From f0bf50eb7f5f71136564f1c489d013a805a9992c Mon Sep 17 00:00:00 2001 From: Grant Sanderson Date: Sat, 28 Sep 2024 09:54:28 -0500 Subject: [PATCH 1/5] Remove use of gl_VertexID --- manimlib/mobject/types/vectorized_mobject.py | 2 +- manimlib/shader_wrapper.py | 2 +- manimlib/shaders/quadratic_bezier/depth/geom.glsl | 5 ----- manimlib/shaders/quadratic_bezier/depth/vert.glsl | 2 -- manimlib/shaders/quadratic_bezier/fill/geom.glsl | 5 ----- manimlib/shaders/quadratic_bezier/fill/vert.glsl | 2 -- manimlib/shaders/quadratic_bezier/stroke/geom.glsl | 5 ----- manimlib/shaders/quadratic_bezier/stroke/vert.glsl | 2 -- 8 files changed, 2 insertions(+), 23 deletions(-) diff --git a/manimlib/mobject/types/vectorized_mobject.py b/manimlib/mobject/types/vectorized_mobject.py index 0e187355..ab90dfbc 100644 --- a/manimlib/mobject/types/vectorized_mobject.py +++ b/manimlib/mobject/types/vectorized_mobject.py @@ -1274,7 +1274,7 @@ class VMobject(Mobject): # Do we want this elsewhere? Say whenever points are refreshed or something? self.get_joint_angles() self.data["base_normal"][0::2] = self.data["point"][0] - return [self.data, self.data[-1:]] + return [self.data[self.get_outer_vert_indices()]] class VGroup(Group, VMobject, Generic[SubVmobjectType]): diff --git a/manimlib/shader_wrapper.py b/manimlib/shader_wrapper.py index d7063ad7..3de2612b 100644 --- a/manimlib/shader_wrapper.py +++ b/manimlib/shader_wrapper.py @@ -225,7 +225,7 @@ class VShaderWrapper(ShaderWrapper): mobject_uniforms: Optional[UniformDict] = None, # A dictionary mapping names of uniform variables texture_paths: Optional[dict[str, str]] = None, # A dictionary mapping names to filepaths for textures. depth_test: bool = False, - render_primitive: int = moderngl.TRIANGLE_STRIP, + render_primitive: int = moderngl.TRIANGLES, code_replacements: dict[str, str] = dict(), stroke_behind: bool = False, ): diff --git a/manimlib/shaders/quadratic_bezier/depth/geom.glsl b/manimlib/shaders/quadratic_bezier/depth/geom.glsl index 10ad809e..ca29d245 100644 --- a/manimlib/shaders/quadratic_bezier/depth/geom.glsl +++ b/manimlib/shaders/quadratic_bezier/depth/geom.glsl @@ -5,7 +5,6 @@ layout (triangle_strip, max_vertices = 6) out; in vec3 verts[3]; in vec3 v_base_point[3]; -in int v_vert_index[3]; out float depth; @@ -22,10 +21,6 @@ void emit_triangle(vec3 points[3]){ void main(){ - // Vector graphic shaders use TRIANGLE_STRIP, but only - // every other one needs to be rendered - if (v_vert_index[0] % 2 != 0) return; - // Curves are marked as ended when the handle after // the first anchor is set equal to that anchor if (verts[0] == verts[1]) return; diff --git a/manimlib/shaders/quadratic_bezier/depth/vert.glsl b/manimlib/shaders/quadratic_bezier/depth/vert.glsl index 64aec443..231d6746 100644 --- a/manimlib/shaders/quadratic_bezier/depth/vert.glsl +++ b/manimlib/shaders/quadratic_bezier/depth/vert.glsl @@ -5,10 +5,8 @@ in vec3 base_normal; out vec3 verts; out vec3 v_base_point; -out int v_vert_index; void main(){ verts = point; v_base_point = base_normal; - v_vert_index = gl_VertexID; } \ 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 0dcdb4fe..44a9953c 100644 --- a/manimlib/shaders/quadratic_bezier/fill/geom.glsl +++ b/manimlib/shaders/quadratic_bezier/fill/geom.glsl @@ -6,7 +6,6 @@ layout (triangle_strip, max_vertices = 6) out; in vec3 verts[3]; in vec4 v_color[3]; in vec3 v_base_normal[3]; -in int v_vert_index[3]; out vec4 color; out float fill_all; @@ -44,10 +43,6 @@ void emit_triangle(vec3 points[3], vec4 v_color[3], vec3 unit_normal){ void main(){ - // Vector graphic shaders use TRIANGLE_STRIP, but only - // every other one needs to be rendered - if (v_vert_index[0] % 2 != 0) return; - // Curves are marked as ended when the handle after // the first anchor is set equal to that anchor if (verts[0] == verts[1]) return; diff --git a/manimlib/shaders/quadratic_bezier/fill/vert.glsl b/manimlib/shaders/quadratic_bezier/fill/vert.glsl index 8f19c73d..86dc3a26 100644 --- a/manimlib/shaders/quadratic_bezier/fill/vert.glsl +++ b/manimlib/shaders/quadratic_bezier/fill/vert.glsl @@ -7,11 +7,9 @@ in vec3 base_normal; out vec3 verts; // Bezier control point out vec4 v_color; out vec3 v_base_normal; -out int v_vert_index; void main(){ verts = point; v_color = fill_rgba; v_base_normal = base_normal; - v_vert_index = gl_VertexID; } \ No newline at end of file diff --git a/manimlib/shaders/quadratic_bezier/stroke/geom.glsl b/manimlib/shaders/quadratic_bezier/stroke/geom.glsl index 053e42ab..07483968 100644 --- a/manimlib/shaders/quadratic_bezier/stroke/geom.glsl +++ b/manimlib/shaders/quadratic_bezier/stroke/geom.glsl @@ -15,7 +15,6 @@ in float v_joint_angle[3]; in float v_stroke_width[3]; in vec4 v_color[3]; in vec3 v_unit_normal[3]; -in int v_vert_index[3]; out vec4 color; out float dist_to_aaw; @@ -156,10 +155,6 @@ void emit_point_with_width( void main() { - // Vector graphic shaders use TRIANGLE_STRIP, but only - // every other one needs to be rendered - if (v_vert_index[0] % 2 != 0) return; - // Curves are marked as ended when the handle after // the first anchor is set equal to that anchor if (verts[0] == verts[1]) return; diff --git a/manimlib/shaders/quadratic_bezier/stroke/vert.glsl b/manimlib/shaders/quadratic_bezier/stroke/vert.glsl index fa2db975..0e43ad38 100644 --- a/manimlib/shaders/quadratic_bezier/stroke/vert.glsl +++ b/manimlib/shaders/quadratic_bezier/stroke/vert.glsl @@ -16,7 +16,6 @@ out vec4 v_color; out float v_stroke_width; out float v_joint_angle; out vec3 v_unit_normal; -out int v_vert_index; const float STROKE_WIDTH_CONVERSION = 0.01; @@ -26,5 +25,4 @@ void main(){ v_stroke_width = STROKE_WIDTH_CONVERSION * stroke_width * mix(frame_scale, 1, is_fixed_in_frame); v_joint_angle = joint_angle; v_unit_normal = unit_normal; - v_vert_index = gl_VertexID; } \ No newline at end of file From 512fb897264ea094073120ebb3b4b8297dbac2cc Mon Sep 17 00:00:00 2001 From: Grant Sanderson Date: Tue, 1 Oct 2024 13:14:24 -0500 Subject: [PATCH 2/5] Save VMobject. outer_vert_indices --- manimlib/mobject/types/vectorized_mobject.py | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/manimlib/mobject/types/vectorized_mobject.py b/manimlib/mobject/types/vectorized_mobject.py index ab90dfbc..715e9b83 100644 --- a/manimlib/mobject/types/vectorized_mobject.py +++ b/manimlib/mobject/types/vectorized_mobject.py @@ -1048,8 +1048,10 @@ class VMobject(Mobject): Returns the pattern (0, 1, 2, 2, 3, 4, 4, 5, 6, ...) """ n_curves = self.get_num_curves() - # Creates the pattern (0, 1, 2, 2, 3, 4, 4, 5, 6, ...) - return (np.arange(1, 3 * n_curves + 1) * 2) // 3 + if self.outer_vert_indices is None: + # Creates the pattern (0, 1, 2, 2, 3, 4, 4, 5, 6, ...) + self.outer_vert_indices = (np.arange(1, 3 * n_curves + 1) * 2) // 3 + return self.outer_vert_indices # Data for shaders that may need refreshing @@ -1207,6 +1209,14 @@ class VMobject(Mobject): def set_data(self, data: np.ndarray) -> Self: return super().set_data(data) + def resize_points( + self, + new_length: int, + resize_func: Callable[[np.ndarray, int], np.ndarray] = resize_array + ) -> Self: + self.outer_vert_indices = None + return super().resize_points(new_length, resize_func) + # TODO, how to be smart about tangents here? @triggers_refresh def apply_function( From 95bb67c47fb799bd6283bd88cd937938b1909a45 Mon Sep 17 00:00:00 2001 From: Grant Sanderson Date: Tue, 1 Oct 2024 13:18:40 -0500 Subject: [PATCH 3/5] Change return type for Mobject.get_shader_data --- manimlib/mobject/mobject.py | 8 ++++---- manimlib/mobject/types/vectorized_mobject.py | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/manimlib/mobject/mobject.py b/manimlib/mobject/mobject.py index a09d6116..a24e925b 100644 --- a/manimlib/mobject/mobject.py +++ b/manimlib/mobject/mobject.py @@ -2029,17 +2029,17 @@ class Mobject(object): result = [] for submobs, sid in batches: shader_wrapper = submobs[0].shader_wrapper - data_list = list(it.chain(*(sm.get_shader_data() for sm in submobs))) + data_list = [sm.get_shader_data() for sm in submobs] shader_wrapper.read_in(data_list) result.append(shader_wrapper) return result - def get_shader_data(self) -> Iterable[np.ndarray]: + def get_shader_data(self) -> np.ndarray: indices = self.get_shader_vert_indices() if indices is not None: - return [self.data[indices]] + return self.data[indices] else: - return [self.data] + return self.data def get_uniforms(self): return self.uniforms diff --git a/manimlib/mobject/types/vectorized_mobject.py b/manimlib/mobject/types/vectorized_mobject.py index 715e9b83..2e686cd7 100644 --- a/manimlib/mobject/types/vectorized_mobject.py +++ b/manimlib/mobject/types/vectorized_mobject.py @@ -1280,11 +1280,11 @@ class VMobject(Mobject): super().refresh_shader_wrapper_id() return self - def get_shader_data(self) -> Iterable[np.ndarray]: + def get_shader_data(self) -> np.ndarray: # Do we want this elsewhere? Say whenever points are refreshed or something? self.get_joint_angles() self.data["base_normal"][0::2] = self.data["point"][0] - return [self.data[self.get_outer_vert_indices()]] + return self.data[self.get_outer_vert_indices()] class VGroup(Group, VMobject, Generic[SubVmobjectType]): From f737823bacfa83785adc32645eb97919d4039857 Mon Sep 17 00:00:00 2001 From: Grant Sanderson Date: Tue, 1 Oct 2024 13:20:23 -0500 Subject: [PATCH 4/5] Add VMobject. get_shader_vert_indices --- manimlib/mobject/types/vectorized_mobject.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/manimlib/mobject/types/vectorized_mobject.py b/manimlib/mobject/types/vectorized_mobject.py index 2e686cd7..c17c9fc5 100644 --- a/manimlib/mobject/types/vectorized_mobject.py +++ b/manimlib/mobject/types/vectorized_mobject.py @@ -1284,7 +1284,10 @@ class VMobject(Mobject): # Do we want this elsewhere? Say whenever points are refreshed or something? self.get_joint_angles() self.data["base_normal"][0::2] = self.data["point"][0] - return self.data[self.get_outer_vert_indices()] + return super().get_shader_data() + + def get_shader_vert_indices(self) -> Optional[np.ndarray]: + return self.get_outer_vert_indices() class VGroup(Group, VMobject, Generic[SubVmobjectType]): From 641c03a95b2349c6f91c091e3ad3769fad49cb5c Mon Sep 17 00:00:00 2001 From: Grant Sanderson Date: Tue, 1 Oct 2024 13:27:02 -0500 Subject: [PATCH 5/5] Change condition for updating VMobject. outer_vert_indices --- manimlib/mobject/types/vectorized_mobject.py | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/manimlib/mobject/types/vectorized_mobject.py b/manimlib/mobject/types/vectorized_mobject.py index c17c9fc5..4deac8ec 100644 --- a/manimlib/mobject/types/vectorized_mobject.py +++ b/manimlib/mobject/types/vectorized_mobject.py @@ -117,6 +117,7 @@ class VMobject(Mobject): self.needs_new_joint_angles = True self.needs_new_unit_normal = True self.subpath_end_indices = None + self.outer_vert_indices = np.zeros(0, dtype=int) super().__init__(**kwargs) @@ -1048,7 +1049,7 @@ class VMobject(Mobject): Returns the pattern (0, 1, 2, 2, 3, 4, 4, 5, 6, ...) """ n_curves = self.get_num_curves() - if self.outer_vert_indices is None: + if len(self.outer_vert_indices) != 3 * n_curves: # Creates the pattern (0, 1, 2, 2, 3, 4, 4, 5, 6, ...) self.outer_vert_indices = (np.arange(1, 3 * n_curves + 1) * 2) // 3 return self.outer_vert_indices @@ -1209,14 +1210,6 @@ class VMobject(Mobject): def set_data(self, data: np.ndarray) -> Self: return super().set_data(data) - def resize_points( - self, - new_length: int, - resize_func: Callable[[np.ndarray, int], np.ndarray] = resize_array - ) -> Self: - self.outer_vert_indices = None - return super().resize_points(new_length, resize_func) - # TODO, how to be smart about tangents here? @triggers_refresh def apply_function(