[Bf-blender-cvs] [783aec533ec] temp-T50725-alembic-export-custom-properties: Add support for arrays of int/float/double

Sybren A. Stüvel noreply at git.blender.org
Thu Sep 10 19:45:39 CEST 2020


Commit: 783aec533ece84605e34acc68d1e10bc8c2feedf
Author: Sybren A. Stüvel
Date:   Thu Sep 10 13:20:48 2020 +0200
Branches: temp-T50725-alembic-export-custom-properties
https://developer.blender.org/rB783aec533ece84605e34acc68d1e10bc8c2feedf

Add support for arrays of int/float/double

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

M	source/blender/io/alembic/exporter/abc_custom_props.cc
M	source/blender/io/alembic/exporter/abc_custom_props.h

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

diff --git a/source/blender/io/alembic/exporter/abc_custom_props.cc b/source/blender/io/alembic/exporter/abc_custom_props.cc
index 97cd314f6e4..17439007129 100644
--- a/source/blender/io/alembic/exporter/abc_custom_props.cc
+++ b/source/blender/io/alembic/exporter/abc_custom_props.cc
@@ -35,18 +35,11 @@
 
 using Alembic::Abc::ArraySample;
 using Alembic::Abc::OArrayProperty;
-using Alembic::Abc::OBaseProperty;
 using Alembic::Abc::OBoolArrayProperty;
-using Alembic::Abc::OBoolProperty;
 using Alembic::Abc::ODoubleArrayProperty;
-using Alembic::Abc::ODoubleProperty;
 using Alembic::Abc::OFloatArrayProperty;
-using Alembic::Abc::OFloatProperty;
-using Alembic::Abc::OInt64ArrayProperty;
-using Alembic::Abc::OInt64Property;
-using Alembic::Abc::OScalarProperty;
+using Alembic::Abc::OInt32ArrayProperty;
 using Alembic::Abc::OStringArrayProperty;
-using Alembic::Abc::OStringProperty;
 
 namespace blender::io::alembic {
 
@@ -83,53 +76,99 @@ void CustomPropertiesExporter::write_all(IDProperty *group)
                            IDP_TYPE_FILTER_ARRAY | IDP_TYPE_FILTER_DOUBLE,
                        customPropertiesExporter_write,
                        this);
-}
-
-template<typename ABCPropertyType, typename BlenderValueType>
-void CustomPropertiesExporter::set_scalar_property(const StringRef property_name,
-                                                   const BlenderValueType property_value)
-{
-  auto create_callback = [this, property_name]() -> OArrayProperty {
-    ABCPropertyType abc_property(abc_compound_prop_, property_name);
-    abc_property.setTimeSampling(timesample_index_);
-    return abc_property;
-  };
-
-  OArrayProperty array_prop = abc_properties_.lookup_or_add_cb(property_name, create_callback);
-  ArraySample sample(&property_value, array_prop.getDataType(), Alembic::Util::Dimensions(1));
-  array_prop.set(sample);
+  std::cout << "\n";
 }
 
 void CustomPropertiesExporter::write(IDProperty *id_property)
 {
-  std::cout << "    CustomPropertiesExporter::write(" << id_property->name << ")\n";
+  std::cout << "    CustomPropertiesExporter::write(" << id_property->name << " ";
   switch (id_property->type) {
     case IDP_STRING: {
+      std::cout << "string";
       /* The Alembic library doesn't accept NULL-terminated character arrays. */
       const std::string prop_value = IDP_String(id_property);
       set_scalar_property<OStringArrayProperty, std::string>(id_property->name, prop_value);
       break;
     }
-    case IDP_INT: {
-      set_scalar_property<OInt64ArrayProperty, uint64_t>(id_property->name, IDP_Int(id_property));
+    case IDP_INT:
+      std::cout << "int";
+      set_scalar_property<OInt32ArrayProperty, int32_t>(id_property->name, IDP_Int(id_property));
       break;
-    }
-    case IDP_FLOAT: {
+    case IDP_FLOAT:
+      std::cout << "float";
       set_scalar_property<OFloatArrayProperty, float>(id_property->name, IDP_Float(id_property));
       break;
-    }
-    case IDP_DOUBLE: {
+    case IDP_DOUBLE:
+      std::cout << "double (" << IDP_Double(id_property) << ")";
       set_scalar_property<ODoubleArrayProperty, double>(id_property->name,
                                                         IDP_Double(id_property));
       break;
-    }
     case IDP_ARRAY:
+      switch (id_property->subtype) {
+        case IDP_INT: {
+          std::cout << "int[]";
+          const int *array = (int *)IDP_Array(id_property);
+          set_array_property<OInt32ArrayProperty, int32_t>(
+              id_property->name, array, id_property->len);
+          break;
+        }
+        case IDP_FLOAT: {
+          std::cout << "float[]";
+          const float *array = (float *)IDP_Array(id_property);
+          set_array_property<OFloatArrayProperty, float>(
+              id_property->name, array, id_property->len);
+          break;
+        }
+        case IDP_DOUBLE: {
+          std::cout << "double[]";
+          const double *array = (double *)IDP_Array(id_property);
+          set_array_property<ODoubleArrayProperty, double>(
+              id_property->name, array, id_property->len);
+          break;
+        }
+        case IDP_ARRAY:
+        case IDP_GROUP:
+        case IDP_ID:
+        case IDP_IDPARRAY:
+          std::cout << "\033[91munsupported[]\033[0m)\n";
+          /* Unsupported. */
+          break;
+      }
+      break;
     case IDP_GROUP:
     case IDP_ID:
     case IDP_IDPARRAY:
+      std::cout << "\033[91munsupported\033[0m)\n";
       /* Unsupported. */
       break;
   }
 }
 
+template<typename ABCPropertyType, typename BlenderValueType>
+void CustomPropertiesExporter::set_scalar_property(const StringRef property_name,
+                                                   const BlenderValueType property_value)
+{
+  set_array_property<ABCPropertyType, BlenderValueType>(property_name, &property_value, 1);
+}
+
+template<typename ABCPropertyType, typename BlenderValueType>
+void CustomPropertiesExporter::set_array_property(const StringRef property_name,
+                                                  const BlenderValueType *array_values,
+                                                  const size_t num_array_items)
+{
+  std::cout << " " << array_values[0] << ")\n";
+
+  /* Create an Alembic property if it doesn't exist yet. */
+  auto create_callback = [this, property_name]() -> OArrayProperty {
+    ABCPropertyType abc_property(abc_compound_prop_, property_name);
+    abc_property.setTimeSampling(timesample_index_);
+    return abc_property;
+  };
+  OArrayProperty array_prop = abc_properties_.lookup_or_add_cb(property_name, create_callback);
+
+  const Alembic::Util::Dimensions array_dimensions(num_array_items);
+  ArraySample sample(array_values, array_prop.getDataType(), array_dimensions);
+  array_prop.set(sample);
+}
+
 }  // namespace blender::io::alembic
diff --git a/source/blender/io/alembic/exporter/abc_custom_props.h b/source/blender/io/alembic/exporter/abc_custom_props.h
index e1981ead2ef..90a7dd92ea6 100644
--- a/source/blender/io/alembic/exporter/abc_custom_props.h
+++ b/source/blender/io/alembic/exporter/abc_custom_props.h
@@ -62,7 +62,12 @@ class CustomPropertiesExporter {
  private:
   /* Write a single scalar (i.e. non-array) property as single-value array. */
   template<typename ABCPropertyType, typename BlenderValueType>
-  void set_scalar_property(const StringRef property_name, const BlenderValueType property_value);
+  void set_scalar_property(StringRef property_name, const BlenderValueType property_value);
+
+  template<typename ABCPropertyType, typename BlenderValueType>
+  void set_array_property(StringRef property_name,
+                          const BlenderValueType *array_values,
+                          size_t num_array_items);
 };
 
 }  // namespace blender::io::alembic



More information about the Bf-blender-cvs mailing list