*/
// 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>
*
* @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.
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.
*/
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.
*
*/
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
};