[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