Skip to content

Commit 013a817

Browse files
committed
Read mouse movement
1 parent a75d551 commit 013a817

File tree

4 files changed

+40
-2
lines changed

4 files changed

+40
-2
lines changed

example_scenes/opengl.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,14 @@
88
# Lines that do not yet work with the Community Version are commented.
99

1010

11+
class Test(Scene):
12+
def construct(self):
13+
square = OpenGLSquare()
14+
square.add_updater(lambda s: s.move_to(self.mouse_point))
15+
self.add(square)
16+
self.wait(60)
17+
18+
1119
class InteractiveDevelopment(Scene):
1220
def construct(self):
1321
circle = OpenGLCircle()

manim/renderer/opengl_renderer.py

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -189,7 +189,7 @@ def __init__(self):
189189
self.camera = OpenGLCamera()
190190

191191
if config["preview"]:
192-
self.window = Window()
192+
self.window = Window(self)
193193
self.context = self.window.ctx
194194
self.frame_buffer_object = self.context.detect_framebuffer()
195195
else:
@@ -352,6 +352,7 @@ def init_scene(self, scene):
352352
self,
353353
scene.__class__.__name__,
354354
)
355+
self.scene = scene
355356

356357
def play(self, scene, *args, **kwargs):
357358
if len(args) == 0:
@@ -429,3 +430,15 @@ def get_raw_frame_buffer_object_data(self, dtype="f1"):
429430
dtype=dtype,
430431
)
431432
return ret
433+
434+
# Returns offset from the bottom left corner in pixels.
435+
def pixel_coords_to_space_coords(self, px, py, relative=False):
436+
pw, ph = config["pixel_width"], config["pixel_height"]
437+
fw, fh = config["frame_width"], config["frame_height"]
438+
fc = self.camera.get_center()
439+
if relative:
440+
return 2 * np.array([px / pw, py / ph, 0])
441+
else:
442+
# Only scale wrt one axis
443+
scale = fh / ph
444+
return fc + scale * np.array([(px - pw / 2), (py - ph / 2), 0])

manim/renderer/opengl_renderer_window.py

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ class Window(PygletWindow):
1111
vsync = True
1212
cursor = True
1313

14-
def __init__(self, size=None, **kwargs):
14+
def __init__(self, renderer, size=None, **kwargs):
1515
if size is None:
1616
size = (config["pixel_width"], config["pixel_height"])
1717
super().__init__(size=size)
@@ -20,10 +20,18 @@ def __init__(self, size=None, **kwargs):
2020

2121
self.title = "Title goes here"
2222
self.size = size
23+
self.renderer = renderer
2324

2425
mglw.activate_context(window=self)
2526
self.timer = Timer()
2627
self.config = mglw.WindowConfig(ctx=self.ctx, wnd=self, timer=self.timer)
2728
self.timer.start()
2829

2930
self.swap_buffers()
31+
32+
# Delegate event handling to scene
33+
def on_mouse_motion(self, x, y, dx, dy):
34+
super().on_mouse_motion(x, y, dx, dy)
35+
point = self.renderer.pixel_coords_to_space_coords(x, y)
36+
d_point = self.renderer.pixel_coords_to_space_coords(dx, dy, relative=True)
37+
self.renderer.scene.on_mouse_motion(point, d_point)

manim/scene/scene.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
from ..constants import *
2323
from ..container import Container
2424
from ..mobject.mobject import Mobject, _AnimationBuilder
25+
from ..mobject.opengl_mobject import OpenGLPoint
2526
from ..utils.iterables import list_update, list_difference_update
2627
from ..utils.family import extract_mobject_family_members
2728
from ..renderer.cairo_renderer import CairoRenderer
@@ -81,6 +82,11 @@ def __init__(
8182
self.duration = None
8283
self.last_t = None
8384

85+
if config["use_opengl_renderer"]:
86+
# Items associated with interaction
87+
self.mouse_point = OpenGLPoint()
88+
self.mouse_drag_point = OpenGLPoint()
89+
8490
if renderer is None:
8591
self.renderer = CairoRenderer(
8692
camera_class=self.camera_class,
@@ -950,3 +956,6 @@ def add_sound(self, sound_file, time_offset=0, gain=None, **kwargs):
950956
return
951957
time = self.renderer.time + time_offset
952958
self.renderer.file_writer.add_sound(sound_file, time, gain, **kwargs)
959+
960+
def on_mouse_motion(self, point, d_point):
961+
self.mouse_point.move_to(point)

0 commit comments

Comments
 (0)