diff --git a/manimlib/shaders/inserts/add_light.glsl b/manimlib/shaders/inserts/add_light.glsl index 6feba5f5..8ef7cc11 100644 --- a/manimlib/shaders/inserts/add_light.glsl +++ b/manimlib/shaders/inserts/add_light.glsl @@ -30,4 +30,14 @@ vec4 add_light(vec4 color, darkening * mix(color.rgb, vec3(1.0), shine), color.a ); +} + +vec4 finalize_color(vec4 color, + vec3 point, + vec3 unit_normal, + vec3 light_coords, + float gloss, + float shadow){ + // Put insertion here instead + return add_light(color, point, unit_normal, light_coords, gloss, shadow); } \ No newline at end of file diff --git a/manimlib/shaders/inserts/finalize_color.glsl b/manimlib/shaders/inserts/finalize_color.glsl new file mode 100644 index 00000000..d72eee59 --- /dev/null +++ b/manimlib/shaders/inserts/finalize_color.glsl @@ -0,0 +1,42 @@ +///// INSERT COLOR_MAP FUNCTION HERE ///// + +vec4 add_light(vec4 color, + vec3 point, + vec3 unit_normal, + vec3 light_coords, + float gloss, + float shadow){ + if(gloss == 0.0 && shadow == 0.0) return color; + + // TODO, do we actually want this? It effectively treats surfaces as two-sided + if(unit_normal.z < 0){ + unit_normal *= -1; + } + + // TODO, read this in as a uniform? + float camera_distance = 6; + // Assume everything has already been rotated such that camera is in the z-direction + vec3 to_camera = vec3(0, 0, camera_distance) - point; + vec3 to_light = light_coords - point; + vec3 light_reflection = -to_light + 2 * unit_normal * dot(to_light, unit_normal); + float dot_prod = dot(normalize(light_reflection), normalize(to_camera)); + float shine = gloss * exp(-3 * pow(1 - dot_prod, 2)); + float dp2 = dot(normalize(to_light), unit_normal); + float darkening = mix(1, max(dp2, 0), shadow); + return vec4( + darkening * mix(color.rgb, vec3(1.0), shine), + color.a + ); +} + +vec4 finalize_color(vec4 color, + vec3 point, + vec3 unit_normal, + vec3 light_coords, + float gloss, + float shadow){ + ///// INSERT COLOR FUNCTION HERE ///// + // The line above may be replaced by arbitrary code snippets, as per + // the method Mobject.set_color_by_code + return add_light(color, point, unit_normal, light_coords, gloss, shadow); +} \ No newline at end of file diff --git a/manimlib/shaders/quadratic_bezier_fill/geom.glsl b/manimlib/shaders/quadratic_bezier_fill/geom.glsl index 435a0b31..acd15617 100644 --- a/manimlib/shaders/quadratic_bezier_fill/geom.glsl +++ b/manimlib/shaders/quadratic_bezier_fill/geom.glsl @@ -9,7 +9,7 @@ uniform float anti_alias_width; uniform vec2 frame_shape; uniform float focal_distance; uniform float is_fixed_in_frame; -// Needed for add_light +// Needed for finalize_color uniform vec3 light_source_position; uniform float gloss; uniform float shadow; @@ -35,11 +35,11 @@ out float bezier_degree; #INSERT quadratic_bezier_geometry_functions.glsl #INSERT get_gl_Position.glsl #INSERT get_unit_normal.glsl -#INSERT add_light.glsl +#INSERT finalize_color.glsl void emit_vertex_wrapper(vec3 point, int index){ - color = add_light( + color = finalize_color( v_color[index], point, v_global_unit_normal[index], diff --git a/manimlib/shaders/quadratic_bezier_stroke/geom.glsl b/manimlib/shaders/quadratic_bezier_stroke/geom.glsl index 0c768be4..ffb4e8eb 100644 --- a/manimlib/shaders/quadratic_bezier_stroke/geom.glsl +++ b/manimlib/shaders/quadratic_bezier_stroke/geom.glsl @@ -52,7 +52,7 @@ const float PI = 3.141592653; #INSERT quadratic_bezier_geometry_functions.glsl #INSERT get_gl_Position.glsl #INSERT get_unit_normal.glsl -#INSERT add_light.glsl +#INSERT finalize_color.glsl void flatten_points(in vec3[3] points, out vec2[3] flat_points){ @@ -254,7 +254,7 @@ void main() { // Apply some lighting to the color before sending out. // vec3 xyz_coords = vec3(corners[i], controls[index_map[i]].z); vec3 xyz_coords = vec3(corners[i], controls[index_map[i]].z); - color = add_light( + color = finalize_color( v_color[index_map[i]], xyz_coords, v_global_unit_normal[index_map[i]], diff --git a/manimlib/shaders/surface/frag.glsl b/manimlib/shaders/surface/frag.glsl index fdef1259..db905275 100644 --- a/manimlib/shaders/surface/frag.glsl +++ b/manimlib/shaders/surface/frag.glsl @@ -10,10 +10,10 @@ in vec4 v_color; out vec4 frag_color; -#INSERT add_light.glsl +#INSERT finalize_color.glsl void main() { - frag_color = add_light( + frag_color = finalize_color( v_color, xyz_coords, normalize(v_normal), diff --git a/manimlib/shaders/textured_surface/frag.glsl b/manimlib/shaders/textured_surface/frag.glsl index 93345c13..ab45dad6 100644 --- a/manimlib/shaders/textured_surface/frag.glsl +++ b/manimlib/shaders/textured_surface/frag.glsl @@ -14,7 +14,7 @@ in float v_opacity; out vec4 frag_color; -#INSERT add_light.glsl +#INSERT finalize_color.glsl const float dark_shift = 0.2; @@ -30,7 +30,7 @@ void main() { color = mix(dark_color, color, alpha); } - frag_color = add_light( + frag_color = finalize_color( color, xyz_coords, normalize(v_normal), diff --git a/manimlib/shaders/true_dot/frag.glsl b/manimlib/shaders/true_dot/frag.glsl index 25db09ba..a8965359 100644 --- a/manimlib/shaders/true_dot/frag.glsl +++ b/manimlib/shaders/true_dot/frag.glsl @@ -12,7 +12,7 @@ in vec2 point; out vec4 frag_color; -#INSERT add_light.glsl +#INSERT finalize_color.glsl void main() { vec2 diff = point - center; @@ -22,7 +22,7 @@ void main() { discard; } vec3 normal = vec3(diff / radius, sqrt(1 - (dist * dist) / (radius * radius))); - frag_color = add_light( + frag_color = finalize_color( color, vec3(point.xy, 0.0), normal,