Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSybren A. Stüvel <sybren@stuvel.eu>2017-10-29 17:27:44 +0300
committerSybren A. Stüvel <sybren@stuvel.eu>2017-10-29 17:38:55 +0300
commit405980b1facff4a76e3661a412eab1d072d0236f (patch)
tree5ae5b79ac5bb91c2dc8d732531e7db4e67abee45
parent7530c54c3cf38016d9038e6879c8ee2b1bd14c9e (diff)
parent89eb05a8908130f8668e4c677d63f3d2b89e68bb (diff)
Merge branch 'master' into blender2.8
# Conflicts: # source/blender/alembic/intern/abc_exporter.cc # source/blender/alembic/intern/abc_exporter.h # source/blender/alembic/intern/alembic_capi.cc # tests/gtests/alembic/abc_export_test.cc
-rw-r--r--source/blender/alembic/CMakeLists.txt2
-rw-r--r--source/blender/alembic/intern/abc_exporter.cc30
-rw-r--r--source/blender/alembic/intern/abc_exporter.h3
-rw-r--r--source/blender/alembic/intern/abc_mball.cc122
-rw-r--r--source/blender/alembic/intern/abc_mball.h62
-rw-r--r--source/blender/alembic/intern/abc_mesh.cc5
-rw-r--r--source/blender/alembic/intern/abc_mesh.h1
-rw-r--r--source/blender/alembic/intern/alembic_capi.cc2
-rw-r--r--tests/gtests/alembic/CMakeLists.txt1
-rw-r--r--tests/gtests/alembic/abc_export_test.cc8
10 files changed, 224 insertions, 12 deletions
diff --git a/source/blender/alembic/CMakeLists.txt b/source/blender/alembic/CMakeLists.txt
index aa12b726d6b..d3b5e189292 100644
--- a/source/blender/alembic/CMakeLists.txt
+++ b/source/blender/alembic/CMakeLists.txt
@@ -52,6 +52,7 @@ set(SRC
intern/abc_curves.cc
intern/abc_exporter.cc
intern/abc_hair.cc
+ intern/abc_mball.cc
intern/abc_mesh.cc
intern/abc_nurbs.cc
intern/abc_object.cc
@@ -67,6 +68,7 @@ set(SRC
intern/abc_curves.h
intern/abc_exporter.h
intern/abc_hair.h
+ intern/abc_mball.h
intern/abc_mesh.h
intern/abc_nurbs.h
intern/abc_object.h
diff --git a/source/blender/alembic/intern/abc_exporter.cc b/source/blender/alembic/intern/abc_exporter.cc
index df2bc52aa2c..5635e3a9420 100644
--- a/source/blender/alembic/intern/abc_exporter.cc
+++ b/source/blender/alembic/intern/abc_exporter.cc
@@ -28,6 +28,7 @@
#include "abc_camera.h"
#include "abc_curves.h"
#include "abc_hair.h"
+#include "abc_mball.h"
#include "abc_mesh.h"
#include "abc_nurbs.h"
#include "abc_points.h"
@@ -37,6 +38,7 @@
extern "C" {
#include "DNA_camera_types.h"
#include "DNA_curve_types.h"
+#include "DNA_meta_types.h"
#include "DNA_mesh_types.h"
#include "DNA_modifier_types.h"
#include "DNA_object_types.h"
@@ -54,6 +56,7 @@ extern "C" {
#include "BKE_global.h"
#include "BKE_idprop.h"
#include "BKE_main.h"
+#include "BKE_mball.h"
#include "BKE_modifier.h"
#include "BKE_particle.h"
#include "BKE_scene.h"
@@ -108,7 +111,7 @@ static bool object_is_smoke_sim(Object *ob)
return false;
}
-static bool object_type_is_exportable(Object *ob)
+static bool object_type_is_exportable(Scene *scene, Object *ob)
{
switch (ob->type) {
case OB_MESH:
@@ -122,6 +125,8 @@ static bool object_type_is_exportable(Object *ob)
case OB_SURF:
case OB_CAMERA:
return true;
+ case OB_MBALL:
+ return AbcMBallWriter::isBasisBall(scene, ob);
default:
return false;
}
@@ -163,8 +168,9 @@ static bool export_object(const ExportSettings * const settings, const Base * co
/* ************************************************************************** */
-AbcExporter::AbcExporter(EvaluationContext *eval_ctx, Scene *scene, const char *filename, ExportSettings &settings)
- : m_settings(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)
@@ -361,11 +367,9 @@ void AbcExporter::createTransformWritersHierarchy(EvaluationContext *eval_ctx)
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);
}
@@ -383,7 +387,7 @@ void AbcExporter::exploreTransform(EvaluationContext *eval_ctx, Base *ob_base, O
return;
}
- if (object_type_is_exportable(ob)) {
+ if (object_type_is_exportable(m_scene, ob)) {
createTransformWriter(eval_ctx, ob, parent, dupliObParent);
}
@@ -553,7 +557,7 @@ void AbcExporter::createShapeWriter(Base *ob_base, Object *dupliObParent)
{
Object *ob = ob_base->object;
- if (!object_type_is_exportable(ob)) {
+ if (!object_type_is_exportable(m_scene, ob)) {
return;
}
@@ -619,6 +623,18 @@ void AbcExporter::createShapeWriter(Base *ob_base, Object *dupliObParent)
break;
}
+ 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;
+ }
}
}
diff --git a/source/blender/alembic/intern/abc_exporter.h b/source/blender/alembic/intern/abc_exporter.h
index 9c5fb69234c..7e32178bc20 100644
--- a/source/blender/alembic/intern/abc_exporter.h
+++ b/source/blender/alembic/intern/abc_exporter.h
@@ -84,6 +84,7 @@ struct ExportSettings {
};
class AbcExporter {
+ Main *m_bmain;
ExportSettings &m_settings;
const char *m_filename;
@@ -102,7 +103,7 @@ class AbcExporter {
std::vector<AbcObjectWriter *> m_shapes;
public:
- AbcExporter(EvaluationContext *eval_ctx, 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);
diff --git a/source/blender/alembic/intern/abc_mball.cc b/source/blender/alembic/intern/abc_mball.cc
new file mode 100644
index 00000000000..31cc6d1fe3e
--- /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_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)
+ : 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;
+}
diff --git a/source/blender/alembic/intern/abc_mball.h b/source/blender/alembic/intern/abc_mball.h
new file mode 100644
index 00000000000..4fdc1d7b882
--- /dev/null
+++ b/source/blender/alembic/intern/abc_mball.h
@@ -0,0 +1,62 @@
+/*
+ * ***** 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__ */
diff --git a/source/blender/alembic/intern/abc_mesh.cc b/source/blender/alembic/intern/abc_mesh.cc
index 7af25fdbe6c..fa2bbb8dfc3 100644
--- a/source/blender/alembic/intern/abc_mesh.cc
+++ b/source/blender/alembic/intern/abc_mesh.cc
@@ -358,6 +358,11 @@ bool AbcMeshWriter::isAnimated() const
return me->adt != NULL;
}
+void AbcMeshWriter::setIsAnimated(bool is_animated)
+{
+ m_is_animated = is_animated;
+}
+
void AbcMeshWriter::do_write()
{
/* We have already stored a sample for this object. */
diff --git a/source/blender/alembic/intern/abc_mesh.h b/source/blender/alembic/intern/abc_mesh.h
index e0b2365e134..a08b7352d16 100644
--- a/source/blender/alembic/intern/abc_mesh.h
+++ b/source/blender/alembic/intern/abc_mesh.h
@@ -58,6 +58,7 @@ public:
ExportSettings &settings);
~AbcMeshWriter();
+ void setIsAnimated(bool is_animated);
private:
virtual void do_write();
diff --git a/source/blender/alembic/intern/alembic_capi.cc b/source/blender/alembic/intern/alembic_capi.cc
index e7c7213cecb..730a574e649 100644
--- a/source/blender/alembic/intern/alembic_capi.cc
+++ b/source/blender/alembic/intern/alembic_capi.cc
@@ -263,7 +263,7 @@ static void export_startjob(void *customdata, short *stop, short *do_update, flo
try {
Scene *scene = data->scene;
- AbcExporter exporter(&data->eval_ctx, scene, data->filename, data->settings);
+ AbcExporter exporter(data->bmain, &data->eval_ctx, scene, data->filename, data->settings);
const int orig_frame = CFRA;
diff --git a/tests/gtests/alembic/CMakeLists.txt b/tests/gtests/alembic/CMakeLists.txt
index 924e7bbb1b6..3e794898ebe 100644
--- a/tests/gtests/alembic/CMakeLists.txt
+++ b/tests/gtests/alembic/CMakeLists.txt
@@ -25,6 +25,7 @@ set(INC
.
..
../../../source/blender/blenlib
+ ../../../source/blender/blenkernel
../../../source/blender/alembic
../../../source/blender/makesdna
../../../source/blender/depsgraph
diff --git a/tests/gtests/alembic/abc_export_test.cc b/tests/gtests/alembic/abc_export_test.cc
index 41ea32950eb..78622dcf8a0 100644
--- a/tests/gtests/alembic/abc_export_test.cc
+++ b/tests/gtests/alembic/abc_export_test.cc
@@ -5,6 +5,7 @@
#include "intern/abc_exporter.h"
extern "C" {
+#include "BKE_global.h"
#include "BLI_utildefines.h"
#include "BLI_math.h"
#include "DNA_scene_types.h"
@@ -14,8 +15,8 @@ extern "C" {
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, &eval_ctx, scene, filename, settings)
{
/* TODO(sergey): Pass scene layer somehow? */
DEG_evaluation_context_init(&eval_ctx, DAG_EVAL_VIEWPORT);
@@ -42,6 +43,7 @@ protected:
ExportSettings settings;
Scene scene;
TestableAbcExporter *exporter;
+ EvaluationContext eval_ctx;
virtual void SetUp()
{
@@ -63,7 +65,7 @@ protected:
// Call after setting up the settings.
void createExporter()
{
- exporter = new TestableAbcExporter(&scene, "somefile.abc", settings);
+ exporter = new TestableAbcExporter(G.main, &scene, "somefile.abc", settings);
}
};