Merge changes I8783ad29,I2c860a84 into devel/master
[platform/core/uifw/dali-core.git] / dali / internal / update / render-tasks / scene-graph-render-task.cpp
index 3196166..d49af14 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * 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.
@@ -93,6 +93,16 @@ Node* RenderTask::GetSourceNode() const
   return mSourceNode;
 }
 
+void RenderTask::SetViewportGuideNode(Node* node)
+{
+  mViewportGuideNode = node;
+}
+
+Node* RenderTask::GetViewportGuideNode() const
+{
+  return mViewportGuideNode;
+}
+
 void RenderTask::SetExclusive(bool exclusive)
 {
   mExclusive = exclusive;
@@ -157,21 +167,11 @@ bool RenderTask::QueryViewport(BufferIndex bufferIndex, Viewport& viewport) cons
   return true;
 }
 
-void RenderTask::SetClearColor(BufferIndex updateBufferIndex, const Vector4& value)
-{
-  mClearColor.Set(updateBufferIndex, value);
-}
-
 const Vector4& RenderTask::GetClearColor(BufferIndex bufferIndex) const
 {
   return mClearColor[bufferIndex];
 }
 
-void RenderTask::BakeClearColor(BufferIndex updateBufferIndex, const Vector4& value)
-{
-  mClearColor.Bake(updateBufferIndex, value);
-}
-
 void RenderTask::SetClearEnabled(bool enabled)
 {
   mClearEnabled = enabled;
@@ -346,7 +346,7 @@ const Matrix& RenderTask::GetViewMatrix(BufferIndex bufferIndex) const
   return mCamera->GetViewMatrix(bufferIndex);
 }
 
-SceneGraph::Camera& RenderTask::GetCamera() const
+const SceneGraph::Camera& RenderTask::GetCamera() const
 {
   DALI_ASSERT_DEBUG(nullptr != mCamera);
   return *mCamera;
@@ -403,9 +403,25 @@ bool RenderTask::ViewMatrixUpdated()
   return retval;
 }
 
-void RenderTask::SetViewportPosition(BufferIndex updateBufferIndex, const Vector2& value)
+void RenderTask::UpdateViewport(BufferIndex updateBufferIndex, Vector2 sceneSize, Vector3 cameraPosition)
 {
-  mViewportPosition.Set(updateBufferIndex, value);
+  if(GetViewportGuideNode() && GetViewportGuideNode()->ConnectedToScene())
+  {
+    Vector3 worldPosition = GetViewportGuideNode()->GetWorldPosition(updateBufferIndex);
+    worldPosition -= cameraPosition;
+
+    Vector3 nodeSize = GetViewportGuideNode()->GetSize(updateBufferIndex) * GetViewportGuideNode()->GetWorldScale(updateBufferIndex);
+    Vector2 halfSceneSize(sceneSize.width * 0.5f, sceneSize.height * 0.5f); // World position origin is center of scene
+    Vector3 halfNodeSize(nodeSize * 0.5f);
+    Vector2 screenPosition(halfSceneSize.width + worldPosition.x - halfNodeSize.x,
+                           halfSceneSize.height + worldPosition.y - halfNodeSize.y);
+
+    /* This is an implicit constraint - the properties will be dirty until the node
+     * is removed. (RenderTask::Impl manages this)
+     */
+    mViewportPosition.Set(updateBufferIndex, screenPosition);
+    mViewportSize.Set(updateBufferIndex, Vector2(nodeSize));
+  }
 }
 
 const Vector2& RenderTask::GetViewportPosition(BufferIndex bufferIndex) const
@@ -413,26 +429,11 @@ const Vector2& RenderTask::GetViewportPosition(BufferIndex bufferIndex) const
   return mViewportPosition[bufferIndex];
 }
 
-void RenderTask::BakeViewportPosition(BufferIndex updateBufferIndex, const Vector2& value)
-{
-  mViewportPosition.Bake(updateBufferIndex, value);
-}
-
-void RenderTask::SetViewportSize(BufferIndex updateBufferIndex, const Vector2& value)
-{
-  mViewportSize.Set(updateBufferIndex, value);
-}
-
 const Vector2& RenderTask::GetViewportSize(BufferIndex bufferIndex) const
 {
   return mViewportSize[bufferIndex];
 }
 
-void RenderTask::BakeViewportSize(BufferIndex updateBufferIndex, const Vector2& value)
-{
-  mViewportSize.Bake(updateBufferIndex, value);
-}
-
 bool RenderTask::GetViewportEnabled(BufferIndex bufferIndex) const
 {
   if(fabsf(mViewportPosition[bufferIndex].x) > Math::MACHINE_EPSILON_1 ||
@@ -482,6 +483,7 @@ RenderTask::RenderTask()
   mRenderSyncTracker(nullptr),
   mSourceNode(nullptr),
   mCameraNode(nullptr),
+  mViewportGuideNode(nullptr),
   mCamera(nullptr),
   mFrameBuffer(nullptr),
   mRefreshRate(Dali::RenderTask::DEFAULT_REFRESH_RATE),