From 7a4fde180e64c7ba94b428c8b224550cb731cddd Mon Sep 17 00:00:00 2001 From: Anmol Singh Date: Thu, 13 Nov 2025 13:51:14 -0500 Subject: [PATCH 1/2] Fix depth sorting of 3D surfaces in 2D scenes (GH-4475) --- manim/camera/camera.py | 39 ++++++++++++++++++++++++++++++++------- 1 file changed, 32 insertions(+), 7 deletions(-) diff --git a/manim/camera/camera.py b/manim/camera/camera.py index cab8c5ac0f..d6be2d74f3 100644 --- a/manim/camera/camera.py +++ b/manim/camera/camera.py @@ -475,13 +475,38 @@ def get_mobjects_to_display( use_z_index=self.use_z_index, only_those_with_points=True, ) - if excluded_mobjects: - all_excluded = extract_mobject_family_members( - excluded_mobjects, - use_z_index=self.use_z_index, - ) - mobjects = list_difference_update(mobjects, all_excluded) - return list(mobjects) + + if excluded_mobjects: + all_excluded = extract_mobject_family_members( + excluded_mobjects, + use_z_index=self.use_z_index, + ) + mobjects = list_difference_update(mobjects, all_excluded) + + mobject_list = list(mobjects) + + # --- Depth sort for 3D-shaded mobjects (e.g. Surface faces) --- + def z_key(mob: Mobject) -> float: + # Only depth-sort “true 3D” mobjects, like Surface faces. + if not (hasattr(mob, "shade_in_3d") and getattr(mob, "shade_in_3d")): + # Non-3D mobjects keep their relative order (stable sort). + return float("inf") + + # Prefer a dedicated reference point if available. + if hasattr(mob, "get_z_index_reference_point"): + ref = mob.get_z_index_reference_point() + else: + ref = mob.get_center() + + # Larger z = closer to camera = should be drawn later. + return ref[2] + + # Python’s sort is stable: non-3D mobjects stay in order, + # 3D ones get correctly sorted by depth. + mobject_list.sort(key=z_key) + + return mobject_list + def is_in_frame(self, mobject: Mobject) -> bool: """Checks whether the passed mobject is in From 3e211685744cb9351df8a6db08da6c7a46b40317 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Thu, 13 Nov 2025 18:53:11 +0000 Subject: [PATCH 2/2] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- manim/camera/camera.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/manim/camera/camera.py b/manim/camera/camera.py index d6be2d74f3..07e53cdb0e 100644 --- a/manim/camera/camera.py +++ b/manim/camera/camera.py @@ -488,7 +488,7 @@ def get_mobjects_to_display( # --- Depth sort for 3D-shaded mobjects (e.g. Surface faces) --- def z_key(mob: Mobject) -> float: # Only depth-sort “true 3D” mobjects, like Surface faces. - if not (hasattr(mob, "shade_in_3d") and getattr(mob, "shade_in_3d")): + if not (hasattr(mob, "shade_in_3d") and mob.shade_in_3d): # Non-3D mobjects keep their relative order (stable sort). return float("inf") @@ -507,7 +507,6 @@ def z_key(mob: Mobject) -> float: return mobject_list - def is_in_frame(self, mobject: Mobject) -> bool: """Checks whether the passed mobject is in frame or not.