diff options
Diffstat (limited to 'source/blender/draw/modes/shaders')
11 files changed, 98 insertions, 53 deletions
diff --git a/source/blender/draw/modes/shaders/common_fxaa_lib.glsl b/source/blender/draw/modes/shaders/common_fxaa_lib.glsl index dcb7c0ba7f2..d9e78855dc9 100644 --- a/source/blender/draw/modes/shaders/common_fxaa_lib.glsl +++ b/source/blender/draw/modes/shaders/common_fxaa_lib.glsl @@ -674,7 +674,7 @@ vec4 FxaaPixelShader( posP.x += offNP.x * FXAA_QUALITY__P10; if (!doneP) posP.y += offNP.y * FXAA_QUALITY__P10; - /*--------------------------------------------------------------------------*/ + /*-------------------------------------------------------------------------*/ # if (FXAA_QUALITY__PS > 11) if (doneNP) { if (!doneN) @@ -696,7 +696,7 @@ vec4 FxaaPixelShader( posP.x += offNP.x * FXAA_QUALITY__P11; if (!doneP) posP.y += offNP.y * FXAA_QUALITY__P11; - /*--------------------------------------------------------------------------*/ + /*-----------------------------------------------------------------------*/ # if (FXAA_QUALITY__PS > 12) if (doneNP) { if (!doneN) @@ -718,10 +718,10 @@ vec4 FxaaPixelShader( posP.x += offNP.x * FXAA_QUALITY__P12; if (!doneP) posP.y += offNP.y * FXAA_QUALITY__P12; - /*--------------------------------------------------------------------------*/ + /*-----------------------------------------------------------------------*/ } # endif - /*--------------------------------------------------------------------------*/ + /*-------------------------------------------------------------------------*/ } # endif /*--------------------------------------------------------------------------*/ diff --git a/source/blender/draw/modes/shaders/common_hair_lib.glsl b/source/blender/draw/modes/shaders/common_hair_lib.glsl index 02254908232..1c0a31c59fd 100644 --- a/source/blender/draw/modes/shaders/common_hair_lib.glsl +++ b/source/blender/draw/modes/shaders/common_hair_lib.glsl @@ -38,8 +38,8 @@ uniform usamplerBuffer hairStrandBuffer; /* R32UI */ uniform usamplerBuffer hairStrandSegBuffer; /* R16UI */ /* Not used, use one buffer per uv layer */ -//uniform samplerBuffer hairUVBuffer; /* RG32F */ -//uniform samplerBuffer hairColBuffer; /* RGBA16 linear color */ +// uniform samplerBuffer hairUVBuffer; /* RG32F */ +// uniform samplerBuffer hairColBuffer; /* RGBA16 linear color */ /* -- Subdivision stage -- */ /** diff --git a/source/blender/draw/modes/shaders/edit_mesh_overlay_common_lib.glsl b/source/blender/draw/modes/shaders/edit_mesh_overlay_common_lib.glsl index ffabfd3fcee..7d4cba66933 100644 --- a/source/blender/draw/modes/shaders/edit_mesh_overlay_common_lib.glsl +++ b/source/blender/draw/modes/shaders/edit_mesh_overlay_common_lib.glsl @@ -1,5 +1,7 @@ uniform bool doEdges = true; +uniform bool selectFaces = true; +uniform bool selectEdges = true; vec4 EDIT_MESH_edge_color_outer(int edge_flag, int face_flag, float crease, float bweight) { @@ -15,16 +17,21 @@ vec4 EDIT_MESH_edge_color_outer(int edge_flag, int face_flag, float crease, floa vec4 EDIT_MESH_edge_color_inner(int edge_flag) { vec4 color = colorWireEdit; - color = ((edge_flag & EDGE_SELECTED) != 0) ? colorEdgeSelect : color; - color = ((edge_flag & EDGE_ACTIVE) != 0) ? colorEditMeshActive : color; + vec4 color_select = (selectEdges) ? colorEdgeSelect : colorFaceSelect; + color = (doEdges && ((edge_flag & EDGE_SELECTED) != 0)) ? color_select : color; + color = (doEdges && ((edge_flag & EDGE_ACTIVE) != 0)) ? colorEditMeshActive : color; + + float non_edge_select_alpha = (selectFaces && (edge_flag & EDGE_SELECTED) != 0) ? 0.75 : 0.4; + color.a = (selectEdges) ? 1.0 : non_edge_select_alpha; return color; } vec4 EDIT_MESH_edge_vertex_color(int vertex_flag) { vec4 color = colorWireEdit; - color = (doEdges && (vertex_flag & (VERT_ACTIVE | VERT_SELECTED)) != 0) ? colorEdgeSelect : - color; + vec4 color_select = (selectEdges) ? colorEdgeSelect : colorFaceSelect; + color = (doEdges && (vertex_flag & (VERT_ACTIVE | VERT_SELECTED)) != 0) ? color_select : color; + color.a = (selectEdges) ? 1.0 : 0.4; return color; } @@ -43,18 +50,15 @@ vec4 EDIT_MESH_vertex_color(int vertex_flag) vec4 EDIT_MESH_face_color(int face_flag) { - if ((face_flag & FACE_ACTIVE) != 0) { - return mix(colorFaceSelect, colorEditMeshActive, 0.5); - } - else if ((face_flag & FACE_SELECTED) != 0) { - return colorFaceSelect; - } - else if ((face_flag & FACE_FREESTYLE) != 0) { - return colorFaceFreestyle; - } - else { - return colorFace; - } + vec4 color = colorFace; + vec4 color_active = mix(colorFaceSelect, colorEditMeshActive, 0.5); + color = ((face_flag & FACE_FREESTYLE) != 0) ? colorFaceFreestyle : color; + color = ((face_flag & FACE_SELECTED) != 0) ? colorFaceSelect : color; + color = ((face_flag & FACE_ACTIVE) != 0) ? color_active : color; + color.a *= ((face_flag & (FACE_FREESTYLE | FACE_SELECTED | FACE_ACTIVE)) == 0 || selectFaces) ? + 1.0 : + 0.5; + return color; } vec4 EDIT_MESH_facedot_color(float facedot_flag) diff --git a/source/blender/draw/modes/shaders/edit_mesh_overlay_frag.glsl b/source/blender/draw/modes/shaders/edit_mesh_overlay_frag.glsl index 3418732afc2..7fe3cea8a42 100644 --- a/source/blender/draw/modes/shaders/edit_mesh_overlay_frag.glsl +++ b/source/blender/draw/modes/shaders/edit_mesh_overlay_frag.glsl @@ -5,15 +5,13 @@ * We want to know how much a pixel is covered by a line. * We replace the square pixel with acircle of the same area and try to find the intersection area. * The area we search is the circular segment. https://en.wikipedia.org/wiki/Circular_segment - * The formula for the area uses inverse trig function and is quite complexe. - * Instead, we approximate it by using the smoothstep function and a 1.05 factor to the disc radius. + * The formula for the area uses inverse trig function and is quite complexe. Instead, + * we approximate it by using the smoothstep function and a 1.05 factor to the disc radius. */ #define DISC_RADIUS (M_1_SQRTPI * 1.05) #define GRID_LINE_SMOOTH_START (0.5 - DISC_RADIUS) #define GRID_LINE_SMOOTH_END (0.5 + DISC_RADIUS) -uniform float edgeScale; - flat in vec4 finalColorOuter_f; in vec4 finalColor_f; noperspective in float edgeCoord_f; @@ -22,8 +20,8 @@ out vec4 FragColor; void main() { - float dist = abs(edgeCoord_f) - max(sizeEdge * edgeScale - 0.5, 0.0); - float dist_outer = dist - max(sizeEdge * edgeScale, 1.0); + float dist = abs(edgeCoord_f) - max(sizeEdge - 0.5, 0.0); + float dist_outer = dist - max(sizeEdge, 1.0); #ifdef USE_SMOOTH_WIRE float mix_w = smoothstep(GRID_LINE_SMOOTH_START, GRID_LINE_SMOOTH_END, dist); float mix_w_outer = smoothstep(GRID_LINE_SMOOTH_START, GRID_LINE_SMOOTH_END, dist_outer); @@ -31,6 +29,8 @@ void main() float mix_w = step(0.5, dist); float mix_w_outer = step(0.5, dist_outer); #endif + /* Line color & alpha. */ FragColor = mix(finalColorOuter_f, finalColor_f, 1.0 - mix_w * finalColorOuter_f.a); + /* Line edges shape. */ FragColor.a *= 1.0 - (finalColorOuter_f.a > 0.0 ? mix_w_outer : mix_w); } diff --git a/source/blender/draw/modes/shaders/edit_mesh_overlay_geom.glsl b/source/blender/draw/modes/shaders/edit_mesh_overlay_geom.glsl index 6e59de12260..047bd1dccc6 100644 --- a/source/blender/draw/modes/shaders/edit_mesh_overlay_geom.glsl +++ b/source/blender/draw/modes/shaders/edit_mesh_overlay_geom.glsl @@ -4,7 +4,6 @@ layout(triangle_strip, max_vertices = 4) out; uniform vec2 viewportSize; uniform vec2 viewportSizeInv; -uniform float edgeScale; in vec4 finalColor[2]; in vec4 finalColorOuter[2]; @@ -14,14 +13,16 @@ flat out vec4 finalColorOuter_f; out vec4 finalColor_f; noperspective out float edgeCoord_f; -void do_vertex(const int i, vec4 pos, float coord, vec2 offset) +void do_vertex(vec4 color, vec4 pos, float coord, vec2 offset) { - finalColor_f = (selectOveride[0] == 0) ? finalColor[i] : finalColor[0]; + finalColor_f = color; edgeCoord_f = coord; gl_Position = pos; /* Multiply offset by 2 because gl_Position range is [-1..1]. */ gl_Position.xy += offset * 2.0 * pos.w; -#ifdef USE_WORLD_CLIP_PLANES + /* Correct but fails due to an AMD compiler bug, see: T62792. + * Do inline instead. */ +#if 0 world_clip_planes_set_clip_distance(gl_in[i].gl_ClipDistance); #endif EmitVertex(); @@ -57,9 +58,9 @@ void main() line = abs(line) * viewportSize; finalColorOuter_f = finalColorOuter[0]; - float half_size = sizeEdge * edgeScale; + float half_size = sizeEdge; /* Enlarge edge for flag display. */ - half_size += (finalColorOuter_f.a > 0.0) ? max(sizeEdge * edgeScale, 1.0) : 0.0; + half_size += (finalColorOuter_f.a > 0.0) ? max(sizeEdge, 1.0) : 0.0; #ifdef USE_SMOOTH_WIRE /* Add 1 px for AA */ @@ -71,10 +72,20 @@ void main() bool horizontal = line.x > line.y; edge_ofs = (horizontal) ? edge_ofs.zyz : edge_ofs.xzz; - do_vertex(0, pos0, half_size, edge_ofs.xy); - do_vertex(0, pos0, -half_size, -edge_ofs.xy); - do_vertex(1, pos1, half_size, edge_ofs.xy); - do_vertex(1, pos1, -half_size, -edge_ofs.xy); +#ifdef USE_WORLD_CLIP_PLANES + /* Due to an AMD glitch, this line was moved out of the `do_vertex` + * function (see T62792). */ + world_clip_planes_set_clip_distance(gl_in[0].gl_ClipDistance); +#endif + do_vertex(finalColor[0], pos0, half_size, edge_ofs.xy); + do_vertex(finalColor[0], pos0, -half_size, -edge_ofs.xy); + +#ifdef USE_WORLD_CLIP_PLANES + world_clip_planes_set_clip_distance(gl_in[1].gl_ClipDistance); +#endif + vec4 final_color = (selectOveride[0] == 0) ? finalColor[1] : finalColor[0]; + do_vertex(final_color, pos1, half_size, edge_ofs.xy); + do_vertex(final_color, pos1, -half_size, -edge_ofs.xy); EndPrimitive(); } diff --git a/source/blender/draw/modes/shaders/edit_mesh_overlay_mesh_analysis_frag.glsl b/source/blender/draw/modes/shaders/edit_mesh_overlay_mesh_analysis_frag.glsl new file mode 100644 index 00000000000..8581453e810 --- /dev/null +++ b/source/blender/draw/modes/shaders/edit_mesh_overlay_mesh_analysis_frag.glsl @@ -0,0 +1,14 @@ +out vec4 fragColor; + +#ifdef FACE_COLOR +flat in vec4 weightColor; +#endif + +#ifdef VERTEX_COLOR +in vec4 weightColor; +#endif + +void main() +{ + fragColor = weightColor; +} diff --git a/source/blender/draw/modes/shaders/edit_mesh_overlay_mesh_analysis_vert.glsl b/source/blender/draw/modes/shaders/edit_mesh_overlay_mesh_analysis_vert.glsl new file mode 100644 index 00000000000..94d8d2e701c --- /dev/null +++ b/source/blender/draw/modes/shaders/edit_mesh_overlay_mesh_analysis_vert.glsl @@ -0,0 +1,23 @@ +uniform mat4 ModelViewProjectionMatrix; +uniform mat4 ModelMatrix; + +in vec3 pos; +in vec4 weight_color; + +#ifdef FACE_COLOR +flat out vec4 weightColor; +#endif + +#ifdef VERTEX_COLOR +out vec4 weightColor; +#endif + +void main() +{ + gl_Position = ModelViewProjectionMatrix * vec4(pos, 1.0); + weightColor = vec4(weight_color.rgb, 1.0); + +#ifdef USE_WORLD_CLIP_PLANES + world_clip_planes_calc_clip_distance((ModelMatrix * vec4(pos, 1.0)).xyz); +#endif +} diff --git a/source/blender/draw/modes/shaders/edit_mesh_overlay_vert.glsl b/source/blender/draw/modes/shaders/edit_mesh_overlay_vert.glsl index 8c54470cd5a..d700e69fb57 100644 --- a/source/blender/draw/modes/shaders/edit_mesh_overlay_vert.glsl +++ b/source/blender/draw/modes/shaders/edit_mesh_overlay_vert.glsl @@ -74,21 +74,15 @@ void main() #endif -#if !defined(FACE) && !defined(EDGE_DECORATION) +#if !defined(FACE) /* Facing based color blend */ vec4 vpos = ModelViewMatrix * vec4(pos, 1.0); vec3 view_normal = normalize(NormalMatrix * vnor + 1e-4); vec3 view_vec = (ProjectionMatrix[3][3] == 0.0) ? normalize(vpos.xyz) : vec3(0.0, 0.0, 1.0); float facing = dot(view_vec, view_normal); - facing = 1.0 - abs(facing) * 0.3; - - finalColor = mix(colorEditMeshMiddle, finalColor, facing); - finalColor.a = 1.0; + facing = 1.0 - abs(facing) * 0.2; -# if defined(EDGE) && !defined(FLAT) - /* Hack to blend color in pixel shader in case of overide. */ - finalColor.a = facing; -# endif + finalColor.rgb = mix(colorEditMeshMiddle.rgb, finalColor.rgb, facing); #endif diff --git a/source/blender/draw/modes/shaders/object_grid_frag.glsl b/source/blender/draw/modes/shaders/object_grid_frag.glsl index 841b4a95b21..df2cfe7be82 100644 --- a/source/blender/draw/modes/shaders/object_grid_frag.glsl +++ b/source/blender/draw/modes/shaders/object_grid_frag.glsl @@ -40,8 +40,8 @@ uniform int gridFlag; * We want to know how much a pixel is covered by a line. * We replace the square pixel with acircle of the same area and try to find the intersection area. * The area we search is the circular segment. https://en.wikipedia.org/wiki/Circular_segment - * The formula for the area uses inverse trig function and is quite complexe. - * Instead, we approximate it by using the smoothstep function and a 1.05 factor to the disc radius. + * The formula for the area uses inverse trig function and is quite complexe. Instead, + * we approximate it by using the smoothstep function and a 1.05 factor to the disc radius. */ #define DISC_RADIUS (M_1_SQRTPI * 1.05) #define GRID_LINE_SMOOTH_START (0.5 - DISC_RADIUS) diff --git a/source/blender/draw/modes/shaders/particle_strand_vert.glsl b/source/blender/draw/modes/shaders/particle_strand_vert.glsl index 745499800e5..6dac6d6b980 100644 --- a/source/blender/draw/modes/shaders/particle_strand_vert.glsl +++ b/source/blender/draw/modes/shaders/particle_strand_vert.glsl @@ -45,14 +45,12 @@ vec3 weight_to_rgb(float weight) return r_rgb; } -#define DECOMPRESS_RANGE 1.0039 - void main() { gl_Position = ModelViewProjectionMatrix * vec4(pos, 1.0); #ifdef USE_WEIGHT - finalColor = vec4(weight_to_rgb(color * DECOMPRESS_RANGE), 1.0); + finalColor = vec4(weight_to_rgb(color), 1.0); #else finalColor = mix(colorWire, colorEdgeSelect, color); #endif diff --git a/source/blender/draw/modes/shaders/sculpt_mask_vert.glsl b/source/blender/draw/modes/shaders/sculpt_mask_vert.glsl index 5ae97ec5cb9..e5e34fee57e 100644 --- a/source/blender/draw/modes/shaders/sculpt_mask_vert.glsl +++ b/source/blender/draw/modes/shaders/sculpt_mask_vert.glsl @@ -1,5 +1,6 @@ uniform mat4 ModelViewProjectionMatrix; +uniform float maskOpacity; in vec3 pos; in float msk; @@ -10,6 +11,6 @@ void main() { gl_Position = ModelViewProjectionMatrix * vec4(pos, 1.0); - float mask = 1.0 - msk * 0.75; + float mask = 1.0 - (msk * maskOpacity); finalColor = vec4(mask, mask, mask, 1.0); } |