mirror of
https://github.com/3b1b/manim.git
synced 2025-11-13 22:38:03 +00:00
Lock uniform keys, the same way data keys are
This commit is contained in:
parent
e36719a21b
commit
ad2e7144b4
1 changed files with 22 additions and 10 deletions
|
|
@ -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
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue