From c3fca0844bdad8df8008e23b08ddbf409f9932c2 Mon Sep 17 00:00:00 2001 From: seungho Date: Wed, 14 Sep 2022 16:12:58 +0900 Subject: [PATCH] Add Set/Get ImageBasedLight ScaleFactor Change-Id: I559cc0684b2c05b4af7639e226e4c4ea0a4dbf9e Signed-off-by: seungho --- .../src/dali-scene3d/utc-Dali-ModelView.cpp | 13 +++++ .../src/dali-scene3d/utc-Dali-SceneView.cpp | 24 +++++++++ .../controls/model-view/model-view-impl.cpp | 60 +++++++++++++++++----- .../internal/controls/model-view/model-view-impl.h | 27 +++++++--- .../controls/scene-view/scene-view-impl.cpp | 27 ++++++++-- .../internal/controls/scene-view/scene-view-impl.h | 20 ++++++-- .../public-api/controls/model-view/model-view.cpp | 18 +++++-- .../public-api/controls/model-view/model-view.h | 27 ++++++++-- .../public-api/controls/scene-view/scene-view.cpp | 20 ++++++-- .../public-api/controls/scene-view/scene-view.h | 28 ++++++++-- 10 files changed, 217 insertions(+), 47 deletions(-) diff --git a/automated-tests/src/dali-scene3d/utc-Dali-ModelView.cpp b/automated-tests/src/dali-scene3d/utc-Dali-ModelView.cpp index 6e3d08f..fb9f435 100644 --- a/automated-tests/src/dali-scene3d/utc-Dali-ModelView.cpp +++ b/automated-tests/src/dali-scene3d/utc-Dali-ModelView.cpp @@ -405,6 +405,19 @@ int UtcDaliModelViewSetImageBasedLightSource03(void) END_TEST; } +int UtcDaliModelViewImageBasedFactor(void) +{ + ToolkitTestApplication application; + + Scene3D::ModelView modelView = Scene3D::ModelView::New(TEST_GLTF_FILE_NAME); + + DALI_TEST_EQUALS(modelView.GetImageBasedLightScaleFactor(), 1.0f, TEST_LOCATION); + + modelView.SetImageBasedLightScaleFactor(0.5f); + DALI_TEST_EQUALS(modelView.GetImageBasedLightScaleFactor(), 0.5f, TEST_LOCATION); + END_TEST; +} + int UtcDaliModelViewFitSize01(void) { ToolkitTestApplication application; diff --git a/automated-tests/src/dali-scene3d/utc-Dali-SceneView.cpp b/automated-tests/src/dali-scene3d/utc-Dali-SceneView.cpp index a6a8332..58bcab0 100644 --- a/automated-tests/src/dali-scene3d/utc-Dali-SceneView.cpp +++ b/automated-tests/src/dali-scene3d/utc-Dali-SceneView.cpp @@ -461,6 +461,30 @@ int UtcDaliSceneViewImageBasedLight(void) END_TEST; } +int UtcDaliSceneViewImageBasedFactor(void) +{ + ToolkitTestApplication application; + + Scene3D::SceneView view = Scene3D::SceneView::New(); + view.SetProperty(Dali::Actor::Property::SIZE, Vector2(100, 100)); + + application.GetScene().Add(view); + + application.SendNotification(); + application.Render(); + + Scene3D::ModelView modelView1 = Scene3D::ModelView::New(TEST_GLTF_FILE_NAME); + view.Add(modelView1); + + DALI_TEST_EQUALS(view.GetImageBasedLightScaleFactor(), 1.0f, TEST_LOCATION); + DALI_TEST_EQUALS(modelView1.GetImageBasedLightScaleFactor(), 1.0f, TEST_LOCATION); + + view.SetImageBasedLightScaleFactor(0.5f); + DALI_TEST_EQUALS(view.GetImageBasedLightScaleFactor(), 0.5f, TEST_LOCATION); + DALI_TEST_EQUALS(modelView1.GetImageBasedLightScaleFactor(), 0.5f, TEST_LOCATION); + END_TEST; +} + int UtcDaliSceneViewUseFramebuffer01(void) { ToolkitTestApplication application; diff --git a/dali-scene3d/internal/controls/model-view/model-view-impl.cpp b/dali-scene3d/internal/controls/model-view/model-view-impl.cpp index 06ed187..5bf8ece 100644 --- a/dali-scene3d/internal/controls/model-view/model-view-impl.cpp +++ b/dali-scene3d/internal/controls/model-view/model-view-impl.cpp @@ -203,7 +203,7 @@ Dali::Scene3D::ModelView ModelView::New(const std::string& modelPath, const std: return handle; } -const Actor ModelView::GetModelRoot() +const Actor ModelView::GetModelRoot() const { return mModelRoot; } @@ -240,20 +240,41 @@ void ModelView::SetImageBasedLightTexture(Dali::Texture diffuse, Dali::Texture s { if(diffuse && specular) { - mDiffuseTexture = diffuse; - mSpecularTexture = specular; - mIblScaleFactor = scaleFactor; + if(mDiffuseTexture != diffuse || mSpecularTexture != specular) + { + mDiffuseTexture = diffuse; + mSpecularTexture = specular; + UpdateImageBasedLightTexture(); + } + if(mIblScaleFactor != scaleFactor) + { + mIblScaleFactor = scaleFactor; + UpdateImageBasedLightScaleFactor(); + } - UpdateImageBasedLight(); } } -uint32_t ModelView::GetAnimationCount() +void ModelView::SetImageBasedLightScaleFactor(float scaleFactor) +{ + mIblScaleFactor = scaleFactor; + if(mDiffuseTexture && mSpecularTexture) + { + UpdateImageBasedLightScaleFactor(); + } +} + +float ModelView::GetImageBasedLightScaleFactor() const +{ + return mIblScaleFactor; +} + +uint32_t ModelView::GetAnimationCount() const { return mAnimations.size(); } -Dali::Animation ModelView::GetAnimation(uint32_t index) +Dali::Animation ModelView::GetAnimation(uint32_t index) const { Dali::Animation animation; if(mAnimations.size() > index) @@ -263,7 +284,7 @@ Dali::Animation ModelView::GetAnimation(uint32_t index) return animation; } -Dali::Animation ModelView::GetAnimation(const std::string& name) +Dali::Animation ModelView::GetAnimation(const std::string& name) const { Dali::Animation animation; if(!name.empty()) @@ -461,7 +482,8 @@ void ModelView::LoadModel() mRenderableActors.clear(); CollectRenderableActor(mModelRoot); - UpdateImageBasedLight(); + UpdateImageBasedLightTexture(); + UpdateImageBasedLightScaleFactor(); mNaturalSize = AABB.CalculateSize(); mModelPivot = AABB.CalculatePivot(); @@ -541,7 +563,7 @@ void ModelView::CollectRenderableActor(Actor actor) } } -void ModelView::UpdateImageBasedLight() +void ModelView::UpdateImageBasedLightTexture() { if(!mDiffuseTexture || !mSpecularTexture) { @@ -553,8 +575,6 @@ void ModelView::UpdateImageBasedLight() Actor renderableActor = actor.GetHandle(); if(renderableActor) { - renderableActor.RegisterProperty(Dali::Scene3D::Loader::NodeDefinition::GetIblScaleFactorUniformName().data(), mIblScaleFactor); - uint32_t rendererCount = renderableActor.GetRendererCount(); for(uint32_t i = 0; i < rendererCount; ++i) { @@ -578,6 +598,22 @@ void ModelView::UpdateImageBasedLight() } } +void ModelView::UpdateImageBasedLightScaleFactor() +{ + if(!mDiffuseTexture || !mSpecularTexture) + { + return; + } + for(auto&& actor : mRenderableActors) + { + Actor renderableActor = actor.GetHandle(); + if(renderableActor) + { + renderableActor.RegisterProperty(Dali::Scene3D::Loader::NodeDefinition::GetIblScaleFactorUniformName().data(), mIblScaleFactor); + } + } +} + } // namespace Internal } // namespace Scene3D } // namespace Dali diff --git a/dali-scene3d/internal/controls/model-view/model-view-impl.h b/dali-scene3d/internal/controls/model-view/model-view-impl.h index 2ec360f..77315e3 100644 --- a/dali-scene3d/internal/controls/model-view/model-view-impl.h +++ b/dali-scene3d/internal/controls/model-view/model-view-impl.h @@ -55,7 +55,7 @@ public: /** * @copydoc ModelView::GetModelRoot() */ - const Actor GetModelRoot(); + const Actor GetModelRoot() const; /** * @copydoc ModelView::FitModel() @@ -78,19 +78,29 @@ public: void SetImageBasedLightTexture(Dali::Texture diffuse, Dali::Texture specular, float scaleFactor); /** + * @copydoc ModelView::SetImageBasedLightScaleFactor() + */ + void SetImageBasedLightScaleFactor(float scaleFactor); + + /** + * @copydoc ModelView::GetImageBasedLightScaleFactor() + */ + float GetImageBasedLightScaleFactor() const; + + /** * @copydoc ModelView::GetAnimationCount() */ - uint32_t GetAnimationCount(); + uint32_t GetAnimationCount() const; /** * @copydoc ModelView::GetAnimation() */ - Dali::Animation GetAnimation(uint32_t index); + Dali::Animation GetAnimation(uint32_t index) const; /** * @copydoc ModelView::GetAnimation() */ - Dali::Animation GetAnimation(const std::string& name); + Dali::Animation GetAnimation(const std::string& name) const; protected: /** @@ -160,9 +170,14 @@ private: void CollectRenderableActor(Actor actor); /** - * @brief Changes IBL information of the input node. + * @brief Changes IBL textures of the input node. + */ + void UpdateImageBasedLightTexture(); + + /** + * @brief Changes IBL scale factor of the input node. */ - void UpdateImageBasedLight(); + void UpdateImageBasedLightScaleFactor(); private: std::string mModelPath; diff --git a/dali-scene3d/internal/controls/scene-view/scene-view-impl.cpp b/dali-scene3d/internal/controls/scene-view/scene-view-impl.cpp index 99ddef2..f0afd0d 100644 --- a/dali-scene3d/internal/controls/scene-view/scene-view-impl.cpp +++ b/dali-scene3d/internal/controls/scene-view/scene-view-impl.cpp @@ -118,17 +118,17 @@ void SceneView::RemoveCamera(CameraActor camera) } } -uint32_t SceneView::GetCameraCount() +uint32_t SceneView::GetCameraCount() const { return mCameras.size(); } -CameraActor SceneView::GetSelectedCamera() +CameraActor SceneView::GetSelectedCamera() const { return mSelectedCamera; } -CameraActor SceneView::GetCamera(uint32_t index) +CameraActor SceneView::GetCamera(uint32_t index) const { if(index < mCameras.size()) { @@ -138,7 +138,7 @@ CameraActor SceneView::GetCamera(uint32_t index) return CameraActor(); } -CameraActor SceneView::GetCamera(const std::string& name) +CameraActor SceneView::GetCamera(const std::string& name) const { CameraActor returnCamera; for(auto&& camera : mCameras) @@ -212,6 +212,23 @@ void SceneView::SetImageBasedLightSource(const std::string& diffuse, const std:: Control::SetResourceReady(false); } +void SceneView::SetImageBasedLightScaleFactor(float scaleFactor) +{ + mIblScaleFactor = scaleFactor; + for(auto&& model : mModels) + { + if(model) + { + model.SetImageBasedLightScaleFactor(scaleFactor); + } + } +} + +float SceneView::GetImageBasedLightScaleFactor() const +{ + return mIblScaleFactor; +} + void SceneView::UseFramebuffer(bool useFramebuffer) { if(mUseFrameBuffer != useFramebuffer) @@ -221,7 +238,7 @@ void SceneView::UseFramebuffer(bool useFramebuffer) } } -bool SceneView::IsUsingFramebuffer() +bool SceneView::IsUsingFramebuffer() const { return mUseFrameBuffer; } diff --git a/dali-scene3d/internal/controls/scene-view/scene-view-impl.h b/dali-scene3d/internal/controls/scene-view/scene-view-impl.h index e3de91e..f61ad8a 100644 --- a/dali-scene3d/internal/controls/scene-view/scene-view-impl.h +++ b/dali-scene3d/internal/controls/scene-view/scene-view-impl.h @@ -67,22 +67,22 @@ public: /** * @copydoc SceneView::GetCameraCount() */ - uint32_t GetCameraCount(); + uint32_t GetCameraCount() const; /** * @copydoc SceneView::GetSelectedCamera() */ - CameraActor GetSelectedCamera(); + CameraActor GetSelectedCamera() const; /** * @copydoc SceneView::GetCamera() */ - CameraActor GetCamera(uint32_t index); + CameraActor GetCamera(uint32_t index) const; /** * @copydoc SceneView::GetCamera() */ - CameraActor GetCamera(const std::string& name); + CameraActor GetCamera(const std::string& name) const; /** * @copydoc SceneView::SelectCamera() @@ -116,6 +116,16 @@ public: void SetImageBasedLightSource(const std::string& diffuse, const std::string& specular, float scaleFactor); /** + * @copydoc SceneView::SetImageBasedLightScaleFactor() + */ + void SetImageBasedLightScaleFactor(float scaleFactor); + + /** + * @copydoc SceneView::GetImageBasedLightScaleFactor() + */ + float GetImageBasedLightScaleFactor() const; + + /** * @copydoc SceneView::UseFramebuffer() */ void UseFramebuffer(bool useFramebuffer); @@ -123,7 +133,7 @@ public: /** * @copydoc SceneView::IsUsingFramebuffer() */ - bool IsUsingFramebuffer(); + bool IsUsingFramebuffer() const; protected: /** diff --git a/dali-scene3d/public-api/controls/model-view/model-view.cpp b/dali-scene3d/public-api/controls/model-view/model-view.cpp index a799377..5d5ede5 100644 --- a/dali-scene3d/public-api/controls/model-view/model-view.cpp +++ b/dali-scene3d/public-api/controls/model-view/model-view.cpp @@ -62,7 +62,7 @@ ModelView::ModelView(Dali::Internal::CustomActor* internal) VerifyCustomActorPointer(internal); } -const Actor ModelView::GetModelRoot() +const Actor ModelView::GetModelRoot() const { return GetImpl(*this).GetModelRoot(); } @@ -87,17 +87,27 @@ void ModelView::SetImageBasedLightTexture(Texture diffuse, Texture specular, flo GetImpl(*this).SetImageBasedLightTexture(diffuse, specular, scaleFactor); } -uint32_t ModelView::GetAnimationCount() +void ModelView::SetImageBasedLightScaleFactor(float scaleFactor) +{ + GetImpl(*this).SetImageBasedLightScaleFactor(scaleFactor); +} + +float ModelView::GetImageBasedLightScaleFactor() const +{ + return GetImpl(*this).GetImageBasedLightScaleFactor(); +} + +uint32_t ModelView::GetAnimationCount() const { return GetImpl(*this).GetAnimationCount(); } -Dali::Animation ModelView::GetAnimation(uint32_t index) +Dali::Animation ModelView::GetAnimation(uint32_t index) const { return GetImpl(*this).GetAnimation(index); } -Dali::Animation ModelView::GetAnimation(const std::string& name) +Dali::Animation ModelView::GetAnimation(const std::string& name) const { return GetImpl(*this).GetAnimation(name); } diff --git a/dali-scene3d/public-api/controls/model-view/model-view.h b/dali-scene3d/public-api/controls/model-view/model-view.h index ce5e249..19ea4c3 100644 --- a/dali-scene3d/public-api/controls/model-view/model-view.h +++ b/dali-scene3d/public-api/controls/model-view/model-view.h @@ -137,7 +137,7 @@ public: * @brief Retrieves model root Actor. * @return Root Actor of the model. */ - const Actor GetModelRoot(); + const Actor GetModelRoot() const; /** * @brief Fits the model to the Control size. @@ -165,7 +165,7 @@ public: void SetImageBasedLightSource(const std::string& diffuse, const std::string& specular, float scaleFactor = 1.0f); /** - * @brief Set Image Based Light Texture. + * @brief Sets Image Based Light Texture. * * @param[in] diffuse cube map texture that can be used as a diffuse IBL source. * @param[in] specular cube map texture that can be used as a specular IBL source. @@ -176,11 +176,28 @@ public: void SetImageBasedLightTexture(Texture diffuse, Texture specular, float scaleFactor = 1.0f); /** + * @brief Sets Scale Factor of Image Based Light Source. + * + * @note If SetImageBasedLightSource() or SetImageBasedLightTexture() method is called after this method, scaleFactor is overrided. + * + * @param[in] scaleFactor scale factor that controls light source intensity in [0.0f, 1.0f]. + */ + void SetImageBasedLightScaleFactor(float scaleFactor); + + /** + * @brief Gets Scale Factor of Image Based Light Source. + * Default value is 1.0f. + * + * @return scale factor that controls light source intensity. + */ + float GetImageBasedLightScaleFactor() const; + + /** * @brief Gets number of animations those loaded from model file. * @return The number of loaded animations. * @note This method should be called after Model load finished. */ - uint32_t GetAnimationCount(); + uint32_t GetAnimationCount() const; /** * @brief Gets animation at the index. @@ -188,7 +205,7 @@ public: * @return Animation at the index. * @note This method should be called after Model load finished. */ - Dali::Animation GetAnimation(uint32_t index); + Dali::Animation GetAnimation(uint32_t index) const; /** * @brief Retrieves animation with the given name. @@ -196,7 +213,7 @@ public: * @return Animation that has the given name. * @note This method should be called after Model load finished. */ - Dali::Animation GetAnimation(const std::string& name); + Dali::Animation GetAnimation(const std::string& name) const; public: // Not intended for application developers /// @cond internal diff --git a/dali-scene3d/public-api/controls/scene-view/scene-view.cpp b/dali-scene3d/public-api/controls/scene-view/scene-view.cpp index cb07590..530d4f1 100644 --- a/dali-scene3d/public-api/controls/scene-view/scene-view.cpp +++ b/dali-scene3d/public-api/controls/scene-view/scene-view.cpp @@ -72,22 +72,22 @@ void SceneView::RemoveCamera(CameraActor camera) GetImpl(*this).RemoveCamera(camera); } -uint32_t SceneView::GetCameraCount() +uint32_t SceneView::GetCameraCount() const { return GetImpl(*this).GetCameraCount(); } -CameraActor SceneView::GetSelectedCamera() +CameraActor SceneView::GetSelectedCamera() const { return GetImpl(*this).GetSelectedCamera(); } -CameraActor SceneView::GetCamera(uint32_t index) +CameraActor SceneView::GetCamera(uint32_t index) const { return GetImpl(*this).GetCamera(index); } -CameraActor SceneView::GetCamera(const std::string& name) +CameraActor SceneView::GetCamera(const std::string& name) const { return GetImpl(*this).GetCamera(name); } @@ -107,12 +107,22 @@ void SceneView::SetImageBasedLightSource(const std::string& diffuse, const std:: GetImpl(*this).SetImageBasedLightSource(diffuse, specular, scaleFactor); } +void SceneView::SetImageBasedLightScaleFactor(float scaleFactor) +{ + GetImpl(*this).SetImageBasedLightScaleFactor(scaleFactor); +} + +float SceneView::GetImageBasedLightScaleFactor() const +{ + return GetImpl(*this).GetImageBasedLightScaleFactor(); +} + void SceneView::UseFramebuffer(bool useFramebuffer) { GetImpl(*this).UseFramebuffer(useFramebuffer); } -bool SceneView::IsUsingFramebuffer() +bool SceneView::IsUsingFramebuffer() const { return GetImpl(*this).IsUsingFramebuffer(); } diff --git a/dali-scene3d/public-api/controls/scene-view/scene-view.h b/dali-scene3d/public-api/controls/scene-view/scene-view.h index cbbe9e0..0e4f10e 100644 --- a/dali-scene3d/public-api/controls/scene-view/scene-view.h +++ b/dali-scene3d/public-api/controls/scene-view/scene-view.h @@ -195,14 +195,14 @@ public: * * @return Number of cameras those currently the SceneView contains. */ - uint32_t GetCameraCount(); + uint32_t GetCameraCount() const; /** * @brief Retrieves selected CameraActor. * * @return CameraActor currently used in SceneView as a selected CameraActor */ - CameraActor GetSelectedCamera(); + CameraActor GetSelectedCamera() const; /** * @brief Retrieves a CameraActor of the index. @@ -211,7 +211,7 @@ public: * * @return CameraActor of the index */ - CameraActor GetCamera(uint32_t index); + CameraActor GetCamera(uint32_t index) const; /** * @brief Retrieves a CameraActor of the name. @@ -220,7 +220,7 @@ public: * * @return CameraActor that has the name as a Dali::Actor::Property::NAME */ - CameraActor GetCamera(const std::string& name); + CameraActor GetCamera(const std::string& name) const; /** * @brief Makes SceneView use a CameraActor of index as a selected camera. @@ -250,6 +250,24 @@ public: void SetImageBasedLightSource(const std::string& diffuse, const std::string& specular, float scaleFactor = 1.0f); /** + * @brief Sets Scale Factor of Image Based Light Source. + * + * @note If SetImageBasedLightSource() or SetImageBasedLightTexture() method is called after this method, scaleFactor is overriden. + * @note Default value is 1.0f. + * + * @param[in] scaleFactor scale factor that controls light source intensity in [0.0f, 1.0f]. + */ + void SetImageBasedLightScaleFactor(float scaleFactor); + + /** + * @brief Gets Scale Factor of Image Based Light Source. + * Default value is 1.0f. + * + * @return scale factor that controls light source intensity. + */ + float GetImageBasedLightScaleFactor() const; + + /** * @brief Sets whether to use FBO or not for the SceneView. * If useFramebuffer is true, rendering result of SceneView is drawn on FBO and it is mapping on this SceneView plane. * If useFramebuffer is false, each item in SceneView is rendered on window directly. @@ -267,7 +285,7 @@ public: * * @return bool True if this SceneView uses Framebuffer. */ - bool IsUsingFramebuffer(); + bool IsUsingFramebuffer() const; public: // Not intended for application developers /// @cond internal -- 2.7.4