2 // Copyright (c) 2014 Samsung Electronics Co., Ltd.
4 // Licensed under the Flora License, Version 1.0 (the License);
5 // you may not use this file except in compliance with the License.
6 // You may obtain a copy of the License at
8 // http://floralicense.org/license/
10 // Unless required by applicable law or agreed to in writing, software
11 // distributed under the License is distributed on an AS IS BASIS,
12 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 // See the License for the specific language governing permissions and
14 // limitations under the License.
18 #include <dali/internal/event/actor-attachments/camera-attachment-impl.h>
21 #include <dali/public-api/common/dali-common.h>
22 #include <dali/internal/event/common/stage-impl.h>
23 #include <dali/internal/update/node-attachments/scene-graph-camera-attachment.h>
33 CameraAttachmentPtr CameraAttachment::New( const SceneGraph::Node& parentNode )
35 StagePtr stage = Stage::GetCurrent();
37 CameraAttachmentPtr attachment( new CameraAttachment( *stage ) );
39 // Transfer object ownership of scene-object to message
40 SceneGraph::CameraAttachment* sceneObject = CreateSceneObject();
41 AttachToNodeMessage( stage->GetUpdateManager(), parentNode, sceneObject );
43 // Keep raw pointer for message passing
44 attachment->mSceneObject = sceneObject;
49 CameraAttachment::CameraAttachment( Stage& stage )
50 : ActorAttachment( stage ),
52 mType( SceneGraph::CameraAttachment::DEFAULT_TYPE ),
53 mProjectionMode( SceneGraph::CameraAttachment::DEFAULT_MODE ),
54 mInvertYAxis( SceneGraph::CameraAttachment::DEFAULT_INVERT_Y_AXIS ),
55 mFieldOfView( SceneGraph::CameraAttachment::DEFAULT_FIELD_OF_VIEW ),
56 mAspectRatio( SceneGraph::CameraAttachment::DEFAULT_ASPECT_RATIO ),
57 mStereoBias( SceneGraph::CameraAttachment::DEFAULT_STEREO_BIAS ),
58 mLeftClippingPlane( SceneGraph::CameraAttachment::DEFAULT_LEFT_CLIPPING_PLANE ),
59 mRightClippingPlane( SceneGraph::CameraAttachment::DEFAULT_RIGHT_CLIPPING_PLANE ),
60 mTopClippingPlane( SceneGraph::CameraAttachment::DEFAULT_TOP_CLIPPING_PLANE ),
61 mBottomClippingPlane( SceneGraph::CameraAttachment::DEFAULT_BOTTOM_CLIPPING_PLANE ),
62 mNearClippingPlane( SceneGraph::CameraAttachment::DEFAULT_NEAR_CLIPPING_PLANE ),
63 mFarClippingPlane( SceneGraph::CameraAttachment::DEFAULT_FAR_CLIPPING_PLANE ),
64 mTargetPosition( SceneGraph::CameraAttachment::DEFAULT_TARGET_POSITION )
68 CameraAttachment::~CameraAttachment()
72 SceneGraph::CameraAttachment* CameraAttachment::CreateSceneObject()
74 return SceneGraph::CameraAttachment::New();
77 void CameraAttachment::SetType(Dali::Camera::Type type)
83 // sceneObject is being used in a separate thread; queue a message to set
84 SetTypeMessage( mStage->GetUpdateInterface(), *mSceneObject, type );
88 Dali::Camera::Type CameraAttachment::GetType() const
93 void CameraAttachment::SetProjectionMode(Dali::Camera::ProjectionMode projectionMode)
95 if( ! Equals(projectionMode, mProjectionMode) )
97 mProjectionMode = projectionMode;
99 // sceneObject is being used in a separate thread; queue a message to set
100 SetProjectionModeMessage( mStage->GetUpdateInterface(), *mSceneObject, projectionMode );
104 Dali::Camera::ProjectionMode CameraAttachment::GetProjectionMode() const
106 return mProjectionMode;
109 void CameraAttachment::SetFieldOfView( float fieldOfView )
111 if( ! Equals(fieldOfView, mFieldOfView) )
113 mFieldOfView = fieldOfView;
115 // sceneObject is being used in a separate thread; queue a message to set
116 SetFieldOfViewMessage( mStage->GetUpdateInterface(), *mSceneObject, fieldOfView );
120 float CameraAttachment::GetFieldOfView() const
125 void CameraAttachment::SetAspectRatio( float aspectRatio )
127 if( ! Equals(aspectRatio, mAspectRatio) )
129 mAspectRatio = aspectRatio;
131 // sceneObject is being used in a separate thread; queue a message to set
132 SetAspectRatioMessage( mStage->GetUpdateInterface(), *mSceneObject, aspectRatio );
136 float CameraAttachment::GetAspectRatio() const
141 void CameraAttachment::SetStereoBias(float stereoBias)
143 if( ! Equals(stereoBias, mStereoBias) )
145 mStereoBias = stereoBias;
147 // sceneObject is being used in a separate thread; queue a message to set
148 SetStereoBiasMessage( mStage->GetUpdateInterface(), *mSceneObject, stereoBias );
152 float CameraAttachment::GetStereoBias(float stereoBias) const
157 void CameraAttachment::SetLeftClippingPlane( float leftClippingPlane )
159 if( ! Equals(leftClippingPlane, mLeftClippingPlane ) )
161 mLeftClippingPlane = leftClippingPlane;
163 // sceneObject is being used in a separate thread; queue a message to set
164 SetLeftClippingPlaneMessage( mStage->GetUpdateInterface(), *mSceneObject, leftClippingPlane );
168 float CameraAttachment::GetLeftClippingPlane() const
170 return mLeftClippingPlane;
173 void CameraAttachment::SetRightClippingPlane( float rightClippingPlane )
175 if( ! Equals(rightClippingPlane, mRightClippingPlane ) )
177 mRightClippingPlane = rightClippingPlane;
179 // sceneObject is being used in a separate thread; queue a message to set
180 SetRightClippingPlaneMessage( mStage->GetUpdateInterface(), *mSceneObject, rightClippingPlane );
184 float CameraAttachment::GetRightClippingPlane() const
186 return mRightClippingPlane;
189 void CameraAttachment::SetTopClippingPlane( float topClippingPlane )
191 if( ! Equals(topClippingPlane, mTopClippingPlane ) )
193 mTopClippingPlane = topClippingPlane;
195 // sceneObject is being used in a separate thread; queue a message to set
196 SetTopClippingPlaneMessage( mStage->GetUpdateInterface(), *mSceneObject, topClippingPlane );
200 float CameraAttachment::GetTopClippingPlane() const
202 return mTopClippingPlane;
205 void CameraAttachment::SetBottomClippingPlane( float bottomClippingPlane )
207 if( ! Equals(bottomClippingPlane, mBottomClippingPlane ) )
209 mBottomClippingPlane = bottomClippingPlane;
211 // sceneObject is being used in a separate thread; queue a message to set
212 SetBottomClippingPlaneMessage( mStage->GetUpdateInterface(), *mSceneObject, bottomClippingPlane );
216 float CameraAttachment::GetBottomClippingPlane() const
218 return mBottomClippingPlane;
221 void CameraAttachment::SetNearClippingPlane( float nearClippingPlane )
223 if( ! Equals(nearClippingPlane, mNearClippingPlane ) )
225 mNearClippingPlane = nearClippingPlane;
227 // sceneObject is being used in a separate thread; queue a message to set
228 SetNearClippingPlaneMessage( mStage->GetUpdateInterface(), *mSceneObject, nearClippingPlane );
232 float CameraAttachment::GetNearClippingPlane() const
234 return mNearClippingPlane;
237 void CameraAttachment::SetFarClippingPlane( float farClippingPlane )
239 if( ! Equals( farClippingPlane, mFarClippingPlane ) )
241 mFarClippingPlane = farClippingPlane;
243 // sceneObject is being used in a separate thread; queue a message to set
244 SetFarClippingPlaneMessage( mStage->GetUpdateInterface(), *mSceneObject, farClippingPlane );
248 float CameraAttachment::GetFarClippingPlane() const
250 return mFarClippingPlane;
253 void CameraAttachment::SetTargetPosition( Vector3 targetPosition )
255 if( targetPosition != mTargetPosition )
257 mTargetPosition = targetPosition;
259 SetTargetPositionMessage( mStage->GetUpdateInterface(), *mSceneObject, targetPosition );
263 Vector3 CameraAttachment::GetTargetPosition()
265 return mTargetPosition;
268 void CameraAttachment::SetInvertYAxis( bool invertYAxis )
270 if( invertYAxis != mInvertYAxis )
272 mInvertYAxis = invertYAxis;
274 // sceneObject is being used in a separate thread; queue a message to set
275 SetInvertYAxisMessage( mStage->GetUpdateInterface(), *mSceneObject, invertYAxis );
279 bool CameraAttachment::GetInvertYAxis() const
284 const Matrix& CameraAttachment::GetViewMatrix() const
286 const SceneGraph::CameraAttachment& sceneObject = *mSceneObject;
288 return sceneObject.GetViewMatrix( mStage->GetEventBufferIndex() );
291 const Matrix& CameraAttachment::GetProjectionMatrix() const
293 const SceneGraph::CameraAttachment& sceneObject = *mSceneObject;
295 return sceneObject.GetProjectionMatrix( mStage->GetEventBufferIndex() );
298 const Matrix& CameraAttachment::GetInverseViewProjectionMatrix() const
300 const SceneGraph::CameraAttachment& sceneObject = *mSceneObject;
302 return sceneObject.GetInverseViewProjectionMatrix( mStage->GetEventBufferIndex() );
305 const PropertyInputImpl* CameraAttachment::GetViewMatrixProperty() const
307 DALI_ASSERT_DEBUG( OnStage() );
309 const SceneGraph::CameraAttachment& sceneObject = *mSceneObject;
311 return sceneObject.GetViewMatrix();
314 const PropertyInputImpl* CameraAttachment::GetProjectionMatrixProperty() const
316 DALI_ASSERT_DEBUG( OnStage() );
318 const SceneGraph::CameraAttachment& sceneObject = *mSceneObject;
320 return sceneObject.GetProjectionMatrix();
323 void CameraAttachment::OnStageConnection()
328 void CameraAttachment::OnStageDisconnection()
333 } // namespace Internal