[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:02:44 CEST 2008


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);
 	}





More information about the Bf-blender-cvs mailing list