@@ -132,55 +132,70 @@ std::vector<T> getScalarArray(const CesiumUtility::JsonValue::Array& array) {
132132FCesiumMetadataValue 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
171186template <glm::length_t N, typename T>
172- FCesiumMetadataValue
187+ std::optional<glm::vec<N, T>>
173188convertToVecN (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
186201template <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
216231template <glm::length_t N, typename T>
217- FCesiumMetadataValue
232+ std::optional<glm::mat<N, N, T>>
218233convertToMatN (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
231246template <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