/
click.go
79 lines (69 loc) · 2.23 KB
/
click.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
package engine
import (
"github.com/cadmean-ru/amphion/common/a"
"sort"
)
type MouseButton byte
const (
MouseUnknown MouseButton = iota
MouseLeft
MouseRight
MouseMiddle
MouseBack
MouseForward
)
// MouseEventData represents the data of mouse related event.
// Contains mouse coordinates, SceneObject, that was clicked and the mouse button.
type MouseEventData struct {
SceneObject *SceneObject
MousePosition a.IntVector2
MouseButton MouseButton
}
func (engine *AmphionEngine) handleClickEvent(mouseEventData MouseEventData, code int) {
if engine.currentScene == nil {
return
}
clickPos := mouseEventData.MousePosition
candidates := make([]*SceneObject, 0, 1)
engine.currentScene.ForEachObject(func(o *SceneObject) {
if o.HasBoundary() && o.IsPointInsideBoundaries2D(a.NewVector3(float32(clickPos.X), float32(clickPos.Y), 0)) {
candidates = append(candidates, o)
}
})
if len(candidates) > 0 {
sort.Slice(candidates, func(i, j int) bool {
return candidates[i].Transform.GetGlobalPosition().Z > candidates[j].Transform.GetGlobalPosition().Z
})
o := candidates[0]
mouseEventData.SceneObject = o
if engine.sceneContext.focusedObject != nil {
engine.messageDispatcher.DispatchDirectly(
engine.sceneContext.focusedObject,
NewMessage(
engine,
MessageBuiltinEvent,
NewAmphionEvent(engine.sceneContext.focusedObject, EventFocusLoose, nil),
),
)
}
engine.messageDispatcher.DispatchDirectly(o, NewMessage(o, MessageBuiltinEvent, NewAmphionEvent(o, code, mouseEventData)))
engine.sceneContext.focusedObject = o
engine.messageDispatcher.DispatchDirectly(o, NewMessage(o, MessageBuiltinEvent, NewAmphionEvent(o, EventFocusGain, nil)))
event := NewAmphionEvent(engine, code, mouseEventData)
engine.updateRoutine.enqueueEventAndRequestUpdate(event)
} else {
if engine.sceneContext.focusedObject != nil {
engine.messageDispatcher.DispatchDirectly(
engine.sceneContext.focusedObject,
NewMessage(
engine,
MessageBuiltinEvent,
NewAmphionEvent(engine.sceneContext.focusedObject, EventFocusLoose, nil),
),
)
}
engine.sceneContext.focusedObject = nil
event := NewAmphionEvent(engine, code, mouseEventData)
engine.updateRoutine.enqueueEventAndRequestUpdate(event)
}
}