diff --git a/manimlib/mobject/mobject.py b/manimlib/mobject/mobject.py index b795110a..34052b16 100644 --- a/manimlib/mobject/mobject.py +++ b/manimlib/mobject/mobject.py @@ -97,6 +97,7 @@ class Mobject(object): self.family: list[Mobject] = [self] self.locked_data_keys: set[str] = set() self.const_data_keys: set[str] = set() + self.locked_uniform_keys: set[str] = set() self.needs_new_bounding_box: bool = True self._is_animating: bool = False self.saved_state = None @@ -1771,7 +1772,8 @@ class Mobject(object): md2 = md2[0] self.data[key] = func(md1, md2, alpha) - for key in self.uniforms: + keys = [k for k in self.uniforms if k not in self.locked_uniform_keys] + for key in keys: if key not in mobject1.uniforms or key not in mobject2.uniforms: continue self.uniforms[key] = interpolate( @@ -1805,10 +1807,16 @@ class Mobject(object): read into the shader_wrapper objects needlessly """ if self.has_updaters: - return + return self self.locked_data_keys = set(keys) return self + def lock_uniforms(self, keys: Iterable[str]) -> Self: + if self.has_updaters: + return self + self.locked_uniform_keys = set(keys) + return self + def lock_matching_data(self, mobject1: Mobject, mobject2: Mobject) -> Self: tuples = zip( self.get_family(), @@ -1818,16 +1826,19 @@ class Mobject(object): for sm, sm1, sm2 in tuples: if not sm.data.dtype == sm1.data.dtype == sm2.data.dtype: continue - names = sm.data.dtype.names - sm.lock_data(filter( - lambda name: arrays_match(sm1.data[name], sm2.data[name]), - names, - )) + sm.lock_data( + key for key in sm.data.dtype.names + if arrays_match(sm1.data[key], sm2.data[key]) + ) + sm.lock_uniforms( + key for key in self.uniforms + if all(listify(mobject1.uniforms.get(key, 0) == mobject2.uniforms.get(key, 0))) + ) sm.const_data_keys = set( - name for name in names - if name not in sm.locked_data_keys + key for key in sm.data.dtype.names + if key not in sm.locked_data_keys if all( - array_is_constant(mob.data[name]) + array_is_constant(mob.data[key]) for mob in (sm, sm1, sm2) ) ) @@ -1838,6 +1849,7 @@ class Mobject(object): for mob in self.get_family(): mob.locked_data_keys = set() mob.const_data_keys = set() + mob.locked_uniform_keys = set() return self # Operations touching shader uniforms