[Bf-blender-cvs] [33bad77043d] master: Draco: update to version 1.5.2
Jim Eckerlein
noreply at git.blender.org
Fri Jun 17 19:53:10 CEST 2022
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. @@
More information about the Bf-blender-cvs
mailing list