Merge "Use c-style string when webview loads contents." into devel/master
[platform/core/uifw/dali-toolkit.git] / dali-scene3d / internal / model-components / model-node-impl.h
1 #ifndef DALI_SCENE3D_MODEL_COMPONENTS_MODEL_NODE_IMPL_H
2 #define DALI_SCENE3D_MODEL_COMPONENTS_MODEL_NODE_IMPL_H
3
4 /*
5  * Copyright (c) 2023 Samsung Electronics Co., Ltd.
6  *
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
10  *
11  * http://www.apache.org/licenses/LICENSE-2.0
12  *
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.
18  *
19  */
20
21 // EXTERNAL INCLUDES
22 #include <dali/public-api/actors/custom-actor-impl.h>
23 #include <dali/public-api/common/dali-common.h>
24 #include <memory> // for std::unique_ptr
25
26 // INTERNAL INCLUDES
27 #include <dali-scene3d/public-api/loader/mesh-definition.h>
28 #include <dali-scene3d/public-api/model-components/model-node.h>
29 #include <dali-scene3d/public-api/model-components/model-primitive.h>
30
31 namespace Dali
32 {
33 namespace Scene3D
34 {
35 /**
36  * @addtogroup dali_toolkit_controls_model
37  * @{
38  */
39
40 namespace Internal
41 {
42 /**
43  * @brief This is the internal base class for custom node of model.
44  *
45  * @SINCE_2_2.99
46  */
47 class DALI_SCENE3D_API ModelNode : public CustomActorImpl
48 {
49 public:
50   // Creation & Destruction
51   /**
52    * @brief Creates a new ModelNodeImpl instance that does not require touch by default.
53    *
54    * If touch is required, then the user can connect to this class' touch signal.
55    * @SINCE_2_2.99
56    * @return A handle to the ModelNode instance
57    */
58   static Scene3D::ModelNode New();
59
60 protected:
61   /**
62    * @brief Virtual destructor.
63    * @SINCE_2_2.99
64    */
65   virtual ~ModelNode();
66
67 protected: // From CustomActorImpl
68   /**
69    * @copydoc CustomActorImpl::OnSceneConnection()
70    * @note If overridden, then an up-call to ModelNode::OnSceneConnection MUST be made at the end.
71    */
72   void OnSceneConnection(int depth) override;
73
74   /**
75    * @copydoc CustomActorImpl::OnSceneDisconnection()
76    * @note If overridden, then an up-call to ModelNode::OnSceneDisconnection MUST be made at the end.
77    */
78   void OnSceneDisconnection() override;
79
80   /**
81    * @copydoc CustomActorImpl::OnChildAdd()
82    * @note If overridden, then an up-call to ModelNode::OnChildAdd MUST be made at the end.
83    */
84   void OnChildAdd(Actor& child) override;
85
86   /**
87    * @copydoc CustomActorImpl::OnChildRemove()
88    * @note If overridden, then an up-call to ModelNode::OnChildRemove MUST be made at the end.
89    */
90   void OnChildRemove(Actor& child) override;
91
92   /**
93    * @copydoc CustomActorImpl::OnPropertySet()
94    * @note If overridden, then an up-call to ModelNode::OnChildRemove MUST be made at the end.
95    */
96   void OnPropertySet(Property::Index index, const Property::Value& propertyValue) override;
97
98   /**
99    * @copydoc CustomActorImpl::OnSizeSet()
100    * @note If overridden, then an up-call to ModelNode::OnSizeSet MUST be made at the end.
101    */
102   void OnSizeSet(const Vector3& targetSize) override;
103
104   /**
105    * @copydoc CustomActorImpl::OnSizeAnimation()
106    * @note If overridden, then an up-call to ModelNode::OnSizeAnimation MUST be made at the end.
107    */
108   void OnSizeAnimation(Animation& animation, const Vector3& targetSize) override;
109
110   /**
111    * @copydoc CustomActorImpl::OnRelayout()
112    */
113   void OnRelayout(const Vector2& size, RelayoutContainer& container) override;
114
115   /**
116    * @copydoc CustomActorImpl::OnSetResizePolicy()
117    */
118   void OnSetResizePolicy(ResizePolicy::Type policy, Dimension::Type dimension) override;
119
120   /**
121    * @copydoc CustomActorImpl::GetNaturalSize()
122    */
123   Vector3 GetNaturalSize() override;
124
125   /**
126    * @copydoc CustomActorImpl::CalculateChildSize()
127    */
128   float CalculateChildSize(const Dali::Actor& child, Dimension::Type dimension) override;
129
130   /**
131    * @copydoc CustomActorImpl::GetHeightForWidth()
132    */
133   float GetHeightForWidth(float width) override;
134
135   /**
136    * @copydoc CustomActorImpl::GetWidthForHeight()
137    */
138   float GetWidthForHeight(float height) override;
139
140   /**
141    * @copydoc CustomActorImpl::RelayoutDependentOnChildren()
142    */
143   bool RelayoutDependentOnChildren(Dimension::Type dimension = Dimension::ALL_DIMENSIONS) override;
144
145   /**
146    * @copydoc CustomActorImpl::OnCalculateRelayoutSize()
147    */
148   void OnCalculateRelayoutSize(Dimension::Type dimension) override;
149
150   /**
151    * @copydoc CustomActorImpl::OnLayoutNegotiated()
152    */
153   void OnLayoutNegotiated(float size, Dimension::Type dimension) override;
154
155 protected:
156   // Construction
157
158   /**
159    * @brief ModelNode constructor.
160    *
161    * @SINCE_2_2.99
162    */
163   ModelNode();
164
165   /**
166    * @brief Second phase initialization.
167    * @SINCE_2_2.99
168    */
169   void Initialize();
170
171 public: // API for derived classes to override
172   // Lifecycle
173
174   /**
175    * @brief This method is called after the Node has been initialized.
176    *
177    * Derived classes should do any second phase initialization by overriding this method.
178    * @SINCE_2_2.99
179    */
180   virtual void OnInitialize();
181
182 public: // Public Method
183   /**
184    * @copydoc Dali::Scene3D::ModelNode::GetModelPrimitiveCount()
185    */
186   uint32_t GetModelPrimitiveCount() const;
187
188   /**
189    * @copydoc Dali::Scene3D::ModelNode::AddModelPrimitive()
190    */
191   void AddModelPrimitive(Dali::Scene3D::ModelPrimitive modelPrimitive);
192
193   /**
194    * @copydoc Dali::Scene3D::ModelNode::RemoveModelPrimitive(Dali::Scene3D::ModelPrimitive modelPrimitive)
195    */
196   void RemoveModelPrimitive(Dali::Scene3D::ModelPrimitive modelPrimitive);
197
198   /**
199    * @copydoc Dali::Scene3D::ModelNode::RemoveModelPrimitive(uint32_t index)
200    */
201   void RemoveModelPrimitive(uint32_t index);
202
203   /**
204    * @copydoc Dali::Scene3D::ModelNode::GetModelPrimitive()
205    */
206   Dali::Scene3D::ModelPrimitive GetModelPrimitive(uint32_t index) const;
207
208   /**
209    * @copydoc Dali::Scene3D::ModelNode::FindChildModelNodeByName()
210    */
211   Scene3D::ModelNode FindChildModelNodeByName(std::string_view nodeName);
212
213   /**
214    * @brief Sets the diffuse and specular image-based lighting textures for a ModelPrimitive.
215    *
216    * @param[in] diffuseTexture The diffuse texture.
217    * @param[in] specularTexture The specular texture.
218    * @param[in] iblScaleFactor The scale factor for the image-based lighting.
219    * @param[in] specularMipmapLevels The number of mipmap levels for the specular texture.
220    */
221   void SetImageBasedLightTexture(Dali::Texture diffuseTexture, Dali::Texture specularTexture, float iblScaleFactor, uint32_t specularMipmapLevels);
222
223   /**
224    * @brief Sets the scale factor for image-based lighting.
225    *
226    * @param[in] iblScaleFactor The scale factor for image-based lighting.
227    */
228   void SetImageBasedLightScaleFactor(float iblScaleFactor);
229
230   /**
231    * @brief Sets the blend shape data for a ModelPrimitive.
232    *
233    * @param[in] data The blend shape data.
234    * @param[in] primitive The ModelPrimitive to set the blend shape data for.
235    */
236   void SetBlendShapeData(Scene3D::Loader::BlendShapes::BlendShapeData& data, Scene3D::ModelPrimitive primitive);
237
238   /**
239    * @brief Sets the bone matrix for a ModelPrimitive and bone index.
240    *
241    * @param[in] inverseMatrix The inverse matrix of the bone.
242    * @param[in] primitive The ModelPrimitive to set the bone matrix for.
243    * @param[in] boneIndex The index of the bone to set the matrix for.
244    */
245   void SetBoneMatrix(const Matrix& inverseMatrix, Scene3D::ModelPrimitive primitive, Scene3D::Loader::Index& boneIndex);
246
247 private:
248   /// @cond internal
249
250   // Not copyable or movable
251   DALI_INTERNAL            ModelNode(const ModelNode&) = delete; ///< Deleted copy constructor.
252   DALI_INTERNAL            ModelNode(ModelNode&&)      = delete; ///< Deleted move constructor.
253   DALI_INTERNAL ModelNode& operator=(const ModelNode&) = delete; ///< Deleted copy assignment operator.
254   DALI_INTERNAL ModelNode& operator=(ModelNode&&)      = delete; ///< Deleted move assignment operator.
255
256 public:
257   class DALI_INTERNAL Impl; // Class declaration is public so we can internally add devel API's to the ModelNode's Impl
258
259 private:
260   const std::unique_ptr<Impl> mImpl;
261   /// @endcond
262 };
263
264 /**
265  * @brief Gets implementation from the handle.
266  *
267  * @SINCE_2_2.99
268  * @param handle
269  * @return Implementation
270  * @pre handle is initialized and points to a node
271  */
272 DALI_SCENE3D_API Internal::ModelNode& GetImplementation(Dali::Scene3D::ModelNode& handle);
273
274 /**
275  * @brief Gets implementation from the handle.
276  *
277  * @SINCE_2_2.99
278  * @param handle
279  * @return Implementation
280  * @pre Handle is initialized and points to a node.
281  */
282 DALI_SCENE3D_API const Internal::ModelNode& GetImplementation(const Dali::Scene3D::ModelNode& handle);
283
284 } // namespace Internal
285
286 /**
287  * @}
288  */
289 } // namespace Scene3D
290
291 } // namespace Dali
292
293 #endif // DALI_SCENE3D_MODEL_COMPONENTS_MODEL_NODE_IMPL_H