- By using OrderIndex, Shadow RenderTask can be created only it is required.
Change-Id: I65a14ff4db167b1aa546be81f80238008322e7b5
Signed-off-by: seungho baek <sbsh.baek@samsung.com>
END_TEST;
}
+
+namespace
+{
+constexpr int32_t SCENE_ORDER_INDEX = 100;
+constexpr int32_t SHADOW_ORDER_INDEX = 99;
+}
+
+int UtcDaliLightShadowRenderTask(void)
+{
+ ToolkitTestApplication application;
+ RenderTaskList taskList = application.GetScene().GetRenderTaskList();
+ DALI_TEST_EQUALS(1, taskList.GetTaskCount(), TEST_LOCATION);
+
+ Scene3D::SceneView sceneView = Scene3D::SceneView::New();
+ sceneView.SetProperty(Dali::Actor::Property::ANCHOR_POINT, AnchorPoint::CENTER);
+ sceneView.SetProperty(Dali::Actor::Property::PARENT_ORIGIN, ParentOrigin::CENTER);
+ sceneView.SetProperty(Dali::Actor::Property::WIDTH_RESIZE_POLICY, ResizePolicy::FILL_TO_PARENT);
+ sceneView.SetProperty(Dali::Actor::Property::HEIGHT_RESIZE_POLICY, ResizePolicy::FILL_TO_PARENT);
+ application.GetScene().Add(sceneView);
+
+ DALI_TEST_EQUALS(2, taskList.GetTaskCount(), TEST_LOCATION);
+
+ sceneView.UseFramebuffer(true);
+
+ DALI_TEST_EQUALS(2, taskList.GetTaskCount(), TEST_LOCATION);
+ DALI_TEST_EQUALS(0, taskList.GetTask(0u).GetOrderIndex(), TEST_LOCATION);
+ DALI_TEST_EQUALS(SCENE_ORDER_INDEX, taskList.GetTask(1u).GetOrderIndex(), TEST_LOCATION);
+
+ Scene3D::Light light = Scene3D::Light::New();
+ light.SetProperty(Dali::Actor::Property::COLOR, Color::BLUE);
+ Dali::DevelActor::LookAt(light, Vector3(1.0f, 0.0f, 0.0f));
+ light.EnableShadow(true);
+ sceneView.Add(light);
+
+ DALI_TEST_EQUALS(3, taskList.GetTaskCount(), TEST_LOCATION);
+ DALI_TEST_EQUALS(0, taskList.GetTask(0u).GetOrderIndex(), TEST_LOCATION);
+ DALI_TEST_EQUALS(SCENE_ORDER_INDEX, taskList.GetTask(1u).GetOrderIndex(), TEST_LOCATION);
+ DALI_TEST_EQUALS(SHADOW_ORDER_INDEX, taskList.GetTask(2u).GetOrderIndex(), TEST_LOCATION);
+
+ application.SendNotification();
+
+ DALI_TEST_EQUALS(SHADOW_ORDER_INDEX, taskList.GetTask(1u).GetOrderIndex(), TEST_LOCATION);
+ DALI_TEST_EQUALS(SCENE_ORDER_INDEX, taskList.GetTask(2u).GetOrderIndex(), TEST_LOCATION);
+
+ light.EnableShadow(false);
+
+ DALI_TEST_EQUALS(2, taskList.GetTaskCount(), TEST_LOCATION);
+ DALI_TEST_EQUALS(0, taskList.GetTask(0u).GetOrderIndex(), TEST_LOCATION);
+ DALI_TEST_EQUALS(SCENE_ORDER_INDEX, taskList.GetTask(1u).GetOrderIndex(), TEST_LOCATION);
+
+ END_TEST;
+}
\ No newline at end of file
application.Render();
renderTaskCount = application.GetScene().GetRenderTaskList().GetTaskCount();
- DALI_TEST_EQUALS(baseRenderTaskCount + 2u, renderTaskCount, TEST_LOCATION);
+ DALI_TEST_EQUALS(baseRenderTaskCount + 1u, renderTaskCount, TEST_LOCATION);
- RenderTask renderTask = application.GetScene().GetRenderTaskList().GetTask(baseRenderTaskCount + 1u);
+ RenderTask renderTask = application.GetScene().GetRenderTaskList().GetTask(baseRenderTaskCount);
CameraActor camera = renderTask.GetCameraActor();
CameraActor defaultCamera = renderTask.GetCameraActor();
application.SendNotification();
application.Render();
- RenderTask renderTask = application.GetScene().GetRenderTaskList().GetTask(baseRenderTaskCount + 1u);
+ RenderTask renderTask = application.GetScene().GetRenderTaskList().GetTask(baseRenderTaskCount);
DALI_TEST_CHECK(!renderTask.GetFrameBuffer());
view.UseFramebuffer(true);
application.GetScene().Add(view);
- DALI_TEST_EQUALS(baseRenderTaskCount + 2, application.GetScene().GetRenderTaskList().GetTaskCount(), TEST_LOCATION);
+ DALI_TEST_EQUALS(baseRenderTaskCount + 1, application.GetScene().GetRenderTaskList().GetTaskCount(), TEST_LOCATION);
view.Unparent();
tet_printf("Test Framebuffer result target created well\n");
view.UseFramebuffer(true);
- RenderTask renderTask = renderTaskList.GetTask(baseRenderTaskCount + 1u);
+ RenderTask renderTask = renderTaskList.GetTask(baseRenderTaskCount);
DALI_TEST_CHECK(renderTask);
FrameBuffer frameBuffer = renderTask.GetFrameBuffer();
tet_printf("Test Framebuffer result target created well after create new FBO, by set multisampling level\n");
view.SetFramebufferMultiSamplingLevel(2u);
- renderTask = renderTaskList.GetTask(baseRenderTaskCount + 1u);
+ renderTask = renderTaskList.GetTask(baseRenderTaskCount);
DALI_TEST_CHECK(renderTask);
frameBuffer = renderTask.GetFrameBuffer();
expectHeight = 103u;
view.SetResolution(expectWidth, expectHeight);
- renderTask = renderTaskList.GetTask(baseRenderTaskCount + 1u);
+ renderTask = renderTaskList.GetTask(baseRenderTaskCount);
DALI_TEST_CHECK(renderTask);
frameBuffer = renderTask.GetFrameBuffer();
constexpr int32_t INVALID_INDEX = -1;
constexpr uint32_t MAXIMUM_SIZE_SHADOW_MAP = 2048;
+constexpr int32_t SCENE_ORDER_INDEX = 100;
+constexpr int32_t SHADOW_ORDER_INDEX = 99;
+
static constexpr std::string_view SKYBOX_INTENSITY_STRING = "uIntensity";
static constexpr std::string_view Y_FLIP_MASK_TEXTURE = "uYFlipMaskTexture";
static constexpr float FLIP_MASK_TEXTURE = 1.0f;
UpdateShadowMapBuffer(shadowMapBufferSize);
// use lightCamera as a camera of shadow render task.
- mShadowMapRenderTask.SetCameraActor(lightCamera);
+ if(mShadowMapRenderTask)
+ {
+ mShadowMapRenderTask.SetCameraActor(lightCamera);
+ }
mShaderManager->SetShadow(light);
+ UpdateShadowMapBuffer(shadowMapBufferSize);
}
void SceneView::RemoveShadow(Scene3D::Light light)
// reset framebuffer and remove it from render task.
mShadowFrameBuffer.Reset();
mShaderManager->RemoveShadow();
- mShadowMapRenderTask.SetCameraActor(CameraActor());
+ if(mShadowMapRenderTask)
+ {
+ mShadowMapRenderTask.SetCameraActor(CameraActor());
+ }
mShadowLight.Reset();
SetShadow(lightEntity.first);
break;
}
+
+ if(mShadowMapRenderTask)
+ {
+ RenderTaskList taskList = Integration::SceneHolder::Get(Self()).GetRenderTaskList();
+ taskList.RemoveTask(mShadowMapRenderTask);
+ mShadowMapRenderTask.Reset();
+ }
}
uint32_t SceneView::GetActivatedLightCount() const
if(mSceneHolder)
{
RenderTaskList taskList = mSceneHolder.GetRenderTaskList();
- mShadowMapRenderTask = taskList.CreateTask();
- mShadowMapRenderTask.SetSourceActor(mRootLayer);
- mShadowMapRenderTask.SetExclusive(true);
- mShadowMapRenderTask.SetInputEnabled(false);
- mShadowMapRenderTask.SetCullMode(false);
- mShadowMapRenderTask.SetClearEnabled(true);
- mShadowMapRenderTask.SetClearColor(Color::WHITE);
- mShadowMapRenderTask.SetRenderPassTag(10);
- mShadowMapRenderTask.SetCameraActor(CameraActor());
-
mRenderTask = taskList.CreateTask();
mRenderTask.SetSourceActor(mRootLayer);
mRenderTask.SetExclusive(true);
mRenderTask.SetInputEnabled(true);
mRenderTask.SetCullMode(false);
+ mRenderTask.SetOrderIndex(SCENE_ORDER_INDEX);
mRenderTask.SetScreenToFrameBufferMappingActor(Self());
UpdateRenderTask();
void SceneView::UpdateShadowMapBuffer(uint32_t shadowMapSize)
{
+ if(!mShadowLight)
+ {
+ return;
+ }
+
+ if(!mShadowMapRenderTask)
+ {
+ RenderTaskList taskList = Integration::SceneHolder::Get(Self()).GetRenderTaskList();
+ mShadowMapRenderTask = taskList.CreateTask();
+ mShadowMapRenderTask.SetSourceActor(mRootLayer);
+ mShadowMapRenderTask.SetExclusive(true);
+ mShadowMapRenderTask.SetInputEnabled(false);
+ mShadowMapRenderTask.SetCullMode(false);
+ mShadowMapRenderTask.SetClearEnabled(true);
+ mShadowMapRenderTask.SetClearColor(Color::WHITE);
+ mShadowMapRenderTask.SetRenderPassTag(10);
+ mShadowMapRenderTask.SetCameraActor(GetImplementation(mShadowLight).GetCamera());
+ mShadowMapRenderTask.SetOrderIndex(SHADOW_ORDER_INDEX);
+ }
+
Dali::FrameBuffer currentShadowFrameBuffer = mShadowMapRenderTask.GetFrameBuffer();
- if(mShadowLight &&
- (!currentShadowFrameBuffer ||
- !mShadowTexture ||
- !Dali::Equals(DevelFrameBuffer::GetDepthTexture(currentShadowFrameBuffer).GetWidth(), shadowMapSize)))
+ if(!currentShadowFrameBuffer ||
+ !mShadowTexture ||
+ !Dali::Equals(DevelFrameBuffer::GetDepthTexture(currentShadowFrameBuffer).GetWidth(), shadowMapSize))
{
mShadowFrameBuffer.Reset();
mShadowTexture = Dali::Texture::New(TextureType::TEXTURE_2D, Pixel::DEPTH_UNSIGNED_INT, shadowMapSize, shadowMapSize);