[Bf-blender-cvs] [7625771e3ec] greasepencil-object: GP: Fill: Add end cap support to boundary strokes

Charlie Jolly noreply at git.blender.org
Sat Jan 19 03:26:04 CET 2019


Commit: 7625771e3ec05f1cfc5f3f78abd5d02bb5c9cdc2
Author: Charlie Jolly
Date:   Sat Jan 19 02:24:43 2019 +0000
Branches: greasepencil-object
https://developer.blender.org/rB7625771e3ec05f1cfc5f3f78abd5d02bb5c9cdc2

GP: Fill: Add end cap support to boundary strokes

+ Fill boundary stroke supports end caps
+ Fix pixfactor type

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

M	source/blender/blenloader/intern/versioning_280.c
M	source/blender/draw/engines/gpencil/gpencil_draw_utils.c
M	source/blender/editors/gpencil/drawgpencil.c
M	source/blender/editors/gpencil/gpencil_fill.c
M	source/blender/gpu/shaders/gpu_shader_gpencil_stroke_geom.glsl
M	source/blender/gpu/shaders/gpu_shader_gpencil_stroke_vert.glsl

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

diff --git a/source/blender/blenloader/intern/versioning_280.c b/source/blender/blenloader/intern/versioning_280.c
index 8a75ec17567..e02aff46848 100644
--- a/source/blender/blenloader/intern/versioning_280.c
+++ b/source/blender/blenloader/intern/versioning_280.c
@@ -1101,7 +1101,7 @@ void blo_do_versions_280(FileData *fd, Library *UNUSED(lib), Main *bmain)
 			}
 
 			/* Init grease pencil pixel size factor */
-			if (!DNA_struct_elem_find(fd->filesdna, "bGPdata", "int", "pixfactor")) {
+			if (!DNA_struct_elem_find(fd->filesdna, "bGPdata", "float", "pixfactor")) {
 				for (bGPdata *gpd = bmain->gpencil.first; gpd; gpd = gpd->id.next) {
 					gpd->pixfactor = GP_DEFAULT_PIX_FACTOR;
 				}
diff --git a/source/blender/draw/engines/gpencil/gpencil_draw_utils.c b/source/blender/draw/engines/gpencil/gpencil_draw_utils.c
index 8c0b1dc3e9a..496ac23af29 100644
--- a/source/blender/draw/engines/gpencil/gpencil_draw_utils.c
+++ b/source/blender/draw/engines/gpencil/gpencil_draw_utils.c
@@ -370,7 +370,7 @@ DRWShadingGroup *DRW_gpencil_shgroup_stroke_create(
 	DRW_shgroup_uniform_float(grp, "pixsize", stl->storage->pixsize, 1);
 
 	/* avoid wrong values */
-	if ((gpd) && (gpd->pixfactor == 0)) {
+	if ((gpd) && (gpd->pixfactor == 0.0f)) {
 		gpd->pixfactor = GP_DEFAULT_PIX_FACTOR;
 	}
 
@@ -465,7 +465,7 @@ static DRWShadingGroup *DRW_gpencil_shgroup_point_create(
 	DRW_shgroup_uniform_float(grp, "pixsize", stl->storage->pixsize, 1);
 
 	/* avoid wrong values */
-	if ((gpd) && (gpd->pixfactor == 0)) {
+	if ((gpd) && (gpd->pixfactor == 0.0f)) {
 		gpd->pixfactor = GP_DEFAULT_PIX_FACTOR;
 	}
 
diff --git a/source/blender/editors/gpencil/drawgpencil.c b/source/blender/editors/gpencil/drawgpencil.c
index cc07caddc9b..344a3bab8af 100644
--- a/source/blender/editors/gpencil/drawgpencil.c
+++ b/source/blender/editors/gpencil/drawgpencil.c
@@ -725,9 +725,12 @@ static void gp_draw_stroke_3d(tGPDdraw *tgpw, short thickness, const float ink[4
 	immUniform1f("objscale", obj_scale);
 	int keep_size = (int)((tgpw->gpd) && (tgpw->gpd->flag & GP_DATA_STROKE_KEEPTHICKNESS));
 	immUniform1i("keep_size", keep_size);
-	immUniform1i("pixfactor", tgpw->gpd->pixfactor);
+	immUniform1f("pixfactor", tgpw->gpd->pixfactor);
 	/* xray mode always to 3D space to avoid wrong zdepth calculation (T60051) */
 	immUniform1i("xraymode", GP_XRAY_3DSPACE);
+	immUniform1i("caps_start", (int)tgpw->gps->caps[0]);
+	immUniform1i("caps_end", (int)tgpw->gps->caps[1]);
+	immUniform1i("fill_stroke", (int)tgpw->is_adaptive_fill);
 
 	/* draw stroke curve */
 	GPU_line_width(max_ff(curpressure * thickness, 1.0f));
@@ -738,23 +741,22 @@ static void gp_draw_stroke_3d(tGPDdraw *tgpw, short thickness, const float ink[4
 		/* first point for adjacency (not drawn) */
 		if (i == 0) {
 			gp_set_point_varying_color(points, ink, attr_id.color);
-			immAttr1f(attr_id.thickness, max_ff(curpressure * thickness, 1.0f));
+			
 			if ((cyclic) && (totpoints > 2)) {
+				immAttr1f(attr_id.thickness, max_ff((points + totpoints - 1)->pressure * thickness, 1.0f));
 				mul_v3_m4v3(fpt, tgpw->diff_mat, &(points + totpoints - 1)->x);
 			}
 			else {
+				immAttr1f(attr_id.thickness, max_ff((points + 1)->pressure * thickness, 1.0f));
 				mul_v3_m4v3(fpt, tgpw->diff_mat, &(points + 1)->x);
 			}
-			mul_v3_fl(fpt, -1.0f);
 			immVertex3fv(attr_id.pos, fpt);
 		}
 		/* set point */
 		gp_set_point_varying_color(pt, ink, attr_id.color);
-		immAttr1f(attr_id.thickness, max_ff(curpressure * thickness, 1.0f));
+		immAttr1f(attr_id.thickness, max_ff(pt->pressure * thickness, 1.0f));
 		mul_v3_m4v3(fpt, tgpw->diff_mat, &pt->x);
 		immVertex3fv(attr_id.pos, fpt);
-
-		curpressure = pt->pressure;
 	}
 
 	if (cyclic && totpoints > 2) {
@@ -770,10 +772,9 @@ static void gp_draw_stroke_3d(tGPDdraw *tgpw, short thickness, const float ink[4
 	}
 	/* last adjacency point (not drawn) */
 	else {
-		gp_set_point_varying_color(points + totpoints - 1, ink, attr_id.color);
-		immAttr1f(attr_id.thickness, max_ff(curpressure * thickness, 1.0f));
+		gp_set_point_varying_color(points + totpoints - 2, ink, attr_id.color);
+		immAttr1f(attr_id.thickness, max_ff((points + totpoints - 2)->pressure * thickness, 1.0f));
 		mul_v3_m4v3(fpt, tgpw->diff_mat, &(points + totpoints - 2)->x);
-		mul_v3_fl(fpt, -1.0f);
 		immVertex3fv(attr_id.pos, fpt);
 	}
 
diff --git a/source/blender/editors/gpencil/gpencil_fill.c b/source/blender/editors/gpencil/gpencil_fill.c
index c3200565e58..046c106ac31 100644
--- a/source/blender/editors/gpencil/gpencil_fill.c
+++ b/source/blender/editors/gpencil/gpencil_fill.c
@@ -972,8 +972,6 @@ static void gpencil_points_from_stack(tGPDfill *tgpf)
 		return;
 	}
 
-	bool is_adaptive_fill = (tgpf->fill_draw_mode == GP_FILL_DMODE_ADAPTIVE) ? true : false;
-
 	tgpf->sbuffer_size = (short)totpoints;
 	tgpf->sbuffer = MEM_callocN(sizeof(tGPspoint) * totpoints, __func__);
 
diff --git a/source/blender/gpu/shaders/gpu_shader_gpencil_stroke_geom.glsl b/source/blender/gpu/shaders/gpu_shader_gpencil_stroke_geom.glsl
index 3de1bd838b3..6c7e2d17e06 100644
--- a/source/blender/gpu/shaders/gpu_shader_gpencil_stroke_geom.glsl
+++ b/source/blender/gpu/shaders/gpu_shader_gpencil_stroke_geom.glsl
@@ -1,6 +1,9 @@
 uniform mat4 ModelViewProjectionMatrix;
 uniform vec2 Viewport;
 uniform int xraymode;
+uniform int caps_start;
+uniform int caps_end;
+uniform int fill_stroke;
 
 layout(lines_adjacency) in;
 layout(triangle_strip, max_vertices = 13) out;
@@ -15,6 +18,8 @@ out vec2 mTexCoord;
 #define GP_XRAY_3DSPACE 1
 #define GP_XRAY_BACK  2
 
+#define GPENCIL_FLATCAP 1
+
 /* project 3d point to 2d on screen space */
 vec2 toScreenSpace(vec4 vertex)
 {
@@ -37,6 +42,22 @@ float getZdepth(vec4 point)
 	/* in front by default */
 	return 0.0;
 }
+
+/* check equality but with a small tolerance */
+bool is_equal(vec4 p1, vec4 p2)
+{
+	float limit = 0.0001;
+	float x = abs(p1.x - p2.x);
+	float y = abs(p1.y - p2.y);
+	float z = abs(p1.z - p2.z);
+
+	if ((x < limit) && (y < limit) && (z < limit)) {
+		return true;
+	}
+
+	return false;
+}
+
 void main(void)
 {
 	float MiterLimit = 0.75;
@@ -134,10 +155,11 @@ void main(void)
 	}
 
 	/* generate the start endcap (alpha < 0 used as endcap flag)*/
-	if (P0 == P2) {
+	float extend = (fill_stroke > 0) ? 2 : 1 ;
+	if ((caps_start != GPENCIL_FLATCAP) && is_equal(P0,P2)) {
 		mTexCoord = vec2(1, 0.5);
 		mColor = vec4(finalColor[1].rgb, finalColor[1].a * -1.0) ;
-		vec2 svn1 =  normalize(sp1 - sp2) * length_a * 4.0;
+		vec2 svn1 =  normalize(sp1 - sp2) * length_a * 4.0 * extend;
 		gl_Position = vec4((sp1 + svn1) / Viewport, getZdepth(P1), 1.0);
 		EmitVertex();
 
@@ -174,7 +196,7 @@ void main(void)
 	EmitVertex();
 
 	/* generate the end endcap (alpha < 0 used as endcap flag)*/
-	if (P1 == P3) {
+	if ((caps_end != GPENCIL_FLATCAP) && is_equal(P1,P3)) {
 		mTexCoord = vec2(0, 1);
 		mColor = vec4(finalColor[2].rgb, finalColor[2].a * -1.0) ;
 		gl_Position = vec4((sp2 + (length_b * 2.0) * miter_b) / Viewport, getZdepth(P2), 1.0);
@@ -187,7 +209,7 @@ void main(void)
 
 		mTexCoord = vec2(1, 0.5);
 		mColor = vec4(finalColor[2].rgb, finalColor[2].a * -1.0) ;
-		vec2 svn2 =  normalize(sp2 - sp1) * length_b * 4.0;
+		vec2 svn2 =  normalize(sp2 - sp1) * length_b * 4.0 * extend;
 		gl_Position = vec4((sp2 + svn2) / Viewport, getZdepth(P2), 1.0);
 		EmitVertex();
 	}
diff --git a/source/blender/gpu/shaders/gpu_shader_gpencil_stroke_vert.glsl b/source/blender/gpu/shaders/gpu_shader_gpencil_stroke_vert.glsl
index 5cbe2f60ebd..968f913d4e4 100644
--- a/source/blender/gpu/shaders/gpu_shader_gpencil_stroke_vert.glsl
+++ b/source/blender/gpu/shaders/gpu_shader_gpencil_stroke_vert.glsl
@@ -4,7 +4,7 @@ uniform mat4 ProjectionMatrix;
 uniform float pixsize;   /* rv3d->pixsize */
 uniform int keep_size;
 uniform float objscale;
-uniform int pixfactor;
+uniform float pixfactor;
 
 in vec3 pos;
 in vec4 color;



More information about the Bf-blender-cvs mailing list