[Bf-blender-cvs] [02d6601] alembic: Use a flag to explicitly apply shape keys to either the goal positions or the motion state.

Lukas Tönne noreply at git.blender.org
Thu May 21 17:36:58 CEST 2015


Commit: 02d660165728b15653ddd247397d6fd03f1e30bd
Author: Lukas Tönne
Date:   Thu May 21 17:35:40 2015 +0200
Branches: alembic
https://developer.blender.org/rB02d660165728b15653ddd247397d6fd03f1e30bd

Use a flag to explicitly apply shape keys to either the goal positions
or the motion state.

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

M	release/scripts/startup/bl_ui/properties_object.py
M	source/blender/blenkernel/BKE_key.h
M	source/blender/blenkernel/intern/cache_library.c
M	source/blender/blenkernel/intern/key.c
M	source/blender/editors/io/io_cache_shapekey.c
M	source/blender/makesdna/DNA_cache_library_types.h
M	source/blender/makesrna/intern/rna_cache_library.c

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

diff --git a/release/scripts/startup/bl_ui/properties_object.py b/release/scripts/startup/bl_ui/properties_object.py
index f3f960d..d781e0d 100644
--- a/release/scripts/startup/bl_ui/properties_object.py
+++ b/release/scripts/startup/bl_ui/properties_object.py
@@ -600,6 +600,8 @@ class OBJECT_PT_cache_library(ObjectButtonsPanel, Panel):
         #sub.operator("object.shape_key_remove", icon='ZOOMOUT', text="").all = False
         sub.menu("CACHELIB_MT_shape_key_specials", icon='DOWNARROW_HLT', text="")
 
+        col.prop(md, "use_motion_state")
+
         if kb:
             col.separator()
 
diff --git a/source/blender/blenkernel/BKE_key.h b/source/blender/blenkernel/BKE_key.h
index cf8d2f8..c5769fd 100644
--- a/source/blender/blenkernel/BKE_key.h
+++ b/source/blender/blenkernel/BKE_key.h
@@ -73,7 +73,7 @@ float *BKE_key_evaluate_strands_ex(
         int *r_totelem, float *arr, size_t arr_size);
 float *BKE_key_evaluate_strands(
         struct Strands *strand, struct Key *key, struct KeyBlock *actkbs, bool lock_shape,
-        int *r_totelem, bool use_motion_basis);
+        int *r_totelem, bool use_motion);
 
 struct Key      *BKE_key_from_object(struct Object *ob);
 struct KeyBlock *BKE_keyblock_from_object(struct Object *ob);
@@ -114,9 +114,9 @@ void    BKE_keyblock_update_from_mesh(struct Mesh *me, struct KeyBlock *kb);
 void    BKE_keyblock_convert_from_mesh(struct Mesh *me, struct KeyBlock *kb);
 void    BKE_keyblock_convert_to_mesh(struct KeyBlock *kb, struct Mesh *me);
 
-void    BKE_keyblock_update_from_strands(struct Strands *strands, struct KeyBlock *kb);
-void    BKE_keyblock_convert_from_strands(struct Strands *strands, struct Key *key, struct KeyBlock *kb);
-void    BKE_keyblock_convert_to_strands(struct KeyBlock *kb, struct Strands *strands);
+void    BKE_keyblock_update_from_strands(struct Strands *strands, struct KeyBlock *kb, bool use_motion);
+void    BKE_keyblock_convert_from_strands(struct Strands *strands, struct Key *key, struct KeyBlock *kb, bool use_motion);
+void    BKE_keyblock_convert_to_strands(struct KeyBlock *kb, struct Strands *strands, bool use_motion);
 
 void    BKE_keyblock_update_from_vertcos(struct Object *ob, struct KeyBlock *kb, float (*vertCos)[3]);
 void    BKE_keyblock_convert_from_vertcos(struct Object *ob, struct KeyBlock *kb, float (*vertCos)[3]);
diff --git a/source/blender/blenkernel/intern/cache_library.c b/source/blender/blenkernel/intern/cache_library.c
index dbccbed..68e0a50 100644
--- a/source/blender/blenkernel/intern/cache_library.c
+++ b/source/blender/blenkernel/intern/cache_library.c
@@ -1518,6 +1518,7 @@ static void strandskey_foreach_id_link(StrandsKeyCacheModifier *skmd, CacheLibra
 
 static void strandskey_process(StrandsKeyCacheModifier *skmd, CacheProcessContext *UNUSED(ctx), CacheProcessData *data, int UNUSED(frame), int UNUSED(frame_prev), eCacheLibrary_EvalMode UNUSED(eval_mode))
 {
+	const bool use_motion = skmd->flag & eStrandsKeyCacheModifier_Flag_UseMotionState;
 	Object *ob = skmd->object;
 	Strands *strands;
 	KeyBlock *actkb;
@@ -1525,41 +1526,31 @@ static void strandskey_process(StrandsKeyCacheModifier *skmd, CacheProcessContex
 	
 	if (!BKE_cache_modifier_find_strands(data->dupcache, ob, skmd->hair_system, NULL, &strands, NULL))
 		return;
+	if (use_motion && !strands->state)
+		return;
 	
 	actkb = BLI_findlink(&skmd->key->block, skmd->shapenr);
-	shape = BKE_key_evaluate_strands(strands, skmd->key, actkb, skmd->flag & eStrandsKeyCacheModifier_Flag_ShapeLock, NULL, false);
+	shape = BKE_key_evaluate_strands(strands, skmd->key, actkb, skmd->flag & eStrandsKeyCacheModifier_Flag_ShapeLock, NULL, use_motion);
 	if (shape) {
 		StrandsVertex *vert = strands->verts;
+		StrandsMotionState *state = use_motion ? strands->state : NULL;
 		int totvert = strands->totverts;
 		int i;
 		
 		float *fp = shape;
 		for (i = 0; i < totvert; ++i) {
-			copy_v3_v3(vert->co, fp);
-			++vert;
-			fp += 3;
-		}
-		
-		MEM_freeN(shape);
-	}
-	
-	/* motion shape, if needed */
-	if (strands->state) {
-		shape = BKE_key_evaluate_strands(strands, skmd->key, actkb, skmd->flag & eStrandsKeyCacheModifier_Flag_ShapeLock, NULL, true);
-		if (shape) {
-			StrandsMotionState *state = strands->state;
-			int totvert = strands->totverts;
-			int i;
-			
-			float *fp = shape;
-			for (i = 0; i < totvert; ++i) {
+			if (state) {
 				copy_v3_v3(state->co, fp);
 				++state;
-				fp += 3;
 			}
-			
-			MEM_freeN(shape);
+			else {
+				copy_v3_v3(vert->co, fp);
+				++vert;
+			}
+			fp += 3;
 		}
+		
+		MEM_freeN(shape);
 	}
 }
 
@@ -1577,6 +1568,7 @@ CacheModifierTypeInfo cacheModifierType_StrandsKey = {
 
 KeyBlock *BKE_cache_modifier_strands_key_insert_key(StrandsKeyCacheModifier *skmd, Strands *strands, const char *name, const bool from_mix)
 {
+	const bool use_motion = skmd->flag & eStrandsKeyCacheModifier_Flag_UseMotionState;
 	Key *key = skmd->key;
 	KeyBlock *kb;
 	bool newkey = false;
@@ -1593,14 +1585,14 @@ KeyBlock *BKE_cache_modifier_strands_key_insert_key(StrandsKeyCacheModifier *skm
 	if (newkey || from_mix == false) {
 		/* create from mesh */
 		kb = BKE_keyblock_add_ctime(key, name, false);
-		BKE_keyblock_convert_from_strands(strands, key, kb);
+		BKE_keyblock_convert_from_strands(strands, key, kb, use_motion);
 	}
 	else {
 		/* copy from current values */
 		KeyBlock *actkb = BLI_findlink(&skmd->key->block, skmd->shapenr);
 		bool shape_lock = skmd->flag & eStrandsKeyCacheModifier_Flag_ShapeLock;
 		int totelem;
-		float *data = BKE_key_evaluate_strands(strands, key, actkb, shape_lock, &totelem, false);
+		float *data = BKE_key_evaluate_strands(strands, key, actkb, shape_lock, &totelem, use_motion);
 		
 		/* create new block with prepared data */
 		kb = BKE_keyblock_add_ctime(key, name, false);
diff --git a/source/blender/blenkernel/intern/key.c b/source/blender/blenkernel/intern/key.c
index c5f4da3..3bcb1bf 100644
--- a/source/blender/blenkernel/intern/key.c
+++ b/source/blender/blenkernel/intern/key.c
@@ -1866,7 +1866,7 @@ float *BKE_key_evaluate_strands_ex(Strands *strands, Key *key, KeyBlock *actkb,
 	return (float *)out;
 }
 
-float *BKE_key_evaluate_strands(Strands *strands, Key *key, KeyBlock *actkb, bool lock_shape, int *r_totelem, bool use_motion_basis)
+float *BKE_key_evaluate_strands(Strands *strands, Key *key, KeyBlock *actkb, bool lock_shape, int *r_totelem, bool use_motion)
 {
 	size_t size = sizeof(float) * 3 * strands->totverts;
 	float *data = MEM_mallocN(size, "strands shape key data");
@@ -1874,7 +1874,7 @@ float *BKE_key_evaluate_strands(Strands *strands, Key *key, KeyBlock *actkb, boo
 	float *fp;
 	int i;
 	
-	if (use_motion_basis && strands->state) {
+	if (use_motion && strands->state) {
 		for (i = 0, fp = data; i < strands->totverts; ++i, fp += 3)
 			copy_v3_v3(fp, strands->state[i].co);
 	}
@@ -2261,9 +2261,8 @@ void BKE_keyblock_convert_to_mesh(KeyBlock *kb, Mesh *me)
 }
 
 /************************* Strands ************************/
-void BKE_keyblock_update_from_strands(Strands *strands, KeyBlock *kb)
+void BKE_keyblock_update_from_strands(Strands *strands, KeyBlock *kb, bool use_motion)
 {
-	StrandsVertex *vert;
 	float (*fp)[3];
 	int a, tot;
 
@@ -2272,14 +2271,23 @@ void BKE_keyblock_update_from_strands(Strands *strands, KeyBlock *kb)
 	tot = strands->totverts;
 	if (tot == 0) return;
 
-	vert = strands->verts;
 	fp = kb->data;
-	for (a = 0; a < tot; a++, fp++, vert++) {
-		copy_v3_v3(*fp, vert->co);
+	/* use vertex locations as fallback, so we always get a valid shape */
+	if (use_motion && strands->state) {
+		StrandsMotionState *state = strands->state;
+		for (a = 0; a < tot; a++, fp++, state++) {
+			copy_v3_v3(*fp, state->co);
+		}
+	}
+	else {
+		StrandsVertex *vert = strands->verts;
+		for (a = 0; a < tot; a++, fp++, vert++) {
+			copy_v3_v3(*fp, vert->co);
+		}
 	}
 }
 
-void BKE_keyblock_convert_from_strands(Strands *strands, Key *key, KeyBlock *kb)
+void BKE_keyblock_convert_from_strands(Strands *strands, Key *key, KeyBlock *kb, bool use_motion)
 {
 	int tot = strands->totverts;
 
@@ -2290,22 +2298,31 @@ void BKE_keyblock_convert_from_strands(Strands *strands, Key *key, KeyBlock *kb)
 	kb->data = MEM_mallocN(key->elemsize * tot, __func__);
 	kb->totelem = tot;
 
-	BKE_keyblock_update_from_strands(strands, kb);
+	BKE_keyblock_update_from_strands(strands, kb, use_motion);
 }
 
-void BKE_keyblock_convert_to_strands(KeyBlock *kb, Strands *strands)
+void BKE_keyblock_convert_to_strands(KeyBlock *kb, Strands *strands, bool use_motion)
 {
-	StrandsVertex *vert;
 	const float (*fp)[3];
 	int a, tot;
 
-	vert = strands->verts;
 	fp = kb->data;
 
 	tot = min_ii(kb->totelem, strands->totverts);
 
-	for (a = 0; a < tot; a++, fp++, vert++) {
-		copy_v3_v3(vert->co, *fp);
+	if (use_motion) {
+		if (strands->state) {
+			StrandsMotionState *state = strands->state;
+			for (a = 0; a < tot; a++, fp++, state++) {
+				copy_v3_v3(state->co, *fp);
+			}
+		}
+	}
+	else {
+		StrandsVertex *vert = strands->verts;
+		for (a = 0; a < tot; a++, fp++, vert++) {
+			copy_v3_v3(vert->co, *fp);
+		}
 	}
 }
 
diff --git a/source/blender/editors/io/io_cache_shapekey.c b/source/blender/editors/io/io_cache_shapekey.c
index b9bcbf1..33490d8 100644
--- a/source/blender/editors/io/io_cache_shapekey.c
+++ b/source/blender/editors/io/io_cache_shapekey.c
@@ -134,7 +134,7 @@ static bool ED_cache_shape_key_remove(StrandsKeyCacheModifier *skmd, Strands *st
 	
 			if (key->refkey) {
 				/* apply new basis key on original data */
-				BKE_keyblock_convert_to_strands(key->refkey, strands);
+				BKE_keyblock_convert_to_strands(key->refkey, strands, skmd->flag & eStrandsKeyCacheModifier_Flag_UseMotionState);
 			}
 		}
 		
diff --git a/source/blender/makesdna/DNA_cache_library_types.h b/source/blender/makesdna/DNA_cache_library_types.h
index 9a16cee..4ae73e2 100644
--- a/source/blender/makesdna/DNA_cache_library_types.h
+++ b/source/blender/makesdna/DNA_cache_library_types.h
@@ -265,6 +265,7 @@ typedef struct StrandsKeyCacheModifier {
 
 typedef enum eStrandsKeyCacheModifier_Flag {
 	eStrandsKeyCacheModifier_Flag_ShapeLock             = (1 << 0),
+	eStrandsKeyCacheModifier_Flag_UseMotionState        = (1 << 1),
 } eStrandsKeyCacheModifier_Flag;
 
 #endif
diff --git a/source/blende

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list