using Azimuth; using Blacklight.Core; using Blacklight.Core.Cameras; using Microsoft.Win32; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using static System.Windows.Forms.VisualStyles.VisualStyleElement; namespace Glass.Blacklight { public class BlacklightGlassWorld { public Cel cel = new Cel(); public MouseManager mouseManager = new MouseManager(); public ScreenSpaceCamera camera = null; public MicroscopeController controller = null; public Scene scene = new Scene(); public BlacklightRenderer renderer = new BlacklightRenderer(); public Scalar Scale { get => camera.Magnification; set => camera.Magnification = value; } public BlacklightGlassWorld() { scene.Cels.Add(cel); } public void BindToViewport(ViewportControl control) { camera = new ScreenSpaceCamera(control.DrawableSurface); controller = control.Controller; controller.MouseDown += MouseDown; controller.MouseUp += MouseUp; controller.MouseMove += MouseMove; renderer.BindToWindow(control.DrawableSurface); } public void Unbind() { controller.MouseDown -= MouseDown; controller.MouseUp -= MouseUp; controller.MouseMove -= MouseMove; } public bool MouseDown(MouseEventArgs e) { var state = new MouseState { Position = new Vector(e.X, e.Y) / camera.Magnification, Buttons = ToFlags(e.Button), }; return mouseManager.MouseDown(state, ToFlags(e.Button)) != null; } public bool MouseUp(MouseEventArgs e) { var state = new MouseState { Position = new Vector(e.X, e.Y) / camera.Magnification, Buttons = ToFlags(e.Button), }; return mouseManager.MouseUp(state, ToFlags(e.Button)) != null; } public bool MouseMove(MouseEventArgs e) { var state = new MouseState { Position = new Vector(e.X, e.Y) / camera.Magnification, Buttons = ToFlags(e.Button), }; return mouseManager.MouseMove(state) != null; } public void Render(WindowHandle window) { cel.Clear(); renderer.Render(cel, Controls); window.DrawScene(scene, camera); } public static MouseButtonFlags ToFlags(MouseButtons buttons) { var flags = MouseButtonFlags.None; if ((buttons & MouseButtons.Left) != 0) { flags |= MouseButtonFlags.Left; } if ((buttons & MouseButtons.Middle) != 0) { flags |= MouseButtonFlags.Middle; } if ((buttons & MouseButtons.Right) != 0) { flags |= MouseButtonFlags.Right; } return flags; } public ControlContainer Controls => mouseManager.Controls; } }