[Bf-blender-cvs] [2bb6028d1a6] master: Alembic export: separated "writing Alembic mesh" from "writing mesh object"

Sybren A. Stüvel noreply at git.blender.org
Wed Jan 16 11:00:13 CET 2019


Commit: 2bb6028d1a64bec0ec83c14483e1d06c802989de
Author: Sybren A. Stüvel
Date:   Tue Jan 15 15:16:39 2019 +0100
Branches: master
https://developer.blender.org/rB2bb6028d1a64bec0ec83c14483e1d06c802989de

Alembic export: separated "writing Alembic mesh" from "writing mesh object"

I moved most of the `AbcMeshWriter` code to a new class
`AbcGenericMeshWriter`. The latter is an abstract class and does not
make any assumptions about the type of Blender object being written.
This makes it possible to write metaballs, curves, nurbs surfaces, etc.
as mesh to Alembic files.

The `AbcMeshWriter` class now is the concrete implementation of
`AbcGenericMeshWriter` for writing mesh objects.

Reviewers: sergey

Differential Revision: https://developer.blender.org/D4213

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

M	source/blender/alembic/intern/abc_mball.cc
M	source/blender/alembic/intern/abc_mesh.cc
M	source/blender/alembic/intern/abc_mesh.h

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

diff --git a/source/blender/alembic/intern/abc_mball.cc b/source/blender/alembic/intern/abc_mball.cc
index c7b2d0c88a5..e92d5671d72 100644
--- a/source/blender/alembic/intern/abc_mball.cc
+++ b/source/blender/alembic/intern/abc_mball.cc
@@ -55,7 +55,7 @@ AbcMBallWriter::AbcMBallWriter(
 	m_mesh_ob->runtime.curve_cache = (CurveCache *)MEM_callocN(
 	                             sizeof(CurveCache),
 	                             "CurveCache for AbcMBallWriter");
-
+	/* TODO(Sybren): reimplement metaball writing as subclass of AbcGenericMeshWriter. */
 	m_mesh_writer = new AbcMeshWriter(m_mesh_ob, parent, time_sampling, settings);
 	m_mesh_writer->setIsAnimated(m_is_animated);
 }
diff --git a/source/blender/alembic/intern/abc_mesh.cc b/source/blender/alembic/intern/abc_mesh.cc
index 9cc5edc505b..229f788f87c 100644
--- a/source/blender/alembic/intern/abc_mesh.cc
+++ b/source/blender/alembic/intern/abc_mesh.cc
@@ -289,10 +289,10 @@ static ModifierData *get_liquid_sim_modifier(Scene *scene, Object *ob)
 
 /* ************************************************************************** */
 
-AbcMeshWriter::AbcMeshWriter(Object *ob,
-                             AbcTransformWriter *parent,
-                             uint32_t time_sampling,
-                             ExportSettings &settings)
+AbcGenericMeshWriter::AbcGenericMeshWriter(Object *ob,
+                                           AbcTransformWriter *parent,
+                                           uint32_t time_sampling,
+                                           ExportSettings &settings)
     : AbcObjectWriter(ob, time_sampling, settings, parent)
 {
 	m_is_animated = isAnimated();
@@ -329,22 +329,15 @@ AbcMeshWriter::AbcMeshWriter(Object *ob,
 	}
 }
 
-AbcMeshWriter::~AbcMeshWriter()
+AbcGenericMeshWriter::~AbcGenericMeshWriter()
 {
 	if (m_subsurf_mod) {
 		m_subsurf_mod->mode &= ~eModifierMode_DisableTemporary;
 	}
 }
 
-bool AbcMeshWriter::isAnimated() const
+bool AbcGenericMeshWriter::isAnimated() const
 {
-	/* Check if object has shape keys. */
-	Mesh *me = static_cast<Mesh *>(m_object->data);
-
-	if (me->key) {
-		return true;
-	}
-
 	/* Test modifiers. */
 	ModifierData *md = static_cast<ModifierData *>(m_object->modifiers.first);
 
@@ -356,15 +349,15 @@ bool AbcMeshWriter::isAnimated() const
 		md = md->next;
 	}
 
-	return me->adt != NULL;
+	return false;
 }
 
-void AbcMeshWriter::setIsAnimated(bool is_animated)
+void AbcGenericMeshWriter::setIsAnimated(bool is_animated)
 {
 	m_is_animated = is_animated;
 }
 
-void AbcMeshWriter::do_write()
+void AbcGenericMeshWriter::do_write()
 {
 	/* We have already stored a sample for this object. */
 	if (!m_first_frame && !m_is_animated)
@@ -389,7 +382,7 @@ void AbcMeshWriter::do_write()
 	}
 }
 
-void AbcMeshWriter::writeMesh(struct Mesh *mesh)
+void AbcGenericMeshWriter::writeMesh(struct Mesh *mesh)
 {
 	std::vector<Imath::V3f> points, normals;
 	std::vector<int32_t> poly_verts, loop_counts;
@@ -455,7 +448,7 @@ void AbcMeshWriter::writeMesh(struct Mesh *mesh)
 	writeArbGeoParams(mesh);
 }
 
-void AbcMeshWriter::writeSubD(struct Mesh *mesh)
+void AbcGenericMeshWriter::writeSubD(struct Mesh *mesh)
 {
 	std::vector<float> crease_sharpness;
 	std::vector<Imath::V3f> points;
@@ -506,7 +499,7 @@ void AbcMeshWriter::writeSubD(struct Mesh *mesh)
 }
 
 template <typename Schema>
-void AbcMeshWriter::writeFaceSets(struct Mesh *me, Schema &schema)
+void AbcGenericMeshWriter::writeFaceSets(struct Mesh *me, Schema &schema)
 {
 	std::map< std::string, std::vector<int32_t> > geo_groups;
 	getGeoGroups(me, geo_groups);
@@ -520,17 +513,18 @@ void AbcMeshWriter::writeFaceSets(struct Mesh *me, Schema &schema)
 	}
 }
 
-Mesh *AbcMeshWriter::getFinalMesh(bool &r_needsfree)
+Mesh *AbcGenericMeshWriter::getFinalMesh(bool &r_needsfree)
 {
 	/* We don't want subdivided mesh data */
 	if (m_subsurf_mod) {
 		m_subsurf_mod->mode |= eModifierMode_DisableTemporary;
 	}
 
+	r_needsfree = false;
+
 	Scene *scene = DEG_get_evaluated_scene(m_settings.depsgraph);
 	Object *ob_eval = DEG_get_evaluated_object(m_settings.depsgraph, m_object);
-	struct Mesh *mesh = mesh_get_eval_final(m_settings.depsgraph, scene, ob_eval, CD_MASK_MESH);
-	r_needsfree = false;
+	struct Mesh *mesh = getEvaluatedMesh(scene, ob_eval, r_needsfree);
 
 	if (m_subsurf_mod) {
 		m_subsurf_mod->mode &= ~eModifierMode_DisableTemporary;
@@ -568,7 +562,7 @@ Mesh *AbcMeshWriter::getFinalMesh(bool &r_needsfree)
 	return mesh;
 }
 
-void AbcMeshWriter::writeArbGeoParams(struct Mesh *me)
+void AbcGenericMeshWriter::writeArbGeoParams(struct Mesh *me)
 {
 	if (m_is_liquid) {
 		/* We don't need anything more for liquid meshes. */
@@ -585,7 +579,7 @@ void AbcMeshWriter::writeArbGeoParams(struct Mesh *me)
 	}
 }
 
-void AbcMeshWriter::getVelocities(struct Mesh *mesh, std::vector<Imath::V3f> &vels)
+void AbcGenericMeshWriter::getVelocities(struct Mesh *mesh, std::vector<Imath::V3f> &vels)
 {
 	const int totverts = mesh->totvert;
 
@@ -609,7 +603,7 @@ void AbcMeshWriter::getVelocities(struct Mesh *mesh, std::vector<Imath::V3f> &ve
 	}
 }
 
-void AbcMeshWriter::getGeoGroups(
+void AbcGenericMeshWriter::getGeoGroups(
         struct Mesh *mesh,
         std::map<std::string, std::vector<int32_t> > &geo_groups)
 {
@@ -651,6 +645,38 @@ void AbcMeshWriter::getGeoGroups(
 	}
 }
 
+
+AbcMeshWriter::AbcMeshWriter(Object *ob,
+                             AbcTransformWriter *parent,
+                             uint32_t time_sampling,
+                             ExportSettings &settings)
+    : AbcGenericMeshWriter(ob, parent, time_sampling, settings)
+{}
+
+AbcMeshWriter::~AbcMeshWriter()
+{}
+
+struct Mesh *AbcMeshWriter::getEvaluatedMesh(struct Scene *scene_eval, struct Object *ob_eval,
+                                             bool &UNUSED(r_needsfree))
+{
+	return mesh_get_eval_final(m_settings.depsgraph, scene_eval, ob_eval, CD_MASK_MESH);
+}
+
+
+bool AbcMeshWriter::isAnimated() const
+{
+	Mesh *me = static_cast<Mesh *>(m_object->data);
+	if (me->key != NULL) {
+		return true;
+	}
+	if (me->adt != NULL) {
+		return true;
+	}
+
+	return AbcGenericMeshWriter::isAnimated();
+}
+
+
 /* ************************************************************************** */
 
 /* Some helpers for mesh generation */
diff --git a/source/blender/alembic/intern/abc_mesh.h b/source/blender/alembic/intern/abc_mesh.h
index dd7e9c7adf0..953c15e5eaf 100644
--- a/source/blender/alembic/intern/abc_mesh.h
+++ b/source/blender/alembic/intern/abc_mesh.h
@@ -31,7 +31,9 @@ struct ModifierData;
 
 /* ************************************************************************** */
 
-class AbcMeshWriter : public AbcObjectWriter {
+/* Writer for Alembic meshes. Does not assume the object is a mesh object. */
+class AbcGenericMeshWriter : public AbcObjectWriter {
+protected:
 	Alembic::AbcGeom::OPolyMeshSchema m_mesh_schema;
 	Alembic::AbcGeom::OPolyMeshSchema::Sample m_mesh_sample;
 
@@ -49,24 +51,24 @@ class AbcMeshWriter : public AbcObjectWriter {
 	bool m_is_subd;
 
 public:
-	AbcMeshWriter(Object *ob,
+	AbcGenericMeshWriter(Object *ob,
 	              AbcTransformWriter *parent,
 	              uint32_t time_sampling,
 	              ExportSettings &settings);
 
-	~AbcMeshWriter();
+	~AbcGenericMeshWriter();
 	void setIsAnimated(bool is_animated);
 
-private:
+protected:
 	virtual void do_write();
+	virtual bool isAnimated() const;
+	virtual struct Mesh *getEvaluatedMesh(struct Scene *scene_eval, struct Object *ob_eval, bool &r_needsfree) = 0;
 
-	bool isAnimated() const;
+	struct Mesh *getFinalMesh(bool &r_needsfree);
 
 	void writeMesh(struct Mesh *mesh);
 	void writeSubD(struct Mesh *mesh);
 
-	struct Mesh *getFinalMesh(bool &r_needsfree);
-
 	void writeArbGeoParams(struct Mesh *mesh);
 	void getGeoGroups(struct Mesh *mesh, std::map<std::string, std::vector<int32_t> > &geoGroups);
 
@@ -77,6 +79,21 @@ private:
 	void writeFaceSets(struct Mesh *mesh, Schema &schema);
 };
 
+
+class AbcMeshWriter : public AbcGenericMeshWriter {
+public:
+	AbcMeshWriter(Object *ob,
+	              AbcTransformWriter *parent,
+	              uint32_t time_sampling,
+	              ExportSettings &settings);
+
+	~AbcMeshWriter();
+protected:
+	bool isAnimated() const override;
+	virtual struct Mesh *getEvaluatedMesh(struct Scene *scene_eval, struct Object *ob_eval, bool &r_needsfree) override;
+};
+
+
 /* ************************************************************************** */
 
 class AbcMeshReader : public AbcObjectReader {



More information about the Bf-blender-cvs mailing list