2 * Copyright (c) 2023 Samsung Electronics Co., Ltd.
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
8 * http://www.apache.org/licenses/LICENSE-2.0
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.
19 #include <dali/public-api/math/matrix.h>
24 #include <dali-scene3d/internal/loader/gltf2-asset.h>
32 constexpr uint32_t ACCESSOR_TYPE_ELEMENT_COUNT[]{
40 static_cast<uint32_t>(-1)};
42 const std::map<std::string_view, AccessorType::Type>& GetAccessorTypes()
44 static const std::map<std::string_view, AccessorType::Type> ACCESSOR_TYPES{
45 ENUM_STRING_MAPPING(AccessorType, SCALAR),
46 ENUM_STRING_MAPPING(AccessorType, VEC2),
47 ENUM_STRING_MAPPING(AccessorType, VEC3),
48 ENUM_STRING_MAPPING(AccessorType, VEC4),
49 ENUM_STRING_MAPPING(AccessorType, MAT2),
50 ENUM_STRING_MAPPING(AccessorType, MAT3),
51 ENUM_STRING_MAPPING(AccessorType, MAT4),
53 return ACCESSOR_TYPES;
56 const std::map<std::string_view, AlphaMode::Type>& GetAlphaModeTypes()
58 static const std::map<std::string_view, AlphaMode::Type> ALPHA_MODE_TYPES{
59 ENUM_STRING_MAPPING(AlphaMode::Type, OPAQUE),
60 ENUM_STRING_MAPPING(AlphaMode::Type, MASK),
61 ENUM_STRING_MAPPING(AlphaMode::Type, BLEND),
63 return ALPHA_MODE_TYPES;
66 const std::map<std::string_view, Animation::Sampler::Interpolation::Type>& GetAnimationSamplerInterpolation()
68 static const std::map<std::string_view, Animation::Sampler::Interpolation::Type> ANIMATION_SAMPLER_INTERPOLATION{
69 ENUM_STRING_MAPPING(Animation::Sampler::Interpolation::Type, STEP),
70 ENUM_STRING_MAPPING(Animation::Sampler::Interpolation::Type, LINEAR),
71 ENUM_STRING_MAPPING(Animation::Sampler::Interpolation::Type, CUBICSPLINE),
73 return ANIMATION_SAMPLER_INTERPOLATION;
76 const std::map<std::string_view, Animation::Channel::Target::Type>& GetAnimationChannelTargetPathTypes()
78 static const std::map<std::string_view, Animation::Channel::Target::Type> ANIMATION_CHANNEL_TARGET_PATH_TYPES{
79 ENUM_STRING_MAPPING(Animation::Channel::Target::Type, TRANSLATION),
80 ENUM_STRING_MAPPING(Animation::Channel::Target::Type, ROTATION),
81 ENUM_STRING_MAPPING(Animation::Channel::Target::Type, SCALE),
82 ENUM_STRING_MAPPING(Animation::Channel::Target::Type, WEIGHTS),
84 return ANIMATION_CHANNEL_TARGET_PATH_TYPES;
89 ENUM_TYPE_FROM_STRING(AccessorType, GetAccessorTypes())
90 ENUM_TYPE_FROM_STRING(AlphaMode, GetAlphaModeTypes())
91 ENUM_TYPE_FROM_STRING(Animation::Sampler::Interpolation, GetAnimationSamplerInterpolation())
92 ENUM_TYPE_FROM_STRING(Animation::Channel::Target, GetAnimationChannelTargetPathTypes())
94 const std::map<std::string_view, Attribute::Type>& GetTargetTypes()
96 static const std::map<std::string_view, Attribute::Type> TARGET_TYPES{
97 ENUM_STRING_MAPPING(Attribute::Type, POSITION),
98 ENUM_STRING_MAPPING(Attribute::Type, TANGENT),
99 ENUM_STRING_MAPPING(Attribute::Type, NORMAL),
104 const std::map<Attribute::Type, const char*>& GetAttributeSetTypes()
106 static const std::map<Attribute::Type, const char*> ATTRIBUTE_SET_TYPES{
107 {Attribute::Type::TEXCOORD_N, "TEXCOORD_%u"},
108 {Attribute::Type::COLOR_N, "COLOR_%u"},
109 {Attribute::Type::JOINTS_N, "JOINTS_%u"},
110 {Attribute::Type::WEIGHTS_N, "WEIGHTS_%u"},
112 return ATTRIBUTE_SET_TYPES;
115 uint32_t Attribute::HashFromString(const char* token, size_t length)
117 auto& table1 = GetTargetTypes();
118 auto& table2 = GetAttributeSetTypes();
120 std::string target(token, length);
121 std::transform(target.begin(), target.end(), target.begin(), ::toupper);
123 auto iFind = table1.find(std::string_view(target.c_str(), length));
124 if(iFind != table1.end())
126 return Attribute::ToHash(iFind->second, false, 0);
129 uint32_t hash = Attribute::ToHash(Attribute::INVALID, false, 0);
130 for(const auto& [key, match] : table2)
133 if(sscanf(target.c_str(), match, &setIndex) > 0)
135 hash = Attribute::ToHash(key, true, setIndex);
142 Attribute::Type Attribute::TargetFromString(const char* token, size_t length)
144 std::string target(token, length);
145 std::transform(target.begin(), target.end(), target.begin(), ::toupper);
147 auto iFind = GetTargetTypes().find(std::string_view(target.c_str(), length));
148 if(iFind != GetTargetTypes().end())
150 return iFind->second;
152 return Attribute::INVALID;
155 bool Component::IsUnsigned(Type t)
157 return t == UNSIGNED_BYTE || t == UNSIGNED_SHORT || t == UNSIGNED_INT;
160 uint32_t Component::Size(Type t)
178 uint32_t AccessorType::ElementCount(Type t)
180 return ACCESSOR_TYPE_ELEMENT_COUNT[t];
183 uint32_t ComponentTypedBufferViewClient::GetBytesPerComponent() const
185 return Component::Size(mComponentType);
188 void Node::SetMatrix(const Matrix& m)
190 m.GetTransformComponents(mTranslation, mRotation, mScale);
193 Quaternion ReadQuaternion(const json_value_s& j)
195 return Quaternion(ReadDaliVector<Vector4>(j));