[Bf-blender-cvs] [9febff7e14c] master: glTF: upgrade Draco to version 1.3.5 and add mesh skinning support

Jim Eckerlein noreply at git.blender.org
Thu Dec 5 19:40:17 CET 2019


Commit: 9febff7e14c564fc560f48626817350a1bf8086f
Author: Jim Eckerlein
Date:   Thu Dec 5 19:11:53 2019 +0100
Branches: master
https://developer.blender.org/rB9febff7e14c564fc560f48626817350a1bf8086f

glTF: upgrade Draco to version 1.3.5 and add mesh skinning support

This will fix exporting meshes with armatures using Draco compression, like:
https://github.com/KhronosGroup/glTF-Blender-IO/issues/617

Differential Revision: https://developer.blender.org/D6342

===================================================================

M	extern/draco/CMakeLists.txt
M	extern/draco/dracoenc/src/draco/attributes/attribute_quantization_transform.cc
M	extern/draco/dracoenc/src/draco/attributes/geometry_indices.h
M	extern/draco/dracoenc/src/draco/attributes/point_attribute.cc
M	extern/draco/dracoenc/src/draco/attributes/point_attribute.h
M	extern/draco/dracoenc/src/draco/compression/attributes/point_d_vector.h
M	extern/draco/dracoenc/src/draco/compression/attributes/prediction_schemes/prediction_scheme_decoder_factory.h
M	extern/draco/dracoenc/src/draco/compression/attributes/prediction_schemes/prediction_scheme_encoder_factory.cc
M	extern/draco/dracoenc/src/draco/compression/attributes/prediction_schemes/prediction_scheme_encoder_factory.h
M	extern/draco/dracoenc/src/draco/compression/attributes/sequential_attribute_decoders_controller.cc
M	extern/draco/dracoenc/src/draco/compression/attributes/sequential_attribute_encoders_controller.cc
M	extern/draco/dracoenc/src/draco/compression/decode.cc
M	extern/draco/dracoenc/src/draco/compression/decode.h
M	extern/draco/dracoenc/src/draco/compression/encode_base.h
M	extern/draco/dracoenc/src/draco/compression/entropy/ans.h
M	extern/draco/dracoenc/src/draco/compression/entropy/rans_symbol_coding.h
M	extern/draco/dracoenc/src/draco/compression/expert_encode.cc
M	extern/draco/dracoenc/src/draco/compression/mesh/mesh_edgebreaker_encoder.cc
M	extern/draco/dracoenc/src/draco/compression/mesh/mesh_edgebreaker_encoder.h
M	extern/draco/dracoenc/src/draco/compression/mesh/mesh_edgebreaker_encoder_impl.cc
M	extern/draco/dracoenc/src/draco/compression/mesh/mesh_edgebreaker_encoder_impl.h
M	extern/draco/dracoenc/src/draco/compression/mesh/mesh_edgebreaker_encoder_impl_interface.h
M	extern/draco/dracoenc/src/draco/compression/mesh/mesh_encoder.cc
M	extern/draco/dracoenc/src/draco/compression/mesh/mesh_encoder.h
M	extern/draco/dracoenc/src/draco/compression/mesh/mesh_encoder_test.cc
M	extern/draco/dracoenc/src/draco/compression/mesh/mesh_sequential_encoder.cc
M	extern/draco/dracoenc/src/draco/compression/mesh/mesh_sequential_encoder.h
M	extern/draco/dracoenc/src/draco/compression/point_cloud/algorithms/dynamic_integer_points_kd_tree_decoder.h
M	extern/draco/dracoenc/src/draco/compression/point_cloud/algorithms/float_points_tree_decoder.h
M	extern/draco/dracoenc/src/draco/compression/point_cloud/algorithms/point_cloud_compression_method.h
M	extern/draco/dracoenc/src/draco/compression/point_cloud/point_cloud_decoder.cc
M	extern/draco/dracoenc/src/draco/compression/point_cloud/point_cloud_encoder.cc
M	extern/draco/dracoenc/src/draco/compression/point_cloud/point_cloud_encoder.h
M	extern/draco/dracoenc/src/draco/compression/point_cloud/point_cloud_kd_tree_encoder.cc
M	extern/draco/dracoenc/src/draco/compression/point_cloud/point_cloud_kd_tree_encoder.h
M	extern/draco/dracoenc/src/draco/compression/point_cloud/point_cloud_sequential_encoder.cc
M	extern/draco/dracoenc/src/draco/compression/point_cloud/point_cloud_sequential_encoder.h
M	extern/draco/dracoenc/src/draco/core/data_buffer.cc
M	extern/draco/dracoenc/src/draco/core/draco_test_utils.cc
M	extern/draco/dracoenc/src/draco/core/draco_test_utils.h
M	extern/draco/dracoenc/src/draco/core/draco_types.cc
M	extern/draco/dracoenc/src/draco/core/draco_types.h
M	extern/draco/dracoenc/src/draco/core/draco_version.h
M	extern/draco/dracoenc/src/draco/core/macros.h
M	extern/draco/dracoenc/src/draco/core/math_utils.h
M	extern/draco/dracoenc/src/draco/core/math_utils_test.cc
M	extern/draco/dracoenc/src/draco/core/options.cc
M	extern/draco/dracoenc/src/draco/core/options.h
M	extern/draco/dracoenc/src/draco/core/status.h
A	extern/draco/dracoenc/src/draco/core/status_or.h
M	extern/draco/dracoenc/src/draco/core/status_test.cc
M	extern/draco/dracoenc/src/draco/core/vector_d.h
M	extern/draco/dracoenc/src/draco/core/vector_d_test.cc
M	extern/draco/dracoenc/src/draco/io/mesh_io.cc
M	extern/draco/dracoenc/src/draco/io/mesh_io.h
M	extern/draco/dracoenc/src/draco/io/obj_decoder.cc
M	extern/draco/dracoenc/src/draco/io/obj_encoder.h
M	extern/draco/dracoenc/src/draco/io/parser_utils.cc
M	extern/draco/dracoenc/src/draco/io/ply_decoder.cc
M	extern/draco/dracoenc/src/draco/io/ply_decoder.h
M	extern/draco/dracoenc/src/draco/io/ply_decoder_test.cc
M	extern/draco/dracoenc/src/draco/io/ply_reader.cc
M	extern/draco/dracoenc/src/draco/io/ply_reader.h
M	extern/draco/dracoenc/src/draco/io/ply_reader_test.cc
M	extern/draco/dracoenc/src/draco/io/point_cloud_io.cc
M	extern/draco/dracoenc/src/draco/mesh/corner_table.cc
M	extern/draco/dracoenc/src/draco/mesh/corner_table.h
M	extern/draco/dracoenc/src/draco/mesh/mesh.cc
M	extern/draco/dracoenc/src/draco/mesh/mesh.h
M	extern/draco/dracoenc/src/draco/mesh/mesh_misc_functions.h
M	extern/draco/dracoenc/src/draco/mesh/triangle_soup_mesh_builder.cc
M	extern/draco/dracoenc/src/draco/metadata/metadata.h
M	extern/draco/dracoenc/src/draco/metadata/metadata_encoder.cc
M	extern/draco/dracoenc/src/draco/metadata/metadata_encoder_test.cc
M	extern/draco/dracoenc/src/draco/point_cloud/point_cloud.cc
M	extern/draco/dracoenc/src/draco/point_cloud/point_cloud.h
M	extern/draco/dracoenc/src/draco/point_cloud/point_cloud_builder.cc
M	extern/draco/dracoenc/src/draco/tools/draco_decoder.cc
M	extern/draco/dracoenc/src/draco/tools/draco_encoder.cc
M	extern/draco/src/draco-compressor.cpp
A	extern/draco/src/draco-compressor.h

===================================================================

diff --git a/extern/draco/CMakeLists.txt b/extern/draco/CMakeLists.txt
index c51af24c9a4..1355766960a 100644
--- a/extern/draco/CMakeLists.txt
+++ b/extern/draco/CMakeLists.txt
@@ -24,6 +24,6 @@ set(CMAKE_CXX_STANDARD 14)
 add_subdirectory(dracoenc)
 
 # Build blender-draco-exporter module.
-add_library(extern_draco SHARED src/draco-compressor.cpp)
+add_library(extern_draco SHARED src/draco-compressor.cpp src/draco-compressor.h)
 target_include_directories(extern_draco PUBLIC dracoenc/src)
 target_link_libraries(extern_draco PUBLIC dracoenc)
diff --git a/extern/draco/dracoenc/src/draco/attributes/attribute_quantization_transform.cc b/extern/draco/dracoenc/src/draco/attributes/attribute_quantization_transform.cc
index 41193f1452f..237becefc61 100644
--- a/extern/draco/dracoenc/src/draco/attributes/attribute_quantization_transform.cc
+++ b/extern/draco/dracoenc/src/draco/attributes/attribute_quantization_transform.cc
@@ -92,6 +92,11 @@ bool AttributeQuantizationTransform::ComputeParameters(
       range_ = dif;
   }
 
+  // In case all values are the same, initialize the range to unit length. This
+  // will ensure that all values are quantized properly to the same value.
+  if (range_ == 0.f)
+    range_ = 1.f;
+
   return true;
 }
 
diff --git a/extern/draco/dracoenc/src/draco/attributes/geometry_indices.h b/extern/draco/dracoenc/src/draco/attributes/geometry_indices.h
index 5244056f0aa..80e43e30a13 100644
--- a/extern/draco/dracoenc/src/draco/attributes/geometry_indices.h
+++ b/extern/draco/dracoenc/src/draco/attributes/geometry_indices.h
@@ -28,11 +28,11 @@ DEFINE_NEW_DRACO_INDEX_TYPE(uint32_t, AttributeValueIndex)
 // Index of a point in a PointCloud.
 DEFINE_NEW_DRACO_INDEX_TYPE(uint32_t, PointIndex)
 // Vertex index in a Mesh or CornerTable.
-DEFINE_NEW_DRACO_INDEX_TYPE(uint32_t, VertexIndex);
+DEFINE_NEW_DRACO_INDEX_TYPE(uint32_t, VertexIndex)
 // Corner index that identifies a corner in a Mesh or CornerTable.
-DEFINE_NEW_DRACO_INDEX_TYPE(uint32_t, CornerIndex);
+DEFINE_NEW_DRACO_INDEX_TYPE(uint32_t, CornerIndex)
 // Face index for Mesh and CornerTable.
-DEFINE_NEW_DRACO_INDEX_TYPE(uint32_t, FaceIndex);
+DEFINE_NEW_DRACO_INDEX_TYPE(uint32_t, FaceIndex)
 
 // Constants denoting invalid indices.
 static constexpr AttributeValueIndex kInvalidAttributeValueIndex(
diff --git a/extern/draco/dracoenc/src/draco/attributes/point_attribute.cc b/extern/draco/dracoenc/src/draco/attributes/point_attribute.cc
index 4428f332b93..0c4e8e1c738 100644
--- a/extern/draco/dracoenc/src/draco/attributes/point_attribute.cc
+++ b/extern/draco/dracoenc/src/draco/attributes/point_attribute.cc
@@ -64,7 +64,7 @@ bool PointAttribute::Reset(size_t num_attribute_values) {
   return true;
 }
 
-#ifdef DRACO_ATTRIBUTE_DEDUPLICATION_SUPPORTED
+#ifdef DRACO_ATTRIBUTE_VALUES_DEDUPLICATION_SUPPORTED
 AttributeValueIndex::ValueType PointAttribute::DeduplicateValues(
     const GeometryAttribute &in_att) {
   return DeduplicateValues(in_att, AttributeValueIndex(0));
diff --git a/extern/draco/dracoenc/src/draco/attributes/point_attribute.h b/extern/draco/dracoenc/src/draco/attributes/point_attribute.h
index dffde50356d..46e58a40aa1 100644
--- a/extern/draco/dracoenc/src/draco/attributes/point_attribute.h
+++ b/extern/draco/dracoenc/src/draco/attributes/point_attribute.h
@@ -105,7 +105,7 @@ class PointAttribute : public GeometryAttribute {
     return GetValue(mapped_index(point_index), out_data);
   }
 
-#ifdef DRACO_ATTRIBUTE_DEDUPLICATION_SUPPORTED
+#ifdef DRACO_ATTRIBUTE_VALUES_DEDUPLICATION_SUPPORTED
   // Deduplicate |in_att| values into |this| attribute. |in_att| can be equal
   // to |this|.
   // Returns -1 if the deduplication failed.
@@ -130,7 +130,7 @@ class PointAttribute : public GeometryAttribute {
   }
 
  private:
-#ifdef DRACO_ATTRIBUTE_DEDUPLICATION_SUPPORTED
+#ifdef DRACO_ATTRIBUTE_VALUES_DEDUPLICATION_SUPPORTED
   template <typename T>
   AttributeValueIndex::ValueType DeduplicateTypedValues(
       const GeometryAttribute &in_att, AttributeValueIndex in_att_offset);
diff --git a/extern/draco/dracoenc/src/draco/compression/attributes/point_d_vector.h b/extern/draco/dracoenc/src/draco/compression/attributes/point_d_vector.h
index 4148770fe77..ce99c8014d7 100644
--- a/extern/draco/dracoenc/src/draco/compression/attributes/point_d_vector.h
+++ b/extern/draco/dracoenc/src/draco/compression/attributes/point_d_vector.h
@@ -42,7 +42,7 @@ class PseudoPointD {
 
   // Specifically copies referenced memory
   void swap(PseudoPointD &other) noexcept {
-    for (auto dim = 0; dim < dimension_; dim += 1)
+    for (internal_t dim = 0; dim < dimension_; dim += 1)
       std::swap(mem_[dim], other.mem_[dim]);
   }
 
diff --git a/extern/draco/dracoenc/src/draco/compression/attributes/prediction_schemes/prediction_scheme_decoder_factory.h b/extern/draco/dracoenc/src/draco/compression/attributes/prediction_schemes/prediction_scheme_decoder_factory.h
index 3a00bda943c..db835554385 100644
--- a/extern/draco/dracoenc/src/draco/compression/attributes/prediction_schemes/prediction_scheme_decoder_factory.h
+++ b/extern/draco/dracoenc/src/draco/compression/attributes/prediction_schemes/prediction_scheme_decoder_factory.h
@@ -21,7 +21,9 @@
 #include "draco/draco_features.h"
 
 #include "draco/compression/attributes/prediction_schemes/mesh_prediction_scheme_constrained_multi_parallelogram_decoder.h"
+#ifdef DRACO_NORMAL_ENCODING_SUPPORTED
 #include "draco/compression/attributes/prediction_schemes/mesh_prediction_scheme_geometric_normal_decoder.h"
+#endif
 #include "draco/compression/attributes/prediction_schemes/mesh_prediction_scheme_multi_parallelogram_decoder.h"
 #include "draco/compression/attributes/prediction_schemes/mesh_prediction_scheme_parallelogram_decoder.h"
 #include "draco/compression/attributes/prediction_schemes/mesh_prediction_scheme_tex_coords_decoder.h"
@@ -82,16 +84,20 @@ struct MeshPredictionSchemeDecoderFactory {
             new MeshPredictionSchemeTexCoordsPortableDecoder<
                 DataTypeT, TransformT, MeshDataT>(attribute, transform,
                                                   mesh_data));
-      } else if (method == MESH_PREDICTION_GEOMETRIC_NORMAL) {
+      }
+#ifdef DRACO_NORMAL_ENCODING_SUPPORTED
+      else if (method == MESH_PREDICTION_GEOMETRIC_NORMAL) {
         return std::unique_ptr<PredictionSchemeDecoder<DataTypeT, TransformT>>(
             new MeshPredictionSchemeGeometricNormalDecoder<
                 DataTypeT, TransformT, MeshDataT>(attribute, transform,
                                                   mesh_data));
       }
+#endif
       return nullptr;
     }
   };
 
+#ifdef DRACO_NORMAL_ENCODING_SUPPORTED
   // Operator () specialized for normal octahedron transforms. These transforms
   // are currently used only by the geometric normal prediction scheme (the
   // transform is also used by delta coding, but delta predictor is not
@@ -128,6 +134,7 @@ struct MeshPredictionSchemeDecoderFactory {
       return nullptr;
     }
   };
+#endif
 
   template <class TransformT, class MeshDataT>
   std::unique_ptr<PredictionSchemeDecoder<DataTypeT, TransformT>> operator()(
diff --git a/extern/draco/dracoenc/src/draco/compression/attributes/prediction_schemes/prediction_scheme_encoder_factory.cc b/extern/draco/dracoenc/src/draco/compression/attributes/prediction_schemes/prediction_scheme_encoder_factory.cc
index 3144bdb9a6b..6b74e571c6d 100644
--- a/extern/draco/dracoenc/src/draco/compression/attributes/prediction_schemes/prediction_scheme_encoder_factory.cc
+++ b/extern/draco/dracoenc/src/draco/compression/attributes/prediction_schemes/prediction_scheme_encoder_factory.cc
@@ -32,10 +32,12 @@ PredictionSchemeMethod SelectPredictionMethod(
       }
     }
     if (att->attribute_type() == GeometryAttribute::NORMAL) {
+#ifdef DRACO_NORMAL_ENCODING_SUPPORTED
       if (encoder->options()->GetSpeed() < 4) {
         // Use geometric normal prediction for speeds 0, 1, 2, 3.
         return MESH_PREDICTION_GEOMETRIC_NORMAL;
       }
+#endif
       return PREDICTION_DIFFERENCE;  // default
     }
     // Handle other attribute types.
diff --git a/extern/draco/dracoenc/src/draco/compression/attributes/prediction_schemes/prediction_scheme_encoder_factory.h b/extern/draco/dracoenc/src/draco/compression/attributes/prediction_schemes/prediction_scheme_encoder_factory.h
index cde5ba2435f..4cc40010773 100644
--- a/extern/draco/dracoenc/src/draco/compression/attributes/prediction_schemes/prediction_scheme_encoder_factory.h
+++ b/extern/draco/dracoenc/src/draco/compression/attributes/prediction_schemes/prediction_scheme_encoder_factory.h
@@ -19,7 +19,9 @@
 #define DRACO_COMPRESSION_ATTRIBUTES_PREDICTION_SCHEMES_PREDICTION_SCHEME_ENCODER_FACTORY_H_
 
 #include "draco/compression/attributes/prediction_schemes/mesh_prediction_scheme_constrained_multi_parallelogram_encoder.h"
+#ifdef DRACO_NORMAL_ENCODING_SUPPORTED
 #include "draco/compression/attributes/prediction_schemes/mesh_prediction_scheme_geometric_normal_encoder.h"
+#endif
 #include "draco/compression/attributes/prediction_schemes/mesh_prediction_scheme_multi_parallelogram_encoder.h"
 #include "draco/compression/attributes/prediction_schemes/mesh_prediction_scheme_parallelogram_encoder.h"
 #include "draco/compression/attributes/prediction_schemes/mesh_prediction_scheme_tex_coords_encoder.h"
@@ -49,32 +51,25 @@ struct MeshPredictionSchemeEncoderFactory {
           new MeshPredictionSchemeParallelogramEncoder<DataTypeT, TransformT,
                                                        MeshDataT>(
               attribute, transform, mesh_data));
-    } else if (method == MESH_PREDICTION_MULTI_PARALLELOGRAM) {
-      return std::unique_ptr<PredictionSchemeEncoder<DataTypeT, TransformT>>(
-          new MeshPredictionSchemeMultiParallelogramEncoder<
-              DataTypeT, TransformT, MeshDataT>(attribute, transform,
-                                                mesh_data));
     } else if (method == MESH_PREDICTION_CONSTRAINED_MULTI_PARALLELOGRAM) {
       return std::unique_ptr<PredictionSchemeEncoder<DataTypeT, TransformT>>(
           new MeshPredictionSchemeConstrainedMultiParallelogramEncoder<
               DataTypeT, TransformT, MeshDataT>(attribute, transform,
                     

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list