diff --git a/example_scenes.py b/example_scenes.py index 50a2b5fc..8852903a 100644 --- a/example_scenes.py +++ b/example_scenes.py @@ -414,7 +414,7 @@ class ControlsExample(Scene): def text_updater(old_text): assert(isinstance(old_text, Text)) 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) if self.checkbox.get_value(): new_text.set_fill( @@ -424,14 +424,13 @@ class ControlsExample(Scene): else: new_text.set_opacity(0) old_text.become(new_text) - + text.add_updater(text_updater) self.add(MotionMobject(text)) self.textbox.set_value("Manim") - self.wait(60) - self.embed() + # self.embed() # See https://github.com/3b1b/videos for many, many more diff --git a/manimlib/camera/camera.py b/manimlib/camera/camera.py index 39a7cd99..80695a83 100644 --- a/manimlib/camera/camera.py +++ b/manimlib/camera/camera.py @@ -353,7 +353,11 @@ class Camera(object): if shader_wrapper.vert_indices is None: ibo = None 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 shader_program, vert_format = self.get_shader_program(shader_wrapper) diff --git a/manimlib/mobject/interactive.py b/manimlib/mobject/interactive.py index 69f4c698..7e72d816 100644 --- a/manimlib/mobject/interactive.py +++ b/manimlib/mobject/interactive.py @@ -29,7 +29,8 @@ class MotionMobject(Mobject): def __init__(self, mobject, **kwargs): super().__init__(**kwargs) 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) def on_mouse_drag(self, point, d_point, buttons, modifiers): @@ -40,7 +41,7 @@ class MotionMobject(Mobject): class Button(Mobject): """ - Pass any mobject and register an on_click method + Pass any mobject and register an on_click method """ CONFIG = { @@ -69,7 +70,8 @@ class ContolMobject(ValueTracker): super().__init__(value=value, **kwargs) 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() def set_value(self, value): @@ -85,6 +87,7 @@ class ContolMobject(ValueTracker): # To be implemented in subclasses pass + class EnableDisableButton(ContolMobject): CONFIG = { "value_type": np.dtype(bool), @@ -103,12 +106,12 @@ class EnableDisableButton(ContolMobject): super().__init__(value, self.box, **kwargs) def assert_value(self, value): - assert(value == True or value == False) + assert(isinstance(value, bool)) def set_value_anim(self, value): - if value == True: + if value: self.box.set_fill(self.enable_color) - elif value == False: + else: self.box.set_fill(self.disable_color) def toggle_value(self): @@ -146,15 +149,15 @@ class Checkbox(ContolMobject): super().__init__(value, self.box, self.box_content, **kwargs) def assert_value(self, value): - assert(value == True or value == False) + assert(isinstance(value, bool)) def toggle_value(self): super().set_value(not self.get_value()) def set_value_anim(self, value): - if value == True: + if value: self.box_content.become(self.get_checkmark()) - elif value == False: + else: self.box_content.become(self.get_cross()) def on_mouse_press(self, point, button, mods): @@ -191,7 +194,6 @@ class Checkbox(ContolMobject): class LinearNumberSlider(ContolMobject): CONFIG = { "value_type": np.float64, - "min_value": -10.0, "max_value": 10.0, "step": 1.0, @@ -245,6 +247,7 @@ class LinearNumberSlider(ContolMobject): value_nearest_to_step = self.min_value + no_of_steps * self.step return value_nearest_to_step + class ColorSliders(Group): CONFIG = { "sliders_kwargs": {}, @@ -265,7 +268,7 @@ class ColorSliders(Group): def __init__(self, **kwargs): digest_config(self, kwargs) - rgb_kwargs = {"value": self.default_rgb_value,"min_value": 0, "max_value": 255, "step": 1} + rgb_kwargs = {"value": self.default_rgb_value, "min_value": 0, "max_value": 255, "step": 1} a_kwargs = {"value": self.default_a_value, "min_value": 0, "max_value": 1, "step": 0.04} self.r_slider = LinearNumberSlider(**self.sliders_kwargs, **rgb_kwargs) @@ -377,12 +380,16 @@ class Textbox(ContolMobject): self.update_text(value) def update_text(self, value): - self.remove(self.text) - self.text.__init__(value, **self.text_kwargs) - self.text.set_width(self.box.get_width() - 2*self.text_buff, stretch=True) - self.text.add_updater(lambda mob: mob.move_to(self.box)) - self.text.fix_in_frame() - self.add(self.text) + text = self.text + self.remove(text) + text.__init__(value, **self.text_kwargs) + height = text.get_height() + text.set_width(self.box.get_width() - 2 * self.text_buff) + 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): if isActive: @@ -411,14 +418,14 @@ class Textbox(ContolMobject): elif symbol == PygletWindowKeys.TAB: new_value = old_value + '\t' elif symbol == PygletWindowKeys.BACKSPACE: - new_value = old_value[:-1] or '' + new_value = old_value[:-1] or '' self.set_value(new_value) return False + class ControlPanel(Group): CONFIG = { "listen_to_events": True, - "panel_kwargs": { "width": FRAME_WIDTH / 4, "height": MED_SMALL_BUFF + FRAME_HEIGHT, @@ -478,7 +485,7 @@ class ControlPanel(Group): direction=UP, buff=MED_SMALL_BUFF ) - + self.controls.set_x(controls_old_x) def add_controls(self, *new_controls): @@ -502,7 +509,7 @@ class ControlPanel(Group): self.panel_opener.set_x(panel_opener_x) self.move_panel_and_controls_to_panel_opener() return self - + def on_mouse_drag(self, point, d_point, buttons, modifiers): if self.panel_opener.is_point_touching(point): self.panel_opener.match_y(Dot(point)) @@ -514,4 +521,3 @@ class ControlPanel(Group): factor = 10 * offset[1] self.controls.set_y(self.controls.get_y() + factor) return False - diff --git a/manimlib/mobject/mobject.py b/manimlib/mobject/mobject.py index 5f31a841..5a7de8a3 100644 --- a/manimlib/mobject/mobject.py +++ b/manimlib/mobject/mobject.py @@ -218,12 +218,8 @@ class Mobject(object): return self def is_point_touching(self, point, buff=MED_SMALL_BUFF): - self.refresh_bounding_box() bb = self.get_bounding_box() - if np.all(point >= (bb[0] - buff)) and np.all(point <= (bb[2] + buff)): - return True - else: - return False + return np.all(point >= (bb[0] - buff)) and np.all(point <= (bb[2] + buff)) # Family matters