diff options
Diffstat (limited to 'source/blender/src/drawipo.c')
-rw-r--r-- | source/blender/src/drawipo.c | 2730 |
1 files changed, 0 insertions, 2730 deletions
diff --git a/source/blender/src/drawipo.c b/source/blender/src/drawipo.c deleted file mode 100644 index fd3fa0df927..00000000000 --- a/source/blender/src/drawipo.c +++ /dev/null @@ -1,2730 +0,0 @@ -/** - * $Id$ - * - * ***** BEGIN GPL/BL DUAL 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. - * - * 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. - * - * The Original Code is: all of this file. - * - * Contributor(s): none yet. - * - * ***** END GPL/BL DUAL LICENSE BLOCK ***** - */ - -#include <stdio.h> -#include <math.h> -#include <string.h> - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -#ifndef _WIN32 -#include <unistd.h> -#else -#include <io.h> -#endif - -#include "MEM_guardedalloc.h" - -#include "BLI_blenlib.h" -#include "BLI_arithb.h" - -#include "DNA_action_types.h" -#include "DNA_curve_types.h" -#include "DNA_ipo_types.h" -#include "DNA_key_types.h" -#include "DNA_object_types.h" -#include "DNA_scene_types.h" -#include "DNA_screen_types.h" -#include "DNA_space_types.h" -#include "DNA_sequence_types.h" -#include "DNA_userdef_types.h" - -#include "BKE_curve.h" -#include "BKE_depsgraph.h" -#include "BKE_global.h" -#include "BKE_ipo.h" -#include "BKE_key.h" -#include "BKE_utildefines.h" - -#include "BIF_cursors.h" -#include "BIF_gl.h" -#include "BIF_graphics.h" -#include "BIF_resources.h" -#include "BIF_screen.h" -#include "BIF_interface.h" -#include "BIF_mywindow.h" -#include "BIF_space.h" -#include "BIF_toolbox.h" -#include "BIF_glutil.h" -#include "BIF_editseq.h" -#include "BIF_editaction.h" -#include "BIF_language.h" - -#include "BSE_drawipo.h" -#include "BSE_view.h" -#include "BSE_editipo.h" -#include "BSE_editipo_types.h" -#include "BSE_editnla_types.h" -#include "BSE_time.h" - -#include "BPY_extern.h" - -#include "mydevice.h" -#include "blendef.h" -#include "butspace.h" // shouldnt be... -#include "interface.h" /* for ui_rasterpos_safe */ -#include "winlay.h" - -/* local define... also used in editipo ... */ -#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) ) - - /* 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 to test LEFTMOUSE for scrollbar */ - -static void scroll_prstr(float x, float y, float val, char dir, int disptype) -{ - int len, macht; - char str[32]; - - if(dir=='v') { - macht= ipomachty; - if ELEM(disptype, IPO_DISPDEGR, IPO_DISPTIME) { - macht+=1; - val *= 10; - } - } - else macht= ipomachtx; - - if (macht<=0) sprintf(str, "%.*f", 1-macht, val); - else sprintf(str, "%d", (int)floor(val + 0.375)); - - len= strlen(str); - if(dir=='h') x-= 4*len; - - if(dir=='v' && disptype==IPO_DISPDEGR) { - str[len]= 186; /* Degree symbol */ - str[len+1]= 0; - } - - ui_rasterpos_safe(x, y, 1.0); - BIF_DrawString(G.fonts, str, 0); -} - -static void step_to_grid(float *step, int *macht) -{ - float loga, rem; - - /* try to write step as a power of 10 */ - - loga= log10(*step); - *macht= (int)(loga); - - rem= loga- *macht; - rem= pow(10.0, rem); - - if(loga<0.0) { - if(rem < 0.2) rem= 0.2; - else if(rem < 0.5) rem= 0.5; - else rem= 1.0; - - *step= rem*pow(10.0, (float)*macht); - - // partial of a frame have no meaning - switch(curarea->spacetype) { - case SPACE_TIME: { - SpaceTime *stime= curarea->spacedata.first; - if(stime->flag & TIME_DRAWFRAMES) { - rem = 1.0; - *step = 1.0; - } - break; - } - case SPACE_SEQ: { - SpaceTime * sseq= curarea->spacedata.first; - if (sseq->flag & SEQ_DRAWFRAMES) { - rem = 1.0; - *step = 1.0; - } - } - default: - break; - } - - - - if(rem==1.0) (*macht)++; // prevents printing 1.0 2.0 3.0 etc - } - else { - if(rem < 2.0) rem= 2.0; - else if(rem < 5.0) rem= 5.0; - else rem= 10.0; - - *step= rem*pow(10.0, (float)*macht); - - (*macht)++; - if(rem==10.0) (*macht)++; // prevents printing 1.0 2.0 3.0 etc - } -} - -void calc_ipogrid() -{ - float space, pixels, secondiv=1.0; - int secondgrid= 0; - /* rule: gridstep is minimal IPOSTEP pixels */ - /* how large is IPOSTEP pixels? */ - - if(G.v2d==0) return; - - /* detect of we have seconds or frames, should become argument */ - - switch(curarea->spacetype) { - case SPACE_TIME: { - SpaceTime *stime= curarea->spacedata.first; - if(!(stime->flag & TIME_DRAWFRAMES)) { - secondgrid= 1; - secondiv= 0.01 * FPS; - } - break; - } - case SPACE_SEQ: { - SpaceSeq * sseq = curarea->spacedata.first; - if (!(sseq->flag & SEQ_DRAWFRAMES)) { - secondgrid = 1; - secondiv = 0.01 * FPS; - } - break; - } - case SPACE_ACTION: { - SpaceAction *saction = curarea->spacedata.first; - if (saction->flag & SACTION_DRAWTIME) { - secondgrid = 1; - secondiv = 0.01 * FPS; - } - break; - } - case SPACE_NLA: { - SpaceNla *snla = curarea->spacedata.first; - if (snla->flag & SNLA_DRAWTIME) { - secondgrid = 1; - secondiv = 0.01 * FPS; - } - break; - } - default: - break; - } - - space= G.v2d->cur.xmax - G.v2d->cur.xmin; - pixels= G.v2d->mask.xmax-G.v2d->mask.xmin; - - ipogrid_dx= IPOSTEP*space/(secondiv*pixels); - step_to_grid(&ipogrid_dx, &ipomachtx); - ipogrid_dx*= secondiv; - - if ELEM5(curarea->spacetype, SPACE_SEQ, SPACE_SOUND, SPACE_TIME, SPACE_ACTION, SPACE_NLA) { - if(ipogrid_dx < 0.1) ipogrid_dx= 0.1; - ipomachtx-= 2; - if(ipomachtx<-2) ipomachtx= -2; - } - - space= (G.v2d->cur.ymax - G.v2d->cur.ymin); - pixels= curarea->winy; - ipogrid_dy= IPOSTEP*space/pixels; - step_to_grid(&ipogrid_dy, &ipomachty); - - if ELEM5(curarea->spacetype, SPACE_SEQ, SPACE_SOUND, SPACE_TIME, SPACE_ACTION, SPACE_NLA) { - if(ipogrid_dy < 1.0) ipogrid_dy= 1.0; - if(ipomachty<1) ipomachty= 1; - } - - ipogrid_startx= secondiv*(G.v2d->cur.xmin/secondiv - fmod(G.v2d->cur.xmin/secondiv, ipogrid_dx/secondiv)); - if(G.v2d->cur.xmin<0.0) ipogrid_startx-= ipogrid_dx; - - ipogrid_starty= (G.v2d->cur.ymin-fmod(G.v2d->cur.ymin, ipogrid_dy)); - if(G.v2d->cur.ymin<0.0) ipogrid_starty-= ipogrid_dy; - -} - -void draw_ipogrid(void) -{ - float vec1[2], vec2[2]; - int a, step; - - vec1[0]= vec2[0]= ipogrid_startx; - vec1[1]= ipogrid_starty; - vec2[1]= G.v2d->cur.ymax; - - step= (G.v2d->mask.xmax-G.v2d->mask.xmin+1)/IPOSTEP; - - BIF_ThemeColor(TH_GRID); - - for(a=0; a<step; a++) { - glBegin(GL_LINE_STRIP); - glVertex2fv(vec1); glVertex2fv(vec2); - glEnd(); - vec2[0]= vec1[0]+= ipogrid_dx; - } - - vec2[0]= vec1[0]-= 0.5*ipogrid_dx; - - BIF_ThemeColorShade(TH_GRID, 16); - - step++; - for(a=0; a<=step; a++) { - glBegin(GL_LINE_STRIP); - glVertex2fv(vec1); glVertex2fv(vec2); - glEnd(); - vec2[0]= vec1[0]-= ipogrid_dx; - } - - if ELEM4(curarea->spacetype, SPACE_SOUND, SPACE_ACTION, SPACE_NLA, SPACE_TIME); - else { - vec1[0]= ipogrid_startx; - vec1[1]= vec2[1]= ipogrid_starty; - vec2[0]= G.v2d->cur.xmax; - - step= (curarea->winy+1)/IPOSTEP; - - BIF_ThemeColor(TH_GRID); - for(a=0; a<=step; a++) { - glBegin(GL_LINE_STRIP); - glVertex2fv(vec1); glVertex2fv(vec2); - glEnd(); - vec2[1]= vec1[1]+= ipogrid_dy; - } - vec2[1]= vec1[1]-= 0.5*ipogrid_dy; - step++; - - if(curarea->spacetype==SPACE_IPO) { - BIF_ThemeColorShade(TH_GRID, 16); - for(a=0; a<step; a++) { - glBegin(GL_LINE_STRIP); - glVertex2fv(vec1); glVertex2fv(vec2); - glEnd(); - vec2[1]= vec1[1]-= ipogrid_dy; - } - } - } - - BIF_ThemeColorShade(TH_GRID, -50); - - if (curarea->spacetype!=SPACE_ACTION && curarea->spacetype!=SPACE_NLA) - { /* Horizontal axis */ - vec1[0]= G.v2d->cur.xmin; - vec2[0]= G.v2d->cur.xmax; - vec1[1]= vec2[1]= 0.0; - glBegin(GL_LINE_STRIP); - - glVertex2fv(vec1); - glVertex2fv(vec2); - - glEnd(); - } - - /* Vertical axis */ - - vec1[1]= G.v2d->cur.ymin; - vec2[1]= G.v2d->cur.ymax; - vec1[0]= vec2[0]= 0.0; - glBegin(GL_LINE_STRIP); - glVertex2fv(vec1); glVertex2fv(vec2); - glEnd(); - - /* Limits box */ - if(curarea->spacetype==SPACE_IPO) { - if(G.sipo->blocktype==ID_SEQ) { - Sequence * last_seq = get_last_seq(); - float start = 0.0; - float end = 100.0; - - if (last_seq && - ((last_seq->flag & SEQ_IPO_FRAME_LOCKED) != 0)) { - start = last_seq->startdisp; - end = last_seq->enddisp; - } - - glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); - glRectf(start, 0.0, end, 1.0); - glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); - } - 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); - } - } -} - -void areamouseco_to_ipoco(View2D *v2d, short *mval, float *x, float *y) -{ - float div, ofs; - - div= v2d->mask.xmax-v2d->mask.xmin; - ofs= v2d->mask.xmin; - - *x= v2d->cur.xmin+ (v2d->cur.xmax-v2d->cur.xmin)*(mval[0]-ofs)/div; - - div= v2d->mask.ymax-v2d->mask.ymin; - ofs= v2d->mask.ymin; - - *y= v2d->cur.ymin+ (v2d->cur.ymax-v2d->cur.ymin)*(mval[1]-ofs)/div; -} - -void ipoco_to_areaco(View2D *v2d, float *vec, short *mval) -{ - float x, y; - - mval[0]= IS_CLIPPED; - - x= (vec[0] - v2d->cur.xmin)/(v2d->cur.xmax-v2d->cur.xmin); - y= (vec[1] - v2d->cur.ymin)/(v2d->cur.ymax-v2d->cur.ymin); - - if(x>=0.0 && x<=1.0) { - if(y>=0.0 && y<=1.0) { - mval[0]= v2d->mask.xmin + x*(v2d->mask.xmax-v2d->mask.xmin); - mval[1]= v2d->mask.ymin + y*(v2d->mask.ymax-v2d->mask.ymin); - } - } -} - -void ipoco_to_areaco_noclip(View2D *v2d, float *vec, short *mval) -{ - float x, y; - - x= (vec[0] - v2d->cur.xmin)/(v2d->cur.xmax-v2d->cur.xmin); - y= (vec[1] - v2d->cur.ymin)/(v2d->cur.ymax-v2d->cur.ymin); - - x= v2d->mask.xmin + x*(v2d->mask.xmax-v2d->mask.xmin); - y= v2d->mask.ymin + y*(v2d->mask.ymax-v2d->mask.ymin); - - if(x<-32760) mval[0]= -32760; - else if(x>32760) mval[0]= 32760; - else mval[0]= x; - - if(y<-32760) mval[1]= -32760; - else if(y>32760) mval[1]= 32760; - else mval[1]= y; -} - -int in_ipo_buttons(void) -{ - short mval[2]; - - getmouseco_areawin(mval); - - if(mval[0]< G.v2d->mask.xmax) return 0; - else return 1; -} - -static View2D *spacelink_get_view2d(SpaceLink *sl) -{ - if(sl->spacetype==SPACE_IPO) - return &((SpaceIpo *)sl)->v2d; - else if(sl->spacetype==SPACE_SOUND) - return &((SpaceSound *)sl)->v2d; - if(sl->spacetype==SPACE_ACTION) - return &((SpaceAction *)sl)->v2d; - if(sl->spacetype==SPACE_NLA) - return &((SpaceNla *)sl)->v2d; - if(sl->spacetype==SPACE_TIME) - return &((SpaceTime *)sl)->v2d; - if(sl->spacetype==SPACE_SEQ) - return &((SpaceSeq *)sl)->v2d; - return NULL; -} - -/* copies changes in this view from or to all 2d views with lock option open */ -/* do not call this inside of drawing routines, to prevent eternal loops */ -void view2d_do_locks(ScrArea *cursa, int flag) -{ - ScrArea *sa; - View2D *v2d, *curv2d; - SpaceLink *sl; - - curv2d= spacelink_get_view2d(cursa->spacedata.first); - if(curv2d==NULL) return; - if((curv2d->flag & V2D_VIEWLOCK)==0) return; - - for(sa= G.curscreen->areabase.first; sa; sa= sa->next) { - if(sa!=cursa) { - for(sl= sa->spacedata.first; sl; sl= sl->next) { - - v2d= spacelink_get_view2d(sl); - if(v2d) { - if(v2d->flag & V2D_VIEWLOCK) { - if(flag & V2D_LOCK_COPY) { - v2d->cur.xmin= curv2d->cur.xmin; - v2d->cur.xmax= curv2d->cur.xmax; - } - else { - curv2d->cur.xmin= v2d->cur.xmin; - curv2d->cur.xmax= v2d->cur.xmax; - scrarea_queue_winredraw(sa); - } - - if(flag & V2D_LOCK_REDRAW) { - if(sl == sa->spacedata.first) - scrarea_do_windraw(sa); - } - else - scrarea_queue_winredraw(sa); - } - } - } - } - } -} - -/* event based, note: curarea is in here... */ -void view2d_zoom(View2D *v2d, float factor, int winx, int winy) -{ - float dx= factor*(v2d->cur.xmax-v2d->cur.xmin); - float dy= factor*(v2d->cur.ymax-v2d->cur.ymin); - if ((v2d->keepzoom & V2D_LOCKZOOM_X)==0) { - v2d->cur.xmin+= dx; - v2d->cur.xmax-= dx; - } - if ((v2d->keepzoom & V2D_LOCKZOOM_Y)==0) { - v2d->cur.ymin+= dy; - v2d->cur.ymax-= dy; - } - test_view2d(v2d, winx, winy); - view2d_do_locks(curarea, V2D_LOCK_COPY); -} - - -void test_view2d(View2D *v2d, int winx, int winy) -{ - /* cur is not allowed to be larger than max, smaller than min, or outside of tot */ - rctf *cur, *tot; - float dx, dy, temp, fac, zoom; - - /* correct winx for scroll */ - if(v2d->scroll & L_SCROLL) winx-= SCROLLB; - if(v2d->scroll & B_SCROLL) winy-= SCROLLH; - if(v2d->scroll & B_SCROLLO) winy-= SCROLLH; /* B_SCROLL and B_SCROLLO are basically same thing */ - - /* header completely closed window */ - if(winy<=0) return; - - cur= &v2d->cur; - tot= &v2d->tot; - - dx= cur->xmax-cur->xmin; - dy= cur->ymax-cur->ymin; - - /* Reevan's test */ - if (v2d->keepzoom & V2D_LOCKZOOM_Y) - v2d->cur.ymax=v2d->cur.ymin+((float)winy); - - if (v2d->keepzoom & V2D_LOCKZOOM_X) - v2d->cur.xmax=v2d->cur.xmin+((float)winx); - - if(v2d->keepzoom) { - - zoom= ((float)winx)/dx; - - if(zoom<v2d->minzoom || zoom>v2d->maxzoom) { - if(zoom<v2d->minzoom) fac= zoom/v2d->minzoom; - else fac= zoom/v2d->maxzoom; - - dx*= fac; - temp= 0.5*(cur->xmax+cur->xmin); - - cur->xmin= temp-0.5*dx; - cur->xmax= temp+0.5*dx; - } - - zoom= ((float)winy)/dy; - - if(zoom<v2d->minzoom || zoom>v2d->maxzoom) { - if(zoom<v2d->minzoom) fac= zoom/v2d->minzoom; - else fac= zoom/v2d->maxzoom; - - dy*= fac; - temp= 0.5*(cur->ymax+cur->ymin); - cur->ymin= temp-0.5*dy; - cur->ymax= temp+0.5*dy; - } - } - else { - if(dx<G.v2d->min[0]) { - dx= G.v2d->min[0]; - temp= 0.5*(cur->xmax+cur->xmin); - cur->xmin= temp-0.5*dx; - cur->xmax= temp+0.5*dx; - } - else if(dx>G.v2d->max[0]) { - dx= G.v2d->max[0]; - temp= 0.5*(cur->xmax+cur->xmin); - cur->xmin= temp-0.5*dx; - cur->xmax= temp+0.5*dx; - } - - if(dy<G.v2d->min[1]) { - dy= G.v2d->min[1]; - temp= 0.5*(cur->ymax+cur->ymin); - cur->ymin= temp-0.5*dy; - cur->ymax= temp+0.5*dy; - } - else if(dy>G.v2d->max[1]) { - dy= G.v2d->max[1]; - temp= 0.5*(cur->ymax+cur->ymin); - cur->ymin= temp-0.5*dy; - cur->ymax= temp+0.5*dy; - } - } - - if(v2d->keepaspect) { - short do_x=0, do_y=0; - - /* when a window edge changes, the aspect ratio can't be used to - find which is the best new 'cur' rect. thats why it stores 'old' */ - if(winx!=v2d->oldwinx) do_x= 1; - if(winy!=v2d->oldwiny) do_y= 1; - - dx= (cur->ymax-cur->ymin)/(cur->xmax-cur->xmin); - dy= ((float)winy)/((float)winx); - - if(do_x==do_y) { // both sizes change, ctrl+uparrow - if(do_x==1 && do_y==1) { - if( ABS(winx-v2d->oldwinx)>ABS(winy-v2d->oldwiny)) do_y= 0; - else do_x= 0; - } - else if( dy > 1.0) do_x= 0; else do_x= 1; - } - - if( do_x ) { - if (v2d->keeptot == 2 && winx < v2d->oldwinx) { - /* This is a special hack for the outliner, to ensure that the - * outliner contents will not eventually get pushed out of view - * when shrinking the view. - */ - cur->xmax -= cur->xmin; - cur->xmin= 0.0f; - } - else { - /* portrait window: correct for x */ - dx= cur->ymax-cur->ymin; - temp= (cur->xmax+cur->xmin); - - cur->xmin= temp/2.0 - 0.5*dx/dy; - cur->xmax= temp/2.0 + 0.5*dx/dy; - } - } - else { - dx= cur->xmax-cur->xmin; - temp= (cur->ymax+cur->ymin); - - cur->ymin= temp/2.0 - 0.5*dy*dx; - cur->ymax= temp/2.0 + 0.5*dy*dx; - } - - v2d->oldwinx= winx; - v2d->oldwiny= winy; - } - - if(v2d->keeptot) { - dx= cur->xmax-cur->xmin; - dy= cur->ymax-cur->ymin; - - if(dx > tot->xmax-tot->xmin) { - if(v2d->keepzoom==0) { - if(cur->xmin<tot->xmin) cur->xmin= tot->xmin; - if(cur->xmax>tot->xmax) cur->xmax= tot->xmax; - } - else { - if(cur->xmax < tot->xmax) { - dx= tot->xmax-cur->xmax; - cur->xmin+= dx; - cur->xmax+= dx; - } - else if(cur->xmin > tot->xmin) { - dx= cur->xmin-tot->xmin; - cur->xmin-= dx; - cur->xmax-= dx; - } - } - } - else { - if(cur->xmin < tot->xmin) { - dx= tot->xmin-cur->xmin; - cur->xmin+= dx; - cur->xmax+= dx; - } - else if((v2d->keeptot!=2) && (cur->xmax > tot->xmax)) { - /* keeptot==2 is a special case for the outliner. see space.c, init_v2d_oops for details */ - dx= cur->xmax-tot->xmax; - cur->xmin-= dx; - cur->xmax-= dx; - } - } - - if(dy > tot->ymax-tot->ymin) { - if(v2d->keepzoom==0) { - if(cur->ymin<tot->ymin) cur->ymin= tot->ymin; - if(cur->ymax>tot->ymax) cur->ymax= tot->ymax; - } - else { - if(cur->ymax < tot->ymax) { - dy= tot->ymax-cur->ymax; - cur->ymin+= dy; - cur->ymax+= dy; - } - else if(cur->ymin > tot->ymin) { - dy= cur->ymin-tot->ymin; - cur->ymin-= dy; - cur->ymax-= dy; - } - } - } - else { - if(cur->ymin < tot->ymin) { - dy= tot->ymin-cur->ymin; - cur->ymin+= dy; - cur->ymax+= dy; - } - else if(cur->ymax > tot->ymax) { - dy= cur->ymax-tot->ymax; - cur->ymin-= dy; - cur->ymax-= dy; - } - } - } -} - -#define IPOBUTX 70 -static int calc_ipobuttonswidth(ScrArea *sa) -{ - SpaceIpo *sipo= sa->spacedata.first; - EditIpo *ei; - int ipowidth = IPOBUTX; - int a; - float textwidth = 0; - - /* default width when no space ipo or no channels */ - if (sipo == NULL) return IPOBUTX; - if ((sipo->totipo==0) || (sipo->editipo==NULL)) return IPOBUTX; - - ei= sipo->editipo; - - for(a=0; a<sipo->totipo; a++, ei++) { - textwidth = BIF_GetStringWidth(G.font, ei->name, 0); - if (textwidth + 18 > ipowidth) - ipowidth = textwidth + 18; - } - return ipowidth; - -} - -void calc_scrollrcts(ScrArea *sa, View2D *v2d, int winx, int winy) -{ - v2d->mask.xmin= v2d->mask.ymin= 0; - v2d->mask.xmax= winx; - v2d->mask.ymax= winy; - - if(sa->spacetype==SPACE_ACTION) { - if(sa->winx > ACTWIDTH+50) { - v2d->mask.xmin+= ACTWIDTH; - v2d->hor.xmin+=ACTWIDTH; - } - } - else if(sa->spacetype==SPACE_NLA){ - if(sa->winx > NLAWIDTH+50) { - v2d->mask.xmin+= NLAWIDTH; - v2d->hor.xmin+=NLAWIDTH; - } - } - else if(sa->spacetype==SPACE_IPO) { - int ipobutx = calc_ipobuttonswidth(sa); - - v2d->mask.xmax-= ipobutx; - - if(v2d->mask.xmax<ipobutx) - v2d->mask.xmax= winx; - } - - if(v2d->scroll) { - if(v2d->scroll & L_SCROLL) { - v2d->vert= v2d->mask; - v2d->vert.xmax= SCROLLB; - v2d->mask.xmin= SCROLLB; - } - else if(v2d->scroll & R_SCROLL) { - v2d->vert= v2d->mask; - v2d->vert.xmin= v2d->vert.xmax-SCROLLB; - v2d->mask.xmax= v2d->vert.xmin; - } - - if((v2d->scroll & B_SCROLL) || (v2d->scroll & B_SCROLLO)) { - v2d->hor= v2d->mask; - v2d->hor.ymax= SCROLLH; - v2d->mask.ymin= SCROLLH; - } - else if(v2d->scroll & T_SCROLL) { - v2d->hor= v2d->mask; - v2d->hor.ymin= v2d->hor.ymax-SCROLLH; - v2d->mask.ymax= v2d->hor.ymin; - } - } -} - - /* draws a line in left vertical scrollbar at the given height */ -static void draw_solution_line(View2D *v2d, float h) -{ - float vec[2]; - short mval[2]; - - vec[0]= v2d->cur.xmin; - vec[1]= h; - ipoco_to_areaco(v2d, vec, mval); - if(mval[0]!=IS_CLIPPED) { - glBegin(GL_LINES); - glVertex2f(v2d->vert.xmin, mval[1]); - glVertex2f(v2d->vert.xmax, mval[1]); - glEnd(); - } -} - -static void draw_solution(SpaceIpo *sipo) -{ - View2D *v2d= &sipo->v2d; - EditIpo *ei; - int a; - - if (!(v2d->scroll & VERT_SCROLL)) return; - - ei= sipo->editipo; - for(a=0; a<sipo->totipo; a++, ei++) { - if ISPOIN(ei, flag & IPO_VISIBLE, icu) { - cpack(ei->col); - - /* DISPBITS ipos have 'multiple' values. */ - if(ei->disptype==IPO_DISPBITS) { - int b, val= ei->icu->curval; - - for (b=0; b<31; b++) - if (val & (1<<b)) - draw_solution_line(v2d, b+1); - } else { - draw_solution_line(v2d, ei->icu->curval); - } - } - } -} - -/* used for drawing timeline */ -void draw_view2d_numbers_horiz(int drawframes) -{ - float fac, fac2, dfac, val; - - /* the numbers: convert ipogrid_startx and -dx to scroll coordinates */ - - fac= (ipogrid_startx- G.v2d->cur.xmin)/(G.v2d->cur.xmax-G.v2d->cur.xmin); - fac= G.v2d->mask.xmin+fac*(G.v2d->mask.xmax-G.v2d->mask.xmin); - - dfac= (ipogrid_dx)/(G.v2d->cur.xmax-G.v2d->cur.xmin); - dfac= dfac*(G.v2d->mask.xmax-G.v2d->mask.xmin); - - BIF_ThemeColor(TH_TEXT); - val= ipogrid_startx; - while(fac < G.v2d->mask.xmax) { - - if(drawframes) { - ipomachtx= 1; - scroll_prstr(fac, 2.0+(float)(G.v2d->mask.ymin), val, 'h', 0); - } - else { - fac2= val/FPS; - scroll_prstr(fac, 2.0+(float)(G.v2d->mask.ymin), fac2, 'h', 0); - } - - fac+= dfac; - val+= ipogrid_dx; - } -} - - -void drawscroll(int disptype) -{ - rcti vert, hor; - float fac, dfac, val, fac2, tim; - int darker, dark, light, lighter; - - vert= (G.v2d->vert); - hor= (G.v2d->hor); - - darker= -40; - dark= 0; - light= 20; - lighter= 50; - - if((G.v2d->scroll & HOR_SCROLL) || (G.v2d->scroll & HOR_SCROLLO)) { - - BIF_ThemeColorShade(TH_SHADE1, light); - glRecti(hor.xmin, hor.ymin, hor.xmax, hor.ymax); - - /* slider */ - fac= (G.v2d->cur.xmin- G.v2d->tot.xmin)/(G.v2d->tot.xmax-G.v2d->tot.xmin); - if(fac<0.0) fac= 0.0; - horxmin= hor.xmin+fac*(hor.xmax-hor.xmin); - - fac= (G.v2d->cur.xmax- G.v2d->tot.xmin)/(G.v2d->tot.xmax-G.v2d->tot.xmin); - if(fac>1.0) fac= 1.0; - horxmax= hor.xmin+fac*(hor.xmax-hor.xmin); - - if(horxmin > horxmax) horxmin= horxmax; - - BIF_ThemeColorShade(TH_SHADE1, dark); - glRecti(horxmin, hor.ymin, horxmax, hor.ymax); - - /* decoration bright line */ - BIF_ThemeColorShade(TH_SHADE1, lighter); - sdrawline(hor.xmin, hor.ymax, hor.xmax, hor.ymax); - - /* the numbers: convert ipogrid_startx and -dx to scroll coordinates */ - fac= (ipogrid_startx- G.v2d->cur.xmin)/(G.v2d->cur.xmax-G.v2d->cur.xmin); - fac= hor.xmin+fac*(hor.xmax-hor.xmin); - - dfac= (ipogrid_dx)/(G.v2d->cur.xmax-G.v2d->cur.xmin); - dfac= dfac*(hor.xmax-hor.xmin); - - BIF_ThemeColor(TH_TEXT); - val= ipogrid_startx; - while(fac < hor.xmax) { - - if(curarea->spacetype==SPACE_OOPS) { - /* Under no circumstances may the outliner/oops display numbers on its scrollbar - * Unfortunately, versions of Blender without this patch will hang on loading files with - * horizontally scrollable Outliners. - */ - break; - } - else if(curarea->spacetype==SPACE_SEQ) { - SpaceSeq * sseq = curarea->spacedata.first; - if (sseq->flag & SEQ_DRAWFRAMES) { - ipomachtx = 1; - scroll_prstr(fac, 3.0+(float)(hor.ymin), val, 'h', disptype); - } else { - fac2= val/FPS; - tim= floor(fac2); - fac2= fac2-tim; - scroll_prstr(fac, 3.0+(float)(hor.ymin), tim+FPS*fac2/100.0, 'h', disptype); - } - } - else if (curarea->spacetype==SPACE_SOUND) { - SpaceSound *ssound= curarea->spacedata.first; - - if(ssound->flag & SND_DRAWFRAMES) { - ipomachtx= 1; - scroll_prstr(fac, 3.0+(float)(hor.ymin), val, 'h', disptype); - } - else { - fac2= val/FPS; - scroll_prstr(fac, 3.0+(float)(hor.ymin), fac2, 'h', disptype); - } - } - else if (curarea->spacetype==SPACE_TIME) { - SpaceTime *stime= curarea->spacedata.first; - - if(stime->flag & TIME_DRAWFRAMES) { - ipomachtx= 1; - scroll_prstr(fac, 3.0+(float)(hor.ymin), val, 'h', disptype); - } - else { - fac2= val/FPS; - scroll_prstr(fac, 3.0+(float)(hor.ymin), fac2, 'h', disptype); - } - } - else if (curarea->spacetype==SPACE_IPO) { - EditIpo *ei= get_active_editipo(); - - if(ei && ei->icu && ei->icu->driver) { - int adrcode= ei->icu->driver->adrcode; - - if(adrcode==OB_ROT_X || adrcode==OB_ROT_Y || adrcode==OB_ROT_Z) { - scroll_prstr(fac, 3.0+(float)(hor.ymin), val, 'v', IPO_DISPDEGR); - } - else - scroll_prstr(fac, 3.0+(float)(hor.ymin), val, 'h', disptype); - } - else - scroll_prstr(fac, 3.0+(float)(hor.ymin), val, 'h', disptype); - } - else if (curarea->spacetype==SPACE_ACTION) { - SpaceAction *saction= curarea->spacedata.first; - - if (saction->flag & SACTION_DRAWTIME) { - fac2= val/FPS; - scroll_prstr(fac, 3.0+(float)(hor.ymin), fac2, 'h', disptype); - } - else { - ipomachtx= 1; - scroll_prstr(fac, 3.0+(float)(hor.ymin), val, 'h', disptype); - } - } - else if (curarea->spacetype==SPACE_NLA) { - SpaceNla *snla= curarea->spacedata.first; - - if (snla->flag & SNLA_DRAWTIME) { - fac2= val/FPS; - scroll_prstr(fac, 3.0+(float)(hor.ymin), fac2, 'h', disptype); - } - else { - ipomachtx= 1; - scroll_prstr(fac, 3.0+(float)(hor.ymin), val, 'h', disptype); - } - } - else { - scroll_prstr(fac, 3.0+(float)(hor.ymin), val, 'h', disptype); - } - - fac+= dfac; - val+= ipogrid_dx; - } - } - - if(G.v2d->scroll & VERT_SCROLL) { - BIF_ThemeColorShade(TH_SHADE1, light); - glRecti(vert.xmin, vert.ymin, vert.xmax, vert.ymax); - - /* slider */ - fac= (G.v2d->cur.ymin- G.v2d->tot.ymin)/(G.v2d->tot.ymax-G.v2d->tot.ymin); - if(fac<0.0) fac= 0.0; - vertymin= vert.ymin+fac*(vert.ymax-vert.ymin); - - fac= (G.v2d->cur.ymax- G.v2d->tot.ymin)/(G.v2d->tot.ymax-G.v2d->tot.ymin); - if(fac>1.0) fac= 1.0; - vertymax= vert.ymin+fac*(vert.ymax-vert.ymin); - - if(vertymin > vertymax) vertymin= vertymax; - - BIF_ThemeColorShade(TH_SHADE1, dark); - glRecti(vert.xmin, vertymin, vert.xmax, vertymax); - - /* decoration black line */ - BIF_ThemeColorShade(TH_SHADE1, darker); - if(G.v2d->scroll & HOR_SCROLL) - sdrawline(vert.xmax, vert.ymin+SCROLLH, vert.xmax, vert.ymax); - else - sdrawline(vert.xmax, vert.ymin, vert.xmax, vert.ymax); - - /* the numbers: convert ipogrid_starty and -dy to scroll coordinates */ - fac= (ipogrid_starty- G.v2d->cur.ymin)/(G.v2d->cur.ymax-G.v2d->cur.ymin); - fac= vert.ymin+SCROLLH+fac*(vert.ymax-vert.ymin-SCROLLH); - - dfac= (ipogrid_dy)/(G.v2d->cur.ymax-G.v2d->cur.ymin); - dfac= dfac*(vert.ymax-vert.ymin-SCROLLH); - - if(curarea->spacetype==SPACE_OOPS); - else if(curarea->spacetype==SPACE_SEQ) { - BIF_ThemeColor(TH_TEXT); - val= ipogrid_starty; - fac+= 0.5*dfac; - while(fac < vert.ymax) { - scroll_prstr((float)(vert.xmax)-14.0, fac, val, 'v', disptype); - fac+= dfac; - val+= ipogrid_dy; - } - } - else if (curarea->spacetype==SPACE_NLA){ - } - else if (curarea->spacetype==SPACE_ACTION){ - /* No digits on vertical axis in action mode! */ - } - else { - BIF_ThemeColor(TH_TEXT); - val= ipogrid_starty; - while(fac < vert.ymax) { - scroll_prstr((float)(vert.xmax)-14.0, fac, val, 'v', disptype); - fac+= dfac; - val+= ipogrid_dy; - } - } - } -} - -static void draw_ipobuts(SpaceIpo *sipo) -{ - ScrArea *area= sipo->area; - View2D *v2d= &sipo->v2d; - Object *ob= OBACT; - uiBlock *block; - uiBut *but; - EditIpo *ei; - int a, y, sel, tot, ipobutx; - char naam[20]; - - if(area->winx< calc_ipobuttonswidth(area)) return; - - if(sipo->butofs) { - tot= 30+IPOBUTY*sipo->totipo; - if(tot<area->winy) sipo->butofs= 0; - } - - ipobutx = calc_ipobuttonswidth(area); - - BIF_ThemeColor(TH_SHADE2); - glRects(v2d->mask.xmax, 0, area->winx, area->winy); - - cpack(0x0); - sdrawline(v2d->mask.xmax, 0, v2d->mask.xmax, area->winy); - - if(sipo->totipo==0) return; - if(sipo->editipo==0) return; - - sprintf(naam, "ipowin %d", area->win); - block= uiNewBlock(&area->uiblocks, naam, UI_EMBOSSN, UI_HELV, area->win); - - ei= sipo->editipo; - y= area->winy-30+sipo->butofs; - - if(ob && sipo->blocktype==ID_KE) { - int icon; - if(ob->shapeflag & OB_SHAPE_LOCK) icon= ICON_PIN_HLT; else icon= ICON_PIN_DEHLT; - uiDefIconButBitS(block, TOG, OB_SHAPE_LOCK, B_SETKEY, icon, - v2d->mask.xmax+18,y,25,20, &ob->shapeflag, 0, 0, 0, 0, "Always show the current Shape for this Object"); - y-= IPOBUTY; - } - - for(a=0; a<sipo->totipo; a++, ei++, y-=IPOBUTY) { - // this button defines visiblity, bit zero of flag (IPO_VISIBLE) - but= uiDefButBitS(block, TOG, IPO_VISIBLE, a+1, ei->name, v2d->mask.xmax+18, y, ipobutx-15, IPOBUTY-1, &(ei->flag), 0, 0, 0, 0, ""); - // no hilite, its not visible, but most of all the winmatrix is not correct later on... - uiButSetFlag(but, UI_TEXT_LEFT|UI_NO_HILITE); - - // this fake button defines selection of curves - if(ei->icu) { - cpack(ei->col); - - glRects(v2d->mask.xmax+8, y+2, v2d->mask.xmax+15, y+IPOBUTY-2); - sel= ei->flag & (IPO_SELECT + IPO_EDIT); - - uiEmboss((float)(v2d->mask.xmax+8), (float)(y+2), (float)(v2d->mask.xmax+15), (float)(y+IPOBUTY-2), sel); - - if(ei->icu->driver) { - cpack(0x0); - fdrawbox((float)v2d->mask.xmax+11, (float)y+8, (float)v2d->mask.xmax+12.5, (float)y+9.5); - } - } - - if(ei->flag & IPO_ACTIVE) { - cpack(0x0); - fdrawbox(v2d->mask.xmax+7, y+1, v2d->mask.xmax+16, y+IPOBUTY-1); - } - } - uiDrawBlock(block); -} - -static void draw_ipovertices(int sel) -{ - EditIpo *ei; - BezTriple *bezt; - float v1[2]; - int val, ok, nr, a, b; - - if(G.f & G_PICKSEL) return; - - glPointSize(BIF_GetThemeValuef(TH_VERTEX_SIZE)); - - ei= G.sipo->editipo; - for(nr=0; nr<G.sipo->totipo; nr++, ei++) { - if ISPOIN(ei, flag & IPO_VISIBLE, icu) { - - if(G.sipo->showkey) { - if(sel) BIF_ThemeColor(TH_TEXT_HI); - else BIF_ThemeColor(TH_TEXT); - } else if(ei->flag & IPO_EDIT) { - if(sel) BIF_ThemeColor(TH_VERTEX_SELECT); - else BIF_ThemeColor(TH_VERTEX); - } else { - if(sel) BIF_ThemeColor(TH_TEXT_HI); - else BIF_ThemeColor(TH_TEXT); - - val= (ei->icu->flag & IPO_SELECT)!=0; - if(sel != val) continue; - } - - /* We can't change the color in the middle of - * GL_POINTS because then Blender will segfault - * on TNT2 / Linux with NVidia's drivers - * (at least up to ver. 4349) */ - - a= ei->icu->totvert; - bezt= ei->icu->bezt; - bglBegin(GL_POINTS); - - while(a--) { - - /* IPO_DISPBITS is used for displaying layer ipo types as well as modes */ - if(ei->disptype==IPO_DISPBITS) { - /*if (G.v2d->cur.xmin < bezt->vec[1][0] < G.v2d->cur.xmax) {*/ - ok= 0; - - if(ei->flag & IPO_EDIT) { - if( (bezt->f2 & SELECT) == sel ) ok= 1; - } - else ok= 1; - - if(ok) { - val= bezt->vec[1][1]; - b= 0; - v1[0]= bezt->vec[1][0]; - - while(b<31) { - if(val & (1<<b)) { - v1[1]= b+1; - bglVertex3fv(v1); - } - b++; - } - } - /*}*/ - } else { /* normal non bit curves */ - if(ei->flag & IPO_EDIT) { - if(ei->icu->ipo==IPO_BEZ) { - /* Draw the editmode hendels for a bezier curve */ - if( (bezt->f1 & SELECT) == sel)/* && G.v2d->cur.xmin < bezt->vec[0][0] < G.v2d->cur.xmax)*/ - bglVertex3fv(bezt->vec[0]); - - if( (bezt->f3 & SELECT) == sel)/* && G.v2d->cur.xmin < bezt->vec[2][0] < G.v2d->cur.xmax)*/ - bglVertex3fv(bezt->vec[2]); - - } - - if( (bezt->f2 & SELECT) == sel) /* && G.v2d->cur.xmin < bezt->vec[1][0] < G.v2d->cur.xmax)*/ - bglVertex3fv(bezt->vec[1]); - - } - else { - /* draw only if in bounds */ - /*if (G.v2d->cur.xmin < bezt->vec[1][0] < G.v2d->cur.xmax)*/ - bglVertex3fv(bezt->vec[1]); - - } - } - - bezt++; - } - bglEnd(); - } - } - - glPointSize(1.0); -} - -static void draw_ipohandles(int sel) -{ - extern unsigned int nurbcol[]; - EditIpo *ei; - BezTriple *bezt; - float *fp; - unsigned int *col; - int a, b; - - if(sel) col= nurbcol+4; - else col= nurbcol; - - ei= G.sipo->editipo; - for(a=0; a<G.sipo->totipo; a++, ei++) { - if ISPOIN4(ei, flag & IPO_VISIBLE, flag & IPO_EDIT, icu, disptype!=IPO_DISPBITS) { - if(ei->icu->ipo==IPO_BEZ) { - bezt= ei->icu->bezt; - b= ei->icu->totvert; - while(b--) { - - if( (bezt->f2 & SELECT)==sel) { - fp= bezt->vec[0]; - cpack(col[bezt->h1]); - - glBegin(GL_LINE_STRIP); - glVertex2fv(fp); glVertex2fv(fp+3); - glEnd(); - cpack(col[bezt->h2]); - - glBegin(GL_LINE_STRIP); - glVertex2fv(fp+3); glVertex2fv(fp+6); - glEnd(); - } - else if( (bezt->f1 & 1)==sel) { - fp= bezt->vec[0]; - cpack(col[bezt->h1]); - - glBegin(GL_LINE_STRIP); - glVertex2fv(fp); glVertex2fv(fp+3); - glEnd(); - } - else if( (bezt->f3 & SELECT)==sel) { - fp= bezt->vec[1]; - cpack(col[bezt->h2]); - - glBegin(GL_LINE_STRIP); - glVertex2fv(fp); glVertex2fv(fp+3); - glEnd(); - } - - bezt++; - } - } - } - } -} - -int pickselcode; - -static void init_pickselcode(void) -{ - pickselcode= 1; -} - -static void draw_ipocurves(int sel) -{ - EditIpo *ei; - IpoCurve *icu; - BezTriple *bezt, *prevbezt; - float *fp, fac, data[120], v1[2], v2[2], v3[2], v4[2]; - float cycdx=0, cycdy=0, cycxofs, cycyofs; - int a, b, resol, cycount, val, nr; - - - ei= G.sipo->editipo; - for(nr=0; nr<G.sipo->totipo; nr++, ei++) { - if ISPOIN3(ei, flag & IPO_VISIBLE, icu, icu->bezt) { - - if(G.f & G_PICKSEL) { - glLoadName(pickselcode++); - val= 1; - } - else { - val= (ei->flag & (IPO_SELECT+IPO_EDIT))!=0; - val= (val==sel); - } - - if(val) { - - cycyofs= cycxofs= 0.0; - cycount= 1; - - icu= ei->icu; - - /* curve */ - if(G.sipo->showkey) BIF_ThemeColor(TH_TEXT); - else cpack(ei->col); - - /* cyclic */ - if(icu->extrap & IPO_CYCL) { - cycdx= (icu->bezt+icu->totvert-1)->vec[1][0] - icu->bezt->vec[1][0]; - cycdy= (icu->bezt+icu->totvert-1)->vec[1][1] - icu->bezt->vec[1][1]; - if(cycdx>0.01) { - - while(icu->bezt->vec[1][0]+cycxofs > G.v2d->cur.xmin) { - cycxofs-= cycdx; - if(icu->extrap & IPO_DIR) cycyofs-= cycdy; - cycount++; - } - bezt= icu->bezt+(icu->totvert-1); - fac= 0.0; - while(bezt->vec[1][0]+fac < G.v2d->cur.xmax) { - cycount++; - fac+= cycdx; - } - } - } - - while(cycount--) { - - if(ei->disptype==IPO_DISPBITS) { - - /* lines */ - cpack(ei->col); - bezt= icu->bezt; - a= icu->totvert; - - while(a--) { - val= bezt->vec[1][1]; - b= 0; - - while(b<31) { - if(val & (1<<b)) { - v1[1]= b+1; - - glBegin(GL_LINE_STRIP); - if(icu->extrap & IPO_CYCL) ; - else if(a==icu->totvert-1) { - v1[0]= G.v2d->cur.xmin+cycxofs; - glVertex2fv(v1); - } - v1[0]= bezt->vec[1][0]+cycxofs; - glVertex2fv(v1); - - if(a) v1[0]= (bezt+1)->vec[1][0]+cycxofs; - else if(icu->extrap & IPO_CYCL) ; - else v1[0]= G.v2d->cur.xmax+cycxofs; - - glVertex2fv(v1); - glEnd(); - } - b++; - } - bezt++; - } - - } - else { - - b= icu->totvert-1; - prevbezt= icu->bezt; - bezt= prevbezt+1; - - glBegin(GL_LINE_STRIP); - - /* extrapolate to left? */ - if( (icu->extrap & IPO_CYCL)==0) { - if(prevbezt->vec[1][0] > G.v2d->cur.xmin) { - v1[0]= G.v2d->cur.xmin; - if(icu->extrap==IPO_HORIZ || icu->ipo==IPO_CONST) v1[1]= prevbezt->vec[1][1]; - else { - fac= (prevbezt->vec[0][0]-prevbezt->vec[1][0])/(prevbezt->vec[1][0]-v1[0]); - if(fac!=0.0) fac= 1.0/fac; - v1[1]= prevbezt->vec[1][1]-fac*(prevbezt->vec[0][1]-prevbezt->vec[1][1]); - } - glVertex2fv(v1); - } - } - - if(b==0) { - v1[0]= prevbezt->vec[1][0]+cycxofs; - v1[1]= prevbezt->vec[1][1]+cycyofs; - glVertex2fv(v1); - } - - while(b--) { - if(icu->ipo==IPO_CONST) { - v1[0]= prevbezt->vec[1][0]+cycxofs; - v1[1]= prevbezt->vec[1][1]+cycyofs; - glVertex2fv(v1); - v1[0]= bezt->vec[1][0]+cycxofs; - v1[1]= prevbezt->vec[1][1]+cycyofs; - glVertex2fv(v1); - } - else if(icu->ipo==IPO_LIN) { - v1[0]= prevbezt->vec[1][0]+cycxofs; - v1[1]= prevbezt->vec[1][1]+cycyofs; - glVertex2fv(v1); - } - else { - /* resol not depending on horizontal resolution anymore, drivers for example... */ - if(icu->driver) resol= 32; - else resol= 3.0*sqrt(bezt->vec[1][0] - prevbezt->vec[1][0]); - - if(resol<2) { - v1[0]= prevbezt->vec[1][0]+cycxofs; - v1[1]= prevbezt->vec[1][1]+cycyofs; - glVertex2fv(v1); - } - else { - if(resol>32) resol= 32; - - v1[0]= prevbezt->vec[1][0]+cycxofs; - v1[1]= prevbezt->vec[1][1]+cycyofs; - v2[0]= prevbezt->vec[2][0]+cycxofs; - v2[1]= prevbezt->vec[2][1]+cycyofs; - - v3[0]= bezt->vec[0][0]+cycxofs; - v3[1]= bezt->vec[0][1]+cycyofs; - v4[0]= bezt->vec[1][0]+cycxofs; - v4[1]= bezt->vec[1][1]+cycyofs; - - correct_bezpart(v1, v2, v3, v4); - - forward_diff_bezier(v1[0], v2[0], v3[0], v4[0], data, resol, 3); - forward_diff_bezier(v1[1], v2[1], v3[1], v4[1], data+1, resol, 3); - - fp= data; - while(resol--) { - glVertex2fv(fp); - fp+= 3; - } - } - } - prevbezt= bezt; - bezt++; - - /* last point? */ - if(b==0) { - v1[0]= prevbezt->vec[1][0]+cycxofs; - v1[1]= prevbezt->vec[1][1]+cycyofs; - glVertex2fv(v1); - } - } - - /* extrapolate to right? */ - if( (icu->extrap & IPO_CYCL)==0) { - if(prevbezt->vec[1][0] < G.v2d->cur.xmax) { - v1[0]= G.v2d->cur.xmax; - if(icu->extrap==IPO_HORIZ || icu->ipo==IPO_CONST) v1[1]= prevbezt->vec[1][1]; - else { - fac= (prevbezt->vec[2][0]-prevbezt->vec[1][0])/(prevbezt->vec[1][0]-v1[0]); - if(fac!=0.0) fac= 1.0/fac; - v1[1]= prevbezt->vec[1][1]-fac*(prevbezt->vec[2][1]-prevbezt->vec[1][1]); - } - glVertex2fv(v1); - } - } - - glEnd(); - - } - cycxofs+= cycdx; - if(icu->extrap & IPO_DIR) cycyofs+= cycdy; - } - - /* line that indicates the end of a speed curve */ - if(G.sipo->blocktype==ID_CU && icu->adrcode==CU_SPEED) { - b= icu->totvert-1; - if(b) { - glColor3ub(0, 0, 0); - bezt= icu->bezt+b; - glBegin(GL_LINES); - glVertex2f(bezt->vec[1][0], 0.0); - glVertex2f(bezt->vec[1][0], bezt->vec[1][1]); - glEnd(); - } - } - } - } - } -} - -static int get_ipo_cfra_from_cfra(SpaceIpo * sipo, int cfra) -{ - if (sipo->blocktype==ID_SEQ) { - Sequence * seq = (Sequence*) sipo->from; - - if (!seq) { - return cfra; - } - - if ((seq->flag & SEQ_IPO_FRAME_LOCKED) != 0) { - return cfra; - } else { - float ctime= frame_to_float(cfra - seq->startdisp); - float div= (seq->enddisp - seq->startdisp)/100.0f; - - if(div == 0.0) { - return 0; - } else { - return ctime / div; - } - } - } else { - return cfra; - } -} - -static void draw_cfra(SpaceIpo *sipo) -{ - View2D *v2d= &sipo->v2d; - Object *ob; - float vec[2]; - - vec[0] = get_ipo_cfra_from_cfra(sipo, G.scene->r.cfra); - vec[0]*= G.scene->r.framelen; - - vec[1]= v2d->cur.ymin; - BIF_ThemeColor(TH_CFRAME); - glLineWidth(2.0); - - glBegin(GL_LINE_STRIP); - glVertex2fv(vec); - vec[1]= v2d->cur.ymax; - glVertex2fv(vec); - glEnd(); - - if(sipo->blocktype==ID_OB) { - ob= (G.scene->basact) ? (G.scene->basact->object) : 0; - if (ob && (ob->sf!=0.0) && (ob->ipoflag & OB_OFFS_OB) ) { - vec[0]-= ob->sf; - - BIF_ThemeColorShade(TH_HILITE, -30); - - glBegin(GL_LINE_STRIP); - glVertex2fv(vec); - vec[1]= G.v2d->cur.ymin; - glVertex2fv(vec); - glEnd(); - } - } - - glLineWidth(1.0); -} - -static void draw_ipokey(SpaceIpo *sipo) -{ - IpoKey *ik; - - glBegin(GL_LINES); - for (ik= sipo->ipokey.first; ik; ik= ik->next) { - if(ik->flag & 1) glColor3ub(0xFF, 0xFF, 0x99); - else glColor3ub(0xAA, 0xAA, 0x55); - - glVertex2f(ik->val, G.v2d->cur.ymin); - glVertex2f(ik->val, G.v2d->cur.ymax); - } - glEnd(); -} - -static void draw_key(SpaceIpo *sipo, int visible) -{ - View2D *v2d= &sipo->v2d; - Key *key; - KeyBlock *kb, *act=NULL; - Object *ob= OBACT; - unsigned int col; - int index; - - key= ob_get_key((Object *)sipo->from); - if(key==NULL) - return; - - if(key->type== KEY_RELATIVE) if(visible==0) return; - - for(index=1, kb= key->block.first; kb; kb= kb->next, index++) { - if(kb->type==KEY_LINEAR) setlinestyle(2); - else if(kb->type==KEY_BSPLINE) setlinestyle(4); - else setlinestyle(0); - - if(kb==key->refkey) col= 0x22FFFF; - else col= 0xFFFF00; - - if(ob->shapenr!=index) col-= 0x225500; - else act= kb; - - cpack(col); - - glBegin(GL_LINE_STRIP); - glVertex2f(v2d->cur.xmin, kb->pos); - glVertex2f(v2d->cur.xmax, kb->pos); - glEnd(); - - } - - if(act) { - if(act->type==KEY_LINEAR) setlinestyle(2); - else if(act->type==KEY_BSPLINE) setlinestyle(4); - else setlinestyle(0); - - if(act==key->refkey) cpack(0x22FFFF); - else cpack(0xFFFF00); - - glBegin(GL_LINE_STRIP); - glVertex2f(v2d->cur.xmin, act->pos); - glVertex2f(v2d->cur.xmax, act->pos); - glEnd(); - } - - setlinestyle(0); -} - -/* ************************** buttons *********************** */ - - -#define B_SETSPEED 3401 -#define B_MUL_IPO 3402 -#define B_TRANS_IPO 3403 -#define B_IPO_NONE 3404 -#define B_IPO_DRIVER 3405 -#define B_IPO_REDR 3406 -#define B_IPO_DEPCHANGE 3407 -#define B_IPO_DRIVERTYPE 3408 - -static float hspeed= 0; - -static void boundbox_ipo_curves(SpaceIpo *si) -{ - EditIpo *ei; - Key *key; - KeyBlock *kb; - int a, first= 1; - - ei= si->editipo; - if(ei==0) - return; - - for(a=0; a<si->totipo; a++, ei++) { - - if(ei->icu) { - if(ei->flag & IPO_VISIBLE) { - - boundbox_ipocurve(ei->icu, 0); - if(first) { - si->v2d.tot= ei->icu->totrct; - first= 0; - } - else BLI_union_rctf(&(si->v2d.tot), &(ei->icu->totrct)); - } - } - } - /* keylines? */ - if(si->blocktype==ID_KE) { - key= ob_get_key((Object *)si->from); - if(key && key->block.first) { - kb= key->block.first; - if(kb->pos < si->v2d.tot.ymin) si->v2d.tot.ymin= kb->pos; - kb= key->block.last; - if(kb->pos > si->v2d.tot.ymax) si->v2d.tot.ymax= kb->pos; - } - } - si->tot= si->v2d.tot; -} - - -/* is used for both read and write... */ -static void ipo_editvertex_buts(uiBlock *block, SpaceIpo *si, float min, float max) -{ - Object *ob= OBACT; - EditIpo *ei; - BezTriple *bezt; - float median[3]; - int a, b, tot, iskey=0; - - median[0]= median[1]= median[2]= 0.0; - tot= 0; - - 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) || G.sipo->showkey) { - - if(ei->icu->bezt) { - bezt= ei->icu->bezt; - b= ei->icu->totvert; - while(b--) { - // all three selected - if(bezt->f2 & SELECT) { - VecAddf(median, median, bezt->vec[1]); - tot++; - } - else { - if(bezt->f1 & SELECT) { - VecAddf(median, median, bezt->vec[0]); - tot++; - } - if(bezt->f3 & SELECT) { - VecAddf(median, median, bezt->vec[2]); - tot++; - } - } - bezt++; - } - - } - } - } - } - /* check for keys */ - if(tot==0) { - if(G.sipo->blocktype==ID_KE) { - Key *key= ob_get_key((Object *)G.sipo->from); - KeyBlock *kb; - - if(key==NULL || ob->shapenr==0) return; - iskey= 1; - - kb= BLI_findlink(&key->block, ob->shapenr-1); - median[1]+= kb->pos; - tot++; - } - } - if(tot==0) return; - - median[0] /= (float)tot; - median[1] /= (float)tot; - median[2] /= (float)tot; - - if(block) { // buttons - - VECCOPY(si->median, median); - - uiBlockBeginAlign(block); - if(tot==1) { - if(iskey) - uiDefButF(block, NUM, B_TRANS_IPO, "Key Y:", 10, 80, 300, 19, &(si->median[1]), min, max, 10, 0, ""); - else { - uiDefButF(block, NUM, B_TRANS_IPO, "Vertex X:", 10, 100, 150, 19, &(si->median[0]), min, max, 100, 0, ""); - uiDefButF(block, NUM, B_TRANS_IPO, "Vertex Y:", 160, 100, 150, 19, &(si->median[1]), min, max, 100, 0, ""); - } - } - else { - if(iskey) - uiDefButF(block, NUM, B_TRANS_IPO, "Median Key Y:", 10, 80, 300, 19, &(si->median[1]), min, max, 10, 0, ""); - else { - uiDefButF(block, NUM, B_TRANS_IPO, "Median X:", 10, 100, 150, 19, &(si->median[0]), min, max, 100, 0, ""); - uiDefButF(block, NUM, B_TRANS_IPO, "Median Y:", 160, 100, 150, 19, &(si->median[1]), min, max, 100, 0, ""); - } - } - } - else if(iskey) { // apply - VecSubf(median, si->median, median); - - if(G.sipo->blocktype==ID_KE) { - Key *key= ob_get_key((Object *)G.sipo->from); - KeyBlock *kb; - - if(key==NULL || ob->shapenr==0) return; - - kb= BLI_findlink(&key->block, ob->shapenr-1); - kb->pos+= median[1]; - tot++; - - sort_keys(key); - } - } - else { - - VecSubf(median, si->median, median); - - 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) || G.sipo->showkey) { - - if(ei->icu->bezt) { - bezt= ei->icu->bezt; - b= ei->icu->totvert; - while(b--) { - // all three selected - if(bezt->f2 & SELECT) { - VecAddf(bezt->vec[0], bezt->vec[0], median); - VecAddf(bezt->vec[1], bezt->vec[1], median); - VecAddf(bezt->vec[2], bezt->vec[2], median); - } - else { - if(bezt->f1 & SELECT) { - VecAddf(bezt->vec[0], bezt->vec[0], median); - } - if(bezt->f3 & SELECT) { - VecAddf(bezt->vec[2], bezt->vec[2], median); - } - } - bezt++; - } - - } - } - } - } - } -} - -void do_ipobuts(unsigned short event) -{ - Object *ob= OBACT; - EditIpo *ei; - - if(G.sipo->from==NULL) return; - - switch(event) { - case B_IPO_REDR: - ei= get_active_editipo(); - if(ei) { - if(ei->icu->driver) { - if (ei->icu->driver->type == IPO_DRIVER_TYPE_PYTHON) { - /* first del pydriver's global dict, just in case - * an available pydrivers.py module needs to be reloaded */ - BPY_pydriver_update(); - /* eval user's expression once for validity; update DAG */ - BPY_pydriver_eval(ei->icu->driver); - DAG_scene_sort(G.scene); - } - else if(G.sipo->blocktype==ID_KE || G.sipo->blocktype==ID_AC) - DAG_object_flush_update(G.scene, ob, OB_RECALC_DATA); - else - DAG_object_flush_update(G.scene, ob, OB_RECALC_OB); - } - } - allqueue(REDRAWIPO, 0); - allqueue(REDRAWVIEW3D, 0); - break; - case B_SETSPEED: - set_speed_editipo(hspeed); - break; - case B_MUL_IPO: - scale_editipo(); - allqueue(REDRAWIPO, 0); - break; - case B_TRANS_IPO: - ipo_editvertex_buts(NULL, G.sipo, 0.0, 0.0); - editipo_changed(G.sipo, 1); - allqueue(REDRAWIPO, 0); - break; - case B_SETKEY: - ob->shapeflag &= ~OB_SHAPE_TEMPLOCK; - DAG_object_flush_update(G.scene, ob, OB_RECALC_DATA); - allqueue(REDRAWVIEW3D, 0); - allqueue(REDRAWIPO, 0); - allqueue(REDRAWBUTSEDIT, 0); - break; - case B_IPO_DRIVER: - ei= get_active_editipo(); - if(ei) { - if(ei->icu==NULL) { - ei->icu= verify_ipocurve(G.sipo->from, G.sipo->blocktype, G.sipo->actname, G.sipo->constname, G.sipo->bonename, ei->adrcode); - if (!ei->icu) { - error("Could not add a driver to this curve, may be linked data!"); - break; - } - ei->flag |= IPO_SELECT; - ei->icu->flag= ei->flag; - } - if(ei->icu->driver) { - MEM_freeN(ei->icu->driver); - ei->icu->driver= NULL; - if(ei->icu->bezt==NULL) { - BLI_remlink( &(G.sipo->ipo->curve), ei->icu); - free_ipo_curve(ei->icu); - ei->icu= NULL; - } - } - else { - ei->icu->driver= MEM_callocN(sizeof(IpoDriver), "ipo driver"); - ei->icu->driver->blocktype= ID_OB; - ei->icu->driver->adrcode= OB_LOC_X; - } - - allqueue(REDRAWVIEW3D, 0); - allqueue(REDRAWIPO, 0); - allqueue(REDRAWBUTSEDIT, 0); - DAG_scene_sort(G.scene); - - BIF_undo_push("Add/Remove Ipo driver"); - } - break; - case B_IPO_DRIVERTYPE: - ei= get_active_editipo(); - if(ei) { - if(ei->icu->driver) { - IpoDriver *driver= ei->icu->driver; - - if(driver->type == IPO_DRIVER_TYPE_PYTHON) { - /* pydriver expression shouldn't reference own ob, - * so we need to store ob ptr to check against it */ - driver->ob= ob; - } - else { - driver->ob= NULL; - driver->blocktype= ID_OB; - driver->adrcode= OB_LOC_X; - driver->flag &= ~IPO_DRIVER_FLAG_INVALID; - } - } - allqueue(REDRAWVIEW3D, 0); - allqueue(REDRAWIPO, 0); - allqueue(REDRAWBUTSEDIT, 0); - DAG_scene_sort(G.scene); - - BIF_undo_push("Change Ipo driver type"); - } - break; - case B_IPO_DEPCHANGE: - ei= get_active_editipo(); - if(ei) { - if(ei->icu->driver) { - IpoDriver *driver= ei->icu->driver; - - if(driver->type == IPO_DRIVER_TYPE_PYTHON) { - } - else { - if(driver->ob) { - if(ob==driver->ob && G.sipo->bonename[0]==0) { - error("Cannot assign a Driver to own Object"); - driver->ob= NULL; - } - else { - /* check if type is still OK */ - if(driver->ob->type==OB_ARMATURE && driver->blocktype==ID_AR); - else driver->blocktype= ID_OB; - } - } - } - DAG_scene_sort(G.scene); - - if(G.sipo->blocktype==ID_KE || G.sipo->blocktype==ID_AC) - DAG_object_flush_update(G.scene, ob, OB_RECALC_DATA); - else - DAG_object_flush_update(G.scene, ob, OB_RECALC_OB); - } - } - allqueue(REDRAWVIEW3D, 0); - allqueue(REDRAWIPO, 0); - allqueue(REDRAWBUTSEDIT, 0); - break; - } -} - -static char *ipodriver_modeselect_pup(Object *ob) -{ - static char string[265]; - char tmpstr[64]; - char formatstring[64]; - - strcpy(string, "Driver type: %t"); - - strcpy(formatstring, "|%s %%x%d %%i%d"); - - if(ob) { - sprintf(tmpstr,formatstring,"Object",ID_OB, ICON_OBJECT); - strcat(string,tmpstr); - } - if(ob && ob->type==OB_ARMATURE) { - sprintf(tmpstr,formatstring,"Pose",ID_AR, ICON_POSE_DEHLT); - strcat(string,tmpstr); - } - - return (string); -} - -static char *ipodriver_channelselect_pup(int is_armature) -{ - static char string[1024]; - char *tmp; - - strcpy(string, "Driver channel: %t"); - tmp= string+strlen(string); - - tmp+= sprintf(tmp, "|Loc X %%x%d", OB_LOC_X); - tmp+= sprintf(tmp, "|Loc Y %%x%d", OB_LOC_Y); - tmp+= sprintf(tmp, "|Loc Z %%x%d", OB_LOC_Z); - tmp+= sprintf(tmp, "|Rot X %%x%d", OB_ROT_X); - tmp+= sprintf(tmp, "|Rot Y %%x%d", OB_ROT_Y); - tmp+= sprintf(tmp, "|Rot Z %%x%d", OB_ROT_Z); - tmp+= sprintf(tmp, "|Scale X %%x%d", OB_SIZE_X); - tmp+= sprintf(tmp, "|Scale Y %%x%d", OB_SIZE_Y); - tmp+= sprintf(tmp, "|Scale Z %%x%d", OB_SIZE_Z); - if(is_armature) - tmp+= sprintf(tmp, "|Rotation Difference %%x%d", OB_ROT_DIFF); - - return (string); -} - -static void ipo_panel_properties(short cntrl) // IPO_HANDLER_PROPERTIES -{ - extern int totipo_curve; // editipo.c - uiBlock *block; - EditIpo *ei; - char name[48]; - - block= uiNewBlock(&curarea->uiblocks, "ipo_panel_properties", UI_EMBOSS, UI_HELV, curarea->win); - uiPanelControl(UI_PNL_SOLID | UI_PNL_CLOSE | cntrl); - uiSetPanelHandler(IPO_HANDLER_PROPERTIES); // for close and esc - if(uiNewPanel(curarea, block, "Transform Properties", "Ipo", 10, 230, 318, 204)==0) return; - - /* this is new panel height, newpanel doesnt force new size on existing panels */ - uiNewPanelHeight(block, 204); - - /* driver buttons first */ - ei= get_active_editipo(); - if(ei) { - - sprintf(name, "Driven Channel: %s", ei->name); - uiDefBut(block, LABEL, 0, name, 10, 265, 200, 19, NULL, 1.0, 0.0, 0, 0, ""); - - if(ei->icu && ei->icu->driver) { - IpoDriver *driver= ei->icu->driver; - - uiDefBut(block, BUT, B_IPO_DRIVER, "Remove", 210,265,100,20, NULL, 0.0f, 0.0f, 0, 0, "Remove Driver for this Ipo Channel"); - - uiBlockBeginAlign(block); - uiDefIconButS(block, TOG, B_IPO_DRIVERTYPE, ICON_PYTHON, 10,240,25,20, &driver->type, (float)IPO_DRIVER_TYPE_NORMAL, (float)IPO_DRIVER_TYPE_PYTHON, 0, 0, "Use a one-line Python Expression as Driver"); - - if(driver->type == IPO_DRIVER_TYPE_PYTHON) { - uiDefBut(block, TEX, B_IPO_REDR, "", 35,240,275,20, driver->name, 0, 127, 0, 0, "Python Expression"); - uiBlockEndAlign(block); - if(driver->flag & IPO_DRIVER_FLAG_INVALID) { - uiDefBut(block, LABEL, 0, "Error: invalid Python expression", - 5,215,230,19, NULL, 0, 0, 0, 0, ""); - } - } - else { - uiDefIDPoinBut(block, test_obpoin_but, ID_OB, B_IPO_DEPCHANGE, "OB:", 35, 240, 125, 20, &(driver->ob), "Driver Object"); - if(driver->ob) { - int icon=ICON_OBJECT; - - if(driver->ob->type==OB_ARMATURE && driver->blocktype==ID_AR) { - icon = ICON_POSE_DEHLT; - uiDefBut(block, TEX, B_IPO_REDR, "BO:", 10,220,150,20, driver->name, 0, 31, 0, 0, "Bone name"); - - if(driver->adrcode==OB_ROT_DIFF) - uiDefBut(block, TEX, B_IPO_REDR, "BO:", 10,200,150,20, driver->name+DRIVER_NAME_OFFS, 0, 31, 0, 0, "Bone name for angular reference"); - - } - else driver->blocktype= ID_OB; /* safety when switching object button */ - - uiBlockBeginAlign(block); - uiDefIconTextButS(block, MENU, B_IPO_DEPCHANGE, icon, - ipodriver_modeselect_pup(driver->ob), 165,240,145,20, &(driver->blocktype), 0, 0, 0, 0, "Driver type"); - - uiDefButS(block, MENU, B_IPO_REDR, - ipodriver_channelselect_pup(driver->ob->type==OB_ARMATURE && driver->blocktype==ID_AR), - 165,220,145,20, &(driver->adrcode), 0, 0, 0, 0, "Driver channel"); - } - uiBlockEndAlign(block); - } - } - else { - uiDefBut(block, BUT, B_IPO_DRIVER, "Add Driver", 210,265,100,19, NULL, 0.0f, 0.0f, 0, 0, "Create a Driver for this Ipo Channel"); - } - } - else - uiDefBut(block, LABEL, 0, " ", 10, 265, 150, 19, NULL, 1.0, 0.0, 0, 0, ""); - - boundbox_ipo_curves(G.sipo); // should not be needed... transform/draw calls should update - - /* note ranges for buttons below are idiot... we need 2 ranges, one for sliding scale, one for real clip */ - if(G.sipo->ipo && G.sipo->ipo->curve.first && totipo_curve) { - extern int totipo_vertsel; // editipo.c - uiDefBut(block, LABEL, 0, "Visible curves", 160, 200, 150, 19, NULL, 1.0, 0.0, 0, 0, ""); - - uiBlockBeginAlign(block); - uiDefButF(block, NUM, B_MUL_IPO, "Xmin:", 10, 180, 150, 19, &G.sipo->tot.xmin, G.sipo->tot.xmin-1000.0, MAXFRAMEF, 100, 0, ""); - uiDefButF(block, NUM, B_MUL_IPO, "Xmax:", 160, 180, 150, 19, &G.sipo->tot.xmax, G.sipo->tot.ymin-1000.0, MAXFRAMEF, 100, 0, ""); - - uiDefButF(block, NUM, B_MUL_IPO, "Ymin:", 10, 160, 150, 19, &G.sipo->tot.ymin, G.sipo->tot.ymin-1000.0, 5000.0, 100, 0, ""); - uiDefButF(block, NUM, B_MUL_IPO, "Ymax:", 160, 160, 150, 19, &G.sipo->tot.ymax, G.sipo->tot.ymin-1000.0, 5000.0, 100, 0, ""); - - /* SPEED BUTTON */ - if(totipo_vertsel) { - uiBlockBeginAlign(block); - uiDefButF(block, NUM, B_IPO_NONE, "Speed:", 10,130,150,19, &hspeed, 0.0, 180.0, 1, 0, ""); - uiDefBut(block, BUT, B_SETSPEED,"SET", 160,130,50,19, 0, 0, 0, 0, 0, ""); - } - } - - /* this one also does keypositions */ - if(G.sipo->ipo) ipo_editvertex_buts(block, G.sipo, -10000, MAXFRAMEF); -} - -static void ipo_blockhandlers(ScrArea *sa) -{ - SpaceIpo *sipo= sa->spacedata.first; - short a; - - /* warning; blocks need to be freed each time, handlers dont remove (for ipo moved to drawipospace) */ - - for(a=0; a<SPACE_MAXHANDLER; a+=2) { - switch(sipo->blockhandler[a]) { - - case IPO_HANDLER_PROPERTIES: - ipo_panel_properties(sipo->blockhandler[a+1]); - break; - - } - /* clear action value for event */ - sipo->blockhandler[a+1]= 0; - } - uiDrawBlocksPanels(sa, 0); - -} - - -void drawipospace(ScrArea *sa, void *spacedata) -{ - SpaceIpo *sipo= sa->spacedata.first; - View2D *v2d= &sipo->v2d; - EditIpo *ei; - float col[3]; - int ofsx, ofsy, a, disptype; - - bwin_clear_viewmat(sa->win); /* clear buttons view */ - glLoadIdentity(); - - uiFreeBlocksWin(&sa->uiblocks, sa->win); /* for panel handler to work */ - - test_editipo(0); /* test if current editipo is correct, make_editipo sets v2d->cur, call here because of calc_ipobuttonswidth() */ - - v2d->hor.xmax+=calc_ipobuttonswidth(sa); - calc_scrollrcts(sa, G.v2d, sa->winx, sa->winy); - - BIF_GetThemeColor3fv(TH_BACK, col); - glClearColor(col[0], col[1], col[2], 0.0); - - if (sipo->pin) - glClearColor(col[0]+0.05,col[1],col[2], 0.0); // litepink - else - glClearColor(col[0],col[1],col[2], 0.0); - - glClear(GL_COLOR_BUFFER_BIT); - - if(sa->winx>SCROLLB+10 && sa->winy>SCROLLH+10) { - if(v2d->scroll) { - ofsx= sa->winrct.xmin; // ivm mywin - ofsy= sa->winrct.ymin; - glViewport(ofsx+v2d->mask.xmin, ofsy+v2d->mask.ymin, ( ofsx+v2d->mask.xmax-1)-(ofsx+v2d->mask.xmin)+1, ( ofsy+v2d->mask.ymax-1)-( ofsy+v2d->mask.ymin)+1); - glScissor(ofsx+v2d->mask.xmin, ofsy+v2d->mask.ymin, ( ofsx+v2d->mask.xmax-1)-(ofsx+v2d->mask.xmin)+1, ( ofsy+v2d->mask.ymax-1)-( ofsy+v2d->mask.ymin)+1); - } - } - - myortho2(v2d->cur.xmin, v2d->cur.xmax, v2d->cur.ymin, v2d->cur.ymax); - - if(sipo->editipo) { - - /* correct scale for degrees? */ - disptype= -1; - ei= sipo->editipo; - for(a=0; a<sipo->totipo; a++, ei++) { - if(ei->flag & IPO_VISIBLE) { - if(disptype== -1) disptype= ei->disptype; - else if(disptype!=ei->disptype) disptype= 0; - } - } - - calc_ipogrid(); - draw_ipogrid(); - - draw_cfra(sipo); - - /* ipokeys */ - if(sipo->showkey) { - if(sipo->ipokey.first==0) make_ipokey(); - else update_ipokey_val(); - draw_ipokey(sipo); - } - - if(sipo->blocktype==ID_KE) { - ei= sipo->editipo; - draw_key(sipo, ei->flag & IPO_VISIBLE); - } - - /* map ipo-points for drawing if scaled ipo */ - if (NLA_IPO_SCALED) - actstrip_map_ipo_keys(OBACT, sipo->ipo, 0, 0); - - /* draw deselect */ - draw_ipocurves(0); - draw_ipohandles(0); - draw_ipovertices(0); - - /* draw select */ - draw_ipocurves(1); - draw_ipohandles(1); - draw_ipovertices(1); - - /* undo mapping of ipo-points for drawing if scaled ipo */ - if (NLA_IPO_SCALED) - actstrip_map_ipo_keys(OBACT, sipo->ipo, 1, 0); - - /* Draw 'curtains' for preview */ - draw_anim_preview_timespace(); - - /* draw markers */ - draw_markers_timespace(0); - - /* restore viewport */ - mywinset(sa->win); - - if(sa->winx>SCROLLB+10 && sa->winy>SCROLLH+10) { - - /* ortho at pixel level sa */ - myortho2(-0.375, sa->winx-0.375, -0.375, sa->winy-0.375); - - if(v2d->scroll) { - drawscroll(disptype); - draw_solution(sipo); - } - - draw_ipobuts(sipo); - } - } - else { - calc_ipogrid(); - draw_ipogrid(); - } - - myortho2(-0.375, sa->winx-0.375, -0.375, sa->winy-0.375); - draw_area_emboss(sa); - - /* it is important to end a view in a transform compatible with buttons */ - bwin_scalematrix(sa->win, sipo->blockscale, sipo->blockscale, sipo->blockscale); - /* only draw panels when relevant */ - if(sipo->editipo) ipo_blockhandlers(sa); - - sa->win_swap= WIN_BACK_OK; -} - -void scroll_ipobuts() -{ - int tot; - short yo, mval[2]; - - tot= 30+IPOBUTY*G.sipo->totipo; - if(tot<curarea->winy) return; - - getmouseco_areawin(mval); - yo= mval[1]; - - while(get_mbut()&M_MOUSE) { - getmouseco_areawin(mval); - if(mval[1]!=yo) { - G.sipo->butofs+= (mval[1]-yo); - if(G.sipo->butofs<0) G.sipo->butofs= 0; - else if(G.sipo->butofs+curarea->winy>tot) G.sipo->butofs= tot-curarea->winy; - - scrarea_do_windraw(curarea); - screen_swapbuffers(); - - yo= mval[1]; - } - else BIF_wait_for_statechange(); - } -} - -/* total mess function, especially with mousewheel, needs cleanup badly (ton) */ -int view2dzoom(unsigned short event) -{ - ScrArea *sa; - float fac, dx, dy, wtemp; - short mval[2], mvalo[2]; - short is_wheel= (event==WHEELUPMOUSE) || (event==WHEELDOWNMOUSE); - - getmouseco_areawin(mvalo); - mval[0]= mvalo[0]; - mval[1]= mvalo[1]; - - while( (get_mbut()&(L_MOUSE|M_MOUSE)) || is_wheel ) { - - /* regular mousewheel: zoom regular - * alt-shift mousewheel: zoom y only - * alt-ctrl mousewheel: zoom x only - */ - if (event==WHEELUPMOUSE) { - if(U.uiflag & USER_WHEELZOOMDIR) - wtemp = -0.0375; - else - wtemp = 0.03; - if(curarea->spacetype!=SPACE_BUTS) wtemp*= 3; - - dx= (float)(wtemp*(G.v2d->cur.xmax-G.v2d->cur.xmin)); - dy= (float)(wtemp*(G.v2d->cur.ymax-G.v2d->cur.ymin)); - - switch (G.qual & (LR_CTRLKEY|LR_SHIFTKEY|LR_ALTKEY)) { - case 0: - break; - case (LR_SHIFTKEY|LR_ALTKEY): - dx = 0; - break; - case (LR_CTRLKEY|LR_ALTKEY): - dy = 0; - break; - default: - if(curarea->spacetype==SPACE_BUTS); // exception - else return 0; - break; - } - } - else if (event==WHEELDOWNMOUSE) { - if(U.uiflag & USER_WHEELZOOMDIR) - wtemp = 0.03; - else - wtemp = -0.0375; - if(curarea->spacetype!=SPACE_BUTS) wtemp*= 3; - - dx= (float)(wtemp*(G.v2d->cur.xmax-G.v2d->cur.xmin)); - dy= (float)(wtemp*(G.v2d->cur.ymax-G.v2d->cur.ymin)); - - switch (G.qual & (LR_CTRLKEY|LR_SHIFTKEY|LR_ALTKEY)) { - case 0: - break; - case (LR_SHIFTKEY|LR_ALTKEY): - dx = 0; - break; - case (LR_CTRLKEY|LR_ALTKEY): - dy = 0; - break; - default: - if(curarea->spacetype==SPACE_BUTS); - else return 0; - break; - } - } - else { - getmouseco_areawin(mval); - if(U.viewzoom==USER_ZOOM_SCALE) { - float dist; - - dist = (G.v2d->mask.xmax - G.v2d->mask.xmin)/2.0; - dx= 1.0-(fabs(mvalo[0]-dist)+2.0)/(fabs(mval[0]-dist)+2.0); - dx*= 0.5*(G.v2d->cur.xmax-G.v2d->cur.xmin); - - dist = (G.v2d->mask.ymax - G.v2d->mask.ymin)/2.0; - dy= 1.0-(fabs(mvalo[1]-dist)+2.0)/(fabs(mval[1]-dist)+2.0); - dy*= 0.5*(G.v2d->cur.ymax-G.v2d->cur.ymin); - - } - else { - fac= 0.01*(mval[0]-mvalo[0]); - dx= fac*(G.v2d->cur.xmax-G.v2d->cur.xmin); - fac= 0.01*(mval[1]-mvalo[1]); - dy= fac*(G.v2d->cur.ymax-G.v2d->cur.ymin); - - if(U.viewzoom==USER_ZOOM_CONT) { - dx/= 20.0; - dy/= 20.0; - } - } - } - - if (ELEM(event, WHEELUPMOUSE, WHEELDOWNMOUSE) || mval[0]!=mvalo[0] || mval[1]!=mvalo[1]) { - - if(U.viewzoom!=USER_ZOOM_CONT) { - mvalo[0]= mval[0]; - mvalo[1]= mval[1]; - } - - 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 (ELEM(curarea->spacetype, SPACE_SOUND, SPACE_TIME)) { - G.v2d->cur.xmin+= dx; - G.v2d->cur.xmax-= dx; - } - else if (curarea->spacetype == SPACE_SEQ) { - /* less sensitivity on y scale */ - G.v2d->cur.xmin+= dx; - G.v2d->cur.xmax-= dx; - if (!(ELEM(event, WHEELUPMOUSE, WHEELDOWNMOUSE))) { - G.v2d->cur.ymin+= dy/2; - G.v2d->cur.ymax-= dy/2; - } - } - else { - G.v2d->cur.xmin+= dx; - G.v2d->cur.xmax-= dx; - G.v2d->cur.ymin+= dy; - G.v2d->cur.ymax-= dy; - } - - test_view2d(G.v2d, curarea->winx, curarea->winy); /* cur min max rects */ - - sa= curarea; /* now when are you going to kill this one! */ - view2d_do_locks(curarea, V2D_LOCK_COPY|V2D_LOCK_REDRAW); - areawinset(sa->win); - - scrarea_do_windraw(curarea); - screen_swapbuffers(); - } - else BIF_wait_for_statechange(); - /* return if we were using the mousewheel - */ - if ( is_wheel ) return 1; - } - return 1; -} - -void center_currframe(void) -{ - /* place the current frame in the - * center of the 2D window. - */ - float width; - - width = G.v2d->cur.xmax - G.v2d->cur.xmin; - G.v2d->cur.xmin = CFRA - 0.5*(width); - G.v2d->cur.xmax = CFRA + 0.5*(width); - - test_view2d(G.v2d, curarea->winx, curarea->winy); - view2d_do_locks(curarea, V2D_LOCK_COPY); - - scrarea_queue_winredraw(curarea); -} - -/* total mess function, especially with mousewheel, needs cleanup badly (ton) */ -int view2dmove(unsigned short event) -{ - /* return 1 when something was done */ - float facx=0.0, facy=0.0, dx, dy, left=1.0, right=1.0; - short mval[2], mvalo[2], leftret=1, mousebut; - short is_wheel= (event==WHEELUPMOUSE) || (event==WHEELDOWNMOUSE); - int oldcursor, cursor; - Window *win; - - /* when wheel is used, we only draw it once */ - - /* try to do some zooming if the - * middlemouse and ctrl are pressed - * or if the mousewheel is being used. - * Return if zooming was done. - */ - - /* check for left mouse / right mouse button select */ - if (U.flag & USER_LMOUSESELECT) mousebut = R_MOUSE; - else mousebut = L_MOUSE; - - if ( (G.qual & LR_CTRLKEY) || is_wheel ) { - /* patch for oops & buttonswin, standard scroll no zoom */ - if(curarea->spacetype==SPACE_OOPS) { - SpaceOops *soops= curarea->spacedata.first; - if(soops->type==SO_OUTLINER); - else if (view2dzoom(event)) { - return 0; - } - } - else if(curarea->spacetype==SPACE_BUTS && (G.qual & LR_CTRLKEY)==0); - else if (view2dzoom(event)) { - return 0; - } - } - - /* test where mouse is */ - getmouseco_areawin(mvalo); - /* initialize this too */ - mval[0]= mvalo[0]; - mval[1]= mvalo[1]; - - 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) { - /* which part of scrollbar should move? */ - if(mvalo[1]< (vertymin+vertymax)/2 ) right= 0.0; - else left= 0.0; - leftret= 0; - } - if(is_wheel) - facy= -facy; - } - else if(IN_2D_HORIZ_SCROLL((int)mvalo)) { - facx= -(G.v2d->tot.xmax-G.v2d->tot.xmin)/(float)(G.v2d->mask.xmax-G.v2d->mask.xmin); - if(get_mbut() & mousebut) { - /* which part of scrollbar should move? */ - if(mvalo[0]< (horxmin+horxmax)/2 ) right= 0.0; - else left= 0.0; - leftret= 0; - } - } - } - else { - facx= (G.v2d->cur.xmax-G.v2d->cur.xmin)/(float)(curarea->winx); - facy= (G.v2d->cur.ymax-G.v2d->cur.ymin)/(float)(curarea->winy); - } - - cursor = BC_NSEW_SCROLLCURSOR; - - /* no y move in audio & time */ - if ELEM(curarea->spacetype, SPACE_SOUND, SPACE_TIME) { - facy= 0.0; - cursor = BC_EW_SCROLLCURSOR; - } - - /* store the old cursor to temporarily change it */ - oldcursor=get_cursor(); - win=winlay_get_active_window(); - - - if(get_mbut() & mousebut && leftret) return 0; - if(facx==0.0 && facy==0.0) return 1; - - if (!is_wheel) SetBlenderCursor(cursor); - - while( (get_mbut()&(L_MOUSE|M_MOUSE)) || is_wheel) { - - /* If the mousewheel is used with shift key - * the scroll up and down. If the mousewheel - * is used with the ctrl key then scroll left - * and right. - */ - if (is_wheel) { - - if(event==WHEELDOWNMOUSE) { - facx= -facx; facy= -facy; - } - switch (G.qual & (LR_CTRLKEY|LR_SHIFTKEY|LR_ALTKEY)) { - case (LR_SHIFTKEY): - dx = 0.0; - dy= facy*20.0; - break; - case (LR_CTRLKEY): - dx= facx*20.0; - dy = 0.0; - break; - default: - if(curarea->spacetype==SPACE_OOPS) { - dx= 0.0; - dy= facy*20; - } - else if(curarea->spacetype==SPACE_BUTS) { - if(G.buts->align==BUT_HORIZONTAL) { - dx= facx*30; dy= 0.0; - } else { - dx= 0.0; dy= facy*30; - } - } - else return 0; - break; - } - } - else { - - - getmouseco_areawin(mval); - dx= facx*(mvalo[0]-mval[0]); - dy= facy*(mvalo[1]-mval[1]); - } - - if(mval[0]!=mvalo[0] || mval[1]!=mvalo[1] || is_wheel) { - ScrArea *sa; - - G.v2d->cur.xmin+= left*dx; - G.v2d->cur.xmax+= right*dx; - G.v2d->cur.ymin+= left*dy; - G.v2d->cur.ymax+= right*dy; - - test_view2d(G.v2d, curarea->winx, curarea->winy); - - sa= curarea; /* bad global */ - view2d_do_locks(curarea, V2D_LOCK_COPY|V2D_LOCK_REDRAW); - areawinset(sa->win); - - if(curarea->spacetype==SPACE_OOPS) - ((SpaceOops *)curarea->spacedata.first)->storeflag |= SO_TREESTORE_REDRAW; - - scrarea_do_windraw(curarea); - screen_swapbuffers(); - - mvalo[0]= mval[0]; - mvalo[1]= mval[1]; - } - else BIF_wait_for_statechange(); - /* return if we were using the mousewheel - */ - if ( is_wheel ) return 1; - } - - window_set_cursor(win, oldcursor); - return 1; -} - -void view2dborder(void) -{ - -} - -EditIpo *select_proj_ipo(rctf *rectf, int event) -{ - EditIpo *ei; - float xmin, ymin, xmax, ymax; - /* this was IGLuint, but it's a useless typedef... */ - GLuint buffer[MAXPICKBUF]; - int a, b; - int hits; - unsigned int code; - short mval[2]; - - G.f |= G_PICKSEL; - - if(rectf==0) { - getmouseco_areawin(mval); - - mval[0]-= 6; mval[1]-= 6; - areamouseco_to_ipoco(G.v2d, mval, &xmin, &ymin); - mval[0]+= 12; mval[1]+= 12; - areamouseco_to_ipoco(G.v2d, mval, &xmax, &ymax); - - myortho2(xmin, xmax, ymin, ymax); - } - else myortho2(rectf->xmin, rectf->xmax, rectf->ymin, rectf->ymax); - - glSelectBuffer( MAXPICKBUF, buffer); - glRenderMode(GL_SELECT); - glInitNames(); /* whatfor? but otherwise it does not work */ - glPushName(-1); - - /* get rid of buttons view */ - glPushMatrix(); - glLoadIdentity(); - - init_pickselcode(); /* drawipo.c */ - draw_ipocurves(0); - - /* restore buttons view */ - glPopMatrix(); - - G.f -= G_PICKSEL; - - hits= glRenderMode(GL_RENDER); - glPopName(); /* see above (pushname) */ - if(hits<1) return 0; - - code= 1; - ei= G.sipo->editipo; - for(a=0; a<G.sipo->totipo; a++, ei++) { - if ISPOIN(ei, icu, flag & IPO_VISIBLE) { - if(rectf) { - for(b=0; b<hits; b++) { - /* conversion for glSelect */ - if(code == buffer[ (4 * b) + 3] ) { - if(event==LEFTMOUSE) ei->flag |= IPO_SELECT; - else ei->flag &= ~IPO_SELECT; - ei->icu->flag= ei->flag; - } - } - } - else { - /* also conversion for glSelect */ - if(code==buffer[ 3 ]) return ei; - } - code++; - } - } - return 0; -} |