From 89eb05a8908130f8668e4c677d63f3d2b89e68bb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sybren=20A=2E=20St=C3=83=C2=83=C3=82=C2=BCvel?= Date: Sat, 28 Oct 2017 19:18:27 +0200 Subject: Alembic: exporting MetaBalls as mesh - Only basis balls are exported, as they represent the resulting mesh. As a result the mesh is written to Alembic using the name of the basis ball. - MetaBalls are converted to a mesh on every frame, then an AbcMeshWriter is used to write that mesh to Alembic. --- source/blender/alembic/intern/abc_mball.cc | 122 +++++++++++++++++++++++++++++ 1 file changed, 122 insertions(+) create mode 100644 source/blender/alembic/intern/abc_mball.cc (limited to 'source/blender/alembic/intern/abc_mball.cc') diff --git a/source/blender/alembic/intern/abc_mball.cc b/source/blender/alembic/intern/abc_mball.cc new file mode 100644 index 00000000000..56bb609ace0 --- /dev/null +++ b/source/blender/alembic/intern/abc_mball.cc @@ -0,0 +1,122 @@ +/* + * ***** BEGIN GPL LICENSE BLOCK ***** + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor(s): Sybren A. Stüvel + * + * ***** END GPL LICENSE BLOCK ***** + */ + +#include "abc_mball.h" +#include "abc_mesh.h" +#include "abc_transform.h" + +extern "C" { +#include "DNA_meta_types.h" +#include "DNA_mesh_types.h" +#include "DNA_object_types.h" + +#include "BKE_curve.h" +#include "BKE_depsgraph.h" +#include "BKE_displist.h" +#include "BKE_main.h" +#include "BKE_mball.h" +#include "BKE_mesh.h" +#include "BKE_object.h" + +#include "DEG_depsgraph.h" +#include "MEM_guardedalloc.h" +} + +AbcMBallWriter::AbcMBallWriter( + Main *bmain, + Scene *scene, + Object *ob, + AbcTransformWriter *parent, + uint32_t time_sampling, + ExportSettings &settings) + : AbcObjectWriter(scene, ob, time_sampling, settings, parent) + , m_bmain(bmain) +{ + m_is_animated = isAnimated(); + + m_mesh_ob = BKE_object_copy(bmain, ob); + m_mesh_ob->curve_cache = (CurveCache*)MEM_callocN( + sizeof(CurveCache), + "CurveCache for AbcMBallWriter"); + + m_mesh_writer = new AbcMeshWriter(scene, m_mesh_ob, parent, + time_sampling, settings); + m_mesh_writer->setIsAnimated(m_is_animated); +} + + +AbcMBallWriter::~AbcMBallWriter() +{ + delete m_mesh_writer; + BKE_object_free(m_mesh_ob); +} + +bool AbcMBallWriter::isAnimated() const +{ + MetaBall *mb = static_cast(m_object->data); + if (mb->adt != NULL) return true; + + /* Any movement of any object in the parent chain + * could cause the mball to deform. */ + for (Object *ob = m_object; ob != NULL; ob = ob->parent) { + if (ob->adt != NULL) return true; + } + return false; +} + +void AbcMBallWriter::do_write() +{ + /* We have already stored a sample for this object. */ + if (!m_first_frame && !m_is_animated) + return; + + Mesh *tmpmesh = BKE_mesh_add(m_bmain, ((ID *)m_object->data)->name + 2); + BLI_assert(tmpmesh != NULL); + m_mesh_ob->data = tmpmesh; + + /* BKE_mesh_add gives us a user count we don't need */ + id_us_min(&tmpmesh->id); + + ListBase disp = {NULL, NULL}; + /* TODO(sergey): This is gonna to work for until EvaluationContext + * only contains for_render flag. As soon as CoW is + * implemented, this is to be rethinked. + */ + EvaluationContext eval_ctx; + DEG_evaluation_context_init(&eval_ctx, DAG_EVAL_RENDER); + BKE_displist_make_mball_forRender(&eval_ctx, m_scene, m_object, &disp); + BKE_mesh_from_metaball(&disp, tmpmesh); + BKE_displist_free(&disp); + + BKE_mesh_texspace_copy_from_object(tmpmesh, m_mesh_ob); + + m_mesh_writer->write(); + + BKE_id_free(m_bmain, tmpmesh); + m_mesh_ob->data = NULL; +} + +bool AbcMBallWriter::isBasisBall(Scene *scene, Object *ob) +{ + Object *basis_ob = BKE_mball_basis_find(scene, ob); + return ob == basis_ob; +} -- cgit v1.2.3