[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [16270] trunk/blender/source/blender: == Grease Pencil - Conversions + Bugfixes ==
Joshua Leung
aligorith at gmail.com
Wed Aug 27 15:04:26 CEST 2008
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 <aligorith at gmail.com> 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 at blender.org
> http://lists.blender.org/mailman/listinfo/bf-blender-cvs
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.blender.org/pipermail/bf-blender-cvs/attachments/20080828/0d003099/attachment.html>
More information about the Bf-blender-cvs
mailing list