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