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;

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to