Fixing culling for magnifier use case
[platform/core/uifw/dali-core.git] / dali / internal / update / render-tasks / scene-graph-camera.h
index a3bc173..23e1c54 100644 (file)
@@ -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.
  */
 
 // 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;
 
@@ -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<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
+};
 
-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<Camera, Dali::Camera::Type>;
 
-  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<Camera, Dali::Camera::ProjectionMode>;
 
-};
+  // 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<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::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<Camera, float>;
 
   // 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<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::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<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::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<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::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<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::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<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::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<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::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<Camera, Vector4>;
 
   // 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<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::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<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::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<Camera, int> 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