1 #ifndef __DALI_CAMERA_ACTOR_H__
2 #define __DALI_CAMERA_ACTOR_H__
5 * Copyright (c) 2015 Samsung Electronics Co., Ltd.
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
11 * http://www.apache.org/licenses/LICENSE-2.0
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
21 #include <dali/public-api/actors/actor.h>
26 * @addtogroup dali_core_actors
30 namespace Internal DALI_INTERNAL
36 * @brief Enumeration for camera.
42 * @brief Enumeration for type determination of how camera operates.
47 FREE_LOOK, ///< Camera orientation is taken from CameraActor @SINCE_1_0.0
48 LOOK_AT_TARGET, ///< Camera is oriented to always look at a target @SINCE_1_0.0
52 * @brief Enumeration for projection modes.
57 PERSPECTIVE_PROJECTION, ///< Distance causes foreshortening; objects further from the camera appear smaller @SINCE_1_0.0
58 ORTHOGRAPHIC_PROJECTION, ///< Relative distance from the camera does not affect the size of objects @SINCE_1_0.0
64 * @brief CameraActor controls a camera.
66 * Allows the developer to use actor semantics to control a camera.
68 * There are two types of camera actor, FREE_LOOK and LOOK_AT_TARGET. By default,
69 * the camera actor will be FREE_LOOK.
71 * A FREE_LOOK camera uses actor's orientation to control where the camera is looking.
72 * If no additional rotations are specified, the camera looks in the negative Z direction.
74 * For LOOK_AT_TARGET, the actor's orientation is ignored, instead the camera looks at TARGET_POSITION
75 * in world coordinates.
79 class DALI_IMPORT_API CameraActor : public Actor
84 * @brief Enumeration for the instance of properties belonging to the CameraActor class.
86 * Properties additional to Actor.
92 * @brief Enumeration for the instance of properties belonging to the CameraActor class.
94 * Properties additional to Actor.
99 TYPE = DEFAULT_DERIVED_ACTOR_PROPERTY_START_INDEX, ///< name "type", type std::string @SINCE_1_0.0
100 PROJECTION_MODE, ///< name "projectionMode", type std::string @SINCE_1_0.0
101 FIELD_OF_VIEW, ///< name "fieldOfView", type float @SINCE_1_0.0
102 ASPECT_RATIO, ///< name "aspectRatio", type float @SINCE_1_0.0
103 NEAR_PLANE_DISTANCE, ///< name "nearPlaneDistance", type float @SINCE_1_0.0
104 FAR_PLANE_DISTANCE, ///< name "farPlaneDistance", type float @SINCE_1_0.0
105 LEFT_PLANE_DISTANCE, ///< name "leftPlaneDistance", type float @SINCE_1_0.0
106 RIGHT_PLANE_DISTANCE, ///< name "rightPlaneDistance", type float @SINCE_1_0.0
107 TOP_PLANE_DISTANCE, ///< name "topPlaneDistance", type float @SINCE_1_0.0
108 BOTTOM_PLANE_DISTANCE, ///< name "bottomPlaneDistance", type float @SINCE_1_0.0
109 TARGET_POSITION, ///< name "targetPosition", type Vector3 @SINCE_1_0.0
110 PROJECTION_MATRIX, ///< name "projectionMatrix", type Matrix @SINCE_1_0.0
111 VIEW_MATRIX, ///< name "viewMatrix", type Matrix @SINCE_1_0.0
112 INVERT_Y_AXIS, ///< name "invertYAxis", type bool @SINCE_1_0.0
117 * @brief Creates an uninitialized CameraActor handle.
119 * Initialize it using CameraActor::New().
120 * Calling member functions with an uninitialized CameraActor handle is not allowed.
126 * @brief Creates a CameraActor object.
128 * Sets the default camera perspective projection for the stage's size. @see SetPerspectiveProjection().
130 * @return The newly created camera actor
132 static CameraActor New();
135 * @brief Creates a CameraActor object.
137 * Sets the default camera perspective projection for the given canvas size. @see SetPerspectiveProjection().
140 * @param[in] size The canvas size
141 * @return The newly created camera actor
143 static CameraActor New( const Size& size );
146 * @brief Downcasts a handle to CameraActor handle.
148 * If handle points to a CameraActor, the downcast produces valid handle.
149 * If not, the returned handle is left uninitialized.
151 * @param[in] handle to An object
152 * @return Handle to a CameraActor or an uninitialized handle
154 static CameraActor DownCast( BaseHandle handle );
159 * This is non-virtual, since derived Handle types must not contain data or virtual methods.
165 * @brief Copy constructor.
168 * @param[in] copy The actor to copy
170 CameraActor(const CameraActor& copy);
173 * @brief Assignment operator.
176 * @param[in] rhs The actor to copy
177 * @return A reference to this
179 CameraActor& operator=(const CameraActor& rhs);
182 * @brief Sets the camera type.
183 * The default type is Dali::Camera::FREE_LOOK
185 * @param[in] type The camera type
187 void SetType( Dali::Camera::Type type );
190 * @brief Gets the type of the camera.
193 * @return The type of camera
195 Dali::Camera::Type GetType() const;
198 * @brief Sets the projection mode.
201 * @param[in] mode One of PERSPECTIVE_PROJECTION or ORTHOGRAPHIC_PROJECTION
203 void SetProjectionMode( Dali::Camera::ProjectionMode mode );
206 * @brief Gets the projection mode.
209 * @return One of PERSPECTIVE_PROJECTION or ORTHOGRAPHIC_PROJECTION
211 Dali::Camera::ProjectionMode GetProjectionMode() const;
214 * @brief Sets the field of view.
217 * @param[in] fieldOfView The field of view in radians
219 void SetFieldOfView( float fieldOfView );
222 * @brief Gets the field of view in Radians.
224 * The default field of view is 45 degrees.
226 * @return The field of view in radians
228 float GetFieldOfView( );
231 * @brief Sets the aspect ratio.
234 * @param[in] aspectRatio The aspect ratio
236 void SetAspectRatio( float aspectRatio );
239 * @brief Gets the aspect ratio of the camera.
241 * The default aspect ratio is 4.0f/3.0f.
243 * @return The aspect ratio
245 float GetAspectRatio( );
248 * @brief Sets the near clipping plane distance.
251 * @param[in] nearClippingPlane Distance of the near clipping plane
253 void SetNearClippingPlane( float nearClippingPlane );
256 * @brief Gets the near clipping plane distance.
258 * The default near clipping plane is 800.0f, to match the default screen height.
259 * Reduce this value to see objects closer to the camera.
261 * @return The near clipping plane value
263 float GetNearClippingPlane( );
266 * @brief Sets the far clipping plane distance.
269 * @param[in] farClippingPlane Distance of the far clipping plane
271 void SetFarClippingPlane( float farClippingPlane );
274 * @brief Gets the far clipping plane distance.
276 * The default value is the default near clipping plane + (0xFFFF>>4).
278 * @return The far clipping plane value
280 float GetFarClippingPlane( );
283 * @brief Sets the target position of the camera.
286 * @param[in] targetPosition The position of the target to look at
287 * @pre Camera type is LOOK_AT_TARGET.
289 void SetTargetPosition( const Vector3& targetPosition );
292 * @brief Gets the Camera Target position.
294 * The default target position is Vector3::ZERO.
296 * @return The target position of the camera
297 * @pre Camera type is LOOK_AT_TARGET.
299 Vector3 GetTargetPosition() const;
302 * @brief Requests for an inversion on the Y axis on the projection calculation.
304 * The default value is not inverted.
306 * @param[in] invertYAxis True if the Y axis should be inverted
308 void SetInvertYAxis(bool invertYAxis);
311 * @brief Gets whether the Y axis is inverted.
314 * @return @c True if the Y axis is inverted, @c false otherwise
316 bool GetInvertYAxis();
319 * @brief Sets the default camera perspective projection for the given canvas size.
321 * Sets the near and far clipping planes, the field of view, the aspect ratio,
322 * and the Z position of the actor based on the canvas size so that 1 unit in
323 * XY (z=0) plane is 1 pixel on screen.
325 * If the canvas size is ZERO, it sets the default camera perspective
326 * projection for the stage's size.
329 * @param[in] size The canvas size
330 * @pre If size is non ZERO, \e width and \e height must be greater than zero.
333 void SetPerspectiveProjection( const Size& size );
336 * @brief Sets the camera projection to use orthographic projection.
338 * The XY plane is centered on the camera axis. The units in the X/Y
339 * plane directly equate to pixels on an equivalently sized
342 * The Z position of the actor, and the near and far clip planes of the
343 * bounding box match those that would be created by using
344 * SetPerspectiveProjection with the same size.
347 * @param[in] size Size of XY plane (normal to camera axis)
349 void SetOrthographicProjection( const Size& size );
352 * @brief Sets the camera projection to use orthographic projection with the given clip planes.
354 * This does not change the Z value of the camera actor.
357 * @param[in] left Distance to left clip plane (normal to camera axis)
358 * @param[in] right Distance to right clip plane (normal to camera axis)
359 * @param[in] top Distance to top clip plane (normal to camera axis)
360 * @param[in] bottom Distance to bottom clip plane (normal to camera axis)
361 * @param[in] near Distance to the near clip plane (along camera axis)
362 * @param[in] far Distance to the far clip plane (along camera axis)
364 void SetOrthographicProjection( float left, float right, float top, float bottom, float near, float far );
366 public: // Not intended for use by Application developers
369 * @brief This constructor is used by CameraActor::New() methods.
372 * @param[in] actor A pointer to a newly allocated Dali resource
374 explicit DALI_INTERNAL CameraActor(Internal::CameraActor* actor);
382 #endif // __DALI_CAMERA_ACTOR_H__