[Bf-blender-cvs] [7bca6c0b94b] greasepencil-object: Apply new shader to old draw method

Antonio Vazquez noreply at git.blender.org
Sun Jan 7 20:27:38 CET 2018


Commit: 7bca6c0b94b3e1f202d6d37e8117e3e981661a35
Author: Antonio Vazquez
Date:   Sun Jan 7 17:46:20 2018 +0100
Branches: greasepencil-object
https://developer.blender.org/rB7bca6c0b94b3e1f202d6d37e8117e3e981661a35

Apply new shader to old draw method

(used in modal operators like fill, primitives or interpolate)

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

M	source/blender/editors/gpencil/drawgpencil.c
M	source/blender/editors/include/ED_gpencil.h
M	source/blender/gpu/shaders/gpu_shader_gpencil_stroke_frag.glsl
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/editors/gpencil/drawgpencil.c b/source/blender/editors/gpencil/drawgpencil.c
index 57a5555b5d6..a96c3edf2ac 100644
--- a/source/blender/editors/gpencil/drawgpencil.c
+++ b/source/blender/editors/gpencil/drawgpencil.c
@@ -732,7 +732,15 @@ static void gp_draw_stroke_3d(tGPDdraw *tgpw, short thickness, const float ink[4
 
 	immBindBuiltinProgram(GPU_SHADER_GPENCIL_STROKE);
 	immUniform2fv("Viewport", viewport);
-	//immUniform2fv("Offset", offset);
+	immUniform1f("pixsize", tgpw->rv3d->pixsize);
+	immUniform1f("pixelsize", U.pixelsize);
+	float obj_scale = (tgpw->ob->size[0] + tgpw->ob->size[1] + tgpw->ob->size[2]) / 3.0f;
+
+	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);
+	immUniform1i("xraymode", tgpw->gpd->xray_mode);
 
 	/* draw stroke curve */
 	glLineWidth(max_ff(curpressure * thickness, 1.0f));
@@ -1440,7 +1448,8 @@ void ED_gp_draw_interpolation(const bContext *C, tGPDinterpolate *tgpi, const in
 		dflag |= (GP_DRAWDATA_ONLY3D | GP_DRAWDATA_NOSTATUS);
 	}
 
-	tgpw.rv3d = rv3d;			
+	tgpw.rv3d = rv3d;	
+	tgpw.ob = obact;
 	tgpw.gpd = tgpi->gpd;
 	tgpw.offsx = 0;
 	tgpw.offsy = 0;
@@ -1493,6 +1502,7 @@ void ED_gp_draw_primitives(const bContext *C, tGPDprimitive *tgpi, const int typ
 	}
 
 	tgpw.rv3d = rv3d;
+	tgpw.ob = obact;
 	tgpw.gpd = tgpi->gpd;
 	tgpw.offsx = 0;
 	tgpw.offsy = 0;
@@ -1539,7 +1549,8 @@ static void gp_draw_data_layers(RegionView3D *rv3d,
 	float diff_mat[4][4];
 	tGPDdraw tgpw;
 
-	tgpw.rv3d = rv3d;			/* region to draw */
+	tgpw.rv3d = rv3d;
+	tgpw.ob = ob;
 	tgpw.gpd = gpd;
 	tgpw.gpl = NULL;
 	tgpw.gpf = NULL;        
diff --git a/source/blender/editors/include/ED_gpencil.h b/source/blender/editors/include/ED_gpencil.h
index f375c5ad11c..b48ce8429c2 100644
--- a/source/blender/editors/include/ED_gpencil.h
+++ b/source/blender/editors/include/ED_gpencil.h
@@ -70,6 +70,7 @@ struct wmWindow;
 /* Temporary draw data (no draw manager mode)  */
 typedef struct tGPDdraw {
 	struct RegionView3D *rv3d;			/* region to draw */
+	struct Object *ob;                  /* object */
 	struct bGPdata *gpd;				/* current GP datablock */
 	struct bGPDlayer *gpl;				/* layer */
 	struct bGPDframe *gpf;              /* frame */
diff --git a/source/blender/gpu/shaders/gpu_shader_gpencil_stroke_frag.glsl b/source/blender/gpu/shaders/gpu_shader_gpencil_stroke_frag.glsl
index d94cec13474..7bb7693d202 100644
--- a/source/blender/gpu/shaders/gpu_shader_gpencil_stroke_frag.glsl
+++ b/source/blender/gpu/shaders/gpu_shader_gpencil_stroke_frag.glsl
@@ -1,8 +1,20 @@
 in vec4 mColor;
 in vec2 mTexCoord;
+
 out vec4 fragColor;
 
 void main()
 {
-	fragColor = mColor;
+	const vec2 center = vec2(0, 0.5);
+	vec4 tColor = vec4(mColor);
+	/* if alpha < 0, then encap */
+	if (mColor.a < 0) {
+		tColor.a = tColor.a * -1.0;
+		float dist = length(mTexCoord - center);
+		if (dist > 0.25) {
+			discard;
+		}
+	}
+	/* Solid */
+	fragColor = tColor;
 }
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 fd69f647728..7e06f873530 100644
--- a/source/blender/gpu/shaders/gpu_shader_gpencil_stroke_geom.glsl
+++ b/source/blender/gpu/shaders/gpu_shader_gpencil_stroke_geom.glsl
@@ -1,9 +1,9 @@
 uniform mat4 ModelViewProjectionMatrix;
 uniform vec2 Viewport;
-//uniform vec2 Offset;
+uniform int xraymode;
 
 layout(lines_adjacency) in;
-layout(triangle_strip, max_vertices = 7) out;
+layout(triangle_strip, max_vertices = 13) out;
 
 in vec4 finalColor[4];
 in float finalThickness[4];
@@ -11,12 +11,32 @@ in float finalThickness[4];
 out vec4 mColor;
 out vec2 mTexCoord;
 
+#define GP_XRAY_FRONT 0
+#define GP_XRAY_3DSPACE 1
+#define GP_XRAY_BACK  2
+
 /* project 3d point to 2d on screen space */
 vec2 toScreenSpace(vec4 vertex)
 {
 	return vec2(vertex.xy / vertex.w) * Viewport;
 }
 
+/* get zdepth value */
+float getZdepth(vec4 point)
+{
+	if (xraymode == GP_XRAY_FRONT) {
+		return 0.0;
+	}
+	if (xraymode == GP_XRAY_3DSPACE) {
+		return (point.z / point.w);
+	}
+	if  (xraymode == GP_XRAY_BACK) {
+		return 1.0;
+	}
+
+	/* in front by default */
+	return 0.0;
+}
 void main(void)
 {
 	float MiterLimit = 0.75;
@@ -73,17 +93,17 @@ void main(void)
 		if (dot(v0, n1) > 0) {
 			mTexCoord = vec2(0, 0);
 			mColor = finalColor[1];
-			gl_Position = vec4((sp1 + finalThickness[1] * n0) / Viewport, 0.0, 1.0);
+			gl_Position = vec4((sp1 + finalThickness[1] * n0) / Viewport, getZdepth(P1), 1.0);
 			EmitVertex();
 
 			mTexCoord = vec2(0, 0);
 			mColor = finalColor[1];
-			gl_Position = vec4((sp1 + finalThickness[1] * n1) / Viewport, 0.0, 1.0);
+			gl_Position = vec4((sp1 + finalThickness[1] * n1) / Viewport, getZdepth(P1), 1.0);
 			EmitVertex();
 
 			mTexCoord = vec2(0, 0.5);
 			mColor = finalColor[1];
-			gl_Position = vec4(sp1 / Viewport, 0.0, 1.0);
+			gl_Position = vec4(sp1 / Viewport,  getZdepth(P1), 1.0);
 			EmitVertex();
 
 			EndPrimitive();
@@ -91,17 +111,17 @@ void main(void)
 		else {
 			mTexCoord = vec2(0, 1);
 			mColor = finalColor[1];
-			gl_Position = vec4((sp1 - finalThickness[1] * n1) / Viewport, 0.0, 1.0);
+			gl_Position = vec4((sp1 - finalThickness[1] * n1) / Viewport, getZdepth(P1), 1.0);
 			EmitVertex();
 
 			mTexCoord = vec2(0, 1);
 			mColor = finalColor[1];
-			gl_Position = vec4((sp1 - finalThickness[1] * n0) / Viewport, 0.0, 1.0);
+			gl_Position = vec4((sp1 - finalThickness[1] * n0) / Viewport, getZdepth(P1), 1.0);
 			EmitVertex();
 
 			mTexCoord = vec2(0, 0.5);
 			mColor = finalColor[1];
-			gl_Position = vec4(sp1 / Viewport, 0.0, 1.0);
+			gl_Position = vec4(sp1 / Viewport, getZdepth(P1), 1.0);
 			EmitVertex();
 
 			EndPrimitive();
@@ -113,26 +133,64 @@ void main(void)
 		length_b = finalThickness[2];
 	}
 
+	/* generate the start endcap (alpha < 0 used as endcap flag)*/
+	if (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;
+		gl_Position = vec4((sp1 + svn1) / Viewport, getZdepth(P1), 1.0);
+		EmitVertex();	
+
+		mTexCoord = vec2(0, 0);
+		mColor = vec4(finalColor[1].rgb, finalColor[1].a * -1.0) ;
+		gl_Position = vec4((sp1 - (length_a * 2.0) * miter_a) / Viewport, getZdepth(P1), 1.0);
+		EmitVertex();
+
+		mTexCoord = vec2(0, 1);
+		mColor = vec4(finalColor[1].rgb, finalColor[1].a * -1.0) ;
+		gl_Position = vec4((sp1 + (length_a * 2.0) * miter_a) / Viewport, getZdepth(P1), 1.0);
+		EmitVertex();
+	}
+
 	/* generate the triangle strip */
 	mTexCoord = vec2(0, 0);
 	mColor = finalColor[1];
-	gl_Position = vec4((sp1 + length_a * miter_a) / Viewport, 0.0, 1.0);
+	gl_Position = vec4((sp1 + length_a * miter_a) / Viewport, getZdepth(P1), 1.0);
 	EmitVertex();
 
 	mTexCoord = vec2(0, 1);
 	mColor = finalColor[1];
-	gl_Position = vec4((sp1 - length_a * miter_a) / Viewport, 0.0, 1.0);
+	gl_Position = vec4((sp1 - length_a * miter_a) / Viewport, getZdepth(P1), 1.0);
 	EmitVertex();
 
 	mTexCoord = vec2(0, 0);
 	mColor = finalColor[2];
-	gl_Position = vec4((sp2 + length_b * miter_b) / Viewport, 0.0, 1.0);
+	gl_Position = vec4((sp2 + length_b * miter_b) / Viewport, getZdepth(P2), 1.0);
 	EmitVertex();
 
 	mTexCoord = vec2(0, 1);
 	mColor = finalColor[2];
-	gl_Position = vec4((sp2 - length_b * miter_b) / Viewport, 0.0, 1.0);
+	gl_Position = vec4((sp2 - length_b * miter_b) / Viewport, getZdepth(P2), 1.0);
 	EmitVertex();
 
+	/* generate the end endcap (alpha < 0 used as endcap flag)*/
+	if (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);
+		EmitVertex();
+
+		mTexCoord = vec2(0, 0);
+		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);
+		EmitVertex();
+
+		mTexCoord = vec2(1, 0.5);
+		mColor = vec4(finalColor[2].rgb, finalColor[2].a * -1.0) ;
+		vec2 svn2 =  normalize(sp2 - sp1) * length_b * 4.0;
+		gl_Position = vec4((sp2 + svn2) / Viewport, getZdepth(P2), 1.0);
+		EmitVertex();	
+	}
+	
 	EndPrimitive();
 }
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 cb4c36ec645..9a7d7844d27 100644
--- a/source/blender/gpu/shaders/gpu_shader_gpencil_stroke_vert.glsl
+++ b/source/blender/gpu/shaders/gpu_shader_gpencil_stroke_vert.glsl
@@ -1,4 +1,11 @@
 uniform mat4 ModelViewProjectionMatrix;
+uniform mat4 ProjectionMatrix;
+
+uniform float pixsize;   /* rv3d->pixsize */
+uniform float pixelsize; /* U.pixelsize */
+uniform int keep_size;    
+uniform float objscale;
+uniform int pixfactor;
 
 in vec3 pos;
 in vec4 color;
@@ -6,10 +13,21 @@ in float thickness;
 
 out vec4 finalColor;
 out float finalThickness;
-	
+
+#define TRUE 1
+
+float defaultpixsize = pixsize * pixelsize * float(pixfactor);
+
 void main(void)
 {
 	gl_Position = ModelViewProjectionMatrix * vec4( pos, 1.0 );
 	finalColor = color;
-	finalThickness = thickness;
-} 
+
+	if (keep_size == TRUE) {
+		finalThickness = thickness;
+	}
+	else {
+		float size = (ProjectionMatrix[3][3] == 0.0) ? (thickness / (gl_Position.z * defaultpixsize)) : (thickness / defaultpixsize);
+		finalThickness = max(size * objscale, 1.0);
+	}
+} 
\ No newline at end of file



More information about the Bf-blender-cvs mailing list