[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