asny / three-d

2D/3D renderer - makes it simple to draw stuff across platforms (including web)
MIT License
1.33k stars 110 forks source link

Trackpad-specific input event support #482

Closed thatcomputerguy0101 closed 1 week ago

thatcomputerguy0101 commented 2 months ago

This adds support for pinch and rotation gesture events, as exposed from winit on MacOS platforms. Additionally, this associates ctrl-scrolling with the pinch gesture unless actual gesture events are detected since some Windows trackpads expose pinch information as scrolling with the ctrl key held. This somewhat breaks any custom control systems that expect pinch to zoom until they are updated with the new pinch event. However, since key modifiers are not made accessible to the camera control interface, any old handlers are still accessible by scrolling vertically.

thatcomputerguy0101 commented 1 month ago

Instead of remapping events, I added the capability to execute different camera actions depending on the state of the modifier keys. This removed the Copy trait from CameraAction and CameraControl due to Box now being involved, but standard uses of those two types outside of the three-d crate should not be affected.

thatcomputerguy0101 commented 1 month ago

On further consideration, I'm not sure I'm happy with the Box-based modifier map, so I'm going to separate that from this PR to allow for further design revision. In the meantime, custom control interfaces could handle modifier keys before passing the event list to CameraControl::handle_events.

asny commented 1 week ago

I think it looks really good. Since I was so slow responding, I resolved the merge conflict and merged the changes. If you think there's more changes needed, feel free to open another PR 🙂 Thanks for the contribution, yet again 🙏

asny commented 1 week ago

@thatcomputerguy0101 While looking at your changes, I realised that the whole control setup is a bit over engineered. Therefore, I tried to remove the CameraControl and the CameraAction in https://github.com/asny/three-d/pull/507. It simply applies the incoming events directly to the camera. This actually made the whole setup much simpler, so I'm going to merge that. Feedback to this approach is very welcome 🙏