SpiecsEngine
 
Loading...
Searching...
No Matches
GltfHelper.cpp
Go to the documentation of this file.
1/**
2* @file GltfHelper.cpp
3* @brief The GltfHelper Class Implementation.
4* @author Spices.
5*/
6
7#include "Pchheader.h"
8#include "GltfHelper.h"
9
10namespace Spices {
11
12 VkFormat GltfHelper::GetFormat(const std::string& str, int id)
13 {
15
16 if (str == "SCALAR")
17 {
18 switch (id)
19 {
20 case 5120: return VK_FORMAT_R8_SINT; //(BYTE)
21 case 5121: return VK_FORMAT_R8_UINT; //(UNSIGNED_BYTE)1
22 case 5122: return VK_FORMAT_R16_SINT; //(SHORT)2
23 case 5123: return VK_FORMAT_R16_UINT; //(UNSIGNED_SHORT)2
24 case 5124: return VK_FORMAT_R32_SINT; //(SIGNED_INT)4
25 case 5125: return VK_FORMAT_R32_UINT; //(UNSIGNED_INT)4
26 case 5126: return VK_FORMAT_R32_SFLOAT; //(FLOAT)
27 }
28 }
29 else if (str == "VEC2")
30 {
31 switch (id)
32 {
33 case 5120: return VK_FORMAT_R8G8_SINT; //(BYTE)
34 case 5121: return VK_FORMAT_R8G8_UINT; //(UNSIGNED_BYTE)1
35 case 5122: return VK_FORMAT_R16G16_SINT; //(SHORT)2
36 case 5123: return VK_FORMAT_R16G16_UINT; //(UNSIGNED_SHORT)2
37 case 5124: return VK_FORMAT_R32G32_SINT; //(SIGNED_INT)4
38 case 5125: return VK_FORMAT_R32G32_UINT; //(UNSIGNED_INT)4
39 case 5126: return VK_FORMAT_R32G32_SFLOAT; //(FLOAT)
40 }
41 }
42 else if (str == "VEC3")
43 {
44 switch (id)
45 {
46 case 5120: return VK_FORMAT_UNDEFINED; //(BYTE)
47 case 5121: return VK_FORMAT_UNDEFINED; //(UNSIGNED_BYTE)1
48 case 5122: return VK_FORMAT_UNDEFINED; //(SHORT)2
49 case 5123: return VK_FORMAT_UNDEFINED; //(UNSIGNED_SHORT)2
50 case 5124: return VK_FORMAT_R32G32B32_SINT; //(SIGNED_INT)4
51 case 5125: return VK_FORMAT_R32G32B32_UINT; //(UNSIGNED_INT)4
52 case 5126: return VK_FORMAT_R32G32B32_SFLOAT; //(FLOAT)
53 }
54 }
55 else if (str == "VEC4")
56 {
57 switch (id)
58 {
59 case 5120: return VK_FORMAT_R8G8B8A8_SINT; //(BYTE)
60 case 5121: return VK_FORMAT_R8G8B8A8_UINT; //(UNSIGNED_BYTE)1
61 case 5122: return VK_FORMAT_R16G16B16A16_SINT; //(SHORT)2
62 case 5123: return VK_FORMAT_R16G16B16A16_UINT; //(UNSIGNED_SHORT)2
63 case 5124: return VK_FORMAT_R32G32B32A32_SINT; //(SIGNED_INT)4
64 case 5125: return VK_FORMAT_R32G32B32A32_UINT; //(UNSIGNED_INT)4
65 case 5126: return VK_FORMAT_R32G32B32A32_SFLOAT; //(FLOAT)
66 }
67 }
68
69 return VK_FORMAT_UNDEFINED;
70 }
71
72 uint32_t GltfHelper::SizeOfFormat(VkFormat format)
73 {
75
76 switch (format)
77 {
78 case VK_FORMAT_R8_SINT: return 1; //(BYTE)
79 case VK_FORMAT_R8_UINT: return 1; //(UNSIGNED_BYTE)1
80 case VK_FORMAT_R16_SINT: return 2; //(SHORT)2
81 case VK_FORMAT_R16_UINT: return 2; //(UNSIGNED_SHORT)2
82 case VK_FORMAT_R32_SINT: return 4; //(SIGNED_INT)4
83 case VK_FORMAT_R32_UINT: return 4; //(UNSIGNED_INT)4
84 case VK_FORMAT_R32_SFLOAT: return 4; //(FLOAT)
85
86 case VK_FORMAT_R8G8_SINT: return 2 * 1; //(BYTE)
87 case VK_FORMAT_R8G8_UINT: return 2 * 1; //(UNSIGNED_BYTE)1
88 case VK_FORMAT_R16G16_SINT: return 2 * 2; //(SHORT)2
89 case VK_FORMAT_R16G16_UINT: return 2 * 2; // (UNSIGNED_SHORT)2
90 case VK_FORMAT_R32G32_SINT: return 2 * 4; //(SIGNED_INT)4
91 case VK_FORMAT_R32G32_UINT: return 2 * 4; //(UNSIGNED_INT)4
92 case VK_FORMAT_R32G32_SFLOAT: return 2 * 4; //(FLOAT)
93
94 case VK_FORMAT_UNDEFINED: return 0; //(BYTE) (UNSIGNED_BYTE) (SHORT) (UNSIGNED_SHORT)
95 case VK_FORMAT_R32G32B32_SINT: return 3 * 4; //(SIGNED_INT)4
96 case VK_FORMAT_R32G32B32_UINT: return 3 * 4; //(UNSIGNED_INT)4
97 case VK_FORMAT_R32G32B32_SFLOAT: return 3 * 4; //(FLOAT)
98
99 case VK_FORMAT_R8G8B8A8_SINT: return 4 * 1; //(BYTE)
100 case VK_FORMAT_R8G8B8A8_UINT: return 4 * 1; //(UNSIGNED_BYTE)1
101 case VK_FORMAT_R16G16B16A16_SINT: return 4 * 2; //(SHORT)2
102 case VK_FORMAT_R16G16B16A16_UINT: return 4 * 2; //(UNSIGNED_SHORT)2
103 case VK_FORMAT_R32G32B32A32_SINT: return 4 * 4; //(SIGNED_INT)4
104 case VK_FORMAT_R32G32B32A32_UINT: return 4 * 4; //(UNSIGNED_INT)4
105 case VK_FORMAT_R32G32B32A32_SFLOAT: return 4 * 4; //(FLOAT)
106 }
107
108 return 0;
109 }
110
112 {
114
115 switch (id)
116 {
117 case 5120: return 1; //(BYTE)
118 case 5121: return 1; //(UNSIGNED_BYTE)1
119 case 5122: return 2; //(SHORT)2
120 case 5123: return 2; //(UNSIGNED_SHORT)2
121 case 5124: return 4; //(SIGNED_INT)4
122 case 5125: return 4; //(UNSIGNED_INT)4
123 case 5126: return 4; //(FLOAT)
124 }
125
126 return -1;
127 }
128
129 int GltfHelper::GetDimensions(const std::string& str)
130 {
132
133 if (str == "SCALAR") return 1;
134 else if (str == "VEC2") return 2;
135 else if (str == "VEC3") return 3;
136 else if (str == "VEC4") return 4;
137 else if (str == "MAT4") return 4 * 4;
138 else return -1;
139 }
140
141 void GltfHelper::SplitGltfAttribute(std::string attribute, std::string* semanticName, uint32_t* semanticIndex)
142 {
144
145 *semanticIndex = 0;
146
147 if (isdigit(attribute.back()))
148 {
149 *semanticIndex = attribute.back() - '0';
150
151 attribute.pop_back();
152 if (attribute.back() == '_')
153 {
154 attribute.pop_back();
155 }
156 }
157
158 *semanticName = attribute;
159 }
160
161 glm::vec4 GltfHelper::GetVector(const Json::array_t& accessor)
162 {
164
165 if (accessor.size() == 0)
166 {
167 return glm::vec4(0.0f);
168 }
169 else if(accessor.size() == 1)
170 {
171 return glm::vec4(accessor[0], 0.0f, 0.0f, 0.0f);
172 }
173 else if (accessor.size() == 2)
174 {
175 return glm::vec4(accessor[0], accessor[1], 0.0f, 0.0f);
176 }
177 else if (accessor.size() == 3)
178 {
179 return glm::vec4(accessor[0], accessor[1], accessor[2], 0.0f);
180 }
181 else
182 {
183 return glm::vec4(accessor[0], accessor[1], accessor[2], accessor[3]);
184 }
185 }
186
187 glm::mat4 GltfHelper::GetMatrix(const Json::array_t& accessor)
188 {
190
191 return glm::mat4(
192 glm::vec4(accessor[0], accessor[1], accessor[2], accessor[3]),
193 glm::vec4(accessor[4], accessor[5], accessor[6], accessor[7]),
194 glm::vec4(accessor[8], accessor[9], accessor[10], accessor[11]),
195 glm::vec4(accessor[12], accessor[13], accessor[14], accessor[15])
196 );
197 }
198
199 std::string GltfHelper::GetElementString(const Json::object_t& root, const char* path, const std::string& pDefault)
200 {
202
203 return GetElement<std::string>(&root, path, pDefault);
204 }
205
206 bool GltfHelper::GetElementBoolean(const Json::object_t& root, const char* path, bool pDefault)
207 {
209
210 return GetElement<bool>(&root, path, pDefault);
211 }
212
213 float GltfHelper::GetElementFloat(const Json::object_t& root, const char* path, float pDefault)
214 {
216
217 return GetElement<float>(&root, path, pDefault);
218 }
219
220 int GltfHelper::GetElementInt(const Json::object_t& root, const char* path, int pDefault)
221 {
223
224 return GetElement<int>(&root, path, pDefault);
225 }
226
227 GltfHelper::Json::array_t GltfHelper::GetElementJsonArray(const Json::object_t& root, const char* path, Json::array_t pDefault)
228 {
230
231 return GetElement<Json::array_t>(&root, path, pDefault);
232 }
233
234 glm::vec4 GltfHelper::GetElementVector(Json::object_t& root, const char* path, glm::vec4 pDefault)
235 {
237
238 if (root.find(path) != root.end() && !root[path].is_null())
239 {
240 return GetVector(root[path].get<Json::array_t>());
241 }
242 else
243 {
244 return pDefault;
245 }
246 }
247}
#define SPICES_PROFILE_ZONE
static int GetDimensions(const std::string &str)
Get Variable Type dimensions.
static void SplitGltfAttribute(std::string attribute, std::string *semanticName, uint32_t *semanticIndex)
Split digital number in attribute.
static int GetFormatSize(int id)
Get Variable Type bytes.
Static functions to help resolve Gltf json.
Definition GltfHelper.h:17