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. @@

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to