Skip to content

Commit a829752

Browse files
committed
Finish testing fromJsonValue
1 parent e38386f commit a829752

File tree

2 files changed

+527
-127
lines changed

2 files changed

+527
-127
lines changed

Source/CesiumRuntime/Private/CesiumMetadataValue.cpp

Lines changed: 172 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -132,55 +132,70 @@ std::vector<T> getScalarArray(const CesiumUtility::JsonValue::Array& array) {
132132
FCesiumMetadataValue convertToScalarArray(
133133
const CesiumUtility::JsonValue::Array& array,
134134
ECesiumMetadataComponentType targetComponentType) {
135+
FCesiumPropertyArray resultArray;
135136
switch (targetComponentType) {
136137
case ECesiumMetadataComponentType::Int8:
137-
return FCesiumMetadataValue(
138+
resultArray = FCesiumPropertyArray(
138139
CesiumGltf::PropertyArrayCopy<int8_t>(getScalarArray<int8_t>(array)));
140+
break;
139141
case ECesiumMetadataComponentType::Uint8:
140-
return FCesiumMetadataValue(
142+
resultArray = FCesiumPropertyArray(
141143
CesiumGltf::PropertyArrayCopy<uint8_t>(getScalarArray<uint8_t>(array)));
144+
break;
142145
case ECesiumMetadataComponentType::Int16:
143-
return FCesiumMetadataValue(
146+
resultArray = FCesiumPropertyArray(
144147
CesiumGltf::PropertyArrayCopy<int16_t>(getScalarArray<int16_t>(array)));
148+
break;
145149
case ECesiumMetadataComponentType::Uint16:
146-
return FCesiumMetadataValue(CesiumGltf::PropertyArrayCopy<uint16_t>(
150+
resultArray = FCesiumPropertyArray(CesiumGltf::PropertyArrayCopy<uint16_t>(
147151
getScalarArray<uint16_t>(array)));
152+
break;
148153
case ECesiumMetadataComponentType::Int32:
149-
return FCesiumMetadataValue(
154+
resultArray = FCesiumPropertyArray(
150155
CesiumGltf::PropertyArrayCopy<int32_t>(getScalarArray<int32_t>(array)));
156+
break;
151157
case ECesiumMetadataComponentType::Uint32:
152-
return FCesiumMetadataValue(CesiumGltf::PropertyArrayCopy<uint32_t>(
158+
resultArray = FCesiumPropertyArray(CesiumGltf::PropertyArrayCopy<uint32_t>(
153159
getScalarArray<uint32_t>(array)));
160+
break;
154161
case ECesiumMetadataComponentType::Int64:
155-
return FCesiumMetadataValue(
162+
resultArray = FCesiumPropertyArray(
156163
CesiumGltf::PropertyArrayCopy<int64_t>(getScalarArray<int64_t>(array)));
164+
break;
157165
case ECesiumMetadataComponentType::Uint64:
158-
return FCesiumMetadataValue(CesiumGltf::PropertyArrayCopy<uint64_t>(
166+
resultArray = FCesiumPropertyArray(CesiumGltf::PropertyArrayCopy<uint64_t>(
159167
getScalarArray<uint64_t>(array)));
168+
break;
160169
case ECesiumMetadataComponentType::Float32:
161-
return FCesiumMetadataValue(
170+
resultArray = FCesiumPropertyArray(
162171
CesiumGltf::PropertyArrayCopy<float>(getScalarArray<float>(array)));
172+
break;
163173
case ECesiumMetadataComponentType::Float64:
164-
return FCesiumMetadataValue(
174+
resultArray = FCesiumPropertyArray(
165175
CesiumGltf::PropertyArrayCopy<double>(getScalarArray<double>(array)));
176+
break;
166177
default:
167178
return EmptyMetadataValue;
168179
}
180+
181+
return UCesiumPropertyArrayBlueprintLibrary::GetArraySize(resultArray) > 0
182+
? FCesiumMetadataValue(std::move(resultArray))
183+
: EmptyMetadataValue;
169184
}
170185

171186
template <glm::length_t N, typename T>
172-
FCesiumMetadataValue
187+
std::optional<glm::vec<N, T>>
173188
convertToVecN(const CesiumUtility::JsonValue::Array& array) {
174189
CESIUM_ASSERT(array.size() == N);
175190

176191
std::vector<T> components = getScalarArray<T>(array);
177192
if (components.size() != array.size()) {
178-
return EmptyMetadataValue;
193+
return std::nullopt;
179194
}
180195

181196
glm::vec<N, T>* pResult =
182197
reinterpret_cast<glm::vec<N, T>*>(components.data());
183-
return FCesiumMetadataValue(*pResult);
198+
return *pResult;
184199
}
185200

186201
template <glm::length_t N>
@@ -189,43 +204,43 @@ FCesiumMetadataValue convertToVecN(
189204
ECesiumMetadataComponentType targetComponentType) {
190205
switch (targetComponentType) {
191206
case ECesiumMetadataComponentType::Int8:
192-
return convertToVecN<N, int8_t>(array);
207+
return FCesiumMetadataValue(convertToVecN<N, int8_t>(array));
193208
case ECesiumMetadataComponentType::Uint8:
194-
return convertToVecN<N, uint8_t>(array);
209+
return FCesiumMetadataValue(convertToVecN<N, uint8_t>(array));
195210
case ECesiumMetadataComponentType::Int16:
196-
return convertToVecN<N, int16_t>(array);
211+
return FCesiumMetadataValue(convertToVecN<N, int16_t>(array));
197212
case ECesiumMetadataComponentType::Uint16:
198-
return convertToVecN<N, uint16_t>(array);
213+
return FCesiumMetadataValue(convertToVecN<N, uint16_t>(array));
199214
case ECesiumMetadataComponentType::Int32:
200-
return convertToVecN<N, int32_t>(array);
215+
return FCesiumMetadataValue(convertToVecN<N, int32_t>(array));
201216
case ECesiumMetadataComponentType::Uint32:
202-
return convertToVecN<N, uint32_t>(array);
217+
return FCesiumMetadataValue(convertToVecN<N, uint32_t>(array));
203218
case ECesiumMetadataComponentType::Int64:
204-
return convertToVecN<N, int64_t>(array);
219+
return FCesiumMetadataValue(convertToVecN<N, int64_t>(array));
205220
case ECesiumMetadataComponentType::Uint64:
206-
return convertToVecN<N, uint64_t>(array);
221+
return FCesiumMetadataValue(convertToVecN<N, uint64_t>(array));
207222
case ECesiumMetadataComponentType::Float32:
208-
return convertToVecN<N, float>(array);
223+
return FCesiumMetadataValue(convertToVecN<N, float>(array));
209224
case ECesiumMetadataComponentType::Float64:
210-
return convertToVecN<N, double>(array);
225+
return FCesiumMetadataValue(convertToVecN<N, double>(array));
211226
default:
212227
return EmptyMetadataValue;
213228
}
214229
}
215230

216231
template <glm::length_t N, typename T>
217-
FCesiumMetadataValue
232+
std::optional<glm::mat<N, N, T>>
218233
convertToMatN(const CesiumUtility::JsonValue::Array& array) {
219234
CESIUM_ASSERT(array.size() == N * N);
220235

221236
std::vector<T> components = getScalarArray<T>(array);
222237
if (components.size() != array.size()) {
223-
return EmptyMetadataValue;
238+
return std::nullopt;
224239
}
225240

226241
glm::mat<N, N, T>* pResult =
227242
reinterpret_cast<glm::mat<N, N, T>*>(components.data());
228-
return FCesiumMetadataValue(*pResult);
243+
return *pResult;
229244
}
230245

231246
template <glm::length_t N>
@@ -234,29 +249,132 @@ FCesiumMetadataValue convertToMatN(
234249
ECesiumMetadataComponentType targetComponentType) {
235250
switch (targetComponentType) {
236251
case ECesiumMetadataComponentType::Int8:
237-
return convertToMatN<N, int8_t>(array);
252+
return FCesiumMetadataValue(convertToMatN<N, int8_t>(array));
253+
case ECesiumMetadataComponentType::Uint8:
254+
return FCesiumMetadataValue(convertToMatN<N, uint8_t>(array));
255+
case ECesiumMetadataComponentType::Int16:
256+
return FCesiumMetadataValue(convertToMatN<N, int16_t>(array));
257+
case ECesiumMetadataComponentType::Uint16:
258+
return FCesiumMetadataValue(convertToMatN<N, uint16_t>(array));
259+
case ECesiumMetadataComponentType::Int32:
260+
return FCesiumMetadataValue(convertToMatN<N, int32_t>(array));
261+
case ECesiumMetadataComponentType::Uint32:
262+
return FCesiumMetadataValue(convertToMatN<N, uint32_t>(array));
263+
case ECesiumMetadataComponentType::Int64:
264+
return FCesiumMetadataValue(convertToMatN<N, int64_t>(array));
265+
case ECesiumMetadataComponentType::Uint64:
266+
return FCesiumMetadataValue(convertToMatN<N, uint64_t>(array));
267+
case ECesiumMetadataComponentType::Float32:
268+
return FCesiumMetadataValue(convertToMatN<N, float>(array));
269+
case ECesiumMetadataComponentType::Float64:
270+
return FCesiumMetadataValue(convertToMatN<N, double>(array));
271+
default:
272+
return EmptyMetadataValue;
273+
}
274+
}
275+
276+
template <glm::length_t N, typename T>
277+
FCesiumMetadataValue
278+
convertToVecNArray(const CesiumUtility::JsonValue::Array& array) {
279+
std::vector<glm::vec<N, T>> values(array.size());
280+
for (size_t i = 0; i < array.size(); i++) {
281+
if (!array[i].isArray() || array[i].getArray().size() != N) {
282+
return EmptyMetadataValue;
283+
}
284+
285+
const CesiumUtility::JsonValue::Array& subArray = array[i].getArray();
286+
std::optional<glm::vec<N, T>> maybeValue = convertToVecN<N, T>(subArray);
287+
if (!maybeValue) {
288+
return EmptyMetadataValue;
289+
}
290+
values[i] = *maybeValue;
291+
}
292+
293+
return FCesiumMetadataValue(
294+
CesiumGltf::PropertyArrayCopy<glm::vec<N, T>>(values));
295+
}
296+
297+
template <glm::length_t N>
298+
FCesiumMetadataValue convertToVecNArray(
299+
const CesiumUtility::JsonValue::Array& array,
300+
ECesiumMetadataComponentType targetComponentType) {
301+
switch (targetComponentType) {
302+
case ECesiumMetadataComponentType::Int8:
303+
return FCesiumMetadataValue(convertToVecNArray<N, int8_t>(array));
238304
case ECesiumMetadataComponentType::Uint8:
239-
return convertToMatN<N, uint8_t>(array);
305+
return FCesiumMetadataValue(convertToVecNArray<N, uint8_t>(array));
240306
case ECesiumMetadataComponentType::Int16:
241-
return convertToMatN<N, int16_t>(array);
307+
return FCesiumMetadataValue(convertToVecNArray<N, int16_t>(array));
242308
case ECesiumMetadataComponentType::Uint16:
243-
return convertToMatN<N, uint16_t>(array);
309+
return FCesiumMetadataValue(convertToVecNArray<N, uint16_t>(array));
244310
case ECesiumMetadataComponentType::Int32:
245-
return convertToMatN<N, int32_t>(array);
311+
return FCesiumMetadataValue(convertToVecNArray<N, int32_t>(array));
246312
case ECesiumMetadataComponentType::Uint32:
247-
return convertToMatN<N, uint32_t>(array);
313+
return FCesiumMetadataValue(convertToVecNArray<N, uint32_t>(array));
248314
case ECesiumMetadataComponentType::Int64:
249-
return convertToMatN<N, int64_t>(array);
315+
return FCesiumMetadataValue(convertToVecNArray<N, int64_t>(array));
250316
case ECesiumMetadataComponentType::Uint64:
251-
return convertToMatN<N, uint64_t>(array);
317+
return FCesiumMetadataValue(convertToVecNArray<N, uint64_t>(array));
252318
case ECesiumMetadataComponentType::Float32:
253-
return convertToMatN<N, float>(array);
319+
return FCesiumMetadataValue(convertToVecNArray<N, float>(array));
254320
case ECesiumMetadataComponentType::Float64:
255-
return convertToMatN<N, double>(array);
321+
return FCesiumMetadataValue(convertToVecNArray<N, double>(array));
256322
default:
257323
return EmptyMetadataValue;
258324
}
259325
}
326+
327+
template <glm::length_t N, typename T>
328+
FCesiumMetadataValue
329+
convertToMatNArray(const CesiumUtility::JsonValue::Array& array) {
330+
std::vector<glm::mat<N, N, T>> values(array.size());
331+
for (size_t i = 0; i < array.size(); i++) {
332+
if (!array[i].isArray() || array[i].getArray().size() != N * N) {
333+
return EmptyMetadataValue;
334+
}
335+
336+
const CesiumUtility::JsonValue::Array& subArray = array[i].getArray();
337+
std::optional<glm::mat<N, N, T>> maybeValue = convertToMatN<N, T>(subArray);
338+
if (!maybeValue) {
339+
return EmptyMetadataValue;
340+
}
341+
values[i] = *maybeValue;
342+
}
343+
344+
return FCesiumMetadataValue(
345+
CesiumGltf::PropertyArrayCopy<glm::mat<N, N, T>>(values));
346+
}
347+
348+
template <glm::length_t N>
349+
FCesiumMetadataValue convertToMatNArray(
350+
const CesiumUtility::JsonValue::Array& array,
351+
ECesiumMetadataComponentType targetComponentType) {
352+
switch (targetComponentType) {
353+
case ECesiumMetadataComponentType::Int8:
354+
return FCesiumMetadataValue(convertToMatNArray<N, int8_t>(array));
355+
case ECesiumMetadataComponentType::Uint8:
356+
return FCesiumMetadataValue(convertToMatNArray<N, uint8_t>(array));
357+
case ECesiumMetadataComponentType::Int16:
358+
return FCesiumMetadataValue(convertToMatNArray<N, int16_t>(array));
359+
case ECesiumMetadataComponentType::Uint16:
360+
return FCesiumMetadataValue(convertToMatNArray<N, uint16_t>(array));
361+
case ECesiumMetadataComponentType::Int32:
362+
return FCesiumMetadataValue(convertToMatNArray<N, int32_t>(array));
363+
case ECesiumMetadataComponentType::Uint32:
364+
return FCesiumMetadataValue(convertToMatNArray<N, uint32_t>(array));
365+
case ECesiumMetadataComponentType::Int64:
366+
return FCesiumMetadataValue(convertToMatNArray<N, int64_t>(array));
367+
case ECesiumMetadataComponentType::Uint64:
368+
return FCesiumMetadataValue(convertToMatNArray<N, uint64_t>(array));
369+
case ECesiumMetadataComponentType::Float32:
370+
return FCesiumMetadataValue(convertToMatNArray<N, float>(array));
371+
case ECesiumMetadataComponentType::Float64:
372+
return FCesiumMetadataValue(convertToMatNArray<N, double>(array));
373+
default:
374+
return EmptyMetadataValue;
375+
}
376+
}
377+
260378
} // namespace
261379

262380
/*static*/ FCesiumMetadataValue FCesiumMetadataValue::fromJsonArray(
@@ -318,27 +436,22 @@ FCesiumMetadataValue convertToMatN(
318436

319437
// Nested arrays can indicate arrays of vecNs / matNs, and numeric data can be
320438
// handled in contiguous buffers.
321-
return EmptyMetadataValue;
322-
// switch (targetType.Type) {
323-
// case ECesiumMetadataType::Vec2:
324-
// case ECesiumMetadataType::Vec3:
325-
// case ECesiumMetadataType::Vec4:
326-
// case ECesiumMetadataType::Mat2:
327-
// case ECesiumMetadataType::Mat3:
328-
// case ECesiumMetadataType::Mat4:
329-
// break;
330-
// default:
331-
// return EmptyMetadataValue;
332-
// }
333-
334-
// TArray<FCesiumMetadataValue> arrayAsValues;
335-
// FCesiumMetadataValueType targetElementType{
336-
// targetType.Type,
337-
// targetType.ComponentType,
338-
// false};
339-
340-
// if (array[0].isArray()) {
341-
// }
439+
switch (targetType.Type) {
440+
case ECesiumMetadataType::Vec2:
441+
return convertToVecNArray<2>(array, targetType.ComponentType);
442+
case ECesiumMetadataType::Vec3:
443+
return convertToVecNArray<3>(array, targetType.ComponentType);
444+
case ECesiumMetadataType::Vec4:
445+
return convertToVecNArray<4>(array, targetType.ComponentType);
446+
case ECesiumMetadataType::Mat2:
447+
return convertToMatNArray<2>(array, targetType.ComponentType);
448+
case ECesiumMetadataType::Mat3:
449+
return convertToMatNArray<3>(array, targetType.ComponentType);
450+
case ECesiumMetadataType::Mat4:
451+
return convertToMatNArray<4>(array, targetType.ComponentType);
452+
default:
453+
return EmptyMetadataValue;
454+
}
342455
}
343456
/*static*/ FCesiumMetadataValue FCesiumMetadataValue::fromJsonValue(
344457
const CesiumUtility::JsonValue& jsonValue,
@@ -653,8 +766,9 @@ FCesiumPropertyArray UCesiumMetadataValueBlueprintLibrary::GetArray(
653766
Value._pEnumDefinition](auto value) -> FCesiumPropertyArray {
654767
if constexpr (std::is_same_v<decltype(value), FCesiumPropertyArray>) {
655768
return value;
769+
} else {
770+
return FCesiumPropertyArray();
656771
}
657-
return FCesiumPropertyArray();
658772
},
659773
Value._value);
660774
}

0 commit comments

Comments
 (0)