X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=dali%2Finternal%2Fupdate%2Frender-tasks%2Fscene-graph-camera.h;h=e779f494bbe1c4f4064960057845d8ca4cb98b0e;hb=1fdfbc2906bc1dcae714eedfbe6c7f94cd6f9364;hp=c5917a00e49f1d9609132b80f6d88e2d6de61300;hpb=0741b58e8e53e8ea7b897c2e21aac6b4da733192;p=platform%2Fcore%2Fuifw%2Fdali-core.git diff --git a/dali/internal/update/render-tasks/scene-graph-camera.h b/dali/internal/update/render-tasks/scene-graph-camera.h index c5917a0..e779f49 100644 --- a/dali/internal/update/render-tasks/scene-graph-camera.h +++ b/dali/internal/update/render-tasks/scene-graph-camera.h @@ -2,7 +2,7 @@ #define DALI_INTERNAL_SCENE_GRAPH_CAMERA_H /* - * Copyright (c) 2018 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. @@ -19,50 +19,43 @@ */ // INTERNAL INCLUDES -#include -#include -#include -#include +#include +#include #include #include +#include +#include +#include namespace Dali { - 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 @@ -70,7 +63,7 @@ public: struct Plane { Vector3 mNormal; - float mDistance; + float mDistance; }; /** @@ -78,8 +71,8 @@ public: */ struct FrustumPlanes { - Plane mPlanes[ 6 ]; - Vector3 mSign[ 6 ]; + Plane mPlanes[6]; + Vector3 mSign[6]; }; /** @@ -89,87 +82,141 @@ public: static Camera* New(); /** - * Destructor + * Virtual destructor */ - ~Camera(); + ~Camera() override; /** - * Set the node this scene graph camera belongs to. - * @param[in] node The owning node. + * Overriden delete operator + * Deletes the camera from its global memory pool */ - void SetNode( const Node* node ); - - /** - * Get the node this scene graph camera belongs to. - * @return node The owning node. - */ - const Node* GetNode() const; + void operator delete(void* ptr); /** * @copydoc Dali::Internal::CameraActor::SetType */ - void SetType( Dali::Camera::Type type ); + void SetType(Dali::Camera::Type type); /** * @copydoc Dali::Internal::CameraActor::SetInvertYAxis */ - void SetInvertYAxis( bool invertYAxis ); + void SetInvertYAxis(bool invertYAxis); /** - * @copydoc Dali::Internal::CameraActor::SetProjectionMode + * Returns whether the Y axis is inverted. + * @return True if the Y axis is inverted, false otherwise. */ - void SetProjectionMode( Dali::Camera::ProjectionMode projectionMode ); + bool IsYAxisInverted() const + { + return mInvertYAxis; + } /** - * @copydoc Dali::Internal::CameraActor::SetFieldOfView + * @copydoc Dali::Internal::CameraActor::SetProjectionMode */ - void SetFieldOfView( float fieldOfView ); + void SetProjectionMode(Dali::Camera::ProjectionMode projectionMode); /** - * @copydoc Dali::Internal::CameraActor::SetAspectRatio + * @copydoc Dali::Internal::CameraActor::SetProjectionDirection */ - void SetAspectRatio( float aspectRatio ); + void SetProjectionDirection(Dali::DevelCameraActor::ProjectionDirection direction); - /** + /** * @copydoc Dali::Internal::CameraActor::SetLeftClippingPlane */ - void SetLeftClippingPlane( float leftClippingPlane ); + void SetLeftClippingPlane(float leftClippingPlane); /** * @copydoc Dali::Internal::CameraActor::SetRightClippingPlane */ - void SetRightClippingPlane( float rightClippingPlane ); + void SetRightClippingPlane(float rightClippingPlane); /** * @copydoc Dali::Internal::CameraActor::SetTopClippingPlane */ - void SetTopClippingPlane( float topClippingPlane ); + void SetTopClippingPlane(float topClippingPlane); /** * @copydoc Dali::Internal::CameraActor::SetBottomClippingPlane */ - void SetBottomClippingPlane( float bottomClippingPlane ); + void SetBottomClippingPlane(float bottomClippingPlane); /** * @copydoc Dali::Internal::CameraActor::SetNearClippingPlane */ - void SetNearClippingPlane( float nearClippingPlane ); + void SetNearClippingPlane(float nearClippingPlane); /** * @copydoc Dali::Internal::CameraActor::SetFarClippingPlane */ - void SetFarClippingPlane( float farClippingPlane ); + void SetFarClippingPlane(float farClippingPlane); + + /** + * @copydoc Dali::Internal::CameraActor::RotateProjection + */ + void RotateProjection(int rotationAngle); /** * @copydoc Dali::Internal::CameraActor::SetTarget */ - void SetTargetPosition( const Vector3& targetPosition ); + 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 */ - void SetReflectByPlane( const Vector4& plane ); + void SetReflectByPlane(const Vector4& plane); /** * Tests whether reflection is used @@ -185,7 +232,7 @@ public: * @param[in] bufferIndex The buffer to read from. * @return The view-matrix. */ - const Matrix& GetViewMatrix( BufferIndex bufferIndex ) const; + const Matrix& GetViewMatrix(BufferIndex bufferIndex) const; /** * @brief Check to see if a sphere lies within the view frustum. @@ -196,7 +243,7 @@ public: * * @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. @@ -207,21 +254,54 @@ public: * * @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 GetOrthographicClippingBox(BufferIndex bufferIndex) const; /** * Retrieve the projection-matrix; this is double buffered for input handling. * @param[in] bufferIndex The buffer to read from. * @return The projection-matrix. */ - const Matrix& GetProjectionMatrix( BufferIndex bufferIndex ) const; + const Matrix& GetProjectionMatrix(BufferIndex bufferIndex) const; /** * Retrieve the inverted view-projection-matrix; this is double buffered for input handling. * @param[in] bufferIndex The buffer to read from. * @return The inverse view-projection-matrix. */ - const Matrix& GetInverseViewProjectionMatrix( BufferIndex bufferIndex ) const; + const Matrix& GetInverseViewProjectionMatrix(BufferIndex bufferIndex) const; + + /** + * Retrieve the final projection-matrix; this is double buffered for input handling. + * @param[in] bufferIndex The buffer to read from. + * @return The projection-matrix that should be used to render. + */ + 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. @@ -242,228 +322,87 @@ public: * Called by the render task using the camera * @param[in] updateBufferIndex The buffer to read from. */ - void Update( BufferIndex updateBufferIndex ); + void Update(BufferIndex updateBufferIndex); /** * @return true if the view matrix of camera is updated this or the previous frame */ - bool ViewMatrixUpdated(); + bool ViewMatrixUpdated() const; -private: + /** + * @return true if the projection matrix projection matrix relative properties are animated this or the previous frame + */ + bool IsProjectionMatrixAnimated() const; +private: /** * Constructor */ 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. * @param[in] bufferIndex The current update buffer index. * @return count how many frames ago the matrix was changed. */ - uint32_t UpdateViewMatrix( BufferIndex updateBufferIndex ); + uint32_t UpdateViewMatrix(BufferIndex updateBufferIndex); /** * Recalculates the projection matrix. * @param[in] bufferIndex The current update buffer index. * @return count how many frames ago the matrix was changed. */ - uint32_t UpdateProjection( BufferIndex updateBufferIndex ); + uint32_t UpdateProjection(BufferIndex updateBufferIndex); private: - /** * @brief Extracts the frustum planes. * * @param[in] bufferIndex The current update buffer index. * @param[in] normalize will normalize plane equation coefficients by default. */ - void UpdateFrustum( BufferIndex updateBufferIndex, bool normalize = true ); + 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 - 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 mFieldOfView; // Animatable + AnimatableProperty mOrthographicSize; // Animatable + AnimatableProperty mAspectRatio; // Animatable - float mFieldOfView; - float mAspectRatio; - float mLeftClippingPlane; - float mRightClippingPlane; - float mTopClippingPlane; - float mBottomClippingPlane; - float mNearClippingPlane; - float mFarClippingPlane; - Vector3 mTargetPosition; + float mNearClippingPlane; + float mFarClippingPlane; + Vector3 mTargetPosition; - Dali::Matrix mReflectionMtx; - Dali::Vector4 mReflectionPlane; - Dali::Vector4 mReflectionEye; - bool mUseReflection{ false }; - bool mUseReflectionClip{ false }; + Dali::Matrix mReflectionMtx; + Dali::Vector4 mReflectionPlane; + Dali::Vector4 mReflectionEye; + bool mUseReflection{false}; + bool mUseReflectionClip{false}; - InheritedMatrix mViewMatrix; ///< The viewMatrix; this is double buffered for input handling. - InheritedMatrix mProjectionMatrix; ///< The projectionMatrix; this is double buffered for input handling. - - DoubleBuffered< FrustumPlanes > mFrustum; ///< Clipping frustum; double buffered for input handling - DoubleBuffered< Matrix > mInverseViewProjection; ///< Inverted viewprojection; double buffered for input handling + InheritedMatrix mViewMatrix; ///< The viewMatrix; this is double buffered for input handling. + InheritedMatrix mProjectionMatrix; ///< The projectionMatrix; this is double buffered for input handling. + DoubleBuffered mFrustum; ///< Clipping frustum; double buffered for input handling + DoubleBuffered mInverseViewProjection; ///< Inverted viewprojection; double buffered for input handling + DoubleBuffered 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; - - // 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; - - // 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; - - // 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; - - // 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; - - // 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; - - // 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; - - // 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; - - // 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; - - // 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; - - // 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; - - // 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; - - // 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 ); -} - } // namespace SceneGraph - } // namespace Internal - } // namespace Dali #endif // DALI_INTERNAL_SCENE_GRAPH_CAMERA_H