[Bf-blender-cvs] [38726e2] alembic_basic_io: Set up objects' position, rotation and scale upon import.
Kévin Dietrich
noreply at git.blender.org
Wed Apr 6 13:39:18 CEST 2016
Commit: 38726e2f7ce9abf401786390551fcba1d2bf0902
Author: Kévin Dietrich
Date: Wed Apr 6 13:18:31 2016 +0200
Branches: alembic_basic_io
https://developer.blender.org/rB38726e2f7ce9abf401786390551fcba1d2bf0902
Set up objects' position, rotation and scale upon import.
===================================================================
M source/blender/alembic/intern/abc_camera.cc
M source/blender/alembic/intern/abc_camera.h
M source/blender/alembic/intern/abc_mesh.cc
M source/blender/alembic/intern/abc_mesh.h
M source/blender/alembic/intern/abc_nurbs.cc
M source/blender/alembic/intern/abc_nurbs.h
M source/blender/alembic/intern/abc_object.cc
M source/blender/alembic/intern/abc_object.h
M source/blender/alembic/intern/alembic_capi.cc
===================================================================
diff --git a/source/blender/alembic/intern/abc_camera.cc b/source/blender/alembic/intern/abc_camera.cc
index ad9a45d..f155326 100644
--- a/source/blender/alembic/intern/abc_camera.cc
+++ b/source/blender/alembic/intern/abc_camera.cc
@@ -115,7 +115,7 @@ bool AbcCameraReader::valid() const
return m_schema.valid();
}
-void AbcCameraReader::readObject(Main *bmain, Scene *scene, float time, Object *parent)
+void AbcCameraReader::readObjectData(Main *bmain, Scene *scene, float time, Object *parent)
{
Camera *bcam = static_cast<Camera *>(BKE_camera_add(bmain, "abc_camera"));
diff --git a/source/blender/alembic/intern/abc_camera.h b/source/blender/alembic/intern/abc_camera.h
index 8e11148..72a48b5 100644
--- a/source/blender/alembic/intern/abc_camera.h
+++ b/source/blender/alembic/intern/abc_camera.h
@@ -52,7 +52,7 @@ public:
bool valid() const;
- void readObject(Main *bmain, Scene *scene, float time, Object *parent);
+ void readObjectData(Main *bmain, Scene *scene, float time, Object *parent);
};
#endif /* __ABC_CAMERA_WRITER_H__ */
diff --git a/source/blender/alembic/intern/abc_mesh.cc b/source/blender/alembic/intern/abc_mesh.cc
index 025fc22..e668e73 100644
--- a/source/blender/alembic/intern/abc_mesh.cc
+++ b/source/blender/alembic/intern/abc_mesh.cc
@@ -43,6 +43,8 @@ extern "C" {
#include "BKE_modifier.h"
#include "BKE_object.h"
+#include "ED_object.h"
+
#include "WM_api.h"
#include "WM_types.h"
}
@@ -1049,7 +1051,7 @@ bool AbcMeshReader::valid() const
return m_schema.valid();
}
-void AbcMeshReader::readObject(Main *bmain, Scene *scene, float time, Object *parent)
+void AbcMeshReader::readObjectData(Main *bmain, Scene *scene, float time, Object *parent)
{
Mesh *blender_mesh = BKE_mesh_add(bmain, m_data_name.c_str());
@@ -1165,40 +1167,11 @@ void AbcMeshReader::readObject(Main *bmain, Scene *scene, float time, Object *pa
}
#endif
- // Compute edge array is done here
BKE_mesh_validate(blender_mesh, false, false);
m_object = BKE_object_add(bmain, scene, OB_MESH, m_object_name.c_str());
m_object->data = blender_mesh;
- if (parent) {
- m_object->parent = parent;
-
- DAG_id_tag_update(&m_object->id, OB_RECALC_OB);
- DAG_relations_tag_update(bmain);
- WM_main_add_notifier(NC_OBJECT | ND_PARENT, m_object);
- }
-
- // setup object matrix
- const Alembic::AbcGeom::MetaData &md = m_iobject.getMetaData();
-
- if (Alembic::AbcGeom::IXformSchema::matches(md)) {
- Alembic::AbcGeom::IXform x(m_iobject, Alembic::AbcGeom::kWrapExisting);
- Alembic::AbcGeom::IXformSchema &schema(x.getSchema());
-
- if (schema.valid()) {
- Alembic::AbcGeom::ISampleSelector xform_sample(time);
- Alembic::AbcGeom::XformSample xs;
- schema.get(xs, xform_sample);
-
- for (int i = 0; i < 4; ++i) {
- for (int j = 0; j < 4; j++) {
- m_object->obmat[i][j] = xs.getMatrix()[i][j];
- }
- }
- }
- }
-
// TODO
#if 0
if (apply_materials) {
diff --git a/source/blender/alembic/intern/abc_mesh.h b/source/blender/alembic/intern/abc_mesh.h
index 6e00b1b..95d2397 100644
--- a/source/blender/alembic/intern/abc_mesh.h
+++ b/source/blender/alembic/intern/abc_mesh.h
@@ -108,7 +108,7 @@ public:
bool valid() const;
- void readObject(Main *bmain, Scene *scene, float time, Object *parent);
+ void readObjectData(Main *bmain, Scene *scene, float time, Object *parent);
};
#endif /* __ABC_MESH_WRITER_H__ */
diff --git a/source/blender/alembic/intern/abc_nurbs.cc b/source/blender/alembic/intern/abc_nurbs.cc
index 4725682..23b81e0 100644
--- a/source/blender/alembic/intern/abc_nurbs.cc
+++ b/source/blender/alembic/intern/abc_nurbs.cc
@@ -210,7 +210,7 @@ bool AbcNurbsReader::valid() const
return m_schemas[0].first.valid();
}
-void AbcNurbsReader::readObject(Main *bmain, Scene *scene, float time, Object *parent)
+void AbcNurbsReader::readObjectData(Main *bmain, Scene *scene, float time, Object *parent)
{
Curve *cu = static_cast<Curve *>(BKE_curve_add(bmain, "abc_curve", OB_SURF));
diff --git a/source/blender/alembic/intern/abc_nurbs.h b/source/blender/alembic/intern/abc_nurbs.h
index 4a65695..f8bbf69 100644
--- a/source/blender/alembic/intern/abc_nurbs.h
+++ b/source/blender/alembic/intern/abc_nurbs.h
@@ -49,7 +49,7 @@ public:
bool valid() const;
- void readObject(Main *bmain, Scene *scene, float time, Object *parent);
+ void readObjectData(Main *bmain, Scene *scene, float time, Object *parent);
private:
void getNurbsPatches(const Alembic::Abc::IObject &obj);
diff --git a/source/blender/alembic/intern/abc_object.cc b/source/blender/alembic/intern/abc_object.cc
index 958edb2..eaf49e9 100644
--- a/source/blender/alembic/intern/abc_object.cc
+++ b/source/blender/alembic/intern/abc_object.cc
@@ -31,6 +31,10 @@ extern "C" {
#include "BLI_math.h"
#include "BLI_utildefines.h"
+
+#include "DNA_object_types.h"
+
+#include "BKE_depsgraph.h"
}
AbcObjectWriter::AbcObjectWriter(Object *obj, AbcExportOptions &opts)
@@ -334,3 +338,32 @@ Object *AbcObjectReader::object() const
{
return m_object;
}
+
+void AbcObjectReader::readObjectMatrix(const float time) const
+{
+ const Alembic::AbcGeom::MetaData &md = m_iobject.getParent().getMetaData();
+
+ if (!Alembic::AbcGeom::IXformSchema::matches(md)) {
+ return;
+ }
+
+ Alembic::AbcGeom::IXform x(m_iobject.getParent(), Alembic::AbcGeom::kWrapExisting);
+ Alembic::AbcGeom::IXformSchema &schema(x.getSchema());
+
+ if (schema.valid()) {
+ Alembic::AbcGeom::ISampleSelector xform_sample(time);
+ Alembic::AbcGeom::XformSample xs;
+ schema.get(xs, xform_sample);
+
+ for (int i = 0; i < 3; ++i) {
+ m_object->loc[i] = xs.getTranslation()[i];
+ m_object->size[i] = xs.getScale()[i];
+ }
+
+ m_object->rot[0] = xs.getXRotation();
+ m_object->rot[1] = xs.getYRotation();
+ m_object->rot[2] = xs.getZRotation();
+
+ DAG_id_tag_update(&(m_object->id), OB_RECALC_OB);
+ }
+}
diff --git a/source/blender/alembic/intern/abc_object.h b/source/blender/alembic/intern/abc_object.h
index 9777441..f6d7e03 100644
--- a/source/blender/alembic/intern/abc_object.h
+++ b/source/blender/alembic/intern/abc_object.h
@@ -104,7 +104,9 @@ public:
Object *object() const;
virtual bool valid() const = 0;
- virtual void readObject(Main *bmain, Scene *scene, float time, Object *parent) = 0;
+ virtual void readObjectData(Main *bmain, Scene *scene, float time, Object *parent) = 0;
+
+ void readObjectMatrix(const float time) const;
};
#endif
diff --git a/source/blender/alembic/intern/alembic_capi.cc b/source/blender/alembic/intern/alembic_capi.cc
index 28a6729..c593354 100644
--- a/source/blender/alembic/intern/alembic_capi.cc
+++ b/source/blender/alembic/intern/alembic_capi.cc
@@ -919,7 +919,8 @@ void ABC_import(bContext *C, const char *filename, int from_forward, int from_up
AbcObjectReader *reader = *iter;
if (reader->valid()) {
- reader->readObject(CTX_data_main(C), CTX_data_scene(C), 0.0f, NULL);
+ reader->readObjectData(CTX_data_main(C), CTX_data_scene(C), 0.0f, NULL);
+ reader->readObjectMatrix(0.0f);
}
}
More information about the Bf-blender-cvs
mailing list