Stage two of the giant animation recode project; Ipo/Action/NLA cleanup
-> Note; added 2 new c files (split editipo.c). MSVC needs upgrade. Impatient people can check the goodies in CMS: http://www.blender3d.org/cms/Action_and_NLA_editor.706.0.html Most work was on trying to unwind the spaghetti for editing ipos. Too much history and bad design got added here. Most evident changes: - made generic 'context' for detecting which Ipo is being edited, or to assign ipos or to retrieve ipo curves. - made generic insertkey() for all ipo types, including actions - shuffled a lot of code around to make things more logical. Also made sure local functions are not exported It is far from ready... when action/nla was added in Blender, a lot of duplicate code was generated. That's for another time. Now the goodies; - made Actions to allow any Ipo type - made NLA to define active actions, for Action window too - corrected timing for active action, so it shows the 'real time', as defined in NLA editor. I did update python code, but that would require testing. Testing is needed for this commit in general, too many changes happened on all levels of the animation system. :) Will keep track of all reports this evening, hopefully it doesnt break the pre-release schedule!
This commit is contained in:
@@ -23,7 +23,7 @@ source_files = ['B.blend.c',
|
||||
'cmovie.tga.c',
|
||||
'cursors.c',
|
||||
'drawaction.c',
|
||||
'drawarmature.c',
|
||||
'drawarmature.c',
|
||||
'drawdeps.c',
|
||||
'drawimage.c',
|
||||
'drawimasel.c',
|
||||
@@ -50,6 +50,8 @@ source_files = ['B.blend.c',
|
||||
'editgroup.c',
|
||||
'editimasel.c',
|
||||
'editipo.c',
|
||||
'editipo_lib.c',
|
||||
'editipo_mods.c',
|
||||
'editkey.c',
|
||||
'editlattice.c',
|
||||
'editmball.c',
|
||||
|
||||
@@ -59,7 +59,7 @@
|
||||
#include "BSE_headerbuttons.h"
|
||||
|
||||
#include "BIF_butspace.h"
|
||||
#include "BDR_editcurve.h"
|
||||
#include "BIF_editaction.h"
|
||||
#include "BIF_gl.h"
|
||||
#include "BIF_glutil.h"
|
||||
#include "BIF_graphics.h"
|
||||
@@ -74,6 +74,7 @@
|
||||
#include "BIF_toolbox.h"
|
||||
|
||||
#include "BDR_drawobject.h"
|
||||
#include "BDR_editcurve.h"
|
||||
|
||||
#include "mydevice.h"
|
||||
#include "blendef.h"
|
||||
@@ -131,7 +132,10 @@
|
||||
#include "LBM_fluidsim.h"
|
||||
|
||||
#include "BIF_editconstraint.h"
|
||||
|
||||
#include "BSE_editipo.h"
|
||||
#include "BSE_edit.h"
|
||||
|
||||
#include "BDR_editobject.h"
|
||||
|
||||
#include "butspace.h" // own module
|
||||
@@ -162,8 +166,8 @@ static void constraint_active_func(void *ob_v, void *con_v)
|
||||
}
|
||||
|
||||
/* make sure ipowin and buttons shows it */
|
||||
if(ob->ipowin==IPO_CO) {
|
||||
allqueue(REDRAWIPO, IPO_CO);
|
||||
if(ob->ipowin==ID_CO) {
|
||||
allqueue(REDRAWIPO, ID_CO);
|
||||
allspace(REMAKEIPO, 0);
|
||||
allqueue(REDRAWNLA, 0);
|
||||
}
|
||||
@@ -185,38 +189,44 @@ static void add_constraint_to_active(Object *ob, bConstraint *con)
|
||||
}
|
||||
}
|
||||
|
||||
/* returns base ID for Ipo, sets actname to channel if appropriate */
|
||||
/* should not make action... */
|
||||
static void get_constraint_ipo_context(Object *ob, char *actname)
|
||||
{
|
||||
|
||||
/* todo; check object if it has ob-level action ipo */
|
||||
|
||||
if (ob->flag & OB_POSEMODE) {
|
||||
bPoseChannel *pchan;
|
||||
|
||||
pchan = get_active_posechannel(ob);
|
||||
if (pchan) {
|
||||
BLI_strncpy(actname, pchan->name, 32);
|
||||
}
|
||||
}
|
||||
else if(ob->ipoflag & OB_ACTION_OB)
|
||||
strcpy(actname, "Object");
|
||||
}
|
||||
|
||||
/* initialize UI to show Ipo window and make sure channels etc exist */
|
||||
static void enable_constraint_ipo_func (void *ob_v, void *con_v)
|
||||
{
|
||||
Object *ob= ob_v;
|
||||
bConstraint *con = con_v;
|
||||
bConstraintChannel *chan;
|
||||
ListBase *conbase;
|
||||
|
||||
char actname[32]="";
|
||||
|
||||
/* verifies if active constraint is set and shown in UI */
|
||||
constraint_active_func(ob_v, con_v);
|
||||
|
||||
conbase = get_active_constraint_channels(ob, 1); // 1 == create
|
||||
|
||||
if (!conbase)
|
||||
return;
|
||||
|
||||
/* See if this list already has an appropriate channel */
|
||||
chan = find_constraint_channel(conbase, con->name);
|
||||
|
||||
if (!chan){
|
||||
/* Add a new constraint channel */
|
||||
chan = MEM_callocN(sizeof(bConstraintChannel), "constraintChannel");
|
||||
strcpy(chan->name, con->name);
|
||||
BLI_addtail(conbase, chan);
|
||||
}
|
||||
|
||||
/* Ensure there is an ipo to display */
|
||||
if (!chan->ipo){
|
||||
chan->ipo = add_ipo(con->name, IPO_CO);
|
||||
}
|
||||
|
||||
|
||||
/* the context */
|
||||
get_constraint_ipo_context(ob, actname);
|
||||
|
||||
/* adds ipo & channels & curve if needed */
|
||||
verify_ipo((ID *)ob, ID_CO, actname, con->name);
|
||||
|
||||
/* make sure ipowin shows it */
|
||||
ob->ipowin= IPO_CO;
|
||||
allqueue(REDRAWIPO, IPO_CO);
|
||||
ob->ipowin= ID_CO;
|
||||
allqueue(REDRAWIPO, ID_CO);
|
||||
allspace(REMAKEIPO, 0);
|
||||
allqueue(REDRAWNLA, 0);
|
||||
}
|
||||
@@ -226,38 +236,23 @@ static void add_influence_key_to_constraint_func (void *ob_v, void *con_v)
|
||||
{
|
||||
Object *ob= ob_v;
|
||||
bConstraint *con = con_v;
|
||||
bConstraintChannel *chan;
|
||||
ListBase *conbase;
|
||||
IpoCurve *icu;
|
||||
char actname[32]="";
|
||||
|
||||
/* verifies if active constraint is set and shown in UI */
|
||||
constraint_active_func(ob_v, con_v);
|
||||
conbase = get_active_constraint_channels(ob, 1); // 1=make
|
||||
|
||||
if (!conbase)
|
||||
return;
|
||||
|
||||
/* See if this list already has an appropriate channel */
|
||||
chan = find_constraint_channel(conbase, con->name);
|
||||
|
||||
if (!chan){
|
||||
/* Add a new constraint channel */
|
||||
chan = MEM_callocN(sizeof(bConstraintChannel), "constraintChannel");
|
||||
strcpy(chan->name, con->name);
|
||||
BLI_addtail(conbase, chan);
|
||||
}
|
||||
|
||||
/* Ensure there is an ipo to display */
|
||||
if (!chan->ipo){
|
||||
chan->ipo = add_ipo(con->name, IPO_CO);
|
||||
}
|
||||
|
||||
/* now insert an ipo key */
|
||||
icu= get_ipocurve(NULL, IPO_CO, CO_ENFORCE, chan->ipo);
|
||||
/* the context */
|
||||
get_constraint_ipo_context(ob, actname);
|
||||
|
||||
/* adds ipo & channels & curve if needed */
|
||||
icu= verify_ipocurve((ID *)ob, ID_CO, actname, con->name, CO_ENFORCE);
|
||||
|
||||
insert_vert_ipo(icu, CFRA, con->enforce);
|
||||
|
||||
/* make sure ipowin shows it */
|
||||
ob->ipowin= IPO_CO;
|
||||
allqueue(REDRAWIPO, IPO_CO);
|
||||
ob->ipowin= ID_CO;
|
||||
allqueue(REDRAWIPO, ID_CO);
|
||||
allspace(REMAKEIPO, 0);
|
||||
allqueue(REDRAWNLA, 0);
|
||||
|
||||
@@ -274,7 +269,7 @@ static void del_constraint_func (void *ob_v, void *con_v)
|
||||
/* remove ipo channel */
|
||||
lb= get_active_constraint_channels(ob_v, 0);
|
||||
if(lb) {
|
||||
chan = find_constraint_channel(lb, con->name);
|
||||
chan = get_constraint_channel(lb, con->name);
|
||||
if(chan) {
|
||||
if(chan->ipo) chan->ipo->id.us--;
|
||||
BLI_freelinkN(lb, chan);
|
||||
@@ -1322,23 +1317,21 @@ void do_object_panels(unsigned short event)
|
||||
/* write config files (currently no simulation) */
|
||||
fluidsimBake(ob);
|
||||
break;
|
||||
case B_FLUIDSIM_SELDIR: {
|
||||
char str[FILE_MAXDIR+FILE_MAXFILE];
|
||||
ScrArea *sa = closest_bigger_area();
|
||||
strcpy(str,"//");
|
||||
ob= OBACT;
|
||||
/* chosse dir for surface files */
|
||||
areawinset(sa->win);
|
||||
activate_fileselect(FILE_SPECIAL, "Select Directory", str, fluidsimFilesel);
|
||||
// continue with redraw... so no brake here!
|
||||
}
|
||||
case B_FLUIDSIM_FORCEREDRAW: {
|
||||
// force redraw
|
||||
allqueue(REDRAWBUTSEDIT, 0);
|
||||
allqueue(REDRAWVIEW3D, 0);
|
||||
countall();
|
||||
DAG_object_flush_update(G.scene, ob, OB_RECALC_DATA);
|
||||
}
|
||||
case B_FLUIDSIM_SELDIR:
|
||||
char str[FILE_MAXDIR+FILE_MAXFILE];
|
||||
ScrArea *sa = closest_bigger_area();
|
||||
strcpy(str,"//");
|
||||
ob= OBACT;
|
||||
/* choose dir for surface files */
|
||||
areawinset(sa->win);
|
||||
activate_fileselect(FILE_SPECIAL, "Select Directory", str, fluidsimFilesel);
|
||||
/* continue with redraw... so no brake here! */
|
||||
case B_FLUIDSIM_FORCEREDRAW:
|
||||
/* force redraw */
|
||||
allqueue(REDRAWBUTSEDIT, 0);
|
||||
allqueue(REDRAWVIEW3D, 0);
|
||||
countall();
|
||||
DAG_object_flush_update(G.scene, ob, OB_RECALC_DATA);
|
||||
break;
|
||||
|
||||
default:
|
||||
@@ -1371,35 +1364,35 @@ static void object_panel_anim(Object *ob)
|
||||
if(uiNewPanel(curarea, block, "Anim settings", "Object", 0, 0, 318, 204)==0) return;
|
||||
|
||||
uiBlockBeginAlign(block);
|
||||
uiDefButC(block, ROW,B_TRACKBUTS,"TrackX", 24,190,59,19, &ob->trackflag, 12.0, 0.0, 0, 0, "Specify the axis that points to another object");
|
||||
uiDefButC(block, ROW,B_TRACKBUTS,"Y", 85,190,19,19, &ob->trackflag, 12.0, 1.0, 0, 0, "Specify the axis that points to another object");
|
||||
uiDefButC(block, ROW,B_TRACKBUTS,"Z", 104,190,19,19, &ob->trackflag, 12.0, 2.0, 0, 0, "Specify the axis that points to another object");
|
||||
uiDefButC(block, ROW,B_TRACKBUTS,"-X", 124,190,24,19, &ob->trackflag, 12.0, 3.0, 0, 0, "Specify the axis that points to another object");
|
||||
uiDefButC(block, ROW,B_TRACKBUTS,"-Y", 150,190,24,19, &ob->trackflag, 12.0, 4.0, 0, 0, "Specify the axis that points to another object");
|
||||
uiDefButC(block, ROW,B_TRACKBUTS,"-Z", 178,190,24,19, &ob->trackflag, 12.0, 5.0, 0, 0, "Specify the axis that points to another object");
|
||||
uiDefButS(block, ROW,B_TRACKBUTS,"TrackX", 24,190,59,19, &ob->trackflag, 12.0, 0.0, 0, 0, "Specify the axis that points to another object");
|
||||
uiDefButS(block, ROW,B_TRACKBUTS,"Y", 85,190,19,19, &ob->trackflag, 12.0, 1.0, 0, 0, "Specify the axis that points to another object");
|
||||
uiDefButS(block, ROW,B_TRACKBUTS,"Z", 104,190,19,19, &ob->trackflag, 12.0, 2.0, 0, 0, "Specify the axis that points to another object");
|
||||
uiDefButS(block, ROW,B_TRACKBUTS,"-X", 124,190,24,19, &ob->trackflag, 12.0, 3.0, 0, 0, "Specify the axis that points to another object");
|
||||
uiDefButS(block, ROW,B_TRACKBUTS,"-Y", 150,190,24,19, &ob->trackflag, 12.0, 4.0, 0, 0, "Specify the axis that points to another object");
|
||||
uiDefButS(block, ROW,B_TRACKBUTS,"-Z", 178,190,24,19, &ob->trackflag, 12.0, 5.0, 0, 0, "Specify the axis that points to another object");
|
||||
uiBlockBeginAlign(block);
|
||||
uiDefButC(block, ROW,REDRAWVIEW3D,"UpX", 226,190,45,19, &ob->upflag, 13.0, 0.0, 0, 0, "Specify the axis that points up");
|
||||
uiDefButC(block, ROW,REDRAWVIEW3D,"Y", 274,190,20,19, &ob->upflag, 13.0, 1.0, 0, 0, "Specify the axis that points up");
|
||||
uiDefButC(block, ROW,REDRAWVIEW3D,"Z", 298,190,19,19, &ob->upflag, 13.0, 2.0, 0, 0, "Specify the axis that points up");
|
||||
uiDefButS(block, ROW,REDRAWVIEW3D,"UpX", 226,190,45,19, &ob->upflag, 13.0, 0.0, 0, 0, "Specify the axis that points up");
|
||||
uiDefButS(block, ROW,REDRAWVIEW3D,"Y", 274,190,20,19, &ob->upflag, 13.0, 1.0, 0, 0, "Specify the axis that points up");
|
||||
uiDefButS(block, ROW,REDRAWVIEW3D,"Z", 298,190,19,19, &ob->upflag, 13.0, 2.0, 0, 0, "Specify the axis that points up");
|
||||
uiBlockBeginAlign(block);
|
||||
uiDefButBitC(block, TOG, OB_DRAWKEY, REDRAWVIEW3D, "Draw Key", 24,160,71,19, &ob->ipoflag, 0, 0, 0, 0, "Draw object as key position");
|
||||
uiDefButBitC(block, TOG, OB_DRAWKEYSEL, REDRAWVIEW3D, "Draw Key Sel", 97,160,81,19, &ob->ipoflag, 0, 0, 0, 0, "Limit the drawing of object keys");
|
||||
uiDefButBitC(block, TOG, OB_POWERTRACK, REDRAWVIEW3D, "Powertrack", 180,160,78,19, &ob->transflag, 0, 0, 0, 0, "Switch objects rotation off");
|
||||
uiDefButBitS(block, TOG, OB_DRAWKEY, REDRAWVIEW3D, "Draw Key", 24,160,71,19, &ob->ipoflag, 0, 0, 0, 0, "Draw object as key position");
|
||||
uiDefButBitS(block, TOG, OB_DRAWKEYSEL, REDRAWVIEW3D, "Draw Key Sel", 97,160,81,19, &ob->ipoflag, 0, 0, 0, 0, "Limit the drawing of object keys");
|
||||
uiDefButBitS(block, TOG, OB_POWERTRACK, REDRAWVIEW3D, "Powertrack", 180,160,78,19, &ob->transflag, 0, 0, 0, 0, "Switch objects rotation off");
|
||||
uiDefButBitS(block, TOG, PARSLOW, 0, "SlowPar", 260,160,56,19, &ob->partype, 0, 0, 0, 0, "Create a delay in the parent relationship");
|
||||
uiBlockBeginAlign(block);
|
||||
uiDefButBitC(block, TOG, OB_DUPLIFRAMES, REDRAWVIEW3D, "DupliFrames", 24,128,89,19, &ob->transflag, 0, 0, 0, 0, "Make copy of object for every frame");
|
||||
uiDefButBitC(block, TOG, OB_DUPLIVERTS, REDRAWVIEW3D, "DupliVerts", 114,128,82,19, &ob->transflag, 0, 0, 0, 0, "Duplicate child objects on all vertices");
|
||||
uiDefButBitC(block, TOG, OB_DUPLIROT, REDRAWVIEW3D, "Rot", 200,128,31,19, &ob->transflag, 0, 0, 0, 0, "Rotate dupli according to facenormal");
|
||||
uiDefButBitC(block, TOG, OB_DUPLINOSPEED, REDRAWVIEW3D, "No Speed", 234,128,82,19, &ob->transflag, 0, 0, 0, 0, "Set dupliframes to still, regardless of frame");
|
||||
uiDefButBitS(block, TOG, OB_DUPLIFRAMES, REDRAWVIEW3D, "DupliFrames", 24,128,89,19, &ob->transflag, 0, 0, 0, 0, "Make copy of object for every frame");
|
||||
uiDefButBitS(block, TOG, OB_DUPLIVERTS, REDRAWVIEW3D, "DupliVerts", 114,128,82,19, &ob->transflag, 0, 0, 0, 0, "Duplicate child objects on all vertices");
|
||||
uiDefButBitS(block, TOG, OB_DUPLIROT, REDRAWVIEW3D, "Rot", 200,128,31,19, &ob->transflag, 0, 0, 0, 0, "Rotate dupli according to facenormal");
|
||||
uiDefButBitS(block, TOG, OB_DUPLINOSPEED, REDRAWVIEW3D, "No Speed", 234,128,82,19, &ob->transflag, 0, 0, 0, 0, "Set dupliframes to still, regardless of frame");
|
||||
uiBlockBeginAlign(block);
|
||||
uiDefButS(block, NUM, REDRAWVIEW3D, "DupSta:", 24,105,141,19, &ob->dupsta, 1.0, (MAXFRAMEF - 1.0f), 0, 0, "Specify startframe for Dupliframes");
|
||||
uiDefButS(block, NUM, REDRAWVIEW3D, "DupOn:", 170,105,146,19, &ob->dupon, 1.0, 1500.0, 0, 0, "");
|
||||
uiDefButS(block, NUM, REDRAWVIEW3D, "DupEnd", 24,82,140,19, &ob->dupend, 1.0, MAXFRAMEF, 0, 0, "Specify endframe for Dupliframes");
|
||||
uiDefButS(block, NUM, REDRAWVIEW3D, "DupOff", 171,82,145,19, &ob->dupoff, 0.0, 1500.0, 0, 0, "");
|
||||
uiBlockBeginAlign(block);
|
||||
uiDefButBitC(block, TOG, OB_OFFS_OB, REDRAWALL, "Offs Ob", 24,51,56,20, &ob->ipoflag, 0, 0, 0, 0, "Let the timeoffset work on its own objectipo");
|
||||
uiDefButBitC(block, TOG, OB_OFFS_PARENT, REDRAWALL, "Offs Par", 82,51,56,20 , &ob->ipoflag, 0, 0, 0, 0, "Let the timeoffset work on the parent");
|
||||
uiDefButBitC(block, TOG, OB_OFFS_PARTICLE, REDRAWALL, "Offs Particle", 140,51,103,20, &ob->ipoflag, 0, 0, 0, 0, "Let the timeoffset work on the particle effect");
|
||||
uiDefButBitS(block, TOG, OB_OFFS_OB, REDRAWALL, "Offs Ob", 24,51,56,20, &ob->ipoflag, 0, 0, 0, 0, "Let the timeoffset work on its own objectipo");
|
||||
uiDefButBitS(block, TOG, OB_OFFS_PARENT, REDRAWALL, "Offs Par", 82,51,56,20 , &ob->ipoflag, 0, 0, 0, 0, "Let the timeoffset work on the parent");
|
||||
uiDefButBitS(block, TOG, OB_OFFS_PARTICLE, REDRAWALL, "Offs Particle", 140,51,103,20, &ob->ipoflag, 0, 0, 0, 0, "Let the timeoffset work on the particle effect");
|
||||
|
||||
uiBlockBeginAlign(block);
|
||||
uiDefButF(block, NUM, REDRAWALL, "TimeOffset:", 24,17,115,30, &ob->sf, -MAXFRAMEF, MAXFRAMEF, 100, 0, "Specify an offset in frames");
|
||||
|
||||
@@ -78,6 +78,7 @@
|
||||
#include "BDR_editcurve.h"
|
||||
|
||||
#include "BSE_view.h"
|
||||
#include "BSE_drawnla.h"
|
||||
#include "BSE_drawipo.h"
|
||||
|
||||
/* 'old' stuff": defines and types, and own include -------------------- */
|
||||
@@ -360,41 +361,6 @@ int count_action_levels(bAction *act)
|
||||
|
||||
return y;
|
||||
}
|
||||
/** Draw a nicely beveled button (in screen space) */
|
||||
void draw_bevel_but(int x, int y, int w, int h, int sel)
|
||||
{
|
||||
int xmin= x, ymin= y;
|
||||
int xmax= x+w-1, ymax= y+h-1;
|
||||
int i;
|
||||
|
||||
glColor3ub(0,0,0);
|
||||
glBegin(GL_LINE_LOOP);
|
||||
glVertex2i(xmin, ymin);
|
||||
glVertex2i(xmax, ymin);
|
||||
glVertex2i(xmax, ymax);
|
||||
glVertex2i(xmin, ymax);
|
||||
glEnd();
|
||||
|
||||
glBegin(GL_LINE_LOOP);
|
||||
if (sel) glColor3ub(0xD0, 0x7E, 0x06);
|
||||
else glColor3ub(0x8C, 0x8C, 0x8C);
|
||||
glVertex2i(xmax-1, ymin+1);
|
||||
glVertex2i(xmax-1, ymax-1);
|
||||
if (sel) glColor3ub(0xF4, 0xEE, 0x8E);
|
||||
else glColor3ub(0xDF, 0xDF, 0xDF);
|
||||
glVertex2i(xmin+1, ymax-1);
|
||||
glVertex2i(xmin+1, ymin+1);
|
||||
glEnd();
|
||||
|
||||
if (sel) glColor3ub(0xF1, 0xCA, 0x13);
|
||||
else glColor3ub(0xAC, 0xAC, 0xAC);
|
||||
glBegin(GL_LINES);
|
||||
for (i=xmin+2; i<=xmax-2; i++) {
|
||||
glVertex2f(i, ymin+2);
|
||||
glVertex2f(i, ymax-1);
|
||||
}
|
||||
glEnd();
|
||||
}
|
||||
|
||||
static void draw_channel_strips(SpaceAction *saction)
|
||||
{
|
||||
@@ -404,6 +370,7 @@ static void draw_channel_strips(SpaceAction *saction)
|
||||
bActionChannel *chan;
|
||||
bConstraintChannel *conchan;
|
||||
float y;
|
||||
int act_end, dummy;
|
||||
char col1[3], col2[3];
|
||||
|
||||
BIF_GetThemeColor3ubv(TH_SHADE2, col2);
|
||||
@@ -413,14 +380,21 @@ static void draw_channel_strips(SpaceAction *saction)
|
||||
if (!act)
|
||||
return;
|
||||
|
||||
scr_rct.xmin= saction->area->winrct.xmin + ACTWIDTH;
|
||||
scr_rct.xmin= saction->area->winrct.xmin + saction->v2d.mask.xmin;
|
||||
scr_rct.ymin= saction->area->winrct.ymin + saction->v2d.mask.ymin;
|
||||
scr_rct.xmax= saction->area->winrct.xmin + saction->v2d.hor.xmax;
|
||||
scr_rct.ymax= saction->area->winrct.ymin + saction->v2d.mask.ymax;
|
||||
di= glaBegin2DDraw(&scr_rct, &G.v2d->cur);
|
||||
|
||||
/* if in NLA there's a strip active, map the view */
|
||||
if (G.saction->pin==0 && OBACT)
|
||||
map_active_strip(di, OBACT, 0);
|
||||
|
||||
y= count_action_levels(act)*(CHANNELHEIGHT+CHANNELSKIP);
|
||||
|
||||
/* end of action itself */
|
||||
gla2DDrawTranslatePt(di, calc_action_end(act), 0, &act_end, &dummy);
|
||||
|
||||
for (chan=act->chanbase.first; chan; chan=chan->next){
|
||||
int frame1_x, channel_y;
|
||||
|
||||
@@ -429,11 +403,11 @@ static void draw_channel_strips(SpaceAction *saction)
|
||||
glEnable(GL_BLEND);
|
||||
if (chan->flag & ACHAN_SELECTED) glColor4ub(col1[0], col1[1], col1[2], 0x22);
|
||||
else glColor4ub(col2[0], col2[1], col2[2], 0x22);
|
||||
glRectf(0, channel_y-CHANNELHEIGHT/2, frame1_x, channel_y+CHANNELHEIGHT/2);
|
||||
glRectf(0, channel_y-CHANNELHEIGHT/2, G.v2d->hor.xmax, channel_y+CHANNELHEIGHT/2);
|
||||
|
||||
if (chan->flag & ACHAN_SELECTED) glColor4ub(col1[0], col1[1], col1[2], 0x44);
|
||||
else glColor4ub(col2[0], col2[1], col2[2], 0x44);
|
||||
glRectf(frame1_x, channel_y-CHANNELHEIGHT/2, G.v2d->hor.xmax, channel_y+CHANNELHEIGHT/2);
|
||||
glRectf(frame1_x, channel_y-CHANNELHEIGHT/2, act_end, channel_y+CHANNELHEIGHT/2);
|
||||
glDisable(GL_BLEND);
|
||||
|
||||
draw_ipo_channel(di, chan->ipo, 0, y);
|
||||
@@ -445,14 +419,15 @@ static void draw_channel_strips(SpaceAction *saction)
|
||||
/* Draw constraint channels */
|
||||
for (conchan=chan->constraintChannels.first; conchan; conchan=conchan->next){
|
||||
gla2DDrawTranslatePt(di, 1, y, &frame1_x, &channel_y);
|
||||
|
||||
glEnable(GL_BLEND);
|
||||
if (conchan->flag & ACHAN_SELECTED) glColor4ub(col1[0], col1[1], col1[2], 0x22);
|
||||
else glColor4ub(col2[0], col2[1], col2[2], 0x22);
|
||||
glRectf(0, channel_y-CHANNELHEIGHT/2+4, frame1_x, channel_y+CHANNELHEIGHT/2-4);
|
||||
glRectf(0, channel_y-CHANNELHEIGHT/2+4, G.v2d->hor.xmax, channel_y+CHANNELHEIGHT/2-4);
|
||||
|
||||
if (conchan->flag & ACHAN_SELECTED) glColor4ub(col1[0], col1[1], col1[2], 0x44);
|
||||
else glColor4ub(col2[0], col2[1], col2[2], 0x44);
|
||||
glRectf(frame1_x, channel_y-CHANNELHEIGHT/2+4, G.v2d->hor.xmax, channel_y+CHANNELHEIGHT/2-4);
|
||||
glRectf(frame1_x, channel_y-CHANNELHEIGHT/2+4, act_end, channel_y+CHANNELHEIGHT/2-4);
|
||||
glDisable(GL_BLEND);
|
||||
|
||||
draw_ipo_channel(di, conchan->ipo, 0, y);
|
||||
@@ -651,10 +626,8 @@ void drawactionspace(ScrArea *sa, void *spacedata)
|
||||
* then draw the key frames in the action window
|
||||
*/
|
||||
draw_mesh_strips(G.saction, key);
|
||||
/*meshactionbuts(G.saction, key);*/
|
||||
}
|
||||
|
||||
|
||||
/* Draw current frame */
|
||||
glViewport(ofsx+G.v2d->mask.xmin,
|
||||
ofsy+G.v2d->mask.ymin,
|
||||
@@ -674,16 +647,20 @@ void drawactionspace(ScrArea *sa, void *spacedata)
|
||||
if(G.v2d->scroll) drawscroll(0);
|
||||
}
|
||||
|
||||
/* Draw channel names */
|
||||
draw_channel_names();
|
||||
if(G.v2d->mask.xmin!=0) {
|
||||
/* Draw channel names */
|
||||
draw_channel_names();
|
||||
|
||||
if ( key ) {
|
||||
/* if there is a mesh with rvk's selected,
|
||||
* then draw the key frames in the action window
|
||||
*/
|
||||
meshactionbuts(G.saction, key);
|
||||
if(sa->winx > 50 + NAMEWIDTH + SLIDERWIDTH) {
|
||||
if ( key ) {
|
||||
/* if there is a mesh with rvk's selected,
|
||||
* then draw the key frames in the action window
|
||||
*/
|
||||
meshactionbuts(G.saction, key);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
mywinset(curarea->win); // reset scissor too
|
||||
myortho2(-0.375, curarea->winx-0.375, -0.375, curarea->winy-0.375);
|
||||
draw_area_emboss(sa);
|
||||
@@ -695,11 +672,41 @@ void drawactionspace(ScrArea *sa, void *spacedata)
|
||||
curarea->win_swap= WIN_BACK_OK;
|
||||
}
|
||||
|
||||
/* unused and blank
|
||||
void draw_channel_name(const char* name, short type, float ypos, int selected)
|
||||
|
||||
/** Draw a nicely beveled button (in screen space) */
|
||||
static void draw_bevel_but(int x, int y, int w, int h, int sel)
|
||||
{
|
||||
int xmin= x, ymin= y;
|
||||
int xmax= x+w-1, ymax= y+h-1;
|
||||
|
||||
/* outline */
|
||||
glColor3ub(0,0,0);
|
||||
glBegin(GL_LINE_LOOP);
|
||||
glVertex2i(xmin, ymin);
|
||||
glVertex2i(xmax, ymin);
|
||||
glVertex2i(xmax, ymax);
|
||||
glVertex2i(xmin, ymax);
|
||||
glEnd();
|
||||
|
||||
/* interior */
|
||||
if (sel) glColor3ub(0xF1, 0xCA, 0x13);
|
||||
else glColor3ub(0xAC, 0xAC, 0xAC);
|
||||
glRectf(xmin+1, ymin+1, xmax-1, ymax-1);
|
||||
|
||||
/* bevel */
|
||||
glBegin(GL_LINE_LOOP);
|
||||
|
||||
if (sel) glColor3ub(0xD0, 0x7E, 0x06);
|
||||
else glColor3ub(0x8C, 0x8C, 0x8C);
|
||||
glVertex2i(xmax-1, ymin+1);
|
||||
glVertex2i(xmax-1, ymax-1);
|
||||
|
||||
if (sel) glColor3ub(0xF4, 0xEE, 0x8E);
|
||||
else glColor3ub(0xDF, 0xDF, 0xDF);
|
||||
glVertex2i(xmin+1, ymax-1);
|
||||
glVertex2i(xmin+1, ymin+1);
|
||||
glEnd();
|
||||
}
|
||||
*/
|
||||
|
||||
static void draw_keylist(gla2DDrawInfo *di, int totvert, BezTriple **blist, float ypos)
|
||||
{
|
||||
@@ -712,7 +719,7 @@ static void draw_keylist(gla2DDrawInfo *di, int totvert, BezTriple **blist, floa
|
||||
if (v==0 || (blist[v]->vec[1][0] != blist[v-1]->vec[1][0])){
|
||||
int sc_x, sc_y;
|
||||
gla2DDrawTranslatePt(di, blist[v]->vec[1][0], ypos, &sc_x, &sc_y);
|
||||
draw_bevel_but(sc_x-2, sc_y-5, 7, 13, (blist[v]->f2 & 1));
|
||||
draw_bevel_but(sc_x-2, sc_y-7, 7, 13, (blist[v]->f2 & 1));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -770,6 +777,7 @@ void draw_action_channel(gla2DDrawInfo *di, bAction *act, int flags, float ypos)
|
||||
static BezTriple **ob_to_keylist(Object *ob, int flags, int *totvert)
|
||||
{
|
||||
IpoCurve *icu;
|
||||
bConstraintChannel *conchan;
|
||||
int v, count=0;
|
||||
|
||||
BezTriple **list = NULL;
|
||||
@@ -784,6 +792,12 @@ static BezTriple **ob_to_keylist(Object *ob, int flags, int *totvert)
|
||||
}
|
||||
|
||||
/* Count Constraint Keys */
|
||||
for (conchan=ob->constraintChannels.first; conchan; conchan=conchan->next){
|
||||
if(conchan->ipo)
|
||||
for (icu=conchan->ipo->curve.first; icu; icu=icu->next)
|
||||
count+=icu->totvert;
|
||||
}
|
||||
|
||||
/* Count object data keys */
|
||||
|
||||
/* Build the list */
|
||||
@@ -792,13 +806,21 @@ static BezTriple **ob_to_keylist(Object *ob, int flags, int *totvert)
|
||||
count=0;
|
||||
|
||||
/* Add object keyframes */
|
||||
for (icu=ob->ipo->curve.first; icu; icu=icu->next){
|
||||
for (v=0; v<icu->totvert; v++){
|
||||
list[count++]=&icu->bezt[v];
|
||||
if(ob->ipo) {
|
||||
for (icu=ob->ipo->curve.first; icu; icu=icu->next){
|
||||
for (v=0; v<icu->totvert; v++){
|
||||
list[count++]=&icu->bezt[v];
|
||||
}
|
||||
}
|
||||
}
|
||||
/* Add constraint keyframes */
|
||||
for (conchan=ob->constraintChannels.first; conchan; conchan=conchan->next){
|
||||
if(conchan->ipo)
|
||||
for (icu=conchan->ipo->curve.first; icu; icu=icu->next)
|
||||
for (v=0; v<icu->totvert; v++)
|
||||
list[count++]=&icu->bezt[v];
|
||||
}
|
||||
|
||||
/* Add constraint keyframes */
|
||||
/* Add object data keyframes */
|
||||
|
||||
/* Sort */
|
||||
@@ -880,13 +902,13 @@ static BezTriple **action_to_keylist(bAction *act, int flags, int *totvert)
|
||||
if(achan->ipo) {
|
||||
for (icu=achan->ipo->curve.first; icu; icu=icu->next)
|
||||
count+=icu->totvert;
|
||||
|
||||
/* Count constraint keys */
|
||||
for (conchan=achan->constraintChannels.first; conchan; conchan=conchan->next)
|
||||
}
|
||||
/* Count constraint keys */
|
||||
for (conchan=achan->constraintChannels.first; conchan; conchan=conchan->next)
|
||||
if(conchan->ipo)
|
||||
for (icu=conchan->ipo->curve.first; icu; icu=icu->next)
|
||||
count+=icu->totvert;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
/* Build the list */
|
||||
@@ -895,17 +917,19 @@ static BezTriple **action_to_keylist(bAction *act, int flags, int *totvert)
|
||||
count=0;
|
||||
|
||||
for (achan=act->chanbase.first; achan; achan=achan->next){
|
||||
/* Add transformation keys */
|
||||
for (icu=achan->ipo->curve.first; icu; icu=icu->next){
|
||||
for (v=0; v<icu->totvert; v++)
|
||||
list[count++]=&icu->bezt[v];
|
||||
}
|
||||
|
||||
/* Add constraint keys */
|
||||
for (conchan=achan->constraintChannels.first; conchan; conchan=conchan->next){
|
||||
for (icu=conchan->ipo->curve.first; icu; icu=icu->next)
|
||||
if(achan->ipo) {
|
||||
/* Add transformation keys */
|
||||
for (icu=achan->ipo->curve.first; icu; icu=icu->next){
|
||||
for (v=0; v<icu->totvert; v++)
|
||||
list[count++]=&icu->bezt[v];
|
||||
}
|
||||
}
|
||||
/* Add constraint keys */
|
||||
for (conchan=achan->constraintChannels.first; conchan; conchan=conchan->next){
|
||||
if(conchan->ipo)
|
||||
for (icu=conchan->ipo->curve.first; icu; icu=icu->next)
|
||||
for (v=0; v<icu->totvert; v++)
|
||||
list[count++]=&icu->bezt[v];
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -92,14 +92,15 @@
|
||||
#define ISPOIN4(a, b, c, d, e) ( (a->b) && (a->c) && (a->d) && (a->e) )
|
||||
|
||||
#define IPOBUTX 65
|
||||
#define IPOSTEP 35 /* minimum pixels per gridstep */
|
||||
/* minimum pixels per gridstep */
|
||||
#define IPOSTEP 35
|
||||
|
||||
static float ipogrid_dx, ipogrid_dy, ipogrid_startx, ipogrid_starty;
|
||||
static int ipomachtx, ipomachty;
|
||||
|
||||
static int vertymin, vertymax, horxmin, horxmax; /* globals om LEFTMOUSE op scrollbar te testen */
|
||||
static int vertymin, vertymax, horxmin, horxmax; /* globals to test LEFTMOUSE for scrollbar */
|
||||
|
||||
extern short ACTWIDTH;
|
||||
extern short ACTWIDTH; /* this is ugly! */
|
||||
|
||||
static void scroll_prstr(float x, float y, float val, char dir, int disptype)
|
||||
{
|
||||
@@ -313,7 +314,7 @@ void draw_ipogrid(void)
|
||||
glRectf(0.0, 0.0, 100.0, 1.0);
|
||||
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
|
||||
}
|
||||
else if(ELEM(G.sipo->blocktype, ID_CU, IPO_CO)) {
|
||||
else if(ELEM(G.sipo->blocktype, ID_CU, ID_CO)) {
|
||||
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
|
||||
glRectf(0.0, 1.0, G.v2d->cur.xmax, 1.0);
|
||||
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
|
||||
@@ -594,12 +595,16 @@ void calc_scrollrcts(ScrArea *sa, View2D *v2d, int winx, int winy)
|
||||
v2d->mask.ymax= winy;
|
||||
|
||||
if(sa->spacetype==SPACE_ACTION) {
|
||||
v2d->mask.xmin+= ACTWIDTH;
|
||||
v2d->hor.xmin+=ACTWIDTH;
|
||||
if(sa->winx > ACTWIDTH+50) {
|
||||
v2d->mask.xmin+= ACTWIDTH;
|
||||
v2d->hor.xmin+=ACTWIDTH;
|
||||
}
|
||||
}
|
||||
else if(sa->spacetype==SPACE_NLA){
|
||||
v2d->mask.xmin+= NLAWIDTH;
|
||||
v2d->hor.xmin+=NLAWIDTH;
|
||||
if(sa->winx > NLAWIDTH+50) {
|
||||
v2d->mask.xmin+= NLAWIDTH;
|
||||
v2d->hor.xmin+=NLAWIDTH;
|
||||
}
|
||||
}
|
||||
else if(sa->spacetype==SPACE_IPO) {
|
||||
v2d->mask.xmax-= IPOBUTX;
|
||||
@@ -1688,7 +1693,7 @@ void do_ipobuts(unsigned short event)
|
||||
ei= get_active_editipo();
|
||||
if(ei) {
|
||||
if(ei->icu==NULL) {
|
||||
ei->icu= get_ipocurve(G.sipo->from, G.sipo->blocktype, ei->adrcode, NULL);
|
||||
ei->icu= verify_ipocurve(G.sipo->from, G.sipo->blocktype, G.sipo->actname, G.sipo->constname, ei->adrcode);
|
||||
ei->flag |= IPO_SELECT;
|
||||
ei->icu->flag= ei->flag;
|
||||
}
|
||||
@@ -2040,6 +2045,8 @@ int view2dzoom(unsigned short event)
|
||||
areawinset(curarea->win); /* from buttons */
|
||||
curarea->head_swap= 0;
|
||||
getmouseco_areawin(mvalo);
|
||||
mval[0]= mvalo[0];
|
||||
mval[1]= mvalo[1];
|
||||
|
||||
while( (get_mbut()&(L_MOUSE|M_MOUSE)) || (event==WHEELUPMOUSE) || (event==WHEELDOWNMOUSE) ) {
|
||||
|
||||
@@ -2130,11 +2137,23 @@ int view2dzoom(unsigned short event)
|
||||
mvalo[1]= mval[1];
|
||||
}
|
||||
|
||||
G.v2d->cur.xmin+= dx;
|
||||
G.v2d->cur.xmax-= dx;
|
||||
|
||||
if ELEM5(curarea->spacetype, SPACE_SEQ, SPACE_SOUND, SPACE_ACTION, SPACE_NLA, SPACE_TIME);
|
||||
if( ELEM(curarea->spacetype, SPACE_NLA, SPACE_ACTION) ) {
|
||||
if(mvalo[0] < G.v2d->mask.xmin) {
|
||||
G.v2d->cur.ymin+= dy;
|
||||
G.v2d->cur.ymax-= dy;
|
||||
}
|
||||
else {
|
||||
G.v2d->cur.xmin+= dx;
|
||||
G.v2d->cur.xmax-= dx;
|
||||
}
|
||||
}
|
||||
else if (ELEM3(curarea->spacetype, SPACE_SEQ, SPACE_SOUND, SPACE_TIME)) {
|
||||
G.v2d->cur.xmin+= dx;
|
||||
G.v2d->cur.xmax-= dx;
|
||||
}
|
||||
else {
|
||||
G.v2d->cur.xmin+= dx;
|
||||
G.v2d->cur.xmax-= dx;
|
||||
G.v2d->cur.ymin+= dy;
|
||||
G.v2d->cur.ymax-= dy;
|
||||
}
|
||||
@@ -2214,10 +2233,20 @@ int view2dmove(unsigned short event)
|
||||
|
||||
if ELEM7(curarea->spacetype, SPACE_IPO, SPACE_SEQ, SPACE_OOPS, SPACE_SOUND, SPACE_ACTION, SPACE_NLA, SPACE_TIME)
|
||||
{
|
||||
|
||||
if( BLI_in_rcti(&G.v2d->mask, (int)mvalo[0], (int)mvalo[1]) ) {
|
||||
facx= (G.v2d->cur.xmax-G.v2d->cur.xmin)/(float)(G.v2d->mask.xmax-G.v2d->mask.xmin);
|
||||
facy= (G.v2d->cur.ymax-G.v2d->cur.ymin)/(float)(G.v2d->mask.ymax-G.v2d->mask.ymin);
|
||||
}
|
||||
/* stoopid exception to allow scroll in lefthand side */
|
||||
else if(curarea->spacetype==SPACE_ACTION && BLI_in_rcti(&G.v2d->mask, ACTWIDTH+(int)mvalo[0], (int)mvalo[1]) ) {
|
||||
facx= 0.0f;
|
||||
facy= (G.v2d->cur.ymax-G.v2d->cur.ymin)/(float)(G.v2d->mask.ymax-G.v2d->mask.ymin);
|
||||
}
|
||||
else if(curarea->spacetype==SPACE_NLA && BLI_in_rcti(&G.v2d->mask, NLAWIDTH+(int)mvalo[0], (int)mvalo[1]) ) {
|
||||
facx= 0.0f;
|
||||
facy= (G.v2d->cur.ymax-G.v2d->cur.ymin)/(float)(G.v2d->mask.ymax-G.v2d->mask.ymin);
|
||||
}
|
||||
else if(IN_2D_VERT_SCROLL((int)mvalo)) {
|
||||
facy= -(G.v2d->tot.ymax-G.v2d->tot.ymin)/(float)(G.v2d->mask.ymax-G.v2d->mask.ymin);
|
||||
if(get_mbut() & mousebut) {
|
||||
|
||||
@@ -56,6 +56,8 @@
|
||||
|
||||
#include "BLI_blenlib.h"
|
||||
#include "MEM_guardedalloc.h"
|
||||
|
||||
#include "BKE_action.h"
|
||||
#include "BKE_global.h"
|
||||
|
||||
#include "BSE_drawnla.h"
|
||||
@@ -77,24 +79,16 @@
|
||||
#include "blendef.h"
|
||||
#include "mydevice.h"
|
||||
|
||||
/* Local function prototypes */
|
||||
static void draw_nlastrips(SpaceNla *snla);
|
||||
static void draw_nlatree(void);
|
||||
|
||||
int count_nla_levels(void);
|
||||
int nla_filter (Base* base, int flags);
|
||||
|
||||
#define TESTBASE_SAFE(base) ((base)->flag & SELECT)
|
||||
|
||||
/* Implementation */
|
||||
static void draw_nlatree(void)
|
||||
/* the left hand side with channels only */
|
||||
static void draw_nla_channels(void)
|
||||
{
|
||||
|
||||
short ofsx, ofsy = 0;
|
||||
Base *base;
|
||||
float x, y;
|
||||
bActionStrip *strip;
|
||||
bConstraintChannel *conchan;
|
||||
Base *base;
|
||||
Object *ob;
|
||||
float x, y;
|
||||
short ofsx, ofsy = 0;
|
||||
|
||||
myortho2(0, NLAWIDTH, G.v2d->cur.ymin, G.v2d->cur.ymax); // Scaling
|
||||
|
||||
@@ -111,14 +105,13 @@ static void draw_nlatree(void)
|
||||
glColor3ub(0x00, 0x00, 0x00);
|
||||
|
||||
x = 0.0;
|
||||
|
||||
y = count_nla_levels();
|
||||
|
||||
y*= (NLACHANNELHEIGHT+NLACHANNELSKIP);
|
||||
|
||||
|
||||
for (base=G.scene->base.first; base; base=base->next){
|
||||
if (nla_filter(base, 0)){
|
||||
if (nla_filter(base)) {
|
||||
ob= base->object;
|
||||
|
||||
BIF_ThemeColorShade(TH_HEADER, 20);
|
||||
glRectf(x, y-NLACHANNELHEIGHT/2, (float)NLAWIDTH, y+NLACHANNELHEIGHT/2);
|
||||
|
||||
@@ -127,63 +120,56 @@ static void draw_nlatree(void)
|
||||
BIF_ThemeColor(TH_TEXT_HI);
|
||||
else
|
||||
BIF_ThemeColor(TH_TEXT);
|
||||
glRasterPos2f(x+16, y-4);
|
||||
glRasterPos2f(x+21, y-4);
|
||||
|
||||
BMF_DrawString(G.font, base->object->id.name+2);
|
||||
BMF_DrawString(G.font, ob->id.name+2);
|
||||
|
||||
/* Draw the constraint ipos */
|
||||
for (conchan = base->object->constraintChannels.first; conchan; conchan=conchan->next){
|
||||
y-=NLACHANNELHEIGHT+NLACHANNELSKIP;
|
||||
BIF_ThemeColorShade(TH_HEADER, -30);
|
||||
/* icon to indicate nla or action */
|
||||
if(ob->nlastrips.first && ob->action) {
|
||||
if(ob->nlaflag & OB_NLA_OVERRIDE)
|
||||
BIF_draw_icon(x+5, y-8, ICON_NLA);
|
||||
else
|
||||
BIF_draw_icon(x+5, y-8, ICON_ACTION);
|
||||
}
|
||||
y-=NLACHANNELHEIGHT+NLACHANNELSKIP;
|
||||
|
||||
/* Draw the action timeline */
|
||||
if (ob->action){
|
||||
BIF_ThemeColorShade(TH_HEADER, -20);
|
||||
glRectf(x+16, y-NLACHANNELHEIGHT/2, (float)NLAWIDTH, y+NLACHANNELHEIGHT/2);
|
||||
|
||||
if (TESTBASE_SAFE(base))
|
||||
BIF_ThemeColor(TH_TEXT_HI);
|
||||
else
|
||||
BIF_ThemeColor(TH_TEXT);
|
||||
glRasterPos2f(x+32, y-4);
|
||||
BMF_DrawString(G.font, ob->action->id.name+2);
|
||||
|
||||
if (conchan->flag & CONSTRAINT_CHANNEL_SELECT)
|
||||
y-=NLACHANNELHEIGHT+NLACHANNELSKIP;
|
||||
}
|
||||
|
||||
/* Draw the nla strips */
|
||||
for (strip = ob->nlastrips.first; strip; strip=strip->next){
|
||||
BIF_ThemeColorShade(TH_HEADER, -40);
|
||||
glRectf(x+32, y-NLACHANNELHEIGHT/2, (float)NLAWIDTH, y+NLACHANNELHEIGHT/2);
|
||||
|
||||
if (TESTBASE_SAFE(base))
|
||||
BIF_ThemeColor(TH_TEXT_HI);
|
||||
else
|
||||
BIF_ThemeColor(TH_TEXT);
|
||||
|
||||
glRasterPos2f(x+32, y-4);
|
||||
BMF_DrawString(G.font, conchan->name);
|
||||
}
|
||||
|
||||
/* Draw the action timeline */
|
||||
if (ACTIVE_ARMATURE(base)){
|
||||
BIF_draw_icon(x, y-8, ICON_DOWNARROW_HLT);
|
||||
y-=NLACHANNELHEIGHT+NLACHANNELSKIP;
|
||||
|
||||
if (base->object->action){
|
||||
BIF_ThemeColorShade(TH_HEADER, -30);
|
||||
glRectf(x+16, y-NLACHANNELHEIGHT/2, (float)NLAWIDTH, y+NLACHANNELHEIGHT/2);
|
||||
|
||||
if (TESTBASE_SAFE(base))
|
||||
BIF_ThemeColor(TH_TEXT_HI);
|
||||
else
|
||||
BIF_ThemeColor(TH_TEXT);
|
||||
glRasterPos2f(x+32, y-4);
|
||||
BMF_DrawString(G.font, base->object->action->id.name+2);
|
||||
}
|
||||
}
|
||||
y-=NLACHANNELHEIGHT+NLACHANNELSKIP;
|
||||
|
||||
/* Draw the nla strips */
|
||||
if (base->object->type==OB_ARMATURE){
|
||||
for (strip = base->object->nlastrips.first; strip; strip=strip->next){
|
||||
BIF_ThemeColorShade(TH_HEADER, -50);
|
||||
glRectf(x+32, y-NLACHANNELHEIGHT/2, (float)NLAWIDTH, y+NLACHANNELHEIGHT/2);
|
||||
|
||||
if (TESTBASE_SAFE(base))
|
||||
BIF_ThemeColor(TH_TEXT_HI);
|
||||
else
|
||||
BIF_ThemeColor(TH_TEXT);
|
||||
|
||||
// why this test? check freeing mem when deleting strips? (ton)
|
||||
if(strip->act) {
|
||||
glRasterPos2f(x+48, y-4);
|
||||
BMF_DrawString(G.font, strip->act->id.name+2);
|
||||
|
||||
y-=(NLACHANNELHEIGHT+NLACHANNELSKIP);
|
||||
// why this test? check freeing mem when deleting strips? (ton)
|
||||
if(strip->act) {
|
||||
glRasterPos2f(x+48, y-4);
|
||||
BMF_DrawString(G.font, strip->act->id.name+2);
|
||||
|
||||
if(strip->flag & ACTSTRIP_ACTIVE) {
|
||||
glEnable(GL_BLEND);
|
||||
BIF_draw_icon_blended(x+16, y-8, ICON_DOT, TH_BACK, 0);
|
||||
glDisable(GL_BLEND);
|
||||
}
|
||||
}
|
||||
y-=(NLACHANNELHEIGHT+NLACHANNELSKIP);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -191,12 +177,29 @@ static void draw_nlatree(void)
|
||||
myortho2(0, NLAWIDTH, 0, ( ofsy+G.v2d->mask.ymax)-( ofsy+G.v2d->mask.ymin)); // Scaling
|
||||
}
|
||||
|
||||
static void draw_nlastrips(SpaceNla *snla)
|
||||
void map_active_strip(gla2DDrawInfo *di, Object *ob, int restore)
|
||||
{
|
||||
static rctf stored;
|
||||
|
||||
if(restore)
|
||||
gla2DSetMap(di, &stored);
|
||||
else {
|
||||
rctf map;
|
||||
|
||||
gla2DGetMap(di, &stored);
|
||||
map= stored;
|
||||
map.xmin= get_action_frame(ob, map.xmin);
|
||||
map.xmax= get_action_frame(ob, map.xmax);
|
||||
gla2DSetMap(di, &map);
|
||||
}
|
||||
}
|
||||
|
||||
/* the right hand side, with strips and keys */
|
||||
static void draw_nla_strips_keys(SpaceNla *snla)
|
||||
{
|
||||
Base *base;
|
||||
rcti scr_rct;
|
||||
gla2DDrawInfo *di;
|
||||
Base *base;
|
||||
bConstraintChannel *conchan;
|
||||
float y;
|
||||
char col1[3], col2[3];
|
||||
|
||||
@@ -205,7 +208,7 @@ static void draw_nlastrips(SpaceNla *snla)
|
||||
|
||||
/* Draw strips */
|
||||
|
||||
scr_rct.xmin= snla->area->winrct.xmin + NLAWIDTH;
|
||||
scr_rct.xmin= snla->area->winrct.xmin + snla->v2d.mask.xmin;
|
||||
scr_rct.ymin= snla->area->winrct.ymin + snla->v2d.mask.ymin;
|
||||
scr_rct.xmax= snla->area->winrct.xmin + snla->v2d.hor.xmax;
|
||||
scr_rct.ymax= snla->area->winrct.ymin + snla->v2d.mask.ymax;
|
||||
@@ -215,13 +218,12 @@ static void draw_nlastrips(SpaceNla *snla)
|
||||
y*= (NLACHANNELHEIGHT+NLACHANNELSKIP);
|
||||
|
||||
for (base=G.scene->base.first; base; base=base->next){
|
||||
Object *ob;
|
||||
Object *ob= base->object;
|
||||
bActionStrip *strip;
|
||||
int frame1_x, channel_y;
|
||||
|
||||
ob=base->object;
|
||||
|
||||
if (nla_filter(base, 0)){
|
||||
if (nla_filter(base)) {
|
||||
|
||||
/* Draw the field */
|
||||
glEnable (GL_BLEND);
|
||||
if (TESTBASE_SAFE(base))
|
||||
@@ -241,42 +243,14 @@ static void draw_nlastrips(SpaceNla *snla)
|
||||
|
||||
glDisable (GL_BLEND);
|
||||
|
||||
/* Draw the ipo */
|
||||
/* Draw the ipo keys */
|
||||
draw_object_channel(di, ob, 0, y);
|
||||
y-=NLACHANNELHEIGHT+NLACHANNELSKIP;
|
||||
|
||||
/* Draw the constraints */
|
||||
for (conchan=ob->constraintChannels.first; conchan; conchan=conchan->next){
|
||||
glEnable (GL_BLEND);
|
||||
if (conchan->flag & CONSTRAINT_CHANNEL_SELECT)
|
||||
glColor4ub (col1[0], col1[1], col1[2], 0x22);
|
||||
else
|
||||
glColor4ub (col2[0], col2[1], col2[2], 0x22);
|
||||
|
||||
gla2DDrawTranslatePt(di, 1, y, &frame1_x, &channel_y);
|
||||
glRectf(0, channel_y-NLACHANNELHEIGHT/2+4, frame1_x, channel_y+NLACHANNELHEIGHT/2-4);
|
||||
|
||||
|
||||
if (conchan->flag & CONSTRAINT_CHANNEL_SELECT)
|
||||
glColor4ub (col1[0], col1[1], col1[2], 0x44);
|
||||
else
|
||||
glColor4ub (col2[0], col2[1], col2[2], 0x44);
|
||||
glRectf(frame1_x, channel_y-NLACHANNELHEIGHT/2+4, G.v2d->hor.xmax, channel_y+NLACHANNELHEIGHT/2-4);
|
||||
|
||||
glDisable (GL_BLEND);
|
||||
|
||||
/* Draw the ipo */
|
||||
draw_ipo_channel(di, conchan->ipo, 0, y);
|
||||
y-=NLACHANNELHEIGHT+NLACHANNELSKIP;
|
||||
|
||||
}
|
||||
y-=NLACHANNELHEIGHT+NLACHANNELSKIP;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/* Draw the action strip */
|
||||
if (ACTIVE_ARMATURE(base)){
|
||||
if (ob->action){
|
||||
|
||||
/* Draw the field */
|
||||
glEnable (GL_BLEND);
|
||||
@@ -284,10 +258,10 @@ static void draw_nlastrips(SpaceNla *snla)
|
||||
glColor4ub (col1[0], col1[1], col1[2], 0x22);
|
||||
else
|
||||
glColor4ub (col2[0], col2[1], col2[2], 0x22);
|
||||
|
||||
gla2DDrawTranslatePt(di, 1, y, &frame1_x, &channel_y);
|
||||
glRectf(0, channel_y-NLACHANNELHEIGHT/2+4, frame1_x, channel_y+NLACHANNELHEIGHT/2-4);
|
||||
|
||||
|
||||
if (TESTBASE_SAFE(base))
|
||||
glColor4ub (col1[0], col1[1], col1[2], 0x44);
|
||||
else
|
||||
@@ -296,107 +270,108 @@ static void draw_nlastrips(SpaceNla *snla)
|
||||
|
||||
glDisable (GL_BLEND);
|
||||
|
||||
/* Draw the action keys */
|
||||
/* Draw the action keys, optionally corrected for active strip */
|
||||
map_active_strip(di, ob, 0);
|
||||
draw_action_channel(di, ob->action, 0, y);
|
||||
|
||||
map_active_strip(di, ob, 1);
|
||||
|
||||
y-=NLACHANNELHEIGHT+NLACHANNELSKIP;
|
||||
|
||||
}
|
||||
|
||||
/* Draw the nla strips */
|
||||
if (ob->type==OB_ARMATURE){
|
||||
for (strip=ob->nlastrips.first; strip; strip=strip->next){
|
||||
int stripstart, stripend;
|
||||
int blendstart, blendend;
|
||||
unsigned char r, g, b;
|
||||
for (strip=ob->nlastrips.first; strip; strip=strip->next){
|
||||
int stripstart, stripend;
|
||||
int blendstart, blendend;
|
||||
|
||||
/* Draw rect */
|
||||
if (strip->flag & ACTSTRIP_SELECT)
|
||||
BIF_ThemeColor(TH_STRIP_SELECT);
|
||||
else
|
||||
BIF_ThemeColor(TH_STRIP);
|
||||
|
||||
gla2DDrawTranslatePt(di, strip->start+strip->blendin, y, &stripstart, &channel_y);
|
||||
gla2DDrawTranslatePt(di, strip->end-strip->blendout, y, &stripend, &channel_y);
|
||||
glRectf(stripstart, channel_y-NLACHANNELHEIGHT/2+3, stripend, channel_y+NLACHANNELHEIGHT/2-3);
|
||||
|
||||
if (strip->flag & ACTSTRIP_SELECT)
|
||||
BIF_ThemeColorShade(TH_STRIP_SELECT, -60);
|
||||
else
|
||||
BIF_ThemeColorShade(TH_STRIP, -60);
|
||||
|
||||
/* Draw blendin */
|
||||
if (strip->blendin>0){
|
||||
glBegin(GL_TRIANGLES);
|
||||
|
||||
/* Draw rect */
|
||||
if (strip->flag & ACTSTRIP_SELECT){
|
||||
r= 0xff; g= 0xff; b= 0xaa;
|
||||
}
|
||||
else{
|
||||
r= 0xe4; g= 0x9c; b= 0xc6;
|
||||
}
|
||||
gla2DDrawTranslatePt(di, strip->start, y, &blendstart, &channel_y);
|
||||
|
||||
glColor4ub (r, g, b, 0xFF);
|
||||
|
||||
gla2DDrawTranslatePt(di, strip->start+strip->blendin, y, &stripstart, &channel_y);
|
||||
gla2DDrawTranslatePt(di, strip->end-strip->blendout, y, &stripend, &channel_y);
|
||||
glRectf(stripstart, channel_y-NLACHANNELHEIGHT/2+3, stripend, channel_y+NLACHANNELHEIGHT/2-3);
|
||||
|
||||
|
||||
/* Draw blendin */
|
||||
if (strip->blendin>0){
|
||||
glBegin(GL_TRIANGLES);
|
||||
|
||||
gla2DDrawTranslatePt(di, strip->start, y, &blendstart, &channel_y);
|
||||
|
||||
glColor4ub (r*0.75, g*0.75, b*0.75, 0xFF);
|
||||
glVertex2f(blendstart, channel_y-NLACHANNELHEIGHT/2+3);
|
||||
glVertex2f(stripstart, channel_y+NLACHANNELHEIGHT/2-3);
|
||||
glVertex2f(stripstart, channel_y-NLACHANNELHEIGHT/2+3);
|
||||
|
||||
|
||||
glEnd();
|
||||
}
|
||||
if (strip->blendout>0){
|
||||
glBegin(GL_TRIANGLES);
|
||||
gla2DDrawTranslatePt(di, strip->end, y, &blendend, &channel_y);
|
||||
glColor4ub (r*0.75, g*0.75, b*0.75, 0xFF);
|
||||
glVertex2f(blendend, channel_y-NLACHANNELHEIGHT/2+3);
|
||||
glVertex2f(stripend, channel_y+NLACHANNELHEIGHT/2-3);
|
||||
glVertex2f(stripend, channel_y-NLACHANNELHEIGHT/2+3);
|
||||
glEnd();
|
||||
}
|
||||
|
||||
/* Draw border */
|
||||
glBegin(GL_LINE_STRIP);
|
||||
glColor4f(1, 1, 1, 0.5);
|
||||
gla2DDrawTranslatePt(di, strip->start, y, &stripstart, &channel_y);
|
||||
gla2DDrawTranslatePt(di, strip->end, y, &stripend, &channel_y);
|
||||
|
||||
glVertex2f(stripstart, channel_y-NLACHANNELHEIGHT/2+3);
|
||||
glVertex2f(blendstart, channel_y-NLACHANNELHEIGHT/2+3);
|
||||
glVertex2f(stripstart, channel_y+NLACHANNELHEIGHT/2-3);
|
||||
glVertex2f(stripend, channel_y+NLACHANNELHEIGHT/2-3);
|
||||
glColor4f(0, 0, 0, 0.5);
|
||||
glVertex2f(stripend, channel_y-NLACHANNELHEIGHT/2+3);
|
||||
glVertex2f(stripstart, channel_y-NLACHANNELHEIGHT/2+3);
|
||||
|
||||
|
||||
glEnd();
|
||||
}
|
||||
if (strip->blendout>0){
|
||||
glBegin(GL_TRIANGLES);
|
||||
|
||||
glEnable (GL_BLEND);
|
||||
gla2DDrawTranslatePt(di, strip->end, y, &blendend, &channel_y);
|
||||
|
||||
/* Show strip extension */
|
||||
if (strip->flag & ACTSTRIP_HOLDLASTFRAME){
|
||||
glColor4ub (r, g, b, 0x55);
|
||||
|
||||
glRectf(stripend, channel_y-NLACHANNELHEIGHT/2+4, G.v2d->hor.xmax, channel_y+NLACHANNELHEIGHT/2-2);
|
||||
}
|
||||
|
||||
/* Show repeat */
|
||||
if (strip->repeat > 1.0 && !(strip->flag & ACTSTRIP_USESTRIDE)){
|
||||
float rep = 1;
|
||||
glBegin(GL_LINES);
|
||||
while (rep<strip->repeat){
|
||||
/* Draw line */
|
||||
glColor4f(0, 0, 0, 0.5);
|
||||
gla2DDrawTranslatePt(di, strip->start+(rep*((strip->end-strip->start)/strip->repeat)), y, &frame1_x, &channel_y);
|
||||
glVertex2f(frame1_x, channel_y-NLACHANNELHEIGHT/2+4);
|
||||
glVertex2f(frame1_x, channel_y+NLACHANNELHEIGHT/2-2);
|
||||
|
||||
glColor4f(1.0, 1.0, 1.0, 0.5);
|
||||
gla2DDrawTranslatePt(di, strip->start+(rep*((strip->end-strip->start)/strip->repeat)), y, &frame1_x, &channel_y);
|
||||
glVertex2f(frame1_x+1, channel_y-NLACHANNELHEIGHT/2+4);
|
||||
glVertex2f(frame1_x+1, channel_y+NLACHANNELHEIGHT/2-2);
|
||||
rep+=1.0;
|
||||
}
|
||||
glEnd();
|
||||
|
||||
}
|
||||
glDisable (GL_BLEND);
|
||||
|
||||
y-=(NLACHANNELHEIGHT+NLACHANNELSKIP);
|
||||
glVertex2f(blendend, channel_y-NLACHANNELHEIGHT/2+3);
|
||||
glVertex2f(stripend, channel_y+NLACHANNELHEIGHT/2-3);
|
||||
glVertex2f(stripend, channel_y-NLACHANNELHEIGHT/2+3);
|
||||
glEnd();
|
||||
}
|
||||
|
||||
/* Draw border */
|
||||
glBegin(GL_LINE_STRIP);
|
||||
glColor4f(1, 1, 1, 0.5);
|
||||
gla2DDrawTranslatePt(di, strip->start, y, &stripstart, &channel_y);
|
||||
gla2DDrawTranslatePt(di, strip->end, y, &stripend, &channel_y);
|
||||
|
||||
glVertex2f(stripstart, channel_y-NLACHANNELHEIGHT/2+3);
|
||||
glVertex2f(stripstart, channel_y+NLACHANNELHEIGHT/2-3);
|
||||
glVertex2f(stripend, channel_y+NLACHANNELHEIGHT/2-3);
|
||||
glColor4f(0, 0, 0, 0.5);
|
||||
glVertex2f(stripend, channel_y-NLACHANNELHEIGHT/2+3);
|
||||
glVertex2f(stripstart, channel_y-NLACHANNELHEIGHT/2+3);
|
||||
glEnd();
|
||||
|
||||
glEnable (GL_BLEND);
|
||||
|
||||
/* Show strip extension */
|
||||
if (strip->flag & ACTSTRIP_HOLDLASTFRAME){
|
||||
if (strip->flag & ACTSTRIP_SELECT)
|
||||
BIF_ThemeColorShadeAlpha(TH_STRIP_SELECT, 0, -180);
|
||||
else
|
||||
BIF_ThemeColorShadeAlpha(TH_STRIP, 0, -180);
|
||||
|
||||
glRectf(stripend, channel_y-NLACHANNELHEIGHT/2+4, G.v2d->hor.xmax, channel_y+NLACHANNELHEIGHT/2-2);
|
||||
}
|
||||
|
||||
/* Show repeat */
|
||||
if (strip->repeat > 1.0 && !(strip->flag & ACTSTRIP_USESTRIDE)){
|
||||
float rep = 1;
|
||||
glBegin(GL_LINES);
|
||||
while (rep<strip->repeat){
|
||||
/* Draw line */
|
||||
glColor4f(0, 0, 0, 0.5);
|
||||
gla2DDrawTranslatePt(di, strip->start+(rep*((strip->end-strip->start)/strip->repeat)), y, &frame1_x, &channel_y);
|
||||
glVertex2f(frame1_x, channel_y-NLACHANNELHEIGHT/2+4);
|
||||
glVertex2f(frame1_x, channel_y+NLACHANNELHEIGHT/2-2);
|
||||
|
||||
glColor4f(1.0, 1.0, 1.0, 0.5);
|
||||
gla2DDrawTranslatePt(di, strip->start+(rep*((strip->end-strip->start)/strip->repeat)), y, &frame1_x, &channel_y);
|
||||
glVertex2f(frame1_x+1, channel_y-NLACHANNELHEIGHT/2+4);
|
||||
glVertex2f(frame1_x+1, channel_y+NLACHANNELHEIGHT/2-2);
|
||||
rep+=1.0;
|
||||
}
|
||||
glEnd();
|
||||
|
||||
}
|
||||
glDisable (GL_BLEND);
|
||||
|
||||
y-=(NLACHANNELHEIGHT+NLACHANNELSKIP);
|
||||
}
|
||||
}
|
||||
glaEnd2DDraw(di);
|
||||
@@ -407,18 +382,16 @@ static void draw_nlastrips(SpaceNla *snla)
|
||||
|
||||
#define B_NLA_PANEL 121
|
||||
|
||||
static bActionStrip *get_active_nlastrip(void)
|
||||
/* For now just returns the first selected strip */
|
||||
bActionStrip *get_active_nlastrip(void)
|
||||
{
|
||||
Base *base;
|
||||
bActionStrip *strip;
|
||||
|
||||
for (base=G.scene->base.first; base; base=base->next){
|
||||
if (nla_filter(base, 0) && base->object->type==OB_ARMATURE){
|
||||
for (strip=base->object->nlastrips.first; strip; strip=strip->next){
|
||||
if (strip->flag & ACTSTRIP_SELECT)
|
||||
return strip;
|
||||
}
|
||||
for (strip=base->object->nlastrips.first; strip; strip=strip->next){
|
||||
if (strip->flag & ACTSTRIP_SELECT)
|
||||
return strip;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -478,30 +451,30 @@ static void nla_panel_properties(short cntrl) // NLA_HANDLER_PROPERTIES
|
||||
strip = get_active_nlastrip();
|
||||
if (!strip) return;
|
||||
|
||||
// first labels, for simpler align code :)
|
||||
/* first labels, for simpler align code :) */
|
||||
uiDefBut(block, LABEL, 0, "Timeline Range:", 10,180,300,19, 0, 0, 0, 0, 0, "");
|
||||
uiDefBut(block, LABEL, 0, "Action Range:", 10,140,300,19, 0, 0, 0, 0, 0, "");
|
||||
uiDefBut(block, LABEL, 0, "Blending:", 10,100,300,19, 0, 0, 0, 0, 0, "");
|
||||
uiDefBut(block, LABEL, 0, "Options:", 10,60,300,19, 0, 0, 0, 0, 0, "");
|
||||
|
||||
uiBlockBeginAlign(block);
|
||||
uiDefButF(block, NUM, B_REDR, "Strip Start:", 10,160,150,19, &strip->start, 1.0, MAXFRAMEF, 100, 0, "First frame in the timeline");
|
||||
uiDefButF(block, NUM, B_REDR, "Strip End:", 160,160,150,19, &strip->end, 1.0, MAXFRAMEF, 100, 0, "Last frame in the timeline");
|
||||
uiDefButF(block, NUM, B_REDR, "Strip Start:", 10,160,150,19, &strip->start, -1000.0, MAXFRAMEF, 100, 0, "First frame in the timeline");
|
||||
uiDefButF(block, NUM, B_REDR, "Strip End:", 160,160,150,19, &strip->end, -1000.0, MAXFRAMEF, 100, 0, "Last frame in the timeline");
|
||||
|
||||
uiBlockBeginAlign(block);
|
||||
uiDefButF(block, NUM, B_REDR, "Action Start:", 10,120,150,19, &strip->actstart, 1.0, MAXFRAMEF, 100, 0, "First frame of the action to map to the playrange");
|
||||
uiDefButF(block, NUM, B_REDR, "Action End:", 160,120,150,19, &strip->actend, 1.0, MAXFRAMEF, 100, 0, "Last frame of the action to map to the playrange");
|
||||
|
||||
uiBlockBeginAlign(block);
|
||||
uiDefButF(block, NUM, B_REDR, "Blendin:", 10,80,150,19, &strip->blendin, 0.0, MAXFRAMEF, 100, 0, "Number of frames of ease-in");
|
||||
uiDefButF(block, NUM, B_REDR, "Blendout:", 160,80,150,19, &strip->blendout, 0.0, MAXFRAMEF, 100, 0, "Number of frames of ease-out");
|
||||
uiDefButF(block, NUM, B_REDR, "Blendin:", 10,80,150,19, &strip->blendin, 0.0, strip->actend-strip->actstart, 100, 0, "Number of frames of ease-in");
|
||||
uiDefButF(block, NUM, B_REDR, "Blendout:", 160,80,150,19, &strip->blendout, 0.0, strip->actend-strip->actstart, 100, 0, "Number of frames of ease-out");
|
||||
|
||||
uiBlockBeginAlign(block);
|
||||
uiDefButF(block, NUM, B_REDR, "Repeat:", 10,40,150,19, &strip->repeat, 0.0001, MAXFRAMEF, 100, 0, "Number of times the action should repeat");
|
||||
uiDefButF(block, NUM, B_REDR, "Stride:", 160,40,150,19, &strip->stridelen, 0.0001, MAXFRAMEF, 100, 0, "Distance covered by one complete cycle of the action specified in the Action Range");
|
||||
uiDefButF(block, NUM, B_REDR, "Repeat:", 10,40,150,19, &strip->repeat, 0.0001, 1000.0f, 100, 0, "Number of times the action should repeat");
|
||||
uiDefButF(block, NUM, B_REDR, "Stride:", 160,40,150,19, &strip->stridelen, 0.0001, 1000.0, 100, 0, "Distance covered by one complete cycle of the action specified in the Action Range");
|
||||
|
||||
uiBlockBeginAlign(block);
|
||||
uiDefButBitS(block, TOG, ACTSTRIP_USESTRIDE, B_REDR, "Use Path", 10,0,100,19, &strip->flag, 0, 0, 0, 0, "Plays action based on path position & stride. Only armatures parented to a path");
|
||||
uiDefButBitS(block, TOG, ACTSTRIP_USESTRIDE, B_REDR, "Use Path", 10,0,100,19, &strip->flag, 0, 0, 0, 0, "Plays action based on path position & stride");
|
||||
uiDefButBitS(block, TOG, ACTSTRIP_HOLDLASTFRAME, B_REDR, "Hold", 110,0,100,19, &strip->flag, 0, 0, 0, 0, "Toggles whether to continue displaying the last frame past the end of the strip");
|
||||
uiDefButS(block, TOG, B_REDR, "Add", 210,0,100,19, &strip->mode, 0, 0, 0, 0, "Toggles additive blending mode");
|
||||
}
|
||||
@@ -563,8 +536,8 @@ void drawnlaspace(ScrArea *sa, void *spacedata)
|
||||
calc_ipogrid();
|
||||
draw_ipogrid();
|
||||
|
||||
/* Draw channel strips */
|
||||
draw_nlastrips(G.snla);
|
||||
/* the right hand side, with strips and keys */
|
||||
draw_nla_strips_keys(G.snla);
|
||||
|
||||
/* Draw current frame */
|
||||
glViewport(ofsx+G.v2d->mask.xmin, ofsy+G.v2d->mask.ymin, ( ofsx+G.v2d->mask.xmax-1)-(ofsx+G.v2d->mask.xmin)+1, ( ofsy+G.v2d->mask.ymax-1)-( ofsy+G.v2d->mask.ymin)+1);
|
||||
@@ -578,10 +551,10 @@ void drawnlaspace(ScrArea *sa, void *spacedata)
|
||||
myortho2(-0.375, curarea->winx-0.375, -0.375, curarea->winy-0.375);
|
||||
if(G.v2d->scroll) drawscroll(0);
|
||||
}
|
||||
|
||||
/* Draw channel names */
|
||||
draw_nlatree();
|
||||
|
||||
if(G.v2d->mask.xmin!=0) {
|
||||
/* Draw channel names */
|
||||
draw_nla_channels();
|
||||
}
|
||||
mywinset(curarea->win); // reset scissor too
|
||||
myortho2(-0.375, sa->winx-0.375, -0.375, sa->winy-0.375);
|
||||
draw_area_emboss(sa);
|
||||
@@ -598,48 +571,36 @@ int count_nla_levels(void)
|
||||
Base *base;
|
||||
int y=0;
|
||||
|
||||
for (y=0, base=G.scene->base.first; base; base=base->next)
|
||||
{
|
||||
if (nla_filter(base,0 )){
|
||||
/* Ipo */
|
||||
for (y=0, base=G.scene->base.first; base; base=base->next) {
|
||||
if (nla_filter(base)) {
|
||||
/* object level */
|
||||
y++;
|
||||
/* Constraint channels */
|
||||
y+=BLI_countlist(&base->object->constraintChannels);
|
||||
|
||||
if (base->object->type==OB_ARMATURE){
|
||||
/* Action */
|
||||
if(base->object->action){
|
||||
// bActionChannel *achan;
|
||||
y++;
|
||||
|
||||
// for (achan=base->object->action->chanbase.first; achan; achan=achan->next){
|
||||
// y+=BLI_countlist(&achan->constraintChannels);
|
||||
// }
|
||||
}
|
||||
/* Nla strips */
|
||||
y+= BLI_countlist(&base->object->nlastrips);
|
||||
}
|
||||
if(base->object->action)
|
||||
y++;
|
||||
|
||||
/* Nla strips */
|
||||
y+= BLI_countlist(&base->object->nlastrips);
|
||||
}
|
||||
}
|
||||
|
||||
return y;
|
||||
}
|
||||
|
||||
int nla_filter (Base* base, int flags)
|
||||
int nla_filter (Base *base)
|
||||
{
|
||||
Object *ob = base->object;
|
||||
|
||||
if(ob->action || ob->nlastrips.first)
|
||||
return 1;
|
||||
|
||||
/* Only objects with ipos */
|
||||
/* should become option */
|
||||
if (ob->ipo)
|
||||
return 1;
|
||||
|
||||
if (ob->constraintChannels.first)
|
||||
return 1;
|
||||
|
||||
/* Only armatures */
|
||||
if (ob->type==OB_ARMATURE)
|
||||
return 1;
|
||||
|
||||
else return 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -255,14 +255,15 @@ static void draw_ob_keys()
|
||||
/* go through each channel in the action */
|
||||
for (achan=act->chanbase.first; achan; achan=achan->next){
|
||||
/* convert the ipo to a list of 'current frame elements' */
|
||||
|
||||
elems.first= elems.last= NULL;
|
||||
make_cfra_list(achan->ipo, &elems);
|
||||
if(achan->ipo) {
|
||||
elems.first= elems.last= NULL;
|
||||
make_cfra_list(achan->ipo, &elems);
|
||||
|
||||
col[0] = 0x00; col[1] = 0x82; col[2] = 0x8B;
|
||||
draw_key_list(elems, col);
|
||||
|
||||
BLI_freelistN(&elems);
|
||||
col[0] = 0x00; col[1] = 0x82; col[2] = 0x8B;
|
||||
draw_key_list(elems, col);
|
||||
|
||||
BLI_freelistN(&elems);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -55,6 +55,7 @@
|
||||
#include "DNA_constraint_types.h"
|
||||
#include "DNA_key_types.h"
|
||||
#include "DNA_mesh_types.h"
|
||||
#include "DNA_nla_types.h"
|
||||
#include "DNA_lattice_types.h"
|
||||
|
||||
#include "BKE_action.h"
|
||||
@@ -98,9 +99,7 @@ extern int count_action_levels (bAction *act);
|
||||
#define BEZSELECTED(bezt) (((bezt)->f1 & 1) || ((bezt)->f2 & 1) || ((bezt)->f3 & 1))
|
||||
|
||||
/* Local Function prototypes, are forward needed */
|
||||
static void insertactionkey(bAction *act, bActionChannel *achan, bPoseChannel *chan, int adrcode, short makecurve, float time);
|
||||
static void hilight_channel (bAction *act, bActionChannel *chan, short hilight);
|
||||
static void set_action_key_time (bAction *act, bPoseChannel *chan, int adrcode, short makecurve, float time);
|
||||
|
||||
static void up_sel_action(void);
|
||||
static void down_sel_action(void);
|
||||
@@ -137,6 +136,7 @@ bAction* bake_action_with_client (bAction *act, Object *armob, float tolerance)
|
||||
bActionChannel *achan;
|
||||
bAction *temp;
|
||||
bPoseChannel *pchan;
|
||||
ID *id;
|
||||
float actlen;
|
||||
int oldframe;
|
||||
int curframe;
|
||||
@@ -144,7 +144,7 @@ bAction* bake_action_with_client (bAction *act, Object *armob, float tolerance)
|
||||
|
||||
if (!act)
|
||||
return NULL;
|
||||
|
||||
|
||||
arm = get_armature(armob);
|
||||
|
||||
if (G.obedit){
|
||||
@@ -158,7 +158,8 @@ bAction* bake_action_with_client (bAction *act, Object *armob, float tolerance)
|
||||
}
|
||||
|
||||
/* Get a new action */
|
||||
result = add_empty_action();
|
||||
result = add_empty_action(ID_PO);
|
||||
id= (ID *)armob;
|
||||
|
||||
/* Assign the new action a unique name */
|
||||
sprintf (newname, "%s.BAKED", act->id.name+2);
|
||||
@@ -169,7 +170,7 @@ bAction* bake_action_with_client (bAction *act, Object *armob, float tolerance)
|
||||
oldframe = G.scene->r.cfra;
|
||||
|
||||
temp = armob->action;
|
||||
armob->action = act;
|
||||
armob->action = result;
|
||||
|
||||
for (curframe=1; curframe<ceil(actlen+1); curframe++){
|
||||
|
||||
@@ -186,16 +187,16 @@ bAction* bake_action_with_client (bAction *act, Object *armob, float tolerance)
|
||||
for (pchan=armob->pose->chanbase.first; pchan; pchan=pchan->next){
|
||||
|
||||
/* Apply to keys */
|
||||
set_action_key_time (result, pchan, AC_QUAT_X, 1, curframe);
|
||||
set_action_key_time (result, pchan, AC_QUAT_Y, 1, curframe);
|
||||
set_action_key_time (result, pchan, AC_QUAT_Z, 1, curframe);
|
||||
set_action_key_time (result, pchan, AC_QUAT_W, 1, curframe);
|
||||
set_action_key_time (result, pchan, AC_LOC_X, 1, curframe);
|
||||
set_action_key_time (result, pchan, AC_LOC_Y, 1, curframe);
|
||||
set_action_key_time (result, pchan, AC_LOC_Z, 1, curframe);
|
||||
set_action_key_time (result, pchan, AC_SIZE_X, 1, curframe);
|
||||
set_action_key_time (result, pchan, AC_SIZE_Y, 1, curframe);
|
||||
set_action_key_time (result, pchan, AC_SIZE_Z, 1, curframe);
|
||||
insertkey(id, ID_AC, pchan->name, NULL, AC_LOC_X);
|
||||
insertkey(id, ID_AC, pchan->name, NULL, AC_LOC_Y);
|
||||
insertkey(id, ID_AC, pchan->name, NULL, AC_LOC_Z);
|
||||
insertkey(id, ID_AC, pchan->name, NULL, AC_QUAT_X);
|
||||
insertkey(id, ID_AC, pchan->name, NULL, AC_QUAT_Y);
|
||||
insertkey(id, ID_AC, pchan->name, NULL, AC_QUAT_Z);
|
||||
insertkey(id, ID_AC, pchan->name, NULL, AC_QUAT_W);
|
||||
insertkey(id, ID_AC, pchan->name, NULL, AC_SIZE_X);
|
||||
insertkey(id, ID_AC, pchan->name, NULL, AC_SIZE_Y);
|
||||
insertkey(id, ID_AC, pchan->name, NULL, AC_SIZE_Z);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -203,8 +204,10 @@ bAction* bake_action_with_client (bAction *act, Object *armob, float tolerance)
|
||||
/* Make another pass to ensure all keyframes are set to linear interpolation mode */
|
||||
for (achan = result->chanbase.first; achan; achan=achan->next){
|
||||
IpoCurve* icu;
|
||||
for (icu = achan->ipo->curve.first; icu; icu=icu->next){
|
||||
icu->ipo= IPO_LIN;
|
||||
if(achan->ipo) {
|
||||
for (icu = achan->ipo->curve.first; icu; icu=icu->next){
|
||||
icu->ipo= IPO_LIN;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -231,7 +234,6 @@ void select_actionchannel_by_name (bAction *act, char *name, int select)
|
||||
|
||||
for (chan = act->chanbase.first; chan; chan=chan->next){
|
||||
if (!strcmp (chan->name, name)){
|
||||
act->achan = chan;
|
||||
if (select){
|
||||
chan->flag |= ACHAN_SELECTED;
|
||||
hilight_channel (act, chan, 1);
|
||||
@@ -322,25 +324,27 @@ void duplicate_actionchannel_keys(void)
|
||||
duplicate_ipo_keys(conchan->ipo);
|
||||
}
|
||||
|
||||
transform_actionchannel_keys ('g');
|
||||
transform_actionchannel_keys ('g', 0);
|
||||
}
|
||||
|
||||
static bActionChannel *get_nearest_actionchannel_key (float *index, short *sel, bConstraintChannel **rchan){
|
||||
static bActionChannel *get_nearest_actionchannel_key (float *index, short *sel, bConstraintChannel **rchan)
|
||||
{
|
||||
bAction *act;
|
||||
bActionChannel *chan;
|
||||
IpoCurve *icu;
|
||||
bActionChannel *firstchan=NULL;
|
||||
bConstraintChannel *conchan, *firstconchan=NULL;
|
||||
int foundsel=0;
|
||||
float firstvert=-1, foundx=-1;
|
||||
int i;
|
||||
short mval[2];
|
||||
float ymin, ymax;
|
||||
rctf rectf;
|
||||
float firstvert=-1, foundx=-1;
|
||||
float ymin, ymax, xmin, xmax;
|
||||
int i;
|
||||
int foundsel=0;
|
||||
short mval[2];
|
||||
|
||||
*index=0;
|
||||
|
||||
*rchan=NULL;
|
||||
act=G.saction->action; /* We presume that we are only called during a valid action */
|
||||
act= G.saction->action; /* We presume that we are only called during a valid action */
|
||||
|
||||
getmouseco_areawin (mval);
|
||||
|
||||
@@ -352,16 +356,26 @@ static bActionChannel *get_nearest_actionchannel_key (float *index, short *sel,
|
||||
ymax = count_action_levels(act) * (CHANNELHEIGHT + CHANNELSKIP);
|
||||
ymax += CHANNELHEIGHT/2;
|
||||
|
||||
/* if action is mapped in NLA, it returns a correction */
|
||||
if(G.saction->pin==0 && OBACT) {
|
||||
xmin= get_action_frame(OBACT, rectf.xmin);
|
||||
xmax= get_action_frame(OBACT, rectf.xmax);
|
||||
}
|
||||
else {
|
||||
xmin= rectf.xmin;
|
||||
xmax= rectf.xmax;
|
||||
}
|
||||
|
||||
*sel=0;
|
||||
|
||||
for (chan=act->chanbase.first; chan; chan=chan->next){
|
||||
|
||||
/* Check action channel */
|
||||
ymin= ymax-(CHANNELHEIGHT+CHANNELSKIP);
|
||||
if (!((ymax < rectf.ymin) || (ymin > rectf.ymax))){
|
||||
if (!((ymax < rectf.ymin) || (ymin > rectf.ymax)) && chan->ipo){
|
||||
for (icu=chan->ipo->curve.first; icu; icu=icu->next){
|
||||
for (i=0; i<icu->totvert; i++){
|
||||
if (icu->bezt[i].vec[1][0] > rectf.xmin && icu->bezt[i].vec[1][0] <= rectf.xmax ){
|
||||
if (icu->bezt[i].vec[1][0] > xmin && icu->bezt[i].vec[1][0] <= xmax ){
|
||||
if (!firstchan){
|
||||
firstchan=chan;
|
||||
firstvert=icu->bezt[i].vec[1][0];
|
||||
@@ -388,10 +402,10 @@ static bActionChannel *get_nearest_actionchannel_key (float *index, short *sel,
|
||||
/* Check constraint channels */
|
||||
for (conchan=chan->constraintChannels.first; conchan; conchan=conchan->next){
|
||||
ymin=ymax-(CHANNELHEIGHT+CHANNELSKIP);
|
||||
if (!((ymax < rectf.ymin) || (ymin > rectf.ymax))){
|
||||
if (!((ymax < rectf.ymin) || (ymin > rectf.ymax)) && conchan->ipo) {
|
||||
for (icu=conchan->ipo->curve.first; icu; icu=icu->next){
|
||||
for (i=0; i<icu->totvert; i++){
|
||||
if (icu->bezt[i].vec[1][0] > rectf.xmin && icu->bezt[i].vec[1][0] <= rectf.xmax ){
|
||||
if (icu->bezt[i].vec[1][0] > xmin && icu->bezt[i].vec[1][0] <= xmax ){
|
||||
if (!firstchan){
|
||||
firstchan=chan;
|
||||
firstconchan=conchan;
|
||||
@@ -550,13 +564,11 @@ static void mouse_action(int selectmode)
|
||||
|
||||
if (chan){
|
||||
if (selectmode == SELECT_REPLACE) {
|
||||
if (sel == 0)
|
||||
selectmode = SELECT_ADD;
|
||||
else
|
||||
selectmode = SELECT_SUBTRACT;
|
||||
selectmode = SELECT_ADD;
|
||||
|
||||
deselect_actionchannel_keys(act, 0);
|
||||
deselect_actionchannels(act, 0);
|
||||
act->achan = chan;
|
||||
|
||||
chan->flag |= ACHAN_SELECTED;
|
||||
hilight_channel (act, chan, 1);
|
||||
select_poseelement_by_name(chan->name, 1);
|
||||
@@ -567,7 +579,9 @@ static void mouse_action(int selectmode)
|
||||
else
|
||||
select_ipo_key(chan->ipo, selx, selectmode);
|
||||
|
||||
BIF_undo_push("Select Action");
|
||||
|
||||
std_rmouse_transform(transform_actionchannel_keys);
|
||||
|
||||
allqueue(REDRAWIPO, 0);
|
||||
allqueue(REDRAWVIEW3D, 0);
|
||||
allqueue(REDRAWACTION, 0);
|
||||
@@ -731,16 +745,17 @@ void borderselect_mesh(Key *key)
|
||||
/* Lets loop throug the IpoCurves and do borderselect
|
||||
* on the curves with adrcodes in our selected range.
|
||||
*/
|
||||
for (icu = key->ipo->curve.first; icu ; icu = icu->next) {
|
||||
/* lets not deal with the "speed" Ipo
|
||||
*/
|
||||
if (!icu->adrcode) continue;
|
||||
if ( (icu->adrcode >= adrcodemin) &&
|
||||
(icu->adrcode <= adrcodemax) ) {
|
||||
borderselect_icu_key(icu, xmin, xmax, select_function);
|
||||
if(key->ipo) {
|
||||
for (icu = key->ipo->curve.first; icu ; icu = icu->next) {
|
||||
/* lets not deal with the "speed" Ipo
|
||||
*/
|
||||
if (!icu->adrcode) continue;
|
||||
if ( (icu->adrcode >= adrcodemin) &&
|
||||
(icu->adrcode <= adrcodemax) ) {
|
||||
borderselect_icu_key(icu, xmin, xmax, select_function);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* redraw stuff */
|
||||
BIF_undo_push("Border select Action Key");
|
||||
allqueue(REDRAWNLA, 0);
|
||||
@@ -749,6 +764,23 @@ void borderselect_mesh(Key *key)
|
||||
}
|
||||
}
|
||||
|
||||
/* ******************** action API ***************** */
|
||||
|
||||
/* generic get current action call, for action window context */
|
||||
bAction *ob_get_action(Object *ob)
|
||||
{
|
||||
bActionStrip *strip;
|
||||
|
||||
if(ob->action)
|
||||
return ob->action;
|
||||
|
||||
for (strip=ob->nlastrips.first; strip; strip=strip->next){
|
||||
if (strip->flag & ACTSTRIP_SELECT)
|
||||
return strip->act;
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* used by ipo, outliner, buttons to find the active channel */
|
||||
bActionChannel* get_hilighted_action_channel(bAction* action)
|
||||
{
|
||||
@@ -766,41 +798,6 @@ bActionChannel* get_hilighted_action_channel(bAction* action)
|
||||
|
||||
}
|
||||
|
||||
/* sets action->achan to active channel, also adds if needed */
|
||||
void verify_active_action_channel(Object *ob)
|
||||
{
|
||||
if(ob) {
|
||||
bPoseChannel *pchan;
|
||||
bActionChannel *achan;
|
||||
|
||||
if(ob->action==NULL) return;
|
||||
|
||||
pchan= get_active_posechannel(ob);
|
||||
if(pchan) {
|
||||
/* See if this action channel exists already */
|
||||
for (achan=ob->action->chanbase.first; achan; achan=achan->next){
|
||||
if (!strcmp (pchan->name, achan->name))
|
||||
break;
|
||||
}
|
||||
|
||||
if (!achan){
|
||||
achan = MEM_callocN (sizeof(bActionChannel), "actionChannel");
|
||||
strcpy (achan->name, pchan->name);
|
||||
BLI_addtail (&ob->action->chanbase, achan);
|
||||
}
|
||||
|
||||
ob->action->achan= achan;
|
||||
ob->action->pchan= pchan;
|
||||
|
||||
for (achan=ob->action->chanbase.first; achan; achan=achan->next)
|
||||
achan->flag &= ~(ACHAN_SELECTED|ACHAN_HILIGHTED);
|
||||
|
||||
ob->action->achan->flag |= ACHAN_SELECTED|ACHAN_HILIGHTED;
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void set_exprap_action(int mode)
|
||||
{
|
||||
if(G.saction->action && G.saction->action->id.lib) return;
|
||||
@@ -808,109 +805,23 @@ void set_exprap_action(int mode)
|
||||
error ("Not yet implemented!");
|
||||
}
|
||||
|
||||
void set_action_key (struct bAction *act, struct bPoseChannel *chan, int adrcode, short makecurve)
|
||||
{
|
||||
set_action_key_time (act, chan, adrcode, makecurve, frame_to_float(CFRA));
|
||||
}
|
||||
|
||||
static void set_action_key_time (bAction *act, bPoseChannel *chan, int adrcode, short makecurve, float time)
|
||||
{
|
||||
bActionChannel *achan;
|
||||
char ipstr[256];
|
||||
|
||||
if (!act)
|
||||
return;
|
||||
|
||||
if (!chan)
|
||||
return;
|
||||
|
||||
/* See if this action channel exists already */
|
||||
for (achan=act->chanbase.first; achan; achan=achan->next){
|
||||
if (!strcmp (chan->name, achan->name))
|
||||
break;
|
||||
}
|
||||
|
||||
if (!achan){
|
||||
if (!makecurve)
|
||||
return;
|
||||
achan = MEM_callocN (sizeof(bActionChannel), "actionChannel");
|
||||
strcpy (achan->name, chan->name);
|
||||
BLI_addtail (&act->chanbase, achan);
|
||||
}
|
||||
|
||||
/* Ensure the channel appears selected in the action window */
|
||||
/* ton: added flag hilighted, for display in ipowin. dunno what the difference is between select/hilite */
|
||||
achan->flag |= ACHAN_SELECTED|ACHAN_HILIGHTED;
|
||||
|
||||
/* Ensure this action channel has a valid Ipo */
|
||||
if (!achan->ipo){
|
||||
sprintf (ipstr, "%s.%s", act->id.name+2, chan->name);
|
||||
ipstr[23]=0;
|
||||
achan->ipo= add_ipo(ipstr, ID_AC);
|
||||
}
|
||||
|
||||
insertactionkey(act, achan, chan, adrcode, makecurve, time);
|
||||
|
||||
}
|
||||
|
||||
static void insertactionkey(bAction *act, bActionChannel *achan, bPoseChannel *chan, int adrcode, short makecurve, float cfra)
|
||||
{
|
||||
IpoCurve *icu;
|
||||
void *poin;
|
||||
float curval;
|
||||
int type;
|
||||
ID *id;
|
||||
|
||||
if (!act){
|
||||
return;
|
||||
}
|
||||
if (act->id.lib){
|
||||
error ("Can't pose library actions");
|
||||
return;
|
||||
}
|
||||
act->achan=achan;
|
||||
act->pchan=chan;
|
||||
|
||||
id=(ID*) act;
|
||||
|
||||
/* First see if this curve exists */
|
||||
if (!makecurve){
|
||||
if (!achan->ipo)
|
||||
return;
|
||||
|
||||
for (icu = achan->ipo->curve.first; icu; icu=icu->next){
|
||||
if (icu->adrcode == adrcode)
|
||||
break;
|
||||
}
|
||||
if (!icu)
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
icu = get_ipocurve (id, GS(id->name), adrcode, achan->ipo);
|
||||
|
||||
if(icu) {
|
||||
poin= get_ipo_poin(id, icu, &type);
|
||||
if(poin) {
|
||||
curval= read_ipo_poin(poin, type);
|
||||
// cfra= frame_to_float(CFRA);
|
||||
insert_vert_ipo(icu, cfra, curval);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
bAction *add_empty_action(void)
|
||||
bAction *add_empty_action(int blocktype)
|
||||
{
|
||||
bAction *act;
|
||||
|
||||
act= alloc_libblock(&G.main->action, ID_AC, "Action");
|
||||
char *str= "Action";
|
||||
|
||||
if(blocktype==ID_OB)
|
||||
str= "ObAction";
|
||||
else if(blocktype==ID_KE)
|
||||
str= "ShapeAction";
|
||||
|
||||
act= alloc_libblock(&G.main->action, ID_AC, str);
|
||||
act->id.flag |= LIB_FAKEUSER;
|
||||
act->id.us++;
|
||||
return act;
|
||||
}
|
||||
|
||||
void transform_actionchannel_keys(char mode)
|
||||
void transform_actionchannel_keys(int mode, int dummy)
|
||||
{
|
||||
bAction *act;
|
||||
TransVert *tv;
|
||||
@@ -1054,9 +965,13 @@ void transform_actionchannel_keys(char mode)
|
||||
headerprint(str);
|
||||
}
|
||||
|
||||
if (G.saction->lock){
|
||||
if(ob && ob->pose) {
|
||||
DAG_object_flush_update(G.scene, ob, OB_RECALC_DATA);
|
||||
if (G.saction->lock) {
|
||||
if(ob) {
|
||||
ob->ctime= -1234567.0f;
|
||||
if(ob->pose || ob_get_key(ob))
|
||||
DAG_object_flush_update(G.scene, ob, OB_RECALC_DATA);
|
||||
else
|
||||
DAG_object_flush_update(G.scene, ob, OB_RECALC_OB);
|
||||
}
|
||||
force_draw_plus(SPACE_VIEW3D, 0);
|
||||
}
|
||||
@@ -1073,8 +988,13 @@ void transform_actionchannel_keys(char mode)
|
||||
/* Update the curve */
|
||||
/* Depending on the lock status, draw necessary views */
|
||||
|
||||
if(ob && ob->pose) {
|
||||
DAG_object_flush_update(G.scene, OBACT, OB_RECALC_DATA);
|
||||
if(ob) {
|
||||
ob->ctime= -1234567.0f;
|
||||
|
||||
if(ob->pose || ob_get_key(ob))
|
||||
DAG_object_flush_update(G.scene, ob, OB_RECALC_DATA);
|
||||
else
|
||||
DAG_object_flush_update(G.scene, ob, OB_RECALC_OB);
|
||||
}
|
||||
remake_action_ipos(act);
|
||||
|
||||
@@ -1272,7 +1192,6 @@ void transform_meshchannel_keys(char mode, Key *key)
|
||||
*/
|
||||
}
|
||||
|
||||
|
||||
void deselect_actionchannel_keys (bAction *act, int test)
|
||||
{
|
||||
bActionChannel *chan;
|
||||
@@ -1535,9 +1454,7 @@ static void mouse_actionchannels(bAction *act, short *mval,
|
||||
* active channel for the action
|
||||
*/
|
||||
sel = (chan->flag & ACHAN_SELECTED);
|
||||
if ( select_channel(act, chan, selectmode) && !sel ) {
|
||||
act->achan = chan;
|
||||
}
|
||||
select_channel(act, chan, selectmode);
|
||||
}
|
||||
--clickmin;
|
||||
--clickmax;
|
||||
@@ -2175,7 +2092,7 @@ void winqreadactionspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
|
||||
transform_meshchannel_keys('g', key);
|
||||
}
|
||||
else if (act) {
|
||||
transform_actionchannel_keys ('g');
|
||||
transform_actionchannel_keys ('g', 0);
|
||||
}
|
||||
}
|
||||
break;
|
||||
@@ -2215,7 +2132,7 @@ void winqreadactionspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
|
||||
transform_meshchannel_keys('s', key);
|
||||
}
|
||||
else if (act) {
|
||||
transform_actionchannel_keys ('s');
|
||||
transform_actionchannel_keys ('s', 0);
|
||||
}
|
||||
}
|
||||
break;
|
||||
@@ -2284,7 +2201,8 @@ void winqreadactionspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
|
||||
* based on user preference USER_LMOUSESELECT
|
||||
*/
|
||||
case LEFTMOUSE:
|
||||
if(view2dmove(LEFTMOUSE)); // only checks for sliders
|
||||
if(view2dmove(LEFTMOUSE)) // only checks for sliders
|
||||
break;
|
||||
else if (mval[0]>ACTWIDTH){
|
||||
do {
|
||||
getmouseco_areawin(mval);
|
||||
@@ -2301,8 +2219,9 @@ void winqreadactionspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
|
||||
else PIL_sleep_ms(30);
|
||||
|
||||
} while(get_mbut() & mousebut);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
/* passed on as selection */
|
||||
case RIGHTMOUSE:
|
||||
/* Clicking in the channel area selects the
|
||||
* channel or constraint channel
|
||||
|
||||
@@ -2433,7 +2433,7 @@ void armature_bone_rename(bArmature *arm, char *oldnamep, char *newnamep)
|
||||
act = ob->action;
|
||||
if (act && !act->id.lib){
|
||||
/* Find the appropriate channel */
|
||||
chan= get_named_actionchannel(act, oldname);
|
||||
chan= get_action_channel(act, oldname);
|
||||
if(chan) BLI_strncpy(chan->name, newname, MAXBONENAME);
|
||||
}
|
||||
|
||||
|
||||
@@ -85,11 +85,11 @@ ListBase *get_active_constraint_channels (Object *ob, int forcevalid)
|
||||
if (!forcevalid)
|
||||
return NULL;
|
||||
|
||||
ob->action=add_empty_action();
|
||||
ob->action=add_empty_action(ID_PO);
|
||||
}
|
||||
|
||||
/* Make sure we have an actionchannel */
|
||||
achan = get_named_actionchannel(ob->action, pchan->name);
|
||||
achan = get_action_channel(ob->action, pchan->name);
|
||||
if (!achan){
|
||||
if (!forcevalid)
|
||||
return NULL;
|
||||
@@ -109,7 +109,17 @@ ListBase *get_active_constraint_channels (Object *ob, int forcevalid)
|
||||
else return NULL;
|
||||
}
|
||||
/* else we return object constraints */
|
||||
return &ob->constraintChannels;
|
||||
else {
|
||||
if(ob->ipoflag & OB_ACTION_OB) {
|
||||
bActionChannel *achan = get_action_channel(ob->action, "Object");
|
||||
if(achan)
|
||||
return &achan->constraintChannels;
|
||||
else
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return &ob->constraintChannels;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -162,7 +172,7 @@ bConstraintChannel *get_active_constraint_channel(Object *ob)
|
||||
if(con->flag & CONSTRAINT_ACTIVE)
|
||||
break;
|
||||
if(con) {
|
||||
bActionChannel *achan = get_named_actionchannel(ob->action, pchan->name);
|
||||
bActionChannel *achan = get_action_channel(ob->action, pchan->name);
|
||||
if(achan) {
|
||||
for(chan= achan->constraintChannels.first; chan; chan= chan->next)
|
||||
if(!strcmp(chan->name, con->name))
|
||||
@@ -178,10 +188,14 @@ bConstraintChannel *get_active_constraint_channel(Object *ob)
|
||||
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;
|
||||
ListBase *lb= get_active_constraint_channels(ob, 0);
|
||||
|
||||
if(lb) {
|
||||
for(chan= lb->first; chan; chan= chan->next)
|
||||
if(!strcmp(chan->name, con->name))
|
||||
break;
|
||||
return chan;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -189,7 +203,6 @@ bConstraintChannel *get_active_constraint_channel(Object *ob)
|
||||
}
|
||||
|
||||
|
||||
|
||||
bConstraint *add_new_constraint(short type)
|
||||
{
|
||||
bConstraint *con;
|
||||
|
||||
@@ -1,15 +1,12 @@
|
||||
/**
|
||||
* $Id$
|
||||
*
|
||||
* ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
|
||||
* ***** BEGIN GPL LICENSE BLOCK *****
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation; either version 2
|
||||
* of the License, or (at your option) any later version. The Blender
|
||||
* Foundation also sells licenses for use in proprietary software under
|
||||
* the Blender License. See http://www.blender.org/BL/ for information
|
||||
* about this.
|
||||
* of the License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
@@ -23,11 +20,9 @@
|
||||
* The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
|
||||
* All rights reserved.
|
||||
*
|
||||
* The Original Code is: all of this file.
|
||||
* Contributor(s): Blender Foundation, 2005. Full recode
|
||||
*
|
||||
* Contributor(s): none yet.
|
||||
*
|
||||
* ***** END GPL/BL DUAL LICENSE BLOCK *****
|
||||
* ***** END GPL LICENSE BLOCK *****
|
||||
*/
|
||||
|
||||
|
||||
@@ -43,10 +38,6 @@
|
||||
#include <string.h>
|
||||
#include <math.h>
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include <config.h>
|
||||
#endif
|
||||
|
||||
#ifndef WIN32
|
||||
#include <unistd.h>
|
||||
#else
|
||||
@@ -81,6 +72,7 @@
|
||||
|
||||
#include "BKE_action.h"
|
||||
#include "BKE_anim.h"
|
||||
#include "BKE_constraint.h"
|
||||
#include "BKE_depsgraph.h"
|
||||
#include "BKE_global.h"
|
||||
#include "BKE_group.h"
|
||||
@@ -118,14 +110,6 @@
|
||||
#include "blendef.h"
|
||||
#include "mydevice.h"
|
||||
|
||||
/* forwards */
|
||||
#define BEZSELECTED(bezt) (((bezt)->f1 & 1) || ((bezt)->f2 & 1) || ((bezt)->f3 & 1))
|
||||
|
||||
#define IPOTHRESH 0.9
|
||||
#define ISPOIN(a, b, c) ( (a->b) && (a->c) )
|
||||
#define ISPOIN3(a, b, c, d) ( (a->b) && (a->c) && (a->d) )
|
||||
#define ISPOIN4(a, b, c, d, e) ( (a->b) && (a->c) && (a->d) && (a->e) )
|
||||
|
||||
extern int ob_ar[];
|
||||
extern int ma_ar[];
|
||||
extern int seq_ar[];
|
||||
@@ -138,155 +122,12 @@ extern int ac_ar[];
|
||||
extern int co_ar[];
|
||||
extern int te_ar[];
|
||||
|
||||
char *ob_ic_names[OB_TOTNAM] = { "LocX", "LocY", "LocZ", "dLocX", "dLocY", "dLocZ",
|
||||
"RotX", "RotY", "RotZ", "dRotX", "dRotY", "dRotZ",
|
||||
"SizeX", "SizeY", "SizeZ", "dSizeX", "dSizeY", "dSizeZ",
|
||||
"Layer", "Time", "ColR", "ColG", "ColB", "ColA",
|
||||
"FStreng", "FFall", "RDamp", "Damping", "Perm" };
|
||||
/* forwards */
|
||||
#define BEZSELECTED(bezt) (((bezt)->f1 & 1) || ((bezt)->f2 & 1) || ((bezt)->f3 & 1))
|
||||
|
||||
char *co_ic_names[CO_TOTNAM] = { "Inf" };
|
||||
char *mtex_ic_names[TEX_TOTNAM] = { "OfsX", "OfsY", "OfsZ", "SizeX", "SizeY", "SizeZ",
|
||||
"texR", "texG", "texB", "DefVar", "Col", "Nor", "Var",
|
||||
"Disp" };
|
||||
char *tex_ic_names[TE_TOTNAM] = { "NSize", "NDepth", "NType", "Turb", "Vnw1", "Vnw2",
|
||||
"Vnw3", "Vnw4", "MinkMExp", "DistM", "ColT", "iScale",
|
||||
"DistA", "MgType", "MgH", "Lacu", "Oct", "MgOff",
|
||||
"MgGain", "NBase1", "NBase2" };
|
||||
char *ma_ic_names[MA_TOTNAM] = { "R", "G", "B", "SpecR", "SpecG", "SpecB", "MirR",
|
||||
"MirG", "MirB", "Ref", "Alpha", "Emit", "Amb", "Spec",
|
||||
"Hard", "SpTra", "Ior", "Mode", "HaSize", "Translu",
|
||||
"RayMir", "FresMir", "FresMirI", "FresTra", "FresTraI",
|
||||
"TraGlow" };
|
||||
char *seq_ic_names[SEQ_TOTNAM] = { "Fac" };
|
||||
char *cu_ic_names[CU_TOTNAM] = { "Speed" };
|
||||
char *key_ic_names[KEY_TOTNAM] = { "Speed", "Key 1", "Key 2", "Key 3", "Key 4", "Key 5",
|
||||
"Key 6", "Key 7", "Key 8", "Key 9", "Key 10",
|
||||
"Key 11", "Key 12", "Key 13", "Key 14", "Key 15",
|
||||
"Key 16", "Key 17", "Key 18", "Key 19", "Key 20",
|
||||
"Key 21", "Key 22", "Key 23", "Key 24", "Key 25",
|
||||
"Key 26", "Key 27", "Key 28", "Key 29", "Key 30",
|
||||
"Key 31", "Key 32", "Key 33", "Key 34", "Key 35",
|
||||
"Key 36", "Key 37", "Key 38", "Key 39", "Key 40",
|
||||
"Key 41", "Key 42", "Key 43", "Key 44", "Key 45",
|
||||
"Key 46", "Key 47", "Key 48", "Key 49", "Key 50",
|
||||
"Key 51", "Key 52", "Key 53", "Key 54", "Key 55",
|
||||
"Key 56", "Key 57", "Key 58", "Key 59", "Key 60",
|
||||
"Key 61", "Key 62", "Key 63"};
|
||||
char *wo_ic_names[WO_TOTNAM] = { "HorR", "HorG", "HorB", "ZenR", "ZenG", "ZenB", "Expos",
|
||||
"Misi", "MisDi", "MisSta", "MisHi", "StarR", "StarB",
|
||||
"StarG", "StarDi", "StarSi" };
|
||||
char *la_ic_names[LA_TOTNAM] = { "Energ", "R", "G", "B", "Dist", "SpoSi", "SpoBl",
|
||||
"Quad1", "Quad2", "HaInt" };
|
||||
/* yafray: two curve names added, 'Apert' for aperture, and 'FDist' for focal distance */
|
||||
char *cam_ic_names[CAM_TOTNAM] = { "Lens", "ClSta", "ClEnd", "Apert", "FDist" };
|
||||
char *snd_ic_names[SND_TOTNAM] = { "Vol", "Pitch", "Pan", "Atten" };
|
||||
char *ac_ic_names[AC_TOTNAM] = {"LocX", "LocY", "LocZ", "SizeX", "SizeY",
|
||||
"SizeZ", "QuatW", "QuatX", "QuatY", "QuatZ"};
|
||||
char *ic_name_empty[1] ={ "" };
|
||||
|
||||
char *getname_ac_ei(int nr)
|
||||
{
|
||||
switch(nr) {
|
||||
case AC_LOC_X:
|
||||
case AC_LOC_Y:
|
||||
case AC_LOC_Z:
|
||||
return ac_ic_names[nr-1];
|
||||
case AC_SIZE_X:
|
||||
case AC_SIZE_Y:
|
||||
case AC_SIZE_Z:
|
||||
return ac_ic_names[nr-10];
|
||||
case AC_QUAT_X:
|
||||
case AC_QUAT_Y:
|
||||
case AC_QUAT_Z:
|
||||
case AC_QUAT_W:
|
||||
return ac_ic_names[nr-19];
|
||||
default:
|
||||
return ic_name_empty[0]; /* empty */
|
||||
}
|
||||
}
|
||||
|
||||
char *getname_co_ei(int nr)
|
||||
{
|
||||
switch(nr){
|
||||
case CO_ENFORCE:
|
||||
return co_ic_names[nr-1];
|
||||
}
|
||||
return ic_name_empty[0];
|
||||
}
|
||||
|
||||
char *getname_ob_ei(int nr, int colipo)
|
||||
{
|
||||
if(nr>=OB_LOC_X && nr <= OB_PD_PERM) return ob_ic_names[nr-1];
|
||||
|
||||
return ic_name_empty[0];
|
||||
}
|
||||
|
||||
char *getname_tex_ei(int nr)
|
||||
{
|
||||
if(nr>=TE_NSIZE && nr<=TE_N_BAS2) return tex_ic_names[nr-1];
|
||||
|
||||
return ic_name_empty[0];
|
||||
}
|
||||
|
||||
char *getname_mtex_ei(int nr)
|
||||
{
|
||||
if(nr>=MAP_OFS_X && nr<=MAP_DISP) return mtex_ic_names[nr-1];
|
||||
|
||||
return ic_name_empty[0];
|
||||
}
|
||||
|
||||
char *getname_mat_ei(int nr)
|
||||
{
|
||||
if(nr>=MA_MAP1) return getname_mtex_ei((nr & (MA_MAP1-1)));
|
||||
else {
|
||||
if(nr>=MA_COL_R && nr<=MA_ADD) return ma_ic_names[nr-1];
|
||||
}
|
||||
return ic_name_empty[0];
|
||||
}
|
||||
|
||||
char *getname_world_ei(int nr)
|
||||
{
|
||||
if(nr>=MA_MAP1) return getname_mtex_ei((nr & (MA_MAP1-1)));
|
||||
else {
|
||||
if(nr>=WO_HOR_R && nr<=WO_STARSIZE) return wo_ic_names[nr-1];
|
||||
}
|
||||
return ic_name_empty[0];
|
||||
}
|
||||
|
||||
char *getname_seq_ei(int nr)
|
||||
{
|
||||
if(nr == SEQ_FAC1) return seq_ic_names[nr-1];
|
||||
return ic_name_empty[0];
|
||||
}
|
||||
|
||||
char *getname_cu_ei(int nr)
|
||||
{
|
||||
if(nr==CU_SPEED) return cu_ic_names[nr-1];
|
||||
return ic_name_empty[0];
|
||||
}
|
||||
|
||||
char *getname_la_ei(int nr)
|
||||
{
|
||||
if(nr>=MA_MAP1) return getname_mtex_ei((nr & (MA_MAP1-1)));
|
||||
else {
|
||||
if(nr>=LA_ENERGY && nr<=LA_HALOINT) return la_ic_names[nr-1];
|
||||
}
|
||||
return ic_name_empty[0];
|
||||
}
|
||||
|
||||
char *getname_cam_ei(int nr)
|
||||
{
|
||||
/* yafray: curves extended to CAM_YF_FDIST */
|
||||
//if(nr>=CAM_LENS && nr<=CAM_END) return cam_ic_names[nr-1];
|
||||
if(nr>=CAM_LENS && nr<=CAM_YF_FDIST) return cam_ic_names[nr-1];
|
||||
return ic_name_empty[0];
|
||||
}
|
||||
|
||||
char *getname_snd_ei(int nr)
|
||||
{
|
||||
if(nr>=SND_VOLUME && nr<=SND_ATTEN) return snd_ic_names[nr-1];
|
||||
return ic_name_empty[0];
|
||||
}
|
||||
#define IPOTHRESH 0.9
|
||||
#define ISPOIN(a, b, c) ( (a->b) && (a->c) )
|
||||
#define ISPOIN3(a, b, c, d) ( (a->b) && (a->c) && (a->d) )
|
||||
|
||||
/* tests if only one editipo is active */
|
||||
static void check_active_editipo(void)
|
||||
@@ -371,78 +212,6 @@ static void set_active_key(int index)
|
||||
}
|
||||
}
|
||||
|
||||
void boundbox_ipocurve(IpoCurve *icu)
|
||||
{
|
||||
BezTriple *bezt;
|
||||
float vec[3]={0.0,0.0,0.0};
|
||||
float min[3], max[3];
|
||||
int a;
|
||||
|
||||
if(icu->totvert) {
|
||||
INIT_MINMAX(min, max);
|
||||
|
||||
if(icu->bezt ) {
|
||||
a= icu->totvert;
|
||||
bezt= icu->bezt;
|
||||
while(a--) {
|
||||
if(icu->vartype & IPO_BITS) {
|
||||
vec[0]= bezt->vec[1][0];
|
||||
vec[1]= 0.0;
|
||||
DO_MINMAX(vec, min, max);
|
||||
|
||||
vec[1]= 16.0;
|
||||
DO_MINMAX(vec, min, max);
|
||||
}
|
||||
else {
|
||||
if(icu->ipo==IPO_BEZ && a!=icu->totvert-1) {
|
||||
DO_MINMAX(bezt->vec[0], min, max);
|
||||
}
|
||||
DO_MINMAX(bezt->vec[1], min, max);
|
||||
if(icu->ipo==IPO_BEZ && a!=0) {
|
||||
DO_MINMAX(bezt->vec[2], min, max);
|
||||
}
|
||||
}
|
||||
|
||||
bezt++;
|
||||
}
|
||||
}
|
||||
if(min[0]==max[0]) max[0]= (float)(min[0]+1.0);
|
||||
if(min[1]==max[1]) max[1]= (float)(min[1]+0.1);
|
||||
|
||||
icu->totrct.xmin= min[0];
|
||||
icu->totrct.ymin= min[1];
|
||||
icu->totrct.xmax= max[0];
|
||||
icu->totrct.ymax= max[1];
|
||||
}
|
||||
else {
|
||||
icu->totrct.xmin= icu->totrct.ymin= 0.0;
|
||||
icu->totrct.xmax= EFRA;
|
||||
icu->totrct.ymax= 1.0;
|
||||
}
|
||||
}
|
||||
|
||||
void boundbox_ipo(Ipo *ipo, rctf *bb)
|
||||
{
|
||||
IpoCurve *icu;
|
||||
int first= 1;
|
||||
|
||||
icu= ipo->curve.first;
|
||||
while(icu) {
|
||||
|
||||
boundbox_ipocurve(icu);
|
||||
|
||||
if(first) {
|
||||
*bb= icu->totrct;
|
||||
first= 0;
|
||||
}
|
||||
else BLI_union_rctf(bb, &(icu->totrct));
|
||||
|
||||
icu= icu->next;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
void editipo_changed(SpaceIpo *si, int doredraw)
|
||||
{
|
||||
EditIpo *ei;
|
||||
@@ -544,7 +313,7 @@ void editipo_changed(SpaceIpo *si, int doredraw)
|
||||
allqueue(REDRAWVIEW3D, 0);
|
||||
}
|
||||
else if(si->blocktype==ID_SEQ) clear_last_seq();
|
||||
else if(si->blocktype==ID_AC) {
|
||||
else if(si->blocktype==ID_PO) {
|
||||
Object *ob= OBACT;
|
||||
if(ob && ob->pose) {
|
||||
DAG_object_flush_update(G.scene, OBACT, OB_RECALC_DATA);
|
||||
@@ -581,7 +350,7 @@ void scale_editipo(void)
|
||||
ei= G.sipo->editipo;
|
||||
if(ei==0) return;
|
||||
for(a=0; a<G.sipo->totipo; a++, ei++) {
|
||||
if ISPOIN(ei, flag & IPO_VISIBLE, icu) {
|
||||
if (ISPOIN(ei, flag & IPO_VISIBLE, icu)) {
|
||||
bezt= ei->icu->bezt;
|
||||
b= ei->icu->totvert;
|
||||
while(b--) {
|
||||
@@ -607,130 +376,7 @@ void scale_editipo(void)
|
||||
allqueue(REDRAWIPO, 0);
|
||||
}
|
||||
|
||||
|
||||
Ipo *get_ipo_to_edit(ID **from)
|
||||
{
|
||||
Object *ob= OBACT;
|
||||
|
||||
*from= 0;
|
||||
|
||||
|
||||
if (G.sipo->pin) {
|
||||
*from = G.sipo->from;
|
||||
return G.sipo->ipo;
|
||||
}
|
||||
|
||||
if(G.sipo->blocktype==ID_SEQ) {
|
||||
extern Sequence *last_seq;
|
||||
|
||||
*from= (ID *)last_seq;
|
||||
if(last_seq) return last_seq->ipo;
|
||||
}
|
||||
else if(G.sipo->blocktype==IPO_CO){
|
||||
if (ob) {
|
||||
bConstraintChannel *chan= get_active_constraint_channel(ob);
|
||||
if(chan) {
|
||||
*from= (ID*) ob;
|
||||
return chan->ipo;
|
||||
}
|
||||
}
|
||||
}
|
||||
else if(G.sipo->blocktype==ID_AC) {
|
||||
bActionChannel *chan;
|
||||
if (ob && ob->action) {
|
||||
*from= (ID *) ob->action;
|
||||
chan= get_hilighted_action_channel(ob->action);
|
||||
if (chan)
|
||||
return chan->ipo;
|
||||
else
|
||||
return NULL;
|
||||
}
|
||||
|
||||
}
|
||||
else if(G.sipo->blocktype==ID_WO) {
|
||||
World *wo= G.scene->world;
|
||||
*from= (ID *)wo;
|
||||
if(wo) return wo->ipo;
|
||||
}
|
||||
else if(G.sipo->blocktype==ID_OB) {
|
||||
if(ob) {
|
||||
*from= (ID *)ob;
|
||||
return ob->ipo;
|
||||
}
|
||||
}
|
||||
else if(G.sipo->blocktype==ID_TE) {
|
||||
if(ob) {
|
||||
Tex *tex= give_current_texture(ob, ob->actcol);
|
||||
*from= (ID *)tex;
|
||||
if(tex) return tex->ipo;
|
||||
}
|
||||
}
|
||||
else if(G.sipo->blocktype==ID_MA) {
|
||||
if(ob) {
|
||||
Material *ma= give_current_material(ob, ob->actcol);
|
||||
*from= (ID *)ma;
|
||||
if(ma) return ma->ipo;
|
||||
}
|
||||
}
|
||||
else if(G.sipo->blocktype==ID_KE) {
|
||||
if(ob) {
|
||||
Key *key= ob_get_key(ob);
|
||||
*from= (ID *)key;
|
||||
if(key) return key->ipo;
|
||||
}
|
||||
}
|
||||
else if(G.sipo->blocktype==ID_CU) {
|
||||
if(ob && ob->type==OB_CURVE) {
|
||||
Curve *cu= ob->data;
|
||||
*from= (ID *)cu;
|
||||
return cu->ipo;
|
||||
}
|
||||
}
|
||||
else if(G.sipo->blocktype==ID_LA) {
|
||||
if(ob && ob->type==OB_LAMP) {
|
||||
Lamp *la= ob->data;
|
||||
*from= (ID *)la;
|
||||
return la->ipo;
|
||||
}
|
||||
}
|
||||
else if(G.sipo->blocktype==ID_CA) {
|
||||
if(ob && ob->type==OB_CAMERA) {
|
||||
Camera *ca= ob->data;
|
||||
*from= (ID *)ca;
|
||||
if(ca) return ca->ipo;
|
||||
}
|
||||
}
|
||||
else if(G.sipo->blocktype==ID_SO) {
|
||||
|
||||
// if (G.buts && G.buts->mainb == BUTS_SOUND) {
|
||||
// bSound *sound = G.buts->lockpoin;
|
||||
// *from= (ID *)sound;
|
||||
// if(sound) return sound->ipo;
|
||||
// }
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
unsigned int ipo_rainbow(int cur, int tot)
|
||||
{
|
||||
float dfac, fac, sat;
|
||||
|
||||
dfac= (float)(1.0/( (float)tot+1.0));
|
||||
|
||||
/* this calculation makes 2 or 4 different cycles of rainbow colors */
|
||||
if(cur< tot/2) fac= (float)(cur*2.0f*dfac);
|
||||
else fac= (float)((cur-tot/2)*2.0f*dfac +dfac);
|
||||
if(tot > 32) fac= fac*1.95f;
|
||||
if(fac>1.0f) fac-= 1.0f;
|
||||
|
||||
if(fac>0.5f && fac<0.8f) sat= 0.4f;
|
||||
else sat= 0.5f;
|
||||
|
||||
return hsv_to_cpack(fac, sat, 1.0f);
|
||||
}
|
||||
|
||||
void make_ob_editipo(Object *ob, SpaceIpo *si)
|
||||
static void make_ob_editipo(Object *ob, SpaceIpo *si)
|
||||
{
|
||||
EditIpo *ei;
|
||||
int a, len, colipo=0;
|
||||
@@ -772,8 +418,7 @@ void make_ob_editipo(Object *ob, SpaceIpo *si)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void make_seq_editipo(SpaceIpo *si)
|
||||
static void make_seq_editipo(SpaceIpo *si)
|
||||
{
|
||||
EditIpo *ei;
|
||||
int a;
|
||||
@@ -801,7 +446,7 @@ void make_seq_editipo(SpaceIpo *si)
|
||||
}
|
||||
}
|
||||
|
||||
void make_cu_editipo(SpaceIpo *si)
|
||||
static void make_cu_editipo(SpaceIpo *si)
|
||||
{
|
||||
EditIpo *ei;
|
||||
int a;
|
||||
@@ -829,7 +474,7 @@ void make_cu_editipo(SpaceIpo *si)
|
||||
}
|
||||
}
|
||||
|
||||
void make_key_editipo(SpaceIpo *si)
|
||||
static void make_key_editipo(SpaceIpo *si)
|
||||
{
|
||||
Key *key;
|
||||
KeyBlock *kb=NULL;
|
||||
@@ -884,24 +529,7 @@ void make_key_editipo(SpaceIpo *si)
|
||||
}
|
||||
}
|
||||
|
||||
int texchannel_to_adrcode(int channel)
|
||||
{
|
||||
switch(channel) {
|
||||
case 0: return MA_MAP1;
|
||||
case 1: return MA_MAP2;
|
||||
case 2: return MA_MAP3;
|
||||
case 3: return MA_MAP4;
|
||||
case 4: return MA_MAP5;
|
||||
case 5: return MA_MAP6;
|
||||
case 6: return MA_MAP7;
|
||||
case 7: return MA_MAP8;
|
||||
case 8: return MA_MAP9;
|
||||
case 9: return MA_MAP10;
|
||||
default: return 0;
|
||||
}
|
||||
}
|
||||
|
||||
void make_mat_editipo(SpaceIpo *si)
|
||||
static void make_mat_editipo(SpaceIpo *si)
|
||||
{
|
||||
EditIpo *ei;
|
||||
int a, len;
|
||||
@@ -944,7 +572,7 @@ void make_mat_editipo(SpaceIpo *si)
|
||||
}
|
||||
}
|
||||
|
||||
void make_texture_editipo(SpaceIpo *si)
|
||||
static void make_texture_editipo(SpaceIpo *si)
|
||||
{
|
||||
EditIpo *ei;
|
||||
int a;
|
||||
@@ -972,7 +600,7 @@ void make_texture_editipo(SpaceIpo *si)
|
||||
}
|
||||
}
|
||||
|
||||
void make_world_editipo(SpaceIpo *si)
|
||||
static void make_world_editipo(SpaceIpo *si)
|
||||
{
|
||||
EditIpo *ei;
|
||||
int a, len;
|
||||
@@ -1016,7 +644,7 @@ void make_world_editipo(SpaceIpo *si)
|
||||
}
|
||||
}
|
||||
|
||||
void make_lamp_editipo(SpaceIpo *si)
|
||||
static void make_lamp_editipo(SpaceIpo *si)
|
||||
{
|
||||
EditIpo *ei;
|
||||
int a;
|
||||
@@ -1026,7 +654,6 @@ void make_lamp_editipo(SpaceIpo *si)
|
||||
|
||||
si->totipo= LA_TOTIPO;
|
||||
|
||||
|
||||
for(a=0; a<LA_TOTIPO; a++) {
|
||||
name = getname_la_ei(la_ar[a]);
|
||||
strcpy(ei->name, name);
|
||||
@@ -1048,7 +675,7 @@ void make_lamp_editipo(SpaceIpo *si)
|
||||
}
|
||||
}
|
||||
|
||||
void make_camera_editipo(SpaceIpo *si)
|
||||
static void make_camera_editipo(SpaceIpo *si)
|
||||
{
|
||||
EditIpo *ei;
|
||||
int a;
|
||||
@@ -1075,7 +702,7 @@ void make_camera_editipo(SpaceIpo *si)
|
||||
}
|
||||
}
|
||||
|
||||
int make_constraint_editipo(Ipo *ipo, EditIpo **si)
|
||||
static int make_constraint_editipo(Ipo *ipo, EditIpo **si)
|
||||
{
|
||||
EditIpo *ei;
|
||||
int a;
|
||||
@@ -1100,7 +727,8 @@ int make_constraint_editipo(Ipo *ipo, EditIpo **si)
|
||||
|
||||
return CO_TOTIPO;
|
||||
}
|
||||
int make_action_editipo(Ipo *ipo, EditIpo **si)
|
||||
|
||||
static int make_bone_editipo(Ipo *ipo, EditIpo **si)
|
||||
{
|
||||
EditIpo *ei;
|
||||
int a;
|
||||
@@ -1126,7 +754,7 @@ int make_action_editipo(Ipo *ipo, EditIpo **si)
|
||||
return AC_TOTIPO;
|
||||
}
|
||||
|
||||
void make_sound_editipo(SpaceIpo *si)
|
||||
static void make_sound_editipo(SpaceIpo *si)
|
||||
{
|
||||
EditIpo *ei;
|
||||
int a;
|
||||
@@ -1153,23 +781,24 @@ void make_sound_editipo(SpaceIpo *si)
|
||||
}
|
||||
}
|
||||
|
||||
void make_editipo(void)
|
||||
/* only called in test_editipo() below */
|
||||
static void make_editipo(void)
|
||||
{
|
||||
EditIpo *ei;
|
||||
Object *ob;
|
||||
ID *from;
|
||||
rctf *rf;
|
||||
int a;
|
||||
|
||||
if(G.sipo->editipo)
|
||||
MEM_freeN(G.sipo->editipo);
|
||||
|
||||
G.sipo->editipo= NULL;
|
||||
G.sipo->totipo= 0;
|
||||
|
||||
if(G.sipo->from==NULL) return;
|
||||
|
||||
ob= OBACT;
|
||||
|
||||
G.sipo->ipo= get_ipo_to_edit(&from);
|
||||
G.sipo->from= from;
|
||||
|
||||
if(G.sipo->ipo) G.sipo->showkey= G.sipo->ipo->showkey;
|
||||
|
||||
if(G.sipo->blocktype==ID_SEQ) {
|
||||
@@ -1226,17 +855,17 @@ void make_editipo(void)
|
||||
make_sound_editipo(G.sipo);
|
||||
}
|
||||
}
|
||||
else if(G.sipo->blocktype==IPO_CO){
|
||||
else if(G.sipo->blocktype==ID_CO){
|
||||
G.sipo->totipo = make_constraint_editipo(G.sipo->ipo, (EditIpo**)&G.sipo->editipo);
|
||||
if (ob) {
|
||||
ob->ipowin= IPO_CO;
|
||||
ob->ipowin= ID_CO;
|
||||
}
|
||||
}
|
||||
else if(G.sipo->blocktype==ID_AC) {
|
||||
else if(G.sipo->blocktype==ID_PO) {
|
||||
|
||||
G.sipo->totipo = make_action_editipo(G.sipo->ipo, (EditIpo**)&G.sipo->editipo);
|
||||
G.sipo->totipo = make_bone_editipo(G.sipo->ipo, (EditIpo**)&G.sipo->editipo);
|
||||
if (ob) {
|
||||
ob->ipowin= ID_AC;
|
||||
ob->ipowin= ID_PO;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1259,73 +888,187 @@ void make_editipo(void)
|
||||
|
||||
}
|
||||
else {
|
||||
if(G.sipo->blocktype==ID_OB) {
|
||||
G.v2d->cur.xmin= 0.0;
|
||||
G.v2d->cur.xmax= EFRA;
|
||||
G.v2d->cur.ymin= -5.0;
|
||||
G.v2d->cur.ymax= +5.0;
|
||||
}
|
||||
else if(G.sipo->blocktype==ID_CA) {
|
||||
G.v2d->cur.xmin= 0.0;
|
||||
G.v2d->cur.xmax= EFRA;
|
||||
G.v2d->cur.ymin= 0.0;
|
||||
G.v2d->cur.ymax= 100.0;
|
||||
}
|
||||
else if ELEM5(G.sipo->blocktype, ID_MA, ID_CU, ID_WO, ID_LA, IPO_CO) {
|
||||
G.v2d->cur.xmin= (float)-0.1;
|
||||
G.v2d->cur.xmax= EFRA;
|
||||
G.v2d->cur.ymin= (float)-0.1;
|
||||
G.v2d->cur.ymax= (float)+1.1;
|
||||
}
|
||||
else if(G.sipo->blocktype==ID_TE) {
|
||||
G.v2d->cur.xmin= (float)-0.1;
|
||||
G.v2d->cur.xmax= EFRA;
|
||||
G.v2d->cur.ymin= (float)-0.1;
|
||||
G.v2d->cur.ymax= (float)+1.1;
|
||||
}
|
||||
else if(G.sipo->blocktype==ID_SEQ) {
|
||||
G.v2d->cur.xmin= -5.0;
|
||||
G.v2d->cur.xmax= 105.0;
|
||||
G.v2d->cur.ymin= (float)-0.1;
|
||||
G.v2d->cur.ymax= (float)+1.1;
|
||||
}
|
||||
else if(G.sipo->blocktype==ID_KE) {
|
||||
G.v2d->cur.xmin= (float)-0.1;
|
||||
G.v2d->cur.xmax= EFRA;
|
||||
G.v2d->cur.ymin= (float)-0.1;
|
||||
G.v2d->cur.ymax= (float)+2.1;
|
||||
}
|
||||
|
||||
ipo_default_v2d_cur(G.sipo->blocktype, &G.v2d->cur);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void test_editipo(void)
|
||||
/* evaluates context in the current UI */
|
||||
/* blocktype is type of ipo */
|
||||
/* from is the base pointer to find data to change (ob in case of action or pose) */
|
||||
static void get_ipo_context(short blocktype, ID **from, Ipo **ipo, char *actname, char *constname)
|
||||
{
|
||||
Ipo *ipo;
|
||||
ID *from;
|
||||
Object *ob= OBACT;
|
||||
|
||||
if(G.sipo->editipo==NULL){
|
||||
make_editipo();
|
||||
*from= NULL;
|
||||
*ipo= NULL;
|
||||
|
||||
if(blocktype==ID_CO) {
|
||||
if (ob) {
|
||||
bConstraintChannel *chan;
|
||||
bConstraint *con= get_active_constraint(ob);
|
||||
|
||||
if(con) {
|
||||
BLI_strncpy(constname, con->name, 32);
|
||||
|
||||
chan= get_active_constraint_channel(ob);
|
||||
if(chan) {
|
||||
*ipo= chan->ipo;
|
||||
BLI_strncpy(constname, con->name, 32);
|
||||
}
|
||||
|
||||
*from= &ob->id;
|
||||
|
||||
/* set actname if in posemode */
|
||||
if(ob->action) {
|
||||
if(ob->flag & OB_POSEMODE) {
|
||||
bPoseChannel *pchan= get_active_posechannel(ob);
|
||||
if(pchan)
|
||||
BLI_strncpy(actname, pchan->name, 32);
|
||||
}
|
||||
else if(ob->ipoflag & OB_ACTION_OB)
|
||||
strcpy(actname, "Object");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
ipo= get_ipo_to_edit(&from);
|
||||
|
||||
if(G.sipo->ipo != ipo || G.sipo->from!=from)
|
||||
make_editipo();
|
||||
else if(blocktype==ID_PO) {
|
||||
if (ob && ob->action) {
|
||||
bPoseChannel *pchan= get_active_posechannel(ob);
|
||||
|
||||
*from= (ID *)ob;
|
||||
if (pchan) {
|
||||
bActionChannel *achan;
|
||||
|
||||
BLI_strncpy(actname, pchan->name, 32); /* also set when no channel yet */
|
||||
|
||||
achan= get_action_channel(ob->action, pchan->name);
|
||||
if(achan)
|
||||
*ipo= achan->ipo;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
if (G.sipo->pin)
|
||||
return;
|
||||
|
||||
|
||||
if(G.sipo->ipo)
|
||||
G.sipo->ipo->cur = G.v2d->cur;
|
||||
|
||||
else if(blocktype==ID_OB) {
|
||||
if(ob) {
|
||||
*from= (ID *)ob;
|
||||
if(ob->ipoflag & OB_ACTION_OB) {
|
||||
if (ob->action) {
|
||||
bActionChannel *achan= get_action_channel(ob->action, "Object");
|
||||
if(achan) {
|
||||
*ipo= achan->ipo;
|
||||
BLI_strncpy(actname, achan->name, 32);
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
*ipo= ob->ipo;
|
||||
}
|
||||
}
|
||||
}
|
||||
else if(blocktype==ID_SEQ) {
|
||||
extern Sequence *last_seq;
|
||||
|
||||
*from= (ID *)last_seq;
|
||||
if(last_seq) *ipo= last_seq->ipo;
|
||||
}
|
||||
else if(blocktype==ID_WO) {
|
||||
World *wo= G.scene->world;
|
||||
*from= (ID *)wo;
|
||||
if(wo) *ipo= wo->ipo;
|
||||
}
|
||||
else if(blocktype==ID_TE) {
|
||||
if(ob) {
|
||||
Tex *tex= give_current_texture(ob, ob->actcol);
|
||||
*from= (ID *)tex;
|
||||
if(tex) *ipo= tex->ipo;
|
||||
}
|
||||
}
|
||||
else if(blocktype==ID_MA) {
|
||||
if(ob) {
|
||||
Material *ma= give_current_material(ob, ob->actcol);
|
||||
*from= (ID *)ma;
|
||||
if(ma) *ipo= ma->ipo;
|
||||
}
|
||||
}
|
||||
else if(blocktype==ID_KE) {
|
||||
if(ob) {
|
||||
Key *key= ob_get_key(ob);
|
||||
*from= (ID *)key;
|
||||
if(key) *ipo= key->ipo;
|
||||
}
|
||||
}
|
||||
else if(blocktype==ID_CU) {
|
||||
if(ob && ob->type==OB_CURVE) {
|
||||
Curve *cu= ob->data;
|
||||
*from= (ID *)cu;
|
||||
*ipo= cu->ipo;
|
||||
}
|
||||
}
|
||||
else if(blocktype==ID_LA) {
|
||||
if(ob && ob->type==OB_LAMP) {
|
||||
Lamp *la= ob->data;
|
||||
*from= (ID *)la;
|
||||
*ipo= la->ipo;
|
||||
}
|
||||
}
|
||||
else if(blocktype==ID_CA) {
|
||||
if(ob && ob->type==OB_CAMERA) {
|
||||
Camera *ca= ob->data;
|
||||
*from= (ID *)ca;
|
||||
if(ca) *ipo= ca->ipo;
|
||||
}
|
||||
}
|
||||
else if(blocktype==ID_SO) {
|
||||
|
||||
// if (G.buts && G.buts->mainb == BUTS_SOUND) {
|
||||
// bSound *sound = G.buts->lockpoin;
|
||||
// *from= (ID *)sound;
|
||||
// if(sound) *ipo= sound->ipo;
|
||||
// }
|
||||
}
|
||||
}
|
||||
|
||||
/* ****************************************** */
|
||||
/* called on each redraw, check if editipo data has to be remade */
|
||||
void test_editipo(void)
|
||||
{
|
||||
int doit= 0;
|
||||
|
||||
if(G.sipo->pin==0) {
|
||||
Ipo *ipo;
|
||||
ID *from;
|
||||
char actname[32]="", constname[32]="";
|
||||
|
||||
get_ipo_context(G.sipo->blocktype, &from, &ipo, actname, constname);
|
||||
|
||||
if(G.sipo->ipo != ipo) {
|
||||
G.sipo->ipo= ipo;
|
||||
if(ipo) G.v2d->cur= ipo->cur;
|
||||
doit= 1;
|
||||
}
|
||||
if(G.sipo->from != from) {
|
||||
G.sipo->from= from;
|
||||
doit= 1;
|
||||
}
|
||||
if( strcmp(G.sipo->actname, actname)) {
|
||||
BLI_strncpy(G.sipo->actname, actname, 32);
|
||||
doit= 1;
|
||||
}
|
||||
if( strcmp(G.sipo->constname, constname)) {
|
||||
BLI_strncpy(G.sipo->constname, constname, 32);
|
||||
doit= 1;
|
||||
}
|
||||
|
||||
if(G.sipo->ipo)
|
||||
G.sipo->ipo->cur = G.v2d->cur;
|
||||
|
||||
}
|
||||
|
||||
if(G.sipo->editipo==NULL || doit) {
|
||||
make_editipo();
|
||||
}
|
||||
}
|
||||
|
||||
/* ****************** EditIpo ************************ */
|
||||
|
||||
int totipo_edit, totipo_sel, totipo_curve, totipo_vis, totipo_vert, totipo_vertsel, totipo_key, totipo_keysel;
|
||||
|
||||
@@ -1426,6 +1169,7 @@ void update_editipo_flags(void)
|
||||
}
|
||||
}
|
||||
|
||||
/* sort of enter/leave editmode for curves */
|
||||
void set_editflag_editipo(void)
|
||||
{
|
||||
EditIpo *ei;
|
||||
@@ -1470,171 +1214,7 @@ void set_editflag_editipo(void)
|
||||
scrarea_queue_winredraw(curarea);
|
||||
}
|
||||
|
||||
void ipo_toggle_showkey(void)
|
||||
{
|
||||
if(G.sipo->showkey) {
|
||||
G.sipo->showkey= 0;
|
||||
swap_selectall_editipo(); /* sel all */
|
||||
}
|
||||
else G.sipo->showkey= 1;
|
||||
free_ipokey(&G.sipo->ipokey);
|
||||
if(G.sipo->ipo) G.sipo->ipo->showkey= G.sipo->showkey;
|
||||
|
||||
BIF_undo_push("Toggle show key Ipo");
|
||||
}
|
||||
|
||||
void swap_selectall_editipo(void)
|
||||
{
|
||||
Object *ob;
|
||||
EditIpo *ei;
|
||||
IpoKey *ik;
|
||||
BezTriple *bezt;
|
||||
int a, b; /* , sel=0; */
|
||||
|
||||
get_status_editipo();
|
||||
|
||||
if(G.sipo->showkey) {
|
||||
ik= G.sipo->ipokey.first;
|
||||
while(ik) {
|
||||
if(totipo_vertsel) ik->flag &= ~1;
|
||||
else ik->flag |= 1;
|
||||
ik= ik->next;
|
||||
}
|
||||
update_editipo_flags();
|
||||
|
||||
if(G.sipo->showkey && G.sipo->blocktype==ID_OB ) {
|
||||
ob= OBACT;
|
||||
if(ob && (ob->ipoflag & OB_DRAWKEY)) draw_object_ext(BASACT);
|
||||
}
|
||||
}
|
||||
else if(totipo_edit==0) {
|
||||
ei= G.sipo->editipo;
|
||||
if (ei){
|
||||
for(a=0; a<G.sipo->totipo; a++) {
|
||||
if( ei->flag & IPO_VISIBLE ) {
|
||||
if(totipo_sel) ei->flag &= ~IPO_SELECT;
|
||||
else ei->flag |= IPO_SELECT;
|
||||
}
|
||||
ei++;
|
||||
}
|
||||
update_editipo_flags();
|
||||
}
|
||||
get_status_editipo();
|
||||
}
|
||||
else {
|
||||
ei= G.sipo->editipo;
|
||||
for(a=0; a<G.sipo->totipo; a++) {
|
||||
if ISPOIN3(ei, flag & IPO_VISIBLE, flag & IPO_EDIT, icu ) {
|
||||
bezt= ei->icu->bezt;
|
||||
if(bezt) {
|
||||
b= ei->icu->totvert;
|
||||
while(b--) {
|
||||
if(totipo_vertsel) {
|
||||
bezt->f1= bezt->f2= bezt->f3= 0;
|
||||
}
|
||||
else {
|
||||
bezt->f1= bezt->f2= bezt->f3= 1;
|
||||
}
|
||||
bezt++;
|
||||
}
|
||||
}
|
||||
}
|
||||
ei++;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
BIF_undo_push("Swap select all Ipo");
|
||||
scrarea_queue_winredraw(curarea);
|
||||
|
||||
}
|
||||
|
||||
void swap_visible_editipo(void)
|
||||
{
|
||||
EditIpo *ei;
|
||||
Object *ob;
|
||||
int a; /* , sel=0; */
|
||||
|
||||
get_status_editipo();
|
||||
|
||||
|
||||
ei= G.sipo->editipo;
|
||||
for(a=0; a<G.sipo->totipo; a++) {
|
||||
if(totipo_vis==0) {
|
||||
if(ei->icu) {
|
||||
ei->flag |= IPO_VISIBLE;
|
||||
ei->flag |= IPO_SELECT;
|
||||
}
|
||||
}
|
||||
else ei->flag &= ~IPO_VISIBLE;
|
||||
ei++;
|
||||
}
|
||||
|
||||
update_editipo_flags();
|
||||
|
||||
if(G.sipo->showkey) {
|
||||
|
||||
make_ipokey();
|
||||
|
||||
ob= OBACT;
|
||||
if(ob && (ob->ipoflag & OB_DRAWKEY)) allqueue(REDRAWVIEW3D, 0);
|
||||
}
|
||||
|
||||
scrarea_queue_winredraw(curarea);
|
||||
BIF_undo_push("Swap Visible Ipo");
|
||||
}
|
||||
|
||||
void deselectall_editipo(void)
|
||||
{
|
||||
EditIpo *ei;
|
||||
IpoKey *ik;
|
||||
BezTriple *bezt;
|
||||
int a, b; /* , sel=0; */
|
||||
|
||||
get_status_editipo();
|
||||
|
||||
if(G.sipo->showkey) {
|
||||
ik= G.sipo->ipokey.first;
|
||||
while(ik) {
|
||||
ik->flag &= ~1;
|
||||
ik= ik->next;
|
||||
}
|
||||
update_editipo_flags();
|
||||
|
||||
}
|
||||
else if(totipo_edit==0) {
|
||||
|
||||
ei= G.sipo->editipo;
|
||||
for(a=0; a<G.sipo->totipo; a++) {
|
||||
if( ei->flag & IPO_VISIBLE ) {
|
||||
ei->flag &= ~IPO_SELECT;
|
||||
}
|
||||
ei++;
|
||||
}
|
||||
update_editipo_flags();
|
||||
}
|
||||
else {
|
||||
ei= G.sipo->editipo;
|
||||
for(a=0; a<G.sipo->totipo; a++) {
|
||||
if ISPOIN3(ei, flag & IPO_VISIBLE, flag & IPO_EDIT, icu ) {
|
||||
if(ei->icu->bezt) {
|
||||
bezt= ei->icu->bezt;
|
||||
b= ei->icu->totvert;
|
||||
while(b--) {
|
||||
bezt->f1= bezt->f2= bezt->f3= 0;
|
||||
bezt++;
|
||||
}
|
||||
}
|
||||
}
|
||||
ei++;
|
||||
}
|
||||
}
|
||||
|
||||
BIF_undo_push("(De)select all Ipo");
|
||||
scrarea_queue_winredraw(curarea);
|
||||
}
|
||||
|
||||
short findnearest_ipovert(IpoCurve **icu, BezTriple **bezt)
|
||||
static short findnearest_ipovert(IpoCurve **icu, BezTriple **bezt)
|
||||
{
|
||||
/* selected verts get a disadvantage */
|
||||
/* in icu and (bezt or bp) the nearest is written */
|
||||
@@ -1651,7 +1231,7 @@ short findnearest_ipovert(IpoCurve **icu, BezTriple **bezt)
|
||||
|
||||
ei= G.sipo->editipo;
|
||||
for(a=0; a<G.sipo->totipo; a++, ei++) {
|
||||
if ISPOIN3(ei, flag & IPO_VISIBLE, flag & IPO_EDIT, icu) {
|
||||
if (ISPOIN3(ei, flag & IPO_VISIBLE, flag & IPO_EDIT, icu)) {
|
||||
|
||||
if(ei->icu->bezt) {
|
||||
bezt1= ei->icu->bezt;
|
||||
@@ -1704,55 +1284,192 @@ short findnearest_ipovert(IpoCurve **icu, BezTriple **bezt)
|
||||
return hpoint;
|
||||
}
|
||||
|
||||
|
||||
void move_to_frame(void)
|
||||
void mouse_select_ipo(void)
|
||||
{
|
||||
EditIpo *ei;
|
||||
Object *ob;
|
||||
Key *key;
|
||||
KeyBlock *kb, *actkb=NULL, *curkb;
|
||||
EditIpo *ei, *actei= 0;
|
||||
IpoCurve *icu;
|
||||
IpoKey *ik, *actik;
|
||||
BezTriple *bezt;
|
||||
ID *id;
|
||||
float cfra;
|
||||
int a, b;
|
||||
float x, y, dist, mindist;
|
||||
int a, oldflag = 0, hand, ok;
|
||||
short mval[2], xo, yo;
|
||||
|
||||
if(G.sipo->editipo==0) return;
|
||||
|
||||
ei= G.sipo->editipo;
|
||||
|
||||
for(a=0; a<G.sipo->totipo; a++, ei++) {
|
||||
if ISPOIN(ei, flag & IPO_VISIBLE, icu) {
|
||||
if(G.sipo->showkey || (ei->flag & IPO_EDIT)) {
|
||||
|
||||
get_status_editipo();
|
||||
|
||||
if(G.sipo->showkey) {
|
||||
getmouseco_areawin(mval);
|
||||
|
||||
areamouseco_to_ipoco(G.v2d, mval, &x, &y);
|
||||
actik= 0;
|
||||
mindist= 1000.0;
|
||||
ik= G.sipo->ipokey.first;
|
||||
while(ik) {
|
||||
dist= (float)(fabs(ik->val-x));
|
||||
if(ik->flag & 1) dist+= 1.0;
|
||||
if(dist < mindist) {
|
||||
actik= ik;
|
||||
mindist= dist;
|
||||
}
|
||||
ik= ik->next;
|
||||
}
|
||||
if(actik) {
|
||||
oldflag= actik->flag;
|
||||
|
||||
if(ei->icu->bezt) {
|
||||
|
||||
b= ei->icu->totvert;
|
||||
bezt= ei->icu->bezt;
|
||||
while(b--) {
|
||||
if(BEZSELECTED(bezt)) {
|
||||
|
||||
cfra= bezt->vec[1][0]/G.scene->r.framelen;
|
||||
|
||||
id= G.sipo->from;
|
||||
if(id && GS(id->name)==ID_OB ) {
|
||||
Object *ob= (Object *)id;
|
||||
if(ob->sf!=0.0 && (ob->ipoflag & OB_OFFS_OB) ) {
|
||||
cfra+= ob->sf/G.scene->r.framelen;
|
||||
}
|
||||
}
|
||||
CFRA= (short)floor(cfra+0.5);
|
||||
|
||||
if(CFRA < 1) CFRA= 1;
|
||||
update_for_newframe();
|
||||
|
||||
break;
|
||||
}
|
||||
bezt++;
|
||||
if(G.qual & LR_SHIFTKEY);
|
||||
else deselectall_editipo();
|
||||
|
||||
if(G.qual & LR_SHIFTKEY) {
|
||||
if(oldflag & 1) actik->flag &= ~1;
|
||||
else actik->flag |= 1;
|
||||
}
|
||||
else {
|
||||
actik->flag |= 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
else if(totipo_edit) {
|
||||
|
||||
hand= findnearest_ipovert(&icu, &bezt);
|
||||
|
||||
if(G.qual & LR_SHIFTKEY) {
|
||||
if(bezt) {
|
||||
if(hand==1) {
|
||||
if(BEZSELECTED(bezt)) {
|
||||
bezt->f1= bezt->f2= bezt->f3= 0;
|
||||
}
|
||||
else {
|
||||
bezt->f1= bezt->f2= bezt->f3= 1;
|
||||
}
|
||||
}
|
||||
else if(hand==0) {
|
||||
if(bezt->f1 & 1) bezt->f1= 0;
|
||||
else bezt->f1= 1;
|
||||
}
|
||||
else {
|
||||
if(bezt->f3 & 1) bezt->f3= 0;
|
||||
else bezt->f3= 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
deselectall_editipo();
|
||||
|
||||
if(bezt) {
|
||||
if(hand==1) {
|
||||
bezt->f1|= 1; bezt->f2|= 1; bezt->f3|= 1;
|
||||
}
|
||||
else if(hand==0) bezt->f1|= 1;
|
||||
else bezt->f3|= 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
|
||||
/* vertex keys ? */
|
||||
if(G.sipo->blocktype==ID_KE && G.sipo->from) {
|
||||
int i, index= 1;
|
||||
|
||||
key= (Key *)G.sipo->from;
|
||||
ob= OBACT;
|
||||
curkb= BLI_findlink(&key->block, ob->shapenr-1);
|
||||
|
||||
ei= G.sipo->editipo;
|
||||
if(key->type==KEY_NORMAL || (ei->flag & IPO_VISIBLE)) {
|
||||
getmouseco_areawin(mval);
|
||||
|
||||
areamouseco_to_ipoco(G.v2d, mval, &x, &y);
|
||||
/* how much is 20 pixels? */
|
||||
mindist= (float)(20.0*(G.v2d->cur.ymax-G.v2d->cur.ymin)/(float)curarea->winy);
|
||||
|
||||
for(i=1, kb= key->block.first; kb; kb= kb->next, i++) {
|
||||
dist= (float)(fabs(kb->pos-y));
|
||||
if(kb==curkb) dist+= (float)0.01;
|
||||
if(dist < mindist) {
|
||||
actkb= kb;
|
||||
mindist= dist;
|
||||
index= i;
|
||||
}
|
||||
}
|
||||
if(actkb) {
|
||||
ok= TRUE;
|
||||
if(G.obedit && actkb!=curkb) {
|
||||
ok= okee("Copy key after leaving Edit Mode");
|
||||
}
|
||||
if(ok) {
|
||||
/* also does all keypos */
|
||||
deselectall_editipo();
|
||||
set_active_key(index);
|
||||
set_active_editipo(ei+index-1);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* select curve */
|
||||
if(actkb==NULL) {
|
||||
if(totipo_vis==1) {
|
||||
ei= G.sipo->editipo;
|
||||
for(a=0; a<G.sipo->totipo; a++, ei++) {
|
||||
if(ei->icu) {
|
||||
if(ei->flag & IPO_VISIBLE) actei= ei;
|
||||
}
|
||||
}
|
||||
}
|
||||
else if(totipo_vis>1) {
|
||||
actei= select_proj_ipo(0, 0);
|
||||
}
|
||||
|
||||
if(actei) oldflag= actei->flag;
|
||||
|
||||
if(G.qual & LR_SHIFTKEY);
|
||||
else deselectall_editipo();
|
||||
|
||||
if(actei) {
|
||||
if(G.qual & LR_SHIFTKEY) {
|
||||
if(oldflag & IPO_SELECT) actei->flag &= ~IPO_SELECT;
|
||||
else actei->flag |= IPO_SELECT;
|
||||
}
|
||||
else {
|
||||
actei->flag |= IPO_SELECT;
|
||||
}
|
||||
set_active_editipo(actei);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
update_editipo_flags();
|
||||
|
||||
force_draw(0);
|
||||
BIF_undo_push("Select Ipo");
|
||||
|
||||
if(G.sipo->showkey && G.sipo->blocktype==ID_OB) {
|
||||
ob= OBACT;
|
||||
if(ob && (ob->ipoflag & OB_DRAWKEY)) allqueue(REDRAWVIEW3D, 0);
|
||||
}
|
||||
|
||||
getmouseco_areawin(mval);
|
||||
xo= mval[0];
|
||||
yo= mval[1];
|
||||
|
||||
while(get_mbut()&R_MOUSE) {
|
||||
getmouseco_areawin(mval);
|
||||
if(abs(mval[0]-xo)+abs(mval[1]-yo) > 4) {
|
||||
|
||||
if(actkb) move_keys(OBACT);
|
||||
else transform_ipo('g');
|
||||
|
||||
return;
|
||||
}
|
||||
BIF_wait_for_statechange();
|
||||
}
|
||||
BIF_undo_push("Set frame to selected Ipo vertex");
|
||||
}
|
||||
|
||||
|
||||
/* *********************************** */
|
||||
|
||||
/* handling of right-hand channel/curve buttons in ipo window */
|
||||
@@ -1843,203 +1560,189 @@ void do_ipo_selectbuttons(void)
|
||||
BIF_undo_push("Select Ipo curve");
|
||||
}
|
||||
|
||||
/* ******************************************* */
|
||||
/* ********************************* Inserting keys ********************************************* */
|
||||
|
||||
EditIpo *get_editipo(void)
|
||||
/* depending type, it returns ipo, if neded it creates one */
|
||||
/* returns either action ipo or "real" ipo */
|
||||
/* arguments define full context;
|
||||
- *from has to be set always, to Object in case of Actions
|
||||
- blocktype defines available channels of Ipo struct (blocktype ID_OB can be in action too)
|
||||
- if actname, use this to locate action, and optional constname to find the channel
|
||||
*/
|
||||
|
||||
/* note; check header_ipo.c, spaceipo_assign_ipo() too */
|
||||
Ipo *verify_ipo(ID *from, short blocktype, char *actname, char *constname)
|
||||
{
|
||||
EditIpo *ei;
|
||||
int a; /* , sel=0; */
|
||||
|
||||
if(from==NULL || from->lib) return NULL;
|
||||
|
||||
get_status_editipo();
|
||||
|
||||
if(totipo_edit>1) {
|
||||
return 0;
|
||||
}
|
||||
if(G.sipo->editipo==0) return 0;
|
||||
|
||||
ei= G.sipo->editipo;
|
||||
for(a=0; a<G.sipo->totipo; a++) {
|
||||
if(ei->flag & IPO_VISIBLE) {
|
||||
if( ei->flag & IPO_EDIT ) return ei;
|
||||
else if(totipo_vis==1) return ei;
|
||||
|
||||
if(ei->flag & IPO_SELECT) {
|
||||
if(totipo_sel==1) return ei;
|
||||
/* first check action ipos */
|
||||
if(actname && actname[0]) {
|
||||
Object *ob= (Object *)from;
|
||||
bActionChannel *achan;
|
||||
|
||||
if(ob->action==NULL)
|
||||
ob->action= add_empty_action(blocktype);
|
||||
|
||||
achan= verify_action_channel(ob->action, actname);
|
||||
|
||||
if(achan) {
|
||||
/* constraint exception */
|
||||
if(blocktype==ID_CO) {
|
||||
bConstraintChannel *conchan= verify_constraint_channel(&achan->constraintChannels, constname);
|
||||
if(conchan->ipo==NULL) {
|
||||
conchan->ipo= add_ipo("CoIpo", ID_CO);
|
||||
}
|
||||
return conchan->ipo;
|
||||
}
|
||||
else {
|
||||
if(achan->ipo==NULL) {
|
||||
achan->ipo= add_ipo("ActIpo", blocktype);
|
||||
}
|
||||
|
||||
return achan->ipo;
|
||||
}
|
||||
}
|
||||
ei++;
|
||||
}
|
||||
return 0;
|
||||
else {
|
||||
|
||||
switch(GS(from->name)) {
|
||||
case ID_OB:
|
||||
{
|
||||
Object *ob= (Object *)from;
|
||||
/* constraint exception */
|
||||
if(blocktype==ID_CO) {
|
||||
bConstraintChannel *conchan= verify_constraint_channel(&ob->constraintChannels, constname);
|
||||
if(conchan->ipo==NULL) {
|
||||
conchan->ipo= add_ipo("CoIpo", ID_CO);
|
||||
}
|
||||
return conchan->ipo;
|
||||
}
|
||||
else if(blocktype==ID_OB) {
|
||||
if(ob->ipo==NULL) {
|
||||
ob->ipo= add_ipo("ObIpo", ID_OB);
|
||||
}
|
||||
return ob->ipo;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case ID_MA:
|
||||
{
|
||||
Material *ma= (Material *)from;
|
||||
|
||||
if(ma->ipo==NULL) {
|
||||
ma->ipo= add_ipo("MatIpo", ID_MA);
|
||||
}
|
||||
return ma->ipo;
|
||||
}
|
||||
break;
|
||||
case ID_TE:
|
||||
{
|
||||
Tex *tex= (Tex *)from;
|
||||
|
||||
if(tex->ipo==NULL) {
|
||||
tex->ipo= add_ipo("TexIpo", ID_TE);
|
||||
}
|
||||
return tex->ipo;
|
||||
}
|
||||
break;
|
||||
case ID_SEQ:
|
||||
{
|
||||
Sequence *seq= (Sequence *)from; /* note, sequence is mimicing Id */
|
||||
|
||||
if((seq->type & SEQ_EFFECT)||(seq->type == SEQ_SOUND)) {
|
||||
if(seq->ipo==NULL) {
|
||||
seq->ipo= add_ipo("SeqIpo", ID_SEQ);
|
||||
}
|
||||
return seq->ipo;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case ID_CU:
|
||||
{
|
||||
Curve *cu= (Curve *)from;
|
||||
|
||||
if(cu->ipo==NULL) {
|
||||
cu->ipo= add_ipo("CuIpo", ID_CU);
|
||||
}
|
||||
return cu->ipo;
|
||||
}
|
||||
break;
|
||||
case ID_KE:
|
||||
{
|
||||
Key *key= (Key *)from;
|
||||
|
||||
if(key->ipo==NULL) {
|
||||
key->ipo= add_ipo("KeyIpo", ID_KE);
|
||||
}
|
||||
return key->ipo;
|
||||
}
|
||||
break;
|
||||
case ID_WO:
|
||||
{
|
||||
World *wo= (World *)from;
|
||||
|
||||
if(wo->ipo==NULL) {
|
||||
wo->ipo= add_ipo("WoIpo", ID_WO);
|
||||
}
|
||||
return wo->ipo;
|
||||
}
|
||||
break;
|
||||
case ID_LA:
|
||||
{
|
||||
Lamp *la= (Lamp *)from;
|
||||
|
||||
if(la->ipo==NULL) {
|
||||
la->ipo= add_ipo("LaIpo", ID_LA);
|
||||
}
|
||||
return la->ipo;
|
||||
}
|
||||
break;
|
||||
case ID_CA:
|
||||
{
|
||||
Camera *ca= (Camera *)from;
|
||||
|
||||
if(ca->ipo==NULL) {
|
||||
ca->ipo= add_ipo("CaIpo", ID_CA);
|
||||
}
|
||||
return ca->ipo;
|
||||
}
|
||||
break;
|
||||
case ID_SO:
|
||||
{
|
||||
bSound *snd= (bSound *)from;
|
||||
|
||||
if(snd->ipo==NULL) {
|
||||
snd->ipo= add_ipo("SndIpo", ID_SO);
|
||||
}
|
||||
return snd->ipo;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
Ipo *get_ipo(ID *from, short type, int make)
|
||||
/* returns and creates */
|
||||
IpoCurve *verify_ipocurve(ID *from, short blocktype, char *actname, char *constname, int adrcode)
|
||||
{
|
||||
Object *ob;
|
||||
Material *ma;
|
||||
Tex *tex;
|
||||
Curve *cu;
|
||||
Sequence *seq;
|
||||
Key *key;
|
||||
World *wo;
|
||||
Lamp *la;
|
||||
Camera *ca;
|
||||
Ipo *ipo= NULL;
|
||||
bAction *act;
|
||||
|
||||
if(from==NULL) return NULL;
|
||||
|
||||
if( type==ID_OB) {
|
||||
ob= (Object *)from;
|
||||
if(ob->id.lib) return NULL;
|
||||
|
||||
ipo= ob->ipo;
|
||||
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 NULL;
|
||||
|
||||
chan= get_active_constraint_channel(ob);
|
||||
|
||||
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->id.lib) return NULL;
|
||||
|
||||
/* weak... the *from pointer has action, ipo doesnt give more context info yet */
|
||||
verify_active_action_channel(OBACT);
|
||||
|
||||
if (act->achan==NULL)
|
||||
return NULL;
|
||||
|
||||
ipo= act->achan->ipo;
|
||||
|
||||
if(make && ipo==NULL) {
|
||||
ipo= act->achan->ipo= add_ipo(act->achan->name, ID_AC);
|
||||
allspace(REMAKEIPO, 0);
|
||||
allqueue(REDRAWIPO, 0);
|
||||
allqueue(REDRAWACTION, 0);
|
||||
}
|
||||
}
|
||||
else if( type==ID_MA) {
|
||||
ma= (Material *)from;
|
||||
if(ma->id.lib) return NULL;
|
||||
ipo= ma->ipo;
|
||||
|
||||
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 NULL;
|
||||
ipo= tex->ipo;
|
||||
|
||||
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==NULL) ipo= seq->ipo= add_ipo("SeqIpo", ID_SEQ);
|
||||
}
|
||||
else return NULL;
|
||||
}
|
||||
else if( type==ID_CU) {
|
||||
cu= (Curve *)from;
|
||||
if(cu->id.lib) return NULL;
|
||||
ipo= cu->ipo;
|
||||
|
||||
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 NULL;
|
||||
ipo= key->ipo;
|
||||
|
||||
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 NULL;
|
||||
ipo= wo->ipo;
|
||||
|
||||
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 NULL;
|
||||
ipo= la->ipo;
|
||||
|
||||
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 NULL;
|
||||
ipo= ca->ipo;
|
||||
|
||||
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 NULL;
|
||||
ipo= snd->ipo;
|
||||
|
||||
if(make && ipo==NULL) ipo= snd->ipo= add_ipo("SndIpo", ID_SO);
|
||||
}
|
||||
else return NULL;
|
||||
|
||||
return ipo;
|
||||
}
|
||||
|
||||
|
||||
// this function should not have the G.sipo in it...
|
||||
|
||||
IpoCurve *get_ipocurve(ID *from, short type, int adrcode, Ipo *useipo)
|
||||
{
|
||||
Ipo *ipo= NULL;
|
||||
IpoCurve *icu=NULL;
|
||||
Ipo *ipo;
|
||||
IpoCurve *icu= NULL;
|
||||
|
||||
/* return 0 if lib */
|
||||
/* also test if ipo and ipocurve exist */
|
||||
|
||||
if (useipo==NULL) {
|
||||
if (G.sipo==NULL || G.sipo->pin==0){
|
||||
ipo= get_ipo(from, type, 1); /* 1= make */
|
||||
}
|
||||
else
|
||||
ipo = G.sipo->ipo;
|
||||
|
||||
if(G.sipo) {
|
||||
if (G.sipo->pin==0) G.sipo->ipo= ipo;
|
||||
}
|
||||
}
|
||||
else
|
||||
ipo= useipo;
|
||||
|
||||
|
||||
if(ipo && ipo->id.lib==0) {
|
||||
/* creates ipo too */
|
||||
ipo= verify_ipo(from, blocktype, actname, constname);
|
||||
|
||||
icu= ipo->curve.first;
|
||||
while(icu) {
|
||||
if(ipo && ipo->id.lib==NULL) {
|
||||
|
||||
for(icu= ipo->curve.first; icu; icu= icu->next) {
|
||||
if(icu->adrcode==adrcode) break;
|
||||
icu= icu->next;
|
||||
}
|
||||
if(icu==0) {
|
||||
if(icu==NULL) {
|
||||
icu= MEM_callocN(sizeof(IpoCurve), "ipocurve");
|
||||
|
||||
icu->flag |= IPO_VISIBLE|IPO_AUTO_HORIZ;
|
||||
|
||||
if (!useipo && G.sipo && G.sipo->pin)
|
||||
icu->blocktype = G.sipo->blocktype;
|
||||
else
|
||||
icu->blocktype= type;
|
||||
icu->flag |= IPO_VISIBLE|IPO_AUTO_HORIZ;
|
||||
icu->blocktype= blocktype;
|
||||
icu->adrcode= adrcode;
|
||||
|
||||
set_icu_vars(icu);
|
||||
@@ -2047,6 +1750,7 @@ IpoCurve *get_ipocurve(ID *from, short type, int adrcode, Ipo *useipo)
|
||||
BLI_addtail( &(ipo->curve), icu);
|
||||
}
|
||||
}
|
||||
|
||||
return icu;
|
||||
}
|
||||
|
||||
@@ -2138,17 +1842,19 @@ void add_vert_ipo(void)
|
||||
|
||||
if(mval[0]>G.v2d->mask.xmax) return;
|
||||
|
||||
ei= get_editipo();
|
||||
ei= get_active_editipo();
|
||||
if(ei==0) {
|
||||
error("Too many (or no) EditIpos");
|
||||
error("No active Ipo curve");
|
||||
return;
|
||||
}
|
||||
|
||||
areamouseco_to_ipoco(G.v2d, mval, &x, &y);
|
||||
|
||||
if(ei->icu==NULL) {
|
||||
if(G.sipo->from)
|
||||
ei->icu= get_ipocurve(G.sipo->from, G.sipo->blocktype, ei->adrcode, 0);
|
||||
if(G.sipo->from) {
|
||||
ei->icu= verify_ipocurve(G.sipo->from, G.sipo->blocktype, G.sipo->actname, G.sipo->constname, ei->adrcode);
|
||||
ei->flag |= ei->icu->flag & IPO_AUTO_HORIZ; /* new curve could have been added, weak... */
|
||||
}
|
||||
}
|
||||
if(ei->icu==NULL) return;
|
||||
|
||||
@@ -2169,6 +1875,591 @@ void add_vert_ipo(void)
|
||||
BIF_undo_push("Add Ipo vertex");
|
||||
}
|
||||
|
||||
static void *get_context_ipo_poin(ID *id, int blocktype, char *actname, IpoCurve *icu, int *vartype)
|
||||
{
|
||||
if(blocktype==ID_PO) {
|
||||
if(GS(id->name)==ID_OB) {
|
||||
Object *ob= (Object *)id;
|
||||
bPoseChannel *pchan= get_pose_channel(ob->pose, actname);
|
||||
|
||||
*vartype= IPO_FLOAT;
|
||||
return get_pchan_ipo_poin(pchan, icu->adrcode);
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
else
|
||||
return get_ipo_poin(id, icu, vartype);
|
||||
|
||||
}
|
||||
|
||||
void insertkey(ID *id, int blocktype, char *actname, char *constname, int adrcode)
|
||||
{
|
||||
IpoCurve *icu;
|
||||
Object *ob;
|
||||
void *poin= NULL;
|
||||
float curval, cfra;
|
||||
int vartype;
|
||||
|
||||
icu= verify_ipocurve(id, blocktype, actname, constname, adrcode);
|
||||
|
||||
if(icu) {
|
||||
|
||||
poin= get_context_ipo_poin(id, blocktype, actname, icu, &vartype);
|
||||
|
||||
if(poin) {
|
||||
curval= read_ipo_poin(poin, vartype);
|
||||
|
||||
cfra= frame_to_float(CFRA);
|
||||
|
||||
/* if action is mapped in NLA, it returns a correction */
|
||||
if(actname && actname[0] && GS(id->name)==ID_OB)
|
||||
cfra= get_action_frame((Object *)id, cfra);
|
||||
|
||||
if( GS(id->name)==ID_OB ) {
|
||||
ob= (Object *)id;
|
||||
if(ob->sf!=0.0 && (ob->ipoflag & OB_OFFS_OB) ) {
|
||||
/* actually frametofloat calc again! */
|
||||
cfra-= ob->sf*G.scene->r.framelen;
|
||||
}
|
||||
}
|
||||
|
||||
insert_vert_ipo(icu, cfra, curval);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void insertkey_editipo(void)
|
||||
{
|
||||
EditIpo *ei;
|
||||
IpoKey *ik;
|
||||
ID *id;
|
||||
float *fp, cfra, *insertvals;
|
||||
int a, nr, ok, tot;
|
||||
short event;
|
||||
|
||||
ei= get_active_editipo();
|
||||
if(ei && ei->icu && ei->icu->driver)
|
||||
event= pupmenu("Insert Curve %t|Default one-to-one mapping %x3");
|
||||
else if(G.sipo->showkey)
|
||||
event= pupmenu("Insert Key Vertices %t|Current Frame %x1|Selected Keys %x2");
|
||||
else
|
||||
event= pupmenu("Insert Key Vertices %t|Current Frame %x1");
|
||||
|
||||
if(event<1) return;
|
||||
|
||||
if(event==3) {
|
||||
IpoDriver *driver= ei->icu->driver;
|
||||
|
||||
if(ei->icu->bezt) MEM_freeN(ei->icu->bezt);
|
||||
ei->icu->totvert= 0;
|
||||
ei->icu->bezt= NULL;
|
||||
|
||||
insert_vert_ipo(ei->icu, 0.0f, 0.0f);
|
||||
|
||||
if(ELEM3(driver->adrcode, OB_ROT_X, OB_ROT_Y, OB_ROT_Z)) {
|
||||
if(ei->disptype==IPO_DISPDEGR)
|
||||
insert_vert_ipo(ei->icu, 18.0f, 18.0f);
|
||||
else
|
||||
insert_vert_ipo(ei->icu, 18.0f, 1.0f);
|
||||
}
|
||||
else
|
||||
insert_vert_ipo(ei->icu, 1.0f, 1.0f);
|
||||
|
||||
ei->flag |= IPO_SELECT|IPO_VISIBLE;
|
||||
ei->icu->flag= ei->flag;
|
||||
ei->icu->extrap= IPO_DIR;
|
||||
|
||||
do_ipo_buttons(B_IPOHOME);
|
||||
}
|
||||
else {
|
||||
ei= G.sipo->editipo;
|
||||
for(nr=0; nr<G.sipo->totipo; nr++, ei++) {
|
||||
if (ISPOIN(ei, flag & IPO_VISIBLE, icu)) {
|
||||
|
||||
ok= 0;
|
||||
if(G.sipo->showkey) ok= 1;
|
||||
else if(ei->flag & IPO_SELECT) ok= 1;
|
||||
|
||||
if(ok) {
|
||||
/* count amount */
|
||||
if(event==1) tot= 1;
|
||||
else {
|
||||
ik= G.sipo->ipokey.first;
|
||||
tot= 0;
|
||||
while(ik) {
|
||||
if(ik->flag & 1) tot++;
|
||||
ik= ik->next;
|
||||
}
|
||||
}
|
||||
if(tot) {
|
||||
|
||||
/* correction for ob timeoffs */
|
||||
cfra= frame_to_float(CFRA);
|
||||
id= G.sipo->from;
|
||||
if(id && GS(id->name)==ID_OB ) {
|
||||
Object *ob= (Object *)id;
|
||||
if(ob->sf!=0.0 && (ob->ipoflag & OB_OFFS_OB) ) {
|
||||
cfra-= ob->sf*G.scene->r.framelen;
|
||||
}
|
||||
}
|
||||
else if(id && GS(id->name)==ID_SEQ) {
|
||||
extern Sequence *last_seq; /* editsequence.c */
|
||||
|
||||
if(last_seq) {
|
||||
cfra= (float)(100.0*(cfra-last_seq->startdisp)/((float)(last_seq->enddisp-last_seq->startdisp)));
|
||||
}
|
||||
}
|
||||
|
||||
insertvals= MEM_mallocN(sizeof(float)*2*tot, "insertkey_editipo");
|
||||
/* make sure icu->curval is correct */
|
||||
calc_ipo(G.sipo->ipo, cfra);
|
||||
|
||||
if(event==1) {
|
||||
insertvals[0]= cfra;
|
||||
|
||||
insertvals[1]= ei->icu->curval;
|
||||
}
|
||||
else {
|
||||
fp= insertvals;
|
||||
ik= G.sipo->ipokey.first;
|
||||
while(ik) {
|
||||
if(ik->flag & 1) {
|
||||
calc_ipo(G.sipo->ipo, ik->val);
|
||||
|
||||
fp[0]= ik->val;
|
||||
fp[1]= ei->icu->curval;
|
||||
fp+= 2;
|
||||
}
|
||||
ik= ik->next;
|
||||
}
|
||||
}
|
||||
fp= insertvals;
|
||||
for(a=0; a<tot; a++, fp+=2) {
|
||||
insert_vert_ipo(ei->icu, fp[0], fp[1]);
|
||||
}
|
||||
|
||||
MEM_freeN(insertvals);
|
||||
calc_ipo(G.sipo->ipo, (float)CFRA);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
BIF_undo_push("Insert Key Ipo");
|
||||
allqueue (REDRAWACTION, 0);
|
||||
allqueue(REDRAWNLA, 0);
|
||||
allqueue(REDRAWIPO, 0);
|
||||
allspace(REMAKEIPO, 0);
|
||||
}
|
||||
|
||||
|
||||
void common_insertkey(void)
|
||||
{
|
||||
Base *base;
|
||||
Object *ob;
|
||||
Material *ma;
|
||||
ID *id;
|
||||
IpoCurve *icu;
|
||||
World *wo;
|
||||
Lamp *la;
|
||||
int tlay, map, event;
|
||||
char menustr[256];
|
||||
|
||||
if(curarea->spacetype==SPACE_IPO) {
|
||||
insertkey_editipo();
|
||||
}
|
||||
else if(curarea->spacetype==SPACE_BUTS) {
|
||||
if(G.buts->mainb==CONTEXT_SHADING) {
|
||||
int tab= G.buts->tab[CONTEXT_SHADING];
|
||||
|
||||
if(tab==TAB_SHADING_MAT) {
|
||||
id= G.buts->lockpoin;
|
||||
ma= G.buts->lockpoin;
|
||||
if(id) {
|
||||
event= pupmenu("Insert Key %t|RGB%x0|Alpha%x1|Halo Size%x2|Mode %x3|All Color%x10|All Mirror%x14|Ofs%x12|Size%x13|All Mapping%x11");
|
||||
if(event== -1) return;
|
||||
|
||||
map= texchannel_to_adrcode(ma->texact);
|
||||
|
||||
if(event==0 || event==10) {
|
||||
insertkey(id, ID_MA, NULL, NULL, MA_COL_R);
|
||||
insertkey(id, ID_MA, NULL, NULL, MA_COL_G);
|
||||
insertkey(id, ID_MA, NULL, NULL, MA_COL_B);
|
||||
}
|
||||
if(event==1 || event==10) {
|
||||
insertkey(id, ID_MA, NULL, NULL, MA_ALPHA);
|
||||
}
|
||||
if(event==2 || event==10) {
|
||||
insertkey(id, ID_MA, NULL, NULL, MA_HASIZE);
|
||||
}
|
||||
if(event==3 || event==10) {
|
||||
insertkey(id, ID_MA, NULL, NULL, MA_MODE);
|
||||
}
|
||||
if(event==10) {
|
||||
insertkey(id, ID_MA, NULL, NULL, MA_SPEC_R);
|
||||
insertkey(id, ID_MA, NULL, NULL, MA_SPEC_G);
|
||||
insertkey(id, ID_MA, NULL, NULL, MA_SPEC_B);
|
||||
insertkey(id, ID_MA, NULL, NULL, MA_REF);
|
||||
insertkey(id, ID_MA, NULL, NULL, MA_EMIT);
|
||||
insertkey(id, ID_MA, NULL, NULL, MA_AMB);
|
||||
insertkey(id, ID_MA, NULL, NULL, MA_SPEC);
|
||||
insertkey(id, ID_MA, NULL, NULL, MA_HARD);
|
||||
insertkey(id, ID_MA, NULL, NULL, MA_MODE);
|
||||
insertkey(id, ID_MA, NULL, NULL, MA_TRANSLU);
|
||||
insertkey(id, ID_MA, NULL, NULL, MA_ADD);
|
||||
}
|
||||
if(event==14) {
|
||||
insertkey(id, ID_MA, NULL, NULL, MA_RAYM);
|
||||
insertkey(id, ID_MA, NULL, NULL, MA_FRESMIR);
|
||||
insertkey(id, ID_MA, NULL, NULL, MA_FRESMIRI);
|
||||
insertkey(id, ID_MA, NULL, NULL, MA_FRESTRA);
|
||||
insertkey(id, ID_MA, NULL, NULL, MA_FRESTRAI);
|
||||
}
|
||||
if(event==12 || event==11) {
|
||||
insertkey(id, ID_MA, NULL, NULL, map+MAP_OFS_X);
|
||||
insertkey(id, ID_MA, NULL, NULL, map+MAP_OFS_Y);
|
||||
insertkey(id, ID_MA, NULL, NULL, map+MAP_OFS_Z);
|
||||
}
|
||||
if(event==13 || event==11) {
|
||||
insertkey(id, ID_MA, NULL, NULL, map+MAP_SIZE_X);
|
||||
insertkey(id, ID_MA, NULL, NULL, map+MAP_SIZE_Y);
|
||||
insertkey(id, ID_MA, NULL, NULL, map+MAP_SIZE_Z);
|
||||
}
|
||||
if(event==11) {
|
||||
insertkey(id, ID_MA, NULL, NULL, map+MAP_R);
|
||||
insertkey(id, ID_MA, NULL, NULL, map+MAP_G);
|
||||
insertkey(id, ID_MA, NULL, NULL, map+MAP_B);
|
||||
insertkey(id, ID_MA, NULL, NULL, map+MAP_DVAR);
|
||||
insertkey(id, ID_MA, NULL, NULL, map+MAP_COLF);
|
||||
insertkey(id, ID_MA, NULL, NULL, map+MAP_NORF);
|
||||
insertkey(id, ID_MA, NULL, NULL, map+MAP_VARF);
|
||||
insertkey(id, ID_MA, NULL, NULL, map+MAP_DISP);
|
||||
}
|
||||
}
|
||||
}
|
||||
else if(tab==TAB_SHADING_WORLD) {
|
||||
id= G.buts->lockpoin;
|
||||
wo= G.buts->lockpoin;
|
||||
if(id) {
|
||||
event= pupmenu("Insert Key %t|Zenith RGB%x0|Horizon RGB%x1|Mist%x2|Stars %x3|Offset%x12|Size%x13");
|
||||
if(event== -1) return;
|
||||
|
||||
map= texchannel_to_adrcode(wo->texact);
|
||||
|
||||
if(event==0) {
|
||||
insertkey(id, ID_WO, NULL, NULL, WO_ZEN_R);
|
||||
insertkey(id, ID_WO, NULL, NULL, WO_ZEN_G);
|
||||
insertkey(id, ID_WO, NULL, NULL, WO_ZEN_B);
|
||||
}
|
||||
if(event==1) {
|
||||
insertkey(id, ID_WO, NULL, NULL, WO_HOR_R);
|
||||
insertkey(id, ID_WO, NULL, NULL, WO_HOR_G);
|
||||
insertkey(id, ID_WO, NULL, NULL, WO_HOR_B);
|
||||
}
|
||||
if(event==2) {
|
||||
insertkey(id, ID_WO, NULL, NULL, WO_MISI);
|
||||
insertkey(id, ID_WO, NULL, NULL, WO_MISTDI);
|
||||
insertkey(id, ID_WO, NULL, NULL, WO_MISTSTA);
|
||||
insertkey(id, ID_WO, NULL, NULL, WO_MISTHI);
|
||||
}
|
||||
if(event==3) {
|
||||
insertkey(id, ID_WO, NULL, NULL, WO_STAR_R);
|
||||
insertkey(id, ID_WO, NULL, NULL, WO_STAR_G);
|
||||
insertkey(id, ID_WO, NULL, NULL, WO_STAR_B);
|
||||
insertkey(id, ID_WO, NULL, NULL, WO_STARDIST);
|
||||
insertkey(id, ID_WO, NULL, NULL, WO_STARSIZE);
|
||||
}
|
||||
if(event==12) {
|
||||
insertkey(id, ID_WO, NULL, NULL, map+MAP_OFS_X);
|
||||
insertkey(id, ID_WO, NULL, NULL, map+MAP_OFS_Y);
|
||||
insertkey(id, ID_WO, NULL, NULL, map+MAP_OFS_Z);
|
||||
}
|
||||
if(event==13) {
|
||||
insertkey(id, ID_WO, NULL, NULL, map+MAP_SIZE_X);
|
||||
insertkey(id, ID_WO, NULL, NULL, map+MAP_SIZE_Y);
|
||||
insertkey(id, ID_WO, NULL, NULL, map+MAP_SIZE_Z);
|
||||
}
|
||||
}
|
||||
}
|
||||
else if(tab==TAB_SHADING_LAMP) {
|
||||
id= G.buts->lockpoin;
|
||||
la= G.buts->lockpoin;
|
||||
if(id) {
|
||||
event= pupmenu("Insert Key %t|RGB%x0|Energy%x1|Spot Size%x2|Offset%x12|Size%x13");
|
||||
if(event== -1) return;
|
||||
|
||||
map= texchannel_to_adrcode(la->texact);
|
||||
|
||||
if(event==0) {
|
||||
insertkey(id, ID_LA, NULL, NULL, LA_COL_R);
|
||||
insertkey(id, ID_LA, NULL, NULL, LA_COL_G);
|
||||
insertkey(id, ID_LA, NULL, NULL, LA_COL_B);
|
||||
}
|
||||
if(event==1) {
|
||||
insertkey(id, ID_LA, NULL, NULL, LA_ENERGY);
|
||||
}
|
||||
if(event==2) {
|
||||
insertkey(id, ID_LA, NULL, NULL, LA_SPOTSI);
|
||||
}
|
||||
if(event==12) {
|
||||
insertkey(id, ID_LA, NULL, NULL, map+MAP_OFS_X);
|
||||
insertkey(id, ID_LA, NULL, NULL, map+MAP_OFS_Y);
|
||||
insertkey(id, ID_LA, NULL, NULL, map+MAP_OFS_Z);
|
||||
}
|
||||
if(event==13) {
|
||||
insertkey(id, ID_LA, NULL, NULL, map+MAP_SIZE_X);
|
||||
insertkey(id, ID_LA, NULL, NULL, map+MAP_SIZE_Y);
|
||||
insertkey(id, ID_LA, NULL, NULL, map+MAP_SIZE_Z);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
else if(G.buts->mainb==CONTEXT_OBJECT) {
|
||||
ob= OBACT;
|
||||
if(ob && ob->type==OB_MESH) {
|
||||
id= (ID *) (ob);
|
||||
if(id) {
|
||||
event= pupmenu("Insert Key %t|Surface Damping%x0|Random Damping%x1|Permeability%x2|Force Strength%x3|Force Falloff%x4");
|
||||
if(event== -1) return;
|
||||
|
||||
if(event==0) {
|
||||
insertkey(id, ID_OB, NULL, NULL, OB_PD_SDAMP);
|
||||
}
|
||||
if(event==1) {
|
||||
insertkey(id, ID_OB, NULL, NULL, OB_PD_RDAMP);
|
||||
}
|
||||
if(event==2) {
|
||||
insertkey(id, ID_OB, NULL, NULL, OB_PD_PERM);
|
||||
}
|
||||
if(event==3) {
|
||||
insertkey(id, ID_OB, NULL, NULL, OB_PD_FSTR);
|
||||
}
|
||||
if(event==4) {
|
||||
insertkey(id, ID_OB, NULL, NULL, OB_PD_FFALL);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
else if(G.buts->mainb==CONTEXT_EDITING) {
|
||||
ob= OBACT;
|
||||
if(ob && ob->type==OB_CAMERA) {
|
||||
id= G.buts->lockpoin;
|
||||
if(id) {
|
||||
/* yafray: insert key extended with aperture and focal distance */
|
||||
if (G.scene->r.renderer==R_INTERN)
|
||||
event= pupmenu("Insert Key %t|Lens%x0|Clipping%x1");
|
||||
else
|
||||
event= pupmenu("Insert Key %t|Lens%x0|Clipping%x1|Aperture%x2|FocalDistance%x3");
|
||||
if(event== -1) return;
|
||||
|
||||
if(event==0) {
|
||||
insertkey(id, ID_CA, NULL, NULL, CAM_LENS);
|
||||
}
|
||||
else if(event==1) {
|
||||
insertkey(id, ID_CA, NULL, NULL, CAM_STA);
|
||||
insertkey(id, ID_CA, NULL, NULL, CAM_END);
|
||||
}
|
||||
else if(event==2) {
|
||||
insertkey(id, ID_CA, NULL, NULL, CAM_YF_APERT);
|
||||
}
|
||||
else if(event==3) {
|
||||
insertkey(id, ID_CA, NULL, NULL, CAM_YF_FDIST);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else if(FALSE /* && G.buts->mainb==BUTS_SOUND */) {
|
||||
if(G.ssound) {
|
||||
id= G.buts->lockpoin;
|
||||
if(id) {
|
||||
event= pupmenu("Insert Key %t|Volume%x0|Pitch%x1|Panning%x2|Attennuation%x3");
|
||||
if(event== -1) return;
|
||||
|
||||
if(event==0) {
|
||||
insertkey(id, ID_SO, NULL, NULL, SND_VOLUME);
|
||||
}
|
||||
if(event==1) {
|
||||
insertkey(id, ID_SO, NULL, NULL, SND_PITCH);
|
||||
}
|
||||
if(event==2) {
|
||||
insertkey(id, ID_SO, NULL, NULL, SND_PANNING);
|
||||
}
|
||||
if(event==3) {
|
||||
insertkey(id, ID_SO, NULL, NULL, SND_ATTEN);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
BIF_undo_push("Insert Key Buttons");
|
||||
|
||||
allqueue(REDRAWACTION, 0);
|
||||
allqueue(REDRAWNLA, 0);
|
||||
allqueue(REDRAWIPO, 0);
|
||||
allspace(REMAKEIPO, 0);
|
||||
|
||||
}
|
||||
else if(curarea->spacetype==SPACE_VIEW3D) {
|
||||
ob= OBACT;
|
||||
|
||||
if (ob && (ob->flag & OB_POSEMODE)) {
|
||||
strcpy(menustr, "Insert Key%t|Loc%x0|Rot%x1|Size%x2|LocRot%x3|LocRotSize%x4|Avail%x9");
|
||||
}
|
||||
else {
|
||||
base= FIRSTBASE;
|
||||
while(base) {
|
||||
if TESTBASELIB(base) break;
|
||||
base= base->next;
|
||||
}
|
||||
if(base==NULL) return;
|
||||
|
||||
strcpy(menustr, "Insert Key%t|Loc%x0|Rot%x1|Size%x2|LocRot%x3|LocRotSize%x4|Layer%x5|Avail%x9");
|
||||
}
|
||||
|
||||
if(ob) {
|
||||
if(ob->type==OB_MESH) strcat(menustr, "| %x6|Mesh%x7");
|
||||
else if(ob->type==OB_LATTICE) strcat(menustr, "| %x6|Lattice%x7");
|
||||
else if(ob->type==OB_CURVE) strcat(menustr, "| %x6|Curve%x7");
|
||||
else if(ob->type==OB_SURF) strcat(menustr, "| %x6|Surface%x7");
|
||||
if(ob->flag & OB_FROMGROUP) strcat(menustr, "| %x6|Entire Group%x10");
|
||||
}
|
||||
|
||||
event= pupmenu(menustr);
|
||||
if(event== -1) return;
|
||||
|
||||
if(event==7) { // ob != NULL
|
||||
insert_shapekey(ob);
|
||||
return;
|
||||
}
|
||||
|
||||
if(event==10) {
|
||||
Group *group= find_group(ob);
|
||||
if(group) {
|
||||
add_group_key(group);
|
||||
allqueue(REDRAWBUTSOBJECT, 0);
|
||||
}
|
||||
}
|
||||
|
||||
if (ob && (ob->flag & OB_POSEMODE)){
|
||||
bPoseChannel *pchan;
|
||||
|
||||
if (ob->action && ob->action->id.lib) {
|
||||
error ("Can't key libactions");
|
||||
return;
|
||||
}
|
||||
|
||||
set_pose_keys(ob); // sets pchan->flag to POSE_KEY if bone selected
|
||||
id= &ob->id;
|
||||
for (pchan=ob->pose->chanbase.first; pchan; pchan=pchan->next) {
|
||||
if (pchan->flag & POSE_KEY){
|
||||
if(event==0 || event==3 ||event==4) {
|
||||
insertkey(id, ID_PO, pchan->name, NULL, AC_LOC_X);
|
||||
insertkey(id, ID_PO, pchan->name, NULL, AC_LOC_Y);
|
||||
insertkey(id, ID_PO, pchan->name, NULL, AC_LOC_Z);
|
||||
}
|
||||
if(event==1 || event==3 ||event==4) {
|
||||
insertkey(id, ID_PO, pchan->name, NULL, AC_QUAT_X);
|
||||
insertkey(id, ID_PO, pchan->name, NULL, AC_QUAT_Y);
|
||||
insertkey(id, ID_PO, pchan->name, NULL, AC_QUAT_Z);
|
||||
insertkey(id, ID_PO, pchan->name, NULL, AC_QUAT_W);
|
||||
}
|
||||
if(event==2 || event==4) {
|
||||
insertkey(id, ID_PO, pchan->name, NULL, AC_SIZE_X);
|
||||
insertkey(id, ID_PO, pchan->name, NULL, AC_SIZE_Y);
|
||||
insertkey(id, ID_PO, pchan->name, NULL, AC_SIZE_Z);
|
||||
}
|
||||
if (event==9 && ob->action) {
|
||||
bActionChannel *achan;
|
||||
|
||||
for (achan = ob->action->chanbase.first; achan; achan=achan->next){
|
||||
if (achan->ipo && !strcmp (achan->name, pchan->name)){
|
||||
for (icu = achan->ipo->curve.first; icu; icu=icu->next){
|
||||
insertkey(id, ID_PO, achan->name, NULL, icu->adrcode);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
remake_action_ipos(ob->action);
|
||||
|
||||
DAG_object_flush_update(G.scene, ob, OB_RECALC_DATA);
|
||||
|
||||
allqueue(REDRAWIPO, 0);
|
||||
allqueue(REDRAWACTION, 0);
|
||||
allqueue(REDRAWNLA, 0);
|
||||
}
|
||||
else {
|
||||
base= FIRSTBASE;
|
||||
while(base) {
|
||||
if TESTBASELIB(base) {
|
||||
char *actname= NULL;
|
||||
|
||||
id= (ID *)(base->object);
|
||||
|
||||
if(ob->ipoflag & OB_ACTION_OB)
|
||||
actname= "Object";
|
||||
|
||||
/* all curves in ipo deselect */
|
||||
if(base->object->ipo) {
|
||||
icu= base->object->ipo->curve.first;
|
||||
while(icu) {
|
||||
icu->flag &= ~IPO_SELECT;
|
||||
if(event==9) insertkey(id, ID_OB, actname, NULL, icu->adrcode);
|
||||
icu= icu->next;
|
||||
}
|
||||
}
|
||||
|
||||
if(event==0 || event==3 ||event==4) {
|
||||
insertkey(id, ID_OB, actname, NULL, OB_LOC_X);
|
||||
insertkey(id, ID_OB, actname, NULL, OB_LOC_Y);
|
||||
insertkey(id, ID_OB, actname, NULL, OB_LOC_Z);
|
||||
}
|
||||
if(event==1 || event==3 ||event==4) {
|
||||
insertkey(id, ID_OB, actname, NULL, OB_ROT_X);
|
||||
insertkey(id, ID_OB, actname, NULL, OB_ROT_Y);
|
||||
insertkey(id, ID_OB, actname, NULL, OB_ROT_Z);
|
||||
}
|
||||
if(event==2 || event==4) {
|
||||
insertkey(id, ID_OB, actname, NULL, OB_SIZE_X);
|
||||
insertkey(id, ID_OB, actname, NULL, OB_SIZE_Y);
|
||||
insertkey(id, ID_OB, actname, NULL, OB_SIZE_Z);
|
||||
}
|
||||
if(event==5) {
|
||||
/* remove localview */
|
||||
tlay= base->object->lay;
|
||||
base->object->lay &= 0xFFFFFF;
|
||||
insertkey(id, ID_OB, actname, NULL, OB_LAY);
|
||||
base->object->lay= tlay;
|
||||
}
|
||||
}
|
||||
base= base->next;
|
||||
}
|
||||
}
|
||||
|
||||
if(event==0) BIF_undo_push("Insert Loc Key");
|
||||
else if(event==1) BIF_undo_push("Insert Rot Key");
|
||||
else if(event==2) BIF_undo_push("Insert Size Key");
|
||||
else if(event==3) BIF_undo_push("Insert LocRot Key");
|
||||
else if(event==4) BIF_undo_push("Insert LocRotSize Key");
|
||||
else if(event==5) BIF_undo_push("Insert Layer Key");
|
||||
else if(event==7) BIF_undo_push("Insert Vertex Key");
|
||||
else if(event==9) BIF_undo_push("Insert Avail Key");
|
||||
|
||||
allspace(REMAKEIPO, 0);
|
||||
allqueue(REDRAWIPO, 0);
|
||||
allqueue(REDRAWVIEW3D, 0);
|
||||
allqueue(REDRAWACTION, 0);
|
||||
allqueue(REDRAWNLA, 0);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/* ****************************************************************************** */
|
||||
|
||||
void add_duplicate_editipo(void)
|
||||
{
|
||||
Object *ob;
|
||||
@@ -2182,7 +2473,7 @@ void add_duplicate_editipo(void)
|
||||
|
||||
ei= G.sipo->editipo;
|
||||
for(a=0; a<G.sipo->totipo; a++, ei++) {
|
||||
if ISPOIN3(ei, flag & IPO_VISIBLE, icu, icu->bezt) {
|
||||
if (ISPOIN3(ei, flag & IPO_VISIBLE, icu, icu->bezt)) {
|
||||
if(G.sipo->showkey || (ei->flag & IPO_EDIT)) {
|
||||
icu= ei->icu;
|
||||
|
||||
@@ -2240,7 +2531,7 @@ void remove_doubles_ipo(void)
|
||||
|
||||
ei= G.sipo->editipo;
|
||||
for(a=0; a<G.sipo->totipo; a++, ei++) {
|
||||
if ISPOIN3(ei, flag & IPO_VISIBLE, icu, icu->bezt) {
|
||||
if (ISPOIN3(ei, flag & IPO_VISIBLE, icu, icu->bezt)) {
|
||||
|
||||
/* OR the curve is selected OR in editmode OR in keymode */
|
||||
mode= 0;
|
||||
@@ -2353,7 +2644,7 @@ void join_ipo(int mode)
|
||||
/* first: multiple selected verts in 1 curve */
|
||||
ei= G.sipo->editipo;
|
||||
for(a=0; a<G.sipo->totipo; a++, ei++) {
|
||||
if ISPOIN3(ei, flag & IPO_VISIBLE, icu, icu->bezt) {
|
||||
if (ISPOIN3(ei, flag & IPO_VISIBLE, icu, icu->bezt)) {
|
||||
if(G.sipo->showkey || (ei->flag & IPO_EDIT)) {
|
||||
icu= ei->icu;
|
||||
|
||||
@@ -2479,7 +2770,7 @@ void ipo_snap(short event)
|
||||
|
||||
ei= G.sipo->editipo;
|
||||
for(b=0; b<G.sipo->totipo; b++, ei++) {
|
||||
if ISPOIN3(ei, flag & IPO_VISIBLE, icu, icu->bezt) {
|
||||
if (ISPOIN3(ei, flag & IPO_VISIBLE, icu, icu->bezt)) {
|
||||
|
||||
ok2= 0;
|
||||
if(G.sipo->showkey) ok2= 1;
|
||||
@@ -2546,717 +2837,8 @@ void ipo_snap(short event)
|
||||
BIF_undo_push("Snap Ipo");
|
||||
}
|
||||
|
||||
|
||||
|
||||
void mouse_select_ipo(void)
|
||||
{
|
||||
Object *ob;
|
||||
Key *key;
|
||||
KeyBlock *kb, *actkb=NULL, *curkb;
|
||||
EditIpo *ei, *actei= 0;
|
||||
IpoCurve *icu;
|
||||
IpoKey *ik, *actik;
|
||||
BezTriple *bezt;
|
||||
float x, y, dist, mindist;
|
||||
int a, oldflag = 0, hand, ok;
|
||||
short mval[2], xo, yo;
|
||||
|
||||
if(G.sipo->editipo==0) return;
|
||||
|
||||
get_status_editipo();
|
||||
|
||||
if(G.sipo->showkey) {
|
||||
getmouseco_areawin(mval);
|
||||
|
||||
areamouseco_to_ipoco(G.v2d, mval, &x, &y);
|
||||
actik= 0;
|
||||
mindist= 1000.0;
|
||||
ik= G.sipo->ipokey.first;
|
||||
while(ik) {
|
||||
dist= (float)(fabs(ik->val-x));
|
||||
if(ik->flag & 1) dist+= 1.0;
|
||||
if(dist < mindist) {
|
||||
actik= ik;
|
||||
mindist= dist;
|
||||
}
|
||||
ik= ik->next;
|
||||
}
|
||||
if(actik) {
|
||||
oldflag= actik->flag;
|
||||
|
||||
if(G.qual & LR_SHIFTKEY);
|
||||
else deselectall_editipo();
|
||||
|
||||
if(G.qual & LR_SHIFTKEY) {
|
||||
if(oldflag & 1) actik->flag &= ~1;
|
||||
else actik->flag |= 1;
|
||||
}
|
||||
else {
|
||||
actik->flag |= 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
else if(totipo_edit) {
|
||||
|
||||
hand= findnearest_ipovert(&icu, &bezt);
|
||||
|
||||
if(G.qual & LR_SHIFTKEY) {
|
||||
if(bezt) {
|
||||
if(hand==1) {
|
||||
if(BEZSELECTED(bezt)) {
|
||||
bezt->f1= bezt->f2= bezt->f3= 0;
|
||||
}
|
||||
else {
|
||||
bezt->f1= bezt->f2= bezt->f3= 1;
|
||||
}
|
||||
}
|
||||
else if(hand==0) {
|
||||
if(bezt->f1 & 1) bezt->f1= 0;
|
||||
else bezt->f1= 1;
|
||||
}
|
||||
else {
|
||||
if(bezt->f3 & 1) bezt->f3= 0;
|
||||
else bezt->f3= 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
deselectall_editipo();
|
||||
|
||||
if(bezt) {
|
||||
if(hand==1) {
|
||||
bezt->f1|= 1; bezt->f2|= 1; bezt->f3|= 1;
|
||||
}
|
||||
else if(hand==0) bezt->f1|= 1;
|
||||
else bezt->f3|= 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
|
||||
/* vertex keys ? */
|
||||
if(G.sipo->blocktype==ID_KE && G.sipo->from) {
|
||||
int i, index= 1;
|
||||
|
||||
key= (Key *)G.sipo->from;
|
||||
ob= OBACT;
|
||||
curkb= BLI_findlink(&key->block, ob->shapenr-1);
|
||||
|
||||
ei= G.sipo->editipo;
|
||||
if(key->type==KEY_NORMAL || (ei->flag & IPO_VISIBLE)) {
|
||||
getmouseco_areawin(mval);
|
||||
|
||||
areamouseco_to_ipoco(G.v2d, mval, &x, &y);
|
||||
/* how much is 20 pixels? */
|
||||
mindist= (float)(20.0*(G.v2d->cur.ymax-G.v2d->cur.ymin)/(float)curarea->winy);
|
||||
|
||||
for(i=1, kb= key->block.first; kb; kb= kb->next, i++) {
|
||||
dist= (float)(fabs(kb->pos-y));
|
||||
if(kb==curkb) dist+= (float)0.01;
|
||||
if(dist < mindist) {
|
||||
actkb= kb;
|
||||
mindist= dist;
|
||||
index= i;
|
||||
}
|
||||
}
|
||||
if(actkb) {
|
||||
ok= TRUE;
|
||||
if(G.obedit && actkb!=curkb) {
|
||||
ok= okee("Copy key after leaving Edit Mode");
|
||||
}
|
||||
if(ok) {
|
||||
/* also does all keypos */
|
||||
deselectall_editipo();
|
||||
set_active_key(index);
|
||||
set_active_editipo(ei+index-1);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* select curve */
|
||||
if(actkb==NULL) {
|
||||
if(totipo_vis==1) {
|
||||
ei= G.sipo->editipo;
|
||||
for(a=0; a<G.sipo->totipo; a++, ei++) {
|
||||
if(ei->icu) {
|
||||
if(ei->flag & IPO_VISIBLE) actei= ei;
|
||||
}
|
||||
}
|
||||
}
|
||||
else if(totipo_vis>1) {
|
||||
actei= select_proj_ipo(0, 0);
|
||||
}
|
||||
|
||||
if(actei) oldflag= actei->flag;
|
||||
|
||||
if(G.qual & LR_SHIFTKEY);
|
||||
else deselectall_editipo();
|
||||
|
||||
if(actei) {
|
||||
if(G.qual & LR_SHIFTKEY) {
|
||||
if(oldflag & IPO_SELECT) actei->flag &= ~IPO_SELECT;
|
||||
else actei->flag |= IPO_SELECT;
|
||||
}
|
||||
else {
|
||||
actei->flag |= IPO_SELECT;
|
||||
}
|
||||
set_active_editipo(actei);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
update_editipo_flags();
|
||||
|
||||
force_draw(0);
|
||||
BIF_undo_push("Select Ipo");
|
||||
|
||||
if(G.sipo->showkey && G.sipo->blocktype==ID_OB) {
|
||||
ob= OBACT;
|
||||
if(ob && (ob->ipoflag & OB_DRAWKEY)) allqueue(REDRAWVIEW3D, 0);
|
||||
}
|
||||
|
||||
getmouseco_areawin(mval);
|
||||
xo= mval[0];
|
||||
yo= mval[1];
|
||||
|
||||
while(get_mbut()&R_MOUSE) {
|
||||
getmouseco_areawin(mval);
|
||||
if(abs(mval[0]-xo)+abs(mval[1]-yo) > 4) {
|
||||
|
||||
if(actkb) move_keys(OBACT);
|
||||
else transform_ipo('g');
|
||||
|
||||
return;
|
||||
}
|
||||
BIF_wait_for_statechange();
|
||||
}
|
||||
}
|
||||
|
||||
static int icu_keys_bezier_loop(IpoCurve *icu,
|
||||
int (*bezier_function)(BezTriple *),
|
||||
void (ipocurve_function)(struct IpoCurve *icu))
|
||||
{
|
||||
/* This loops through the beziers in the Ipocurve, and executes
|
||||
* the generic user provided 'bezier_function' on each one.
|
||||
* Optionally executes the generic function ipocurve_function on the
|
||||
* IPO curve after looping (eg. calchandles_ipocurve)
|
||||
*/
|
||||
|
||||
int b;
|
||||
BezTriple *bezt;
|
||||
|
||||
b = icu->totvert;
|
||||
bezt = icu->bezt;
|
||||
|
||||
/* if bezier_function has been specified
|
||||
* then loop through each bezier executing
|
||||
* it.
|
||||
*/
|
||||
|
||||
if (bezier_function != NULL) {
|
||||
while(b--) {
|
||||
/* exit with return code 1 if the bezier function
|
||||
* returns 1 (good for when you are only interested
|
||||
* in finding the first bezier that
|
||||
* satisfies a condition).
|
||||
*/
|
||||
if (bezier_function(bezt)) return 1;
|
||||
bezt++;
|
||||
}
|
||||
}
|
||||
|
||||
/* if ipocurve_function has been specified
|
||||
* then execute it
|
||||
*/
|
||||
if (ipocurve_function != NULL)
|
||||
ipocurve_function(icu);
|
||||
|
||||
return 0;
|
||||
|
||||
}
|
||||
|
||||
static int ipo_keys_bezier_loop(Ipo *ipo,
|
||||
int (*bezier_function)(BezTriple *),
|
||||
void (ipocurve_function)(struct IpoCurve *icu))
|
||||
{
|
||||
/* This loops through the beziers that are attached to
|
||||
* the selected keys on the Ipocurves of the Ipo, and executes
|
||||
* the generic user provided 'bezier_function' on each one.
|
||||
* Optionally executes the generic function ipocurve_function on a
|
||||
* IPO curve after looping (eg. calchandles_ipocurve)
|
||||
*/
|
||||
|
||||
IpoCurve *icu;
|
||||
|
||||
/* Loop through each curve in the Ipo
|
||||
*/
|
||||
for (icu=ipo->curve.first; icu; icu=icu->next){
|
||||
if (icu_keys_bezier_loop(icu,bezier_function, ipocurve_function))
|
||||
return 1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int selected_bezier_loop(int (*looptest)(EditIpo *),
|
||||
int (*bezier_function)(BezTriple *),
|
||||
void (ipocurve_function)(struct IpoCurve *icu))
|
||||
{
|
||||
/* This loops through the beziers that are attached to
|
||||
* selected keys in editmode in the IPO window, and executes
|
||||
* the generic user-provided 'bezier_function' on each one
|
||||
* that satisfies the 'looptest' function. Optionally executes
|
||||
* the generic function ipocurve_function on a IPO curve
|
||||
* after looping (eg. calchandles_ipocurve)
|
||||
*/
|
||||
|
||||
EditIpo *ei;
|
||||
BezTriple *bezt;
|
||||
int a, b;
|
||||
|
||||
/* Get the first Edit Ipo from the selected Ipos
|
||||
*/
|
||||
ei= G.sipo->editipo;
|
||||
|
||||
/* Loop throught all of the selected Ipo's
|
||||
*/
|
||||
for(a=0; a<G.sipo->totipo; a++, ei++) {
|
||||
/* Do a user provided test on the Edit Ipo
|
||||
* to determine whether we want to process it
|
||||
*/
|
||||
if (looptest(ei)) {
|
||||
/* Loop through the selected
|
||||
* beziers on the Edit Ipo
|
||||
*/
|
||||
bezt = ei->icu->bezt;
|
||||
b = ei->icu->totvert;
|
||||
|
||||
/* if bezier_function has been specified
|
||||
* then loop through each bezier executing
|
||||
* it.
|
||||
*/
|
||||
if (bezier_function != NULL) {
|
||||
while(b--) {
|
||||
/* exit with return code 1 if the bezier function
|
||||
* returns 1 (good for when you are only interested
|
||||
* in finding the first bezier that
|
||||
* satisfies a condition).
|
||||
*/
|
||||
if (bezier_function(bezt)) return 1;
|
||||
bezt++;
|
||||
}
|
||||
}
|
||||
|
||||
/* if ipocurve_function has been specified
|
||||
* then execute it
|
||||
*/
|
||||
if (ipocurve_function != NULL)
|
||||
ipocurve_function(ei->icu);
|
||||
}
|
||||
/* nufte flourdje zim ploopydu <-- random dutch looking comment ;) */
|
||||
/* looks more like russian to me! (ton) */
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int select_bezier_add(BezTriple *bezt)
|
||||
{
|
||||
/* Select the bezier triple */
|
||||
bezt->f1 |= 1;
|
||||
bezt->f2 |= 1;
|
||||
bezt->f3 |= 1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
int select_bezier_subtract(BezTriple *bezt)
|
||||
{
|
||||
/* Deselect the bezier triple */
|
||||
bezt->f1 &= ~1;
|
||||
bezt->f2 &= ~1;
|
||||
bezt->f3 &= ~1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
int select_bezier_invert(BezTriple *bezt)
|
||||
{
|
||||
/* Invert the selection for the bezier triple */
|
||||
bezt->f2 ^= 1;
|
||||
if ( bezt->f2 & 1 ) {
|
||||
bezt->f1 |= 1;
|
||||
bezt->f3 |= 1;
|
||||
}
|
||||
else {
|
||||
bezt->f1 &= ~1;
|
||||
bezt->f3 &= ~1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int set_bezier_auto(BezTriple *bezt)
|
||||
{
|
||||
/* Sets the selected bezier handles to type 'auto'
|
||||
*/
|
||||
|
||||
/* is a handle selected? If so
|
||||
* set it to type auto
|
||||
*/
|
||||
if(bezt->f1 || bezt->f3) {
|
||||
if(bezt->f1) bezt->h1= 1; /* the secret code for auto */
|
||||
if(bezt->f3) bezt->h2= 1;
|
||||
|
||||
/* if the handles are not of the same type, set them
|
||||
* to type free
|
||||
*/
|
||||
if(bezt->h1!=bezt->h2) {
|
||||
if ELEM(bezt->h1, HD_ALIGN, HD_AUTO) bezt->h1= HD_FREE;
|
||||
if ELEM(bezt->h2, HD_ALIGN, HD_AUTO) bezt->h2= HD_FREE;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int set_bezier_vector(BezTriple *bezt)
|
||||
{
|
||||
/* Sets the selected bezier handles to type 'vector'
|
||||
*/
|
||||
|
||||
/* is a handle selected? If so
|
||||
* set it to type vector
|
||||
*/
|
||||
if(bezt->f1 || bezt->f3) {
|
||||
if(bezt->f1) bezt->h1= 2; /* the code for vector */
|
||||
if(bezt->f3) bezt->h2= 2;
|
||||
|
||||
/* if the handles are not of the same type, set them
|
||||
* to type free
|
||||
*/
|
||||
if(bezt->h1!=bezt->h2) {
|
||||
if ELEM(bezt->h1, HD_ALIGN, HD_AUTO) bezt->h1= HD_FREE;
|
||||
if ELEM(bezt->h2, HD_ALIGN, HD_AUTO) bezt->h2= HD_FREE;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int bezier_isfree(BezTriple *bezt)
|
||||
{
|
||||
/* queries whether the handle should be set
|
||||
* to type 'free' (I think)
|
||||
*/
|
||||
if(bezt->f1 && bezt->h1) return 1;
|
||||
if(bezt->f3 && bezt->h2) return 1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int set_bezier_free(BezTriple *bezt)
|
||||
{
|
||||
/* Sets selected bezier handles to type 'free'
|
||||
*/
|
||||
if(bezt->f1) bezt->h1= HD_FREE;
|
||||
if(bezt->f3) bezt->h2= HD_FREE;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int set_bezier_align(BezTriple *bezt)
|
||||
{
|
||||
/* Sets selected bezier handles to type 'align'
|
||||
*/
|
||||
if(bezt->f1) bezt->h1= HD_ALIGN;
|
||||
if(bezt->f3) bezt->h2= HD_ALIGN;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int vis_edit_icu_bez(EditIpo *ei)
|
||||
{
|
||||
/* A 4 part test for an EditIpo :
|
||||
* is it a) visible
|
||||
* b) in edit mode
|
||||
* c) does it contain an Ipo Curve
|
||||
* d) does that ipo curve have a bezier
|
||||
*
|
||||
* (The reason why I don't just use the macro
|
||||
* is I need a pointer to a function.)
|
||||
*/
|
||||
return ISPOIN4(ei, flag & IPO_VISIBLE, flag & IPO_EDIT, icu, icu->bezt);
|
||||
}
|
||||
|
||||
void select_ipo_bezier_keys(Ipo *ipo, int selectmode)
|
||||
{
|
||||
/* Select all of the beziers in all
|
||||
* of the Ipo curves belonging to the
|
||||
* Ipo, using the selection mode.
|
||||
*/
|
||||
switch (selectmode) {
|
||||
case SELECT_ADD:
|
||||
ipo_keys_bezier_loop(ipo, select_bezier_add, NULL);
|
||||
break;
|
||||
case SELECT_SUBTRACT:
|
||||
ipo_keys_bezier_loop(ipo, select_bezier_subtract, NULL);
|
||||
break;
|
||||
case SELECT_INVERT:
|
||||
ipo_keys_bezier_loop(ipo, select_bezier_invert, NULL);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void sethandles_ipo_keys(Ipo *ipo, int code)
|
||||
{
|
||||
/* this function lets you set bezier handles all to
|
||||
* one type for some Ipo's (e.g. with hotkeys through
|
||||
* the action window).
|
||||
*/
|
||||
|
||||
/* code==1: set autohandle */
|
||||
/* code==2: set vectorhandle */
|
||||
/* als code==3 (HD_ALIGN) toggelt het, vectorhandles worden HD_FREE */
|
||||
|
||||
switch(code) {
|
||||
case 1:
|
||||
/*** Set to auto ***/
|
||||
ipo_keys_bezier_loop(ipo, set_bezier_auto,
|
||||
calchandles_ipocurve);
|
||||
break;
|
||||
case 2:
|
||||
/*** Set to vector ***/
|
||||
ipo_keys_bezier_loop(ipo, set_bezier_vector,
|
||||
calchandles_ipocurve);
|
||||
break;
|
||||
default:
|
||||
if ( ipo_keys_bezier_loop(ipo, bezier_isfree, NULL) ) {
|
||||
/*** Set to free ***/
|
||||
ipo_keys_bezier_loop(ipo, set_bezier_free,
|
||||
calchandles_ipocurve);
|
||||
}
|
||||
else {
|
||||
/*** Set to align ***/
|
||||
ipo_keys_bezier_loop(ipo, set_bezier_align,
|
||||
calchandles_ipocurve);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
static void ipo_curves_auto_horiz(void)
|
||||
{
|
||||
EditIpo *ei;
|
||||
int a, set= 1;
|
||||
|
||||
ei= G.sipo->editipo;
|
||||
for(a=0; a<G.sipo->totipo; a++, ei++) {
|
||||
if ISPOIN3(ei, flag & IPO_VISIBLE, flag & IPO_SELECT, icu)
|
||||
if(ei->flag & IPO_AUTO_HORIZ) set= 0;
|
||||
}
|
||||
|
||||
ei= G.sipo->editipo;
|
||||
for(a=0; a<G.sipo->totipo; a++, ei++) {
|
||||
if ISPOIN3(ei, flag & IPO_VISIBLE, flag & IPO_SELECT, icu) {
|
||||
if(set) ei->flag |= IPO_AUTO_HORIZ;
|
||||
else ei->flag &= ~IPO_AUTO_HORIZ;
|
||||
}
|
||||
}
|
||||
update_editipo_flags();
|
||||
}
|
||||
|
||||
void sethandles_ipo(int code)
|
||||
{
|
||||
/* this function lets you set bezier handles all to
|
||||
* one type for some selected keys in edit mode in the
|
||||
* IPO window (e.g. with hotkeys)
|
||||
*/
|
||||
|
||||
/* code==1: set autohandle */
|
||||
/* code==2: set vectorhandle */
|
||||
/* als code==3 (HD_ALIGN) toggelt het, vectorhandles worden HD_FREE */
|
||||
|
||||
if(G.sipo->ipo && G.sipo->ipo->id.lib) return;
|
||||
|
||||
switch(code) {
|
||||
case 1:
|
||||
/*** Set to auto ***/
|
||||
selected_bezier_loop(vis_edit_icu_bez, set_bezier_auto,
|
||||
calchandles_ipocurve);
|
||||
break;
|
||||
case 2:
|
||||
/*** Set to vector ***/
|
||||
selected_bezier_loop(vis_edit_icu_bez, set_bezier_vector,
|
||||
calchandles_ipocurve);
|
||||
break;
|
||||
case 4:
|
||||
/* set to enforce autohandles to be horizontal on extremes */
|
||||
ipo_curves_auto_horiz();
|
||||
|
||||
break;
|
||||
default:
|
||||
if (selected_bezier_loop(vis_edit_icu_bez, bezier_isfree, NULL) ) {
|
||||
/*** Set to free ***/
|
||||
selected_bezier_loop(vis_edit_icu_bez, set_bezier_free,
|
||||
calchandles_ipocurve);
|
||||
}
|
||||
else {
|
||||
/*** Set to align ***/
|
||||
selected_bezier_loop(vis_edit_icu_bez, set_bezier_align,
|
||||
calchandles_ipocurve);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
editipo_changed(G.sipo, 1);
|
||||
BIF_undo_push("Set handles Ipo");
|
||||
}
|
||||
|
||||
|
||||
static void set_ipocurve_constant(struct IpoCurve *icu) {
|
||||
/* Sets the type of the IPO curve to constant
|
||||
*/
|
||||
icu->ipo= IPO_CONST;
|
||||
}
|
||||
|
||||
static void set_ipocurve_linear(struct IpoCurve *icu) {
|
||||
/* Sets the type of the IPO curve to linear
|
||||
*/
|
||||
icu->ipo= IPO_LIN;
|
||||
}
|
||||
|
||||
static void set_ipocurve_bezier(struct IpoCurve *icu) {
|
||||
/* Sets the type of the IPO curve to bezier
|
||||
*/
|
||||
icu->ipo= IPO_BEZ;
|
||||
}
|
||||
|
||||
|
||||
void setipotype_ipo(Ipo *ipo, int code)
|
||||
{
|
||||
/* Sets the type of the each ipo curve in the
|
||||
* Ipo to a value based on the code
|
||||
*/
|
||||
switch (code) {
|
||||
case 1:
|
||||
ipo_keys_bezier_loop(ipo, NULL, set_ipocurve_constant);
|
||||
break;
|
||||
case 2:
|
||||
ipo_keys_bezier_loop(ipo, NULL, set_ipocurve_linear);
|
||||
break;
|
||||
case 3:
|
||||
ipo_keys_bezier_loop(ipo, NULL, set_ipocurve_bezier);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void set_ipotype(void)
|
||||
{
|
||||
EditIpo *ei;
|
||||
int a;
|
||||
short event;
|
||||
|
||||
if(G.sipo->ipo && G.sipo->ipo->id.lib) return;
|
||||
if(G.sipo->showkey) return;
|
||||
get_status_editipo();
|
||||
|
||||
if(G.sipo->blocktype==ID_KE && totipo_edit==0 && totipo_sel==0) {
|
||||
Key *key= (Key *)G.sipo->from;
|
||||
Object *ob= OBACT;
|
||||
KeyBlock *kb;
|
||||
|
||||
if(key==NULL) return;
|
||||
kb= BLI_findlink(&key->block, ob->shapenr-1);
|
||||
|
||||
event= pupmenu("Key Type %t|Linear %x1|Cardinal %x2|B Spline %x3");
|
||||
if(event < 1) return;
|
||||
|
||||
kb->type= 0;
|
||||
if(event==1) kb->type= KEY_LINEAR;
|
||||
if(event==2) kb->type= KEY_CARDINAL;
|
||||
if(event==3) kb->type= KEY_BSPLINE;
|
||||
}
|
||||
else {
|
||||
event= pupmenu("Ipo Type %t|Constant %x1|Linear %x2|Bezier %x3");
|
||||
if(event < 1) return;
|
||||
|
||||
ei= G.sipo->editipo;
|
||||
for(a=0; a<G.sipo->totipo; a++, ei++) {
|
||||
if ISPOIN3(ei, flag & IPO_VISIBLE, flag & IPO_SELECT, icu) {
|
||||
if(event==1) ei->icu->ipo= IPO_CONST;
|
||||
else if(event==2) ei->icu->ipo= IPO_LIN;
|
||||
else ei->icu->ipo= IPO_BEZ;
|
||||
}
|
||||
}
|
||||
}
|
||||
BIF_undo_push("Set ipo type");
|
||||
scrarea_queue_winredraw(curarea);
|
||||
}
|
||||
|
||||
void borderselect_ipo(void)
|
||||
{
|
||||
EditIpo *ei;
|
||||
IpoKey *ik;
|
||||
BezTriple *bezt;
|
||||
rcti rect;
|
||||
rctf rectf;
|
||||
int a, b, val;
|
||||
short mval[2];
|
||||
|
||||
get_status_editipo();
|
||||
|
||||
val= get_border(&rect, 3);
|
||||
|
||||
if(val) {
|
||||
mval[0]= rect.xmin;
|
||||
mval[1]= rect.ymin;
|
||||
areamouseco_to_ipoco(G.v2d, mval, &rectf.xmin, &rectf.ymin);
|
||||
mval[0]= rect.xmax;
|
||||
mval[1]= rect.ymax;
|
||||
areamouseco_to_ipoco(G.v2d, mval, &rectf.xmax, &rectf.ymax);
|
||||
|
||||
if(G.sipo->showkey) {
|
||||
ik= G.sipo->ipokey.first;
|
||||
while(ik) {
|
||||
if(rectf.xmin<ik->val && rectf.xmax>ik->val) {
|
||||
if(val==LEFTMOUSE) ik->flag |= 1;
|
||||
else ik->flag &= ~1;
|
||||
}
|
||||
ik= ik->next;
|
||||
}
|
||||
update_editipo_flags();
|
||||
}
|
||||
else if(totipo_edit==0) {
|
||||
if(rect.xmin<rect.xmax && rect.ymin<rect.ymax)
|
||||
select_proj_ipo(&rectf, val);
|
||||
}
|
||||
else {
|
||||
|
||||
ei= G.sipo->editipo;
|
||||
for(a=0; a<G.sipo->totipo; a++, ei++) {
|
||||
if ISPOIN3(ei, flag & IPO_VISIBLE, flag & IPO_EDIT, icu) {
|
||||
if(ei->icu->bezt) {
|
||||
b= ei->icu->totvert;
|
||||
bezt= ei->icu->bezt;
|
||||
while(b--) {
|
||||
int bit= (val==LEFTMOUSE);
|
||||
|
||||
if(BLI_in_rctf(&rectf, bezt->vec[0][0], bezt->vec[0][1]))
|
||||
bezt->f1 = (bezt->f1&~1) | bit;
|
||||
if(BLI_in_rctf(&rectf, bezt->vec[1][0], bezt->vec[1][1]))
|
||||
bezt->f2 = (bezt->f2&~1) | bit;
|
||||
if(BLI_in_rctf(&rectf, bezt->vec[2][0], bezt->vec[2][1]))
|
||||
bezt->f3 = (bezt->f3&~1) | bit;
|
||||
|
||||
bezt++;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
BIF_undo_push("Border select Ipo");
|
||||
scrarea_queue_winredraw(curarea);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* When deleting an IPO curve from Python, check if the IPO is being
|
||||
* When deleting an IPO curve from Python, check if the Ipo is being
|
||||
* edited and if so clear the pointer to the old curve.
|
||||
*/
|
||||
|
||||
@@ -3269,7 +2851,7 @@ void del_ipoCurve ( IpoCurve * icu )
|
||||
for(i=0; i<G.sipo->totipo; i++, ei++) {
|
||||
if ( ei->icu == icu ) {
|
||||
ei->flag &= ~(IPO_SELECT | IPO_EDIT);
|
||||
ei->icu= 0;
|
||||
ei->icu= NULL;
|
||||
return;
|
||||
}
|
||||
}
|
||||
@@ -3300,12 +2882,12 @@ void del_ipo(void)
|
||||
del= 0;
|
||||
|
||||
if(G.sipo->showkey==0 && totipo_edit==0) {
|
||||
if ISPOIN3(ei, flag & IPO_VISIBLE, flag & IPO_SELECT, icu) {
|
||||
if (ISPOIN3(ei, flag & IPO_VISIBLE, flag & IPO_SELECT, icu)) {
|
||||
del= 1;
|
||||
}
|
||||
}
|
||||
else {
|
||||
if ISPOIN(ei, flag & IPO_VISIBLE, icu) {
|
||||
if (ISPOIN(ei, flag & IPO_VISIBLE, icu)) {
|
||||
if(G.sipo->showkey || (ei->flag & IPO_EDIT)) {
|
||||
if(ei->icu->bezt) {
|
||||
bezt= ei->icu->bezt;
|
||||
@@ -3346,7 +2928,7 @@ void del_ipo(void)
|
||||
// 2nd round, small parts: just curves
|
||||
ei= G.sipo->editipo;
|
||||
for(b=0; b<G.sipo->totipo; b++, ei++) {
|
||||
if ISPOIN(ei, flag & IPO_VISIBLE, icu) {
|
||||
if (ISPOIN(ei, flag & IPO_VISIBLE, icu)) {
|
||||
if(G.sipo->showkey || (ei->flag & IPO_EDIT)) {
|
||||
|
||||
event= 0;
|
||||
@@ -3389,6 +2971,7 @@ void del_ipo(void)
|
||||
allspace(REMAKEIPO, 0);
|
||||
}
|
||||
|
||||
/* ******************** copy paste buffer ******************** */
|
||||
ListBase ipocopybuf={0, 0};
|
||||
int totipocopybuf=0;
|
||||
|
||||
@@ -3418,7 +3001,7 @@ void copy_editipo(void)
|
||||
|
||||
ei= G.sipo->editipo;
|
||||
for(a=0; a<G.sipo->totipo; a++, ei++) {
|
||||
if ISPOIN(ei, flag & IPO_VISIBLE, icu) {
|
||||
if (ISPOIN(ei, flag & IPO_VISIBLE, icu)) {
|
||||
if( (ei->flag & IPO_EDIT) || (ei->flag & IPO_SELECT) ) {
|
||||
icu= MEM_callocN(sizeof(IpoCurve), "ipocopybuf");
|
||||
*icu= *(ei->icu);
|
||||
@@ -3470,7 +3053,7 @@ void paste_editipo(void)
|
||||
|
||||
if(ok) {
|
||||
|
||||
ei->icu= get_ipocurve(G.sipo->from, G.sipo->blocktype, ei->adrcode, 0);
|
||||
ei->icu= verify_ipocurve(G.sipo->from, G.sipo->blocktype, G.sipo->actname, G.sipo->constname, ei->adrcode);
|
||||
if(ei->icu==NULL) return;
|
||||
|
||||
if(ei->icu->bezt) MEM_freeN(ei->icu->bezt);
|
||||
@@ -3498,28 +3081,10 @@ void paste_editipo(void)
|
||||
}
|
||||
}
|
||||
|
||||
void set_exprap_ipo(int mode)
|
||||
{
|
||||
EditIpo *ei;
|
||||
int a;
|
||||
|
||||
if(G.sipo->ipo && G.sipo->ipo->id.lib) return;
|
||||
/* in case of keys: always ok */
|
||||
/* *********************** */
|
||||
|
||||
ei= G.sipo->editipo;
|
||||
for(a=0; a<G.sipo->totipo; a++, ei++) {
|
||||
if ISPOIN(ei, flag & IPO_VISIBLE, icu) {
|
||||
if( (ei->flag & IPO_EDIT) || (ei->flag & IPO_SELECT) || (G.sipo->showkey) ) {
|
||||
ei->icu->extrap= mode;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
editipo_changed(G.sipo, 1);
|
||||
BIF_undo_push("Set extrapolation Ipo");
|
||||
}
|
||||
|
||||
int find_other_handles(EditIpo *eicur, float ctime, BezTriple **beztar)
|
||||
static int find_other_handles(EditIpo *eicur, float ctime, BezTriple **beztar)
|
||||
{
|
||||
EditIpo *ei;
|
||||
BezTriple *bezt;
|
||||
@@ -3559,7 +3124,7 @@ void set_speed_editipo(float speed)
|
||||
|
||||
ei= G.sipo->editipo;
|
||||
for(a=0; a<G.sipo->totipo; a++, ei++) {
|
||||
if ISPOIN(ei, flag & IPO_VISIBLE, icu) {
|
||||
if (ISPOIN(ei, flag & IPO_VISIBLE, icu)) {
|
||||
bezt= ei->icu->bezt;
|
||||
totvert= ei->icu->totvert;
|
||||
|
||||
@@ -3619,587 +3184,6 @@ void set_speed_editipo(float speed)
|
||||
}
|
||||
|
||||
|
||||
void insertkey(ID *id, int adrcode)
|
||||
{
|
||||
IpoCurve *icu;
|
||||
Ipo *ipo;
|
||||
Object *ob;
|
||||
void *poin;
|
||||
float curval, cfra;
|
||||
int type;
|
||||
|
||||
if(id) {
|
||||
|
||||
// this call here, otherwise get_ipocurve gives it from the pinned ipo
|
||||
ipo= get_ipo(id, GS(id->name), 1); // 1=make
|
||||
|
||||
icu= get_ipocurve(id, GS(id->name), adrcode, ipo);
|
||||
|
||||
if(icu) {
|
||||
poin= get_ipo_poin(id, icu, &type);
|
||||
if(poin) {
|
||||
curval= read_ipo_poin(poin, type);
|
||||
|
||||
cfra= frame_to_float(CFRA);
|
||||
|
||||
if( GS(id->name)==ID_OB ) {
|
||||
ob= (Object *)id;
|
||||
if(ob->sf!=0.0 && (ob->ipoflag & OB_OFFS_OB) ) {
|
||||
/* actually frametofloat calc again! */
|
||||
cfra-= ob->sf*G.scene->r.framelen;
|
||||
}
|
||||
}
|
||||
|
||||
insert_vert_ipo(icu, cfra, curval);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void insertkey_editipo(void)
|
||||
{
|
||||
EditIpo *ei;
|
||||
IpoKey *ik;
|
||||
ID *id;
|
||||
float *fp, cfra, *insertvals;
|
||||
int a, nr, ok, tot;
|
||||
short event;
|
||||
|
||||
ei= get_active_editipo();
|
||||
if(ei && ei->icu && ei->icu->driver)
|
||||
event= pupmenu("Insert Curve %t|Default one-to-one mapping %x3");
|
||||
else if(G.sipo->showkey)
|
||||
event= pupmenu("Insert Key Vertices %t|Current Frame %x1|Selected Keys %x2");
|
||||
else
|
||||
event= pupmenu("Insert Key Vertices %t|Current Frame %x1");
|
||||
|
||||
if(event<1) return;
|
||||
|
||||
if(event==3) {
|
||||
IpoDriver *driver= ei->icu->driver;
|
||||
|
||||
if(ei->icu->bezt) MEM_freeN(ei->icu->bezt);
|
||||
ei->icu->totvert= 0;
|
||||
ei->icu->bezt= NULL;
|
||||
|
||||
insert_vert_ipo(ei->icu, 0.0f, 0.0f);
|
||||
|
||||
if(ELEM3(driver->adrcode, OB_ROT_X, OB_ROT_Y, OB_ROT_Z)) {
|
||||
if(ei->disptype==IPO_DISPDEGR)
|
||||
insert_vert_ipo(ei->icu, 18.0f, 18.0f);
|
||||
else
|
||||
insert_vert_ipo(ei->icu, 18.0f, 1.0f);
|
||||
}
|
||||
else
|
||||
insert_vert_ipo(ei->icu, 1.0f, 1.0f);
|
||||
|
||||
ei->flag |= IPO_SELECT|IPO_VISIBLE;
|
||||
ei->icu->flag= ei->flag;
|
||||
ei->icu->extrap= IPO_DIR;
|
||||
|
||||
do_ipo_buttons(B_IPOHOME);
|
||||
}
|
||||
else {
|
||||
ei= G.sipo->editipo;
|
||||
for(nr=0; nr<G.sipo->totipo; nr++, ei++) {
|
||||
if ISPOIN(ei, flag & IPO_VISIBLE, icu) {
|
||||
|
||||
ok= 0;
|
||||
if(G.sipo->showkey) ok= 1;
|
||||
else if(ei->flag & IPO_SELECT) ok= 1;
|
||||
|
||||
if(ok) {
|
||||
/* count amount */
|
||||
if(event==1) tot= 1;
|
||||
else {
|
||||
ik= G.sipo->ipokey.first;
|
||||
tot= 0;
|
||||
while(ik) {
|
||||
if(ik->flag & 1) tot++;
|
||||
ik= ik->next;
|
||||
}
|
||||
}
|
||||
if(tot) {
|
||||
|
||||
/* correction for ob timeoffs */
|
||||
cfra= frame_to_float(CFRA);
|
||||
id= G.sipo->from;
|
||||
if(id && GS(id->name)==ID_OB ) {
|
||||
Object *ob= (Object *)id;
|
||||
if(ob->sf!=0.0 && (ob->ipoflag & OB_OFFS_OB) ) {
|
||||
cfra-= ob->sf*G.scene->r.framelen;
|
||||
}
|
||||
}
|
||||
else if(id && GS(id->name)==ID_SEQ) {
|
||||
extern Sequence *last_seq; /* editsequence.c */
|
||||
|
||||
if(last_seq) {
|
||||
cfra= (float)(100.0*(cfra-last_seq->startdisp)/((float)(last_seq->enddisp-last_seq->startdisp)));
|
||||
}
|
||||
}
|
||||
|
||||
insertvals= MEM_mallocN(sizeof(float)*2*tot, "insertkey_editipo");
|
||||
/* make sure icu->curval is correct */
|
||||
calc_ipo(G.sipo->ipo, cfra);
|
||||
|
||||
if(event==1) {
|
||||
insertvals[0]= cfra;
|
||||
|
||||
insertvals[1]= ei->icu->curval;
|
||||
}
|
||||
else {
|
||||
fp= insertvals;
|
||||
ik= G.sipo->ipokey.first;
|
||||
while(ik) {
|
||||
if(ik->flag & 1) {
|
||||
calc_ipo(G.sipo->ipo, ik->val);
|
||||
|
||||
fp[0]= ik->val;
|
||||
fp[1]= ei->icu->curval;
|
||||
fp+= 2;
|
||||
}
|
||||
ik= ik->next;
|
||||
}
|
||||
}
|
||||
fp= insertvals;
|
||||
for(a=0; a<tot; a++, fp+=2) {
|
||||
insert_vert_ipo(ei->icu, fp[0], fp[1]);
|
||||
}
|
||||
|
||||
MEM_freeN(insertvals);
|
||||
calc_ipo(G.sipo->ipo, (float)CFRA);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
BIF_undo_push("Insert Key Ipo");
|
||||
allqueue (REDRAWACTION, 0);
|
||||
allqueue(REDRAWNLA, 0);
|
||||
allqueue(REDRAWIPO, 0);
|
||||
allspace(REMAKEIPO, 0);
|
||||
}
|
||||
|
||||
|
||||
void common_insertkey(void)
|
||||
{
|
||||
Base *base;
|
||||
Object *ob;
|
||||
Material *ma;
|
||||
ID *id;
|
||||
IpoCurve *icu;
|
||||
World *wo;
|
||||
Lamp *la;
|
||||
int tlay, map, event;
|
||||
char menustr[256];
|
||||
|
||||
if(curarea->spacetype==SPACE_IPO) {
|
||||
insertkey_editipo();
|
||||
}
|
||||
else if(curarea->spacetype==SPACE_BUTS) {
|
||||
if(G.buts->mainb==CONTEXT_SHADING) {
|
||||
int tab= G.buts->tab[CONTEXT_SHADING];
|
||||
|
||||
if(tab==TAB_SHADING_MAT) {
|
||||
id= G.buts->lockpoin;
|
||||
ma= G.buts->lockpoin;
|
||||
if(id) {
|
||||
event= pupmenu("Insert Key %t|RGB%x0|Alpha%x1|Halo Size%x2|Mode %x3|All Color%x10|All Mirror%x14|Ofs%x12|Size%x13|All Mapping%x11");
|
||||
if(event== -1) return;
|
||||
|
||||
map= texchannel_to_adrcode(ma->texact);
|
||||
|
||||
if(event==0 || event==10) {
|
||||
insertkey(id, MA_COL_R);
|
||||
insertkey(id, MA_COL_G);
|
||||
insertkey(id, MA_COL_B);
|
||||
}
|
||||
if(event==1 || event==10) {
|
||||
insertkey(id, MA_ALPHA);
|
||||
}
|
||||
if(event==2 || event==10) {
|
||||
insertkey(id, MA_HASIZE);
|
||||
}
|
||||
if(event==3 || event==10) {
|
||||
insertkey(id, MA_MODE);
|
||||
}
|
||||
if(event==10) {
|
||||
insertkey(id, MA_SPEC_R);
|
||||
insertkey(id, MA_SPEC_G);
|
||||
insertkey(id, MA_SPEC_B);
|
||||
insertkey(id, MA_REF);
|
||||
insertkey(id, MA_EMIT);
|
||||
insertkey(id, MA_AMB);
|
||||
insertkey(id, MA_SPEC);
|
||||
insertkey(id, MA_HARD);
|
||||
insertkey(id, MA_MODE);
|
||||
insertkey(id, MA_TRANSLU);
|
||||
insertkey(id, MA_ADD);
|
||||
}
|
||||
if(event==14) {
|
||||
insertkey(id, MA_RAYM);
|
||||
insertkey(id, MA_FRESMIR);
|
||||
insertkey(id, MA_FRESMIRI);
|
||||
insertkey(id, MA_FRESTRA);
|
||||
insertkey(id, MA_FRESTRAI);
|
||||
}
|
||||
if(event==12 || event==11) {
|
||||
insertkey(id, map+MAP_OFS_X);
|
||||
insertkey(id, map+MAP_OFS_Y);
|
||||
insertkey(id, map+MAP_OFS_Z);
|
||||
}
|
||||
if(event==13 || event==11) {
|
||||
insertkey(id, map+MAP_SIZE_X);
|
||||
insertkey(id, map+MAP_SIZE_Y);
|
||||
insertkey(id, map+MAP_SIZE_Z);
|
||||
}
|
||||
if(event==11) {
|
||||
insertkey(id, map+MAP_R);
|
||||
insertkey(id, map+MAP_G);
|
||||
insertkey(id, map+MAP_B);
|
||||
insertkey(id, map+MAP_DVAR);
|
||||
insertkey(id, map+MAP_COLF);
|
||||
insertkey(id, map+MAP_NORF);
|
||||
insertkey(id, map+MAP_VARF);
|
||||
insertkey(id, map+MAP_DISP);
|
||||
}
|
||||
}
|
||||
}
|
||||
else if(tab==TAB_SHADING_WORLD) {
|
||||
id= G.buts->lockpoin;
|
||||
wo= G.buts->lockpoin;
|
||||
if(id) {
|
||||
event= pupmenu("Insert Key %t|Zenith RGB%x0|Horizon RGB%x1|Mist%x2|Stars %x3|Offset%x12|Size%x13");
|
||||
if(event== -1) return;
|
||||
|
||||
map= texchannel_to_adrcode(wo->texact);
|
||||
|
||||
if(event==0) {
|
||||
insertkey(id, WO_ZEN_R);
|
||||
insertkey(id, WO_ZEN_G);
|
||||
insertkey(id, WO_ZEN_B);
|
||||
}
|
||||
if(event==1) {
|
||||
insertkey(id, WO_HOR_R);
|
||||
insertkey(id, WO_HOR_G);
|
||||
insertkey(id, WO_HOR_B);
|
||||
}
|
||||
if(event==2) {
|
||||
insertkey(id, WO_MISI);
|
||||
insertkey(id, WO_MISTDI);
|
||||
insertkey(id, WO_MISTSTA);
|
||||
insertkey(id, WO_MISTHI);
|
||||
}
|
||||
if(event==3) {
|
||||
insertkey(id, WO_STAR_R);
|
||||
insertkey(id, WO_STAR_G);
|
||||
insertkey(id, WO_STAR_B);
|
||||
insertkey(id, WO_STARDIST);
|
||||
insertkey(id, WO_STARSIZE);
|
||||
}
|
||||
if(event==12) {
|
||||
insertkey(id, map+MAP_OFS_X);
|
||||
insertkey(id, map+MAP_OFS_Y);
|
||||
insertkey(id, map+MAP_OFS_Z);
|
||||
}
|
||||
if(event==13) {
|
||||
insertkey(id, map+MAP_SIZE_X);
|
||||
insertkey(id, map+MAP_SIZE_Y);
|
||||
insertkey(id, map+MAP_SIZE_Z);
|
||||
}
|
||||
}
|
||||
}
|
||||
else if(tab==TAB_SHADING_LAMP) {
|
||||
id= G.buts->lockpoin;
|
||||
la= G.buts->lockpoin;
|
||||
if(id) {
|
||||
event= pupmenu("Insert Key %t|RGB%x0|Energy%x1|Spot Size%x2|Offset%x12|Size%x13");
|
||||
if(event== -1) return;
|
||||
|
||||
map= texchannel_to_adrcode(la->texact);
|
||||
|
||||
if(event==0) {
|
||||
insertkey(id, LA_COL_R);
|
||||
insertkey(id, LA_COL_G);
|
||||
insertkey(id, LA_COL_B);
|
||||
}
|
||||
if(event==1) {
|
||||
insertkey(id, LA_ENERGY);
|
||||
}
|
||||
if(event==2) {
|
||||
insertkey(id, LA_SPOTSI);
|
||||
}
|
||||
if(event==12) {
|
||||
insertkey(id, map+MAP_OFS_X);
|
||||
insertkey(id, map+MAP_OFS_Y);
|
||||
insertkey(id, map+MAP_OFS_Z);
|
||||
}
|
||||
if(event==13) {
|
||||
insertkey(id, map+MAP_SIZE_X);
|
||||
insertkey(id, map+MAP_SIZE_Y);
|
||||
insertkey(id, map+MAP_SIZE_Z);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
else if(G.buts->mainb==CONTEXT_OBJECT) {
|
||||
ob= OBACT;
|
||||
if(ob && ob->type==OB_MESH) {
|
||||
id= (ID *) (ob);
|
||||
if(id) {
|
||||
event= pupmenu("Insert Key %t|Surface Damping%x0|Random Damping%x1|Permeability%x2|Force Strength%x3|Force Falloff%x4");
|
||||
if(event== -1) return;
|
||||
|
||||
if(event==0) {
|
||||
insertkey(id, OB_PD_SDAMP);
|
||||
}
|
||||
if(event==1) {
|
||||
insertkey(id, OB_PD_RDAMP);
|
||||
}
|
||||
if(event==2) {
|
||||
insertkey(id, OB_PD_PERM);
|
||||
}
|
||||
if(event==3) {
|
||||
insertkey(id, OB_PD_FSTR);
|
||||
}
|
||||
if(event==4) {
|
||||
insertkey(id, OB_PD_FFALL);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
else if(G.buts->mainb==CONTEXT_EDITING) {
|
||||
ob= OBACT;
|
||||
if(ob && ob->type==OB_CAMERA) {
|
||||
id= G.buts->lockpoin;
|
||||
if(id) {
|
||||
/* yafray: insert key extended with aperture and focal distance */
|
||||
if (G.scene->r.renderer==R_INTERN)
|
||||
event= pupmenu("Insert Key %t|Lens%x0|Clipping%x1");
|
||||
else
|
||||
event= pupmenu("Insert Key %t|Lens%x0|Clipping%x1|Aperture%x2|FocalDistance%x3");
|
||||
if(event== -1) return;
|
||||
|
||||
if(event==0) {
|
||||
insertkey(id, CAM_LENS);
|
||||
}
|
||||
else if(event==1) {
|
||||
insertkey(id, CAM_STA);
|
||||
insertkey(id, CAM_END);
|
||||
}
|
||||
else if(event==2) {
|
||||
insertkey(id, CAM_YF_APERT);
|
||||
}
|
||||
else if(event==3) {
|
||||
insertkey(id, CAM_YF_FDIST);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else if(FALSE /* && G.buts->mainb==BUTS_SOUND */) {
|
||||
if(G.ssound) {
|
||||
id= G.buts->lockpoin;
|
||||
if(id) {
|
||||
event= pupmenu("Insert Key %t|Volume%x0|Pitch%x1|Panning%x2|Attennuation%x3");
|
||||
if(event== -1) return;
|
||||
|
||||
if(event==0) {
|
||||
insertkey(id, SND_VOLUME);
|
||||
}
|
||||
if(event==1) {
|
||||
insertkey(id, SND_PITCH);
|
||||
}
|
||||
if(event==2) {
|
||||
insertkey(id, SND_PANNING);
|
||||
}
|
||||
if(event==3) {
|
||||
insertkey(id, SND_ATTEN);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
BIF_undo_push("Insert Key Buttons");
|
||||
|
||||
allqueue(REDRAWACTION, 0);
|
||||
allqueue(REDRAWNLA, 0);
|
||||
allqueue(REDRAWIPO, 0);
|
||||
allspace(REMAKEIPO, 0);
|
||||
|
||||
}
|
||||
else if(curarea->spacetype==SPACE_VIEW3D) {
|
||||
ob= OBACT;
|
||||
|
||||
if (ob && (ob->flag & OB_POSEMODE)) {
|
||||
strcpy(menustr, "Insert Key%t|Loc%x0|Rot%x1|Size%x2|LocRot%x3|LocRotSize%x4|Avail%x9");
|
||||
}
|
||||
else {
|
||||
base= FIRSTBASE;
|
||||
while(base) {
|
||||
if TESTBASELIB(base) break;
|
||||
base= base->next;
|
||||
}
|
||||
if(base==NULL) return;
|
||||
|
||||
strcpy(menustr, "Insert Key%t|Loc%x0|Rot%x1|Size%x2|LocRot%x3|LocRotSize%x4|Layer%x5|Avail%x9");
|
||||
}
|
||||
|
||||
if(ob) {
|
||||
if(ob->type==OB_MESH) strcat(menustr, "| %x6|Mesh%x7");
|
||||
else if(ob->type==OB_LATTICE) strcat(menustr, "| %x6|Lattice%x7");
|
||||
else if(ob->type==OB_CURVE) strcat(menustr, "| %x6|Curve%x7");
|
||||
else if(ob->type==OB_SURF) strcat(menustr, "| %x6|Surface%x7");
|
||||
if(ob->flag & OB_FROMGROUP) strcat(menustr, "| %x6|Entire Group%x10");
|
||||
}
|
||||
|
||||
event= pupmenu(menustr);
|
||||
if(event== -1) return;
|
||||
|
||||
if(event==7) { // ob != NULL
|
||||
insert_shapekey(ob);
|
||||
return;
|
||||
}
|
||||
|
||||
if(event==10) {
|
||||
Group *group= find_group(ob);
|
||||
if(group) {
|
||||
add_group_key(group);
|
||||
allqueue(REDRAWBUTSOBJECT, 0);
|
||||
}
|
||||
}
|
||||
|
||||
if (ob && (ob->flag & OB_POSEMODE)){
|
||||
bAction *act;
|
||||
bPose *pose;
|
||||
bPoseChannel *chan;
|
||||
bActionChannel *achan;
|
||||
|
||||
/* Get action & pose from object */
|
||||
act=ob->action;
|
||||
pose=ob->pose;
|
||||
|
||||
if (!act){
|
||||
act= ob->action= add_empty_action();
|
||||
/* this sets the non-pinned open ipowindow(s) to show the action curve */
|
||||
ob->ipowin= ID_AC;
|
||||
allqueue(REDRAWIPO, ob->ipowin);
|
||||
|
||||
allqueue(REDRAWACTION, 0);
|
||||
allqueue(REDRAWNLA, 0);
|
||||
}
|
||||
if (!pose){
|
||||
error ("No pose!"); /* Should never happen */
|
||||
}
|
||||
|
||||
if (act->id.lib) {
|
||||
error ("Can't key libactions");
|
||||
return;
|
||||
}
|
||||
|
||||
set_pose_keys(ob); // sets chan->flag to POSE_KEY if bone selected
|
||||
for (chan=pose->chanbase.first; chan; chan=chan->next) {
|
||||
if (chan->flag & POSE_KEY){
|
||||
// set_action_key(act, chan);
|
||||
if(event==0 || event==3 ||event==4) {
|
||||
set_action_key(act, chan, AC_LOC_X, 1);
|
||||
set_action_key(act, chan, AC_LOC_Y, 1);
|
||||
set_action_key(act, chan, AC_LOC_Z, 1);
|
||||
}
|
||||
if(event==1 || event==3 ||event==4) {
|
||||
set_action_key(act, chan, AC_QUAT_X, 1);
|
||||
set_action_key(act, chan, AC_QUAT_Y, 1);
|
||||
set_action_key(act, chan, AC_QUAT_Z, 1);
|
||||
set_action_key(act, chan, AC_QUAT_W, 1);
|
||||
}
|
||||
if(event==2 || event==4) {
|
||||
set_action_key(act, chan, AC_SIZE_X, 1);
|
||||
set_action_key(act, chan, AC_SIZE_Y, 1);
|
||||
set_action_key(act, chan, AC_SIZE_Z, 1);
|
||||
}
|
||||
if (event==9){
|
||||
for (achan = act->chanbase.first; achan; achan=achan->next){
|
||||
if (achan->ipo && !strcmp (achan->name, chan->name)){
|
||||
for (icu = achan->ipo->curve.first; icu; icu=icu->next){
|
||||
set_action_key(act, chan, icu->adrcode, 0);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
remake_action_ipos(act);
|
||||
}
|
||||
|
||||
DAG_object_flush_update(G.scene, ob, OB_RECALC_DATA);
|
||||
|
||||
allqueue(REDRAWIPO, 0);
|
||||
allqueue(REDRAWACTION, 0);
|
||||
allqueue(REDRAWNLA, 0);
|
||||
}
|
||||
else {
|
||||
base= FIRSTBASE;
|
||||
while(base) {
|
||||
if TESTBASELIB(base) {
|
||||
id= (ID *)(base->object);
|
||||
|
||||
/* all curves in ipo deselect */
|
||||
if(base->object->ipo) {
|
||||
icu= base->object->ipo->curve.first;
|
||||
while(icu) {
|
||||
icu->flag &= ~IPO_SELECT;
|
||||
if(event==9) insertkey(id, icu->adrcode);
|
||||
icu= icu->next;
|
||||
}
|
||||
}
|
||||
|
||||
if(event==0 || event==3 ||event==4) {
|
||||
insertkey(id, OB_LOC_X);
|
||||
insertkey(id, OB_LOC_Y);
|
||||
insertkey(id, OB_LOC_Z);
|
||||
}
|
||||
if(event==1 || event==3 ||event==4) {
|
||||
insertkey(id, OB_ROT_X);
|
||||
insertkey(id, OB_ROT_Y);
|
||||
insertkey(id, OB_ROT_Z);
|
||||
}
|
||||
if(event==2 || event==4) {
|
||||
insertkey(id, OB_SIZE_X);
|
||||
insertkey(id, OB_SIZE_Y);
|
||||
insertkey(id, OB_SIZE_Z);
|
||||
}
|
||||
if(event==5) {
|
||||
/* remove localview */
|
||||
tlay= base->object->lay;
|
||||
base->object->lay &= 0xFFFFFF;
|
||||
insertkey(id, OB_LAY);
|
||||
base->object->lay= tlay;
|
||||
}
|
||||
}
|
||||
base= base->next;
|
||||
}
|
||||
}
|
||||
|
||||
if(event==0) BIF_undo_push("Insert Loc Key");
|
||||
else if(event==1) BIF_undo_push("Insert Rot Key");
|
||||
else if(event==2) BIF_undo_push("Insert Size Key");
|
||||
else if(event==3) BIF_undo_push("Insert LocRot Key");
|
||||
else if(event==4) BIF_undo_push("Insert LocRotSize Key");
|
||||
else if(event==5) BIF_undo_push("Insert Layer Key");
|
||||
else if(event==7) BIF_undo_push("Insert Vertex Key");
|
||||
else if(event==9) BIF_undo_push("Insert Avail Key");
|
||||
|
||||
allspace(REMAKEIPO, 0);
|
||||
allqueue(REDRAWIPO, 0);
|
||||
allqueue(REDRAWVIEW3D, 0);
|
||||
allqueue(REDRAWACTION, 0);
|
||||
allqueue(REDRAWNLA, 0);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
/* **************************************************** */
|
||||
|
||||
/* IPOKEY:
|
||||
@@ -4269,7 +3253,7 @@ void make_ipokey(void)
|
||||
ei= G.sipo->editipo;
|
||||
if(ei==0) return;
|
||||
for(a=0; a<G.sipo->totipo; a++, ei++) {
|
||||
if ISPOIN(ei, flag & IPO_VISIBLE, icu) {
|
||||
if (ISPOIN(ei, flag & IPO_VISIBLE, icu)) {
|
||||
bezt= ei->icu->bezt;
|
||||
totvert= ei->icu->totvert;
|
||||
|
||||
@@ -4324,7 +3308,7 @@ void make_ipokey_transform(Object *ob, ListBase *lb, int sel)
|
||||
BezTriple *bezt;
|
||||
int a, adrcode = 0, ok, dloc=0, drot=0, dsize=0;
|
||||
|
||||
if(ob->ipo==0) return;
|
||||
if(ob->ipo==NULL) return;
|
||||
if(ob->ipo->showkey==0) return;
|
||||
|
||||
/* test: are there delta curves? */
|
||||
@@ -4503,44 +3487,6 @@ void set_ipo_pointers_transob(IpoKey *ik, TransOb *tob)
|
||||
|
||||
|
||||
|
||||
void nextkey(ListBase *elems, int dir)
|
||||
{
|
||||
IpoKey *ik, *previk;
|
||||
int totsel;
|
||||
|
||||
if(dir==1) ik= elems->last;
|
||||
else ik= elems->first;
|
||||
previk= 0;
|
||||
totsel= 0;
|
||||
|
||||
while(ik) {
|
||||
|
||||
if(ik->flag) totsel++;
|
||||
|
||||
if(previk) {
|
||||
if(G.qual & LR_SHIFTKEY) {
|
||||
if(ik->flag) previk->flag= 1;
|
||||
}
|
||||
else previk->flag= ik->flag;
|
||||
}
|
||||
|
||||
previk= ik;
|
||||
if(dir==1) ik= ik->prev;
|
||||
else ik= ik->next;
|
||||
|
||||
if(G.qual & LR_SHIFTKEY);
|
||||
else if(ik==0) previk->flag= 0;
|
||||
}
|
||||
|
||||
/* when no key select: */
|
||||
if(totsel==0) {
|
||||
if(dir==1) ik= elems->first;
|
||||
else ik= elems->last;
|
||||
|
||||
if(ik) ik->flag= 1;
|
||||
}
|
||||
}
|
||||
|
||||
static int float_to_frame (float frame)
|
||||
{
|
||||
int to= (int) floor(0.5 + frame/G.scene->r.framelen );
|
||||
@@ -4641,77 +3587,6 @@ void movekey_obipo(int dir) /* only call external from view3d queue */
|
||||
allspace(REMAKEIPO, 0);
|
||||
|
||||
}
|
||||
|
||||
void nextkey_ipo(int dir) /* call from ipo queue */
|
||||
{
|
||||
IpoKey *ik;
|
||||
int a;
|
||||
|
||||
if(G.sipo->showkey==0) return;
|
||||
|
||||
nextkey(&G.sipo->ipokey, dir);
|
||||
|
||||
/* copy to beziers */
|
||||
ik= G.sipo->ipokey.first;
|
||||
while(ik) {
|
||||
for(a=0; a<G.sipo->totipo; a++) {
|
||||
if(ik->data[a]) ik->data[a]->f1= ik->data[a]->f2= ik->data[a]->f3= ik->flag;
|
||||
}
|
||||
ik= ik->next;
|
||||
}
|
||||
|
||||
allqueue(REDRAWNLA, 0);
|
||||
allqueue(REDRAWACTION, 0);
|
||||
allqueue(REDRAWIPO, 0);
|
||||
if(G.sipo->blocktype == ID_OB) allqueue(REDRAWVIEW3D, 0);
|
||||
}
|
||||
|
||||
void nextkey_obipo(int dir) /* only call external from view3d queue */
|
||||
{
|
||||
Base *base;
|
||||
Object *ob;
|
||||
ListBase elems;
|
||||
IpoKey *ik;
|
||||
int a;
|
||||
|
||||
/* problem: this doesnt work when you mix dLoc keys with Loc keys */
|
||||
|
||||
base= FIRSTBASE;
|
||||
while(base) {
|
||||
if TESTBASE(base) {
|
||||
ob= base->object;
|
||||
if( (ob->ipoflag & OB_DRAWKEY) && ob->ipo && ob->ipo->showkey) {
|
||||
elems.first= elems.last= 0;
|
||||
make_ipokey_transform(ob, &elems, 0);
|
||||
|
||||
if(elems.first) {
|
||||
|
||||
nextkey(&elems, dir);
|
||||
|
||||
/* copy to beziers */
|
||||
ik= elems.first;
|
||||
while(ik) {
|
||||
for(a=0; a<OB_TOTIPO; a++) {
|
||||
if(ik->data[a]) ik->data[a]->f1= ik->data[a]->f2= ik->data[a]->f3= ik->flag;
|
||||
}
|
||||
ik= ik->next;
|
||||
}
|
||||
|
||||
free_ipokey(&elems);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
base= base->next;
|
||||
}
|
||||
allqueue(REDRAWNLA, 0);
|
||||
allqueue(REDRAWACTION, 0);
|
||||
allqueue(REDRAWVIEW3D, 0);
|
||||
allspace(REMAKEIPO, 0);
|
||||
allqueue(REDRAWIPO, 0);
|
||||
}
|
||||
|
||||
|
||||
/* **************************************************** */
|
||||
|
||||
|
||||
@@ -4725,7 +3600,7 @@ void remake_ipo_transverts(TransVert *transmain, float *dvec, int tot)
|
||||
ei= G.sipo->editipo;
|
||||
for(a=0; a<G.sipo->totipo; a++, ei++) {
|
||||
|
||||
if ISPOIN(ei, flag & IPO_VISIBLE, icu) {
|
||||
if (ISPOIN(ei, flag & IPO_VISIBLE, icu)) {
|
||||
|
||||
if(ei->icu->bezt) {
|
||||
sort_time_ipocurve(ei->icu);
|
||||
@@ -4737,7 +3612,7 @@ void remake_ipo_transverts(TransVert *transmain, float *dvec, int tot)
|
||||
tv= transmain;
|
||||
for(a=0; a<G.sipo->totipo; a++, ei++) {
|
||||
|
||||
if ISPOIN(ei, flag & IPO_VISIBLE, icu) {
|
||||
if (ISPOIN(ei, flag & IPO_VISIBLE, icu)) {
|
||||
if( (ei->flag & IPO_EDIT) || G.sipo->showkey) {
|
||||
if(ei->icu->bezt) {
|
||||
bezt= ei->icu->bezt;
|
||||
@@ -4803,7 +3678,7 @@ void transform_ipo(int mode)
|
||||
ei= G.sipo->editipo;
|
||||
for(a=0; a<G.sipo->totipo; a++, ei++) {
|
||||
|
||||
if ISPOIN(ei, flag & IPO_VISIBLE, icu) {
|
||||
if (ISPOIN(ei, flag & IPO_VISIBLE, icu)) {
|
||||
if( (ei->flag & IPO_EDIT) || G.sipo->showkey) {
|
||||
|
||||
|
||||
@@ -4852,7 +3727,7 @@ void transform_ipo(int mode)
|
||||
|
||||
ei= G.sipo->editipo;
|
||||
for(a=0; a<G.sipo->totipo; a++, ei++) {
|
||||
if ISPOIN3(ei, flag & IPO_VISIBLE, flag & IPO_SELECT, icu) {
|
||||
if (ISPOIN3(ei, flag & IPO_VISIBLE, flag & IPO_SELECT, icu)) {
|
||||
if(ei->icu->bezt && ei->icu->ipo==IPO_BEZ) tot+= 3*ei->icu->totvert;
|
||||
else tot+= ei->icu->totvert;
|
||||
}
|
||||
@@ -4863,7 +3738,7 @@ void transform_ipo(int mode)
|
||||
|
||||
ei= G.sipo->editipo;
|
||||
for(a=0; a<G.sipo->totipo; a++, ei++) {
|
||||
if ISPOIN3(ei, flag & IPO_VISIBLE, flag & IPO_SELECT, icu) {
|
||||
if (ISPOIN3(ei, flag & IPO_VISIBLE, flag & IPO_SELECT, icu)) {
|
||||
if(ei->icu->bezt) {
|
||||
|
||||
bezt= ei->icu->bezt;
|
||||
@@ -4984,7 +3859,7 @@ void transform_ipo(int mode)
|
||||
dosort= 0;
|
||||
ei= G.sipo->editipo;
|
||||
for(a=0; a<G.sipo->totipo; a++, ei++) {
|
||||
if ISPOIN(ei, flag & IPO_VISIBLE, icu) {
|
||||
if (ISPOIN(ei, flag & IPO_VISIBLE, icu)) {
|
||||
|
||||
/* watch it: if the time is wrong: do not correct handles */
|
||||
if (test_time_ipocurve(ei->icu) ) dosort++;
|
||||
@@ -5009,7 +3884,7 @@ void transform_ipo(int mode)
|
||||
DAG_object_flush_update(G.scene, OBACT, OB_RECALC_DATA);
|
||||
force_draw_plus(SPACE_VIEW3D, 0);
|
||||
}
|
||||
else if(G.sipo->blocktype==ID_AC) {
|
||||
else if(G.sipo->blocktype==ID_PO) {
|
||||
Object *ob= OBACT;
|
||||
if(ob && ob->pose) {
|
||||
DAG_object_flush_update(G.scene, ob, OB_RECALC_DATA);
|
||||
@@ -5096,7 +3971,7 @@ void transform_ipo(int mode)
|
||||
dosort= 0;
|
||||
ei= G.sipo->editipo;
|
||||
for(a=0; a<G.sipo->totipo; a++, ei++) {
|
||||
if ISPOIN(ei, flag & IPO_VISIBLE, icu) {
|
||||
if (ISPOIN(ei, flag & IPO_VISIBLE, icu)) {
|
||||
if( (ei->flag & IPO_EDIT) || G.sipo->showkey) {
|
||||
if( test_time_ipocurve(ei->icu)) {
|
||||
dosort= 1;
|
||||
@@ -5110,7 +3985,7 @@ void transform_ipo(int mode)
|
||||
|
||||
ei= G.sipo->editipo;
|
||||
for(a=0; a<G.sipo->totipo; a++, ei++) {
|
||||
if ISPOIN(ei, flag & IPO_VISIBLE, icu) {
|
||||
if (ISPOIN(ei, flag & IPO_VISIBLE, icu)) {
|
||||
if( (ei->flag & IPO_EDIT) || G.sipo->showkey) {
|
||||
testhandles_ipocurve(ei->icu);
|
||||
}
|
||||
@@ -5194,14 +4069,14 @@ void ipo_record(void)
|
||||
short anim, val, xn, yn, mvalo[2], mval[2];
|
||||
char str[128];
|
||||
|
||||
if(G.sipo->from==0) return;
|
||||
if(G.sipo->from==NULL) return;
|
||||
if(SFRA>=EFRA) return;
|
||||
|
||||
anim= pupmenu("Record Mouse %t|Still %x1|Play Animation %x2");
|
||||
if(anim < 1) return;
|
||||
if(anim!=2) anim= 0;
|
||||
|
||||
ipo= get_ipo(G.sipo->from, G.sipo->blocktype, 1); /* 1= make */
|
||||
ipo= verify_ipo(G.sipo->from, G.sipo->blocktype, G.sipo->actname, G.sipo->constname);
|
||||
if(G.sipo) G.sipo->ipo= ipo;
|
||||
|
||||
ob= OBACT;
|
||||
@@ -5227,16 +4102,20 @@ void ipo_record(void)
|
||||
}
|
||||
|
||||
/* make curves ready, start values */
|
||||
if(ei1->icu==NULL) ei1->icu= get_ipocurve(G.sipo->from, G.sipo->blocktype, ei1->adrcode, 0);
|
||||
if(ei1->icu==NULL)
|
||||
ei1->icu= verify_ipocurve(G.sipo->from, G.sipo->blocktype, G.sipo->actname, G.sipo->constname, ei1->adrcode);
|
||||
if(ei1->icu==NULL) return;
|
||||
|
||||
poin= get_ipo_poin(G.sipo->from, ei1->icu, &type);
|
||||
if(poin) ei1->icu->curval= read_ipo_poin(poin, type);
|
||||
or1= ei1->icu->curval;
|
||||
ei1->icu->flag |= IPO_LOCK;
|
||||
|
||||
if(ei2) {
|
||||
if(ei2->icu==NULL) ei2->icu= get_ipocurve(G.sipo->from, G.sipo->blocktype, ei2->adrcode, 0);
|
||||
if(ei2->icu==NULL)
|
||||
ei1->icu= verify_ipocurve(G.sipo->from, G.sipo->blocktype, G.sipo->actname, G.sipo->constname, ei2->adrcode);
|
||||
if(ei2->icu==NULL) return;
|
||||
|
||||
poin= get_ipo_poin(G.sipo->from, ei2->icu, &type);
|
||||
if(poin) ei2->icu->curval= read_ipo_poin(poin, type);
|
||||
or2= ei2->icu->curval;
|
||||
@@ -5396,8 +4275,7 @@ void ipo_record(void)
|
||||
MEM_freeN(data2);
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* while transform, update for curves */
|
||||
void remake_object_ipos(Object *ob)
|
||||
{
|
||||
IpoCurve *icu;
|
||||
@@ -5413,49 +4291,6 @@ void remake_object_ipos(Object *ob)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
int is_ipo_key_selected(Ipo *ipo)
|
||||
{
|
||||
int i;
|
||||
IpoCurve *icu;
|
||||
|
||||
if (!ipo)
|
||||
return 0;
|
||||
|
||||
for (icu=ipo->curve.first; icu; icu=icu->next){
|
||||
for (i=0; i<icu->totvert; i++)
|
||||
if (BEZSELECTED(&icu->bezt[i]))
|
||||
return 1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
void set_ipo_key_selection(Ipo *ipo, int sel)
|
||||
{
|
||||
int i;
|
||||
IpoCurve *icu;
|
||||
|
||||
if (!ipo)
|
||||
return;
|
||||
|
||||
for (icu=ipo->curve.first; icu; icu=icu->next){
|
||||
for (i=0; i<icu->totvert; i++){
|
||||
if (sel){
|
||||
icu->bezt[i].f1|=1;
|
||||
icu->bezt[i].f2|=1;
|
||||
icu->bezt[i].f3|=1;
|
||||
}
|
||||
else{
|
||||
icu->bezt[i].f1&=~1;
|
||||
icu->bezt[i].f2&=~1;
|
||||
icu->bezt[i].f3&=~1;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void delete_ipo_keys(Ipo *ipo)
|
||||
{
|
||||
IpoCurve *icu, *next;
|
||||
@@ -5482,27 +4317,6 @@ void delete_ipo_keys(Ipo *ipo)
|
||||
}
|
||||
}
|
||||
|
||||
int fullselect_ipo_keys(Ipo *ipo)
|
||||
{
|
||||
int i;
|
||||
IpoCurve *icu;
|
||||
int tvtot = 0;
|
||||
|
||||
if (!ipo)
|
||||
return tvtot;
|
||||
|
||||
for (icu=ipo->curve.first; icu; icu=icu->next){
|
||||
for (i=0; i<icu->totvert; i++){
|
||||
if (icu->bezt[i].f2 & 1){
|
||||
tvtot+=3;
|
||||
icu->bezt[i].f1 |= 1;
|
||||
icu->bezt[i].f3 |= 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return tvtot;
|
||||
}
|
||||
|
||||
int add_trans_ipo_keys(Ipo *ipo, TransVert *tv, int tvtot)
|
||||
{
|
||||
@@ -5566,152 +4380,52 @@ void duplicate_ipo_keys(Ipo *ipo)
|
||||
}
|
||||
}
|
||||
|
||||
void borderselect_icu_key(IpoCurve *icu, float xmin, float xmax,
|
||||
int (*select_function)(BezTriple *))
|
||||
void move_to_frame(void)
|
||||
{
|
||||
/* Selects all bezier triples in the Ipocurve
|
||||
* between times xmin and xmax, using the selection
|
||||
* function.
|
||||
*/
|
||||
|
||||
int i;
|
||||
|
||||
/* loop through all of the bezier triples in
|
||||
* the Ipocurve -- if the triple occurs between
|
||||
* times xmin and xmax then select it using the selection
|
||||
* function
|
||||
*/
|
||||
for (i=0; i<icu->totvert; i++){
|
||||
if (icu->bezt[i].vec[1][0] > xmin && icu->bezt[i].vec[1][0] < xmax ){
|
||||
select_function(&(icu->bezt[i]));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void borderselect_ipo_key(Ipo *ipo, float xmin, float xmax, int selectmode)
|
||||
{
|
||||
/* Selects all bezier triples in each Ipocurve of the
|
||||
* Ipo between times xmin and xmax, using the selection mode.
|
||||
*/
|
||||
|
||||
IpoCurve *icu;
|
||||
int (*select_function)(BezTriple *);
|
||||
|
||||
/* If the ipo is no good then return */
|
||||
if (!ipo)
|
||||
return;
|
||||
|
||||
/* Set the selection function based on the
|
||||
* selection mode.
|
||||
*/
|
||||
switch(selectmode) {
|
||||
case SELECT_ADD:
|
||||
select_function = select_bezier_add;
|
||||
break;
|
||||
case SELECT_SUBTRACT:
|
||||
select_function = select_bezier_subtract;
|
||||
break;
|
||||
case SELECT_INVERT:
|
||||
select_function = select_bezier_invert;
|
||||
break;
|
||||
default:
|
||||
return;
|
||||
}
|
||||
|
||||
/* loop through all of the bezier triples in all
|
||||
* of the Ipocurves -- if the triple occurs between
|
||||
* times xmin and xmax then select it using the selection
|
||||
* function
|
||||
*/
|
||||
for (icu=ipo->curve.first; icu; icu=icu->next){
|
||||
borderselect_icu_key(icu, xmin, xmax, select_function);
|
||||
}
|
||||
}
|
||||
|
||||
void select_ipo_key(Ipo *ipo, float selx, int selectmode)
|
||||
{
|
||||
/* Selects all bezier triples in each Ipocurve of the
|
||||
* Ipo at time selx, using the selection mode.
|
||||
*/
|
||||
int i;
|
||||
IpoCurve *icu;
|
||||
int (*select_function)(BezTriple *);
|
||||
|
||||
/* If the ipo is no good then return */
|
||||
if (!ipo)
|
||||
return;
|
||||
|
||||
/* Set the selection function based on the
|
||||
* selection mode.
|
||||
*/
|
||||
switch(selectmode) {
|
||||
case SELECT_ADD:
|
||||
select_function = select_bezier_add;
|
||||
break;
|
||||
case SELECT_SUBTRACT:
|
||||
select_function = select_bezier_subtract;
|
||||
break;
|
||||
case SELECT_INVERT:
|
||||
select_function = select_bezier_invert;
|
||||
break;
|
||||
default:
|
||||
return;
|
||||
}
|
||||
|
||||
/* loop through all of the bezier triples in all
|
||||
* of the Ipocurves -- if the triple occurs at
|
||||
* time selx then select it using the selection
|
||||
* function
|
||||
*/
|
||||
for (icu=ipo->curve.first; icu; icu=icu->next){
|
||||
for (i=0; i<icu->totvert; i++){
|
||||
if (icu->bezt[i].vec[1][0]==selx){
|
||||
select_function(&(icu->bezt[i]));
|
||||
EditIpo *ei;
|
||||
BezTriple *bezt;
|
||||
ID *id;
|
||||
float cfra;
|
||||
int a, b;
|
||||
|
||||
if(G.sipo->editipo==0) return;
|
||||
|
||||
ei= G.sipo->editipo;
|
||||
|
||||
for(a=0; a<G.sipo->totipo; a++, ei++) {
|
||||
if (ISPOIN(ei, flag & IPO_VISIBLE, icu)) {
|
||||
if(G.sipo->showkey || (ei->flag & IPO_EDIT)) {
|
||||
|
||||
if(ei->icu->bezt) {
|
||||
|
||||
b= ei->icu->totvert;
|
||||
bezt= ei->icu->bezt;
|
||||
while(b--) {
|
||||
if(BEZSELECTED(bezt)) {
|
||||
|
||||
cfra= bezt->vec[1][0]/G.scene->r.framelen;
|
||||
|
||||
id= G.sipo->from;
|
||||
if(id && GS(id->name)==ID_OB ) {
|
||||
Object *ob= (Object *)id;
|
||||
if(ob->sf!=0.0 && (ob->ipoflag & OB_OFFS_OB) ) {
|
||||
cfra+= ob->sf/G.scene->r.framelen;
|
||||
}
|
||||
}
|
||||
CFRA= (short)floor(cfra+0.5);
|
||||
|
||||
if(CFRA < 1) CFRA= 1;
|
||||
update_for_newframe();
|
||||
|
||||
break;
|
||||
}
|
||||
bezt++;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
BIF_undo_push("Set frame to selected Ipo vertex");
|
||||
}
|
||||
|
||||
void select_icu_key(IpoCurve *icu, float selx, int selectmode)
|
||||
{
|
||||
/* Selects all bezier triples in the Ipocurve
|
||||
* at time selx, using the selection mode.
|
||||
* This is kind of sloppy the obvious similarities
|
||||
* with the above function, forgive me ...
|
||||
*/
|
||||
int i;
|
||||
int (*select_function)(BezTriple *);
|
||||
|
||||
/* If the icu is no good then return */
|
||||
if (!icu)
|
||||
return;
|
||||
|
||||
/* Set the selection function based on the
|
||||
* selection mode.
|
||||
*/
|
||||
switch(selectmode) {
|
||||
case SELECT_ADD:
|
||||
select_function = select_bezier_add;
|
||||
break;
|
||||
case SELECT_SUBTRACT:
|
||||
select_function = select_bezier_subtract;
|
||||
break;
|
||||
case SELECT_INVERT:
|
||||
select_function = select_bezier_invert;
|
||||
break;
|
||||
default:
|
||||
return;
|
||||
}
|
||||
|
||||
/* loop through all of the bezier triples in
|
||||
* the Ipocurve -- if the triple occurs at
|
||||
* time selx then select it using the selection
|
||||
* function
|
||||
*/
|
||||
for (i=0; i<icu->totvert; i++){
|
||||
if (icu->bezt[i].vec[1][0]==selx){
|
||||
select_function(&(icu->bezt[i]));
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
309
source/blender/src/editipo_lib.c
Normal file
309
source/blender/src/editipo_lib.c
Normal file
@@ -0,0 +1,309 @@
|
||||
/**
|
||||
* $Id:
|
||||
*
|
||||
* ***** BEGIN GPL LICENSE BLOCK *****
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation; either version 2
|
||||
* of the License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software Foundation,
|
||||
* Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
*
|
||||
* The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Contributor(s): Blender Foundation, 2005. Full recode
|
||||
*
|
||||
* ***** END GPL LICENSE BLOCK *****
|
||||
*/
|
||||
|
||||
/* ********** General calls (minimal dependencies) for editing Ipos in Blender ************* */
|
||||
|
||||
#include "BLI_blenlib.h"
|
||||
#include "BLI_arithb.h"
|
||||
|
||||
#include "DNA_curve_types.h"
|
||||
#include "DNA_ipo_types.h"
|
||||
#include "DNA_space_types.h"
|
||||
#include "DNA_scene_types.h"
|
||||
#include "DNA_view3d_types.h"
|
||||
|
||||
#include "BKE_global.h"
|
||||
#include "BKE_ipo.h"
|
||||
#include "BKE_utildefines.h"
|
||||
|
||||
#include "BSE_edit.h"
|
||||
#include "BSE_editipo_types.h"
|
||||
#include "BSE_editipo.h"
|
||||
#include "BSE_drawipo.h"
|
||||
|
||||
#include "blendef.h"
|
||||
#include "mydevice.h"
|
||||
|
||||
char *ob_ic_names[OB_TOTNAM] = { "LocX", "LocY", "LocZ", "dLocX", "dLocY", "dLocZ",
|
||||
"RotX", "RotY", "RotZ", "dRotX", "dRotY", "dRotZ",
|
||||
"SizeX", "SizeY", "SizeZ", "dSizeX", "dSizeY", "dSizeZ",
|
||||
"Layer", "Time", "ColR", "ColG", "ColB", "ColA",
|
||||
"FStreng", "FFall", "RDamp", "Damping", "Perm" };
|
||||
|
||||
char *co_ic_names[CO_TOTNAM] = { "Inf" };
|
||||
char *mtex_ic_names[TEX_TOTNAM] = { "OfsX", "OfsY", "OfsZ", "SizeX", "SizeY", "SizeZ",
|
||||
"texR", "texG", "texB", "DefVar", "Col", "Nor", "Var",
|
||||
"Disp" };
|
||||
char *tex_ic_names[TE_TOTNAM] = { "NSize", "NDepth", "NType", "Turb", "Vnw1", "Vnw2",
|
||||
"Vnw3", "Vnw4", "MinkMExp", "DistM", "ColT", "iScale",
|
||||
"DistA", "MgType", "MgH", "Lacu", "Oct", "MgOff",
|
||||
"MgGain", "NBase1", "NBase2" };
|
||||
char *ma_ic_names[MA_TOTNAM] = { "R", "G", "B", "SpecR", "SpecG", "SpecB", "MirR",
|
||||
"MirG", "MirB", "Ref", "Alpha", "Emit", "Amb", "Spec",
|
||||
"Hard", "SpTra", "Ior", "Mode", "HaSize", "Translu",
|
||||
"RayMir", "FresMir", "FresMirI", "FresTra", "FresTraI",
|
||||
"TraGlow" };
|
||||
char *seq_ic_names[SEQ_TOTNAM] = { "Fac" };
|
||||
char *cu_ic_names[CU_TOTNAM] = { "Speed" };
|
||||
char *key_ic_names[KEY_TOTNAM] = { "Speed", "Key 1", "Key 2", "Key 3", "Key 4", "Key 5",
|
||||
"Key 6", "Key 7", "Key 8", "Key 9", "Key 10",
|
||||
"Key 11", "Key 12", "Key 13", "Key 14", "Key 15",
|
||||
"Key 16", "Key 17", "Key 18", "Key 19", "Key 20",
|
||||
"Key 21", "Key 22", "Key 23", "Key 24", "Key 25",
|
||||
"Key 26", "Key 27", "Key 28", "Key 29", "Key 30",
|
||||
"Key 31", "Key 32", "Key 33", "Key 34", "Key 35",
|
||||
"Key 36", "Key 37", "Key 38", "Key 39", "Key 40",
|
||||
"Key 41", "Key 42", "Key 43", "Key 44", "Key 45",
|
||||
"Key 46", "Key 47", "Key 48", "Key 49", "Key 50",
|
||||
"Key 51", "Key 52", "Key 53", "Key 54", "Key 55",
|
||||
"Key 56", "Key 57", "Key 58", "Key 59", "Key 60",
|
||||
"Key 61", "Key 62", "Key 63"};
|
||||
char *wo_ic_names[WO_TOTNAM] = { "HorR", "HorG", "HorB", "ZenR", "ZenG", "ZenB", "Expos",
|
||||
"Misi", "MisDi", "MisSta", "MisHi", "StarR", "StarB",
|
||||
"StarG", "StarDi", "StarSi" };
|
||||
char *la_ic_names[LA_TOTNAM] = { "Energ", "R", "G", "B", "Dist", "SpoSi", "SpoBl",
|
||||
"Quad1", "Quad2", "HaInt" };
|
||||
/* yafray: two curve names added, 'Apert' for aperture, and 'FDist' for focal distance */
|
||||
char *cam_ic_names[CAM_TOTNAM] = { "Lens", "ClSta", "ClEnd", "Apert", "FDist" };
|
||||
char *snd_ic_names[SND_TOTNAM] = { "Vol", "Pitch", "Pan", "Atten" };
|
||||
char *ac_ic_names[AC_TOTNAM] = {"LocX", "LocY", "LocZ", "SizeX", "SizeY",
|
||||
"SizeZ", "QuatW", "QuatX", "QuatY", "QuatZ"};
|
||||
char *ic_name_empty[1] ={ "" };
|
||||
|
||||
char *getname_ac_ei(int nr)
|
||||
{
|
||||
switch(nr) {
|
||||
case AC_LOC_X:
|
||||
case AC_LOC_Y:
|
||||
case AC_LOC_Z:
|
||||
return ac_ic_names[nr-1];
|
||||
case AC_SIZE_X:
|
||||
case AC_SIZE_Y:
|
||||
case AC_SIZE_Z:
|
||||
return ac_ic_names[nr-10];
|
||||
case AC_QUAT_X:
|
||||
case AC_QUAT_Y:
|
||||
case AC_QUAT_Z:
|
||||
case AC_QUAT_W:
|
||||
return ac_ic_names[nr-19];
|
||||
default:
|
||||
return ic_name_empty[0]; /* empty */
|
||||
}
|
||||
}
|
||||
|
||||
char *getname_co_ei(int nr)
|
||||
{
|
||||
switch(nr){
|
||||
case CO_ENFORCE:
|
||||
return co_ic_names[nr-1];
|
||||
}
|
||||
return ic_name_empty[0];
|
||||
}
|
||||
|
||||
char *getname_ob_ei(int nr, int colipo)
|
||||
{
|
||||
if(nr>=OB_LOC_X && nr <= OB_PD_PERM) return ob_ic_names[nr-1];
|
||||
|
||||
return ic_name_empty[0];
|
||||
}
|
||||
|
||||
char *getname_tex_ei(int nr)
|
||||
{
|
||||
if(nr>=TE_NSIZE && nr<=TE_N_BAS2) return tex_ic_names[nr-1];
|
||||
|
||||
return ic_name_empty[0];
|
||||
}
|
||||
|
||||
char *getname_mtex_ei(int nr)
|
||||
{
|
||||
if(nr>=MAP_OFS_X && nr<=MAP_DISP) return mtex_ic_names[nr-1];
|
||||
|
||||
return ic_name_empty[0];
|
||||
}
|
||||
|
||||
char *getname_mat_ei(int nr)
|
||||
{
|
||||
if(nr>=MA_MAP1) return getname_mtex_ei((nr & (MA_MAP1-1)));
|
||||
else {
|
||||
if(nr>=MA_COL_R && nr<=MA_ADD) return ma_ic_names[nr-1];
|
||||
}
|
||||
return ic_name_empty[0];
|
||||
}
|
||||
|
||||
char *getname_world_ei(int nr)
|
||||
{
|
||||
if(nr>=MA_MAP1) return getname_mtex_ei((nr & (MA_MAP1-1)));
|
||||
else {
|
||||
if(nr>=WO_HOR_R && nr<=WO_STARSIZE) return wo_ic_names[nr-1];
|
||||
}
|
||||
return ic_name_empty[0];
|
||||
}
|
||||
|
||||
char *getname_seq_ei(int nr)
|
||||
{
|
||||
if(nr == SEQ_FAC1) return seq_ic_names[nr-1];
|
||||
return ic_name_empty[0];
|
||||
}
|
||||
|
||||
char *getname_cu_ei(int nr)
|
||||
{
|
||||
if(nr==CU_SPEED) return cu_ic_names[nr-1];
|
||||
return ic_name_empty[0];
|
||||
}
|
||||
|
||||
char *getname_la_ei(int nr)
|
||||
{
|
||||
if(nr>=MA_MAP1) return getname_mtex_ei((nr & (MA_MAP1-1)));
|
||||
else {
|
||||
if(nr>=LA_ENERGY && nr<=LA_HALOINT) return la_ic_names[nr-1];
|
||||
}
|
||||
return ic_name_empty[0];
|
||||
}
|
||||
|
||||
char *getname_cam_ei(int nr)
|
||||
{
|
||||
/* yafray: curves extended to CAM_YF_FDIST */
|
||||
//if(nr>=CAM_LENS && nr<=CAM_END) return cam_ic_names[nr-1];
|
||||
if(nr>=CAM_LENS && nr<=CAM_YF_FDIST) return cam_ic_names[nr-1];
|
||||
return ic_name_empty[0];
|
||||
}
|
||||
|
||||
char *getname_snd_ei(int nr)
|
||||
{
|
||||
if(nr>=SND_VOLUME && nr<=SND_ATTEN) return snd_ic_names[nr-1];
|
||||
return ic_name_empty[0];
|
||||
}
|
||||
|
||||
|
||||
void boundbox_ipocurve(IpoCurve *icu)
|
||||
{
|
||||
BezTriple *bezt;
|
||||
float vec[3]={0.0,0.0,0.0};
|
||||
float min[3], max[3];
|
||||
int a;
|
||||
|
||||
if(icu->totvert) {
|
||||
INIT_MINMAX(min, max);
|
||||
|
||||
if(icu->bezt ) {
|
||||
a= icu->totvert;
|
||||
bezt= icu->bezt;
|
||||
while(a--) {
|
||||
if(icu->vartype & IPO_BITS) {
|
||||
vec[0]= bezt->vec[1][0];
|
||||
vec[1]= 0.0;
|
||||
DO_MINMAX(vec, min, max);
|
||||
|
||||
vec[1]= 16.0;
|
||||
DO_MINMAX(vec, min, max);
|
||||
}
|
||||
else {
|
||||
if(icu->ipo==IPO_BEZ && a!=icu->totvert-1) {
|
||||
DO_MINMAX(bezt->vec[0], min, max);
|
||||
}
|
||||
DO_MINMAX(bezt->vec[1], min, max);
|
||||
if(icu->ipo==IPO_BEZ && a!=0) {
|
||||
DO_MINMAX(bezt->vec[2], min, max);
|
||||
}
|
||||
}
|
||||
|
||||
bezt++;
|
||||
}
|
||||
}
|
||||
if(min[0]==max[0]) max[0]= (float)(min[0]+1.0);
|
||||
if(min[1]==max[1]) max[1]= (float)(min[1]+0.1);
|
||||
|
||||
icu->totrct.xmin= min[0];
|
||||
icu->totrct.ymin= min[1];
|
||||
icu->totrct.xmax= max[0];
|
||||
icu->totrct.ymax= max[1];
|
||||
}
|
||||
else {
|
||||
icu->totrct.xmin= icu->totrct.ymin= 0.0;
|
||||
icu->totrct.xmax= EFRA;
|
||||
icu->totrct.ymax= 1.0;
|
||||
}
|
||||
}
|
||||
|
||||
void boundbox_ipo(Ipo *ipo, rctf *bb)
|
||||
{
|
||||
IpoCurve *icu;
|
||||
int first= 1;
|
||||
|
||||
icu= ipo->curve.first;
|
||||
while(icu) {
|
||||
|
||||
boundbox_ipocurve(icu);
|
||||
|
||||
if(first) {
|
||||
*bb= icu->totrct;
|
||||
first= 0;
|
||||
}
|
||||
else BLI_union_rctf(bb, &(icu->totrct));
|
||||
|
||||
icu= icu->next;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
unsigned int ipo_rainbow(int cur, int tot)
|
||||
{
|
||||
float dfac, fac, sat;
|
||||
|
||||
dfac= (float)(1.0/( (float)tot+1.0));
|
||||
|
||||
/* this calculation makes 2 or 4 different cycles of rainbow colors */
|
||||
if(cur< tot/2) fac= (float)(cur*2.0f*dfac);
|
||||
else fac= (float)((cur-tot/2)*2.0f*dfac +dfac);
|
||||
if(tot > 32) fac= fac*1.95f;
|
||||
if(fac>1.0f) fac-= 1.0f;
|
||||
|
||||
if(fac>0.5f && fac<0.8f) sat= 0.4f;
|
||||
else sat= 0.5f;
|
||||
|
||||
return hsv_to_cpack(fac, sat, 1.0f);
|
||||
}
|
||||
|
||||
/* exported to python, hrms... (ton) */
|
||||
int texchannel_to_adrcode(int channel)
|
||||
{
|
||||
switch(channel) {
|
||||
case 0: return MA_MAP1;
|
||||
case 1: return MA_MAP2;
|
||||
case 2: return MA_MAP3;
|
||||
case 3: return MA_MAP4;
|
||||
case 4: return MA_MAP5;
|
||||
case 5: return MA_MAP6;
|
||||
case 6: return MA_MAP7;
|
||||
case 7: return MA_MAP8;
|
||||
case 8: return MA_MAP9;
|
||||
case 9: return MA_MAP10;
|
||||
default: return 0;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
1115
source/blender/src/editipo_mods.c
Normal file
1115
source/blender/src/editipo_mods.c
Normal file
@@ -0,0 +1,1115 @@
|
||||
/**
|
||||
* $Id:
|
||||
*
|
||||
* ***** BEGIN GPL LICENSE BLOCK *****
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation; either version 2
|
||||
* of the License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software Foundation,
|
||||
* Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
*
|
||||
* The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Contributor(s): Blender Foundation, 2005. Full recode
|
||||
*
|
||||
* ***** END GPL LICENSE BLOCK *****
|
||||
*/
|
||||
|
||||
|
||||
/* ********** Selection and set Handle code for editing Ipos in Blender ************* */
|
||||
/*
|
||||
mouse_select_ipo() is in editipo.c
|
||||
*/
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <math.h>
|
||||
|
||||
#ifndef WIN32
|
||||
#include <unistd.h>
|
||||
#else
|
||||
#include <io.h>
|
||||
#endif
|
||||
|
||||
#include "BLI_blenlib.h"
|
||||
#include "BLI_arithb.h"
|
||||
|
||||
#include "DNA_curve_types.h"
|
||||
#include "DNA_ipo_types.h"
|
||||
#include "DNA_key_types.h"
|
||||
#include "DNA_object_types.h"
|
||||
#include "DNA_space_types.h"
|
||||
#include "DNA_scene_types.h"
|
||||
#include "DNA_view3d_types.h"
|
||||
|
||||
#include "BKE_global.h"
|
||||
#include "BKE_ipo.h"
|
||||
#include "BKE_utildefines.h"
|
||||
|
||||
#include "BIF_interface.h"
|
||||
#include "BIF_screen.h"
|
||||
#include "BIF_space.h"
|
||||
#include "BIF_toolbox.h"
|
||||
|
||||
#include "BSE_edit.h"
|
||||
#include "BSE_editipo_types.h"
|
||||
#include "BSE_editipo.h"
|
||||
#include "BSE_drawipo.h"
|
||||
#include "BSE_trans_types.h"
|
||||
|
||||
#include "BDR_drawobject.h"
|
||||
|
||||
#include "blendef.h"
|
||||
#include "mydevice.h"
|
||||
|
||||
/* copy from editipo.c */
|
||||
#define BEZSELECTED(bezt) (((bezt)->f1 & 1) || ((bezt)->f2 & 1) || ((bezt)->f3 & 1))
|
||||
|
||||
#define ISPOIN(a, b, c) ( (a->b) && (a->c) )
|
||||
#define ISPOIN3(a, b, c, d) ( (a->b) && (a->c) && (a->d) )
|
||||
#define ISPOIN4(a, b, c, d, e) ( (a->b) && (a->c) && (a->d) && (a->e) )
|
||||
|
||||
extern int totipo_edit, totipo_sel, totipo_vertsel, totipo_vis;
|
||||
|
||||
void ipo_toggle_showkey(void)
|
||||
{
|
||||
if(G.sipo->showkey) {
|
||||
G.sipo->showkey= 0;
|
||||
swap_selectall_editipo(); /* sel all */
|
||||
}
|
||||
else G.sipo->showkey= 1;
|
||||
free_ipokey(&G.sipo->ipokey);
|
||||
if(G.sipo->ipo) G.sipo->ipo->showkey= G.sipo->showkey;
|
||||
|
||||
BIF_undo_push("Toggle show key Ipo");
|
||||
}
|
||||
|
||||
void swap_selectall_editipo(void)
|
||||
{
|
||||
Object *ob;
|
||||
EditIpo *ei;
|
||||
IpoKey *ik;
|
||||
BezTriple *bezt;
|
||||
int a, b; /* , sel=0; */
|
||||
|
||||
get_status_editipo();
|
||||
|
||||
if(G.sipo->showkey) {
|
||||
ik= G.sipo->ipokey.first;
|
||||
while(ik) {
|
||||
if(totipo_vertsel) ik->flag &= ~1;
|
||||
else ik->flag |= 1;
|
||||
ik= ik->next;
|
||||
}
|
||||
update_editipo_flags();
|
||||
|
||||
if(G.sipo->showkey && G.sipo->blocktype==ID_OB ) {
|
||||
ob= OBACT;
|
||||
if(ob && (ob->ipoflag & OB_DRAWKEY)) draw_object_ext(BASACT);
|
||||
}
|
||||
}
|
||||
else if(totipo_edit==0) {
|
||||
ei= G.sipo->editipo;
|
||||
if (ei){
|
||||
for(a=0; a<G.sipo->totipo; a++) {
|
||||
if( ei->flag & IPO_VISIBLE ) {
|
||||
if(totipo_sel) ei->flag &= ~IPO_SELECT;
|
||||
else ei->flag |= IPO_SELECT;
|
||||
}
|
||||
ei++;
|
||||
}
|
||||
update_editipo_flags();
|
||||
}
|
||||
get_status_editipo();
|
||||
}
|
||||
else {
|
||||
ei= G.sipo->editipo;
|
||||
for(a=0; a<G.sipo->totipo; a++) {
|
||||
if (ISPOIN3(ei, flag & IPO_VISIBLE, flag & IPO_EDIT, icu )) {
|
||||
bezt= ei->icu->bezt;
|
||||
if(bezt) {
|
||||
b= ei->icu->totvert;
|
||||
while(b--) {
|
||||
if(totipo_vertsel) {
|
||||
bezt->f1= bezt->f2= bezt->f3= 0;
|
||||
}
|
||||
else {
|
||||
bezt->f1= bezt->f2= bezt->f3= 1;
|
||||
}
|
||||
bezt++;
|
||||
}
|
||||
}
|
||||
}
|
||||
ei++;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
BIF_undo_push("Swap select all Ipo");
|
||||
scrarea_queue_winredraw(curarea);
|
||||
|
||||
}
|
||||
|
||||
void swap_visible_editipo(void)
|
||||
{
|
||||
EditIpo *ei;
|
||||
Object *ob;
|
||||
int a; /* , sel=0; */
|
||||
|
||||
get_status_editipo();
|
||||
|
||||
|
||||
ei= G.sipo->editipo;
|
||||
for(a=0; a<G.sipo->totipo; a++) {
|
||||
if(totipo_vis==0) {
|
||||
if(ei->icu) {
|
||||
ei->flag |= IPO_VISIBLE;
|
||||
ei->flag |= IPO_SELECT;
|
||||
}
|
||||
}
|
||||
else ei->flag &= ~IPO_VISIBLE;
|
||||
ei++;
|
||||
}
|
||||
|
||||
update_editipo_flags();
|
||||
|
||||
if(G.sipo->showkey) {
|
||||
|
||||
make_ipokey();
|
||||
|
||||
ob= OBACT;
|
||||
if(ob && (ob->ipoflag & OB_DRAWKEY)) allqueue(REDRAWVIEW3D, 0);
|
||||
}
|
||||
|
||||
scrarea_queue_winredraw(curarea);
|
||||
BIF_undo_push("Swap Visible Ipo");
|
||||
}
|
||||
|
||||
void deselectall_editipo(void)
|
||||
{
|
||||
EditIpo *ei;
|
||||
IpoKey *ik;
|
||||
BezTriple *bezt;
|
||||
int a, b; /* , sel=0; */
|
||||
|
||||
get_status_editipo();
|
||||
|
||||
if(G.sipo->showkey) {
|
||||
ik= G.sipo->ipokey.first;
|
||||
while(ik) {
|
||||
ik->flag &= ~1;
|
||||
ik= ik->next;
|
||||
}
|
||||
update_editipo_flags();
|
||||
|
||||
}
|
||||
else if(totipo_edit==0) {
|
||||
|
||||
ei= G.sipo->editipo;
|
||||
for(a=0; a<G.sipo->totipo; a++) {
|
||||
if( ei->flag & IPO_VISIBLE ) {
|
||||
ei->flag &= ~IPO_SELECT;
|
||||
}
|
||||
ei++;
|
||||
}
|
||||
update_editipo_flags();
|
||||
}
|
||||
else {
|
||||
ei= G.sipo->editipo;
|
||||
for(a=0; a<G.sipo->totipo; a++) {
|
||||
if (ISPOIN3(ei, flag & IPO_VISIBLE, flag & IPO_EDIT, icu )) {
|
||||
if(ei->icu->bezt) {
|
||||
bezt= ei->icu->bezt;
|
||||
b= ei->icu->totvert;
|
||||
while(b--) {
|
||||
bezt->f1= bezt->f2= bezt->f3= 0;
|
||||
bezt++;
|
||||
}
|
||||
}
|
||||
}
|
||||
ei++;
|
||||
}
|
||||
}
|
||||
|
||||
BIF_undo_push("(De)select all Ipo");
|
||||
scrarea_queue_winredraw(curarea);
|
||||
}
|
||||
|
||||
|
||||
static int icu_keys_bezier_loop(IpoCurve *icu,
|
||||
int (*bezier_function)(BezTriple *),
|
||||
void (ipocurve_function)(struct IpoCurve *icu))
|
||||
{
|
||||
/* This loops through the beziers in the Ipocurve, and executes
|
||||
* the generic user provided 'bezier_function' on each one.
|
||||
* Optionally executes the generic function ipocurve_function on the
|
||||
* IPO curve after looping (eg. calchandles_ipocurve)
|
||||
*/
|
||||
|
||||
int b;
|
||||
BezTriple *bezt;
|
||||
|
||||
b = icu->totvert;
|
||||
bezt = icu->bezt;
|
||||
|
||||
/* if bezier_function has been specified
|
||||
* then loop through each bezier executing
|
||||
* it.
|
||||
*/
|
||||
|
||||
if (bezier_function != NULL) {
|
||||
while(b--) {
|
||||
/* exit with return code 1 if the bezier function
|
||||
* returns 1 (good for when you are only interested
|
||||
* in finding the first bezier that
|
||||
* satisfies a condition).
|
||||
*/
|
||||
if (bezier_function(bezt)) return 1;
|
||||
bezt++;
|
||||
}
|
||||
}
|
||||
|
||||
/* if ipocurve_function has been specified
|
||||
* then execute it
|
||||
*/
|
||||
if (ipocurve_function != NULL)
|
||||
ipocurve_function(icu);
|
||||
|
||||
return 0;
|
||||
|
||||
}
|
||||
|
||||
static int ipo_keys_bezier_loop(Ipo *ipo,
|
||||
int (*bezier_function)(BezTriple *),
|
||||
void (ipocurve_function)(struct IpoCurve *icu))
|
||||
{
|
||||
/* This loops through the beziers that are attached to
|
||||
* the selected keys on the Ipocurves of the Ipo, and executes
|
||||
* the generic user provided 'bezier_function' on each one.
|
||||
* Optionally executes the generic function ipocurve_function on a
|
||||
* IPO curve after looping (eg. calchandles_ipocurve)
|
||||
*/
|
||||
|
||||
IpoCurve *icu;
|
||||
|
||||
/* Loop through each curve in the Ipo
|
||||
*/
|
||||
for (icu=ipo->curve.first; icu; icu=icu->next){
|
||||
if (icu_keys_bezier_loop(icu,bezier_function, ipocurve_function))
|
||||
return 1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int selected_bezier_loop(int (*looptest)(EditIpo *),
|
||||
int (*bezier_function)(BezTriple *),
|
||||
void (ipocurve_function)(struct IpoCurve *icu))
|
||||
{
|
||||
/* This loops through the beziers that are attached to
|
||||
* selected keys in editmode in the IPO window, and executes
|
||||
* the generic user-provided 'bezier_function' on each one
|
||||
* that satisfies the 'looptest' function. Optionally executes
|
||||
* the generic function ipocurve_function on a IPO curve
|
||||
* after looping (eg. calchandles_ipocurve)
|
||||
*/
|
||||
|
||||
EditIpo *ei;
|
||||
BezTriple *bezt;
|
||||
int a, b;
|
||||
|
||||
/* Get the first Edit Ipo from the selected Ipos
|
||||
*/
|
||||
ei= G.sipo->editipo;
|
||||
|
||||
/* Loop throught all of the selected Ipo's
|
||||
*/
|
||||
for(a=0; a<G.sipo->totipo; a++, ei++) {
|
||||
/* Do a user provided test on the Edit Ipo
|
||||
* to determine whether we want to process it
|
||||
*/
|
||||
if (looptest(ei)) {
|
||||
/* Loop through the selected
|
||||
* beziers on the Edit Ipo
|
||||
*/
|
||||
bezt = ei->icu->bezt;
|
||||
b = ei->icu->totvert;
|
||||
|
||||
/* if bezier_function has been specified
|
||||
* then loop through each bezier executing
|
||||
* it.
|
||||
*/
|
||||
if (bezier_function != NULL) {
|
||||
while(b--) {
|
||||
/* exit with return code 1 if the bezier function
|
||||
* returns 1 (good for when you are only interested
|
||||
* in finding the first bezier that
|
||||
* satisfies a condition).
|
||||
*/
|
||||
if (bezier_function(bezt)) return 1;
|
||||
bezt++;
|
||||
}
|
||||
}
|
||||
|
||||
/* if ipocurve_function has been specified
|
||||
* then execute it
|
||||
*/
|
||||
if (ipocurve_function != NULL)
|
||||
ipocurve_function(ei->icu);
|
||||
}
|
||||
/* nufte flourdje zim ploopydu <-- random dutch looking comment ;) */
|
||||
/* looks more like russian to me! (ton) */
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int select_bezier_add(BezTriple *bezt)
|
||||
{
|
||||
/* Select the bezier triple */
|
||||
bezt->f1 |= 1;
|
||||
bezt->f2 |= 1;
|
||||
bezt->f3 |= 1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
int select_bezier_subtract(BezTriple *bezt)
|
||||
{
|
||||
/* Deselect the bezier triple */
|
||||
bezt->f1 &= ~1;
|
||||
bezt->f2 &= ~1;
|
||||
bezt->f3 &= ~1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
int select_bezier_invert(BezTriple *bezt)
|
||||
{
|
||||
/* Invert the selection for the bezier triple */
|
||||
bezt->f2 ^= 1;
|
||||
if ( bezt->f2 & 1 ) {
|
||||
bezt->f1 |= 1;
|
||||
bezt->f3 |= 1;
|
||||
}
|
||||
else {
|
||||
bezt->f1 &= ~1;
|
||||
bezt->f3 &= ~1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int set_bezier_auto(BezTriple *bezt)
|
||||
{
|
||||
/* Sets the selected bezier handles to type 'auto'
|
||||
*/
|
||||
|
||||
/* is a handle selected? If so
|
||||
* set it to type auto
|
||||
*/
|
||||
if(bezt->f1 || bezt->f3) {
|
||||
if(bezt->f1) bezt->h1= 1; /* the secret code for auto */
|
||||
if(bezt->f3) bezt->h2= 1;
|
||||
|
||||
/* if the handles are not of the same type, set them
|
||||
* to type free
|
||||
*/
|
||||
if(bezt->h1!=bezt->h2) {
|
||||
if ELEM(bezt->h1, HD_ALIGN, HD_AUTO) bezt->h1= HD_FREE;
|
||||
if ELEM(bezt->h2, HD_ALIGN, HD_AUTO) bezt->h2= HD_FREE;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int set_bezier_vector(BezTriple *bezt)
|
||||
{
|
||||
/* Sets the selected bezier handles to type 'vector'
|
||||
*/
|
||||
|
||||
/* is a handle selected? If so
|
||||
* set it to type vector
|
||||
*/
|
||||
if(bezt->f1 || bezt->f3) {
|
||||
if(bezt->f1) bezt->h1= 2; /* the code for vector */
|
||||
if(bezt->f3) bezt->h2= 2;
|
||||
|
||||
/* if the handles are not of the same type, set them
|
||||
* to type free
|
||||
*/
|
||||
if(bezt->h1!=bezt->h2) {
|
||||
if ELEM(bezt->h1, HD_ALIGN, HD_AUTO) bezt->h1= HD_FREE;
|
||||
if ELEM(bezt->h2, HD_ALIGN, HD_AUTO) bezt->h2= HD_FREE;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int bezier_isfree(BezTriple *bezt)
|
||||
{
|
||||
/* queries whether the handle should be set
|
||||
* to type 'free' (I think)
|
||||
*/
|
||||
if(bezt->f1 && bezt->h1) return 1;
|
||||
if(bezt->f3 && bezt->h2) return 1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int set_bezier_free(BezTriple *bezt)
|
||||
{
|
||||
/* Sets selected bezier handles to type 'free'
|
||||
*/
|
||||
if(bezt->f1) bezt->h1= HD_FREE;
|
||||
if(bezt->f3) bezt->h2= HD_FREE;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int set_bezier_align(BezTriple *bezt)
|
||||
{
|
||||
/* Sets selected bezier handles to type 'align'
|
||||
*/
|
||||
if(bezt->f1) bezt->h1= HD_ALIGN;
|
||||
if(bezt->f3) bezt->h2= HD_ALIGN;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int vis_edit_icu_bez(EditIpo *ei)
|
||||
{
|
||||
/* A 4 part test for an EditIpo :
|
||||
* is it a) visible
|
||||
* b) in edit mode
|
||||
* c) does it contain an Ipo Curve
|
||||
* d) does that ipo curve have a bezier
|
||||
*
|
||||
* (The reason why I don't just use the macro
|
||||
* is I need a pointer to a function.)
|
||||
*/
|
||||
return (ISPOIN4(ei, flag & IPO_VISIBLE, flag & IPO_EDIT, icu, icu->bezt));
|
||||
}
|
||||
|
||||
void select_ipo_bezier_keys(Ipo *ipo, int selectmode)
|
||||
{
|
||||
/* Select all of the beziers in all
|
||||
* of the Ipo curves belonging to the
|
||||
* Ipo, using the selection mode.
|
||||
*/
|
||||
switch (selectmode) {
|
||||
case SELECT_ADD:
|
||||
ipo_keys_bezier_loop(ipo, select_bezier_add, NULL);
|
||||
break;
|
||||
case SELECT_SUBTRACT:
|
||||
ipo_keys_bezier_loop(ipo, select_bezier_subtract, NULL);
|
||||
break;
|
||||
case SELECT_INVERT:
|
||||
ipo_keys_bezier_loop(ipo, select_bezier_invert, NULL);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void sethandles_ipo_keys(Ipo *ipo, int code)
|
||||
{
|
||||
/* this function lets you set bezier handles all to
|
||||
* one type for some Ipo's (e.g. with hotkeys through
|
||||
* the action window).
|
||||
*/
|
||||
|
||||
/* code==1: set autohandle */
|
||||
/* code==2: set vectorhandle */
|
||||
/* als code==3 (HD_ALIGN) toggelt het, vectorhandles worden HD_FREE */
|
||||
|
||||
switch(code) {
|
||||
case 1:
|
||||
/*** Set to auto ***/
|
||||
ipo_keys_bezier_loop(ipo, set_bezier_auto,
|
||||
calchandles_ipocurve);
|
||||
break;
|
||||
case 2:
|
||||
/*** Set to vector ***/
|
||||
ipo_keys_bezier_loop(ipo, set_bezier_vector,
|
||||
calchandles_ipocurve);
|
||||
break;
|
||||
default:
|
||||
if ( ipo_keys_bezier_loop(ipo, bezier_isfree, NULL) ) {
|
||||
/*** Set to free ***/
|
||||
ipo_keys_bezier_loop(ipo, set_bezier_free,
|
||||
calchandles_ipocurve);
|
||||
}
|
||||
else {
|
||||
/*** Set to align ***/
|
||||
ipo_keys_bezier_loop(ipo, set_bezier_align,
|
||||
calchandles_ipocurve);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
static void ipo_curves_auto_horiz(void)
|
||||
{
|
||||
EditIpo *ei;
|
||||
int a, set= 1;
|
||||
|
||||
ei= G.sipo->editipo;
|
||||
for(a=0; a<G.sipo->totipo; a++, ei++) {
|
||||
if (ISPOIN3(ei, flag & IPO_VISIBLE, flag & IPO_SELECT, icu))
|
||||
if(ei->flag & IPO_AUTO_HORIZ) set= 0;
|
||||
}
|
||||
|
||||
ei= G.sipo->editipo;
|
||||
for(a=0; a<G.sipo->totipo; a++, ei++) {
|
||||
if (ISPOIN3(ei, flag & IPO_VISIBLE, flag & IPO_SELECT, icu)) {
|
||||
if(set) ei->flag |= IPO_AUTO_HORIZ;
|
||||
else ei->flag &= ~IPO_AUTO_HORIZ;
|
||||
}
|
||||
}
|
||||
update_editipo_flags();
|
||||
}
|
||||
|
||||
void sethandles_ipo(int code)
|
||||
{
|
||||
/* this function lets you set bezier handles all to
|
||||
* one type for some selected keys in edit mode in the
|
||||
* IPO window (e.g. with hotkeys)
|
||||
*/
|
||||
|
||||
/* code==1: set autohandle */
|
||||
/* code==2: set vectorhandle */
|
||||
/* als code==3 (HD_ALIGN) toggelt het, vectorhandles worden HD_FREE */
|
||||
|
||||
if(G.sipo->ipo && G.sipo->ipo->id.lib) return;
|
||||
|
||||
switch(code) {
|
||||
case 1:
|
||||
/*** Set to auto ***/
|
||||
selected_bezier_loop(vis_edit_icu_bez, set_bezier_auto,
|
||||
calchandles_ipocurve);
|
||||
break;
|
||||
case 2:
|
||||
/*** Set to vector ***/
|
||||
selected_bezier_loop(vis_edit_icu_bez, set_bezier_vector,
|
||||
calchandles_ipocurve);
|
||||
break;
|
||||
case 4:
|
||||
/* set to enforce autohandles to be horizontal on extremes */
|
||||
ipo_curves_auto_horiz();
|
||||
|
||||
break;
|
||||
default:
|
||||
if (selected_bezier_loop(vis_edit_icu_bez, bezier_isfree, NULL) ) {
|
||||
/*** Set to free ***/
|
||||
selected_bezier_loop(vis_edit_icu_bez, set_bezier_free,
|
||||
calchandles_ipocurve);
|
||||
}
|
||||
else {
|
||||
/*** Set to align ***/
|
||||
selected_bezier_loop(vis_edit_icu_bez, set_bezier_align,
|
||||
calchandles_ipocurve);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
editipo_changed(G.sipo, 1);
|
||||
BIF_undo_push("Set handles Ipo");
|
||||
}
|
||||
|
||||
|
||||
static void set_ipocurve_constant(struct IpoCurve *icu) {
|
||||
/* Sets the type of the IPO curve to constant
|
||||
*/
|
||||
icu->ipo= IPO_CONST;
|
||||
}
|
||||
|
||||
static void set_ipocurve_linear(struct IpoCurve *icu) {
|
||||
/* Sets the type of the IPO curve to linear
|
||||
*/
|
||||
icu->ipo= IPO_LIN;
|
||||
}
|
||||
|
||||
static void set_ipocurve_bezier(struct IpoCurve *icu) {
|
||||
/* Sets the type of the IPO curve to bezier
|
||||
*/
|
||||
icu->ipo= IPO_BEZ;
|
||||
}
|
||||
|
||||
|
||||
void setipotype_ipo(Ipo *ipo, int code)
|
||||
{
|
||||
/* Sets the type of the each ipo curve in the
|
||||
* Ipo to a value based on the code
|
||||
*/
|
||||
switch (code) {
|
||||
case 1:
|
||||
ipo_keys_bezier_loop(ipo, NULL, set_ipocurve_constant);
|
||||
break;
|
||||
case 2:
|
||||
ipo_keys_bezier_loop(ipo, NULL, set_ipocurve_linear);
|
||||
break;
|
||||
case 3:
|
||||
ipo_keys_bezier_loop(ipo, NULL, set_ipocurve_bezier);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void set_ipotype(void)
|
||||
{
|
||||
EditIpo *ei;
|
||||
int a;
|
||||
short event;
|
||||
|
||||
if(G.sipo->ipo && G.sipo->ipo->id.lib) return;
|
||||
if(G.sipo->showkey) return;
|
||||
get_status_editipo();
|
||||
|
||||
if(G.sipo->blocktype==ID_KE && totipo_edit==0 && totipo_sel==0) {
|
||||
Key *key= (Key *)G.sipo->from;
|
||||
Object *ob= OBACT;
|
||||
KeyBlock *kb;
|
||||
|
||||
if(key==NULL) return;
|
||||
kb= BLI_findlink(&key->block, ob->shapenr-1);
|
||||
|
||||
event= pupmenu("Key Type %t|Linear %x1|Cardinal %x2|B Spline %x3");
|
||||
if(event < 1) return;
|
||||
|
||||
kb->type= 0;
|
||||
if(event==1) kb->type= KEY_LINEAR;
|
||||
if(event==2) kb->type= KEY_CARDINAL;
|
||||
if(event==3) kb->type= KEY_BSPLINE;
|
||||
}
|
||||
else {
|
||||
event= pupmenu("Ipo Type %t|Constant %x1|Linear %x2|Bezier %x3");
|
||||
if(event < 1) return;
|
||||
|
||||
ei= G.sipo->editipo;
|
||||
for(a=0; a<G.sipo->totipo; a++, ei++) {
|
||||
if (ISPOIN3(ei, flag & IPO_VISIBLE, flag & IPO_SELECT, icu)) {
|
||||
if(event==1) ei->icu->ipo= IPO_CONST;
|
||||
else if(event==2) ei->icu->ipo= IPO_LIN;
|
||||
else ei->icu->ipo= IPO_BEZ;
|
||||
}
|
||||
}
|
||||
}
|
||||
BIF_undo_push("Set ipo type");
|
||||
scrarea_queue_winredraw(curarea);
|
||||
}
|
||||
|
||||
void borderselect_ipo(void)
|
||||
{
|
||||
EditIpo *ei;
|
||||
IpoKey *ik;
|
||||
BezTriple *bezt;
|
||||
rcti rect;
|
||||
rctf rectf;
|
||||
int a, b, val;
|
||||
short mval[2];
|
||||
|
||||
get_status_editipo();
|
||||
|
||||
val= get_border(&rect, 3);
|
||||
|
||||
if(val) {
|
||||
mval[0]= rect.xmin;
|
||||
mval[1]= rect.ymin;
|
||||
areamouseco_to_ipoco(G.v2d, mval, &rectf.xmin, &rectf.ymin);
|
||||
mval[0]= rect.xmax;
|
||||
mval[1]= rect.ymax;
|
||||
areamouseco_to_ipoco(G.v2d, mval, &rectf.xmax, &rectf.ymax);
|
||||
|
||||
if(G.sipo->showkey) {
|
||||
ik= G.sipo->ipokey.first;
|
||||
while(ik) {
|
||||
if(rectf.xmin<ik->val && rectf.xmax>ik->val) {
|
||||
if(val==LEFTMOUSE) ik->flag |= 1;
|
||||
else ik->flag &= ~1;
|
||||
}
|
||||
ik= ik->next;
|
||||
}
|
||||
update_editipo_flags();
|
||||
}
|
||||
else if(totipo_edit==0) {
|
||||
if(rect.xmin<rect.xmax && rect.ymin<rect.ymax)
|
||||
select_proj_ipo(&rectf, val);
|
||||
}
|
||||
else {
|
||||
|
||||
ei= G.sipo->editipo;
|
||||
for(a=0; a<G.sipo->totipo; a++, ei++) {
|
||||
if (ISPOIN3(ei, flag & IPO_VISIBLE, flag & IPO_EDIT, icu)) {
|
||||
if(ei->icu->bezt) {
|
||||
b= ei->icu->totvert;
|
||||
bezt= ei->icu->bezt;
|
||||
while(b--) {
|
||||
int bit= (val==LEFTMOUSE);
|
||||
|
||||
if(BLI_in_rctf(&rectf, bezt->vec[0][0], bezt->vec[0][1]))
|
||||
bezt->f1 = (bezt->f1&~1) | bit;
|
||||
if(BLI_in_rctf(&rectf, bezt->vec[1][0], bezt->vec[1][1]))
|
||||
bezt->f2 = (bezt->f2&~1) | bit;
|
||||
if(BLI_in_rctf(&rectf, bezt->vec[2][0], bezt->vec[2][1]))
|
||||
bezt->f3 = (bezt->f3&~1) | bit;
|
||||
|
||||
bezt++;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
BIF_undo_push("Border select Ipo");
|
||||
scrarea_queue_winredraw(curarea);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
void nextkey(ListBase *elems, int dir)
|
||||
{
|
||||
IpoKey *ik, *previk;
|
||||
int totsel;
|
||||
|
||||
if(dir==1) ik= elems->last;
|
||||
else ik= elems->first;
|
||||
previk= 0;
|
||||
totsel= 0;
|
||||
|
||||
while(ik) {
|
||||
|
||||
if(ik->flag) totsel++;
|
||||
|
||||
if(previk) {
|
||||
if(G.qual & LR_SHIFTKEY) {
|
||||
if(ik->flag) previk->flag= 1;
|
||||
}
|
||||
else previk->flag= ik->flag;
|
||||
}
|
||||
|
||||
previk= ik;
|
||||
if(dir==1) ik= ik->prev;
|
||||
else ik= ik->next;
|
||||
|
||||
if(G.qual & LR_SHIFTKEY);
|
||||
else if(ik==0) previk->flag= 0;
|
||||
}
|
||||
|
||||
/* when no key select: */
|
||||
if(totsel==0) {
|
||||
if(dir==1) ik= elems->first;
|
||||
else ik= elems->last;
|
||||
|
||||
if(ik) ik->flag= 1;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void nextkey_ipo(int dir) /* call from ipo queue */
|
||||
{
|
||||
IpoKey *ik;
|
||||
int a;
|
||||
|
||||
if(G.sipo->showkey==0) return;
|
||||
|
||||
nextkey(&G.sipo->ipokey, dir);
|
||||
|
||||
/* copy to beziers */
|
||||
ik= G.sipo->ipokey.first;
|
||||
while(ik) {
|
||||
for(a=0; a<G.sipo->totipo; a++) {
|
||||
if(ik->data[a]) ik->data[a]->f1= ik->data[a]->f2= ik->data[a]->f3= ik->flag;
|
||||
}
|
||||
ik= ik->next;
|
||||
}
|
||||
|
||||
allqueue(REDRAWNLA, 0);
|
||||
allqueue(REDRAWACTION, 0);
|
||||
allqueue(REDRAWIPO, 0);
|
||||
if(G.sipo->blocktype == ID_OB) allqueue(REDRAWVIEW3D, 0);
|
||||
}
|
||||
|
||||
void nextkey_obipo(int dir) /* only call external from view3d queue */
|
||||
{
|
||||
Base *base;
|
||||
Object *ob;
|
||||
ListBase elems;
|
||||
IpoKey *ik;
|
||||
int a;
|
||||
|
||||
/* problem: this doesnt work when you mix dLoc keys with Loc keys */
|
||||
|
||||
base= FIRSTBASE;
|
||||
while(base) {
|
||||
if TESTBASE(base) {
|
||||
ob= base->object;
|
||||
if( (ob->ipoflag & OB_DRAWKEY) && ob->ipo && ob->ipo->showkey) {
|
||||
elems.first= elems.last= 0;
|
||||
make_ipokey_transform(ob, &elems, 0);
|
||||
|
||||
if(elems.first) {
|
||||
|
||||
nextkey(&elems, dir);
|
||||
|
||||
/* copy to beziers */
|
||||
ik= elems.first;
|
||||
while(ik) {
|
||||
for(a=0; a<OB_TOTIPO; a++) {
|
||||
if(ik->data[a]) ik->data[a]->f1= ik->data[a]->f2= ik->data[a]->f3= ik->flag;
|
||||
}
|
||||
ik= ik->next;
|
||||
}
|
||||
|
||||
free_ipokey(&elems);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
base= base->next;
|
||||
}
|
||||
allqueue(REDRAWNLA, 0);
|
||||
allqueue(REDRAWACTION, 0);
|
||||
allqueue(REDRAWVIEW3D, 0);
|
||||
allspace(REMAKEIPO, 0);
|
||||
allqueue(REDRAWIPO, 0);
|
||||
}
|
||||
|
||||
int is_ipo_key_selected(Ipo *ipo)
|
||||
{
|
||||
int i;
|
||||
IpoCurve *icu;
|
||||
|
||||
if (!ipo)
|
||||
return 0;
|
||||
|
||||
for (icu=ipo->curve.first; icu; icu=icu->next){
|
||||
for (i=0; i<icu->totvert; i++)
|
||||
if (BEZSELECTED(&icu->bezt[i]))
|
||||
return 1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void set_ipo_key_selection(Ipo *ipo, int sel)
|
||||
{
|
||||
int i;
|
||||
IpoCurve *icu;
|
||||
|
||||
if (!ipo)
|
||||
return;
|
||||
|
||||
for (icu=ipo->curve.first; icu; icu=icu->next){
|
||||
for (i=0; i<icu->totvert; i++){
|
||||
if (sel){
|
||||
icu->bezt[i].f1|=1;
|
||||
icu->bezt[i].f2|=1;
|
||||
icu->bezt[i].f3|=1;
|
||||
}
|
||||
else{
|
||||
icu->bezt[i].f1&=~1;
|
||||
icu->bezt[i].f2&=~1;
|
||||
icu->bezt[i].f3&=~1;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
int fullselect_ipo_keys(Ipo *ipo)
|
||||
{
|
||||
int i;
|
||||
IpoCurve *icu;
|
||||
int tvtot = 0;
|
||||
|
||||
if (!ipo)
|
||||
return tvtot;
|
||||
|
||||
for (icu=ipo->curve.first; icu; icu=icu->next){
|
||||
for (i=0; i<icu->totvert; i++){
|
||||
if (icu->bezt[i].f2 & 1){
|
||||
tvtot+=3;
|
||||
icu->bezt[i].f1 |= 1;
|
||||
icu->bezt[i].f3 |= 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return tvtot;
|
||||
}
|
||||
|
||||
|
||||
void borderselect_icu_key(IpoCurve *icu, float xmin, float xmax,
|
||||
int (*select_function)(BezTriple *))
|
||||
{
|
||||
/* Selects all bezier triples in the Ipocurve
|
||||
* between times xmin and xmax, using the selection
|
||||
* function.
|
||||
*/
|
||||
|
||||
int i;
|
||||
|
||||
/* loop through all of the bezier triples in
|
||||
* the Ipocurve -- if the triple occurs between
|
||||
* times xmin and xmax then select it using the selection
|
||||
* function
|
||||
*/
|
||||
for (i=0; i<icu->totvert; i++){
|
||||
if (icu->bezt[i].vec[1][0] > xmin && icu->bezt[i].vec[1][0] < xmax ){
|
||||
select_function(&(icu->bezt[i]));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void borderselect_ipo_key(Ipo *ipo, float xmin, float xmax, int selectmode)
|
||||
{
|
||||
/* Selects all bezier triples in each Ipocurve of the
|
||||
* Ipo between times xmin and xmax, using the selection mode.
|
||||
*/
|
||||
|
||||
IpoCurve *icu;
|
||||
int (*select_function)(BezTriple *);
|
||||
|
||||
/* If the ipo is no good then return */
|
||||
if (!ipo)
|
||||
return;
|
||||
|
||||
/* Set the selection function based on the
|
||||
* selection mode.
|
||||
*/
|
||||
switch(selectmode) {
|
||||
case SELECT_ADD:
|
||||
select_function = select_bezier_add;
|
||||
break;
|
||||
case SELECT_SUBTRACT:
|
||||
select_function = select_bezier_subtract;
|
||||
break;
|
||||
case SELECT_INVERT:
|
||||
select_function = select_bezier_invert;
|
||||
break;
|
||||
default:
|
||||
return;
|
||||
}
|
||||
|
||||
/* loop through all of the bezier triples in all
|
||||
* of the Ipocurves -- if the triple occurs between
|
||||
* times xmin and xmax then select it using the selection
|
||||
* function
|
||||
*/
|
||||
for (icu=ipo->curve.first; icu; icu=icu->next){
|
||||
borderselect_icu_key(icu, xmin, xmax, select_function);
|
||||
}
|
||||
}
|
||||
|
||||
void select_ipo_key(Ipo *ipo, float selx, int selectmode)
|
||||
{
|
||||
/* Selects all bezier triples in each Ipocurve of the
|
||||
* Ipo at time selx, using the selection mode.
|
||||
*/
|
||||
int i;
|
||||
IpoCurve *icu;
|
||||
int (*select_function)(BezTriple *);
|
||||
|
||||
/* If the ipo is no good then return */
|
||||
if (!ipo)
|
||||
return;
|
||||
|
||||
/* Set the selection function based on the
|
||||
* selection mode.
|
||||
*/
|
||||
switch(selectmode) {
|
||||
case SELECT_ADD:
|
||||
select_function = select_bezier_add;
|
||||
break;
|
||||
case SELECT_SUBTRACT:
|
||||
select_function = select_bezier_subtract;
|
||||
break;
|
||||
case SELECT_INVERT:
|
||||
select_function = select_bezier_invert;
|
||||
break;
|
||||
default:
|
||||
return;
|
||||
}
|
||||
|
||||
/* loop through all of the bezier triples in all
|
||||
* of the Ipocurves -- if the triple occurs at
|
||||
* time selx then select it using the selection
|
||||
* function
|
||||
*/
|
||||
for (icu=ipo->curve.first; icu; icu=icu->next){
|
||||
for (i=0; i<icu->totvert; i++){
|
||||
if (icu->bezt[i].vec[1][0]==selx){
|
||||
select_function(&(icu->bezt[i]));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void select_icu_key(IpoCurve *icu, float selx, int selectmode)
|
||||
{
|
||||
/* Selects all bezier triples in the Ipocurve
|
||||
* at time selx, using the selection mode.
|
||||
* This is kind of sloppy the obvious similarities
|
||||
* with the above function, forgive me ...
|
||||
*/
|
||||
int i;
|
||||
int (*select_function)(BezTriple *);
|
||||
|
||||
/* If the icu is no good then return */
|
||||
if (!icu)
|
||||
return;
|
||||
|
||||
/* Set the selection function based on the
|
||||
* selection mode.
|
||||
*/
|
||||
switch(selectmode) {
|
||||
case SELECT_ADD:
|
||||
select_function = select_bezier_add;
|
||||
break;
|
||||
case SELECT_SUBTRACT:
|
||||
select_function = select_bezier_subtract;
|
||||
break;
|
||||
case SELECT_INVERT:
|
||||
select_function = select_bezier_invert;
|
||||
break;
|
||||
default:
|
||||
return;
|
||||
}
|
||||
|
||||
/* loop through all of the bezier triples in
|
||||
* the Ipocurve -- if the triple occurs at
|
||||
* time selx then select it using the selection
|
||||
* function
|
||||
*/
|
||||
for (i=0; i<icu->totvert; i++){
|
||||
if (icu->bezt[i].vec[1][0]==selx){
|
||||
select_function(&(icu->bezt[i]));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void set_exprap_ipo(int mode)
|
||||
{
|
||||
EditIpo *ei;
|
||||
int a;
|
||||
|
||||
if(G.sipo->ipo && G.sipo->ipo->id.lib) return;
|
||||
/* in case of keys: always ok */
|
||||
|
||||
ei= G.sipo->editipo;
|
||||
for(a=0; a<G.sipo->totipo; a++, ei++) {
|
||||
if (ISPOIN(ei, flag & IPO_VISIBLE, icu)) {
|
||||
if( (ei->flag & IPO_EDIT) || (ei->flag & IPO_SELECT) || (G.sipo->showkey) ) {
|
||||
ei->icu->extrap= mode;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
editipo_changed(G.sipo, 1);
|
||||
BIF_undo_push("Set extrapolation Ipo");
|
||||
}
|
||||
|
||||
|
||||
@@ -96,18 +96,20 @@ float meshslidervals[64] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
|
||||
0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
|
||||
0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0};
|
||||
|
||||
static IpoCurve *get_key_icu(Key *key, int keynum) {
|
||||
static IpoCurve *get_key_icu(Key *key, int keynum)
|
||||
{
|
||||
/* return the Ipocurve that has the specified
|
||||
* keynum as ardcode -- return NULL if no such
|
||||
* curve exists.
|
||||
*/
|
||||
IpoCurve *icu;
|
||||
|
||||
/* why this? (ton) */
|
||||
if (!(key->ipo)) {
|
||||
key->ipo = get_ipo((ID *)key, ID_KE, 1);
|
||||
key->ipo= add_ipo("KeyIpo", ID_KE);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
for (icu = key->ipo->curve.first; icu ; icu = icu->next) {
|
||||
if (!icu->adrcode) continue;
|
||||
if (icu->adrcode == keynum) return icu;
|
||||
@@ -158,7 +160,7 @@ static void rvk_slider_func(void *voidkey, void *voidkeynum)
|
||||
|
||||
cfra = frame_to_float(CFRA);
|
||||
|
||||
icu = get_key_icu(key, keynum);
|
||||
icu = verify_ipocurve(&key->id, ID_KE, NULL, NULL, keynum);
|
||||
|
||||
if (icu) {
|
||||
/* if the ipocurve exists, try to get a bezier
|
||||
@@ -166,12 +168,6 @@ static void rvk_slider_func(void *voidkey, void *voidkeynum)
|
||||
*/
|
||||
bezt = get_bezt_icu_time(icu, &cfra, &rvkval);
|
||||
}
|
||||
else {
|
||||
/* create an IpoCurve if one doesn't already
|
||||
* exist.
|
||||
*/
|
||||
icu = get_ipocurve(key->from, GS(key->from->name), keynum, key->ipo);
|
||||
}
|
||||
|
||||
/* create the bezier triple if one doesn't exist,
|
||||
* otherwise modify it's value
|
||||
|
||||
@@ -40,13 +40,6 @@
|
||||
|
||||
#include "PIL_time.h"
|
||||
|
||||
#include "BKE_action.h"
|
||||
#include "BKE_global.h"
|
||||
#include "BKE_ipo.h"
|
||||
#include "BKE_library.h"
|
||||
#include "BKE_main.h"
|
||||
#include "BKE_nla.h"
|
||||
|
||||
#include "MEM_guardedalloc.h"
|
||||
|
||||
#include "BLI_blenlib.h"
|
||||
@@ -62,6 +55,14 @@
|
||||
#include "DNA_nla_types.h"
|
||||
#include "DNA_constraint_types.h"
|
||||
|
||||
#include "BKE_action.h"
|
||||
#include "BKE_depsgraph.h"
|
||||
#include "BKE_global.h"
|
||||
#include "BKE_ipo.h"
|
||||
#include "BKE_library.h"
|
||||
#include "BKE_main.h"
|
||||
#include "BKE_nla.h"
|
||||
|
||||
#include "BIF_screen.h"
|
||||
#include "BIF_interface.h"
|
||||
#include "BIF_butspace.h"
|
||||
@@ -98,8 +99,6 @@ static Base *get_nearest_nlastrip (bActionStrip **rstrip, short *sel);
|
||||
static void mouse_nlachannels(short mval[2]);
|
||||
static void add_nlablock(short mval[2]);
|
||||
static void convert_nla(short mval[2]);
|
||||
extern int count_nla_levels(void); /* From drawnla.c */
|
||||
extern int nla_filter (Base* base, int flags); /* From drawnla.c */
|
||||
|
||||
/* ******************** SPACE: NLA ********************** */
|
||||
|
||||
@@ -109,31 +108,28 @@ void shift_nlastrips_up(void) {
|
||||
bActionStrip *strip, *prevstrip;
|
||||
|
||||
for (base=G.scene->base.first; base; base=base->next) {
|
||||
if (base->object->type == OB_ARMATURE) {
|
||||
for (strip = base->object->nlastrips.first;
|
||||
strip; strip=strip->next){
|
||||
if (strip->flag & ACTSTRIP_SELECT) {
|
||||
if ( (prevstrip = strip->prev) ) {
|
||||
if (prevstrip->prev)
|
||||
prevstrip->prev->next = strip;
|
||||
if (strip->next)
|
||||
strip->next->prev = prevstrip;
|
||||
strip->prev = prevstrip->prev;
|
||||
prevstrip->next = strip->next;
|
||||
strip->next = prevstrip;
|
||||
prevstrip->prev = strip;
|
||||
|
||||
for (strip = base->object->nlastrips.first;
|
||||
strip; strip=strip->next){
|
||||
if (strip->flag & ACTSTRIP_SELECT) {
|
||||
if ( (prevstrip = strip->prev) ) {
|
||||
if (prevstrip->prev)
|
||||
prevstrip->prev->next = strip;
|
||||
if (strip->next)
|
||||
strip->next->prev = prevstrip;
|
||||
strip->prev = prevstrip->prev;
|
||||
prevstrip->next = strip->next;
|
||||
strip->next = prevstrip;
|
||||
prevstrip->prev = strip;
|
||||
if (prevstrip == base->object->nlastrips.first)
|
||||
base->object->nlastrips.first = strip;
|
||||
if (strip == base->object->nlastrips.last)
|
||||
base->object->nlastrips.last = prevstrip;
|
||||
|
||||
if (prevstrip == base->object->nlastrips.first)
|
||||
base->object->nlastrips.first = strip;
|
||||
if (strip == base->object->nlastrips.last)
|
||||
base->object->nlastrips.last = prevstrip;
|
||||
|
||||
strip = prevstrip;
|
||||
}
|
||||
else {
|
||||
break;
|
||||
}
|
||||
strip = prevstrip;
|
||||
}
|
||||
else {
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -149,37 +145,35 @@ void shift_nlastrips_down(void) {
|
||||
bActionStrip *strip, *nextstrip;
|
||||
|
||||
for (base=G.scene->base.first; base; base=base->next) {
|
||||
if (base->object->type == OB_ARMATURE) {
|
||||
for (strip = base->object->nlastrips.last;
|
||||
strip; strip=strip->prev){
|
||||
if (strip->flag & ACTSTRIP_SELECT) {
|
||||
if ( (nextstrip = strip->next) ) {
|
||||
if (nextstrip->next)
|
||||
nextstrip->next->prev = strip;
|
||||
if (strip->prev)
|
||||
strip->prev->next = nextstrip;
|
||||
strip->next = nextstrip->next;
|
||||
nextstrip->prev = strip->prev;
|
||||
strip->prev = nextstrip;
|
||||
nextstrip->next = strip;
|
||||
for (strip = base->object->nlastrips.last;
|
||||
strip; strip=strip->prev){
|
||||
if (strip->flag & ACTSTRIP_SELECT) {
|
||||
if ( (nextstrip = strip->next) ) {
|
||||
if (nextstrip->next)
|
||||
nextstrip->next->prev = strip;
|
||||
if (strip->prev)
|
||||
strip->prev->next = nextstrip;
|
||||
strip->next = nextstrip->next;
|
||||
nextstrip->prev = strip->prev;
|
||||
strip->prev = nextstrip;
|
||||
nextstrip->next = strip;
|
||||
|
||||
if (nextstrip == base->object->nlastrips.last)
|
||||
base->object->nlastrips.last = strip;
|
||||
if (strip == base->object->nlastrips.first)
|
||||
base->object->nlastrips.first = nextstrip;
|
||||
if (nextstrip == base->object->nlastrips.last)
|
||||
base->object->nlastrips.last = strip;
|
||||
if (strip == base->object->nlastrips.first)
|
||||
base->object->nlastrips.first = nextstrip;
|
||||
|
||||
strip = nextstrip;
|
||||
}
|
||||
else {
|
||||
break;
|
||||
}
|
||||
strip = nextstrip;
|
||||
}
|
||||
else {
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
BIF_undo_push("Shift NLA strips");
|
||||
allqueue (REDRAWNLA, 0);
|
||||
|
||||
}
|
||||
|
||||
void winqreadnlaspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
|
||||
@@ -267,7 +261,7 @@ void winqreadnlaspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
|
||||
|
||||
case GKEY:
|
||||
if (mval[0]>=NLAWIDTH)
|
||||
transform_nlachannel_keys ('g');
|
||||
transform_nlachannel_keys ('g', 0);
|
||||
update_for_newframe_muted();
|
||||
break;
|
||||
|
||||
@@ -280,7 +274,7 @@ void winqreadnlaspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
|
||||
|
||||
case SKEY:
|
||||
if (mval[0]>=NLAWIDTH)
|
||||
transform_nlachannel_keys ('s');
|
||||
transform_nlachannel_keys ('s', 0);
|
||||
update_for_newframe_muted();
|
||||
break;
|
||||
|
||||
@@ -288,17 +282,17 @@ void winqreadnlaspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
|
||||
case XKEY:
|
||||
if (mval[0]>=NLAWIDTH)
|
||||
delete_nlachannel_keys ();
|
||||
else
|
||||
delete_nlachannels();
|
||||
|
||||
update_for_newframe_muted();
|
||||
break;
|
||||
|
||||
|
||||
/* LEFTMOUSE and RIGHTMOUSE event codes can be swapped above,
|
||||
* based on user preference USER_LMOUSESELECT
|
||||
*/
|
||||
case LEFTMOUSE:
|
||||
if(view2dmove(LEFTMOUSE)); // only checks for sliders
|
||||
else if (mval[0]>NLAWIDTH){
|
||||
if(view2dmove(LEFTMOUSE))
|
||||
break; // only checks for sliders
|
||||
else if (mval[0]>=snla->v2d.mask.xmin) {
|
||||
do {
|
||||
getmouseco_areawin(mval);
|
||||
|
||||
@@ -310,16 +304,16 @@ void winqreadnlaspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
|
||||
if( cfra!=CFRA ) {
|
||||
CFRA= cfra;
|
||||
update_for_newframe();
|
||||
force_draw_plus(SPACE_VIEW3D, 1);
|
||||
force_draw_plus(SPACE_IPO, 1);
|
||||
force_draw_all(0);
|
||||
}
|
||||
else PIL_sleep_ms(30);
|
||||
|
||||
} while(get_mbut() & mousebut);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
/* else pass on! */
|
||||
case RIGHTMOUSE:
|
||||
if (mval[0]>=NLAWIDTH) {
|
||||
if (mval[0]>=snla->v2d.mask.xmin) {
|
||||
if(G.qual & LR_SHIFTKEY)
|
||||
mouse_nla(SELECT_INVERT);
|
||||
else
|
||||
@@ -350,6 +344,31 @@ void winqreadnlaspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
|
||||
if(doredraw) scrarea_queue_winredraw(curarea);
|
||||
}
|
||||
|
||||
static void set_active_strip(Object *ob, bActionStrip *act)
|
||||
{
|
||||
bActionStrip *strip;
|
||||
|
||||
for (strip = ob->nlastrips.first; strip; strip=strip->next)
|
||||
strip->flag &= ~ACTSTRIP_ACTIVE;
|
||||
|
||||
if(act) {
|
||||
act->flag |= ACTSTRIP_ACTIVE;
|
||||
|
||||
if(ob->action!=act->act) {
|
||||
if(ob->action) ob->action->id.us--;
|
||||
ob->action= act->act;
|
||||
ob->action->id.us++;
|
||||
|
||||
allqueue(REDRAWIPO, 0);
|
||||
allqueue(REDRAWVIEW3D, 0);
|
||||
allqueue(REDRAWACTION, 0);
|
||||
allqueue(REDRAWNLA, 0);
|
||||
ob->ctime= -1234567.0f; // eveil!
|
||||
DAG_object_flush_update(G.scene, ob, OB_RECALC_OB|OB_RECALC_DATA);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void convert_nla(short mval[2])
|
||||
{
|
||||
short event;
|
||||
@@ -358,6 +377,7 @@ static void convert_nla(short mval[2])
|
||||
float x,y;
|
||||
int sel=0;
|
||||
bActionStrip *strip, *nstrip;
|
||||
|
||||
/* Find out what strip we're over */
|
||||
ymax = count_nla_levels() * (NLACHANNELSKIP+NLACHANNELHEIGHT);
|
||||
ymax+= NLACHANNELHEIGHT/2;
|
||||
@@ -365,74 +385,73 @@ static void convert_nla(short mval[2])
|
||||
areamouseco_to_ipoco(G.v2d, mval, &x, &y);
|
||||
|
||||
for (base=G.scene->base.first; base; base=base->next){
|
||||
if (nla_filter(base, 0)){
|
||||
if (nla_filter(base)) {
|
||||
/* Check object ipo */
|
||||
ymin=ymax-(NLACHANNELSKIP+NLACHANNELHEIGHT);
|
||||
ymin= ymax-(NLACHANNELSKIP+NLACHANNELHEIGHT);
|
||||
if (y>=ymin && y<=ymax)
|
||||
break;
|
||||
ymax=ymin;
|
||||
|
||||
if (base->object->type==OB_ARMATURE){
|
||||
/* Check action ipo */
|
||||
ymin=ymax-(NLACHANNELSKIP+NLACHANNELHEIGHT);
|
||||
if (y>=ymin && y<=ymax)
|
||||
break;
|
||||
ymax=ymin;
|
||||
/* Check action ipo */
|
||||
ymin=ymax-(NLACHANNELSKIP+NLACHANNELHEIGHT);
|
||||
if (y>=ymin && y<=ymax)
|
||||
break;
|
||||
ymax=ymin;
|
||||
|
||||
/* Check nlastrips */
|
||||
for (strip=base->object->nlastrips.first; strip; strip=strip->next){
|
||||
ymin=ymax-(NLACHANNELSKIP+NLACHANNELHEIGHT);
|
||||
if (y>=ymin && y<=ymax){
|
||||
sel = 1;
|
||||
break;
|
||||
}
|
||||
ymax=ymin;
|
||||
}
|
||||
if (sel)
|
||||
/* Check nlastrips */
|
||||
for (strip=base->object->nlastrips.first; strip; strip=strip->next){
|
||||
ymin=ymax-(NLACHANNELSKIP+NLACHANNELHEIGHT);
|
||||
if (y>=ymin && y<=ymax){
|
||||
sel = 1;
|
||||
break;
|
||||
}
|
||||
ymax=ymin;
|
||||
}
|
||||
if (sel)
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (!base)
|
||||
return;
|
||||
|
||||
if (base->object->type==OB_ARMATURE){
|
||||
event = pupmenu("Convert%t|Action to NLA Strip%x1");
|
||||
switch (event){
|
||||
case 1:
|
||||
if (base->object->action){
|
||||
/* Make new actionstrip */
|
||||
nstrip = MEM_callocN(sizeof(bActionStrip), "bActionStrip");
|
||||
|
||||
deselect_nlachannel_keys(0);
|
||||
|
||||
/* Link the action to the nstrip */
|
||||
nstrip->act = base->object->action;
|
||||
nstrip->actstart = calc_action_start(base->object->action); /* MAKE THIS THE FIRST FRAME OF THE ACTION */
|
||||
nstrip->actend = calc_action_end(base->object->action);
|
||||
nstrip->start = nstrip->actstart;
|
||||
nstrip->end = nstrip->actend;
|
||||
nstrip->flag = ACTSTRIP_SELECT;
|
||||
nstrip->repeat = 1.0;
|
||||
|
||||
BLI_addtail(&base->object->nlastrips, nstrip);
|
||||
|
||||
/* Unlink action */
|
||||
base->object->action = NULL;
|
||||
|
||||
BIF_undo_push("Convert NLA");
|
||||
allqueue (REDRAWNLA, 0);
|
||||
}
|
||||
event = pupmenu("Convert%t|Action to NLA Strip%x1");
|
||||
switch (event){
|
||||
case 1:
|
||||
if (base->object->action){
|
||||
/* Make new actionstrip */
|
||||
nstrip = MEM_callocN(sizeof(bActionStrip), "bActionStrip");
|
||||
|
||||
deselect_nlachannel_keys(0);
|
||||
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
/* Link the action to the nstrip */
|
||||
nstrip->act = base->object->action;
|
||||
nstrip->actstart = calc_action_start(base->object->action); /* MAKE THIS THE FIRST FRAME OF THE ACTION */
|
||||
nstrip->actend = calc_action_end(base->object->action);
|
||||
nstrip->start = nstrip->actstart;
|
||||
nstrip->end = nstrip->actend;
|
||||
nstrip->flag = ACTSTRIP_SELECT;
|
||||
set_active_strip(base->object, nstrip);
|
||||
|
||||
nstrip->repeat = 1.0;
|
||||
|
||||
BLI_addtail(&base->object->nlastrips, nstrip);
|
||||
|
||||
/* Unlink action */
|
||||
base->object->action = NULL;
|
||||
|
||||
BIF_undo_push("Convert NLA");
|
||||
allqueue (REDRAWNLA, 0);
|
||||
}
|
||||
|
||||
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static Base *nla_base=NULL; /* global, bad, bad! put it in nla space later, or recode the 2 functions below (ton) */
|
||||
|
||||
static void add_nla_block(short event)
|
||||
@@ -461,14 +480,17 @@ static void add_nla_block(short event)
|
||||
|
||||
/* Link the action to the strip */
|
||||
strip->act = act;
|
||||
strip->actstart = 1.0;
|
||||
strip->actstart = calc_action_start(act);
|
||||
strip->actend = calc_action_end(act);
|
||||
strip->start = G.scene->r.cfra; /* Should be mval[0] */
|
||||
strip->start = G.scene->r.cfra; /* could be mval[0] another time... */
|
||||
strip->end = strip->start + (strip->actend-strip->actstart);
|
||||
if(strip->start<strip->end+2)
|
||||
/* simple prevention of zero strips */
|
||||
if(strip->start>strip->end-2)
|
||||
strip->end= strip->start+100;
|
||||
|
||||
strip->flag = ACTSTRIP_SELECT;
|
||||
set_active_strip(nla_base->object, strip);
|
||||
|
||||
strip->repeat = 1.0;
|
||||
|
||||
act->id.us++;
|
||||
@@ -492,15 +514,14 @@ static void add_nla_databrowse_callback(unsigned short val)
|
||||
|
||||
static void add_nlablock(short mval[2])
|
||||
{
|
||||
/* Make sure we are over an armature */
|
||||
/* Make sure we are over an object with action */
|
||||
Base *base;
|
||||
rctf rectf;
|
||||
float ymin, ymax;
|
||||
float x, y;
|
||||
rctf rectf;
|
||||
short event;
|
||||
char *str;
|
||||
short nr;
|
||||
bConstraintChannel *conchan=NULL;
|
||||
char *str;
|
||||
|
||||
areamouseco_to_ipoco(G.v2d, mval, &x, &y);
|
||||
|
||||
@@ -516,34 +537,22 @@ static void add_nlablock(short mval[2])
|
||||
|
||||
for (base=G.scene->base.first; base; base=base->next){
|
||||
/* Handle object ipo selection */
|
||||
if (nla_filter(base, 0)){
|
||||
if (nla_filter(base)) {
|
||||
|
||||
/* Area that encloses object name (or ipo) */
|
||||
ymin=ymax-(NLACHANNELHEIGHT+NLACHANNELSKIP);
|
||||
|
||||
/* Area that encloses constraint channels */
|
||||
for (conchan=base->object->constraintChannels.first;
|
||||
conchan; conchan=conchan->next){
|
||||
/* Area that encloses action */
|
||||
if (base->object->action)
|
||||
ymin-=(NLACHANNELHEIGHT+NLACHANNELSKIP);
|
||||
}
|
||||
|
||||
if (base->object->type==OB_ARMATURE){
|
||||
/* Area that encloses selected action, if
|
||||
* present
|
||||
*/
|
||||
if (base->object->action)
|
||||
ymin-=(NLACHANNELHEIGHT+NLACHANNELSKIP);
|
||||
/* Area that encloses nla strips */
|
||||
ymin-=(NLACHANNELHEIGHT+NLACHANNELSKIP)*
|
||||
(BLI_countlist(&base->object->nlastrips));
|
||||
|
||||
/* Area that encloses nla strips */
|
||||
ymin-=(NLACHANNELHEIGHT+NLACHANNELSKIP)*
|
||||
(BLI_countlist(&base->object->nlastrips));
|
||||
}
|
||||
|
||||
/* Test to see the mouse is in an armature area */
|
||||
if (base->object->type==OB_ARMATURE){
|
||||
if (!((ymax < rectf.ymin) || (ymin > rectf.ymax)))
|
||||
break;
|
||||
}
|
||||
/* Test to see the mouse is in an action area */
|
||||
if (!((ymax < rectf.ymin) || (ymin > rectf.ymax)))
|
||||
break;
|
||||
|
||||
ymax=ymin;
|
||||
}
|
||||
@@ -552,9 +561,9 @@ static void add_nlablock(short mval[2])
|
||||
/* global... for the call above, because the NLA system seems not to have an 'active strip' stored */
|
||||
nla_base= base;
|
||||
|
||||
/* Make sure we have an armature */
|
||||
/* Make sure we have an action */
|
||||
if (!base){
|
||||
error ("Not an armature");
|
||||
error ("Object has not an Action");
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -581,127 +590,83 @@ static void add_nlablock(short mval[2])
|
||||
*/
|
||||
}
|
||||
|
||||
/* Left hand side of channels display, selects objects */
|
||||
static void mouse_nlachannels(short mval[2])
|
||||
{
|
||||
/* Find which strip has been clicked */
|
||||
// bActionChannel *chan;
|
||||
bConstraintChannel *conchan=NULL;
|
||||
bActionStrip *strip;
|
||||
float click, x,y;
|
||||
int wsize;
|
||||
int sel;
|
||||
bActionStrip *strip= NULL;
|
||||
Base *base;
|
||||
Object *ob=NULL;
|
||||
float x,y;
|
||||
int click, obclick=0;
|
||||
int wsize;
|
||||
|
||||
wsize = (count_nla_levels ()*(NLACHANNELHEIGHT+NLACHANNELSKIP));
|
||||
wsize+= NLACHANNELHEIGHT/2;
|
||||
|
||||
areamouseco_to_ipoco(G.v2d, mval, &x, &y);
|
||||
click = ((wsize - y) / (NLACHANNELHEIGHT+NLACHANNELSKIP));
|
||||
|
||||
areamouseco_to_ipoco(G.v2d, mval, &x, &y);
|
||||
click = (int)floor( ((float)wsize - y) / (NLACHANNELHEIGHT+NLACHANNELSKIP));
|
||||
|
||||
if (click<0)
|
||||
return;
|
||||
|
||||
for (base = G.scene->base.first; base; base=base->next){
|
||||
if (nla_filter(base, 0)) {
|
||||
/* See if this is a base selected */
|
||||
if ((int)click==0)
|
||||
break;
|
||||
if (nla_filter(base)) {
|
||||
ob= base->object;
|
||||
|
||||
/* See if this is a base selected */
|
||||
if (click==0) {
|
||||
obclick= 1;
|
||||
break;
|
||||
}
|
||||
click--;
|
||||
|
||||
/* Check for click in a constraint */
|
||||
for (conchan=base->object->constraintChannels.first; conchan; conchan=conchan->next){
|
||||
if ((int)click==0){
|
||||
base=G.scene->base.last;
|
||||
break;
|
||||
}
|
||||
click--;
|
||||
}
|
||||
|
||||
/* See if this is an action */
|
||||
if (base->object->type==OB_ARMATURE && base->object->action){
|
||||
if ((int)click==0){
|
||||
break;
|
||||
}
|
||||
if (ob->action){
|
||||
if (click==0) break;
|
||||
click--;
|
||||
}
|
||||
|
||||
/* See if this is an nla strip */
|
||||
for (strip = base->object->nlastrips.first; strip; strip=strip->next){
|
||||
if ((int)click==0){
|
||||
base=G.scene->base.last;
|
||||
break;
|
||||
if(ob->nlastrips.first) {
|
||||
for (strip = ob->nlastrips.first; strip; strip=strip->next){
|
||||
if (click==0) break;
|
||||
click--;
|
||||
}
|
||||
click--;
|
||||
if (strip && click==0) break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!base && !conchan)
|
||||
if (!base)
|
||||
return;
|
||||
|
||||
/* Handle constraint strip selection */
|
||||
if (conchan){
|
||||
if (conchan->flag & CONSTRAINT_CHANNEL_SELECT)
|
||||
sel = 0;
|
||||
else
|
||||
sel =1;
|
||||
|
||||
/* Channel names clicking */
|
||||
if (G.qual & LR_SHIFTKEY){
|
||||
// select_poseelement_by_name(chan->name, !(chan->flag & ACHAN_SELECTED));
|
||||
if (conchan->flag & CONSTRAINT_CHANNEL_SELECT){
|
||||
conchan->flag &= ~CONSTRAINT_CHANNEL_SELECT;
|
||||
// hilight_channel(act, chan, 0);
|
||||
}
|
||||
else{
|
||||
conchan->flag |= CONSTRAINT_CHANNEL_SELECT;
|
||||
// hilight_channel(act, chan, 1);
|
||||
}
|
||||
}
|
||||
else{
|
||||
deselect_nlachannels (0); // Auto clear
|
||||
conchan->flag |= CONSTRAINT_CHANNEL_SELECT;
|
||||
// hilight_channel(act, chan, 1);
|
||||
// act->achan = chan;
|
||||
// select_poseelement_by_name(chan->name, 1);
|
||||
}
|
||||
|
||||
/* Handle object strip selection */
|
||||
if (G.qual & LR_SHIFTKEY) {
|
||||
if (base->flag & SELECT) base->flag &= ~SELECT;
|
||||
else base->flag |= SELECT;
|
||||
}
|
||||
else {
|
||||
deselect_nlachannels (0); // Auto clear
|
||||
base->flag |= SELECT;
|
||||
}
|
||||
ob->flag= base->flag;
|
||||
|
||||
if(base!=BASACT) set_active_base(base);
|
||||
|
||||
/* set action */
|
||||
if(strip)
|
||||
set_active_strip(ob, strip);
|
||||
|
||||
/* override option for NLA */
|
||||
if(obclick && mval[0]<25) {
|
||||
ob->nlaflag ^= OB_NLA_OVERRIDE;
|
||||
ob->ctime= -1234567.0f; // eveil!
|
||||
DAG_object_flush_update(G.scene, ob, OB_RECALC_OB|OB_RECALC_DATA);
|
||||
}
|
||||
|
||||
/* Handle object strip selection */
|
||||
else if (base) {
|
||||
|
||||
/* Choose the mode */
|
||||
if (base->flag & SELECT)
|
||||
sel = 0;
|
||||
else
|
||||
sel =1;
|
||||
|
||||
/* Channel names clicking */
|
||||
if (G.qual & LR_SHIFTKEY) {
|
||||
// select_poseelement_by_name(chan->name, !(chan->flag & ACHAN_SELECTED));
|
||||
if (base->flag & SELECT) {
|
||||
base->flag &= ~SELECT;
|
||||
// hilight_channel(act, chan, 0);
|
||||
}
|
||||
else {
|
||||
base->flag |= SELECT;
|
||||
// hilight_channel(act, chan, 1);
|
||||
}
|
||||
}
|
||||
else {
|
||||
deselect_nlachannels (0); // Auto clear
|
||||
base->flag |= SELECT;
|
||||
// hilight_channel(act, chan, 1);
|
||||
// act->achan = chan;
|
||||
// select_poseelement_by_name(chan->name, 1);
|
||||
}
|
||||
|
||||
}
|
||||
allqueue (REDRAWIPO, 0);
|
||||
allqueue (REDRAWVIEW3D, 0);
|
||||
allqueue (REDRAWACTION, 0);
|
||||
allqueue(REDRAWIPO, 0);
|
||||
allqueue(REDRAWVIEW3D, 0);
|
||||
allqueue(REDRAWACTION, 0);
|
||||
allqueue(REDRAWNLA, 0);
|
||||
|
||||
}
|
||||
@@ -736,7 +701,7 @@ void deselect_nlachannel_keys (int test)
|
||||
|
||||
/* Test action ipos */
|
||||
if (sel){
|
||||
if (base->object->type==OB_ARMATURE && base->object->action){
|
||||
if (base->object->action){
|
||||
for (chan=base->object->action->chanbase.first; chan; chan=chan->next){
|
||||
if (is_ipo_key_selected(chan->ipo)){
|
||||
sel=0;
|
||||
@@ -758,12 +723,10 @@ void deselect_nlachannel_keys (int test)
|
||||
|
||||
/* Test NLA strips */
|
||||
if (sel){
|
||||
if (base->object->type==OB_ARMATURE){
|
||||
for (strip=base->object->nlastrips.first; strip; strip=strip->next){
|
||||
if (strip->flag & ACTSTRIP_SELECT){
|
||||
sel = 0;
|
||||
break;
|
||||
}
|
||||
for (strip=base->object->nlastrips.first; strip; strip=strip->next){
|
||||
if (strip->flag & ACTSTRIP_SELECT){
|
||||
sel = 0;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -775,9 +738,9 @@ void deselect_nlachannel_keys (int test)
|
||||
|
||||
/* Set the flags */
|
||||
for (base=G.scene->base.first; base; base=base->next){
|
||||
|
||||
/* Set the object ipos */
|
||||
set_ipo_key_selection(base->object->ipo, sel);
|
||||
|
||||
|
||||
/* Set the object constraint ipos */
|
||||
for (conchan=base->object->constraintChannels.first; conchan; conchan=conchan->next){
|
||||
@@ -785,7 +748,7 @@ void deselect_nlachannel_keys (int test)
|
||||
}
|
||||
|
||||
/* Set the action ipos */
|
||||
if (base->object->type==OB_ARMATURE && base->object->action){
|
||||
if (base->object->action){
|
||||
for (chan=base->object->action->chanbase.first; chan; chan=chan->next){
|
||||
set_ipo_key_selection(chan->ipo, sel);
|
||||
/* Set the action constraint ipos */
|
||||
@@ -795,13 +758,11 @@ void deselect_nlachannel_keys (int test)
|
||||
}
|
||||
|
||||
/* Set the nlastrips */
|
||||
if (base->object->type==OB_ARMATURE){
|
||||
for (strip=base->object->nlastrips.first; strip; strip=strip->next){
|
||||
if (sel)
|
||||
strip->flag |= ACTSTRIP_SELECT;
|
||||
else
|
||||
strip->flag &= ~ACTSTRIP_SELECT;
|
||||
}
|
||||
for (strip=base->object->nlastrips.first; strip; strip=strip->next){
|
||||
if (sel)
|
||||
strip->flag |= ACTSTRIP_SELECT;
|
||||
else
|
||||
strip->flag &= ~ACTSTRIP_SELECT;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -821,7 +782,7 @@ static void recalc_all_ipos(void)
|
||||
}
|
||||
}
|
||||
|
||||
void transform_nlachannel_keys(char mode)
|
||||
void transform_nlachannel_keys(int mode, int dummy)
|
||||
{
|
||||
Base *base;
|
||||
TransVert *tv;
|
||||
@@ -852,7 +813,7 @@ void transform_nlachannel_keys(char mode)
|
||||
tvtot+=fullselect_ipo_keys(conchan->ipo);
|
||||
|
||||
/* Check action ipos */
|
||||
if (base->object->type == OB_ARMATURE && base->object->action){
|
||||
if (base->object->action){
|
||||
for (chan=base->object->action->chanbase.first; chan; chan=chan->next){
|
||||
tvtot+=fullselect_ipo_keys(chan->ipo);
|
||||
|
||||
@@ -864,11 +825,9 @@ void transform_nlachannel_keys(char mode)
|
||||
}
|
||||
|
||||
/* Check nlastrips */
|
||||
if (base->object->type==OB_ARMATURE){
|
||||
for (strip=base->object->nlastrips.first; strip; strip=strip->next){
|
||||
if (strip->flag & ACTSTRIP_SELECT)
|
||||
tvtot+=2;
|
||||
}
|
||||
for (strip=base->object->nlastrips.first; strip; strip=strip->next){
|
||||
if (strip->flag & ACTSTRIP_SELECT)
|
||||
tvtot+=2;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -889,7 +848,7 @@ void transform_nlachannel_keys(char mode)
|
||||
tvtot=add_trans_ipo_keys(conchan->ipo, tv, tvtot);
|
||||
|
||||
/* Manipulate action ipos */
|
||||
if (base->object->type==OB_ARMATURE && base->object->action){
|
||||
if (base->object->action){
|
||||
for (chan=base->object->action->chanbase.first; chan; chan=chan->next){
|
||||
tvtot=add_trans_ipo_keys(chan->ipo, tv, tvtot);
|
||||
|
||||
@@ -1078,19 +1037,17 @@ void delete_nlachannel_keys(void)
|
||||
delete_ipo_keys(conchan->ipo);
|
||||
|
||||
/* Delete NLA strips */
|
||||
if (base->object->type==OB_ARMATURE){
|
||||
for (strip = base->object->nlastrips.first; strip; strip=nextstrip){
|
||||
nextstrip=strip->next;
|
||||
if (strip->flag & ACTSTRIP_SELECT){
|
||||
free_actionstrip(strip);
|
||||
BLI_remlink(&base->object->nlastrips, strip);
|
||||
MEM_freeN(strip);
|
||||
}
|
||||
for (strip = base->object->nlastrips.first; strip; strip=nextstrip){
|
||||
nextstrip=strip->next;
|
||||
if (strip->flag & ACTSTRIP_SELECT){
|
||||
free_actionstrip(strip);
|
||||
BLI_remlink(&base->object->nlastrips, strip);
|
||||
MEM_freeN(strip);
|
||||
}
|
||||
}
|
||||
|
||||
/* Delete action ipos */
|
||||
if (base->object->type==OB_ARMATURE && base->object->action){
|
||||
if (base->object->action){
|
||||
for (chan=base->object->action->chanbase.first; chan; chan=chan->next){
|
||||
delete_ipo_keys(chan->ipo);
|
||||
/* Delete action constraint keys */
|
||||
@@ -1125,27 +1082,26 @@ void duplicate_nlachannel_keys(void)
|
||||
duplicate_ipo_keys(conchan->ipo);
|
||||
|
||||
/* Duplicate nla strips */
|
||||
if (base->object->type == OB_ARMATURE){
|
||||
laststrip = base->object->nlastrips.last;
|
||||
for (strip=base->object->nlastrips.first; strip; strip=strip->next){
|
||||
if (strip->flag & ACTSTRIP_SELECT){
|
||||
bActionStrip *newstrip;
|
||||
|
||||
copy_actionstrip(&newstrip, &strip);
|
||||
|
||||
BLI_addtail(&base->object->nlastrips, newstrip);
|
||||
|
||||
strip->flag &= ~ACTSTRIP_SELECT;
|
||||
newstrip->flag |= ACTSTRIP_SELECT;
|
||||
|
||||
}
|
||||
if (strip==laststrip)
|
||||
break;
|
||||
laststrip = base->object->nlastrips.last;
|
||||
for (strip=base->object->nlastrips.first; strip; strip=strip->next){
|
||||
if (strip->flag & ACTSTRIP_SELECT){
|
||||
bActionStrip *newstrip;
|
||||
|
||||
copy_actionstrip(&newstrip, &strip);
|
||||
|
||||
BLI_addtail(&base->object->nlastrips, newstrip);
|
||||
|
||||
strip->flag &= ~ACTSTRIP_SELECT;
|
||||
newstrip->flag |= ACTSTRIP_SELECT;
|
||||
set_active_strip(base->object, newstrip);
|
||||
|
||||
}
|
||||
if (strip==laststrip)
|
||||
break;
|
||||
}
|
||||
|
||||
/* Duplicate actionchannel keys */
|
||||
if (base->object->type == OB_ARMATURE && base->object->action){
|
||||
if (base->object->action){
|
||||
for (chan=base->object->action->chanbase.first; chan; chan=chan->next){
|
||||
duplicate_ipo_keys(chan->ipo);
|
||||
/* Duplicate action constraint keys */
|
||||
@@ -1156,7 +1112,7 @@ void duplicate_nlachannel_keys(void)
|
||||
}
|
||||
|
||||
BIF_undo_push("Duplicate NLA");
|
||||
transform_nlachannel_keys ('g');
|
||||
transform_nlachannel_keys ('g', 0);
|
||||
}
|
||||
|
||||
void borderselect_nla(void)
|
||||
@@ -1185,66 +1141,67 @@ void borderselect_nla(void)
|
||||
|
||||
ymax = count_nla_levels();
|
||||
ymax*= (NLACHANNELHEIGHT+NLACHANNELSKIP);
|
||||
|
||||
ymax+= (NLACHANNELHEIGHT+NLACHANNELSKIP)/2;
|
||||
|
||||
for (base=G.scene->base.first; base; base=base->next){
|
||||
/* Check object ipos */
|
||||
if (nla_filter(base, 0)){
|
||||
if (nla_filter(base)) {
|
||||
|
||||
ymin=ymax-(NLACHANNELHEIGHT+NLACHANNELSKIP);
|
||||
|
||||
/* Check object ipos */
|
||||
if (base->object->ipo){
|
||||
if (!((ymax < rectf.ymin) || (ymin > rectf.ymax)))
|
||||
borderselect_ipo_key(base->object->ipo, rectf.xmin, rectf.xmax,
|
||||
selectmode);
|
||||
}
|
||||
ymax=ymin;
|
||||
|
||||
/* Check object constraint ipos */
|
||||
for (conchan=base->object->constraintChannels.first; conchan; conchan=conchan->next){
|
||||
ymin=ymax-(NLACHANNELHEIGHT+NLACHANNELSKIP);
|
||||
if (!((ymax < rectf.ymin) || (ymin > rectf.ymax)))
|
||||
borderselect_ipo_key(conchan->ipo, rectf.xmin, rectf.xmax,
|
||||
selectmode);
|
||||
ymax=ymin;
|
||||
}
|
||||
|
||||
ymax=ymin;
|
||||
|
||||
/* Check action ipos */
|
||||
if (ACTIVE_ARMATURE(base)){
|
||||
if (base->object->action){
|
||||
bActionChannel *chan;
|
||||
float xmin, xmax;
|
||||
|
||||
ymin=ymax-(NLACHANNELHEIGHT+NLACHANNELSKIP);
|
||||
if (base->object->action){
|
||||
bActionChannel *chan;
|
||||
|
||||
if (!((ymax < rectf.ymin) || (ymin > rectf.ymax))){
|
||||
for (chan=base->object->action->chanbase.first; chan; chan=chan->next){
|
||||
borderselect_ipo_key(chan->ipo, rectf.xmin, rectf.xmax,
|
||||
selectmode);
|
||||
/* Check action constraint ipos */
|
||||
for (conchan=chan->constraintChannels.first; conchan; conchan=conchan->next)
|
||||
borderselect_ipo_key(conchan->ipo, rectf.xmin, rectf.xmax,
|
||||
selectmode);
|
||||
}
|
||||
|
||||
/* if action is mapped in NLA, it returns a correction */
|
||||
xmin= get_action_frame(base->object, rectf.xmin);
|
||||
xmax= get_action_frame(base->object, rectf.xmax);
|
||||
|
||||
if (!((ymax < rectf.ymin) || (ymin > rectf.ymax))){
|
||||
for (chan=base->object->action->chanbase.first; chan; chan=chan->next){
|
||||
borderselect_ipo_key(chan->ipo, xmin, xmax, selectmode);
|
||||
/* Check action constraint ipos */
|
||||
for (conchan=chan->constraintChannels.first; conchan; conchan=conchan->next)
|
||||
borderselect_ipo_key(conchan->ipo, xmin, xmax, selectmode);
|
||||
}
|
||||
}
|
||||
|
||||
ymax=ymin;
|
||||
} /* End of if armature */
|
||||
} /* End of if action */
|
||||
|
||||
/* Skip nlastrips */
|
||||
if (base->object->type==OB_ARMATURE){
|
||||
for (strip=base->object->nlastrips.first; strip; strip=strip->next){
|
||||
ymin=ymax-(NLACHANNELHEIGHT+NLACHANNELSKIP);
|
||||
//
|
||||
if (!((ymax < rectf.ymin) || (ymin > rectf.ymax))){
|
||||
if (!((rectf.xmax<strip->start) || (rectf.xmin>strip->end))){
|
||||
if (val==1)
|
||||
strip->flag |= ACTSTRIP_SELECT;
|
||||
else
|
||||
strip->flag &= ~ACTSTRIP_SELECT;
|
||||
}
|
||||
for (strip=base->object->nlastrips.first; strip; strip=strip->next){
|
||||
ymin=ymax-(NLACHANNELHEIGHT+NLACHANNELSKIP);
|
||||
//
|
||||
if (!((ymax < rectf.ymin) || (ymin > rectf.ymax))){
|
||||
if (!((rectf.xmax<strip->start) || (rectf.xmin>strip->end))){
|
||||
if (val==1)
|
||||
strip->flag |= ACTSTRIP_SELECT;
|
||||
else
|
||||
strip->flag &= ~ACTSTRIP_SELECT;
|
||||
}
|
||||
|
||||
ymax=ymin;
|
||||
}
|
||||
|
||||
ymax=ymin;
|
||||
}
|
||||
|
||||
} /* End of object filter */
|
||||
}
|
||||
}
|
||||
BIF_undo_push("Border select NLA");
|
||||
allqueue(REDRAWNLA, 0);
|
||||
@@ -1253,22 +1210,25 @@ void borderselect_nla(void)
|
||||
}
|
||||
}
|
||||
|
||||
/* right hand side of window, does ipokeys, actionkeys or strips */
|
||||
static void mouse_nla(int selectmode)
|
||||
{
|
||||
short sel;
|
||||
float selx;
|
||||
short mval[2];
|
||||
Base *base;
|
||||
bAction *act;
|
||||
bActionChannel *chan;
|
||||
bActionStrip *rstrip;
|
||||
bConstraintChannel *conchan;
|
||||
float selx;
|
||||
short mval[2];
|
||||
short sel, isdone=0;
|
||||
|
||||
getmouseco_areawin (mval);
|
||||
|
||||
/* Try object ipo selection */
|
||||
/* Try object ipo or ob-constraint ipo selection */
|
||||
base= get_nearest_nlachannel_ob_key(&selx, &sel);
|
||||
if (base) {
|
||||
isdone= 1;
|
||||
|
||||
if (selectmode == SELECT_REPLACE){
|
||||
deselect_nlachannel_keys(0);
|
||||
selectmode = SELECT_ADD;
|
||||
@@ -1279,71 +1239,66 @@ static void mouse_nla(int selectmode)
|
||||
/* Try object constraint selection */
|
||||
for (conchan=base->object->constraintChannels.first; conchan; conchan=conchan->next)
|
||||
select_ipo_key(conchan->ipo, selx, selectmode);
|
||||
|
||||
|
||||
BIF_undo_push("Select NLA");
|
||||
allqueue(REDRAWIPO, 0);
|
||||
allqueue(REDRAWVIEW3D, 0);
|
||||
allqueue(REDRAWNLA, 0);
|
||||
return;
|
||||
}
|
||||
|
||||
/* Try action ipo selection */
|
||||
act= get_nearest_nlachannel_ac_key(&selx, &sel);
|
||||
if (act) {
|
||||
if (selectmode == SELECT_REPLACE){
|
||||
deselect_nlachannel_keys(0);
|
||||
selectmode = SELECT_ADD;
|
||||
else {
|
||||
/* Try action ipo selection */
|
||||
act= get_nearest_nlachannel_ac_key(&selx, &sel);
|
||||
if (act) {
|
||||
isdone= 1;
|
||||
|
||||
if (selectmode == SELECT_REPLACE){
|
||||
deselect_nlachannel_keys(0);
|
||||
selectmode = SELECT_ADD;
|
||||
}
|
||||
|
||||
for (chan=act->chanbase.first; chan; chan=chan->next) {
|
||||
select_ipo_key(chan->ipo, selx, selectmode);
|
||||
/* Try action constraint selection */
|
||||
for (conchan=chan->constraintChannels.first; conchan; conchan=conchan->next)
|
||||
select_ipo_key(conchan->ipo, selx, selectmode);
|
||||
}
|
||||
}
|
||||
|
||||
for (chan=act->chanbase.first; chan; chan=chan->next) {
|
||||
select_ipo_key(chan->ipo, selx, selectmode);
|
||||
/* Try action constraint selection */
|
||||
for (conchan=chan->constraintChannels.first; conchan; conchan=conchan->next)
|
||||
select_ipo_key(conchan->ipo, selx, selectmode);
|
||||
else {
|
||||
|
||||
/* Try nla strip selection */
|
||||
base= get_nearest_nlastrip(&rstrip, &sel);
|
||||
if (base){
|
||||
isdone= 1;
|
||||
|
||||
if (!(G.qual & LR_SHIFTKEY)){
|
||||
deselect_nlachannel_keys(0);
|
||||
sel = 0;
|
||||
}
|
||||
|
||||
if (sel)
|
||||
rstrip->flag &= ~ACTSTRIP_SELECT;
|
||||
else
|
||||
rstrip->flag |= ACTSTRIP_SELECT;
|
||||
|
||||
set_active_strip(base->object, rstrip);
|
||||
}
|
||||
}
|
||||
|
||||
BIF_undo_push("Select NLA");
|
||||
allqueue(REDRAWIPO, 0);
|
||||
allqueue(REDRAWVIEW3D, 0);
|
||||
allqueue(REDRAWNLA, 0);
|
||||
return;
|
||||
}
|
||||
|
||||
/* Try nla strip selection */
|
||||
base= get_nearest_nlastrip(&rstrip, &sel);
|
||||
if (base){
|
||||
if (!(G.qual & LR_SHIFTKEY)){
|
||||
deselect_nlachannel_keys(0);
|
||||
sel = 0;
|
||||
}
|
||||
if(isdone) {
|
||||
std_rmouse_transform(transform_nlachannel_keys);
|
||||
|
||||
if (sel)
|
||||
rstrip->flag &= ~ACTSTRIP_SELECT;
|
||||
else
|
||||
rstrip->flag |= ACTSTRIP_SELECT;
|
||||
|
||||
BIF_undo_push("Select NLA");
|
||||
allqueue(REDRAWIPO, 0);
|
||||
allqueue(REDRAWVIEW3D, 0);
|
||||
allqueue(REDRAWNLA, 0);
|
||||
return;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
static Base *get_nearest_nlastrip (bActionStrip **rstrip, short *sel)
|
||||
/* This function is currently more complicated than it seems like it should be.
|
||||
* However, this will be needed once the nla strip timeline is more complex */
|
||||
static Base *get_nearest_nlastrip (bActionStrip **rstrip, short *sel)
|
||||
{
|
||||
Base *base, *firstbase=NULL;
|
||||
short mval[2];
|
||||
short foundsel = 0;
|
||||
bActionStrip *strip, *firststrip=NULL, *foundstrip=NULL;
|
||||
rctf rectf;
|
||||
float ymin, ymax;
|
||||
bActionStrip *strip, *firststrip=NULL, *foundstrip=NULL;
|
||||
bConstraintChannel *conchan=NULL;
|
||||
short mval[2];
|
||||
short foundsel = 0;
|
||||
|
||||
getmouseco_areawin (mval);
|
||||
|
||||
@@ -1358,48 +1313,42 @@ static Base *get_nearest_nlastrip (bActionStrip **rstrip, short *sel)
|
||||
ymax+= NLACHANNELHEIGHT/2;
|
||||
|
||||
for (base = G.scene->base.first; base; base=base->next){
|
||||
if (nla_filter(base, 0)){
|
||||
if (nla_filter(base)) {
|
||||
|
||||
/* Skip object ipos */
|
||||
// if (base->object->ipo)
|
||||
ymax-=(NLACHANNELHEIGHT+NLACHANNELSKIP);
|
||||
|
||||
/* Skip constraint channels */
|
||||
for (conchan=base->object->constraintChannels.first;
|
||||
conchan; conchan=conchan->next){
|
||||
/* Skip action ipos */
|
||||
if (base->object->action)
|
||||
ymax-=(NLACHANNELHEIGHT+NLACHANNELSKIP);
|
||||
}
|
||||
|
||||
if (base->object->type==OB_ARMATURE){
|
||||
/* Skip action ipos */
|
||||
if (base->object->action)
|
||||
ymax-=(NLACHANNELHEIGHT+NLACHANNELSKIP);
|
||||
for (strip=base->object->nlastrips.first; strip; strip=strip->next){
|
||||
ymin=ymax-(NLACHANNELHEIGHT+NLACHANNELSKIP);
|
||||
/* Do Ytest */
|
||||
if (!((ymax < rectf.ymin) || (ymin > rectf.ymax))){
|
||||
/* Do XTest */
|
||||
if (!((rectf.xmax<strip->start) || (rectf.xmin>strip->end))){
|
||||
if (!firstbase){
|
||||
firstbase=base;
|
||||
firststrip=strip;
|
||||
*sel = strip->flag & ACTSTRIP_SELECT;
|
||||
}
|
||||
|
||||
if (strip->flag & ACTSTRIP_SELECT){
|
||||
if (!foundsel){
|
||||
foundsel=1;
|
||||
foundstrip = strip;
|
||||
}
|
||||
}
|
||||
else if (foundsel && strip != foundstrip){
|
||||
*rstrip=strip;
|
||||
*sel = 0;
|
||||
return base;
|
||||
|
||||
/* the strips */
|
||||
for (strip=base->object->nlastrips.first; strip; strip=strip->next){
|
||||
ymin=ymax-(NLACHANNELHEIGHT+NLACHANNELSKIP);
|
||||
/* Do Ytest */
|
||||
if (!((ymax < rectf.ymin) || (ymin > rectf.ymax))){
|
||||
/* Do XTest */
|
||||
if (!((rectf.xmax<strip->start) || (rectf.xmin>strip->end))){
|
||||
if (!firstbase){
|
||||
firstbase=base;
|
||||
firststrip=strip;
|
||||
*sel = strip->flag & ACTSTRIP_SELECT;
|
||||
}
|
||||
|
||||
if (strip->flag & ACTSTRIP_SELECT){
|
||||
if (!foundsel){
|
||||
foundsel=1;
|
||||
foundstrip = strip;
|
||||
}
|
||||
}
|
||||
else if (foundsel && strip != foundstrip){
|
||||
*rstrip=strip;
|
||||
*sel = 0;
|
||||
return base;
|
||||
}
|
||||
}
|
||||
ymax=ymin;
|
||||
}
|
||||
ymax=ymin;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1414,7 +1363,7 @@ static Base *get_nearest_nlachannel_ob_key (float *index, short *sel)
|
||||
Base *firstbase=NULL;
|
||||
bConstraintChannel *conchan;
|
||||
int foundsel=0;
|
||||
float firstvert=-1, foundx=-1;
|
||||
float firstvertx=-1, foundx=-1;
|
||||
int i;
|
||||
short mval[2];
|
||||
float ymin, ymax;
|
||||
@@ -1438,9 +1387,11 @@ static Base *get_nearest_nlachannel_ob_key (float *index, short *sel)
|
||||
*sel=0;
|
||||
|
||||
for (base=G.scene->base.first; base; base=base->next){
|
||||
/* Handle object ipo selection */
|
||||
if (nla_filter(base, 0)){
|
||||
if (nla_filter(base)) {
|
||||
|
||||
ymin=ymax-(NLACHANNELHEIGHT+NLACHANNELSKIP);
|
||||
|
||||
/* Handle object ipo selection */
|
||||
if (base->object->ipo){
|
||||
if (!((ymax < rectf.ymin) || (ymin > rectf.ymax))){
|
||||
for (icu=base->object->ipo->curve.first; icu; icu=icu->next){
|
||||
@@ -1448,7 +1399,7 @@ static Base *get_nearest_nlachannel_ob_key (float *index, short *sel)
|
||||
if (icu->bezt[i].vec[1][0] > rectf.xmin && icu->bezt[i].vec[1][0] <= rectf.xmax ){
|
||||
if (!firstbase){
|
||||
firstbase=base;
|
||||
firstvert=icu->bezt[i].vec[1][0];
|
||||
firstvertx=icu->bezt[i].vec[1][0];
|
||||
*sel = icu->bezt[i].f2 & 1;
|
||||
}
|
||||
|
||||
@@ -1468,19 +1419,15 @@ static Base *get_nearest_nlachannel_ob_key (float *index, short *sel)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
ymax=ymin;
|
||||
|
||||
/* Handle object constraint ipos */
|
||||
for (conchan=base->object->constraintChannels.first; conchan; conchan=conchan->next){
|
||||
ymin=ymax-(NLACHANNELHEIGHT+NLACHANNELSKIP);
|
||||
if (!((ymax < rectf.ymin) || (ymin > rectf.ymax))){
|
||||
if ( !((ymax < rectf.ymin) || (ymin > rectf.ymax)) && conchan->ipo){
|
||||
for (icu=conchan->ipo->curve.first; icu; icu=icu->next){
|
||||
for (i=0; i<icu->totvert; i++){
|
||||
if (icu->bezt[i].vec[1][0] > rectf.xmin && icu->bezt[i].vec[1][0] <= rectf.xmax ){
|
||||
if (!firstbase){
|
||||
firstbase=base;
|
||||
firstvert=icu->bezt[i].vec[1][0];
|
||||
firstvertx=icu->bezt[i].vec[1][0];
|
||||
*sel = icu->bezt[i].f2 & 1;
|
||||
}
|
||||
|
||||
@@ -1499,21 +1446,20 @@ static Base *get_nearest_nlachannel_ob_key (float *index, short *sel)
|
||||
}
|
||||
}
|
||||
}
|
||||
ymax=ymin;
|
||||
}
|
||||
|
||||
ymax=ymin;
|
||||
|
||||
/* Skip action ipos */
|
||||
if (ACTIVE_ARMATURE(base)){
|
||||
if (base->object->action){
|
||||
ymax-=(NLACHANNELHEIGHT+NLACHANNELSKIP);
|
||||
}
|
||||
/* Skip nlastrips */
|
||||
if (base->object->type==OB_ARMATURE){
|
||||
ymax-=(NLACHANNELHEIGHT+NLACHANNELSKIP)*BLI_countlist(&base->object->nlastrips);
|
||||
}
|
||||
ymax-=(NLACHANNELHEIGHT+NLACHANNELSKIP)*BLI_countlist(&base->object->nlastrips);
|
||||
}
|
||||
}
|
||||
|
||||
*index=firstvert;
|
||||
*index=firstvertx;
|
||||
return firstbase;
|
||||
}
|
||||
|
||||
@@ -1522,14 +1468,14 @@ static bAction *get_nearest_nlachannel_ac_key (float *index, short *sel)
|
||||
Base *base;
|
||||
IpoCurve *icu;
|
||||
bAction *firstact=NULL;
|
||||
int foundsel=0;
|
||||
float firstvert=-1, foundx=-1;
|
||||
int i;
|
||||
short mval[2];
|
||||
float ymin, ymax;
|
||||
rctf rectf;
|
||||
bActionChannel *chan;
|
||||
bConstraintChannel *conchan;
|
||||
rctf rectf;
|
||||
float firstvert=-1, foundx=-1;
|
||||
float ymin, ymax, xmin, xmax;
|
||||
int i;
|
||||
int foundsel=0;
|
||||
short mval[2];
|
||||
|
||||
*index=0;
|
||||
|
||||
@@ -1550,47 +1496,55 @@ static bAction *get_nearest_nlachannel_ac_key (float *index, short *sel)
|
||||
|
||||
for (base=G.scene->base.first; base; base=base->next){
|
||||
/* Handle object ipo selection */
|
||||
if (nla_filter(base, 0)){
|
||||
/* Skip object ipo */
|
||||
if (nla_filter(base)) {
|
||||
|
||||
/* Skip object ipo and ob-constraint ipo */
|
||||
ymin=ymax-(NLACHANNELHEIGHT+NLACHANNELSKIP);
|
||||
ymax=ymin;
|
||||
|
||||
/* Handle action ipos */
|
||||
if (ACTIVE_ARMATURE(base)){
|
||||
if (base->object->action){
|
||||
bAction *act= base->object->action;
|
||||
|
||||
/* if action is mapped in NLA, it returns a correction */
|
||||
xmin= get_action_frame(base->object, rectf.xmin);
|
||||
xmax= get_action_frame(base->object, rectf.xmax);
|
||||
|
||||
ymin=ymax-(NLACHANNELHEIGHT+NLACHANNELSKIP);
|
||||
if (!((ymax < rectf.ymin) || (ymin > rectf.ymax))){
|
||||
for (chan=base->object->action->chanbase.first; chan; chan=chan->next){
|
||||
for (icu=chan->ipo->curve.first; icu; icu=icu->next){
|
||||
for (i=0; i<icu->totvert; i++){
|
||||
if (icu->bezt[i].vec[1][0] > rectf.xmin && icu->bezt[i].vec[1][0] <= rectf.xmax ){
|
||||
if (!firstact){
|
||||
firstact=base->object->action;
|
||||
firstvert=icu->bezt[i].vec[1][0];
|
||||
*sel = icu->bezt[i].f2 & 1;
|
||||
}
|
||||
|
||||
if (icu->bezt[i].f2 & 1){
|
||||
if (!foundsel){
|
||||
foundsel=1;
|
||||
foundx = icu->bezt[i].vec[1][0];
|
||||
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++){
|
||||
if (icu->bezt[i].vec[1][0] > xmin && icu->bezt[i].vec[1][0] <= xmax ){
|
||||
if (!firstact){
|
||||
firstact= act;
|
||||
firstvert=icu->bezt[i].vec[1][0];
|
||||
*sel = icu->bezt[i].f2 & 1;
|
||||
}
|
||||
|
||||
if (icu->bezt[i].f2 & 1){
|
||||
if (!foundsel){
|
||||
foundsel=1;
|
||||
foundx = icu->bezt[i].vec[1][0];
|
||||
}
|
||||
}
|
||||
else if (foundsel && icu->bezt[i].vec[1][0] != foundx){
|
||||
*index=icu->bezt[i].vec[1][0];
|
||||
*sel = 0;
|
||||
return act;
|
||||
}
|
||||
}
|
||||
else if (foundsel && icu->bezt[i].vec[1][0] != foundx){
|
||||
*index=icu->bezt[i].vec[1][0];
|
||||
*sel = 0;
|
||||
return base->object->action;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
for (conchan=chan->constraintChannels.first; conchan; conchan=conchan->next){
|
||||
ymin=ymax-(NLACHANNELHEIGHT+NLACHANNELSKIP);
|
||||
if (!((ymax < rectf.ymin) || (ymin > rectf.ymax))){
|
||||
if ( !((ymax < rectf.ymin) || (ymin > rectf.ymax)) && conchan->ipo){
|
||||
for (icu=conchan->ipo->curve.first; icu; icu=icu->next){
|
||||
for (i=0; i<icu->totvert; i++){
|
||||
if (icu->bezt[i].vec[1][0] > rectf.xmin && icu->bezt[i].vec[1][0] <= rectf.xmax ){
|
||||
if (icu->bezt[i].vec[1][0] > xmin && icu->bezt[i].vec[1][0] <= xmax ){
|
||||
if (!firstact){
|
||||
firstact=base->object->action;
|
||||
firstvert=icu->bezt[i].vec[1][0];
|
||||
@@ -1622,9 +1576,7 @@ static bAction *get_nearest_nlachannel_ac_key (float *index, short *sel)
|
||||
}
|
||||
|
||||
/* Skip nlastrips */
|
||||
if (base->object->type==OB_ARMATURE){
|
||||
ymax-=(NLACHANNELHEIGHT+NLACHANNELSKIP)*BLI_countlist(&base->object->nlastrips);
|
||||
}
|
||||
ymax-=(NLACHANNELHEIGHT+NLACHANNELSKIP)*BLI_countlist(&base->object->nlastrips);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1632,73 +1584,10 @@ static bAction *get_nearest_nlachannel_ac_key (float *index, short *sel)
|
||||
return firstact;
|
||||
}
|
||||
|
||||
void clever_numbuts_nla(void){
|
||||
bActionStrip *strip=NULL;
|
||||
int but=0;
|
||||
|
||||
/* Determine if an nla strip has been selected */
|
||||
//strip = get_active_nlastrip();
|
||||
if (!strip)
|
||||
return;
|
||||
|
||||
add_numbut(but++, LABEL, "Timeline Range:", 1.0, MAXFRAMEF, 0, 0);
|
||||
add_numbut(but++, NUM|FLO, "Strip Start:", 1.0, MAXFRAMEF, &strip->start, "First frame in the timeline");
|
||||
add_numbut(but++, NUM|FLO, "Strip End:", 1.0, MAXFRAMEF, &strip->end, "Last frame in the timeline");
|
||||
add_numbut(but++, LABEL, "Action Range:", 1.0, MAXFRAMEF, 0, 0);
|
||||
add_numbut(but++, NUM|FLO, "Action Start:", 1.0, MAXFRAMEF, &strip->actstart, "First frame of the action to map to the playrange");
|
||||
add_numbut(but++, NUM|FLO, "Action End:", 1.0, MAXFRAMEF, &strip->actend, "Last frame of the action to map to the playrange");
|
||||
add_numbut(but++, LABEL, "Blending:", 1.0, MAXFRAMEF, 0, 0);
|
||||
add_numbut(but++, NUM|FLO, "Blend In:", 0.0, MAXFRAMEF, &strip->blendin, "Number of frames of ease-in");
|
||||
add_numbut(but++, NUM|FLO, "Blend Out:", 0.0, MAXFRAMEF, &strip->blendout, "Number of frames of ease-out");
|
||||
add_numbut(but++, LABEL, "Options:", 1.0, MAXFRAMEF, 0, 0);
|
||||
add_numbut(but++, NUM|FLO, "Repeat:", 0.0001, MAXFRAMEF, &strip->repeat, "Number of times the action should repeat");
|
||||
add_numbut(but++, NUM|FLO, "Stride:", 0.0001, MAXFRAMEF, &strip->stridelen, "Distance covered by one complete cycle of the action specified in the Action Range");
|
||||
{
|
||||
/* STUPID HACK BECAUSE NUMBUTS ARE BROKEN WITH MULTIPLE TOGGLES */
|
||||
short hold= (strip->flag & ACTSTRIP_HOLDLASTFRAME) ? 1 : 0;
|
||||
short frompath=(strip->flag & ACTSTRIP_USESTRIDE) ? 1 : 0;
|
||||
|
||||
add_numbut(but++, TOG|SHO, "Use Path", 0, 0, &frompath, "Plays action based on position on path & stride length. Only valid for armatures that are parented to a path");
|
||||
add_numbut(but++, TOG|SHO, "Hold", 0, 0, &hold, "Toggles whether or not to continue displaying the last frame past the end of the strip");
|
||||
add_numbut(but++, TOG|SHO, "Add", 0, 0, &strip->mode, "Toggles additive blending mode");
|
||||
|
||||
do_clever_numbuts("Action", but, REDRAW);
|
||||
|
||||
/* STUPID HACK BECAUSE NUMBUTS ARE BROKEN WITH MULTIPLE TOGGLES */
|
||||
if (hold) strip->flag |= ACTSTRIP_HOLDLASTFRAME;
|
||||
else strip->flag &= ~ACTSTRIP_HOLDLASTFRAME;
|
||||
|
||||
if (frompath) strip->flag |= ACTSTRIP_USESTRIDE;
|
||||
else strip->flag &= ~ACTSTRIP_USESTRIDE;
|
||||
|
||||
}
|
||||
|
||||
if (strip->end<strip->start)
|
||||
strip->end=strip->start;
|
||||
|
||||
|
||||
if (strip->blendin>(strip->end-strip->start))
|
||||
strip->blendin = strip->end-strip->start;
|
||||
|
||||
if (strip->blendout>(strip->end-strip->start))
|
||||
strip->blendout = strip->end-strip->start;
|
||||
|
||||
if (strip->blendin > (strip->end-strip->start-strip->blendout))
|
||||
strip->blendin = (strip->end-strip->start-strip->blendout);
|
||||
|
||||
if (strip->blendout > (strip->end-strip->start-strip->blendin))
|
||||
strip->blendout = (strip->end-strip->start-strip->blendin);
|
||||
|
||||
|
||||
update_for_newframe_muted();
|
||||
allqueue (REDRAWNLA, 0);
|
||||
allqueue (REDRAWVIEW3D, 0);
|
||||
}
|
||||
|
||||
void deselect_nlachannels(int test){
|
||||
int sel = 1;
|
||||
void deselect_nlachannels(int test)
|
||||
{
|
||||
Base *base;
|
||||
bConstraintChannel *conchan;
|
||||
int sel = 1;
|
||||
|
||||
if (test){
|
||||
for (base=G.scene->base.first; base; base=base->next){
|
||||
@@ -1707,15 +1596,6 @@ void deselect_nlachannels(int test){
|
||||
sel=0;
|
||||
break;
|
||||
}
|
||||
|
||||
/* Check constraint flags for previous selection */
|
||||
for (conchan=base->object->constraintChannels.first; conchan; conchan=conchan->next){
|
||||
if (conchan->flag & CONSTRAINT_CHANNEL_SELECT){
|
||||
sel=0;
|
||||
base = G.scene->base.last;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
@@ -1724,56 +1604,12 @@ void deselect_nlachannels(int test){
|
||||
/* Select objects */
|
||||
for (base=G.scene->base.first; base; base=base->next){
|
||||
if (sel){
|
||||
if (nla_filter(base, 0))
|
||||
if (nla_filter(base))
|
||||
base->flag |= SELECT;
|
||||
}
|
||||
else
|
||||
base->flag &= ~SELECT;
|
||||
|
||||
/* Select constraint channels */
|
||||
for (conchan=base->object->constraintChannels.first; conchan; conchan=conchan->next){
|
||||
if (sel){
|
||||
if (nla_filter(base, 0))
|
||||
conchan->flag |= CONSTRAINT_CHANNEL_SELECT;
|
||||
}
|
||||
else
|
||||
conchan->flag &= ~CONSTRAINT_CHANNEL_SELECT;
|
||||
}
|
||||
|
||||
base->object->flag= base->flag;
|
||||
}
|
||||
}
|
||||
|
||||
void delete_nlachannels(void){
|
||||
Base *base;
|
||||
bConstraintChannel *conchan, *nextchan;
|
||||
int sel=0;
|
||||
|
||||
/* See if there is anything selected */
|
||||
for (base = G.scene->base.first; base && (!sel); base=base->next){
|
||||
/* Check constraints */
|
||||
for (conchan=base->object->constraintChannels.first; conchan; conchan=conchan->next){
|
||||
if (conchan->flag & CONSTRAINT_CHANNEL_SELECT){
|
||||
sel = 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!sel)
|
||||
return;
|
||||
|
||||
if (okee ("Delete selected channels")){
|
||||
for (base=G.scene->base.first; base; base=base->next){
|
||||
for (conchan=base->object->constraintChannels.first; conchan; conchan=nextchan){
|
||||
nextchan = conchan->next;
|
||||
|
||||
if (conchan->flag & CONSTRAINT_CHANNEL_SELECT){
|
||||
if (conchan->ipo)
|
||||
conchan->ipo->id.us--;
|
||||
BLI_freelinkN(&base->object->constraintChannels, conchan);
|
||||
}
|
||||
}
|
||||
}
|
||||
BIF_undo_push("Delete NLA channels");
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -181,6 +181,7 @@ void add_object_draw(int type) /* for toolbox or menus, only non-editmode stuff
|
||||
if ELEM3(curarea->spacetype, SPACE_VIEW3D, SPACE_BUTS, SPACE_INFO) {
|
||||
if (G.obedit) exit_editmode(2); // freedata, and undo
|
||||
ob= add_object(type);
|
||||
set_active_base(BASACT);
|
||||
base_init_from_view3d(BASACT, G.vd);
|
||||
|
||||
/* only undo pushes on objects without editmode... */
|
||||
@@ -3541,8 +3542,10 @@ void std_rmouse_transform(void (*xf_func)(int, int))
|
||||
PIL_sleep_ms(10);
|
||||
timer++;
|
||||
if(timer>=10*U.tb_rightmouse) {
|
||||
toolbox_n();
|
||||
return;
|
||||
if(curarea->spacetype==SPACE_VIEW3D) {
|
||||
toolbox_n();
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1041,11 +1041,13 @@ void set_active_base(Base *base)
|
||||
set_active_group();
|
||||
|
||||
/* signal to ipo */
|
||||
if (base) {
|
||||
allqueue(REDRAWIPO, base->object->ipowin);
|
||||
allqueue(REDRAWACTION, 0);
|
||||
allqueue(REDRAWNLA, 0);
|
||||
}
|
||||
allqueue(REDRAWIPO, base->object->ipowin);
|
||||
allqueue(REDRAWACTION, 0);
|
||||
allqueue(REDRAWNLA, 0);
|
||||
|
||||
/* signal to action */
|
||||
select_actionchannel_by_name(base->object->action, "Object", 1);
|
||||
|
||||
/* disable temporal locks */
|
||||
for(tbase=FIRSTBASE; tbase; tbase= tbase->next) {
|
||||
if(base!=tbase && (tbase->object->shapeflag & OB_SHAPE_TEMPLOCK)) {
|
||||
|
||||
@@ -377,6 +377,28 @@ struct gla2DDrawInfo {
|
||||
float wo_to_sc[2];
|
||||
};
|
||||
|
||||
void gla2DGetMap(gla2DDrawInfo *di, rctf *rect)
|
||||
{
|
||||
*rect= di->world_rect;
|
||||
}
|
||||
|
||||
void gla2DSetMap(gla2DDrawInfo *di, rctf *rect)
|
||||
{
|
||||
int sc_w, sc_h;
|
||||
float wo_w, wo_h;
|
||||
|
||||
di->world_rect= *rect;
|
||||
|
||||
sc_w= (di->screen_rect.xmax-di->screen_rect.xmin);
|
||||
sc_h= (di->screen_rect.ymax-di->screen_rect.ymin);
|
||||
wo_w= (di->world_rect.xmax-di->world_rect.xmin);
|
||||
wo_h= (di->world_rect.ymax-di->world_rect.ymin);
|
||||
|
||||
di->wo_to_sc[0]= sc_w/wo_w;
|
||||
di->wo_to_sc[1]= sc_h/wo_h;
|
||||
}
|
||||
|
||||
|
||||
gla2DDrawInfo *glaBegin2DDraw(rcti *screen_rect, rctf *world_rect)
|
||||
{
|
||||
gla2DDrawInfo *di= MEM_mallocN(sizeof(*di), "gla2DDrawInfo");
|
||||
|
||||
@@ -395,7 +395,7 @@ static void do_action_keymenu_transformmenu(void *arg, int event)
|
||||
transform_meshchannel_keys('g', key);
|
||||
}
|
||||
else if (act) {
|
||||
transform_actionchannel_keys ('g');
|
||||
transform_actionchannel_keys ('g', 0);
|
||||
}
|
||||
break;
|
||||
case ACTMENU_KEY_TRANSFORM_SCALE:
|
||||
@@ -403,7 +403,7 @@ static void do_action_keymenu_transformmenu(void *arg, int event)
|
||||
transform_meshchannel_keys('s', key);
|
||||
}
|
||||
else if (act) {
|
||||
transform_actionchannel_keys ('s');
|
||||
transform_actionchannel_keys ('s', 0);
|
||||
}
|
||||
break;
|
||||
}
|
||||
@@ -743,30 +743,24 @@ void action_buttons(void)
|
||||
|
||||
uiBlockSetEmboss(block, UI_EMBOSS);
|
||||
|
||||
// object action is allowed to be zero!
|
||||
/* (ton) commented out below line, since people can apparently link Action to any object (mesh) and
|
||||
not unlink anymore when theres a mesh key. Needs to be rethought this stuff! */
|
||||
//if (!get_action_mesh_key()) {
|
||||
/* NAME ETC */
|
||||
ob=OBACT;
|
||||
from = (ID*) ob;
|
||||
|
||||
xco= std_libbuttons(block, xco, 0, B_ACTPIN, &G.saction->pin,
|
||||
B_ACTIONBROWSE, (ID*)G.saction->action,
|
||||
from, &(G.saction->actnr), B_ACTALONE,
|
||||
B_ACTLOCAL, B_ACTIONDELETE, 0, 0);
|
||||
|
||||
/* Draw action baker */
|
||||
xco+= 8;
|
||||
|
||||
/* NAME ETC */
|
||||
ob=OBACT;
|
||||
from = (ID*) ob;
|
||||
uiDefBut(block, BUT, B_ACTBAKE,
|
||||
"Bake", xco, 0, 64, YIC, 0, 0, 0, 0, 0,
|
||||
"Create an action with the constraint effects "
|
||||
"converted into Ipo keys");
|
||||
xco+=64;
|
||||
|
||||
xco= std_libbuttons(block, xco, 0, B_ACTPIN, &G.saction->pin,
|
||||
B_ACTIONBROWSE, (ID*)G.saction->action,
|
||||
from, &(G.saction->actnr), B_ACTALONE,
|
||||
B_ACTLOCAL, B_ACTIONDELETE, 0, 0);
|
||||
|
||||
/* Draw action baker */
|
||||
xco+= 8;
|
||||
|
||||
uiDefBut(block, BUT, B_ACTBAKE,
|
||||
"Bake", xco, 0, 64, YIC, 0, 0, 0, 0, 0,
|
||||
"Create an action with the constraint effects "
|
||||
"converted into Ipo keys");
|
||||
xco+=64;
|
||||
|
||||
//}
|
||||
uiClearButLock();
|
||||
|
||||
/* draw LOCK */
|
||||
|
||||
@@ -43,34 +43,47 @@
|
||||
#include <config.h>
|
||||
#endif
|
||||
|
||||
#include "DNA_ID.h"
|
||||
#include "DNA_action_types.h"
|
||||
#include "DNA_camera_types.h"
|
||||
#include "DNA_curve_types.h"
|
||||
#include "DNA_key_types.h"
|
||||
#include "DNA_material_types.h"
|
||||
#include "DNA_constraint_types.h"
|
||||
#include "DNA_ID.h"
|
||||
#include "DNA_ipo_types.h"
|
||||
#include "DNA_key_types.h"
|
||||
#include "DNA_lamp_types.h"
|
||||
#include "DNA_material_types.h"
|
||||
#include "DNA_object_types.h"
|
||||
#include "DNA_scene_types.h"
|
||||
#include "DNA_screen_types.h"
|
||||
#include "DNA_texture_types.h"
|
||||
#include "DNA_space_types.h"
|
||||
#include "DNA_sequence_types.h"
|
||||
#include "DNA_sound_types.h"
|
||||
#include "DNA_world_types.h"
|
||||
|
||||
#include "BIF_interface.h"
|
||||
#include "BIF_mainqueue.h"
|
||||
#include "BIF_resources.h"
|
||||
#include "BIF_screen.h"
|
||||
#include "BIF_space.h"
|
||||
|
||||
#include "BKE_action.h"
|
||||
#include "BKE_constraint.h"
|
||||
#include "BKE_global.h"
|
||||
#include "BKE_main.h"
|
||||
#include "BKE_material.h"
|
||||
#include "BKE_texture.h"
|
||||
#include "BKE_utildefines.h"
|
||||
|
||||
#include "BLI_blenlib.h"
|
||||
|
||||
#include "BSE_drawipo.h"
|
||||
#include "BSE_editipo_types.h"
|
||||
#include "BSE_edit.h"
|
||||
#include "BSE_editipo.h"
|
||||
#include "BSE_headerbuttons.h"
|
||||
|
||||
#include "BIF_editaction.h"
|
||||
#include "BIF_interface.h"
|
||||
#include "BIF_mainqueue.h"
|
||||
#include "BIF_resources.h"
|
||||
#include "BIF_screen.h"
|
||||
#include "BIF_space.h"
|
||||
|
||||
#include "nla.h"
|
||||
|
||||
#include "blendef.h"
|
||||
@@ -79,6 +92,154 @@
|
||||
static int viewmovetemp = 0;
|
||||
extern int totipo_edit, totipo_sel;
|
||||
|
||||
/* headerbutton call, assuming full context is set */
|
||||
/* it aligns with editipo.c, verify_ipo */
|
||||
void spaceipo_assign_ipo(SpaceIpo *si, Ipo *ipo)
|
||||
{
|
||||
if(si->from==NULL || si->from->lib) return;
|
||||
|
||||
if(ipo) ipo->id.us++;
|
||||
|
||||
/* first check action ipos */
|
||||
if(si->actname && si->actname[0]) {
|
||||
Object *ob= (Object *)si->from;
|
||||
bActionChannel *achan;
|
||||
|
||||
if(ob->action) {
|
||||
achan= get_action_channel(ob->action, si->actname);
|
||||
|
||||
if(achan) {
|
||||
/* constraint exception */
|
||||
if(si->blocktype==ID_CO) {
|
||||
bConstraintChannel *conchan= get_constraint_channel(&achan->constraintChannels, si->constname);
|
||||
if(conchan) {
|
||||
if(conchan->ipo)
|
||||
conchan->ipo->id.us--;
|
||||
conchan->ipo= ipo;
|
||||
}
|
||||
}
|
||||
else {
|
||||
if(achan->ipo)
|
||||
achan->ipo->id.us--;
|
||||
achan->ipo= ipo;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
switch(GS(si->from->name)) {
|
||||
case ID_OB:
|
||||
{
|
||||
Object *ob= (Object *)si->from;
|
||||
/* constraint exception */
|
||||
if(si->blocktype==ID_CO) {
|
||||
bConstraintChannel *conchan= get_constraint_channel(&ob->constraintChannels, si->constname);
|
||||
if(conchan) {
|
||||
if(conchan->ipo)
|
||||
conchan->ipo->id.us--;
|
||||
conchan->ipo= ipo;
|
||||
}
|
||||
}
|
||||
else if(si->blocktype==ID_OB) {
|
||||
if(ob->ipo)
|
||||
ob->ipo->id.us--;
|
||||
ob->ipo= ipo;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case ID_MA:
|
||||
{
|
||||
Material *ma= (Material *)si->from;
|
||||
|
||||
if(ma->ipo)
|
||||
ma->ipo->id.us--;
|
||||
ma->ipo= ipo;
|
||||
}
|
||||
break;
|
||||
case ID_TE:
|
||||
{
|
||||
Tex *tex= (Tex *)si->from;
|
||||
|
||||
if(tex->ipo)
|
||||
tex->ipo->id.us--;
|
||||
tex->ipo= ipo;
|
||||
}
|
||||
break;
|
||||
case ID_SEQ:
|
||||
{
|
||||
Sequence *seq= (Sequence *)si->from; /* note, sequence is mimicing Id */
|
||||
|
||||
if((seq->type & SEQ_EFFECT)||(seq->type == SEQ_SOUND)) {
|
||||
if(seq->ipo)
|
||||
seq->ipo->id.us--;
|
||||
seq->ipo= ipo;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case ID_CU:
|
||||
{
|
||||
Curve *cu= (Curve *)si->from;
|
||||
|
||||
if(cu->ipo)
|
||||
cu->ipo->id.us--;
|
||||
cu->ipo= ipo;
|
||||
}
|
||||
break;
|
||||
case ID_KE:
|
||||
{
|
||||
Key *key= (Key *)si->from;
|
||||
|
||||
if(key->ipo)
|
||||
key->ipo->id.us--;
|
||||
key->ipo= ipo;
|
||||
}
|
||||
break;
|
||||
case ID_WO:
|
||||
{
|
||||
World *wo= (World *)si->from;
|
||||
|
||||
if(wo->ipo)
|
||||
wo->ipo->id.us--;
|
||||
wo->ipo= ipo;
|
||||
}
|
||||
break;
|
||||
case ID_LA:
|
||||
{
|
||||
Lamp *la= (Lamp *)si->from;
|
||||
|
||||
if(la->ipo)
|
||||
la->ipo->id.us--;
|
||||
la->ipo= ipo;
|
||||
}
|
||||
break;
|
||||
case ID_CA:
|
||||
{
|
||||
Camera *ca= (Camera *)si->from;
|
||||
|
||||
if(ca->ipo)
|
||||
ca->ipo->id.us--;
|
||||
ca->ipo= ipo;
|
||||
}
|
||||
break;
|
||||
case ID_SO:
|
||||
{
|
||||
bSound *snd= (bSound *)si->from;
|
||||
|
||||
if(snd->ipo)
|
||||
snd->ipo->id.us--;
|
||||
snd->ipo= ipo;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
allqueue(REDRAWVIEW3D, 0);
|
||||
allqueue(REDRAWIPO, 0);
|
||||
allqueue(REDRAWACTION, 0);
|
||||
allqueue(REDRAWNLA, 0);
|
||||
allqueue(REDRAWBUTSALL, 0);
|
||||
|
||||
}
|
||||
|
||||
|
||||
static void do_ipo_editmenu_transformmenu(void *arg, int event)
|
||||
{
|
||||
@@ -203,7 +364,7 @@ static uiBlock *ipo_editmenu_keymenu(void *arg_unused)
|
||||
block= uiNewBlock(&curarea->uiblocks, "ipo_editmenu_keymenu", UI_EMBOSSP, UI_HELV, G.curscreen->mainwin);
|
||||
uiBlockSetButmFunc(block, do_ipo_editmenu_keymenu, NULL);
|
||||
|
||||
ei = get_editipo();
|
||||
ei = get_active_editipo();
|
||||
|
||||
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Linear", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 0, "");
|
||||
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Cardinal", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 1, "");
|
||||
@@ -475,10 +636,10 @@ static void do_ipo_viewmenu(void *arg, int event)
|
||||
case 5:
|
||||
mainqenter(PADMINUS,1);
|
||||
break;
|
||||
case 6: /* Play Back Animation */
|
||||
case 6: /* Play Animation */
|
||||
play_anim(0);
|
||||
break;
|
||||
case 7: /* Play Back Animation in All */
|
||||
case 7: /* Play Animation in All */
|
||||
play_anim(1);
|
||||
break;
|
||||
case 8:
|
||||
@@ -493,7 +654,7 @@ static uiBlock *ipo_viewmenu(void *arg_unused)
|
||||
EditIpo *ei;
|
||||
short yco= 0, menuwidth=120;
|
||||
|
||||
ei = get_editipo();
|
||||
ei = get_active_editipo();
|
||||
|
||||
block= uiNewBlock(&curarea->uiblocks, "ipo_viewmenu", UI_EMBOSSP, UI_HELV, curarea->headwin);
|
||||
uiBlockSetButmFunc(block, do_ipo_viewmenu, NULL);
|
||||
@@ -512,9 +673,9 @@ static uiBlock *ipo_viewmenu(void *arg_unused)
|
||||
|
||||
uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
|
||||
|
||||
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Play Back Animation|Alt A", 0, yco-=20,
|
||||
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Play Animation|Alt A", 0, yco-=20,
|
||||
menuwidth, 19, NULL, 0.0, 0.0, 1, 6, "");
|
||||
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Play Back Animation in 3D View|Alt Shift A", 0, yco-=20,
|
||||
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Play Animation in 3D View|Alt Shift A", 0, yco-=20,
|
||||
menuwidth, 19, NULL, 0.0, 0.0, 1, 7, "");
|
||||
|
||||
uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
|
||||
@@ -582,6 +743,7 @@ static uiBlock *ipo_selectmenu(void *arg_unused)
|
||||
|
||||
static char *ipo_modeselect_pup(void)
|
||||
{
|
||||
Object *ob= OBACT;
|
||||
static char string[1024];
|
||||
char tmpstr[1024];
|
||||
char formatstring[1024];
|
||||
@@ -590,12 +752,12 @@ static char *ipo_modeselect_pup(void)
|
||||
|
||||
strcpy(formatstring, "|%s %%x%d %%i%d");
|
||||
|
||||
if(OBACT) {
|
||||
if(ob) {
|
||||
sprintf(tmpstr,formatstring,"Object",ID_OB, ICON_OBJECT);
|
||||
strcat(string,tmpstr);
|
||||
}
|
||||
|
||||
if(OBACT && give_current_material(OBACT, OBACT->actcol)) { // check for material
|
||||
if(ob && give_current_material(ob, ob->actcol)) { // check for material
|
||||
sprintf(tmpstr,formatstring,"Material",ID_MA, ICON_MATERIAL);
|
||||
strcat(string,tmpstr);
|
||||
}
|
||||
@@ -605,37 +767,37 @@ static char *ipo_modeselect_pup(void)
|
||||
strcat(string,tmpstr);
|
||||
}
|
||||
|
||||
if(OBACT && OBACT->type==OB_CURVE) {
|
||||
if(ob && ob->type==OB_CURVE) {
|
||||
sprintf(tmpstr,formatstring,"Path",ID_CU, ICON_CURVE);
|
||||
strcat(string,tmpstr);
|
||||
}
|
||||
|
||||
if(OBACT && OBACT->type==OB_CAMERA) {
|
||||
if(ob && ob->type==OB_CAMERA) {
|
||||
sprintf(tmpstr,formatstring,"Camera",ID_CA, ICON_CAMERA);
|
||||
strcat(string,tmpstr);
|
||||
}
|
||||
|
||||
if(OBACT && OBACT->type==OB_LAMP) {
|
||||
if(ob && ob->type==OB_LAMP) {
|
||||
sprintf(tmpstr,formatstring,"Lamp",ID_LA, ICON_LAMP);
|
||||
strcat(string,tmpstr);
|
||||
}
|
||||
|
||||
if(OBACT && give_current_texture(OBACT, OBACT->actcol)) {
|
||||
if(ob && give_current_texture(ob, ob->actcol)) {
|
||||
sprintf(tmpstr,formatstring,"Texture",ID_TE, ICON_TEXTURE);
|
||||
strcat(string,tmpstr);
|
||||
}
|
||||
|
||||
if(OBACT){
|
||||
if ELEM4(OBACT->type, OB_MESH, OB_CURVE, OB_SURF, OB_LATTICE) {
|
||||
if(ob){
|
||||
if ELEM4(ob->type, OB_MESH, OB_CURVE, OB_SURF, OB_LATTICE) {
|
||||
sprintf(tmpstr,formatstring,"Shape",ID_KE, ICON_EDIT);
|
||||
strcat(string,tmpstr);
|
||||
}
|
||||
if (OBACT->action){
|
||||
sprintf(tmpstr,formatstring,"Action",ID_AC, ICON_ACTION);
|
||||
if (ob->type==OB_ARMATURE){
|
||||
sprintf(tmpstr,formatstring,"Pose",ID_PO, ICON_POSE_HLT);
|
||||
strcat(string,tmpstr);
|
||||
}
|
||||
#ifdef __CON_IPO
|
||||
sprintf(tmpstr,formatstring,"Constraint",IPO_CO, ICON_CONSTRAINT);
|
||||
sprintf(tmpstr,formatstring,"Constraint",ID_CO, ICON_CONSTRAINT);
|
||||
strcat(string,tmpstr);
|
||||
#endif
|
||||
}
|
||||
@@ -652,6 +814,7 @@ void do_ipo_buttons(short event)
|
||||
EditIpo *ei;
|
||||
View2D *v2d;
|
||||
rcti rect;
|
||||
Object *ob= OBACT;
|
||||
float xmin, ymin, dx, dy;
|
||||
int a, val, first;
|
||||
short mval[2];
|
||||
@@ -744,10 +907,9 @@ void do_ipo_buttons(short event)
|
||||
set_exprap_ipo(IPO_CYCLX);
|
||||
break;
|
||||
case B_IPOMAIN:
|
||||
make_editipo();
|
||||
scrarea_queue_winredraw(curarea);
|
||||
scrarea_queue_headredraw(curarea);
|
||||
|
||||
if(ob) ob->ipowin= G.sipo->blocktype;
|
||||
break;
|
||||
case B_IPOSHOWKEY:
|
||||
/* reverse value because of winqread */
|
||||
@@ -762,7 +924,53 @@ void do_ipo_buttons(short event)
|
||||
view2dzoom(event);
|
||||
scrarea_queue_headredraw(curarea);
|
||||
break;
|
||||
|
||||
case B_IPO_ACTION_OB:
|
||||
if(ob && G.sipo->from && G.sipo->pin==0) {
|
||||
if(ob->ipoflag & OB_ACTION_OB) { /* check if channel exists, and flip ipo link */
|
||||
bActionChannel *achan;
|
||||
|
||||
if(ob->action==NULL)
|
||||
ob->action= add_empty_action(ID_OB);
|
||||
achan= verify_action_channel(ob->action, "Object");
|
||||
if(achan->ipo==NULL && ob->ipo) {
|
||||
achan->ipo= ob->ipo;
|
||||
ob->ipo= NULL;
|
||||
}
|
||||
|
||||
/* object constraints */
|
||||
if(ob->constraintChannels.first) {
|
||||
free_constraint_channels(&achan->constraintChannels);
|
||||
achan->constraintChannels= ob->constraintChannels;
|
||||
ob->constraintChannels.first= ob->constraintChannels.last= NULL;
|
||||
}
|
||||
}
|
||||
else if(ob->action) {
|
||||
bActionChannel *achan= get_action_channel(ob->action, "Object");
|
||||
if(achan) {
|
||||
|
||||
if(achan->ipo && ob->ipo==NULL) {
|
||||
ob->ipo= achan->ipo;
|
||||
achan->ipo= NULL;
|
||||
}
|
||||
|
||||
/* object constraints */
|
||||
if(achan->constraintChannels.first) {
|
||||
free_constraint_channels(&ob->constraintChannels);
|
||||
ob->constraintChannels= achan->constraintChannels;
|
||||
achan->constraintChannels.first= achan->constraintChannels.last= NULL;
|
||||
}
|
||||
}
|
||||
}
|
||||
allqueue(REDRAWVIEW3D, 0);
|
||||
allqueue(REDRAWIPO, 0);
|
||||
allqueue(REDRAWACTION, 0);
|
||||
allqueue(REDRAWOOPS, 0);
|
||||
allqueue(REDRAWNLA, 0);
|
||||
}
|
||||
break;
|
||||
case B_IPO_ACTION_KEY:
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -770,7 +978,6 @@ void ipo_buttons(void)
|
||||
{
|
||||
Object *ob;
|
||||
EditIpo *ei;
|
||||
ID *id, *from;
|
||||
uiBlock *block;
|
||||
short xco,xmax;
|
||||
char naam[20];
|
||||
@@ -807,7 +1014,7 @@ void ipo_buttons(void)
|
||||
if((curarea->flag & HEADER_NO_PULLDOWN)==0) {
|
||||
uiBlockSetEmboss(block, UI_EMBOSSP);
|
||||
|
||||
ei = get_editipo();
|
||||
ei = get_active_editipo();
|
||||
|
||||
xmax= GetButStringLength("View");
|
||||
uiDefPulldownBut(block,ipo_viewmenu, NULL, "View", xco, -2, xmax-3, 24, "");
|
||||
@@ -836,10 +1043,45 @@ void ipo_buttons(void)
|
||||
/* end of pull down menus */
|
||||
uiBlockSetEmboss(block, UI_EMBOSS);
|
||||
|
||||
/* mainmenu, only when data is there and no pin */
|
||||
ob= OBACT;
|
||||
|
||||
/* action switch option, only when active object is there and no pin */
|
||||
uiSetButLock(G.sipo->pin, "Can't change because of pinned data");
|
||||
|
||||
ob= OBACT;
|
||||
/* define whether ipos are on Object or on action */
|
||||
if(ob) {
|
||||
static short fake1= 1;
|
||||
|
||||
uiBlockBeginAlign(block);
|
||||
|
||||
if(G.sipo->blocktype==ID_OB) {
|
||||
uiDefIconButBitS(block, TOG, OB_ACTION_OB, B_IPO_ACTION_OB, ICON_ACTION, xco,0,XIC,YIC, &(ob->ipoflag), 0, 0, 0, 0, "Sets Ipo to be included in an Action or not");
|
||||
xco+= XIC;
|
||||
}
|
||||
else if(G.sipo->blocktype==ID_KE) {
|
||||
uiDefIconButBitS(block, TOG, OB_ACTION_KEY, B_IPO_ACTION_KEY, ICON_ACTION, xco,0,XIC,YIC, &(ob->ipoflag), 0, 0, 0, 0, "Sets Ipo to be included in an Action or not");
|
||||
xco+= XIC;
|
||||
}
|
||||
else if(G.sipo->blocktype==ID_CO) {
|
||||
|
||||
if(G.sipo->from && G.sipo->actname[0]==0)
|
||||
uiDefIconButBitS(block, TOG, OB_ACTION_OB, B_IPO_ACTION_OB, ICON_ACTION, xco,0,XIC,YIC, &(ob->ipoflag), 0, 0, 0, 0, "Sets Ipo to be included in an Action or not");
|
||||
else {
|
||||
uiSetButLock(1, "Pose Constraint Ipo cannot be switched");
|
||||
uiDefIconButS(block, TOG, 1, ICON_ACTION, xco,0,XIC,YIC, &fake1, 0, 0, 0, 0, "Ipo is connected to Pose Action");
|
||||
}
|
||||
xco+= XIC;
|
||||
}
|
||||
else if(G.sipo->blocktype==ID_PO) { /* only to indicate we have action ipos */
|
||||
uiSetButLock(1, "Pose Action Ipo cannot be switched");
|
||||
uiDefIconButS(block, TOG, 1, ICON_ACTION, xco,0,XIC,YIC, &fake1, 0, 0, 0, 0, "Ipo is connected to Pose Action");
|
||||
xco+= XIC;
|
||||
}
|
||||
uiClearButLock();
|
||||
}
|
||||
|
||||
/* mainmenu, only when data is there and no pin */
|
||||
uiSetButLock(G.sipo->pin, "Can't change because of pinned data");
|
||||
|
||||
if (G.sipo->blocktype == ID_OB)
|
||||
icon = ICON_OBJECT;
|
||||
@@ -855,9 +1097,9 @@ void ipo_buttons(void)
|
||||
icon = ICON_LAMP;
|
||||
else if (G.sipo->blocktype == ID_KE)
|
||||
icon = ICON_EDIT;
|
||||
else if (G.sipo->blocktype == ID_AC)
|
||||
icon = ICON_ACTION;
|
||||
else if (G.sipo->blocktype == IPO_CO)
|
||||
else if (G.sipo->blocktype == ID_PO)
|
||||
icon = ICON_POSE_HLT;
|
||||
else if (G.sipo->blocktype == ID_CO)
|
||||
icon = ICON_CONSTRAINT;
|
||||
else if (G.sipo->blocktype == ID_SEQ)
|
||||
icon = ICON_SEQUENCE;
|
||||
@@ -882,25 +1124,22 @@ void ipo_buttons(void)
|
||||
xco-= 4;
|
||||
}
|
||||
|
||||
uiBlockEndAlign(block);
|
||||
|
||||
uiClearButLock();
|
||||
|
||||
/* NAME ETC */
|
||||
id= (ID *)get_ipo_to_edit(&from);
|
||||
|
||||
xco= std_libbuttons(block, (short)(xco+1.5*XIC), 0, B_IPOPIN, &G.sipo->pin, B_IPOBROWSE, (ID*)G.sipo->ipo, from, &(G.sipo->menunr), B_IPOALONE, B_IPOLOCAL, B_IPODELETE, 0, B_KEEPDATA);
|
||||
|
||||
uiSetButLock(id && id->lib, "Can't edit library data");
|
||||
xco= std_libbuttons(block, (short)(xco+1.5*XIC), 0, B_IPOPIN, &G.sipo->pin, B_IPOBROWSE, (ID*)G.sipo->ipo, G.sipo->from, &(G.sipo->menunr), B_IPOALONE, B_IPOLOCAL, B_IPODELETE, 0, B_KEEPDATA);
|
||||
|
||||
/* COPY PASTE */
|
||||
xco-= XIC/2;
|
||||
if(curarea->headertype==HEADERTOP) {
|
||||
uiDefIconBut(block, BUT, B_IPOCOPY, ICON_COPYUP, xco+=XIC,0,XIC,YIC, 0, 0, 0, 0, 0, "Copies the selected curves to the buffer");
|
||||
uiSetButLock(id && id->lib, "Can't edit library data");
|
||||
uiSetButLock(G.sipo->ipo && G.sipo->ipo->id.lib, "Can't edit library data");
|
||||
uiDefIconBut(block, BUT, B_IPOPASTE, ICON_PASTEUP, xco+=XIC,0,XIC,YIC, 0, 0, 0, 0, 0, "Pastes the curves from the buffer");
|
||||
}
|
||||
else {
|
||||
uiDefIconBut(block, BUT, B_IPOCOPY, ICON_COPYDOWN, xco+=XIC,0,XIC,YIC, 0, 0, 0, 0, 0, "Copies the selected curves to the buffer");
|
||||
uiSetButLock(id && id->lib, "Can't edit library data");
|
||||
uiSetButLock(G.sipo->ipo && G.sipo->ipo->id.lib, "Can't edit library data");
|
||||
uiDefIconBut(block, BUT, B_IPOPASTE, ICON_PASTEDOWN, xco+=XIC,0,XIC,YIC, 0, 0, 0, 0, 0, "Pastes the curves from the buffer");
|
||||
}
|
||||
xco+=XIC/2;
|
||||
|
||||
@@ -207,11 +207,11 @@ static void do_nla_strip_transformmenu(void *arg, int event)
|
||||
{
|
||||
switch(event) {
|
||||
case 0: /* grab/move */
|
||||
transform_nlachannel_keys ('g');
|
||||
transform_nlachannel_keys ('g', 0);
|
||||
update_for_newframe_muted();
|
||||
break;
|
||||
case 1: /* scale */
|
||||
transform_nlachannel_keys ('s');
|
||||
transform_nlachannel_keys ('s', 0);
|
||||
update_for_newframe_muted();
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -634,14 +634,12 @@ void do_global_buttons(unsigned short event)
|
||||
Ipo *ipo;
|
||||
Lamp *la;
|
||||
World *wrld;
|
||||
Sequence *seq;
|
||||
bAction *act;
|
||||
ID *id, *idtest, *from;
|
||||
ID *id, *idtest, *from=NULL;
|
||||
ScrArea *sa;
|
||||
int nr= 1;
|
||||
char buf[FILE_MAXDIR+FILE_MAXFILE];
|
||||
|
||||
|
||||
ob= OBACT;
|
||||
|
||||
id= NULL; /* id at null for texbrowse */
|
||||
@@ -966,7 +964,7 @@ void do_global_buttons(unsigned short event)
|
||||
if (act)
|
||||
idtest= (ID *)copy_action(act);
|
||||
else
|
||||
idtest=(ID *)add_empty_action();
|
||||
idtest=(ID *)add_empty_action(ob->type==OB_ARMATURE?ID_PO:ID_OB);
|
||||
idtest->us--;
|
||||
}
|
||||
|
||||
@@ -992,9 +990,10 @@ void do_global_buttons(unsigned short event)
|
||||
break;
|
||||
case B_IPOBROWSE:
|
||||
|
||||
ipo= get_ipo_to_edit(&from);
|
||||
ipo= G.sipo->ipo;
|
||||
from= G.sipo->from;
|
||||
id= (ID *)ipo;
|
||||
if(from==0) return;
|
||||
if(from==NULL) return;
|
||||
|
||||
if(G.sipo->menunr== -2) {
|
||||
activate_databrowse((ID *)G.sipo->ipo, ID_IP, GS(from->name), B_IPOBROWSE, &G.sipo->menunr, do_global_buttons);
|
||||
@@ -1026,13 +1025,10 @@ void do_global_buttons(unsigned short event)
|
||||
if(idtest==0) {
|
||||
if(ipo) idtest= (ID *)copy_ipo(ipo);
|
||||
else {
|
||||
nr= GS(from->name);
|
||||
if(nr==ID_OB){
|
||||
if (G.sipo->blocktype==IPO_CO)
|
||||
idtest= (ID *)add_ipo("CoIpo", IPO_CO); /* constraint channel is no ID data... */
|
||||
else
|
||||
idtest= (ID *)add_ipo("ObIpo", nr);
|
||||
}
|
||||
nr= G.sipo->blocktype;
|
||||
if(nr==ID_OB) idtest= (ID *)add_ipo("ObIpo", ID_OB);
|
||||
else if(nr==ID_CO) idtest= (ID *)add_ipo("CoIpo", ID_CO);
|
||||
else if(nr==ID_PO) idtest= (ID *)add_ipo("ActIpo", nr);
|
||||
else if(nr==ID_MA) idtest= (ID *)add_ipo("MatIpo", nr);
|
||||
else if(nr==ID_TE) idtest= (ID *)add_ipo("TexIpo", nr);
|
||||
else if(nr==ID_SEQ) idtest= (ID *)add_ipo("MatSeq", nr);
|
||||
@@ -1042,136 +1038,26 @@ void do_global_buttons(unsigned short event)
|
||||
else if(nr==ID_LA) idtest= (ID *)add_ipo("LaIpo", nr);
|
||||
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 bugtracker!");
|
||||
}
|
||||
idtest->us--;
|
||||
}
|
||||
if(idtest!=id && from) {
|
||||
ipo= (Ipo *)idtest;
|
||||
|
||||
if (ipo->blocktype==IPO_CO){
|
||||
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;
|
||||
id_us_plus(idtest);
|
||||
allqueue(REDRAWVIEW3D, 0);
|
||||
}
|
||||
else if(ipo->blocktype==ID_AC) {
|
||||
bActionChannel *chan;
|
||||
chan = get_hilighted_action_channel ((bAction*)from);
|
||||
if (!chan){
|
||||
error ("Create an action channel first");
|
||||
return;
|
||||
}
|
||||
chan->ipo=ipo;
|
||||
id_us_plus(idtest);
|
||||
allqueue(REDRAWNLA, 0);
|
||||
allqueue(REDRAWACTION, 0);
|
||||
}
|
||||
else if(ipo->blocktype==ID_MA) {
|
||||
( (Material *)from)->ipo= ipo;
|
||||
id_us_plus(idtest);
|
||||
allqueue(REDRAWBUTSSHADING, 0);
|
||||
}
|
||||
else if(ipo->blocktype==ID_TE) {
|
||||
( (Tex *)from)->ipo= ipo;
|
||||
id_us_plus(idtest);
|
||||
allqueue(REDRAWBUTSSHADING, 0);
|
||||
}
|
||||
else if(ipo->blocktype==ID_SEQ) {
|
||||
seq= (Sequence *)from;
|
||||
if((seq->type & SEQ_EFFECT)||(seq->type == SEQ_SOUND)) {
|
||||
id_us_plus(idtest);
|
||||
seq->ipo= ipo;
|
||||
}
|
||||
}
|
||||
else if(ipo->blocktype==ID_CU) {
|
||||
( (Curve *)from)->ipo= ipo;
|
||||
id_us_plus(idtest);
|
||||
allqueue(REDRAWVIEW3D, 0);
|
||||
}
|
||||
else if(ipo->blocktype==ID_KE) {
|
||||
( (Key *)from)->ipo= ipo;
|
||||
|
||||
id_us_plus(idtest);
|
||||
allqueue(REDRAWVIEW3D, 0);
|
||||
|
||||
}
|
||||
else if(ipo->blocktype==ID_WO) {
|
||||
( (World *)from)->ipo= ipo;
|
||||
id_us_plus(idtest);
|
||||
allqueue(REDRAWBUTSSHADING, 0);
|
||||
}
|
||||
else if(ipo->blocktype==ID_LA) {
|
||||
( (Lamp *)from)->ipo= ipo;
|
||||
id_us_plus(idtest);
|
||||
allqueue(REDRAWBUTSSHADING, 0);
|
||||
}
|
||||
else if(ipo->blocktype==ID_CA) {
|
||||
( (Camera *)from)->ipo= ipo;
|
||||
id_us_plus(idtest);
|
||||
allqueue(REDRAWBUTSEDIT, 0);
|
||||
}
|
||||
else if(ipo->blocktype==ID_SO) {
|
||||
( (bSound *)from)->ipo= ipo;
|
||||
id_us_plus(idtest);
|
||||
allqueue(REDRAWBUTSEDIT, 0);
|
||||
}
|
||||
else
|
||||
printf("error in browse ipo \n");
|
||||
|
||||
if(id) id->us--;
|
||||
|
||||
spaceipo_assign_ipo(G.sipo, (Ipo *)idtest);
|
||||
|
||||
BIF_undo_push("Browse Ipo");
|
||||
scrarea_queue_winredraw(curarea);
|
||||
scrarea_queue_headredraw(curarea);
|
||||
allqueue(REDRAWIPO, 0);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case B_IPODELETE:
|
||||
ipo= get_ipo_to_edit(&from);
|
||||
if(from==0) return;
|
||||
ipo= G.sipo->ipo;
|
||||
from= G.sipo->from;
|
||||
|
||||
ipo->id.us--;
|
||||
|
||||
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) {
|
||||
bConstraintChannel *chan= get_active_constraint_channel((Object*)from);
|
||||
if(chan) chan->ipo= NULL;
|
||||
}
|
||||
else error("Warn bugtracker!");
|
||||
spaceipo_assign_ipo(G.sipo, NULL);
|
||||
|
||||
editipo_changed(G.sipo, 1); /* doredraw */
|
||||
|
||||
BIF_undo_push("Unlink Ipo");
|
||||
allqueue(REDRAWIPO, 0);
|
||||
allqueue(REDRAWNLA, 0);
|
||||
allqueue (REDRAWACTION, 0);
|
||||
|
||||
break;
|
||||
case B_WORLDBROWSE:
|
||||
@@ -1616,6 +1502,8 @@ void do_global_buttons(unsigned short event)
|
||||
scrarea_queue_headredraw(curarea);
|
||||
allqueue(REDRAWINFO, 1);
|
||||
allqueue(REDRAWOOPS, 1);
|
||||
allqueue(REDRAWACTION, 1);
|
||||
allqueue(REDRAWNLA, 1);
|
||||
/* name scene also in set PUPmenu */
|
||||
allqueue(REDRAWBUTSALL, 0);
|
||||
allqueue(REDRAWHEADERS, 0);
|
||||
@@ -1973,9 +1861,10 @@ void do_global_buttons2(short event)
|
||||
break;
|
||||
|
||||
case B_IPOALONE:
|
||||
ipo= get_ipo_to_edit(&idfrom);
|
||||
ipo= G.sipo->ipo;
|
||||
idfrom= G.sipo->from;
|
||||
|
||||
if(idfrom && idfrom->lib==0) {
|
||||
if(idfrom && idfrom->lib==NULL) {
|
||||
if(ipo->id.us>1) {
|
||||
if(okee("Single user")) {
|
||||
if(ipo->blocktype==ID_OB) ((Object *)idfrom)->ipo= copy_ipo(ipo);
|
||||
@@ -1990,7 +1879,7 @@ void do_global_buttons2(short event)
|
||||
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)
|
||||
else if(ipo->blocktype==ID_CO)
|
||||
get_active_constraint_channel((Object*)idfrom)->ipo= copy_ipo(ipo);
|
||||
else error("Warn bugtracker!");
|
||||
|
||||
@@ -2001,7 +1890,8 @@ void do_global_buttons2(short event)
|
||||
}
|
||||
break;
|
||||
case B_IPOLOCAL:
|
||||
ipo= get_ipo_to_edit(&idfrom);
|
||||
ipo= G.sipo->ipo;
|
||||
idfrom= G.sipo->from;
|
||||
|
||||
if(idfrom && idfrom->lib==0) {
|
||||
if(ipo->id.lib) {
|
||||
|
||||
@@ -70,6 +70,7 @@
|
||||
#include "BDR_editobject.h"
|
||||
|
||||
#include "BSE_edit.h"
|
||||
#include "BSE_editipo.h"
|
||||
|
||||
#include "mydevice.h"
|
||||
#include "blendef.h"
|
||||
@@ -493,7 +494,6 @@ void paste_posebuf (int flip)
|
||||
Object *ob= OBACT;
|
||||
bPoseChannel *chan, *pchan;
|
||||
float eul[4];
|
||||
int newchan = 0;
|
||||
char name[32];
|
||||
|
||||
if (!ob || !ob->pose)
|
||||
@@ -533,22 +533,23 @@ void paste_posebuf (int flip)
|
||||
}
|
||||
|
||||
if (G.flags & G_RECORDKEYS){
|
||||
ID *id= &ob->id;
|
||||
/* Set keys on pose */
|
||||
if (chan->flag & POSE_ROT){
|
||||
set_action_key(ob->action, pchan, AC_QUAT_X, newchan);
|
||||
set_action_key(ob->action, pchan, AC_QUAT_Y, newchan);
|
||||
set_action_key(ob->action, pchan, AC_QUAT_Z, newchan);
|
||||
set_action_key(ob->action, pchan, AC_QUAT_W, newchan);
|
||||
insertkey(id, ID_AC, chan->name, NULL, AC_QUAT_X);
|
||||
insertkey(id, ID_AC, chan->name, NULL, AC_QUAT_Y);
|
||||
insertkey(id, ID_AC, chan->name, NULL, AC_QUAT_Z);
|
||||
insertkey(id, ID_AC, chan->name, NULL, AC_QUAT_W);
|
||||
}
|
||||
if (chan->flag & POSE_SIZE){
|
||||
set_action_key(ob->action, pchan, AC_SIZE_X, newchan);
|
||||
set_action_key(ob->action, pchan, AC_SIZE_Y, newchan);
|
||||
set_action_key(ob->action, pchan, AC_SIZE_Z, newchan);
|
||||
insertkey(id, ID_AC, chan->name, NULL, AC_SIZE_X);
|
||||
insertkey(id, ID_AC, chan->name, NULL, AC_SIZE_Y);
|
||||
insertkey(id, ID_AC, chan->name, NULL, AC_SIZE_Z);
|
||||
}
|
||||
if (chan->flag & POSE_LOC){
|
||||
set_action_key(ob->action, pchan, AC_LOC_X, newchan);
|
||||
set_action_key(ob->action, pchan, AC_LOC_Y, newchan);
|
||||
set_action_key(ob->action, pchan, AC_LOC_Z, newchan);
|
||||
insertkey(id, ID_AC, pchan->name, NULL, AC_LOC_X);
|
||||
insertkey(id, ID_AC, pchan->name, NULL, AC_LOC_Y);
|
||||
insertkey(id, ID_AC, pchan->name, NULL, AC_LOC_Z);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -812,7 +812,11 @@ char *BIF_ThemeGetColorPtr(bTheme *btheme, int spacetype, int colorid)
|
||||
cp= ts->bone_solid; break;
|
||||
case TH_BONE_POSE:
|
||||
cp= ts->bone_pose; break;
|
||||
|
||||
case TH_STRIP:
|
||||
cp= ts->strip; break;
|
||||
case TH_STRIP_SELECT:
|
||||
cp= ts->strip_select; break;
|
||||
|
||||
case TH_SYNTAX_B:
|
||||
cp= ts->syntaxb; break;
|
||||
case TH_SYNTAX_V:
|
||||
@@ -962,6 +966,8 @@ void BIF_InitTheme(void)
|
||||
SETCOL(btheme->tnla.shade1, 172, 172, 172, 255); // sliders
|
||||
SETCOL(btheme->tnla.shade2, 84, 44, 31, 100); // bar
|
||||
SETCOL(btheme->tnla.hilite, 17, 27, 60, 100); // bar
|
||||
SETCOL(btheme->tnla.strip_select, 0xff, 0xff, 0xaa, 255);
|
||||
SETCOL(btheme->tnla.strip, 0xe4, 0x9c, 0xc6, 255);
|
||||
|
||||
/* space seq */
|
||||
btheme->tseq= btheme->tv3d;
|
||||
@@ -1088,6 +1094,8 @@ char *BIF_ThemeColorsPup(int spacetype)
|
||||
sprintf(str, "View Sliders %%x%d|", TH_SHADE1); strcat(cp, str);
|
||||
sprintf(str, "Bars %%x%d|", TH_SHADE2); strcat(cp, str);
|
||||
sprintf(str, "Bars selected %%x%d|", TH_HILITE); strcat(cp, str);
|
||||
sprintf(str, "Strips %%x%d|", TH_STRIP); strcat(cp, str);
|
||||
sprintf(str, "Strips selected %%x%d|", TH_STRIP_SELECT); strcat(cp, str);
|
||||
}
|
||||
else if(spacetype==SPACE_ACTION) {
|
||||
//sprintf(str, "Panel %%x%d|", TH_PANEL); strcat(cp, str);
|
||||
|
||||
@@ -2521,7 +2521,7 @@ void drawinfospace(ScrArea *sa, void *spacedata)
|
||||
uiDefButBitI(block, TOGN, USER_TRACKBALL, B_DRAWINFO, "Turntable",
|
||||
(xpos+edgsp+mpref+(2*spref)+(3*midsp)+(mpref/2)),y3,(mpref/2),buth,
|
||||
&(U.flag), 0, 0, 0, 0,
|
||||
"Allow the view to tumble freely when orbiting with the Middle Mouse Button");
|
||||
"Use fixed up axis for orbiting with Middle Mouse Button");
|
||||
uiBlockSetCol(block, TH_AUTO); /* end color */
|
||||
uiDefButBitI(block, TOG, USER_AUTOPERSP, B_DRAWINFO, "Auto Perspective",
|
||||
(xpos+edgsp+mpref+(2*spref)+(3*midsp)),y2,(mpref/2),buth,
|
||||
@@ -4639,7 +4639,7 @@ void allqueue(unsigned short event, short val)
|
||||
scrarea_queue_headredraw(sa);
|
||||
if(val) {
|
||||
si= sa->spacedata.first;
|
||||
if (si->pin==0)
|
||||
if (si->pin==0)
|
||||
si->blocktype= val;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1627,24 +1627,24 @@ void special_aftertrans_update(TransInfo *t)
|
||||
pose= ob->pose;
|
||||
|
||||
if (!act)
|
||||
act= ob->action= add_empty_action();
|
||||
act= ob->action= add_empty_action(ID_PO);
|
||||
|
||||
set_pose_keys(ob); // sets chan->flag to POSE_KEY if bone selected
|
||||
for (pchan=pose->chanbase.first; pchan; pchan=pchan->next){
|
||||
if (pchan->flag & POSE_KEY){
|
||||
|
||||
set_action_key(act, pchan, AC_QUAT_X, 1);
|
||||
set_action_key(act, pchan, AC_QUAT_Y, 1);
|
||||
set_action_key(act, pchan, AC_QUAT_Z, 1);
|
||||
set_action_key(act, pchan, AC_QUAT_W, 1);
|
||||
|
||||
set_action_key(act, pchan, AC_SIZE_X, 1);
|
||||
set_action_key(act, pchan, AC_SIZE_Y, 1);
|
||||
set_action_key(act, pchan, AC_SIZE_Z, 1);
|
||||
|
||||
set_action_key(act, pchan, AC_LOC_X, 1);
|
||||
set_action_key(act, pchan, AC_LOC_Y, 1);
|
||||
set_action_key(act, pchan, AC_LOC_Z, 1);
|
||||
insertkey(&act->id, ID_AC, pchan->name, NULL, AC_SIZE_X);
|
||||
insertkey(&act->id, ID_AC, pchan->name, NULL, AC_SIZE_Y);
|
||||
insertkey(&act->id, ID_AC, pchan->name, NULL, AC_SIZE_Z);
|
||||
|
||||
insertkey(&act->id, ID_AC, pchan->name, NULL, AC_QUAT_W);
|
||||
insertkey(&act->id, ID_AC, pchan->name, NULL, AC_QUAT_X);
|
||||
insertkey(&act->id, ID_AC, pchan->name, NULL, AC_QUAT_Y);
|
||||
insertkey(&act->id, ID_AC, pchan->name, NULL, AC_QUAT_Z);
|
||||
|
||||
insertkey(&act->id, ID_AC, pchan->name, NULL, AC_LOC_X);
|
||||
insertkey(&act->id, ID_AC, pchan->name, NULL, AC_LOC_Y);
|
||||
insertkey(&act->id, ID_AC, pchan->name, NULL, AC_LOC_Z);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1679,18 +1679,18 @@ void special_aftertrans_update(TransInfo *t)
|
||||
|
||||
/* Set autokey if necessary */
|
||||
if ((G.flags & G_RECORDKEYS) && (!cancelled) && (base->flag & SELECT)){
|
||||
/* note, here we have to do context still */
|
||||
insertkey(&base->object->id, ID_OB, NULL, NULL, OB_ROT_X);
|
||||
insertkey(&base->object->id, ID_OB, NULL, NULL, OB_ROT_Y);
|
||||
insertkey(&base->object->id, ID_OB, NULL, NULL, OB_ROT_Z);
|
||||
|
||||
insertkey(&base->object->id, OB_ROT_X);
|
||||
insertkey(&base->object->id, OB_ROT_Y);
|
||||
insertkey(&base->object->id, OB_ROT_Z);
|
||||
insertkey(&base->object->id, ID_OB, NULL, NULL, OB_LOC_X);
|
||||
insertkey(&base->object->id, ID_OB, NULL, NULL, OB_LOC_Y);
|
||||
insertkey(&base->object->id, ID_OB, NULL, NULL, OB_LOC_Z);
|
||||
|
||||
insertkey(&base->object->id, OB_LOC_X);
|
||||
insertkey(&base->object->id, OB_LOC_Y);
|
||||
insertkey(&base->object->id, OB_LOC_Z);
|
||||
|
||||
insertkey(&base->object->id, OB_SIZE_X);
|
||||
insertkey(&base->object->id, OB_SIZE_Y);
|
||||
insertkey(&base->object->id, OB_SIZE_Z);
|
||||
insertkey(&base->object->id, ID_OB, NULL, NULL, OB_SIZE_X);
|
||||
insertkey(&base->object->id, ID_OB, NULL, NULL, OB_SIZE_Y);
|
||||
insertkey(&base->object->id, ID_OB, NULL, NULL, OB_SIZE_Z);
|
||||
|
||||
remake_object_ipos (ob);
|
||||
allqueue(REDRAWIPO, 0);
|
||||
|
||||
@@ -238,6 +238,17 @@ static void init_userdef_file(void)
|
||||
}
|
||||
}
|
||||
}
|
||||
if (G.main->versionfile <= 238) {
|
||||
bTheme *btheme;
|
||||
/* bone colors */
|
||||
for(btheme= U.themes.first; btheme; btheme= btheme->next) {
|
||||
/* check for alpha==0 is safe, then color was never set */
|
||||
if(btheme->tnla.strip[3]==0) {
|
||||
SETCOL(btheme->tnla.strip_select, 0xff, 0xff, 0xaa, 255);
|
||||
SETCOL(btheme->tnla.strip, 0xe4, 0x9c, 0xc6, 255);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (U.undosteps==0) U.undosteps=32;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user