#define DALI_SCENE3D_MODEL_H
/*
- * Copyright (c) 2022 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2024 Samsung Electronics Co., Ltd.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
*
*/
-// INTERNAL INCLUDES
-#include <dali-scene3d/public-api/api.h>
-
// EXTERNAL INCLUDES
+#include <memory>
+
#include <dali-toolkit/public-api/controls/control.h>
+#include <dali/public-api/actors/camera-actor.h>
#include <dali/public-api/common/dali-common.h>
#include <dali/public-api/rendering/texture.h>
+// INTERNAL INCLUDES
+#include <dali-scene3d/public-api/algorithm/navigation-mesh.h>
+#include <dali-scene3d/public-api/api.h>
+#include <dali-scene3d/public-api/model-components/model-node.h>
+#include <dali-scene3d/public-api/model-motion/motion-data.h>
+
namespace Dali
{
namespace Scene3D
*
* By default, The loaded model has its own position and size which are defined in vertex buffer regardless of the Control size.
*
+ * @note We support to render model well only if glsl version is higher than 300.
+ *
* @SINCE_2_1.41
* @code
*
class DALI_SCENE3D_API Model : public Dali::Toolkit::Control
{
public:
+ // Typedefs
+ using MeshHitSignalType = Signal<bool(Model, Scene3D::ModelNode)>; ///< Mesh hit signal type @SINCE_2_2.53
+ using ColliderMeshPtr = std::unique_ptr<Algorithm::NavigationMesh>;
+
/**
* @brief Create an initialized Model.
*
* @SINCE_2_1.41
* @param[in] modelUrl model file path.(e.g., glTF, and DLI).
* @param[in] resourceDirectoryUrl resource file path that includes binary, image etc.
+ * @note If modelUrl is empty, it will not load resouces. Only ModelRoot will be created.
* @note If resourceDirectoryUrl is empty, the parent directory path of modelUrl is used for resource path.
* @return A handle to a newly allocated Dali resource
*/
- static Model New(const std::string& modelUrl, const std::string& resourceDirectoryUrl = std::string());
+ static Model New(const std::string& modelUrl = std::string(), const std::string& resourceDirectoryUrl = std::string());
/**
* @brief Creates an uninitialized Model.
* @SINCE_2_1.41
* @param[in] rhs A reference to the moved handle
*/
- Model(Model&& rhs);
+ Model(Model&& rhs) noexcept;
/**
* @brief Assignment operator.
* @param[in] rhs A reference to the moved handle
* @return A reference to this
*/
- Model& operator=(Model&& rhs);
+ Model& operator=(Model&& rhs) noexcept;
/**
* @brief Downcasts an Object handle to Model.
static Model DownCast(BaseHandle handle);
/**
- * @brief Retrieves model root Actor.
+ * @brief Retrieves model root Node.
*
* @SINCE_2_1.41
- * @return Root Actor of the model.
+ * @return Root Node of the model.
*/
- const Actor GetModelRoot() const;
+ const ModelNode GetModelRoot() const;
+
+ /**
+ * @brief Add new ModelNode to this Model.
+ * This modelNode will become child of ModelRoot.
+ *
+ * @SINCE_2_2.22
+ * @param[in] modelNode the root of ModelNode tree to be added.
+ */
+ void AddModelNode(ModelNode modelNode);
+
+ /**
+ * @brief Remove ModelNode from this Model.
+ *
+ * @SINCE_2_2.22
+ * @param[in] modelNode the root of ModelNode tree to be removed.
+ */
+ void RemoveModelNode(ModelNode modelNode);
/**
* @brief Whether allow this model's children actor to use events.
void SetImageBasedLightSource(const std::string& diffuseUrl, const std::string& specularUrl, float scaleFactor = 1.0f);
/**
- * @brief Sets Image Based Light Texture.
- *
- * @SINCE_2_1.41
- * @param[in] diffuseTexture cube map texture that can be used as a diffuse IBL source.
- * @param[in] specularTexture cube map texture that can be used as a specular IBL source.
- * @param[in] scaleFactor scale factor that controls light source intensity in [0.0f, 1.0f]. Default value is 1.0f.
- *
- * @note Both of diffuse texture and specular texture should be available. If not, nothing applied.
- */
- void SetImageBasedLightTexture(Texture diffuseTexture, Texture specularTexture, float scaleFactor = 1.0f);
-
- /**
* @brief Sets Scale Factor of Image Based Light Source.
*
* @SINCE_2_1.41
- * @note If SetImageBasedLightSource() or SetImageBasedLightTexture() method is called after this method, scaleFactor is overrided.
+ * @note If SetImageBasedLightSource() method is called after this method, scaleFactor is overrided.
*
* @param[in] scaleFactor scale factor that controls light source intensity in [0.0f, 1.0f].
*/
*/
Dali::Animation GetAnimation(const std::string& name) const;
+ /**
+ * @brief Gets number of camera parameters those loaded from model file.
+ *
+ * @SINCE_2_2.15
+ * @return The number of loaded camera parameters.
+ * @note This method should be called after Model load finished.
+ */
+ uint32_t GetCameraCount() const;
+
+ /**
+ * @brief Generate camera actor using camera parameters at the index.
+ * If camera parameter is valid, create new CameraActor.
+ * Camera parameter decide at initialized time and
+ * didn't apply model node's current position (like Animation).
+ *
+ * @SINCE_2_2.15
+ * @param[in] index Index of camera to be used for generation camera.
+ * @return Generated CameraActor by the index, or empty Handle if generation failed.
+ * @note This method should be called after Model load finished.
+ */
+ Dali::CameraActor GenerateCamera(uint32_t index) const;
+
+ /**
+ * @brief Apply camera parameters at the index to inputed camera actor.
+ * If camera parameter is valid and camera actor is not empty, apply parameters.
+ * It will change camera's transform and near / far / fov or orthographic size / aspect ratio (if defined)
+ * Camera parameter decide at initialized time and
+ * didn't apply model node's current position (like Animation).
+ *
+ * @SINCE_2_2.15
+ * @param[in] index Index of camera to be used for generation camera.
+ * @param[in,out] camera Index of camera to be used for generation camera.
+ * @return True if apply successed. False otherwise.
+ * @note This method should be called after Model load finished.
+ */
+ bool ApplyCamera(uint32_t index, Dali::CameraActor camera) const;
+
+ /**
+ * @brief Returns a child ModelNode object with a name that matches nodeName.
+ *
+ * @SINCE_2_2.34
+ * @param[in] nodeName The name of the child ModelNode object you want to find.
+ * @return Returns a child ModelNode object with a name that matches nodeName. If there is no corresponding child ModelNode object, it returns an empty ModelNode object.
+ */
+ ModelNode FindChildModelNodeByName(std::string_view nodeName);
+
+ /**
+ * @brief Retrieves the list of blendshape name that current Model hold.
+ * The name will be appended end of input list.
+ *
+ * @SINCE_2_2.34
+ * @param[in, out] blendShapeNames The name of blendShape list collected.
+ * @note This method should be called after Model load finished.
+ */
+ void RetrieveBlendShapeNames(std::vector<std::string>& blendShapeNames) const;
+
+ /**
+ * @brief Retrieves the list of ModelNode that contains given blend shape name.
+ * The ModelNode will be appended end of input list.
+ *
+ * @SINCE_2_2.34
+ * @param[in] blendShapeName The name of blendShape that want to collect.
+ * @param[in, out] modelNodes The ModelNode list collected.
+ * @note This method should be called after Model load finished.
+ */
+ void RetrieveModelNodesByBlendShapeName(std::string_view blendShapeName, std::vector<ModelNode>& modelNodes) const;
+
+ /**
+ * @brief Generates specific animation of this Model by inputed MotionData.
+ *
+ * @SINCE_2_2.34
+ * @param[in] motionData the data of motion animation.
+ * @return Animation that be generated by MotionData. Or empty handle if there is no valid animation generated.
+ * @note This method should be called after Model load finished.
+ */
+ Dali::Animation GenerateMotionDataAnimation(MotionData motionData);
+
+ /**
+ * @brief Sets specific values of this Model by inputed MotionData.
+ * @note If MotionValue's ValueType is ValueType::KEY_FRAMES, the last value will be set.
+ *
+ * @SINCE_2_2.34
+ * @param[in] motionData the data of motion to be set.
+ * @note This method should be called after Model load finished.
+ */
+ void SetMotionData(Scene3D::MotionData motionData);
+
+ /**
+ * @brief Sets whether this Model casts shadow or not.
+ * If it is true, this model is drawn on Shadow Map.
+ *
+ * @SINCE_2_3.99
+ * @param[in] castShadow Whether this Model casts shadow or not.
+ * @note This method affects all of the child ModelNode.
+ * However, same property of each child ModelNode can be changed respectively and it not changes parent's property.
+ */
+ void CastShadow(bool castShadow);
+
+ /**
+ * @brief Retrieves whether the Model casts shadow or not for Light.
+ *
+ * @SINCE_2_3.99
+ * @return True if this model casts shadow.
+ * @note IBL does not cast any shadow.
+ */
+ bool IsShadowCasting() const;
+
+ /**
+ * @brief Sets whether this Model receives shadow or not.
+ * If it is true, shadows are drawn on this model.
+ *
+ * @SINCE_2_3.99
+ * @param[in] receiveShadow Whether this Model receives shadow or not.
+ * @note This method affects all of the child ModelNode.
+ * However, same property of each child ModelNode can be changed respectively and it not changes parent's property.
+ */
+ void ReceiveShadow(bool receiveShadow);
+
+ /**
+ * @brief Retrieves whether the Model receives shadow or not for Light.
+ *
+ * @SINCE_2_3.99
+ * @return True if this model receives shadow.
+ */
+ bool IsShadowReceiving() const;
+
+ /**
+ * @brief This signal is emitted when the collider mesh is touched/hit.
+ *
+ * A callback of the following type may be connected:
+ * @code
+ * bool YourCallbackName(Model model, ModelNode modelNode);
+ * @endcode
+ * Here the model is the model that is hit and the ModelNode containing the collider mesh
+ * was applied to.
+ * The return value of True, indicates that the hover event should be consumed.
+ * Otherwise the signal will be emitted on the next sensitive parent of the actor.
+ *
+ * @SINCE_2_2.53
+ * @return The signal to connect to
+ */
+ MeshHitSignalType& MeshHitSignal();
+
public: // Not intended for application developers
/// @cond internal
/**