*/
// 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
{
namespace Internal
{
+using ColliderMeshUniquePtr = std::unique_ptr<Dali::Scene3D::Algorithm::ColliderMesh>;
/**
* @brief This is the internal base class for custom node of model.
*
* @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.
/**
* @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)
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.
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.
*/
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;
+
+ /**
+ * @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.
+ *
+ * @param[in] primitive The ModelPrimitive to set the bone matrix for.
+ */
+ void UpdateBoneMatrix(Scene3D::ModelPrimitive primitive);
+
/// @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;
+ 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
};