#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.
*/
// INTERNAL INCLUDES
-#include <dali/public-api/math/rect.h>
-#include <dali/public-api/actors/camera-actor.h>
#include <dali/internal/common/message.h>
#include <dali/internal/event/common/event-thread-services.h>
#include <dali/internal/update/common/double-buffered.h>
#include <dali/internal/update/common/inherited-property.h>
+#include <dali/public-api/actors/camera-actor.h>
+#include <dali/public-api/math/rect.h>
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<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;
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
struct Plane
{
Vector3 mNormal;
- float mDistance;
+ float mDistance;
};
/**
*/
struct FrustumPlanes
{
- Plane mPlanes[ 6 ];
- Vector3 mSign[ 6 ];
+ Plane mPlanes[6];
+ Vector3 mSign[6];
};
/**
* 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.
/**
* @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
/**
* @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
* @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.
*
* @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.
*
* @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.
* 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();
private:
-
/**
* Constructor
*/
* @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
- 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< FrustumPlanes > mFrustum; ///< Clipping frustum; double buffered for input handling
- DoubleBuffered< Matrix > mInverseViewProjection; ///< Inverted viewprojection; double buffered for input handling
- DoubleBuffered< Matrix > mFinalProjection; ///< Final projection matrix; double buffered for input handling
-
+ 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<FrustumPlanes> mFrustum; ///< Clipping frustum; double buffered for input handling
+ DoubleBuffered<Matrix> mInverseViewProjection; ///< Inverted viewprojection; double buffered for input handling
+ 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 )
+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 ) );
+ 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::SetType, parameter);
}
-inline void SetProjectionModeMessage( EventThreadServices& eventThreadServices, const Camera& camera, Dali::Camera::ProjectionMode 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 ) );
+ 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 );
+ new(slot) LocalProjectionMode(&camera, &Camera::SetProjectionMode, parameter);
}
-inline void SetFieldOfViewMessage( EventThreadServices& eventThreadServices, const Camera& camera, float 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 ) );
+ 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::SetFieldOfView, parameter);
}
-inline void SetAspectRatioMessage( EventThreadServices& eventThreadServices, const Camera& camera, float 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 ) );
+ 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::SetAspectRatio, parameter);
}
-inline void SetLeftClippingPlaneMessage( EventThreadServices& eventThreadServices, const Camera& camera, float 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 ) );
+ 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::SetLeftClippingPlane, parameter);
}
-inline void SetRightClippingPlaneMessage( EventThreadServices& eventThreadServices, const Camera& camera, float 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 ) );
+ 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::SetRightClippingPlane, parameter);
}
-inline void SetTopClippingPlaneMessage( EventThreadServices& eventThreadServices, const Camera& camera, float 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 ) );
+ 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::SetTopClippingPlane, parameter);
}
-inline void SetBottomClippingPlaneMessage( EventThreadServices& eventThreadServices, const Camera& camera, float 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 ) );
+ 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::SetBottomClippingPlane, parameter);
}
-inline void SetNearClippingPlaneMessage( EventThreadServices& eventThreadServices, const Camera& camera, float 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 ) );
+ 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::SetNearClippingPlane, parameter);
}
-inline void SetFarClippingPlaneMessage( EventThreadServices& eventThreadServices, const Camera& camera, float 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 ) );
+ 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 SetReflectByPlaneMessage(EventThreadServices& eventThreadServices, const Camera& camera, const Vector4& plane)
+{
+ using LocalType = MessageValue1<Camera, Vector4>;
+
+ // 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 );
+ new(slot) LocalType(&camera, &Camera::SetReflectByPlane, plane);
}
-inline void SetTargetPositionMessage( EventThreadServices& eventThreadServices, const Camera& camera, const Vector3& 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 ) );
+ 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::SetTargetPosition, parameter);
}
-inline void SetInvertYAxisMessage( EventThreadServices& eventThreadServices, const Camera& camera, bool 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 ) );
+ 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 );
+ new(slot) LocalType(&camera, &Camera::SetInvertYAxis, parameter);
}
-inline void RotateProjectionMessage( EventThreadServices& eventThreadServices, const Camera& camera, int parameter )
+inline void RotateProjectionMessage(EventThreadServices& eventThreadServices, const Camera& camera, int parameter)
{
- typedef MessageValue1< Camera, int > LocalType;
+ typedef MessageValue1<Camera, int> LocalType;
// Reserve some memory inside the message queue
- unsigned int* 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::RotateProjection, parameter );
+ new(slot) LocalType(&camera, &Camera::RotateProjection, parameter);
}
} // namespace SceneGraph