diff --git a/manimlib/mobject/types/vectorized_mobject.py b/manimlib/mobject/types/vectorized_mobject.py index 1b16c63b..23f23b1c 100644 --- a/manimlib/mobject/types/vectorized_mobject.py +++ b/manimlib/mobject/types/vectorized_mobject.py @@ -51,8 +51,8 @@ DEFAULT_FILL_COLOR = GREY_C DISJOINT_CONST = 404 class VMobject(Mobject): - stroke_shader_folder: str = "quadratic_bezier_stroke" fill_shader_folder: str = "quadratic_bezier_fill" + stroke_shader_folder: str = "quadratic_bezier_stroke" fill_dtype: Sequence[Tuple[str, type, Tuple[int]]] = [ ('point', np.float32, (3,)), ('orientation', np.float32, (1,)), @@ -65,7 +65,8 @@ class VMobject(Mobject): ("stroke_width", np.float32, (1,)), ("color", np.float32, (4,)), ] - render_primitive: int = moderngl.TRIANGLES + fill_render_primitive: int = moderngl.TRIANGLES + stroke_render_primitive: int = moderngl.TRIANGLE_STRIP pre_function_handle_to_anchor_scale_factor: float = 0.01 make_smooth_after_applying_functions: bool = False @@ -1135,13 +1136,13 @@ class VMobject(Mobject): vert_data=self.fill_data, uniforms=self.uniforms, shader_folder=self.fill_shader_folder, - render_primitive=self.render_primitive, + render_primitive=self.fill_render_primitive, ) self.stroke_shader_wrapper = ShaderWrapper( vert_data=self.stroke_data, uniforms=self.uniforms, shader_folder=self.stroke_shader_folder, - render_primitive=self.render_primitive, + render_primitive=self.stroke_render_primitive, ) self.back_stroke_shader_wrapper = self.stroke_shader_wrapper.copy() @@ -1157,7 +1158,7 @@ class VMobject(Mobject): return self.fill_shader_wrapper def get_stroke_shader_wrapper(self) -> ShaderWrapper: - self.stroke_shader_wrapper.vert_data = self.get_stroke_shader_data()[self.get_outer_vert_indices()] + self.stroke_shader_wrapper.vert_data = self.get_stroke_shader_data() self.stroke_shader_wrapper.uniforms = self.get_shader_uniforms() self.stroke_shader_wrapper.depth_test = self.depth_test return self.stroke_shader_wrapper @@ -1197,16 +1198,24 @@ class VMobject(Mobject): return [sw for sw in self_sws if len(sw.vert_data) > 0] def get_stroke_shader_data(self) -> np.ndarray: + # Set data array to be one longer than number of points, + # with a dummy vertex added at the end. This is to ensure + # it can be safely stacked onto other stroke data arrays. points = self.get_points() - if len(self.stroke_data) != len(points): - self.stroke_data = resize_array(self.stroke_data, len(points)) + n = len(points) + size = n + 1 if n > 0 else 0 + if len(self.stroke_data) != size: + self.stroke_data = resize_array(self.stroke_data, size) + if n == 0: + return self.stroke_data - self.read_data_to_shader(self.stroke_data, "point", "points") - self.read_data_to_shader(self.stroke_data, "color", "stroke_rgba") - self.read_data_to_shader(self.stroke_data, "stroke_width", "stroke_width") + self.read_data_to_shader(self.stroke_data[:n], "point", "points") + self.read_data_to_shader(self.stroke_data[:n], "color", "stroke_rgba") + self.read_data_to_shader(self.stroke_data[:n], "stroke_width", "stroke_width") self.get_joint_angles() # Potentially refreshes - self.read_data_to_shader(self.stroke_data, "joint_angle", "joint_angle") + self.read_data_to_shader(self.stroke_data[:n], "joint_angle", "joint_angle") + self.stroke_data[-1] = self.stroke_data[-2] return self.stroke_data def get_fill_shader_data(self) -> np.ndarray: diff --git a/manimlib/shaders/quadratic_bezier_stroke/geom.glsl b/manimlib/shaders/quadratic_bezier_stroke/geom.glsl index 0d54d9a9..5e6eac4c 100644 --- a/manimlib/shaders/quadratic_bezier_stroke/geom.glsl +++ b/manimlib/shaders/quadratic_bezier_stroke/geom.glsl @@ -26,6 +26,7 @@ in vec3 verts[3]; in float v_joint_angle[3]; in float v_stroke_width[3]; in vec4 v_color[3]; +in float v_vert_index[3]; out vec4 color; out float uv_stroke_width; @@ -140,6 +141,7 @@ void get_corners( void main() { + if (int(v_vert_index[0]) % 2 == 1) return; if (distance(verts[0], verts[1]) == 0 || distance(verts[1], verts[2]) == 0) return; vec3 unit_normal = camera_rotation * vec3(0.0, 0.0, 1.0); // TODO, track true unit normal globally diff --git a/manimlib/shaders/quadratic_bezier_stroke/vert.glsl b/manimlib/shaders/quadratic_bezier_stroke/vert.glsl index feeb0242..d1b46d33 100644 --- a/manimlib/shaders/quadratic_bezier_stroke/vert.glsl +++ b/manimlib/shaders/quadratic_bezier_stroke/vert.glsl @@ -14,6 +14,7 @@ out vec3 verts; out float v_joint_angle; out float v_stroke_width; out vec4 v_color; +out float v_vert_index; const float STROKE_WIDTH_CONVERSION = 0.01; @@ -25,4 +26,5 @@ void main(){ v_stroke_width = STROKE_WIDTH_CONVERSION * stroke_width * frame_shape[1] / 8.0; v_joint_angle = joint_angle; v_color = color; + v_vert_index = gl_VertexID; } \ No newline at end of file