15#ifndef DRACO_ATTRIBUTES_GEOMETRY_ATTRIBUTE_H_
16#define DRACO_ATTRIBUTES_GEOMETRY_ATTRIBUTE_H_
27#ifdef DRACO_TRANSCODER_SUPPORTED
60#ifdef DRACO_TRANSCODER_SUPPORTED
80 bool IsValid()
const {
return buffer_ !=
nullptr; }
91 template <
typename T,
int att_components_t>
93 AttributeValueIndex att_index)
const {
95 const int64_t byte_pos = byte_offset_ + byte_stride_ * att_index.value();
96 std::array<T, att_components_t> out;
97 buffer_->Read(byte_pos, &(out[0]),
sizeof(out));
104 template <
typename T,
int att_components_t>
106 std::array<T, att_components_t> *out)
const {
108 const int64_t byte_pos = byte_offset_ + byte_stride_ * att_index.value();
110 if (byte_pos +
sizeof(*out) > buffer_->data_size()) {
113 buffer_->Read(byte_pos, &((*out)[0]),
sizeof(*out));
118 inline int64_t
GetBytePos(AttributeValueIndex att_index)
const {
119 return byte_offset_ + byte_stride_ * att_index.value();
122 inline const uint8_t *
GetAddress(AttributeValueIndex att_index)
const {
123 const int64_t byte_pos =
GetBytePos(att_index);
124 return buffer_->data() + byte_pos;
127 const int64_t byte_pos =
GetBytePos(att_index);
128 return buffer_->data() + byte_pos;
131 return ((buffer_->data() + buffer_->data_size()) > address);
136 void GetValue(AttributeValueIndex att_index,
void *out_data)
const {
137 const int64_t byte_pos = byte_offset_ + byte_stride_ * att_index.value();
138 buffer_->Read(byte_pos, out_data, byte_stride_);
144 const int64_t byte_pos = entry_index.value() *
byte_stride();
148#ifdef DRACO_TRANSCODER_SUPPORTED
153 template <
typename InputT>
154 Status ConvertAndSetAttributeValue(AttributeValueIndex avi,
155 int input_num_components,
156 const InputT *value);
168 template <
typename OutT,
int out_att_components_t>
170 return ConvertValue(att_id, out_att_components_t, out_val);
177 template <
typename OutT>
178 bool ConvertValue(AttributeValueIndex att_id, int8_t out_num_components,
179 OutT *out_val)
const {
180 if (out_val ==
nullptr) {
183 switch (data_type_) {
185 return ConvertTypedValue<int8_t, OutT>(att_id, out_num_components,
188 return ConvertTypedValue<uint8_t, OutT>(att_id, out_num_components,
191 return ConvertTypedValue<int16_t, OutT>(att_id, out_num_components,
194 return ConvertTypedValue<uint16_t, OutT>(att_id, out_num_components,
197 return ConvertTypedValue<int32_t, OutT>(att_id, out_num_components,
200 return ConvertTypedValue<uint32_t, OutT>(att_id, out_num_components,
203 return ConvertTypedValue<int64_t, OutT>(att_id, out_num_components,
206 return ConvertTypedValue<uint64_t, OutT>(att_id, out_num_components,
209 return ConvertTypedValue<float, OutT>(att_id, out_num_components,
212 return ConvertTypedValue<double, OutT>(att_id, out_num_components,
215 return ConvertTypedValue<bool, OutT>(att_id, out_num_components,
228 template <
typename OutT>
229 bool ConvertValue(AttributeValueIndex att_index, OutT *out_value)
const {
290 template <
typename T,
typename OutT>
291 bool ConvertTypedValue(AttributeValueIndex att_id, uint8_t out_num_components,
292 OutT *out_value)
const {
293 const uint8_t *src_address =
GetAddress(att_id);
296 for (
int i = 0; i < std::min(num_components_, out_num_components); ++i) {
300 const T in_value = *
reinterpret_cast<const T *
>(src_address);
301 if (!ConvertComponentValue<T, OutT>(in_value, normalized_,
305 src_address +=
sizeof(T);
308 for (
int i = num_components_; i < out_num_components; ++i) {
309 out_value[i] =
static_cast<OutT
>(0);
314#ifdef DRACO_TRANSCODER_SUPPORTED
317 template <
typename T,
typename OutT>
318 Status ConvertAndSetAttributeTypedValue(AttributeValueIndex avi,
319 int8_t input_num_components,
324 for (
int i = 0; i < num_components_; ++i) {
326 return ErrorStatus(
"GeometryAttribute: Invalid address.");
328 OutT *
const out_value =
reinterpret_cast<OutT *
>(address);
329 if (i < input_num_components) {
330 if (!ConvertComponentValue<T, OutT>(*(value + i), normalized_,
333 "GeometryAttribute: Failed to convert component value.");
336 *out_value =
static_cast<OutT
>(0);
338 address +=
sizeof(OutT);
348 template <
typename T,
typename OutT>
349 static bool ConvertComponentValue(
const T &in_value,
bool normalized,
352 if (std::is_integral<OutT>::value) {
355 if (!std::is_same<T, bool>::value && std::is_integral<T>::value) {
356 static constexpr OutT kOutMin =
357 std::is_signed<T>::value ? std::numeric_limits<OutT>::min() : 0;
358 if (in_value < kOutMin || in_value > std::numeric_limits<OutT>::max()) {
364 if (std::is_floating_point<T>::value) {
367 if (
sizeof(in_value) >
sizeof(
double)) {
368 if (std::isnan(
static_cast<long double>(in_value)) ||
369 std::isinf(
static_cast<long double>(in_value))) {
372 }
else if (
sizeof(in_value) >
sizeof(
float)) {
373 if (std::isnan(
static_cast<double>(in_value)) ||
374 std::isinf(
static_cast<double>(in_value))) {
378 if (std::isnan(
static_cast<float>(in_value)) ||
379 std::isinf(
static_cast<float>(in_value))) {
386 if (in_value < std::numeric_limits<OutT>::min() ||
387 in_value >= std::numeric_limits<OutT>::max()) {
393 if (std::is_integral<T>::value && std::is_floating_point<OutT>::value &&
397 *out_value =
static_cast<OutT
>(in_value);
398 *out_value /=
static_cast<OutT
>(std::numeric_limits<T>::max());
399 }
else if (std::is_floating_point<T>::value &&
400 std::is_integral<OutT>::value &&
normalized) {
402 if (in_value > 1 || in_value < 0) {
409 if (
sizeof(OutT) > 4) {
415 *out_value =
static_cast<OutT
>(std::floor(
416 in_value *
static_cast<double>(std::numeric_limits<OutT>::max()) +
419 *out_value =
static_cast<OutT
>(in_value);
434 DataBufferDescriptor buffer_descriptor_;
435 uint8_t num_components_;
438 int64_t byte_stride_;
439 int64_t byte_offset_;
441 Type attribute_type_;
451#ifdef DRACO_TRANSCODER_SUPPORTED
452template <
typename InputT>
453Status GeometryAttribute::ConvertAndSetAttributeValue(AttributeValueIndex avi,
454 int input_num_components,
455 const InputT *value) {
458 return ConvertAndSetAttributeTypedValue<InputT, int8_t>(
459 avi, input_num_components, value);
461 return ConvertAndSetAttributeTypedValue<InputT, uint8_t>(
462 avi, input_num_components, value);
464 return ConvertAndSetAttributeTypedValue<InputT, int16_t>(
465 avi, input_num_components, value);
467 return ConvertAndSetAttributeTypedValue<InputT, uint16_t>(
468 avi, input_num_components, value);
470 return ConvertAndSetAttributeTypedValue<InputT, int32_t>(
471 avi, input_num_components, value);
473 return ConvertAndSetAttributeTypedValue<InputT, uint32_t>(
474 avi, input_num_components, value);
476 return ConvertAndSetAttributeTypedValue<InputT, int64_t>(
477 avi, input_num_components, value);
479 return ConvertAndSetAttributeTypedValue<InputT, uint64_t>(
480 avi, input_num_components, value);
482 return ConvertAndSetAttributeTypedValue<InputT, float>(
483 avi, input_num_components, value);
485 return ConvertAndSetAttributeTypedValue<InputT, double>(
486 avi, input_num_components, value);
488 return ConvertAndSetAttributeTypedValue<InputT, bool>(
489 avi, input_num_components, value);
494 "GeometryAttribute::SetAndConvertAttributeValue: Unsupported "
507 hash =
HashCombine(
static_cast<int8_t
>(va.data_type_), hash);
508 hash =
HashCombine(
static_cast<int8_t
>(va.attribute_type_), hash);
517 return static_cast<size_t>(at);
Type
Definition Database.hh:9
Definition data_buffer.h:36
Definition geometry_attribute.h:43
const DataBuffer * buffer() const
Definition geometry_attribute.h:269
bool IsAddressValid(const uint8_t *address) const
Definition geometry_attribute.h:130
uint32_t unique_id() const
Definition geometry_attribute.h:277
bool GetValue(AttributeValueIndex att_index, std::array< T, att_components_t > *out) const
Definition geometry_attribute.h:105
uint8_t num_components() const
Definition geometry_attribute.h:263
DataBufferDescriptor buffer_descriptor() const
Definition geometry_attribute.h:276
bool operator==(const GeometryAttribute &va) const
Definition geometry_attribute.cc:65
void set_normalized(bool normalized)
Definition geometry_attribute.h:267
bool IsValid() const
Definition geometry_attribute.h:80
int64_t byte_stride() const
Definition geometry_attribute.h:272
void set_unique_id(uint32_t id)
Definition geometry_attribute.h:278
void set_attribute_type(Type type)
Definition geometry_attribute.h:257
bool CopyFrom(const GeometryAttribute &src_att)
Definition geometry_attribute.cc:45
bool ConvertValue(AttributeValueIndex att_index, OutT *out_value) const
Definition geometry_attribute.h:229
Type attribute_type() const
Definition geometry_attribute.h:256
bool normalized() const
Definition geometry_attribute.h:266
friend struct GeometryAttributeHasher
Definition geometry_attribute.h:448
void Init(Type attribute_type, DataBuffer *buffer, uint8_t num_components, DataType data_type, bool normalized, int64_t byte_stride, int64_t byte_offset)
Definition geometry_attribute.cc:28
bool ConvertValue(AttributeValueIndex att_id, OutT *out_val) const
Definition geometry_attribute.h:169
void GetValue(AttributeValueIndex att_index, void *out_data) const
Definition geometry_attribute.h:136
void set_byte_offset(int64_t byte_offset)
Definition geometry_attribute.h:275
uint8_t * GetAddress(AttributeValueIndex att_index)
Definition geometry_attribute.h:126
void ResetBuffer(DataBuffer *buffer, int64_t byte_stride, int64_t byte_offset)
Definition geometry_attribute.cc:93
bool ConvertValue(AttributeValueIndex att_id, int8_t out_num_components, OutT *out_val) const
Definition geometry_attribute.h:178
int64_t GetBytePos(AttributeValueIndex att_index) const
Definition geometry_attribute.h:118
std::array< T, att_components_t > GetValue(AttributeValueIndex att_index) const
Definition geometry_attribute.h:92
void SetAttributeValue(AttributeValueIndex entry_index, const void *value)
Definition geometry_attribute.h:143
static std::string TypeToString(Type attribute_type)
Definition geometry_attribute.h:234
const uint8_t * GetAddress(AttributeValueIndex att_index) const
Definition geometry_attribute.h:122
int64_t byte_offset() const
Definition geometry_attribute.h:274
DataType data_type() const
Definition geometry_attribute.h:259
GeometryAttribute()
Definition geometry_attribute.cc:19
Type
Definition geometry_attribute.h:46
@ INVALID
Definition geometry_attribute.h:47
@ TEX_COORD
Definition geometry_attribute.h:55
@ GENERIC
Definition geometry_attribute.h:59
@ POSITION
Definition geometry_attribute.h:52
@ NAMED_ATTRIBUTES_COUNT
Definition geometry_attribute.h:72
@ COLOR
Definition geometry_attribute.h:54
@ NORMAL
Definition geometry_attribute.h:53
Definition attribute_octahedron_transform.cc:21
size_t HashCombine(T1 a, T2 b)
Definition hash_utils.h:26
Status OkStatus()
Definition status.h:66
Status ErrorStatus(const std::string &msg)
Definition status.h:67
DataType
Definition draco_types.h:26
@ DT_INT32
Definition draco_types.h:33
@ DT_INT64
Definition draco_types.h:35
@ DT_INT8
Definition draco_types.h:29
@ DT_BOOL
Definition draco_types.h:39
@ DT_INT16
Definition draco_types.h:31
@ DT_UINT16
Definition draco_types.h:32
@ DT_UINT8
Definition draco_types.h:30
@ DT_FLOAT64
Definition draco_types.h:38
@ DT_FLOAT32
Definition draco_types.h:37
@ DT_UINT32
Definition draco_types.h:34
@ DT_UINT64
Definition draco_types.h:36
Definition data_buffer.h:27
int64_t buffer_id
Definition data_buffer.h:30
int64_t buffer_update_count
Definition data_buffer.h:32
Definition geometry_attribute.h:502
size_t operator()(const GeometryAttribute &va) const
Definition geometry_attribute.h:503
Definition geometry_attribute.h:515
size_t operator()(const GeometryAttribute::Type &at) const
Definition geometry_attribute.h:516