1 #ifndef DALI_SCENE3D_MODEL_COMPONENTS_MODEL_NODE_IMPL_H
2 #define DALI_SCENE3D_MODEL_COMPONENTS_MODEL_NODE_IMPL_H
5 * Copyright (c) 2024 Samsung Electronics Co., Ltd.
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
11 * http://www.apache.org/licenses/LICENSE-2.0
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
22 #include <dali-toolkit/public-api/controls/control-impl.h>
23 #include <dali/devel-api/common/map-wrapper.h>
24 #include <dali/public-api/common/dali-common.h>
25 #include <memory> // for std::unique_ptr
29 #include <dali-scene3d/internal/model-components/model-primitive-modify-observer.h>
30 #include <dali-scene3d/public-api/algorithm/navigation-mesh.h>
31 #include <dali-scene3d/public-api/light/light.h>
32 #include <dali-scene3d/public-api/loader/mesh-definition.h>
33 #include <dali-scene3d/public-api/loader/shader-manager.h>
34 #include <dali-scene3d/public-api/loader/shader-option.h>
35 #include <dali-scene3d/public-api/loader/skinning-details.h>
36 #include <dali-scene3d/public-api/model-components/model-node.h>
37 #include <dali-scene3d/public-api/model-components/model-primitive.h>
38 #include "dali-scene3d/public-api/controls/model/model.h"
45 * @addtogroup dali_toolkit_controls_model
51 using ColliderMeshUniquePtr = std::unique_ptr<Dali::Scene3D::Algorithm::ColliderMesh>;
53 * @brief This is the internal base class for custom node of model.
57 class DALI_SCENE3D_API ModelNode : public Toolkit::Internal::Control, public ModelPrimitiveModifyObserver
60 using ModelPrimitiveContainer = std::vector<Scene3D::ModelPrimitive>;
61 using BoneDataContainer = std::vector<Dali::Scene3D::Loader::Skinning::BoneData>;
62 using BlendShapeIndexMap = std::map<std::string, Loader::BlendShapes::Index>;
64 // Creation & Destruction
66 * @brief Creates a new ModelNodeImpl instance that does not require touch by default.
68 * If touch is required, then the user can connect to this class' touch signal.
70 * @return A handle to the ModelNode instance
72 static Scene3D::ModelNode New();
76 * @brief Virtual destructor.
81 public: // From Internal::Control.
83 * @copydoc Dali::Toolkit::Internal::Control::OnInitialize()
85 void OnInitialize() override;
87 protected: // From CustomActorImpl. Note that it will make we can ignore many codes what Internal::Control using now.
89 * @copydoc CustomActorImpl::OnSceneConnection()
90 * @note If overridden, then an up-call to ModelNode::OnSceneConnection MUST be made at the end.
92 void OnSceneConnection(int depth) override;
95 * @copydoc CustomActorImpl::OnSceneDisconnection()
96 * @note If overridden, then an up-call to ModelNode::OnSceneDisconnection MUST be made at the end.
98 void OnSceneDisconnection() override;
101 * @copydoc CustomActorImpl::OnChildAdd()
102 * @note If overridden, then an up-call to ModelNode::OnChildAdd MUST be made at the end.
104 void OnChildAdd(Actor& child) override;
107 * @copydoc CustomActorImpl::OnChildRemove()
108 * @note If overridden, then an up-call to ModelNode::OnChildRemove MUST be made at the end.
110 void OnChildRemove(Actor& child) override;
113 * @copydoc CustomActorImpl::OnPropertySet()
114 * @note If overridden, then an up-call to ModelNode::OnChildRemove MUST be made at the end.
116 void OnPropertySet(Property::Index index, const Property::Value& propertyValue) override;
119 * @copydoc CustomActorImpl::OnSizeSet()
120 * @note If overridden, then an up-call to ModelNode::OnSizeSet MUST be made at the end.
122 void OnSizeSet(const Vector3& targetSize) override;
125 * @copydoc CustomActorImpl::OnSizeAnimation()
126 * @note If overridden, then an up-call to ModelNode::OnSizeAnimation MUST be made at the end.
128 void OnSizeAnimation(Animation& animation, const Vector3& targetSize) override;
131 * @copydoc CustomActorImpl::OnRelayout()
133 void OnRelayout(const Vector2& size, RelayoutContainer& container) override;
136 * @copydoc CustomActorImpl::OnSetResizePolicy()
138 void OnSetResizePolicy(ResizePolicy::Type policy, Dimension::Type dimension) override;
141 * @copydoc CustomActorImpl::GetNaturalSize()
143 Vector3 GetNaturalSize() override;
146 * @copydoc CustomActorImpl::CalculateChildSize()
148 float CalculateChildSize(const Dali::Actor& child, Dimension::Type dimension) override;
151 * @copydoc CustomActorImpl::GetHeightForWidth()
153 float GetHeightForWidth(float width) override;
156 * @copydoc CustomActorImpl::GetWidthForHeight()
158 float GetWidthForHeight(float height) override;
161 * @copydoc CustomActorImpl::RelayoutDependentOnChildren()
163 bool RelayoutDependentOnChildren(Dimension::Type dimension = Dimension::ALL_DIMENSIONS) override;
166 * @copydoc CustomActorImpl::OnCalculateRelayoutSize()
168 void OnCalculateRelayoutSize(Dimension::Type dimension) override;
171 * @copydoc CustomActorImpl::OnLayoutNegotiated()
173 void OnLayoutNegotiated(float size, Dimension::Type dimension) override;
179 * @brief ModelNode constructor.
185 public: // Public Method
187 * @copydoc Dali::Scene3D::ModelNode::GetModelPrimitiveCount()
189 uint32_t GetModelPrimitiveCount() const;
192 * @copydoc Dali::Scene3D::ModelNode::AddModelPrimitive()
194 void AddModelPrimitive(Dali::Scene3D::ModelPrimitive modelPrimitive, Loader::ShaderOption::HashType hash);
197 * @copydoc Dali::Scene3D::ModelNode::RemoveModelPrimitive(Dali::Scene3D::ModelPrimitive modelPrimitive)
199 void RemoveModelPrimitive(Dali::Scene3D::ModelPrimitive modelPrimitive);
202 * @copydoc Dali::Scene3D::ModelNode::RemoveModelPrimitive(uint32_t index)
204 void RemoveModelPrimitive(uint32_t index);
207 * @copydoc Dali::Scene3D::ModelNode::GetModelPrimitive()
209 Dali::Scene3D::ModelPrimitive GetModelPrimitive(uint32_t index) const;
212 * @copydoc Dali::Scene3D::ModelNode::FindChildModelNodeByName()
214 Scene3D::ModelNode FindChildModelNodeByName(std::string_view nodeName);
217 * @copydoc Dali::Scene3D::ModelNode::RetrieveBlendShapeNames()
219 void RetrieveBlendShapeNames(std::vector<std::string>& blendShapeNames) const;
222 * @copydoc Dali::Scene3D::ModelNode::GetBlendShapeIndexByName()
224 Loader::BlendShapes::Index GetBlendShapeIndexByName(std::string_view blendShapeName) const;
227 * @brief Sets the shadow map textures for a ModelNode.
229 * @param[in] shadowMapTexture The shadow map texture.
231 void SetShadowMapTexture(Dali::Texture shadowMapTexture);
234 * @copydoc Dali::Scene3D::ModelNode::CastShadow()
236 void CastShadow(bool castShadow);
239 * @copydoc Dali::Scene3D::ModelNode::IsShadowCasting()
241 bool IsShadowCasting() const;
244 * @copydoc Dali::Scene3D::ModelNode::ReceiveShadow()
246 void ReceiveShadow(bool receiveShadow);
249 * @copydoc Dali::Scene3D::ModelNode::IsShadowReceiving()
251 bool IsShadowReceiving() const;
254 * @brief Sets the diffuse and specular image-based lighting textures for a ModelNode.
256 * @param[in] diffuseTexture The diffuse texture.
257 * @param[in] specularTexture The specular texture.
258 * @param[in] iblScaleFactor The scale factor for the image-based lighting.
259 * @param[in] specularMipmapLevels The number of mipmap levels for the specular texture.
261 void SetImageBasedLightTexture(Dali::Texture diffuseTexture, Dali::Texture specularTexture, float iblScaleFactor, uint32_t specularMipmapLevels);
264 * @brief Sets the scale factor for image-based lighting.
266 * @param[in] iblScaleFactor The scale factor for image-based lighting.
268 void SetImageBasedLightScaleFactor(float iblScaleFactor);
271 * @brief Updates shaders by using current material
273 * @param[in] shaderManager Shader manager to create shader.
275 void UpdateShader(Scene3D::Loader::ShaderManagerPtr shaderManager);
278 * @brief Sets the blend shape data for a ModelPrimitive.
280 * @param[in] data The blend shape data.
281 * @param[in] primitive The ModelPrimitive to set the blend shape data for.
283 void SetBlendShapeData(Scene3D::Loader::BlendShapes::BlendShapeData& data, Scene3D::ModelPrimitive primitive);
286 * @brief Sets the bone matrix for a ModelPrimitive and bone index.
288 * @param[in] inverseMatrix The inverse matrix of the bone.
289 * @param[in] primitive The ModelPrimitive to set the bone matrix for.
290 * @param[in] boneIndex The index of the bone to set the matrix for.
292 void SetBoneMatrix(const Matrix& inverseMatrix, Scene3D::ModelPrimitive primitive, Scene3D::Loader::Index& boneIndex);
295 * @brief Called when a Renderer of ModelPrimitive is created.
297 * @param[in] renderer The Renderer that is created.
299 void OnRendererCreated(Renderer renderer) override;
302 * @copydoc Dali::Scene3D::ModelNode::SetColliderMesh()
304 void SetColliderMesh(ColliderMeshUniquePtr&& colliderMesh);
307 * @copydoc Dali::Scene3D::ModelNode::HasColliderMesh()
309 [[nodiscard]] bool HasColliderMesh() const;
312 * @copydoc Dali::Scene3D::ModelNode::GetColliderMesh()
314 [[nodiscard]] const Scene3D::Algorithm::ColliderMesh& GetColliderMesh() const;
317 * @brief Sets a root model for the ModelNode
318 * @param[in] model Valid Model or nullptr to disconnect node from tree
320 void SetRootModel(Dali::Scene3D::Internal::Model* model)
322 mParentModel = model;
327 * @brief Updates the bone matrix for a ModelPrimitive.
329 * @param[in] primitive The ModelPrimitive to set the bone matrix for.
331 void UpdateBoneMatrix(Scene3D::ModelPrimitive primitive);
335 // Not copyable or movable
336 DALI_INTERNAL ModelNode(const ModelNode&) = delete; ///< Deleted copy constructor.
337 DALI_INTERNAL ModelNode(ModelNode&&) = delete; ///< Deleted move constructor.
338 DALI_INTERNAL ModelNode& operator=(const ModelNode&) = delete; ///< Deleted copy assignment operator.
339 DALI_INTERNAL ModelNode& operator=(ModelNode&&) = delete; ///< Deleted move assignment operator.
342 Scene3D::Loader::ShaderManagerPtr mShaderManager;
343 ModelPrimitiveContainer mModelPrimitiveContainer; ///< List of model primitives
344 BoneDataContainer mBoneDataContainer;
345 BlendShapeIndexMap mBlendShapeIndexMap; ///< Index of blend shape by name
346 Dali::Texture mShadowMapTexture;
347 Dali::Texture mSpecularTexture;
348 Dali::Texture mDiffuseTexture;
350 Internal::Model* mParentModel{nullptr};
353 std::unique_ptr<Dali::Scene3D::Algorithm::ColliderMesh> mColliderMesh;
355 float mIblScaleFactor{1.0f};
356 uint32_t mSpecularMipmapLevels{1u};
357 bool mIsShadowCasting{true};
358 bool mIsShadowReceiving{true};
363 * @brief Gets implementation from the handle.
367 * @return Implementation
368 * @pre handle is initialized and points to a node
370 DALI_SCENE3D_API Internal::ModelNode& GetImplementation(Dali::Scene3D::ModelNode& handle);
373 * @brief Gets implementation from the handle.
377 * @return Implementation
378 * @pre Handle is initialized and points to a node.
380 DALI_SCENE3D_API const Internal::ModelNode& GetImplementation(const Dali::Scene3D::ModelNode& handle);
382 } // namespace Internal
387 } // namespace Scene3D
391 #endif // DALI_SCENE3D_MODEL_COMPONENTS_MODEL_NODE_IMPL_H