Use triangle strip for stroke shader

This commit is contained in:
Grant Sanderson 2023-01-12 15:56:12 -08:00
parent 24afb2a24f
commit a07701e295
3 changed files with 24 additions and 11 deletions

View file

@ -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:

View file

@ -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

View file

@ -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;
}