diff options
Diffstat (limited to 'extern/draco/draco/src/draco/attributes/attribute_octahedron_transform.cc')
-rw-r--r-- | extern/draco/draco/src/draco/attributes/attribute_octahedron_transform.cc | 95 |
1 files changed, 76 insertions, 19 deletions
diff --git a/extern/draco/draco/src/draco/attributes/attribute_octahedron_transform.cc b/extern/draco/draco/src/draco/attributes/attribute_octahedron_transform.cc index 283a21251f4..51c3bb6c872 100644 --- a/extern/draco/draco/src/draco/attributes/attribute_octahedron_transform.cc +++ b/extern/draco/draco/src/draco/attributes/attribute_octahedron_transform.cc @@ -38,6 +38,46 @@ void AttributeOctahedronTransform::CopyToAttributeTransformData( out_data->AppendParameterValue(quantization_bits_); } +bool AttributeOctahedronTransform::TransformAttribute( + const PointAttribute &attribute, const std::vector<PointIndex> &point_ids, + PointAttribute *target_attribute) { + return GeneratePortableAttribute(attribute, point_ids, + target_attribute->size(), target_attribute); +} + +bool AttributeOctahedronTransform::InverseTransformAttribute( + const PointAttribute &attribute, PointAttribute *target_attribute) { + if (target_attribute->data_type() != DT_FLOAT32) { + return false; + } + + const int num_points = target_attribute->size(); + const int num_components = target_attribute->num_components(); + if (num_components != 3) { + return false; + } + constexpr int kEntrySize = sizeof(float) * 3; + float att_val[3]; + const int32_t *source_attribute_data = reinterpret_cast<const int32_t *>( + attribute.GetAddress(AttributeValueIndex(0))); + uint8_t *target_address = + target_attribute->GetAddress(AttributeValueIndex(0)); + OctahedronToolBox octahedron_tool_box; + if (!octahedron_tool_box.SetQuantizationBits(quantization_bits_)) { + return false; + } + for (uint32_t i = 0; i < num_points; ++i) { + const int32_t s = *source_attribute_data++; + const int32_t t = *source_attribute_data++; + octahedron_tool_box.QuantizedOctahedralCoordsToUnitVector(s, t, att_val); + + // Store the decoded floating point values into the attribute buffer. + std::memcpy(target_address, att_val, kEntrySize); + target_address += kEntrySize; + } + return true; +} + void AttributeOctahedronTransform::SetParameters(int quantization_bits) { quantization_bits_ = quantization_bits; } @@ -51,38 +91,55 @@ bool AttributeOctahedronTransform::EncodeParameters( return false; } -std::unique_ptr<PointAttribute> -AttributeOctahedronTransform::GeneratePortableAttribute( +bool AttributeOctahedronTransform::DecodeParameters( + const PointAttribute &attribute, DecoderBuffer *decoder_buffer) { + uint8_t quantization_bits; + if (!decoder_buffer->Decode(&quantization_bits)) { + return false; + } + quantization_bits_ = quantization_bits; + return true; +} + +bool AttributeOctahedronTransform::GeneratePortableAttribute( const PointAttribute &attribute, const std::vector<PointIndex> &point_ids, - int num_points) const { + int num_points, PointAttribute *target_attribute) const { DRACO_DCHECK(is_initialized()); - // Allocate portable attribute. - const int num_entries = static_cast<int>(point_ids.size()); - std::unique_ptr<PointAttribute> portable_attribute = - InitPortableAttribute(num_entries, 2, num_points, attribute, true); - // Quantize all values in the order given by point_ids into portable // attribute. int32_t *const portable_attribute_data = reinterpret_cast<int32_t *>( - portable_attribute->GetAddress(AttributeValueIndex(0))); + target_attribute->GetAddress(AttributeValueIndex(0))); float att_val[3]; int32_t dst_index = 0; OctahedronToolBox converter; if (!converter.SetQuantizationBits(quantization_bits_)) { - return nullptr; + return false; } - for (uint32_t i = 0; i < point_ids.size(); ++i) { - const AttributeValueIndex att_val_id = attribute.mapped_index(point_ids[i]); - attribute.GetValue(att_val_id, att_val); - // Encode the vector into a s and t octahedral coordinates. - int32_t s, t; - converter.FloatVectorToQuantizedOctahedralCoords(att_val, &s, &t); - portable_attribute_data[dst_index++] = s; - portable_attribute_data[dst_index++] = t; + if (!point_ids.empty()) { + for (uint32_t i = 0; i < point_ids.size(); ++i) { + const AttributeValueIndex att_val_id = + attribute.mapped_index(point_ids[i]); + attribute.GetValue(att_val_id, att_val); + // Encode the vector into a s and t octahedral coordinates. + int32_t s, t; + converter.FloatVectorToQuantizedOctahedralCoords(att_val, &s, &t); + portable_attribute_data[dst_index++] = s; + portable_attribute_data[dst_index++] = t; + } + } else { + for (PointIndex i(0); i < num_points; ++i) { + const AttributeValueIndex att_val_id = attribute.mapped_index(i); + attribute.GetValue(att_val_id, att_val); + // Encode the vector into a s and t octahedral coordinates. + int32_t s, t; + converter.FloatVectorToQuantizedOctahedralCoords(att_val, &s, &t); + portable_attribute_data[dst_index++] = s; + portable_attribute_data[dst_index++] = t; + } } - return portable_attribute; + return true; } } // namespace draco |