mirror of
https://github.com/3b1b/manim.git
synced 2025-08-05 16:49:03 +00:00
Some cleanup for interactive mobjects
This commit is contained in:
parent
baab9ddf02
commit
5a2a363a87
4 changed files with 37 additions and 32 deletions
|
@ -414,7 +414,7 @@ class ControlsExample(Scene):
|
||||||
def text_updater(old_text):
|
def text_updater(old_text):
|
||||||
assert(isinstance(old_text, Text))
|
assert(isinstance(old_text, Text))
|
||||||
new_text = Text(self.textbox.get_value(), size=old_text.size)
|
new_text = Text(self.textbox.get_value(), size=old_text.size)
|
||||||
new_text.align_data_and_family(old_text)
|
# new_text.align_data_and_family(old_text)
|
||||||
new_text.move_to(old_text)
|
new_text.move_to(old_text)
|
||||||
if self.checkbox.get_value():
|
if self.checkbox.get_value():
|
||||||
new_text.set_fill(
|
new_text.set_fill(
|
||||||
|
@ -430,8 +430,7 @@ class ControlsExample(Scene):
|
||||||
self.add(MotionMobject(text))
|
self.add(MotionMobject(text))
|
||||||
|
|
||||||
self.textbox.set_value("Manim")
|
self.textbox.set_value("Manim")
|
||||||
self.wait(60)
|
# self.embed()
|
||||||
self.embed()
|
|
||||||
|
|
||||||
|
|
||||||
# See https://github.com/3b1b/videos for many, many more
|
# See https://github.com/3b1b/videos for many, many more
|
||||||
|
|
|
@ -353,7 +353,11 @@ class Camera(object):
|
||||||
if shader_wrapper.vert_indices is None:
|
if shader_wrapper.vert_indices is None:
|
||||||
ibo = None
|
ibo = None
|
||||||
else:
|
else:
|
||||||
ibo = self.ctx.buffer(shader_wrapper.vert_indices.astype('i4').tobytes())
|
vert_index_data = shader_wrapper.vert_indices.astype('i4').tobytes()
|
||||||
|
if vert_index_data:
|
||||||
|
ibo = self.ctx.buffer(vert_index_data)
|
||||||
|
else:
|
||||||
|
ibo = None
|
||||||
|
|
||||||
# Program and vertex array
|
# Program and vertex array
|
||||||
shader_program, vert_format = self.get_shader_program(shader_wrapper)
|
shader_program, vert_format = self.get_shader_program(shader_wrapper)
|
||||||
|
|
|
@ -29,7 +29,8 @@ class MotionMobject(Mobject):
|
||||||
def __init__(self, mobject, **kwargs):
|
def __init__(self, mobject, **kwargs):
|
||||||
super().__init__(**kwargs)
|
super().__init__(**kwargs)
|
||||||
self.mobject = mobject
|
self.mobject = mobject
|
||||||
self.mobject.add_updater(lambda mob: None) # To avoid locking it as static mobject
|
# To avoid locking it as static mobject
|
||||||
|
self.mobject.add_updater(lambda mob: None)
|
||||||
self.add(mobject)
|
self.add(mobject)
|
||||||
|
|
||||||
def on_mouse_drag(self, point, d_point, buttons, modifiers):
|
def on_mouse_drag(self, point, d_point, buttons, modifiers):
|
||||||
|
@ -69,7 +70,8 @@ class ContolMobject(ValueTracker):
|
||||||
super().__init__(value=value, **kwargs)
|
super().__init__(value=value, **kwargs)
|
||||||
self.add(*mobjects)
|
self.add(*mobjects)
|
||||||
|
|
||||||
self.add_updater(lambda mob: None) # To avoid lock_static_mobject_data while waiting in scene
|
# To avoid lock_static_mobject_data while waiting in scene
|
||||||
|
self.add_updater(lambda mob: None)
|
||||||
self.fix_in_frame()
|
self.fix_in_frame()
|
||||||
|
|
||||||
def set_value(self, value):
|
def set_value(self, value):
|
||||||
|
@ -85,6 +87,7 @@ class ContolMobject(ValueTracker):
|
||||||
# To be implemented in subclasses
|
# To be implemented in subclasses
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
class EnableDisableButton(ContolMobject):
|
class EnableDisableButton(ContolMobject):
|
||||||
CONFIG = {
|
CONFIG = {
|
||||||
"value_type": np.dtype(bool),
|
"value_type": np.dtype(bool),
|
||||||
|
@ -103,12 +106,12 @@ class EnableDisableButton(ContolMobject):
|
||||||
super().__init__(value, self.box, **kwargs)
|
super().__init__(value, self.box, **kwargs)
|
||||||
|
|
||||||
def assert_value(self, value):
|
def assert_value(self, value):
|
||||||
assert(value == True or value == False)
|
assert(isinstance(value, bool))
|
||||||
|
|
||||||
def set_value_anim(self, value):
|
def set_value_anim(self, value):
|
||||||
if value == True:
|
if value:
|
||||||
self.box.set_fill(self.enable_color)
|
self.box.set_fill(self.enable_color)
|
||||||
elif value == False:
|
else:
|
||||||
self.box.set_fill(self.disable_color)
|
self.box.set_fill(self.disable_color)
|
||||||
|
|
||||||
def toggle_value(self):
|
def toggle_value(self):
|
||||||
|
@ -146,15 +149,15 @@ class Checkbox(ContolMobject):
|
||||||
super().__init__(value, self.box, self.box_content, **kwargs)
|
super().__init__(value, self.box, self.box_content, **kwargs)
|
||||||
|
|
||||||
def assert_value(self, value):
|
def assert_value(self, value):
|
||||||
assert(value == True or value == False)
|
assert(isinstance(value, bool))
|
||||||
|
|
||||||
def toggle_value(self):
|
def toggle_value(self):
|
||||||
super().set_value(not self.get_value())
|
super().set_value(not self.get_value())
|
||||||
|
|
||||||
def set_value_anim(self, value):
|
def set_value_anim(self, value):
|
||||||
if value == True:
|
if value:
|
||||||
self.box_content.become(self.get_checkmark())
|
self.box_content.become(self.get_checkmark())
|
||||||
elif value == False:
|
else:
|
||||||
self.box_content.become(self.get_cross())
|
self.box_content.become(self.get_cross())
|
||||||
|
|
||||||
def on_mouse_press(self, point, button, mods):
|
def on_mouse_press(self, point, button, mods):
|
||||||
|
@ -191,7 +194,6 @@ class Checkbox(ContolMobject):
|
||||||
class LinearNumberSlider(ContolMobject):
|
class LinearNumberSlider(ContolMobject):
|
||||||
CONFIG = {
|
CONFIG = {
|
||||||
"value_type": np.float64,
|
"value_type": np.float64,
|
||||||
|
|
||||||
"min_value": -10.0,
|
"min_value": -10.0,
|
||||||
"max_value": 10.0,
|
"max_value": 10.0,
|
||||||
"step": 1.0,
|
"step": 1.0,
|
||||||
|
@ -245,6 +247,7 @@ class LinearNumberSlider(ContolMobject):
|
||||||
value_nearest_to_step = self.min_value + no_of_steps * self.step
|
value_nearest_to_step = self.min_value + no_of_steps * self.step
|
||||||
return value_nearest_to_step
|
return value_nearest_to_step
|
||||||
|
|
||||||
|
|
||||||
class ColorSliders(Group):
|
class ColorSliders(Group):
|
||||||
CONFIG = {
|
CONFIG = {
|
||||||
"sliders_kwargs": {},
|
"sliders_kwargs": {},
|
||||||
|
@ -377,12 +380,16 @@ class Textbox(ContolMobject):
|
||||||
self.update_text(value)
|
self.update_text(value)
|
||||||
|
|
||||||
def update_text(self, value):
|
def update_text(self, value):
|
||||||
self.remove(self.text)
|
text = self.text
|
||||||
self.text.__init__(value, **self.text_kwargs)
|
self.remove(text)
|
||||||
self.text.set_width(self.box.get_width() - 2*self.text_buff, stretch=True)
|
text.__init__(value, **self.text_kwargs)
|
||||||
self.text.add_updater(lambda mob: mob.move_to(self.box))
|
height = text.get_height()
|
||||||
self.text.fix_in_frame()
|
text.set_width(self.box.get_width() - 2 * self.text_buff)
|
||||||
self.add(self.text)
|
if text.get_height() > height:
|
||||||
|
text.set_height(height)
|
||||||
|
text.add_updater(lambda mob: mob.move_to(self.box))
|
||||||
|
text.fix_in_frame()
|
||||||
|
self.add(text)
|
||||||
|
|
||||||
def active_anim(self, isActive):
|
def active_anim(self, isActive):
|
||||||
if isActive:
|
if isActive:
|
||||||
|
@ -415,10 +422,10 @@ class Textbox(ContolMobject):
|
||||||
self.set_value(new_value)
|
self.set_value(new_value)
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
|
||||||
class ControlPanel(Group):
|
class ControlPanel(Group):
|
||||||
CONFIG = {
|
CONFIG = {
|
||||||
"listen_to_events": True,
|
"listen_to_events": True,
|
||||||
|
|
||||||
"panel_kwargs": {
|
"panel_kwargs": {
|
||||||
"width": FRAME_WIDTH / 4,
|
"width": FRAME_WIDTH / 4,
|
||||||
"height": MED_SMALL_BUFF + FRAME_HEIGHT,
|
"height": MED_SMALL_BUFF + FRAME_HEIGHT,
|
||||||
|
@ -514,4 +521,3 @@ class ControlPanel(Group):
|
||||||
factor = 10 * offset[1]
|
factor = 10 * offset[1]
|
||||||
self.controls.set_y(self.controls.get_y() + factor)
|
self.controls.set_y(self.controls.get_y() + factor)
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
|
|
@ -218,12 +218,8 @@ class Mobject(object):
|
||||||
return self
|
return self
|
||||||
|
|
||||||
def is_point_touching(self, point, buff=MED_SMALL_BUFF):
|
def is_point_touching(self, point, buff=MED_SMALL_BUFF):
|
||||||
self.refresh_bounding_box()
|
|
||||||
bb = self.get_bounding_box()
|
bb = self.get_bounding_box()
|
||||||
if np.all(point >= (bb[0] - buff)) and np.all(point <= (bb[2] + buff)):
|
return np.all(point >= (bb[0] - buff)) and np.all(point <= (bb[2] + buff))
|
||||||
return True
|
|
||||||
else:
|
|
||||||
return False
|
|
||||||
|
|
||||||
# Family matters
|
# Family matters
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue