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

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'source/blender/src/drawnla.c')
-rw-r--r--source/blender/src/drawnla.c523
1 files changed, 523 insertions, 0 deletions
diff --git a/source/blender/src/drawnla.c b/source/blender/src/drawnla.c
new file mode 100644
index 00000000000..d5a729b7378
--- /dev/null
+++ b/source/blender/src/drawnla.c
@@ -0,0 +1,523 @@
+/**
+ * $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 *****
+ */
+
+#ifdef _WIN32
+#pragma warning (once : 4761)
+#include "BLI_winstuff.h"
+#endif
+
+#include "BMF_Api.h"
+
+#include <stdlib.h>
+#include <stdio.h>
+#include "BSE_drawnla.h"
+#include "BSE_drawipo.h"
+#include "BSE_editnla_types.h"
+
+#include "BIF_gl.h"
+#include "BIF_resources.h"
+#include "BIF_screen.h"
+#include "BIF_mywindow.h"
+#include "BIF_glutil.h"
+
+#include "DNA_view3d_types.h"
+#include "DNA_screen_types.h"
+#include "DNA_space_types.h"
+#include "DNA_scene_types.h"
+#include "DNA_object_types.h"
+#include "DNA_curve_types.h"
+#include "DNA_ipo_types.h"
+#include "DNA_action_types.h"
+#include "DNA_nla_types.h"
+#include "DNA_constraint_types.h"
+
+#include "BLI_blenlib.h"
+#include "MEM_guardedalloc.h"
+#include "BKE_global.h"
+
+#include "BDR_drawaction.h"
+#include "BDR_editcurve.h"
+
+#include "blendef.h"
+#include "interface.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)
+{
+
+ short ofsx, ofsy = 0;
+ Base *base;
+ float x, y;
+ bActionStrip *strip;
+ bConstraintChannel *conchan;
+
+ myortho2 (0, NLAWIDTH, G.v2d->cur.ymin, G.v2d->cur.ymax); // Scaling
+
+ /* Blank out the area */
+ if(curarea->winx>SCROLLB+10 && curarea->winy>SCROLLH+10) {
+ if(G.v2d->scroll) {
+ ofsx= curarea->winrct.xmin;
+ ofsy= curarea->winrct.ymin;
+ glViewport(ofsx, ofsy+G.v2d->mask.ymin-SCROLLB, NLAWIDTH, ( ofsy+G.v2d->mask.ymax)-( ofsy+G.v2d->mask.ymin-SCROLLB));
+ glScissor(ofsx, ofsy+G.v2d->mask.ymin-SCROLLB, NLAWIDTH, ( ofsy+G.v2d->mask.ymax)-( ofsy+G.v2d->mask.ymin-SCROLLB));
+ }
+ }
+
+ glClearColor(.6, .6, .6, 0.0);
+ glClear(GL_COLOR_BUFFER_BIT);
+
+ /* Clip to the scrollable area */
+
+ 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)){
+ cpack (0xAAAAAA);
+ glRectf(x, y-NLACHANNELHEIGHT/2, (float)NLAWIDTH, y+NLACHANNELHEIGHT/2);
+
+ /* Draw the name / ipo timeline*/
+ if (TESTBASE_SAFE(base))
+ cpack(0xFFFFFF);
+ else
+ cpack (0x000000);
+ glRasterPos2f(x+16, y-4);
+ BMF_DrawString(G.font, base->object->id.name+2);
+
+ /* Draw the constraint ipos */
+ for (conchan = base->object->constraintChannels.first; conchan; conchan=conchan->next){
+ y-=NLACHANNELHEIGHT+NLACHANNELSKIP;
+ cpack (0x888888);
+ glRectf(x+16, y-NLACHANNELHEIGHT/2, (float)NLAWIDTH, y+NLACHANNELHEIGHT/2);
+
+ if (conchan->flag & CONSTRAINT_CHANNEL_SELECT)
+ cpack(0xFFFFFF);
+ else
+ cpack (0x000000);
+
+ glRasterPos2f(x+32, y-4);
+ BMF_DrawString(G.font, conchan->name);
+ }
+
+ /* Draw the action timeline */
+ if (ACTIVE_ARMATURE(base)){
+ glRasterPos2f(x, y-8);
+ BIF_draw_icon(ICON_DOWNARROW_HLT);
+ y-=NLACHANNELHEIGHT+NLACHANNELSKIP;
+
+ if (base->object->action){
+ cpack (0x888888);
+ glRectf(x+16, y-NLACHANNELHEIGHT/2, (float)NLAWIDTH, y+NLACHANNELHEIGHT/2);
+
+ if (TESTBASE_SAFE(base))
+ cpack(0xFFFFFF);
+ else
+ cpack (0x000000);
+
+ 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){
+ cpack (0x666666);
+ glRectf(x+32, y-NLACHANNELHEIGHT/2, (float)NLAWIDTH, y+NLACHANNELHEIGHT/2);
+
+ if (TESTBASE_SAFE(base))
+ cpack(0xFFFFFF);
+ else
+ cpack (0x000000);
+
+ glRasterPos2f(x+48, y-4);
+ BMF_DrawString(G.font, strip->act->id.name+2);
+
+ y-=(NLACHANNELHEIGHT+NLACHANNELSKIP);
+
+ }
+ }
+ }
+ }
+
+ myortho2 (0, NLAWIDTH, 0, ( ofsy+G.v2d->mask.ymax)-( ofsy+G.v2d->mask.ymin-SCROLLB)); // Scaling
+
+ glShadeModel(GL_SMOOTH);
+
+ y=9;
+
+#if 1
+ /* Draw sexy shaded block thingies */
+ glEnable (GL_BLEND);
+ glBegin(GL_QUAD_STRIP);
+ glColor4ub (0x99,0x99,0x99,0x00);
+ glVertex2f (0,SCROLLB*2-y);
+ glVertex2f (NLAWIDTH,SCROLLB*2-y);
+
+ glColor4ub (0x99,0x99,0x99,0xFF);
+ glVertex2f (0,SCROLLB-y);
+ glVertex2f (NLAWIDTH,SCROLLB-y);
+
+ glColor4ub (0x99,0x99,0x99,0xFF);
+ glVertex2f (0,0-y);
+ glVertex2f (NLAWIDTH,0-y);
+
+ glEnd();
+
+ glDisable (GL_BLEND);
+#endif
+
+ glShadeModel(GL_FLAT);
+}
+
+static void draw_nlastrips(SpaceNla *snla)
+{
+ rcti scr_rct;
+ gla2DDrawInfo *di;
+ Base *base;
+ int offset = 0;
+ bConstraintChannel *conchan;
+
+ float y;
+
+ /* Draw strips */
+
+ scr_rct.xmin= snla->area->winrct.xmin + NLAWIDTH;
+ scr_rct.ymin= snla->area->winrct.ymin + snla->v2d.mask.ymin-SCROLLB;
+ scr_rct.xmax= snla->area->winrct.xmin + snla->v2d.hor.xmax;
+ scr_rct.ymax= snla->area->winrct.ymin + snla->v2d.mask.ymax;
+ di= glaBegin2DDraw(&scr_rct, &G.v2d->cur);
+
+ y=count_nla_levels();
+ y*= (NLACHANNELHEIGHT+NLACHANNELSKIP);
+
+ for (base=G.scene->base.first; base; base=base->next){
+ Object *ob;
+ bActionStrip *strip;
+ int frame1_x, channel_y;
+
+ ob=base->object;
+
+ if (nla_filter(base, 0)){
+ /* Draw the field */
+ glEnable (GL_BLEND);
+ if (TESTBASE_SAFE(base))
+ glColor4b (0x11, 0x22, 0x55, 0x22);
+ else
+ glColor4b (0x55, 0x22, 0x11, 0x22);
+
+ gla2DDrawTranslatePt(di, 1, y, &frame1_x, &channel_y);
+ glRectf(0, channel_y-NLACHANNELHEIGHT/2, frame1_x, channel_y+NLACHANNELHEIGHT/2);
+
+
+ if (TESTBASE_SAFE(base))
+ glColor4b (0x11, 0x22, 0x55, 0x44);
+ else
+ glColor4b (0x55, 0x22, 0x11, 0x44);
+ glRectf(frame1_x, channel_y-NLACHANNELHEIGHT/2, G.v2d->hor.xmax, channel_y+NLACHANNELHEIGHT/2);
+
+ glDisable (GL_BLEND);
+
+ /* Draw the ipo */
+ 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)
+ glColor4b (0x11, 0x22, 0x55, 0x22);
+ else
+ glColor4b (0x55, 0x22, 0x11, 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)
+ glColor4b (0x11, 0x22, 0x55, 0x44);
+ else
+ glColor4b (0x55, 0x22, 0x11, 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;
+
+ }
+ }
+
+
+
+
+ /* Draw the action strip */
+ if (ACTIVE_ARMATURE(base)){
+
+ /* Draw the field */
+ glEnable (GL_BLEND);
+ if (TESTBASE_SAFE(base))
+ glColor4ub (0x11, 0x22, 0x55, 0x22);
+ else
+ glColor4ub (0x55, 0x22, 0x11, 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 (0x11, 0x22, 0x55, 0x44);
+ else
+ glColor4ub (0x55, 0x22, 0x11, 0x44);
+ glRectf(frame1_x, channel_y-NLACHANNELHEIGHT/2+4, G.v2d->hor.xmax, channel_y+NLACHANNELHEIGHT/2-4);
+
+ glDisable (GL_BLEND);
+
+ /* Draw the action keys */
+ draw_action_channel(di, ob->action, 0, y);
+
+ 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;
+
+ /* Draw rect */
+ if (strip->flag & ACTSTRIP_SELECT){
+ r = 0xFF; g=0xFF; b=0xAA;
+ }
+ else{
+ r = 0xE4; g=0x9C; b=0xC6;
+ }
+
+ 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(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){
+ 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);
+ }
+
+ }
+ }
+ glaEnd2DDraw(di);
+
+}
+
+void drawnlaspace(void)
+{
+ short ofsx = 0, ofsy = 0;
+
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA) ;
+
+ calc_scrollrcts(G.v2d, curarea->winx, curarea->winy);
+
+ if(curarea->winx>SCROLLB+10 && curarea->winy>SCROLLH+10) {
+ if(G.v2d->scroll) {
+ ofsx= curarea->winrct.xmin;
+ ofsy= curarea->winrct.ymin;
+ 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);
+ glScissor(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);
+ }
+ }
+
+ glClearColor(.45, .45, .45, 0.0);
+ glClear(GL_COLOR_BUFFER_BIT);
+
+ myortho2 (G.v2d->cur.xmin, G.v2d->cur.xmax, G.v2d->cur.ymin, G.v2d->cur.ymax);
+
+ /* Draw backdrop */
+ calc_ipogrid();
+ draw_ipogrid();
+
+ /* Draw channel strips */
+ draw_nlastrips(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);
+ glScissor(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);
+ myortho2 (G.v2d->cur.xmin, G.v2d->cur.xmax, G.v2d->cur.ymin, G.v2d->cur.ymax);
+ draw_cfra_action();
+
+ /* Draw scroll */
+ mywinset(curarea->win);
+ if(curarea->winx>SCROLLB+10 && curarea->winy>SCROLLH+10) {
+ myortho2(-0.5, curarea->winx+0.5, -0.5, curarea->winy+0.5);
+ if(G.v2d->scroll) drawscroll(0);
+ }
+
+ /* Draw channel names */
+ draw_nlatree();
+
+ curarea->win_swap= WIN_BACK_OK;
+}
+
+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 */
+ 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);
+ }
+ }
+ }
+
+ return y;
+}
+
+int nla_filter (Base* base, int flags)
+{
+ Object *ob = base->object;
+
+ /* Only objects with ipos */
+ if (ob->ipo)
+ return 1;
+
+ if (ob->constraintChannels.first)
+ return 1;
+
+ /* Only armatures */
+ if (ob->type==OB_ARMATURE)
+ return 1;
+
+ else return 0;
+} \ No newline at end of file