Merge branch 'devel/master' into tizen
[platform/core/uifw/dali-toolkit.git] / dali-scene3d / internal / model-components / model-node-impl.h
index e3c718c..35f1c12 100644 (file)
  */
 
 // EXTERNAL INCLUDES
+#include <dali/devel-api/common/map-wrapper.h>
 #include <dali/public-api/actors/custom-actor-impl.h>
 #include <dali/public-api/common/dali-common.h>
 #include <memory> // for std::unique_ptr
+#include <string>
 
 // INTERNAL INCLUDES
 #include <dali-scene3d/internal/model-components/model-primitive-modify-observer.h>
+#include <dali-scene3d/public-api/algorithm/navigation-mesh.h>
+#include <dali-scene3d/public-api/light/light.h>
 #include <dali-scene3d/public-api/loader/mesh-definition.h>
+#include <dali-scene3d/public-api/loader/shader-manager.h>
+#include <dali-scene3d/public-api/loader/shader-option.h>
 #include <dali-scene3d/public-api/loader/skinning-details.h>
 #include <dali-scene3d/public-api/model-components/model-node.h>
 #include <dali-scene3d/public-api/model-components/model-primitive.h>
+#include "dali-scene3d/public-api/controls/model/model.h"
 
 namespace Dali
 {
@@ -41,6 +48,7 @@ namespace Scene3D
 
 namespace Internal
 {
+using ColliderMeshUniquePtr = std::unique_ptr<Dali::Scene3D::Algorithm::ColliderMesh>;
 /**
  * @brief This is the internal base class for custom node of model.
  *
@@ -51,6 +59,7 @@ class DALI_SCENE3D_API ModelNode : public CustomActorImpl, public ModelPrimitive
 public:
   using ModelPrimitiveContainer = std::vector<Scene3D::ModelPrimitive>;
   using BoneDataContainer       = std::vector<Dali::Scene3D::Loader::Skinning::BoneData>;
+  using BlendShapeIndexMap      = std::map<std::string, Loader::BlendShapes::Index>;
 
   // Creation & Destruction
   /**
@@ -193,7 +202,7 @@ public: // Public Method
   /**
    * @copydoc Dali::Scene3D::ModelNode::AddModelPrimitive()
    */
-  void AddModelPrimitive(Dali::Scene3D::ModelPrimitive modelPrimitive);
+  void AddModelPrimitive(Dali::Scene3D::ModelPrimitive modelPrimitive, Loader::ShaderOption::HashType hash);
 
   /**
    * @copydoc Dali::Scene3D::ModelNode::RemoveModelPrimitive(Dali::Scene3D::ModelPrimitive modelPrimitive)
@@ -216,7 +225,24 @@ public: // Public Method
   Scene3D::ModelNode FindChildModelNodeByName(std::string_view nodeName);
 
   /**
-   * @brief Sets the diffuse and specular image-based lighting textures for a ModelPrimitive.
+   * @copydoc Dali::Scene3D::ModelNode::RetrieveBlendShapeNames()
+   */
+  void RetrieveBlendShapeNames(std::vector<std::string>& blendShapeNames) const;
+
+  /**
+   * @copydoc Dali::Scene3D::ModelNode::GetBlendShapeIndexByName()
+   */
+  Loader::BlendShapes::Index GetBlendShapeIndexByName(std::string_view blendShapeName) const;
+
+  /**
+   * @brief Sets the shadow map textures for a ModelNode.
+   *
+   * @param[in] shadowMapTexture The shadow map texture.
+   */
+  void SetShadowMapTexture(Dali::Texture shadowMapTexture);
+
+  /**
+   * @brief Sets the diffuse and specular image-based lighting textures for a ModelNode.
    *
    * @param[in] diffuseTexture The diffuse texture.
    * @param[in] specularTexture The specular texture.
@@ -233,6 +259,13 @@ public: // Public Method
   void SetImageBasedLightScaleFactor(float iblScaleFactor);
 
   /**
+   * @brief Updates shaders by using current material
+   *
+   * @param[in] shaderManager Shader manager to create shader.
+   */
+  void UpdateShader(Scene3D::Loader::ShaderManagerPtr shaderManager);
+
+  /**
    * @brief Sets the blend shape data for a ModelPrimitive.
    *
    * @param[in] data The blend shape data.
@@ -256,6 +289,30 @@ public: // Public Method
    */
   void OnRendererCreated(Renderer renderer) override;
 
+  /**
+   * @copydoc Dali::Scene3D::ModelNode::SetColliderMesh()
+   */
+  void SetColliderMesh(ColliderMeshUniquePtr&& colliderMesh);
+
+  /**
+   * @copydoc Dali::Scene3D::ModelNode::HasColliderMesh()
+   */
+  [[nodiscard]] bool HasColliderMesh() const;
+
+  /**
+   * @copydoc Dali::Scene3D::ModelNode::GetColliderMesh()
+   */
+  [[nodiscard]] const Scene3D::Algorithm::ColliderMesh& GetColliderMesh() const;
+
+  /**
+  * @brief Sets a root model for the ModelNode
+  * @param[in] model Valid Model to set
+  */
+  void SetRootModel(Dali::Scene3D::Internal::Model& model)
+  {
+    mParentModel = &model;
+  }
+
 private:
   /**
    * @brief Updates the bone matrix for a ModelPrimitive.
@@ -264,22 +321,30 @@ private:
    */
   void UpdateBoneMatrix(Scene3D::ModelPrimitive primitive);
 
-private:
   /// @cond internal
 
   // Not copyable or movable
-  DALI_INTERNAL            ModelNode(const ModelNode&) = delete; ///< Deleted copy constructor.
-  DALI_INTERNAL            ModelNode(ModelNode&&)      = delete; ///< Deleted move constructor.
+  DALI_INTERNAL ModelNode(const ModelNode&) = delete;            ///< Deleted copy constructor.
+  DALI_INTERNAL ModelNode(ModelNode&&)      = delete;            ///< Deleted move constructor.
   DALI_INTERNAL ModelNode& operator=(const ModelNode&) = delete; ///< Deleted copy assignment operator.
-  DALI_INTERNAL ModelNode& operator=(ModelNode&&)      = delete; ///< Deleted move assignment operator.
+  DALI_INTERNAL ModelNode& operator=(ModelNode&&) = delete;      ///< Deleted move assignment operator.
 
 private:
-  ModelPrimitiveContainer mModelPrimitiveContainer; ///< List of model primitives
-  BoneDataContainer       mBoneDataContainer;
-  Dali::Texture           mSpecularTexture;
-  Dali::Texture           mDiffuseTexture;
-  float                   mIblScaleFactor{1.0f};
-  uint32_t                mSpecularMipmapLevels{1u};
+  Scene3D::Loader::ShaderManagerPtr mShaderManager;
+  ModelPrimitiveContainer           mModelPrimitiveContainer; ///< List of model primitives
+  BoneDataContainer                 mBoneDataContainer;
+  BlendShapeIndexMap                mBlendShapeIndexMap; ///< Index of blend shape by name
+  Dali::Texture                     mShadowMapTexture;
+  Dali::Texture                     mSpecularTexture;
+  Dali::Texture                     mDiffuseTexture;
+
+  Internal::Model* mParentModel{nullptr};
+
+  // Collider mesh
+  std::unique_ptr<Dali::Scene3D::Algorithm::ColliderMesh> mColliderMesh;
+
+  float    mIblScaleFactor{1.0f};
+  uint32_t mSpecularMipmapLevels{1u};
   /// @endcond
 };