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

Commit

Permalink
Merge pull request #154 from virtual-puppet-project/refactor/runner-e…
Browse files Browse the repository at this point in the history
…nhancements

Refactor/runner enhancements

Former-commit-id: e6c2e01
  • Loading branch information
you-win committed Sep 1, 2022
2 parents 6f2708f + 6f58497 commit afe448f
Show file tree
Hide file tree
Showing 13 changed files with 156 additions and 146 deletions.
25 changes: 15 additions & 10 deletions model/dummies/tracking_backend_dummy.gd
Original file line number Diff line number Diff line change
@@ -1,22 +1,27 @@
class_name TrackingBackendDummy
extends TrackingBackendInterface
extends TrackingBackendTrait

## Non-functional TrackingBackendInterface loaded by default in the RunnerTrait
## Non-functional TrackingBackendTrait
##
## @see: `RunnerTrait`

var logger := Logger.new("TrackingBackendDummy")

func get_name() -> String:
AM.logger.error("get_name not yet implemented")
logger.error("get_name not yet implemented")
return ""

func start_receiver() -> void:
AM.logger.error("start_receiver not yet implemented")
logger.error("start_receiver not yet implemented")

func stop_receiver() -> void:
AM.logger.error("stop_reciever not yet implemented")
logger.error("stop_reciever not yet implemented")

func set_offsets() -> void:
logger.error("set_offsets not yet implemented")

func set_offsets(_offsets: StoredOffsets) -> void:
AM.logger.error("set_offsets not yet implemented")
func has_data() -> bool:
logger.error("has_data not yet implemented")
return false

func apply(_model: PuppetTrait, _interpolation_data: InterpolationData, _extra: Dictionary) -> void:
AM.logger.error("apply not yet implemented")
func apply(_interpolation_data: InterpolationData, _model: PuppetTrait) -> void:
logger.error("apply not yet implemented")
2 changes: 1 addition & 1 deletion model/error.gd
Original file line number Diff line number Diff line change
Expand Up @@ -128,7 +128,7 @@ enum Code {
RUNNER_NO_LOADERS_FOUND,
RUNNER_FILE_NOT_FOUND,
RUNNER_LOAD_FILE_FAILED,
RUNNER_UNHANDLED_FILE_FORMAT
RUNNER_UNHANDLED_FILE_FORMAT,
RUNNER_NO_PREVIEW_IMAGE_FOUND,

#endregion
Expand Down
27 changes: 6 additions & 21 deletions model/extensions/runner_trait.gd
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,9 @@ var logger: Logger
# TODO this should be stored on the model
var current_model_path := ""

## Array of TrackingBackendInterfaces
var trackers := []
var main_tracker: TrackingBackendInterface
## @type: Dictionary<String, TrackingBackendTrait>
var trackers := {}
var main_tracker: TrackingBackendTrait

#-----------------------------------------------------------------------------#
# Builtin functions #
Expand Down Expand Up @@ -72,8 +72,9 @@ func _teardown() -> void:
_generate_preview()

main_tracker = null
for tracker in trackers:
if not tracker is TrackingBackendInterface:
for tracker in trackers.values():
if not tracker is TrackingBackendTrait:
logger.error("Tracker %s does not inherit from TrackingBackendTrait" % str(tracker))
continue
tracker.stop_receiver()
trackers.clear()
Expand Down Expand Up @@ -226,22 +227,6 @@ func _try_load_model(path: String) -> Result:
func load_model(_path: String) -> Result:
return Result.err(Error.Code.NOT_YET_IMPLEMENTED, "load_model")

## Uses the built-in gltf loader to load a `glb` model
##
## @param: path: String - The absolute path to a model
##
## @return: Result<Spatial> - The loaded model
func load_glb(path: String) -> Result:
logger.info("Using glb loader")

var gltf_loader := PackedSceneGLTF.new()

var model = gltf_loader.import_gltf_scene(path)
if model == null:
return Safely.err(Error.Code.RUNNER_LOAD_FILE_FAILED)

return Safely.ok(model)

## Uses the built-in scene loader to load a PackedScene
##
## @param: path: String - The absolute path to a PackedScene
Expand Down
22 changes: 0 additions & 22 deletions model/extensions/tracking_backend_interface.gd

This file was deleted.

32 changes: 32 additions & 0 deletions model/extensions/tracking_backend_trait.gd
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
class_name TrackingBackendTrait
extends Reference

var stored_offsets := StoredOffsets.new()

## Interface for defining tracking backends

func get_name() -> String:
printerr("get_name not yet implemented")
return ""

## Start the receiver and thus start listening for data
func start_receiver() -> void:
printerr("start_receiver not yet implemented")

## Stop the receiver and thus stop listening for data
func stop_receiver() -> void:
printerr("stop_reciever not yet implemented")

## Sets the stored offsets based off of the current data
func set_offsets() -> void:
printerr("set_offsets not yet implemented")

## Determines if there is tracking data
func has_data() -> bool:
printerr("has_data not yet implemented")
return false

## Called by the Runner to apply tracking data. The model is also passed to allow for
## blend shapes to be directly applied, if applicable
func apply(_interpolation_data: InterpolationData, _model: PuppetTrait) -> void:
printerr("apply not yet implemented")
12 changes: 3 additions & 9 deletions project.godot
Original file line number Diff line number Diff line change
Expand Up @@ -194,15 +194,10 @@ _global_script_classes=[ {
"language": "GDScript",
"path": "res://utils/temp_cache_manager.gd"
}, {
"base": "TrackingBackendInterface",
"class": "TrackingBackendDummy",
"language": "GDScript",
"path": "res://model/dummies/tracking_backend_dummy.gd"
}, {
"base": "Reference",
"class": "TrackingBackendInterface",
"class": "TrackingBackendTrait",
"language": "GDScript",
"path": "res://model/extensions/tracking_backend_interface.gd"
"path": "res://model/extensions/tracking_backend_trait.gd"
}, {
"base": "AbstractManager",
"class": "TranslationManager",
Expand Down Expand Up @@ -252,8 +247,7 @@ _global_script_class_icons={
"StoredOffsets": "",
"Sun": "",
"TempCacheManager": "",
"TrackingBackendDummy": "",
"TrackingBackendInterface": "",
"TrackingBackendTrait": "",
"TranslationManager": "",
"VRMTopLevel": ""
}
Expand Down
16 changes: 10 additions & 6 deletions resources/extensions/i_facial_mocap/gui.gd
Original file line number Diff line number Diff line change
Expand Up @@ -108,32 +108,36 @@ func _toggle_tracking() -> Button:

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

var tracker: TrackingBackendInterface
var tracker: TrackingBackendTrait
var found := false
for i in trackers:
if i.get_name() == "iFacialMocap" and i is TrackingBackendInterface:
for i in trackers.values():
if i is TrackingBackendTrait and i.get_name() == "iFacialMocap":
tracker = i
found = true
break

if found:
logger.debug("Stopping ifm tracker")

tracker.stop_receiver()
trackers.erase(tracker)
trackers.erase(tracker.get_name())

button.text = tr("I_FACIAL_MOCAP_TOGGLE_TRACKING_BUTTON_START")
else:
logger.debug("Starting ifm tracker")

var res: Result = Safely.wrap(AM.em.load_resource("iFacialMocap", "ifm.gd"))
if res.is_err():
logger.error(res)
return

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

trackers.append(ifm)
trackers[ifm.get_name()] = ifm

button.text = tr("I_FACIAL_MOCAP_TOGGLE_TRACKING_BUTTON_STOP")

Expand Down
26 changes: 19 additions & 7 deletions resources/extensions/i_facial_mocap/ifm.gd
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
extends TrackingBackendInterface
extends TrackingBackendTrait

## Reference: https://www.ifacialmocap.com/for-developer/
##
Expand All @@ -20,6 +20,8 @@ extends TrackingBackendInterface
# TODO Check if these can be ints or not
## Data from an ifm packet. Variables are defined and named in the order they are encounted in the packet
class IFacialMocapData:
var has_data := false

var blend_shapes := {}

var head_rotation := Vector3.ZERO
Expand Down Expand Up @@ -105,8 +107,15 @@ func _receive() -> void:
server.poll()
if connection != null:
var packet := connection.get_packet()
if connection.get_packet_error() != OK:
logger.error("Last packet had an error: %d" % connection.get_packet_error())
connection.close()
connection = null
return
if packet.size() < 1:
return

ifm_data.has_data = true

var split := packet.get_string_from_utf8().split("|")
for pair in split:
Expand Down Expand Up @@ -193,13 +202,16 @@ func stop_receiver() -> void:
server.stop()
server = null

func set_offsets(offsets: StoredOffsets) -> void:
offsets.translation_offset = ifm_data.head_position
offsets.rotation_offset = ifm_data.head_rotation
offsets.left_eye_gaze_offset = ifm_data.left_eye_rotation
offsets.right_eye_gaze_offset = ifm_data.right_eye_rotation
func set_offsets() -> void:
stored_offsets.translation_offset = ifm_data.head_position
stored_offsets.rotation_offset = ifm_data.head_rotation
stored_offsets.left_eye_gaze_offset = ifm_data.left_eye_rotation
stored_offsets.right_eye_gaze_offset = ifm_data.right_eye_rotation

func has_data() -> bool:
return ifm_data.has_data

func apply(_model: PuppetTrait, interpolation_data: InterpolationData, _extra: Dictionary) -> void:
func apply(interpolation_data: InterpolationData, _model: PuppetTrait) -> void:
interpolation_data.bone_translation.target_value = ifm_data.head_position
interpolation_data.bone_rotation.target_value = ifm_data.head_rotation

Expand Down
32 changes: 19 additions & 13 deletions resources/extensions/open_see_face/data/tracking_gui_descriptor.gd
Original file line number Diff line number Diff line change
Expand Up @@ -11,11 +11,13 @@ const ConfigKeys := {
"MODEL": "open_see_face_model"
}

var logger := Logger.new("OpenSeeFaceGUI")

func _init() -> void:
for val in ConfigKeys.values():
var res: Result = Safely.wrap(AM.cm.runtime_subscribe_to_signal(val))
if res.is_err() and res.unwrap_err().code != Error.Code.PUB_SUB_ALREADY_CONNECTED:
AM.logger.error(res)
logger.error(res)
return

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

var current_index: int = popup.get_current_index()
if current_index < 0:
AM.logger.error(tr("CAMERA_SELECTED_NO_PREVIOUSLY_SELECTED_ITEM"))
logger.error(tr("CAMERA_SELECTED_NO_PREVIOUSLY_SELECTED_ITEM"))
else:
popup.set_item_checked(current_index, false)

Expand Down Expand Up @@ -271,14 +273,14 @@ func _toggle_tracking() -> Button:

func _on_toggle_tracking(button: Button) -> void:
var trackers = get_tree().current_scene.get("trackers")
if typeof(trackers) != TYPE_ARRAY:
AM.logger.error(tr("TOGGLE_TRACKING_INCOMPATIBLE_RUNNER_ERROR"))
if typeof(trackers) != TYPE_DICTIONARY:
logger.error(tr("TOGGLE_TRACKING_INCOMPATIBLE_RUNNER_ERROR"))
return

var tracker: TrackingBackendInterface
var tracker: TrackingBackendTrait
var found := false
for i in trackers:
if i.get_name() == "OpenSeeFace" and i is TrackingBackendInterface:
for i in trackers.values():
if i is TrackingBackendTrait and i.get_name() == "OpenSeeFace":
tracker = i
found = true
break
Expand All @@ -287,19 +289,23 @@ func _on_toggle_tracking(button: Button) -> void:
# is being turned off. Thus if the button were to be pressed again, it would be for
# starting the tracker
if found:
logger.debug("Stopping osf tracker")

tracker.stop_receiver()
trackers.erase(tracker)
trackers.erase(tracker.get_name())

button.text = tr("TOGGLE_TRACKING_BUTTON_TEXT_START")
else:
logger.debug("Starting osf tracker")

var osf_res: Result = AM.em.load_resource("OpenSeeFace", "open_see_face.gd")
if not osf_res or osf_res.is_err():
AM.logger.error(tr("TOGGLE_TRACKING_LOAD_TRACKER_ERROR"))
logger.error(tr("TOGGLE_TRACKING_LOAD_TRACKER_ERROR"))
return

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

trackers.append(osf)
trackers[osf.get_name()] = osf

button.text = tr("TOGGLE_TRACKING_BUTTON_TEXT_STOP")

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

var current_index: int = popup.get_current_index()
if current_index < 0:
AM.logger.error(tr("ML_MODEL_SELECT_NO_PREVIOUS_MODEL_SELECTED_ERROR"))
logger.error(tr("ML_MODEL_SELECT_NO_PREVIOUS_MODEL_SELECTED_ERROR"))
else:
popup.set_item_checked(current_index, false)

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

var split: PoolStringArray = popup.get_item_text(idx).split(":")
if split.size() < 2:
AM.logger.error(tr("ML_MODEL_SELECT_INVALID_MODEL_SELECTED") % str(split))
logger.error(tr("ML_MODEL_SELECT_INVALID_MODEL_SELECTED") % str(split))
return

if not split[0].is_valid_integer():
AM.logger.error(tr("ML_MODEL_SELECT_NO_PRECEDING_INTEGER"))
logger.error(tr("ML_MODEL_SELECT_NO_PRECEDING_INTEGER"))
return

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

0 comments on commit afe448f

Please sign in to comment.