Skip to content
This repository was archived by the owner on May 30, 2024. It is now read-only.

Commit afe448f

Browse files
authored
Merge pull request #154 from virtual-puppet-project/refactor/runner-enhancements
Refactor/runner enhancements Former-commit-id: e6c2e01
2 parents 6f2708f + 6f58497 commit afe448f

File tree

13 files changed

+156
-146
lines changed

13 files changed

+156
-146
lines changed
Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,27 @@
1-
class_name TrackingBackendDummy
2-
extends TrackingBackendInterface
1+
extends TrackingBackendTrait
32

4-
## Non-functional TrackingBackendInterface loaded by default in the RunnerTrait
3+
## Non-functional TrackingBackendTrait
54
##
65
## @see: `RunnerTrait`
76

7+
var logger := Logger.new("TrackingBackendDummy")
8+
89
func get_name() -> String:
9-
AM.logger.error("get_name not yet implemented")
10+
logger.error("get_name not yet implemented")
1011
return ""
1112

1213
func start_receiver() -> void:
13-
AM.logger.error("start_receiver not yet implemented")
14+
logger.error("start_receiver not yet implemented")
1415

1516
func stop_receiver() -> void:
16-
AM.logger.error("stop_reciever not yet implemented")
17+
logger.error("stop_reciever not yet implemented")
18+
19+
func set_offsets() -> void:
20+
logger.error("set_offsets not yet implemented")
1721

18-
func set_offsets(_offsets: StoredOffsets) -> void:
19-
AM.logger.error("set_offsets not yet implemented")
22+
func has_data() -> bool:
23+
logger.error("has_data not yet implemented")
24+
return false
2025

21-
func apply(_model: PuppetTrait, _interpolation_data: InterpolationData, _extra: Dictionary) -> void:
22-
AM.logger.error("apply not yet implemented")
26+
func apply(_interpolation_data: InterpolationData, _model: PuppetTrait) -> void:
27+
logger.error("apply not yet implemented")

model/error.gd

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,7 @@ enum Code {
128128
RUNNER_NO_LOADERS_FOUND,
129129
RUNNER_FILE_NOT_FOUND,
130130
RUNNER_LOAD_FILE_FAILED,
131-
RUNNER_UNHANDLED_FILE_FORMAT
131+
RUNNER_UNHANDLED_FILE_FORMAT,
132132
RUNNER_NO_PREVIEW_IMAGE_FOUND,
133133

134134
#endregion

model/extensions/runner_trait.gd

Lines changed: 6 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,9 @@ var logger: Logger
77
# TODO this should be stored on the model
88
var current_model_path := ""
99

10-
## Array of TrackingBackendInterfaces
11-
var trackers := []
12-
var main_tracker: TrackingBackendInterface
10+
## @type: Dictionary<String, TrackingBackendTrait>
11+
var trackers := {}
12+
var main_tracker: TrackingBackendTrait
1313

1414
#-----------------------------------------------------------------------------#
1515
# Builtin functions #
@@ -72,8 +72,9 @@ func _teardown() -> void:
7272
_generate_preview()
7373

7474
main_tracker = null
75-
for tracker in trackers:
76-
if not tracker is TrackingBackendInterface:
75+
for tracker in trackers.values():
76+
if not tracker is TrackingBackendTrait:
77+
logger.error("Tracker %s does not inherit from TrackingBackendTrait" % str(tracker))
7778
continue
7879
tracker.stop_receiver()
7980
trackers.clear()
@@ -226,22 +227,6 @@ func _try_load_model(path: String) -> Result:
226227
func load_model(_path: String) -> Result:
227228
return Result.err(Error.Code.NOT_YET_IMPLEMENTED, "load_model")
228229

229-
## Uses the built-in gltf loader to load a `glb` model
230-
##
231-
## @param: path: String - The absolute path to a model
232-
##
233-
## @return: Result<Spatial> - The loaded model
234-
func load_glb(path: String) -> Result:
235-
logger.info("Using glb loader")
236-
237-
var gltf_loader := PackedSceneGLTF.new()
238-
239-
var model = gltf_loader.import_gltf_scene(path)
240-
if model == null:
241-
return Safely.err(Error.Code.RUNNER_LOAD_FILE_FAILED)
242-
243-
return Safely.ok(model)
244-
245230
## Uses the built-in scene loader to load a PackedScene
246231
##
247232
## @param: path: String - The absolute path to a PackedScene

model/extensions/tracking_backend_interface.gd

Lines changed: 0 additions & 22 deletions
This file was deleted.
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
class_name TrackingBackendTrait
2+
extends Reference
3+
4+
var stored_offsets := StoredOffsets.new()
5+
6+
## Interface for defining tracking backends
7+
8+
func get_name() -> String:
9+
printerr("get_name not yet implemented")
10+
return ""
11+
12+
## Start the receiver and thus start listening for data
13+
func start_receiver() -> void:
14+
printerr("start_receiver not yet implemented")
15+
16+
## Stop the receiver and thus stop listening for data
17+
func stop_receiver() -> void:
18+
printerr("stop_reciever not yet implemented")
19+
20+
## Sets the stored offsets based off of the current data
21+
func set_offsets() -> void:
22+
printerr("set_offsets not yet implemented")
23+
24+
## Determines if there is tracking data
25+
func has_data() -> bool:
26+
printerr("has_data not yet implemented")
27+
return false
28+
29+
## Called by the Runner to apply tracking data. The model is also passed to allow for
30+
## blend shapes to be directly applied, if applicable
31+
func apply(_interpolation_data: InterpolationData, _model: PuppetTrait) -> void:
32+
printerr("apply not yet implemented")

project.godot

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -194,15 +194,10 @@ _global_script_classes=[ {
194194
"language": "GDScript",
195195
"path": "res://utils/temp_cache_manager.gd"
196196
}, {
197-
"base": "TrackingBackendInterface",
198-
"class": "TrackingBackendDummy",
199-
"language": "GDScript",
200-
"path": "res://model/dummies/tracking_backend_dummy.gd"
201-
}, {
202197
"base": "Reference",
203-
"class": "TrackingBackendInterface",
198+
"class": "TrackingBackendTrait",
204199
"language": "GDScript",
205-
"path": "res://model/extensions/tracking_backend_interface.gd"
200+
"path": "res://model/extensions/tracking_backend_trait.gd"
206201
}, {
207202
"base": "AbstractManager",
208203
"class": "TranslationManager",
@@ -252,8 +247,7 @@ _global_script_class_icons={
252247
"StoredOffsets": "",
253248
"Sun": "",
254249
"TempCacheManager": "",
255-
"TrackingBackendDummy": "",
256-
"TrackingBackendInterface": "",
250+
"TrackingBackendTrait": "",
257251
"TranslationManager": "",
258252
"VRMTopLevel": ""
259253
}

resources/extensions/i_facial_mocap/gui.gd

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -108,32 +108,36 @@ func _toggle_tracking() -> Button:
108108

109109
func _on_toggle_tracking(button: Button) -> void:
110110
var trackers = get_tree().current_scene.get("trackers")
111-
if typeof(trackers) != TYPE_ARRAY:
111+
if typeof(trackers) != TYPE_DICTIONARY:
112112
logger.error(tr("I_FACIAL_MOCAP_INCOMPATIBLE_RUNNER_ERROR"))
113113
return
114114

115-
var tracker: TrackingBackendInterface
115+
var tracker: TrackingBackendTrait
116116
var found := false
117-
for i in trackers:
118-
if i.get_name() == "iFacialMocap" and i is TrackingBackendInterface:
117+
for i in trackers.values():
118+
if i is TrackingBackendTrait and i.get_name() == "iFacialMocap":
119119
tracker = i
120120
found = true
121121
break
122122

123123
if found:
124+
logger.debug("Stopping ifm tracker")
125+
124126
tracker.stop_receiver()
125-
trackers.erase(tracker)
127+
trackers.erase(tracker.get_name())
126128

127129
button.text = tr("I_FACIAL_MOCAP_TOGGLE_TRACKING_BUTTON_START")
128130
else:
131+
logger.debug("Starting ifm tracker")
132+
129133
var res: Result = Safely.wrap(AM.em.load_resource("iFacialMocap", "ifm.gd"))
130134
if res.is_err():
131135
logger.error(res)
132136
return
133137

134138
var ifm = res.unwrap().new()
135139

136-
trackers.append(ifm)
140+
trackers[ifm.get_name()] = ifm
137141

138142
button.text = tr("I_FACIAL_MOCAP_TOGGLE_TRACKING_BUTTON_STOP")
139143

resources/extensions/i_facial_mocap/ifm.gd

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
extends TrackingBackendInterface
1+
extends TrackingBackendTrait
22

33
## Reference: https://www.ifacialmocap.com/for-developer/
44
##
@@ -20,6 +20,8 @@ extends TrackingBackendInterface
2020
# TODO Check if these can be ints or not
2121
## Data from an ifm packet. Variables are defined and named in the order they are encounted in the packet
2222
class IFacialMocapData:
23+
var has_data := false
24+
2325
var blend_shapes := {}
2426

2527
var head_rotation := Vector3.ZERO
@@ -105,8 +107,15 @@ func _receive() -> void:
105107
server.poll()
106108
if connection != null:
107109
var packet := connection.get_packet()
110+
if connection.get_packet_error() != OK:
111+
logger.error("Last packet had an error: %d" % connection.get_packet_error())
112+
connection.close()
113+
connection = null
114+
return
108115
if packet.size() < 1:
109116
return
117+
118+
ifm_data.has_data = true
110119

111120
var split := packet.get_string_from_utf8().split("|")
112121
for pair in split:
@@ -193,13 +202,16 @@ func stop_receiver() -> void:
193202
server.stop()
194203
server = null
195204

196-
func set_offsets(offsets: StoredOffsets) -> void:
197-
offsets.translation_offset = ifm_data.head_position
198-
offsets.rotation_offset = ifm_data.head_rotation
199-
offsets.left_eye_gaze_offset = ifm_data.left_eye_rotation
200-
offsets.right_eye_gaze_offset = ifm_data.right_eye_rotation
205+
func set_offsets() -> void:
206+
stored_offsets.translation_offset = ifm_data.head_position
207+
stored_offsets.rotation_offset = ifm_data.head_rotation
208+
stored_offsets.left_eye_gaze_offset = ifm_data.left_eye_rotation
209+
stored_offsets.right_eye_gaze_offset = ifm_data.right_eye_rotation
210+
211+
func has_data() -> bool:
212+
return ifm_data.has_data
201213

202-
func apply(_model: PuppetTrait, interpolation_data: InterpolationData, _extra: Dictionary) -> void:
214+
func apply(interpolation_data: InterpolationData, _model: PuppetTrait) -> void:
203215
interpolation_data.bone_translation.target_value = ifm_data.head_position
204216
interpolation_data.bone_rotation.target_value = ifm_data.head_rotation
205217

resources/extensions/open_see_face/data/tracking_gui_descriptor.gd

Lines changed: 19 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,13 @@ const ConfigKeys := {
1111
"MODEL": "open_see_face_model"
1212
}
1313

14+
var logger := Logger.new("OpenSeeFaceGUI")
15+
1416
func _init() -> void:
1517
for val in ConfigKeys.values():
1618
var res: Result = Safely.wrap(AM.cm.runtime_subscribe_to_signal(val))
1719
if res.is_err() and res.unwrap_err().code != Error.Code.PUB_SUB_ALREADY_CONNECTED:
18-
AM.logger.error(res)
20+
logger.error(res)
1921
return
2022

2123
_hv_fill_expand(self)
@@ -155,7 +157,7 @@ func _on_camera_selected(idx: int, ob: OptionButton) -> void:
155157

156158
var current_index: int = popup.get_current_index()
157159
if current_index < 0:
158-
AM.logger.error(tr("CAMERA_SELECTED_NO_PREVIOUSLY_SELECTED_ITEM"))
160+
logger.error(tr("CAMERA_SELECTED_NO_PREVIOUSLY_SELECTED_ITEM"))
159161
else:
160162
popup.set_item_checked(current_index, false)
161163

@@ -271,14 +273,14 @@ func _toggle_tracking() -> Button:
271273

272274
func _on_toggle_tracking(button: Button) -> void:
273275
var trackers = get_tree().current_scene.get("trackers")
274-
if typeof(trackers) != TYPE_ARRAY:
275-
AM.logger.error(tr("TOGGLE_TRACKING_INCOMPATIBLE_RUNNER_ERROR"))
276+
if typeof(trackers) != TYPE_DICTIONARY:
277+
logger.error(tr("TOGGLE_TRACKING_INCOMPATIBLE_RUNNER_ERROR"))
276278
return
277279

278-
var tracker: TrackingBackendInterface
280+
var tracker: TrackingBackendTrait
279281
var found := false
280-
for i in trackers:
281-
if i.get_name() == "OpenSeeFace" and i is TrackingBackendInterface:
282+
for i in trackers.values():
283+
if i is TrackingBackendTrait and i.get_name() == "OpenSeeFace":
282284
tracker = i
283285
found = true
284286
break
@@ -287,19 +289,23 @@ func _on_toggle_tracking(button: Button) -> void:
287289
# is being turned off. Thus if the button were to be pressed again, it would be for
288290
# starting the tracker
289291
if found:
292+
logger.debug("Stopping osf tracker")
293+
290294
tracker.stop_receiver()
291-
trackers.erase(tracker)
295+
trackers.erase(tracker.get_name())
292296

293297
button.text = tr("TOGGLE_TRACKING_BUTTON_TEXT_START")
294298
else:
299+
logger.debug("Starting osf tracker")
300+
295301
var osf_res: Result = AM.em.load_resource("OpenSeeFace", "open_see_face.gd")
296302
if not osf_res or osf_res.is_err():
297-
AM.logger.error(tr("TOGGLE_TRACKING_LOAD_TRACKER_ERROR"))
303+
logger.error(tr("TOGGLE_TRACKING_LOAD_TRACKER_ERROR"))
298304
return
299305

300306
var osf = osf_res.unwrap().new()
301307

302-
trackers.append(osf)
308+
trackers[osf.get_name()] = osf
303309

304310
button.text = tr("TOGGLE_TRACKING_BUTTON_TEXT_STOP")
305311

@@ -372,19 +378,19 @@ func _on_model_selected(idx: int, ob: OptionButton) -> void:
372378

373379
var current_index: int = popup.get_current_index()
374380
if current_index < 0:
375-
AM.logger.error(tr("ML_MODEL_SELECT_NO_PREVIOUS_MODEL_SELECTED_ERROR"))
381+
logger.error(tr("ML_MODEL_SELECT_NO_PREVIOUS_MODEL_SELECTED_ERROR"))
376382
else:
377383
popup.set_item_checked(current_index, false)
378384

379385
popup.set_item_checked(idx, not popup.is_item_checked(idx))
380386

381387
var split: PoolStringArray = popup.get_item_text(idx).split(":")
382388
if split.size() < 2:
383-
AM.logger.error(tr("ML_MODEL_SELECT_INVALID_MODEL_SELECTED") % str(split))
389+
logger.error(tr("ML_MODEL_SELECT_INVALID_MODEL_SELECTED") % str(split))
384390
return
385391

386392
if not split[0].is_valid_integer():
387-
AM.logger.error(tr("ML_MODEL_SELECT_NO_PRECEDING_INTEGER"))
393+
logger.error(tr("ML_MODEL_SELECT_NO_PRECEDING_INTEGER"))
388394
return
389395

390396
AM.ps.publish(ConfigKeys.MODEL, split[0].to_int())

0 commit comments

Comments
 (0)