Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 16 additions & 4 deletions manim/renderer/opengl_renderer.py
Original file line number Diff line number Diff line change
Expand Up @@ -352,11 +352,17 @@ def render_vmobject(self, mob: OpenGLVMobject) -> None:
gl.ONE,
)

def enable_depth(sub):
def enable_depth(sub) -> bool:
if sub.depth_test:
self.ctx.enable(gl.DEPTH_TEST)
if (sub.has_fill() and sub.get_fill_opacity() != 1.0) or (
sub.has_stroke() and sub.get_stroke_opacity() != 1.0
):
self.render_target_fbo.depth_mask = False
return True
else:
self.ctx.disable(gl.DEPTH_TEST)
return False

for sub in mob.family_members_with_points():
# TODO: review this renderer data optimization attempt
Expand All @@ -382,7 +388,7 @@ def enable_depth(sub):
for counter, sub in enumerate(family):
if not isinstance(sub.renderer_data, GLRenderData):
return
enable_depth(sub)
reenable_depth_mask = enable_depth(sub)
uniforms = {}
uniforms["index"] = (counter + 1) / num_mobs / 2
uniforms["disable_stencil"] = float(True)
Expand All @@ -399,11 +405,13 @@ def enable_depth(sub):
GLVMobjectManager.get_stroke_shader_data(sub),
np.array(range(len(sub.points))),
)
if reenable_depth_mask:
self.render_target_fbo.depth_mask = True

for counter, sub in enumerate(family):
if not isinstance(sub.renderer_data, GLRenderData):
return
enable_depth(sub)
reenable_depth_mask = enable_depth(sub)
uniforms = {}
# uniforms['z_shift'] = counter/9
uniforms["index"] = (counter + 1) / num_mobs
Expand All @@ -420,11 +428,13 @@ def enable_depth(sub):
GLVMobjectManager.get_fill_shader_data(sub),
sub.renderer_data.vert_indices,
)
if reenable_depth_mask:
self.render_target_fbo.depth_mask = True

for counter, sub in enumerate(family):
if not isinstance(sub.renderer_data, GLRenderData):
return
enable_depth(sub)
reenable_depth_mask = enable_depth(sub)
uniforms = {}
uniforms["index"] = (counter + 1) / num_mobs
uniforms["disable_stencil"] = float(False)
Expand All @@ -441,6 +451,8 @@ def enable_depth(sub):
GLVMobjectManager.get_stroke_shader_data(sub),
np.array(range(len(sub.points))),
)
if reenable_depth_mask:
self.render_target_fbo.depth_mask = True

def get_pixels(self) -> PixelArray:
raw = self.output_fbo.read(components=4, dtype="f1", clamp=True) # RGBA, floats
Expand Down
22 changes: 22 additions & 0 deletions manim/renderer/renderer.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@
from abc import ABC, abstractmethod
from typing import TYPE_CHECKING, Protocol, runtime_checkable

import numpy as np

from manim._config import logger
from manim.mobject.mobject import InvisibleMobject
from manim.mobject.opengl.opengl_mobject import OpenGLMobject
Expand Down Expand Up @@ -35,8 +37,28 @@ def __init__(self) -> None:

def render(self, state: SceneState) -> None:
self.pre_render(state.camera)

# seperate depth testing mobjects and otherwise
depth_testing: list[OpenGLVMobject] = []
non_depth_testing: list[OpenGLVMobject] = []
for mob in state.mobjects:
if mob.depth_test:
depth_testing.append(mob)
else:
non_depth_testing.append(mob)
# sort depth testing mobjects according to center distance from camera
depth_testing.sort(
key=lambda m: np.linalg.norm(
m.get_center() - state.camera.get_implied_camera_location()
),
reverse=True,
)
# render depth testing mobs followed by otherwise
for mob in depth_testing:
self.render_mobject(mob)
for mob in non_depth_testing:
self.render_mobject(mob)

self.post_render()

def render_mobject(self, mob: OpenGLMobject) -> None:
Expand Down