mirror of
https://github.com/3b1b/manim.git
synced 2025-09-01 00:48:45 +00:00
Use triangle strip for stroke shader
This commit is contained in:
parent
24afb2a24f
commit
a07701e295
3 changed files with 24 additions and 11 deletions
|
@ -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:
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
}
|
Loading…
Add table
Reference in a new issue