-
Notifications
You must be signed in to change notification settings - Fork 3
Expand file tree
/
Copy pathmouse_tracker.gd
More file actions
96 lines (71 loc) · 2.9 KB
/
mouse_tracker.gd
File metadata and controls
96 lines (71 loc) · 2.9 KB
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
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
extends TrackingBackendTrait
const ConfigKeys := {
"DAMPING": "mouse_tracker_damping",
"SCREEN": "mouse_tracker_screen"
}
var logger := Logger.new(get_name())
var tracker: Reference
var apply_func: FuncRef
var config_screen: int = -1
var config_screen_scale: float = 16.0
var screen_size := Vector2.ZERO
var screen_midpoint := Vector2.ZERO
var mouse_pos := Vector2.ZERO
#-----------------------------------------------------------------------------#
# Builtin functions #
#-----------------------------------------------------------------------------#
func _init() -> void:
for val in ConfigKeys.values():
var res: Result = Safely.wrap(AM.ps.subscribe(self, val, "_on_event_published"))
if res.is_err():
logger.error(res)
return
config_screen = AM.cm.get_data(ConfigKeys.SCREEN, -1)
config_screen_scale = AM.cm.get_data(ConfigKeys.DAMPING, 16.0)
_set_screen_values()
start_receiver()
#-----------------------------------------------------------------------------#
# Connections #
#-----------------------------------------------------------------------------#
func _on_event_published(payload: SignalPayload) -> void:
match payload.signal_name:
ConfigKeys.DAMPING:
config_screen_scale = payload.data
ConfigKeys.SCREEN:
config_screen = payload.data
_set_screen_values()
#-----------------------------------------------------------------------------#
# Private functions #
#-----------------------------------------------------------------------------#
func _set_screen_values() -> void:
screen_size = OS.get_screen_size(config_screen)
screen_midpoint = screen_size / 2
#-----------------------------------------------------------------------------#
# Public functions #
#-----------------------------------------------------------------------------#
func get_name() -> String:
return tr("MOUSE_TRACKER_TRACKER_NAME")
func start_receiver() -> void:
var res: Result = Safely.wrap(AM.em.load_gdnative_resource(
"MouseTracker", "MouseTrackerLib", "MousePoller"))
if res.is_err():
logger.error(res)
return
tracker = res.unwrap()
func stop_receiver() -> void:
tracker = null
func set_offsets() -> void:
stored_offsets.translation_offset = Vector3(mouse_pos.x, mouse_pos.y, 0.0)
stored_offsets.rotation_offset = Vector3(mouse_pos.x, mouse_pos.y, 0.0)
func has_data() -> bool:
return tracker != null
func apply(data: InterpolationData, _model: PuppetTrait) -> void:
if tracker == null:
logger.error("%s failed to load, please report this as a bug" % get_name())
return
mouse_pos = (tracker.get_position() - screen_midpoint) / config_screen_scale
data.bone_rotation.target_value = stored_offsets.rotation_offset - Vector3(
mouse_pos.y,
mouse_pos.x,
0.0
)