Sculptmode now works properly with shape keys (Merry Christmas.) Fixes bug #5499, Sculpt mode don't works correctly with Shape Key.

This commit is contained in:
2006-12-25 19:11:20 +00:00
parent a2b3eb56f2
commit 6b64ccdca1
5 changed files with 48 additions and 10 deletions

View File

@@ -63,6 +63,8 @@
#include "BLI_blenlib.h"
#include "blendef.h"
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
@@ -1302,6 +1304,11 @@ int do_ob_key(Object *ob)
if(key==NULL)
return 0;
/* Don't apply key for sculptmode */
if(key==NULL || ((G.f & G_SCULPTMODE) && !G.obedit && ob==OBACT))
return 0;
if(ob->shapeflag & (OB_SHAPE_LOCK|OB_SHAPE_TEMPLOCK)) {
KeyBlock *kb= BLI_findlink(&key->block, ob->shapenr-1);

View File

@@ -3134,6 +3134,7 @@ static void direct_link_scene(FileData *fd, Scene *sce)
sce->toolsettings= newdataadr(fd, sce->toolsettings);
sce->sculptdata.session= NULL;
/* SculptData textures */
for(a=0; a<MAX_MTEX; ++a)
sce->sculptdata.mtex[a]= newdataadr(fd,sce->sculptdata.mtex[a]);

View File

@@ -33,7 +33,7 @@
struct uiBlock;
struct BrushData;
struct IndexNode;
struct Key;
struct KeyBlock;
struct Mesh;
struct Object;
struct PartialVisibility;
@@ -59,6 +59,8 @@ typedef struct PropsetData {
} PropsetData;
typedef struct SculptSession {
struct Object *active_ob;
/* Cache of the OpenGL matrices */
double modelviewmat[16];
double projectionmat[16];
@@ -82,7 +84,7 @@ typedef struct SculptSession {
/* For rotating around a pivot point */
vec3f pivot;
struct Key *key;
struct KeyBlock *keyblock;
} SculptSession;
SculptSession *sculpt_session();

View File

@@ -600,9 +600,11 @@ void do_common_editbuts(unsigned short event) // old name, is a mix of object an
case B_ADDKEY:
insert_shapekey(ob);
set_sculpt_object(ob);
break;
case B_SETKEY:
ob->shapeflag |= OB_SHAPE_TEMPLOCK;
set_sculpt_object(ob);
DAG_object_flush_update(G.scene, ob, OB_RECALC_DATA);
allqueue(REDRAWVIEW3D, 0);
allqueue(REDRAWIPO, 0);
@@ -610,6 +612,7 @@ void do_common_editbuts(unsigned short event) // old name, is a mix of object an
break;
case B_LOCKKEY:
ob->shapeflag &= ~OB_SHAPE_TEMPLOCK;
set_sculpt_object(ob);
DAG_object_flush_update(G.scene, ob, OB_RECALC_DATA);
allqueue(REDRAWVIEW3D, 0);
allqueue(REDRAWIPO, 0);
@@ -621,6 +624,7 @@ void do_common_editbuts(unsigned short event) // old name, is a mix of object an
if(ob->shapenr == BLI_countlist(&key->block))
ob->shapenr= 1;
else ob->shapenr++;
set_sculpt_object(ob);
do_common_editbuts(B_SETKEY);
break;
}
@@ -630,6 +634,7 @@ void do_common_editbuts(unsigned short event) // old name, is a mix of object an
if(ob->shapenr <= 1)
ob->shapenr= BLI_countlist(&key->block);
else ob->shapenr--;
set_sculpt_object(ob);
do_common_editbuts(B_SETKEY);
break;
}
@@ -638,7 +643,9 @@ void do_common_editbuts(unsigned short event) // old name, is a mix of object an
allqueue (REDRAWIPO, 0);
break;
case B_DELKEY:
set_sculpt_object(NULL);
delete_key(OBACT);
set_sculpt_object(ob);
allqueue(REDRAWACTION, 0);
break;

View File

@@ -194,9 +194,11 @@ void sculptmode_init(Scene *sce)
sd->tablet_strength=10;
}
void sculptmode_undo_init();
void sculpt_init_session()
{
sculpt_data()->session= MEM_callocN(sizeof(SculptSession), "SculptSession");
sculptmode_undo_init();
}
/* Free G.sculptdata->vertexusers */
@@ -595,8 +597,31 @@ void calc_vertex_users()
void set_sculpt_object(Object *ob)
{
if(ob)
calc_vertex_users();
SculptSession *ss= sculpt_session();
if(ss) {
if(ss->keyblock) {
Mesh *me= get_mesh(ss->active_ob);
if(me) {
mesh_to_key(me, ss->keyblock);
DAG_object_flush_update(G.scene, ss->active_ob, OB_RECALC_DATA);
}
}
if(ob) {
Mesh *me= get_mesh(ob);
calc_vertex_users();
/* Load in key */
ss->keyblock= ob_get_keyblock(ob);
if(ss->keyblock)
key_to_mesh(ss->keyblock, me);
DAG_object_flush_update(G.scene, ob, OB_RECALC_DATA);
}
ss->active_ob= ob;
}
}
/* ===== INTERFACE =====
@@ -1597,8 +1622,8 @@ void sculptmode_draw_mesh(int only_damaged) {
void sculptmode_correct_state()
{
//if(get_mesh( != get_mesh(OBACT))
//set_sculpt_object(OBACT);
if(get_mesh(sculpt_session()->active_ob) != get_mesh(OBACT))
set_sculpt_object(OBACT);
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_NORMAL_ARRAY);
@@ -1823,8 +1848,6 @@ void set_sculptmode()
set_sculpt_object(NULL);
sculptmode_free_session(G.scene);
DAG_object_flush_update(G.scene, OBACT, OB_RECALC_DATA);
} else {
G.f |= G_SCULPTMODE;
@@ -1835,8 +1858,6 @@ void set_sculptmode()
sculpt_init_session();
set_sculpt_object(OBACT);
sculptmode_undo_init();
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_NORMAL_ARRAY);