Texture size reduction on the fly for 3D model using metadata
[platform/core/uifw/dali-toolkit.git] / dali-scene3d / internal / loader / gltf2-asset.cpp
1 /*
2 * Copyright (c) 2022 Samsung Electronics Co., Ltd.
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 *
16 */
17
18 // EXTERNAL INCLUDES
19 #include <dali/public-api/math/matrix.h>
20 #include <algorithm>
21 #include <map>
22
23 // INTERNAL INCLUDES
24 #include <dali-scene3d/internal/loader/gltf2-asset.h>
25
26 using namespace Dali;
27
28 namespace gltf2
29 {
30 namespace
31 {
32 constexpr uint32_t ACCESSOR_TYPE_ELEMENT_COUNT[]{
33   1,
34   2,
35   3,
36   4,
37   4,
38   9,
39   16,
40   static_cast<uint32_t>(-1)};
41
42 const std::map<std::string_view, AccessorType::Type> ACCESSOR_TYPES{
43   ENUM_STRING_MAPPING(AccessorType, SCALAR),
44   ENUM_STRING_MAPPING(AccessorType, VEC2),
45   ENUM_STRING_MAPPING(AccessorType, VEC3),
46   ENUM_STRING_MAPPING(AccessorType, VEC4),
47   ENUM_STRING_MAPPING(AccessorType, MAT2),
48   ENUM_STRING_MAPPING(AccessorType, MAT3),
49   ENUM_STRING_MAPPING(AccessorType, MAT4),
50 };
51
52 const std::map<std::string_view, AlphaMode::Type> ALPHA_MODE_TYPES{
53   ENUM_STRING_MAPPING(AlphaMode::Type, OPAQUE),
54   ENUM_STRING_MAPPING(AlphaMode::Type, MASK),
55   ENUM_STRING_MAPPING(AlphaMode::Type, BLEND),
56 };
57
58 const std::map<std::string_view, Attribute::Type> ATTRIBUTE_TYPES{
59   ENUM_STRING_MAPPING(Attribute::Type, POSITION),
60   ENUM_STRING_MAPPING(Attribute::Type, NORMAL),
61   ENUM_STRING_MAPPING(Attribute::Type, TANGENT),
62   ENUM_STRING_MAPPING(Attribute::Type, TEXCOORD_0),
63   ENUM_STRING_MAPPING(Attribute::Type, TEXCOORD_1),
64   ENUM_STRING_MAPPING(Attribute::Type, COLOR_0),
65   ENUM_STRING_MAPPING(Attribute::Type, JOINTS_0),
66   ENUM_STRING_MAPPING(Attribute::Type, WEIGHTS_0),
67 };
68
69 const std::map<std::string_view, Animation::Sampler::Interpolation::Type> ANIMATION_SAMPLER_INTERPOLATION{
70   ENUM_STRING_MAPPING(Animation::Sampler::Interpolation::Type, STEP),
71   ENUM_STRING_MAPPING(Animation::Sampler::Interpolation::Type, LINEAR),
72   ENUM_STRING_MAPPING(Animation::Sampler::Interpolation::Type, CUBICSPLINE),
73 };
74
75 const std::map<std::string_view, Animation::Channel::Target::Type> ANIMATION_CHANNEL_TARGET_PATH_TYPES{
76   ENUM_STRING_MAPPING(Animation::Channel::Target::Type, TRANSLATION),
77   ENUM_STRING_MAPPING(Animation::Channel::Target::Type, ROTATION),
78   ENUM_STRING_MAPPING(Animation::Channel::Target::Type, SCALE),
79   ENUM_STRING_MAPPING(Animation::Channel::Target::Type, WEIGHTS),
80 };
81
82 } // namespace
83
84 ENUM_TYPE_FROM_STRING(AccessorType, ACCESSOR_TYPES)
85 ENUM_TYPE_FROM_STRING(AlphaMode, ALPHA_MODE_TYPES)
86 ENUM_TYPE_FROM_STRING(Attribute, ATTRIBUTE_TYPES)
87 ENUM_TYPE_FROM_STRING(Animation::Sampler::Interpolation, ANIMATION_SAMPLER_INTERPOLATION)
88 ENUM_TYPE_FROM_STRING(Animation::Channel::Target, ANIMATION_CHANNEL_TARGET_PATH_TYPES)
89
90 bool Component::IsUnsigned(Type t)
91 {
92   return t == UNSIGNED_BYTE || t == UNSIGNED_SHORT || t == UNSIGNED_INT;
93 }
94
95 uint32_t Component::Size(Type t)
96 {
97   switch(t)
98   {
99     case BYTE:
100     case UNSIGNED_BYTE:
101       return 1;
102     case SHORT:
103     case UNSIGNED_SHORT:
104       return 2;
105     case UNSIGNED_INT:
106     case FLOAT:
107       return 4;
108     default:
109       return -1;
110   }
111 }
112
113 uint32_t AccessorType::ElementCount(Type t)
114 {
115   return ACCESSOR_TYPE_ELEMENT_COUNT[t];
116 }
117
118 uint32_t ComponentTypedBufferViewClient::GetBytesPerComponent() const
119 {
120   return Component::Size(mComponentType);
121 }
122
123 void Node::SetMatrix(const Matrix& m)
124 {
125   m.GetTransformComponents(mTranslation, mRotation, mScale);
126 }
127
128 Quaternion ReadQuaternion(const json_value_s& j)
129 {
130   return Quaternion(ReadDaliVector<Vector4>(j));
131 }
132
133 } // namespace gltf2