1 #ifndef DALI_SCENE3D_MODEL_COMPONENTS_MODEL_PRIMITIVE_IMPL_H
2 #define DALI_SCENE3D_MODEL_COMPONENTS_MODEL_PRIMITIVE_IMPL_H
5 * Copyright (c) 2023 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/public-api/common/dali-common.h>
23 #include <dali/public-api/common/intrusive-ptr.h>
24 #include <dali/public-api/object/base-object.h>
25 #include <dali/public-api/object/property-value.h>
26 #include <dali/public-api/object/property.h>
30 #include <dali-scene3d/internal/model-components/material-modify-observer.h>
31 #include <dali-scene3d/internal/model-components/model-primitive-modify-observer.h>
32 #include <dali-scene3d/public-api/loader/blend-shape-details.h>
33 #include <dali-scene3d/public-api/loader/mesh-definition.h>
34 #include <dali-scene3d/public-api/model-components/material.h>
35 #include <dali-scene3d/public-api/model-components/model-primitive.h>
43 using ModelPrimitivePtr = IntrusivePtr<ModelPrimitive>;
46 * @brief TODO : Explain me.
47 * Use Vector4 Tangent data
48 * Same ModelPrimitive all shares IBL
50 class ModelPrimitive : public BaseObject, public MaterialModifyObserver
53 using ModelPrimitiveModifyObserverContainer = std::set<ModelPrimitiveModifyObserver*>;
56 // Creation & Destruction
58 * @brief Create a new ModelPrimitive object.
59 * @return A smart-pointer to the newly allocated ModelPrimitive.
61 static ModelPrimitivePtr New();
65 * @brief Construct a new ModelPrimitive.
70 * @brief Second-phase constructor.
75 * @brief Virtual destructor.
77 virtual ~ModelPrimitive();
81 * @brief Set Renderer that is created by Scene3D::Loader internally.
83 void SetRenderer(Dali::Renderer renderer);
86 * @copydoc Dali::Scene3D::ModelPrimitive::GetRenderer()
88 Dali::Renderer GetRenderer() const;
91 * @copydoc Dali::Scene3D::ModelPrimitive::SetGeometry()
93 void SetGeometry(Dali::Geometry geometry);
96 * @copydoc Dali::Scene3D::ModelPrimitive::GetGeometry()
98 Dali::Geometry GetGeometry() const;
101 * @copydoc Dali::Scene3D::ModelPrimitive::SetMaterial()
103 void SetMaterial(Dali::Scene3D::Material material, bool updateRenderer = true);
106 * @copydoc Dali::Scene3D::ModelPrimitive::GetMaterial()
108 Dali::Scene3D::Material GetMaterial() const;
111 * @brief Adds a primitive observer to this model primitive.
113 * @param[in] observer The observer to add.
115 void AddPrimitiveObserver(ModelPrimitiveModifyObserver* observer);
118 * @brief Removes a primitive observer from this model primitive.
120 * @param[in] observer The observer to remove.
122 void RemovePrimitiveObserver(ModelPrimitiveModifyObserver* observer);
125 * @brief Sets the image-based lighting texture for this model primitive.
127 * @param[in] diffuseTexture The diffuse texture.
128 * @param[in] specularTexture The specular texture.
129 * @param[in] iblScaleFactor The scale factor to set for image-based lighting.
130 * @param[in] specularMipmapLevels The number of mipmap levels of specular texture.
132 void SetImageBasedLightTexture(Dali::Texture diffuseTexture, Dali::Texture specularTexture, float iblScaleFactor, uint32_t specularMipmapLevels);
135 * @brief Sets the scale factor for image-based lighting for this model primitive.
137 * @param[in] iblScaleFactor The scale factor to set for image-based lighting.
139 void SetImageBasedLightScaleFactor(float iblScaleFactor);
142 * @brief Sets the blend shape data for this model primitive.
144 * @param[in] data The blend shape data to set.
146 void SetBlendShapeData(Scene3D::Loader::BlendShapes::BlendShapeData& data);
149 * @brief Sets the blend shape geometry for this model primitive.
151 * @param[in] blendShapeGeometry The blend shape geometry to set.
153 void SetBlendShapeGeometry(Dali::Texture blendShapeGeometry);
156 * @brief Sets the blend shape options for this model primitive.
158 * @param[in] hasPositions Whether or not this model primitive has positions for blend shapes.
159 * @param[in] hasNormals Whether or not this model primitive has normals for blend shapes.
160 * @param[in] hasTangents Whether or not this model primitive has tangents for blend shapes.
162 void SetBlendShapeOptions(bool hasPositions, bool hasNormals, bool hasTangents);
165 * @brief Sets whether or not this model primitive is skinned.
167 * @param[in] isSkinned Whether or not this model primitive is skinned.
169 void SetSkinned(bool isSkinned);
171 private: // From MaterialModifyObserver
173 * @copydoc Dali::Scene3D::Internal::Material::MaterialModifyObserver::OnMaterialModified()
175 void OnMaterialModified(Dali::Scene3D::Material material, MaterialModifyObserver::ModifyFlag flag) override;
179 * @brief Apply materials data into renderer.
181 void ApplyMaterialToRenderer(MaterialModifyObserver::ModifyFlag flag = MaterialModifyObserver::ModifyFlag::NONE);
184 * @brief Updates the uniform of renderer.
186 void UpdateRendererUniform();
189 * @brief Creates a renderer.
191 void CreateRenderer();
194 * @brief Updates the image-based lighting texture.
196 void UpdateImageBasedLightTexture();
199 // Delete copy & move operator
200 ModelPrimitive(const ModelPrimitive&) = delete;
201 ModelPrimitive(ModelPrimitive&&) = delete;
202 ModelPrimitive& operator=(const ModelPrimitive& rhs) = delete;
203 ModelPrimitive& operator=(ModelPrimitive&& rhs) noexcept = delete;
206 ModelPrimitiveModifyObserverContainer mObservers{};
209 Dali::Renderer mRenderer;
210 Dali::Geometry mGeometry;
211 Dali::Shader mShader;
212 Dali::TextureSet mTextureSet;
213 Dali::Scene3D::Material mMaterial;
216 Dali::Texture mSpecularTexture;
217 Dali::Texture mDiffuseTexture;
218 float mIblScaleFactor{1.0f};
219 uint32_t mSpecularMipmapLevels{1u};
222 Scene3D::Loader::BlendShapes::BlendShapeData mBlendShapeData;
223 Dali::Texture mBlendShapeGeometry;
224 bool mHasSkinning = false;
225 bool mHasPositions = false;
226 bool mHasNormals = false;
227 bool mHasTangents = false;
229 bool mIsMaterialChanged = false;
230 bool mNeedToSetRendererUniform = false;
233 } // namespace Internal
235 // Helpers for public-api forwarding methods
237 inline Internal::ModelPrimitive& GetImplementation(Dali::Scene3D::ModelPrimitive& modelPrimitive)
239 DALI_ASSERT_ALWAYS(modelPrimitive && "ModelPrimitive handle is empty");
241 BaseObject& handle = modelPrimitive.GetBaseObject();
243 return static_cast<Internal::ModelPrimitive&>(handle);
246 inline const Internal::ModelPrimitive& GetImplementation(const Dali::Scene3D::ModelPrimitive& modelPrimitive)
248 DALI_ASSERT_ALWAYS(modelPrimitive && "ModelPrimitive handle is empty");
250 const BaseObject& handle = modelPrimitive.GetBaseObject();
252 return static_cast<const Internal::ModelPrimitive&>(handle);
255 } // namespace Scene3D
259 #endif // DALI_SCENE3D_MODEL_COMPONENTS_MODEL_PRIMITIVE_IMPL_H