Lock uniform keys, the same way data keys are

This commit is contained in:
Grant Sanderson 2023-02-02 16:17:26 -08:00
parent e36719a21b
commit ad2e7144b4

View file

@ -97,6 +97,7 @@ class Mobject(object):
self.family: list[Mobject] = [self] self.family: list[Mobject] = [self]
self.locked_data_keys: set[str] = set() self.locked_data_keys: set[str] = set()
self.const_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.needs_new_bounding_box: bool = True
self._is_animating: bool = False self._is_animating: bool = False
self.saved_state = None self.saved_state = None
@ -1771,7 +1772,8 @@ class Mobject(object):
md2 = md2[0] md2 = md2[0]
self.data[key] = func(md1, md2, alpha) 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: if key not in mobject1.uniforms or key not in mobject2.uniforms:
continue continue
self.uniforms[key] = interpolate( self.uniforms[key] = interpolate(
@ -1805,10 +1807,16 @@ class Mobject(object):
read into the shader_wrapper objects needlessly read into the shader_wrapper objects needlessly
""" """
if self.has_updaters: if self.has_updaters:
return 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:
if self.has_updaters:
return self
self.locked_uniform_keys = set(keys)
return self
def lock_matching_data(self, mobject1: Mobject, mobject2: Mobject) -> Self: def lock_matching_data(self, mobject1: Mobject, mobject2: Mobject) -> Self:
tuples = zip( tuples = zip(
self.get_family(), self.get_family(),
@ -1818,16 +1826,19 @@ class Mobject(object):
for sm, sm1, sm2 in tuples: for sm, sm1, sm2 in tuples:
if not sm.data.dtype == sm1.data.dtype == sm2.data.dtype: if not sm.data.dtype == sm1.data.dtype == sm2.data.dtype:
continue continue
names = sm.data.dtype.names sm.lock_data(
sm.lock_data(filter( key for key in sm.data.dtype.names
lambda name: arrays_match(sm1.data[name], sm2.data[name]), if arrays_match(sm1.data[key], sm2.data[key])
names, )
)) 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( sm.const_data_keys = set(
name for name in names key for key in sm.data.dtype.names
if name not in sm.locked_data_keys if key not in sm.locked_data_keys
if all( if all(
array_is_constant(mob.data[name]) array_is_constant(mob.data[key])
for mob in (sm, sm1, sm2) for mob in (sm, sm1, sm2)
) )
) )
@ -1838,6 +1849,7 @@ class Mobject(object):
for mob in self.get_family(): for mob in self.get_family():
mob.locked_data_keys = set() mob.locked_data_keys = set()
mob.const_data_keys = set() mob.const_data_keys = set()
mob.locked_uniform_keys = set()
return self return self
# Operations touching shader uniforms # Operations touching shader uniforms