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
|
DISJOINT_CONST = 404
|
||||||
|
|
||||||
class VMobject(Mobject):
|
class VMobject(Mobject):
|
||||||
stroke_shader_folder: str = "quadratic_bezier_stroke"
|
|
||||||
fill_shader_folder: str = "quadratic_bezier_fill"
|
fill_shader_folder: str = "quadratic_bezier_fill"
|
||||||
|
stroke_shader_folder: str = "quadratic_bezier_stroke"
|
||||||
fill_dtype: Sequence[Tuple[str, type, Tuple[int]]] = [
|
fill_dtype: Sequence[Tuple[str, type, Tuple[int]]] = [
|
||||||
('point', np.float32, (3,)),
|
('point', np.float32, (3,)),
|
||||||
('orientation', np.float32, (1,)),
|
('orientation', np.float32, (1,)),
|
||||||
|
@ -65,7 +65,8 @@ class VMobject(Mobject):
|
||||||
("stroke_width", np.float32, (1,)),
|
("stroke_width", np.float32, (1,)),
|
||||||
("color", np.float32, (4,)),
|
("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
|
pre_function_handle_to_anchor_scale_factor: float = 0.01
|
||||||
make_smooth_after_applying_functions: bool = False
|
make_smooth_after_applying_functions: bool = False
|
||||||
|
@ -1135,13 +1136,13 @@ class VMobject(Mobject):
|
||||||
vert_data=self.fill_data,
|
vert_data=self.fill_data,
|
||||||
uniforms=self.uniforms,
|
uniforms=self.uniforms,
|
||||||
shader_folder=self.fill_shader_folder,
|
shader_folder=self.fill_shader_folder,
|
||||||
render_primitive=self.render_primitive,
|
render_primitive=self.fill_render_primitive,
|
||||||
)
|
)
|
||||||
self.stroke_shader_wrapper = ShaderWrapper(
|
self.stroke_shader_wrapper = ShaderWrapper(
|
||||||
vert_data=self.stroke_data,
|
vert_data=self.stroke_data,
|
||||||
uniforms=self.uniforms,
|
uniforms=self.uniforms,
|
||||||
shader_folder=self.stroke_shader_folder,
|
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()
|
self.back_stroke_shader_wrapper = self.stroke_shader_wrapper.copy()
|
||||||
|
|
||||||
|
@ -1157,7 +1158,7 @@ class VMobject(Mobject):
|
||||||
return self.fill_shader_wrapper
|
return self.fill_shader_wrapper
|
||||||
|
|
||||||
def get_stroke_shader_wrapper(self) -> ShaderWrapper:
|
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.uniforms = self.get_shader_uniforms()
|
||||||
self.stroke_shader_wrapper.depth_test = self.depth_test
|
self.stroke_shader_wrapper.depth_test = self.depth_test
|
||||||
return self.stroke_shader_wrapper
|
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]
|
return [sw for sw in self_sws if len(sw.vert_data) > 0]
|
||||||
|
|
||||||
def get_stroke_shader_data(self) -> np.ndarray:
|
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()
|
points = self.get_points()
|
||||||
if len(self.stroke_data) != len(points):
|
n = len(points)
|
||||||
self.stroke_data = resize_array(self.stroke_data, 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[:n], "point", "points")
|
||||||
self.read_data_to_shader(self.stroke_data, "color", "stroke_rgba")
|
self.read_data_to_shader(self.stroke_data[:n], "color", "stroke_rgba")
|
||||||
self.read_data_to_shader(self.stroke_data, "stroke_width", "stroke_width")
|
self.read_data_to_shader(self.stroke_data[:n], "stroke_width", "stroke_width")
|
||||||
self.get_joint_angles() # Potentially refreshes
|
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
|
return self.stroke_data
|
||||||
|
|
||||||
def get_fill_shader_data(self) -> np.ndarray:
|
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_joint_angle[3];
|
||||||
in float v_stroke_width[3];
|
in float v_stroke_width[3];
|
||||||
in vec4 v_color[3];
|
in vec4 v_color[3];
|
||||||
|
in float v_vert_index[3];
|
||||||
|
|
||||||
out vec4 color;
|
out vec4 color;
|
||||||
out float uv_stroke_width;
|
out float uv_stroke_width;
|
||||||
|
@ -140,6 +141,7 @@ void get_corners(
|
||||||
|
|
||||||
|
|
||||||
void main() {
|
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;
|
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
|
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_joint_angle;
|
||||||
out float v_stroke_width;
|
out float v_stroke_width;
|
||||||
out vec4 v_color;
|
out vec4 v_color;
|
||||||
|
out float v_vert_index;
|
||||||
|
|
||||||
const float STROKE_WIDTH_CONVERSION = 0.01;
|
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_stroke_width = STROKE_WIDTH_CONVERSION * stroke_width * frame_shape[1] / 8.0;
|
||||||
v_joint_angle = joint_angle;
|
v_joint_angle = joint_angle;
|
||||||
v_color = color;
|
v_color = color;
|
||||||
|
v_vert_index = gl_VertexID;
|
||||||
}
|
}
|
Loading…
Add table
Reference in a new issue