Revision: 16222
          
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=16222
Author:   aligorith
Date:     2008-08-22 10:36:29 +0200 (Fri, 22 Aug 2008)

Log Message:
-----------
Grease Pencil: WIP commit (nothing new)

Just a little commit so that I can transfer some changes back over to laptop. 
* Line drawing should now be improved for most cases, but acute angles still 
need more work to reduce 'shrinking' artifacts. As such, this is still hidden 
behind 'rt' setting
* Preparation work for Grease-Pencil in Image Editor, and also 'Stick to View' 
for Image/Sequence editors.

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

Modified: trunk/blender/source/blender/include/BDR_gpencil.h
===================================================================
--- trunk/blender/source/blender/include/BDR_gpencil.h  2008-08-22 06:02:01 UTC 
(rev 16221)
+++ trunk/blender/source/blender/include/BDR_gpencil.h  2008-08-22 08:36:29 UTC 
(rev 16222)
@@ -43,7 +43,6 @@
 /* Temporary 'Stroke Point' data */
 typedef struct tGPspoint {
        short x, y;                             /* x and y coordinates of 
cursor (in relative to area) */
-       float xf, yf;                   /* same as x and y, but as floats */
        float pressure;                 /* pressure of tablet at this point */
 } tGPspoint;
 

Modified: trunk/blender/source/blender/include/BIF_drawgpencil.h
===================================================================
--- trunk/blender/source/blender/include/BIF_drawgpencil.h      2008-08-22 
06:02:01 UTC (rev 16221)
+++ trunk/blender/source/blender/include/BIF_drawgpencil.h      2008-08-22 
08:36:29 UTC (rev 16222)
@@ -28,15 +28,18 @@
 #ifndef BIF_DRAWGPENCIL_H
 #define BIF_DRAWGPENCIL_H
 
+
+struct bGPdata;
 struct ScrArea;
 struct View3D;
 struct SpaceNode;
 struct SpaceSeq;
-struct bGPdata;
 struct uiBlock;
+struct ImBuf;
 
 short draw_gpencil_panel(struct uiBlock *block, struct bGPdata *gpd, struct 
ScrArea *sa); 
 
+void draw_gpencil_2dimage(struct ScrArea *sa, struct ImBuf *ibuf);
 void draw_gpencil_2dview(struct ScrArea *sa, short onlyv2d);
 void draw_gpencil_3dview(struct ScrArea *sa, short only3d);
 void draw_gpencil_oglrender(struct View3D *v3d, int winx, int winy);

Modified: trunk/blender/source/blender/makesdna/DNA_gpencil_types.h
===================================================================
--- trunk/blender/source/blender/makesdna/DNA_gpencil_types.h   2008-08-22 
06:02:01 UTC (rev 16221)
+++ trunk/blender/source/blender/makesdna/DNA_gpencil_types.h   2008-08-22 
08:36:29 UTC (rev 16222)
@@ -59,8 +59,10 @@
 #define GP_STROKE_3DSPACE              (1<<0)
        /* stroke is in 2d-space */
 #define GP_STROKE_2DSPACE              (1<<1)
+       /* stroke is in 2d-space (but with special 'image' scaling) */
+#define GP_STROKE_2DIMAGE              (1<<2)
        /* stroke is an "eraser" stroke */
-#define GP_STROKE_ERASER               (1<<2)
+#define GP_STROKE_ERASER               (1<<15)
 
 
 /* Grease-Pencil Annotations - 'Frame'

Modified: trunk/blender/source/blender/makesdna/DNA_space_types.h
===================================================================
--- trunk/blender/source/blender/makesdna/DNA_space_types.h     2008-08-22 
06:02:01 UTC (rev 16221)
+++ trunk/blender/source/blender/makesdna/DNA_space_types.h     2008-08-22 
08:36:29 UTC (rev 16222)
@@ -247,6 +247,7 @@
        float xof, yof;                                 /* user defined offset, 
image is centered */
        float centx, centy;                             /* storage for offset 
while render drawing */
        
+       struct bGPdata *gpd;                    /* grease pencil data */
 } SpaceImage;
 
 typedef struct SpaceNla {

Modified: trunk/blender/source/blender/src/drawgpencil.c
===================================================================
--- trunk/blender/source/blender/src/drawgpencil.c      2008-08-22 06:02:01 UTC 
(rev 16221)
+++ trunk/blender/source/blender/src/drawgpencil.c      2008-08-22 08:36:29 UTC 
(rev 16222)
@@ -37,6 +37,9 @@
 
 #include "MEM_guardedalloc.h"
 
+#include "IMB_imbuf.h"
+#include "IMB_imbuf_types.h"
+
 #include "BMF_Api.h"
 
 #include "BLI_arithb.h"
@@ -317,6 +320,7 @@
        GP_DRAWDATA_NOSTATUS    = (1<<0),       /* don't draw status info */
        GP_DRAWDATA_ONLY3D              = (1<<1),       /* only draw 3d-strokes 
*/
        GP_DRAWDATA_ONLYV2D             = (1<<2),       /* only draw 'canvas' 
strokes */
+       GP_DRAWDATA_ONLYI2D             = (1<<3),       /* only draw 'image' 
strokes */
 };
 
 /* ----- Tool Buffer Drawing ------ */
@@ -466,18 +470,22 @@
        }
        else { /* tesselation code: currently only enabled with rt != 0 */
                bGPDspoint *pt1, *pt2;
-               float p0[2], p1[2], pm[2];
+               float pm[2];
                int i;
+               short n;
                
                glShadeModel(GL_FLAT);
-               glBegin(GL_QUAD_STRIP);
                
+               glPointSize(3.0f); // temp
+               
+               for (n= 0; n < 2; n++) { // temp
+               glBegin((n)?GL_POINTS:GL_QUADS);
+               
                for (i=0, pt1=points, pt2=points+1; i < (totpoints-1); i++, 
pt1++, pt2++) {
                        float s0[2], s1[2];             /* segment 'center' 
points */
                        float t0[2], t1[2];             /* tesselated 
coordinates */
                        float m1[2], m2[2];             /* gradient and normal 
*/
-                       float pthick, dist;             /* thickness at segment 
point, and length of segment */
-                       float sminorang;                /* minor angle between 
strokes */
+                       float pthick;                   /* thickness at segment 
point */
                        
                        /* get x and y coordinates from points */
                        if (sflag & GP_STROKE_2DSPACE) {
@@ -494,94 +502,74 @@
                        /* calculate gradient and normal - 'angle'=(ny/nx) */
                        m1[1]= s1[1] - s0[1];           
                        m1[0]= s1[0] - s0[0];
-                       dist = Vec2Lenf(s0, s1);
-                       m2[1]= -(m1[0]) / dist;
-                       m2[0]= m1[1] / dist;
+                       m2[1]= -m1[0];
+                       m2[0]= m1[1];
+                       Normalize2(m2);
                        
-                       /* if the first segment, initialise the first segment 
using segment's normal */
-                       if (i == 0) {   
-                               pthick= (pt1->pressure * thickness);
-                               
+                       /* always use pressure from first point here */
+                       pthick= (pt1->pressure * thickness);
+                       
+                       /* if the first segment, start of segment is segment's 
normal */
+                       if (i == 0) {
                                // TODO: also draw/do a round end-cap first
                                
-                               p0[0]= s0[0] - (pthick * m2[0]);
-                               p0[1]= s0[1] - (pthick * m2[1]);
-                               p1[0]= s1[0] + (pthick * m2[0]);
-                               p1[1]= s1[1] + (pthick * m2[1]);
+                               /* calculate points for start of segment */
+                               t0[0]= s0[0] - (pthick * m2[0]);
+                               t0[1]= s0[1] - (pthick * m2[1]);
+                               t1[0]= s0[0] + (pthick * m2[0]);
+                               t1[1]= s0[1] + (pthick * m2[1]);
                                
-                               Vec2Copyf(pm, m1);
+                               /* draw this line only once */
+                               glVertex2fv(t0);
+                               glVertex2fv(t1);
                        }
-                       
-                       /* if the minor angle between the current segment and 
the previous one is less than 90 degrees */
-                       if (i)
-                               sminorang= NormalizedVecAngle2_2D(pm, m1);
-                       else
-                               sminorang= 0.0f;
-                       
-                       if ((IS_EQ(sminorang, 0)==0) && (abs(sminorang) < 
M_PI_2) ) 
-                       {
-                               float closep[2];
+                       /* if not the first segment, use bisector of angle 
between segments */
+                       else {
+                               float mb[2];    /* bisector normal */
                                
-                               /* recalculate startpoint of segment, where the 
new start-line:
-                                *      - starts a new gl-quad-strip
-                                *      - uses the vert of old startpoint 
closer to our endpoint
-                                *      - distance between new startpoints = 
distance between old startpoints
-                                *      - new startpoints occur on same 
gradient as old segment does (has potential for some 'minor' overlap, but ok)
-                                */
+                               /* calculate gradient of bisector (as average 
of normals) */
+                               mb[0]= (pm[0] + m2[0]) / 2;
+                               mb[1]= (pm[1] + m2[1]) / 2;
+                               Normalize2(mb);
                                
-                               /* find the closer vertex, and distance between 
startpoints */
-                               if (Vec2Lenf(p0, s1) > Vec2Lenf(p1, s1))
-                                       Vec2Copyf(closep, p1);
-                               else
-                                       Vec2Copyf(closep, p0);
-                                       
-                               /* determine which side this closer vertex 
should be on */
-                               pthick= (pt1->pressure * thickness * 2);
-                               if ( ((closep[0] - s0[0]) > 0) || ((closep[1] - 
s0[1]) > 0) ) {
-                                       /* assumes this is the 'second' point, 
(i.e. the 'plus' one), so the other is subtracting */
-                                       p0[0]= closep[0] - (pthick * pm[0]);
-                                       p0[1]= closep[1] - (pthick * pm[1]);
-                                       p1[0]= closep[0];
-                                       p1[1]= closep[1];
-                               }
-                               else if ( ((closep[0] - s0[0]) < 0) || 
((closep[1] - s0[1]) < 0) ) {
-                                       /* assumes this is the 'first' point, 
(i.e. the 'minus' one), so the other is adding */
-                                       p0[0]= closep[0];
-                                       p0[1]= closep[1];
-                                       p1[0]= closep[0] + (pthick * pm[0]);
-                                       p1[1]= closep[1] + (pthick * pm[1]);
-                               }
+                               /* calculate points for start of segment */
+                               // FIXME: do we need extra padding for acute 
angles?
+                               t0[0]= s0[0] - (pthick * mb[0]);
+                               t0[1]= s0[1] - (pthick * mb[1]);
+                               t1[0]= s0[0] + (pthick * mb[0]);
+                               t1[1]= s0[1] + (pthick * mb[1]);
                                
-                               /* reset gl-states! */
-                               glEnd();
-                               glBegin(GL_QUAD_STRIP);                         
+                               /* draw this line twice (once for end of 
current segment, and once for start of next) */
+                               glVertex2fv(t1);
+                               glVertex2fv(t0);
+                               glVertex2fv(t0);
+                               glVertex2fv(t1);
                        }
                        
-                       /* do the end of this segment */
-                       pthick= (pt2->pressure * thickness);
-                       t0[0] = s1[0] - (pthick * m2[0]);
-                       t0[1] = s1[1] - (pthick * m2[1]);
-                       t1[0] = s1[0] + (pthick * m2[0]);
-                       t1[1] = s1[1] + (pthick * m2[1]);
-                       
-                       /* draw this segment */
-                       glVertex2f(p0[0], p0[1]);
-                       glVertex2f(p1[0], p1[1]);
-                       glVertex2f(t0[0], t0[1]);
-                       glVertex2f(t1[0], t1[1]);
-                       
-                       // TODO: draw end cap if last segment
+                       /* if last segment, also draw end of segment (defined 
as segment's normal) */
                        if (i == totpoints-2) {
-                       
+                               /* for once, we use second point's pressure 
(otherwise it won't be drawn) */
+                               pthick= (pt2->pressure * thickness);
+                               
+                               /* calculate points for end of segment */
+                               t0[0]= s1[0] - (pthick * m2[0]);
+                               t0[1]= s1[1] - (pthick * m2[1]);
+                               t1[0]= s1[0] + (pthick * m2[0]);
+                               t1[1]= s1[1] + (pthick * m2[1]);
+                               
+                               /* draw this line only once */
+                               glVertex2fv(t1);
+                               glVertex2fv(t0);
+                               
+                               // TODO: draw end cap as last step 
                        }
                        
-                       /* store current points for next segment to use */
-                       Vec2Copyf(p0, t0);
-                       Vec2Copyf(p1, t1);
-                       Vec2Copyf(pm, m1);
+                       /* store stroke's 'natural' normal for next stroke to 
use */
+                       Vec2Copyf(pm, m2);
                }
                
                glEnd();
+               }
        }
        
        /* draw debug points of curve on top? (original stroke points) */
@@ -626,6 +614,10 @@
                        continue;
                if (!(dflag & GP_DRAWDATA_ONLYV2D) && (gps->flag & 
GP_STROKE_2DSPACE))
                        continue;
+               if ((dflag & GP_DRAWDATA_ONLYI2D) && !(gps->flag & 
GP_STROKE_2DIMAGE))
+                       continue;
+               if (!(dflag & GP_DRAWDATA_ONLYI2D) && (gps->flag & 
GP_STROKE_2DIMAGE))
+                       continue;
                if ((gps->points == 0) || (gps->totpoints < 1))
                        continue;
                
@@ -796,6 +788,22 @@
 
 /* ----- Grease Pencil Sketches Drawing API ------ */
 
+/* draw grease-pencil sketches to specified 2d-view that uses ibuf corrections 
*/
+void draw_gpencil_2dimage (ScrArea *sa, ImBuf *ibuf)
+{
+       bGPdata *gpd;
+       int dflag = 0;
+       
+       /* check that we have grease-pencil stuff to draw */
+       if (ELEM(NULL, sa, ibuf)) return;
+       gpd= gpencil_data_getactive(sa);
+       if (gpd == NULL) return;
+       
+       /* draw it! */
+       dflag = (GP_DRAWDATA_ONLYI2D|GP_DRAWDATA_NOSTATUS);
+       gp_draw_data(gpd, sa->winx, sa->winy, dflag);
+}
+
 /* draw grease-pencil sketches to specified 2d-view assuming that matrices are 
already set correctly 
  * Note: this gets called twice - first time with onlyv2d=1 to draw 'canvas' 
strokes, second time with onlyv2d=0 for screen-aligned strokes
  */

Modified: trunk/blender/source/blender/src/gpencil.c

@@ Diff output truncated at 10240 characters. @@

_______________________________________________
Bf-blender-cvs mailing list
Bf-blender-cvs@blender.org
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to