Revision: 17033 http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=17033 Author: aligorith Date: 2008-10-12 02:13:25 +0200 (Sun, 12 Oct 2008)
Log Message: ----------- Grease Pencil Bugfixs: - Eraser now works in Sequence Editor. Cleaned up the code that handles Sequencer coordinate-conversions so that it should be a bit faster (doesn't need to recalculate offsets+scaling for every point that is made). - Fixed mistake made in previous commit that made the pressure value (for tablets) an integer instead or a float. This should solve some of the reports of bits of strokes being missed on tablets. Modified Paths: -------------- trunk/blender/source/blender/src/drawgpencil.c trunk/blender/source/blender/src/gpencil.c Modified: trunk/blender/source/blender/src/drawgpencil.c =================================================================== --- trunk/blender/source/blender/src/drawgpencil.c 2008-10-11 23:48:37 UTC (rev 17032) +++ trunk/blender/source/blender/src/drawgpencil.c 2008-10-12 00:13:25 UTC (rev 17033) @@ -958,6 +958,7 @@ else zoomx = zoomy = zoom; + /* calculate transforms (Note: we use ibuf here, as we have it) */ sizex= zoomx * ibuf->x; sizey= zoomy * ibuf->y; offsx= (sa->winx-sizex)/2 + sseq->xof; Modified: trunk/blender/source/blender/src/gpencil.c =================================================================== --- trunk/blender/source/blender/src/gpencil.c 2008-10-11 23:48:37 UTC (rev 17032) +++ trunk/blender/source/blender/src/gpencil.c 2008-10-12 00:13:25 UTC (rev 17033) @@ -1096,7 +1096,12 @@ typedef struct tGPsdata { ScrArea *sa; /* area where painting originated */ View2D *v2d; /* needed for GP_STROKE_2DSPACE */ + ImBuf *ibuf; /* needed for GP_STROKE_2DIMAGE */ + struct IBufViewSettings { + int offsx, offsy; /* offsets */ + int sizex, sizey; /* dimensions to use as scale-factor */ + } im2d_settings; /* needed for GP_STROKE_2DIMAGE */ bGPdata *gpd; /* gp-datablock layer comes from */ bGPDlayer *gpl; /* layer we're working on */ @@ -1108,8 +1113,8 @@ short mval[2]; /* current mouse-position */ short mvalo[2]; /* previous recorded mouse-position */ - short pressure; /* current stylus pressure */ - short opressure; /* previous stylus pressure */ + float pressure; /* current stylus pressure */ + float opressure; /* previous stylus pressure */ short radius; /* radius of influence for eraser */ } tGPsdata; @@ -1213,43 +1218,20 @@ } /* 2d - on image 'canvas' (assume that p->v2d is set) */ - else if ((gpd->sbuffer_sflag & GP_STROKE_2DIMAGE) && (p->v2d)) { - /* for now - space specific */ - switch (p->sa->spacetype) { - case SPACE_SEQ: /* sequencer */ - { - SpaceSeq *sseq= (SpaceSeq *)p->sa->spacedata.first; - int sizex, sizey, offsx, offsy, rectx, recty; - float zoom, zoomx, zoomy; - - /* calculate zoom factor */ - zoom= SEQ_ZOOM_FAC(sseq->zoom); - if (sseq->mainb == SEQ_DRAW_IMG_IMBUF) { - zoomx = zoom * ((float)G.scene->r.xasp / (float)G.scene->r.yasp); - zoomy = zoom; - } - else - zoomx = zoomy = zoom; - - /* calculate rect size */ - rectx= (G.scene->r.size*G.scene->r.xsch)/100; - recty= (G.scene->r.size*G.scene->r.ysch)/100; - sizex= zoomx * rectx; - sizey= zoomy * recty; - offsx= (p->sa->winx-sizex)/2 + sseq->xof; - offsy= (p->sa->winy-sizey)/2 + sseq->yof; - - /* calculate new points */ - out[0]= (float)(mval[0] - offsx) / (float)sizex; - out[1]= (float)(mval[1] - offsy) / (float)sizey; - } - break; - - default: /* just use raw mouse coordinates - BAD! */ - out[0]= mval[0]; - out[1]= mval[1]; - break; - } + else if (gpd->sbuffer_sflag & GP_STROKE_2DIMAGE) { + int sizex, sizey, offsx, offsy; + + /* get stored settings + * - assume that these have been set already (there are checks that set sane 'defaults' just in case) + */ + sizex= p->im2d_settings.sizex; + sizey= p->im2d_settings.sizey; + offsx= p->im2d_settings.offsx; + offsy= p->im2d_settings.offsy; + + /* calculate new points */ + out[0]= (float)(mval[0] - offsx) / (float)sizex; + out[1]= (float)(mval[1] - offsy) / (float)sizey; } /* 2d - relative to screen (viewport area) */ @@ -1574,9 +1556,17 @@ y0= xyval[1]; } else if (gps->flag & GP_STROKE_2DIMAGE) { - ipoco_to_areaco_noclip(p->v2d, &gps->points->x, xyval); - x0= xyval[0]; - y0= xyval[1]; + int offsx, offsy, sizex, sizey; + + /* get stored settings */ + sizex= p->im2d_settings.sizex; + sizey= p->im2d_settings.sizey; + offsx= p->im2d_settings.offsx; + offsy= p->im2d_settings.offsy; + + /* calculate new points */ + x0= (gps->points->x * sizex) + offsx; + y0= (gps->points->y * sizey) + offsy; } else { x0= (gps->points->x / 1000 * p->sa->winx); @@ -1622,13 +1612,20 @@ y1= xyval[1]; } else if (gps->flag & GP_STROKE_2DIMAGE) { - ipoco_to_areaco_noclip(p->v2d, &pt1->x, xyval); - x0= xyval[0]; - y0= xyval[1]; + int offsx, offsy, sizex, sizey; - ipoco_to_areaco_noclip(p->v2d, &pt2->x, xyval); - x1= xyval[0]; - y1= xyval[1]; + /* get stored settings */ + sizex= p->im2d_settings.sizex; + sizey= p->im2d_settings.sizey; + offsx= p->im2d_settings.offsx; + offsy= p->im2d_settings.offsy; + + /* calculate new points */ + x0= (pt1->x * sizex) + offsx; + y0= (pt1->y * sizey) + offsy; + + x1= (pt2->x * sizex) + offsx; + y1= (pt2->y * sizey) + offsy; } else { x0= (pt1->x / 1000 * p->sa->winx); @@ -1800,6 +1797,10 @@ /* clear out buffer (stored in gp-data) in case something contaminated it */ gp_session_validatebuffer(p); + + /* set 'default' im2d_settings just in case something that uses this doesn't set it */ + p->im2d_settings.sizex= 1; + p->im2d_settings.sizey= 1; } /* cleanup after a painting session */ @@ -1870,7 +1871,35 @@ break; case SPACE_SEQ: { + SpaceSeq *sseq= (SpaceSeq *)p->sa->spacedata.first; + int rectx, recty; + float zoom, zoomx, zoomy; + + /* set draw 2d-stroke flag */ p->gpd->sbuffer_sflag |= GP_STROKE_2DIMAGE; + + /* calculate zoom factor */ + zoom= SEQ_ZOOM_FAC(sseq->zoom); + if (sseq->mainb == SEQ_DRAW_IMG_IMBUF) { + zoomx = zoom * ((float)G.scene->r.xasp / (float)G.scene->r.yasp); + zoomy = zoom; + } + else + zoomx = zoomy = zoom; + + /* calculate rect size to use to calculate the size of the drawing area + * - We use the size of the output image not the size of the ibuf being shown + * as it is too messy getting the ibuf (and could be too slow). This should be + * a reasonable for most cases anyway. + */ + rectx= (G.scene->r.size * G.scene->r.xsch) / 100; + recty= (G.scene->r.size * G.scene->r.ysch) / 100; + + /* set offset and scale values for opertations to use */ + p->im2d_settings.sizex= zoomx * rectx; + p->im2d_settings.sizey= zoomy * recty; + p->im2d_settings.offsx= (p->sa->winx-p->im2d_settings.sizex)/2 + sseq->xof; + p->im2d_settings.offsy= (p->sa->winy-p->im2d_settings.sizey)/2 + sseq->yof; } break; case SPACE_IMAGE: _______________________________________________ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org http://lists.blender.org/mailman/listinfo/bf-blender-cvs