- Enable shape key switching in edit mode for curves, surfaces and latticies

- Disable changing of lattice size if there are shape keys
This commit is contained in:
Sergey Sharybin 2010-08-10 06:36:42 +00:00
parent 41531e4fb6
commit c0e39df6ac
22 changed files with 207 additions and 124 deletions

@ -225,8 +225,12 @@ void free_lattice(Lattice *lt)
if(lt->def) MEM_freeN(lt->def);
if(lt->dvert) free_dverts(lt->dvert, lt->pntsu*lt->pntsv*lt->pntsw);
if(lt->editlatt) {
if(lt->editlatt->def) MEM_freeN(lt->editlatt->def);
if(lt->editlatt->dvert) free_dverts(lt->editlatt->dvert, lt->pntsu*lt->pntsv*lt->pntsw);
Lattice *editlt= lt->editlatt->latt;
if(editlt->def) MEM_freeN(editlt->def);
if(editlt->dvert) free_dverts(editlt->dvert, lt->pntsu*lt->pntsv*lt->pntsw);
MEM_freeN(editlt);
MEM_freeN(lt->editlatt);
}
}
@ -295,7 +299,7 @@ void init_latt_deform(Object *oblatt, Object *ob)
float fu, fv, fw;
int u, v, w;
if(lt->editlatt) lt= lt->editlatt;
if(lt->editlatt) lt= lt->editlatt->latt;
bp = lt->def;
fp= lt->latticedata= MEM_mallocN(sizeof(float)*3*lt->pntsu*lt->pntsv*lt->pntsw, "latticedata");
@ -350,7 +354,7 @@ void calc_latt_deform(Object *ob, float *co, float weight)
MDeformVert *dvert= lattice_get_deform_verts(ob);
if(lt->editlatt) lt= lt->editlatt;
if(lt->editlatt) lt= lt->editlatt->latt;
if(lt->latticedata==NULL) return;
if(lt->vgroup[0] && dvert) {
@ -446,7 +450,7 @@ void end_latt_deform(Object *ob)
{
Lattice *lt= ob->data;
if(lt->editlatt) lt= lt->editlatt;
if(lt->editlatt) lt= lt->editlatt->latt;
if(lt->latticedata)
MEM_freeN(lt->latticedata);
@ -1002,7 +1006,7 @@ float (*lattice_getVertexCos(struct Object *ob, int *numVerts_r))[3]
int i, numVerts;
float (*vertexCos)[3];
if(lt->editlatt) lt= lt->editlatt;
if(lt->editlatt) lt= lt->editlatt->latt;
numVerts = *numVerts_r = lt->pntsu*lt->pntsv*lt->pntsw;
vertexCos = MEM_mallocN(sizeof(*vertexCos)*numVerts,"lt_vcos");
@ -1066,7 +1070,7 @@ struct MDeformVert* lattice_get_deform_verts(struct Object *oblatt)
if(oblatt->type == OB_LATTICE)
{
Lattice *lt = (Lattice*)oblatt->data;
if(lt->editlatt) lt= lt->editlatt;
if(lt->editlatt) lt= lt->editlatt->latt;
return lt->dvert;
}

@ -1917,7 +1917,7 @@ static void give_parvert(Object *par, int nr, float *vec)
DispList *dl = find_displist(&par->disp, DL_VERTS);
float *co = dl?dl->verts:NULL;
if(latt->editlatt) latt= latt->editlatt;
if(latt->editlatt) latt= latt->editlatt->latt;
a= latt->pntsu*latt->pntsv*latt->pntsw;
count= 0;

@ -724,7 +724,7 @@ static void calc_shapeKeys(Object *obedit)
int a, i, j;
EditNurb *editnurb= cu->editnurb;
KeyBlock *currkey;
KeyBlock *actkey= ob_get_keyblock(obedit);
KeyBlock *actkey= BLI_findlink(&cu->key->block, editnurb->shapenr-1);
BezTriple *bezt, *oldbezt;
BPoint *bp, *oldbp;
Nurb *nu;
@ -738,7 +738,7 @@ static void calc_shapeKeys(Object *obedit)
int act_is_basis = 0;
/* find if this key is a basis for any others */
for(currkey = cu->key->block.first; currkey; currkey= currkey->next) {
if(obedit->shapenr-1 == currkey->relative) {
if(editnurb->shapenr-1 == currkey->relative) {
act_is_basis = 1;
break;
}
@ -806,7 +806,7 @@ static void calc_shapeKeys(Object *obedit)
currkey = cu->key->block.first;
while(currkey) {
int apply_offset = (ofs && (currkey != actkey) && (obedit->shapenr-1 == currkey->relative));
int apply_offset = (ofs && (currkey != actkey) && (editnurb->shapenr-1 == currkey->relative));
fp= newkey= MEM_callocN(cu->key->elemsize * totvert, "currkey->data");
ofp= oldkey = currkey->data;
@ -1035,6 +1035,7 @@ void make_editNurb(Object *obedit)
}
if(actkey) {
editnurb->shapenr= obedit->shapenr;
init_editNurb_keyIndex(editnurb, &cu->nurb);
}
}

@ -0,0 +1,33 @@
/**
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software Foundation,
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
* The Original Code is Copyright (C) 2008 Blender Foundation.
* All rights reserved.
*
*
* Contributor(s): Blender Foundation
*
* ***** END GPL LICENSE BLOCK *****
*/
struct Object;
void free_editLatt(struct Object *ob);
void make_editLatt(struct Object *obedit);
void load_editLatt(struct Object *obedit);

@ -2097,12 +2097,6 @@ static void list_item_row(bContext *C, uiLayout *layout, PointerRNA *ptr, Pointe
/* list item behind label & other buttons */
sub= uiLayoutRow(overlap, 0);
if(itemptr->type == &RNA_ShapeKey) {
ob= (Object*)activeptr->data;
if(ob->mode == OB_MODE_EDIT && !(ob->type == OB_MESH))
uiLayoutSetEnabled(sub, 0);
}
but= uiDefButR(block, LISTROW, 0, "", 0,0, UI_UNIT_X*10,UI_UNIT_Y, activeptr, activepropname, 0, 0, i, 0, 0, "");
uiButSetFlag(but, UI_BUT_NO_TOOLTIP);

@ -78,6 +78,7 @@
#include "ED_curve.h"
#include "ED_mesh.h"
#include "ED_mball.h"
#include "ED_lattice.h"
#include "ED_object.h"
#include "ED_screen.h"
#include "ED_util.h"
@ -938,8 +939,9 @@ void special_editmenu(Scene *scene, View3D *v3d)
static float weight= 1.0f;
{ // XXX
// XXX if(fbutton(&weight, 0.0f, 1.0f, 10, 10, "Set Weight")) {
int a= lt->editlatt->pntsu*lt->editlatt->pntsv*lt->editlatt->pntsw;
BPoint *bp= lt->editlatt->def;
Lattice *editlt= lt->editlatt->latt;
int a= editlt->pntsu*editlt->pntsv*editlt->pntsw;
BPoint *bp= editlt->def;
while(a--) {
if(bp->f1 & SELECT)

@ -191,13 +191,14 @@ static int return_editlattice_indexar(Lattice *editlatt, int *tot, int **indexar
static void select_editlattice_hook(Object *obedit, HookModifierData *hmd)
{
Lattice *lt= obedit->data;
Lattice *lt= obedit->data, *editlt;
BPoint *bp;
int index=0, nr=0, a;
editlt= lt->editlatt->latt;
/* count */
a= lt->editlatt->pntsu*lt->editlatt->pntsv*lt->editlatt->pntsw;
bp= lt->editlatt->def;
a= editlt->pntsu*editlt->pntsv*editlt->pntsw;
bp= editlt->def;
while(a--) {
if(hmd->indexar[index]==nr) {
bp->f1 |= SELECT;
@ -313,7 +314,7 @@ static int object_hook_index_array(Object *obedit, int *tot, int **indexar, char
case OB_LATTICE:
{
Lattice *lt= obedit->data;
return return_editlattice_indexar(lt->editlatt, tot, indexar, cent_r);
return return_editlattice_indexar(lt->editlatt->latt, tot, indexar, cent_r);
}
default:
return 0;

@ -131,11 +131,6 @@ void OBJECT_OT_hook_reset(struct wmOperatorType *ot);
void OBJECT_OT_hook_recenter(struct wmOperatorType *ot);
/* object_lattice.c */
void free_editLatt(struct Object *ob);
void make_editLatt(struct Object *obedit);
void load_editLatt(struct Object *obedit);
void remake_editLatt(struct Object *obedit);
void LATTICE_OT_select_all(struct wmOperatorType *ot);
void LATTICE_OT_make_regular(struct wmOperatorType *ot);

@ -46,6 +46,8 @@
#include "BKE_lattice.h"
#include "BKE_mesh.h"
#include "BLI_listbase.h"
#include "ED_screen.h"
#include "ED_view3d.h"
#include "ED_util.h"
@ -62,12 +64,16 @@ void free_editLatt(Object *ob)
Lattice *lt= ob->data;
if(lt->editlatt) {
if(lt->editlatt->def)
MEM_freeN(lt->editlatt->def);
if(lt->editlatt->dvert)
free_dverts(lt->editlatt->dvert, lt->editlatt->pntsu*lt->editlatt->pntsv*lt->editlatt->pntsw);
Lattice *editlt= lt->editlatt->latt;
if(editlt->def)
MEM_freeN(editlt->def);
if(editlt->dvert)
free_dverts(editlt->dvert, editlt->pntsu*editlt->pntsv*editlt->pntsw);
MEM_freeN(editlt);
MEM_freeN(lt->editlatt);
lt->editlatt= NULL;
}
}
@ -85,38 +91,42 @@ void make_editLatt(Object *obedit)
if(actkey)
key_to_latt(actkey, lt);
lt->editlatt= MEM_dupallocN(lt);
lt->editlatt->def= MEM_dupallocN(lt->def);
lt->editlatt= MEM_callocN(sizeof(EditLatt), "editlatt");
lt->editlatt->latt= MEM_dupallocN(lt);
lt->editlatt->latt->def= MEM_dupallocN(lt->def);
if(lt->dvert) {
int tot= lt->pntsu*lt->pntsv*lt->pntsw;
lt->editlatt->dvert = MEM_mallocN (sizeof (MDeformVert)*tot, "Lattice MDeformVert");
copy_dverts(lt->editlatt->dvert, lt->dvert, tot);
lt->editlatt->latt->dvert = MEM_mallocN (sizeof (MDeformVert)*tot, "Lattice MDeformVert");
copy_dverts(lt->editlatt->latt->dvert, lt->dvert, tot);
}
if(lt->key) lt->editlatt->shapenr= obedit->shapenr;
}
void load_editLatt(Object *obedit)
{
Lattice *lt;
Lattice *lt, *editlt;
KeyBlock *actkey;
BPoint *bp;
float *fp;
int tot;
lt= obedit->data;
editlt= lt->editlatt->latt;
actkey= ob_get_keyblock(obedit);
if(lt->editlatt->shapenr) {
actkey= BLI_findlink(&lt->key->block, lt->editlatt->shapenr-1);
if(actkey) {
/* active key: vertices */
tot= lt->editlatt->pntsu*lt->editlatt->pntsv*lt->editlatt->pntsw;
tot= editlt->pntsu*editlt->pntsv*editlt->pntsw;
if(actkey->data) MEM_freeN(actkey->data);
fp=actkey->data= MEM_callocN(lt->key->elemsize*tot, "actkey->data");
actkey->totelem= tot;
bp= lt->editlatt->def;
bp= editlt->def;
while(tot--) {
VECCOPY(fp, bp->vec);
fp+= 3;
@ -126,17 +136,17 @@ void load_editLatt(Object *obedit)
else {
MEM_freeN(lt->def);
lt->def= MEM_dupallocN(lt->editlatt->def);
lt->def= MEM_dupallocN(editlt->def);
lt->flag= lt->editlatt->flag;
lt->flag= editlt->flag;
lt->pntsu= lt->editlatt->pntsu;
lt->pntsv= lt->editlatt->pntsv;
lt->pntsw= lt->editlatt->pntsw;
lt->pntsu= editlt->pntsu;
lt->pntsv= editlt->pntsv;
lt->pntsw= editlt->pntsw;
lt->typeu= lt->editlatt->typeu;
lt->typev= lt->editlatt->typev;
lt->typew= lt->editlatt->typew;
lt->typeu= editlt->typeu;
lt->typev= editlt->typev;
lt->typew= editlt->typew;
}
if(lt->dvert) {
@ -144,11 +154,11 @@ void load_editLatt(Object *obedit)
lt->dvert= NULL;
}
if(lt->editlatt->dvert) {
if(editlt->dvert) {
int tot= lt->pntsu*lt->pntsv*lt->pntsw;
lt->dvert = MEM_mallocN (sizeof (MDeformVert)*tot, "Lattice MDeformVert");
copy_dverts(lt->dvert, lt->editlatt->dvert, tot);
copy_dverts(lt->dvert, editlt->dvert, tot);
}
}
@ -160,9 +170,9 @@ void ED_setflagsLatt(Object *obedit, int flag)
BPoint *bp;
int a;
bp= lt->editlatt->def;
bp= lt->editlatt->latt->def;
a= lt->editlatt->pntsu*lt->editlatt->pntsv*lt->editlatt->pntsw;
a= lt->editlatt->latt->pntsu*lt->editlatt->latt->pntsv*lt->editlatt->latt->pntsw;
while(a--) {
if(bp->hide==0) {
@ -183,8 +193,8 @@ int select_all_exec(bContext *C, wmOperator *op)
if (action == SEL_TOGGLE) {
action = SEL_SELECT;
bp= lt->editlatt->def;
a= lt->editlatt->pntsu*lt->editlatt->pntsv*lt->editlatt->pntsw;
bp= lt->editlatt->latt->def;
a= lt->editlatt->latt->pntsu*lt->editlatt->latt->pntsv*lt->editlatt->latt->pntsw;
while(a--) {
if(bp->hide==0) {
@ -205,8 +215,8 @@ int select_all_exec(bContext *C, wmOperator *op)
ED_setflagsLatt(obedit, 0);
break;
case SEL_INVERT:
bp= lt->editlatt->def;
a= lt->editlatt->pntsu*lt->editlatt->pntsv*lt->editlatt->pntsw;
bp= lt->editlatt->latt->def;
a= lt->editlatt->latt->pntsu*lt->editlatt->latt->pntsv*lt->editlatt->latt->pntsw;
while(a--) {
if(bp->hide==0) {
@ -256,7 +266,7 @@ int make_regular_exec(bContext *C, wmOperator *op)
if(ob) {
lt= ob->data;
resizelattice(lt->editlatt, lt->pntsu, lt->pntsv, lt->pntsw, NULL);
resizelattice(lt->editlatt->latt, lt->pntsu, lt->pntsv, lt->pntsw, NULL);
}
else {
ob= CTX_data_active_object(C);
@ -354,21 +364,21 @@ typedef struct UndoLattice {
static void undoLatt_to_editLatt(void *data, void *edata)
{
UndoLattice *ult= (UndoLattice*)data;
Lattice *editlatt= (Lattice *)edata;
int a= editlatt->pntsu*editlatt->pntsv*editlatt->pntsw;
EditLatt *editlatt= (EditLatt *)edata;
int a= editlatt->latt->pntsu*editlatt->latt->pntsv*editlatt->latt->pntsw;
memcpy(editlatt->def, ult->def, a*sizeof(BPoint));
memcpy(editlatt->latt->def, ult->def, a*sizeof(BPoint));
}
static void *editLatt_to_undoLatt(void *edata)
{
UndoLattice *ult= MEM_callocN(sizeof(UndoLattice), "UndoLattice");
Lattice *editlatt= (Lattice *)edata;
EditLatt *editlatt= (EditLatt *)edata;
ult->def= MEM_dupallocN(editlatt->def);
ult->pntsu= editlatt->pntsu;
ult->pntsv= editlatt->pntsv;
ult->pntsw= editlatt->pntsw;
ult->def= MEM_dupallocN(editlatt->latt->def);
ult->pntsu= editlatt->latt->pntsu;
ult->pntsv= editlatt->latt->pntsv;
ult->pntsw= editlatt->latt->pntsw;
return ult;
}
@ -384,11 +394,11 @@ static void free_undoLatt(void *data)
static int validate_undoLatt(void *data, void *edata)
{
UndoLattice *ult= (UndoLattice*)data;
Lattice *editlatt= (Lattice *)edata;
EditLatt *editlatt= (EditLatt *)edata;
return (ult->pntsu == editlatt->pntsu &&
ult->pntsv == editlatt->pntsv &&
ult->pntsw == editlatt->pntsw);
return (ult->pntsu == editlatt->latt->pntsu &&
ult->pntsv == editlatt->latt->pntsv &&
ult->pntsw == editlatt->latt->pntsw);
}
static void *get_editlatt(bContext *C)

@ -172,8 +172,8 @@ static int vertex_parent_set_exec(bContext *C, wmOperator *op)
else if(obedit->type==OB_LATTICE) {
Lattice *lt= obedit->data;
a= lt->editlatt->pntsu*lt->editlatt->pntsv*lt->editlatt->pntsw;
bp= lt->editlatt->def;
a= lt->editlatt->latt->pntsu*lt->editlatt->latt->pntsv*lt->editlatt->latt->pntsw;
bp= lt->editlatt->latt->def;
while(a--) {
if(bp->f1 & SELECT) {
if(v1==0) v1= nr;

@ -73,7 +73,7 @@ static Lattice *vgroup_edit_lattice(Object *ob)
{
if(ob->type==OB_LATTICE) {
Lattice *lt= ob->data;
return (lt->editlatt)? lt->editlatt: lt;
return (lt->editlatt)? lt->editlatt->latt: lt;
}
return NULL;
@ -169,7 +169,7 @@ int ED_vgroup_give_parray(ID *id, MDeformVert ***dvert_arr, int *dvert_tot)
int i=0;
Lattice *lt= (Lattice *)id;
lt= (lt->editlatt)? lt->editlatt: lt;
lt= (lt->editlatt)? lt->editlatt->latt: lt;
*dvert_tot= lt->pntsu*lt->pntsv*lt->pntsw;
*dvert_arr= MEM_mallocN(sizeof(void*)*(*dvert_tot), "vgroup parray from me");
@ -203,7 +203,7 @@ int ED_vgroup_give_array(ID *id, MDeformVert **dvert_arr, int *dvert_tot)
case ID_LT:
{
Lattice *lt= (Lattice *)id;
lt= (lt->editlatt)? lt->editlatt: lt;
lt= (lt->editlatt)? lt->editlatt->latt: lt;
*dvert_arr= lt->dvert;
*dvert_tot= lt->pntsu*lt->pntsv*lt->pntsw;
return TRUE;

@ -225,7 +225,7 @@ static void stats_object_edit(Object *obedit, SceneStats *stats)
else if(obedit->type==OB_LATTICE) {
/* Lattice Edit */
Lattice *lt= obedit->data;
Lattice *editlatt= lt->editlatt;
Lattice *editlatt= lt->editlatt->latt;
BPoint *bp;
int a;

@ -1357,10 +1357,10 @@ void lattice_foreachScreenVert(ViewContext *vc, void (*func)(void *userData, BPo
{
Object *obedit= vc->obedit;
Lattice *lt= obedit->data;
BPoint *bp = lt->editlatt->def;
BPoint *bp = lt->editlatt->latt->def;
DispList *dl = find_displist(&obedit->disp, DL_VERTS);
float *co = dl?dl->verts:NULL;
int i, N = lt->editlatt->pntsu*lt->editlatt->pntsv*lt->editlatt->pntsw;
int i, N = lt->editlatt->latt->pntsu*lt->editlatt->latt->pntsv*lt->editlatt->latt->pntsw;
short s[2] = {IS_CLIPPED, 0};
ED_view3d_local_clipping(vc->rv3d, obedit->obmat); /* for local clipping lookups */
@ -1408,7 +1408,7 @@ static void drawlattice(Scene *scene, View3D *v3d, Object *ob)
dl= find_displist(&ob->disp, DL_VERTS);
if(is_edit) {
lt= lt->editlatt;
lt= lt->editlatt->latt;
cpack(0x004000);

@ -255,8 +255,8 @@ static void v3d_editvertex_buts(const bContext *C, uiLayout *layout, View3D *v3d
BPoint *bp;
int a;
a= lt->editlatt->pntsu*lt->editlatt->pntsv*lt->editlatt->pntsw;
bp= lt->editlatt->def;
a= lt->editlatt->latt->pntsu*lt->editlatt->latt->pntsv*lt->editlatt->latt->pntsw;
bp= lt->editlatt->latt->def;
while(a--) {
if(bp->f1 & SELECT) {
add_v3_v3(median, bp->vec);
@ -457,8 +457,8 @@ static void v3d_editvertex_buts(const bContext *C, uiLayout *layout, View3D *v3d
BPoint *bp;
int a;
a= lt->editlatt->pntsu*lt->editlatt->pntsv*lt->editlatt->pntsw;
bp= lt->editlatt->def;
a= lt->editlatt->latt->pntsu*lt->editlatt->latt->pntsv*lt->editlatt->latt->pntsw;
bp= lt->editlatt->latt->def;
while(a--) {
if(bp->f1 & SELECT) {
add_v3_v3(bp->vec, median);

@ -145,8 +145,8 @@ static void special_transvert_update(Scene *scene, Object *obedit)
else if(obedit->type==OB_LATTICE) {
Lattice *lt= obedit->data;
if(lt->editlatt->flag & LT_OUTSIDE)
outside_lattice(lt->editlatt);
if(lt->editlatt->latt->flag & LT_OUTSIDE)
outside_lattice(lt->editlatt->latt);
}
}
}
@ -372,9 +372,9 @@ static void make_trans_verts(Object *obedit, float *min, float *max, int mode)
else if(obedit->type==OB_LATTICE) {
Lattice *lt= obedit->data;
bp= lt->editlatt->def;
bp= lt->editlatt->latt->def;
a= lt->editlatt->pntsu*lt->editlatt->pntsv*lt->editlatt->pntsw;
a= lt->editlatt->latt->pntsu*lt->editlatt->latt->pntsv*lt->editlatt->latt->pntsw;
tv=transvmain= MEM_callocN(a*sizeof(TransVert), "maketransverts curve");

@ -1532,7 +1532,7 @@ static void createTransCurveVerts(bContext *C, TransInfo *t)
static void createTransLatticeVerts(bContext *C, TransInfo *t)
{
Lattice *latt = ((Lattice*)t->obedit->data)->editlatt;
Lattice *latt = ((Lattice*)t->obedit->data)->editlatt->latt;
TransData *td = NULL;
BPoint *bp;
float mtx[3][3], smtx[3][3];

@ -659,7 +659,7 @@ void recalcData(TransInfo *t)
Lattice *la= t->obedit->data;
DAG_id_flush_update(t->obedit->data, OB_RECALC_DATA); /* sets recalc flags */
if(la->editlatt->flag & LT_OUTSIDE) outside_lattice(la->editlatt);
if(la->editlatt->latt->flag & LT_OUTSIDE) outside_lattice(la->editlatt->latt);
}
else if (t->obedit->type == OB_MESH) {
EditMesh *em = ((Mesh*)t->obedit->data)->edit_mesh;

@ -379,9 +379,9 @@ int calc_manipulator_stats(const bContext *C)
BPoint *bp;
Lattice *lt= obedit->data;
bp= lt->editlatt->def;
bp= lt->editlatt->latt->def;
a= lt->editlatt->pntsu*lt->editlatt->pntsv*lt->editlatt->pntsw;
a= lt->editlatt->latt->pntsu*lt->editlatt->latt->pntsv*lt->editlatt->latt->pntsw;
while(a--) {
if(bp->f1 & SELECT) {
calc_tw_center(scene, bp->vec);

@ -157,6 +157,11 @@ typedef struct EditNurb {
/* index data for shape keys */
struct GHash *keyindex;
/* shape key being edited */
int shapenr;
char pad[4];
} EditNurb;
typedef struct Curve {

@ -36,6 +36,14 @@ struct Ipo;
struct Key;
struct MDeformVert;
typedef struct EditLatt {
struct Lattice *latt;
int shapenr;
char pad[4];
} EditLatt;
typedef struct Lattice {
ID id;
@ -58,7 +66,7 @@ typedef struct Lattice {
float *latticedata;
float latmat[4][4];
struct Lattice *editlatt;
struct EditLatt *editlatt;
} Lattice;
/* ***************** LATTICE ********************* */

@ -79,8 +79,8 @@ static void rna_Lattice_points_begin(CollectionPropertyIterator *iter, PointerRN
Lattice *lt= (Lattice*)ptr->data;
int tot= lt->pntsu*lt->pntsv*lt->pntsw;
if(lt->editlatt && lt->editlatt->def)
rna_iterator_array_begin(iter, (void*)lt->editlatt->def, sizeof(BPoint), tot, 0, NULL);
if(lt->editlatt && lt->editlatt->latt->def)
rna_iterator_array_begin(iter, (void*)lt->editlatt->latt->def, sizeof(BPoint), tot, 0, NULL);
else if(lt->def)
rna_iterator_array_begin(iter, (void*)lt->def, sizeof(BPoint), tot, 0, NULL);
else
@ -111,7 +111,7 @@ static void rna_Lattice_update_size(Main *bmain, Scene *scene, PointerRNA *ptr)
if(ob->data == lt) {
resizelattice(lt, newu, newv, neww, ob);
if(lt->editlatt)
resizelattice(lt->editlatt, newu, newv, neww, ob);
resizelattice(lt->editlatt->latt, newu, newv, neww, ob);
break;
}
}
@ -120,7 +120,7 @@ static void rna_Lattice_update_size(Main *bmain, Scene *scene, PointerRNA *ptr)
if(!ob) {
resizelattice(lt, newu, newv, neww, NULL);
if(lt->editlatt)
resizelattice(lt->editlatt, newu, newv, neww, NULL);
resizelattice(lt->editlatt->latt, newu, newv, neww, NULL);
}
rna_Lattice_update_data(bmain, scene, ptr);
@ -136,26 +136,39 @@ static void rna_Lattice_outside_set(PointerRNA *ptr, int value)
outside_lattice(lt);
if(lt->editlatt) {
if(value) lt->editlatt->flag |= LT_OUTSIDE;
else lt->editlatt->flag &= ~LT_OUTSIDE;
if(value) lt->editlatt->latt->flag |= LT_OUTSIDE;
else lt->editlatt->latt->flag &= ~LT_OUTSIDE;
outside_lattice(lt->editlatt);
outside_lattice(lt->editlatt->latt);
}
}
static int rna_Lattice_size_editable(PointerRNA *ptr)
{
Lattice *lt= (Lattice*)ptr->data;
return lt->key == NULL;
}
static void rna_Lattice_points_u_set(PointerRNA *ptr, int value)
{
((Lattice*)ptr->data)->opntsu= CLAMPIS(value, 1, 64);
Lattice *lt= (Lattice*)ptr->data;
lt->opntsu= CLAMPIS(value, 1, 64);
}
static void rna_Lattice_points_v_set(PointerRNA *ptr, int value)
{
((Lattice*)ptr->data)->opntsv= CLAMPIS(value, 1, 64);
Lattice *lt= (Lattice*)ptr->data;
lt->opntsv= CLAMPIS(value, 1, 64);
}
static void rna_Lattice_points_w_set(PointerRNA *ptr, int value)
{
((Lattice*)ptr->data)->opntsw= CLAMPIS(value, 1, 64);
Lattice *lt= (Lattice*)ptr->data;
lt->opntsw= CLAMPIS(value, 1, 64);
}
static void rna_Lattice_vg_name_set(PointerRNA *ptr, const char *value)
@ -164,7 +177,7 @@ static void rna_Lattice_vg_name_set(PointerRNA *ptr, const char *value)
strcpy(lt->vgroup, value);
if(lt->editlatt)
strcpy(lt->editlatt->vgroup, value);
strcpy(lt->editlatt->latt->vgroup, value);
}
@ -216,22 +229,25 @@ static void rna_def_lattice(BlenderRNA *brna)
RNA_def_property_int_sdna(prop, NULL, "pntsu");
RNA_def_property_int_funcs(prop, NULL, "rna_Lattice_points_u_set", NULL);
RNA_def_property_range(prop, 1, 64);
RNA_def_property_ui_text(prop, "U", "Points in U direction");
RNA_def_property_ui_text(prop, "U", "Points in U direction (can't be changed when there are shape keys)");
RNA_def_property_update(prop, 0, "rna_Lattice_update_size");
RNA_def_property_editable_func(prop, "rna_Lattice_size_editable");
prop= RNA_def_property(srna, "points_v", PROP_INT, PROP_NONE);
RNA_def_property_int_sdna(prop, NULL, "pntsv");
RNA_def_property_int_funcs(prop, NULL, "rna_Lattice_points_v_set", NULL);
RNA_def_property_range(prop, 1, 64);
RNA_def_property_ui_text(prop, "V", "Points in V direction");
RNA_def_property_ui_text(prop, "V", "Points in V direction (can't be changed when there are shape keys)");
RNA_def_property_update(prop, 0, "rna_Lattice_update_size");
RNA_def_property_editable_func(prop, "rna_Lattice_size_editable");
prop= RNA_def_property(srna, "points_w", PROP_INT, PROP_NONE);
RNA_def_property_int_sdna(prop, NULL, "pntsw");
RNA_def_property_int_funcs(prop, NULL, "rna_Lattice_points_w_set", NULL);
RNA_def_property_range(prop, 1, 64);
RNA_def_property_ui_text(prop, "W", "Points in W direction");
RNA_def_property_ui_text(prop, "W", "Points in W direction (can't be changed when there are shape keys)");
RNA_def_property_update(prop, 0, "rna_Lattice_update_size");
RNA_def_property_editable_func(prop, "rna_Lattice_size_editable");
prop= RNA_def_property(srna, "interpolation_type_u", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "typeu");

@ -128,6 +128,8 @@ EnumPropertyItem object_type_curve_items[] = {
#include "ED_mesh.h"
#include "ED_object.h"
#include "ED_particle.h"
#include "ED_curve.h"
#include "ED_lattice.h"
static void rna_Object_internal_update(Main *bmain, Scene *scene, PointerRNA *ptr)
{
@ -182,12 +184,24 @@ void rna_Object_internal_update_data(Main *bmain, Scene *scene, PointerRNA *ptr)
void rna_Object_active_shape_update(Main *bmain, Scene *scene, PointerRNA *ptr)
{
Object *ob= ptr->id.data;
int editmode= (scene->obedit == ob && ob->type == OB_MESH);
if(editmode) {
if(scene->obedit == ob) {
/* exit/enter editmode to get new shape */
load_editMesh(scene, ob);
make_editMesh(scene, ob);
switch(ob->type) {
case OB_MESH:
load_editMesh(scene, ob);
make_editMesh(scene, ob);
break;
case OB_CURVE:
case OB_SURF:
load_editNurb(ob);
make_editNurb(ob);
break;
case OB_LATTICE:
load_editLatt(ob);
make_editLatt(ob);
break;
}
}
rna_Object_internal_update_data(bmain, scene, ptr);