[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