#define DALI_INTERNAL_SCENE_GRAPH_CAMERA_H
/*
- * Copyright (c) 2021 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2023 Samsung Electronics Co., Ltd.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
*/
// INTERNAL INCLUDES
-#include <dali/internal/common/message.h>
-#include <dali/internal/event/common/event-thread-services.h>
+#include <dali/devel-api/actors/camera-actor-devel.h>
+#include <dali/internal/update/common/animatable-property.h>
#include <dali/internal/update/common/double-buffered.h>
#include <dali/internal/update/common/inherited-property.h>
+#include <dali/internal/update/nodes/node.h>
#include <dali/public-api/actors/camera-actor.h>
#include <dali/public-api/math/rect.h>
{
namespace Internal
{
-// value types used by messages
-template<>
-struct ParameterType<Dali::Camera::Type>
-: public BasicType<Dali::Camera::Type>
-{
-};
-template<>
-struct ParameterType<Dali::Camera::ProjectionMode>
-: public BasicType<Dali::Camera::ProjectionMode>
-{
-};
-
namespace SceneGraph
{
-class Node;
class SceneController;
/**
* Scene-graph camera object
*/
-class Camera
+class Camera : public Node
{
public:
- static const Dali::Camera::Type DEFAULT_TYPE;
- static const Dali::Camera::ProjectionMode DEFAULT_MODE;
- static const bool DEFAULT_INVERT_Y_AXIS;
- static const float DEFAULT_FIELD_OF_VIEW;
- static const float DEFAULT_ASPECT_RATIO;
- static const float DEFAULT_LEFT_CLIPPING_PLANE;
- static const float DEFAULT_RIGHT_CLIPPING_PLANE;
- static const float DEFAULT_TOP_CLIPPING_PLANE;
- static const float DEFAULT_BOTTOM_CLIPPING_PLANE;
- static const float DEFAULT_NEAR_CLIPPING_PLANE;
- static const float DEFAULT_FAR_CLIPPING_PLANE;
- static const Vector2 DEFAULT_STEREO_BIAS;
- static const Vector3 DEFAULT_TARGET_POSITION;
+ static const Dali::Camera::Type DEFAULT_TYPE;
+ static const Dali::Camera::ProjectionMode DEFAULT_MODE;
+ static const Dali::DevelCameraActor::ProjectionDirection DEFAULT_PROJECTION_DIRECTION;
+ static const bool DEFAULT_INVERT_Y_AXIS;
+ static const float DEFAULT_FIELD_OF_VIEW;
+ static const float DEFAULT_ORTHOGRAPHIC_SIZE;
+ static const float DEFAULT_ASPECT_RATIO;
+ static const float DEFAULT_LEFT_CLIPPING_PLANE;
+ static const float DEFAULT_RIGHT_CLIPPING_PLANE;
+ static const float DEFAULT_TOP_CLIPPING_PLANE;
+ static const float DEFAULT_BOTTOM_CLIPPING_PLANE;
+ static const float DEFAULT_NEAR_CLIPPING_PLANE;
+ static const float DEFAULT_FAR_CLIPPING_PLANE;
+ static const Vector2 DEFAULT_STEREO_BIAS;
+ static const Vector3 DEFAULT_TARGET_POSITION;
/**
* Plane equation container for a plane of the view frustum
static Camera* New();
/**
- * Destructor
- */
- ~Camera();
-
- /**
- * Set the node this scene graph camera belongs to.
- * @param[in] node The owning node.
+ * Virtual destructor
*/
- void SetNode(const Node* node);
+ ~Camera() override;
/**
- * Get the node this scene graph camera belongs to.
- * @return node The owning node.
+ * Overriden delete operator
+ * Deletes the camera from its global memory pool
*/
- const Node* GetNode() const;
+ void operator delete(void* ptr);
/**
* @copydoc Dali::Internal::CameraActor::SetType
void SetProjectionMode(Dali::Camera::ProjectionMode projectionMode);
/**
- * @copydoc Dali::Internal::CameraActor::SetFieldOfView
+ * @copydoc Dali::Internal::CameraActor::SetProjectionDirection
*/
- void SetFieldOfView(float fieldOfView);
-
- /**
- * @copydoc Dali::Internal::CameraActor::SetAspectRatio
- */
- void SetAspectRatio(float aspectRatio);
+ void SetProjectionDirection(Dali::DevelCameraActor::ProjectionDirection direction);
/**
* @copydoc Dali::Internal::CameraActor::SetLeftClippingPlane
void SetTargetPosition(const Vector3& targetPosition);
/**
+ * @brief Bakes the field of view.
+ * @param[in] updateBufferIndex The current update buffer index.
+ * @param[in] fieldOfView The field of view.
+ */
+ void BakeFieldOfView(BufferIndex updateBufferIndex, float fieldOfView);
+
+ /**
+ * @brief Retrieve the field of view.
+ * @param[in] bufferIndex The buffer to read from.
+ * @return The field of view.
+ */
+ float GetFieldOfView(BufferIndex bufferIndex) const
+ {
+ return mFieldOfView[bufferIndex];
+ }
+
+ /**
+ * @brief Bakes the orthographic size.
+ * @param[in] updateBufferIndex The current update buffer index.
+ * @param[in] orthographicSize The orthographic size.
+ */
+ void BakeOrthographicSize(BufferIndex updateBufferIndex, float orthographicSize);
+
+ /**
+ * @brief Retrieve the orthographic size.
+ * @param[in] bufferIndex The buffer to read from.
+ * @return The orthographic size.
+ */
+ float GetOrthographicSize(BufferIndex bufferIndex) const
+ {
+ return mOrthographicSize[bufferIndex];
+ }
+
+ /**
+ * @brief Bakes the aspect ratio.
+ * @param[in] updateBufferIndex The current update buffer index.
+ * @param[in] aspectRatio The aspect ratio.
+ */
+ void BakeAspectRatio(BufferIndex updateBufferIndex, float aspectRatio);
+
+ /**
+ * @brief Retrieve the aspect ratio.
+ * @param[in] bufferIndex The buffer to read from.
+ * @return The aspect ratio.
+ */
+ float GetAspectRatio(BufferIndex bufferIndex) const
+ {
+ return mAspectRatio[bufferIndex];
+ }
+
+ /**
* Sets the reflection plane
* @param[in] plane reflection plane
*/
*
* @return false if the sphere lies outside of the frustum.
*/
- bool CheckSphereInFrustum(BufferIndex bufferIndex, const Vector3& origin, float radius);
+ bool CheckSphereInFrustum(BufferIndex bufferIndex, const Vector3& origin, float radius) const;
/**
* @brief Check to see if a bounding box lies within the view frustum.
*
* @return false if the cubeoid lies completely outside of the frustum, true otherwise
*/
- bool CheckAABBInFrustum(BufferIndex bufferIndex, const Vector3& origin, const Vector3& halfExtents);
+ bool CheckAABBInFrustum(BufferIndex bufferIndex, const Vector3& origin, const Vector3& halfExtents) const;
+
+ /**
+ * @brief Calculate orthographic clipping box by this camera's orthographic size.
+ */
+ Dali::Rect<int32_t> GetOrthographicClippingBox(BufferIndex bufferIndex) const;
/**
* Retrieve the projection-matrix; this is double buffered for input handling.
const Matrix& GetFinalProjectionMatrix(BufferIndex bufferIndex) const;
/**
+ * Retrieve the field of view property querying interface.
+ * @pre The camera is on-stage.
+ * @return The field of view property querying interface.
+ */
+ const PropertyBase* GetFieldOfView() const;
+
+ /**
+ * Retrieve the orthographic size property querying interface.
+ * @pre The camera is on-stage.
+ * @return The orthographic size property querying interface.
+ */
+ const PropertyBase* GetOrthographicSize() const;
+
+ /**
+ * Retrieve the aspect ratio property querying interface.
+ * @pre The camera is on-stage.
+ * @return The aspect ratio property querying interface.
+ */
+ const PropertyBase* GetAspectRatio() const;
+
+ /**
* Retrieve the projection-matrix property querying interface.
* @pre The camera is on-stage.
* @return The projection-matrix property querying interface.
/**
* @return true if the view matrix of camera is updated this or the previous frame
*/
- bool ViewMatrixUpdated();
+ bool ViewMatrixUpdated() const;
+
+ /**
+ * @return true if the projection matrix projection matrix relative properties are animated this or the previous frame
+ */
+ bool IsProjectionMatrixAnimated() const;
private:
/**
*/
Camera();
- // Non copyable
- // Undefined
- Camera(const Camera&);
- // Undefined
- Camera& operator=(const Camera& rhs);
+ // Delete copy and move
+ Camera(const Camera&) = delete;
+ Camera(Camera&&) = delete;
+ Camera& operator=(const Camera& rhs) = delete;
+ Camera& operator=(Camera&& rhs) = delete;
/**
* Recalculates the view matrix.
*/
void UpdateFrustum(BufferIndex updateBufferIndex, bool normalize = true);
- /**
- * Adjust near plane for reflection
- * @param perspective Perspective matrix
- * @param clipPlane Clipping plane
- */
- void AdjustNearPlaneForPerspective(Matrix& perspective, const Vector4& clipPlane);
+ uint32_t mUpdateViewFlag; ///< This is non-zero if the view matrix requires an update
+ uint32_t mUpdateProjectionFlag; ///< This is non-zero if the projection matrix requires an update
+ int mProjectionRotation; ///< The rotaion angle of the projection
- uint32_t mUpdateViewFlag; ///< This is non-zero if the view matrix requires an update
- uint32_t mUpdateProjectionFlag; ///< This is non-zero if the projection matrix requires an update
- int mProjectionRotation; ///< The rotaion angle of the projection
- const Node* mNode; ///< The node this scene graph camera belongs to
+public: // PROPERTIES
+ Dali::Camera::Type mType; // Non-animatable
+ Dali::Camera::ProjectionMode mProjectionMode; // Non-animatable
+ Dali::DevelCameraActor::ProjectionDirection mProjectionDirection; // Non-animatable
+ bool mInvertYAxis; // Non-animatable
-public: // PROPERTIES
- Dali::Camera::Type mType; // Non-animatable
- Dali::Camera::ProjectionMode mProjectionMode; // Non-animatable
- bool mInvertYAxis; // Non-animatable
+ AnimatableProperty<float> mFieldOfView; // Animatable
+ AnimatableProperty<float> mOrthographicSize; // Animatable
+ AnimatableProperty<float> mAspectRatio; // Animatable
- float mFieldOfView;
- float mAspectRatio;
- float mLeftClippingPlane;
- float mRightClippingPlane;
- float mTopClippingPlane;
- float mBottomClippingPlane;
float mNearClippingPlane;
float mFarClippingPlane;
Vector3 mTargetPosition;
DoubleBuffered<Matrix> mFinalProjection; ///< Final projection matrix; double buffered for input handling
};
-// Messages for Camera
-
-inline void SetTypeMessage(EventThreadServices& eventThreadServices, const Camera& camera, Dali::Camera::Type parameter)
-{
- using LocalType = MessageValue1<Camera, Dali::Camera::Type>;
-
- // Reserve some memory inside the message queue
- uint32_t* slot = eventThreadServices.ReserveMessageSlot(sizeof(LocalType));
-
- // Construct message in the message queue memory; note that delete should not be called on the return value
- new(slot) LocalType(&camera, &Camera::SetType, parameter);
-}
-
-inline void SetProjectionModeMessage(EventThreadServices& eventThreadServices, const Camera& camera, Dali::Camera::ProjectionMode parameter)
-{
- using LocalProjectionMode = MessageValue1<Camera, Dali::Camera::ProjectionMode>;
-
- // Reserve some memory inside the message queue
- uint32_t* slot = eventThreadServices.ReserveMessageSlot(sizeof(LocalProjectionMode));
-
- // Construct message in the message queue memory; note that delete should not be called on the return value
- new(slot) LocalProjectionMode(&camera, &Camera::SetProjectionMode, parameter);
-}
-
-inline void SetFieldOfViewMessage(EventThreadServices& eventThreadServices, const Camera& camera, float parameter)
-{
- using LocalType = MessageValue1<Camera, float>;
-
- // Reserve some memory inside the message queue
- uint32_t* slot = eventThreadServices.ReserveMessageSlot(sizeof(LocalType));
-
- // Construct message in the message queue memory; note that delete should not be called on the return value
- new(slot) LocalType(&camera, &Camera::SetFieldOfView, parameter);
-}
-
-inline void SetAspectRatioMessage(EventThreadServices& eventThreadServices, const Camera& camera, float parameter)
-{
- using LocalType = MessageValue1<Camera, float>;
-
- // Reserve some memory inside the message queue
- uint32_t* slot = eventThreadServices.ReserveMessageSlot(sizeof(LocalType));
-
- // Construct message in the message queue memory; note that delete should not be called on the return value
- new(slot) LocalType(&camera, &Camera::SetAspectRatio, parameter);
-}
-
-inline void SetLeftClippingPlaneMessage(EventThreadServices& eventThreadServices, const Camera& camera, float parameter)
-{
- using LocalType = MessageValue1<Camera, float>;
-
- // Reserve some memory inside the message queue
- uint32_t* slot = eventThreadServices.ReserveMessageSlot(sizeof(LocalType));
-
- // Construct message in the message queue memory; note that delete should not be called on the return value
- new(slot) LocalType(&camera, &Camera::SetLeftClippingPlane, parameter);
-}
-
-inline void SetRightClippingPlaneMessage(EventThreadServices& eventThreadServices, const Camera& camera, float parameter)
-{
- using LocalType = MessageValue1<Camera, float>;
-
- // Reserve some memory inside the message queue
- uint32_t* slot = eventThreadServices.ReserveMessageSlot(sizeof(LocalType));
-
- // Construct message in the message queue memory; note that delete should not be called on the return value
- new(slot) LocalType(&camera, &Camera::SetRightClippingPlane, parameter);
-}
-
-inline void SetTopClippingPlaneMessage(EventThreadServices& eventThreadServices, const Camera& camera, float parameter)
-{
- using LocalType = MessageValue1<Camera, float>;
-
- // Reserve some memory inside the message queue
- uint32_t* slot = eventThreadServices.ReserveMessageSlot(sizeof(LocalType));
-
- // Construct message in the message queue memory; note that delete should not be called on the return value
- new(slot) LocalType(&camera, &Camera::SetTopClippingPlane, parameter);
-}
-
-inline void SetBottomClippingPlaneMessage(EventThreadServices& eventThreadServices, const Camera& camera, float parameter)
-{
- using LocalType = MessageValue1<Camera, float>;
-
- // Reserve some memory inside the message queue
- uint32_t* slot = eventThreadServices.ReserveMessageSlot(sizeof(LocalType));
-
- // Construct message in the message queue memory; note that delete should not be called on the return value
- new(slot) LocalType(&camera, &Camera::SetBottomClippingPlane, parameter);
-}
-
-inline void SetNearClippingPlaneMessage(EventThreadServices& eventThreadServices, const Camera& camera, float parameter)
-{
- using LocalType = MessageValue1<Camera, float>;
-
- // Reserve some memory inside the message queue
- uint32_t* slot = eventThreadServices.ReserveMessageSlot(sizeof(LocalType));
-
- // Construct message in the message queue memory; note that delete should not be called on the return value
- new(slot) LocalType(&camera, &Camera::SetNearClippingPlane, parameter);
-}
-
-inline void SetFarClippingPlaneMessage(EventThreadServices& eventThreadServices, const Camera& camera, float parameter)
-{
- using LocalType = MessageValue1<Camera, float>;
-
- // Reserve some memory inside the message queue
- uint32_t* slot = eventThreadServices.ReserveMessageSlot(sizeof(LocalType));
-
- // Construct message in the message queue memory; note that delete should not be called on the return value
- new(slot) LocalType(&camera, &Camera::SetFarClippingPlane, parameter);
-}
-
-inline void SetTargetPositionMessage(EventThreadServices& eventThreadServices, const Camera& camera, const Vector3& parameter)
-{
- using LocalType = MessageValue1<Camera, Vector3>;
-
- // Reserve some memory inside the message queue
- uint32_t* slot = eventThreadServices.ReserveMessageSlot(sizeof(LocalType));
-
- // Construct message in the message queue memory; note that delete should not be called on the return value
- new(slot) LocalType(&camera, &Camera::SetTargetPosition, parameter);
-}
-
-inline void SetInvertYAxisMessage(EventThreadServices& eventThreadServices, const Camera& camera, bool parameter)
-{
- using LocalType = MessageValue1<Camera, bool>;
-
- // Reserve some memory inside the message queue
- uint32_t* slot = eventThreadServices.ReserveMessageSlot(sizeof(LocalType));
-
- // Construct message in the message queue memory; note that delete should not be called on the return value
- new(slot) LocalType(&camera, &Camera::SetInvertYAxis, parameter);
-}
-
-inline void RotateProjectionMessage(EventThreadServices& eventThreadServices, const Camera& camera, int parameter)
-{
- typedef MessageValue1<Camera, int> LocalType;
-
- // Reserve some memory inside the message queue
- unsigned int* slot = eventThreadServices.ReserveMessageSlot(sizeof(LocalType));
-
- // Construct message in the message queue memory; note that delete should not be called on the return value
- new(slot) LocalType(&camera, &Camera::RotateProjection, parameter);
-}
-
} // namespace SceneGraph
-
} // namespace Internal
-
} // namespace Dali
#endif // DALI_INTERNAL_SCENE_GRAPH_CAMERA_H