diff --git a/resources/shaders/110/mm_gouraud.fs b/resources/shaders/110/mm_gouraud.fs index 8ca23df66d..821af13f03 100644 --- a/resources/shaders/110/mm_gouraud.fs +++ b/resources/shaders/110/mm_gouraud.fs @@ -40,6 +40,28 @@ struct SlopeDetection }; uniform SlopeDetection slope; +//BBS: add wireframe logic +varying vec3 barycentric_coordinates; +float edgeFactor(float lineWidth) { + vec3 d = fwidth(barycentric_coordinates); + vec3 a3 = smoothstep(vec3(0.0), d * lineWidth, barycentric_coordinates); + return min(min(a3.x, a3.y), a3.z); +} + +vec3 wireframe(vec3 fill, vec3 stroke, float lineWidth) { + return mix(stroke, fill, edgeFactor(lineWidth)); + //if (any(lessThan(barycentric_coordinates, vec3(0.005, 0.005, 0.005)))) + // return vec3(1.0, 0.0, 0.0); + //else + // return fill; +} + +vec3 getWireframeColor(vec3 fill) { + float brightness = 0.2126 * fill.r + 0.7152 * fill.g + 0.0722 * fill.b; + return (brightness > 0.75) ? vec3(0.11, 0.165, 0.208) : vec3(0.988, 0.988, 0.988); +} +uniform bool show_wireframe; + void main() { if (any(lessThan(clipping_planes_dots, ZERO))) @@ -86,5 +108,12 @@ void main() NdotL = max(dot(eye_normal, LIGHT_FRONT_DIR), 0.0); intensity.x += NdotL * LIGHT_FRONT_DIFFUSE; - gl_FragColor = vec4(vec3(intensity.y) + color * intensity.x, alpha); + if (show_wireframe) { + vec3 wireframeColor = show_wireframe ? getWireframeColor(color) : color; + vec3 triangleColor = wireframe(color, wireframeColor, 1.0); + gl_FragColor = vec4(vec3(intensity.y) + triangleColor * intensity.x, alpha); + } + else { + gl_FragColor = vec4(vec3(intensity.y) + color * intensity.x, alpha); + } } diff --git a/resources/shaders/110/mm_gouraud.vs b/resources/shaders/110/mm_gouraud.vs index e8c679b6bf..b0cea9cfd6 100644 --- a/resources/shaders/110/mm_gouraud.vs +++ b/resources/shaders/110/mm_gouraud.vs @@ -12,10 +12,13 @@ uniform vec2 z_range; uniform vec4 clipping_plane; attribute vec3 v_position; +attribute vec3 v_barycentric; varying vec3 clipping_planes_dots; varying vec4 model_pos; varying vec4 world_pos; +varying vec3 barycentric_coordinates; + struct SlopeDetection { bool actived; @@ -32,4 +35,7 @@ void main() gl_Position = projection_matrix * view_model_matrix * model_pos; // Fill in the scalars for fragment shader clipping. Fragments with any of these components lower than zero are discarded. clipping_planes_dots = vec3(dot(world_pos, clipping_plane), world_pos.z - z_range.x, z_range.y - world_pos.z); + + //compute the Barycentric Coordinates + barycentric_coordinates = v_barycentric; } diff --git a/resources/shaders/140/mm_gouraud.fs b/resources/shaders/140/mm_gouraud.fs index 2156394bea..c5fe86efc5 100644 --- a/resources/shaders/140/mm_gouraud.fs +++ b/resources/shaders/140/mm_gouraud.fs @@ -40,6 +40,30 @@ struct SlopeDetection }; uniform SlopeDetection slope; +out vec4 out_color; + +//BBS: add wireframe logic +in vec3 barycentric_coordinates; +float edgeFactor(float lineWidth) { + vec3 d = fwidth(barycentric_coordinates); + vec3 a3 = smoothstep(vec3(0.0), d * lineWidth, barycentric_coordinates); + return min(min(a3.x, a3.y), a3.z); +} + +vec3 wireframe(vec3 fill, vec3 stroke, float lineWidth) { + return mix(stroke, fill, edgeFactor(lineWidth)); + //if (any(lessThan(barycentric_coordinates, vec3(0.005, 0.005, 0.005)))) + // return vec3(1.0, 0.0, 0.0); + //else + // return fill; +} + +vec3 getWireframeColor(vec3 fill) { + float brightness = 0.2126 * fill.r + 0.7152 * fill.g + 0.0722 * fill.b; + return (brightness > 0.75) ? vec3(0.11, 0.165, 0.208) : vec3(0.988, 0.988, 0.988); +} +uniform bool show_wireframe; + void main() { if (any(lessThan(clipping_planes_dots, ZERO))) @@ -86,5 +110,12 @@ void main() NdotL = max(dot(eye_normal, LIGHT_FRONT_DIR), 0.0); intensity.x += NdotL * LIGHT_FRONT_DIFFUSE; - gl_FragColor = vec4(vec3(intensity.y) + color * intensity.x, alpha); + if (show_wireframe) { + vec3 wireframeColor = show_wireframe ? getWireframeColor(color) : color; + vec3 triangleColor = wireframe(color, wireframeColor, 1.0); + out_color = vec4(vec3(intensity.y) + triangleColor * intensity.x, alpha); + } + else { + out_color = vec4(vec3(intensity.y) + color * intensity.x, alpha); + } } diff --git a/resources/shaders/140/mm_gouraud.vs b/resources/shaders/140/mm_gouraud.vs index 4add5c0aee..b191e35fa8 100644 --- a/resources/shaders/140/mm_gouraud.vs +++ b/resources/shaders/140/mm_gouraud.vs @@ -12,10 +12,13 @@ uniform vec2 z_range; uniform vec4 clipping_plane; in vec3 v_position; +in vec3 v_barycentric; out vec3 clipping_planes_dots; out vec4 model_pos; out vec4 world_pos; +out vec3 barycentric_coordinates; + struct SlopeDetection { bool actived; @@ -32,4 +35,7 @@ void main() gl_Position = projection_matrix * view_model_matrix * model_pos; // Fill in the scalars for fragment shader clipping. Fragments with any of these components lower than zero are discarded. clipping_planes_dots = vec3(dot(world_pos, clipping_plane), world_pos.z - z_range.x, z_range.y - world_pos.z); + + //compute the Barycentric Coordinates + barycentric_coordinates = v_barycentric; } diff --git a/resources/shaders/background.fs b/resources/shaders/background.fs deleted file mode 100644 index b148440898..0000000000 --- a/resources/shaders/background.fs +++ /dev/null @@ -1,11 +0,0 @@ -#version 110 - -uniform vec4 top_color; -uniform vec4 bottom_color; - -varying vec2 tex_coord; - -void main() -{ - gl_FragColor = mix(bottom_color, top_color, tex_coord.y); -} diff --git a/resources/shaders/background.vs b/resources/shaders/background.vs deleted file mode 100644 index b7c1d92c0e..0000000000 --- a/resources/shaders/background.vs +++ /dev/null @@ -1,9 +0,0 @@ -#version 110 - -varying vec2 tex_coord; - -void main() -{ - gl_Position = gl_Vertex; - tex_coord = gl_MultiTexCoord0.xy; -} diff --git a/resources/shaders/flat.fs b/resources/shaders/flat.fs deleted file mode 100644 index ab656998df..0000000000 --- a/resources/shaders/flat.fs +++ /dev/null @@ -1,8 +0,0 @@ -#version 110 - -uniform vec4 uniform_color; - -void main() -{ - gl_FragColor = uniform_color; -} diff --git a/resources/shaders/flat.vs b/resources/shaders/flat.vs deleted file mode 100644 index d0d3ee42a9..0000000000 --- a/resources/shaders/flat.vs +++ /dev/null @@ -1,6 +0,0 @@ -#version 110 - -void main() -{ - gl_Position = ftransform(); -} diff --git a/resources/shaders/flat_texture.fs b/resources/shaders/flat_texture.fs deleted file mode 100644 index ffe193b1c0..0000000000 --- a/resources/shaders/flat_texture.fs +++ /dev/null @@ -1,10 +0,0 @@ -#version 110 - -uniform sampler2D uniform_texture; - -varying vec2 tex_coord; - -void main() -{ - gl_FragColor = texture2D(uniform_texture, tex_coord); -} diff --git a/resources/shaders/flat_texture.vs b/resources/shaders/flat_texture.vs deleted file mode 100644 index 27addc7526..0000000000 --- a/resources/shaders/flat_texture.vs +++ /dev/null @@ -1,9 +0,0 @@ -#version 110 - -varying vec2 tex_coord; - -void main() -{ - gl_Position = ftransform(); - tex_coord = gl_MultiTexCoord0.xy; -} diff --git a/resources/shaders/gouraud.fs b/resources/shaders/gouraud.fs deleted file mode 100644 index 4084efdbf1..0000000000 --- a/resources/shaders/gouraud.fs +++ /dev/null @@ -1,105 +0,0 @@ -#version 110 - -const vec3 ZERO = vec3(0.0, 0.0, 0.0); -//BBS: add grey and orange -//const vec3 GREY = vec3(0.9, 0.9, 0.9); -const vec3 ORANGE = vec3(0.8, 0.4, 0.0); -const vec3 LightRed = vec3(0.78, 0.0, 0.0); -const vec3 LightBlue = vec3(0.73, 1.0, 1.0); -const float EPSILON = 0.0001; - -struct PrintVolumeDetection -{ - // 0 = rectangle, 1 = circle, 2 = custom, 3 = invalid - int type; - // type = 0 (rectangle): - // x = min.x, y = min.y, z = max.x, w = max.y - // type = 1 (circle): - // x = center.x, y = center.y, z = radius - vec4 xy_data; - // x = min z, y = max z - vec2 z_data; -}; - -struct SlopeDetection -{ - bool actived; - float normal_z; - mat3 volume_world_normal_matrix; -}; - -uniform vec4 uniform_color; -uniform SlopeDetection slope; - -//BBS: add outline_color -uniform bool is_outline; - -uniform bool offset_depth_buffer; - -#ifdef ENABLE_ENVIRONMENT_MAP - uniform sampler2D environment_tex; - uniform bool use_environment_tex; -#endif // ENABLE_ENVIRONMENT_MAP - -varying vec3 clipping_planes_dots; - -// x = diffuse, y = specular; -varying vec2 intensity; - -uniform PrintVolumeDetection print_volume; - -varying vec4 world_pos; -varying float world_normal_z; -varying vec3 eye_normal; - -void main() -{ - if (any(lessThan(clipping_planes_dots, ZERO))) - discard; - vec3 color = uniform_color.rgb; - float alpha = uniform_color.a; - - if (slope.actived) { - if(world_pos.z<0.1&&world_pos.z>-0.1) - { - color = LightBlue; - alpha = 0.8; - } - else if( world_normal_z < slope.normal_z - EPSILON) - { - color = color * 0.5 + LightRed * 0.5; - alpha = 0.8; - } - } - // if the fragment is outside the print volume -> use darker color - vec3 pv_check_min = ZERO; - vec3 pv_check_max = ZERO; - if (print_volume.type == 0) { - // rectangle - pv_check_min = world_pos.xyz - vec3(print_volume.xy_data.x, print_volume.xy_data.y, print_volume.z_data.x); - pv_check_max = world_pos.xyz - vec3(print_volume.xy_data.z, print_volume.xy_data.w, print_volume.z_data.y); - color = (any(lessThan(pv_check_min, ZERO)) || any(greaterThan(pv_check_max, ZERO))) ? mix(color, ZERO, 0.3333) : color; - } - else if (print_volume.type == 1) { - // circle - float delta_radius = print_volume.xy_data.z - distance(world_pos.xy, print_volume.xy_data.xy); - pv_check_min = vec3(delta_radius, 0.0, world_pos.z - print_volume.z_data.x); - pv_check_max = vec3(0.0, 0.0, world_pos.z - print_volume.z_data.y); - color = (any(lessThan(pv_check_min, ZERO)) || any(greaterThan(pv_check_max, ZERO))) ? mix(color, ZERO, 0.3333) : color; - } - - //BBS: add outline_color - if (is_outline) - gl_FragColor = uniform_color; -#ifdef ENABLE_ENVIRONMENT_MAP - else if (use_environment_tex) - gl_FragColor = vec4(0.45 * texture2D(environment_tex, normalize(eye_normal).xy * 0.5 + 0.5).xyz + 0.8 * color * intensity.x, alpha); -#endif - else - gl_FragColor = vec4(vec3(intensity.y) + color * intensity.x, alpha); - - // In the support painting gizmo and the seam painting gizmo are painted triangles rendered over the already - // rendered object. To resolved z-fighting between previously rendered object and painted triangles, values - // inside the depth buffer are offset by small epsilon for painted triangles inside those gizmos. - gl_FragDepth = gl_FragCoord.z - (offset_depth_buffer ? EPSILON : 0.0); -} \ No newline at end of file diff --git a/resources/shaders/gouraud.vs b/resources/shaders/gouraud.vs deleted file mode 100644 index c8b3d7b335..0000000000 --- a/resources/shaders/gouraud.vs +++ /dev/null @@ -1,71 +0,0 @@ -#version 110 - -#define INTENSITY_CORRECTION 0.6 - -// normalized values for (-0.6/1.31, 0.6/1.31, 1./1.31) -const vec3 LIGHT_TOP_DIR = vec3(-0.4574957, 0.4574957, 0.7624929); -#define LIGHT_TOP_DIFFUSE (0.8 * INTENSITY_CORRECTION) -#define LIGHT_TOP_SPECULAR (0.125 * INTENSITY_CORRECTION) -#define LIGHT_TOP_SHININESS 20.0 - -// normalized values for (1./1.43, 0.2/1.43, 1./1.43) -const vec3 LIGHT_FRONT_DIR = vec3(0.6985074, 0.1397015, 0.6985074); -#define LIGHT_FRONT_DIFFUSE (0.3 * INTENSITY_CORRECTION) -//#define LIGHT_FRONT_SPECULAR (0.0 * INTENSITY_CORRECTION) -//#define LIGHT_FRONT_SHININESS 5.0 - -#define INTENSITY_AMBIENT 0.3 - -const vec3 ZERO = vec3(0.0, 0.0, 0.0); - -struct SlopeDetection -{ - bool actived; - float normal_z; - mat3 volume_world_normal_matrix; -}; - -uniform mat4 volume_world_matrix; -uniform SlopeDetection slope; - -// Clipping plane, x = min z, y = max z. Used by the FFF and SLA previews to clip with a top / bottom plane. -uniform vec2 z_range; -// Clipping plane - general orientation. Used by the SLA gizmo. -uniform vec4 clipping_plane; - -// x = diffuse, y = specular; -varying vec2 intensity; - -varying vec3 clipping_planes_dots; - -varying vec4 world_pos; -varying float world_normal_z; -varying vec3 eye_normal; - -void main() -{ - // First transform the normal into camera space and normalize the result. - eye_normal = normalize(gl_NormalMatrix * gl_Normal); - - // Compute the cos of the angle between the normal and lights direction. The light is directional so the direction is constant for every vertex. - // Since these two are normalized the cosine is the dot product. We also need to clamp the result to the [0,1] range. - float NdotL = max(dot(eye_normal, LIGHT_TOP_DIR), 0.0); - - intensity.x = INTENSITY_AMBIENT + NdotL * LIGHT_TOP_DIFFUSE; - vec3 position = (gl_ModelViewMatrix * gl_Vertex).xyz; - intensity.y = LIGHT_TOP_SPECULAR * pow(max(dot(-normalize(position), reflect(-LIGHT_TOP_DIR, eye_normal)), 0.0), LIGHT_TOP_SHININESS); - - // Perform the same lighting calculation for the 2nd light source (no specular applied). - NdotL = max(dot(eye_normal, LIGHT_FRONT_DIR), 0.0); - intensity.x += NdotL * LIGHT_FRONT_DIFFUSE; - - // Point in homogenous coordinates. - world_pos = volume_world_matrix * gl_Vertex; - - // z component of normal vector in world coordinate used for slope shading - world_normal_z = slope.actived ? (normalize(slope.volume_world_normal_matrix * gl_Normal)).z : 0.0; - - gl_Position = ftransform(); - // Fill in the scalars for fragment shader clipping. Fragments with any of these components lower than zero are discarded. - clipping_planes_dots = vec3(dot(world_pos, clipping_plane), world_pos.z - z_range.x, z_range.y - world_pos.z); -} diff --git a/resources/shaders/gouraud_130.fs b/resources/shaders/gouraud_130.fs deleted file mode 100644 index 9ab12676ec..0000000000 --- a/resources/shaders/gouraud_130.fs +++ /dev/null @@ -1,124 +0,0 @@ -#version 130 - -const vec3 ZERO = vec3(0.0, 0.0, 0.0); -//BBS: add grey and orange -//const vec3 GREY = vec3(0.9, 0.9, 0.9); -const vec3 ORANGE = vec3(0.8, 0.4, 0.0); -const float EPSILON = 0.0001; - -struct PrintVolumeDetection -{ - // 0 = rectangle, 1 = circle, 2 = custom, 3 = invalid - int type; - // type = 0 (rectangle): - // x = min.x, y = min.y, z = max.x, w = max.y - // type = 1 (circle): - // x = center.x, y = center.y, z = radius - vec4 xy_data; - // x = min z, y = max z - vec2 z_data; -}; - -struct SlopeDetection -{ - bool actived; - float normal_z; - mat3 volume_world_normal_matrix; -}; - -//BBS: add wireframe logic -varying vec3 barycentric_coordinates; -float edgeFactor(float lineWidth) { - vec3 d = fwidth(barycentric_coordinates); - vec3 a3 = smoothstep(vec3(0.0), d * lineWidth, barycentric_coordinates); - return min(min(a3.x, a3.y), a3.z); -} - -vec3 wireframe(vec3 fill, vec3 stroke, float lineWidth) { - return mix(stroke, fill, edgeFactor(lineWidth)); -} - -vec3 getWireframeColor(vec3 fill) { - float brightness = 0.2126 * fill.r + 0.7152 * fill.g + 0.0722 * fill.b; - return (brightness > 0.75) ? vec3(0.11, 0.165, 0.208) : vec3(0.988, 0.988, 0.988); -} - -uniform vec4 uniform_color; -uniform SlopeDetection slope; - -//BBS: add outline_color -uniform bool is_outline; -uniform bool show_wireframe; - -uniform bool offset_depth_buffer; - -#ifdef ENABLE_ENVIRONMENT_MAP - uniform sampler2D environment_tex; - uniform bool use_environment_tex; -#endif // ENABLE_ENVIRONMENT_MAP - -varying vec3 clipping_planes_dots; - -// x = diffuse, y = specular; -varying vec2 intensity; - -uniform PrintVolumeDetection print_volume; - -varying vec4 model_pos; -varying vec4 world_pos; -varying float world_normal_z; -varying vec3 eye_normal; - -void main() -{ - if (any(lessThan(clipping_planes_dots, ZERO))) - discard; - vec3 color = uniform_color.rgb; - float alpha = uniform_color.a; - - if (slope.actived && world_normal_z < slope.normal_z - EPSILON) { - //color = vec3(0.7, 0.7, 1.0); - color = ORANGE; - alpha = 1.0; - } - - // if the fragment is outside the print volume -> use darker color - vec3 pv_check_min = ZERO; - vec3 pv_check_max = ZERO; - if (print_volume.type == 0) { - // rectangle - pv_check_min = world_pos.xyz - vec3(print_volume.xy_data.x, print_volume.xy_data.y, print_volume.z_data.x); - pv_check_max = world_pos.xyz - vec3(print_volume.xy_data.z, print_volume.xy_data.w, print_volume.z_data.y); - color = (any(lessThan(pv_check_min, ZERO)) || any(greaterThan(pv_check_max, ZERO))) ? mix(color, ZERO, 0.3333) : color; - } - else if (print_volume.type == 1) { - // circle - float delta_radius = print_volume.xy_data.z - distance(world_pos.xy, print_volume.xy_data.xy); - pv_check_min = vec3(delta_radius, 0.0, world_pos.z - print_volume.z_data.x); - pv_check_max = vec3(0.0, 0.0, world_pos.z - print_volume.z_data.y); - color = (any(lessThan(pv_check_min, ZERO)) || any(greaterThan(pv_check_max, ZERO))) ? mix(color, ZERO, 0.3333) : color; - } - - //BBS: add outline_color - if (is_outline) - gl_FragColor = uniform_color; -#ifdef ENABLE_ENVIRONMENT_MAP - else if (use_environment_tex) - gl_FragColor = vec4(0.45 * texture2D(environment_tex, normalize(eye_normal).xy * 0.5 + 0.5).xyz + 0.8 * color * intensity.x, alpha); -#endif - else { - //gl_FragColor = vec4(vec3(intensity.y) + color * intensity.x, alpha); - if (show_wireframe) { - vec3 wireframeColor = show_wireframe ? getWireframeColor(color) : color; - vec3 triangleColor = wireframe(color, wireframeColor, 1.0); - gl_FragColor = vec4(vec3(intensity.y) + triangleColor * intensity.x, alpha); - } - else { - gl_FragColor = vec4(vec3(intensity.y) + color * intensity.x, alpha); - } - } - // In the support painting gizmo and the seam painting gizmo are painted triangles rendered over the already - // rendered object. To resolved z-fighting between previously rendered object and painted triangles, values - // inside the depth buffer are offset by small epsilon for painted triangles inside those gizmos. - gl_FragDepth = gl_FragCoord.z - (offset_depth_buffer ? EPSILON : 0.0); -} \ No newline at end of file diff --git a/resources/shaders/gouraud_130.vs b/resources/shaders/gouraud_130.vs deleted file mode 100644 index 9d46b5c55c..0000000000 --- a/resources/shaders/gouraud_130.vs +++ /dev/null @@ -1,79 +0,0 @@ -#version 130 - -#define INTENSITY_CORRECTION 0.6 - -// normalized values for (-0.6/1.31, 0.6/1.31, 1./1.31) -const vec3 LIGHT_TOP_DIR = vec3(-0.4574957, 0.4574957, 0.7624929); -#define LIGHT_TOP_DIFFUSE (0.8 * INTENSITY_CORRECTION) -#define LIGHT_TOP_SPECULAR (0.125 * INTENSITY_CORRECTION) -#define LIGHT_TOP_SHININESS 20.0 - -// normalized values for (1./1.43, 0.2/1.43, 1./1.43) -const vec3 LIGHT_FRONT_DIR = vec3(0.6985074, 0.1397015, 0.6985074); -#define LIGHT_FRONT_DIFFUSE (0.3 * INTENSITY_CORRECTION) -//#define LIGHT_FRONT_SPECULAR (0.0 * INTENSITY_CORRECTION) -//#define LIGHT_FRONT_SHININESS 5.0 - -#define INTENSITY_AMBIENT 0.3 - -const vec3 ZERO = vec3(0.0, 0.0, 0.0); - -struct SlopeDetection -{ - bool actived; - float normal_z; - mat3 volume_world_normal_matrix; -}; - -uniform mat4 volume_world_matrix; -uniform SlopeDetection slope; - -// Clipping plane, x = min z, y = max z. Used by the FFF and SLA previews to clip with a top / bottom plane. -uniform vec2 z_range; -// Clipping plane - general orientation. Used by the SLA gizmo. -uniform vec4 clipping_plane; - -// x = diffuse, y = specular; -varying vec2 intensity; - -varying vec3 clipping_planes_dots; - -varying vec4 model_pos; -varying vec4 world_pos; -varying float world_normal_z; -varying vec3 eye_normal; - -varying vec3 barycentric_coordinates; - -void main() -{ - // First transform the normal into camera space and normalize the result. - eye_normal = normalize(gl_NormalMatrix * gl_Normal); - - // Compute the cos of the angle between the normal and lights direction. The light is directional so the direction is constant for every vertex. - // Since these two are normalized the cosine is the dot product. We also need to clamp the result to the [0,1] range. - float NdotL = max(dot(eye_normal, LIGHT_TOP_DIR), 0.0); - - intensity.x = INTENSITY_AMBIENT + NdotL * LIGHT_TOP_DIFFUSE; - vec3 position = (gl_ModelViewMatrix * gl_Vertex).xyz; - intensity.y = LIGHT_TOP_SPECULAR * pow(max(dot(-normalize(position), reflect(-LIGHT_TOP_DIR, eye_normal)), 0.0), LIGHT_TOP_SHININESS); - - // Perform the same lighting calculation for the 2nd light source (no specular applied). - NdotL = max(dot(eye_normal, LIGHT_FRONT_DIR), 0.0); - intensity.x += NdotL * LIGHT_FRONT_DIFFUSE; - - model_pos = gl_Vertex; - // Point in homogenous coordinates. - world_pos = volume_world_matrix * gl_Vertex; - - // z component of normal vector in world coordinate used for slope shading - world_normal_z = slope.actived ? (normalize(slope.volume_world_normal_matrix * gl_Normal)).z : 0.0; - - gl_Position = ftransform(); - // Fill in the scalars for fragment shader clipping. Fragments with any of these components lower than zero are discarded. - clipping_planes_dots = vec3(dot(world_pos, clipping_plane), world_pos.z - z_range.x, z_range.y - world_pos.z); - - //compute the Barycentric Coordinates - int vertexMod3 = gl_VertexID % 3; - barycentric_coordinates = vec3(float(vertexMod3 == 0), float(vertexMod3 == 1), float(vertexMod3 == 2)); -} diff --git a/resources/shaders/gouraud_light.fs b/resources/shaders/gouraud_light.fs deleted file mode 100644 index 970185a00e..0000000000 --- a/resources/shaders/gouraud_light.fs +++ /dev/null @@ -1,12 +0,0 @@ -#version 110 - -uniform vec4 uniform_color; -uniform float emission_factor; - -// x = tainted, y = specular; -varying vec2 intensity; - -void main() -{ - gl_FragColor = vec4(vec3(intensity.y) + uniform_color.rgb * (intensity.x + emission_factor), uniform_color.a); -} diff --git a/resources/shaders/gouraud_light.vs b/resources/shaders/gouraud_light.vs deleted file mode 100644 index d4f71938a9..0000000000 --- a/resources/shaders/gouraud_light.vs +++ /dev/null @@ -1,38 +0,0 @@ -#version 110 - -#define INTENSITY_CORRECTION 0.6 - -// normalized values for (-0.6/1.31, 0.6/1.31, 1./1.31) -const vec3 LIGHT_TOP_DIR = vec3(-0.4574957, 0.4574957, 0.7624929); -#define LIGHT_TOP_DIFFUSE (0.8 * INTENSITY_CORRECTION) -#define LIGHT_TOP_SPECULAR (0.125 * INTENSITY_CORRECTION) -#define LIGHT_TOP_SHININESS 20.0 - -// normalized values for (1./1.43, 0.2/1.43, 1./1.43) -const vec3 LIGHT_FRONT_DIR = vec3(0.6985074, 0.1397015, 0.6985074); -#define LIGHT_FRONT_DIFFUSE (0.3 * INTENSITY_CORRECTION) - -#define INTENSITY_AMBIENT 0.3 - -// x = tainted, y = specular; -varying vec2 intensity; - -void main() -{ - // First transform the normal into camera space and normalize the result. - vec3 normal = normalize(gl_NormalMatrix * gl_Normal); - - // Compute the cos of the angle between the normal and lights direction. The light is directional so the direction is constant for every vertex. - // Since these two are normalized the cosine is the dot product. We also need to clamp the result to the [0,1] range. - float NdotL = max(dot(normal, LIGHT_TOP_DIR), 0.0); - - intensity.x = INTENSITY_AMBIENT + NdotL * LIGHT_TOP_DIFFUSE; - vec3 position = (gl_ModelViewMatrix * gl_Vertex).xyz; - intensity.y = LIGHT_TOP_SPECULAR * pow(max(dot(-normalize(position), reflect(-LIGHT_TOP_DIR, normal)), 0.0), LIGHT_TOP_SHININESS); - - // Perform the same lighting calculation for the 2nd light source (no specular applied). - NdotL = max(dot(normal, LIGHT_FRONT_DIR), 0.0); - intensity.x += NdotL * LIGHT_FRONT_DIFFUSE; - - gl_Position = ftransform(); -} diff --git a/resources/shaders/gouraud_light_instanced.fs b/resources/shaders/gouraud_light_instanced.fs deleted file mode 100644 index 970185a00e..0000000000 --- a/resources/shaders/gouraud_light_instanced.fs +++ /dev/null @@ -1,12 +0,0 @@ -#version 110 - -uniform vec4 uniform_color; -uniform float emission_factor; - -// x = tainted, y = specular; -varying vec2 intensity; - -void main() -{ - gl_FragColor = vec4(vec3(intensity.y) + uniform_color.rgb * (intensity.x + emission_factor), uniform_color.a); -} diff --git a/resources/shaders/gouraud_light_instanced.vs b/resources/shaders/gouraud_light_instanced.vs deleted file mode 100644 index a42f8e9a4e..0000000000 --- a/resources/shaders/gouraud_light_instanced.vs +++ /dev/null @@ -1,46 +0,0 @@ -#version 110 - -#define INTENSITY_CORRECTION 0.6 - -// normalized values for (-0.6/1.31, 0.6/1.31, 1./1.31) -const vec3 LIGHT_TOP_DIR = vec3(-0.4574957, 0.4574957, 0.7624929); -#define LIGHT_TOP_DIFFUSE (0.8 * INTENSITY_CORRECTION) -#define LIGHT_TOP_SPECULAR (0.125 * INTENSITY_CORRECTION) -#define LIGHT_TOP_SHININESS 20.0 - -// normalized values for (1./1.43, 0.2/1.43, 1./1.43) -const vec3 LIGHT_FRONT_DIR = vec3(0.6985074, 0.1397015, 0.6985074); -#define LIGHT_FRONT_DIFFUSE (0.3 * INTENSITY_CORRECTION) - -#define INTENSITY_AMBIENT 0.3 - -// vertex attributes -attribute vec3 v_position; -attribute vec3 v_normal; -// instance attributes -attribute vec3 i_offset; -attribute vec2 i_scales; - -// x = tainted, y = specular; -varying vec2 intensity; - -void main() -{ - // First transform the normal into camera space and normalize the result. - vec3 eye_normal = normalize(gl_NormalMatrix * v_normal); - - // Compute the cos of the angle between the normal and lights direction. The light is directional so the direction is constant for every vertex. - // Since these two are normalized the cosine is the dot product. We also need to clamp the result to the [0,1] range. - float NdotL = max(dot(eye_normal, LIGHT_TOP_DIR), 0.0); - - intensity.x = INTENSITY_AMBIENT + NdotL * LIGHT_TOP_DIFFUSE; - vec4 world_position = vec4(v_position * vec3(vec2(1.5 * i_scales.x), 1.5 * i_scales.y) + i_offset - vec3(0.0, 0.0, 0.5 * i_scales.y), 1.0); - vec3 eye_position = (gl_ModelViewMatrix * world_position).xyz; - intensity.y = LIGHT_TOP_SPECULAR * pow(max(dot(-normalize(eye_position), reflect(-LIGHT_TOP_DIR, eye_normal)), 0.0), LIGHT_TOP_SHININESS); - - // Perform the same lighting calculation for the 2nd light source (no specular applied). - NdotL = max(dot(eye_normal, LIGHT_FRONT_DIR), 0.0); - intensity.x += NdotL * LIGHT_FRONT_DIFFUSE; - - gl_Position = gl_ProjectionMatrix * vec4(eye_position, 1.0); -} diff --git a/resources/shaders/mm_contour.fs b/resources/shaders/mm_contour.fs deleted file mode 100644 index 8ccf5b832c..0000000000 --- a/resources/shaders/mm_contour.fs +++ /dev/null @@ -1,11 +0,0 @@ -#version 110 - -const float EPSILON = 0.0001; - -void main() -{ - gl_FragColor = vec4(1.0, 1.0, 1.0, 1.0); - // Values inside depth buffer for fragments of the contour of a selected area are offset - // by small epsilon to solve z-fighting between painted triangles and contour lines. - gl_FragDepth = gl_FragCoord.z - EPSILON; -} diff --git a/resources/shaders/mm_contour.vs b/resources/shaders/mm_contour.vs deleted file mode 100644 index d0d3ee42a9..0000000000 --- a/resources/shaders/mm_contour.vs +++ /dev/null @@ -1,6 +0,0 @@ -#version 110 - -void main() -{ - gl_Position = ftransform(); -} diff --git a/resources/shaders/mm_gouraud.fs b/resources/shaders/mm_gouraud.fs deleted file mode 100644 index 4a74d75b56..0000000000 --- a/resources/shaders/mm_gouraud.fs +++ /dev/null @@ -1,83 +0,0 @@ -#version 110 - -#define INTENSITY_CORRECTION 0.6 - -// normalized values for (-0.6/1.31, 0.6/1.31, 1./1.31) -const vec3 LIGHT_TOP_DIR = vec3(-0.4574957, 0.4574957, 0.7624929); -#define LIGHT_TOP_DIFFUSE (0.8 * INTENSITY_CORRECTION) -#define LIGHT_TOP_SPECULAR (0.125 * INTENSITY_CORRECTION) -#define LIGHT_TOP_SHININESS 20.0 - -// normalized values for (1./1.43, 0.2/1.43, 1./1.43) -const vec3 LIGHT_FRONT_DIR = vec3(0.6985074, 0.1397015, 0.6985074); -#define LIGHT_FRONT_DIFFUSE (0.3 * INTENSITY_CORRECTION) - -#define INTENSITY_AMBIENT 0.3 - -const vec3 ZERO = vec3(0.0, 0.0, 0.0); -const float EPSILON = 0.0001; -//BBS: add grey and orange -//const vec3 GREY = vec3(0.9, 0.9, 0.9); -const vec3 ORANGE = vec3(0.8, 0.4, 0.0); -const vec3 LightRed = vec3(0.78, 0.0, 0.0); -const vec3 LightBlue = vec3(0.73, 1.0, 1.0); -uniform vec4 uniform_color; - -varying vec3 clipping_planes_dots; -varying vec4 model_pos; -varying vec4 world_pos; -uniform bool volume_mirrored; - -struct SlopeDetection -{ - bool actived; - float normal_z; - mat3 volume_world_normal_matrix; -}; -uniform SlopeDetection slope; - -void main() -{ - if (any(lessThan(clipping_planes_dots, ZERO))) - discard; - vec3 color = uniform_color.rgb; - float alpha = uniform_color.a; - - vec3 triangle_normal = normalize(cross(dFdx(model_pos.xyz), dFdy(model_pos.xyz))); - if (volume_mirrored) - { - triangle_normal = -triangle_normal; - } - vec3 transformed_normal = normalize(slope.volume_world_normal_matrix * triangle_normal); - - if (slope.actived) { - if(world_pos.z<0.1&&world_pos.z>-0.1) - { - color = LightBlue; - alpha = 1.0; - } - else if( transformed_normal.z < slope.normal_z - EPSILON) - { - color = color * 0.5 + LightRed * 0.5; - alpha = 1.0; - } - } - // First transform the normal into camera space and normalize the result. - vec3 eye_normal = normalize(gl_NormalMatrix * triangle_normal); - - // Compute the cos of the angle between the normal and lights direction. The light is directional so the direction is constant for every vertex. - // Since these two are normalized the cosine is the dot product. We also need to clamp the result to the [0,1] range. - float NdotL = max(dot(eye_normal, LIGHT_TOP_DIR), 0.0); - - // x = diffuse, y = specular; - vec2 intensity = vec2(0.0, 0.0); - intensity.x = INTENSITY_AMBIENT + NdotL * LIGHT_TOP_DIFFUSE; - vec3 position = (gl_ModelViewMatrix * model_pos).xyz; - intensity.y = LIGHT_TOP_SPECULAR * pow(max(dot(-normalize(position), reflect(-LIGHT_TOP_DIR, eye_normal)), 0.0), LIGHT_TOP_SHININESS); - - // Perform the same lighting calculation for the 2nd light source (no specular applied). - NdotL = max(dot(eye_normal, LIGHT_FRONT_DIR), 0.0); - intensity.x += NdotL * LIGHT_FRONT_DIFFUSE; - - gl_FragColor = vec4(vec3(intensity.y) + color * intensity.x, alpha); -} diff --git a/resources/shaders/mm_gouraud.vs b/resources/shaders/mm_gouraud.vs deleted file mode 100644 index 5929c88bec..0000000000 --- a/resources/shaders/mm_gouraud.vs +++ /dev/null @@ -1,30 +0,0 @@ -#version 110 - -const vec3 ZERO = vec3(0.0, 0.0, 0.0); - -uniform mat4 volume_world_matrix; -// Clipping plane, x = min z, y = max z. Used by the FFF and SLA previews to clip with a top / bottom plane. -uniform vec2 z_range; -// Clipping plane - general orientation. Used by the SLA gizmo. -uniform vec4 clipping_plane; - -varying vec3 clipping_planes_dots; -varying vec4 model_pos; -varying vec4 world_pos; -struct SlopeDetection -{ - bool actived; - float normal_z; - mat3 volume_world_normal_matrix; -}; -uniform SlopeDetection slope; -void main() -{ - model_pos = gl_Vertex; - // Point in homogenous coordinates. - world_pos = volume_world_matrix * gl_Vertex; - - gl_Position = ftransform(); - // Fill in the scalars for fragment shader clipping. Fragments with any of these components lower than zero are discarded. - clipping_planes_dots = vec3(dot(world_pos, clipping_plane), world_pos.z - z_range.x, z_range.y - world_pos.z); -} diff --git a/resources/shaders/mm_gouraud_wireframe.fs b/resources/shaders/mm_gouraud_wireframe.fs deleted file mode 100644 index c10b0fd099..0000000000 --- a/resources/shaders/mm_gouraud_wireframe.fs +++ /dev/null @@ -1,107 +0,0 @@ -#version 110 - -#define INTENSITY_CORRECTION 0.6 - -// normalized values for (-0.6/1.31, 0.6/1.31, 1./1.31) -const vec3 LIGHT_TOP_DIR = vec3(-0.4574957, 0.4574957, 0.7624929); -#define LIGHT_TOP_DIFFUSE (0.8 * INTENSITY_CORRECTION) -#define LIGHT_TOP_SPECULAR (0.125 * INTENSITY_CORRECTION) -#define LIGHT_TOP_SHININESS 20.0 - -// normalized values for (1./1.43, 0.2/1.43, 1./1.43) -const vec3 LIGHT_FRONT_DIR = vec3(0.6985074, 0.1397015, 0.6985074); -#define LIGHT_FRONT_DIFFUSE (0.3 * INTENSITY_CORRECTION) - -#define INTENSITY_AMBIENT 0.3 - -const vec3 ZERO = vec3(0.0, 0.0, 0.0); -const float EPSILON = 0.0001; -//BBS: add grey and orange -//const vec3 GREY = vec3(0.9, 0.9, 0.9); -const vec3 ORANGE = vec3(0.8, 0.4, 0.0); - -uniform vec4 uniform_color; - -varying vec3 clipping_planes_dots; -varying vec4 model_pos; - -uniform bool volume_mirrored; - -struct SlopeDetection -{ - bool actived; - float normal_z; - mat3 volume_world_normal_matrix; -}; -uniform SlopeDetection slope; - -//BBS: add wireframe logic -varying vec3 barycentric_coordinates; -float edgeFactor(float lineWidth) { - vec3 d = fwidth(barycentric_coordinates); - vec3 a3 = smoothstep(vec3(0.0), d * lineWidth, barycentric_coordinates); - return min(min(a3.x, a3.y), a3.z); -} - -vec3 wireframe(vec3 fill, vec3 stroke, float lineWidth) { - return mix(stroke, fill, edgeFactor(lineWidth)); - //if (any(lessThan(barycentric_coordinates, vec3(0.005, 0.005, 0.005)))) - // return vec3(1.0, 0.0, 0.0); - //else - // return fill; -} - -vec3 getWireframeColor(vec3 fill) { - float brightness = 0.2126 * fill.r + 0.7152 * fill.g + 0.0722 * fill.b; - return (brightness > 0.75) ? vec3(0.11, 0.165, 0.208) : vec3(0.988, 0.988, 0.988); -} -uniform bool show_wireframe; - -void main() -{ - if (any(lessThan(clipping_planes_dots, ZERO))) - discard; - vec3 color = uniform_color.rgb; - float alpha = uniform_color.a; - - vec3 triangle_normal = normalize(cross(dFdx(model_pos.xyz), dFdy(model_pos.xyz))); -#ifdef FLIP_TRIANGLE_NORMALS - triangle_normal = -triangle_normal; -#endif - - vec3 transformed_normal = normalize(slope.volume_world_normal_matrix * triangle_normal); - if (slope.actived && transformed_normal.z < slope.normal_z - EPSILON) { - //color = vec3(0.7, 0.7, 1.0); - color = color * 0.5 + ORANGE * 0.5; - alpha = 1.0; - } - - if (volume_mirrored) - triangle_normal = -triangle_normal; - - // First transform the normal into camera space and normalize the result. - vec3 eye_normal = normalize(gl_NormalMatrix * triangle_normal); - - // Compute the cos of the angle between the normal and lights direction. The light is directional so the direction is constant for every vertex. - // Since these two are normalized the cosine is the dot product. We also need to clamp the result to the [0,1] range. - float NdotL = max(dot(eye_normal, LIGHT_TOP_DIR), 0.0); - - // x = diffuse, y = specular; - vec2 intensity = vec2(0.0, 0.0); - intensity.x = INTENSITY_AMBIENT + NdotL * LIGHT_TOP_DIFFUSE; - vec3 position = (gl_ModelViewMatrix * model_pos).xyz; - intensity.y = LIGHT_TOP_SPECULAR * pow(max(dot(-normalize(position), reflect(-LIGHT_TOP_DIR, eye_normal)), 0.0), LIGHT_TOP_SHININESS); - - // Perform the same lighting calculation for the 2nd light source (no specular applied). - NdotL = max(dot(eye_normal, LIGHT_FRONT_DIR), 0.0); - intensity.x += NdotL * LIGHT_FRONT_DIFFUSE; - - if (show_wireframe) { - vec3 wireframeColor = show_wireframe ? getWireframeColor(color) : color; - vec3 triangleColor = wireframe(color, wireframeColor, 1.0); - gl_FragColor = vec4(vec3(intensity.y) + triangleColor * intensity.x, alpha); - } - else { - gl_FragColor = vec4(vec3(intensity.y) + color * intensity.x, alpha); - } -} diff --git a/resources/shaders/mm_gouraud_wireframe.vs b/resources/shaders/mm_gouraud_wireframe.vs deleted file mode 100644 index f81da2f348..0000000000 --- a/resources/shaders/mm_gouraud_wireframe.vs +++ /dev/null @@ -1,43 +0,0 @@ -#version 110 - -const vec3 ZERO = vec3(0.0, 0.0, 0.0); - -attribute vec3 v_position; -attribute vec3 v_barycentric; - -uniform mat4 volume_world_matrix; -// Clipping plane, x = min z, y = max z. Used by the FFF and SLA previews to clip with a top / bottom plane. -uniform vec2 z_range; -// Clipping plane - general orientation. Used by the SLA gizmo. -uniform vec4 clipping_plane; - -varying vec3 clipping_planes_dots; -varying vec4 model_pos; - -varying vec3 barycentric_coordinates; - -struct SlopeDetection -{ - bool actived; - float normal_z; - mat3 volume_world_normal_matrix; -}; -uniform SlopeDetection slope; -void main() -{ - //model_pos = gl_Vertex; - model_pos = vec4(v_position, 1.0); - // Point in homogenous coordinates. - //vec4 world_pos = volume_world_matrix * gl_Vertex; - vec4 world_pos = volume_world_matrix * model_pos; - - //gl_Position = ftransform(); - gl_Position = gl_ModelViewProjectionMatrix * vec4(v_position.x, v_position.y, v_position.z, 1.0); - // Fill in the scalars for fragment shader clipping. Fragments with any of these components lower than zero are discarded. - clipping_planes_dots = vec3(dot(world_pos, clipping_plane), world_pos.z - z_range.x, z_range.y - world_pos.z); - - //compute the Barycentric Coordinates - //int vertexMod3 = gl_VertexID % 3; - //barycentric_coordinates = vec3(float(vertexMod3 == 0), float(vertexMod3 == 1), float(vertexMod3 == 2)); - barycentric_coordinates = v_barycentric; -} diff --git a/resources/shaders/outline.fs b/resources/shaders/outline.fs deleted file mode 100644 index f8f13853fe..0000000000 --- a/resources/shaders/outline.fs +++ /dev/null @@ -1,10 +0,0 @@ -#version 110 - -const vec3 ORANGE = vec3(0.8, 0.4, 0.0); -uniform vec4 uniform_color; - -void main() -{ - gl_FragColor = uniform_color; - //gl_FragColor = vec4(ORANGE, 1.0); -} \ No newline at end of file diff --git a/resources/shaders/outline.vs b/resources/shaders/outline.vs deleted file mode 100644 index fd6580b46e..0000000000 --- a/resources/shaders/outline.vs +++ /dev/null @@ -1,12 +0,0 @@ -#version 110 - -attribute vec4 v_position; -attribute vec2 v_tex_coords; - -varying vec2 tex_coords; - -void main() -{ - gl_Position = ftransform(); - tex_coords = v_tex_coords; -} diff --git a/resources/shaders/printbed.fs b/resources/shaders/printbed.fs deleted file mode 100644 index 833dff08f4..0000000000 --- a/resources/shaders/printbed.fs +++ /dev/null @@ -1,34 +0,0 @@ -#version 110 - -const vec3 back_color_dark = vec3(0.235, 0.235, 0.235); -const vec3 back_color_light = vec3(0.365, 0.365, 0.365); - -uniform sampler2D texture; -uniform bool transparent_background; -uniform bool svg_source; - -varying vec2 tex_coord; - -vec4 svg_color() -{ - // takes foreground from texture - vec4 fore_color = texture2D(texture, tex_coord); - - // calculates radial gradient - vec3 back_color = vec3(mix(back_color_light, back_color_dark, smoothstep(0.0, 0.5, length(abs(tex_coord.xy) - vec2(0.5))))); - - // blends foreground with background - return vec4(mix(back_color, fore_color.rgb, fore_color.a), transparent_background ? fore_color.a : 1.0); -} - -vec4 non_svg_color() -{ - // takes foreground from texture - vec4 color = texture2D(texture, tex_coord); - return vec4(color.rgb, transparent_background ? color.a * 0.25 : color.a); -} - -void main() -{ - gl_FragColor = svg_source ? svg_color() : non_svg_color(); -} \ No newline at end of file diff --git a/resources/shaders/printbed.vs b/resources/shaders/printbed.vs deleted file mode 100644 index 27addc7526..0000000000 --- a/resources/shaders/printbed.vs +++ /dev/null @@ -1,9 +0,0 @@ -#version 110 - -varying vec2 tex_coord; - -void main() -{ - gl_Position = ftransform(); - tex_coord = gl_MultiTexCoord0.xy; -} diff --git a/resources/shaders/thumbnail.fs b/resources/shaders/thumbnail.fs deleted file mode 100644 index 4b269734ee..0000000000 --- a/resources/shaders/thumbnail.fs +++ /dev/null @@ -1,16 +0,0 @@ -#version 110 - -uniform vec4 uniform_color; -uniform float emission_factor; - -// x = tainted, y = specular; -varying vec2 intensity; -//varying float drop; -varying vec4 world_pos; - -void main() -{ - if (world_pos.z < 0.0) - discard; - gl_FragColor = vec4(vec3(intensity.y) + uniform_color.rgb * (intensity.x + emission_factor), uniform_color.a); -} diff --git a/resources/shaders/thumbnail.vs b/resources/shaders/thumbnail.vs deleted file mode 100644 index a02248f28d..0000000000 --- a/resources/shaders/thumbnail.vs +++ /dev/null @@ -1,43 +0,0 @@ -#version 110 - -#define INTENSITY_CORRECTION 0.6 - -// normalized values for (-0.6/1.31, 0.6/1.31, 1./1.31) -const vec3 LIGHT_TOP_DIR = vec3(-0.4574957, 0.4574957, 0.7624929); -#define LIGHT_TOP_DIFFUSE (0.8 * INTENSITY_CORRECTION) -#define LIGHT_TOP_SPECULAR (0.125 * INTENSITY_CORRECTION) -#define LIGHT_TOP_SHININESS 20.0 - -// normalized values for (1./1.43, 0.2/1.43, 1./1.43) -const vec3 LIGHT_FRONT_DIR = vec3(0.6985074, 0.1397015, 0.6985074); -#define LIGHT_FRONT_DIFFUSE (0.3 * INTENSITY_CORRECTION) - -#define INTENSITY_AMBIENT 0.3 - -uniform mat4 volume_world_matrix; -// x = tainted, y = specular; -varying vec2 intensity; -varying vec4 world_pos; - -void main() -{ - // First transform the normal into camera space and normalize the result. - vec3 normal = normalize(gl_NormalMatrix * gl_Normal); - - // Compute the cos of the angle between the normal and lights direction. The light is directional so the direction is constant for every vertex. - // Since these two are normalized the cosine is the dot product. We also need to clamp the result to the [0,1] range. - float NdotL = max(dot(normal, LIGHT_TOP_DIR), 0.0); - - intensity.x = INTENSITY_AMBIENT + NdotL * LIGHT_TOP_DIFFUSE; - vec3 position = (gl_ModelViewMatrix * gl_Vertex).xyz; - intensity.y = LIGHT_TOP_SPECULAR * pow(max(dot(-normalize(position), reflect(-LIGHT_TOP_DIR, normal)), 0.0), LIGHT_TOP_SHININESS); - - // Perform the same lighting calculation for the 2nd light source (no specular applied). - NdotL = max(dot(normal, LIGHT_FRONT_DIR), 0.0); - intensity.x += NdotL * LIGHT_FRONT_DIFFUSE; - - // Point in homogenous coordinates. - world_pos = volume_world_matrix * gl_Vertex; - - gl_Position = ftransform(); -} diff --git a/resources/shaders/toolpaths_lines.fs b/resources/shaders/toolpaths_lines.fs deleted file mode 100644 index 31151cdc17..0000000000 --- a/resources/shaders/toolpaths_lines.fs +++ /dev/null @@ -1,28 +0,0 @@ -#version 110 - -// normalized values for (-0.6/1.31, 0.6/1.31, 1./1.31) -const vec3 LIGHT_TOP_DIR = vec3(-0.4574957, 0.4574957, 0.7624929); -const vec3 LIGHT_FRONT_DIR = vec3(0.0, 0.0, 1.0); - -// x = ambient, y = top diffuse, z = front diffuse, w = global -uniform vec4 light_intensity; -uniform vec4 uniform_color; - -varying vec3 eye_normal; - -void main() -{ - vec3 normal = normalize(eye_normal); - - // Compute the cos of the angle between the normal and lights direction. The light is directional so the direction is constant for every vertex. - // Since these two are normalized the cosine is the dot product. Take the abs value to light the lines no matter in which direction the normal points. - float NdotL = abs(dot(normal, LIGHT_TOP_DIR)); - - float intensity = light_intensity.x + NdotL * light_intensity.y; - - // Perform the same lighting calculation for the 2nd light source. - NdotL = abs(dot(normal, LIGHT_FRONT_DIR)); - intensity += NdotL * light_intensity.z; - - gl_FragColor = vec4(uniform_color.rgb * light_intensity.w * intensity, uniform_color.a); -} diff --git a/resources/shaders/toolpaths_lines.vs b/resources/shaders/toolpaths_lines.vs deleted file mode 100644 index c008aedc66..0000000000 --- a/resources/shaders/toolpaths_lines.vs +++ /dev/null @@ -1,9 +0,0 @@ -#version 110 - -varying vec3 eye_normal; - -void main() -{ - gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex; - eye_normal = gl_NormalMatrix * gl_Normal; -} diff --git a/resources/shaders/variable_layer_height.fs b/resources/shaders/variable_layer_height.fs deleted file mode 100644 index 693c1c6a0b..0000000000 --- a/resources/shaders/variable_layer_height.fs +++ /dev/null @@ -1,41 +0,0 @@ -#version 110 - -#define M_PI 3.1415926535897932384626433832795 - -// 2D texture (1D texture split by the rows) of color along the object Z axis. -uniform sampler2D z_texture; -// Scaling from the Z texture rows coordinate to the normalized texture row coordinate. -uniform float z_to_texture_row; -uniform float z_texture_row_to_normalized; -uniform float z_cursor; -uniform float z_cursor_band_width; - -// x = tainted, y = specular; -varying vec2 intensity; - -varying float object_z; - -void main() -{ - float object_z_row = z_to_texture_row * object_z; - // Index of the row in the texture. - float z_texture_row = floor(object_z_row); - // Normalized coordinate from 0. to 1. - float z_texture_col = object_z_row - z_texture_row; - float z_blend = 0.25 * cos(min(M_PI, abs(M_PI * (object_z - z_cursor) * 1.8 / z_cursor_band_width))) + 0.25; - // Calculate level of detail from the object Z coordinate. - // This makes the slowly sloping surfaces to be shown with high detail (with stripes), - // and the vertical surfaces to be shown with low detail (no stripes) - float z_in_cells = object_z_row * 190.; - // Gradient of Z projected on the screen. - float dx_vtc = dFdx(z_in_cells); - float dy_vtc = dFdy(z_in_cells); - float lod = clamp(0.5 * log2(max(dx_vtc * dx_vtc, dy_vtc * dy_vtc)), 0., 1.); - // Sample the Z texture. Texture coordinates are normalized to <0, 1>. - vec4 color = vec4(0.25, 0.25, 0.25, 1.0); - if (z_texture_row >= 0.0) - color = mix(texture2D(z_texture, vec2(z_texture_col, z_texture_row_to_normalized * (z_texture_row + 0.5 )), -10000.), - texture2D(z_texture, vec2(z_texture_col, z_texture_row_to_normalized * (z_texture_row * 2. + 1.)), 10000.), lod); - // Mix the final color. - gl_FragColor = vec4(vec3(intensity.y), 1.0) + intensity.x * mix(color, vec4(1.0, 1.0, 0.0, 1.0), z_blend); -} diff --git a/resources/shaders/variable_layer_height.vs b/resources/shaders/variable_layer_height.vs deleted file mode 100644 index 0e966b0814..0000000000 --- a/resources/shaders/variable_layer_height.vs +++ /dev/null @@ -1,52 +0,0 @@ -#version 110 - -#define INTENSITY_CORRECTION 0.6 - -const vec3 LIGHT_TOP_DIR = vec3(-0.4574957, 0.4574957, 0.7624929); -#define LIGHT_TOP_DIFFUSE (0.8 * INTENSITY_CORRECTION) -#define LIGHT_TOP_SPECULAR (0.125 * INTENSITY_CORRECTION) -#define LIGHT_TOP_SHININESS 20.0 - -const vec3 LIGHT_FRONT_DIR = vec3(0.6985074, 0.1397015, 0.6985074); -#define LIGHT_FRONT_DIFFUSE (0.3 * INTENSITY_CORRECTION) -//#define LIGHT_FRONT_SPECULAR (0.0 * INTENSITY_CORRECTION) -//#define LIGHT_FRONT_SHININESS 5.0 - -#define INTENSITY_AMBIENT 0.3 - -uniform mat4 volume_world_matrix; -uniform float object_max_z; - -// x = tainted, y = specular; -varying vec2 intensity; - -varying float object_z; - -void main() -{ - // First transform the normal into camera space and normalize the result. - vec3 normal = normalize(gl_NormalMatrix * gl_Normal); - - // Compute the cos of the angle between the normal and lights direction. The light is directional so the direction is constant for every vertex. - // Since these two are normalized the cosine is the dot product. We also need to clamp the result to the [0,1] range. - float NdotL = max(dot(normal, LIGHT_TOP_DIR), 0.0); - - intensity.x = INTENSITY_AMBIENT + NdotL * LIGHT_TOP_DIFFUSE; - vec3 position = (gl_ModelViewMatrix * gl_Vertex).xyz; - intensity.y = LIGHT_TOP_SPECULAR * pow(max(dot(-normalize(position), reflect(-LIGHT_TOP_DIR, normal)), 0.0), LIGHT_TOP_SHININESS); - - // Perform the same lighting calculation for the 2nd light source (no specular) - NdotL = max(dot(normal, LIGHT_FRONT_DIR), 0.0); - - intensity.x += NdotL * LIGHT_FRONT_DIFFUSE; - - // Scaled to widths of the Z texture. - if (object_max_z > 0.0) - // when rendering the overlay - object_z = object_max_z * gl_MultiTexCoord0.y; - else - // when rendering the volumes - object_z = (volume_world_matrix * gl_Vertex).z; - - gl_Position = ftransform(); -} diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index 1593b183f7..bc74bd4441 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -3377,8 +3377,8 @@ void GLCanvas3D::on_key(wxKeyEvent& evt) wxGetApp().plater()->toggle_render_statistic_dialog(); m_dirty = true; #endif - } - else if (evt.ShiftDown() && evt.ControlDown() && keyCode == WXK_RETURN) { + } else if ((evt.ShiftDown() && evt.ControlDown() && keyCode == WXK_RETURN) || + evt.ShiftDown() && evt.AltDown() && keyCode == WXK_RETURN) { wxGetApp().plater()->toggle_show_wireframe(); m_dirty = true; } diff --git a/src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp b/src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp index d9a396ba10..b79dfb1ec2 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp @@ -138,7 +138,7 @@ bool GLGizmoMmuSegmentation::on_init() m_desc["height_range"] = _L("Height range"); //add toggle wire frame hint - m_desc["toggle_wireframe_caption"] = _L("Ctrl + Shift + Enter"); + m_desc["toggle_wireframe_caption"] = _L("Alt + Shift + Enter"); m_desc["toggle_wireframe"] = _L("Toggle Wireframe"); init_extruders_data(); @@ -358,17 +358,17 @@ void GLGizmoMmuSegmentation::show_tooltip_information(float caption_max, float x std::vector tip_items; switch (m_tool_type) { - case ToolType::BRUSH: - tip_items = {"paint", "erase", "cursor_size", "clipping_of_view"}; + case ToolType::BRUSH: + tip_items = {"paint", "erase", "cursor_size", "clipping_of_view", "toggle_wireframe"}; break; - case ToolType::BUCKET_FILL: - tip_items = {"paint", "erase", "smart_fill_angle", "clipping_of_view"}; + case ToolType::BUCKET_FILL: + tip_items = {"paint", "erase", "smart_fill_angle", "clipping_of_view", "toggle_wireframe"}; break; case ToolType::SMART_FILL: // TODO: break; case ToolType::GAP_FILL: - tip_items = {"gap_area"}; + tip_items = {"gap_area", "toggle_wireframe"}; break; default: break; diff --git a/src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp b/src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp index 6bf8a526ab..015e47cbda 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp @@ -1237,6 +1237,12 @@ float TriangleSelectorPatch::gap_area = TriangleSelectorPatch::GapAreaMin; void TriangleSelectorPatch::render(ImGuiWrapper* imgui, const Transform3d& matrix) { + static bool last_show_wireframe = false; + if (last_show_wireframe != wxGetApp().plater()->is_show_wireframe()) { + last_show_wireframe = wxGetApp().plater()->is_show_wireframe(); + m_update_render_data = true; + m_paint_changed = true; + } if (m_update_render_data) { update_render_data(); m_update_render_data = false; @@ -1246,6 +1252,18 @@ void TriangleSelectorPatch::render(ImGuiWrapper* imgui, const Transform3d& matri if (!shader) return; assert(shader->get_name() == "gouraud" || shader->get_name() == "mm_gouraud"); + bool show_wireframe = false; + if (wxGetApp().plater()->is_wireframe_enabled()) { + if (m_need_wireframe && wxGetApp().plater()->is_show_wireframe()) { + //BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << boost::format(", show_wireframe on"); + shader->set_uniform("show_wireframe", true); + show_wireframe = true; + } + else { + //BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << boost::format(", show_wireframe off"); + shader->set_uniform("show_wireframe", false); + } + } for (size_t buffer_idx = 0; buffer_idx < m_triangle_patches.size(); ++buffer_idx) { if (this->has_VBOs(buffer_idx)) { @@ -1263,7 +1281,7 @@ void TriangleSelectorPatch::render(ImGuiWrapper* imgui, const Transform3d& matri //to make black not too hard too see ColorRGBA new_color = adjust_color_for_rendering(color); shader->set_uniform("uniform_color", new_color); - this->render(buffer_idx); + this->render(buffer_idx, show_wireframe); } } @@ -1280,7 +1298,7 @@ void TriangleSelectorPatch::update_triangles_per_type() patch.triangle_indices.reserve(m_triangles.size() / 3); } - bool using_wireframe = (wxGetApp().plater()->is_wireframe_enabled())?true:false; + bool using_wireframe = (wxGetApp().plater()->is_wireframe_enabled() && wxGetApp().plater()->is_show_wireframe()) ? true : false; for (auto& triangle : m_triangles) { if (!triangle.valid() || triangle.is_split()) @@ -1338,7 +1356,7 @@ void TriangleSelectorPatch::update_triangles_per_patch() auto [neighbors, neighbors_propagated] = this->precompute_all_neighbors(); std::vector visited(m_triangles.size(), false); - bool using_wireframe = (wxGetApp().plater()->is_wireframe_enabled())?true:false; + bool using_wireframe = (wxGetApp().plater()->is_wireframe_enabled() && wxGetApp().plater()->is_show_wireframe()) ? true : false; auto get_all_touching_triangles = [this](int facet_idx, const Vec3i& neighbors, const Vec3i& neighbors_propagated) -> std::vector { assert(facet_idx != -1 && facet_idx < int(m_triangles.size())); @@ -1494,13 +1512,12 @@ void TriangleSelectorPatch::update_render_data() //BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << boost::format(", exit"); } -void TriangleSelectorPatch::render(int triangle_indices_idx) +void TriangleSelectorPatch::render(int triangle_indices_idx, bool show_wireframe) { assert(triangle_indices_idx < this->m_triangle_indices_VBO_ids.size()); assert(this->m_triangle_patches.size() == this->m_triangle_indices_VBO_ids.size()); //assert(this->m_vertices_VBO_id != 0); assert(this->m_triangle_patches.size() == this->m_vertices_VBO_ids.size()); - assert(this->m_vertices_VAO_ids[triangle_indices_idx] != 0); assert(this->m_vertices_VBO_ids[triangle_indices_idx] != 0); assert(this->m_triangle_indices_VBO_ids[triangle_indices_idx] != 0); @@ -1512,9 +1529,21 @@ void TriangleSelectorPatch::render(int triangle_indices_idx) glsafe(::glBindBuffer(GL_ARRAY_BUFFER, this->m_vertices_VBO_ids[triangle_indices_idx])); const GLint position_id = shader->get_attrib_location("v_position"); if (position_id != -1) { - glsafe(::glVertexAttribPointer((GLint) position_id, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), nullptr)); + if (show_wireframe) { + glsafe(::glVertexAttribPointer((GLint) position_id, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(float), (const void *) 0)); + } else { + glsafe(::glVertexAttribPointer((GLint) position_id, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), nullptr)); + } glsafe(::glEnableVertexAttribArray((GLint)position_id)); } + GLint barycentric_id = -1; + if (show_wireframe) { + barycentric_id = shader->get_attrib_location("v_barycentric"); + if (barycentric_id != -1) { + glsafe(::glVertexAttribPointer((GLint) barycentric_id, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(float), (const void *) (3 * sizeof(float)))); + glsafe(::glEnableVertexAttribArray((GLint) barycentric_id)); + } + } // Render using the Vertex Buffer Objects. if (this->m_triangle_indices_sizes[triangle_indices_idx] > 0) { @@ -1526,6 +1555,8 @@ void TriangleSelectorPatch::render(int triangle_indices_idx) if (position_id != -1) glsafe(::glDisableVertexAttribArray(position_id)); + if (barycentric_id != -1) + glsafe(::glDisableVertexAttribArray(barycentric_id)); glsafe(::glBindBuffer(GL_ARRAY_BUFFER, 0)); } diff --git a/src/slic3r/GUI/Gizmos/GLGizmoPainterBase.hpp b/src/slic3r/GUI/Gizmos/GLGizmoPainterBase.hpp index 4ea9412ffa..da05fcfab4 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoPainterBase.hpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoPainterBase.hpp @@ -175,7 +175,7 @@ protected: private: void update_render_data(); - void render(int buffer_idx); + void render(int buffer_idx, bool show_wireframe=false); }; diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index c76307b130..a24eebaf07 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -7742,7 +7742,7 @@ Plater::Plater(wxWindow *parent, MainFrame *main_frame) , p(new priv(this, main_frame)) { // Initialization performed in the private c-tor - enable_wireframe(false); + enable_wireframe(true); } bool Plater::Show(bool show)