[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