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
This commit is contained in:
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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 */
|
||||
|
||||
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user