Track/interpolate uniforms the same way data is

This commit is contained in:
Grant Sanderson
2021-01-12 12:15:32 -10:00
parent ba8fb4a6b7
commit d60ec48591
2 changed files with 31 additions and 34 deletions

View File

@ -68,26 +68,31 @@ class Mobject(object):
self.locked_data_keys = set() self.locked_data_keys = set()
self.init_data() self.init_data()
self.init_uniforms()
self.init_updaters() self.init_updaters()
self.init_points() self.init_points()
self.init_colors() self.init_colors()
self.init_shader_data() self.init_shader_data()
if self.is_fixed_in_frame:
self.fix_in_frame()
if self.depth_test: if self.depth_test:
self.apply_depth_test() self.apply_depth_test()
def __str__(self): def __str__(self):
return self.__class__.__name__ return self.__class__.__name__
# Related to data dict
def init_data(self): def init_data(self):
self.data = { self.data = {
"points": np.zeros((0, 3)), "points": np.zeros((0, 3)),
"rgbas": np.zeros((1, 4)), "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): def init_colors(self):
self.set_color(self.color, self.opacity) self.set_color(self.color, self.opacity)
@ -95,6 +100,8 @@ class Mobject(object):
# Typically implemented in subclass, unlpess purposefully left blank # Typically implemented in subclass, unlpess purposefully left blank
pass pass
# Related to data dict
def set_data(self, data): def set_data(self, data):
for key in data: for key in data:
self.data[key] = data[key] self.data[key] = data[key]
@ -225,6 +232,9 @@ class Mobject(object):
copy_mobject.data = dict(self.data) copy_mobject.data = dict(self.data)
for key in self.data: for key in self.data:
copy_mobject.data[key] = self.data[key].copy() copy_mobject.data[key] = self.data[key].copy()
copy_mobject.uniforms = dict(self.uniforms)
copy_mobject.submobjects = [] copy_mobject.submobjects = []
copy_mobject.add(*[sm.copy() for sm in self.submobjects]) copy_mobject.add(*[sm.copy() for sm in self.submobjects])
copy_mobject.match_updaters(self) copy_mobject.match_updaters(self)
@ -751,19 +761,19 @@ class Mobject(object):
self.set_opacity(1.0 - darkness, recurse=recurse) self.set_opacity(1.0 - darkness, recurse=recurse)
def get_gloss(self): def get_gloss(self):
return self.gloss return self.uniforms["gloss"]
def set_gloss(self, gloss, recurse=True): def set_gloss(self, gloss, recurse=True):
for mob in self.get_family(recurse): for mob in self.get_family(recurse):
mob.gloss = gloss mob.uniforms["gloss"] = gloss
return self return self
def get_shadow(self): def get_shadow(self):
return self.shadow return self.uniforms["shadow"]
def set_shadow(self, shadow, recurse=True): def set_shadow(self, shadow, recurse=True):
for mob in self.get_family(recurse): for mob in self.get_family(recurse):
mob.shadow = shadow mob.uniforms["shadow"] = shadow
return self return self
## ##
@ -1196,21 +1206,12 @@ class Mobject(object):
mobject2.data[key], mobject2.data[key],
alpha alpha
) )
self.interpolate_light_style(mobject1, mobject2, alpha) # TODO, interpolate uniforms instaed for key in self.uniforms:
return self self.uniforms[key] = interpolate(
mobject1.uniforms[key],
def interpolate_light_style(self, mobject1, mobject2, alpha): mobject2.uniforms[key],
g0 = self.get_gloss() alpha
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))
return self return self
def become_partial(self, mobject, a, b): def become_partial(self, mobject, a, b):
@ -1278,12 +1279,12 @@ class Mobject(object):
@affects_shader_info_id @affects_shader_info_id
def fix_in_frame(self): def fix_in_frame(self):
self.is_fixed_in_frame = True self.uniforms["is_fixed_in_frame"] = 1.0
return self return self
@affects_shader_info_id @affects_shader_info_id
def unfix_from_frame(self): def unfix_from_frame(self):
self.is_fixed_in_frame = False self.uniforms["is_fixed_in_frame"] = 0.0
return self return self
@affects_shader_info_id @affects_shader_info_id
@ -1418,11 +1419,7 @@ class Mobject(object):
self.get_shader_data() self.get_shader_data()
def get_shader_uniforms(self): def get_shader_uniforms(self):
return { return self.uniforms
"is_fixed_in_frame": float(self.is_fixed_in_frame),
"gloss": self.gloss,
"shadow": self.shadow,
}
def get_shader_vert_indices(self): def get_shader_vert_indices(self):
return self.shader_indices return self.shader_indices

View File

@ -224,7 +224,12 @@ class TexturedSurface(ParametricSurface):
"opacity": np.array([self.uv_surface.data["rgbas"][:, 3]]), "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): def init_colors(self):
# Don't call ParametricSurface color init
pass pass
def set_opacity(self, opacity, recurse=True): def set_opacity(self, opacity, recurse=True):
@ -244,11 +249,6 @@ class TexturedSurface(ParametricSurface):
) )
return self 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): 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, "opacity", "opacity")
self.read_data_to_shader(shader_data, "im_coords", "im_coords") self.read_data_to_shader(shader_data, "im_coords", "im_coords")