GPencil: Fix Display Textures in Solid mode
authorAntonioya <blendergit@gmail.com>
Sat, 2 Mar 2019 12:58:59 +0000 (13:58 +0100)
committerAntonioya <blendergit@gmail.com>
Sat, 2 Mar 2019 12:59:18 +0000 (13:59 +0100)
There was a bug when selected Solid mode with Material or Texture mode. The textures were not visible.

Now, the mode is passed to shaders to decide if use the solid color or the result texture color. The mode is passed using an array with shading type and mode.

source/blender/draw/engines/gpencil/gpencil_cache_utils.c
source/blender/draw/engines/gpencil/gpencil_draw_utils.c
source/blender/draw/engines/gpencil/gpencil_engine.c
source/blender/draw/engines/gpencil/gpencil_engine.h
source/blender/draw/engines/gpencil/gpencil_shader_fx.c
source/blender/draw/engines/gpencil/shaders/gpencil_fill_frag.glsl
source/blender/draw/engines/gpencil/shaders/gpencil_point_vert.glsl
source/blender/draw/engines/gpencil/shaders/gpencil_stroke_vert.glsl

index f57ec5e..cf30253 100644 (file)
@@ -85,11 +85,11 @@ tGPencilObjectCache *gpencil_object_cache_add(
 
        /* save wire mode (object mode is always primary option) */
        if (ob->dt == OB_WIRE) {
-               cache_elem->shading_type = (int)OB_WIRE;
+               cache_elem->shading_type[0] = (int)OB_WIRE;
        }
        else {
                if (v3d) {
-                       cache_elem->shading_type = (int)v3d->shading.type;
+                       cache_elem->shading_type[0] = (int)v3d->shading.type;
                }
        }
 
index 873b660..3b2d5ec 100644 (file)
@@ -268,11 +268,11 @@ static void set_wireframe_color(Object *ob, bGPDlayer *gpl, View3D *v3d,
 
        /* wire color */
        if ((v3d) && (id > -1)) {
-               const char type = (stl->shgroups[id].shading_type == OB_WIRE) ?
+               const char type = (stl->shgroups[id].shading_type[0] == OB_WIRE) ?
                                                        v3d->shading.wire_color_type :
                                                        v3d->shading.color_type;
                /* if fill and wire, use background color */
-               if ((is_fill) && (stl->shgroups[id].shading_type == OB_WIRE)) {
+               if ((is_fill) && (stl->shgroups[id].shading_type[0] == OB_WIRE)) {
                        if (v3d->shading.background_type == V3D_SHADING_BACKGROUND_THEME) {
                                UI_GetThemeColor4fv(TH_BACK, stl->shgroups[id].wire_color);
                                stl->shgroups[id].wire_color[3] = 1.0f;
@@ -296,7 +296,7 @@ static void set_wireframe_color(Object *ob, bGPDlayer *gpl, View3D *v3d,
                switch (type) {
                        case V3D_SHADING_SINGLE_COLOR:
                        {
-                               if (stl->shgroups[id].shading_type == OB_WIRE) {
+                               if (stl->shgroups[id].shading_type[0] == OB_WIRE) {
                                        UI_GetThemeColor4fv(TH_WIRE, color);
                                }
                                else {
@@ -348,7 +348,7 @@ static void set_wireframe_color(Object *ob, bGPDlayer *gpl, View3D *v3d,
 static DRWShadingGroup *DRW_gpencil_shgroup_fill_create(
         GPENCIL_e_data *e_data, GPENCIL_Data *vedata, DRWPass *pass,
         GPUShader *shader, Object *ob, bGPdata *gpd, bGPDlayer *gpl,
-        MaterialGPencilStyle *gp_style, int id, int shading_type)
+        MaterialGPencilStyle *gp_style, int id, int shading_type[2])
 {
        GPENCIL_StorageList *stl = ((GPENCIL_Data *)vedata)->stl;
        const DRWContextState *draw_ctx = DRW_context_state_get();
@@ -416,8 +416,14 @@ static DRWShadingGroup *DRW_gpencil_shgroup_fill_create(
        DRW_shgroup_uniform_int(grp, "viewport_xray", &stl->storage->is_xray, 1);
 
        /* shading type */
-       stl->shgroups[id].shading_type = GPENCIL_USE_SOLID(stl) ? (int)OB_RENDER : shading_type;
-       DRW_shgroup_uniform_int(grp, "shading_type", &stl->shgroups[id].shading_type, 1);
+       stl->shgroups[id].shading_type[0] = GPENCIL_USE_SOLID(stl) ? (int)OB_RENDER : shading_type[0];
+       if (v3d) {
+               stl->shgroups[id].shading_type[1] = (stl->shgroups[id].shading_type[0] == OB_WIRE) ?
+                                                                                       v3d->shading.wire_color_type :
+                                                                                       v3d->shading.color_type;
+       }
+
+       DRW_shgroup_uniform_int(grp, "shading_type", &stl->shgroups[id].shading_type[0], 2);
 
        /* wire color */
        set_wireframe_color(ob, gpl, v3d, stl, gp_style, id, true);
@@ -475,7 +481,7 @@ DRWShadingGroup *DRW_gpencil_shgroup_stroke_create(
         GPENCIL_e_data *e_data, GPENCIL_Data *vedata, DRWPass *pass, GPUShader *shader, Object *ob,
         bGPdata *gpd, bGPDlayer *gpl, bGPDstroke *gps,
         MaterialGPencilStyle *gp_style, int id,
-        bool onion, const float scale, int shading_type)
+        bool onion, const float scale, const int shading_type[2])
 {
        GPENCIL_StorageList *stl = ((GPENCIL_Data *)vedata)->stl;
        const float *viewport_size = DRW_viewport_size_get();
@@ -519,8 +525,13 @@ DRWShadingGroup *DRW_gpencil_shgroup_stroke_create(
                /* viewport x-ray */
                DRW_shgroup_uniform_int(grp, "viewport_xray", &stl->storage->is_xray, 1);
 
-               stl->shgroups[id].shading_type = (GPENCIL_USE_SOLID(stl) || onion) ? (int)OB_RENDER : shading_type;
-               DRW_shgroup_uniform_int(grp, "shading_type", &stl->shgroups[id].shading_type, 1);
+               stl->shgroups[id].shading_type[0] = (GPENCIL_USE_SOLID(stl) || onion) ? (int)OB_RENDER : shading_type[0];
+               if (v3d) {
+                       stl->shgroups[id].shading_type[1] = (stl->shgroups[id].shading_type[0] == OB_WIRE) ?
+                                                                                               v3d->shading.wire_color_type :
+                                                                                               v3d->shading.color_type;
+               }
+               DRW_shgroup_uniform_int(grp, "shading_type", &stl->shgroups[id].shading_type[0], 2);
 
                /* wire color */
                set_wireframe_color(ob, gpl, v3d, stl, gp_style, id, false);
@@ -545,8 +556,8 @@ DRWShadingGroup *DRW_gpencil_shgroup_stroke_create(
                /* viewport x-ray */
                DRW_shgroup_uniform_int(grp, "viewport_xray", &stl->storage->is_xray, 1);
 
-               stl->shgroups[id].shading_type = (int)OB_RENDER;
-               DRW_shgroup_uniform_int(grp, "shading_type", &stl->shgroups[id].shading_type, 1);
+               stl->shgroups[id].shading_type[0] = (int)OB_RENDER;
+               DRW_shgroup_uniform_int(grp, "shading_type", &stl->shgroups[id].shading_type[0], 2);
        }
 
        if ((gpd) && (id > -1)) {
@@ -591,7 +602,7 @@ static DRWShadingGroup *DRW_gpencil_shgroup_point_create(
         GPENCIL_e_data *e_data, GPENCIL_Data *vedata, DRWPass *pass, GPUShader *shader, Object *ob,
         bGPdata *gpd, bGPDlayer *gpl,
         MaterialGPencilStyle *gp_style, int id, bool onion,
-        const float scale, int shading_type)
+        const float scale, const int shading_type[2])
 {
        GPENCIL_StorageList *stl = ((GPENCIL_Data *)vedata)->stl;
        const float *viewport_size = DRW_viewport_size_get();
@@ -632,8 +643,13 @@ static DRWShadingGroup *DRW_gpencil_shgroup_point_create(
                /* viewport x-ray */
                DRW_shgroup_uniform_int(grp, "viewport_xray", &stl->storage->is_xray, 1);
 
-               stl->shgroups[id].shading_type = (GPENCIL_USE_SOLID(stl) || onion) ? (int)OB_RENDER : shading_type;
-               DRW_shgroup_uniform_int(grp, "shading_type", &stl->shgroups[id].shading_type, 1);
+               stl->shgroups[id].shading_type[0] = (GPENCIL_USE_SOLID(stl) || onion) ? (int)OB_RENDER : shading_type[0];
+               if (v3d) {
+                       stl->shgroups[id].shading_type[1] = (stl->shgroups[id].shading_type[0] == OB_WIRE) ?
+                                                                                               v3d->shading.wire_color_type :
+                                                                                               v3d->shading.color_type;
+               }
+               DRW_shgroup_uniform_int(grp, "shading_type", &stl->shgroups[id].shading_type[0], 2);
 
                /* wire color */
                set_wireframe_color(ob, gpl, v3d, stl, gp_style, id, false);
@@ -658,8 +674,8 @@ static DRWShadingGroup *DRW_gpencil_shgroup_point_create(
                /* viewport x-ray */
                DRW_shgroup_uniform_int(grp, "viewport_xray", &stl->storage->is_xray, 1);
 
-               stl->shgroups[id].shading_type = (int)OB_RENDER;
-               DRW_shgroup_uniform_int(grp, "shading_type", &stl->shgroups[id].shading_type, 1);
+               stl->shgroups[id].shading_type[0] = (int)OB_RENDER;
+               DRW_shgroup_uniform_int(grp, "shading_type", &stl->shgroups[id].shading_type[0], 2);
        }
 
        if (gpd) {
@@ -1318,7 +1334,7 @@ void DRW_gpencil_populate_buffer_strokes(GPENCIL_e_data *e_data, void *vedata, T
        bGPdata *gpd = (bGPdata *)DEG_get_original_id(&gpd_eval->id);
 
        MaterialGPencilStyle *gp_style = NULL;
-
+       const int shade_render[2] = { OB_RENDER, 0 };
        float obscale = mat4_to_scale(ob->obmat);
 
        /* use the brush material */
@@ -1346,12 +1362,12 @@ void DRW_gpencil_populate_buffer_strokes(GPENCIL_e_data *e_data, void *vedata, T
                                if ((gp_style) && (gp_style->mode == GP_STYLE_MODE_LINE)) {
                                        stl->g_data->shgrps_drawing_stroke = DRW_gpencil_shgroup_stroke_create(
                                                e_data, vedata, psl->drawing_pass, e_data->gpencil_stroke_sh, NULL,
-                                               gpd, NULL, NULL, gp_style, -1, false, 1.0f, (int)OB_RENDER);
+                                               gpd, NULL, NULL, gp_style, -1, false, 1.0f, shade_render);
                                }
                                else {
                                        stl->g_data->shgrps_drawing_stroke = DRW_gpencil_shgroup_point_create(
                                                e_data, vedata, psl->drawing_pass, e_data->gpencil_point_sh, NULL,
-                                               gpd, NULL, gp_style, -1, false, 1.0f, (int)OB_RENDER);
+                                               gpd, NULL, gp_style, -1, false, 1.0f, shade_render);
                                }
 
                                /* clean previous version of the batch */
index d5d5c1e..74b3e7a 100644 (file)
@@ -558,7 +558,7 @@ static void gpencil_add_draw_data(void *vedata, Object *ob)
        /* FX passses */
        cache_ob->has_fx = false;
        if ((!stl->storage->simplify_fx) &&
-           (!ELEM(cache_ob->shading_type, OB_WIRE, OB_SOLID)) &&
+           (!ELEM(cache_ob->shading_type[0], OB_WIRE, OB_SOLID)) &&
            (BKE_shaderfx_has_gpencil(ob)))
        {
                cache_ob->has_fx = true;
index 1b92f59..0c917b0 100644 (file)
@@ -93,7 +93,7 @@ typedef struct tGPencilObjectCache {
        float scale;
 
        /* shading type */
-       int shading_type;
+       int shading_type[2];
 
        /* GPU data size */
        int tot_vertex;
@@ -121,8 +121,8 @@ typedef struct GPENCIL_shgroup {
 
        /* color of the wireframe */
        float wire_color[4];
-       /* shading type */
-       int shading_type;
+       /* shading type and mode */
+       int shading_type[2];
 } GPENCIL_shgroup;
 
 typedef struct GPENCIL_Storage {
@@ -380,7 +380,7 @@ struct DRWShadingGroup *DRW_gpencil_shgroup_stroke_create(
         struct Object *ob, struct bGPdata *gpd,
         struct bGPDlayer *gpl, struct bGPDstroke *gps,
         struct MaterialGPencilStyle *gp_style, int id, bool onion,
-        const float scale, int shading_type);
+        const float scale, const int shading_type[2]);
 void DRW_gpencil_populate_datablock(
         struct GPENCIL_e_data *e_data, void *vedata,
         struct Object *ob, struct tGPencilObjectCache *cache_ob);
index 4b03075..e4819f4 100644 (file)
@@ -746,7 +746,7 @@ void DRW_gpencil_fx_prepare(
         tGPencilObjectCache *cache_ob)
 {
        GPENCIL_StorageList *stl = ((GPENCIL_Data *)vedata)->stl;
-       const bool wiremode = (bool)(cache_ob->shading_type == OB_WIRE);
+       const bool wiremode = (bool)(cache_ob->shading_type[0] == OB_WIRE);
 
        int ob_idx = cache_ob->idx;
 
index 78fbb21..b359707 100644 (file)
@@ -22,7 +22,7 @@ uniform sampler2D myTexture;
 uniform int texture_clamp;
 
 uniform int viewport_xray;
-uniform int shading_type;
+uniform int shading_type[2];
 uniform vec4 wire_color;
 
 /* keep this list synchronized with list in gpencil_draw_utils.c */
@@ -43,6 +43,9 @@ uniform vec4 wire_color;
 #define OB_WIRE  2
 #define OB_SOLID 3
 
+#define        V3D_SHADING_MATERIAL_COLOR 0
+#define        V3D_SHADING_TEXTURE_COLOR  3
+
 in vec4 finalColor;
 in vec2 texCoord_interp;
 out vec4 fragColor;
@@ -92,7 +95,7 @@ void main()
        vec4 chesscolor;
 
        /* wireframe with x-ray discard */
-       if ((viewport_xray == 1) && (shading_type == OB_WIRE)) {
+       if ((viewport_xray == 1) && (shading_type[0] == OB_WIRE)) {
                discard;
        }
 
@@ -168,18 +171,18 @@ void main()
        }
 
        /* if wireframe override colors */
-       if (shading_type == OB_WIRE) {
+       if (shading_type[0] == OB_WIRE) {
                fragColor = wire_color;
        }
-               /* solid with x-ray discard */
-       if (shading_type == OB_SOLID) {
-               if (viewport_xray == 1) {
-                       /* use 50% of color */
-                       fragColor = vec4(wire_color.rgb, wire_color.a * 0.5);
-               }
-               else {
+       
+       /* for solid override color */
+       if (shading_type[0] == OB_SOLID) {
+               if ((shading_type[1] != V3D_SHADING_MATERIAL_COLOR) && (shading_type[1] != V3D_SHADING_TEXTURE_COLOR)) { 
                        fragColor = wire_color;
                }
+               if (viewport_xray == 1) {
+                       fragColor.a *= 0.5;
+               }
        }
 
 }
index 20ca2cf..b367d15 100644 (file)
@@ -6,7 +6,7 @@ uniform int keep_size;
 uniform float objscale;
 uniform float pixfactor;
 uniform int viewport_xray;
-uniform int shading_type;
+uniform int shading_type[2];
 uniform vec4 wire_color;
 
 in vec3 pos;
@@ -23,6 +23,9 @@ out vec2 finaluvdata;
 #define OB_WIRE  2
 #define OB_SOLID 3
 
+#define        V3D_SHADING_MATERIAL_COLOR 0
+#define        V3D_SHADING_TEXTURE_COLOR  3
+
 float defaultpixsize = pixsize * (1000.0 / pixfactor);
 
 void main()
@@ -39,18 +42,18 @@ void main()
        }
        
        /* for wireframe override size and color */
-       if (shading_type == OB_WIRE) {
+       if (shading_type[0] == OB_WIRE) {
                finalThickness = 2.0;
                finalColor = wire_color;
        }
        /* for solid override color */
-       if (shading_type == OB_SOLID) {
-               if (viewport_xray == 1) {
-                       finalColor = vec4(wire_color.rgb, wire_color.a * 0.5);
-               }
-               else { 
+       if (shading_type[0] == OB_SOLID) {
+               if ((shading_type[1] != V3D_SHADING_MATERIAL_COLOR) && (shading_type[1] != V3D_SHADING_TEXTURE_COLOR)) { 
                        finalColor = wire_color;
                }
+               if (viewport_xray == 1) {
+                       finalColor.a *= 0.5;
+               }
        }
 
        finaluvdata = uvdata;
index f58f5a3..3c6768d 100644 (file)
@@ -6,7 +6,7 @@ uniform int keep_size;
 uniform float objscale;
 uniform float pixfactor;
 uniform int viewport_xray;
-uniform int shading_type;
+uniform int shading_type[2];
 uniform vec4 wire_color;
 
 in vec3 pos;
@@ -23,6 +23,9 @@ out vec2 finaluvdata;
 #define OB_WIRE  2
 #define OB_SOLID 3
 
+#define        V3D_SHADING_MATERIAL_COLOR 0
+#define        V3D_SHADING_TEXTURE_COLOR  3
+
 float defaultpixsize = pixsize * (1000.0 / pixfactor);
 
 void main(void)
@@ -39,18 +42,18 @@ void main(void)
        }
 
        /* for wireframe override size and color */
-       if (shading_type == OB_WIRE) {
+       if (shading_type[0] == OB_WIRE) {
                finalThickness = 1.0;
                finalColor = wire_color;
        }
        /* for solid override color */
-       if (shading_type == OB_SOLID) {
-               if (viewport_xray == 1) {
-                       finalColor = vec4(wire_color.rgb, wire_color.a * 0.5);
-               }
-               else { 
+       if (shading_type[0] == OB_SOLID) {
+               if ((shading_type[1] != V3D_SHADING_MATERIAL_COLOR) && (shading_type[1] != V3D_SHADING_TEXTURE_COLOR)) { 
                        finalColor = wire_color;
                }
+               if (viewport_xray == 1) {
+                       finalColor.a *= 0.5;
+               }
        }
 
        finaluvdata = uvdata;