[Bf-blender-cvs] [57056a7e66f] temp-alembic-exporter-T73363-ms2: Alembic: support writing metaballs

Sybren A. Stüvel noreply at git.blender.org
Tue Apr 28 11:51:06 CEST 2020


Commit: 57056a7e66fadb460ee1608433fa7d2ebc26e055
Author: Sybren A. Stüvel
Date:   Fri Apr 24 12:40:23 2020 +0200
Branches: temp-alembic-exporter-T73363-ms2
https://developer.blender.org/rB57056a7e66fadb460ee1608433fa7d2ebc26e055

Alembic: support writing metaballs

This commit also introduces a change in how Alembic C++ objects are created.
This no longer happens in the constructor, but is done in a different
function that's only called when `writer->is_supported(context)` returns
`true`.

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

M	source/blender/io/alembic/CMakeLists.txt
M	source/blender/io/alembic/intern/export/abc_export_capi.cc
M	source/blender/io/alembic/intern/export/abc_hierarchy_iterator.cc
M	source/blender/io/alembic/intern/export/abc_writer_abstract.cc
M	source/blender/io/alembic/intern/export/abc_writer_abstract.h
M	source/blender/io/alembic/intern/export/abc_writer_mesh.cc
M	source/blender/io/alembic/intern/export/abc_writer_mesh.h
A	source/blender/io/alembic/intern/export/abc_writer_metaball.cc
A	source/blender/io/alembic/intern/export/abc_writer_metaball.h
M	source/blender/io/alembic/intern/export/abc_writer_transform.cc
M	source/blender/io/alembic/intern/export/abc_writer_transform.h

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

diff --git a/source/blender/io/alembic/CMakeLists.txt b/source/blender/io/alembic/CMakeLists.txt
index 4a050467de5..cd796cafb01 100644
--- a/source/blender/io/alembic/CMakeLists.txt
+++ b/source/blender/io/alembic/CMakeLists.txt
@@ -97,6 +97,7 @@ set(SRC
   intern/export/abc_subdiv_disabler.cc
   intern/export/abc_writer_abstract.cc
   intern/export/abc_writer_mesh.cc
+  intern/export/abc_writer_metaball.cc
   intern/export/abc_writer_transform.cc
 
   intern/export/abc_archive.h
@@ -104,6 +105,7 @@ set(SRC
   intern/export/abc_subdiv_disabler.h
   intern/export/abc_writer_abstract.h
   intern/export/abc_writer_mesh.h
+  intern/export/abc_writer_metaball.h
   intern/export/abc_writer_transform.h
 )
 
diff --git a/source/blender/io/alembic/intern/export/abc_export_capi.cc b/source/blender/io/alembic/intern/export/abc_export_capi.cc
index c2ba0c8a469..5a51f524a8b 100644
--- a/source/blender/io/alembic/intern/export/abc_export_capi.cc
+++ b/source/blender/io/alembic/intern/export/abc_export_capi.cc
@@ -46,6 +46,9 @@ extern "C" {
 #include "WM_types.h"
 }
 
+#include "CLG_log.h"
+static CLG_LogRef LOG = {"io.alembic"};
+
 #include <algorithm>
 
 namespace ABC {
@@ -104,6 +107,8 @@ static void export_startjob(void *customdata, short *stop, short *do_update, flo
   ABCHierarchyIterator iter(data->depsgraph, &abc_archive, data->params);
 
   if (export_animation) {
+    CLOG_INFO(&LOG, 2, "Exporting animation");
+
     // Writing the animated frames is not 100% of the work, but it's our best guess.
     const float progress_per_frame = 1.0f / std::max(size_t(1), abc_archive.total_frame_count());
     ABCArchive::Frames::const_iterator frame_it = abc_archive.frames_begin();
@@ -121,6 +126,7 @@ static void export_startjob(void *customdata, short *stop, short *do_update, flo
       scene->r.subframe = frame - scene->r.cfra;
       BKE_scene_graph_update_for_newframe(data->depsgraph, data->bmain);
 
+      CLOG_INFO(&LOG, 2, "Exporting frame %.2f", frame);
       ExportSubset export_subset = abc_archive.export_subset_for_frame(frame);
       iter.set_export_subset(export_subset);
       iter.iterate_and_write();
diff --git a/source/blender/io/alembic/intern/export/abc_hierarchy_iterator.cc b/source/blender/io/alembic/intern/export/abc_hierarchy_iterator.cc
index 1183bd5d8c0..e0d6146386c 100644
--- a/source/blender/io/alembic/intern/export/abc_hierarchy_iterator.cc
+++ b/source/blender/io/alembic/intern/export/abc_hierarchy_iterator.cc
@@ -23,7 +23,7 @@
 // #include "abc_writer_hair.h"
 // #include "abc_writer_light.h"
 #include "abc_writer_mesh.h"
-// #include "abc_writer_metaball.h"
+#include "abc_writer_metaball.h"
 #include "abc_writer_transform.h"
 
 #include <string>
@@ -107,7 +107,9 @@ ABCWriterConstructorArgs ABCHierarchyIterator::writer_constructor_args(
 AbstractHierarchyWriter *ABCHierarchyIterator::create_transform_writer(
     const HierarchyContext *context)
 {
-  return new ABCTransformWriter(writer_constructor_args(context));
+  ABCAbstractWriter *transform_writer = new ABCTransformWriter(writer_constructor_args(context));
+  transform_writer->create_alembic_objects();
+  return transform_writer;
 }
 
 AbstractHierarchyWriter *ABCHierarchyIterator::create_data_writer(const HierarchyContext *context)
@@ -128,8 +130,7 @@ AbstractHierarchyWriter *ABCHierarchyIterator::create_data_writer(const Hierarch
       return nullptr;
       break;
     case OB_MBALL:
-      // data_writer = new USDMetaballWriter(writer_args);
-      return nullptr;
+      data_writer = new ABCMetaballWriter(writer_args);
       break;
 
     case OB_EMPTY:
@@ -152,6 +153,7 @@ AbstractHierarchyWriter *ABCHierarchyIterator::create_data_writer(const Hierarch
     return nullptr;
   }
 
+  data_writer->create_alembic_objects();
   return data_writer;
 }
 
@@ -161,7 +163,9 @@ AbstractHierarchyWriter *ABCHierarchyIterator::create_hair_writer(
   if (!params_.export_hair) {
     return nullptr;
   }
-  // return new USDHairWriter(writer_constructor_args(context));
+  // ABCAbstractWriter *hair_writer = new ABCHairWriter(writer_constructor_args(context));
+  // hair_writer->create_alembic_objects();
+  // return hair_writer;
   return nullptr;
 }
 
diff --git a/source/blender/io/alembic/intern/export/abc_writer_abstract.cc b/source/blender/io/alembic/intern/export/abc_writer_abstract.cc
index 333de76ee95..42061fff34d 100644
--- a/source/blender/io/alembic/intern/export/abc_writer_abstract.cc
+++ b/source/blender/io/alembic/intern/export/abc_writer_abstract.cc
@@ -25,11 +25,10 @@ extern "C" {
 #include "BKE_object.h"
 
 #include "DNA_modifier_types.h"
+}
 
 #include "CLG_log.h"
-
 static CLG_LogRef LOG = {"io.alembic"};
-}
 
 namespace ABC {
 
diff --git a/source/blender/io/alembic/intern/export/abc_writer_abstract.h b/source/blender/io/alembic/intern/export/abc_writer_abstract.h
index 632505dd2b0..4e0705ae7e5 100644
--- a/source/blender/io/alembic/intern/export/abc_writer_abstract.h
+++ b/source/blender/io/alembic/intern/export/abc_writer_abstract.h
@@ -66,6 +66,10 @@ class ABCAbstractWriter : public AbstractHierarchyWriter {
    * Empty). */
   virtual bool is_supported(const HierarchyContext *context) const;
 
+  /* Called by AlembicHierarchyCreator after checking that the data is supported via
+   * is_supported(). */
+  virtual void create_alembic_objects() = 0;
+
   /* TODO(Sybren): bring back support for writing the bounding box. */
 
   virtual const Alembic::Abc::OObject get_alembic_object() const = 0;
diff --git a/source/blender/io/alembic/intern/export/abc_writer_mesh.cc b/source/blender/io/alembic/intern/export/abc_writer_mesh.cc
index 57c98604e1c..e2b4af7430f 100644
--- a/source/blender/io/alembic/intern/export/abc_writer_mesh.cc
+++ b/source/blender/io/alembic/intern/export/abc_writer_mesh.cc
@@ -44,6 +44,9 @@ extern "C" {
 #include "DNA_particle_types.h"
 }
 
+#include "CLG_log.h"
+static CLG_LogRef LOG = {"io.alembic"};
+
 using Alembic::Abc::FloatArraySample;
 using Alembic::Abc::Int32ArraySample;
 using Alembic::Abc::OObject;
@@ -82,6 +85,10 @@ static void get_loop_normals(struct Mesh *mesh,
 
 ABCGenericMeshWriter::ABCGenericMeshWriter(const ABCWriterConstructorArgs &args)
     : ABCAbstractWriter(args), is_subd_(false)
+{
+}
+
+void ABCGenericMeshWriter::create_alembic_objects()
 {
   /* If the object is static, use the default static time sampling. */
   timesample_index_ = is_animated_ ? timesample_index_geometry_ : 0;
@@ -90,13 +97,14 @@ ABCGenericMeshWriter::ABCGenericMeshWriter(const ABCWriterConstructorArgs &args)
     is_subd_ = args_.export_params.use_subdiv_schema;
   }
 
-  OObject abc_parent = args.abc_parent;
-  if (is_subd_ && !abc_subdiv_.valid()) {
-    abc_subdiv_ = OSubD(abc_parent, args.abc_name, timesample_index_);
+  if (is_subd_) {
+    CLOG_INFO(&LOG, 2, "ABCGenericMeshWriter: exporting OSubD %s", args_.abc_path.c_str());
+    abc_subdiv_ = OSubD(args_.abc_parent, args_.abc_name, timesample_index_);
     abc_subdiv_schema_ = abc_subdiv_.getSchema();
   }
-  else if (!is_subd_ && !abc_poly_mesh_.valid()) {
-    abc_poly_mesh_ = OPolyMesh(abc_parent, args.abc_name, timesample_index_);
+  else {
+    CLOG_INFO(&LOG, 2, "ABCGenericMeshWriter: exporting OPolyMesh %s", args_.abc_path.c_str());
+    abc_poly_mesh_ = OPolyMesh(args_.abc_parent, args_.abc_name, timesample_index_);
     abc_poly_mesh_schema_ = abc_poly_mesh_.getSchema();
 
     OCompoundProperty typeContainer = abc_poly_mesh_.getSchema().getUserProperties();
@@ -104,8 +112,6 @@ ABCGenericMeshWriter::ABCGenericMeshWriter(const ABCWriterConstructorArgs &args)
     type.set(subsurf_modifier_ == nullptr);
   }
 
-  // TODO(Sybren): does this have to use the original or the evaluated data?
-  // TODO(Sybren): avoid keeping ModifierData pointers around?
   Scene *scene_eval = DEG_get_evaluated_scene(args_.depsgraph);
   liquid_sim_modifier_ = get_liquid_sim_modifier(scene_eval, args_.object);
 }
@@ -122,7 +128,7 @@ const Alembic::Abc::OObject ABCGenericMeshWriter::get_alembic_object() const
   return abc_poly_mesh_;
 }
 
-bool ABCGenericMeshWriter::export_as_subdivision_surface(Object *ob_eval)
+bool ABCGenericMeshWriter::export_as_subdivision_surface(Object *ob_eval) const
 {
   ModifierData *md = static_cast<ModifierData *>(ob_eval->modifiers.last);
 
@@ -555,6 +561,7 @@ static void get_loop_normals(struct Mesh *mesh,
 
 ABCMeshWriter::ABCMeshWriter(const ABCWriterConstructorArgs &args) : ABCGenericMeshWriter(args)
 {
+  CLOG_INFO(&LOG, 2, "ABCMeshWriter: exporting %s", args.abc_path.c_str());
 }
 
 Mesh *ABCMeshWriter::get_export_mesh(Object *object_eval, bool & /*r_needsfree*/)
diff --git a/source/blender/io/alembic/intern/export/abc_writer_mesh.h b/source/blender/io/alembic/intern/export/abc_writer_mesh.h
index 852f08c1913..e7e109f7673 100644
--- a/source/blender/io/alembic/intern/export/abc_writer_mesh.h
+++ b/source/blender/io/alembic/intern/export/abc_writer_mesh.h
@@ -58,6 +58,7 @@ class ABCGenericMeshWriter : public ABCAbstractWriter {
   ABCGenericMeshWriter(const ABCWriterConstructorArgs &args);
   virtual ~ABCGenericMeshWriter();
 
+  virtual void create_alembic_objects() override;
   virtual const Alembic::Abc::OObject get_alembic_object() const;
 
  protected:
@@ -67,12 +68,13 @@ class ABCGenericMeshWriter : public ABCAbstractWriter {
   virtual Mesh *get_export_mesh(Object *object_eval, bool &r_needsfree) = 0;
   virtual void free_export_mesh(Mesh *mesh);
 
+  virtual bool export_as_subdivision_surface(Object *ob_eval) const;
+
  private:
   void write_mesh(HierarchyContext &context, Mesh *mesh);
   void write_subd(HierarchyContext &context, Mesh *mesh);
   template<typename Schema> void write_face_sets(Object *object, Mesh *mesh, Schema &schema);
 
-  bool export_as_subdivision_surface(Object *ob_eval);
   ModifierData *get_liquid_sim_modifier(Scene *scene_eval, Object *ob_eval);
 
   void write_arb_geo_params(Mesh *me);
diff --git a/source/blender/io/alembic/intern/export/abc_writer_metaball.cc b/source/blender/io/alembic/intern/export/abc_writer_metaball.cc
new file mode 100644
index 00000000000..2ff6dc058d9
--- /dev/null
+++ b/source/blender/io/alembic/intern/export/abc_writer_metaball.cc
@@ -0,0 +1,86 @@
+/*
+ * This program is free software; you can redistribute it

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list