[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [18429] branches/blender2.5/blender/source /blender/editors/space_ipo/ipo_draw.c: 2.5 - IPO Editor

Joshua Leung aligorith at gmail.com
Fri Jan 9 07:25:17 CET 2009


Revision: 18429
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=18429
Author:   aligorith
Date:     2009-01-09 07:25:14 +0100 (Fri, 09 Jan 2009)

Log Message:
-----------
2.5 - IPO Editor

Porting relevant drawing code over from AnimSys2. It is currently not hooked up to anything else yet, so don't expect any curves to draw for a while. I'll need this for validating that my recorded animation system will work. ;)

Added Paths:
-----------
    branches/blender2.5/blender/source/blender/editors/space_ipo/ipo_draw.c

Added: branches/blender2.5/blender/source/blender/editors/space_ipo/ipo_draw.c
===================================================================
--- branches/blender2.5/blender/source/blender/editors/space_ipo/ipo_draw.c	                        (rev 0)
+++ branches/blender2.5/blender/source/blender/editors/space_ipo/ipo_draw.c	2009-01-09 06:25:14 UTC (rev 18429)
@@ -0,0 +1,713 @@
+/**
+ * $Id: drawipo.c 17512 2008-11-20 05:55:42Z aligorith $
+ *
+ * ***** 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) Blender Foundation
+ *
+ * Contributor(s): Joshua Leung (2009 Recode)
+ *
+ * ***** END GPL 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 "DNA_view2d_types.h"
+#include "DNA_windowmanager_types.h"
+
+#include "BKE_curve.h"
+#include "BKE_depsgraph.h"
+#include "BKE_ipo.h"
+#include "BKE_key.h"
+#include "BKE_object.h"
+#include "BKE_utildefines.h"
+
+#include "BIF_gl.h"
+#include "BIF_glutil.h"
+
+#include "ED_anim_api.h"
+#include "ED_util.h"
+
+#include "UI_resources.h"
+#include "UI_view2d.h"
+
+/* **************************** */
+// XXX stubs to remove!
+
+// NOTE: the code in this file has yet to be rewritten to get rid of the editipo system which is past its use-by-date - Aligorith
+
+typedef struct EditIpo {
+	IpoCurve *icu;
+	short disptype;
+	short flag;
+	unsigned int col;
+} 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) )
+
+/* *************************** */
+
+/* helper func - draw keyframe vertices only for an IPO-curve */
+static void draw_ipovertices_keyframes(IpoCurve *icu, View2D *v2d, short disptype, short edit, short sel)
+{
+	BezTriple *bezt= icu->bezt;
+	float v1[2];
+	int a, b;
+	
+	bglBegin(GL_POINTS);
+	
+	for (a = 0; a < icu->totvert; a++, bezt++) {
+		/* IPO_DISPBITS is used for displaying curves for bitflag variables */
+		if (disptype == IPO_DISPBITS) {
+			/*if (v2d->cur.xmin < bezt->vec[1][0] < v2d->cur.xmax) {*/
+			short ok= 0;
+			
+			if (edit) {
+				if ((bezt->f2 & SELECT) == sel) 
+					ok= 1;
+			}
+			else ok= 1;
+			
+			if (ok) {
+				int val= (int)bezt->vec[1][1];
+				v1[0]= bezt->vec[1][0];
+				
+				for (b= 0; b < 31; b++) {
+					if (val & (1<<b)) {	
+						v1[1]= b + 1;
+						bglVertex3fv(v1);
+					}
+				}
+			}
+			/*}*/
+		} 
+		else { /* normal (non bit) curves */
+			if (edit) {
+				/* Only the vertex of the line, the
+				 * handler are drawn later
+				 */
+				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]);
+			}
+		}
+	}
+	bglEnd();
+}
+
+/* helper func - draw handle vertex for an IPO-Curve as a round unfilled circle */
+static void draw_ipohandle_control(float x, float y, float xscale, float yscale, float hsize)
+{
+	static GLuint displist=0;
+	
+	/* initialise round circle shape */
+	if (displist == 0) {
+		GLUquadricObj *qobj;
+		
+		displist= glGenLists(1);
+		glNewList(displist, GL_COMPILE_AND_EXECUTE);
+		
+		qobj	= gluNewQuadric(); 
+		gluQuadricDrawStyle(qobj, GLU_SILHOUETTE); 
+		gluDisk(qobj, 0.07,  0.8, 12, 1);
+		gluDeleteQuadric(qobj);  
+		
+		glEndList();
+	}
+	
+	/* adjust view transform before starting */
+	glTranslatef(x, y, 0.0f);
+	glScalef(1.0/xscale*hsize, 1.0/yscale*hsize, 1.0);
+	
+	/* draw! */
+	glCallList(displist);
+	
+	/* restore view transform */
+	glScalef(xscale/hsize, yscale/hsize, 1.0);
+	glTranslatef(-x, -y, 0.0f);
+}
+
+/* helper func - draw handle vertices only for an IPO-curve (if it is in EditMode) */
+static void draw_ipovertices_handles(IpoCurve *icu, View2D *v2d, short disptype, short sel)
+{
+	BezTriple *bezt= icu->bezt;
+	BezTriple *prevbezt = NULL;
+	float hsize, xscale, yscale;
+	int a;
+	
+	/* get view settings */
+	hsize= UI_GetThemeValuef(TH_HANDLE_VERTEX_SIZE);
+	UI_view2d_getscale(v2d, &xscale, &yscale);
+	
+	/* set handle color */
+	if (sel) UI_ThemeColor(TH_HANDLE_VERTEX_SELECT);
+	else UI_ThemeColor(TH_HANDLE_VERTEX);
+	
+	for (a= 0; a < icu->totvert; a++, prevbezt=bezt, bezt++) {
+		if (disptype != IPO_DISPBITS) {
+			if (ELEM(icu->ipo, IPO_BEZ, IPO_MIXED)) {
+				/* Draw the editmode handels for a bezier curve (others don't have handles) 
+				 * if their selection status matches the selection status we're drawing for
+				 *	- first handle only if previous beztriple was bezier-mode
+				 *	- second handle only if current beztriple is bezier-mode
+				 */
+				if ( (!prevbezt && (bezt->ipo==IPO_BEZ)) || (prevbezt && (prevbezt->ipo==IPO_BEZ)) ) {
+					if ((bezt->f1 & SELECT) == sel)/* && v2d->cur.xmin < bezt->vec[0][0] < v2d->cur.xmax)*/
+						draw_ipohandle_control(bezt->vec[0][0], bezt->vec[0][1], xscale, yscale, hsize);
+				}
+				
+				if (bezt->ipo==IPO_BEZ) {
+					if ((bezt->f3 & SELECT) == sel)/* && v2d->cur.xmin < bezt->vec[2][0] < v2d->cur.xmax)*/
+						draw_ipohandle_control(bezt->vec[2][0], bezt->vec[2][1], xscale, yscale, hsize);
+				}
+			}
+		}
+	}
+}
+
+static void draw_ipovertices(SpaceIpo *sipo, ARegion *ar, int sel)
+{
+	View2D *v2d= &ar->v2d;
+	EditIpo *ei= sipo->editipo;
+	int nr, val = 0;
+	
+	/* this shouldn't get called while drawing in selection-buffer anyway */
+	//if (G.f & G_PICKSEL) return;
+	
+	glPointSize(UI_GetThemeValuef(TH_VERTEX_SIZE));
+	
+	for (nr=0; nr<sipo->totipo; nr++, ei++) {
+		if ISPOIN(ei, flag & IPO_VISIBLE, icu) {
+			/* select colors to use to draw keyframes */
+			if (sipo->showkey) {
+				if (sel) UI_ThemeColor(TH_TEXT_HI);
+				else UI_ThemeColor(TH_TEXT);
+			} 
+			else if (ei->flag & IPO_EDIT) {
+				if (sel) UI_ThemeColor(TH_VERTEX_SELECT); 
+				else UI_ThemeColor(TH_VERTEX);
+			} 
+			else {
+				if (sel) UI_ThemeColor(TH_TEXT_HI);
+				else UI_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) 
+			 */		
+			
+			/* draw keyframes, then the handles (if in editmode) */
+			draw_ipovertices_keyframes(ei->icu, v2d, ei->disptype, (ei->flag & IPO_EDIT), sel);
+			
+			/* Now draw the two vertex of the handles,
+			 * This needs to be done after the keyframes, 
+			 * because we can't call glPointSize
+			 * in the middle of a glBegin/glEnd also the
+			 * bug comment before.
+			 */
+			if ((ei->flag & IPO_EDIT) && (sipo->flag & SIPO_NOHANDLES)==0)
+				draw_ipovertices_handles(ei->icu, v2d, ei->disptype, sel);
+		}
+	}
+	
+	glPointSize(1.0);
+}
+
+/* draw lines for IPO-curve handles only (this is only done in EditMode) */
+static void draw_ipohandles(SpaceIpo *sipo, ARegion *ar, int sel)
+{
+	EditIpo *ei;
+	extern unsigned int nurbcol[];
+	unsigned int *col;
+	int a, b;
+	
+	/* don't draw handle lines if handles are not shown */
+	if (sipo->flag & SIPO_NOHANDLES)
+		return;
+	
+	if (sel) col= nurbcol+4;
+	else col= nurbcol;
+	
+	ei= sipo->editipo;
+	for (a=0; a<sipo->totipo; a++, ei++) {
+		if ISPOIN4(ei, flag & IPO_VISIBLE, flag & IPO_EDIT, icu, disptype!=IPO_DISPBITS) {
+			if (ELEM(ei->icu->ipo, IPO_BEZ, IPO_MIXED)) {
+				BezTriple *bezt=ei->icu->bezt, *prevbezt=NULL;
+				float *fp;
+				
+				for (b= 0; b < ei->icu->totvert; b++, prevbezt=bezt, bezt++) {
+					if ((bezt->f2 & SELECT)==sel) {
+						fp= bezt->vec[0];
+						
+						/* only draw first handle if previous segment had handles */
+						if ( (!prevbezt && (bezt->ipo==IPO_BEZ)) || (prevbezt && (prevbezt->ipo==IPO_BEZ)) ) 
+						{
+							cpack(col[bezt->h1]);
+							glBegin(GL_LINE_STRIP); 
+							glVertex2fv(fp); glVertex2fv(fp+3); 
+							glEnd();
+							
+						}
+						
+						/* only draw second handle if this segment is bezier */
+						if (bezt->ipo == IPO_BEZ) 
+						{
+							cpack(col[bezt->h2]);
+							glBegin(GL_LINE_STRIP); 
+							glVertex2fv(fp+3); glVertex2fv(fp+6); 
+							glEnd();
+						}
+					}
+					else {
+						/* only draw first handle if previous segment was had handles, and selection is ok */
+						if ( ((bezt->f1 & SELECT)==sel) && 
+							 ( (!prevbezt && (bezt->ipo==IPO_BEZ)) || (prevbezt && (prevbezt->ipo==IPO_BEZ)) ) ) 
+						{
+							fp= bezt->vec[0];
+							cpack(col[bezt->h1]);
+							
+							glBegin(GL_LINE_STRIP); 
+							glVertex2fv(fp); glVertex2fv(fp+3); 
+							glEnd();
+						}
+						
+						/* only draw second handle if this segment is bezier, and selection is ok */
+						if ( ((bezt->f3 & SELECT)==sel) &&
+							 (bezt->ipo == IPO_BEZ) )
+						{
+							fp= bezt->vec[1];
+							cpack(col[bezt->h2]);
+							
+							glBegin(GL_LINE_STRIP); 
+							glVertex2fv(fp); glVertex2fv(fp+3); 
+							glEnd();
+						}
+					}
+				}
+			}
+		}
+	}
+}
+
+/* helper func - draw one repeat of an ipo-curve: bitflag curve only (this is evil stuff to expose to user like this) */
+static void draw_ipocurve_repeat_bits (IpoCurve *icu, View2D *v2d, float cycxofs)
+{
+	BezTriple *bezt= icu->bezt;
+	int a;
+	

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list