[Bf-blender-cvs] [a636f3fbd14] greasepencil-object: Generate missing mouse event

Antonio Vazquez noreply at git.blender.org
Mon Feb 26 18:39:17 CET 2018


Commit: a636f3fbd148daa6aa05a0b276faa260738b446f
Author: Antonio Vazquez
Date:   Mon Feb 26 18:38:03 2018 +0100
Branches: greasepencil-object
https://developer.blender.org/rBa636f3fbd148daa6aa05a0b276faa260738b446f

Generate missing mouse event

When the artist moves very fast the mouse, there are event that are not captured due hardware limitations, so need to interpolate the position and generate the missing control points in the stroke.

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

M	release/scripts/startup/bl_ui/space_view3d_toolbar.py
M	source/blender/editors/gpencil/gpencil_paint.c
M	source/blender/makesdna/DNA_gpencil_types.h
M	source/blender/makesrna/intern/rna_scene.c

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

diff --git a/release/scripts/startup/bl_ui/space_view3d_toolbar.py b/release/scripts/startup/bl_ui/space_view3d_toolbar.py
index 5d818297a3a..b6cffc90914 100644
--- a/release/scripts/startup/bl_ui/space_view3d_toolbar.py
+++ b/release/scripts/startup/bl_ui/space_view3d_toolbar.py
@@ -2183,6 +2183,9 @@ class VIEW3D_PT_tools_grease_pencil_brush_option(Panel):
             row = layout.row(align=True)
             row.prop(brush, "uv_random", slider=True)
 
+            row = layout.row(align=True)
+            row.prop(brush, "input_samples")
+
 
 # Grease Pencil drawingcurves
 class VIEW3D_PT_tools_grease_pencil_brushcurves(Panel):
diff --git a/source/blender/editors/gpencil/gpencil_paint.c b/source/blender/editors/gpencil/gpencil_paint.c
index b76155a2544..037c1069cfe 100644
--- a/source/blender/editors/gpencil/gpencil_paint.c
+++ b/source/blender/editors/gpencil/gpencil_paint.c
@@ -2276,7 +2276,7 @@ static void gpencil_draw_apply(bContext *C, wmOperator *op, tGPsdata *p, const D
 }
 
 /* handle draw event */
-static void gpencil_draw_apply_event(bContext *C, wmOperator *op, const wmEvent *event, const Depsgraph *depsgraph)
+static void gpencil_draw_apply_event(bContext *C, wmOperator *op, const wmEvent *event, const Depsgraph *depsgraph, int x, int y)
 {
 	tGPsdata *p = op->customdata;
 	PointerRNA itemptr;
@@ -2284,10 +2284,11 @@ static void gpencil_draw_apply_event(bContext *C, wmOperator *op, const wmEvent
 	int tablet = 0;
 	
 	/* convert from window-space to area-space mouse coordinates
+	 * add any x,y override position for fake events
 	 * NOTE: float to ints conversions, +1 factor is probably used to ensure a bit more accurate rounding...
 	 */
-	p->mval[0] = event->mval[0] + 1;
-	p->mval[1] = event->mval[1] + 1;
+	p->mval[0] = event->mval[0] + 1 - x;
+	p->mval[1] = event->mval[1] + 1 - y;
 	p->shift = event->shift;
 
 	/* verify key status for straight lines */
@@ -2528,7 +2529,8 @@ static int gpencil_draw_invoke(bContext *C, wmOperator *op, const wmEvent *event
 		p->status = GP_STATUS_PAINTING;
 
 		/* handle the initial drawing - i.e. for just doing a simple dot */
-		gpencil_draw_apply_event(C, op, event, CTX_data_depsgraph(C));
+
+		gpencil_draw_apply_event(C, op, event, CTX_data_depsgraph(C), 0, 0);
 		op->flag |= OP_IS_MODAL_CURSOR_REGION;
 	}
 	else {
@@ -2642,6 +2644,35 @@ static void gpencil_move_last_stroke_to_back(bContext *C)
 	BLI_insertlinkbefore(&gpf->strokes, gpf->strokes.first, gps);
 }
 
+/* add events for missing mouse movements when the artist draw very fast */
+static void gpencil_add_missing_events(bContext *C, wmOperator *op, const wmEvent *event, tGPsdata *p)
+{
+	bGPDbrush *brush = p->brush;
+	int factor = brush->input_samples;
+	if (factor == 0) {
+		return;
+	}
+
+	float pt[2], a[2], b[2];
+	copy_v2fl_v2i(a, p->mvalo);
+	b[0] = event->mval[0] + 1;
+	b[1] = event->mval[1] + 1;
+	float dist = len_v2v2(a, b);
+	if (dist >= factor) {
+		int slices = (int)((dist / factor) + 1);
+		float n = 1.0f / slices;
+		for (int i = 1; i < slices; i++) {
+			interp_v2_v2v2(pt, a, b, n * i);
+			copy_v2_v2(a, pt);
+			sub_v2_v2v2(pt, b, pt);
+
+			/* create fake event */
+			gpencil_draw_apply_event(C, op, event, CTX_data_depsgraph(C),
+									(int)pt[0], (int)pt[1]);
+		}
+	}
+}
+
 /* events handling during interactive drawing part of operator */
 static int gpencil_draw_modal(bContext *C, wmOperator *op, const wmEvent *event)
 {
@@ -2892,7 +2923,9 @@ static int gpencil_draw_modal(bContext *C, wmOperator *op, const wmEvent *event)
 		if (ELEM(event->type, MOUSEMOVE, INBETWEEN_MOUSEMOVE) || (p->flags & GP_PAINTFLAG_FIRSTRUN)) {
 			/* handle drawing event */
 			/* printf("\t\tGP - add point\n"); */
-			gpencil_draw_apply_event(C, op, event, CTX_data_depsgraph(C));
+			gpencil_add_missing_events(C, op, event, p);
+
+			gpencil_draw_apply_event(C, op, event, CTX_data_depsgraph(C), 0, 0);
 
 			/* finish painting operation if anything went wrong just now */
 			if (p->status == GP_STATUS_ERROR) {
diff --git a/source/blender/makesdna/DNA_gpencil_types.h b/source/blender/makesdna/DNA_gpencil_types.h
index 76a85b3c5b7..03130f92b42 100644
--- a/source/blender/makesdna/DNA_gpencil_types.h
+++ b/source/blender/makesdna/DNA_gpencil_types.h
@@ -137,6 +137,8 @@ typedef struct bGPDbrush {
 	float lazy_factor;        /* factor of smooth */
 	
 	float uv_random;          /* random factor for UV rotation */
+	int   input_samples;      /* maximum distance before generate new point for very fast mouse movements */
+	char  pad[4];
 } bGPDbrush;
 
 /* bGPDbrush->flag */
diff --git a/source/blender/makesrna/intern/rna_scene.c b/source/blender/makesrna/intern/rna_scene.c
index 19c5ada3a01..7ac6a7ebf3f 100644
--- a/source/blender/makesrna/intern/rna_scene.c
+++ b/source/blender/makesrna/intern/rna_scene.c
@@ -2386,6 +2386,12 @@ static void rna_def_gpencil_brush(BlenderRNA *brna)
 	RNA_def_property_ui_text(prop, "UV Random", "Random factor for autogenerated UV rotation");
 	RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, NULL);
 
+	prop = RNA_def_property(srna, "input_samples", PROP_INT, PROP_NONE);
+	RNA_def_property_int_sdna(prop, NULL, "input_samples");
+	RNA_def_property_range(prop, 0, 200);
+	RNA_def_property_ui_text(prop, "Input Samples", "Maximum distance from last mouse position before generate a new control point. Set to 0 to disable");
+	RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, NULL);
+
 	/* Flags */
 	prop = RNA_def_property(srna, "use_pressure", PROP_BOOLEAN, PROP_NONE);
 	RNA_def_property_boolean_sdna(prop, NULL, "flag", GP_BRUSH_USE_PRESSURE);



More information about the Bf-blender-cvs mailing list