[dali_2.3.21] Merge branch 'devel/master'
[platform/core/uifw/dali-toolkit.git] / dali-scene3d / internal / loader / gltf2-util.h
1 #ifndef DALI_SCENE3D_LOADER_GLTF2_UTIL_H
2 #define DALI_SCENE3D_LOADER_GLTF2_UTIL_H
3 /*
4  * Copyright (c) 2023 Samsung Electronics Co., Ltd.
5  *
6  * Licensed under the Apache License, Version 2.0 (the "License");
7  * you may not use this file except in compliance with the License.
8  * You may obtain a copy of the License at
9  *
10  * http://www.apache.org/licenses/LICENSE-2.0
11  *
12  * Unless required by applicable law or agreed to in writing, software
13  * distributed under the License is distributed on an "AS IS" BASIS,
14  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15  * See the License for the specific language governing permissions and
16  * limitations under the License.
17  *
18  */
19
20 // EXTERNAL INCLUDES
21 #include <dali/public-api/common/dali-common.h>
22
23 // INTERNAL INCLUDES
24 #include <dali-scene3d/internal/loader/gltf2-asset.h>
25 #include <dali-scene3d/public-api/loader/load-result.h>
26 #include <dali-scene3d/public-api/loader/resource-bundle.h>
27 #include <dali-scene3d/public-api/loader/scene-definition.h>
28
29 namespace gt = gltf2;
30 namespace js = json;
31
32 namespace Dali::Scene3D::Loader::Internal
33 {
34 namespace Gltf2Util
35 {
36 struct NodeMapping
37 {
38   Index gltfIndex;
39   Index runtimeIndex;
40
41   bool operator<(Index gltfIndex) const
42   {
43     return this->gltfIndex < gltfIndex;
44   }
45 };
46
47 class NodeIndexMapper
48 {
49 public:
50   NodeIndexMapper()                                  = default;
51   NodeIndexMapper(const NodeIndexMapper&)            = delete;
52   NodeIndexMapper& operator=(const NodeIndexMapper&) = delete;
53
54   ///@brief Registers a mapping of the @a gltfIndex of a node to its @a runtimeIndex .
55   ///@note If the indices are the same, the registration is omitted, in order to
56   /// save growing a vector.
57   void RegisterMapping(Index gltfIndex, Index runtimeIndex)
58   {
59     if(gltfIndex != runtimeIndex)
60     {
61       auto iInsert = std::lower_bound(mNodes.begin(), mNodes.end(), gltfIndex);
62       DALI_ASSERT_DEBUG(iInsert == mNodes.end() || iInsert->gltfIndex != gltfIndex);
63       mNodes.insert(iInsert, NodeMapping{gltfIndex, runtimeIndex});
64     }
65   }
66
67   ///@brief Retrieves the runtime index of a Node, mapped to the given @a gltfIndex.
68   Index GetRuntimeId(Index gltfIndex) const
69   {
70     auto iFind = std::lower_bound(mNodes.begin(), mNodes.end(), gltfIndex); // using custom operator<
71     return (iFind != mNodes.end() && iFind->gltfIndex == gltfIndex) ? iFind->runtimeIndex : gltfIndex;
72   }
73
74 private:
75   std::vector<NodeMapping> mNodes;
76 };
77
78 struct ConversionContext
79 {
80   LoadResult& mOutput;
81
82   std::string mPath;
83   Index       mDefaultMaterial;
84
85   std::vector<Index> mMeshIds;
86   NodeIndexMapper    mNodeIndices;
87 };
88
89 void ConvertBuffers(const gt::Document& document, ConversionContext& context);
90
91 void ConvertMaterials(const gt::Document& document, ConversionContext& context);
92
93 void ConvertMeshes(const gt::Document& document, ConversionContext& context);
94
95 void ConvertCamera(const gt::Camera& camera, CameraParameters& cameraParameters);
96
97 void ConvertNodes(const gt::Document& document, ConversionContext& context, bool isMRendererModel);
98
99 void ConvertAnimations(const gt::Document& document, ConversionContext& context);
100
101 void ProcessSkins(const gt::Document& document, ConversionContext& context);
102
103 void SetDefaultEnvironmentMap(const gt::Document& document, ConversionContext& context);
104
105 const std::string_view GetRendererModelIdentification();
106
107 void ReadDocument(const json_object_s& jsonObject, gt::Document& document);
108
109 void InitializeGltfLoader();
110
111 void ReadDocumentFromParsedData(const json_object_s& jsonObject, gltf2::Document& document);
112
113 bool GenerateDocument(json::unique_ptr& root, gt::Document& document, bool& isMRendererModel);
114
115 void ConvertGltfToContext(gt::Document& document, Gltf2Util::ConversionContext& context, bool isMRendererModel);
116
117 } // namespace Gltf2Util
118
119 } // namespace Dali::Scene3D::Loader::Internal
120
121 #endif // DALI_SCENE3D_LOADER_GLTF2_UTIL_H