Skip to content

Commit

Permalink
Only reconstruct family as needed
Browse files Browse the repository at this point in the history
  • Loading branch information
3b1b committed Mar 7, 2024
1 parent e124aec commit 4b14c11
Showing 1 changed file with 23 additions and 20 deletions.
43 changes: 23 additions & 20 deletions manimlib/mobject/mobject.py
Original file line number Diff line number Diff line change
Expand Up @@ -97,7 +97,7 @@ def __init__(
# Internal state
self.submobjects: list[Mobject] = []
self.parents: list[Mobject] = []
self.family: list[Mobject] = [self]
self.family: list[Mobject] | None = [self]
self.locked_data_keys: set[str] = set()
self.const_data_keys: set[str] = set()
self.locked_uniform_keys: set[str] = set()
Expand Down Expand Up @@ -409,23 +409,26 @@ def split(self) -> list[Self]:
return self.submobjects

@affects_data
def assemble_family(self) -> Self:
sub_families = (sm.get_family() for sm in self.submobjects)
self.family = [self, *it.chain(*sub_families)]
self.refresh_has_updater_status()
self.refresh_bounding_box()
def note_updated_family(self, only_changed_order=False) -> Self:
self.family = None
if not only_changed_order:
self.refresh_has_updater_status()
self.refresh_bounding_box()
for parent in self.parents:
parent.assemble_family()
parent.note_updated_family()
return self

def get_family(self, recurse: bool = True) -> list[Mobject]:
if recurse:
return self.family
else:
if not recurse:
return [self]
if self.family is None:
# Reconstruct and save
sub_families = (sm.get_family() for sm in self.submobjects)
self.family = [self, *it.chain(*sub_families)]
return self.family

def family_members_with_points(self) -> list[Self]:
return [m for m in self.family if len(m.data) > 0]
def family_members_with_points(self) -> list[Mobject]:
return [m for m in self.get_family() if len(m.data) > 0]

def get_ancestors(self, extended: bool = False) -> list[Mobject]:
"""
Expand Down Expand Up @@ -456,7 +459,7 @@ def add(self, *mobjects: Mobject) -> Self:
self.submobjects.append(mobject)
if self not in mobject.parents:
mobject.parents.append(self)
self.assemble_family()
self.note_updated_family()
return self

def remove(
Expand All @@ -472,7 +475,7 @@ def remove(
if parent in child.parents:
child.parents.remove(parent)
if reassemble:
parent.assemble_family()
parent.note_updated_family()
return self

def clear(self) -> Self:
Expand All @@ -489,12 +492,12 @@ def replace_submobject(self, index: int, new_submob: Mobject) -> Self:
old_submob.parents.remove(self)
self.submobjects[index] = new_submob
new_submob.parents.append(self)
self.assemble_family()
self.note_updated_family()
return self

def insert_submobject(self, index: int, new_submob: Mobject) -> Self:
self.submobjects.insert(index, new_submob)
self.assemble_family()
self.note_updated_family()
return self

def set_submobjects(self, submobject_list: list[Mobject]) -> Self:
Expand Down Expand Up @@ -606,20 +609,20 @@ def sort(
self.submobjects.sort(key=submob_func)
else:
self.submobjects.sort(key=lambda m: point_to_num_func(m.get_center()))
self.assemble_family()
self.note_updated_family(only_changed_order=True)
return self

def shuffle(self, recurse: bool = False) -> Self:
if recurse:
for submob in self.submobjects:
submob.shuffle(recurse=True)
random.shuffle(self.submobjects)
self.assemble_family()
self.note_updated_family(only_changed_order=True)
return self

def reverse_submobjects(self) -> Self:
self.submobjects.reverse()
self.assemble_family()
self.note_updated_family(only_changed_order=True)
return self

# Copying and serialization
Expand Down Expand Up @@ -692,7 +695,7 @@ def copy(self, deep: bool = False) -> Self:
for attr, value in self.__dict__.items():
if isinstance(value, Mobject) and value is not self:
if value in family:
setattr(result, attr, result.family[self.family.index(value)])
setattr(result, attr, result.family[family.index(value)])
elif isinstance(value, np.ndarray):
setattr(result, attr, value.copy())
return result
Expand Down

0 comments on commit 4b14c11

Please sign in to comment.