Oops... forgot to note how to use this. With no objects selected, use the Alt-C hotkey
On Thu, Aug 28, 2008 at 1:02 AM, Joshua Leung <[EMAIL PROTECTED]> wrote: > Revision: 16270 > > http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=16270 > Author: aligorith > Date: 2008-08-27 15:02:44 +0200 (Wed, 27 Aug 2008) > > Log Message: > ----------- > == Grease Pencil - Conversions + Bugfixes == > > * New stuff: Grease Pencil strokes on the active layer can now be converted > to 3d curves (geometry). More work is still needed to make the result look > be more optimal (i.e. extruded curve) > > * Bugfix: Spacing between collapsed layers is more compact now > > Modified Paths: > -------------- > trunk/blender/source/blender/include/BDR_gpencil.h > trunk/blender/source/blender/include/BSE_drawipo.h > trunk/blender/source/blender/src/drawgpencil.c > trunk/blender/source/blender/src/drawipo.c > trunk/blender/source/blender/src/editobject.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-27 11:56:11 > UTC (rev 16269) > +++ trunk/blender/source/blender/include/BDR_gpencil.h 2008-08-27 13:02:44 > UTC (rev 16270) > @@ -76,6 +76,9 @@ > void gpencil_delete_operation(short mode); > void gpencil_delete_menu(void); > > +void gpencil_convert_operation(short mode); > +void gpencil_convert_menu(void); > + > //short gpencil_paint(short mousebutton); > short gpencil_do_paint(struct ScrArea *sa, short mousebutton); > > > Modified: trunk/blender/source/blender/include/BSE_drawipo.h > =================================================================== > --- trunk/blender/source/blender/include/BSE_drawipo.h 2008-08-27 11:56:11 > UTC (rev 16269) > +++ trunk/blender/source/blender/include/BSE_drawipo.h 2008-08-27 13:02:44 > UTC (rev 16270) > @@ -42,6 +42,7 @@ > struct EditIpo; > struct View2D; > struct rctf; > +struct SpaceLink; > > void calc_ipogrid(void); > void draw_ipogrid(void); > @@ -50,6 +51,8 @@ > void ipoco_to_areaco (struct View2D *v2d, float *vec, short > *mval); > void ipoco_to_areaco_noclip (struct View2D *v2d, float *vec, short > *mval); > > +struct View2D *spacelink_get_view2d(struct SpaceLink *sl); > + > void view2d_do_locks (struct ScrArea *cursa, int flag); > void view2d_zoom (struct View2D *v2d, float factor, > int winx, int winy); > void view2d_getscale (struct View2D *v2d, float *x, float *y); > > Modified: trunk/blender/source/blender/src/drawgpencil.c > =================================================================== > --- trunk/blender/source/blender/src/drawgpencil.c 2008-08-27 11:56:11 > UTC (rev 16269) > +++ trunk/blender/source/blender/src/drawgpencil.c 2008-08-27 13:02:44 > UTC (rev 16270) > @@ -177,7 +177,7 @@ > if (gpl->flag & (GP_LAYER_LOCKED|GP_LAYER_HIDE)) { > char name[256]; /* gpl->info is 128, but we need space for > 'locked/hidden' as well */ > > - height= 26; > + height= 0; > > /* visibility button (only if hidden but not locked!) */ > if ((gpl->flag & GP_LAYER_HIDE) && !(gpl->flag & > GP_LAYER_LOCKED)) > > Modified: trunk/blender/source/blender/src/drawipo.c > =================================================================== > --- trunk/blender/source/blender/src/drawipo.c 2008-08-27 11:56:11 UTC > (rev 16269) > +++ trunk/blender/source/blender/src/drawipo.c 2008-08-27 13:02:44 UTC > (rev 16270) > @@ -442,7 +442,7 @@ > else return 1; > } > > -static View2D *spacelink_get_view2d(SpaceLink *sl) > +View2D *spacelink_get_view2d(SpaceLink *sl) > { > if(sl->spacetype==SPACE_IPO) > return &((SpaceIpo *)sl)->v2d; > > Modified: trunk/blender/source/blender/src/editobject.c > =================================================================== > --- trunk/blender/source/blender/src/editobject.c 2008-08-27 11:56:11 > UTC (rev 16269) > +++ trunk/blender/source/blender/src/editobject.c 2008-08-27 13:02:44 > UTC (rev 16270) > @@ -172,6 +172,7 @@ > #include "BDR_drawobject.h" > #include "BDR_editcurve.h" > #include "BDR_unwrapper.h" > +#include "BDR_gpencil.h" > > #include <time.h> > #include "mydevice.h" > @@ -2827,7 +2828,10 @@ > if(G.scene->id.lib) return; > > obact= OBACT; > - if(obact==0) return; > + if(obact==0) { > + gpencil_convert_menu(); > + return; > + } > if(!obact->flag & SELECT) return; > if(G.obedit) return; > > > Modified: trunk/blender/source/blender/src/gpencil.c > =================================================================== > --- trunk/blender/source/blender/src/gpencil.c 2008-08-27 11:56:11 UTC > (rev 16269) > +++ trunk/blender/source/blender/src/gpencil.c 2008-08-27 13:02:44 UTC > (rev 16270) > @@ -46,7 +46,9 @@ > #include "BLI_blenlib.h" > > #include "DNA_listBase.h" > +#include "DNA_curve_types.h" > #include "DNA_gpencil_types.h" > +#include "DNA_object_types.h" > #include "DNA_scene_types.h" > #include "DNA_screen_types.h" > #include "DNA_space_types.h" > @@ -57,6 +59,7 @@ > #include "BKE_global.h" > #include "BKE_utildefines.h" > #include "BKE_blender.h" > +#include "BKE_curve.h" > > #include "BIF_gl.h" > #include "BIF_glutil.h" > @@ -74,6 +77,8 @@ > #include "BDR_gpencil.h" > #include "BIF_drawgpencil.h" > > +#include "BDR_editobject.h" > + > #include "BSE_drawipo.h" > #include "BSE_headerbuttons.h" > #include "BSE_view.h" > @@ -678,6 +683,152 @@ > gpencil_delete_operation(mode); > } > > +/* --------- Data Conversion ---------- */ > + > +/* convert the coordinates from the given stroke point into 3d-coordinates > */ > +static void gp_strokepoint_convertcoords (bGPDstroke *gps, bGPDspoint *pt, > float p3d[3]) > +{ > + if (gps->flag & GP_STROKE_3DSPACE) { > + /* directly use 3d-coordinates */ > + // FIXME: maybe we need to counterotate this for object > rotation? > + VecCopyf(p3d, &pt->x); > + } > + else { > + short mval[2], mx, my; > + float *fp= give_cursor(); > + float dvec[3]; > + > + /* get screen coordinate */ > + if (gps->flag & GP_STROKE_2DSPACE) { > + View2D *v2d= > spacelink_get_view2d(curarea->spacedata.first); > + ipoco_to_areaco_noclip(v2d, &pt->x, mval); > + } > + else { > + mval[0]= (pt->x / 1000 * curarea->winx); > + mval[1]= (pt->y / 1000 * curarea->winy); > + } > + mx= mval[0]; > + my= mval[1]; > + > + /* convert screen coordinate to 3d coordinates > + * - method taken from editview.c - mouse_cursor() > + */ > + project_short_noclip(fp, mval); > + window_to_3d(dvec, mval[0]-mx, mval[1]-my); > + VecSubf(p3d, fp, dvec); > + } > +} > + > +/* convert a given grease-pencil layer to a 3d-curve representation (using > current view if appropriate) */ > +static void gp_layer_to_curve (bGPdata *gpd, bGPDlayer *gpl) > +{ > + bGPDframe *gpf= gpencil_layer_getframe(gpl, CFRA, 0); > + bGPDstroke *gps; > + Object *ob; > + Curve *cu; > + float *fp= give_cursor(); > + char name[140]; > + > + /* error checking */ > + if (ELEM3(NULL, gpd, gpl, gpf)) > + return; > + > + /* only convert if there are any strokes on this layer's frame to > convert */ > + if (gpf->strokes.first == NULL) > + return; > + > + /* initialise the curve */ > + sprintf(name, "GP_%s", gpl->info); > + cu= add_curve(name, 1); > + cu->flag |= CU_3D; > + > + /* init the curve object (remove rotation and assign curve data to > it) */ > + add_object_draw(OB_CURVE); > + ob= OBACT; > + ob->rot[0]= ob->rot[1]= ob->rot[2]= 0; > + ob->data= cu; > + > + /* initialise 3d-cursor correction globals */ > + initgrabz(fp[0], fp[1], fp[2]); > + > + /* add points to curve */ > + for (gps= gpf->strokes.first; gps; gps= gps->next) { > + bGPDspoint *pt; > + Nurb *nu; > + BPoint *bp; > + int i; > + > + /* create new 'nurb' within the curve */ > + nu = (Nurb *)MEM_callocN(sizeof(Nurb), > "gpstroke_to_curve(nurb)"); > + > + nu->pntsu= gps->totpoints; > + nu->pntsv= 1; > + nu->orderu= gps->totpoints; > + nu->flagu= 2; /* endpoint */ > + nu->resolu= 32; > + > + nu->bp= MEM_callocN(sizeof(BPoint)*gps->totpoints, > "bezts"); > + > + /* add points */ > + for (i=0, pt=gps->points, bp=nu->bp; i < gps->totpoints; > i++, pt++, bp++) { > + float p3d[3]; > + > + /* get coordinates to add at */ > + gp_strokepoint_convertcoords(gps, pt, p3d); > + VecCopyf(bp->vec, p3d); > + > + /* set settings */ > + bp->f1= SELECT; > + bp->radius = bp->weight = pt->pressure * > gpl->thickness; > + } > + > + /* add nurb to curve */ > + BLI_addtail(&cu->nurb, nu); > + } > +} > + > +/* convert grease-pencil strokes to another representation > + * mode: 1 - Active layer to curve > + */ > +void gpencil_convert_operation (short mode) > +{ > + bGPdata *gpd; > + > + /* get datablock to work on */ > + gpd= gpencil_data_getactive(NULL); > + if (gpd == NULL) return; > + > + /* handle selection modes */ > + switch (mode) { > + case 1: /* active layer only */ > + { > + bGPDlayer *gpl= gpencil_layer_getactive(gpd); > + gp_layer_to_curve(gpd, gpl); > + } > + break; > + } > + > + /* redraw and undo-push */ > + BIF_undo_push("GPencil Convert"); > + allqueue(REDRAWVIEW3D, 0); > + allqueue(REDRAWOOPS, 0); > +} > + > +/* display a menu for converting grease-pencil strokes */ > +void gpencil_convert_menu (void) > +{ > + bGPdata *gpd= gpencil_data_getactive(NULL); > + short mode; > + > + /* only show menu if it will be relevant */ > + if (gpd == NULL) return; > + > + mode= pupmenu("Grease Pencil Convert %t|Active Layer To Curve%x1"); > + if (mode <= 0) return; > + > + gpencil_convert_operation(mode); > +} > + > /* ************************************************** */ > /* GREASE-PENCIL EDITING MODE - Painting */ > > @@ -1113,12 +1264,11 @@ > /* eraser tool - check if part of stroke occurs within last segment drawn > by eraser */ > static short gp_stroke_eraser_strokeinside (short mval[], short mvalo[], > short rad, short x0, short y0, short x1, short y1) > { > - /* step 1: check if within the radius for the new one */ > - /* simple within-radius check */ > + /* simple within-radius check for now */ > if (edge_inside_circle(mval[0], mval[1], rad, x0, y0, x1, y1)) > return 1; > > - /* step 2: check if within the quad formed between the two eraser > coords */ > + /* not inside */ > return 0; > } > > @@ -1203,7 +1353,6 @@ > /* check if point segment of stroke had > anything to do with > * eraser region (either within stroke > painted, or on its lines) > * - this assumes that linewidth is > irrelevant > - * - handled using the lasso-select > checking code > */ > if (gp_stroke_eraser_strokeinside(mval, > mvalo, rad, x0, y0, x1, y1)) { > /* if function returns true, break > this loop (as no more point to check) */ > @@ -1288,8 +1437,14 @@ > case SPACE_SEQ: > { > /* for now, this is not applicable here... > */ > + //p->gpd->sbuffer_sflag |= > GP_STROKE_2DIMAGE; > } > break; > + case SPACE_IMAGE: > + { > + p->gpd->sbuffer_sflag |= GP_STROKE_2DIMAGE; > + } > + break; > } > } > } > @@ -1298,10 +1453,7 @@ > static void gp_paint_strokeend (tGPsdata *p) > { > /* check if doing eraser or not */ > - if (p->gpd->sbuffer_sflag & GP_STROKE_ERASER) { > - /* don't do anything */ > - } > - else { > + if ((p->gpd->sbuffer_sflag & GP_STROKE_ERASER) == 0) { > /* transfer stroke to frame */ > gp_stroke_newfrombuffer(p); > } > > > _______________________________________________ > Bf-blender-cvs mailing list > Bf-blender-cvs@blender.org > http://lists.blender.org/mailman/listinfo/bf-blender-cvs >
_______________________________________________ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org http://lists.blender.org/mailman/listinfo/bf-blender-cvs