/* ************************************************************************** */
- AbcExporter::AbcExporter(EvaluationContext *eval_ctx, Scene *scene, const char *filename, ExportSettings &settings)
- : m_settings(settings)
-AbcExporter::AbcExporter(Main *bmain, Scene *scene, const char *filename, ExportSettings &settings)
++AbcExporter::AbcExporter(Main *bmain, EvaluationContext *eval_ctx, Scene *scene, const char *filename, ExportSettings &settings)
+ : m_bmain(bmain)
+ , m_settings(settings)
, m_filename(filename)
, m_trans_sampling_index(0)
, m_shape_sampling_index(0)
void AbcExporter::createTransformWritersHierarchy(EvaluationContext *eval_ctx)
{
- Base *base = static_cast<Base *>(m_scene->base.first);
-
- while (base) {
+ for (Base *base = static_cast<Base *>(m_settings.sl->object_bases.first); base; base = base->next) {
Object *ob = base->object;
- switch (ob->type) {
- case OB_LAMP:
- case OB_LATTICE:
- case OB_SPEAKER:
- /* We do not export transforms for objects of these classes. */
- break;
- default:
- exploreTransform(eval_ctx, ob, ob->parent);
+ if (export_object(&m_settings, base, false)) {
+ switch (ob->type) {
+ case OB_LAMP:
+ case OB_LATTICE:
- case OB_MBALL:
+ case OB_SPEAKER:
+ /* We do not export transforms for objects of these classes. */
+ break;
-
+ default:
+ exploreTransform(eval_ctx, base, ob->parent, NULL);
+ }
}
-
- base = base->next;
}
}
return;
}
- if (object_type_is_exportable(ob)) {
+ if (object_type_is_exportable(m_scene, ob)) {
- createTransformWriter(ob, parent, dupliObParent);
+ createTransformWriter(eval_ctx, ob, parent, dupliObParent);
}
ListBase *lb = object_duplilist(eval_ctx, m_scene, ob);
}
}
-void AbcExporter::createShapeWriter(Object *ob, Object *dupliObParent)
+void AbcExporter::createShapeWriter(Base *ob_base, Object *dupliObParent)
{
- if (!object_type_is_exportable(ob)) {
+ Object *ob = ob_base->object;
+
+ if (!object_type_is_exportable(m_scene, ob)) {
return;
}
break;
}
- m_bmain, m_scene, ob, xform,
+ case OB_MBALL:
+ {
+ MetaBall *mball = static_cast<MetaBall *>(ob->data);
+ if (!mball) {
+ return;
+ }
+
+ m_shapes.push_back(new AbcMBallWriter(
++ m_bmain, m_eval_ctx, m_scene, ob, xform,
+ m_shape_sampling_index, m_settings));
+ break;
+ }
}
}
std::vector<AbcObjectWriter *> m_shapes;
public:
- AbcExporter(EvaluationContext *eval_ctx, Scene *scene, const char *filename, ExportSettings &settings);
- AbcExporter(Main *bmain, Scene *scene, const char *filename, ExportSettings &settings);
++ AbcExporter(Main *bmain, EvaluationContext *eval_ctx, Scene *scene, const char *filename, ExportSettings &settings);
~AbcExporter();
void operator()(Main *bmain, float &progress, bool &was_canceled);
--- /dev/null
-#include "BKE_depsgraph.h"
+ /*
+ * ***** 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"
- : AbcObjectWriter(scene, ob, time_sampling, settings, parent)
+ #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,
++ EvaluationContext *eval_ctx,
+ Scene *scene,
+ Object *ob,
+ AbcTransformWriter *parent,
+ uint32_t time_sampling,
+ ExportSettings &settings)
- m_mesh_writer = new AbcMeshWriter(scene, m_mesh_ob, parent,
++ : AbcObjectWriter(eval_ctx, 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(eval_ctx, 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<MetaBall *>(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;
+ }
--- /dev/null
+ /*
+ * ***** 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 *****
+ */
+
+ #ifndef __ABC_MBALL_H__
+ #define __ABC_MBALL_H__
+
+ #include "abc_object.h"
+
+ struct AbcMeshWriter;
+ struct Main;
+ struct MetaBall;
+ struct Object;
+
+ /* AbcMBallWriter converts the metaballs to meshes at every frame,
+ * and defers to a wrapped AbcMeshWriter to perform the writing
+ * to the Alembic file. Only the basis balls are exported, as this
+ * results in the entire shape as one mesh. */
+ class AbcMBallWriter : public AbcObjectWriter {
+ AbcMeshWriter *m_mesh_writer;
+ Object *m_mesh_ob;
+ bool m_is_animated;
+ Main *m_bmain;
+ public:
+ AbcMBallWriter(
+ Main *bmain,
++ EvaluationContext *eval_ctx,
+ Scene *scene,
+ Object *ob,
+ AbcTransformWriter *parent,
+ uint32_t time_sampling,
+ ExportSettings &settings);
+
+ ~AbcMBallWriter();
+
+ static bool isBasisBall(Scene *scene, Object *ob);
+
+ private:
+ virtual void do_write();
+ bool isAnimated() const;
+ };
+
+
+ #endif /* __ABC_MBALL_H__ */
try {
Scene *scene = data->scene;
- AbcExporter exporter(&data->eval_ctx, scene, data->filename, data->settings);
- AbcExporter exporter(data->bmain, scene, data->filename, data->settings);
++ AbcExporter exporter(data->bmain, &data->eval_ctx, scene, data->filename, data->settings);
const int orig_frame = CFRA;
.
..
../../../source/blender/blenlib
+ ../../../source/blender/blenkernel
../../../source/blender/alembic
../../../source/blender/makesdna
+ ../../../source/blender/depsgraph
${ALEMBIC_INCLUDE_DIRS}
${BOOST_INCLUDE_DIR}
${HDF5_INCLUDE_DIRS}
#include "DNA_scene_types.h"
}
+#include "DEG_depsgraph.h"
+
class TestableAbcExporter : public AbcExporter {
public:
- TestableAbcExporter(Scene *scene, const char *filename, ExportSettings &settings)
- : AbcExporter(&eval_ctx, scene, filename, settings)
+ TestableAbcExporter(Main *bmain, Scene *scene, const char *filename, ExportSettings &settings)
- : AbcExporter(bmain, scene, filename, settings)
- {}
++ : AbcExporter(bmain, &eval_ctx, scene, filename, settings)
+ {
+ /* TODO(sergey): Pass scene layer somehow? */
+ DEG_evaluation_context_init(&eval_ctx, DAG_EVAL_VIEWPORT);
+ }
void getShutterSamples(unsigned int nr_of_samples,
bool time_relative,
ExportSettings settings;
Scene scene;
TestableAbcExporter *exporter;
++ EvaluationContext eval_ctx;
virtual void SetUp()
{