tangled
alpha
login
or
join now
cass.cityboundforest.com
/
triangular-viking
0
fork
atom
A Quadrilateral Cowboy clone intended to help me learn Game Dev
0
fork
atom
overview
issues
pulls
pipelines
Adding large terminal code
cass.cityboundforest.com
3 weeks ago
aece78ef
fe1a47f9
+118
-1
2 changed files
expand all
collapse all
unified
split
terminal.go
utils.go
+104
-1
terminal.go
···
2
2
3
3
import (
4
4
"graphics.gd/classdb"
5
5
+
"graphics.gd/classdb/Area3D"
6
6
+
"graphics.gd/classdb/InputEvent"
7
7
+
"graphics.gd/classdb/InputEventMouse"
8
8
+
"graphics.gd/classdb/InputEventMouseMotion"
9
9
+
"graphics.gd/classdb/MeshInstance3D"
10
10
+
"graphics.gd/classdb/Node"
5
11
"graphics.gd/classdb/Node3D"
6
12
"graphics.gd/classdb/SubViewport"
13
13
+
"graphics.gd/classdb/Time"
14
14
+
"graphics.gd/variant"
15
15
+
"graphics.gd/variant/Transform3D"
16
16
+
"graphics.gd/variant/Vector2"
17
17
+
"graphics.gd/variant/Vector3"
7
18
)
8
19
9
20
type TerminalScene struct {
10
21
Node3D.Extension[TerminalScene]
11
22
12
12
-
SubViewport SubViewport.Instance
23
23
+
SubViewport SubViewport.Instance
24
24
+
is_mouse_inside bool
25
25
+
last_event_pos2D any
26
26
+
last_event_time float32
27
27
+
}
28
28
+
29
29
+
func (t *TerminalScene) Ready() {
30
30
+
node_area_node := t.AsNode().GetNode("Quad/Area3D")
31
31
+
node_area := Area3D.New()
32
32
+
node_area.SetObject(node_area_node.AsObject())
33
33
+
node_area.AsCollisionObject3D().OnMouseEntered(t.mouse_entered_area)
34
34
+
node_area.AsCollisionObject3D().OnMouseExited(t.mouse_exited_area)
35
35
+
node_area.AsCollisionObject3D().OnInputEvent(t.mouse_input_event)
36
36
+
}
37
37
+
38
38
+
func (t *TerminalScene) mouse_entered_area() {
39
39
+
t.is_mouse_inside = true
40
40
+
}
41
41
+
42
42
+
func (t *TerminalScene) mouse_exited_area() {
43
43
+
t.is_mouse_inside = false
44
44
+
}
45
45
+
46
46
+
func (t *TerminalScene) UnhandledInput(event InputEvent.Instance) {
47
47
+
event_variant := variant.New(event)
48
48
+
event_type_string := event_variant.Type().String()
49
49
+
50
50
+
if (event_type_string == "InputEventMouseButton") || (event_type_string == "InputEventMouseMotion") || (event_type_string == "InputEventScreenDrag") || (event_type_string == "InputEventScreenTouch") {
51
51
+
return
52
52
+
}
53
53
+
54
54
+
node_viewport_node := t.AsNode().GetNode("SubViewport")
55
55
+
node_viewport := SubViewport.New()
56
56
+
node_viewport.SetObject(node_viewport_node.AsObject())
57
57
+
node_viewport.AsViewport().PushInput(event)
58
58
+
}
59
59
+
60
60
+
func (t *TerminalScene) mouse_input_event(_camera Node.Instance, event InputEvent.Instance, event_position Vector3.XYZ, _normal Vector3.XYZ, _shape_idx int) {
61
61
+
node_quad_node := t.AsNode().GetNode("Quad")
62
62
+
node_quad := MeshInstance3D.New()
63
63
+
node_quad.SetObject(node_quad_node.AsObject())
64
64
+
65
65
+
node_viewport_node := t.AsNode().GetNode("SubViewport")
66
66
+
node_viewport := SubViewport.New()
67
67
+
node_viewport.SetObject(node_viewport_node.AsObject())
68
68
+
69
69
+
mouse_event := InputEventMouse.New()
70
70
+
mouse_event.SetObject(event.AsObject())
71
71
+
72
72
+
event_variant := variant.New(event)
73
73
+
event_type_string := event_variant.Type().String()
74
74
+
75
75
+
quad_mesh_size := node_quad.Mesh().GetAabb().Size
76
76
+
event_pos3D := event_position
77
77
+
now := Time.GetTicksMsec() / 1000.0
78
78
+
event_pos3D = transform_xform(Transform3D.AffineInverse(Transform3D.BasisOrigin{
79
79
+
Basis: node_quad.AsNode3D().GlobalTransform().Basis,
80
80
+
Origin: node_quad.AsNode3D().GlobalTransform().Origin,
81
81
+
}), event_pos3D)
82
82
+
83
83
+
event_pos2D := Vector2.Zero
84
84
+
85
85
+
if t.is_mouse_inside {
86
86
+
event_pos2D = Vector2.New(event_pos3D.X, -event_pos3D.Y)
87
87
+
event_pos2D.X = event_pos2D.X / quad_mesh_size.X
88
88
+
event_pos2D.Y = event_pos2D.Y / quad_mesh_size.Y
89
89
+
event_pos2D.X += 0.5
90
90
+
event_pos2D.Y += 0.5
91
91
+
event_pos2D.X *= float32(node_viewport.Size().X)
92
92
+
event_pos2D.Y *= float32(node_viewport.Size().Y)
93
93
+
} else if t.last_event_pos2D != nil {
94
94
+
event_pos2D = t.last_event_pos2D.(Vector2.XY)
95
95
+
}
96
96
+
97
97
+
mouse_event.SetPosition(event_pos2D)
98
98
+
mouse_event.SetGlobalPosition(event_pos2D)
99
99
+
100
100
+
if event_type_string == "InputEventMouseMotion" || event_type_string == "InputEventScreenDrag" {
101
101
+
if t.last_event_pos2D == nil {
102
102
+
other_event := InputEventMouseMotion.New()
103
103
+
other_event.SetObject(event.AsObject())
104
104
+
other_event.SetRelative(Vector2.Zero)
105
105
+
} else {
106
106
+
other_event := InputEventMouseMotion.New()
107
107
+
other_event.SetObject(event.AsObject())
108
108
+
other_event.SetRelative(Vector2.Sub(event_pos2D, t.last_event_pos2D.(Vector2.XY)))
109
109
+
other_event.SetVelocity(Vector2.DivX(other_event.Relative(), (float32(now) - t.last_event_time)))
110
110
+
}
111
111
+
}
112
112
+
113
113
+
t.last_event_pos2D = event_pos2D
114
114
+
t.last_event_time = float32(now)
115
115
+
node_viewport.AsViewport().PushInput(event)
13
116
}
14
117
15
118
func registerTerminal() {
+14
utils.go
···
1
1
+
package main
2
2
+
3
3
+
import (
4
4
+
"graphics.gd/variant/Transform3D"
5
5
+
"graphics.gd/variant/Vector3"
6
6
+
)
7
7
+
8
8
+
func transform_xform(t Transform3D.BasisOrigin, v Vector3.XYZ) Vector3.XYZ {
9
9
+
return Vector3.New(
10
10
+
Vector3.Dot(t.Basis.X, v)+t.Origin.X,
11
11
+
Vector3.Dot(t.Basis.Y, v)+t.Origin.Y,
12
12
+
Vector3.Dot(t.Basis.Z, v)+t.Origin.Z,
13
13
+
)
14
14
+
}