[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