[Tizen] Add MotionData class and generate Animation by this
[platform/core/uifw/dali-toolkit.git] / dali-scene3d / internal / model-components / model-node-impl.h
index d216bb5..8a06116 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/light/light.h>
 #include <dali-scene3d/public-api/loader/mesh-definition.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>
 
@@ -44,9 +49,13 @@ namespace Internal
  *
  * @SINCE_2_2.99
  */
-class DALI_SCENE3D_API ModelNode : public CustomActorImpl
+class DALI_SCENE3D_API ModelNode : public CustomActorImpl, public ModelPrimitiveModifyObserver
 {
 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
   /**
    * @brief Creates a new ModelNodeImpl instance that does not require touch by default.
@@ -211,6 +220,16 @@ public: // Public Method
   Scene3D::ModelNode FindChildModelNodeByName(std::string_view nodeName);
 
   /**
+   * @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 diffuse and specular image-based lighting textures for a ModelPrimitive.
    *
    * @param[in] diffuseTexture The diffuse texture.
@@ -227,6 +246,9 @@ public: // Public Method
    */
   void SetImageBasedLightScaleFactor(float iblScaleFactor);
 
+  void AddLight(Scene3D::Light light, uint32_t lightIndex);
+  void RemoveLight(uint32_t lightIndex);
+
   /**
    * @brief Sets the blend shape data for a ModelPrimitive.
    *
@@ -244,20 +266,41 @@ public: // Public Method
    */
   void SetBoneMatrix(const Matrix& inverseMatrix, Scene3D::ModelPrimitive primitive, Scene3D::Loader::Index& boneIndex);
 
+  /**
+   * @brief Called when a Renderer of ModelPrimitive is created.
+   *
+   * @param[in] renderer The Renderer that is created.
+   */
+  void OnRendererCreated(Renderer renderer) override;
+
+private:
+  /**
+   * @brief Updates the bone matrix for a ModelPrimitive.
+   *
+   * @param[in] primitive The ModelPrimitive to set the bone matrix for.
+   */
+  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.
-
-public:
-  class DALI_INTERNAL Impl; // Class declaration is public so we can internally add devel API's to the ModelNode's Impl
+  DALI_INTERNAL ModelNode& operator=(ModelNode&&) = delete;      ///< Deleted move assignment operator.
 
 private:
-  const std::unique_ptr<Impl> mImpl;
+  ModelPrimitiveContainer mModelPrimitiveContainer; ///< List of model primitives
+  BoneDataContainer       mBoneDataContainer;
+  BlendShapeIndexMap      mBlendShapeIndexMap; ///< Index of blend shape by name
+  Dali::Texture           mSpecularTexture;
+  Dali::Texture           mDiffuseTexture;
+  float                   mIblScaleFactor{1.0f};
+  uint32_t                mSpecularMipmapLevels{1u};
+
+  // Light
+  std::vector<Scene3D::Light> mLights;
   /// @endcond
 };