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/light/light.h>
33 #include <dali-scene3d/public-api/loader/blend-shape-details.h>
34 #include <dali-scene3d/public-api/loader/mesh-definition.h>
35 #include <dali-scene3d/public-api/loader/shader-manager.h>
36 #include <dali-scene3d/public-api/model-components/material.h>
37 #include <dali-scene3d/public-api/model-components/model-primitive.h>
45 using ModelPrimitivePtr = IntrusivePtr<ModelPrimitive>;
48 * @brief TODO : Explain me.
49 * Use Vector4 Tangent data
50 * Same ModelPrimitive all shares IBL
52 class ModelPrimitive : public BaseObject, public MaterialModifyObserver
55 using ModelPrimitiveModifyObserverContainer = std::set<ModelPrimitiveModifyObserver*>;
58 // Creation & Destruction
60 * @brief Create a new ModelPrimitive object.
61 * @return A smart-pointer to the newly allocated ModelPrimitive.
63 static ModelPrimitivePtr New();
67 * @brief Construct a new ModelPrimitive.
72 * @brief Second-phase constructor.
77 * @brief Virtual destructor.
79 virtual ~ModelPrimitive();
83 * @brief Set Renderer that is created by Scene3D::Loader internally.
85 void SetRenderer(Dali::Renderer renderer);
88 * @copydoc Dali::Scene3D::ModelPrimitive::GetRenderer()
90 Dali::Renderer GetRenderer() const;
93 * @copydoc Dali::Scene3D::ModelPrimitive::SetGeometry()
95 void SetGeometry(Dali::Geometry geometry);
98 * @copydoc Dali::Scene3D::ModelPrimitive::GetGeometry()
100 Dali::Geometry GetGeometry() const;
103 * @copydoc Dali::Scene3D::ModelPrimitive::SetMaterial()
105 void SetMaterial(Dali::Scene3D::Material material, bool updateRenderer = true);
108 * @copydoc Dali::Scene3D::ModelPrimitive::GetMaterial()
110 Dali::Scene3D::Material GetMaterial() const;
113 * @brief Adds a primitive observer to this model primitive.
115 * @param[in] observer The observer to add.
117 void AddPrimitiveObserver(ModelPrimitiveModifyObserver* observer);
120 * @brief Removes a primitive observer from this model primitive.
122 * @param[in] observer The observer to remove.
124 void RemovePrimitiveObserver(ModelPrimitiveModifyObserver* observer);
127 * @brief Sets shadow map texture for this model primitive.
129 * @param[in] shadowMapTexture The shadow map texture.
131 void SetShadowMapTexture(Dali::Texture shadowMapTexture);
134 * @brief Sets the image-based lighting texture for this model primitive.
136 * @param[in] diffuseTexture The diffuse texture.
137 * @param[in] specularTexture The specular texture.
138 * @param[in] iblScaleFactor The scale factor to set for image-based lighting.
139 * @param[in] specularMipmapLevels The number of mipmap levels of specular texture.
141 void SetImageBasedLightTexture(Dali::Texture diffuseTexture, Dali::Texture specularTexture, float iblScaleFactor, uint32_t specularMipmapLevels);
144 * @brief Sets the scale factor for image-based lighting for this model primitive.
146 * @param[in] iblScaleFactor The scale factor to set for image-based lighting.
148 void SetImageBasedLightScaleFactor(float iblScaleFactor);
151 * @brief Updates shaders by using current material
153 * @param[in] shaderManager Shader manager to create shader.
155 void UpdateShader(Scene3D::Loader::ShaderManagerPtr shaderManager);
158 * @brief Sets the blend shape data for this model primitive.
160 * @param[in] data The blend shape data to set.
162 void SetBlendShapeData(Scene3D::Loader::BlendShapes::BlendShapeData& data);
165 * @brief Sets the blend shape geometry for this model primitive.
167 * @param[in] blendShapeGeometry The blend shape geometry to set.
169 void SetBlendShapeGeometry(Dali::Texture blendShapeGeometry);
172 * @brief Sets the blend shape options for this model primitive.
174 * @param[in] hasPositions Whether or not this model primitive has positions for blend shapes.
175 * @param[in] hasNormals Whether or not this model primitive has normals for blend shapes.
176 * @param[in] hasTangents Whether or not this model primitive has tangents for blend shapes.
177 * @param[in] version blendShape version.
179 void SetBlendShapeOptions(bool hasPositions, bool hasNormals, bool hasTangents, Scene3D::Loader::BlendShapes::Version version);
182 * @brief Sets whether or not this model primitive is skinned.
184 * @param[in] isSkinned Whether or not this model primitive is skinned.
185 * @param[in] numberOfJointSets How many joint sets the mesh expects in the shader
187 void SetSkinned(bool isSkinned, uint32_t numberOfJointSets);
189 private: // From MaterialModifyObserver
191 * @copydoc Dali::Scene3D::Internal::Material::MaterialModifyObserver::OnMaterialModified()
193 void OnMaterialModified(Dali::Scene3D::Material material, MaterialModifyObserver::ModifyFlag flag) override;
197 * @brief Apply materials data into renderer.
199 void ApplyMaterialToRenderer(MaterialModifyObserver::ModifyFlag flag = MaterialModifyObserver::ModifyFlag::NONE);
202 * @brief Updates the uniform of renderer.
204 void UpdateRendererUniform();
207 * @brief Creates a renderer.
209 void CreateRenderer();
211 void UpdateShadowMapTexture();
214 * @brief Updates the image-based lighting texture.
216 void UpdateImageBasedLightTexture();
219 // Delete copy & move operator
220 ModelPrimitive(const ModelPrimitive&) = delete;
221 ModelPrimitive(ModelPrimitive&&) = delete;
222 ModelPrimitive& operator=(const ModelPrimitive& rhs) = delete;
223 ModelPrimitive& operator=(ModelPrimitive&& rhs) noexcept = delete;
226 ModelPrimitiveModifyObserverContainer mObservers{};
229 Dali::Renderer mRenderer;
230 Dali::Geometry mGeometry;
231 Dali::Shader mShader;
232 Dali::TextureSet mTextureSet;
233 Dali::Scene3D::Material mMaterial;
235 Scene3D::Loader::ShaderManagerPtr mShaderManager;
238 Dali::Texture mShadowMapTexture;
241 Dali::Texture mSpecularTexture;
242 Dali::Texture mDiffuseTexture;
243 float mIblScaleFactor{1.0f};
244 uint32_t mSpecularMipmapLevels{1u};
247 uint32_t mNumberOfJointSets{0};
250 Scene3D::Loader::BlendShapes::BlendShapeData mBlendShapeData;
251 Dali::Texture mBlendShapeGeometry;
252 bool mHasSkinning = false;
253 bool mHasPositions = false;
254 bool mHasNormals = false;
255 bool mHasTangents = false;
256 Scene3D::Loader::BlendShapes::Version mBlendShapeVersion = Scene3D::Loader::BlendShapes::Version::INVALID;
258 bool mIsMaterialChanged = false;
259 bool mNeedToSetRendererUniform = false;
262 } // namespace Internal
264 // Helpers for public-api forwarding methods
266 inline Internal::ModelPrimitive& GetImplementation(Dali::Scene3D::ModelPrimitive& modelPrimitive)
268 DALI_ASSERT_ALWAYS(modelPrimitive && "ModelPrimitive handle is empty");
270 BaseObject& handle = modelPrimitive.GetBaseObject();
272 return static_cast<Internal::ModelPrimitive&>(handle);
275 inline const Internal::ModelPrimitive& GetImplementation(const Dali::Scene3D::ModelPrimitive& modelPrimitive)
277 DALI_ASSERT_ALWAYS(modelPrimitive && "ModelPrimitive handle is empty");
279 const BaseObject& handle = modelPrimitive.GetBaseObject();
281 return static_cast<const Internal::ModelPrimitive&>(handle);
284 } // namespace Scene3D
288 #endif // DALI_SCENE3D_MODEL_COMPONENTS_MODEL_PRIMITIVE_IMPL_H