Revision: 15755
          
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=15755
Author:   aligorith
Date:     2008-07-25 09:11:08 +0200 (Fri, 25 Jul 2008)

Log Message:
-----------
Grease Pencil - Backend work:

Just preparation work for an eraser tool (as well as the code of a failed 
attempt at an implementation).

Modified Paths:
--------------
    trunk/blender/source/blender/include/BDR_gpencil.h
    trunk/blender/source/blender/makesdna/DNA_gpencil_types.h
    trunk/blender/source/blender/src/drawgpencil.c
    trunk/blender/source/blender/src/editnode.c
    trunk/blender/source/blender/src/gpencil.c
    trunk/blender/source/blender/src/space.c

Modified: trunk/blender/source/blender/include/BDR_gpencil.h
===================================================================
--- trunk/blender/source/blender/include/BDR_gpencil.h  2008-07-25 05:39:48 UTC 
(rev 15754)
+++ trunk/blender/source/blender/include/BDR_gpencil.h  2008-07-25 07:11:08 UTC 
(rev 15755)
@@ -69,6 +69,6 @@
 void gpencil_delete_menu(void);
 
 //short gpencil_paint(short mousebutton);
-short gpencil_do_paint(struct ScrArea *sa);
+short gpencil_do_paint(struct ScrArea *sa, short mousebutton);
 
 #endif /*  BDR_GPENCIL_H */

Modified: trunk/blender/source/blender/makesdna/DNA_gpencil_types.h
===================================================================
--- trunk/blender/source/blender/makesdna/DNA_gpencil_types.h   2008-07-25 
05:39:48 UTC (rev 15754)
+++ trunk/blender/source/blender/makesdna/DNA_gpencil_types.h   2008-07-25 
07:11:08 UTC (rev 15755)
@@ -59,6 +59,8 @@
 #define GP_STROKE_3DSPACE              (1<<0)
        /* stroke is in 2d-space */
 #define GP_STROKE_2DSPACE              (1<<1)
+       /* stroke is an "eraser" stroke */
+#define GP_STROKE_ERASER               (1<<2)
 
 
 /* Grease-Pencil Annotations - 'Frame'

Modified: trunk/blender/source/blender/src/drawgpencil.c
===================================================================
--- trunk/blender/source/blender/src/drawgpencil.c      2008-07-25 05:39:48 UTC 
(rev 15754)
+++ trunk/blender/source/blender/src/drawgpencil.c      2008-07-25 07:11:08 UTC 
(rev 15755)
@@ -415,6 +415,45 @@
        }
 }
 
+/* draw a set of strokes */
+static void gp_draw_strokes (bGPDframe *gpf, int winx, int winy, int dflag, 
short debug, 
+                                                        short lthick, float 
color[4])
+{
+       bGPDstroke *gps;
+       
+       /* set color first (may need to reset it again later too) */
+       glColor4f(color[0], color[1], color[2], color[3]);
+       
+       for (gps= gpf->strokes.first; gps; gps= gps->next) {    
+               /* handle 'eraser' strokes differently */
+               if (gps->flag & GP_STROKE_ERASER) {
+                       // FIXME: this method is a failed experiment
+#if 0
+                       /* draw stroke twice, first time with 'white' to set a 
mask to invert
+                        * contents of framebuffer, then second-time the same 
again but to restore
+                        * the contents
+                        */
+                       glEnable(GL_COLOR_LOGIC_OP); 
+                       glLogicOp(GL_XOR);
+                       
+                       glColor4f(1, 1, 1, 1); /* white */
+                       
+                       gp_draw_stroke(gps->points, gps->totpoints, lthick, 
dflag, gps->flag, 0, winx, winy);
+                       gp_draw_stroke(gps->points, gps->totpoints, lthick, 
dflag, gps->flag, 0, winx, winy);
+                       
+                       glDisable(GL_COLOR_LOGIC_OP);
+                       
+                       /* reset color for drawing next stroke */
+                       glColor4f(color[0], color[1], color[2], color[3]);
+#endif
+               }
+               else {
+                       /* just draw the stroke once */
+                       gp_draw_stroke(gps->points, gps->totpoints, lthick, 
dflag, gps->flag, debug, winx, winy);
+               }
+       }
+}
+
 /* draw grease-pencil datablock */
 static void gp_draw_data (bGPdata *gpd, int winx, int winy, int dflag)
 {
@@ -430,11 +469,10 @@
        /* loop over layers, drawing them */
        for (gpl= gpd->layers.first; gpl; gpl= gpl->next) {
                bGPDframe *gpf;
-               bGPDstroke *gps;
                
                short debug = (gpl->flag & GP_LAYER_DRAWDEBUG) ? 1 : 0;
                short lthick= gpl->thickness;
-               float color[4];
+               float color[4], tcolor[4];
                
                /* don't draw layer if hidden */
                if (gpl->flag & GP_LAYER_HIDE) 
@@ -452,6 +490,7 @@
                /* set color, stroke thickness, and point size */
                glLineWidth(lthick);
                QUATCOPY(color, gpl->color); // just for copying 4 array 
elements
+               QUATCOPY(tcolor, gpl->color); // additional copy of color (for 
ghosting)
                glColor4f(color[0], color[1], color[2], color[3]);
                glPointSize(gpl->thickness + 2);
                
@@ -467,11 +506,8 @@
                                        /* check if frame is drawable */
                                        if ((gpf->framenum - gf->framenum) <= 
gpl->gstep) {
                                                /* alpha decreases with 
distance from curframe index */
-                                               glColor4f(color[0], color[1], 
color[2], (color[3]-(i*0.7)));
-                                               
-                                               for (gps= gf->strokes.first; 
gps; gps= gps->next) {     
-                                                       
gp_draw_stroke(gps->points, gps->totpoints, lthick, dflag, gps->flag, debug, 
winx, winy);
-                                               }
+                                               tcolor[3] = color[3] - (i * 
0.7);
+                                               gp_draw_strokes(gpf, winx, 
winy, dflag, debug, lthick, tcolor);
                                        }
                                        else 
                                                break;
@@ -482,11 +518,8 @@
                                        /* check if frame is drawable */
                                        if ((gf->framenum - gpf->framenum) <= 
gpl->gstep) {
                                                /* alpha decreases with 
distance from curframe index */
-                                               glColor4f(color[0], color[1], 
color[2], (color[3]-(i*0.7)));
-                                               
-                                               for (gps= gf->strokes.first; 
gps; gps= gps->next) {                                                          
   
-                                                       
gp_draw_stroke(gps->points, gps->totpoints, lthick, dflag, gps->flag, debug, 
winx, winy);
-                                               }
+                                               tcolor[3] = color[3] - (i * 
0.7);
+                                               gp_draw_strokes(gpf, winx, 
winy, dflag, debug, lthick, tcolor);
                                        }
                                        else 
                                                break;
@@ -497,19 +530,14 @@
                        }
                        else {
                                /* draw the strokes for the ghost frames (at 
half of the alpha set by user) */
-                               glColor4f(color[0], color[1], color[2], 
(color[3] / 7));
-                               
                                if (gpf->prev) {
-                                       for (gps= gpf->prev->strokes.first; 
gps; gps= gps->next) {
-                                               gp_draw_stroke(gps->points, 
gps->totpoints, lthick, dflag, gps->flag, debug, winx, winy);
-                                       }
+                                       tcolor[3] = (color[3] / 7);
+                                       gp_draw_strokes(gpf, winx, winy, dflag, 
debug, lthick, tcolor);
                                }
                                
-                               glColor4f(color[0], color[1], color[2], 
(color[3] / 4));
                                if (gpf->next) {
-                                       for (gps= gpf->next->strokes.first; 
gps; gps= gps->next) {      
-                                               gp_draw_stroke(gps->points, 
gps->totpoints, lthick, dflag, gps->flag, debug, winx, winy);
-                                       }
+                                       tcolor[3] = (color[3] / 4);
+                                       gp_draw_strokes(gpf, winx, winy, dflag, 
debug, lthick, tcolor);
                                }
                                
                                /* restore alpha */
@@ -518,9 +546,8 @@
                }
                
                /* draw the strokes already in active frame */
-               for (gps= gpf->strokes.first; gps; gps= gps->next) {    
-                       gp_draw_stroke(gps->points, gps->totpoints, lthick, 
dflag, gps->flag, debug, winx, winy);
-               }
+               tcolor[3]= color[3];
+               gp_draw_strokes(gpf, winx, winy, dflag, debug, lthick, tcolor);
                
                /* Check if may need to draw the active stroke cache, only if 
this layer is the active layer
                 * that is being edited. (Stroke cache is currently stored in 
gp-data)

Modified: trunk/blender/source/blender/src/editnode.c
===================================================================
--- trunk/blender/source/blender/src/editnode.c 2008-07-25 05:39:48 UTC (rev 
15754)
+++ trunk/blender/source/blender/src/editnode.c 2008-07-25 07:11:08 UTC (rev 
15755)
@@ -2400,7 +2400,7 @@
                
                switch(event) {
                case LEFTMOUSE:
-                       if(gpencil_do_paint(sa)) {
+                       if(gpencil_do_paint(sa, L_MOUSE)) {
                                return;
                        }
                        else if(fromlib) {
@@ -2421,7 +2421,10 @@
                        break;
                        
                case RIGHTMOUSE: 
-                       if(find_indicated_socket(snode, &actnode, &actsock, 
SOCK_IN)) {
+                       if(gpencil_do_paint(sa, R_MOUSE)) {
+                               return;
+                       }
+                       else if(find_indicated_socket(snode, &actnode, 
&actsock, SOCK_IN)) {
                                if(actsock->flag & SOCK_SEL) {
                                        snode->edittree->selin= NULL;
                                        actsock->flag&= ~SOCK_SEL;

Modified: trunk/blender/source/blender/src/gpencil.c
===================================================================
--- trunk/blender/source/blender/src/gpencil.c  2008-07-25 05:39:48 UTC (rev 
15754)
+++ trunk/blender/source/blender/src/gpencil.c  2008-07-25 07:11:08 UTC (rev 
15755)
@@ -972,7 +972,7 @@
 /* ---------- 'Paint' Tool ------------ */
 
 /* init new stroke */
-static void gp_paint_initstroke (tGPsdata *p)
+static void gp_paint_initstroke (tGPsdata *p, short mousebutton)
 {      
        /* get active layer (or add a new one if non-existent) */
        p->gpl= gpencil_layer_getactive(p->gpd);
@@ -995,8 +995,17 @@
        }
        else
                p->gpf->flag |= GP_FRAME_PAINT;
+       
+       /* set 'eraser' for this stroke if using eraser or right-mouse in 
action */
+       if ( get_activedevice() == 2 || (mousebutton & R_MOUSE) ) {
+               p->gpd->sbuffer_sflag |= GP_STROKE_ERASER;
                
-       /* check if points will need to be made in 3d-space */
+               // for now: eraser isn't ready for prime-time yet, so no 
painting available here yet
+               p->status= GP_STATUS_ERROR;
+               return;
+       }
+       
+       /* check if points will need to be made in view-aligned space */
        if (p->gpd->flag & GP_DATA_VIEWALIGN) {
                switch (p->sa->spacetype) {
                        case SPACE_VIEW3D:
@@ -1069,7 +1078,7 @@
                gp_session_cleanup(&p);
                return 0;
        }
-       gp_paint_initstroke(&p);
+       gp_paint_initstroke(&p, mousebutton);
        if (p.status == GP_STATUS_ERROR) {
                gp_session_cleanup(&p);
                return 0;
@@ -1158,10 +1167,9 @@
 /* All event (loops) handling checking if stroke drawing should be initiated
  * should call this function.
  */
-short gpencil_do_paint (ScrArea *sa)
+short gpencil_do_paint (ScrArea *sa, short mousebutton)
 {
        bGPdata *gpd = gpencil_data_getactive(sa);
-       short mousebutton = L_MOUSE; /* for now, this is always on L_MOUSE*/
        short retval= 0;
        
        /* check if possible to do painting */

Modified: trunk/blender/source/blender/src/space.c
===================================================================
--- trunk/blender/source/blender/src/space.c    2008-07-25 05:39:48 UTC (rev 
15754)
+++ trunk/blender/source/blender/src/space.c    2008-07-25 07:11:08 UTC (rev 
15755)
@@ -1205,9 +1205,12 @@
                                        return; /* return if event was 
processed (swallowed) by handler(s) */
                        }
                        
-                       if(gpencil_do_paint(sa)) return;
+                       if(gpencil_do_paint(sa, L_MOUSE)) return;
                        if(BIF_do_manipulator(sa)) return;
                }
+               else if(event==RIGHTMOUSE) {
+                       if(gpencil_do_paint(sa, R_MOUSE)) return;
+               }
                
                /* swap mouse buttons based on user preference */
                if (U.flag & USER_LMOUSESELECT) {
@@ -4825,9 +4828,12 @@
                if( uiDoBlocks(&curarea->uiblocks, event, 1)!=UI_NOTHING ) 
event= 0;
                
                /* grease-pencil defaults to leftmouse */
-               if(event==LEFTMOUSE) {
-                       if(gpencil_do_paint(sa)) return;
+               if (event == LEFTMOUSE) {
+                       if(gpencil_do_paint(sa, L_MOUSE)) return;
                }
+               else if (event == RIGHTMOUSE) {
+                       if(gpencil_do_paint(sa, R_MOUSE)) return;
+               }
                
                /* swap mouse buttons based on user preference */
                if (U.flag & USER_LMOUSESELECT) {


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

Reply via email to