[Bf-blender-cvs] [01d974f] alembic_basic_io: Added a new 'Transform Cache' constraint to lookup transformation matrices from alembic archives.

Kévin Dietrich noreply at git.blender.org
Sat May 28 00:33:55 CEST 2016


Commit: 01d974f92fcd80d6ac5db369d4b3498a66094829
Author: Kévin Dietrich
Date:   Sat May 28 00:09:28 2016 +0200
Branches: alembic_basic_io
https://developer.blender.org/rB01d974f92fcd80d6ac5db369d4b3498a66094829

Added a new 'Transform Cache' constraint to lookup transformation
matrices from alembic archives.

===================================================================

M	release/scripts/startup/bl_ui/properties_constraint.py
M	source/blender/alembic/ABC_alembic.h
M	source/blender/alembic/intern/abc_camera.cc
M	source/blender/alembic/intern/abc_mesh.cc
M	source/blender/alembic/intern/abc_object.cc
M	source/blender/alembic/intern/abc_util.cc
M	source/blender/alembic/intern/abc_util.h
M	source/blender/alembic/intern/alembic_capi.cc
M	source/blender/blenkernel/intern/constraint.c
M	source/blender/editors/object/object_constraint.c
M	source/blender/makesdna/DNA_constraint_types.h
M	source/blender/makesrna/intern/rna_constraint.c

===================================================================

diff --git a/release/scripts/startup/bl_ui/properties_constraint.py b/release/scripts/startup/bl_ui/properties_constraint.py
index 4ca2f77..3af878c 100644
--- a/release/scripts/startup/bl_ui/properties_constraint.py
+++ b/release/scripts/startup/bl_ui/properties_constraint.py
@@ -880,6 +880,10 @@ class ConstraintButtonsPanel:
 
         layout.operator("clip.constraint_to_fcurve")
 
+    def TRANSFORMCACHE(self, context, layout, con):
+        layout.prop(con, "filepath")
+        layout.prop(con, "abc_object_path")
+
     def SCRIPT(self, context, layout, con):
         layout.label("Blender 2.6 doesn't support python constraints yet")
 
diff --git a/source/blender/alembic/ABC_alembic.h b/source/blender/alembic/ABC_alembic.h
index 3fb2320..e22af68 100644
--- a/source/blender/alembic/ABC_alembic.h
+++ b/source/blender/alembic/ABC_alembic.h
@@ -28,6 +28,7 @@ extern "C" {
 #endif
 
 struct bContext;
+struct Object;
 struct Scene;
 
 enum {
@@ -59,6 +60,8 @@ void ABC_get_vertex_cache(const char *filepath, float time, void *verts, int max
 
 int ABC_check_subobject_valid(const char *name, const char *sub_obj);
 
+void ABC_get_transform(struct Object *ob, const char *filename, const char *object_path, float r_mat[4][4], float time);
+
 #ifdef __cplusplus
 }
 #endif
diff --git a/source/blender/alembic/intern/abc_camera.cc b/source/blender/alembic/intern/abc_camera.cc
index 8155662..f0d14bc 100644
--- a/source/blender/alembic/intern/abc_camera.cc
+++ b/source/blender/alembic/intern/abc_camera.cc
@@ -27,11 +27,13 @@
 
 extern "C" {
 #include "DNA_camera_types.h"
+#include "DNA_constraint_types.h"
 #include "DNA_object_types.h"
 
 #include "BLI_string.h"
 
 #include "BKE_camera.h"
+#include "BKE_constraint.h"
 #include "BKE_depsgraph.h"
 #include "BKE_object.h"
 
@@ -128,7 +130,7 @@ void AbcCameraReader::readObjectData(Main *bmain, Scene *scene, float time)
 {
 	Camera *bcam = static_cast<Camera *>(BKE_camera_add(bmain, "abc_camera"));
 
-	ISampleSelector sample_sel(time);
+	ISampleSelector sample_sel(0.0f);
 	CameraSample cam_sample;
 	m_schema.get(cam_sample, sample_sel);
 
@@ -169,4 +171,11 @@ void AbcCameraReader::readObjectData(Main *bmain, Scene *scene, float time)
 
 	m_object = BKE_object_add(bmain, scene, OB_CAMERA, m_object_name.c_str());
 	m_object->data = bcam;
+
+	if (!m_schema.isConstant()) {
+		bConstraint *con = BKE_constraint_add_for_object(m_object, NULL, CONSTRAINT_TYPE_TRANSFORMCACHE);
+		bTransformCacheConstraint *data = static_cast<bTransformCacheConstraint *>(con->data);
+		BLI_strncpy(data->filepath, m_iobject.getArchive().getName().c_str(), 1024);
+		BLI_strncpy(data->abc_object_path, m_iobject.getFullName().c_str(), 1024);
+	}
 }
diff --git a/source/blender/alembic/intern/abc_mesh.cc b/source/blender/alembic/intern/abc_mesh.cc
index 7c7b561..e3e327b 100644
--- a/source/blender/alembic/intern/abc_mesh.cc
+++ b/source/blender/alembic/intern/abc_mesh.cc
@@ -28,17 +28,18 @@
 #include "abc_util.h"
 
 extern "C" {
+#include "DNA_constraint_types.h"
 #include "DNA_material_types.h"
 #include "DNA_mesh_types.h"
 #include "DNA_modifier_types.h"
 #include "DNA_object_fluidsim.h"
 #include "DNA_object_types.h"
-#include "DNA_object_types.h"
 
 #include "BLI_listbase.h"
 #include "BLI_math_geom.h"
 #include "BLI_string.h"
 
+#include "BKE_constraint.h"
 #include "BKE_DerivedMesh.h"
 #include "BKE_depsgraph.h"
 #include "BKE_main.h"
@@ -1299,4 +1300,11 @@ bool AbcEmptyReader::valid() const
 void AbcEmptyReader::readObjectData(Main *bmain, Scene *scene, float /*time*/)
 {
 	m_object = BKE_object_add(bmain, scene, OB_EMPTY, m_object_name.c_str());
+
+	if (!m_schema.isConstant()) {
+		bConstraint *con = BKE_constraint_add_for_object(m_object, NULL, CONSTRAINT_TYPE_TRANSFORMCACHE);
+		bTransformCacheConstraint *data = static_cast<bTransformCacheConstraint *>(con->data);
+		BLI_strncpy(data->filepath, m_iobject.getArchive().getName().c_str(), 1024);
+		BLI_strncpy(data->abc_object_path, m_iobject.getFullName().c_str(), 1024);
+	}
 }
diff --git a/source/blender/alembic/intern/abc_object.cc b/source/blender/alembic/intern/abc_object.cc
index 714a233..b51b034 100644
--- a/source/blender/alembic/intern/abc_object.cc
+++ b/source/blender/alembic/intern/abc_object.cc
@@ -365,7 +365,7 @@ void AbcObjectReader::readObjectMatrix(const float time)
 			mul_m4_m4m4(m_object->obmat, m_object->obmat, cam_to_yup);
 		}
 
-		create_transform_matrix(m_object);
+		create_transform_matrix(m_object->obmat);
 
 		/* TODO: apply global scale */
 #if 0
diff --git a/source/blender/alembic/intern/abc_util.cc b/source/blender/alembic/intern/abc_util.cc
index b42e576..53734e7 100644
--- a/source/blender/alembic/intern/abc_util.cc
+++ b/source/blender/alembic/intern/abc_util.cc
@@ -154,7 +154,7 @@ static void create_rotation_matrix(
 
 /* Recompute transform matrix of object in new coordinate system
  * (from Y-Up to Z-Up). */
-void create_transform_matrix(Object *obj)
+void create_transform_matrix(float r_mat[4][4])
 {
     float rot_mat[3][3], rot[3][3], scale_mat[4][4], invmat[4][4], transform_mat[4][4];
     float rot_x_mat[3][3], rot_y_mat[3][3], rot_z_mat[3][3];
@@ -172,7 +172,7 @@ void create_transform_matrix(Object *obj)
     /* compute rotation matrix */
 
     /* extract location, rotation, and scale from matrix */
-    mat4_to_loc_rot_size(loc, rot, scale, obj->obmat);
+    mat4_to_loc_rot_size(loc, rot, scale, r_mat);
 
     /* get euler angles from rotation matrix */
     mat3_to_eulO(euler, ROT_MODE_XYZ, rot);
@@ -201,7 +201,7 @@ void create_transform_matrix(Object *obj)
     /* add scale to transformation matrix */
     mul_m4_m4m4(transform_mat, transform_mat, scale_mat);
 
-    copy_m4_m4(obj->obmat, transform_mat);
+    copy_m4_m4(r_mat, transform_mat);
 }
 
 /* recompute transform matrix of object in new coordinate system (from Z-Up to Y-Up) */
diff --git a/source/blender/alembic/intern/abc_util.h b/source/blender/alembic/intern/abc_util.h
index f65fb76..d2b0b79 100644
--- a/source/blender/alembic/intern/abc_util.h
+++ b/source/blender/alembic/intern/abc_util.h
@@ -36,7 +36,7 @@ bool object_selected(Object *ob);
 bool parent_selected(Object *ob);
 
 Imath::M44d convert_matrix(float mat[4][4]);
-void create_transform_matrix(Object *obj);
+void create_transform_matrix(float r_mat[4][4]);
 void create_transform_matrix(Object *obj, float transform_mat[4][4]);
 
 void split(const std::string &s, const char delim, std::vector<std::string> &tokens);
diff --git a/source/blender/alembic/intern/alembic_capi.cc b/source/blender/alembic/intern/alembic_capi.cc
index c9fa39b..8de8575 100644
--- a/source/blender/alembic/intern/alembic_capi.cc
+++ b/source/blender/alembic/intern/alembic_capi.cc
@@ -76,6 +76,8 @@ using Alembic::AbcGeom::IPolyMeshSchema;
 using Alembic::AbcGeom::ISampleSelector;
 using Alembic::AbcGeom::ISubD;
 using Alembic::AbcGeom::IXform;
+using Alembic::AbcGeom::IXformSchema;
+using Alembic::AbcGeom::XformSample;
 
 using Alembic::AbcMaterial::IMaterial;
 
@@ -559,3 +561,80 @@ void ABC_import(bContext *C, const char *filename, float scale)
 
 	WM_jobs_start(CTX_wm_manager(C), wm_job);
 }
+
+/* ******************************* */
+
+static IXform get_xform(const IObject &object,  const std::string &name, bool &found)
+{
+	if (!object.valid()) {
+		return IXform();
+	}
+
+	std::vector<std::string> tokens;
+	split(name, '/', tokens);
+
+	IObject tmp = object;
+
+	std::vector<std::string>::iterator iter;
+	for (iter = tokens.begin(); iter != tokens.end(); ++iter) {
+		IObject child = tmp.getChild(*iter);
+
+		if (!child.valid()) {
+			continue;
+		}
+
+		tmp = child;
+	}
+
+	if (!tmp.valid()) {
+		return IXform();
+	}
+
+	found = true;
+
+	const MetaData &md = tmp.getMetaData();
+
+	if (IXform::matches(md)) {
+		return IXform(tmp, kWrapExisting);
+	}
+
+	return IXform(tmp.getParent(), kWrapExisting);
+}
+
+void ABC_get_transform(Object *ob, const char *filename, const char *object_path, float r_mat[4][4], float time)
+{
+	IArchive archive = open_archive(filename);
+
+	if (!archive.valid()) {
+		return;
+	}
+
+	bool found = false;
+	const IXform ixform = get_xform(archive.getTop(), object_path, found);
+	const IXformSchema xform_schema = ixform.getSchema();
+
+	if (!found || !xform_schema.valid()) {
+		return;
+	}
+
+	XformSample xs;
+	ISampleSelector sample_sel(time);
+	xform_schema.get(xs, sample_sel);
+
+	Imath::M44d xform = xs.getMatrix();
+
+	for (int i = 0; i < 4; ++i) {
+		for(int j = 0; j < 4; ++j) {
+			r_mat[i][j] = xform[i][j];
+		}
+	}
+
+	if (ob->type == OB_CAMERA) {
+		float cam_to_yup[4][4];
+		unit_m4(cam_to_yup);
+		rotate_m4(cam_to_yup, 'X', M_PI_2);
+		mul_m4_m4m4(r_mat, r_mat, cam_to_yup);
+	}
+
+	create_transform_matrix(r_mat);
+}
diff --git a/source/blender/blenkernel/intern/constraint.c b/source/blender/blenkernel/intern/constraint.c
index a591d53..a730fdd 100644
--- a/source/blender/blenkernel/intern/constraint.c
+++ b/source/blender/blenkernel/intern/constraint.c
@@ -4333,6 +4333,41 @@ static bConstraintTypeInfo CTI_OBJECTSOLVER = {
 	objectsolver_evaluate /* evaluate */
 };
 
+/* ----------- Transform Cache ------------- */
+
+#ifdef WITH_ALEMBIC
+#include "ABC_alembic.h"
+#endif
+
+static void transformcache_evaluate(bConstraint *con, bConstraintOb *cob, ListBase *targets)
+{
+	bTransformCacheConstraint *data = con->data;
+	Scene *scene = cob->scene;
+
+	const float ctime = BKE_scene_frame_get(scene) / (float)scene->r.frs_sec;
+
+	printf("%s: time: %f\n", __func__, ctime);
+
+	ABC_get_transform(cob->ob, data->filepath, data->abc_object_path, cob->matrix, ctime);
+
+	UNUSED_VARS(targets);
+}
+
+static bConstraintTypeInfo CTI_TRANSFORMCACHE = {
+	CONSTRAINT_TYPE_TRANSFORMCACHE, /* type */
+	sizeof(bTransformCacheConstraint), /* size */
+	"Transform Cache", /* name */
+	"bTransformCacheConstraint", /* struct name */
+	NULL,  /* free data */
+	NULL,  /* id looper */
+	NULL,  /* copy data */
+	NULL,  /* new data */
+	NULL,  /* get constraint targets */
+	NULL,  /* flush constraint targets */
+	NULL,  /* get target matrix */
+	transformcache_evaluate  /* evaluate */
+};
+
 /* ************************* Constraints Type-Info *************************** */
 /* All of the constraints api functions use bConstraintTypeInfo structs to carry ou

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list