Support model size change
[platform/core/uifw/dali-toolkit.git] / dali-scene3d / internal / controls / model / model-impl.h
index fea5d60..d7924bf 100644 (file)
@@ -23,6 +23,7 @@
 #include <dali/public-api/actors/camera-actor.h>
 #include <dali/public-api/actors/layer.h>
 #include <dali/public-api/animation/animation.h>
+#include <dali/public-api/object/property-notification.h>
 #include <dali/public-api/object/weak-handle.h>
 #include <dali/public-api/rendering/texture.h>
 
@@ -32,6 +33,8 @@
 #include <dali-scene3d/internal/common/model-load-task.h>
 #include <dali-scene3d/public-api/controls/model/model.h>
 #include <dali-scene3d/public-api/controls/scene-view/scene-view.h>
+#include <dali-scene3d/public-api/loader/load-result.h>
+#include <dali-scene3d/public-api/model-components/model-node.h>
 
 namespace Dali
 {
@@ -51,16 +54,24 @@ public:
   using CameraData    = Loader::CameraParameters;
 
   /**
-   * @brief Creates a new Model.
-   *
-   * @return A public handle to the newly allocated Model.
+   * @copydoc Model::New()
    */
   static Dali::Scene3D::Model New(const std::string& modelUrl, const std::string& resourceDirectoryUrl);
 
   /**
    * @copydoc Model::GetModelRoot()
    */
-  const Actor GetModelRoot() const;
+  const Scene3D::ModelNode GetModelRoot() const;
+
+  /**
+   * @copydoc Model::AddModelNode()
+   */
+  void AddModelNode(Scene3D::ModelNode modelNode);
+
+  /**
+   * @copydoc Model::RemoveModelNode()
+   */
+  void RemoveModelNode(Scene3D::ModelNode modelNode);
 
   /**
    * @copydoc Model::SetChildrenSensitive()
@@ -88,11 +99,6 @@ public:
   void SetImageBasedLightSource(const std::string& diffuseUrl, const std::string& specularUrl, float scaleFactor);
 
   /**
-   * @copydoc Model::SetImageBasedLightTexture()
-   */
-  void SetImageBasedLightTexture(Dali::Texture diffuseTexture, Dali::Texture specularTexture, float scaleFactor);
-
-  /**
    * @copydoc Model::SetImageBasedLightScaleFactor()
    */
   void SetImageBasedLightScaleFactor(float scaleFactor);
@@ -132,9 +138,16 @@ public:
    */
   bool ApplyCamera(uint32_t index, Dali::CameraActor camera) const;
 
+  /**
+   * @copydoc Model::FindChildModelNodeByName()
+   */
+  Scene3D::ModelNode FindChildModelNodeByName(std::string_view nodeName);
+
 protected:
   /**
    * @brief Constructs a new Model.
+   * @param[in] modelUrl model file path.(e.g., glTF, and DLI).
+   * @param[in] resourceDirectoryUrl resource file path that includes binary, image etc.
    */
   Model(const std::string& modelUrl, const std::string& resourceDirectoryUrl);
 
@@ -160,6 +173,11 @@ private:
   void OnSceneDisconnection() override;
 
   /**
+   * @copydoc CustomActorImpl::OnSizeSet( const Vector3& size )
+   */
+  void OnSizeSet(const Vector3& size) override;
+
+  /**
    * @copydoc Toolkit::Control::GetNaturalSize
    */
   Vector3 GetNaturalSize() override;
@@ -186,9 +204,14 @@ private:
 
 private:
   /**
+   * @brief Create Model Root of this Model class.
+   */
+  void CreateModelRoot();
+
+  /**
    * @brief Scales the model to fit the control or to return to original size.
    */
-  void ScaleModel();
+  void ScaleModel(bool useCurrentSize);
 
   /**
    * @brief Changes model anchor point to set the model at center or returns to the original model pivot.
@@ -198,7 +221,12 @@ private:
   /**
    * @brief Changes IBL information of the input node.
    */
-  void CollectRenderableActor(Actor actor);
+  void UpdateImageBasedLightTextureRecursively(Scene3D::ModelNode node, Dali::Texture diffuseTexture, Dali::Texture specularTexture, float iblScaleFactor, uint32_t specularMipmapLevels);
+
+  /**
+   * @brief Changes IBL factor of the input node.
+   */
+  void UpdateImageBasedLightScaleFactorRecursively(Scene3D::ModelNode node, float iblScaleFactor);
 
   /**
    * @brief Changes IBL textures of the input node.
@@ -223,7 +251,7 @@ public: // Overrides ImageBasedLightObserver Methods.
   /**
    * @copydoc Dali::Scene3D::Internal::ImageBasedLightObserver::NotifyImageBasedLightTexture()
    */
-  void NotifyImageBasedLightTexture(Dali::Texture diffuseTexture, Dali::Texture specularTexture, float scaleFactor) override;
+  void NotifyImageBasedLightTexture(Dali::Texture diffuseTexture, Dali::Texture specularTexture, float scaleFactor, uint32_t specularMipmapLevels) override;
 
   /**
    * @copydoc Dali::Scene3D::Internal::ImageBasedLightObserver::NotifyImageBasedLightScaleFactor()
@@ -252,6 +280,11 @@ private:
   void OnIblLoadComplete();
 
   /**
+   * @brief Update model root scale when Model size property is updated.
+   */
+  void OnSizeNotification(Dali::PropertyNotification& source);
+
+  /**
    * @brief Reset Resource loading tasks.
    */
   void ResetResourceTasks();
@@ -262,11 +295,6 @@ private:
   void ResetResourceTask(IntrusivePtr<AsyncTask> asyncTask);
 
   /**
-   * @brief Request to load a Ibl texture asynchronously
-   */
-  void RequestLoadIblTexture(EnvironmentMapLoadTaskPtr asyncLoadTask, const std::string& url);
-
-  /**
    * @brief Notify Resource Ready signal.
    */
   void NotifyResourceReady();
@@ -289,11 +317,11 @@ private:
 private:
   std::string                    mModelUrl;
   std::string                    mResourceDirectoryUrl;
-  Dali::Actor                    mModelRoot;
+  Scene3D::ModelNode             mModelRoot;
   std::vector<AnimationData>     mAnimations;
   std::vector<CameraData>        mCameraParameters;
-  std::vector<WeakHandle<Actor>> mRenderableActors;
   WeakHandle<Scene3D::SceneView> mParentSceneView;
+  Dali::PropertyNotification     mSizeNotification;
 
   // Asynchronous loading variable
   ModelLoadTaskPtr          mModelLoadTask;
@@ -303,7 +331,6 @@ private:
   std::string mDiffuseIblUrl;
   std::string mSpecularIblUrl;
 
-  // TODO: This default texture can be removed after 3D Resource Cache is added.
   Dali::Texture mDefaultSpecularTexture;
   Dali::Texture mDefaultDiffuseTexture;
   Dali::Texture mSceneSpecularTexture;
@@ -314,6 +341,8 @@ private:
   Vector3       mModelPivot;
   float         mSceneIblScaleFactor;
   float         mIblScaleFactor;
+  uint32_t      mSceneSpecularMipmapLevels;
+  uint32_t      mSpecularMipmapLevels;
   bool          mModelChildrenSensitive;
   bool          mModelChildrenFocusable;
   bool          mModelResourceReady;