[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