Revision: 17236
          
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=17236
Author:   aligorith
Date:     2008-10-31 04:22:13 +0100 (Fri, 31 Oct 2008)

Log Message:
-----------
AnimSys2: IPO-Drawing code Cleanup (Part 2)

* Split another function into smaller portions based on what those parts did
* Commented and formatted code

Modified Paths:
--------------
    branches/animsys2/source/blender/src/drawipo.c

Modified: branches/animsys2/source/blender/src/drawipo.c
===================================================================
--- branches/animsys2/source/blender/src/drawipo.c      2008-10-31 00:23:01 UTC 
(rev 17235)
+++ branches/animsys2/source/blender/src/drawipo.c      2008-10-31 03:22:13 UTC 
(rev 17236)
@@ -1155,135 +1155,147 @@
        uiDrawBlock(block);
 }
 
-static void draw_ipovertices(int sel)
+/* helper func - draw keyframe vertices only for an IPO-curve */
+static void draw_ipovertices_keyframes(IpoCurve *icu, short disptype, short 
edit, short sel)
 {
-       EditIpo *ei;
-       BezTriple *bezt;
+       BezTriple *bezt= icu->bezt;
        float v1[2];
-       int val, ok, nr, a, b;
+       int a, b;
        
-       if(G.f & G_PICKSEL) return;
+       bglBegin(GL_POINTS);
        
-       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) {
+       for (a = 0; a < icu->totvert; a++, bezt++) {
+               /* IPO_DISPBITS is used for displaying curves for bitflag 
variables */
+               if (disptype == IPO_DISPBITS) {
+                       /*if (G.v2d->cur.xmin < bezt->vec[1][0] < 
G.v2d->cur.xmax) {*/
+                       short ok= 0;
                        
-                       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;
+                       if (edit) {
+                               if ((bezt->f2 & SELECT) == sel) 
+                                       ok= 1;
                        }
-
-                       /* 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) */                
+                       else ok= 1;
                        
-                       a= ei->icu->totvert;
-                       bezt= ei->icu->bezt;
-                       bglBegin(GL_POINTS);
-                       
-                       while(a--) {
+                       if (ok) {
+                               int val= (int)bezt->vec[1][1];
+                               v1[0]= bezt->vec[1][0];
                                
-                               /* 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;
+                               for (b= 0; b < 31; b++) {
+                                       if (val & (1<<b)) {     
+                                               v1[1]= b + 1;
+                                               bglVertex3fv(v1);
                                        }
-                                       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) {
-                                               /* Only the vertex of the line, 
the
-                                                * handler are draw below.
-                                                */
-                                               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();
-
-                       if (ei->flag & IPO_EDIT) {
-                               /* Now draw the two vertex of the handler,
-                                * need split it because we can't call 
glPointSize
-                                * in the middle of a glBegin/glEnd also the
-                                * bug comment before.
+                       /*}*/
+               } 
+               else { /* normal (non bit) curves */
+                       if (edit) {
+                               /* Only the vertex of the line, the
+                                * handler are draw below.
                                 */
-                               a= ei->icu->totvert;
-                               bezt= ei->icu->bezt;
+                               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();
+}
 
-                               
glPointSize(BIF_GetThemeValuef(TH_HANDLE_VERTEX_SIZE));
-
-                               if(sel) BIF_ThemeColor(TH_HANDLE_VERTEX_SELECT);
-                               else BIF_ThemeColor(TH_HANDLE_VERTEX);
-
-                               bglBegin(GL_POINTS);
-
-                               while(a--) {
-                                       if (ei->disptype!=IPO_DISPBITS) {
-                                               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]);
-                                                       }
-                                               }
-                                       }
-                                       bezt++;
-                               }
-                               bglEnd();
-
-                               /* The color are always reset (see the while)
-                                * but the point size not so we reset now.
+/* helper func - draw handle vertices only for an IPO-curve (if it is in 
EditMode) */
+static void draw_ipovertices_handles(IpoCurve *icu, short disptype, short sel)
+{
+       BezTriple *bezt= icu->bezt;
+       int a;
+       
+       /* Handles can be draw with different size to see them better */
+       glPointSize(BIF_GetThemeValuef(TH_HANDLE_VERTEX_SIZE));
+       
+       /* set handle color */
+       if (sel) BIF_ThemeColor(TH_HANDLE_VERTEX_SELECT);
+       else BIF_ThemeColor(TH_HANDLE_VERTEX);
+       
+       bglBegin(GL_POINTS);
+       for (a= 0; a < icu->totvert; a++, bezt++) {
+               if (disptype != IPO_DISPBITS) {
+                       if (icu->ipo == IPO_BEZ) {
+                               /* Draw the editmode hendels for a bezier curve 
(others don't have handles) 
+                                * if their selection status matches the 
selection status we're drawing for
                                 */
-                               glPointSize(BIF_GetThemeValuef(TH_VERTEX_SIZE));
+                               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]);
                        }
                }
        }
+       bglEnd();
        
+       /* The color are always reset (see the while)
+        * but the point size not so we reset now.
+        */
+       glPointSize(BIF_GetThemeValuef(TH_VERTEX_SIZE));
+}
+
+static void draw_ipovertices(int sel)
+{
+       EditIpo *ei= G.sipo->editipo;
+       int nr, val = 0;
+       
+       /* this shouldn't get called while drawing in selection-buffer anyway */
+       if (G.f & G_PICKSEL) return;
+       
+       glPointSize(BIF_GetThemeValuef(TH_VERTEX_SIZE));
+       
+       for (nr=0; nr<G.sipo->totipo; nr++, ei++) {
+               if ISPOIN(ei, flag & IPO_VISIBLE, icu) {
+                       /* select colors to use to draw keyframes */
+                       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) 
+                        */             
+                       
+                       /* draw keyframes, then the handles (if in editmode) */
+                       draw_ipovertices_keyframes(ei->icu, 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)
+                               draw_ipovertices_handles(ei->icu, ei->disptype, 
sel);
+               }
+       }
+       
        glPointSize(1.0);
 }
 
+/* draw lines for IPO-curve handles only (this is only done in EditMode) */
 static void draw_ipohandles(int sel)
 {
        extern unsigned int nurbcol[];
@@ -1297,14 +1309,13 @@
        else col= nurbcol;
        
        ei= G.sipo->editipo;
-       for(a=0; a<G.sipo->totipo; a++, ei++) {
+       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) {
+                       if (ei->icu->ipo==IPO_BEZ) {
                                bezt= ei->icu->bezt;
                                b= ei->icu->totvert;
-                               while(b--) {
-                                       
-                                       if( (bezt->f2 & SELECT)==sel) {
+                               for (b= 0; b < ei->icu->totvert; b++, bezt++) {
+                                       if ((bezt->f2 & SELECT)==sel) {
                                                fp= bezt->vec[0];
                                                cpack(col[bezt->h1]);
                                                
@@ -1317,7 +1328,9 @@
                                                glVertex2fv(fp+3); 
glVertex2fv(fp+6); 
                                                glEnd();
                                        }
-                                       else if( (bezt->f1 & SELECT)==sel) {
+                                       
+                                       // TODO: it would be better if these 
weren't checked in sequence
+                                       else if ((bezt->f1 & SELECT)==sel) {
                                                fp= bezt->vec[0];
                                                cpack(col[bezt->h1]);
                                                
@@ -1325,7 +1338,7 @@
                                                glVertex2fv(fp); 
glVertex2fv(fp+3); 
                                                glEnd();
                                        }
-                                       else if( (bezt->f3 & SELECT)==sel) {
+                                       else if ((bezt->f3 & SELECT)==sel) {
                                                fp= bezt->vec[1];
                                                cpack(col[bezt->h2]);
                                                
@@ -1333,15 +1346,13 @@
                                                glVertex2fv(fp); 
glVertex2fv(fp+3); 
                                                glEnd();
                                        }
-                                       
-                                       bezt++;
                                }
                        }
                }
        }
 }
 
-/* draw one repeat of an ipo-curve - bitflag curve only (this is evil stuff to 
expose to user like this) */
+/* 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, float cycxofs)
 {
        BezTriple *bezt= icu->bezt;
@@ -1384,7 +1395,7 @@
        }
 }
 
-/* draw one repeat of an ipo-curve - normal curve */
+/* helper func - draw one repeat of an ipo-curve: normal curve */
 static void draw_ipocurve_repeat_normal (IpoCurve *icu, float cycxofs, float 
cycyofs, float *facp)
 {
        BezTriple *prevbezt= icu->bezt;


_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to