Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--source/blender/blenkernel/BKE_constraint.h4
-rw-r--r--source/blender/blenkernel/intern/action.c1
-rw-r--r--source/blender/blenkernel/intern/constraint.c12
-rw-r--r--source/blender/blenkernel/intern/object.c58
-rw-r--r--source/blender/blenloader/intern/readfile.c4
-rw-r--r--source/blender/include/BIF_editconstraint.h23
-rw-r--r--source/blender/include/BIF_poseobject.h2
-rw-r--r--source/blender/include/butspace.h6
-rw-r--r--source/blender/makesdna/DNA_constraint_types.h75
-rw-r--r--source/blender/makesdna/DNA_object_types.h5
-rw-r--r--source/blender/src/buttons_object.c409
-rw-r--r--source/blender/src/editarmature.c19
-rw-r--r--source/blender/src/editconstraint.c181
-rw-r--r--source/blender/src/editipo.c72
-rw-r--r--source/blender/src/editnla.c4
-rw-r--r--source/blender/src/editobject.c14
-rw-r--r--source/blender/src/headerbuttons.c81
-rw-r--r--source/blender/src/interface.c2
-rw-r--r--source/blender/src/outliner.c2
-rw-r--r--source/blender/src/poseobject.c16
-rw-r--r--source/blender/yafray/intern/yafray_Render.h16
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"