[Bf-blender-cvs] [6d4c44d043a] greasepencil-experimental: GP: Fill: Test code for overspill (not working)

Charlie Jolly noreply at git.blender.org
Thu Jan 10 18:00:08 CET 2019


Commit: 6d4c44d043a8e8786b24fac51d0bcce487a57ac2
Author: Charlie Jolly
Date:   Thu Jan 10 16:59:59 2019 +0000
Branches: greasepencil-experimental
https://developer.blender.org/rB6d4c44d043a8e8786b24fac51d0bcce487a57ac2

GP: Fill: Test code for overspill (not working)

===================================================================

M	source/blender/editors/gpencil/gpencil_fill.c

===================================================================

diff --git a/source/blender/editors/gpencil/gpencil_fill.c b/source/blender/editors/gpencil/gpencil_fill.c
index f3d1c489796..ca80ab453c3 100644
--- a/source/blender/editors/gpencil/gpencil_fill.c
+++ b/source/blender/editors/gpencil/gpencil_fill.c
@@ -120,10 +120,16 @@ typedef struct tGPDfill {
 	short sbuffer_size;                 /* number of elements currently in cache */
 	void *sbuffer;                      /* temporary points */
 	float *depth_arr;                   /* depth array for reproject */
+	int overspill;                      /* overspill or bleed outside fill area */
 
 	Image *ima;                         /* temp image */
 	BLI_Stack *stack;                   /* temp points data */
 	void *draw_handle_3d;               /* handle for drawing strokes while operator is running 3d stuff */
+
+	int bwinx;                          /* tmp size */
+	int bwiny;
+	rcti brect;
+
 } tGPDfill;
 
 
@@ -287,6 +293,43 @@ static void gp_render_offscreen(tGPDfill *tgpf)
 		return;
 	}
 
+	if (tgpf->overspill < 0) {
+		tgpf->overspill = 0;
+	}
+		
+
+	/* set temporary new size */
+	tgpf->bwinx = tgpf->ar->winx;
+	tgpf->bwiny = tgpf->ar->winy;
+	tgpf->brect = tgpf->ar->winrct;
+
+	/* resize ar */
+	tgpf->ar->winrct.xmin -= tgpf->overspill;
+	tgpf->ar->winrct.ymin -= tgpf->overspill;
+	tgpf->ar->winrct.xmax += tgpf->overspill;
+	tgpf->ar->winrct.ymax += tgpf->overspill;
+	tgpf->ar->winx = (short)abs(tgpf->ar->winrct.xmax - tgpf->ar->winrct.xmin);
+	tgpf->ar->winy = (short)abs(tgpf->ar->winrct.ymax - tgpf->ar->winrct.ymin);
+
+	/* save new size */
+	tgpf->sizex = (int)tgpf->ar->winx;
+	tgpf->sizey = (int)tgpf->ar->winy;
+
+	/* debug prints */
+	printf("center: %i, %i\n", tgpf->center[0], tgpf->center[1]);
+
+	/* adjust center */
+	float center[2];
+	center[0] = (float)tgpf->center[0] * ((float)tgpf->ar->winx / (float)tgpf->bwinx);
+	center[1] = (float)tgpf->center[1] * ((float)tgpf->ar->winy / (float)tgpf->bwiny);
+	round_v2i_v2fl(tgpf->center, center);
+
+	/* debug prints */
+	printf("new center: %i, %i\n", tgpf->center[0], tgpf->center[1]);
+	printf("size: %i, %i\n", tgpf->sizex, tgpf->sizey);
+	print_rcti("before", &tgpf->brect);
+	print_rcti("after", &tgpf->ar->winrct);
+
 	char err_out[256] = "unknown";
 	GPUOffScreen *offscreen = GPU_offscreen_create(tgpf->sizex, tgpf->sizey, 0, true, false, err_out);
 	GPU_offscreen_bind(offscreen, true);
@@ -304,18 +347,6 @@ static void gp_render_offscreen(tGPDfill *tgpf)
 		perspective_m4(winmat, viewplane.xmin, viewplane.xmax, viewplane.ymin, viewplane.ymax, clipsta, clipend);
 	}
 
-	/* set temporary new size */
-	int bwinx = tgpf->ar->winx;
-	int bwiny = tgpf->ar->winy;
-	rcti brect = tgpf->ar->winrct;
-
-	tgpf->ar->winx = (short)tgpf->sizex;
-	tgpf->ar->winy = (short)tgpf->sizey;
-	tgpf->ar->winrct.xmin = 0;
-	tgpf->ar->winrct.ymin = 0;
-	tgpf->ar->winrct.xmax = tgpf->sizex;
-	tgpf->ar->winrct.ymax = tgpf->sizey;
-
 	GPU_matrix_push_projection();
 	GPU_matrix_identity_set();
 	GPU_matrix_push();
@@ -335,11 +366,6 @@ static void gp_render_offscreen(tGPDfill *tgpf)
 	float ink[4] = {1.0f, 0.0f, 0.0f, 1.0f};
 	gp_draw_datablock(tgpf, ink);
 
-	/* restore size */
-	tgpf->ar->winx = (short)bwinx;
-	tgpf->ar->winy = (short)bwiny;
-	tgpf->ar->winrct = brect;
-
 	GPU_matrix_pop_projection();
 	GPU_matrix_pop();
 
@@ -1237,14 +1263,13 @@ static int gpencil_fill_modal(bContext *C, wmOperator *op, const wmEvent *event)
 					in_bounds = BLI_rcti_isect_pt(&ar->winrct, event->x, event->y);
 
 					if ((in_bounds) && (ar->regiontype == RGN_TYPE_WINDOW)) {
+						/* set fill overspill */
+						tgpf->overspill = 50;
+
 						/* TODO GPXX: Verify the mouse click is right for any window size */
 						tgpf->center[0] = event->mval[0];
 						tgpf->center[1] = event->mval[1];
 
-						/* save size */
-						tgpf->sizex = ar->winx;
-						tgpf->sizey = ar->winy;
-
 						/* render screen to temp image */
 						gp_render_offscreen(tgpf);
 
@@ -1266,6 +1291,11 @@ static int gpencil_fill_modal(bContext *C, wmOperator *op, const wmEvent *event)
 						/* create stroke and reproject */
 						gpencil_stroke_from_buffer(tgpf);
 
+						/* restore size */
+						tgpf->ar->winx = (short)tgpf->bwinx;
+						tgpf->ar->winy = (short)tgpf->bwiny;
+						tgpf->ar->winrct = tgpf->brect;
+
 						/* free temp stack data */
 						if (tgpf->stack) {
 							BLI_stack_free(tgpf->stack);



More information about the Bf-blender-cvs mailing list