mirror of
https://github.com/3b1b/manim.git
synced 2025-04-13 09:47:07 +00:00
Add border width and backstroke
This commit is contained in:
parent
24b160f9f9
commit
f2bca0045f
2 changed files with 38 additions and 14 deletions
|
@ -1347,9 +1347,12 @@ class VMobject(Mobject):
|
|||
if not family:
|
||||
return []
|
||||
|
||||
stroke_behind = False
|
||||
for submob in family:
|
||||
if submob._has_fill:
|
||||
submob.data["base_point"] = submob.data["point"][0]
|
||||
if submob.stroke_behind:
|
||||
stroke_behind = True
|
||||
|
||||
self.shader_wrapper.read_in(
|
||||
# [sm.data for sm in family],
|
||||
|
@ -1359,6 +1362,7 @@ class VMobject(Mobject):
|
|||
rep = family[0] # Representative family member
|
||||
self.shader_wrapper.bind_to_mobject_uniforms(rep.get_uniforms())
|
||||
self.shader_wrapper.depth_test = rep.depth_test
|
||||
self.shader_wrapper.stroke_behind = stroke_behind
|
||||
return [self.shader_wrapper]
|
||||
|
||||
|
||||
|
|
|
@ -261,6 +261,7 @@ class VShaderWrapper(ShaderWrapper):
|
|||
depth_test: bool = False,
|
||||
# render_primitive: int = moderngl.TRIANGLES,
|
||||
render_primitive: int = moderngl.TRIANGLE_STRIP,
|
||||
stroke_behind: bool = False,
|
||||
):
|
||||
super().__init__(
|
||||
ctx=ctx,
|
||||
|
@ -271,6 +272,7 @@ class VShaderWrapper(ShaderWrapper):
|
|||
depth_test=depth_test,
|
||||
render_primitive=render_primitive,
|
||||
)
|
||||
self.stroke_behind = stroke_behind
|
||||
self.fill_canvas = get_fill_canvas(self.ctx)
|
||||
|
||||
def init_program_code(self) -> None:
|
||||
|
@ -312,10 +314,34 @@ class VShaderWrapper(ShaderWrapper):
|
|||
self.fill_vert_format = '3f 36x 4f 3f 3f 4x'
|
||||
self.fill_vert_attributes = ['point', 'fill_rgba', 'base_point', 'unit_normal']
|
||||
|
||||
self.fill_border_vert_format = '3f 20x 4f 4f 24x 1f'
|
||||
self.fill_border_vert_attributes = ['point', 'joint_product', 'stroke_rgba', 'stroke_width']
|
||||
|
||||
def init_vertex_objects(self):
|
||||
self.vbo = None
|
||||
self.stroke_vao = None
|
||||
self.fill_vao = None
|
||||
self.fill_border_vao = None
|
||||
|
||||
def generate_vao(self):
|
||||
self.stroke_vao = self.ctx.vertex_array(
|
||||
program=self.stroke_program,
|
||||
content=[(self.vbo, self.stroke_vert_format, *self.stroke_vert_attributes)],
|
||||
mode=self.render_primitive,
|
||||
)
|
||||
self.fill_vao = self.ctx.vertex_array(
|
||||
program=self.fill_program,
|
||||
content=[(self.vbo, self.fill_vert_format, *self.fill_vert_attributes)],
|
||||
mode=self.render_primitive,
|
||||
)
|
||||
self.fill_border_vao = self.ctx.vertex_array(
|
||||
program=self.stroke_program,
|
||||
content=[(self.vbo, self.fill_border_vert_format, *self.fill_border_vert_attributes)],
|
||||
mode=self.render_primitive,
|
||||
)
|
||||
|
||||
def set_backstroke(self, value: bool = True):
|
||||
self.stroke_behind = value
|
||||
|
||||
# TODO, think about create_id, replace_code
|
||||
def is_valid(self) -> bool:
|
||||
|
@ -362,23 +388,17 @@ class VShaderWrapper(ShaderWrapper):
|
|||
|
||||
gl.glBlendFunc(gl.GL_SRC_ALPHA, gl.GL_ONE_MINUS_SRC_ALPHA)
|
||||
|
||||
self.fill_border_vao.render()
|
||||
|
||||
def render(self):
|
||||
if self.stroke_vao is None or self.fill_vao is None:
|
||||
self.generate_vao()
|
||||
self.render_fill()
|
||||
self.render_stroke()
|
||||
|
||||
def generate_vao(self):
|
||||
self.stroke_vao = self.ctx.vertex_array(
|
||||
program=self.stroke_program,
|
||||
content=[(self.vbo, self.stroke_vert_format, *self.stroke_vert_attributes)],
|
||||
mode=self.render_primitive,
|
||||
)
|
||||
self.fill_vao = self.ctx.vertex_array(
|
||||
program=self.fill_program,
|
||||
content=[(self.vbo, self.fill_vert_format, *self.fill_vert_attributes)],
|
||||
mode=self.render_primitive,
|
||||
)
|
||||
if self.stroke_behind:
|
||||
self.render_stroke()
|
||||
self.render_fill()
|
||||
else:
|
||||
self.render_fill()
|
||||
self.render_stroke()
|
||||
|
||||
def release(self):
|
||||
attrs = ["vbo", "stroke_vao", "fill_vao"]
|
||||
|
|
Loading…
Add table
Reference in a new issue