[Bf-blender-cvs] [302e34cee09] temp-alembic-exporter-T73363-ms2: Alembic: nicer way to disable subdivision surfaces

Sybren A. Stüvel noreply at git.blender.org
Fri Apr 10 15:39:38 CEST 2020


Commit: 302e34cee093703ec8a33ae159b375126bac6baa
Author: Sybren A. Stüvel
Date:   Fri Apr 10 14:45:57 2020 +0200
Branches: temp-alembic-exporter-T73363-ms2
https://developer.blender.org/rB302e34cee093703ec8a33ae159b375126bac6baa

Alembic: nicer way to disable subdivision surfaces

Before exporting starts, subdivision surfaces are disabled. The old
Alembic exporter would do this temporarily for each frame.

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

M	source/blender/io/alembic/CMakeLists.txt
M	source/blender/io/alembic/intern/export/abc_export_capi.cc
A	source/blender/io/alembic/intern/export/abc_subdiv_disabler.cc
A	source/blender/io/alembic/intern/export/abc_subdiv_disabler.h
M	source/blender/io/alembic/intern/export/abc_writer_mesh.cc
M	source/blender/io/alembic/intern/export/abc_writer_mesh.h

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

diff --git a/source/blender/io/alembic/CMakeLists.txt b/source/blender/io/alembic/CMakeLists.txt
index f4e6eefd8c4..8abc9dab702 100644
--- a/source/blender/io/alembic/CMakeLists.txt
+++ b/source/blender/io/alembic/CMakeLists.txt
@@ -54,6 +54,7 @@ set(SRC
   intern/abc_reader_object.cc
   intern/abc_reader_points.cc
   intern/abc_reader_transform.cc
+  intern/export/abc_subdiv_disabler.cc
   intern/abc_util.cc
   # intern/abc_writer_archive.cc
   # intern/abc_writer_camera.cc
@@ -78,6 +79,7 @@ set(SRC
   intern/abc_reader_object.h
   intern/abc_reader_points.h
   intern/abc_reader_transform.h
+  intern/export/abc_subdiv_disabler.h
   intern/abc_util.h
   # intern/abc_writer_archive.h
   # intern/abc_writer_camera.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 57d3817f103..671c66ba4c9 100644
--- a/source/blender/io/alembic/intern/export/abc_export_capi.cc
+++ b/source/blender/io/alembic/intern/export/abc_export_capi.cc
@@ -20,6 +20,7 @@
 #include "ABC_alembic.h"
 #include "abc_archive.h"
 #include "abc_hierarchy_iterator.h"
+#include "abc_subdiv_disabler.h"
 
 #include "MEM_guardedalloc.h"
 
@@ -70,78 +71,6 @@ static void build_depsgraph(Depsgraph *depsgraph, Main *bmain)
   BKE_scene_graph_update_tagged(depsgraph, bmain);
 }
 
-/**
- * Prepare objects for export.
- * When exporting unsubdivided meshes, this disables the subdivision modifiers.
- */
-// static void prepare_export(Depsgraph *depsgraph)
-// {
-// }
-
-// class SubdivModifierDisabler {
-//  private:
-//   std::set<ModifierData *> disabled_modifiers_;
-
-//  public:
-//   SubdivModifierDisabler(Depsgraph *depsgraph);
-//   ~SubdivModifierDisabler();
-
-//  private:
-//   ModifierData *get_subdiv_modifier(Scene *scene, Object *ob);
-// };
-
-// SubdivModifierDisabler::SubdivModifierDisabler(Depsgraph *depsgraph)
-// {
-//   Scene *scene = DEG_get_input_scene(depsgraph);
-
-//   // This is the same iteration as is used by
-//   AbstractHierarchyIterator::export_graph_construct(). DEG_OBJECT_ITER_BEGIN (depsgraph,
-//                          object,
-//                          DEG_ITER_OBJECT_FLAG_LINKED_DIRECTLY |
-//                              DEG_ITER_OBJECT_FLAG_LINKED_VIA_SET) {
-//     if (object->type != OB_MESH) {
-//       continue;
-//     }
-
-//     ModifierData *subdiv = get_subdiv_modifier(scene, object);
-//     if (subdiv == NULL) {
-//       continue;
-//     }
-//   }
-// }
-
-// SubdivModifierDisabler::~SubdivModifierDisabler()
-// {
-// }
-
-/* Check if the mesh is a subsurf, ignoring disabled modifiers and
- * displace if it's after subsurf. */
-// ModifierData *SubdivModifierDisabler::get_subsurf_modifier(Scene *scene, Object *ob)
-// {
-//   ModifierData *md = static_cast<ModifierData *>(ob->modifiers.last);
-
-//   for (; md; md = md->prev) {
-//     if (!modifier_isEnabled(scene, md, eModifierMode_Render)) {
-//       continue;
-//     }
-
-//     if (md->type == eModifierType_Subsurf) {
-//       SubsurfModifierData *smd = reinterpret_cast<SubsurfModifierData *>(md);
-
-//       if (smd->subdivType == ME_CC_SUBSURF) {
-//         return md;
-//       }
-//     }
-
-//     /* mesh is not a subsurf. break */
-//     if ((md->type != eModifierType_Displace) && (md->type != eModifierType_ParticleSystem)) {
-//       return NULL;
-//     }
-//   }
-
-//   return NULL;
-// }
-
 static void export_startjob(void *customdata, short *stop, short *do_update, float *progress)
 {
   ExportJobData *data = static_cast<ExportJobData *>(customdata);
@@ -156,6 +85,13 @@ static void export_startjob(void *customdata, short *stop, short *do_update, flo
 
   build_depsgraph(data->depsgraph, data->bmain);
 
+  // Disable subdivison modifiers if necessary.
+  SubdivModifierDisabler subdiv_disabler(data->depsgraph);
+  if (!data->params.apply_subdiv) {
+    subdiv_disabler.disable_modifiers();
+    BKE_scene_graph_update_tagged(data->depsgraph, data->bmain);
+  }
+
   // For restoring the current frame after exporting animation is done.
   Scene *scene = DEG_get_input_scene(data->depsgraph);
   const int orig_frame = CFRA;
diff --git a/source/blender/io/alembic/intern/export/abc_subdiv_disabler.cc b/source/blender/io/alembic/intern/export/abc_subdiv_disabler.cc
new file mode 100644
index 00000000000..0ca6ed0e328
--- /dev/null
+++ b/source/blender/io/alembic/intern/export/abc_subdiv_disabler.cc
@@ -0,0 +1,83 @@
+#include "abc_subdiv_disabler.h"
+
+extern "C" {
+#include <stdio.h>
+
+#include "DEG_depsgraph.h"
+#include "DEG_depsgraph_query.h"
+
+#include "DNA_mesh_types.h"
+#include "DNA_modifier_types.h"
+#include "DNA_object_types.h"
+
+#include "BKE_modifier.h"
+}
+
+namespace ABC {
+
+SubdivModifierDisabler::SubdivModifierDisabler(Depsgraph *depsgraph) : depsgraph_(depsgraph)
+{
+}
+
+SubdivModifierDisabler::~SubdivModifierDisabler()
+{
+  for (ModifierData *modifier : disabled_modifiers_) {
+    modifier->mode &= ~eModifierMode_DisableTemporary;
+  }
+}
+
+void SubdivModifierDisabler::disable_modifiers()
+{
+  Scene *scene = DEG_get_input_scene(depsgraph_);
+
+  // This is the same iteration as is used by
+  // AbstractHierarchyIterator::export_graph_construct().
+  DEG_OBJECT_ITER_BEGIN (depsgraph_,
+                         object_eval,
+                         DEG_ITER_OBJECT_FLAG_LINKED_DIRECTLY |
+                             DEG_ITER_OBJECT_FLAG_LINKED_VIA_SET) {
+    if (object_eval->type != OB_MESH) {
+      continue;
+    }
+
+    Object *object_orig = DEG_get_original_object(object_eval);
+    ModifierData *subdiv = get_subdiv_modifier(scene, object_orig);
+    if (subdiv == nullptr) {
+      continue;
+    }
+
+    subdiv->mode |= eModifierMode_DisableTemporary;
+    DEG_id_tag_update(&object_orig->id, ID_RECALC_GEOMETRY);
+  }
+  DEG_OBJECT_ITER_END;
+}
+
+/* Check if the mesh is a subsurf, ignoring disabled modifiers and
+ * displace if it's after subsurf. */
+ModifierData *SubdivModifierDisabler::get_subdiv_modifier(Scene *scene, Object *ob)
+{
+  ModifierData *md = static_cast<ModifierData *>(ob->modifiers.last);
+
+  for (; md; md = md->prev) {
+    if (!modifier_isEnabled(scene, md, eModifierMode_Render)) {
+      continue;
+    }
+
+    if (md->type == eModifierType_Subsurf) {
+      SubsurfModifierData *smd = reinterpret_cast<SubsurfModifierData *>(md);
+
+      if (smd->subdivType == ME_CC_SUBSURF) {
+        return md;
+      }
+    }
+
+    /* mesh is not a subsurf. break */
+    if ((md->type != eModifierType_Displace) && (md->type != eModifierType_ParticleSystem)) {
+      return nullptr;
+    }
+  }
+
+  return nullptr;
+}
+
+}  // namespace ABC
\ No newline at end of file
diff --git a/source/blender/io/alembic/intern/export/abc_subdiv_disabler.h b/source/blender/io/alembic/intern/export/abc_subdiv_disabler.h
new file mode 100644
index 00000000000..1d1167eee93
--- /dev/null
+++ b/source/blender/io/alembic/intern/export/abc_subdiv_disabler.h
@@ -0,0 +1,33 @@
+#pragma once
+
+#include <set>
+
+struct Depsgraph;
+struct ModifierData;
+struct Object;
+struct Scene;
+
+namespace ABC {
+
+/**
+ * Temporarily all subdivision modifiers on mesh objects.
+ * The destructor restores all disabled modifiers.
+ *
+ * This is used to export unsubdivided meshes to Alembic. It is done in a separate step before the
+ * exporter starts iterating over all the frames, so that it only has to happen once per export.
+ */
+class SubdivModifierDisabler {
+ private:
+  Depsgraph *depsgraph_;
+  std::set<ModifierData *> disabled_modifiers_;
+
+ public:
+  SubdivModifierDisabler(Depsgraph *depsgraph);
+  ~SubdivModifierDisabler();
+
+  void disable_modifiers();
+
+  static ModifierData *get_subdiv_modifier(Scene *scene, Object *ob);
+};
+
+}  // namespace ABC
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 66c822d0d07..6a39756eab8 100644
--- a/source/blender/io/alembic/intern/export/abc_writer_mesh.cc
+++ b/source/blender/io/alembic/intern/export/abc_writer_mesh.cc
@@ -86,27 +86,18 @@ ABCGenericMeshWriter::ABCGenericMeshWriter(const ABCWriterConstructorArgs &args)
   /* If the object is static, use the default static time sampling. */
   timesample_index_ = is_animated_ ? timesample_index_geometry_ : 0;
 
-  Object *object_orig = DEG_get_original_object(args_.object);
-  Scene *scene_orig = DEG_get_input_scene(args_.depsgraph);
+  if (!args_.export_params.apply_subdiv && export_as_subdivision_surface(args_.object)) {
+    is_subd_ = args_.export_params.use_subdiv_schema;
+  }
 
-  // Do some initialisation for the first time we see this object.
+  // TODO(Sybren): does this have to use the original or the evaluated data?
   // TODO(Sybren): avoid keeping ModifierData pointers around?
-  if (!args_.export_params.apply_subdiv) {
-    subsurf_modifier_ = get_subsurf_modifier(scene_orig, object_orig);
-    if (subsurf_modifier_ != nullptr) {
-      subsurf_modifier_->flag |= eModifierMode_DisableTemporary;
-      is_subd_ = args_.export_params.use_subdiv_schema;
-    }
-  }
-  // TODO(Sybren): does this have to use the original, or the evaluated?
-  liquid_sim_modifier_ = get_liquid_sim_modifier(scene_orig, object_orig);
+  Scene *scene_eval = DEG_get_evaluated_scene(args_.depsgraph);
+  liquid_sim_modifier_ = get_liquid_sim_modifier(scene_eval, args_.object);
 }
 
 ABCGenericMeshWriter::~ABCGenericMeshWriter()
 {
-  if (subsurf_modifier_ != nullptr) {
-    subsurf_modifier_->flag &= ~eModifierMode_DisableTemporary;
-  }
 }
 
 const Alembic::Abc::OObject ABCGenericMeshWriter::get_alembic_object() const
@@ -117,32 +108,19 @@ const Alembic::Abc::OObject ABCGenericMeshWriter::get_alembic_object() const
   return abc_poly_mesh_;
 }
 
-/* Check whether the mesh is a subsurf, ignoring disabled modifiers and displace if it's after
- * subsurf. */
-ModifierData *ABCGenericMeshWriter::get_subsurf_modifier(Scene *scene_eval, Object *ob_eval)
+bool ABCGenericMeshWriter::export_as_subdivision_surface(Object *ob_eval)
 {
   ModifierData *md = static_cast<ModifierData *>(ob_eval->modifiers.last);
 
   for (; md; md = md->prev) {
-    if (!modifier_isEnabled(scene_eval, md, eModifierMode_Render)) {
-      continue;
- 

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list