cesium-native 0.43.0
Loading...
Searching...
No Matches
PropertyAttributePropertyView.h
1#pragma once
2
3#include "CesiumGltf/AccessorView.h"
4#include "CesiumGltf/PropertyAttributeProperty.h"
5#include "CesiumGltf/PropertyTransformations.h"
6#include "CesiumGltf/PropertyTypeTraits.h"
7#include "CesiumGltf/PropertyView.h"
8
9#include <CesiumUtility/Assert.h>
10
11#include <cmath>
12#include <cstdint>
13
14namespace CesiumGltf {
24public:
29 static const int ErrorInvalidPropertyAttribute = 14;
30
35 static const int ErrorUnsupportedProperty = 15;
36
41 static const int ErrorMissingAttribute = 16;
42
46 static const int ErrorInvalidAccessor = 17;
47
52 static const int ErrorAccessorTypeMismatch = 18;
53
59
65
70 static const int ErrorInvalidBufferView = 21;
71
76 static const int ErrorInvalidBuffer = 22;
77
83
89};
90
104template <typename ElementType, bool Normalized = false>
106
118template <typename ElementType>
119class PropertyAttributePropertyView<ElementType, false>
120 : public PropertyView<ElementType, false> {
121public:
126 : PropertyView<ElementType, false>(), _accessor{}, _size{0} {}
127
134 : PropertyView<ElementType, false>(status), _accessor{}, _size{0} {
135 CESIUM_ASSERT(
137 "An empty property view should not be constructed with a valid status");
138 }
139
151 const ClassProperty& classProperty,
152 int64_t size) noexcept
153 : PropertyView<ElementType, false>(classProperty), _accessor{}, _size{0} {
154 if (this->_status != PropertyAttributePropertyViewStatus::Valid) {
155 // Don't override the status / size if something is wrong with the class
156 // property's definition.
157 return;
158 }
159
160 if (!classProperty.defaultProperty) {
161 // This constructor should only be called if the class property *has* a
162 // default value. But in the case that it does not, this property view
163 // becomes invalid.
164 this->_status =
166 return;
167 }
168
169 this->_status =
171 this->_size = size;
172 }
173
183 const PropertyAttributeProperty& property,
184 const ClassProperty& classProperty,
185 const AccessorView<ElementType>& accessorView) noexcept
186 : PropertyView<ElementType, false>(classProperty, property),
187 _accessor{accessorView},
188 _size{
190 ? accessorView.size()
191 : 0} {}
192
208 std::optional<ElementType> get(int64_t index) const noexcept {
209 if (this->_status ==
211 return this->defaultValue();
212 }
213
214 ElementType value = getRaw(index);
215
216 if (value == this->noData()) {
217 return this->defaultValue();
218 }
219
220 return transformValue(value, this->offset(), this->scale());
221 }
222
233 ElementType getRaw(int64_t index) const noexcept {
234 CESIUM_ASSERT(
236 "Check the status() first to make sure view is valid");
237 CESIUM_ASSERT(
238 size() > 0 &&
239 "Check the size() of the view to make sure it's not empty");
240 CESIUM_ASSERT(index >= 0 && "index must be non-negative");
241 CESIUM_ASSERT(index < size() && "index must be less than size");
242
243 return _accessor[index];
244 }
245
253 int64_t size() const noexcept { return _size; }
254
255private:
257 int64_t _size;
258};
259
271template <typename ElementType>
272class PropertyAttributePropertyView<ElementType, true>
273 : public PropertyView<ElementType, true> {
274private:
275 using NormalizedType = typename TypeToNormalizedType<ElementType>::type;
276
277public:
282 : PropertyView<ElementType, true>(), _accessor{}, _size{0} {}
283
290 : PropertyView<ElementType, true>(status), _accessor{}, _size{0} {
291 CESIUM_ASSERT(
293 "An empty property view should not be constructed with a valid status");
294 }
295
306 const ClassProperty& classProperty,
307 int64_t size) noexcept
308 : PropertyView<ElementType, true>(classProperty), _accessor{}, _size{0} {
309 if (this->_status != PropertyAttributePropertyViewStatus::Valid) {
310 // Don't override the status / size if something is wrong with the class
311 // property's definition.
312 return;
313 }
314
315 if (!classProperty.defaultProperty) {
316 // This constructor should only be called if the class property *has* a
317 // default value. But in the case that it does not, this property view
318 // becomes invalid.
319 this->_status =
321 return;
322 }
323
324 this->_status =
326 this->_size = size;
327 }
328
338 const PropertyAttributeProperty& property,
339 const ClassProperty& classProperty,
340 const AccessorView<ElementType>& accessorView) noexcept
341 : PropertyView<ElementType, true>(classProperty, property),
342 _accessor{accessorView},
343 _size{
345 ? accessorView.size()
346 : 0} {}
347
363 std::optional<NormalizedType> get(int64_t index) const noexcept {
364 if (this->_status ==
366 return this->defaultValue();
367 }
368
369 ElementType value = getRaw(index);
370
371 if (value == this->noData()) {
372 return this->defaultValue();
373 }
374
378 this->offset(),
379 this->scale());
380 }
381
383 constexpr glm::length_t N = ElementType::length();
384 using T = typename ElementType::value_type;
385 using NormalizedT = typename NormalizedType::value_type;
387 normalize<N, T>(value),
388 this->offset(),
389 this->scale());
390 }
391
393 constexpr glm::length_t N = ElementType::length();
394 using T = typename ElementType::value_type;
395 using NormalizedT = typename NormalizedType::value_type;
397 normalize<N, T>(value),
398 this->offset(),
399 this->scale());
400 }
401 }
402
413 ElementType getRaw(int64_t index) const noexcept {
414 CESIUM_ASSERT(
416 "Check the status() first to make sure view is valid");
417 CESIUM_ASSERT(
418 size() > 0 &&
419 "Check the size() of the view to make sure it's not empty");
420 CESIUM_ASSERT(index >= 0 && "index must be non-negative");
421 CESIUM_ASSERT(index < size() && "index must be less than size");
422
423 return _accessor[index];
424 }
425
433 int64_t size() const noexcept { return _size; }
434
435private:
437 int64_t _size;
438};
439
440} // namespace CesiumGltf
A view on the data of one accessor of a glTF asset.
Indicates the status of a property attribute property view.
static const int ErrorInvalidBufferView
This property view uses an accessor that does not have a valid buffer view index.
static const int ErrorInvalidBuffer
This property view uses a buffer view that does not have a valid buffer index.
static const int ErrorAccessorNormalizationMismatch
This property view's normalization does not match the normalization of the accessor it uses.
static const int ErrorInvalidAccessor
This property view's attribute does not have a valid accessor index.
static const int ErrorMissingAttribute
This property view was initialized with a primitive that does not contain the specified attribute.
static const int ErrorAccessorComponentTypeMismatch
This property view's component type does not match the type of the accessor it uses.
static const int ErrorUnsupportedProperty
This property view is associated with a ClassProperty of an unsupported type.
static const int ErrorAccessorTypeMismatch
This property view's type does not match the type of the accessor it uses.
static const int ErrorInvalidPropertyAttribute
This property view was initialized from an invalid PropertyAttribute.
static const PropertyViewStatusType ErrorAccessorOutOfBounds
This property view uses an accessor that points outside the bounds of its target buffer view.
static const PropertyViewStatusType ErrorBufferViewOutOfBounds
This property view uses a buffer view that points outside the bounds of its target buffer.
std::optional< ElementType > get(int64_t index) const noexcept
Gets the value of the property for the given vertex index with all value transforms applied....
PropertyAttributePropertyView(PropertyViewStatusType status) noexcept
Constructs an invalid instance for an erroneous property.
ElementType getRaw(int64_t index) const noexcept
Gets the raw value of the property for the given vertex index.
PropertyAttributePropertyView() noexcept
Constructs an invalid instance for a non-existent property.
PropertyAttributePropertyView(const ClassProperty &classProperty, int64_t size) noexcept
Constructs an instance of an empty property that specifies a default value. Although this property ha...
int64_t size() const noexcept
Get the number of elements in this PropertyAttributePropertyView. If the view is valid,...
PropertyAttributePropertyView(const PropertyAttributeProperty &property, const ClassProperty &classProperty, const AccessorView< ElementType > &accessorView) noexcept
Construct a view of the data specified by a PropertyAttributeProperty.
ElementType getRaw(int64_t index) const noexcept
Gets the raw value of the property for the given vertex index.
PropertyAttributePropertyView(const PropertyAttributeProperty &property, const ClassProperty &classProperty, const AccessorView< ElementType > &accessorView) noexcept
Construct a view of the data specified by a PropertyAttributeProperty.
int64_t size() const noexcept
Get the number of elements in this PropertyAttributePropertyView. If the view is valid,...
std::optional< NormalizedType > get(int64_t index) const noexcept
Gets the value of the property for the given vertex index with all value transforms applied....
PropertyAttributePropertyView(PropertyViewStatusType status) noexcept
Constructs an invalid instance for an erroneous property.
PropertyAttributePropertyView() noexcept
Constructs an invalid instance for a non-existent property.
PropertyAttributePropertyView(const ClassProperty &classProperty, int64_t size) noexcept
Constructs an instance of an empty property that specifies a default value. Although this property ha...
A view of the data specified by a PropertyAttributeProperty.
Indicates the status of a property view.
static const PropertyViewStatusType Valid
This property view is valid and ready to use.
static const PropertyViewStatusType ErrorNonexistentProperty
This property view is trying to view a property that does not exist.
static const PropertyViewStatusType EmptyPropertyWithDefault
This property view does not contain any data, but specifies a default value. This happens when a clas...
Represents a metadata property in EXT_structural_metadata.
Classes for working with glTF models.
T transformValue(const T &value, const std::optional< T > &offset, const std::optional< T > &scale)
Transforms the value by optional offset and scale factors.
double normalize(T value)
Normalizes the given value between [0, 1] if unsigned or [-1, 1] if signed, based on the type's maxim...
int32_t PropertyViewStatusType
The type used for fields of PropertyViewStatus.
Check if a C++ type can be represented as a matN type.
Check if a C++ type can be represented as a scalar property type.
Check if a C++ type can be represented as a vecN type.
An attribute containing property values.
Convert an integer numeric type to the corresponding representation as a double type....