X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=dali%2Finternal%2Fupdate%2Frender-tasks%2Fscene-graph-camera.h;h=23e1c5420fb5fc8366992996979ee7717183bb93;hb=22b436e684416fa7e5a6f00d42912db5c8eebd61;hp=a3bc173d43cddb4e7f4c8a7248bbf43915aafd1b;hpb=f022a30b115efa5dbab07e21655332b59d0260ca;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 a3bc173..23e1c54 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) 2022 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,28 +19,31 @@ */ // INTERNAL INCLUDES -#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 > {}; +template<> +struct ParameterType +: public BasicType +{ +}; +template<> +struct ParameterType +: public BasicType +{ +}; namespace SceneGraph { - class Node; class SceneController; @@ -50,19 +53,19 @@ class SceneController; class Camera { public: - static const Dali::Camera::Type DEFAULT_TYPE; + 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 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; /** * Plane equation container for a plane of the view frustum @@ -70,7 +73,7 @@ public: struct Plane { Vector3 mNormal; - float mDistance; + float mDistance; }; /** @@ -78,8 +81,8 @@ public: */ struct FrustumPlanes { - Plane mPlanes[ 6 ]; - Vector3 mSign[ 6 ]; + Plane mPlanes[6]; + Vector3 mSign[6]; }; /** @@ -97,73 +100,93 @@ public: * Set the node this scene graph camera belongs to. * @param[in] node The owning node. */ - void SetNode( const Node* node ); + void SetNode(const Node* node); + + /** + * Get the node this scene graph camera belongs to. + * @return node The owning node. + */ + const Node* GetNode() const; /** * @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); + + /** + * Returns whether the Y axis is inverted. + * @return True if the Y axis is inverted, false otherwise. + */ + bool IsYAxisInverted() const + { + return mInvertYAxis; + } /** * @copydoc Dali::Internal::CameraActor::SetProjectionMode */ - void SetProjectionMode( Dali::Camera::ProjectionMode projectionMode ); + void SetProjectionMode(Dali::Camera::ProjectionMode projectionMode); /** * @copydoc Dali::Internal::CameraActor::SetFieldOfView */ - void SetFieldOfView( float fieldOfView ); + void SetFieldOfView(float fieldOfView); /** * @copydoc Dali::Internal::CameraActor::SetAspectRatio */ - void SetAspectRatio( float aspectRatio ); + void SetAspectRatio(float aspectRatio); - /** + /** * @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); /** * Sets the reflection plane * @param[in] plane reflection plane */ - void SetReflectByPlane( const Vector4& plane ); + void SetReflectByPlane(const Vector4& plane); /** * Tests whether reflection is used @@ -179,7 +202,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. @@ -190,7 +213,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); /** * @brief Check to see if a bounding box lies within the view frustum. @@ -201,21 +224,28 @@ 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); /** * 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 projection-matrix property querying interface. @@ -236,7 +266,7 @@ 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 @@ -244,7 +274,6 @@ public: bool ViewMatrixUpdated(); private: - /** * Constructor */ @@ -261,197 +290,219 @@ private: * @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 - const Node* mNode; ///< The node this scene graph camera belongs to + 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 + 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 + bool mInvertYAxis; // Non-animatable + + float mFieldOfView; + float mAspectRatio; + float mLeftClippingPlane; + float mRightClippingPlane; + float mTopClippingPlane; + float mBottomClippingPlane; + float mNearClippingPlane; + float mFarClippingPlane; + Vector3 mTargetPosition; + + 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 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 +}; -public: // PROPERTIES - Dali::Camera::Type mType; // Non-animatable - Dali::Camera::ProjectionMode mProjectionMode; // Non-animatable - bool mInvertYAxis; // Non-animatable +// Messages for Camera - float mFieldOfView; - float mAspectRatio; - float mLeftClippingPlane; - float mRightClippingPlane; - float mTopClippingPlane; - float mBottomClippingPlane; - float mNearClippingPlane; - float mFarClippingPlane; - Vector3 mTargetPosition; +inline void SetTypeMessage(EventThreadServices& eventThreadServices, const Camera& camera, Dali::Camera::Type parameter) +{ + using LocalType = MessageValue1; - Dali::Matrix mReflectionMtx; - Dali::Vector4 mReflectionPlane; - Dali::Vector4 mReflectionEye; - bool mUseReflection{ false }; - bool mUseReflectionClip{ false }; + // Reserve some memory inside the message queue + uint32_t* slot = eventThreadServices.ReserveMessageSlot(sizeof(LocalType)); - InheritedMatrix mViewMatrix; ///< The viewMatrix; this is double buffered for input handling. - InheritedMatrix mProjectionMatrix; ///< The projectionMatrix; this is double buffered for input handling. + // 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); +} - DoubleBuffered< FrustumPlanes > mFrustum; ///< Clipping frustum; double buffered for input handling - DoubleBuffered< Matrix > mInverseViewProjection; ///< Inverted viewprojection; double buffered for input handling +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)); -// Messages for Camera + // 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 SetTypeMessage( EventThreadServices& eventThreadServices, const Camera& camera, Dali::Camera::Type parameter ) +inline void SetFieldOfViewMessage(EventThreadServices& eventThreadServices, const Camera& camera, float parameter) { - typedef MessageValue1< Camera, Dali::Camera::Type > LocalType; + using LocalType = MessageValue1; // Reserve some memory inside the message queue - uint32_t* slot = eventThreadServices.ReserveMessageSlot( sizeof( LocalType ) ); + 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 ); + new(slot) LocalType(&camera, &Camera::SetFieldOfView, parameter); } -inline void SetProjectionModeMessage( EventThreadServices& eventThreadServices, const Camera& camera, Dali::Camera::ProjectionMode parameter ) +inline void SetAspectRatioMessage(EventThreadServices& eventThreadServices, const Camera& camera, float parameter) { - typedef MessageValue1< Camera, Dali::Camera::ProjectionMode > LocalProjectionMode; + using LocalType = MessageValue1; // Reserve some memory inside the message queue - uint32_t* slot = eventThreadServices.ReserveMessageSlot( sizeof( LocalProjectionMode ) ); + 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) LocalProjectionMode( &camera, &Camera::SetProjectionMode, parameter ); + new(slot) LocalType(&camera, &Camera::SetAspectRatio, parameter); } -inline void SetFieldOfViewMessage( EventThreadServices& eventThreadServices, const Camera& camera, float parameter ) +inline void SetLeftClippingPlaneMessage(EventThreadServices& eventThreadServices, const Camera& camera, float parameter) { - typedef MessageValue1< Camera, float > LocalType; + using LocalType = MessageValue1; // Reserve some memory inside the message queue - uint32_t* slot = eventThreadServices.ReserveMessageSlot( sizeof( LocalType ) ); + 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 ); + new(slot) LocalType(&camera, &Camera::SetLeftClippingPlane, parameter); } -inline void SetAspectRatioMessage( EventThreadServices& eventThreadServices, const Camera& camera, float parameter ) +inline void SetRightClippingPlaneMessage(EventThreadServices& eventThreadServices, const Camera& camera, float parameter) { - typedef MessageValue1< Camera, float > LocalType; + using LocalType = MessageValue1; // Reserve some memory inside the message queue - uint32_t* slot = eventThreadServices.ReserveMessageSlot( sizeof( LocalType ) ); + 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 ); + new(slot) LocalType(&camera, &Camera::SetRightClippingPlane, parameter); } -inline void SetLeftClippingPlaneMessage( EventThreadServices& eventThreadServices, const Camera& camera, float parameter ) +inline void SetTopClippingPlaneMessage(EventThreadServices& eventThreadServices, const Camera& camera, float parameter) { - typedef MessageValue1< Camera, float > LocalType; + using LocalType = MessageValue1; // Reserve some memory inside the message queue - uint32_t* slot = eventThreadServices.ReserveMessageSlot( sizeof( LocalType ) ); + 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 ); + new(slot) LocalType(&camera, &Camera::SetTopClippingPlane, parameter); } -inline void SetRightClippingPlaneMessage( EventThreadServices& eventThreadServices, const Camera& camera, float parameter ) +inline void SetBottomClippingPlaneMessage(EventThreadServices& eventThreadServices, const Camera& camera, float parameter) { - typedef MessageValue1< Camera, float > LocalType; + using LocalType = MessageValue1; // Reserve some memory inside the message queue - uint32_t* slot = eventThreadServices.ReserveMessageSlot( sizeof( LocalType ) ); + 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 ); + new(slot) LocalType(&camera, &Camera::SetBottomClippingPlane, parameter); } -inline void SetTopClippingPlaneMessage( EventThreadServices& eventThreadServices, const Camera& camera, float parameter ) +inline void SetNearClippingPlaneMessage(EventThreadServices& eventThreadServices, const Camera& camera, float parameter) { - typedef MessageValue1< Camera, float > LocalType; + using LocalType = MessageValue1; // Reserve some memory inside the message queue - uint32_t* slot = eventThreadServices.ReserveMessageSlot( sizeof( LocalType ) ); + 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 ); + new(slot) LocalType(&camera, &Camera::SetNearClippingPlane, parameter); } -inline void SetBottomClippingPlaneMessage( EventThreadServices& eventThreadServices, const Camera& camera, float parameter ) +inline void SetFarClippingPlaneMessage(EventThreadServices& eventThreadServices, const Camera& camera, float parameter) { - typedef MessageValue1< Camera, float > LocalType; + using LocalType = MessageValue1; // Reserve some memory inside the message queue - uint32_t* slot = eventThreadServices.ReserveMessageSlot( sizeof( LocalType ) ); + 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 ); + new(slot) LocalType(&camera, &Camera::SetFarClippingPlane, parameter); } -inline void SetNearClippingPlaneMessage( EventThreadServices& eventThreadServices, const Camera& camera, float parameter ) +inline void SetReflectByPlaneMessage(EventThreadServices& eventThreadServices, const Camera& camera, const Vector4& plane) { - typedef MessageValue1< Camera, float > LocalType; + using LocalType = MessageValue1; // Reserve some memory inside the message queue - uint32_t* slot = eventThreadServices.ReserveMessageSlot( sizeof( LocalType ) ); + 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 ); + new(slot) LocalType(&camera, &Camera::SetReflectByPlane, plane); } -inline void SetFarClippingPlaneMessage( EventThreadServices& eventThreadServices, const Camera& camera, float parameter ) +inline void SetTargetPositionMessage(EventThreadServices& eventThreadServices, const Camera& camera, const Vector3& parameter) { - typedef MessageValue1< Camera, float > LocalType; + using LocalType = MessageValue1; // Reserve some memory inside the message queue - uint32_t* slot = eventThreadServices.ReserveMessageSlot( sizeof( LocalType ) ); + 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 ); + new(slot) LocalType(&camera, &Camera::SetTargetPosition, parameter); } -inline void SetTargetPositionMessage( EventThreadServices& eventThreadServices, const Camera& camera, const Vector3& parameter ) +inline void SetInvertYAxisMessage(EventThreadServices& eventThreadServices, const Camera& camera, bool parameter) { - typedef MessageValue1< Camera, Vector3 > LocalType; + using LocalType = MessageValue1; // Reserve some memory inside the message queue - uint32_t* slot = eventThreadServices.ReserveMessageSlot( sizeof( LocalType ) ); + 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 ); + new(slot) LocalType(&camera, &Camera::SetInvertYAxis, parameter); } -inline void SetInvertYAxisMessage( EventThreadServices& eventThreadServices, const Camera& camera, bool parameter ) +inline void RotateProjectionMessage(EventThreadServices& eventThreadServices, const Camera& camera, int parameter) { - typedef MessageValue1< Camera, bool > LocalType; + typedef MessageValue1 LocalType; // Reserve some memory inside the message queue - uint32_t* slot = eventThreadServices.ReserveMessageSlot( sizeof( LocalType ) ); + 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::SetInvertYAxis, parameter ); + new(slot) LocalType(&camera, &Camera::RotateProjection, parameter); } } // namespace SceneGraph