[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [24059] trunk/blender: Shape Keys

Brecht Van Lommel brecht at blender.org
Thu Oct 22 18:35:51 CEST 2009


Revision: 24059
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=24059
Author:   blendix
Date:     2009-10-22 18:35:51 +0200 (Thu, 22 Oct 2009)

Log Message:
-----------
Shape Keys

Blended shape keys can now be displayed & edited in edit mode. This
is much like showing an armature modifier in edit mode, and shape keys
now are a applied as a virtual modifier (for mesh & lattice only, curve
doesn't fit in the stack well due to tilt).

The main thing missing still is being able to switch between the active
shape key in edit mode, that's more complicated.. but the weights of
other shapes can be edited while in edit mode.

One thing to be careful about is that this does automatic crazyspace
correction, which means that if you edit a shape key with a low value,
the actual vertices will be moved to correct for that and actually move
a (potentially much) longer distance.

Also includes some UI tweaks, mainly placing some buttons horizontally
since the vertical list was getting too long.

Modified Paths:
--------------
    trunk/blender/release/scripts/ui/buttons_data_mesh.py
    trunk/blender/source/blender/blenkernel/BKE_key.h
    trunk/blender/source/blender/blenkernel/BKE_modifier.h
    trunk/blender/source/blender/blenkernel/intern/DerivedMesh.c
    trunk/blender/source/blender/blenkernel/intern/displist.c
    trunk/blender/source/blender/blenkernel/intern/key.c
    trunk/blender/source/blender/blenkernel/intern/lattice.c
    trunk/blender/source/blender/blenkernel/intern/modifier.c
    trunk/blender/source/blender/blenkernel/intern/particle.c
    trunk/blender/source/blender/editors/interface/interface_layout.c
    trunk/blender/source/blender/editors/interface/interface_templates.c
    trunk/blender/source/blender/editors/object/object_shapekey.c
    trunk/blender/source/blender/editors/transform/transform_conversions.c
    trunk/blender/source/blender/makesdna/DNA_modifier_types.h
    trunk/blender/source/blender/makesdna/DNA_object_types.h
    trunk/blender/source/blender/makesrna/intern/rna_object.c
    trunk/blender/source/blender/makesrna/intern/rna_ui.c
    trunk/blender/source/gameengine/Converter/BL_ShapeDeformer.cpp

Modified: trunk/blender/release/scripts/ui/buttons_data_mesh.py
===================================================================
--- trunk/blender/release/scripts/ui/buttons_data_mesh.py	2009-10-22 16:21:06 UTC (rev 24058)
+++ trunk/blender/release/scripts/ui/buttons_data_mesh.py	2009-10-22 16:35:51 UTC (rev 24059)
@@ -71,9 +71,14 @@
 		layout = self.layout
 		
 		ob = context.object
+		group = ob.active_vertex_group
 
+		rows = 2
+		if group:
+			rows= 5
+
 		row = layout.row()
-		row.template_list(ob, "vertex_groups", ob, "active_vertex_group_index", rows=2)
+		row.template_list(ob, "vertex_groups", ob, "active_vertex_group_index", rows=rows)
 
 		col = row.column(align=True)
 		col.itemO("object.vertex_group_add", icon='ICON_ZOOMIN', text="")
@@ -83,7 +88,6 @@
 		if ob.data.users > 1:
 			col.itemO("object.vertex_group_copy_to_linked", icon='ICON_LINK_AREA', text="")
 
-		group = ob.active_vertex_group
 		if group:
 			row = layout.row()
 			row.itemR(group, "name")
@@ -114,9 +118,20 @@
 		key = ob.data.shape_keys
 		kb = ob.active_shape_key
 
+		enable_edit = ob.mode != 'EDIT'
+		enable_edit_value = False
+
+		if ob.shape_key_lock == False:
+			if enable_edit or (ob.type == 'MESH' and ob.shape_key_edit_mode):
+				enable_edit_value = True
+
 		row = layout.row()
-		row.template_list(key, "keys", ob, "active_shape_key_index", rows=2)
 
+		rows = 2
+		if kb:
+			rows= 5
+		row.template_list(key, "keys", ob, "active_shape_key_index", rows=rows)
+
 		col = row.column()
 
 		subcol = col.column(align=True)
@@ -124,57 +139,57 @@
 		subcol.itemO("object.shape_key_remove", icon='ICON_ZOOMOUT', text="")
 
 		if kb:
-			subcol.itemO("object.shape_key_mirror", icon='ICON_MOD_MIRROR', text="")
-			
 			col.itemS()
 
 			subcol = col.column(align=True)
 			subcol.item_enumO("object.shape_key_move", "type", 'UP', icon='ICON_TRIA_UP', text="")
 			subcol.item_enumO("object.shape_key_move", "type", 'DOWN', icon='ICON_TRIA_DOWN', text="")
-			
-			col.itemS()
 
-			subcol = col.column(align=True)
-			subcol.itemR(ob, "shape_key_lock", icon='ICON_UNPINNED', text="")
-			subcol.itemR(kb, "mute", icon='ICON_MUTE_IPO_OFF', text="")
+			split = layout.split(percentage=0.4)
+			sub = split.row()
+			sub.enabled = enable_edit
+			sub.itemR(key, "relative")
 
-			if key.relative:
-				row = layout.row()
-				row.itemR(key, "relative")
-				row.itemL()
+			sub = split.row()
+			sub.alignment = 'RIGHT'
 
-				row = layout.row()
-				row.itemR(kb, "name")
+			subrow = sub.row(align=True)
+			subrow.itemR(ob, "shape_key_lock", icon='ICON_UNPINNED', text="")
+			subrow.itemR(kb, "mute", icon='ICON_MUTE_IPO_OFF', text="")
+			subrow.itemO("object.shape_key_clear", icon='ICON_X', text="")
 
+			sub.itemO("object.shape_key_mirror", icon='ICON_MOD_MIRROR', text="")
+
+			sub.itemR(ob, "shape_key_edit_mode", text="")
+
+			row = layout.row()
+			row.enabled = enable_edit_value
+			row.itemR(kb, "name")
+
+			if key.relative:
 				if ob.active_shape_key_index != 0:
-					
 					row = layout.row()
-					row.enabled = ob.shape_key_lock == False
+					row.enabled = enable_edit_value
 					row.itemR(kb, "value")
-					row.itemO("object.shape_key_clear", icon='ICON_X', text="")
 					
 					split = layout.split()
 					sub = split.column(align=True)
-					sub.enabled = ob.shape_key_lock == False
+					sub.enabled = enable_edit_value
 					sub.itemL(text="Range:")
 					sub.itemR(kb, "slider_min", text="Min")
 					sub.itemR(kb, "slider_max", text="Max")
 					
 					sub = split.column(align=True)
+					sub.enabled = enable_edit_value
 					sub.itemL(text="Blend:")
 					sub.item_pointerR(kb, "vertex_group", ob, "vertex_groups", text="")
 					sub.item_pointerR(kb, "relative_key", key, "keys", text="")
 					
 			else:
 				row = layout.row()
-				row.itemR(key, "relative")
+				row.enabled = enable_edit
 				row.itemR(key, "slurph")
 
-				layout.itemR(kb, "name")
-
-		if ob.mode == 'EDIT':
-			layout.enabled = False
-
 class DATA_PT_uv_texture(DataButtonsPanel):
 	__label__ = "UV Texture"
 	

Modified: trunk/blender/source/blender/blenkernel/BKE_key.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_key.h	2009-10-22 16:21:06 UTC (rev 24058)
+++ trunk/blender/source/blender/blenkernel/BKE_key.h	2009-10-22 16:35:51 UTC (rev 24059)
@@ -64,7 +64,7 @@
 struct KeyBlock *key_get_named_keyblock(struct Key *key, const char name[]);
 char *key_get_curValue_rnaPath(struct Key *key, struct KeyBlock *kb);
 // needed for the GE
-void do_rel_key(int start, int end, int tot, char *basispoin, struct Key *key, int mode);
+void do_rel_key(int start, int end, int tot, char *basispoin, struct Key *key, struct KeyBlock *actkb, int mode);
 
 #ifdef __cplusplus
 };

Modified: trunk/blender/source/blender/blenkernel/BKE_modifier.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_modifier.h	2009-10-22 16:21:06 UTC (rev 24058)
+++ trunk/blender/source/blender/blenkernel/BKE_modifier.h	2009-10-22 16:35:51 UTC (rev 24059)
@@ -293,7 +293,7 @@
 struct ModifierData  *modifiers_findByType(struct Object *ob, ModifierType type);
 void          modifiers_clearErrors(struct Object *ob);
 int           modifiers_getCageIndex(struct Object *ob,
-                                     int *lastPossibleCageIndex_r);
+                                     int *lastPossibleCageIndex_r, int virtual_);
 
 int           modifiers_isSoftbodyEnabled(struct Object *ob);
 int           modifiers_isClothEnabled(struct Object *ob);

Modified: trunk/blender/source/blender/blenkernel/intern/DerivedMesh.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/DerivedMesh.c	2009-10-22 16:21:06 UTC (rev 24058)
+++ trunk/blender/source/blender/blenkernel/intern/DerivedMesh.c	2009-10-22 16:35:51 UTC (rev 24059)
@@ -1755,9 +1755,7 @@
 	*final_r = NULL;
 
 	if(useDeform) {
-		if(useDeform > 0)
-			deformedVerts= (float(*)[3])do_ob_key(scene, ob); /* shape key makes deform verts */
-		else if(inputVertexCos)
+		if(inputVertexCos)
 			deformedVerts = inputVertexCos;
 		
 		/* Apply all leading deforming modifiers */
@@ -2013,7 +2011,7 @@
 	float (*deformedVerts)[3] = NULL;
 	CustomDataMask mask;
 	DerivedMesh *dm, *orcodm = NULL;
-	int i, numVerts = 0, cageIndex = modifiers_getCageIndex(ob, NULL);
+	int i, numVerts = 0, cageIndex = modifiers_getCageIndex(ob, NULL, 1);
 	LinkNode *datamasks, *curr;
 	int required_mode = eModifierMode_Realtime | eModifierMode_Editmode;
 
@@ -2024,16 +2022,13 @@
 	}
 
 	dm = NULL;
-	md = ob->modifiers.first;
+	md = modifiers_getVirtualModifierList(ob);
 	
 	/* we always want to keep original indices */
 	dataMask |= CD_MASK_ORIGINDEX;
 
 	datamasks = modifiers_calcDataMasks(ob, md, dataMask, required_mode);
 
-	/* doesn't work, shape keys are not updated from editmesh.
-	   deformedVerts= (float(*)[3])do_ob_key(scene, ob); */
-
 	curr = datamasks;
 	for(i = 0; md; i++, md = md->next, curr = curr->next) {
 		ModifierTypeInfo *mti = modifierType_getInfo(md->type);
@@ -2463,13 +2458,13 @@
 	ModifierData *md;
 	DerivedMesh *dm;
 	int i, a, numleft = 0, numVerts = 0;
-	int cageIndex = modifiers_getCageIndex(ob, NULL);
+	int cageIndex = modifiers_getCageIndex(ob, NULL, 1);
 	float (*defmats)[3][3] = NULL, (*deformedVerts)[3] = NULL;
 
 	modifiers_clearErrors(ob);
 
 	dm = NULL;
-	md = ob->modifiers.first;
+	md = modifiers_getVirtualModifierList(ob);
 
 	/* compute the deformation matrices and coordinates for the first
 	   modifiers with on cage editing that are enabled and support computing

Modified: trunk/blender/source/blender/blenkernel/intern/displist.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/displist.c	2009-10-22 16:21:06 UTC (rev 24058)
+++ trunk/blender/source/blender/blenkernel/intern/displist.c	2009-10-22 16:35:51 UTC (rev 24059)
@@ -1260,7 +1260,9 @@
 
 		if(keyVerts) {
 			/* split coords from key data, the latter also includes
-			   tilts, which is passed through in the modifier stack */
+			   tilts, which is passed through in the modifier stack.
+			   this is also the reason curves do not use a virtual
+			   shape key modifier yet. */
 			deformedVerts= curve_getKeyVertexCos(cu, nurb, keyVerts);
 			originalVerts= MEM_dupallocN(deformedVerts);
 		}

Modified: trunk/blender/source/blender/blenkernel/intern/key.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/key.c	2009-10-22 16:21:06 UTC (rev 24058)
+++ trunk/blender/source/blender/blenkernel/intern/key.c	2009-10-22 16:35:51 UTC (rev 24059)
@@ -36,6 +36,7 @@
 #include "MEM_guardedalloc.h"
 
 #include "BLI_blenlib.h"
+#include "BLI_editVert.h"
 
 #include "DNA_anim_types.h"
 #include "DNA_curve_types.h"
@@ -497,38 +498,41 @@
 	}
 }
 
-static void *key_block_get_data(Key *key, KeyBlock *kb)
+static char *key_block_get_data(Key *key, KeyBlock *actkb, KeyBlock *kb, char **freedata)
 {
-	/* editmode shape key apply test */
-#if 0
-	EditVert *eve;
-	Mesh *me;
-	float (*co)[3];
-	int a;
+	if(kb == actkb) {
+		/* this hack makes it possible to edit shape keys in
+		   edit mode with shape keys blending applied */
+		if(GS(key->from->name) == ID_ME) {
+			Mesh *me;
+			EditVert *eve;
+			float (*co)[3];
+			int a;
 
-	if(kb != key->refkey) {
-		if(GS(key->from->name) == ID_ME) {
 			me= (Mesh*)key->from;
 
-			if(me->edit_mesh) {
+			if(me->edit_mesh && me->edit_mesh->totvert == kb->totelem) {
 				a= 0;
-				co= kb->data;
+				co= MEM_callocN(sizeof(float)*3*me->edit_mesh->totvert, "key_block_get_data");
 
 				for(eve=me->edit_mesh->verts.first; eve; eve=eve->next, a++)
 					VECCOPY(co[a], eve->co);
+
+				*freedata= (char*)co;
+				return (char*)co;
 			}
 		}
 	}
-#endif
 
+	*freedata= NULL;
 	return kb->data;
 }
 
-static void cp_key(int start, int end, int tot, char *poin, Key *key, KeyBlock *kb, float *weights, int mode)
+static void cp_key(int start, int end, int tot, char *poin, Key *key, KeyBlock *actkb, KeyBlock *kb, float *weights, int mode)
 {
 	float ktot = 0.0, kd = 0.0;
 	int elemsize, poinsize = 0, a, *ofsp, ofs[32], flagflo=0;
-	char *k1, *kref;
+	char *k1, *kref, *freek1, *freekref;
 	char *cp, elemstr[8];
 
 	if(key->from==NULL) return;
@@ -553,9 +557,6 @@
 
 	if(end>tot) end= tot;
 	
-	k1= key_block_get_data(key, kb);
-	kref= key_block_get_data(key, key->refkey);
-	
 	if(tot != kb->totelem) {

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list