diff options
author | Ton Roosendaal <ton@blender.org> | 2005-08-25 00:18:03 +0400 |
---|---|---|
committer | Ton Roosendaal <ton@blender.org> | 2005-08-25 00:18:03 +0400 |
commit | dfb654ba60154e6aad52047e6f44da37d1782952 (patch) | |
tree | 946ff8717a14dcb5f67576a53745f1eb8384310b /source/blender | |
parent | bc3f228bc9ccae8382c0a01d626301e604819088 (diff) |
Huge commit, but not much features... had to shuffle a lot of code around.
Main target was cleanup of editconstraint.c and removal of the ugly
ob->activecon (active constraint channel), which was set by the "Show"
button in the Constraint Panel.
Better is to introduce an 'Active Constraint' itself, which stores in
the Constraint itself. By using this setting, and by checking the active
Bone, the UI can update reliably now. This only shows now in IpoWindow
btw (for constraint ipos). The active Constraint is drawn in the Buttons
with a slightly brighter backdrop. Any action in that Panel selects a
constraint now (even click in backdrop).
So now we have pose channels & constraint channels nicely behaving. Now the
darn Action channels... :)
Further in this commit:
- interface.c: Button ROUNDBOX now does button callback too.
Button NUMSLI didn't do the callback on a click only
- Cleaned up include files in yafray, got annoyed it compiled over all the
time.
- removed unused variables from Constraint struct
Diffstat (limited to 'source/blender')
21 files changed, 475 insertions, 531 deletions
diff --git a/source/blender/blenkernel/BKE_constraint.h b/source/blender/blenkernel/BKE_constraint.h index 1dd5beed9fa..fc45daf455f 100644 --- a/source/blender/blenkernel/BKE_constraint.h +++ b/source/blender/blenkernel/BKE_constraint.h @@ -46,8 +46,8 @@ void *new_constraint_data (short type); void evaluate_constraint (struct bConstraint *constraint, struct Object *ob, short ownertype, void *ownerdata, float targetmat[][4]); void free_constraints (struct ListBase *conlist); void copy_constraints (struct ListBase *dst, struct ListBase *src); -void *copy_constraint_channels (ListBase *dst, ListBase *src); -struct bConstraintChannel *clone_constraint_channels (struct ListBase *dst, struct ListBase *src, struct bConstraintChannel *oldact); +void copy_constraint_channels (ListBase *dst, ListBase *src); +void clone_constraint_channels (struct ListBase *dst, struct ListBase *src); void relink_constraints (struct ListBase *list); void free_constraint_data (struct bConstraint *con); diff --git a/source/blender/blenkernel/intern/action.c b/source/blender/blenkernel/intern/action.c index fb10d5d769b..5af1cc34860 100644 --- a/source/blender/blenkernel/intern/action.c +++ b/source/blender/blenkernel/intern/action.c @@ -118,7 +118,6 @@ void make_local_action(bAction *act) if(ob->id.lib==0) { ob->action = actn; - ob->activecon = NULL; actn->id.us++; act->id.us--; } diff --git a/source/blender/blenkernel/intern/constraint.c b/source/blender/blenkernel/intern/constraint.c index e3b0263de51..7501957af11 100644 --- a/source/blender/blenkernel/intern/constraint.c +++ b/source/blender/blenkernel/intern/constraint.c @@ -193,10 +193,9 @@ void relink_constraints (struct ListBase *list) } } -void *copy_constraint_channels (ListBase *dst, ListBase *src) +void copy_constraint_channels (ListBase *dst, ListBase *src) { bConstraintChannel *dchan, *schan; - bConstraintChannel *newact=NULL; dst->first=dst->last=NULL; duplicatelist(dst, src); @@ -204,25 +203,18 @@ void *copy_constraint_channels (ListBase *dst, ListBase *src) for (dchan=dst->first, schan=src->first; dchan; dchan=dchan->next, schan=schan->next){ dchan->ipo = copy_ipo(schan->ipo); } - - return newact; } -bConstraintChannel *clone_constraint_channels (ListBase *dst, ListBase *src, bConstraintChannel *oldact) +void clone_constraint_channels (ListBase *dst, ListBase *src) { bConstraintChannel *dchan, *schan; - bConstraintChannel *newact=NULL; dst->first=dst->last=NULL; duplicatelist(dst, src); for (dchan=dst->first, schan=src->first; dchan; dchan=dchan->next, schan=schan->next){ id_us_plus((ID *)dchan->ipo); - if (schan==oldact) - newact=dchan; } - - return newact; } void copy_constraints (ListBase *dst, ListBase *src) diff --git a/source/blender/blenkernel/intern/object.c b/source/blender/blenkernel/intern/object.c index 68f75234c3d..a1b03b18eb7 100644 --- a/source/blender/blenkernel/intern/object.c +++ b/source/blender/blenkernel/intern/object.c @@ -413,6 +413,8 @@ int exist_object(Object *obtest) { Object *ob; + if(obtest==NULL) return 0; + ob= G.main->object.first; while(ob) { if(ob==obtest) return 1; @@ -784,7 +786,6 @@ Object *copy_object(Object *ob) Object *obn; ModifierData *md; int a; - bConstraintChannel *actcon; obn= copy_libblock(ob); @@ -819,11 +820,7 @@ Object *copy_object(Object *ob) copy_nlastrips(&obn->nlastrips, &ob->nlastrips); copy_constraints (&obn->constraints, &ob->constraints); - actcon = clone_constraint_channels (&obn->constraintChannels, &ob->constraintChannels, ob->activecon); - /* If the active constraint channel was in this list, update it */ - if (actcon) - obn->activecon = actcon; - + clone_constraint_channels (&obn->constraintChannels, &ob->constraintChannels); /* increase user numbers */ id_us_plus((ID *)obn->data); @@ -1531,7 +1528,9 @@ void solve_constraints (Object *ob, short obtype, void *obdata, float ctime) for (con = ob->constraints.first; con; con=con->next) { // inverse kinematics is solved seperate if (con->type==CONSTRAINT_TYPE_KINEMATIC) continue; - + // and this we can skip completely + if (con->flag & CONSTRAINT_DISABLE) continue; + /* Clear accumulators if necessary*/ if (clear) { clear= 0; @@ -1542,32 +1541,29 @@ void solve_constraints (Object *ob, short obtype, void *obdata, float ctime) memset(asize, 0, sizeof(float)*3); } - /* Check this constraint only if it has some enforcement */ - if (!(con->flag & CONSTRAINT_DISABLE)) { - enf = con->enforce; // value from ipos (from action channels) + enf = con->enforce; // value from ipos (from action channels) - /* Get the targetmat */ - get_constraint_target_matrix(con, obtype, obdata, tmat, size, ctime); - - Mat4CpyMat4(focusmat, tmat); - - /* Extract the components & accumulate */ - Mat4ToQuat(focusmat, quat); - VECCOPY(loc, focusmat[3]); - Mat3CpyMat4(mat, focusmat); - Mat3ToSize(mat, size); - - a+= enf; - tot++; - - for(i=0; i<3; i++) { - aquat[i+1]+=(quat[i+1]) * enf; - aloc[i]+=(loc[i]) * enf; - asize[i]+=(size[i]-1.0f) * enf; - } - aquat[0]+=(quat[0])*enf; - Mat4CpyMat4(lastmat, focusmat); + /* Get the targetmat */ + get_constraint_target_matrix(con, obtype, obdata, tmat, size, ctime); + + Mat4CpyMat4(focusmat, tmat); + + /* Extract the components & accumulate */ + Mat4ToQuat(focusmat, quat); + VECCOPY(loc, focusmat[3]); + Mat3CpyMat4(mat, focusmat); + Mat3ToSize(mat, size); + + a+= enf; + tot++; + + for(i=0; i<3; i++) { + aquat[i+1]+=(quat[i+1]) * enf; + aloc[i]+=(loc[i]) * enf; + asize[i]+=(size[i]-1.0f) * enf; } + aquat[0]+=(quat[0])*enf; + Mat4CpyMat4(lastmat, focusmat); /* If the next constraint is not the same type (or there isn't one), * then evaluate the accumulator & request a clear */ diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c index f6762d409ce..bc6d12156fa 100644 --- a/source/blender/blenloader/intern/readfile.c +++ b/source/blender/blenloader/intern/readfile.c @@ -2145,8 +2145,6 @@ static void lib_link_object(FileData *fd, Main *main) ob->ipo= newlibadr_us(fd, ob->id.lib, ob->ipo); ob->action = newlibadr_us(fd, ob->id.lib, ob->action); -// ob->activecon = newglobadr(fd, ob->activecon); - poin= ob->data; ob->data= newlibadr_us(fd, ob->id.lib, ob->data); @@ -2326,8 +2324,6 @@ static void direct_link_object(FileData *fd, Object *ob) link_list(fd, &ob->nlastrips); link_list(fd, &ob->constraintChannels); - ob->activecon = newdataadr(fd, ob->activecon); - direct_link_scriptlink(fd, &ob->scriptlink); ob->mat= newdataadr(fd, ob->mat); diff --git a/source/blender/include/BIF_editconstraint.h b/source/blender/include/BIF_editconstraint.h index af7765cf1b2..8665d65e2f7 100644 --- a/source/blender/include/BIF_editconstraint.h +++ b/source/blender/include/BIF_editconstraint.h @@ -38,27 +38,18 @@ struct Object; struct bConstraint; struct bConstraintChannel; -typedef struct ConstraintElement{ - struct ConstraintElement *next, *prev; - struct ConstraintElement *parent; - Object *ob; - int flag; - const char *substring; - void *subdata; -} ConstraintElement; +struct bConstraint *add_new_constraint(short type); -struct bConstraintChannel *add_new_constraint_channel(const char *name); -struct bConstraint * add_new_constraint(char type); -void add_influence_key_to_constraint (struct bConstraint *con); void add_constraint_to_object(struct bConstraint *con, struct Object *ob); -void add_constraint_to_client(struct bConstraint *con); -struct ListBase *get_constraint_client_channels (int forcevalid); -struct ListBase *get_constraint_client(char *name, short *clienttype, void** clientdata); + +struct ListBase *get_active_constraints(struct Object *ob); +struct bConstraint *get_active_constraint(struct Object *ob); +struct ListBase *get_active_constraint_channels (struct Object *ob, int forcevalid); +struct bConstraintChannel *get_active_constraint_channel(struct Object *ob); void object_test_constraints(struct Object *owner); -char *get_con_subtarget_name(struct bConstraint *constraint, - struct Object *target); +char *get_con_subtarget_name(struct bConstraint *con, struct Object *target); #endif diff --git a/source/blender/include/BIF_poseobject.h b/source/blender/include/BIF_poseobject.h index ec201437488..cd5d326e006 100644 --- a/source/blender/include/BIF_poseobject.h +++ b/source/blender/include/BIF_poseobject.h @@ -35,6 +35,7 @@ struct Object; +struct bPoseChannel; void enter_posemode(void); void exit_posemode(void); @@ -42,6 +43,7 @@ void exit_posemode(void); // sets chan->flag to POSE_KEY if bone selected void set_pose_keys(struct Object *ob); +struct bPoseChannel *get_active_posechannel (struct Object *ob); /* tools */ void pose_select_constraint_target(void); diff --git a/source/blender/include/butspace.h b/source/blender/include/butspace.h index 4a87125f504..98427c3b765 100644 --- a/source/blender/include/butspace.h +++ b/source/blender/include/butspace.h @@ -544,11 +544,7 @@ enum B_SOUND_BUTTONS { /* *********************** */ #define B_CONSTRAINTBUTS 3300 enum { - B_CONSTRAINT_REDRAW = 3201, - B_CONSTRAINT_DEL, - B_CONSTRAINT_TEST, - B_CONSTRAINT_CHANGETYPE, - B_CONSTRAINT_CHANGENAME, + B_CONSTRAINT_TEST = 3201, B_CONSTRAINT_CHANGETARGET, B_CONSTRAINT_ADD_NULL, B_CONSTRAINT_ADD_KINEMATIC, diff --git a/source/blender/makesdna/DNA_constraint_types.h b/source/blender/makesdna/DNA_constraint_types.h index 95c1053ba8e..7a1c899edb5 100644 --- a/source/blender/makesdna/DNA_constraint_types.h +++ b/source/blender/makesdna/DNA_constraint_types.h @@ -40,6 +40,7 @@ struct Action; +/* channels reside in Object or Action (ListBase) constraintChannels */ typedef struct bConstraintChannel{ struct bConstraintChannel *next, *prev; Ipo *ipo; @@ -50,17 +51,12 @@ typedef struct bConstraintChannel{ typedef struct bConstraint{ struct bConstraint *next, *prev; void *data; /* Constraint data (a valid constraint type) */ - char type; /* Constraint type */ - char otype; /* Old type - for menu callbacks */ + short type; /* Constraint type */ short flag; /* Flag */ short reserved1; char name[30]; /* Constraint name */ float enforce; - float time; - float offset[3]; /* Target location offset */ - float orient[3]; /* Target orientation offset */ - float roll[3]; /* Target roll offset (needed?) */ } bConstraint; /* Single-target subobject constraints */ @@ -173,44 +169,47 @@ typedef struct bStretchToConstraint{ /* bConstraint.flag */ -#define CONSTRAINT_EXPAND 0x00000001 -#define CONSTRAINT_DONE 0x00000002 -#define CONSTRAINT_DISABLE 0x00000004 -#define CONSTRAINT_LOOPTESTED 0x00000008 + /* expand for UI */ +#define CONSTRAINT_EXPAND 0x01 + /* pre-check for illegal object name or bone name */ +#define CONSTRAINT_DISABLE 0x04 + /* flags 0x2 and 0x8 were used in past, skip this */ + /* to indicate which Ipo should be shown, maybe for 3d access later too */ +#define CONSTRAINT_ACTIVE 0x10 /* bConstraintChannel.flag */ -#define CONSTRAINT_CHANNEL_SELECT 0x00000001 +#define CONSTRAINT_CHANNEL_SELECT 0x01 /* bLocateLikeConstraint.flag */ -#define LOCLIKE_X 0x00000001 -#define LOCLIKE_Y 0x00000002 -#define LOCLIKE_Z 0x00000004 -#define LOCSPACE 0x00000008 +#define LOCLIKE_X 0x01 +#define LOCLIKE_Y 0x02 +#define LOCLIKE_Z 0x04 +#define LOCSPACE 0x08 /* Axis flags */ -#define LOCK_X 0x00000000 -#define LOCK_Y 0x00000001 -#define LOCK_Z 0x00000002 - -#define UP_X 0x00000000 -#define UP_Y 0x00000001 -#define UP_Z 0x00000002 - -#define TRACK_X 0x00000000 -#define TRACK_Y 0x00000001 -#define TRACK_Z 0x00000002 -#define TRACK_nX 0x00000003 -#define TRACK_nY 0x00000004 -#define TRACK_nZ 0x00000005 - -#define VOLUME_XZ 0x00000000 -#define VOLUME_X 0x00000001 -#define VOLUME_Z 0x00000002 -#define NO_VOLUME 0x00000003 - -#define PLANE_X 0x00000000 -#define PLANE_Y 0x00000001 -#define PLANE_Z 0x00000002 +#define LOCK_X 0x00 +#define LOCK_Y 0x01 +#define LOCK_Z 0x02 + +#define UP_X 0x00 +#define UP_Y 0x01 +#define UP_Z 0x02 + +#define TRACK_X 0x00 +#define TRACK_Y 0x01 +#define TRACK_Z 0x02 +#define TRACK_nX 0x03 +#define TRACK_nY 0x04 +#define TRACK_nZ 0x05 + +#define VOLUME_XZ 0x00 +#define VOLUME_X 0x01 +#define VOLUME_Z 0x02 +#define NO_VOLUME 0x03 + +#define PLANE_X 0x00 +#define PLANE_Y 0x01 +#define PLANE_Z 0x02 /* bKinematicConstraint->flag */ #define CONSTRAINT_IK_TIP 1 diff --git a/source/blender/makesdna/DNA_object_types.h b/source/blender/makesdna/DNA_object_types.h index 871d0e3f536..036a2bdc9cb 100644 --- a/source/blender/makesdna/DNA_object_types.h +++ b/source/blender/makesdna/DNA_object_types.h @@ -93,14 +93,13 @@ typedef struct Object { struct bPose *pose; void *data; - struct bConstraintChannel *activecon; ListBase constraintChannels; - ListBase effect; ListBase network; ListBase disp; ListBase defbase; ListBase modifiers; /* list of ModifierData structures */ + struct Material **mat; /* rot en drot have to be together! (transform('r' en 's')) */ @@ -190,7 +189,7 @@ typedef struct Object { LBuf lbuf; LBuf port; - float toonedge, smoothresh; /* smoothresh is phong interpolation ray_shadow correction in render */ + float pad3, smoothresh; /* smoothresh is phong interpolation ray_shadow correction in render */ struct DerivedMesh *derivedDeform, *derivedFinal; } Object; diff --git a/source/blender/src/buttons_object.c b/source/blender/src/buttons_object.c index 2384dc11a04..834f3d79e9a 100644 --- a/source/blender/src/buttons_object.c +++ b/source/blender/src/buttons_object.c @@ -57,23 +57,22 @@ #include "BSE_filesel.h" #include "BSE_headerbuttons.h" +#include "BIF_butspace.h" +#include "BDR_editcurve.h" #include "BIF_gl.h" +#include "BIF_glutil.h" #include "BIF_graphics.h" +#include "BIF_interface.h" #include "BIF_keyval.h" #include "BIF_mainqueue.h" +#include "BIF_mywindow.h" +#include "BIF_poseobject.h" #include "BIF_resources.h" #include "BIF_screen.h" -#include "BIF_mywindow.h" #include "BIF_space.h" -#include "BIF_glutil.h" -#include "BIF_interface.h" #include "BIF_toolbox.h" -#include "BDR_editcurve.h" -#include "BDR_drawobject.h" - -//#include "BIF_editsca.h" -#include "BIF_butspace.h" +#include "BDR_drawobject.h" #include "mydevice.h" #include "blendef.h" @@ -140,14 +139,57 @@ float prlen=0.0; /* ********************* CONSTRAINT ***************************** */ -static void activate_constraint_ipo_func (void *arg1v, void *unused) +static void constraint_active_func(void *ob_v, void *con_v) { - Object *ob= OBACT; - bConstraint *con = arg1v; + Object *ob= ob_v; + bConstraint *con; + ListBase *lb; + + /* lets be nice and escape if its active already */ + if(con_v) { + con= con_v; + if(con->flag & CONSTRAINT_ACTIVE) return; + } + + lb= get_active_constraints(ob); + + for(con= lb->first; con; con= con->next) { + if(con==con_v) con->flag |= CONSTRAINT_ACTIVE; + else con->flag &= ~CONSTRAINT_ACTIVE; + } + + /* make sure ipowin and buttons shows it */ + if(ob->ipowin==IPO_CO) { + allqueue(REDRAWIPO, IPO_CO); + allspace(REMAKEIPO, 0); + allqueue(REDRAWNLA, 0); + } + allqueue(REDRAWBUTSOBJECT, 0); +} + +static void add_constraint_to_active(Object *ob, bConstraint *con) +{ + ListBase *list; + + list = get_active_constraints(ob); + if (list) { + unique_constraint_name(con, list); + BLI_addtail(list, con); + + con->flag |= CONSTRAINT_ACTIVE; + for(con= con->prev; con; con= con->prev) + con->flag &= ~CONSTRAINT_ACTIVE; + } +} + +static void enable_constraint_ipo_func (void *ob_v, void *con_v) +{ + Object *ob= ob_v; + bConstraint *con = con_v; bConstraintChannel *chan; ListBase *conbase; - conbase = get_constraint_client_channels(1); + conbase = get_active_constraint_channels(ob, 1); // 1 == create if (!conbase) return; @@ -157,7 +199,8 @@ static void activate_constraint_ipo_func (void *arg1v, void *unused) if (!chan){ /* Add a new constraint channel */ - chan = add_new_constraint_channel(con->name); + chan = MEM_callocN(sizeof(bConstraintChannel), "constraintChannel"); + strcpy(chan->name, con->name); BLI_addtail(conbase, chan); } @@ -166,25 +209,23 @@ static void activate_constraint_ipo_func (void *arg1v, void *unused) chan->ipo = add_ipo(con->name, IPO_CO); } - /* Make this the active channel */ - ob->activecon = chan; - /* make sure ipowin shows it */ ob->ipowin= IPO_CO; allqueue(REDRAWIPO, IPO_CO); + allspace(REMAKEIPO, 0); allqueue(REDRAWNLA, 0); } -static void add_influence_key_to_constraint_func (void *arg1v, void *unused) +static void add_influence_key_to_constraint_func (void *ob_v, void *con_v) { - Object *ob= OBACT; - bConstraint *con = arg1v; + Object *ob= ob_v; + bConstraint *con = con_v; bConstraintChannel *chan; ListBase *conbase; IpoCurve *icu; - conbase = get_constraint_client_channels(1); // 1=make + conbase = get_active_constraint_channels(ob, 1); // 1=make if (!conbase) return; @@ -194,7 +235,8 @@ static void add_influence_key_to_constraint_func (void *arg1v, void *unused) if (!chan){ /* Add a new constraint channel */ - chan = add_new_constraint_channel(con->name); + chan = MEM_callocN(sizeof(bConstraintChannel), "constraintChannel"); + strcpy(chan->name, con->name); BLI_addtail(conbase, chan); } @@ -207,9 +249,6 @@ static void add_influence_key_to_constraint_func (void *arg1v, void *unused) icu= get_ipocurve(NULL, IPO_CO, CO_ENFORCE, chan->ipo); insert_vert_ipo(icu, CFRA, con->enforce); - /* Make this the active channel */ - ob->activecon = chan; - /* make sure ipowin shows it */ ob->ipowin= IPO_CO; allqueue(REDRAWIPO, IPO_CO); @@ -220,23 +259,27 @@ static void add_influence_key_to_constraint_func (void *arg1v, void *unused) } - - -static void del_constraint_func (void *arg1v, void *arg2v) +static void del_constraint_func (void *ob_v, void *con_v) { - bConstraint *con= arg1v; - Object *ob; - - ListBase *lb= arg2v; - - ob=OBACT; - - if (ob->activecon && !strcmp(ob->activecon->name, con->name)) - ob->activecon = NULL; - + bConstraint *con= con_v; + bConstraintChannel *chan; + ListBase *lb; + + /* remove ipo channel */ + lb= get_active_constraint_channels(ob_v, 0); + if(lb) { + chan = find_constraint_channel(lb, con->name); + if(chan) { + if(chan->ipo) chan->ipo->id.us--; + BLI_freelinkN(lb, chan); + } + } + /* remove constraint itself */ + lb= get_active_constraints(ob_v); free_constraint_data (con); - BLI_freelinkN(lb, con); + + constraint_active_func(ob_v, NULL); BIF_undo_push("Delete constraint"); allqueue(REDRAWBUTSOBJECT, 0); @@ -244,68 +287,20 @@ static void del_constraint_func (void *arg1v, void *arg2v) } -static void verify_constraint_name_func (void *data, void *data2_unused) +static void verify_constraint_name_func (void *ob_v, void *con_v) { ListBase *conlist; - bConstraint *con; - char ownerstr[64]; - short type; + bConstraint *con= con_v; - con = (bConstraint*) data; if (!con) return; - conlist = get_constraint_client(ownerstr, &type, NULL); + conlist = get_active_constraints(ob_v); unique_constraint_name (con, conlist); -} - -static void constraint_changed_func (void *data, void *data2_unused) -{ - bConstraint *con = (bConstraint*) data; - - if (con->type == con->otype) - return; - - free_constraint_data (con); - con->data = new_constraint_data(con->type); + constraint_active_func(ob_v, con); } -static void move_constraint_func (void *datav, void *data2_unused) -{ - bConstraint *constraint_to_move= datav; - int val; - ListBase *conlist; - char ownerstr[64]; - short type; - bConstraint *curCon, *con, *neighbour; - - val= pupmenu("Move up%x1|Move down %x2"); - - con = constraint_to_move; - - if(val>0) { - conlist = get_constraint_client(ownerstr, &type, NULL); - for (curCon = conlist->first; curCon; curCon = curCon->next){ - if (curCon == con){ - /* Move up */ - if (val == 1 && con->prev){ - neighbour = con->prev; - BLI_remlink(conlist, neighbour); - BLI_insertlink(conlist, con, neighbour); - } - /* Move down */ - else if (val == 2 && con->next){ - neighbour = con->next; - BLI_remlink (conlist, con); - BLI_insertlink(conlist, neighbour, con); - } - break; - } - } - } -} - static void get_constraint_typestring (char *str, bConstraint *con) { switch (con->type){ @@ -377,7 +372,7 @@ static void constraint_moveUp(void *ob_v, void *con_v) ListBase *conlist; if(constr->prev) { - conlist = get_constraint_client(NULL, NULL, NULL); + conlist = get_active_constraints(ob_v); for(con= conlist->first; con; con= con->next) { if(con==constr) { BLI_remlink(conlist, con); @@ -395,7 +390,7 @@ static void constraint_moveDown(void *ob_v, void *con_v) ListBase *conlist; if(constr->next) { - conlist = get_constraint_client(NULL, NULL, NULL); + conlist = get_active_constraints(ob_v); for(con= conlist->first; con; con= con->next) { if(con==constr) { BLI_remlink(conlist, con); @@ -408,13 +403,17 @@ static void constraint_moveDown(void *ob_v, void *con_v) } -static void draw_constraint (uiBlock *block, ListBase *list, bConstraint *con, short *xco, short *yco, short type) +static void draw_constraint (uiBlock *block, ListBase *list, bConstraint *con, short *xco, short *yco) { + Object *ob= OBACT; uiBut *but; char typestr[64]; short height, width = 265; - int curCol; + int curCol, rb_col; + /* unless button has own callback, it adds this callback to button */ + uiBlockSetFunc(block, constraint_active_func, ob, con); + get_constraint_typestring (typestr, con); curCol = get_constraint_col(con); @@ -423,19 +422,20 @@ static void draw_constraint (uiBlock *block, ListBase *list, bConstraint *con, s uiBlockSetEmboss(block, UI_EMBOSSN); /* rounded header */ - uiDefBut(block, ROUNDBOX, 0, "", *xco-10, *yco-1, width+30, 22, NULL, 5.0, 0.0, - (con->flag & CONSTRAINT_EXPAND)?3:15 , -20, ""); + rb_col= (con->flag & CONSTRAINT_ACTIVE)?10:-10; + uiDefBut(block, ROUNDBOX, B_DIFF, "", *xco-10, *yco-1, width+30, 22, NULL, 5.0, 0.0, + (con->flag & CONSTRAINT_EXPAND)?3:15 , rb_col-20, ""); /* open/close */ - uiDefIconButBitS(block, ICONTOG, CONSTRAINT_EXPAND, B_CONSTRAINT_REDRAW, ICON_DISCLOSURE_TRI_RIGHT, *xco-10, *yco, 20, 20, &con->flag, 0.0, 0.0, 0.0, 0.0, "Collapse/Expand Constraint"); + uiDefIconButBitS(block, ICONTOG, CONSTRAINT_EXPAND, B_CONSTRAINT_TEST, ICON_DISCLOSURE_TRI_RIGHT, *xco-10, *yco, 20, 20, &con->flag, 0.0, 0.0, 0.0, 0.0, "Collapse/Expand Constraint"); /* up down */ uiBlockSetEmboss(block, UI_EMBOSS); but = uiDefIconBut(block, BUT, B_CONSTRAINT_TEST, VICON_MOVE_UP, *xco+width-50, *yco, 16, 18, NULL, 0.0, 0.0, 0.0, 0.0, "Move modifier up in stack"); - uiButSetFunc(but, constraint_moveUp, NULL, con); + uiButSetFunc(but, constraint_moveUp, ob, con); but = uiDefIconBut(block, BUT, B_CONSTRAINT_TEST, VICON_MOVE_DOWN, *xco+width-50+20, *yco, 16, 18, NULL, 0.0, 0.0, 0.0, 0.0, "Move modifier down in stack"); - uiButSetFunc(but, constraint_moveDown, NULL, con); + uiButSetFunc(but, constraint_moveDown, ob, con); if (con->flag & CONSTRAINT_EXPAND) { @@ -453,13 +453,10 @@ static void draw_constraint (uiBlock *block, ListBase *list, bConstraint *con, s */ uiBlockSetEmboss(block, UI_EMBOSS); - but = uiDefBut(block, LABEL, B_CONSTRAINT_TEST, typestr, *xco+10, *yco, 100, 18, NULL, 0.0, 0.0, 0.0, 0.0, ""); - - uiButSetFunc(but, constraint_changed_func, con, NULL); - con->otype = con->type; + uiDefBut(block, LABEL, B_CONSTRAINT_TEST, typestr, *xco+10, *yco, 100, 18, NULL, 0.0, 0.0, 0.0, 0.0, ""); - but = uiDefBut(block, TEX, B_CONSTRAINT_REDRAW, "", *xco+120, *yco, 85, 18, con->name, 0.0, 29.0, 0.0, 0.0, "Constraint name"); - uiButSetFunc(but, verify_constraint_name_func, con, NULL); + but = uiDefBut(block, TEX, B_CONSTRAINT_TEST, "", *xco+120, *yco, 85, 18, con->name, 0.0, 29.0, 0.0, 0.0, "Constraint name"); + uiButSetFunc(but, verify_constraint_name_func, ob, con); } else{ uiBlockSetEmboss(block, UI_EMBOSSN); @@ -471,19 +468,17 @@ static void draw_constraint (uiBlock *block, ListBase *list, bConstraint *con, s else BIF_ThemeColor(curCol); - but = uiDefBut(block, LABEL, B_CONSTRAINT_TEST, typestr, *xco+10, *yco, 100, 18, NULL, 0.0, 0.0, 0.0, 0.0, ""); - uiButSetFunc(but, move_constraint_func, con, NULL); + uiDefBut(block, LABEL, B_CONSTRAINT_TEST, typestr, *xco+10, *yco, 100, 18, NULL, 0.0, 0.0, 0.0, 0.0, ""); - but = uiDefBut(block, LABEL, B_CONSTRAINT_TEST, con->name, *xco+120, *yco-1, 135, 19, NULL, 0.0, 0.0, 0.0, 0.0, ""); - uiButSetFunc(but, move_constraint_func, con, NULL); + uiDefBut(block, LABEL, B_CONSTRAINT_TEST, con->name, *xco+120, *yco-1, 135, 19, NULL, 0.0, 0.0, 0.0, 0.0, ""); } uiBlockSetCol(block, TH_AUTO); uiBlockSetEmboss(block, UI_EMBOSSN); - but = uiDefIconBut(block, BUT, B_CONSTRAINT_DEL, ICON_X, *xco+262, *yco, 19, 19, list, 0.0, 0.0, 0.0, 0.0, "Delete constraint"); - uiButSetFunc(but, del_constraint_func, con, list); + but = uiDefIconBut(block, BUT, B_CONSTRAINT_CHANGETARGET, ICON_X, *xco+262, *yco, 19, 19, list, 0.0, 0.0, 0.0, 0.0, "Delete constraint"); + uiButSetFunc(but, del_constraint_func, ob, con); uiBlockSetEmboss(block, UI_EMBOSS); @@ -500,7 +495,7 @@ static void draw_constraint (uiBlock *block, ListBase *list, bConstraint *con, s bArmature *arm; height = 88; - uiDefBut(block, ROUNDBOX, 0, "", *xco-10, *yco-height, width+30,height-1, NULL, 5.0, 0.0, 12, 0, ""); + uiDefBut(block, ROUNDBOX, B_DIFF, "", *xco-10, *yco-height, width+30,height-1, NULL, 5.0, 0.0, 12, rb_col, ""); uiDefBut(block, LABEL, B_CONSTRAINT_TEST, "Target:", *xco+65, *yco-24, 50, 18, NULL, 0.0, 0.0, 0.0, 0.0, ""); @@ -538,7 +533,7 @@ static void draw_constraint (uiBlock *block, ListBase *list, bConstraint *con, s bArmature *arm; height = 66; - uiDefBut(block, ROUNDBOX, 0, "", *xco-10, *yco-height, width+30,height-1, NULL, 5.0, 0.0, 12, 0, ""); + uiDefBut(block, ROUNDBOX, B_DIFF, "", *xco-10, *yco-height, width+30,height-1, NULL, 5.0, 0.0, 12, rb_col, ""); uiDefBut(block, LABEL, B_CONSTRAINT_TEST, "Target:", *xco+65, *yco-24, 50, 18, NULL, 0.0, 0.0, 0.0, 0.0, ""); @@ -568,7 +563,7 @@ static void draw_constraint (uiBlock *block, ListBase *list, bConstraint *con, s bArmature *arm; height = 46; - uiDefBut(block, ROUNDBOX, 0, "", *xco-10, *yco-height, width+30,height-1, NULL, 5.0, 0.0, 12, 0, ""); + uiDefBut(block, ROUNDBOX, B_DIFF, "", *xco-10, *yco-height, width+30,height-1, NULL, 5.0, 0.0, 12, rb_col, ""); uiDefBut(block, LABEL, B_CONSTRAINT_TEST, "Target:", *xco+65, *yco-24, 50, 18, NULL, 0.0, 0.0, 0.0, 0.0, ""); @@ -591,7 +586,7 @@ static void draw_constraint (uiBlock *block, ListBase *list, bConstraint *con, s bArmature *arm; height = 66; - uiDefBut(block, ROUNDBOX, 0, "", *xco-10, *yco-height, width+30,height-1, NULL, 5.0, 0.0, 12, 0, ""); + uiDefBut(block, ROUNDBOX, B_DIFF, "", *xco-10, *yco-height, width+30,height-1, NULL, 5.0, 0.0, 12, rb_col, ""); uiDefBut(block, LABEL, B_CONSTRAINT_TEST, "Target:", *xco+65, *yco-24, 50, 18, NULL, 0.0, 0.0, 0.0, 0.0, ""); @@ -606,11 +601,11 @@ static void draw_constraint (uiBlock *block, ListBase *list, bConstraint *con, s strcpy (data->subtarget, ""); uiBlockEndAlign(block); - uiDefButBitS(block, TOG, CONSTRAINT_IK_TIP, B_CONSTRAINT_REDRAW, "Use Tip", *xco+((width/2)-117), *yco-42, 80, 18, &data->flag, 0, 0, 0, 0, "Include Bone's tip als last element in Chain"); + uiDefButBitS(block, TOG, CONSTRAINT_IK_TIP, B_CONSTRAINT_TEST, "Use Tip", *xco+((width/2)-117), *yco-42, 80, 18, &data->flag, 0, 0, 0, 0, "Include Bone's tip als last element in Chain"); uiBlockBeginAlign(block); - uiDefButF(block, NUM, B_CONSTRAINT_REDRAW, "Tolerance:", *xco+((width/2)-117), *yco-64, 120, 18, &data->tolerance, 0.0001f, 1.0, 0.0, 0.0, "Maximum distance to target after solving"); - uiDefButS(block, NUM, B_CONSTRAINT_REDRAW, "Iterations:", *xco+((width/2)+3), *yco-64, 120, 18, &data->iterations, 1, 10000, 0.0, 0.0, "Maximum number of solving iterations"); + uiDefButF(block, NUM, B_CONSTRAINT_TEST, "Tolerance:", *xco+((width/2)-117), *yco-64, 120, 18, &data->tolerance, 0.0001f, 1.0, 0.0, 0.0, "Maximum distance to target after solving"); + uiDefButS(block, NUM, B_CONSTRAINT_TEST, "Iterations:", *xco+((width/2)+3), *yco-64, 120, 18, &data->iterations, 1, 10000, 0.0, 0.0, "Maximum number of solving iterations"); uiBlockEndAlign(block); } @@ -621,7 +616,7 @@ static void draw_constraint (uiBlock *block, ListBase *list, bConstraint *con, s bArmature *arm; height = 66; - uiDefBut(block, ROUNDBOX, 0, "", *xco-10, *yco-height, width+30,height-1, NULL, 5.0, 0.0, 12, 0, ""); + uiDefBut(block, ROUNDBOX, B_DIFF, "", *xco-10, *yco-height, width+30,height-1, NULL, 5.0, 0.0, 12, rb_col, ""); uiDefBut(block, LABEL, B_CONSTRAINT_TEST, "Target:", *xco+65, *yco-24, 50, 18, NULL, 0.0, 0.0, 0.0, 0.0, ""); @@ -640,20 +635,20 @@ static void draw_constraint (uiBlock *block, ListBase *list, bConstraint *con, s uiBlockBeginAlign(block); uiDefBut(block, LABEL, B_CONSTRAINT_TEST, "To:", *xco+12, *yco-64, 25, 18, NULL, 0.0, 0.0, 0.0, 0.0, ""); - uiDefButI(block, ROW,B_CONSTRAINT_REDRAW,"X", *xco+39, *yco-64,17,18, &data->reserved1, 12.0, 0.0, 0, 0, "The axis that points to the target object"); - uiDefButI(block, ROW,B_CONSTRAINT_REDRAW,"Y", *xco+56, *yco-64,17,18, &data->reserved1, 12.0, 1.0, 0, 0, "The axis that points to the target object"); - uiDefButI(block, ROW,B_CONSTRAINT_REDRAW,"Z", *xco+73, *yco-64,17,18, &data->reserved1, 12.0, 2.0, 0, 0, "The axis that points to the target object"); - uiDefButI(block, ROW,B_CONSTRAINT_REDRAW,"-X", *xco+90, *yco-64,24,18, &data->reserved1, 12.0, 3.0, 0, 0, "The axis that points to the target object"); - uiDefButI(block, ROW,B_CONSTRAINT_REDRAW,"-Y", *xco+114, *yco-64,24,18, &data->reserved1, 12.0, 4.0, 0, 0, "The axis that points to the target object"); - uiDefButI(block, ROW,B_CONSTRAINT_REDRAW,"-Z", *xco+138, *yco-64,24,18, &data->reserved1, 12.0, 5.0, 0, 0, "The axis that points to the target object"); + uiDefButI(block, ROW,B_CONSTRAINT_TEST,"X", *xco+39, *yco-64,17,18, &data->reserved1, 12.0, 0.0, 0, 0, "The axis that points to the target object"); + uiDefButI(block, ROW,B_CONSTRAINT_TEST,"Y", *xco+56, *yco-64,17,18, &data->reserved1, 12.0, 1.0, 0, 0, "The axis that points to the target object"); + uiDefButI(block, ROW,B_CONSTRAINT_TEST,"Z", *xco+73, *yco-64,17,18, &data->reserved1, 12.0, 2.0, 0, 0, "The axis that points to the target object"); + uiDefButI(block, ROW,B_CONSTRAINT_TEST,"-X", *xco+90, *yco-64,24,18, &data->reserved1, 12.0, 3.0, 0, 0, "The axis that points to the target object"); + uiDefButI(block, ROW,B_CONSTRAINT_TEST,"-Y", *xco+114, *yco-64,24,18, &data->reserved1, 12.0, 4.0, 0, 0, "The axis that points to the target object"); + uiDefButI(block, ROW,B_CONSTRAINT_TEST,"-Z", *xco+138, *yco-64,24,18, &data->reserved1, 12.0, 5.0, 0, 0, "The axis that points to the target object"); uiBlockEndAlign(block); uiBlockBeginAlign(block); uiDefBut(block, LABEL, B_CONSTRAINT_TEST, "Up:", *xco+174, *yco-64, 30, 18, NULL, 0.0, 0.0, 0.0, 0.0, ""); - uiDefButI(block, ROW,B_CONSTRAINT_REDRAW,"X", *xco+204, *yco-64,17,18, &data->reserved2, 13.0, 0.0, 0, 0, "The axis that points upward"); - uiDefButI(block, ROW,B_CONSTRAINT_REDRAW,"Y", *xco+221, *yco-64,17,18, &data->reserved2, 13.0, 1.0, 0, 0, "The axis that points upward"); - uiDefButI(block, ROW,B_CONSTRAINT_REDRAW,"Z", *xco+238, *yco-64,17,18, &data->reserved2, 13.0, 2.0, 0, 0, "The axis that points upward"); + uiDefButI(block, ROW,B_CONSTRAINT_TEST,"X", *xco+204, *yco-64,17,18, &data->reserved2, 13.0, 0.0, 0, 0, "The axis that points upward"); + uiDefButI(block, ROW,B_CONSTRAINT_TEST,"Y", *xco+221, *yco-64,17,18, &data->reserved2, 13.0, 1.0, 0, 0, "The axis that points upward"); + uiDefButI(block, ROW,B_CONSTRAINT_TEST,"Z", *xco+238, *yco-64,17,18, &data->reserved2, 13.0, 2.0, 0, 0, "The axis that points upward"); uiBlockEndAlign(block); } break; @@ -662,7 +657,7 @@ static void draw_constraint (uiBlock *block, ListBase *list, bConstraint *con, s bLockTrackConstraint *data = con->data; bArmature *arm; height = 66; - uiDefBut(block, ROUNDBOX, 0, "", *xco-10, *yco-height, width+30,height-1, NULL, 5.0, 0.0, 12, 0, ""); + uiDefBut(block, ROUNDBOX, B_DIFF, "", *xco-10, *yco-height, width+30,height-1, NULL, 5.0, 0.0, 12, rb_col, ""); uiDefBut(block, LABEL, B_CONSTRAINT_TEST, "Target:", *xco+65, *yco-24, 50, 18, NULL, 0.0, 0.0, 0.0, 0.0, ""); @@ -681,20 +676,20 @@ static void draw_constraint (uiBlock *block, ListBase *list, bConstraint *con, s uiBlockBeginAlign(block); uiDefBut(block, LABEL, B_CONSTRAINT_TEST, "To:", *xco+12, *yco-64, 25, 18, NULL, 0.0, 0.0, 0.0, 0.0, ""); - uiDefButI(block, ROW,B_CONSTRAINT_REDRAW,"X", *xco+39, *yco-64,17,18, &data->trackflag, 12.0, 0.0, 0, 0, "The axis that points to the target object"); - uiDefButI(block, ROW,B_CONSTRAINT_REDRAW,"Y", *xco+56, *yco-64,17,18, &data->trackflag, 12.0, 1.0, 0, 0, "The axis that points to the target object"); - uiDefButI(block, ROW,B_CONSTRAINT_REDRAW,"Z", *xco+73, *yco-64,17,18, &data->trackflag, 12.0, 2.0, 0, 0, "The axis that points to the target object"); - uiDefButI(block, ROW,B_CONSTRAINT_REDRAW,"-X", *xco+90, *yco-64,24,18, &data->trackflag, 12.0, 3.0, 0, 0, "The axis that points to the target object"); - uiDefButI(block, ROW,B_CONSTRAINT_REDRAW,"-Y", *xco+114, *yco-64,24,18, &data->trackflag, 12.0, 4.0, 0, 0, "The axis that points to the target object"); - uiDefButI(block, ROW,B_CONSTRAINT_REDRAW,"-Z", *xco+138, *yco-64,24,18, &data->trackflag, 12.0, 5.0, 0, 0, "The axis that points to the target object"); + uiDefButI(block, ROW,B_CONSTRAINT_TEST,"X", *xco+39, *yco-64,17,18, &data->trackflag, 12.0, 0.0, 0, 0, "The axis that points to the target object"); + uiDefButI(block, ROW,B_CONSTRAINT_TEST,"Y", *xco+56, *yco-64,17,18, &data->trackflag, 12.0, 1.0, 0, 0, "The axis that points to the target object"); + uiDefButI(block, ROW,B_CONSTRAINT_TEST,"Z", *xco+73, *yco-64,17,18, &data->trackflag, 12.0, 2.0, 0, 0, "The axis that points to the target object"); + uiDefButI(block, ROW,B_CONSTRAINT_TEST,"-X", *xco+90, *yco-64,24,18, &data->trackflag, 12.0, 3.0, 0, 0, "The axis that points to the target object"); + uiDefButI(block, ROW,B_CONSTRAINT_TEST,"-Y", *xco+114, *yco-64,24,18, &data->trackflag, 12.0, 4.0, 0, 0, "The axis that points to the target object"); + uiDefButI(block, ROW,B_CONSTRAINT_TEST,"-Z", *xco+138, *yco-64,24,18, &data->trackflag, 12.0, 5.0, 0, 0, "The axis that points to the target object"); uiBlockEndAlign(block); uiBlockBeginAlign(block); uiDefBut(block, LABEL, B_CONSTRAINT_TEST, "Lock:", *xco+166, *yco-64, 38, 18, NULL, 0.0, 0.0, 0.0, 0.0, ""); - uiDefButI(block, ROW,B_CONSTRAINT_REDRAW,"X", *xco+204, *yco-64,17,18, &data->lockflag, 13.0, 0.0, 0, 0, "The axis that is locked"); - uiDefButI(block, ROW,B_CONSTRAINT_REDRAW,"Y", *xco+221, *yco-64,17,18, &data->lockflag, 13.0, 1.0, 0, 0, "The axis that is locked"); - uiDefButI(block, ROW,B_CONSTRAINT_REDRAW,"Z", *xco+238, *yco-64,17,18, &data->lockflag, 13.0, 2.0, 0, 0, "The axis that is locked"); + uiDefButI(block, ROW,B_CONSTRAINT_TEST,"X", *xco+204, *yco-64,17,18, &data->lockflag, 13.0, 0.0, 0, 0, "The axis that is locked"); + uiDefButI(block, ROW,B_CONSTRAINT_TEST,"Y", *xco+221, *yco-64,17,18, &data->lockflag, 13.0, 1.0, 0, 0, "The axis that is locked"); + uiDefButI(block, ROW,B_CONSTRAINT_TEST,"Z", *xco+238, *yco-64,17,18, &data->lockflag, 13.0, 2.0, 0, 0, "The axis that is locked"); uiBlockEndAlign(block); } break; @@ -703,7 +698,7 @@ static void draw_constraint (uiBlock *block, ListBase *list, bConstraint *con, s bFollowPathConstraint *data = con->data; height = 66; - uiDefBut(block, ROUNDBOX, 0, "", *xco-10, *yco-height, width+30,height-1, NULL, 5.0, 0.0, 12, 0, ""); + uiDefBut(block, ROUNDBOX, B_DIFF, "", *xco-10, *yco-height, width+30,height-1, NULL, 5.0, 0.0, 12, rb_col, ""); uiDefBut(block, LABEL, B_CONSTRAINT_TEST, "Target:", *xco+65, *yco-24, 50, 18, NULL, 0.0, 0.0, 0.0, 0.0, ""); @@ -714,25 +709,25 @@ static void draw_constraint (uiBlock *block, ListBase *list, bConstraint *con, s but=uiDefButBitI(block, TOG, 1, B_CONSTRAINT_TEST, "CurveFollow", *xco+39, *yco-44, 100, 18, &data->followflag, 0, 24, 0, 0, "Object will follow the heading and banking of the curve"); /* Draw Offset number button */ - uiDefButF(block, NUM, B_CONSTRAINT_REDRAW, "Offset:", *xco+155, *yco-44, 100, 18, &data->offset, -9000, 9000, 100.0, 0.0, "Offset from the position corresponding to the time frame"); + uiDefButF(block, NUM, B_CONSTRAINT_TEST, "Offset:", *xco+155, *yco-44, 100, 18, &data->offset, -9000, 9000, 100.0, 0.0, "Offset from the position corresponding to the time frame"); uiBlockBeginAlign(block); uiDefBut(block, LABEL, B_CONSTRAINT_TEST, "Fw:", *xco+12, *yco-64, 27, 18, NULL, 0.0, 0.0, 0.0, 0.0, ""); - uiDefButI(block, ROW,B_CONSTRAINT_REDRAW,"X", *xco+39, *yco-64,17,18, &data->trackflag, 12.0, 0.0, 0, 0, "The axis that points forward along the path"); - uiDefButI(block, ROW,B_CONSTRAINT_REDRAW,"Y", *xco+56, *yco-64,17,18, &data->trackflag, 12.0, 1.0, 0, 0, "The axis that points forward along the path"); - uiDefButI(block, ROW,B_CONSTRAINT_REDRAW,"Z", *xco+73, *yco-64,17,18, &data->trackflag, 12.0, 2.0, 0, 0, "The axis that points forward along the path"); - uiDefButI(block, ROW,B_CONSTRAINT_REDRAW,"-X", *xco+90, *yco-64,24,18, &data->trackflag, 12.0, 3.0, 0, 0, "The axis that points forward along the path"); - uiDefButI(block, ROW,B_CONSTRAINT_REDRAW,"-Y", *xco+114, *yco-64,24,18, &data->trackflag, 12.0, 4.0, 0, 0, "The axis that points forward along the path"); - uiDefButI(block, ROW,B_CONSTRAINT_REDRAW,"-Z", *xco+138, *yco-64,24,18, &data->trackflag, 12.0, 5.0, 0, 0, "The axis that points forward along the path"); + uiDefButI(block, ROW,B_CONSTRAINT_TEST,"X", *xco+39, *yco-64,17,18, &data->trackflag, 12.0, 0.0, 0, 0, "The axis that points forward along the path"); + uiDefButI(block, ROW,B_CONSTRAINT_TEST,"Y", *xco+56, *yco-64,17,18, &data->trackflag, 12.0, 1.0, 0, 0, "The axis that points forward along the path"); + uiDefButI(block, ROW,B_CONSTRAINT_TEST,"Z", *xco+73, *yco-64,17,18, &data->trackflag, 12.0, 2.0, 0, 0, "The axis that points forward along the path"); + uiDefButI(block, ROW,B_CONSTRAINT_TEST,"-X", *xco+90, *yco-64,24,18, &data->trackflag, 12.0, 3.0, 0, 0, "The axis that points forward along the path"); + uiDefButI(block, ROW,B_CONSTRAINT_TEST,"-Y", *xco+114, *yco-64,24,18, &data->trackflag, 12.0, 4.0, 0, 0, "The axis that points forward along the path"); + uiDefButI(block, ROW,B_CONSTRAINT_TEST,"-Z", *xco+138, *yco-64,24,18, &data->trackflag, 12.0, 5.0, 0, 0, "The axis that points forward along the path"); uiBlockEndAlign(block); uiBlockBeginAlign(block); uiDefBut(block, LABEL, B_CONSTRAINT_TEST, "Up:", *xco+174, *yco-64, 30, 18, NULL, 0.0, 0.0, 0.0, 0.0, ""); - uiDefButI(block, ROW,B_CONSTRAINT_REDRAW,"X", *xco+204, *yco-64,17,18, &data->upflag, 13.0, 0.0, 0, 0, "The axis that points upward"); - uiDefButI(block, ROW,B_CONSTRAINT_REDRAW,"Y", *xco+221, *yco-64,17,18, &data->upflag, 13.0, 1.0, 0, 0, "The axis that points upward"); - uiDefButI(block, ROW,B_CONSTRAINT_REDRAW,"Z", *xco+238, *yco-64,17,18, &data->upflag, 13.0, 2.0, 0, 0, "The axis that points upward"); + uiDefButI(block, ROW,B_CONSTRAINT_TEST,"X", *xco+204, *yco-64,17,18, &data->upflag, 13.0, 0.0, 0, 0, "The axis that points upward"); + uiDefButI(block, ROW,B_CONSTRAINT_TEST,"Y", *xco+221, *yco-64,17,18, &data->upflag, 13.0, 1.0, 0, 0, "The axis that points upward"); + uiDefButI(block, ROW,B_CONSTRAINT_TEST,"Z", *xco+238, *yco-64,17,18, &data->upflag, 13.0, 2.0, 0, 0, "The axis that points upward"); uiBlockEndAlign(block); } break; @@ -742,7 +737,7 @@ static void draw_constraint (uiBlock *block, ListBase *list, bConstraint *con, s bArmature *arm; height = 105; - uiDefBut(block, ROUNDBOX, 0, "", *xco-10, *yco-height, width+30,height-1, NULL, 5.0, 0.0, 12, 0, ""); + uiDefBut(block, ROUNDBOX, B_DIFF, "", *xco-10, *yco-height, width+30,height-1, NULL, 5.0, 0.0, 12, rb_col, ""); uiDefBut(block, LABEL, B_CONSTRAINT_TEST, "Target:", *xco+65, *yco-24, 50, 18, NULL, 0.0, 0.0, 0.0, 0.0, ""); @@ -761,32 +756,32 @@ static void draw_constraint (uiBlock *block, ListBase *list, bConstraint *con, s uiBlockBeginAlign(block); - uiDefButF(block,BUTM,B_CONSTRAINT_REDRAW,"R",*xco, *yco-60,20,18,&(data->orglength),0.0,0,0,0,"Recalculate RLenght"); - uiDefButF(block,NUM,B_CONSTRAINT_REDRAW,"Rest Length:",*xco+18, *yco-60,237,18,&(data->orglength),0.0,100,0.5,0.5,"Lenght at Rest Position"); + uiDefButF(block,BUTM,B_CONSTRAINT_TEST,"R",*xco, *yco-60,20,18,&(data->orglength),0.0,0,0,0,"Recalculate RLenght"); + uiDefButF(block,NUM,B_CONSTRAINT_TEST,"Rest Length:",*xco+18, *yco-60,237,18,&(data->orglength),0.0,100,0.5,0.5,"Lenght at Rest Position"); uiBlockEndAlign(block); - uiDefButF(block,NUM,B_CONSTRAINT_REDRAW,"Volume Variation:",*xco+18, *yco-82,237,18,&(data->bulge),0.0,100,0.5,0.5,"Factor between volume variation and stretching"); + uiDefButF(block,NUM,B_CONSTRAINT_TEST,"Volume Variation:",*xco+18, *yco-82,237,18,&(data->bulge),0.0,100,0.5,0.5,"Factor between volume variation and stretching"); uiBlockBeginAlign(block); uiDefBut(block, LABEL, B_CONSTRAINT_TEST, "Vol:",*xco+14, *yco-104,30,18, NULL, 0.0, 0.0, 0.0, 0.0, ""); - uiDefButI(block, ROW,B_CONSTRAINT_REDRAW,"XZ", *xco+44, *yco-104,30,18, &data->volmode, 12.0, 0.0, 0, 0, "Keep Volume: Scaling X & Z"); - uiDefButI(block, ROW,B_CONSTRAINT_REDRAW,"X", *xco+74, *yco-104,20,18, &data->volmode, 12.0, 1.0, 0, 0, "Keep Volume: Scaling X"); - uiDefButI(block, ROW,B_CONSTRAINT_REDRAW,"Z", *xco+94, *yco-104,20,18, &data->volmode, 12.0, 2.0, 0, 0, "Keep Volume: Scaling Z"); - uiDefButI(block, ROW,B_CONSTRAINT_REDRAW,"NONE", *xco+114, *yco-104,50,18, &data->volmode, 12.0, 3.0, 0, 0, "Ignore Volume"); + uiDefButI(block, ROW,B_CONSTRAINT_TEST,"XZ", *xco+44, *yco-104,30,18, &data->volmode, 12.0, 0.0, 0, 0, "Keep Volume: Scaling X & Z"); + uiDefButI(block, ROW,B_CONSTRAINT_TEST,"X", *xco+74, *yco-104,20,18, &data->volmode, 12.0, 1.0, 0, 0, "Keep Volume: Scaling X"); + uiDefButI(block, ROW,B_CONSTRAINT_TEST,"Z", *xco+94, *yco-104,20,18, &data->volmode, 12.0, 2.0, 0, 0, "Keep Volume: Scaling Z"); + uiDefButI(block, ROW,B_CONSTRAINT_TEST,"NONE", *xco+114, *yco-104,50,18, &data->volmode, 12.0, 3.0, 0, 0, "Ignore Volume"); uiBlockEndAlign(block); uiBlockBeginAlign(block); uiDefBut(block, LABEL, B_CONSTRAINT_TEST,"Plane:",*xco+175, *yco-104,40,18, NULL, 0.0, 0.0, 0.0, 0.0, ""); - uiDefButI(block, ROW,B_CONSTRAINT_REDRAW,"X", *xco+215, *yco-104,20,18, &data->plane, 12.0, 0.0, 0, 0, "Keep X axis"); - uiDefButI(block, ROW,B_CONSTRAINT_REDRAW,"Z", *xco+235, *yco-104,20,18, &data->plane, 12.0, 2.0, 0, 0, "Keep Z axis"); + uiDefButI(block, ROW,B_CONSTRAINT_TEST,"X", *xco+215, *yco-104,20,18, &data->plane, 12.0, 0.0, 0, 0, "Keep X axis"); + uiDefButI(block, ROW,B_CONSTRAINT_TEST,"Z", *xco+235, *yco-104,20,18, &data->plane, 12.0, 2.0, 0, 0, "Keep Z axis"); uiBlockEndAlign(block); } break; case CONSTRAINT_TYPE_NULL: { height = 17; - uiDefBut(block, ROUNDBOX, 0, "", *xco-10, *yco-height, width+30,height-1, NULL, 5.0, 0.0, 12, 0, ""); + uiDefBut(block, ROUNDBOX, B_DIFF, "", *xco-10, *yco-height, width+30,height-1, NULL, 5.0, 0.0, 12, rb_col, ""); } break; @@ -800,14 +795,13 @@ static void draw_constraint (uiBlock *block, ListBase *list, bConstraint *con, s if (con->type!=CONSTRAINT_TYPE_NULL) { uiBlockBeginAlign(block); - uiDefButF(block, NUMSLI, B_CONSTRAINT_REDRAW, "Influence ", *xco, *yco, 197, 20, &(con->enforce), 0.0, 1.0, 0.0, 0.0, "Amount of influence this constraint will have on the final solution"); - but = uiDefBut(block, BUT, B_CONSTRAINT_REDRAW, "Show", *xco+200, *yco, 45, 20, 0, 0.0, 1.0, 0.0, 0.0, "Show this constraint's ipo in the object's Ipo window"); - /* If this is on an object, add the constraint to the object */ - uiButSetFunc (but, activate_constraint_ipo_func, con, NULL); - /* If this is on a bone, add the constraint to the action (if any) */ - but = uiDefBut(block, BUT, B_CONSTRAINT_REDRAW, "Key", *xco+245, *yco, 40, 20, 0, 0.0, 1.0, 0.0, 0.0, "Add an influence keyframe to the constraint"); + uiDefButF(block, NUMSLI, B_CONSTRAINT_TEST, "Influence ", *xco, *yco, 197, 20, &(con->enforce), 0.0, 1.0, 0.0, 0.0, "Amount of influence this constraint will have on the final solution"); + but = uiDefBut(block, BUT, B_CONSTRAINT_TEST, "Show", *xco+200, *yco, 45, 20, 0, 0.0, 1.0, 0.0, 0.0, "Show constraint's ipo in the Ipo window, adds a channel if not there"); + /* If this is on an object or bone, add ipo channel the constraint */ + uiButSetFunc (but, enable_constraint_ipo_func, ob, con); + but = uiDefBut(block, BUT, B_CONSTRAINT_TEST, "Key", *xco+245, *yco, 40, 20, 0, 0.0, 1.0, 0.0, 0.0, "Add an influence keyframe to the constraint"); /* Add a keyframe to the influence IPO */ - uiButSetFunc (but, add_influence_key_to_constraint_func, con, NULL); + uiButSetFunc (but, add_influence_key_to_constraint_func, ob, con); uiBlockEndAlign(block); (*yco)-=24; } else { @@ -818,14 +812,12 @@ static void draw_constraint (uiBlock *block, ListBase *list, bConstraint *con, s static uiBlock *add_constraintmenu(void *arg_unused) { + Object *ob= OBACT; uiBlock *block; - ListBase *conlist; - char ownerstr[64]; - short type; short yco= 0; - conlist = get_constraint_client(ownerstr, &type, NULL); + conlist = get_active_constraints(ob); block= uiNewBlock(&curarea->uiblocks, "add_constraintmenu", UI_EMBOSSP, UI_HELV, curarea->win); @@ -842,8 +834,7 @@ static uiBlock *add_constraintmenu(void *arg_unused) uiDefBut(block, BUTM, B_CONSTRAINT_ADD_STRETCHTO,"Stretch To", 0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 0, ""); - if (type==TARGET_BONE) { - + if (ob->flag & OB_POSEMODE) { uiDefBut(block, SEPR, 0, "", 0, yco-=6, 120, 6, NULL, 0.0, 0.0, 0, 0, ""); uiDefBut(block, BUTM, B_CONSTRAINT_ADD_KINEMATIC,"IK Solver", 0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 0, ""); @@ -864,16 +855,10 @@ void do_constraintbuts(unsigned short event) { Object *ob= OBACT; - object_test_constraints(ob); - switch(event) { - case B_CONSTRAINT_CHANGENAME: case B_CONSTRAINT_TEST: - case B_CONSTRAINT_REDRAW: - case B_CONSTRAINT_CHANGETYPE: break; // no handling - case B_CONSTRAINT_DEL: case B_CONSTRAINT_CHANGETARGET: if(ob->pose) ob->pose->flag |= POSE_RECALC; // checks & sorts pose channels DAG_scene_sort(G.scene); @@ -884,7 +869,7 @@ void do_constraintbuts(unsigned short event) bConstraint *con; con = add_new_constraint(CONSTRAINT_TYPE_NULL); - add_constraint_to_client(con); + add_constraint_to_active(ob, con); BIF_undo_push("Add constraint"); } @@ -894,7 +879,7 @@ void do_constraintbuts(unsigned short event) bConstraint *con; con = add_new_constraint(CONSTRAINT_TYPE_KINEMATIC); - add_constraint_to_client(con); + add_constraint_to_active(ob, con); BIF_undo_push("Add constraint"); } @@ -904,7 +889,7 @@ void do_constraintbuts(unsigned short event) bConstraint *con; con = add_new_constraint(CONSTRAINT_TYPE_TRACKTO); - add_constraint_to_client(con); + add_constraint_to_active(ob, con); BIF_undo_push("Add constraint"); } @@ -914,7 +899,7 @@ void do_constraintbuts(unsigned short event) bConstraint *con; con = add_new_constraint(CONSTRAINT_TYPE_ROTLIKE); - add_constraint_to_client(con); + add_constraint_to_active(ob, con); BIF_undo_push("Add constraint"); } @@ -924,7 +909,7 @@ void do_constraintbuts(unsigned short event) bConstraint *con; con = add_new_constraint(CONSTRAINT_TYPE_LOCLIKE); - add_constraint_to_client(con); + add_constraint_to_active(ob, con); BIF_undo_push("Add constraint"); } @@ -934,7 +919,7 @@ void do_constraintbuts(unsigned short event) bConstraint *con; con = add_new_constraint(CONSTRAINT_TYPE_ACTION); - add_constraint_to_client(con); + add_constraint_to_active(ob, con); BIF_undo_push("Add constraint"); } @@ -944,7 +929,7 @@ void do_constraintbuts(unsigned short event) bConstraint *con; con = add_new_constraint(CONSTRAINT_TYPE_LOCKTRACK); - add_constraint_to_client(con); + add_constraint_to_active(ob, con); BIF_undo_push("Add constraint"); } @@ -954,24 +939,26 @@ void do_constraintbuts(unsigned short event) bConstraint *con; con = add_new_constraint(CONSTRAINT_TYPE_FOLLOWPATH); - add_constraint_to_client(con); + add_constraint_to_active(ob, con); } break; case B_CONSTRAINT_ADD_STRETCHTO: - { - bConstraint *con; - con = add_new_constraint(CONSTRAINT_TYPE_STRETCHTO); - add_constraint_to_client(con); - - BIF_undo_push("Add constraint"); - } + { + bConstraint *con; + con = add_new_constraint(CONSTRAINT_TYPE_STRETCHTO); + add_constraint_to_active(ob, con); + + BIF_undo_push("Add constraint"); + } break; default: break; } + object_test_constraints(ob); + if(ob->pose) update_pose_constraint_flags(ob->pose); if(ob->type==OB_ARMATURE) DAG_object_flush_update(G.scene, ob, OB_RECALC_DATA); @@ -984,10 +971,11 @@ void do_constraintbuts(unsigned short event) static void object_panel_constraint(void) { uiBlock *block; + Object *ob= OBACT; ListBase *conlist; bConstraint *curcon; - short xco, yco, type; - char ownerstr[64]; + short xco, yco; + char str[64]; block= uiNewBlock(&curarea->uiblocks, "object_panel_constraint", UI_EMBOSS, UI_HELV, curarea->win); if(uiNewPanel(curarea, block, "Constraints", "Object", 640, 0, 318, 204)==0) return; @@ -996,31 +984,24 @@ static void object_panel_constraint(void) /* so first we make it default height */ uiNewPanelHeight(block, 204); - if(G.obedit==OBACT) return; + if(G.obedit==OBACT) return; // ?? - conlist = get_constraint_client(ownerstr, &type, NULL); + conlist = get_active_constraints(OBACT); if (conlist) { uiDefBlockBut(block, add_constraintmenu, NULL, "Add Constraint", 0, 190, 130, 20, "Add a new constraint"); /* print active object or bone */ - { - short type; - void *data=NULL; - char str[64]; - - str[0]= 0; - get_constraint_client(NULL, &type, &data); - if (data && type==TARGET_BONE){ - sprintf(str, "To Bone: %s", ((Bone*)data)->name); - } - else if(OBACT) { - Object *ob= OBACT; - sprintf(str, "To Object: %s", ob->id.name+2); - } - uiDefBut(block, LABEL, 1, str, 150, 190, 150, 20, NULL, 0.0, 0.0, 0, 0, "Displays Active Object or Bone name"); + str[0]= 0; + if (ob->flag & OB_POSEMODE){ + bPoseChannel *pchan= get_active_posechannel(ob); + if(pchan) sprintf(str, "To Bone: %s", pchan->name); + } + else { + sprintf(str, "To Object: %s", ob->id.name+2); } + uiDefBut(block, LABEL, 1, str, 150, 190, 150, 20, NULL, 0.0, 0.0, 0, 0, "Displays Active Object or Bone name"); /* Go through the list of constraints and draw them */ xco = 10; @@ -1028,7 +1009,7 @@ static void object_panel_constraint(void) for (curcon = conlist->first; curcon; curcon=curcon->next) { /* Draw default constraint header */ - draw_constraint(block, conlist, curcon, &xco, &yco, type); + draw_constraint(block, conlist, curcon, &xco, &yco); } if(yco < 0) uiNewPanelHeight(block, 204-yco); diff --git a/source/blender/src/editarmature.c b/source/blender/src/editarmature.c index 5980ffcee48..439b520a6f6 100644 --- a/source/blender/src/editarmature.c +++ b/source/blender/src/editarmature.c @@ -1847,23 +1847,6 @@ int do_pose_selectbuffer(Base *base, unsigned int *buffer, short hits) } } - /* signal update to ipo window */ - if(ob->ipowin==IPO_CO) { - bConstraintChannel *chan; - ListBase *conbase; - - conbase = get_constraint_client_channels(0); - if (conbase) { - for(chan= conbase->first; chan; chan= chan->next) { - if(chan->ipo) - break; - } - /* Make this the active channel */ - ob->activecon = chan; - } - else ob->activecon = NULL; - } - /* in weightpaint we select the associated vertex group too */ if(G.f & G_WEIGHTPAINT) { if(nearBone->flag & BONE_ACTIVE) { @@ -1873,7 +1856,7 @@ int do_pose_selectbuffer(Base *base, unsigned int *buffer, short hits) allqueue(REDRAWVIEW3D, 0); allqueue(REDRAWACTION, 0); - allqueue(REDRAWIPO, 0); /* To force action ipo update */ + allqueue(REDRAWIPO, 0); /* To force action/constraint ipo update */ allqueue(REDRAWBUTSEDIT, 0); allqueue(REDRAWBUTSOBJECT, 0); allqueue(REDRAWOOPS, 0); diff --git a/source/blender/src/editconstraint.c b/source/blender/src/editconstraint.c index e4eb4542c97..142587776c5 100644 --- a/source/blender/src/editconstraint.c +++ b/source/blender/src/editconstraint.c @@ -56,6 +56,7 @@ #include "BIF_editaction.h" #include "BIF_editarmature.h" #include "BIF_editconstraint.h" +#include "BIF_poseobject.h" #include "BIF_interface.h" #include "BIF_screen.h" #include "BIF_toolbox.h" @@ -64,33 +65,9 @@ #include "nla.h" -/* called by buttons to find a bone to display/edit values for */ -static bPoseChannel *get_active_posechannel (void) +ListBase *get_active_constraint_channels (Object *ob, int forcevalid) { - Object *ob= OBACT; - bPoseChannel *pchan; - bArmature *arm; - - arm = get_armature(OBACT); - if (!arm) - return NULL; - - /* find for active */ - for(pchan= ob->pose->chanbase.first; pchan; pchan= pchan->next) { - if(pchan->bone && (pchan->bone->flag & BONE_ACTIVE)) - return pchan; - } - - return NULL; -} - - -ListBase *get_constraint_client_channels (int forcevalid) -{ - Object *ob; char ipstr[64]; - - ob=OBACT; if (!ob) return NULL; @@ -100,7 +77,7 @@ ListBase *get_constraint_client_channels (int forcevalid) bActionChannel *achan; bPoseChannel *pchan; - pchan = get_active_posechannel(); + pchan = get_active_posechannel(ob); if (pchan) { /* Make sure we have an action */ @@ -135,49 +112,87 @@ ListBase *get_constraint_client_channels (int forcevalid) return &ob->constraintChannels; } -ListBase *get_constraint_client(char *name, short *clientType, void **clientdata) + +/* if object in posemode, active bone constraints, else object constraints */ +ListBase *get_active_constraints(Object *ob) { - Object *ob; ListBase *list; - ob=OBACT; - if (clientType) - *clientType = -1; - if (!ob) return NULL; list = &ob->constraints; - /* Prep the object's constraint channels */ - if (clientType) - *clientType = TARGET_OBJECT; - - if (name) - strcpy (name, ob->id.name+2); - if (ob->flag & OB_POSEMODE) { bPoseChannel *pchan; - pchan = get_active_posechannel(); - if (pchan) { - - /* Is the bone the client? */ - if (clientType) - *clientType = TARGET_BONE; - if (clientdata) - *clientdata = pchan->bone; - if (name) - sprintf (name, "%s>>%s", name, pchan->name); - + pchan = get_active_posechannel(ob); + if (pchan) list = &pchan->constraints; - } } return list; } -bConstraint * add_new_constraint(char type) +/* single constraint */ +bConstraint *get_active_constraint(Object *ob) +{ + ListBase *lb= get_active_constraints(ob); + + if(lb) { + bConstraint *con; + for(con= lb->first; con; con=con->next) + if(con->flag & CONSTRAINT_ACTIVE) + return con; + } + return NULL; +} + +/* single channel, for ipo */ +bConstraintChannel *get_active_constraint_channel(Object *ob) +{ + bConstraint *con; + bConstraintChannel *chan; + + if (ob->flag & OB_POSEMODE) { + if(ob->action) { + bPoseChannel *pchan; + + pchan = get_active_posechannel(ob); + if(pchan) { + for(con= pchan->constraints.first; con; con= con->next) + if(con->flag & CONSTRAINT_ACTIVE) + break; + if(con) { + bActionChannel *achan = get_named_actionchannel(ob->action, pchan->name); + if(achan) { + for(chan= achan->constraintChannels.first; chan; chan= chan->next) + if(!strcmp(chan->name, con->name)) + break; + return chan; + } + } + } + } + } + else { + for(con= ob->constraints.first; con; con= con->next) + if(con->flag & CONSTRAINT_ACTIVE) + break; + if(con) { + for(chan= ob->constraintChannels.first; chan; chan= chan->next) + if(!strcmp(chan->name, con->name)) + break; + return chan; + } + } + + return NULL; +} + + + +bConstraint *add_new_constraint(short type) { bConstraint *con; @@ -197,86 +212,65 @@ void add_constraint_to_object(bConstraint *con, Object *ob) { ListBase *list; list = &ob->constraints; - if (list) - { - unique_constraint_name(con, list); - BLI_addtail(list, con); - } -} - -void add_constraint_to_client(bConstraint *con) -{ - ListBase *list; - short type; - list = get_constraint_client(NULL, &type, NULL); - if (list) - { + + if (list) { unique_constraint_name(con, list); BLI_addtail(list, con); + + con->flag |= CONSTRAINT_ACTIVE; + for(con= con->prev; con; con= con->prev) + con->flag &= ~CONSTRAINT_ACTIVE; } } -bConstraintChannel *add_new_constraint_channel(const char* name) -{ - bConstraintChannel *chan = NULL; - chan = MEM_callocN(sizeof(bConstraintChannel), "constraintChannel"); - strcpy(chan->name, name); - - return chan; -} - -void add_influence_key_to_constraint (bConstraint *con){ - printf("doesn't do anything yet\n"); -} - -char *get_con_subtarget_name(bConstraint *constraint, Object *target) +char *get_con_subtarget_name(bConstraint *con, Object *target) { /* * If the target for this constraint is target, return a pointer * to the name for this constraints subtarget ... NULL otherwise */ - switch (constraint->type) { + switch (con->type) { case CONSTRAINT_TYPE_ACTION: { - bActionConstraint *data = constraint->data; + bActionConstraint *data = con->data; if (data->tar==target) return data->subtarget; } break; case CONSTRAINT_TYPE_LOCLIKE: { - bLocateLikeConstraint *data = constraint->data; + bLocateLikeConstraint *data = con->data; if (data->tar==target) return data->subtarget; } break; case CONSTRAINT_TYPE_ROTLIKE: { - bRotateLikeConstraint *data = constraint->data; + bRotateLikeConstraint *data = con->data; if (data->tar==target) return data->subtarget; } break; case CONSTRAINT_TYPE_KINEMATIC: { - bKinematicConstraint *data = constraint->data; + bKinematicConstraint *data = con->data; if (data->tar==target) return data->subtarget; } break; case CONSTRAINT_TYPE_TRACKTO: { - bTrackToConstraint *data = constraint->data; + bTrackToConstraint *data = con->data; if (data->tar==target) return data->subtarget; } break; case CONSTRAINT_TYPE_LOCKTRACK: { - bLockTrackConstraint *data = constraint->data; + bLockTrackConstraint *data = con->data; if (data->tar==target) return data->subtarget; } break; case CONSTRAINT_TYPE_STRETCHTO: { - bStretchToConstraint *data = constraint->data; + bStretchToConstraint *data = con->data; if (data->tar==target) return data->subtarget; } break; @@ -286,7 +280,7 @@ char *get_con_subtarget_name(bConstraint *constraint, Object *target) */ { /* - * bFollowPathConstraint *data = constraint->data; + * bFollowPathConstraint *data = con->data; */ return NULL; } @@ -354,6 +348,7 @@ static void test_constraints (Object *owner, const char* substring) if (!exist_object(data->tar)){ data->tar = NULL; + curcon->flag |= CONSTRAINT_DISABLE; break; } @@ -371,6 +366,7 @@ static void test_constraints (Object *owner, const char* substring) if (!exist_object(data->tar)){ data->tar = NULL; + curcon->flag |= CONSTRAINT_DISABLE; break; } @@ -388,6 +384,7 @@ static void test_constraints (Object *owner, const char* substring) if (!exist_object(data->tar)){ data->tar = NULL; + curcon->flag |= CONSTRAINT_DISABLE; break; } @@ -404,6 +401,7 @@ static void test_constraints (Object *owner, const char* substring) bKinematicConstraint *data = curcon->data; if (!exist_object(data->tar)){ data->tar = NULL; + curcon->flag |= CONSTRAINT_DISABLE; break; } @@ -420,6 +418,7 @@ static void test_constraints (Object *owner, const char* substring) bTrackToConstraint *data = curcon->data; if (!exist_object(data->tar)) { data->tar = NULL; + curcon->flag |= CONSTRAINT_DISABLE; break; } @@ -445,6 +444,7 @@ static void test_constraints (Object *owner, const char* substring) if (!exist_object(data->tar)){ data->tar = NULL; + curcon->flag |= CONSTRAINT_DISABLE; break; } @@ -471,6 +471,7 @@ static void test_constraints (Object *owner, const char* substring) if (!exist_object(data->tar)){ data->tar = NULL; + curcon->flag |= CONSTRAINT_DISABLE; break; } @@ -488,10 +489,12 @@ static void test_constraints (Object *owner, const char* substring) if (!exist_object(data->tar)){ data->tar = NULL; + curcon->flag |= CONSTRAINT_DISABLE; break; } if (data->tar->type != OB_CURVE){ data->tar = NULL; + curcon->flag |= CONSTRAINT_DISABLE; break; } if (data->upflag==data->trackflag){ diff --git a/source/blender/src/editipo.c b/source/blender/src/editipo.c index 24f18bb7f71..89d379160bc 100644 --- a/source/blender/src/editipo.c +++ b/source/blender/src/editipo.c @@ -92,6 +92,7 @@ #include "BIF_butspace.h" #include "BIF_editaction.h" +#include "BIF_editconstraint.h" #include "BIF_editkey.h" #include "BIF_editseq.h" #include "BIF_editview.h" @@ -562,9 +563,12 @@ Ipo *get_ipo_to_edit(ID **from) if(last_seq) return last_seq->ipo; } else if(G.sipo->blocktype==IPO_CO){ - if (ob && ob->activecon){ - *from= (ID*) ob; - return ob->activecon->ipo; + if (ob) { + bConstraintChannel *chan= get_active_constraint_channel(ob); + if(chan) { + *from= (ID*) ob; + return chan->ipo; + } } } else if(G.sipo->blocktype==ID_AC) { @@ -1793,100 +1797,104 @@ Ipo *get_ipo(ID *from, short type, int make) World *wo; Lamp *la; Camera *ca; - Ipo *ipo= 0; + Ipo *ipo= NULL; bAction *act; if( type==ID_OB) { ob= (Object *)from; - if(ob->id.lib) return 0; + if(ob->id.lib) return NULL; ipo= ob->ipo; - if(make && ipo==0) ipo= ob->ipo= add_ipo("ObIpo", ID_OB); + if(make && ipo==NULL) ipo= ob->ipo= add_ipo("ObIpo", ID_OB); } else if( type==IPO_CO){ + bConstraintChannel *chan; + ob= (Object *)from; - if(ob->id.lib) return 0; + if(ob->id.lib) return NULL; + + chan= get_active_constraint_channel(ob); - if (ob->activecon){ - ipo= ob->activecon->ipo; - if(make && ipo==0) ipo= ob->activecon->ipo= add_ipo("CoIpo", IPO_CO); + if (chan){ + ipo= chan->ipo; + if(make && ipo==NULL) ipo= chan->ipo= add_ipo("CoIpo", IPO_CO); } } else if( type==ID_AC) { act= (bAction *)from; - if (!act->achan) return 0; - if (act->id.lib) return 0; + if (!act->achan) return NULL; + if (act->id.lib) return NULL; ipo= act->achan->ipo; /* This should never happen */ - if(make && ipo==0) ipo= act->achan->ipo= add_ipo("AcIpo", ID_AC); + if(make && ipo==NULL) ipo= act->achan->ipo= add_ipo("AcIpo", ID_AC); } else if( type==ID_MA) { ma= (Material *)from; - if(ma->id.lib) return 0; + if(ma->id.lib) return NULL; ipo= ma->ipo; - if(make && ipo==0) ipo= ma->ipo= add_ipo("MatIpo", ID_MA); + if(make && ipo==NULL) ipo= ma->ipo= add_ipo("MatIpo", ID_MA); } else if( type==ID_TE) { tex= (Tex *)from; - if(tex->id.lib) return 0; + if(tex->id.lib) return NULL; ipo= tex->ipo; - if(make && ipo==0) ipo= tex->ipo= add_ipo("TexIpo", ID_TE); + if(make && ipo==NULL) ipo= tex->ipo= add_ipo("TexIpo", ID_TE); } else if( type==ID_SEQ) { seq= (Sequence *)from; if((seq->type & SEQ_EFFECT)||(seq->type == SEQ_SOUND)) { ipo= seq->ipo; - if(make && ipo==0) ipo= seq->ipo= add_ipo("SeqIpo", ID_SEQ); + if(make && ipo==NULL) ipo= seq->ipo= add_ipo("SeqIpo", ID_SEQ); } - else return 0; + else return NULL; } else if( type==ID_CU) { cu= (Curve *)from; - if(cu->id.lib) return 0; + if(cu->id.lib) return NULL; ipo= cu->ipo; - if(make && ipo==0) ipo= cu->ipo= add_ipo("CuIpo", ID_CU); + if(make && ipo==NULL) ipo= cu->ipo= add_ipo("CuIpo", ID_CU); } else if( type==ID_KE) { key= (Key *)from; - if(key->id.lib) return 0; + if(key->id.lib) return NULL; ipo= key->ipo; - if(make && ipo==0) ipo= key->ipo= add_ipo("KeyIpo", ID_KE); + if(make && ipo==NULL) ipo= key->ipo= add_ipo("KeyIpo", ID_KE); } else if( type==ID_WO) { wo= (World *)from; - if(wo->id.lib) return 0; + if(wo->id.lib) return NULL; ipo= wo->ipo; - if(make && ipo==0) ipo= wo->ipo= add_ipo("WoIpo", ID_WO); + if(make && ipo==NULL) ipo= wo->ipo= add_ipo("WoIpo", ID_WO); } else if( type==ID_LA) { la= (Lamp *)from; - if(la->id.lib) return 0; + if(la->id.lib) return NULL; ipo= la->ipo; - if(make && ipo==0) ipo= la->ipo= add_ipo("LaIpo", ID_LA); + if(make && ipo==NULL) ipo= la->ipo= add_ipo("LaIpo", ID_LA); } else if( type==ID_CA) { ca= (Camera *)from; - if(ca->id.lib) return 0; + if(ca->id.lib) return NULL; ipo= ca->ipo; - if(make && ipo==0) ipo= ca->ipo= add_ipo("CaIpo", ID_CA); + if(make && ipo==NULL) ipo= ca->ipo= add_ipo("CaIpo", ID_CA); } else if( type==ID_SO) { bSound *snd= (bSound *)from; - if(snd->id.lib) return 0; + if(snd->id.lib) return NULL; ipo= snd->ipo; - if(make && ipo==0) ipo= snd->ipo= add_ipo("SndIpo", ID_SO); + if(make && ipo==NULL) ipo= snd->ipo= add_ipo("SndIpo", ID_SO); } - else return 0; + else return NULL; return ipo; } diff --git a/source/blender/src/editnla.c b/source/blender/src/editnla.c index 1cfb308164a..e91b645295e 100644 --- a/source/blender/src/editnla.c +++ b/source/blender/src/editnla.c @@ -1764,10 +1764,6 @@ void delete_nlachannels(void){ nextchan = conchan->next; if (conchan->flag & CONSTRAINT_CHANNEL_SELECT){ - /* If we're the active constraint, unlink us */ - if (conchan==base->object->activecon) - base->object->activecon = NULL; - if (conchan->ipo) conchan->ipo->id.us--; BLI_freelinkN(&base->object->constraintChannels, conchan); diff --git a/source/blender/src/editobject.c b/source/blender/src/editobject.c index d14584ffc5b..0e28ee94202 100644 --- a/source/blender/src/editobject.c +++ b/source/blender/src/editobject.c @@ -2769,9 +2769,7 @@ void copy_attr(short event) if (U.dupflag& USER_DUP_IPO) copy_constraint_channels(&base->object->constraintChannels, &ob->constraintChannels); else - clone_constraint_channels (&base->object->constraintChannels, &ob->constraintChannels, NULL); - - base->object->activecon = NULL; + clone_constraint_channels (&base->object->constraintChannels, &ob->constraintChannels); } else if(event==23) { base->object->softflag= ob->softflag; @@ -3622,8 +3620,7 @@ void single_obdata_users(int flag) id_us_plus(id->newid); } else { - ob->action=copy_action(ob->action); - ob->activecon=NULL; + ob->action= copy_action(ob->action); id->us--; id->newid=(ID *)ob->action; } @@ -4086,7 +4083,7 @@ void adduplicate(int noTrans) id= (ID *)obn->ipo; if(id) { ID_NEW_US( obn->ipo) - else obn->ipo= copy_ipo(obn->ipo); + else obn->ipo= copy_ipo(obn->ipo); id->us--; } /* Handle constraint ipos */ @@ -4094,7 +4091,7 @@ void adduplicate(int noTrans) id= (ID *)chan->ipo; if(id) { ID_NEW_US( chan->ipo) - else chan->ipo= copy_ipo(chan->ipo); + else chan->ipo= copy_ipo(chan->ipo); id->us--; } } @@ -4103,9 +4100,8 @@ void adduplicate(int noTrans) id= (ID *)obn->action; if (id){ ID_NEW_US(obn->action) - else{ + else{ obn->action= copy_action(obn->action); - obn->activecon=NULL; } id->us--; } diff --git a/source/blender/src/headerbuttons.c b/source/blender/src/headerbuttons.c index 97c6eae405d..d8a5b1165df 100644 --- a/source/blender/src/headerbuttons.c +++ b/source/blender/src/headerbuttons.c @@ -281,7 +281,7 @@ int std_libbuttons(uiBlock *block, short xco, short yco, if(ob==NULL) { if(G.sipo->blocktype!=ID_SEQ && G.sipo->blocktype!=ID_WO) { id= NULL; - idwasnul= 0; + idwasnul= NULL; } } } @@ -657,7 +657,7 @@ void do_global_buttons(unsigned short event) ob= OBACT; - id= 0; /* id at null for texbrowse */ + id= NULL; /* id at null for texbrowse */ switch(event) { @@ -829,7 +829,7 @@ void do_global_buttons(unsigned short event) if(mtex) { if(mtex->tex) mtex->tex->id.us--; MEM_freeN(mtex); - ma->mtex[ ma->texact ]= 0; + ma->mtex[ ma->texact ]= NULL; allqueue(REDRAWBUTSSHADING, 0); allqueue(REDRAWIPO, 0); BIF_preview_changed(G.buts); @@ -843,7 +843,7 @@ void do_global_buttons(unsigned short event) if(mtex) { if(mtex->tex) mtex->tex->id.us--; MEM_freeN(mtex); - wrld->mtex[ wrld->texact ]= 0; + wrld->mtex[ wrld->texact ]= NULL; allqueue(REDRAWBUTSSHADING, 0); allqueue(REDRAWIPO, 0); BIF_preview_changed(G.buts); @@ -857,7 +857,7 @@ void do_global_buttons(unsigned short event) if(mtex) { if(mtex->tex) mtex->tex->id.us--; MEM_freeN(mtex); - la->mtex[ la->texact ]= 0; + la->mtex[ la->texact ]= NULL; allqueue(REDRAWBUTSSHADING, 0); allqueue(REDRAWIPO, 0); BIF_preview_changed(G.buts); @@ -874,7 +874,7 @@ void do_global_buttons(unsigned short event) id= G.buts->lockpoin; if(event==B_EXTEXBROWSE) { - id= 0; + id= NULL; ma= give_current_material(ob, ob->actcol); if(ma) { mtex= ma->mtex[ ma->texact ]; @@ -891,7 +891,7 @@ void do_global_buttons(unsigned short event) } else { - id= 0; + id= NULL; ma= give_current_material(ob, ob->actcol); if(ma) { @@ -988,7 +988,6 @@ void do_global_buttons(unsigned short event) act= (bAction *)idtest; ob->action= act; - ob->activecon=NULL; id_us_plus(idtest); if(id) id->us--; @@ -1043,7 +1042,7 @@ void do_global_buttons(unsigned short event) nr= GS(from->name); if(nr==ID_OB){ if (G.sipo->blocktype==IPO_CO) - idtest= (ID *)add_ipo("CoIpo", IPO_CO); /* BLEARGH! */ + idtest= (ID *)add_ipo("CoIpo", IPO_CO); /* constraint channel is no ID data... */ else idtest= (ID *)add_ipo("ObIpo", nr); } @@ -1057,7 +1056,7 @@ void do_global_buttons(unsigned short event) else if(nr==ID_CA) idtest= (ID *)add_ipo("CaIpo", nr); else if(nr==ID_SO) idtest= (ID *)add_ipo("SndIpo", nr); else if(nr==ID_AC) idtest= (ID *)add_ipo("ActIpo", nr); - else error("Warn bugs@blender.nl!"); + else error("Warn bugtracker!"); } idtest->us--; } @@ -1065,11 +1064,14 @@ void do_global_buttons(unsigned short event) ipo= (Ipo *)idtest; if (ipo->blocktype==IPO_CO){ - ((Object*)from)->activecon->ipo = ipo; - id_us_plus(idtest); - allqueue(REDRAWVIEW3D, 0); - allqueue(REDRAWACTION, 0); - allqueue(REDRAWNLA, 0); + bConstraintChannel *chan= get_active_constraint_channel((Object*)from); + if(chan) { + chan->ipo = ipo; + id_us_plus(idtest); + allqueue(REDRAWVIEW3D, 0); + allqueue(REDRAWACTION, 0); + allqueue(REDRAWNLA, 0); + } } else if(ipo->blocktype==ID_OB) { ( (Object *)from)->ipo= ipo; @@ -1155,25 +1157,27 @@ void do_global_buttons(unsigned short event) ipo->id.us--; - if(ipo->blocktype==ID_OB) ( (Object *)from)->ipo= 0; - else if(ipo->blocktype==ID_MA) ( (Material *)from)->ipo= 0; - else if(ipo->blocktype==ID_TE) ( (Tex *)from)->ipo= 0; - else if(ipo->blocktype==ID_SEQ) ( (Sequence *)from)->ipo= 0; - else if(ipo->blocktype==ID_CU) ( (Curve *)from)->ipo= 0; - else if(ipo->blocktype==ID_KE) ( (Key *)from)->ipo= 0; - else if(ipo->blocktype==ID_WO) ( (World *)from)->ipo= 0; - else if(ipo->blocktype==ID_LA) ( (Lamp *)from)->ipo= 0; - else if(ipo->blocktype==ID_WO) ( (World *)from)->ipo= 0; - else if(ipo->blocktype==ID_CA) ( (Camera *)from)->ipo= 0; - else if(ipo->blocktype==ID_SO) ( (bSound *)from)->ipo= 0; + if(ipo->blocktype==ID_OB) ( (Object *)from)->ipo= NULL; + else if(ipo->blocktype==ID_MA) ( (Material *)from)->ipo= NULL; + else if(ipo->blocktype==ID_TE) ( (Tex *)from)->ipo= NULL; + else if(ipo->blocktype==ID_SEQ) ( (Sequence *)from)->ipo= NULL; + else if(ipo->blocktype==ID_CU) ( (Curve *)from)->ipo= NULL; + else if(ipo->blocktype==ID_KE) ( (Key *)from)->ipo= NULL; + else if(ipo->blocktype==ID_WO) ( (World *)from)->ipo= NULL; + else if(ipo->blocktype==ID_LA) ( (Lamp *)from)->ipo= NULL; + else if(ipo->blocktype==ID_WO) ( (World *)from)->ipo= NULL; + else if(ipo->blocktype==ID_CA) ( (Camera *)from)->ipo= NULL; + else if(ipo->blocktype==ID_SO) ( (bSound *)from)->ipo= NULL; else if(ipo->blocktype==ID_AC) { bAction *act = (bAction*) from; bActionChannel *chan = get_hilighted_action_channel((bAction*)from); BLI_freelinkN (&act->chanbase, chan); } - else if(ipo->blocktype==IPO_CO) ((Object *)from)->activecon->ipo= 0; - + else if(ipo->blocktype==IPO_CO) { + bConstraintChannel *chan= get_active_constraint_channel((Object*)from); + if(chan) chan->ipo= NULL; + } else error("Warn bugtracker!"); editipo_changed(G.sipo, 1); /* doredraw */ @@ -1226,7 +1230,7 @@ void do_global_buttons(unsigned short event) case B_WORLDDELETE: if(G.scene->world) { G.scene->world->id.us--; - G.scene->world= 0; + G.scene->world= NULL; BIF_undo_push("Unlink World"); allqueue(REDRAWBUTSSHADING, 0); @@ -1237,7 +1241,7 @@ void do_global_buttons(unsigned short event) case B_WTEXBROWSE: if(G.buts->texnr== -2) { - id= 0; + id= NULL; wrld= G.scene->world; if(wrld) { mtex= wrld->mtex[ wrld->texact ]; @@ -1253,7 +1257,7 @@ void do_global_buttons(unsigned short event) } else { - id= 0; + id= NULL; wrld= G.scene->world; if(wrld) { @@ -1338,7 +1342,7 @@ void do_global_buttons(unsigned short event) if(ob->type!=OB_LAMP) return; if(G.buts->texnr== -2) { - id= 0; + id= NULL; la= ob->data; mtex= la->mtex[ la->texact ]; if(mtex) id= (ID *)mtex->tex; @@ -1352,7 +1356,7 @@ void do_global_buttons(unsigned short event) } else { - id= 0; + id= NULL; la= ob->data; mtex= la->mtex[ la->texact ]; @@ -1391,7 +1395,7 @@ void do_global_buttons(unsigned short event) break; case B_IMAGEDELETE: - G.sima->image= 0; + G.sima->image= NULL; image_changed(G.sima, 0); BIF_undo_push("Unlink Image"); allqueue(REDRAWIMAGE, 0); @@ -1744,7 +1748,6 @@ void do_global_buttons2(short event) if(act->id.us>1) { if(okee("Single user")) { ob->action=copy_action(act); - ob->activecon=NULL; act->id.us--; allqueue(REDRAWACTION, 0); } @@ -1997,9 +2000,11 @@ void do_global_buttons2(short event) else if(ipo->blocktype==ID_WO) ((World *)idfrom)->ipo= copy_ipo(ipo); else if(ipo->blocktype==ID_CA) ((Camera *)idfrom)->ipo= copy_ipo(ipo); else if(ipo->blocktype==ID_SO) ((bSound *)idfrom)->ipo= copy_ipo(ipo); - else if(ipo->blocktype==ID_AC) get_hilighted_action_channel((bAction *)idfrom)->ipo= copy_ipo(ipo); - else if(ipo->blocktype==IPO_CO) ((Object *)idfrom)->activecon->ipo= copy_ipo(ipo); - else error("Warn ton!"); + else if(ipo->blocktype==ID_AC) + get_hilighted_action_channel((bAction *)idfrom)->ipo= copy_ipo(ipo); + else if(ipo->blocktype==IPO_CO) + get_active_constraint_channel((Object*)idfrom)->ipo= copy_ipo(ipo); + else error("Warn bugtracker!"); ipo->id.us--; allqueue(REDRAWIPO, 0); diff --git a/source/blender/src/interface.c b/source/blender/src/interface.c index 8515168d84a..78eb0297e64 100644 --- a/source/blender/src/interface.c +++ b/source/blender/src/interface.c @@ -2086,6 +2086,7 @@ static int ui_do_but_SLI(uiBut *but) ui_set_but_val(but, tempf); } + uibut_do_func(but); } ui_check_but(but); ui_draw_but(but); @@ -2864,6 +2865,7 @@ static int ui_do_button(uiBlock *block, uiBut *but, uiEvent *uevent) if(uevent->val) retval= ui_do_but_NUMSLI(but); break; + case ROUNDBOX: case LABEL: if(uevent->val) retval= ui_do_but_LABEL(but); break; diff --git a/source/blender/src/outliner.c b/source/blender/src/outliner.c index af4218011de..03b833de47a 100644 --- a/source/blender/src/outliner.c +++ b/source/blender/src/outliner.c @@ -507,7 +507,7 @@ static TreeElement *outliner_add_element(SpaceOops *soops, ListBase *lb, void *i temod->name = "Modifiers"; for (index=0,md=ob->modifiers.first; md; index++,md=md->next) { TreeElement *te = outliner_add_element(soops, &temod->subtree, ob, temod, TSE_MODIFIER, index); - if(te) te->name= md->name; + te->name= md->name; if (md->type==eModifierType_Lattice) { outliner_add_element(soops, &te->subtree, ((LatticeModifierData*) md)->object, te, TSE_MODIFIER_OB, 0); diff --git a/source/blender/src/poseobject.c b/source/blender/src/poseobject.c index b400cd0bc3b..3ead7a3cab9 100644 --- a/source/blender/src/poseobject.c +++ b/source/blender/src/poseobject.c @@ -148,6 +148,22 @@ void exit_posemode(void) scrarea_queue_headredraw(curarea); } +/* called by buttons to find a bone to display/edit values for */ +bPoseChannel *get_active_posechannel (Object *ob) +{ + bPoseChannel *pchan; + + /* find active */ + for(pchan= ob->pose->chanbase.first; pchan; pchan= pchan->next) { + if(pchan->bone && (pchan->bone->flag & BONE_ACTIVE)) + return pchan; + } + + return NULL; +} + + + void pose_select_constraint_target(void) { Object *ob= OBACT; diff --git a/source/blender/yafray/intern/yafray_Render.h b/source/blender/yafray/intern/yafray_Render.h index 8d9086d03cc..e1a63e90bb7 100644 --- a/source/blender/yafray/intern/yafray_Render.h +++ b/source/blender/yafray/intern/yafray_Render.h @@ -8,32 +8,16 @@ extern "C" { #include "MEM_guardedalloc.h" #include "IMB_imbuf_types.h" -#include "DNA_action_types.h" -#include "DNA_armature_types.h" #include "DNA_camera_types.h" -#include "DNA_constraint_types.h" -#include "DNA_curve_types.h" -#include "DNA_effect_types.h" -#include "DNA_group_types.h" #include "DNA_image_types.h" -#include "DNA_key_types.h" #include "DNA_lamp_types.h" -#include "DNA_lattice_types.h" #include "DNA_material_types.h" -#include "DNA_meta_types.h" #include "DNA_mesh_types.h" #include "DNA_meshdata_types.h" #include "DNA_object_types.h" -#include "DNA_packedFile_types.h" -#include "DNA_radio_types.h" #include "DNA_scene_types.h" -#include "DNA_screen_types.h" -#include "DNA_sound_types.h" -#include "DNA_space_types.h" #include "DNA_texture_types.h" #include "DNA_userdef_types.h" -#include "DNA_vfont_types.h" -#include "DNA_view3d_types.h" #include "DNA_world_types.h" #include "BKE_global.h" |