Commit: 33bad77043d3ec4b91bc302af69da8c7ba9dd204 Author: Jim Eckerlein Date: Fri Jun 17 18:38:41 2022 +0200 Branches: master https://developer.blender.org/rB33bad77043d3ec4b91bc302af69da8c7ba9dd204
Draco: update to version 1.5.2 Differential Revision: https://developer.blender.org/D15233 =================================================================== M extern/draco/README.blender M extern/draco/draco/src/draco/attributes/attribute_octahedron_transform.cc M extern/draco/draco/src/draco/attributes/attribute_octahedron_transform.h M extern/draco/draco/src/draco/attributes/attribute_quantization_transform.cc M extern/draco/draco/src/draco/attributes/attribute_quantization_transform.h M extern/draco/draco/src/draco/attributes/attribute_transform.cc M extern/draco/draco/src/draco/attributes/attribute_transform.h M extern/draco/draco/src/draco/attributes/geometry_attribute.cc M extern/draco/draco/src/draco/attributes/geometry_attribute.h M extern/draco/draco/src/draco/attributes/point_attribute.cc M extern/draco/draco/src/draco/attributes/point_attribute.h M extern/draco/draco/src/draco/compression/attributes/attributes_decoder.cc M extern/draco/draco/src/draco/compression/attributes/attributes_encoder.cc M extern/draco/draco/src/draco/compression/attributes/kd_tree_attributes_decoder.cc M extern/draco/draco/src/draco/compression/attributes/kd_tree_attributes_encoder.cc M extern/draco/draco/src/draco/compression/attributes/kd_tree_attributes_encoder.h M extern/draco/draco/src/draco/compression/attributes/normal_compression_utils.h M extern/draco/draco/src/draco/compression/attributes/prediction_schemes/mesh_prediction_scheme_data.h M extern/draco/draco/src/draco/compression/attributes/prediction_schemes/mesh_prediction_scheme_geometric_normal_predictor_area.h M extern/draco/draco/src/draco/compression/attributes/prediction_schemes/mesh_prediction_scheme_parallelogram_shared.h M extern/draco/draco/src/draco/compression/attributes/prediction_schemes/mesh_prediction_scheme_tex_coords_portable_predictor.h M extern/draco/draco/src/draco/compression/attributes/prediction_schemes/prediction_scheme_encoder_factory.cc M extern/draco/draco/src/draco/compression/attributes/prediction_schemes/prediction_scheme_encoder_factory.h M extern/draco/draco/src/draco/compression/attributes/prediction_schemes/prediction_scheme_encoder_interface.h M extern/draco/draco/src/draco/compression/attributes/prediction_schemes/prediction_scheme_wrap_decoding_transform.h M extern/draco/draco/src/draco/compression/attributes/prediction_schemes/prediction_scheme_wrap_transform_base.h M extern/draco/draco/src/draco/compression/attributes/sequential_attribute_encoders_controller.cc M extern/draco/draco/src/draco/compression/attributes/sequential_integer_attribute_decoder.cc M extern/draco/draco/src/draco/compression/attributes/sequential_integer_attribute_encoder.cc M extern/draco/draco/src/draco/compression/attributes/sequential_normal_attribute_decoder.cc M extern/draco/draco/src/draco/compression/attributes/sequential_normal_attribute_decoder.h M extern/draco/draco/src/draco/compression/attributes/sequential_normal_attribute_encoder.cc M extern/draco/draco/src/draco/compression/attributes/sequential_quantization_attribute_decoder.cc M extern/draco/draco/src/draco/compression/attributes/sequential_quantization_attribute_decoder.h M extern/draco/draco/src/draco/compression/attributes/sequential_quantization_attribute_encoder.cc M extern/draco/draco/src/draco/compression/config/compression_shared.h M extern/draco/draco/src/draco/compression/config/draco_options.h M extern/draco/draco/src/draco/compression/decode.cc M extern/draco/draco/src/draco/compression/encode_base.h M extern/draco/draco/src/draco/compression/entropy/ans.h M extern/draco/draco/src/draco/compression/entropy/rans_symbol_coding.h M extern/draco/draco/src/draco/compression/entropy/rans_symbol_encoder.h M extern/draco/draco/src/draco/compression/entropy/symbol_decoding.cc M extern/draco/draco/src/draco/compression/expert_encode.cc M extern/draco/draco/src/draco/compression/expert_encode.h M extern/draco/draco/src/draco/compression/mesh/mesh_edgebreaker_decoder_impl.cc M extern/draco/draco/src/draco/compression/mesh/mesh_edgebreaker_encoder.cc M extern/draco/draco/src/draco/compression/mesh/mesh_edgebreaker_encoder_impl.cc M extern/draco/draco/src/draco/compression/mesh/mesh_edgebreaker_encoder_impl.h M extern/draco/draco/src/draco/compression/mesh/mesh_edgebreaker_shared.h M extern/draco/draco/src/draco/compression/mesh/mesh_edgebreaker_traversal_valence_decoder.h M extern/draco/draco/src/draco/compression/mesh/mesh_sequential_decoder.cc M extern/draco/draco/src/draco/compression/mesh/mesh_sequential_encoder.cc M extern/draco/draco/src/draco/compression/mesh/mesh_sequential_encoder.h M extern/draco/draco/src/draco/compression/mesh/traverser/mesh_attribute_indices_encoding_observer.h M extern/draco/draco/src/draco/compression/mesh/traverser/mesh_traversal_sequencer.h M extern/draco/draco/src/draco/compression/point_cloud/algorithms/dynamic_integer_points_kd_tree_decoder.h M extern/draco/draco/src/draco/compression/point_cloud/algorithms/dynamic_integer_points_kd_tree_encoder.h M extern/draco/draco/src/draco/compression/point_cloud/algorithms/float_points_tree_decoder.cc M extern/draco/draco/src/draco/compression/point_cloud/algorithms/float_points_tree_encoder.h M extern/draco/draco/src/draco/compression/point_cloud/algorithms/integer_points_kd_tree_decoder.h M extern/draco/draco/src/draco/compression/point_cloud/algorithms/integer_points_kd_tree_encoder.h M extern/draco/draco/src/draco/compression/point_cloud/algorithms/quantize_points_3.h M extern/draco/draco/src/draco/compression/point_cloud/point_cloud_decoder.cc M extern/draco/draco/src/draco/compression/point_cloud/point_cloud_encoder.cc M extern/draco/draco/src/draco/core/bounding_box.cc M extern/draco/draco/src/draco/core/bounding_box.h M extern/draco/draco/src/draco/core/cycle_timer.cc M extern/draco/draco/src/draco/core/cycle_timer.h M extern/draco/draco/src/draco/core/data_buffer.cc M extern/draco/draco/src/draco/core/decoder_buffer.h M extern/draco/draco/src/draco/core/draco_index_type_vector.h M extern/draco/draco/src/draco/core/draco_version.h M extern/draco/draco/src/draco/core/macros.h M extern/draco/draco/src/draco/core/options.h M extern/draco/draco/src/draco/core/status.h M extern/draco/draco/src/draco/core/varint_decoding.h M extern/draco/draco/src/draco/core/vector_d.h M extern/draco/draco/src/draco/draco_features.h M extern/draco/draco/src/draco/mesh/corner_table.cc M extern/draco/draco/src/draco/mesh/mesh.h M extern/draco/draco/src/draco/mesh/mesh_attribute_corner_table.h M extern/draco/draco/src/draco/mesh/mesh_cleanup.cc M extern/draco/draco/src/draco/mesh/mesh_cleanup.h M extern/draco/draco/src/draco/mesh/mesh_misc_functions.h M extern/draco/draco/src/draco/mesh/mesh_stripifier.h M extern/draco/draco/src/draco/mesh/triangle_soup_mesh_builder.cc M extern/draco/draco/src/draco/metadata/geometry_metadata.cc M extern/draco/draco/src/draco/metadata/geometry_metadata.h M extern/draco/draco/src/draco/metadata/metadata.cc M extern/draco/draco/src/draco/metadata/metadata.h M extern/draco/draco/src/draco/metadata/metadata_decoder.cc M extern/draco/draco/src/draco/point_cloud/point_cloud.cc A extern/draco/patches/blender.patch M extern/draco/src/common.cpp M extern/draco/src/common.h M extern/draco/src/decoder.cpp M extern/draco/src/decoder.h M extern/draco/src/encoder.cpp M extern/draco/src/encoder.h =================================================================== diff --git a/extern/draco/README.blender b/extern/draco/README.blender index b9c3bbb967d..a879ded978b 100644 --- a/extern/draco/README.blender +++ b/extern/draco/README.blender @@ -1,5 +1,5 @@ Project: Draco URL: https://google.github.io/draco/ License: Apache 2.0 -Upstream version: 1.3.6 -Local modifications: None +Upstream version: 1.5.2 +Local modifications: Apply patches/blender.patch 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 diff --git a/extern/draco/draco/src/draco/attributes/attribute_octahedron_transform.h b/extern/draco/draco/src/draco/attributes/attribute_octahedron_transform.h index 6e4e74284f0..21a1725bb52 100644 --- a/extern/draco/draco/src/draco/attributes/attribute_octahedron_transform.h +++ b/extern/draco/draco/src/draco/attributes/attribute_octahedron_transform.h @@ -37,19 +37,40 @@ class AttributeOctahedronTransform : public AttributeTransform { void CopyToAttributeTransformData( AttributeTransformData *out_data) const override; + bool TransformAttribute(const PointAttribute &attribute, + const std::vector<PointIndex> &point_ids, + PointAttribute *target_attribute) override; + + bool InverseTransformAttribute(const PointAttribute &attribute, + PointAttribute *target_attribute) override; + // Set number of quantization bits. void SetParameters(int quantization_bits); // Encode relevant parameters into buffer. - bool EncodeParameters(EncoderBuffer *encoder_buffer) const; + bool EncodeParameters(EncoderBuffer *encoder_buffer) const override; + + bool DecodeParameters(const PointAttribute &attribute, + DecoderBuffer *decoder_buffer) override; bool is_initialized() const { return quantization_bits_ != -1; } int32_t quantization_bits() const { return quantization_bits_; } - // Create portable attribute. - std::unique_ptr<PointAttribute> GeneratePortableAttribute( - const PointAttribute &attribute, const std::vector<PointIndex> &point_ids, - int num_points) const; + protected: + DataType GetTransformedDataType( + const PointAttribute &attribute) const override { + return DT_UINT32; + } + int GetTransformedNumComponents( + const PointAttribute &attribute) const override { + return 2; + } + + // Perform the actual transformation. + bool GeneratePortableAttribute(const PointAttribute &attribute, + const std::vector<PointIndex> &point_ids, + int num_points, + PointAttribute *target_attribute) const; private: int32_t quantization_bits_; diff --git a/extern/draco/draco/src/draco/attributes/attribute_quantization_transform.cc b/extern/draco/draco/src/draco/attributes/attribute_quantization_transform.cc index daa634ed03f..a7f93a488d7 100644 --- a/extern/draco/draco/src/draco/attributes/attribute_quantization_transform.cc +++ b/extern/draco/draco/src/draco/attributes/attribute_quantization_transform.cc @@ -1,4 +1,3 @@ - // Copyright 2017 The Draco Authors. // // Licensed under the Apache License, Version 2.0 (the "License"); @@ -51,13 +50,74 @@ void AttributeQuantizationTransform::CopyToAttributeTransformData( out_data->AppendParameterValue(range_); } -void AttributeQuantizationTransform::SetParameters(int quantization_bits, +bool AttributeQuantizationTransform::TransformAttribute( + const PointAttribute &attribute, const std::vector<PointIndex> &point_ids, + PointAttribute *target_attribute) { + if (point_ids.empty()) { + GeneratePortableAttribute(attribute, target_attribute->size(), + target_attribute); + } else { + GeneratePortableAttribute(attribute, point_ids, target_attribute->size(), + target_attribute); + } + return true; +} + +bool AttributeQuantizationTransform::InverseTransformAttribute( + const PointAttribute &attribute, PointAttribute *target_attribute) { + if (target_attribute->data_type() != DT_FLOAT32) { + return false; + } + + // Convert all quantized values back to floats. + const int32_t max_quantized_value = + (1u << static_cast<uint32_t>(quantization_bits_)) - 1; + const int num_components = target_attribute->num_components(); + const int entry_size = sizeof(float) * num_components; + const std::unique_ptr<float[]> att_val(new float[num_components]); + int quant_val_id = 0; + int out_byte_pos = 0; + Dequantizer dequantizer; + if (!dequantizer.Init(range_, max_quantized_value)) { + return false; + } + const int32_t *const source_attribute_data = + reinterpret_cast<const int32_t *>( + attribute.GetAddress(AttributeValueIndex(0))); + + const int num_values = target_attribute->size(); + + for (uint32_t i = 0; i < num_values; ++i) { + for (int c = 0; c < num_components; ++c) { + float value = + dequantizer.DequantizeFloat(source_attribute_data[quant_val_id++]); + value = value + min_values_[c]; + att_val[c] = value; + } + // Store the floating point value into the attribute buffer. + target_attribute->buffer()->Write(out_byte_pos, att_ @@ Diff output truncated at 10240 characters. @@ _______________________________________________ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org List details, subscription details or unsubscribe: https://lists.blender.org/mailman/listinfo/bf-blender-cvs