mirror of
https://github.com/3b1b/manim.git
synced 2025-04-13 09:47:07 +00:00
Track/interpolate uniforms the same way data is
This commit is contained in:
parent
ba8fb4a6b7
commit
d60ec48591
2 changed files with 31 additions and 34 deletions
|
@ -68,26 +68,31 @@ class Mobject(object):
|
|||
self.locked_data_keys = set()
|
||||
|
||||
self.init_data()
|
||||
self.init_uniforms()
|
||||
self.init_updaters()
|
||||
self.init_points()
|
||||
self.init_colors()
|
||||
self.init_shader_data()
|
||||
|
||||
if self.is_fixed_in_frame:
|
||||
self.fix_in_frame()
|
||||
if self.depth_test:
|
||||
self.apply_depth_test()
|
||||
|
||||
def __str__(self):
|
||||
return self.__class__.__name__
|
||||
|
||||
# Related to data dict
|
||||
def init_data(self):
|
||||
self.data = {
|
||||
"points": np.zeros((0, 3)),
|
||||
"rgbas": np.zeros((1, 4)),
|
||||
}
|
||||
|
||||
def init_uniforms(self):
|
||||
self.uniforms = {
|
||||
"is_fixed_in_frame": float(self.is_fixed_in_frame),
|
||||
"gloss": self.gloss,
|
||||
"shadow": self.shadow,
|
||||
}
|
||||
|
||||
def init_colors(self):
|
||||
self.set_color(self.color, self.opacity)
|
||||
|
||||
|
@ -95,6 +100,8 @@ class Mobject(object):
|
|||
# Typically implemented in subclass, unlpess purposefully left blank
|
||||
pass
|
||||
|
||||
# Related to data dict
|
||||
|
||||
def set_data(self, data):
|
||||
for key in data:
|
||||
self.data[key] = data[key]
|
||||
|
@ -225,6 +232,9 @@ class Mobject(object):
|
|||
copy_mobject.data = dict(self.data)
|
||||
for key in self.data:
|
||||
copy_mobject.data[key] = self.data[key].copy()
|
||||
|
||||
copy_mobject.uniforms = dict(self.uniforms)
|
||||
|
||||
copy_mobject.submobjects = []
|
||||
copy_mobject.add(*[sm.copy() for sm in self.submobjects])
|
||||
copy_mobject.match_updaters(self)
|
||||
|
@ -751,19 +761,19 @@ class Mobject(object):
|
|||
self.set_opacity(1.0 - darkness, recurse=recurse)
|
||||
|
||||
def get_gloss(self):
|
||||
return self.gloss
|
||||
return self.uniforms["gloss"]
|
||||
|
||||
def set_gloss(self, gloss, recurse=True):
|
||||
for mob in self.get_family(recurse):
|
||||
mob.gloss = gloss
|
||||
mob.uniforms["gloss"] = gloss
|
||||
return self
|
||||
|
||||
def get_shadow(self):
|
||||
return self.shadow
|
||||
return self.uniforms["shadow"]
|
||||
|
||||
def set_shadow(self, shadow, recurse=True):
|
||||
for mob in self.get_family(recurse):
|
||||
mob.shadow = shadow
|
||||
mob.uniforms["shadow"] = shadow
|
||||
return self
|
||||
|
||||
##
|
||||
|
@ -1196,21 +1206,12 @@ class Mobject(object):
|
|||
mobject2.data[key],
|
||||
alpha
|
||||
)
|
||||
self.interpolate_light_style(mobject1, mobject2, alpha) # TODO, interpolate uniforms instaed
|
||||
return self
|
||||
|
||||
def interpolate_light_style(self, mobject1, mobject2, alpha):
|
||||
g0 = self.get_gloss()
|
||||
g1 = mobject1.get_gloss()
|
||||
g2 = mobject2.get_gloss()
|
||||
if not (g0 == g1 == g2):
|
||||
self.set_gloss(interpolate(g1, g2, alpha))
|
||||
|
||||
s0 = self.get_shadow()
|
||||
s1 = mobject1.get_shadow()
|
||||
s2 = mobject2.get_shadow()
|
||||
if not (s0 == s1 == s2):
|
||||
self.set_shadow(interpolate(s1, s2, alpha))
|
||||
for key in self.uniforms:
|
||||
self.uniforms[key] = interpolate(
|
||||
mobject1.uniforms[key],
|
||||
mobject2.uniforms[key],
|
||||
alpha
|
||||
)
|
||||
return self
|
||||
|
||||
def become_partial(self, mobject, a, b):
|
||||
|
@ -1278,12 +1279,12 @@ class Mobject(object):
|
|||
|
||||
@affects_shader_info_id
|
||||
def fix_in_frame(self):
|
||||
self.is_fixed_in_frame = True
|
||||
self.uniforms["is_fixed_in_frame"] = 1.0
|
||||
return self
|
||||
|
||||
@affects_shader_info_id
|
||||
def unfix_from_frame(self):
|
||||
self.is_fixed_in_frame = False
|
||||
self.uniforms["is_fixed_in_frame"] = 0.0
|
||||
return self
|
||||
|
||||
@affects_shader_info_id
|
||||
|
@ -1418,11 +1419,7 @@ class Mobject(object):
|
|||
self.get_shader_data()
|
||||
|
||||
def get_shader_uniforms(self):
|
||||
return {
|
||||
"is_fixed_in_frame": float(self.is_fixed_in_frame),
|
||||
"gloss": self.gloss,
|
||||
"shadow": self.shadow,
|
||||
}
|
||||
return self.uniforms
|
||||
|
||||
def get_shader_vert_indices(self):
|
||||
return self.shader_indices
|
||||
|
|
|
@ -224,7 +224,12 @@ class TexturedSurface(ParametricSurface):
|
|||
"opacity": np.array([self.uv_surface.data["rgbas"][:, 3]]),
|
||||
}
|
||||
|
||||
def init_uniforms(self):
|
||||
super().init_uniforms()
|
||||
self.uniforms["num_textures"] = self.num_textures
|
||||
|
||||
def init_colors(self):
|
||||
# Don't call ParametricSurface color init
|
||||
pass
|
||||
|
||||
def set_opacity(self, opacity, recurse=True):
|
||||
|
@ -244,11 +249,6 @@ class TexturedSurface(ParametricSurface):
|
|||
)
|
||||
return self
|
||||
|
||||
def get_shader_uniforms(self):
|
||||
result = super().get_shader_uniforms()
|
||||
result["num_textures"] = self.num_textures
|
||||
return result
|
||||
|
||||
def fill_in_shader_color_info(self, shader_data):
|
||||
self.read_data_to_shader(shader_data, "opacity", "opacity")
|
||||
self.read_data_to_shader(shader_data, "im_coords", "im_coords")
|
||||
|
|
Loading…
Add table
Reference in a new issue