[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