diff options
author | Ton Roosendaal <ton@blender.org> | 2005-10-10 22:05:30 +0400 |
---|---|---|
committer | Ton Roosendaal <ton@blender.org> | 2005-10-10 22:05:30 +0400 |
commit | 4bd9775936c1b5a1656713d8c6a679b711b93d93 (patch) | |
tree | 7a4d0c39ffef76f3f34f5dea7ad85a02587414a1 /source/blender | |
parent | 9b8868532a9e0970f83eb68ef36144eaca9525a1 (diff) |
Stupid me! Committed in wrong console with wrong dir... here's the rest of
all files for the Ipo/Action/NLA makeover...
Diffstat (limited to 'source/blender')
36 files changed, 745 insertions, 447 deletions
diff --git a/source/blender/blenkernel/BKE_action.h b/source/blender/blenkernel/BKE_action.h index 5b8c8c1a929..21e7b2f7fc0 100644 --- a/source/blender/blenkernel/BKE_action.h +++ b/source/blender/blenkernel/BKE_action.h @@ -75,8 +75,13 @@ void free_action(struct bAction * id); void make_local_action(struct bAction *act); -/* if NULL it does all, otherwise only from Object */ -void do_all_actions(struct Object *); +/* only for armatures, doing pose actions only too */ +void do_all_pose_actions(struct Object *); +/* only for objects, doing only 1 channel */ +void do_all_object_actions(struct Object *); +/* only for Mesh, Curve, Surface, Lattice, doing only Shape channel */ +void do_all_shape_actions(struct Object *); + /** * Return a pointer to the pose channel of the given name @@ -121,13 +126,20 @@ void extract_pose_from_action(struct bPose *pose, struct bAction *act, * and return the channel with the given name. * Returns NULL if no channel. */ -struct bActionChannel *get_named_actionchannel(struct bAction *act, - const char *name); +struct bActionChannel *get_action_channel(struct bAction *act, const char *name); +/** + * Iterate through the action channels of the action + * and return the channel with the given name. + * Returns and adds new channel if no channel. + */ +struct bActionChannel *verify_action_channel(struct bAction *act, const char *name); -// exported for game engine +/* exported for game engine */ void blend_poses(struct bPose *dst, const struct bPose *src, float srcweight, short mode); void extract_pose_from_pose(struct bPose *pose, const struct bPose *src); +/* map global time (frame nr) to strip converted time, doesn't clip */ +float get_action_frame(struct Object *ob, float cframe); #ifdef __cplusplus }; diff --git a/source/blender/blenkernel/BKE_constraint.h b/source/blender/blenkernel/BKE_constraint.h index fc45daf455f..2bec643d5b0 100644 --- a/source/blender/blenkernel/BKE_constraint.h +++ b/source/blender/blenkernel/BKE_constraint.h @@ -51,13 +51,14 @@ void clone_constraint_channels (struct ListBase *dst, struct ListBase *src); void relink_constraints (struct ListBase *list); void free_constraint_data (struct bConstraint *con); -void do_constraint_channels (struct ListBase *conbase, struct ListBase *chanbase, float ctime); -short get_constraint_target_matrix (struct bConstraint *con, short ownertype, void *ownerdata, float mat[][4], float size[3], float time); -struct bConstraintChannel *find_constraint_channel (ListBase *list, const char *name); +/* channels */ +struct bConstraintChannel *get_constraint_channel (ListBase *list, const char *name); +struct bConstraintChannel *verify_constraint_channel (ListBase *list, const char *name); void free_constraint_channels (ListBase *chanbase); /* Gemeric functions */ - +void do_constraint_channels (struct ListBase *conbase, struct ListBase *chanbase, float ctime); +short get_constraint_target_matrix (struct bConstraint *con, short ownertype, void *ownerdata, float mat[][4], float size[3], float time); char constraint_has_target (struct bConstraint *con); struct Object *get_constraint_target(struct bConstraint *con, char **subtarget); void set_constraint_target(struct bConstraint *con, struct Object *ob, char *subtarget); diff --git a/source/blender/blenkernel/BKE_ipo.h b/source/blender/blenkernel/BKE_ipo.h index 6acbceb8e3f..a1fb24ae9b2 100644 --- a/source/blender/blenkernel/BKE_ipo.h +++ b/source/blender/blenkernel/BKE_ipo.h @@ -49,13 +49,15 @@ struct Sequence; struct ListBase; struct BezTriple; struct ID; -/* struct IPO_Channel; */ +struct bPoseChannel; +struct bActionChannel; +struct rctf; float frame_to_float(int cfra); void free_ipo_curve(struct IpoCurve *icu); void free_ipo(struct Ipo *ipo); - +void ipo_default_v2d_cur(int blocktype, struct rctf *cur); struct Ipo *add_ipo(char *name, int idcode); struct Ipo *copy_ipo(struct Ipo *ipo); void make_local_obipo(struct Ipo *ipo); @@ -79,9 +81,14 @@ void calc_ipo(struct Ipo *ipo, float ctime); void write_ipo_poin(void *poin, int type, float val); float read_ipo_poin(void *poin, int type); void *give_mtex_poin(struct MTex *mtex, int adrcode ); + void *get_ipo_poin(struct ID *id, struct IpoCurve *icu, int *type); +void *get_pchan_ipo_poin(struct bPoseChannel *pchan, int adrcode); + void set_icu_vars(struct IpoCurve *icu); + void execute_ipo(struct ID *id, struct Ipo *ipo); +void execute_action_ipo(struct bActionChannel *achan, struct bPoseChannel *pchan); void do_ipo_nocalc(struct Ipo *ipo); void do_ipo(struct Ipo *ipo); @@ -96,9 +103,9 @@ int calc_ipo_spec(struct Ipo *ipo, int adrcode, float *ctime); void clear_delta_obipo(struct Ipo *ipo); void add_to_cfra_elem(struct ListBase *lb, struct BezTriple *bezt); void make_cfra_list(struct Ipo *ipo, struct ListBase *elems); + /* the sort is an IPO_Channel... */ int IPO_GetChannels(struct Ipo *ipo, short *channels); -void test_ipo_get(void); float IPO_GetFloatValue(struct Ipo *ipo, /* struct IPO_Channel channel, */ diff --git a/source/blender/blenkernel/bad_level_call_stubs/stubs.c b/source/blender/blenkernel/bad_level_call_stubs/stubs.c index f5d06fc5a7e..706c9980344 100644 --- a/source/blender/blenkernel/bad_level_call_stubs/stubs.c +++ b/source/blender/blenkernel/bad_level_call_stubs/stubs.c @@ -61,11 +61,6 @@ char* getIpoCurveName( struct IpoCurve * icu ) return 0; }; -struct IpoCurve *get_ipocurve(struct ID *from, short type, int adrcode, struct Ipo *useipo) -{ - return 0; -} - void insert_vert_ipo(struct IpoCurve *icu, float x, float y) { diff --git a/source/blender/blenkernel/intern/action.c b/source/blender/blenkernel/intern/action.c index 2df93f47e2a..276f5ecdcec 100644 --- a/source/blender/blenkernel/intern/action.c +++ b/source/blender/blenkernel/intern/action.c @@ -310,7 +310,10 @@ void update_pose_constraint_flags(bPose *pose) /* ************************ END Pose channels *************** */ -bActionChannel *get_named_actionchannel(bAction *act, const char *name) +/* ************************ Action channels *************** */ + + +bActionChannel *get_action_channel(bAction *act, const char *name) { bActionChannel *chan; @@ -325,6 +328,22 @@ bActionChannel *get_named_actionchannel(bAction *act, const char *name) return NULL; } +/* returns existing channel, or adds new one. In latter case it doesnt activate it, context is required for that*/ +bActionChannel *verify_action_channel(bAction *act, const char *name) +{ + bActionChannel *chan; + + chan= get_action_channel(act, name); + if(chan==NULL) { + if (!chan) { + chan = MEM_callocN (sizeof(bActionChannel), "actionChannel"); + strcpy (chan->name, name); + BLI_addtail (&act->chanbase, chan); + } + } + return chan; +} + /* ************************ Blending with NLA *************** */ @@ -395,20 +414,25 @@ float calc_action_start(const bAction *act) if (!act) return 0; - for (chan=act->chanbase.first; chan; chan=chan->next){ - for (icu=chan->ipo->curve.first; icu; icu=icu->next) - for (i=0; i<icu->totvert; i++){ - size = MIN2 (size, icu->bezt[i].vec[1][0]); - foundvert=1; - + for (chan=act->chanbase.first; chan; chan=chan->next) { + if(chan->ipo) { + for (icu=chan->ipo->curve.first; icu; icu=icu->next) { + for (i=0; i<icu->totvert; i++){ + size = MIN2 (size, icu->bezt[i].vec[1][0]); + foundvert=1; + } } - for (conchan=chan->constraintChannels.first; conchan; conchan=conchan->next){ - for (icu=conchan->ipo->curve.first; icu; icu=icu->next) + } + for (conchan=chan->constraintChannels.first; conchan; conchan=conchan->next) { + if(conchan->ipo) { + for (icu=conchan->ipo->curve.first; icu; icu=icu->next) { for (i=0; i<icu->totvert; i++){ size = MIN2 (size, icu->bezt[i].vec[1][0]); foundvert=1; } + } } + } } if (!foundvert) @@ -428,16 +452,20 @@ float calc_action_end(const bAction *act) if (!act) return 0; - for (chan=act->chanbase.first; chan; chan=chan->next){ - for (icu=chan->ipo->curve.first; icu; icu=icu->next) - for (i=0; i<icu->totvert; i++) - size = MAX2 (size, icu->bezt[i].vec[1][0]); - - for (conchan=chan->constraintChannels.first; conchan; conchan=conchan->next){ + for (chan=act->chanbase.first; chan; chan=chan->next) { + if(chan->ipo) { + for (icu=chan->ipo->curve.first; icu; icu=icu->next) + for (i=0; i<icu->totvert; i++) + size = MAX2 (size, icu->bezt[i].vec[1][0]); + } + + for (conchan=chan->constraintChannels.first; conchan; conchan=conchan->next){ + if(conchan->ipo) { for (icu=conchan->ipo->curve.first; icu; icu=icu->next) for (i=0; i<icu->totvert; i++) size = MAX2 (size, icu->bezt[i].vec[1][0]); } + } } return size; } @@ -469,18 +497,16 @@ void extract_pose_from_action(bPose *pose, bAction *act, float ctime) /* Copy the data from the action into the pose */ for (pchan= pose->chanbase.first; pchan; pchan=pchan->next) { - achan= get_named_actionchannel(act, pchan->name); + achan= get_action_channel(act, pchan->name); pchan->flag= 0; if(achan) { ipo = achan->ipo; if (ipo) { - act->achan= achan; // for ipos - act->pchan= pchan; // for ipos /* Evaluates and sets the internal ipo value */ calc_ipo(ipo, ctime); /* This call also sets the pchan flags */ - execute_ipo((ID*)act, achan->ipo); + execute_action_ipo(achan, pchan); do_constraint_channels(&pchan->constraints, &achan->constraintChannels, ctime); } @@ -488,8 +514,8 @@ void extract_pose_from_action(bPose *pose, bAction *act, float ctime) } } -/* for do_all_actions, clears the pose */ -static void rest_pose(bPose *pose, int clearflag) +/* for do_all_pose_actions, clears the pose */ +static void rest_pose(bPose *pose) { bPoseChannel *chan; int i; @@ -505,13 +531,166 @@ static void rest_pose(bPose *pose, int clearflag) } chan->quat[0]=1.0; - if (clearflag) - chan->flag =0; + chan->flag =0; + } +} + +/* ********** NLA with non-poses works with ipo channels ********** */ + +typedef struct NlaIpoChannel { + struct NlaIpoChannel *next, *prev; + float val; + void *poin; + int type; +} NlaIpoChannel; + +static void extract_ipochannels_from_action(ListBase *lb, ID *id, bAction *act, char *name, float ctime) +{ + bActionChannel *achan= get_action_channel(act, name); + IpoCurve *icu; + NlaIpoChannel *nic; + + if(achan==NULL) return; + + if(achan->ipo) { + calc_ipo(achan->ipo, ctime); + + for(icu= achan->ipo->curve.first; icu; icu= icu->next) { + + nic= MEM_callocN(sizeof(NlaIpoChannel), "NlaIpoChannel"); + BLI_addtail(lb, nic); + nic->val= icu->curval; + nic->poin= get_ipo_poin(id, icu, &nic->type); + } + } + + /* constraint channels only for objects */ + if(GS(id->name)==ID_OB) { + Object *ob= (Object *)id; + bConstraint *con; + bConstraintChannel *conchan; + + for (con=ob->constraints.first; con; con=con->next) { + conchan = get_constraint_channel(&achan->constraintChannels, con->name); + + if(conchan && conchan->ipo) { + calc_ipo(conchan->ipo, ctime); + + icu= conchan->ipo->curve.first; // only one ipo now + if(icu) { + nic= MEM_callocN(sizeof(NlaIpoChannel), "NlaIpoChannel constr"); + BLI_addtail(lb, nic); + nic->val= icu->curval; + nic->poin= &con->enforce; + nic->type= IPO_FLOAT; + } + } + } + } +} + +static NlaIpoChannel *find_nla_ipochannel(ListBase *lb, void *poin) +{ + NlaIpoChannel *nic; + + if(poin) { + for(nic= lb->first; nic; nic= nic->next) { + if(nic->poin==poin) + return nic; + } + } + return NULL; +} + + +static void blend_ipochannels(ListBase *dst, ListBase *src, float srcweight, int mode) +{ + NlaIpoChannel *snic, *dnic, *next; + float dstweight; + + switch (mode){ + case POSE_BLEND: + dstweight = 1.0F - srcweight; + break; + case POSE_ADD: + dstweight = 1.0F; + break; + default : + dstweight = 1.0F; + } + + for(snic= src->first; snic; snic= next) { + next= snic->next; + + dnic= find_nla_ipochannel(dst, snic->poin); + if(dnic==NULL) { + /* remove from src list, and insert in dest */ + BLI_remlink(src, snic); + BLI_addtail(dst, snic); + } + else { + /* we do the blend */ + dnic->val= dstweight*dnic->val + srcweight*snic->val; + } + } +} + +static void execute_ipochannels(Object *ob, ListBase *lb) +{ + NlaIpoChannel *nic; + + for(nic= lb->first; nic; nic= nic->next) { + if(nic->poin) write_ipo_poin(nic->poin, nic->type, nic->val); } } + /* ************** time ****************** */ +static bActionStrip *get_active_strip(Object *ob) +{ + bActionStrip *strip; + + if(ob->action==NULL) + return NULL; + + for (strip=ob->nlastrips.first; strip; strip=strip->next) + if(strip->flag & ACTSTRIP_ACTIVE) + break; + + if(strip && strip->act==ob->action) + return strip; + return NULL; +} + +/* non clipped mapping of strip */ +static float get_actionstrip_frame(bActionStrip *strip, float cframe) +{ + float length, actlength, repeat; + + if (strip->flag & ACTSTRIP_USESTRIDE) + repeat= 1.0f; + else + repeat= strip->repeat; + + length = strip->end-strip->start; + if(length==0.0f) + length= 1.0f; + actlength = strip->actend-strip->actstart; + + return repeat*actlength*(cframe - strip->start)/length + strip->actstart; +} + +/* if the conditions match, it converts current time to strip time */ +float get_action_frame(Object *ob, float cframe) +{ + bActionStrip *strip= get_active_strip(ob); + + if(strip) + return get_actionstrip_frame(strip, cframe); + return cframe; +} + /* this now only used for repeating cycles, to enable fields and blur. */ /* the whole time control in blender needs serious thinking... */ static float nla_time(float cfra, float unit) @@ -538,129 +717,185 @@ static float nla_time(float cfra, float unit) /* ************** do the action ************ */ -void do_all_actions(Object *ob) +static void do_nla(Object *ob, int blocktype) { - bPose *tpose=NULL; + bPose *tpose= NULL; + ListBase tchanbase={NULL, NULL}, chanbase={NULL, NULL}; bActionStrip *strip; - float ctime, striptime, frametime, length, actlength; + float striptime, frametime, length, actlength; float blendfac, stripframe; int doit; - - // only to have safe calls from editor - if(ob==NULL) return; - if(ob->type!=OB_ARMATURE || ob->pose==NULL) return; - - ctime= bsystem_time(ob, 0, (float) G.scene->r.cfra, 0.0); - - if(ob->pose->flag & POSE_LOCKED) { // no actions to execute while transform - ; - } - else if(ob->action) { - /* Do local action (always overrides the nla actions) */ - extract_pose_from_action (ob->pose, ob->action, bsystem_time(ob, 0, (float) G.scene->r.cfra, 0.0)); + if(blocktype==ID_AR) { + copy_pose(&tpose, ob->pose, 1); + rest_pose(ob->pose); // potentially destroying current not-keyed pose } - else if(ob->nlastrips.first) { + + for (strip=ob->nlastrips.first; strip; strip=strip->next){ doit=0; - - copy_pose(&tpose, ob->pose, 1); - rest_pose(ob->pose, 1); // potentially destroying current not-keyed pose - - for (strip=ob->nlastrips.first; strip; strip=strip->next){ - doit = 0; - if (strip->act){ - /* Determine if the current frame is within the strip's range */ - length = strip->end-strip->start; - actlength = strip->actend-strip->actstart; - striptime = (G.scene->r.cfra-(strip->start)) / length; - stripframe = (G.scene->r.cfra-(strip->start)) ; - - - if (striptime>=0.0){ - - rest_pose(tpose, 1); - - /* Handle path */ - if (strip->flag & ACTSTRIP_USESTRIDE){ - if (ob->parent && ob->parent->type==OB_CURVE){ - Curve *cu = ob->parent->data; - float ctime, pdist; - - if (cu->flag & CU_PATH){ - /* Ensure we have a valid path */ - if(cu->path==NULL || cu->path->data==NULL) makeDispListCurveTypes(ob->parent, 0); - if(cu->path) { - - /* Find the position on the path */ - ctime= bsystem_time(ob, ob->parent, (float)G.scene->r.cfra, 0.0); - - if(calc_ipo_spec(cu->ipo, CU_SPEED, &ctime)==0) { - ctime /= cu->pathlen; - CLAMP(ctime, 0.0, 1.0); - } - pdist = ctime*cu->path->totdist; - - if (strip->stridelen) - striptime = pdist / strip->stridelen; - else - striptime = 0; - - striptime = (float)fmod (striptime, 1.0); - - frametime = (striptime * actlength) + strip->actstart; - extract_pose_from_action (tpose, strip->act, bsystem_time(ob, 0, frametime, 0.0)); - doit=1; + if (strip->act){ /* so theres an action */ + + /* Determine if the current frame is within the strip's range */ + length = strip->end-strip->start; + actlength = strip->actend-strip->actstart; + striptime = (G.scene->r.cfra-(strip->start)) / length; + stripframe = (G.scene->r.cfra-(strip->start)) ; + + if (striptime>=0.0){ + + if(blocktype==ID_AR) + rest_pose(tpose); + + /* Handle path */ + if (strip->flag & ACTSTRIP_USESTRIDE){ + if (ob->parent && ob->parent->type==OB_CURVE){ + Curve *cu = ob->parent->data; + float ctime, pdist; + + if (cu->flag & CU_PATH){ + /* Ensure we have a valid path */ + if(cu->path==NULL || cu->path->data==NULL) makeDispListCurveTypes(ob->parent, 0); + if(cu->path) { + + /* Find the position on the path */ + ctime= bsystem_time(ob, ob->parent, (float)G.scene->r.cfra, 0.0); + + if(calc_ipo_spec(cu->ipo, CU_SPEED, &ctime)==0) { + ctime /= cu->pathlen; + CLAMP(ctime, 0.0, 1.0); } + pdist = ctime*cu->path->totdist; + + if (strip->stridelen) + striptime = pdist / strip->stridelen; + else + striptime = 0; + + striptime = (float)fmod (striptime, 1.0); + + frametime = (striptime * actlength) + strip->actstart; + + if(blocktype==ID_AR) + extract_pose_from_action (tpose, strip->act, bsystem_time(ob, 0, frametime, 0.0)); + else if(blocktype==ID_OB) + extract_ipochannels_from_action(&tchanbase, &ob->id, strip->act, "Object", bsystem_time(ob, 0, frametime, 0.0)); + + doit=1; } } } - - /* Handle repeat */ - - else if (striptime < 1.0){ - /* Mod to repeat */ - striptime*=strip->repeat; - striptime = (float)fmod (striptime, 1.0); + } + /* Handle repeat */ + else if (striptime < 1.0) { + /* Mod to repeat */ + striptime*=strip->repeat; + striptime = (float)fmod (striptime, 1.0); + + frametime = (striptime * actlength) + strip->actstart; + + if(blocktype==ID_AR) + extract_pose_from_action (tpose, strip->act, nla_time(frametime, (float)strip->repeat)); + else if(blocktype==ID_OB) + extract_ipochannels_from_action(&tchanbase, &ob->id, strip->act, "Object", nla_time(frametime, (float)strip->repeat)); + doit=1; + } + /* Handle extend */ + else{ + if (strip->flag & ACTSTRIP_HOLDLASTFRAME){ + striptime = 1.0; frametime = (striptime * actlength) + strip->actstart; - extract_pose_from_action (tpose, strip->act, nla_time(frametime, (float)strip->repeat)); + + if(blocktype==ID_AR) + extract_pose_from_action (tpose, strip->act, bsystem_time(ob, 0, frametime, 0.0)); + else if(blocktype==ID_OB) + extract_ipochannels_from_action(&tchanbase, &ob->id, strip->act, "Object", bsystem_time(ob, 0, frametime, 0.0)); + doit=1; } - /* Handle extend */ - else{ - if (strip->flag & ACTSTRIP_HOLDLASTFRAME){ - striptime = 1.0; - frametime = (striptime * actlength) + strip->actstart; - extract_pose_from_action (tpose, strip->act, bsystem_time(ob, 0, frametime, 0.0)); - doit=1; - } + } + + /* Handle blendin & blendout */ + if (doit){ + /* Handle blendin */ + + if (strip->blendin>0.0 && stripframe<=strip->blendin && G.scene->r.cfra>=strip->start){ + blendfac = stripframe/strip->blendin; } - - /* Handle blendin & blendout */ - if (doit){ - /* Handle blendin */ - - if (strip->blendin>0.0 && stripframe<=strip->blendin && G.scene->r.cfra>=strip->start){ - blendfac = stripframe/strip->blendin; - } - else if (strip->blendout>0.0 && stripframe>=(length-strip->blendout) && G.scene->r.cfra<=strip->end){ - blendfac = (length-stripframe)/(strip->blendout); - } - else - blendfac = 1; - - /* Blend this pose with the accumulated pose */ + else if (strip->blendout>0.0 && stripframe>=(length-strip->blendout) && G.scene->r.cfra<=strip->end){ + blendfac = (length-stripframe)/(strip->blendout); + } + else + blendfac = 1; + + if(blocktype==ID_AR) /* Blend this pose with the accumulated pose */ blend_poses (ob->pose, tpose, blendfac, strip->mode); + else { + blend_ipochannels(&chanbase, &tchanbase, blendfac, strip->mode); + BLI_freelistN(&tchanbase); } - } - } + } + } } } + if(blocktype==ID_OB) { + execute_ipochannels(ob, &chanbase); + } + if (tpose){ free_pose_channels(tpose); MEM_freeN(tpose); } + if(chanbase.first) + BLI_freelistN(&chanbase); + + +} + +void do_all_pose_actions(Object *ob) +{ + + // only to have safe calls from editor + if(ob==NULL) return; + if(ob->type!=OB_ARMATURE || ob->pose==NULL) return; + + if(ob->pose->flag & POSE_LOCKED) { // no actions to execute while transform + ; + } + else if(ob->action && ((ob->nlaflag & OB_NLA_OVERRIDE)==0 || ob->nlastrips.first==NULL) ) { + float cframe= (float) G.scene->r.cfra; + + cframe= get_action_frame(ob, cframe); + + extract_pose_from_action (ob->pose, ob->action, bsystem_time(ob, 0, cframe, 0.0)); + } + else if(ob->nlastrips.first) { + do_nla(ob, ID_AR); + } +} + +/* called from where_is_object */ +void do_all_object_actions(Object *ob) +{ + if(ob==NULL) return; + + /* Do local action */ + if(ob->action && ((ob->nlaflag & OB_NLA_OVERRIDE)==0 || ob->nlastrips.first==NULL) ) { + ListBase tchanbase= {NULL, NULL}; + float cframe= (float) G.scene->r.cfra; + + cframe= get_action_frame(ob, cframe); + + extract_ipochannels_from_action(&tchanbase, &ob->id, ob->action, "Object", bsystem_time(ob, 0, cframe, 0.0)); + if(tchanbase.first) { + execute_ipochannels(ob, &tchanbase); + BLI_freelistN(&tchanbase); + } + } + else if(ob->nlastrips.first) { + do_nla(ob, ID_OB); + } } diff --git a/source/blender/blenkernel/intern/constraint.c b/source/blender/blenkernel/intern/constraint.c index 6fd3cbcfd8b..48d9db1a516 100644 --- a/source/blender/blenkernel/intern/constraint.c +++ b/source/blender/blenkernel/intern/constraint.c @@ -618,7 +618,7 @@ void *new_constraint_data (short type) return result; } -bConstraintChannel *find_constraint_channel (ListBase *list, const char *name) +bConstraintChannel *get_constraint_channel (ListBase *list, const char *name) { bConstraintChannel *chan; @@ -630,6 +630,22 @@ bConstraintChannel *find_constraint_channel (ListBase *list, const char *name) return NULL; } +/* finds or creates new constraint channel */ +bConstraintChannel *verify_constraint_channel (ListBase *list, const char *name) +{ + bConstraintChannel *chan; + + chan= get_constraint_channel (list, name); + if(chan==NULL) { + chan= MEM_callocN(sizeof(bConstraintChannel), "new constraint chan"); + BLI_addtail(list, chan); + strcpy(chan->name, name); + } + + return chan; +} + + /* ***************** Evaluating ********************* */ /* does ipos only */ @@ -640,7 +656,7 @@ void do_constraint_channels (ListBase *conbase, ListBase *chanbase, float ctime) IpoCurve *icu=NULL; for (con=conbase->first; con; con=con->next) { - chan = find_constraint_channel(chanbase, con->name); + chan = get_constraint_channel(chanbase, con->name); if (chan && chan->ipo){ calc_ipo(chan->ipo, ctime); for (icu=chan->ipo->curve.first; icu; icu=icu->next){ diff --git a/source/blender/blenkernel/intern/depsgraph.c b/source/blender/blenkernel/intern/depsgraph.c index 68ab67c399d..76acb9cfdc8 100644 --- a/source/blender/blenkernel/intern/depsgraph.c +++ b/source/blender/blenkernel/intern/depsgraph.c @@ -1460,8 +1460,12 @@ void DAG_scene_update_flags(Scene *sce, unsigned int lay) if(ob->parent->type==OB_CURVE) ob->recalc |= OB_RECALC_OB; } - if(ob->action) ob->recalc |= OB_RECALC_DATA; - else if(ob->nlastrips.first) ob->recalc |= OB_RECALC_DATA; + if(ob->action || ob->nlastrips.first) { + /* since actions now are mixed, we set the recalcs on the safe side */ + ob->recalc |= OB_RECALC_OB; + if(ob->type==OB_ARMATURE) + ob->recalc |= OB_RECALC_DATA; + } else if(modifiers_isSoftbodyEnabled(ob)) ob->recalc |= OB_RECALC_DATA; else if(object_modifiers_use_time(ob)) ob->recalc |= OB_RECALC_DATA; else { diff --git a/source/blender/blenkernel/intern/effect.c b/source/blender/blenkernel/intern/effect.c index 86ac9d76db5..b604af0f221 100644 --- a/source/blender/blenkernel/intern/effect.c +++ b/source/blender/blenkernel/intern/effect.c @@ -1235,7 +1235,7 @@ void build_particle_system(Object *ob) par->ctime= -1234567.0; do_ob_key(par); if(par->type==OB_ARMATURE) { - do_all_actions(par); // only does this object actions + do_all_pose_actions(par); // only does this object actions where_is_pose(par); } par= par->parent; @@ -1318,7 +1318,7 @@ void build_particle_system(Object *ob) do_ob_key(par); if(par->type==OB_ARMATURE) { - do_all_actions(par); // only does this object actions + do_all_pose_actions(par); // only does this object actions where_is_pose(par); } par= par->parent; diff --git a/source/blender/blenkernel/intern/ipo.c b/source/blender/blenkernel/intern/ipo.c index 7c8a272c372..c6c99137761 100644 --- a/source/blender/blenkernel/intern/ipo.c +++ b/source/blender/blenkernel/intern/ipo.c @@ -205,13 +205,56 @@ void free_ipo(Ipo *ipo) } } +/* on adding new ipos, or for empty views */ +void ipo_default_v2d_cur(int blocktype, rctf *cur) +{ + if(blocktype==ID_CA) { + cur->xmin= G.scene->r.sfra; + cur->xmax= G.scene->r.efra; + cur->ymin= 0.0; + cur->ymax= 100.0; + } + else if ELEM5(blocktype, ID_MA, ID_CU, ID_WO, ID_LA, ID_CO) { + cur->xmin= (float)G.scene->r.sfra-0.1; + cur->xmax= G.scene->r.efra; + cur->ymin= (float)-0.1; + cur->ymax= (float)+1.1; + } + else if(blocktype==ID_TE) { + cur->xmin= (float)G.scene->r.sfra-0.1; + cur->xmax= G.scene->r.efra; + cur->ymin= (float)-0.1; + cur->ymax= (float)+1.1; + } + else if(blocktype==ID_SEQ) { + cur->xmin= -5.0+G.scene->r.sfra; + cur->xmax= 105.0; + cur->ymin= (float)-0.1; + cur->ymax= (float)+1.1; + } + else if(blocktype==ID_KE) { + cur->xmin= (float)G.scene->r.sfra-0.1; + cur->xmax= G.scene->r.efra; + cur->ymin= (float)-0.1; + cur->ymax= (float)+2.1; + } + else { /* ID_OB and everything else */ + cur->xmin= G.scene->r.sfra; + cur->xmax= G.scene->r.efra; + cur->ymin= -5.0; + cur->ymax= +5.0; + } +} + + Ipo *add_ipo(char *name, int idcode) { Ipo *ipo; ipo= alloc_libblock(&G.main->ipo, ID_IP, name); ipo->blocktype= idcode; - + ipo_default_v2d_cur(idcode, &ipo->cur); + return ipo; } @@ -226,11 +269,9 @@ Ipo *copy_ipo(Ipo *ipo) duplicatelist(&(ipon->curve), &(ipo->curve)); - icu= ipon->curve.first; - while(icu) { + for(icu= ipo->curve.first; icu; icu= icu->next) { icu->bezt= MEM_dupallocN(icu->bezt); if(icu->driver) icu->driver= MEM_dupallocN(icu->driver); - icu= icu->next; } return ipon; @@ -389,10 +430,9 @@ void make_local_ipo(Ipo *ipo) IpoCurve *find_ipocurve(Ipo *ipo, int adrcode) { if(ipo) { - IpoCurve *icu= ipo->curve.first; - while(icu) { + IpoCurve *icu; + for(icu= ipo->curve.first; icu; icu= icu->next) { if(icu->adrcode==adrcode) return icu; - icu= icu->next; } } return NULL; @@ -909,12 +949,9 @@ void calc_ipo(Ipo *ipo, float ctime) if(ipo==NULL) return; - icu= ipo->curve.first; - while(icu) { - - if(icu->driver || (icu->flag & IPO_LOCK)==0) calc_icu(icu, ctime); - - icu= icu->next; + for(icu= ipo->curve.first; icu; icu= icu->next) { + if(icu->driver || (icu->flag & IPO_LOCK)==0) + calc_icu(icu, ctime); } } @@ -1090,14 +1127,11 @@ void *get_ipo_poin(ID *id, IpoCurve *icu, int *type) Lamp *la; Sequence *seq; World *wo; - bAction *act; - bActionChannel *achan; - bPoseChannel *pchan; *type= IPO_FLOAT; if( GS(id->name)==ID_OB) { - + ob= (Object *)id; switch(icu->adrcode) { @@ -1172,56 +1206,6 @@ void *get_ipo_poin(ID *id, IpoCurve *icu, int *type) break; } } - else if (GS(id->name)==ID_AC){ - act= (bAction *)id; - achan = act->achan; - pchan = act->pchan; - if (!pchan || !achan) - return NULL; - switch (icu->adrcode){ - case AC_QUAT_W: - poin= &(pchan->quat[0]); - pchan->flag |= POSE_ROT; - break; - case AC_QUAT_X: - poin= &(pchan->quat[1]); - pchan->flag |= POSE_ROT; - break; - case AC_QUAT_Y: - poin= &(pchan->quat[2]); - pchan->flag |= POSE_ROT; - break; - case AC_QUAT_Z: - poin= &(pchan->quat[3]); - pchan->flag |= POSE_ROT; - break; - case AC_LOC_X: - poin= &(pchan->loc[0]); - pchan->flag |= POSE_LOC; - break; - case AC_LOC_Y: - poin= &(pchan->loc[1]); - pchan->flag |= POSE_LOC; - break; - case AC_LOC_Z: - poin= &(pchan->loc[2]); - pchan->flag |= POSE_LOC; - break; - case AC_SIZE_X: - poin= &(pchan->size[0]); - pchan->flag |= POSE_SIZE; - break; - case AC_SIZE_Y: - poin= &(pchan->size[1]); - pchan->flag |= POSE_SIZE; - break; - case AC_SIZE_Z: - poin= &(pchan->size[2]); - pchan->flag |= POSE_SIZE; - break; - }; - } - else if( GS(id->name)==ID_MA) { ma= (Material *)id; @@ -1738,7 +1722,7 @@ void set_icu_vars(IpoCurve *icu) } } - +/* not for actions or constraints! */ void execute_ipo(ID *id, Ipo *ipo) { IpoCurve *icu; @@ -1747,11 +1731,70 @@ void execute_ipo(ID *id, Ipo *ipo) if(ipo==NULL) return; - icu= ipo->curve.first; - while(icu) { + for(icu= ipo->curve.first; icu; icu= icu->next) { poin= get_ipo_poin(id, icu, &type); if(poin) write_ipo_poin(poin, type, icu->curval); - icu= icu->next; + } +} + +void *get_pchan_ipo_poin(bPoseChannel *pchan, int adrcode) +{ + void *poin= NULL; + + switch (adrcode) { + case AC_QUAT_W: + poin= &(pchan->quat[0]); + pchan->flag |= POSE_ROT; + break; + case AC_QUAT_X: + poin= &(pchan->quat[1]); + pchan->flag |= POSE_ROT; + break; + case AC_QUAT_Y: + poin= &(pchan->quat[2]); + pchan->flag |= POSE_ROT; + break; + case AC_QUAT_Z: + poin= &(pchan->quat[3]); + pchan->flag |= POSE_ROT; + break; + case AC_LOC_X: + poin= &(pchan->loc[0]); + pchan->flag |= POSE_LOC; + break; + case AC_LOC_Y: + poin= &(pchan->loc[1]); + pchan->flag |= POSE_LOC; + break; + case AC_LOC_Z: + poin= &(pchan->loc[2]); + pchan->flag |= POSE_LOC; + break; + case AC_SIZE_X: + poin= &(pchan->size[0]); + pchan->flag |= POSE_SIZE; + break; + case AC_SIZE_Y: + poin= &(pchan->size[1]); + pchan->flag |= POSE_SIZE; + break; + case AC_SIZE_Z: + poin= &(pchan->size[2]); + pchan->flag |= POSE_SIZE; + break; + } + return poin; +} + +void execute_action_ipo(bActionChannel *achan, bPoseChannel *pchan) +{ + + if(achan && achan->ipo) { + IpoCurve *icu; + for(icu= achan->ipo->curve.first; icu; icu= icu->next) { + void *poin= get_pchan_ipo_poin(pchan, icu->adrcode); + if(poin) write_ipo_poin(poin, IPO_FLOAT, icu->curval); + } } } @@ -1925,12 +1968,8 @@ int has_ipo_code(Ipo *ipo, int code) if(ipo==NULL) return 0; - icu= ipo->curve.first; - while(icu) { - + for(icu= ipo->curve.first; icu; icu= icu->next) { if(icu->adrcode==code) return 1; - - icu= icu->next; } return 0; } @@ -2036,8 +2075,7 @@ int calc_ipo_spec(Ipo *ipo, int adrcode, float *ctime) if(ipo==NULL) return 0; - icu= ipo->curve.first; - while(icu) { + for(icu= ipo->curve.first; icu; icu= icu->next) { if(icu->adrcode == adrcode) { if(icu->flag & IPO_LOCK); else calc_icu(icu, *ctime); @@ -2045,7 +2083,6 @@ int calc_ipo_spec(Ipo *ipo, int adrcode, float *ctime) *ctime= icu->curval; return 1; } - icu= icu->next; } return 0; @@ -2108,8 +2145,7 @@ void make_cfra_list(Ipo *ipo, ListBase *elems) int a; if(ipo->blocktype==ID_OB) { - icu= ipo->curve.first; - while(icu) { + for(icu= ipo->curve.first; icu; icu= icu->next) { if(icu->flag & IPO_VISIBLE) { switch(icu->adrcode) { case OB_DLOC_X: @@ -2147,12 +2183,10 @@ void make_cfra_list(Ipo *ipo, ListBase *elems) break; } } - icu= icu->next; } } else if(ipo->blocktype==ID_AC) { - icu= ipo->curve.first; - while(icu) { + for(icu= ipo->curve.first; icu; icu= icu->next) { if(icu->flag & IPO_VISIBLE) { switch(icu->adrcode) { case AC_LOC_X: @@ -2176,7 +2210,6 @@ void make_cfra_list(Ipo *ipo, ListBase *elems) break; } } - icu= icu->next; } } else { @@ -2216,14 +2249,10 @@ int IPO_GetChannels(Ipo *ipo, IPO_Channel *channels) if(ipo==NULL) return 0; - icu= ipo->curve.first; - while(icu) { - + for(icu= ipo->curve.first; icu; icu= icu->next) { channels[total]= icu->adrcode; total++; if(total>31) break; - - icu= icu->next; } return total; @@ -2245,25 +2274,3 @@ float IPO_GetFloatValue(Ipo *ipo, IPO_Channel channel, float ctime) return ctime; } - - -void test_ipo_get() -{ - Object *ob; - int tot; - IPO_Channel chan[32]; - - ob = (G.scene->basact ? G.scene->basact->object : 0); - - if(ob==NULL) return; - if(ob->ipo==NULL) return; - - tot= IPO_GetChannels(ob->ipo, chan); - printf("tot %d \n", tot); - - while(tot--) { - printf("var1 %d \n", chan[tot]); - } - - printf("var1 %f \n", IPO_GetFloatValue(ob->ipo, chan[0], 10.0)); -} diff --git a/source/blender/blenkernel/intern/object.c b/source/blender/blenkernel/intern/object.c index aa8efe61565..6bdf6a7faa5 100644 --- a/source/blender/blenkernel/intern/object.c +++ b/source/blender/blenkernel/intern/object.c @@ -1306,6 +1306,9 @@ void where_is_object_time(Object *ob, float ctime) calc_ipo(ob->ipo, stime); execute_ipo((ID *)ob, ob->ipo); } + else + do_all_object_actions(ob); + /* do constraint ipos ... */ do_constraint_channels(&ob->constraints, &ob->constraintChannels, ctime); } @@ -1796,7 +1799,7 @@ void object_handle_update(Object *ob) /* this actually only happens for reading old files... */ if(ob->pose==NULL || (ob->pose->flag & POSE_RECALC)) armature_rebuild_pose(ob, ob->data); - do_all_actions(ob); + do_all_pose_actions(ob); where_is_pose(ob); } } diff --git a/source/blender/include/BDR_drawaction.h b/source/blender/include/BDR_drawaction.h index 6764ced261e..e02fc6b6931 100644 --- a/source/blender/include/BDR_drawaction.h +++ b/source/blender/include/BDR_drawaction.h @@ -40,7 +40,6 @@ struct bAction; struct Object; void draw_cfra_action(void); -void draw_bevel_but(int x, int y, int w, int h, int sel); void draw_ipo_channel(struct gla2DDrawInfo *di, struct Ipo *ipo, int flags, float ypos); void draw_action_channel(struct gla2DDrawInfo *di, struct bAction *act, int flags, float ypos); void draw_object_channel(struct gla2DDrawInfo *di, struct Object *ob, int flags, float ypos); diff --git a/source/blender/include/BIF_editaction.h b/source/blender/include/BIF_editaction.h index 495b7a620c2..47ffb3fea00 100644 --- a/source/blender/include/BIF_editaction.h +++ b/source/blender/include/BIF_editaction.h @@ -67,7 +67,7 @@ void delete_meshchannel_keys(struct Key *key); void delete_actionchannel_keys(void); void duplicate_meshchannel_keys(struct Key *key); void duplicate_actionchannel_keys(void); -void transform_actionchannel_keys(char mode); +void transform_actionchannel_keys(int mode, int dummy); void transform_meshchannel_keys(char mode, struct Key *key); struct Key *get_action_mesh_key(void); int get_nearest_key_num(struct Key *key, short *mval, float *x); @@ -91,12 +91,13 @@ void select_actionchannel_by_name (struct bAction *act, char *name, int select); /* Action */ struct bActionChannel* get_hilighted_action_channel(struct bAction* action); -void set_action_key (struct bAction *act, struct bPoseChannel *chan, int adrcode, short makecurve); -struct bAction *add_empty_action(void); +struct bAction *add_empty_action(int blocktype); + void winqreadactionspace(struct ScrArea *sa, void *spacedata, struct BWinEvent *evt); struct bAction *bake_action_with_client (struct bAction *act, struct Object *arm, float tolerance); -void verify_active_action_channel(struct Object *ob); +/* contextual get action */ +struct bAction *ob_get_action(struct Object *ob); void remake_action_ipos(struct bAction *act); diff --git a/source/blender/include/BIF_editconstraint.h b/source/blender/include/BIF_editconstraint.h index 8665d65e2f7..4d14919ddaa 100644 --- a/source/blender/include/BIF_editconstraint.h +++ b/source/blender/include/BIF_editconstraint.h @@ -33,6 +33,7 @@ #ifndef BIF_EDITCONSTRAINT_H #define BIF_EDITCONSTRAINT_H +struct ID; struct ListBase; struct Object; struct bConstraint; diff --git a/source/blender/include/BIF_editnla.h b/source/blender/include/BIF_editnla.h index f5e72c793eb..c1ab70fd0f5 100644 --- a/source/blender/include/BIF_editnla.h +++ b/source/blender/include/BIF_editnla.h @@ -35,14 +35,12 @@ struct BWinEvent; -void clever_numbuts_nla(void); extern void winqreadnlaspace(struct ScrArea *sa, void *spacedata, struct BWinEvent *evt); /* NLA channel operations */ void delete_nlachannel_keys(void); -void delete_nlachannels(void); void duplicate_nlachannel_keys(void); -void transform_nlachannel_keys(char mode); +void transform_nlachannel_keys(int mode, int dummy); /* Select */ void borderselect_nla(void); diff --git a/source/blender/include/BIF_glutil.h b/source/blender/include/BIF_glutil.h index ec4e586cb02..43fa758d3cf 100644 --- a/source/blender/include/BIF_glutil.h +++ b/source/blender/include/BIF_glutil.h @@ -187,6 +187,11 @@ void gla2DDrawTranslatePtv (gla2DDrawInfo *di, float world[2], int screen_r[2] */ void glaEnd2DDraw (gla2DDrawInfo *di); + /** Adjust the transformation mapping of a 2d area */ +void gla2DGetMap(gla2DDrawInfo *di, struct rctf *rect); +void gla2DSetMap(gla2DDrawInfo *di, struct rctf *rect); + + /* use this for platform hacks. for now glPointSize is solved here */ void bglBegin(int mode); void bglEnd(void); diff --git a/source/blender/include/BIF_resources.h b/source/blender/include/BIF_resources.h index 7040c781927..f7a075e55b1 100644 --- a/source/blender/include/BIF_resources.h +++ b/source/blender/include/BIF_resources.h @@ -447,7 +447,10 @@ enum { TH_SYNTAX_N, TH_BONE_SOLID, - TH_BONE_POSE + TH_BONE_POSE, + + TH_STRIP, + TH_STRIP_SELECT }; /* XXX WARNING: previous is saved in file, so do not change order! */ diff --git a/source/blender/include/BSE_drawnla.h b/source/blender/include/BSE_drawnla.h index e46f4217de7..923d9a3f0df 100644 --- a/source/blender/include/BSE_drawnla.h +++ b/source/blender/include/BSE_drawnla.h @@ -34,9 +34,19 @@ #define BSE_DRAWNLA_H struct ScrArea; +struct Base; +struct gla2DDrawInfo; +struct Object; void drawnlaspace(struct ScrArea *sa, void *spacedata); void do_nlabuts(unsigned short event); +int count_nla_levels(void); +int nla_filter (struct Base* base); + + /* changes the gla2d system to map the strip transform */ +void map_active_strip(struct gla2DDrawInfo *di, struct Object *ob, int restore); + + #endif /* BSE_DRAWNLA */ diff --git a/source/blender/include/BSE_editipo.h b/source/blender/include/BSE_editipo.h index e0036de5eac..5e3a4ec5562 100644 --- a/source/blender/include/BSE_editipo.h +++ b/source/blender/include/BSE_editipo.h @@ -65,22 +65,9 @@ void boundbox_ipocurve(struct IpoCurve *icu); void boundbox_ipo(struct Ipo *ipo, struct rctf *bb); void editipo_changed(struct SpaceIpo *si, int doredraw); void scale_editipo(void); -struct Ipo *get_ipo_to_edit(struct ID **from); + unsigned int ipo_rainbow(int cur, int tot); -void make_ob_editipo(struct Object *ob, struct SpaceIpo *si); -void make_seq_editipo(struct SpaceIpo *si); -void make_cu_editipo(struct SpaceIpo *si); -void make_key_editipo(struct SpaceIpo *si); -int texchannel_to_adrcode(int channel); -void make_mat_editipo(struct SpaceIpo *si); -void make_world_editipo(struct SpaceIpo *si); -void make_texture_editipo(struct SpaceIpo *si); -void make_lamp_editipo(struct SpaceIpo *si); -void make_camera_editipo(struct SpaceIpo *si); -int make_action_editipo(struct Ipo *ipo, struct EditIpo **si); -int make_constraint_editipo(struct Ipo *ipo, struct EditIpo **si); -void make_sound_editipo(struct SpaceIpo *si); -void make_editipo(void); + void test_editipo(void); void get_status_editipo(void); void update_editipo_flags(void); @@ -89,13 +76,17 @@ void ipo_toggle_showkey(void); void swap_selectall_editipo(void); void swap_visible_editipo(void); void deselectall_editipo(void); -short findnearest_ipovert(struct IpoCurve **icu, struct BezTriple **bezt); + void move_to_frame(void); void do_ipowin_buts(short event); void do_ipo_selectbuttons(void); -struct EditIpo *get_editipo(void); -struct Ipo *get_ipo(struct ID *from, short type, int make); -struct IpoCurve *get_ipocurve(struct ID *from, short type, int adrcode, struct Ipo* useipo); + + +/* gets ipo curve, creates if needed */ +struct IpoCurve *verify_ipocurve(struct ID *, short, char *, char *, int); +struct Ipo *verify_ipo(struct ID *, short, char *, char *); +int texchannel_to_adrcode(int channel); + void insert_vert_ipo(struct IpoCurve *icu, float x, float y); void add_vert_ipo(void); void add_duplicate_editipo(void); @@ -114,11 +105,11 @@ void del_ipoCurve ( struct IpoCurve * icu ); void free_ipocopybuf(void); void copy_editipo(void); void paste_editipo(void); + void set_exprap_ipo(int mode); -int find_other_handles(struct EditIpo *eicur, - float ctime, struct BezTriple **beztar); + void set_speed_editipo(float speed); -void insertkey(struct ID *id, int adrcode); +void insertkey(ID *id, int blocktype, char *actname, char *constname, int adrcode); void insertkey_editipo(void); void common_insertkey(void); void free_ipokey(struct ListBase *lb); @@ -151,8 +142,10 @@ void duplicate_ipo_keys(struct Ipo *ipo); void borderselect_ipo_key(struct Ipo *ipo, float xmin, float xmax, int val); void borderselect_icu_key(struct IpoCurve *icu, float xmin, float xmax, int (*select_function)(struct BezTriple *)); + void select_ipo_key(struct Ipo *ipo, float selx, int sel); void select_icu_key(struct IpoCurve *icu, float selx, int selectmode); +/* callbacks */ int select_bezier_add(struct BezTriple *bezt); int select_bezier_subtract(struct BezTriple *bezt); int select_bezier_invert(struct BezTriple *bezt); diff --git a/source/blender/include/BSE_editnla_types.h b/source/blender/include/BSE_editnla_types.h index 4316b857568..434e87fbbc4 100644 --- a/source/blender/include/BSE_editnla_types.h +++ b/source/blender/include/BSE_editnla_types.h @@ -37,7 +37,5 @@ #define NLACHANNELHEIGHT 16 #define NLACHANNELSKIP 1 -#define ACTIVE_ARMATURE(base) ((base)->object->type==OB_ARMATURE && (base)->object->action) - #endif /* BSE_EDITNLA_TYPES_H */ diff --git a/source/blender/include/BSE_headerbuttons.h b/source/blender/include/BSE_headerbuttons.h index a42cfe0801f..4f2179cca28 100644 --- a/source/blender/include/BSE_headerbuttons.h +++ b/source/blender/include/BSE_headerbuttons.h @@ -36,6 +36,8 @@ struct uiBlock; struct ScrArea; struct ID; +struct SpaceIpo; +struct Ipo; /* these used to be in blender/src/headerbuttons.c: */ #define SPACEICONMAX 15 /* See release/datafiles/blenderbuttons */ @@ -112,6 +114,9 @@ void do_view3d_buttons(short event); void do_headerbuttons(short event); +/* header_ipo.c */ +void spaceipo_assign_ipo(struct SpaceIpo *si, struct Ipo *ipo); + /* header_text.c */ void do_text_editmenu_to3dmenu(void *arg, int event); diff --git a/source/blender/include/blendef.h b/source/blender/include/blendef.h index 22c13c54e55..e0c40760061 100644 --- a/source/blender/include/blendef.h +++ b/source/blender/include/blendef.h @@ -223,7 +223,7 @@ #define B_MAN_ROT 162 #define B_MAN_SCALE 163 #define B_HEMESHBROWSE 164 -#define B_HEMESHLOCAL 165 +#define B_HEMESHLOCAL 165 /* IPO: 200 */ #define B_IPOHOME 201 @@ -234,11 +234,14 @@ #define B_IPOEXTRAP 206 #define B_IPOCYCLIC 207 #define B_IPOMAIN 208 -#define B_IPOSHOWKEY 209 -#define B_IPOCYCLICX 210 +#define B_IPOSHOWKEY 209 +#define B_IPOCYCLICX 210 /* warn: also used for oops and seq */ -#define B_VIEW2DZOOM 211 +#define B_VIEW2DZOOM 211 #define B_IPOPIN 212 +#define B_IPO_ACTION_OB 213 +#define B_IPO_ACTION_KEY 214 + /* OOPS: 250 */ #define B_OOPSHOME 251 diff --git a/source/blender/makesdna/DNA_ID.h b/source/blender/makesdna/DNA_ID.h index 86ee9eabb15..da1bd98a603 100644 --- a/source/blender/makesdna/DNA_ID.h +++ b/source/blender/makesdna/DNA_ID.h @@ -123,14 +123,20 @@ typedef struct Library { #define ID_SAMPLE MAKE_ID2('S', 'A') #define ID_GR MAKE_ID2('G', 'R') #define ID_ID MAKE_ID2('I', 'D') -#define ID_SEQ MAKE_ID2('S', 'Q') #define ID_AR MAKE_ID2('A', 'R') #define ID_AC MAKE_ID2('A', 'C') #define ID_SCRIPT MAKE_ID2('P', 'Y') -#define IPO_CO MAKE_ID2('C', 'O') /* NOTE! This is not an ID, but is needed for g.sipo->blocktype */ -#define ID_NLA MAKE_ID2('N', 'L') /* fake ID for outliner */ - + /* NOTE! Fake IDs, needed for g.sipo->blocktype or outliner */ +#define ID_SEQ MAKE_ID2('S', 'Q') + /* constraint */ +#define ID_CO MAKE_ID2('C', 'O') + /* pose (action channel, used to be ID_AC in code, so we keep code for backwards compat) */ +#define ID_PO MAKE_ID2('A', 'C') + /* used in outliner... */ +#define ID_NLA MAKE_ID2('N', 'L') + + /* id->flag: set frist 8 bits always at zero while reading */ #define LIB_LOCAL 0 #define LIB_EXTERN 1 diff --git a/source/blender/makesdna/DNA_action_types.h b/source/blender/makesdna/DNA_action_types.h index 872d4b8e1ce..90f8760462b 100644 --- a/source/blender/makesdna/DNA_action_types.h +++ b/source/blender/makesdna/DNA_action_types.h @@ -91,8 +91,6 @@ typedef struct bActionChannel { typedef struct bAction { ID id; ListBase chanbase; /* Channels in this action */ - bActionChannel *achan; /* Current action channel */ - bPoseChannel *pchan; /* Current pose channel */ } bAction; typedef struct SpaceAction { diff --git a/source/blender/makesdna/DNA_nla_types.h b/source/blender/makesdna/DNA_nla_types.h index 49c8363192c..17a15fecfcf 100644 --- a/source/blender/makesdna/DNA_nla_types.h +++ b/source/blender/makesdna/DNA_nla_types.h @@ -56,10 +56,11 @@ typedef struct bActionStrip { #define ACTSTRIPMODE_BLEND 0 #define ACTSTRIPMODE_ADD 1 -#define ACTSTRIP_SELECT 0x00000001 -#define ACTSTRIP_USESTRIDE 0x00000002 -#define ACTSTRIP_BLENDTONEXT 0x00000004 -#define ACTSTRIP_HOLDLASTFRAME 0x00000008 +#define ACTSTRIP_SELECT 0x01 +#define ACTSTRIP_USESTRIDE 0x02 +#define ACTSTRIP_BLENDTONEXT 0x04 +#define ACTSTRIP_HOLDLASTFRAME 0x08 +#define ACTSTRIP_ACTIVE 0x10 #endif diff --git a/source/blender/makesdna/DNA_object_types.h b/source/blender/makesdna/DNA_object_types.h index b4f0c369d55..187aeb51dfe 100644 --- a/source/blender/makesdna/DNA_object_types.h +++ b/source/blender/makesdna/DNA_object_types.h @@ -113,10 +113,13 @@ typedef struct Object { float imat[4][4]; /* for during render, old game engine, temporally: ipokeys of transform */ unsigned int lay; /* copy of Base */ + short flag; /* copy of Base */ short colbits; /* when zero, from obdata */ - char transflag, ipoflag; - char trackflag, upflag; + + short transflag, ipoflag; /* transformation and ipo settings */ + short trackflag, upflag; + short nlaflag, pad; short ipowin, scaflag; /* ipowin: blocktype last ipowindow */ short scavisflag, boundtype; @@ -255,7 +258,7 @@ extern Object workob; #define PARBONE 7 #define PARSLOW 16 -/* char! transflag */ +/* (short) transflag */ #define OB_OFFS_LOCAL 1 #define OB_QUAT 2 #define OB_NEG_SCALE 4 @@ -267,7 +270,7 @@ extern Object workob; #define OB_POWERTRACK 128 -/* char! ipoflag */ +/* (short) ipoflag */ #define OB_DRAWKEY 1 #define OB_DRAWKEYSEL 2 #define OB_OFFS_OB 4 @@ -276,9 +279,11 @@ extern Object workob; #define OB_OFFS_PATH 32 #define OB_OFFS_PARENT 64 #define OB_OFFS_PARTICLE 128 + /* get ipo from from action or not? */ +#define OB_ACTION_OB 256 +#define OB_ACTION_KEY 512 - -/* trackflag / upflag */ +/* (short) trackflag / upflag */ #define OB_POSX 0 #define OB_POSY 1 #define OB_POSZ 2 @@ -288,7 +293,7 @@ extern Object workob; /* gameflag in game.h */ -/* dt: nummers */ +/* dt: no flags */ #define OB_BOUNDBOX 1 #define OB_WIRE 2 #define OB_SOLID 3 @@ -379,6 +384,8 @@ extern Object workob; #define OB_SHAPE_LOCK 1 #define OB_SHAPE_TEMPLOCK 2 +/* ob->nlaflag */ +#define OB_NLA_OVERRIDE 1 /* ob->softflag in DNA_object_force.h */ diff --git a/source/blender/makesdna/DNA_space_types.h b/source/blender/makesdna/DNA_space_types.h index 1c282969646..f56f620cc0e 100644 --- a/source/blender/makesdna/DNA_space_types.h +++ b/source/blender/makesdna/DNA_space_types.h @@ -86,8 +86,11 @@ typedef struct SpaceIpo { void *editipo; ListBase ipokey; + + /* the ipo context we need to store */ struct Ipo *ipo; struct ID *from; + char actname[32], constname[32]; short totipo, pin; short butofs, channel; diff --git a/source/blender/makesdna/DNA_userdef_types.h b/source/blender/makesdna/DNA_userdef_types.h index 7d00460403a..6aac12ea622 100644 --- a/source/blender/makesdna/DNA_userdef_types.h +++ b/source/blender/makesdna/DNA_userdef_types.h @@ -87,6 +87,7 @@ typedef struct ThemeSpace { char face_dot[4]; // selected color char normal[4]; char bone_solid[4], bone_pose[4]; + char strip[4], strip_select[4]; char vertex_size, facedot_size; char bpad[2]; diff --git a/source/blender/python/api2_2x/Bone.c b/source/blender/python/api2_2x/Bone.c index 6a6980107a2..9fd751248aa 100644 --- a/source/blender/python/api2_2x/Bone.c +++ b/source/blender/python/api2_2x/Bone.c @@ -48,6 +48,7 @@ struct ScrArea; /*keep me up here */ #include "BKE_utildefines.h" #include "BIF_editaction.h" +#include "BSE_editipo.h" #include "NLA.h" @@ -1401,7 +1402,6 @@ static PyObject *Bone_setPose( BPy_Bone * self, PyObject * args ) Bone *root = NULL; bPoseChannel *chan = NULL; bPoseChannel *setChan = NULL; - bPoseChannel *test = NULL; Object *object = NULL; bArmature *arm = NULL; Bone *bone = NULL; @@ -1410,7 +1410,6 @@ static PyObject *Bone_setPose( BPy_Bone * self, PyObject * args ) BPy_Action *py_action = NULL; int x; int flagValue = 0; - int makeCurve = 1; if( !self->bone ) { //test to see if linked to armature //use python vars @@ -1502,43 +1501,26 @@ static PyObject *Bone_setPose( BPy_Bone * self, PyObject * args ) //create an action if one not already assigned to object if( !py_action && !object->action ) { - object->action = ( bAction * ) add_empty_action( ); - object->ipowin = ID_AC; - } else { - //test if posechannel is already in action - for( test = object->action->chanbase.first; test; - test = test->next ) { - if( test == setChan ) - makeCurve = 0; //already there - } + object->action = ( bAction * ) add_empty_action(ID_PO); + object->ipowin = ID_PO; } - //set action keys + //set action keys (note, new uniform API for Pose ipos (ton) if( setChan->flag & POSE_ROT ) { - set_action_key( object->action, setChan, AC_QUAT_X, - (short)makeCurve ); - set_action_key( object->action, setChan, AC_QUAT_Y, - (short)makeCurve ); - set_action_key( object->action, setChan, AC_QUAT_Z, - (short)makeCurve ); - set_action_key( object->action, setChan, AC_QUAT_W, - (short)makeCurve ); + insertkey(&object->id, ID_PO, setChan->name, NULL, AC_QUAT_X); + insertkey(&object->id, ID_PO, setChan->name, NULL, AC_QUAT_Y); + insertkey(&object->id, ID_PO, setChan->name, NULL, AC_QUAT_Z); + insertkey(&object->id, ID_PO, setChan->name, NULL, AC_QUAT_W); } if( setChan->flag & POSE_SIZE ) { - set_action_key( object->action, setChan, AC_SIZE_X, - (short)makeCurve ); - set_action_key( object->action, setChan, AC_SIZE_Y, - (short)makeCurve ); - set_action_key( object->action, setChan, AC_SIZE_Z, - (short)makeCurve ); + insertkey(&object->id, ID_PO, setChan->name, NULL, AC_SIZE_X); + insertkey(&object->id, ID_PO, setChan->name, NULL, AC_SIZE_Y); + insertkey(&object->id, ID_PO, setChan->name, NULL, AC_SIZE_Z); } if( setChan->flag & POSE_LOC ) { - set_action_key( object->action, setChan, AC_LOC_X, - (short)makeCurve ); - set_action_key( object->action, setChan, AC_LOC_Y, - (short)makeCurve ); - set_action_key( object->action, setChan, AC_LOC_Z, - (short)makeCurve ); + insertkey(&object->id, ID_PO, setChan->name, NULL, AC_LOC_X); + insertkey(&object->id, ID_PO, setChan->name, NULL, AC_LOC_Y); + insertkey(&object->id, ID_PO, setChan->name, NULL, AC_LOC_Z); } //rebuild ipos remake_action_ipos( object->action ); diff --git a/source/blender/python/api2_2x/Camera.c b/source/blender/python/api2_2x/Camera.c index 6314ff908f0..a8625def1c9 100644 --- a/source/blender/python/api2_2x/Camera.c +++ b/source/blender/python/api2_2x/Camera.c @@ -959,11 +959,11 @@ static PyObject *Camera_insertIpoKey( BPy_Camera * self, PyObject * args ) "expected int argument" ) ); if (key == IPOKEY_LENS){ - insertkey((ID *)self->camera, CAM_LENS); + insertkey((ID *)self->camera, ID_CA, NULL, NULL, CAM_LENS); } else if (key == IPOKEY_CLIPPING){ - insertkey((ID *)self->camera, CAM_STA); - insertkey((ID *)self->camera, CAM_END); + insertkey((ID *)self->camera, ID_CA, NULL, NULL, CAM_STA); + insertkey((ID *)self->camera, ID_CA, NULL, NULL, CAM_END); } allspace(REMAKEIPO, 0); diff --git a/source/blender/python/api2_2x/Ipo.c b/source/blender/python/api2_2x/Ipo.c index 55f6147012c..8ecd3bb5041 100644 --- a/source/blender/python/api2_2x/Ipo.c +++ b/source/blender/python/api2_2x/Ipo.c @@ -212,9 +212,9 @@ static PyObject *M_Ipo_New( PyObject * self, PyObject * args ) if( !strcmp( code, "Lamp" ) ) idcode = ID_LA; if( !strcmp( code, "Action" ) ) - idcode = ID_AC; + idcode = ID_PO; if( !strcmp( code, "Constraint" ) ) - idcode = IPO_CO; + idcode = ID_CO; if( !strcmp( code, "Sequence" ) ) idcode = ID_SEQ; if( !strcmp( code, "Curve" ) ) @@ -890,10 +890,10 @@ static PyObject *Ipo_addCurve( BPy_Ipo * self, PyObject * args ) case ID_MA: ok = Ipo_maIcuName( cur_name, ¶m ); break; - case ID_AC: + case ID_PO: ok = Ipo_acIcuName( cur_name, ¶m ); break; - case IPO_CO: + case ID_CO: ok = Ipo_coIcuName( cur_name, ¶m ); break; case ID_CU: @@ -913,14 +913,13 @@ static PyObject *Ipo_addCurve( BPy_Ipo * self, PyObject * args ) return EXPP_ReturnPyObjError ( PyExc_NameError, "curve name was invalid" ); - /* ask blender to create the new ipo curve */ - icu = get_ipocurve( NULL, ipo->blocktype, param, self->ipo ); - - if( icu == 0 ) /* could not create curve */ - return EXPP_ReturnPyObjError - ( PyExc_RuntimeError, - "blender could not create ipo curve" ); - + /* create the new ipo curve */ + icu = MEM_callocN(sizeof(IpoCurve), "Pyhon added ipocurve"); + icu->blocktype= ipo->blocktype; + icu->flag |= IPO_VISIBLE|IPO_AUTO_HORIZ; + icu->blocktype= ipo->blocktype; + icu->adrcode= param; + allspace( REMAKEIPO, 0 ); EXPP_allqueue( REDRAWIPO, 0 ); diff --git a/source/blender/python/api2_2x/Ipocurve.c b/source/blender/python/api2_2x/Ipocurve.c index 612da52cd18..f4fbd539b99 100644 --- a/source/blender/python/api2_2x/Ipocurve.c +++ b/source/blender/python/api2_2x/Ipocurve.c @@ -416,7 +416,7 @@ static PyObject *IpoCurve_getName( C_IpoCurve * self ) case ID_WO: return PyString_FromString( getname_world_ei ( self->ipocurve->adrcode ) ); - case ID_AC: + case ID_PO: return PyString_FromString( getname_ac_ei ( self->ipocurve->adrcode ) ); case ID_CU: @@ -427,7 +427,7 @@ static PyObject *IpoCurve_getName( C_IpoCurve * self ) case ID_SEQ: return PyString_FromString( getname_seq_ei ( self->ipocurve->adrcode ) ); - case IPO_CO: + case ID_CO: return PyString_FromString( getname_co_ei ( self->ipocurve->adrcode ) ); default: @@ -605,7 +605,7 @@ char *getIpoCurveName( IpoCurve * icu ) return getname_tex_ei( icu->adrcode ); case ID_LA: return getname_la_ei( icu->adrcode ); - case ID_AC: + case ID_PO: return getname_ac_ei( icu->adrcode ); case ID_CU: return getname_cu_ei( icu->adrcode ); @@ -613,7 +613,7 @@ char *getIpoCurveName( IpoCurve * icu ) return "Key"; /* ipo curves have no names... that was only meant for drawing the buttons... (ton) */ case ID_SEQ: return getname_seq_ei( icu->adrcode ); - case IPO_CO: + case ID_CO: return getname_co_ei( icu->adrcode ); } return NULL; diff --git a/source/blender/python/api2_2x/Lamp.c b/source/blender/python/api2_2x/Lamp.c index 89d0eef891c..f3e6214e966 100644 --- a/source/blender/python/api2_2x/Lamp.c +++ b/source/blender/python/api2_2x/Lamp.c @@ -1395,25 +1395,25 @@ static PyObject *Lamp_insertIpoKey( BPy_Lamp * self, PyObject * args ) map = texchannel_to_adrcode(self->lamp->texact); if (key == IPOKEY_RGB ) { - insertkey((ID *)self->lamp,LA_COL_R); - insertkey((ID *)self->lamp,LA_COL_G); - insertkey((ID *)self->lamp,LA_COL_B); + insertkey((ID *)self->lamp, ID_LA, NULL, NULL, LA_COL_R); + insertkey((ID *)self->lamp, ID_LA, NULL, NULL,LA_COL_G); + insertkey((ID *)self->lamp, ID_LA, NULL, NULL,LA_COL_B); } if (key == IPOKEY_ENERGY ) { - insertkey((ID *)self->lamp,LA_ENERGY); + insertkey((ID *)self->lamp, ID_LA, NULL, NULL,LA_ENERGY); } if (key == IPOKEY_SPOTSIZE ) { - insertkey((ID *)self->lamp,LA_SPOTSI); + insertkey((ID *)self->lamp, ID_LA, NULL, NULL,LA_SPOTSI); } if (key == IPOKEY_OFFSET ) { - insertkey((ID *)self->lamp, map+MAP_OFS_X); - insertkey((ID *)self->lamp, map+MAP_OFS_Y); - insertkey((ID *)self->lamp, map+MAP_OFS_Z); + insertkey((ID *)self->lamp, ID_LA, NULL, NULL, map+MAP_OFS_X); + insertkey((ID *)self->lamp, ID_LA, NULL, NULL, map+MAP_OFS_Y); + insertkey((ID *)self->lamp, ID_LA, NULL, NULL, map+MAP_OFS_Z); } if (key == IPOKEY_SIZE ) { - insertkey((ID *)self->lamp, map+MAP_SIZE_X); - insertkey((ID *)self->lamp, map+MAP_SIZE_Y); - insertkey((ID *)self->lamp, map+MAP_SIZE_Z); + insertkey((ID *)self->lamp, ID_LA, NULL, NULL, map+MAP_SIZE_X); + insertkey((ID *)self->lamp, ID_LA, NULL, NULL, map+MAP_SIZE_Y); + insertkey((ID *)self->lamp, ID_LA, NULL, NULL, map+MAP_SIZE_Z); } allspace(REMAKEIPO, 0); diff --git a/source/blender/python/api2_2x/Material.c b/source/blender/python/api2_2x/Material.c index 7a3bbc89f45..50390025ee2 100644 --- a/source/blender/python/api2_2x/Material.c +++ b/source/blender/python/api2_2x/Material.c @@ -1829,58 +1829,58 @@ static PyObject *Material_insertIpoKey( BPy_Material * self, PyObject * args ) map = texchannel_to_adrcode(self->material->texact); if(key==IPOKEY_RGB || key==IPOKEY_ALLCOLOR) { - insertkey((ID *)self->material, MA_COL_R); - insertkey((ID *)self->material, MA_COL_G); - insertkey((ID *)self->material, MA_COL_B); + insertkey((ID *)self->material, ID_MA, NULL, NULL, MA_COL_R); + insertkey((ID *)self->material, ID_MA, NULL, NULL, MA_COL_G); + insertkey((ID *)self->material, ID_MA, NULL, NULL, MA_COL_B); } if(key==IPOKEY_ALPHA || key==IPOKEY_ALLCOLOR) { - insertkey((ID *)self->material, MA_ALPHA); + insertkey((ID *)self->material, ID_MA, NULL, NULL, MA_ALPHA); } if(key==IPOKEY_HALOSIZE || key==IPOKEY_ALLCOLOR) { - insertkey((ID *)self->material, MA_HASIZE); + insertkey((ID *)self->material, ID_MA, NULL, NULL, MA_HASIZE); } if(key==IPOKEY_MODE || key==IPOKEY_ALLCOLOR) { - insertkey((ID *)self->material, MA_MODE); + insertkey((ID *)self->material, ID_MA, NULL, NULL, MA_MODE); } if(key==IPOKEY_ALLCOLOR) { - insertkey((ID *)self->material, MA_SPEC_R); - insertkey((ID *)self->material, MA_SPEC_G); - insertkey((ID *)self->material, MA_SPEC_B); - insertkey((ID *)self->material, MA_REF); - insertkey((ID *)self->material, MA_EMIT); - insertkey((ID *)self->material, MA_AMB); - insertkey((ID *)self->material, MA_SPEC); - insertkey((ID *)self->material, MA_HARD); - insertkey((ID *)self->material, MA_MODE); - insertkey((ID *)self->material, MA_TRANSLU); - insertkey((ID *)self->material, MA_ADD); + insertkey((ID *)self->material, ID_MA, NULL, NULL, MA_SPEC_R); + insertkey((ID *)self->material, ID_MA, NULL, NULL, MA_SPEC_G); + insertkey((ID *)self->material, ID_MA, NULL, NULL, MA_SPEC_B); + insertkey((ID *)self->material, ID_MA, NULL, NULL, MA_REF); + insertkey((ID *)self->material, ID_MA, NULL, NULL, MA_EMIT); + insertkey((ID *)self->material, ID_MA, NULL, NULL, MA_AMB); + insertkey((ID *)self->material, ID_MA, NULL, NULL, MA_SPEC); + insertkey((ID *)self->material, ID_MA, NULL, NULL, MA_HARD); + insertkey((ID *)self->material, ID_MA, NULL, NULL, MA_MODE); + insertkey((ID *)self->material, ID_MA, NULL, NULL, MA_TRANSLU); + insertkey((ID *)self->material, ID_MA, NULL, NULL, MA_ADD); } if(key==IPOKEY_ALLMIRROR) { - insertkey((ID *)self->material, MA_RAYM); - insertkey((ID *)self->material, MA_FRESMIR); - insertkey((ID *)self->material, MA_FRESMIRI); - insertkey((ID *)self->material, MA_FRESTRA); - insertkey((ID *)self->material, MA_FRESTRAI); + insertkey((ID *)self->material, ID_MA, NULL, NULL, MA_RAYM); + insertkey((ID *)self->material, ID_MA, NULL, NULL, MA_FRESMIR); + insertkey((ID *)self->material, ID_MA, NULL, NULL, MA_FRESMIRI); + insertkey((ID *)self->material, ID_MA, NULL, NULL, MA_FRESTRA); + insertkey((ID *)self->material, ID_MA, NULL, NULL, MA_FRESTRAI); } if(key==IPOKEY_OFS || key==IPOKEY_ALLMAPPING) { - insertkey((ID *)self->material, map+MAP_OFS_X); - insertkey((ID *)self->material, map+MAP_OFS_Y); - insertkey((ID *)self->material, map+MAP_OFS_Z); + insertkey((ID *)self->material, ID_MA, NULL, NULL, map+MAP_OFS_X); + insertkey((ID *)self->material, ID_MA, NULL, NULL, map+MAP_OFS_Y); + insertkey((ID *)self->material, ID_MA, NULL, NULL, map+MAP_OFS_Z); } if(key==IPOKEY_SIZE || key==IPOKEY_ALLMAPPING) { - insertkey((ID *)self->material, map+MAP_SIZE_X); - insertkey((ID *)self->material, map+MAP_SIZE_Y); - insertkey((ID *)self->material, map+MAP_SIZE_Z); + insertkey((ID *)self->material, ID_MA, NULL, NULL, map+MAP_SIZE_X); + insertkey((ID *)self->material, ID_MA, NULL, NULL, map+MAP_SIZE_Y); + insertkey((ID *)self->material, ID_MA, NULL, NULL, map+MAP_SIZE_Z); } if(key==IPOKEY_ALLMAPPING) { - insertkey((ID *)self->material, map+MAP_R); - insertkey((ID *)self->material, map+MAP_G); - insertkey((ID *)self->material, map+MAP_B); - insertkey((ID *)self->material, map+MAP_DVAR); - insertkey((ID *)self->material, map+MAP_COLF); - insertkey((ID *)self->material, map+MAP_NORF); - insertkey((ID *)self->material, map+MAP_VARF); - insertkey((ID *)self->material, map+MAP_DISP); + insertkey((ID *)self->material, ID_MA, NULL, NULL, map+MAP_R); + insertkey((ID *)self->material, ID_MA, NULL, NULL, map+MAP_G); + insertkey((ID *)self->material, ID_MA, NULL, NULL, map+MAP_B); + insertkey((ID *)self->material, ID_MA, NULL, NULL, map+MAP_DVAR); + insertkey((ID *)self->material, ID_MA, NULL, NULL, map+MAP_COLF); + insertkey((ID *)self->material, ID_MA, NULL, NULL, map+MAP_NORF); + insertkey((ID *)self->material, ID_MA, NULL, NULL, map+MAP_VARF); + insertkey((ID *)self->material, ID_MA, NULL, NULL, map+MAP_DISP); } allspace(REMAKEIPO, 0); diff --git a/source/blender/python/api2_2x/NLA.c b/source/blender/python/api2_2x/NLA.c index f2d9b657816..a07f15b3cab 100644 --- a/source/blender/python/api2_2x/NLA.c +++ b/source/blender/python/api2_2x/NLA.c @@ -307,7 +307,7 @@ static PyObject *Action_getChannelIpo( BPy_Action * self, PyObject * args ) return NULL; } - chan = get_named_actionchannel( self->action, chanName ); + chan = get_action_channel( self->action, chanName ); if( chan == NULL ) { EXPP_ReturnPyObjError( PyExc_AttributeError, "no channel with that name..." ); @@ -328,7 +328,7 @@ static PyObject *Action_removeChannel( BPy_Action * self, PyObject * args ) return NULL; } - chan = get_named_actionchannel( self->action, chanName ); + chan = get_action_channel( self->action, chanName ); if( chan == NULL ) { EXPP_ReturnPyObjError( PyExc_AttributeError, "no channel with that name..." ); diff --git a/source/blender/python/api2_2x/Object.c b/source/blender/python/api2_2x/Object.c index 888cab2bc92..4da5dfc74ae 100644 --- a/source/blender/python/api2_2x/Object.c +++ b/source/blender/python/api2_2x/Object.c @@ -1991,50 +1991,55 @@ static PyObject *Object_setIpo( BPy_Object * self, PyObject * args ) /* * Object_insertIpoKey() * inserts Object IPO key for LOC, ROT, SIZE, LOCROT, or LOCROTSIZE + * Note it also inserts actions! */ static PyObject *Object_insertIpoKey( BPy_Object * self, PyObject * args ) { + Object *ob= self->object; int key = 0; + char *actname= NULL; if( !PyArg_ParseTuple( args, "i", &( key ) ) ) return ( EXPP_ReturnPyObjError( PyExc_AttributeError, "expected int argument" ) ); - + if(ob->ipoflag & OB_ACTION_OB) + actname= "Object"; + if (key == IPOKEY_LOC || key == IPOKEY_LOCROT || key == IPOKEY_LOCROTSIZE){ - insertkey((ID *)self->object,OB_LOC_X); - insertkey((ID *)self->object,OB_LOC_Y); - insertkey((ID *)self->object,OB_LOC_Z); + insertkey((ID *)ob, ID_OB, actname, NULL,OB_LOC_X); + insertkey((ID *)ob, ID_OB, actname, NULL,OB_LOC_Y); + insertkey((ID *)ob, ID_OB, actname, NULL,OB_LOC_Z); } if (key == IPOKEY_ROT || key == IPOKEY_LOCROT || key == IPOKEY_LOCROTSIZE){ - insertkey((ID *)self->object,OB_ROT_X); - insertkey((ID *)self->object,OB_ROT_Y); - insertkey((ID *)self->object,OB_ROT_Z); + insertkey((ID *)ob, ID_OB, actname, NULL,OB_ROT_X); + insertkey((ID *)ob, ID_OB, actname, NULL,OB_ROT_Y); + insertkey((ID *)ob, ID_OB, actname, NULL,OB_ROT_Z); } if (key == IPOKEY_SIZE || key == IPOKEY_LOCROTSIZE ){ - insertkey((ID *)self->object,OB_SIZE_X); - insertkey((ID *)self->object,OB_SIZE_Y); - insertkey((ID *)self->object,OB_SIZE_Z); + insertkey((ID *)ob, ID_OB, actname, NULL,OB_SIZE_X); + insertkey((ID *)ob, ID_OB, actname, NULL,OB_SIZE_Y); + insertkey((ID *)ob, ID_OB, actname, NULL,OB_SIZE_Z); } if (key == IPOKEY_PI_STRENGTH ){ - insertkey((ID *)self->object, OB_PD_FSTR); + insertkey((ID *)ob, ID_OB, actname, NULL, OB_PD_FSTR); } if (key == IPOKEY_PI_FALLOFF ){ - insertkey((ID *)self->object, OB_PD_FFALL); + insertkey((ID *)ob, ID_OB, actname, NULL, OB_PD_FFALL); } if (key == IPOKEY_PI_SURFACEDAMP ){ - insertkey((ID *)self->object, OB_PD_SDAMP); + insertkey((ID *)ob, ID_OB, actname, NULL, OB_PD_SDAMP); } if (key == IPOKEY_PI_RANDOMDAMP ){ - insertkey((ID *)self->object, OB_PD_RDAMP); + insertkey((ID *)ob, ID_OB, actname, NULL, OB_PD_RDAMP); } if (key == IPOKEY_PI_PERM ){ - insertkey((ID *)self->object, OB_PD_PERM); + insertkey((ID *)ob, ID_OB, actname, NULL, OB_PD_PERM); } diff --git a/source/blender/python/api2_2x/World.c b/source/blender/python/api2_2x/World.c index f065f3ebf58..c91f2b1a2d8 100644 --- a/source/blender/python/api2_2x/World.c +++ b/source/blender/python/api2_2x/World.c @@ -1113,37 +1113,37 @@ static PyObject *World_insertIpoKey( BPy_World * self, PyObject * args ) map = texchannel_to_adrcode(self->world->texact); if(key == IPOKEY_ZENITH) { - insertkey((ID *)self->world, WO_ZEN_R); - insertkey((ID *)self->world, WO_ZEN_G); - insertkey((ID *)self->world, WO_ZEN_B); + insertkey((ID *)self->world, ID_WO, NULL, NULL, WO_ZEN_R); + insertkey((ID *)self->world, ID_WO, NULL, NULL, WO_ZEN_G); + insertkey((ID *)self->world, ID_WO, NULL, NULL, WO_ZEN_B); } if(key == IPOKEY_HORIZON) { - insertkey((ID *)self->world, WO_HOR_R); - insertkey((ID *)self->world, WO_HOR_G); - insertkey((ID *)self->world, WO_HOR_B); + insertkey((ID *)self->world, ID_WO, NULL, NULL, WO_HOR_R); + insertkey((ID *)self->world, ID_WO, NULL, NULL, WO_HOR_G); + insertkey((ID *)self->world, ID_WO, NULL, NULL, WO_HOR_B); } if(key == IPOKEY_MIST) { - insertkey((ID *)self->world, WO_MISI); - insertkey((ID *)self->world, WO_MISTDI); - insertkey((ID *)self->world, WO_MISTSTA); - insertkey((ID *)self->world, WO_MISTHI); + insertkey((ID *)self->world, ID_WO, NULL, NULL, WO_MISI); + insertkey((ID *)self->world, ID_WO, NULL, NULL, WO_MISTDI); + insertkey((ID *)self->world, ID_WO, NULL, NULL, WO_MISTSTA); + insertkey((ID *)self->world, ID_WO, NULL, NULL, WO_MISTHI); } if(key == IPOKEY_STARS) { - insertkey((ID *)self->world, WO_STAR_R); - insertkey((ID *)self->world, WO_STAR_G); - insertkey((ID *)self->world, WO_STAR_B); - insertkey((ID *)self->world, WO_STARDIST); - insertkey((ID *)self->world, WO_STARSIZE); + insertkey((ID *)self->world, ID_WO, NULL, NULL, WO_STAR_R); + insertkey((ID *)self->world, ID_WO, NULL, NULL, WO_STAR_G); + insertkey((ID *)self->world, ID_WO, NULL, NULL, WO_STAR_B); + insertkey((ID *)self->world, ID_WO, NULL, NULL, WO_STARDIST); + insertkey((ID *)self->world, ID_WO, NULL, NULL, WO_STARSIZE); } if(key == IPOKEY_OFFSET) { - insertkey((ID *)self->world, map+MAP_OFS_X); - insertkey((ID *)self->world, map+MAP_OFS_Y); - insertkey((ID *)self->world, map+MAP_OFS_Z); + insertkey((ID *)self->world, ID_WO, NULL, NULL, map+MAP_OFS_X); + insertkey((ID *)self->world, ID_WO, NULL, NULL, map+MAP_OFS_Y); + insertkey((ID *)self->world, ID_WO, NULL, NULL, map+MAP_OFS_Z); } if(key == IPOKEY_SIZE) { - insertkey((ID *)self->world, map+MAP_SIZE_X); - insertkey((ID *)self->world, map+MAP_SIZE_Y); - insertkey((ID *)self->world, map+MAP_SIZE_Z); + insertkey((ID *)self->world, ID_WO, NULL, NULL, map+MAP_SIZE_X); + insertkey((ID *)self->world, ID_WO, NULL, NULL, map+MAP_SIZE_Y); + insertkey((ID *)self->world, ID_WO, NULL, NULL, map+MAP_SIZE_Z); } allspace(REMAKEIPO, 0); |