74 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
		
		
			
		
	
	
			74 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| 
								 | 
							
								package mouse
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								import (
							 | 
						||
| 
								 | 
							
									"github.com/go-gl/glfw/v3.3/glfw"
							 | 
						||
| 
								 | 
							
									"zworld/plugins/system/input/keys"
							 | 
						||
| 
								 | 
							
									"zworld/plugins/math/vec2"
							 | 
						||
| 
								 | 
							
								)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								type Callback func(Event)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								type Handler interface {
							 | 
						||
| 
								 | 
							
									MouseEvent(Event)
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								type MouseWrapper interface {
							 | 
						||
| 
								 | 
							
									Button(w *glfw.Window, button glfw.MouseButton, action glfw.Action, mod glfw.ModifierKey)
							 | 
						||
| 
								 | 
							
									Move(w *glfw.Window, x, y float64)
							 | 
						||
| 
								 | 
							
									Scroll(w *glfw.Window, x, y float64)
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								type wrapper struct {
							 | 
						||
| 
								 | 
							
									Handler
							 | 
						||
| 
								 | 
							
									position vec2.T
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								func NewWrapper(handler Handler) MouseWrapper {
							 | 
						||
| 
								 | 
							
									return &wrapper{
							 | 
						||
| 
								 | 
							
										Handler: handler,
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								func (mw *wrapper) Button(w *glfw.Window, button glfw.MouseButton, action glfw.Action, mod glfw.ModifierKey) {
							 | 
						||
| 
								 | 
							
									mw.MouseEvent(&event{
							 | 
						||
| 
								 | 
							
										action:   Action(action),
							 | 
						||
| 
								 | 
							
										button:   Button(button),
							 | 
						||
| 
								 | 
							
										mods:     keys.Modifier(mod),
							 | 
						||
| 
								 | 
							
										position: mw.position,
							 | 
						||
| 
								 | 
							
										locked:   locked,
							 | 
						||
| 
								 | 
							
									})
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								func (mw *wrapper) Move(w *glfw.Window, x, y float64) {
							 | 
						||
| 
								 | 
							
									// calculate framebuffer scale relative to window
							 | 
						||
| 
								 | 
							
									width, _ := w.GetSize()
							 | 
						||
| 
								 | 
							
									fwidth, fheight := w.GetFramebufferSize()
							 | 
						||
| 
								 | 
							
									scale := float32(fwidth) / float32(width)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									// calculate framebuffer position & mouse delta
							 | 
						||
| 
								 | 
							
									pos := vec2.New(float32(x), float32(y)).Scaled(scale)
							 | 
						||
| 
								 | 
							
									dt := pos.Sub(mw.position)
							 | 
						||
| 
								 | 
							
									mw.position = pos
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									// discard events that occur outside of the window bounds
							 | 
						||
| 
								 | 
							
									if pos.X < 0 || pos.Y < 0 || int(pos.X) > fwidth || int(pos.Y) > fheight {
							 | 
						||
| 
								 | 
							
										return
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									// submit event to handler
							 | 
						||
| 
								 | 
							
									mw.MouseEvent(&event{
							 | 
						||
| 
								 | 
							
										action:   Move,
							 | 
						||
| 
								 | 
							
										position: pos,
							 | 
						||
| 
								 | 
							
										delta:    dt,
							 | 
						||
| 
								 | 
							
										locked:   locked,
							 | 
						||
| 
								 | 
							
									})
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								func (mw *wrapper) Scroll(w *glfw.Window, x, y float64) {
							 | 
						||
| 
								 | 
							
									mw.MouseEvent(&event{
							 | 
						||
| 
								 | 
							
										action: Scroll,
							 | 
						||
| 
								 | 
							
										scroll: vec2.New(float32(x), float32(y)),
							 | 
						||
| 
								 | 
							
										locked: locked,
							 | 
						||
| 
								 | 
							
									})
							 | 
						||
| 
								 | 
							
								}
							 |