mirror of
https://github.com/3b1b/manim.git
synced 2025-08-05 16:49:03 +00:00
Change to only compute has_updater status as needed
This commit is contained in:
parent
fd35433a62
commit
70b839e188
2 changed files with 32 additions and 22 deletions
|
@ -65,7 +65,7 @@ class Transform(Animation):
|
||||||
self.target_copy = self.target_mobject.copy()
|
self.target_copy = self.target_mobject.copy()
|
||||||
self.mobject.align_data_and_family(self.target_copy)
|
self.mobject.align_data_and_family(self.target_copy)
|
||||||
super().begin()
|
super().begin()
|
||||||
if not self.mobject.has_updaters:
|
if not self.mobject.has_updaters():
|
||||||
self.mobject.lock_matching_data(
|
self.mobject.lock_matching_data(
|
||||||
self.starting_mobject,
|
self.starting_mobject,
|
||||||
self.target_copy,
|
self.target_copy,
|
||||||
|
|
|
@ -837,7 +837,7 @@ class Mobject(object):
|
||||||
self.updating_suspended: bool = False
|
self.updating_suspended: bool = False
|
||||||
|
|
||||||
def update(self, dt: float = 0, recurse: bool = True) -> Self:
|
def update(self, dt: float = 0, recurse: bool = True) -> Self:
|
||||||
if not self.has_updaters or self.updating_suspended:
|
if not self.has_updaters() or self.updating_suspended:
|
||||||
return self
|
return self
|
||||||
if recurse:
|
if recurse:
|
||||||
for submob in self.submobjects:
|
for submob in self.submobjects:
|
||||||
|
@ -862,31 +862,33 @@ class Mobject(object):
|
||||||
|
|
||||||
def add_updater(
|
def add_updater(
|
||||||
self,
|
self,
|
||||||
update_function: Updater,
|
update_func: Updater,
|
||||||
index: int | None = None,
|
|
||||||
call_updater: bool = True
|
call_updater: bool = True
|
||||||
) -> Self:
|
) -> Self:
|
||||||
if "dt" in get_parameters(update_function):
|
if "dt" in get_parameters(update_func):
|
||||||
updater_list = self.time_based_updaters
|
self.time_based_updaters.append(update_func)
|
||||||
else:
|
else:
|
||||||
updater_list = self.non_time_updaters
|
self.non_time_updaters.append(update_func)
|
||||||
|
|
||||||
if index is None:
|
|
||||||
updater_list.append(update_function)
|
|
||||||
else:
|
|
||||||
updater_list.insert(index, update_function)
|
|
||||||
|
|
||||||
self.refresh_has_updater_status()
|
|
||||||
for parent in self.parents:
|
|
||||||
parent.has_updaters = True
|
|
||||||
if call_updater:
|
if call_updater:
|
||||||
self.update(dt=0)
|
self.update(dt=0)
|
||||||
|
|
||||||
|
self.refresh_has_updater_status()
|
||||||
return self
|
return self
|
||||||
|
|
||||||
def remove_updater(self, update_function: Updater) -> Self:
|
def insert_updater(self, update_func: Updater, index=0):
|
||||||
|
if "dt" in get_parameters(update_func):
|
||||||
|
self.time_based_updaters.insert(index, update_func)
|
||||||
|
else:
|
||||||
|
self.non_time_updaters.insert(index, update_func)
|
||||||
|
|
||||||
|
self.refresh_has_updater_status()
|
||||||
|
return self
|
||||||
|
|
||||||
|
def remove_updater(self, update_func: Updater) -> Self:
|
||||||
for updater_list in [self.time_based_updaters, self.non_time_updaters]:
|
for updater_list in [self.time_based_updaters, self.non_time_updaters]:
|
||||||
while update_function in updater_list:
|
while update_func in updater_list:
|
||||||
updater_list.remove(update_function)
|
updater_list.remove(update_func)
|
||||||
self.refresh_has_updater_status()
|
self.refresh_has_updater_status()
|
||||||
return self
|
return self
|
||||||
|
|
||||||
|
@ -923,14 +925,22 @@ class Mobject(object):
|
||||||
self.update(dt=0, recurse=recurse)
|
self.update(dt=0, recurse=recurse)
|
||||||
return self
|
return self
|
||||||
|
|
||||||
|
def has_updaters(self) -> bool:
|
||||||
|
if self._has_updaters_in_family is None:
|
||||||
|
# Recompute and save
|
||||||
|
res = bool(self.time_based_updaters or self.non_time_updaters)
|
||||||
|
self._has_updaters_in_family = res or any(sm.has_updaters() for sm in self.submobjects)
|
||||||
|
return self._has_updaters_in_family
|
||||||
|
|
||||||
def refresh_has_updater_status(self) -> Self:
|
def refresh_has_updater_status(self) -> Self:
|
||||||
self.has_updaters = any(mob.get_updaters() for mob in self.get_family())
|
for mob in (self, *self.parents):
|
||||||
|
mob._has_updaters_in_family = None
|
||||||
return self
|
return self
|
||||||
|
|
||||||
# Check if mark as static or not for camera
|
# Check if mark as static or not for camera
|
||||||
|
|
||||||
def is_changing(self) -> bool:
|
def is_changing(self) -> bool:
|
||||||
return self._is_animating or self.has_updaters
|
return self._is_animating or self.has_updaters()
|
||||||
|
|
||||||
def set_animating_status(self, is_animating: bool, recurse: bool = True) -> Self:
|
def set_animating_status(self, is_animating: bool, recurse: bool = True) -> Self:
|
||||||
for mob in (*self.get_family(recurse), *self.get_ancestors()):
|
for mob in (*self.get_family(recurse), *self.get_ancestors()):
|
||||||
|
@ -1865,13 +1875,13 @@ class Mobject(object):
|
||||||
interpolate can skip this, and so that it's not
|
interpolate can skip this, and so that it's not
|
||||||
read into the shader_wrapper objects needlessly
|
read into the shader_wrapper objects needlessly
|
||||||
"""
|
"""
|
||||||
if self.has_updaters:
|
if self.has_updaters():
|
||||||
return self
|
return self
|
||||||
self.locked_data_keys = set(keys)
|
self.locked_data_keys = set(keys)
|
||||||
return self
|
return self
|
||||||
|
|
||||||
def lock_uniforms(self, keys: Iterable[str]) -> Self:
|
def lock_uniforms(self, keys: Iterable[str]) -> Self:
|
||||||
if self.has_updaters:
|
if self.has_updaters():
|
||||||
return self
|
return self
|
||||||
self.locked_uniform_keys = set(keys)
|
self.locked_uniform_keys = set(keys)
|
||||||
return self
|
return self
|
||||||
|
|
Loading…
Add table
Reference in a new issue