From 0ac9ee1fbf5127d88154b35f5d7054bc39438243 Mon Sep 17 00:00:00 2001 From: Grant Sanderson Date: Tue, 20 Aug 2024 10:15:53 -0500 Subject: [PATCH] Don't deepcopy ShaderWrapper --- manimlib/mobject/mobject.py | 8 ++++++-- manimlib/shader_wrapper.py | 6 ++++++ 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/manimlib/mobject/mobject.py b/manimlib/mobject/mobject.py index 16364eb5..8e555c40 100644 --- a/manimlib/mobject/mobject.py +++ b/manimlib/mobject/mobject.py @@ -652,9 +652,13 @@ class Mobject(object): return self def deepcopy(self) -> Self: + self.parents = [] + result.target = None + result.saved_state = None + for submob in self.get_family(): + submob._shaders_initialized = False + submob._data_has_changed = True result = copy.deepcopy(self) - result._shaders_initialized = False - result._data_has_changed = True return result def copy(self, deep: bool = False) -> Self: diff --git a/manimlib/shader_wrapper.py b/manimlib/shader_wrapper.py index 9251a497..860057d8 100644 --- a/manimlib/shader_wrapper.py +++ b/manimlib/shader_wrapper.py @@ -63,6 +63,12 @@ class ShaderWrapper(object): self.init_vertex_objects() self.refresh_id() + def __deepcopy__(self, memo): + # Don't allow deepcopies, e.g. if the mobject with this ShaderWrapper as an + # attribute gets copies. Returning None means the parent object with this ShaderWrapper + # as an attribute should smoothly handle this case. + return None + def init_program_code(self) -> None: def get_code(name: str) -> str | None: return get_shader_code_from_file(