[Bf-blender-cvs] [888b22b] alembic_basic_io: Add a deformVert callback to the modifier to handle curve streaming.

Kévin Dietrich noreply at git.blender.org
Tue May 31 17:54:09 CEST 2016


Commit: 888b22bc8758e93d520644cc038d184f3131386b
Author: Kévin Dietrich
Date:   Tue May 31 04:40:56 2016 +0200
Branches: alembic_basic_io
https://developer.blender.org/rB888b22bc8758e93d520644cc038d184f3131386b

Add a deformVert callback to the modifier to handle curve streaming.

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

M	source/blender/alembic/ABC_alembic.h
M	source/blender/alembic/intern/alembic_capi.cc
M	source/blender/modifiers/intern/MOD_meshsequencecache.c

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

diff --git a/source/blender/alembic/ABC_alembic.h b/source/blender/alembic/ABC_alembic.h
index 31065c0..a9b4299 100644
--- a/source/blender/alembic/ABC_alembic.h
+++ b/source/blender/alembic/ABC_alembic.h
@@ -63,7 +63,10 @@ int ABC_check_subobject_valid(const char *filepath, const char *object_path);
 
 void ABC_get_transform(struct Object *ob, const char *filepath, const char *object_path, float r_mat[4][4], float time);
 
-struct DerivedMesh *ABC_read_mesh(const char *filepath, const char *object_path, const float path);
+struct DerivedMesh *ABC_read_mesh(const char *filepath, const char *object_path, const float time);
+
+void ABC_read_vertex_cache(const char *filepath, const char *object_path, const float time,
+                           float (*vertexCos)[3], int max_verts);
 
 #ifdef __cplusplus
 }
diff --git a/source/blender/alembic/intern/alembic_capi.cc b/source/blender/alembic/intern/alembic_capi.cc
index 54bb6b6..5363f71 100644
--- a/source/blender/alembic/intern/alembic_capi.cc
+++ b/source/blender/alembic/intern/alembic_capi.cc
@@ -757,8 +757,8 @@ static DerivedMesh *read_points_sample(const IObject &iobject, const float time)
 	return dm;
 }
 
-#if 0
-DerivedMesh *read_curves_sample(const IObject &iobject, const float time)
+#if 1
+DerivedMesh *read_curves_sample(DerivedMesh *dm, const IObject &iobject, const float time)
 {
 	ICurves points(iobject, kWrapExisting);
 	ICurvesSchema schema = points.getSchema();
@@ -768,7 +768,10 @@ DerivedMesh *read_curves_sample(const IObject &iobject, const float time)
 	const P3fArraySamplePtr &positions = sample.getPositions();
 
 	const size_t num_verts = positions->size();
-	DerivedMesh *dm = CDDM_new(num_verts, 0, 0, 0, 0);
+
+	if (num_verts != dm->getNumVerts(dm)) {
+		return dm;
+	}
 
 	MVert *mverts = dm->getVertArray(dm);
 
@@ -778,6 +781,26 @@ DerivedMesh *read_curves_sample(const IObject &iobject, const float time)
 }
 #endif
 
+void read_curves_sample(float (*vertexCos)[3], int max_verts, const IObject &iobject, const float time)
+{
+	ICurves points(iobject, kWrapExisting);
+	ICurvesSchema schema = points.getSchema();
+	ISampleSelector sample_sel(time);
+	const ICurvesSchema::Sample sample = schema.getValue(sample_sel);
+
+	const P3fArraySamplePtr &positions = sample.getPositions();
+
+	for (int i = 0; i < min_ff(max_verts, positions->size()); ++i) {
+		float *vert = vertexCos[i];
+		Imath::V3f pos_in = (*positions)[i];
+
+		/* Convert Y-up to Z-up. */
+		vert[0] = pos_in[0];
+		vert[1] = -pos_in[2];
+		vert[2] = pos_in[1];
+	}
+}
+
 DerivedMesh *ABC_read_mesh(const char *filepath, const char *object_path, const float time)
 {
 	IArchive archive = open_archive(filepath);
@@ -802,11 +825,30 @@ DerivedMesh *ABC_read_mesh(const char *filepath, const char *object_path, const
 	else if (IPoints::matches(header)) {
 		return read_points_sample(iobject, time);
 	}
-#if 0
-	else if (ICurves::matches(header)) {
-		return read_curves_sample(iobject, time);
-	}
-#endif
 
 	return NULL;
 }
+
+void ABC_read_vertex_cache(const char *filepath, const char *object_path, const float time,
+                           float (*vertexCos)[3], int max_verts)
+{
+	IArchive archive = open_archive(filepath);
+
+	if (!archive.valid()) {
+		return;
+	}
+
+	IObject iobject;
+
+	find_object(archive.getTop(), iobject, object_path);
+
+	if (!iobject.valid()) {
+		return;
+	}
+
+	const Alembic::Abc::ObjectHeader &header = iobject.getHeader();
+
+	if (ICurves::matches(header)) {
+		return read_curves_sample(vertexCos, max_verts, iobject, time);
+	}
+}
diff --git a/source/blender/modifiers/intern/MOD_meshsequencecache.c b/source/blender/modifiers/intern/MOD_meshsequencecache.c
index 4439f46..7443513 100644
--- a/source/blender/modifiers/intern/MOD_meshsequencecache.c
+++ b/source/blender/modifiers/intern/MOD_meshsequencecache.c
@@ -106,6 +106,44 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob,
 #endif
 }
 
+static void deformVerts(ModifierData *md, Object *ob,
+                        DerivedMesh *derivedData,
+                        float (*vertexCos)[3],
+                        int numVerts,
+                        ModifierApplyFlag flag)
+{
+	MeshSeqCacheModifierData *mcmd = (MeshSeqCacheModifierData *) md;
+
+	Scene *scene = md->scene;
+	const float frame = BKE_scene_frame_get(scene);
+	const float time = frame / FPS;
+
+	char filepath[1024];
+	BLI_strncpy(filepath, mcmd->filepath, 1024);
+
+	int fframe;
+	int frame_len;
+
+	if (BLI_path_frame_get(filepath, &fframe, &frame_len)) {
+		char ext[32];
+		BLI_path_frame_strip(filepath, true, ext);
+		BLI_path_frame(filepath, frame, frame_len);
+		BLI_ensure_extension(filepath, 1024, ext);
+
+		if (!BLI_exists(filepath)) {
+			return;
+		}
+	}
+
+	ABC_read_vertex_cache(filepath,
+	                      mcmd->abc_object_path,
+                          time,
+	                      vertexCos,
+	                      numVerts);
+
+	UNUSED_VARS(ob, derivedData, flag);
+}
+
 static bool dependsOnTime(ModifierData *md)
 {
 	UNUSED_VARS(md);
@@ -116,10 +154,11 @@ ModifierTypeInfo modifierType_MeshSequenceCache = {
     /* name */              "Mesh Cache Seq",
     /* structName */        "MeshSeqCacheModifierData",
     /* structSize */        sizeof(MeshSeqCacheModifierData),
-    /* type */              eModifierTypeType_Nonconstructive,
-    /* flags */             eModifierTypeFlag_AcceptsMesh | eModifierTypeFlag_Single,
+    /* type */              eModifierTypeType_DeformOrConstruct,
+    /* flags */             eModifierTypeFlag_AcceptsMesh |
+                            eModifierTypeFlag_AcceptsCVs,
     /* copyData */          copyData,
-    /* deformVerts */       NULL,
+    /* deformVerts */       deformVerts,
     /* deformMatrices */    NULL,
     /* deformVertsEM */     NULL,
     /* deformMatricesEM */  NULL,




More information about the Bf-blender-cvs mailing list