[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [17383] trunk/blender/source/blender/src/ interface_draw.c: Patch #17971 by Nathan Vegdahl:

Matt Ebb matt at mke3.net
Mon Nov 10 05:40:24 CET 2008


Revision: 17383
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=17383
Author:   broken
Date:     2008-11-10 05:40:09 +0100 (Mon, 10 Nov 2008)

Log Message:
-----------
Patch #17971 by Nathan Vegdahl:
Makes colorband GUI display proper color interpolation

This updates the colorband display to show the correct interpolation 
within the editable gradient itself.

thanks!

Modified Paths:
--------------
    trunk/blender/source/blender/src/interface_draw.c

Modified: trunk/blender/source/blender/src/interface_draw.c
===================================================================
--- trunk/blender/source/blender/src/interface_draw.c	2008-11-10 00:14:35 UTC (rev 17382)
+++ trunk/blender/source/blender/src/interface_draw.c	2008-11-10 04:40:09 UTC (rev 17383)
@@ -68,6 +68,7 @@
 #include "BKE_global.h"
 #include "BKE_key.h"
 #include "BKE_utildefines.h"
+#include "BKE_texture.h"
 
 #include "datatoc.h"            /* std font */
 
@@ -1978,6 +1979,7 @@
 	CBData *cbd;
 	float x1, y1, sizex, sizey;
 	float dx, v3[2], v1[2], v2[2], v1a[2], v2a[2];
+	float pos, colf[4];
 	int a;
 		
 	if(coba==NULL) return;
@@ -1998,7 +2000,7 @@
 		v1[0]+= dx;
 	}
 	
-	glShadeModel(GL_SMOOTH);
+	glShadeModel(GL_FLAT);
 	glEnable(GL_BLEND);
 	
 	cbd= coba->data;
@@ -2012,17 +2014,16 @@
 	glColor4fv( &cbd->r );
 	glVertex2fv(v1); glVertex2fv(v2);
 	
-	for(a=0; a<coba->tot; a++, cbd++) {
-		
-		v1[0]=v2[0]= x1+ cbd->pos*sizex;
-		
-		glColor4fv( &cbd->r );
+	for( a = 1; a < sizex; a++ ) {
+		pos = ((float)a) / (sizex-1);
+		do_colorband( coba, pos, colf );
+
+		v1[0]=v2[0]= x1 + a;
+
+		glColor4fv( colf );
 		glVertex2fv(v1); glVertex2fv(v2);
 	}
-	
-	v1[0]=v2[0]= x1+ sizex;
-	glVertex2fv(v1); glVertex2fv(v2);
-	
+
 	glEnd();
 	glShadeModel(GL_FLAT);
 	glDisable(GL_BLEND);
@@ -2203,11 +2204,17 @@
 static void ui_draw_but_CURVE(uiBut *but)
 {
 	CurveMapping *cumap= (CurveMapping *)but->poin;
-	CurveMap *cuma= cumap->cm+cumap->cur;
+	CurveMap *cuma;
 	CurveMapPoint *cmp;
 	float fx, fy, dx, dy, fac[2], zoomx, zoomy, offsx, offsy;
 	GLint scissor[4];
-	int a;
+	int a, i, c, tmp;
+
+	/* Check number of curves */
+	if(cumap->flag & CUMA_MULTI_CURVE)
+		c= 4;
+	else
+		c= 1;
 	
 	/* need scissor test, curve can draw outside of boundary */
 	glGetIntegerv(GL_VIEWPORT, scissor);
@@ -2286,57 +2293,105 @@
 			glEnd();
 		}
 	}
+
+	/* Ugly hack to make sure all curves are there */
+    tmp= cumap->cur;
+	for(i= 0; i<c; i++) {
+        if (c>1) {
+            cumap->cur= i;
+	    	cuma= cumap->cm+i;
+        }
+        else
+            cuma= cumap->cm+cumap->cur;
+		if(cuma->table==NULL)
+			curvemapping_changed(cumap, 0);	/* 0 = no remove doubles */
+	}
+    cumap->cur= tmp;
 	
 	/* the curve */
-	BIF_ThemeColorBlend(TH_TEXT, TH_BUT_NEUTRAL, 0.35);
-	glEnable(GL_LINE_SMOOTH);
-	glEnable(GL_BLEND);
-	glBegin(GL_LINE_STRIP);
-	
-	if(cuma->table==NULL)
-		curvemapping_changed(cumap, 0);	/* 0 = no remove doubles */
-	cmp= cuma->table;
-	
-	/* first point */
-	if((cuma->flag & CUMA_EXTEND_EXTRAPOLATE)==0)
-		glVertex2f(but->x1, but->y1 + zoomy*(cmp[0].y-offsy));
-	else {
-		fx= but->x1 + zoomx*(cmp[0].x-offsx + cuma->ext_in[0]);
-		fy= but->y1 + zoomy*(cmp[0].y-offsy + cuma->ext_in[1]);
-		glVertex2f(fx, fy);
-	}
-	for(a=0; a<=CM_TABLE; a++) {
-		fx= but->x1 + zoomx*(cmp[a].x-offsx);
-		fy= but->y1 + zoomy*(cmp[a].y-offsy);
-		glVertex2f(fx, fy);
-	}
-	/* last point */
-	if((cuma->flag & CUMA_EXTEND_EXTRAPOLATE)==0)
-		glVertex2f(but->x2, but->y1 + zoomy*(cmp[CM_TABLE].y-offsy));	
-	else {
-		fx= but->x1 + zoomx*(cmp[CM_TABLE].x-offsx - cuma->ext_out[0]);
-		fy= but->y1 + zoomy*(cmp[CM_TABLE].y-offsy - cuma->ext_out[1]);
-		glVertex2f(fx, fy);
-	}
-	glEnd();
-	glDisable(GL_LINE_SMOOTH);
-	glDisable(GL_BLEND);
+	for(i=0; i<c; i++) {
+		if(c>1) {
+			cuma= cumap->cm+i;
+			switch (i) {
+				case 0:
+					glColor3ub(240,20,20);
+					break;
+				case 1:
+					glColor3ub(20,240,20);
+					break;
+				case 2:
+					glColor3ub(20,20,240);
+					break;
+				default:
+					BIF_ThemeColorBlend(TH_TEXT, TH_BUT_NEUTRAL, 0.35);
+					break;			
+			}
+		}
+		else {
+			cuma= cumap->cm+cumap->cur;
+			switch(cumap->cur) {
+				case 0:
+					glColor3ub(240,20,20);
+					break;
+				case 1:
+					glColor3ub(20,240,20);
+					break;
+				case 2:
+					glColor3ub(20,20,240);
+					break;
+				default:
+					BIF_ThemeColorBlend(TH_TEXT, TH_BUT_NEUTRAL, 0.35);
+					break;
+			}
+		}
+		glEnable(GL_LINE_SMOOTH);
+		glEnable(GL_BLEND);
+		glBegin(GL_LINE_STRIP);
+		
+		cmp= cuma->table;
+		
+		/* first point */
+		if((cuma->flag & CUMA_EXTEND_EXTRAPOLATE)==0)
+			glVertex2f(but->x1, but->y1 + zoomy*(cmp[0].y-offsy));
+		else {
+			fx= but->x1 + zoomx*(cmp[0].x-offsx + cuma->ext_in[0]);
+			fy= but->y1 + zoomy*(cmp[0].y-offsy + cuma->ext_in[1]);
+			glVertex2f(fx, fy);
+		}
+		/* Points inbetween first and last */
+		for(a=0; a<=CM_TABLE; a++) {
+			fx= but->x1 + zoomx*(cmp[a].x-offsx);
+			fy= but->y1 + zoomy*(cmp[a].y-offsy);
+			glVertex2f(fx, fy);
+		}
+		/* last point */
+		if((cuma->flag & CUMA_EXTEND_EXTRAPOLATE)==0)
+			glVertex2f(but->x2, but->y1 + zoomy*(cmp[CM_TABLE].y-offsy));	
+		else {
+			fx= but->x1 + zoomx*(cmp[CM_TABLE].x-offsx - cuma->ext_out[0]);
+			fy= but->y1 + zoomy*(cmp[CM_TABLE].y-offsy - cuma->ext_out[1]);
+			glVertex2f(fx, fy);
+		}
+		glEnd();
+		glDisable(GL_LINE_SMOOTH);
+		glDisable(GL_BLEND);
 
-	/* the points, use aspect to make them visible on edges */
-	cmp= cuma->curve;
-	glPointSize(3.0f);
-	bglBegin(GL_POINTS);
-	for(a=0; a<cuma->totpoint; a++) {
-		if(cmp[a].flag & SELECT)
-			BIF_ThemeColor(TH_TEXT_HI);
-		else
-			BIF_ThemeColor(TH_TEXT);
-		fac[0]= but->x1 + zoomx*(cmp[a].x-offsx);
-		fac[1]= but->y1 + zoomy*(cmp[a].y-offsy);
-		bglVertex2fv(fac);
-	}
-	bglEnd();
-	glPointSize(1.0f);
+        /* the points, use aspect to make them visible on edges */
+        cmp= cuma->curve;
+        glPointSize(3.0f);
+        bglBegin(GL_POINTS);
+        for(a=0; a<cuma->totpoint; a++) {
+            if(cmp[a].flag & SELECT)
+                BIF_ThemeColor(TH_TEXT_HI);
+            else
+                BIF_ThemeColor(TH_TEXT);
+            fac[0]= but->x1 + zoomx*(cmp[a].x-offsx);
+            fac[1]= but->y1 + zoomy*(cmp[a].y-offsy);
+            bglVertex2fv(fac);
+        }
+        bglEnd();
+        glPointSize(1.0f);
+    }
 	
 	/* restore scissortest */
 	glScissor(scissor[0], scissor[1], scissor[2], scissor[3]);





More information about the Bf-blender-cvs mailing list