From 2703d7330f7e06ffe1cdc7912dc55d7a15d0493f Mon Sep 17 00:00:00 2001 From: patrickdown Date: Wed, 27 Sep 2023 21:07:04 -0400 Subject: [PATCH] Pushing towards a more useable prerelease version Added plugin stuff like plugin.cfg/.gd plugin.gd now takes care of the autoload Moved low level event handling to T5Interface. T5Manager becomes a class whose main purpose is to create XR glasses rig in the scene. This hopefully allow the advanced user to more easily create their own manager classes. Add T5Gameboard to visualize the T5 gameboard in the scene. The T5Gameboard can also be registered with the T5Manager to be a start location for the T5Origin in the scene. Added some node icons. --- README.md | 28 +- example/T5Glasses.tscn | 1 - example/XROrigin3D.gd | 5 +- example/addons/tiltfive/T5Interface.gd | 147 +++- example/addons/tiltfive/T5Manager.gd | 193 +--- example/addons/tiltfive/T5ManagerBase.gd | 73 ++ example/addons/tiltfive/T5ProjectSettings.gd | 48 + .../addons/tiltfive/T5_Icon_RGB.svg.import | 37 + example/addons/tiltfive/assets/T5_border.glb | Bin 0 -> 15264 bytes .../tiltfive/assets/T5_border.glb.import | 39 + .../addons/tiltfive/assets/T5_border_XE.glb | Bin 0 -> 25796 bytes .../tiltfive/assets/T5_border_XE.glb.import | 39 + .../tiltfive/assets/T5_border_XE_raised.glb | Bin 0 -> 31804 bytes .../assets/T5_border_XE_raised.glb.import | 39 + example/addons/tiltfive/assets/board.svg | 50 ++ .../addons/tiltfive/assets/board.svg.import | 37 + example/addons/tiltfive/assets/glasses.svg | 69 ++ .../addons/tiltfive/assets/glasses.svg.import | 37 + .../assets/materials/T5BorderMat.tres | 6 + .../assets/materials/T5_border_tex.png | Bin 0 -> 2140 bytes .../assets/materials/T5_border_tex.png.import | 36 + example/addons/tiltfive/plugin.cfg | 7 + example/addons/tiltfive/plugin.gd | 23 + .../addons/tiltfive/scenes/T5GlassesBase.gd | 2 +- .../addons/tiltfive/scenes/T5GlassesBase.tscn | 4 +- example/addons/tiltfive/tiltfive.gdextension | 3 + example/main.gd | 5 + example/main.tscn | 14 +- example/openxr_action_map.tres | 826 ------------------ example/project.godot | 4 + extension/src/GodotT5Service.cpp | 30 +- extension/src/T5Gameboard.cpp | 188 ++++ extension/src/T5Gameboard.h | 64 ++ extension/src/register_types.cpp | 3 + 34 files changed, 1009 insertions(+), 1048 deletions(-) create mode 100644 example/addons/tiltfive/T5ManagerBase.gd create mode 100644 example/addons/tiltfive/T5ProjectSettings.gd create mode 100644 example/addons/tiltfive/T5_Icon_RGB.svg.import create mode 100644 example/addons/tiltfive/assets/T5_border.glb create mode 100644 example/addons/tiltfive/assets/T5_border.glb.import create mode 100644 example/addons/tiltfive/assets/T5_border_XE.glb create mode 100644 example/addons/tiltfive/assets/T5_border_XE.glb.import create mode 100644 example/addons/tiltfive/assets/T5_border_XE_raised.glb create mode 100644 example/addons/tiltfive/assets/T5_border_XE_raised.glb.import create mode 100644 example/addons/tiltfive/assets/board.svg create mode 100644 example/addons/tiltfive/assets/board.svg.import create mode 100644 example/addons/tiltfive/assets/glasses.svg create mode 100644 example/addons/tiltfive/assets/glasses.svg.import create mode 100644 example/addons/tiltfive/assets/materials/T5BorderMat.tres create mode 100644 example/addons/tiltfive/assets/materials/T5_border_tex.png create mode 100644 example/addons/tiltfive/assets/materials/T5_border_tex.png.import create mode 100644 example/addons/tiltfive/plugin.cfg create mode 100644 example/addons/tiltfive/plugin.gd delete mode 100644 example/openxr_action_map.tres create mode 100644 extension/src/T5Gameboard.cpp create mode 100644 extension/src/T5Gameboard.h diff --git a/README.md b/README.md index 5ad28bf..d2043a8 100644 --- a/README.md +++ b/README.md @@ -27,34 +27,24 @@ Scons should be run from an environment that has the Microsoft x64 development t > `scons example target=[template_debug | template_release]` Copy build products to the `example\addons\tilt-five\bin` -## Basic usage - -- Open the project in the examples directory -- Run the default scene - ## Starting with a new project To use this plugin in your own project: -- Copy the add on into your project +- Copy the `addons/tiltfive` folder into your project - Open Project->Project Settings - - On the Autoload tab add `res://addons/tiltfive/T5Interface.gd` -- Create a main scene and add a T5Manager node + - Click on the Plugins tab + - Make sure the Tilt Five plugin is enabled + - You may need to restart Godot +- In the main scene add a T5Manager node +- In the main scene add a T5Gameboard node +- On the T5Manager node set the start location to the T5Gameboard node +- Add lights and other items to your scene -See example project for futher details. +Running should now show your scene on the Tilt Five system ## Dependencies - Uses the godot-cpp headers - Uses the Tilt Five NDK -## TODO - -- API for tangible camera on the glasses -- Better docs -- Examples - - -## Acknowledgments -This was written by referring a lot to [GodotVR](https://github.com/GodotVR) code and reading -[Godot's](https://github.com/godotengine/godot) source code. diff --git a/example/T5Glasses.tscn b/example/T5Glasses.tscn index b81a343..6c219b9 100644 --- a/example/T5Glasses.tscn +++ b/example/T5Glasses.tscn @@ -34,7 +34,6 @@ albedo_color = Color(0.862745, 0, 0.0235294, 1) [node name="T5Glasses" instance=ExtResource("1_uq4nw")] [node name="Origin" parent="." index="0"] -gameboard_scale = 16.0 script = ExtResource("1_qprko") [node name="T5-glasses" parent="Origin/Camera" index="0" instance=ExtResource("3_xuir6")] diff --git a/example/XROrigin3D.gd b/example/XROrigin3D.gd index bce8903..8df7e5b 100644 --- a/example/XROrigin3D.gd +++ b/example/XROrigin3D.gd @@ -2,10 +2,7 @@ extends T5Origin3D var elapsed = 0.0 -func _init(): - print(gameboard_scale) - func _process(delta): elapsed += delta - position.x = sin(elapsed) * 1 + position.y = sin(elapsed) * 1 diff --git a/example/addons/tiltfive/T5Interface.gd b/example/addons/tiltfive/T5Interface.gd index cb1b539..4899246 100644 --- a/example/addons/tiltfive/T5Interface.gd +++ b/example/addons/tiltfive/T5Interface.gd @@ -1,4 +1,3 @@ -@tool extends Node ## This script should be configured as an autoload script. @@ -12,50 +11,140 @@ extends Node ## in editor. This will allow the Godot editor to request ## action information from the interface. -var tilt_five_xr_interface: TiltFiveXRInterface +const T5ManagerBase = preload("res://addons/tiltfive/T5ManagerBase.gd") -func get_tilt_five_xr_interface() -> TiltFiveXRInterface: - return tilt_five_xr_interface +enum GameboardType { + LE = TiltFiveXRInterface.LE_GAMEBOARD, + XE = TiltFiveXRInterface.XE_GAMEBOARD, + XE_Raised = TiltFiveXRInterface.XE_RAISED_GAMEBOARD, + Unknown = TiltFiveXRInterface.NO_GAMEBOARD_SET +} -func _define_project_setting( - p_name : String, - p_type : int, - p_hint : int = PROPERTY_HINT_NONE, - p_hint_string : String = "", - p_default_val = "") -> void: - # p_default_val can be any type!! +# State of a set of glasses. +class GlassesState: + var available := false + var attempting_to_reserve := false + var reserved := false + var glasses_scene : Node + var gameboard_type := GameboardType.Unknown + func can_attempt_to_reserve(): + return available and (not attempting_to_reserve) and (not reserved) + +# Dictionary maps glasses_id -> GlassesState +var glasses_dict: Dictionary - if !ProjectSettings.has_setting(p_name): - ProjectSettings.set_setting(p_name, p_default_val) +var tilt_five_xr_interface: TiltFiveXRInterface - var property_info : Dictionary = { - "name" : p_name, - "type" : p_type, - "hint" : p_hint, - "hint_string" : p_hint_string - } +var t5_manager : T5ManagerBase: + set(value): + t5_manager = value - ProjectSettings.add_property_info(property_info) - ProjectSettings.set_as_basic(p_name, true) - ProjectSettings.set_initial_value(p_name, p_default_val) +func get_tilt_five_xr_interface() -> TiltFiveXRInterface: + return tilt_five_xr_interface + +func get_setting_or_default(name : String, default): + var val = ProjectSettings.get_setting_with_override(name) + if not val: + val = default + return val # Called when the manager is loaded and added to our scene func _enter_tree(): - _define_project_setting("xr/tilt_five/application_id", TYPE_STRING, PROPERTY_HINT_NONE, "", "my.game.com") - _define_project_setting("xr/tilt_five/application_version", TYPE_STRING, PROPERTY_HINT_NONE, "", "0.1.0") - _define_project_setting("xr/tilt_five/default_display_name", TYPE_STRING, PROPERTY_HINT_NONE, "", "Game: Player One") - tilt_five_xr_interface = TiltFiveXRInterface.new(); if tilt_five_xr_interface: - tilt_five_xr_interface.application_id = ProjectSettings.get_setting_with_override("xr/tilt_five/application_id") - tilt_five_xr_interface.application_version = ProjectSettings.get_setting_with_override("xr/tilt_five/application_version") + tilt_five_xr_interface.application_id = T5ProjectSettings.application_id + tilt_five_xr_interface.application_version = T5ProjectSettings.application_version XRServer.add_interface(tilt_five_xr_interface) + tilt_five_xr_interface.glasses_event.connect(_on_glasses_event) func _exit_tree(): if tilt_five_xr_interface: + tilt_five_xr_interface.glasses_event.disconnect(_on_glasses_event) if tilt_five_xr_interface.is_initialized(): tilt_five_xr_interface.uninitialize() - + XRServer.remove_interface(tilt_five_xr_interface) tilt_five_xr_interface = null + +func _ready(): + if not t5_manager: + push_error("T5Manager is not set in T5Interface") + return + if !tilt_five_xr_interface.is_initialized(): + tilt_five_xr_interface.initialize() + +func _start_display(glasses_id : StringName, glasses_scene : Node): + var viewport := t5_manager.get_glasses_scene_viewport(glasses_scene) + var xr_origin := t5_manager.get_glasses_scene_origin(glasses_scene) + tilt_five_xr_interface.start_display(glasses_id, viewport, xr_origin) + var t5_camera := t5_manager.get_glasses_scene_camera(glasses_scene) + if t5_camera: + t5_camera.tracker = "/user/%s/head" % glasses_id + for idx in range(4): + var controller = t5_manager.get_glasses_scene_wand(glasses_scene, idx) + if not controller: break + controller.tracker = "/user/%s/wand_%d" % [glasses_id, idx + 1] + +func _process_glasses(): + for glasses_id in glasses_dict: + var glasses_state = glasses_dict.get(glasses_id) as GlassesState + if glasses_state.can_attempt_to_reserve() and t5_manager.should_use_glasses(glasses_id): + glasses_state.attempting_to_reserve = true + tilt_five_xr_interface.reserve_glasses(glasses_id, t5_manager.get_glasses_display_name(glasses_id)) + +func _on_glasses_event(glasses_id, event_num): + var glasses_state = glasses_dict.get(glasses_id) as GlassesState + if not glasses_state: + glasses_state = GlassesState.new() + glasses_dict[glasses_id] = glasses_state + match event_num: + TiltFiveXRInterface.E_AVAILABLE: + print_verbose(glasses_id, " E_AVAILABLE") + glasses_state.available = true + _process_glasses() + + TiltFiveXRInterface.E_UNAVAILABLE: + print_verbose(glasses_id, " E_UNAVAILABLE") + glasses_state.available = false + if glasses_state.attempting_to_reserve: + glasses_state.attempting_to_reserve = false + _process_glasses() + + TiltFiveXRInterface.E_RESERVED: + print_verbose(glasses_id, " E_RESERVED") + glasses_state.reserved = true + glasses_state.attempting_to_reserve = false + + var glasses_scene = t5_manager.create_glasses_scene(glasses_id) + + # instance our scene + if glasses_scene: + glasses_state.glasses_scene = glasses_scene + _start_display(glasses_id, glasses_scene) + else: + tilt_five_xr_interface.release_glasses(glasses_id) + + TiltFiveXRInterface.E_DROPPED: + print_verbose(glasses_id, " E_DROPPED") + glasses_state.reserved = false + + var glasses_scene = glasses_state.glasses_scene + if glasses_scene: + tilt_five_xr_interface.stop_display(glasses_id) + glasses_state.glasses_scene = null + t5_manager.release_glasses_scene(glasses_scene) + + TiltFiveXRInterface.E_TRACKING: + var gbt = tilt_five_xr_interface.get_gameboard_type(glasses_id) + if glasses_state.gameboard_type != gbt: + glasses_state.gameboard_type = gbt + if glasses_state.glasses_scene: + t5_manager.set_glasses_scene_gameboard_type(glasses_state.glasses_scene, glasses_state.gameboard_type) + print_verbose(glasses_id, " E_TRACKING, Gameboard size = ", tilt_five_xr_interface.get_gameboard_extents(gbt)) + + TiltFiveXRInterface.E_NOT_TRACKING: + print_verbose(glasses_id, " E_NOT_TRACKING") + + _: + print_verbose(glasses_id, " - unknown event: ", event_num) diff --git a/example/addons/tiltfive/T5Manager.gd b/example/addons/tiltfive/T5Manager.gd index b8c45aa..18e57fa 100644 --- a/example/addons/tiltfive/T5Manager.gd +++ b/example/addons/tiltfive/T5Manager.gd @@ -1,162 +1,65 @@ -class_name T5Manager extends Node - -## The T5Manager node should be added to your -## main scene and will manage when glasses -## and wands are detected. +@icon("res://addons/tiltfive/assets/glasses.svg") +class_name T5Manager extends "res://addons/tiltfive/T5ManagerBase.gd" +## Create a instance of an XR rig for each pair of Tilt Five glasses ## +## This node will create an instance of the T5GlassesBase or derived scene +## for each pair of Tilt Five glasses that are found. The glasses +## scene is an XR rig with an SubViewport, T5Origin, Camera, and wand. +## If the glasses scene is not specified then T5GlassesBase.tscn is used. +## ## This should be persistent. -signal glasses_available(glasses_id : String) -signal glasses_reserved(glasses_id : String) -signal glasses_dropped(glasses_id : String) +## Signal when the glasses scene is added to the main scene +signal glasses_scene_was_added(glasses : T5GlassesBase) + +## Signal when the glasses scene is removed from the main scene +signal glasses_scene_will_be_removed(glasses : T5GlassesBase) const xr_origin_node := ^"Origin" const xr_camera_node := ^"Origin/Camera" -const wand_node_list := [^"Origin/Wand_1", ^"Origin/Wand_2", ^"Origin/Wand_3", ^"Origin/Wand_4"] +const wand_node_list := [^"Origin/Wand_1", ^"Origin/Wand_2"] -var tilt_five_xr_interface: TiltFiveXRInterface - -@export var automatically_start : bool = true +## [PackedScene] that will instanced for a pair of Tilt Five glasses. Defaults to T5GlassesBase.tscn @export var glasses_scene : PackedScene = preload("res://addons/tiltfive/scenes/T5GlassesBase.tscn") -var reserved_glasses: Dictionary +## A [T5Gameboard] node in the scene that will be used to set the location and content scale of the +## [T5Origin] in the glasses scene +@export var start_location : T5Gameboard # We'll add our glasses scenes as children of this node var glasses_node: Node3D -# Called when the manager is loaded and added to our scene -func _enter_tree(): - tilt_five_xr_interface = T5Interface.get_tilt_five_xr_interface() - - if tilt_five_xr_interface: - tilt_five_xr_interface.service_event.connect(on_service_event) - tilt_five_xr_interface.glasses_event.connect(on_glasses_event) - -# Called when the manager is removed -func _exit_tree(): - if tilt_five_xr_interface: - tilt_five_xr_interface.glasses_event.disconnect(on_glasses_event) - tilt_five_xr_interface.service_event.disconnect(on_service_event) - - tilt_five_xr_interface = null - -# Called when our scene is fully setup -func _ready(): - # Create a node on our parent under which we create our glasses scenes +func _ready(): glasses_node = Node3D.new() glasses_node.name = "TiltFiveGlasses" get_parent().add_child.call_deferred(glasses_node) - if not tilt_five_xr_interface: - return - - if automatically_start and !tilt_five_xr_interface.is_initialized(): - tilt_five_xr_interface.initialize() - -func start_service() -> bool: - if not tilt_five_xr_interface: - return false - - return tilt_five_xr_interface.initialize() - -func has_reserved_glasses() -> bool: - for glasses in reserved_glasses: - if reserved_glasses[glasses]: - return true - return false - -func reserve_glasses(glasses_id : StringName, display_name := "") -> void: - if not reserved_glasses.has(glasses_id): - print_verbose("Warning: Tilt Five glasses id ", glasses_id, " does not exist") - return - if reserved_glasses[glasses_id]: - print_verbose("Warning: Tilt Five glasses ", glasses_id, " already reserved") - return - if display_name.length() == 0: - display_name = ProjectSettings.get_setting_with_override("xr/tilt_five/default_display_name") - tilt_five_xr_interface.reserve_glasses(glasses_id, display_name) - -func start_display(glasses_id : StringName, viewport : SubViewport): - var xr_origin = viewport.get_node(xr_origin_node) - tilt_five_xr_interface.start_display(glasses_id, viewport, xr_origin) - var t5_camera := viewport.get_node_or_null(xr_camera_node) as T5Camera3D - if t5_camera: - t5_camera.tracker = "/user/%s/head" % glasses_id - for idx in 4: - var controller = viewport.get_node_or_null(wand_node_list[idx]) as T5Controller3D - if controller: - controller.tracker = "/user/%s/wand_%d" % [glasses_id, idx + 1] - -func node_name_from_glasses_id(glasses_id: String) -> String: - return "Glasses_" + glasses_id.replace("-", "_") - -func on_service_event(event_num): - match event_num: - TiltFiveXRInterface.E_SERVICE_T5_UNAVAILABLE: - print("Tilt Five service is unavailable") - TiltFiveXRInterface.E_SERVICE_T5_INCOMPATIBLE_VERSION: - print("Tilt Five service has an incompatible version") - TiltFiveXRInterface.E_SERVICE_RUNNING: - print("Tilt Five service is running") - TiltFiveXRInterface.E_SERVICE_STOPPED: - print("Tilt Five service has stopped") - -func on_glasses_event(glasses_id, event_num): - match event_num: - TiltFiveXRInterface.E_GLASSES_AVAILABLE: - print_verbose(glasses_id, " E_GLASSES_AVAILABLE") - if not reserved_glasses.has(glasses_id): - reserved_glasses[glasses_id] = false - - # If we're managing our glasses scene, reserve our glasses - if glasses_scene: - reserve_glasses(glasses_id) - - # Let others who are interested know - glasses_available.emit(glasses_id) - - TiltFiveXRInterface.E_GLASSES_UNAVAILABLE: - print_verbose(glasses_id, " E_GLASSES_UNAVAILABLE") - - # Let others who are interested know - reserved_glasses.erase(glasses_id) - - TiltFiveXRInterface.E_GLASSES_RESERVED: - print_verbose(glasses_id, " E_GLASSES_RESERVED") - - reserved_glasses[glasses_id] = true - - # If we're managing our glasses scene, instance our scene - if glasses_scene: - var gview = glasses_scene.instantiate() - gview.name = node_name_from_glasses_id(glasses_id) - glasses_node.add_child(gview) - start_display(glasses_id, gview) - - # Let others who are interested know - glasses_reserved.emit(glasses_id) - - TiltFiveXRInterface.E_GLASSES_DROPPED: - print_verbose(glasses_id, " E_GLASSES_DROPPED") - - var node_name = node_name_from_glasses_id(glasses_id) - var gview = glasses_node.get_node_or_null(node_name) - if gview: - tilt_five_xr_interface.stop_display(glasses_id) - glasses_node.remove_child(gview) - gview.queue_free() - - if reserved_glasses.get(glasses_id, false): - reserved_glasses[glasses_id] = false - glasses_dropped.emit(glasses_id) - - TiltFiveXRInterface.E_GLASSES_TRACKING: - var gbt = tilt_five_xr_interface.get_gameboard_type(glasses_id) - print_verbose(glasses_id, " E_GLASSES_TRACKING, Gameboard size = ", tilt_five_xr_interface.get_gameboard_extents(gbt)) - - TiltFiveXRInterface.E_GLASSES_NOT_TRACKING: - print_verbose(glasses_id, " E_GLASSES_NOT_TRACKING") - - _: - print_verbose(glasses_id, " - unknown event: ", event_num) - +func create_glasses_scene(glasses_id : String) -> Node: + var gview = glasses_scene.instantiate() + glasses_node.add_child(gview) + if start_location: + var origin := get_glasses_scene_origin(gview) + origin.transform = start_location.transform + origin.gameboard_scale = start_location.content_scale + glasses_scene_was_added.emit(gview) + return gview + +func release_glasses_scene(glasses_scene : Node) -> void: + glasses_scene_will_be_removed.emit(glasses_scene) + glasses_node.remove_child(glasses_scene) + glasses_scene.queue_free() + +func get_glasses_scene_viewport(glasses_scene : Node) -> SubViewport: + return glasses_scene as SubViewport + +func get_glasses_scene_origin(glasses_scene : Node) -> T5Origin3D: + return glasses_scene.get_node(xr_origin_node) + +func get_glasses_scene_camera(glasses_scene : Node) -> Camera3D: + return glasses_scene.get_node(xr_camera_node) + +func get_glasses_scene_wand(glasses_scene : Node, wand_num : int) -> T5Controller3D: + if wand_num < wand_node_list.size(): + return glasses_scene.get_node_or_null(wand_node_list[wand_num]) as T5Controller3D + return null + diff --git a/example/addons/tiltfive/T5ManagerBase.gd b/example/addons/tiltfive/T5ManagerBase.gd new file mode 100644 index 0000000..d08abe7 --- /dev/null +++ b/example/addons/tiltfive/T5ManagerBase.gd @@ -0,0 +1,73 @@ +extends Node +## Base class for all T5Managers. Should not be used directly. +## +## Classes derived from T5ManagerBase implement these functions +## to customize the process of connecting the XR rigs in the scene +## to the Tilt Five glasses hardware that is found. +## +## These functions must be overridden +## +## create_glasses_scene +## release_glasses_scene +## get_glasses_scene_viewport +## get_glasses_scene_origin +## get_glasses_scene_camera +## get_glasses_scene_wand +## +## The derived node should be persistent. + +# Called when the manager is loaded and added to our scene +func _enter_tree(): + T5Interface.t5_manager = self + +# Called when the manager is removed +func _exit_tree(): + T5Interface.t5_manager = null + +## Invoked by the T5Interface to find out if the glasses should be used in +## game +func should_use_glasses(glasses_id : String) -> bool: + return true + +## Invoked by the T5Interface to get the display name to be assigned to +## the glasses. This is the name that shows up in the Tilt Five control +## panel +func get_glasses_display_name(glasses_id : String) -> String: + return T5ProjectSettings.default_display_name + +## Invoked by the T5Interface to get the XR rig scene to be associated with +## tilt five glasses. This scene should contain a SubViewport -> T5Origin -> Camera3D and T5Controller3D(s) +func create_glasses_scene(glasses_id : String) -> Node: + push_error("create_glasses_scene not implemented in T5ManagerBase derived class") + return null + +## Invoked by the T5Interface if the Tilt Five glasses become unavailable +func release_glasses_scene(glasses_scene : Node) -> void: + push_error("release_glasses_scene not implemented in T5ManagerBase derived class") + +## Invoked by the T5Interface to get the SubViewport of the XR rig +func get_glasses_scene_viewport(glasses_scene : Node) -> SubViewport: + push_error("get_glasses_scene_viewport not implemented in T5ManagerBase derived class") + return null + +## Invoked by the T5Interface to get the T5Origin3D of the XR rig +func get_glasses_scene_origin(glasses_scene : Node) -> T5Origin3D: + push_error("get_glasses_scene_origin not implemented in T5ManagerBase derived class") + return null + +## Invoked by the T5Interface to get the Camera3D of the XR rig +func get_glasses_scene_camera(glasses_scene : Node) -> Camera3D: + push_error("get_glasses_scene_camera not implemented in T5ManagerBase derived class") + return null + +## Invoked by the T5Interface to get a T5Controller3D from the XR rig. Although the default rig +## has only one wand two may be paired to a headset. +func get_glasses_scene_wand(glasses_scene : Node, wand_num : int) -> T5Controller3D: + push_error("get_glasses_scene_wand not implemented in T5ManagerBase derived class") + return null + +## Invoked by the T5Interface to set the gameboard type the Tilt Fiave glasses detected +func set_glasses_scene_gameboard_type(glasses_scene : Node, gameboard_type : T5Interface.GameboardType) -> void: + pass + + diff --git a/example/addons/tiltfive/T5ProjectSettings.gd b/example/addons/tiltfive/T5ProjectSettings.gd new file mode 100644 index 0000000..34cae21 --- /dev/null +++ b/example/addons/tiltfive/T5ProjectSettings.gd @@ -0,0 +1,48 @@ +class_name T5ProjectSettings extends RefCounted + +static var _initialized := false + +static func _define_project_setting( + p_name : String, + p_type : int, + p_hint : int = PROPERTY_HINT_NONE, + p_hint_string : String = "", + p_default_val = "") -> void: + # p_default_val can be any type!! + + if !ProjectSettings.has_setting(p_name): + ProjectSettings.set_setting(p_name, p_default_val) + + var property_info : Dictionary = { + "name" : p_name, + "type" : p_type, + "hint" : p_hint, + "hint_string" : p_hint_string + } + + ProjectSettings.add_property_info(property_info) + ProjectSettings.set_as_basic(p_name, true) + ProjectSettings.set_initial_value(p_name, p_default_val) + +static func setup_properties(): + if not _initialized: + _define_project_setting("xr/tilt_five/application_id", TYPE_STRING, PROPERTY_HINT_NONE, "", "my.game.com") + _define_project_setting("xr/tilt_five/application_version", TYPE_STRING, PROPERTY_HINT_NONE, "", "0.1.0") + _define_project_setting("xr/tilt_five/default_display_name", TYPE_STRING, PROPERTY_HINT_NONE, "", "Game: Player One") + _initialized = true + +static var application_id : String: + get: + setup_properties() + return ProjectSettings.get_setting_with_override("xr/tilt_five/application_id") + +static var application_version : String: + get: + setup_properties() + return ProjectSettings.get_setting_with_override("xr/tilt_five/application_version") + +static var default_display_name : String: + get: + setup_properties() + return ProjectSettings.get_setting_with_override("xr/tilt_five/default_display_name") + diff --git a/example/addons/tiltfive/T5_Icon_RGB.svg.import b/example/addons/tiltfive/T5_Icon_RGB.svg.import new file mode 100644 index 0000000..09ced77 --- /dev/null +++ b/example/addons/tiltfive/T5_Icon_RGB.svg.import @@ -0,0 +1,37 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://jql7sxvwys6l" +path="res://.godot/imported/T5_Icon_RGB.svg-913fc980ffc72ff335b087b54f0a0888.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/tiltfive/T5_Icon_RGB.svg" +dest_files=["res://.godot/imported/T5_Icon_RGB.svg-913fc980ffc72ff335b087b54f0a0888.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 +svg/scale=1.0 +editor/scale_with_editor_scale=false +editor/convert_colors_with_editor_theme=false diff --git a/example/addons/tiltfive/assets/T5_border.glb b/example/addons/tiltfive/assets/T5_border.glb new file mode 100644 index 0000000000000000000000000000000000000000..f630e656cca6ba3fea07a4364c7d8ec8c6a5b59a GIT binary patch literal 15264 zcmeHL2~Xk6JG5M>hvTo4!&6E!NDxbJyt zjL|5FxCH~aL=zPyYK#krQJ)*`TU3br^)h6n1 zMh^;5GR8jd%$RR=#(ED7>X+ganwV%XI{BnHMH*ra38BWg1ScP-K4TK%V&f7WBWa0a z*JwlRXhVWyuTDXZ$yyf=7mcTrvs1DmAu%d0mW(wnu1=}WPKJp_Lo8H@?WJNXQE z>eF*Ta7?JtkPsCbofw=LZwOC{4o#r7FHb~K$dS%YiQz=R$;VYfiR2;0DK<2QbWQ{L zoU>DG+-L(PTt}wT3h|cW6k|vn!mnad2RFC)k-eaF?UwlER`51EWTRq%k4M zAg7K(yv)u_n`Q*=78f0t5D*&9i#1&1qV-g3-90_jZf6Z%!^0**W%=N=pTe4@>B4Fos4)M}-fFONty5Ye=Lrr8tF! zCK@=|LDZe31S%y3pk_{_Vv)lHVJmWRb@6i5XfJ`+Fx29jvfWBP7V(s8HA@aY+f`*fAg(6%!gMaR^I_ zh%h7!jxtPe@^K@FQ89)=lj5C#Ozz9q#I)_2xgcA>6&xZW^_-*2Pur?XC83b$505 zPjSXu1ttrqH6Uh}2{qtfrt(+oHGgZp<`40yQh$ukmAsUm8mhGve_*#Rfn5gh*8HAl#{TRC|zPc5Y*U$6Zu{%#)BT={yntJ>28=R-O;RkfqD5)c(l7qgR(x2MLN z?>e)>+shLRs_HG(T2^4S*24`a)6ub~J7ZmY^<$ZDAJzS~FDbV}_~ty|1FOzw10Owl zRA>3!iR_4o^&CGX8{mjf4(h7!Ps+`X%H=pS>~=QrlE#O1W52$VeS1a@#|p9mo;7E$ z&YCbuj=yU6I2)MebhSxO>o^|sqB0wpeCf(3muFKPj%~>Xm}2Yf2@@}l2jwWX0TWkU zc%Wh%ap%~MY=B`eY+hNLC-ajhY>=~93oLvhXJG>@)*@%Y4OnnS&LS6Jkt1@J)ge#R z0Xd6W0gDVQFG)hdI2nYgq%h1fJIN`Hm|O2Q`J+QWTQcyu(n0je&CpVYEWaj z4X{`XZVkyEeUmtAfTdhC=reFrvH?aN>JcW%G1Wl>%xgt@vgMd+r~#I0t0CVU+mj72 zdSOeLxNuB8(gI7p(^4KB*CHEWsgK;|m9;vVAM6?7M<>=If7%b+Cu$^YfW=zmEVu#F ze&C#uv&aRwwv;1smeoNg>VTX@t$=Ai@ERg#+7G<8z@p~JS@Z&!_Jimn&NA;E@)tdo z+q}9~wy(@*U*0c@Ywoo%F*DDRav}LrU*!9T{G0cQR=drNo%&|ywWPK49X7qRH{^SO z=JJ}64cYSE0h5oH`i@?U9-$X98*^X4LF5Gv0#j|x=MH?ztN7p!G@l*hE6yGAeL*&m zsEIhs*q`Da;QXaK4g48l_{M$%MtpD<_YCynJ^_C@mf4&4A?hV+g1XD-MC4AIkR$e2N-EFEHYY8iJds6=I1Rg1@K<&WNZR&X=eO=Ofh+oW(r` zKH{Fl*%9?eFT~kFZ*F$Jph0}}PMjC?NSsIXSDXvOoI&(g zoMrU4-I-rB$Qyn9to)J&wLyPncLly3;?8;L-jM6XTI>OVC2r#T3vL`seE4@(%7uTg zCC=I4CFRb)%Ti6UA*EXJ@2^x7{+*Tb;@@8>uWa~}^2!DmDKGw=g`W6tL(L@4+y+?a z(Nj?e)KSz5eHXnzpG3bm%jJYa;RCHI(@CzDRs{za*Z#{)j8i3%H4MBIN)$VvWd=@-pAIz|?nMf7pl~{R!rK0D5t!z3NkT@4aLr_J9(}J|cXc295{4}&z)blPrgu|5am89j-18|1?uT-Mjr7Cq|0S-Glm`XQr$R4-Ke%4OLaEmS9#D<6V?l^QXjd! z)JKkC^CxSo)UwlXuo9wKi&fEqym+_W!!rtX;r9N_dsgGO_ zPO`Osfw^5io>f2Qb6}$Ne@9Qt&Gz!Oe;2>b&;N%0bv|FmS#JM-iRFC$Ze00VIsUtT zfwLk$)d)58@srJHBVlSZ*W#R?0E0 zk$y~i`8QOKg@v@&&Gv7im%d;4dq$ieljMgaet2B-H%|U7lVjN$voH9T{NnE)@?k!U zCJFNZZ-NECs=T=$tfimdu`JeW|1QM>tRjKG<&YQn3XJc#=nuDnWz~=Q+eWXi$5s5Q ze2RrKdy^D54^9wE*6WwBY>nW=|ArL&q&k4B^ke2^lCAv<%$H#veaDYUhVd%xhd=d; zd3kKfmel5T{|@GB4ZqUdU@#lKH%l?`0YJ zJS5ibOG)7GLfR}!vdG5+a9#_;E5vsh;``-%RIn*C*3;dV8^Y(*3LvWBE{6Dts?T7dSd$jWdzo^dL{lM?7JB|IoTOUx{4?O2Q zsP2dOoj=q0A^y^dzJ7?`y0y{|aaVuA_&X%xVjdE_Y)ULRZzoN4p8ut}7Cird6jkGS z_HS*$^WRa;g4ZK`l!Di5o~x4QUHGGl*RfWalGo$CO$u)Rae#v7g>}de@5l@OkO$%* zFZcm(#791e3*O*`yx<>oKwQ)Z{*gc8p??pI6F6^&A|vM&-)SP}KWc6==Q~v~iSy|_ zB8f}vL-a4pCyDdjm@|>*p~*<%btvg*k4s(k*{i4M{XaY6 zi$3H1mMU9^cjSpUkcb1m@DKjrf&38{d4nhF0N%(4c_4rAM&96qx_}S*h4`oo_@Iw? zhaU0q4vBtRlyu>FIB2@^IxH{J^ZFFe?ZWf!-MR~}%Y;!?`#Gyx7hboSt~y?agFpK7 zy4EPu@%r@JB<=rzs(lK3RKI#Mi$RF{x zY(3enZW0T9Oj(N-`8Bjy;tBXB=of!KIiKpao$lUA%%b8 z7w-Xme*bPjk9WioaUtPX#KAn`K|+sv2Yw(CN5uV|$7!AizL!;Y$IKG(E?har<6$0g zA*=E@&EsGm@gSk!vUM$A4~cl<9v1gB?1W#$Lw$vW9`A@F;tIczh=X|{5%1OSl!z;M z;Cqnvtgk+-+g2{Y1MfH|_0wwV50re&CC(AvA#0`eIbn?>Jw0 zM;!R`u&eSb{4=ItN*dMZ&lMH3VAW~VAXI~-f(9dG$*gF`g0z;*n%S_LG;9ggVzrqa z4SPcNByDI|6SAdwD;k!B>ae=39*z2h8nCxmLmG_;HD*ni1C6GHnv#5rMgv04SaX_b zLfU4`k+on>G+GjB#agpAG};nsOR@zGM?x)WzB!F%gx+TDSbG{B2syKk%!NiLLat2B zG&Hn?v?M#ya39 zPnAN)y0UKU9U9#U1+X5hCyic&dXel#qbs4_tPjofAZ>3J$ojH=G=d2AXYaBBGzJnH zNU|@DKte$@--kwTLW9_QY%q->gx+UE*)VzzW5d}9Hj<5E!7PMOFzG{BC~3o3I2+9j z%t8^tBIy~)sw-+JMw7ONBAhVh4P-xp)`pS&Fv7!Vbtt_VNH>y=p%F!BEE~t7>31xP zVX^cZN6$DG&&IO^dXAyFDAL5!+c<8KNXSUPsiaF|AFvPUnM(Kr(xs5iBsPtGMA{EYJB@wJ zrn4FJJCl9FW>GA}n?-Lk={cLt;T9PrKPIaTdVWGPv&sGwHkYrPOLHHQ)jako`;4CR zNiJXu*&?=>KH5QCKNfGiyan#d6ZFAnjtZUqJX%vRO>lpOXCw zdSA%au(dQ65n9K-VC!joNoWK6isS~ik>np(Te8?m z7Q5LVn%hP;d8GN4Mn0hewwLXrv7a4a-%+$I8bAlwL3$pd`8@VLJr9vx0ipe*KS1_B z5ZX)6eKeCto({7k>?n;wLWS%YJ5B?ri2cY;&^XD_ahf?sZ$GkA>?d}b#?OS#u(RwO zjq`-gvtm|41Ly)PWfy7u!chs$6w_NNyTmTDD>VK|=qkI$uG6?d=mxvV%4h)HVz=2H z8h1G=qnVrZcAM2w+-DEy`GD0{*eM>ed(2L8kMJY*m_4EKD|HDZQ1m7pxN3sY0Q6LH_I%waH5@dah>wV7BzMRoKveS;;KvX{oTLlUYMiozA2M zJ^fi1rlO}xQH^dCJyX(CNqA=eem!ih8(Y&wY}>2nI|C2^zn0ZWj7ZoJLBhlEey@nW zecKbH+m+F+Q)N{pm5Ro6cUNgF6-~_8j&v;Avo)4k#RUW;;+_ATYro?d0jv0)LrG~< z2fvCFC219m)m+uVFp|Y-P$3FUQh>ucfs$utbpg*hEAozx*C2QvYxvN6a|NSXnv~;9< zV(LDX%0Kk}!VD9;sQB-q{}$r^>5izJ&ZZt!xpeB}>2dea+~%9&O7mhWmM=U{r{Mgy z2ZyaJSFBpKRg3p)MfqMQ{@%S zLI;n@&e}26;!N7}9yMlaBaZi(He8W@E7GJ4X+I->$Q*Uxmh1y#K7ZJ&tHSZHN5?ara{ev^4oy+>P1Rtn|XN;cK5- zXV027Yj^FGqWeb`4%0H{&bfTF{{Ejm<1RdUx2WrTD^{-Dd?7D2_xbb3WnDX-`7JAe z=JV{2XXTIQL%`1(_y%JKg!e{|#I_z7OWTo|DYwA}g8 z$V2fz6;oD;$QDuYck(<(thvEG=u`SXx}{w)eE<=N6uQiw-V%IxZ@E ztWq`qjwax}wr$(qXw*azIQGLmo#$#77=|f3&d!?6)<5p2Lo2O*$vcyjd^&)2Qf<0-s;~axR}P7arKR?+$|c8b+GW&>T-V_4&>%(J z@qp3IEG$ia-D8rr9gT=yc;oIlzlz!)6Nj)4OLZ`)S&& zf+f#BA9~itv~*6^m0z-##rJBH*tGN2k(UNIo_Au|?KGh&s)A|pJI_3R_Uu`M%w@l} zR)&naFso_D%V#6i4Q-lwt*x#MX`wxudS-Uy>fMc;Q}@hn>8i-e=@8+Qc5vJAz%Rb^ z3G`^H@^7CK`16wJgUh#^C{8(+Tz3)s{`TUv+g+C5&lvoEc;~~(jT~8HZIQ09Fyfok zu~~&~Dpi5oh}-q2&QWEL{KU#MNAr05iF^9FtIp=wu}OQ>L;GZ}Ols5NRK|ohjx0GK zqME8!%Xv}t99gZCCr(@53UoXI2P4bD2nDT zYTqR!QmG7y9PQzMk^avot->q1MvvlQ%)x&B$QD_)Qv)k~MzH9$?_bXR!FVvr!7!ol zEmqRY$K~yljUtPE#w}{)$QG@;d*+{(qiw$2(76o@2d+hG+aoOGKzU7=_4GtJ^nuZ_~?t?^aV}?dcQ|)n!Ghrg8kDOYpLY?Sy|LHA<%J?{h^MxBMa%|oosNqj^k#xlWxu~ifILI(ZT1(MO;u` zbpOd`)aqxmPc?b6WWo;>Pd2gZh2w{xnqRVD_=2LNeROFROTO8xblmQH(%mIj{pF@9 zd442u3z4yz0Tm(0csFgiC{g`7ryUB;eO(%{x=;`TM=<3&~ce-!v zvnQt;Pd#$v$WJ9DBgYl?JA0wwli(2})5Xf%^1CDSHRke=uQjwd1};`?D&Cdf%xwvDW^(%dHNaJ+^qp*Q@T#pJA21DD#cyyA2DEJ$+o1izYWr)fZ*bY~ zLr;r>n)7nC{a4th1Up?1J9TomUgdvH85D8xy2G~_)qR>h$ba-9{U<|tild8F*o@*M zb*6d*KKk}nD?fc{@RX)Ca<|u5bF#R!)N^^YAMa;oW~SV^p83x}~-5RL+Z~WlJ_Y^k6w_22H;`dv22+ zb~V>dTbtTEw0M2)i!a;Ou3dZNl#s~YH!KPk7;mSvRobh{KHdAUG=2O0$2}JP+_Z8? z=Hs1eg~Bx=%vNcze5x~P26U)5^>>Zse-(eT9u>CQ%-E~8$M50aHvjp*ide7i{odKq JHRJ>G_CI#u7h?bb literal 0 HcmV?d00001 diff --git a/example/addons/tiltfive/assets/T5_border.glb.import b/example/addons/tiltfive/assets/T5_border.glb.import new file mode 100644 index 0000000..ec70317 --- /dev/null +++ b/example/addons/tiltfive/assets/T5_border.glb.import @@ -0,0 +1,39 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://s3wiiyeuos30" +path="res://.godot/imported/T5_border.glb-c296b67b5e5121f576eaa5a4e3abd8d7.scn" + +[deps] + +source_file="res://addons/tiltfive/assets/T5_border.glb" +dest_files=["res://.godot/imported/T5_border.glb-c296b67b5e5121f576eaa5a4e3abd8d7.scn"] + +[params] + +nodes/root_type="Node3D" +nodes/root_name="Scene Root" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +import_script/path="" +_subresources={ +"materials": { +"Boarder Material": { +"use_external/enabled": true, +"use_external/path": "res://addons/tiltfive/assets/materials/T5BorderMat.tres" +} +} +} +gltf/embedded_image_handling=0 diff --git a/example/addons/tiltfive/assets/T5_border_XE.glb b/example/addons/tiltfive/assets/T5_border_XE.glb new file mode 100644 index 0000000000000000000000000000000000000000..f10e074b5a4bbe786fb44dfc507c7f7671ab447b GIT binary patch literal 25796 zcmeHNcUV+M*Ppq9QbfTnf+BXMEG%8!ivx?J z*rIVEYSbtwDt7F#_t=%lcg`%cndRMm%k%y7eb4i9y>ou^+jHm6oH;Xd&V5Ws>KiN( zLJr3ga?G5N?tOaq%5aWJON&c)4#;p$h)a%3jY&^Qbq;XuF+4RTIVH_00UmMcoD`QF z8<*-7>fYOFoYKw5&C}P}#d%y@YFc7SGAMhxDV(RcIHwJR2Al&F6)4R)U{Hp0a?B{; zocplfT%40rV&m`!#o#G}|E^^?kBUnh&K|AM@0^kfZ;T2~ib;o8rKY6Eq_cMoQn>QOB@#$95alKb&$eMq3~4rD1DV)o}OL`A0H2;pVH+&U~we6Vd}c=)U%=w z(Dl(nQ+vjx$0Q{s4vR<`n=m{%E)9B?;XE`ZEv`#SQc7yyxC!ZFQ^7_V&WT{<319`V z<*15hcqbK8&|YXIW_?Yzc)Wo4<)3KW29NxQ6Xy4G@y_lJM z^^WM-Da<**!^OF8Q2#Eydq;GQQaA^A!mFVdiNo*_CA^Ri1Ukj6o387vuKl!_QKOUM zz+G_4Q^uwa!`a7vCXR|psOZDcvGMV7sb3_u#r2&y8eM`ZxsOgx04r6P zZ)i$PYOE`~!x>wN83x@*OG(weOl%0=H!Nk;=#=ERVt(-&O_rrXEI$Issz>i)joUOq~H zw09!7_aIkYBT8^HKX}g1+uOqhIEBL7)7KN)RQf9XJd{4rNQI_{kC&g1kC&IPmlw8@ zt{d+cL0y!vOknB-lYssI54c zwS(MBm95VlrO|@Ww_4>N4f5qEeuc1b(9;m+RU&;siXXR;wFaQ zKXjC9j@+cecHRO`XtkN)s-Sb|^cIFE!?W$;w=x_KZSKFZjp1~7*Tjz543|P5#!tvm z;aDa@-%icTRbihyL7(SM+`;%(FqU6^H4Nhz#~;?=hA{S`MtLf1HOYoqaAQ|3*#64qS3~*-pugk z+Id>E6+S!5BTridHbnd-;1(@6Gn@rFnZ;Weo(s=Dh~28iHvOT^wCmd#uZDLiJ7hE5 z6Z)VWpQFY8&w{?qo}0_CJ@h$b!VZT2fU!*U(J*`(#;63J!Lk1iW1j)Ogf`g$Hko&( zP=);|49GKybC&6Jdgkrcn!-KqpHS6+cBWR_r!|GWPaRj;fX=t>2ehVe?>@gXoxElR zT2nY?@=;ZFXveAn!@PYsPpDzq1F`6gna{bUV@G( zTwAl7>EOFe;WjXrXdescvnl)%<`Q)xVC<&w*5(CF=O)7VKmSPg`2Z z)@)Z;JEm~Y(>k4Fum(-xP|(5scIh)m*%Xe0cV&al#jQvMF2+bBQ`RA6m+$@a!uGwL3v4y=H6K z6khFIz;u52&{{TyKe`^!?t*p(?`^%M?HpU(RyKw4?8bL( z`?;-b3gelDIzNGqDI5cP0_q%vcbUStpP+qqLZ40HAlRd@oq;fRQ}{OQb=b}Zu%Rh@ z7WPckNrSmCg+pNP#W~#ub7~6XzKuE^z&A``-2c&6Ex^Z2;r4K*pw3(HRZ|$xBh+~Y zK5q)|fHMx)&IMRIrtr6LR`NAy3gdq31?}|fWufKqTh>?g<)bjy$VUQ?XRa}f>zY3+ zVr-|cRHDJyM#LBsz8O-Y!I)6Q7$1I$xuC)LP{bH3u6S`lgK?CIF>XxqxT3+hQN$QS z?yXj;!5C7+7*7^kT-9JaDPoK*-yFN4!Prv77-v>rcU^;Vrid}-Y@oWS!I)FT7=LOS z-PU0IDPoL8@<5o3(qplKH+#@Hgpc>9ZqU6dGaix^{X7ndL<#@-^vIDGfEASK4(BF329 zJ}6j;F}a8_K0o(1Sc&nuh%r`=JQ||JSY5;zw`U}WC^2pqF~;yxW;Z3q@FGTEs+ZJF ziSfLMF}Ak{9%K7|2V?wi0qtY_FJjCEGNC`13y2u=f+5g<%nL+}Il@I4FXjj$#(beM z*oWl{B8J>yAJ`Lf2h1Zl#yr9e?2mbbh%u)a2=j$Gg@`e~aD@5A{6fT-Yit02z+6Mb zn0FL||6txBV%#%}!QV!Kzlj+4Nx%4RN}ih-!GbPVWjA6`2YL)d-^4!E2#(dbk*aZAJV6k`~3lWTqMYj~bw3}bHc_3=jK=PAZ8<|g0#_+G>F6k`~3lg5^18lI;Z!eHP8*d5STNxk;{q=J7nm7{++=%Lplt=PAZ8#s)J$hvzBA zFyT10N>zwiZP7m!f^00o~IbYn42^JU*&mC;4}bnARbrkZV)TcS38yufvxpe;m%gBn`HP70jOM(EaUbCAi+E&bHTxcd zG14f&{5zG1QHP%krZDRBSnJ=xI2M=OzrUp;=HJp?0rPL^i21j4H^BT`x;tS0EggCO zEggCOEgdocmW~+n8q8l1^Ka>h`L}e${98I=%u_HQLCn9UBj(@I5%X{9i21j4#Qa-2 z_Kkl_N1lI6N1lI6=VQbi0WtrUjyB=n(z&hhOka`n_qX(=fcdxdWq|p&bmaNBbj18y zI%57UeFWF}}q$g?8gHt%!F6&%Y0#o%#0x zI@t;yCc>^lQQ!~eNhLnn%6~rz%YNhXF;ed<_@WfKXv|!!Z0mX9-W<( zZ%V()?H`%WvWsI3^x-izZ_{t`9i|g~F*aY+7j=UDYvx0pYLfomlU{ zd{JN2In^YP>D+N|lP~IvI{h8{GM)IoHSZ5}wsd_-NLqZWBs zckI2ePSMx&IwBA2j_JTUHP8|HgnXT?wAY#M>)R1|Sa+-)Sf{f1E|G_I$8=zw8t8~T ztUIOy>(oF;#8Dxc8hG+TOH_#FJ$Dee2$bi$j{g}5S^1|L?(2mFpdz68W$P0U& zfsV)vd!~Vo$P0U~fsV)vd$@s)$k)-bc_rkIZa?N@7kS}KLEnZyot;HqIGYS~L|!=K z*qrco40%46fA7cmLftLSuQ4n>%YKK)_@7>14b3roe12JXMz6bKg?qf7|ByR{{l3Y^ z5`9+BFDf0!_>YTc8t`X}Ml$|l#8Csj$K6QAPmH1YVmnhZyE8swor3}2?S&WPS2yrB z;3tf9VEp_ayBqLjZj|xosth*ZZ@oFf=AgsPkp_HDpP7u0y)({$AMwC~@yqh281S3@ zEZIEyUdhal|IQL^M9MGg_F!(qdk)M-A+|tdHs1KN}9n5QVx_W(lj?KM}*WrJXr|9*? zyhGF%+Y$2)QD4*%^A1s8)DiOzQD4*%^A1s8)DiOzQD4*%^A1s8)DiOzQD4*%^A1s8 z)DiOzQD4-lm{&%L`X+P?@)6Kc^ZET3c?$D^f03s!9ax*phcJH;^AYh~A}{76qK?Rm z`G}|^@?t(B>WI9UkBB-VFXkhnj>y9r)WUB>$Wz$ZMPAHD#CAkpSar*F%b>) z2Qgm|a|AIj5OV=B{ug6@G0qobdoi9DV|X!c7seus@wph2i*dLZdyBEOh{af1jGx7r zS(q!10yuy*w81@!gpR>mgu z@fG|TE=3M8{;A~#DQ+@(*hytJ#!a@J&`GsooSR%|)k(E7(@j=Ol=h2*N1oR4@7DP+eU$qy1<8@G zb^QGyzKlm%>wB0->kX=cDKYYd>4O+wVC%=`8SR1m-cth&*tw$J=o{4;k20#fbZq2I`__p;VYX|=1o6UNE(2V3c7-(**2 z7xrGrgSq@G$d%a<>x#V=j7K@y*_GKHdG+&Zj7J$^=E~*?`CO%rM_KmBh0QC|pI%j` z53=l%i{20P_PJxOI&;!R-c;c?B?onO=92rFQ_EOpUoOdd6{}wyJxni4pq!P6H6gq`)3famt(Qx{4mZ{Yu)0%R zlwR5gyUJ_I{8|0^f+2dD4tCz0tmFIV4`w{dW-u=nZ~RzY@g`C)e}H-1yF|wa`s#R; zlVIKp!gT!b89F~h=>&e#z)8nXxIK{h75X2pORVF5!|S=;joCUyKSjUA=WyL7wT#qD z^mBX<@?9_Lc$BylE#TeCw*wdWq{A z?TUPZt2!Pf?gKavtQ}2^UgExi^M?HM=|lAr_ZggLnij>*7cPraqS(2^<%U5~GM;l>1_#0W;k@ILxJI$_ zi_03dqu9B|W%k=4?7ZXB>B1t{wQg*@T-u)M#_Yl6wS(Q5y|}#ib2nyBE>%0bF?(|vq3Oov zLzH;_VjU&w;d#d88E6mBIlYAU;kkUKLVh~gjh%~J)`R}ydCBEP7!RJKTvmng;`z#D zG}r^rT`o6)z3@EdauwJU&vPz6B!sf_n@gMrJm0x&8D2x~Uv8tq`NH#_+^-^UKHEiK z&w}~I^PkH$QSAL(wgmsd{&D#w_!st{%bnnVI6f{Xfq&xoxm*GMi*W;& z$HA{Le&Dhg{2%Sh<#1RZXn!to-Ry;V;gZK0VQ+PD2A(H)Zq%ryi!+eNID^X$jv?%P z!8*nlTn4&_u=5D(7-w*~CM1NNUs%WZg3FU}A?&=vI>r}V_MIKV&PS|coWW)Gju3X9 zVjbfQE+emnus8$j7+-LCtwuL?USl2O3odtd1|H%JtYdt^<-m#Hrw|X|zJvQW^0=>K z9pel1XS55iqr|v^OU>)Xa_Q39%&r)BAdm3|myvg29xB?$I0JclklvnKUh$#T!fy;tehvWJfdmVEsA78+v&@n%NWU7-w+#{CzaDKh`nM;L@Q% z44W^kW1OLviWoM(Ob_A=z3d#r{2@Eb)NPF0mavSFn!p2A4_jUOb1ej`0SU@z75^x3G?J2A5VaEsAZzS|zn&RwiyoWW&xm=`>!v5xTum&afp@m$9`#u;3`a)@Se0M;?i z;4%#S1mgy*V|>9Su2=L&tYe&k{)ly4ujsGnzxW*1G2Y-3{T<^CtYe(PC9V(b7uGS} z;1bspjsxo$Z*Yn0591B2W4ys7u2-}Z)-m4T64y7{73&yhaEbc?&I8upLA=2w?jJaB zSjTvSOWbd8p0SSc2A8-$pd^B9Mq z-7yY9KSe!to(DS*Q1U#3gg0crqYMx1((%!+ljWzwBiZljh-w}2+`u}XBlvr+-FNyr z_5<_Re~4o$#VwWNl*(~QRjw33^4VB}B%5eeO566L0JpU`7_m$80 z%IA6I^SknS&Ch33=W*rpxAJ*g`FyQ>o>o3TF#8#InGWrMp&iw~}e{ueu3jL%L=waM37xd6iIB!psgJv)eLwjphSR|De?65DJ`+CkZlxDYqskZ~cdaJd0$L0Xc2aP=jh!PSfOfU6q` zf~zx;;p#yA;qrmeC}A{>pln1OfcFQ~1GHp#_A@}up{0JL8Axoc2YXh@G#!W|@cn>s z28nGtlEzRrCQV3F;E-uToZxB-sE{-Sixt9s2EKcJ1$H|}PLX0Li=nQNT%=Y|wgPKx zBGrivls05DX#h_Z!u2~j0@oo@0M`Ms53W6ACtN#7He6dlb2I4IfU*Xu34Au70?^tC z&mI9(A6hCT^*~~41?<_)OtU7j1-=lNx*)MlTVe;L9jQg?0EbL1QX9(JP_GXC+6dQo zBnz(9WCdJH$s)KGkhyTpCSSw#6^!U>xGC^+0cC;KB6xNqAZw8L>>{Q~i3Cz2Re;X| zWCapis6x!3G$ZE361cC41xV!0NmWt}YKRe8(_8d5wT3&8s_1-r7s|WzDs4?$&=GKr zqNCwTqvPP3NGHRUNxy_^2Au`h9C%_rJkbHl4m1GxS%AiY)|c??Xh3bDr4iHxB(^q= zJv*Oi22elXM*!mn65I5nK2Z8lFRB0z887Myr6<&FppSuYb)msV)!?aW)SQ;k3xH12(}0fA6MzoV-vIqW^8xLlKLdJ6UXVTXHF*i;9;hFL z>lkRBgl8_pWlpO=S%p&IPXc-kdI#xS@|vLLWyVulPTrHZz!(q=ej|b7={gOQ(_qGM0{^31kc%Mn;ecG@Xth=`@~VS(b+VU z%%&M+I$1;)(&=O&{gTWiOX*@dlPsn)$TwsKT}Hnl%jhgJkF2IE={&NM&LIm)7F|OZ zk~MTbSxmm8>*!*#j($s)k&Sc%T}C$0C1fS}k^Vqek{{@DvWEObH`6s_GhId2k?nLV zT}QUkwPXXyrP*`?$)@Yc4HnNxgL~_Uhx}WBd{d7CgkOHcu z8lt7SWEVL^f2F&~uQZSBB}eFCx|bZLyUBj?J3UJGlcV%!q9uj&IMtHl^cV6gIYo=; zucQe63*2FHh8EMqq?jHgN69&QmL4T%>2KsXxk%5`C622lOG0r4QilPr8$Sv=8l0`p{s~lMJL^(4OQA z8cM>+U^;+?lL0i0^dZqSlJ+5yv^R;PkLh#RIiAB_;vu<8521VrZS{jQ@g9`-=zaQt zJR%>V{7660s?>s7Nmb#tlsu)Dv;mY2ByZ^+c|bnUdvL#}W}sy$nZa!#-68kLdwK`% zcT|F3EF=l;YLXLmruCt$FV&N7lRM-cy$$zUN83f)0R-S zl$uL7$!+qM-h}%N{RBrxRp}F{Dw#_Tv@xv4)<$X zMm`a9sSIv2$(}mUI#AY;YD@mKJ#7YMGs#)HO0JXF^eWu1=m%0p%%l%+SCJY}ds-XH z+EOjam-hNEN9~}rlWZj=^`=fxI!R5W3*-{{lU{)P z1${-{fVp15O{7}14z-2SR;np^P$g{wWfQ5f^e1^m2$V!Br?#{fttr{UT|;uG9<(u( zjU`9vIr)>6)8}x1qBTIPhExM?8_AWrQ%5KrB?qZG{9*$o+)_L0N*$ndkQzyCXgi8! zBgtN}pf_n7DBDO@k`=8^t79oyOESGiTS3`MYALm%ZKyqz_EJOX28`ncy#XU>EnNeN zWoxOGH^c2KsH>Pt_^Gx8UG0(TjGMxK*TP=2C+(MRM7DTA_%exy&RCwSl!>MgaE z9#MD63ra8P8I2^vsjC!8TqO_bKD|d>pmdQG((LeFAvRX_RuFdBgm&v1fzb!v7F9t+ zrf!Z0;S<+CG`?rgwg4d>A`lPiv~*IU_7Gp_7z^4+k8Ob?Nxm)cG0T+T;54kWzsqfR zp9Ekzy4wICt!v>;&s?2aMo9In(5{{OPM}Y&KKrb+Tm2a?ZeD$xx0ZChVWzP2qsOYO zDQFqJrrP`h%V_6|W{)k_kgX@4_T4c&_ujgVSEgkCwBc*JW?P=6^=h(flGmZ%N9>y9 zFxADvDSTl;xz+h?v1YdKma9p$xtUdMTQcLfegTrCu4dahERfWx7xloxf;0|Xub?!% z|KuNb zFTDb*;7Z<~$1N?^WMySv%g-!-RXaat-LpxX-J`S}M%7wyFeYPCt3y4S?8*GOpYv$H zX?|Oe_D(Om|GbZ@N9S3A6DCYh418z)hXs)vggu=0=+UF2A3uIP`opqk*Yo9T*RH8* ze5XuYYxAbX+WbzZS1HD%@4laYX_>_ai{|^vl^?1dyi~rq@vQmze_WcnykNH4-mT00 zftka89cos*B090?a>UWhhP7sV6-X@9hdS6M6n}B@oqPLFFYkHu4u5{;hT_H8tjlGd zLvG8@NVh+F9Xx3@87?_?UZtPYz<$xCv}(EOc>ezMWfam`%Q}|sk=7+ZPW71No8NR>e$P6 zU)>4ad`{$8R$p8G;ET%>wrLM<|E*uYepjQPkGYY&am}WMdlNGKUiO}J>XVo2y7-)5 zhwZJtD*m4J6Yt+_(>4!ozsO_Oqai2aC6D@NW+#mOrPuThKQ$fusmQVX{pH4;3mghM zAIdJAIkqVOK*07>mSrAGKHPhAXHwiVv-D3_>r8$7^y$8|Hi2jM&)p#mT_ARR<3G#kzRa(AvAl?|uFGz3Yopa!0-x712!H(frw{ zyvEnBts3)AiC)uV2qwtT*@V zS$t&0yOD{S5t7;Br=G!|w`$euLBmEgY{XZ;v|pfH5;stCotrzCYgP<#juSwBnR?oB4GT zHr9JKpf^o96&%~x+(O+kXw=xe!uX`651w7_SXOh!&L)~#B)?BiUcR+D&aCM8VB&In zX3+dq=cdmoSn+=SfJ@fumGg4{xT#q+I<#e)WBa>g+S687IfpUPg{RS^oVlx79D^f6;$f`{UypIuUzi zv8t#je&3W4xkX-PW(8i6PwGyaXQmnajiq{?=j&Z(p34ieF731>6Myj-&_lC!Y|C~f z^T)SzBIAPNtC-bjwlJ}d6RC0b%z2B)VNPdfg^|ZD>uhZA&s3B9Aw8BlTnZ5rG(*JfH+c|asd`o90|oZr)r zBs#>6FRD+jh6cE`KHD&%G+^Yi=1yeU#%CArSj1Wnqu~W#UJC0+-fwLYzu%!Y$?1OX zR1?k0>?WH1{T8{-H7|H-@AGqz&uwqZ7Z&qQ);l8Iu-LFWch1b2GwZFoG^NpPS(z}< zEU=|_%cMDWXzkLmyYn)=29cyTLms);CMVjh_^b-e{lz^#vD2C{K|7V z*FxR=?uzdl-lccfmwoUsD|nPt7FShjXye!AQkxpzE)y{TY4m2r_}|OkY$f-L#tbT1e09m7CB=n3R8z}V?AtCm?dovW+ikzc zk6R~eJMOXFDMhQ~jR6tXcf-t+7981WtC6B>#$;UDX#Umi;{h!{c}9KA`T3Ja*`N15 z%sx8M?3UxSJt^0-J^#wtH>A$H=Qj`GM)2T-ht$pe^iG?(jlL>%oDg}$*Vng5(XnCo z%nr%#-<-FfcH+c|b62kp9$D1u(zOO}q9P+VCSBPSY^mOrBA_kuG2dcAy4)$t442W0*-@AAPxQ&%5PwalIU z&Dh@0tX9-1+huott=xFf;7DobPo;;S%RYZomzG^JL4TuF4)nfHzAjPhs}+^Ruxy|zoM9ICdd z-tCTG`I;A0U$|cxzQ!&i%K84#lCwX{W`Xyl-tjl?I~E5z8(GUOcgt`m94C-*S)ylnEBVSU)+lxy?@ccF3rqi=lmMW zV`hi99XBuk>HS7cu3B|?HSR|o08o^RkHKb%10}OlbF&?`#=5Is%FiagC|EPbbnx8uq6FSMk~qA?9sQszPz5fYw_!l zWfvUF`{lge<3Xt+eyEKUXYo#@_Kav(XWHM4#ea$a&>m$r%ADl8Hm9CrZu7s-ib!Zs NuddmhqrZgK{s*{uok#!x literal 0 HcmV?d00001 diff --git a/example/addons/tiltfive/assets/T5_border_XE.glb.import b/example/addons/tiltfive/assets/T5_border_XE.glb.import new file mode 100644 index 0000000..285d74f --- /dev/null +++ b/example/addons/tiltfive/assets/T5_border_XE.glb.import @@ -0,0 +1,39 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://bvi54sixhguyl" +path="res://.godot/imported/T5_border_XE.glb-8ae44d3d0d11e4f9febaa25582a4baec.scn" + +[deps] + +source_file="res://addons/tiltfive/assets/T5_border_XE.glb" +dest_files=["res://.godot/imported/T5_border_XE.glb-8ae44d3d0d11e4f9febaa25582a4baec.scn"] + +[params] + +nodes/root_type="Node3D" +nodes/root_name="Scene Root" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +import_script/path="" +_subresources={ +"materials": { +"Border Material": { +"use_external/enabled": true, +"use_external/path": "res://addons/tiltfive/assets/materials/T5BorderMat.tres" +} +} +} +gltf/embedded_image_handling=0 diff --git a/example/addons/tiltfive/assets/T5_border_XE_raised.glb b/example/addons/tiltfive/assets/T5_border_XE_raised.glb new file mode 100644 index 0000000000000000000000000000000000000000..9f8392d6fa1e4176d8938f745f58258f6af319d7 GIT binary patch literal 31804 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 rz3HrKM*IJW|K)sCHL%Exe%#>l8 + + + + + + + + + diff --git a/example/addons/tiltfive/assets/board.svg.import b/example/addons/tiltfive/assets/board.svg.import new file mode 100644 index 0000000..131f8eb --- /dev/null +++ b/example/addons/tiltfive/assets/board.svg.import @@ -0,0 +1,37 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://d1k4sti7mydwh" +path="res://.godot/imported/board.svg-ece10245621dedc440b30e3a84647ba9.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/tiltfive/assets/board.svg" +dest_files=["res://.godot/imported/board.svg-ece10245621dedc440b30e3a84647ba9.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 +svg/scale=1.0 +editor/scale_with_editor_scale=false +editor/convert_colors_with_editor_theme=false diff --git a/example/addons/tiltfive/assets/glasses.svg b/example/addons/tiltfive/assets/glasses.svg new file mode 100644 index 0000000..d127c68 --- /dev/null +++ b/example/addons/tiltfive/assets/glasses.svg @@ -0,0 +1,69 @@ + + + + + + + + + + + + + diff --git a/example/addons/tiltfive/assets/glasses.svg.import b/example/addons/tiltfive/assets/glasses.svg.import new file mode 100644 index 0000000..fd92c68 --- /dev/null +++ b/example/addons/tiltfive/assets/glasses.svg.import @@ -0,0 +1,37 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://63xpi03wffd8" +path="res://.godot/imported/glasses.svg-065e492e0e832aaa5619ccaad95c9012.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/tiltfive/assets/glasses.svg" +dest_files=["res://.godot/imported/glasses.svg-065e492e0e832aaa5619ccaad95c9012.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 +svg/scale=1.0 +editor/scale_with_editor_scale=false +editor/convert_colors_with_editor_theme=false diff --git a/example/addons/tiltfive/assets/materials/T5BorderMat.tres b/example/addons/tiltfive/assets/materials/T5BorderMat.tres new file mode 100644 index 0000000..9cdce6d --- /dev/null +++ b/example/addons/tiltfive/assets/materials/T5BorderMat.tres @@ -0,0 +1,6 @@ +[gd_resource type="StandardMaterial3D" load_steps=2 format=3 uid="uid://df4vk6rpxs784"] + +[ext_resource type="Texture2D" uid="uid://b42436tkvdjtj" path="res://addons/tiltfive/assets/materials/T5_border_tex.png" id="1_d1o3y"] + +[resource] +albedo_texture = ExtResource("1_d1o3y") diff --git a/example/addons/tiltfive/assets/materials/T5_border_tex.png b/example/addons/tiltfive/assets/materials/T5_border_tex.png new file mode 100644 index 0000000000000000000000000000000000000000..9e2ff18cad351c12ac2555ac9eed56bfedd1413b GIT binary patch literal 2140 zcmeH}e^k;}AIC35MVjRFtgOgbZF8E6r7oKdDD6}_e;iwy5+W^ZN(!W*kP116TWe7( z&5231rDbAUMNARCY#gP{95xbMsHCLULzbj8e;_*S%jRC+_s}Smgl#@Y=mAHU$6#93lXE5&YVJRctfZ~L{idbQu)(~FkEkD72b;`E~ODMad{MZ4T>kA6_#Ywi0oFP-3X zNKo`brmB)$Pxqc+fp7j0r~GyWoN?-T2vRf>{EPzSO909jpx*`F9|2qqAcY|WS^s?a zpKZy!+>U%i?qoZLT||j)r0@d@H`25oMC@gRXu{6X{Nki`8zix^qP9BsU{z-K@3F7D zyXn*?E44P;WqwGb{u&lj`Ep_chc>e|j>--}X6h-eKV5B z0?iNZiBvp+MvJ#*zM3nYwCI10pbGx%TdL`q>UC~u$Z30!Azph+s4qceufNsc>5`Pk z^uY1R9tLInbJsO`x)0N<7O!qD=Cx~G{52x&_m!V_ugFS`(uD1=rstGORZTgywQI*V zd^EYRrmDLPVwUD*cH4^kXKx*cC2aUM!%D9oGZ+v0TB6=3I&Va{lfz_&Zsv^SX2;?R zg2%nHxl(u&l>gFljKi#`a|8KC-b#F@@%T&w8{2g=IMfM!ZP_=<%~zgW(Oa_mz-%2G zOMcO&h}0EKN_3tH@VppphwFAotU4SxJ3e&%MV<>kE{O|-WSOXWmW`;>5ncNUCDY0N z{{9*Gk;*>A#J3jPbPRMRU?5+9%pr|s3{!xAg8uQaYnwhodc=5eF)5HPW-=+Jr-ea9 zMMcu{w%~e1GOQEUCl-qh@#!*?$@KEoxap;He$Eg-lg|O?xb@JiRnAo@6pCJlPl^uw zQtI$hw%3{YE~VW^B_<14FU*kK&Zo)c^6Oki4+hs)22n@OS|fjgAZo{tvIXe93`(!2 zN!Hrh8ps@Mf9muzAu8G+h^egTCTlQV7+kWn_n0&7kGW7a26wvAY1GgCcxM6naSYK| zP*9+^Mai==+xINwxk(SxE28+B8Y5avqDq z#WDjjn+6FL?|`>>(Y6#jXEhEWc+pRvR08#zcFu-(0phT0?!HO49U!M(HN_B7pryHy zA^_?t`|b7r#g+}x5}ow?#4hmYH{Ps%2U3jn@3c5m2T~m`yYM5L%4M*}-i{Wq^bs?Kk31EyAG$Y| z?ul!?or%i(kNp#(E+mdTf8Ju>q!NSVxInnDU@BPY&4c6Pt(~F>)DGAkt zH4leCczB={-1nw$i&nTEKA$6wEEnJ(j&msduVstL#jGGuQiU#oYlqyivs5y?ToBN@ zW?B+*c#cS4tUk+8T%fK?xl?507j7IqmW|cMH*xFnGQ%kGv$PsF5^7;2z?zJfy$SjU zj-Q}mm`LeE_a^&i+e(gh-Q3^FK3vvJ<+`a;*vamHmY<~|JNb!loxhnRwQow;W3}2l zg1e5a6keKPE8W?Ds+Ve5Tl_`R8|Jllg1hLDc{A~pSHleQo-jM_t$o#W>#~{pS~n5v zXnt*F$$pL#E?tfa+#0$jb7OJyGS4w?qC)E$oqjJYEqrMV7p?=CwoTN{1T03R8AA!O z3Brqp*#qXtD2YzQpL#qrMDwNgaTAcF&AC!h^k+$~c``xO#BZPA`oqVi$_xGfI7s`b Z;WzR}uN_Rug|7=>_m0HamhD;P{|3Nwjf4OI literal 0 HcmV?d00001 diff --git a/example/addons/tiltfive/assets/materials/T5_border_tex.png.import b/example/addons/tiltfive/assets/materials/T5_border_tex.png.import new file mode 100644 index 0000000..9a22f78 --- /dev/null +++ b/example/addons/tiltfive/assets/materials/T5_border_tex.png.import @@ -0,0 +1,36 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://b42436tkvdjtj" +path.s3tc="res://.godot/imported/T5_border_tex.png-f817ec4f59697917c96dd8c9cdc0b494.s3tc.ctex" +metadata={ +"imported_formats": ["s3tc_bptc"], +"vram_texture": true +} +generator_parameters={} + +[deps] + +source_file="res://addons/tiltfive/assets/materials/T5_border_tex.png" +dest_files=["res://.godot/imported/T5_border_tex.png-f817ec4f59697917c96dd8c9cdc0b494.s3tc.ctex"] + +[params] + +compress/mode=2 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=true +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=0 diff --git a/example/addons/tiltfive/plugin.cfg b/example/addons/tiltfive/plugin.cfg new file mode 100644 index 0000000..661a0b3 --- /dev/null +++ b/example/addons/tiltfive/plugin.cfg @@ -0,0 +1,7 @@ +[plugin] + +name="Tilt Five" +description="Support for the Tilt Five XR headset" +author="Patrick Down" +version="1.0.0" +script="plugin.gd" diff --git a/example/addons/tiltfive/plugin.gd b/example/addons/tiltfive/plugin.gd new file mode 100644 index 0000000..942637c --- /dev/null +++ b/example/addons/tiltfive/plugin.gd @@ -0,0 +1,23 @@ +@tool +extends EditorPlugin + +static var _initialized := false + +func _setup(): + if not _initialized: + #add_custom_type("T5Manager", "Node", preload("res://addons/tiltfive/T5Manager.gd"), preload("res://addons/tiltfive/assets/glasses.svg")) + add_autoload_singleton("T5Interface", "res://addons/tiltfive/T5Interface.gd") + _initialized = true + +func _enter_tree(): + T5ProjectSettings.setup_properties() + _setup() + +func _enable_plugin(): + _setup() + +func _disable_plugin(): + if _initialized: + #remove_custom_type("T5Manager") + remove_autoload_singleton("T5Interface") + diff --git a/example/addons/tiltfive/scenes/T5GlassesBase.gd b/example/addons/tiltfive/scenes/T5GlassesBase.gd index 9726117..cfeb497 100644 --- a/example/addons/tiltfive/scenes/T5GlassesBase.gd +++ b/example/addons/tiltfive/scenes/T5GlassesBase.gd @@ -1,4 +1,4 @@ -extends SubViewport +class_name T5GlassesBase extends SubViewport @onready var wand = $Origin/Wand_1 diff --git a/example/addons/tiltfive/scenes/T5GlassesBase.tscn b/example/addons/tiltfive/scenes/T5GlassesBase.tscn index 2fff38b..5da1db5 100644 --- a/example/addons/tiltfive/scenes/T5GlassesBase.tscn +++ b/example/addons/tiltfive/scenes/T5GlassesBase.tscn @@ -1,11 +1,11 @@ [gd_scene load_steps=2 format=3 uid="uid://je0clrdu7o76"] -[ext_resource type="Script" path="res://addons/tiltfive/scenes/T5GlassesBase.gd" id="1_ra3f6"] +[ext_resource type="Script" path="res://addons/tiltfive/scenes/T5GlassesBase.gd" id="1_tymyw"] [node name="T5GlassesBase" type="SubViewport"] size = Vector2i(2, 2) render_target_update_mode = 0 -script = ExtResource("1_ra3f6") +script = ExtResource("1_tymyw") [node name="Origin" type="T5Origin3D" parent="."] diff --git a/example/addons/tiltfive/tiltfive.gdextension b/example/addons/tiltfive/tiltfive.gdextension index fb10e68..4277612 100644 --- a/example/addons/tiltfive/tiltfive.gdextension +++ b/example/addons/tiltfive/tiltfive.gdextension @@ -3,6 +3,9 @@ entry_symbol = "tiltfive_library_init" compatibility_minimum = "4.1.0" +[icons] +T5Gameboard = "res://addons/tiltfive/assets/board.svg" + [libraries] windows.x86_64.debug = "res://addons/tiltfive/bin/libgdtiltfive.windows.template_debug.x86_64.dll" diff --git a/example/main.gd b/example/main.gd index ea4a90d..880e6ec 100644 --- a/example/main.gd +++ b/example/main.gd @@ -1,2 +1,7 @@ extends Node3D +func _on_t5_manager_glasses_scene_was_added(glasses): + print("Scene ", glasses.name, " added") + +func _on_t5_manager_glasses_scene_will_be_removed(glasses): + print("Scene ", glasses.name, " removed") diff --git a/example/main.tscn b/example/main.tscn index 2cfdf95..19c9256 100644 --- a/example/main.tscn +++ b/example/main.tscn @@ -1,9 +1,9 @@ [gd_scene load_steps=17 format=3 uid="uid://ckbe6draoen0x"] -[ext_resource type="Script" path="res://main.gd" id="1_ptcg0"] +[ext_resource type="Script" path="res://main.gd" id="1_xvgge"] [ext_resource type="Script" path="res://addons/tiltfive/T5Manager.gd" id="2_dibvp"] +[ext_resource type="PackedScene" uid="uid://dl3mv76qkuscf" path="res://T5Glasses.tscn" id="3_i6xar"] [ext_resource type="Script" path="res://addons/tiltfive/scenes/helpers/SelectableBody.gd" id="3_jespo"] -[ext_resource type="PackedScene" uid="uid://dl3mv76qkuscf" path="res://T5Glasses.tscn" id="3_xx6p7"] [ext_resource type="Material" uid="uid://blq3i2qbhoyum" path="res://addons/tiltfive/materials/highlight_overlay_material.tres" id="5_cq8r1"] [sub_resource type="BoxMesh" id="BoxMesh_gbwc2"] @@ -35,11 +35,15 @@ albedo_color = Color(0.862745, 0, 0.0235294, 1) albedo_color = Color(0.741176, 0, 0.686275, 1) [node name="Main" type="Node3D"] -script = ExtResource("1_ptcg0") +script = ExtResource("1_xvgge") -[node name="T5Manager" type="Node" parent="."] +[node name="T5Manager" type="Node" parent="." node_paths=PackedStringArray("start_location")] script = ExtResource("2_dibvp") -glasses_scene = ExtResource("3_xx6p7") +glasses_scene = ExtResource("3_i6xar") +start_location = NodePath("../T5Gameboard") + +[node name="T5Gameboard" type="T5Gameboard" parent="."] +content_scale = 16.0 [node name="DirectionalLight3D" type="DirectionalLight3D" parent="."] transform = Transform3D(0.952497, -0.0534809, 0.299816, -0.283211, 0.206458, 0.936572, -0.111988, -0.976993, 0.181504, 2.31774, 1.62798, 0) diff --git a/example/openxr_action_map.tres b/example/openxr_action_map.tres deleted file mode 100644 index 49e8894..0000000 --- a/example/openxr_action_map.tres +++ /dev/null @@ -1,826 +0,0 @@ -[gd_resource type="OpenXRActionMap" load_steps=195 format=3 uid="uid://cjxvj4v2q54a5"] - -[sub_resource type="OpenXRAction" id="OpenXRAction_qhy06"] -resource_name = "trigger" -localized_name = "Trigger" -toplevel_paths = PackedStringArray("/user/hand/left", "/user/hand/right") - -[sub_resource type="OpenXRAction" id="OpenXRAction_2vwe0"] -resource_name = "trigger_click" -localized_name = "Trigger click" -action_type = 0 -toplevel_paths = PackedStringArray("/user/hand/left", "/user/hand/right") - -[sub_resource type="OpenXRAction" id="OpenXRAction_gpqeh"] -resource_name = "trigger_touch" -localized_name = "Trigger touching" -action_type = 0 -toplevel_paths = PackedStringArray("/user/hand/left", "/user/hand/right") - -[sub_resource type="OpenXRAction" id="OpenXRAction_473o0"] -resource_name = "grip" -localized_name = "Grip" -toplevel_paths = PackedStringArray("/user/hand/left", "/user/hand/right") - -[sub_resource type="OpenXRAction" id="OpenXRAction_8qgll"] -resource_name = "grip_click" -localized_name = "Grip click" -action_type = 0 -toplevel_paths = PackedStringArray("/user/hand/left", "/user/hand/right") - -[sub_resource type="OpenXRAction" id="OpenXRAction_kmk80"] -resource_name = "grip_touch" -localized_name = "Grip touching" -action_type = 0 -toplevel_paths = PackedStringArray("/user/hand/left", "/user/hand/right") - -[sub_resource type="OpenXRAction" id="OpenXRAction_rhxy5"] -resource_name = "primary" -localized_name = "Primary joystick/thumbstick/trackpad" -action_type = 2 -toplevel_paths = PackedStringArray("/user/hand/left", "/user/hand/right") - -[sub_resource type="OpenXRAction" id="OpenXRAction_sxg5f"] -resource_name = "primary_click" -localized_name = "Primary joystick/thumbstick/trackpad click" -action_type = 0 -toplevel_paths = PackedStringArray("/user/hand/left", "/user/hand/right") - -[sub_resource type="OpenXRAction" id="OpenXRAction_3rri5"] -resource_name = "primary_touch" -localized_name = "Primary joystick/thumbstick/trackpad touching" -action_type = 0 -toplevel_paths = PackedStringArray("/user/hand/left", "/user/hand/right") - -[sub_resource type="OpenXRAction" id="OpenXRAction_53byk"] -resource_name = "secondary" -localized_name = "Secondary joystick/thumbstick/trackpad" -action_type = 2 -toplevel_paths = PackedStringArray("/user/hand/left", "/user/hand/right") - -[sub_resource type="OpenXRAction" id="OpenXRAction_bkd5n"] -resource_name = "secondary_click" -localized_name = "Secondary joystick/thumbstick/trackpad click" -action_type = 0 -toplevel_paths = PackedStringArray("/user/hand/left", "/user/hand/right") - -[sub_resource type="OpenXRAction" id="OpenXRAction_mkk7a"] -resource_name = "secondary_touch" -localized_name = "Secondary joystick/thumbstick/trackpad touching" -action_type = 0 -toplevel_paths = PackedStringArray("/user/hand/left", "/user/hand/right") - -[sub_resource type="OpenXRAction" id="OpenXRAction_4uh4f"] -resource_name = "menu_button" -localized_name = "Menu button" -action_type = 0 -toplevel_paths = PackedStringArray("/user/hand/left", "/user/hand/right") - -[sub_resource type="OpenXRAction" id="OpenXRAction_83w55"] -resource_name = "select_button" -localized_name = "Select button" -action_type = 0 -toplevel_paths = PackedStringArray("/user/hand/left", "/user/hand/right") - -[sub_resource type="OpenXRAction" id="OpenXRAction_0sqj6"] -resource_name = "ax_button" -localized_name = "A/X button" -action_type = 0 -toplevel_paths = PackedStringArray("/user/hand/left", "/user/hand/right") - -[sub_resource type="OpenXRAction" id="OpenXRAction_3tdc8"] -resource_name = "ax_touch" -localized_name = "A/X touching" -action_type = 0 -toplevel_paths = PackedStringArray("/user/hand/left", "/user/hand/right") - -[sub_resource type="OpenXRAction" id="OpenXRAction_tblbd"] -resource_name = "by_button" -localized_name = "B/Y button" -action_type = 0 -toplevel_paths = PackedStringArray("/user/hand/left", "/user/hand/right") - -[sub_resource type="OpenXRAction" id="OpenXRAction_fayqd"] -resource_name = "by_touch" -localized_name = "B/Y touching" -action_type = 0 -toplevel_paths = PackedStringArray("/user/hand/left", "/user/hand/right") - -[sub_resource type="OpenXRAction" id="OpenXRAction_mj02j"] -resource_name = "default_pose" -localized_name = "Default pose" -action_type = 3 -toplevel_paths = PackedStringArray("/user/hand/left", "/user/hand/right", "/user/vive_tracker_htcx/role/left_foot", "/user/vive_tracker_htcx/role/right_foot", "/user/vive_tracker_htcx/role/left_shoulder", "/user/vive_tracker_htcx/role/right_shoulder", "/user/vive_tracker_htcx/role/left_elbow", "/user/vive_tracker_htcx/role/right_elbow", "/user/vive_tracker_htcx/role/left_knee", "/user/vive_tracker_htcx/role/right_knee", "/user/vive_tracker_htcx/role/waist", "/user/vive_tracker_htcx/role/chest", "/user/vive_tracker_htcx/role/camera", "/user/vive_tracker_htcx/role/keyboard") - -[sub_resource type="OpenXRAction" id="OpenXRAction_x4afo"] -resource_name = "aim_pose" -localized_name = "Aim pose" -action_type = 3 -toplevel_paths = PackedStringArray("/user/hand/left", "/user/hand/right") - -[sub_resource type="OpenXRAction" id="OpenXRAction_ffdsq"] -resource_name = "grip_pose" -localized_name = "Grip pose" -action_type = 3 -toplevel_paths = PackedStringArray("/user/hand/left", "/user/hand/right") - -[sub_resource type="OpenXRAction" id="OpenXRAction_80sg0"] -resource_name = "palm_pose" -localized_name = "Palm pose" -action_type = 3 -toplevel_paths = PackedStringArray("/user/hand/left", "/user/hand/right") - -[sub_resource type="OpenXRAction" id="OpenXRAction_5os4r"] -resource_name = "haptic" -localized_name = "Haptic" -action_type = 4 -toplevel_paths = PackedStringArray("/user/hand/left", "/user/hand/right", "/user/vive_tracker_htcx/role/left_foot", "/user/vive_tracker_htcx/role/right_foot", "/user/vive_tracker_htcx/role/left_shoulder", "/user/vive_tracker_htcx/role/right_shoulder", "/user/vive_tracker_htcx/role/left_elbow", "/user/vive_tracker_htcx/role/right_elbow", "/user/vive_tracker_htcx/role/left_knee", "/user/vive_tracker_htcx/role/right_knee", "/user/vive_tracker_htcx/role/waist", "/user/vive_tracker_htcx/role/chest", "/user/vive_tracker_htcx/role/camera", "/user/vive_tracker_htcx/role/keyboard") - -[sub_resource type="OpenXRActionSet" id="OpenXRActionSet_dlwup"] -resource_name = "godot" -localized_name = "Godot action set" -actions = [SubResource("OpenXRAction_qhy06"), SubResource("OpenXRAction_2vwe0"), SubResource("OpenXRAction_gpqeh"), SubResource("OpenXRAction_473o0"), SubResource("OpenXRAction_8qgll"), SubResource("OpenXRAction_kmk80"), SubResource("OpenXRAction_rhxy5"), SubResource("OpenXRAction_sxg5f"), SubResource("OpenXRAction_3rri5"), SubResource("OpenXRAction_53byk"), SubResource("OpenXRAction_bkd5n"), SubResource("OpenXRAction_mkk7a"), SubResource("OpenXRAction_4uh4f"), SubResource("OpenXRAction_83w55"), SubResource("OpenXRAction_0sqj6"), SubResource("OpenXRAction_3tdc8"), SubResource("OpenXRAction_tblbd"), SubResource("OpenXRAction_fayqd"), SubResource("OpenXRAction_mj02j"), SubResource("OpenXRAction_x4afo"), SubResource("OpenXRAction_ffdsq"), SubResource("OpenXRAction_80sg0"), SubResource("OpenXRAction_5os4r")] - -[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_im411"] -action = SubResource("OpenXRAction_mj02j") -paths = PackedStringArray("/user/hand/left/input/aim/pose", "/user/hand/right/input/aim/pose") - -[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_wdvxs"] -action = SubResource("OpenXRAction_x4afo") -paths = PackedStringArray("/user/hand/left/input/aim/pose", "/user/hand/right/input/aim/pose") - -[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_cahdc"] -action = SubResource("OpenXRAction_ffdsq") -paths = PackedStringArray("/user/hand/left/input/grip/pose", "/user/hand/right/input/grip/pose") - -[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_voxcd"] -action = SubResource("OpenXRAction_80sg0") -paths = PackedStringArray("/user/hand/left/input/palm_ext/pose", "/user/hand/right/input/palm_ext/pose") - -[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_rh512"] -action = SubResource("OpenXRAction_4uh4f") -paths = PackedStringArray("/user/hand/left/input/menu/click", "/user/hand/right/input/menu/click") - -[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_v45m1"] -action = SubResource("OpenXRAction_83w55") -paths = PackedStringArray("/user/hand/left/input/select/click", "/user/hand/right/input/select/click") - -[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_gpprf"] -action = SubResource("OpenXRAction_5os4r") -paths = PackedStringArray("/user/hand/left/output/haptic", "/user/hand/right/output/haptic") - -[sub_resource type="OpenXRInteractionProfile" id="OpenXRInteractionProfile_n4f80"] -interaction_profile_path = "/interaction_profiles/khr/simple_controller" -bindings = [SubResource("OpenXRIPBinding_im411"), SubResource("OpenXRIPBinding_wdvxs"), SubResource("OpenXRIPBinding_cahdc"), SubResource("OpenXRIPBinding_voxcd"), SubResource("OpenXRIPBinding_rh512"), SubResource("OpenXRIPBinding_v45m1"), SubResource("OpenXRIPBinding_gpprf")] - -[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_kpvac"] -action = SubResource("OpenXRAction_mj02j") -paths = PackedStringArray("/user/hand/left/input/aim/pose", "/user/hand/right/input/aim/pose") - -[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_8kp18"] -action = SubResource("OpenXRAction_x4afo") -paths = PackedStringArray("/user/hand/left/input/aim/pose", "/user/hand/right/input/aim/pose") - -[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_bxlun"] -action = SubResource("OpenXRAction_ffdsq") -paths = PackedStringArray("/user/hand/left/input/grip/pose", "/user/hand/right/input/grip/pose") - -[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_se4e1"] -action = SubResource("OpenXRAction_80sg0") -paths = PackedStringArray("/user/hand/left/input/palm_ext/pose", "/user/hand/right/input/palm_ext/pose") - -[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_lnjyf"] -action = SubResource("OpenXRAction_4uh4f") -paths = PackedStringArray("/user/hand/left/input/menu/click", "/user/hand/right/input/menu/click") - -[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_5sqy5"] -action = SubResource("OpenXRAction_83w55") -paths = PackedStringArray("/user/hand/left/input/system/click", "/user/hand/right/input/system/click") - -[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_qs7ua"] -action = SubResource("OpenXRAction_qhy06") -paths = PackedStringArray("/user/hand/left/input/trigger/value", "/user/hand/right/input/trigger/value") - -[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_q86v7"] -action = SubResource("OpenXRAction_2vwe0") -paths = PackedStringArray("/user/hand/left/input/trigger/click", "/user/hand/right/input/trigger/click") - -[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_cnyj6"] -action = SubResource("OpenXRAction_473o0") -paths = PackedStringArray("/user/hand/left/input/squeeze/click", "/user/hand/right/input/squeeze/click") - -[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_jlsfx"] -action = SubResource("OpenXRAction_8qgll") -paths = PackedStringArray("/user/hand/left/input/squeeze/click", "/user/hand/right/input/squeeze/click") - -[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_2wfqp"] -action = SubResource("OpenXRAction_rhxy5") -paths = PackedStringArray("/user/hand/left/input/trackpad", "/user/hand/right/input/trackpad") - -[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_gf5ct"] -action = SubResource("OpenXRAction_sxg5f") -paths = PackedStringArray("/user/hand/left/input/trackpad/click", "/user/hand/right/input/trackpad/click") - -[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_fpm1i"] -action = SubResource("OpenXRAction_3rri5") -paths = PackedStringArray("/user/hand/left/input/trackpad/touch", "/user/hand/right/input/trackpad/touch") - -[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_xyyt2"] -action = SubResource("OpenXRAction_5os4r") -paths = PackedStringArray("/user/hand/left/output/haptic", "/user/hand/right/output/haptic") - -[sub_resource type="OpenXRInteractionProfile" id="OpenXRInteractionProfile_om27o"] -interaction_profile_path = "/interaction_profiles/htc/vive_controller" -bindings = [SubResource("OpenXRIPBinding_kpvac"), SubResource("OpenXRIPBinding_8kp18"), SubResource("OpenXRIPBinding_bxlun"), SubResource("OpenXRIPBinding_se4e1"), SubResource("OpenXRIPBinding_lnjyf"), SubResource("OpenXRIPBinding_5sqy5"), SubResource("OpenXRIPBinding_qs7ua"), SubResource("OpenXRIPBinding_q86v7"), SubResource("OpenXRIPBinding_cnyj6"), SubResource("OpenXRIPBinding_jlsfx"), SubResource("OpenXRIPBinding_2wfqp"), SubResource("OpenXRIPBinding_gf5ct"), SubResource("OpenXRIPBinding_fpm1i"), SubResource("OpenXRIPBinding_xyyt2")] - -[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_8bitt"] -action = SubResource("OpenXRAction_mj02j") -paths = PackedStringArray("/user/hand/left/input/aim/pose", "/user/hand/right/input/aim/pose") - -[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_4jso0"] -action = SubResource("OpenXRAction_x4afo") -paths = PackedStringArray("/user/hand/left/input/aim/pose", "/user/hand/right/input/aim/pose") - -[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_jt3hh"] -action = SubResource("OpenXRAction_ffdsq") -paths = PackedStringArray("/user/hand/left/input/grip/pose", "/user/hand/right/input/grip/pose") - -[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_0kdv5"] -action = SubResource("OpenXRAction_80sg0") -paths = PackedStringArray("/user/hand/left/input/palm_ext/pose", "/user/hand/right/input/palm_ext/pose") - -[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_3ueik"] -action = SubResource("OpenXRAction_4uh4f") -paths = PackedStringArray("/user/hand/left/input/menu/click", "/user/hand/right/input/menu/click") - -[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_sdi8m"] -action = SubResource("OpenXRAction_qhy06") -paths = PackedStringArray("/user/hand/left/input/trigger/value", "/user/hand/right/input/trigger/value") - -[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_3s0mv"] -action = SubResource("OpenXRAction_2vwe0") -paths = PackedStringArray("/user/hand/left/input/trigger/value", "/user/hand/right/input/trigger/value") - -[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_k1tdu"] -action = SubResource("OpenXRAction_473o0") -paths = PackedStringArray("/user/hand/left/input/squeeze/click", "/user/hand/right/input/squeeze/click") - -[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_bf5r6"] -action = SubResource("OpenXRAction_8qgll") -paths = PackedStringArray("/user/hand/left/input/squeeze/click", "/user/hand/right/input/squeeze/click") - -[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_2fqvs"] -action = SubResource("OpenXRAction_rhxy5") -paths = PackedStringArray("/user/hand/left/input/thumbstick", "/user/hand/right/input/thumbstick") - -[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_id70d"] -action = SubResource("OpenXRAction_sxg5f") -paths = PackedStringArray("/user/hand/left/input/thumbstick/click", "/user/hand/right/input/thumbstick/click") - -[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_kuadv"] -action = SubResource("OpenXRAction_53byk") -paths = PackedStringArray("/user/hand/left/input/trackpad", "/user/hand/right/input/trackpad") - -[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_vc3mt"] -action = SubResource("OpenXRAction_bkd5n") -paths = PackedStringArray("/user/hand/left/input/trackpad/click", "/user/hand/right/input/trackpad/click") - -[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_v06u4"] -action = SubResource("OpenXRAction_mkk7a") -paths = PackedStringArray("/user/hand/left/input/trackpad/touch", "/user/hand/right/input/trackpad/touch") - -[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_n3wd8"] -action = SubResource("OpenXRAction_5os4r") -paths = PackedStringArray("/user/hand/left/output/haptic", "/user/hand/right/output/haptic") - -[sub_resource type="OpenXRInteractionProfile" id="OpenXRInteractionProfile_tk604"] -interaction_profile_path = "/interaction_profiles/microsoft/motion_controller" -bindings = [SubResource("OpenXRIPBinding_8bitt"), SubResource("OpenXRIPBinding_4jso0"), SubResource("OpenXRIPBinding_jt3hh"), SubResource("OpenXRIPBinding_0kdv5"), SubResource("OpenXRIPBinding_3ueik"), SubResource("OpenXRIPBinding_sdi8m"), SubResource("OpenXRIPBinding_3s0mv"), SubResource("OpenXRIPBinding_k1tdu"), SubResource("OpenXRIPBinding_bf5r6"), SubResource("OpenXRIPBinding_2fqvs"), SubResource("OpenXRIPBinding_id70d"), SubResource("OpenXRIPBinding_kuadv"), SubResource("OpenXRIPBinding_vc3mt"), SubResource("OpenXRIPBinding_v06u4"), SubResource("OpenXRIPBinding_n3wd8")] - -[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_mqkht"] -action = SubResource("OpenXRAction_mj02j") -paths = PackedStringArray("/user/hand/left/input/aim/pose", "/user/hand/right/input/aim/pose") - -[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_s7gwf"] -action = SubResource("OpenXRAction_x4afo") -paths = PackedStringArray("/user/hand/left/input/aim/pose", "/user/hand/right/input/aim/pose") - -[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_d44wu"] -action = SubResource("OpenXRAction_ffdsq") -paths = PackedStringArray("/user/hand/left/input/grip/pose", "/user/hand/right/input/grip/pose") - -[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_2xbfe"] -action = SubResource("OpenXRAction_80sg0") -paths = PackedStringArray("/user/hand/left/input/palm_ext/pose", "/user/hand/right/input/palm_ext/pose") - -[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_yrexh"] -action = SubResource("OpenXRAction_4uh4f") -paths = PackedStringArray("/user/hand/left/input/menu/click", "/user/hand/right/input/system/click") - -[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_co5wb"] -action = SubResource("OpenXRAction_0sqj6") -paths = PackedStringArray("/user/hand/left/input/x/click", "/user/hand/right/input/a/click") - -[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_svkea"] -action = SubResource("OpenXRAction_3tdc8") -paths = PackedStringArray("/user/hand/left/input/x/touch", "/user/hand/right/input/a/touch") - -[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_tqkga"] -action = SubResource("OpenXRAction_tblbd") -paths = PackedStringArray("/user/hand/left/input/y/click", "/user/hand/right/input/b/click") - -[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_36qfl"] -action = SubResource("OpenXRAction_fayqd") -paths = PackedStringArray("/user/hand/left/input/y/touch", "/user/hand/right/input/b/touch") - -[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_5fhs4"] -action = SubResource("OpenXRAction_qhy06") -paths = PackedStringArray("/user/hand/left/input/trigger/value", "/user/hand/right/input/trigger/value") - -[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_jgdy4"] -action = SubResource("OpenXRAction_2vwe0") -paths = PackedStringArray("/user/hand/left/input/trigger/value", "/user/hand/right/input/trigger/value") - -[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_tl1gn"] -action = SubResource("OpenXRAction_gpqeh") -paths = PackedStringArray("/user/hand/left/input/trigger/touch", "/user/hand/right/input/trigger/touch") - -[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_afswg"] -action = SubResource("OpenXRAction_473o0") -paths = PackedStringArray("/user/hand/left/input/squeeze/value", "/user/hand/right/input/squeeze/value") - -[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_tv4sh"] -action = SubResource("OpenXRAction_8qgll") -paths = PackedStringArray("/user/hand/left/input/squeeze/value", "/user/hand/right/input/squeeze/value") - -[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_v3n7r"] -action = SubResource("OpenXRAction_rhxy5") -paths = PackedStringArray("/user/hand/left/input/thumbstick", "/user/hand/right/input/thumbstick") - -[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_3cy0f"] -action = SubResource("OpenXRAction_sxg5f") -paths = PackedStringArray("/user/hand/left/input/thumbstick/click", "/user/hand/right/input/thumbstick/click") - -[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_y5rl5"] -action = SubResource("OpenXRAction_3rri5") -paths = PackedStringArray("/user/hand/left/input/thumbstick/touch", "/user/hand/right/input/thumbstick/touch") - -[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_nlre4"] -action = SubResource("OpenXRAction_5os4r") -paths = PackedStringArray("/user/hand/left/output/haptic", "/user/hand/right/output/haptic") - -[sub_resource type="OpenXRInteractionProfile" id="OpenXRInteractionProfile_kc40e"] -interaction_profile_path = "/interaction_profiles/oculus/touch_controller" -bindings = [SubResource("OpenXRIPBinding_mqkht"), SubResource("OpenXRIPBinding_s7gwf"), SubResource("OpenXRIPBinding_d44wu"), SubResource("OpenXRIPBinding_2xbfe"), SubResource("OpenXRIPBinding_yrexh"), SubResource("OpenXRIPBinding_co5wb"), SubResource("OpenXRIPBinding_svkea"), SubResource("OpenXRIPBinding_tqkga"), SubResource("OpenXRIPBinding_36qfl"), SubResource("OpenXRIPBinding_5fhs4"), SubResource("OpenXRIPBinding_jgdy4"), SubResource("OpenXRIPBinding_tl1gn"), SubResource("OpenXRIPBinding_afswg"), SubResource("OpenXRIPBinding_tv4sh"), SubResource("OpenXRIPBinding_v3n7r"), SubResource("OpenXRIPBinding_3cy0f"), SubResource("OpenXRIPBinding_y5rl5"), SubResource("OpenXRIPBinding_nlre4")] - -[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_52qkv"] -action = SubResource("OpenXRAction_mj02j") -paths = PackedStringArray("/user/hand/left/input/aim/pose", "/user/hand/right/input/aim/pose") - -[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_jrcjr"] -action = SubResource("OpenXRAction_x4afo") -paths = PackedStringArray("/user/hand/left/input/aim/pose", "/user/hand/right/input/aim/pose") - -[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_3lqo4"] -action = SubResource("OpenXRAction_ffdsq") -paths = PackedStringArray("/user/hand/left/input/grip/pose", "/user/hand/right/input/grip/pose") - -[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_q6f46"] -action = SubResource("OpenXRAction_80sg0") -paths = PackedStringArray("/user/hand/left/input/palm_ext/pose", "/user/hand/right/input/palm_ext/pose") - -[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_xbac3"] -action = SubResource("OpenXRAction_83w55") -paths = PackedStringArray("/user/hand/left/input/system/click", "/user/hand/right/input/system/click") - -[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_ugijx"] -action = SubResource("OpenXRAction_4uh4f") -paths = PackedStringArray("/user/hand/left/input/back/click", "/user/hand/right/input/back/click") - -[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_c6e0h"] -action = SubResource("OpenXRAction_0sqj6") -paths = PackedStringArray("/user/hand/left/input/x/click", "/user/hand/right/input/a/click") - -[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_if48k"] -action = SubResource("OpenXRAction_3tdc8") -paths = PackedStringArray("/user/hand/left/input/x/touch", "/user/hand/right/input/a/touch") - -[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_t12aj"] -action = SubResource("OpenXRAction_tblbd") -paths = PackedStringArray("/user/hand/left/input/y/click", "/user/hand/right/input/b/click") - -[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_as3e6"] -action = SubResource("OpenXRAction_fayqd") -paths = PackedStringArray("/user/hand/left/input/y/touch", "/user/hand/right/input/b/touch") - -[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_g834v"] -action = SubResource("OpenXRAction_qhy06") -paths = PackedStringArray("/user/hand/left/input/trigger/value", "/user/hand/right/input/trigger/value") - -[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_fosu3"] -action = SubResource("OpenXRAction_2vwe0") -paths = PackedStringArray("/user/hand/left/input/trigger/value", "/user/hand/right/input/trigger/value") - -[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_kfw8l"] -action = SubResource("OpenXRAction_gpqeh") -paths = PackedStringArray("/user/hand/left/input/trigger/touch", "/user/hand/right/input/trigger/touch") - -[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_741bj"] -action = SubResource("OpenXRAction_473o0") -paths = PackedStringArray("/user/hand/left/input/squeeze/value", "/user/hand/right/input/squeeze/value") - -[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_224bn"] -action = SubResource("OpenXRAction_8qgll") -paths = PackedStringArray("/user/hand/left/input/squeeze/value", "/user/hand/right/input/squeeze/value") - -[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_dpx87"] -action = SubResource("OpenXRAction_rhxy5") -paths = PackedStringArray("/user/hand/left/input/thumbstick", "/user/hand/right/input/thumbstick") - -[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_gr54n"] -action = SubResource("OpenXRAction_sxg5f") -paths = PackedStringArray("/user/hand/left/input/thumbstick/click", "/user/hand/right/input/thumbstick/click") - -[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_mjqra"] -action = SubResource("OpenXRAction_3rri5") -paths = PackedStringArray("/user/hand/left/input/thumbstick/touch", "/user/hand/right/input/thumbstick/touch") - -[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_uunaw"] -action = SubResource("OpenXRAction_5os4r") -paths = PackedStringArray("/user/hand/left/output/haptic", "/user/hand/right/output/haptic") - -[sub_resource type="OpenXRInteractionProfile" id="OpenXRInteractionProfile_ammxl"] -interaction_profile_path = "/interaction_profiles/pico/neo3_controller" -bindings = [SubResource("OpenXRIPBinding_52qkv"), SubResource("OpenXRIPBinding_jrcjr"), SubResource("OpenXRIPBinding_3lqo4"), SubResource("OpenXRIPBinding_q6f46"), SubResource("OpenXRIPBinding_xbac3"), SubResource("OpenXRIPBinding_ugijx"), SubResource("OpenXRIPBinding_c6e0h"), SubResource("OpenXRIPBinding_if48k"), SubResource("OpenXRIPBinding_t12aj"), SubResource("OpenXRIPBinding_as3e6"), SubResource("OpenXRIPBinding_g834v"), SubResource("OpenXRIPBinding_fosu3"), SubResource("OpenXRIPBinding_kfw8l"), SubResource("OpenXRIPBinding_741bj"), SubResource("OpenXRIPBinding_224bn"), SubResource("OpenXRIPBinding_dpx87"), SubResource("OpenXRIPBinding_gr54n"), SubResource("OpenXRIPBinding_mjqra"), SubResource("OpenXRIPBinding_uunaw")] - -[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_s0c47"] -action = SubResource("OpenXRAction_mj02j") -paths = PackedStringArray("/user/hand/left/input/aim/pose", "/user/hand/right/input/aim/pose") - -[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_2rykr"] -action = SubResource("OpenXRAction_x4afo") -paths = PackedStringArray("/user/hand/left/input/aim/pose", "/user/hand/right/input/aim/pose") - -[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_3apyd"] -action = SubResource("OpenXRAction_ffdsq") -paths = PackedStringArray("/user/hand/left/input/grip/pose", "/user/hand/right/input/grip/pose") - -[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_ec4nm"] -action = SubResource("OpenXRAction_80sg0") -paths = PackedStringArray("/user/hand/left/input/palm_ext/pose", "/user/hand/right/input/palm_ext/pose") - -[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_teed4"] -action = SubResource("OpenXRAction_4uh4f") -paths = PackedStringArray("/user/hand/left/input/system/click", "/user/hand/right/input/system/click") - -[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_c1jsm"] -action = SubResource("OpenXRAction_0sqj6") -paths = PackedStringArray("/user/hand/left/input/a/click", "/user/hand/right/input/a/click") - -[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_i31ov"] -action = SubResource("OpenXRAction_3tdc8") -paths = PackedStringArray("/user/hand/left/input/a/touch", "/user/hand/right/input/a/touch") - -[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_a5dot"] -action = SubResource("OpenXRAction_tblbd") -paths = PackedStringArray("/user/hand/left/input/b/click", "/user/hand/right/input/b/click") - -[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_sy7to"] -action = SubResource("OpenXRAction_fayqd") -paths = PackedStringArray("/user/hand/left/input/b/touch", "/user/hand/right/input/b/touch") - -[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_7onrj"] -action = SubResource("OpenXRAction_qhy06") -paths = PackedStringArray("/user/hand/left/input/trigger/value", "/user/hand/right/input/trigger/value") - -[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_75ykv"] -action = SubResource("OpenXRAction_2vwe0") -paths = PackedStringArray("/user/hand/left/input/trigger/click", "/user/hand/right/input/trigger/click") - -[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_0l2lu"] -action = SubResource("OpenXRAction_gpqeh") -paths = PackedStringArray("/user/hand/left/input/trigger/touch", "/user/hand/right/input/trigger/touch") - -[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_n0kql"] -action = SubResource("OpenXRAction_473o0") -paths = PackedStringArray("/user/hand/left/input/squeeze/value", "/user/hand/right/input/squeeze/value") - -[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_pxnyh"] -action = SubResource("OpenXRAction_8qgll") -paths = PackedStringArray("/user/hand/left/input/squeeze/value", "/user/hand/right/input/squeeze/value") - -[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_wlbel"] -action = SubResource("OpenXRAction_rhxy5") -paths = PackedStringArray("/user/hand/left/input/thumbstick", "/user/hand/right/input/thumbstick") - -[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_k58ue"] -action = SubResource("OpenXRAction_sxg5f") -paths = PackedStringArray("/user/hand/left/input/thumbstick/click", "/user/hand/right/input/thumbstick/click") - -[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_i5msy"] -action = SubResource("OpenXRAction_3rri5") -paths = PackedStringArray("/user/hand/left/input/thumbstick/touch", "/user/hand/right/input/thumbstick/touch") - -[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_rhs2g"] -action = SubResource("OpenXRAction_53byk") -paths = PackedStringArray("/user/hand/left/input/trackpad", "/user/hand/right/input/trackpad") - -[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_xrpmw"] -action = SubResource("OpenXRAction_bkd5n") -paths = PackedStringArray("/user/hand/left/input/trackpad/force", "/user/hand/right/input/trackpad/force") - -[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_5qr1b"] -action = SubResource("OpenXRAction_mkk7a") -paths = PackedStringArray("/user/hand/left/input/trackpad/touch", "/user/hand/right/input/trackpad/touch") - -[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_5pkjy"] -action = SubResource("OpenXRAction_5os4r") -paths = PackedStringArray("/user/hand/left/output/haptic", "/user/hand/right/output/haptic") - -[sub_resource type="OpenXRInteractionProfile" id="OpenXRInteractionProfile_6eyyg"] -interaction_profile_path = "/interaction_profiles/valve/index_controller" -bindings = [SubResource("OpenXRIPBinding_s0c47"), SubResource("OpenXRIPBinding_2rykr"), SubResource("OpenXRIPBinding_3apyd"), SubResource("OpenXRIPBinding_ec4nm"), SubResource("OpenXRIPBinding_teed4"), SubResource("OpenXRIPBinding_c1jsm"), SubResource("OpenXRIPBinding_i31ov"), SubResource("OpenXRIPBinding_a5dot"), SubResource("OpenXRIPBinding_sy7to"), SubResource("OpenXRIPBinding_7onrj"), SubResource("OpenXRIPBinding_75ykv"), SubResource("OpenXRIPBinding_0l2lu"), SubResource("OpenXRIPBinding_n0kql"), SubResource("OpenXRIPBinding_pxnyh"), SubResource("OpenXRIPBinding_wlbel"), SubResource("OpenXRIPBinding_k58ue"), SubResource("OpenXRIPBinding_i5msy"), SubResource("OpenXRIPBinding_rhs2g"), SubResource("OpenXRIPBinding_xrpmw"), SubResource("OpenXRIPBinding_5qr1b"), SubResource("OpenXRIPBinding_5pkjy")] - -[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_gokds"] -action = SubResource("OpenXRAction_mj02j") -paths = PackedStringArray("/user/hand/left/input/aim/pose", "/user/hand/right/input/aim/pose") - -[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_pofwu"] -action = SubResource("OpenXRAction_x4afo") -paths = PackedStringArray("/user/hand/left/input/aim/pose", "/user/hand/right/input/aim/pose") - -[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_b1pba"] -action = SubResource("OpenXRAction_ffdsq") -paths = PackedStringArray("/user/hand/left/input/grip/pose", "/user/hand/right/input/grip/pose") - -[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_l18yv"] -action = SubResource("OpenXRAction_80sg0") -paths = PackedStringArray("/user/hand/left/input/palm_ext/pose", "/user/hand/right/input/palm_ext/pose") - -[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_3uw3r"] -action = SubResource("OpenXRAction_4uh4f") -paths = PackedStringArray("/user/hand/left/input/menu/click", "/user/hand/right/input/menu/click") - -[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_3a84h"] -action = SubResource("OpenXRAction_0sqj6") -paths = PackedStringArray("/user/hand/left/input/x/click", "/user/hand/right/input/a/click") - -[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_fqe4s"] -action = SubResource("OpenXRAction_tblbd") -paths = PackedStringArray("/user/hand/left/input/y/click", "/user/hand/right/input/b/click") - -[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_ddk7k"] -action = SubResource("OpenXRAction_qhy06") -paths = PackedStringArray("/user/hand/left/input/trigger/value", "/user/hand/right/input/trigger/value") - -[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_gl8l7"] -action = SubResource("OpenXRAction_2vwe0") -paths = PackedStringArray("/user/hand/left/input/trigger/value", "/user/hand/right/input/trigger/value") - -[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_pn00s"] -action = SubResource("OpenXRAction_473o0") -paths = PackedStringArray("/user/hand/left/input/squeeze/value", "/user/hand/right/input/squeeze/value") - -[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_kw4aa"] -action = SubResource("OpenXRAction_8qgll") -paths = PackedStringArray("/user/hand/left/input/squeeze/value", "/user/hand/right/input/squeeze/value") - -[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_03m8e"] -action = SubResource("OpenXRAction_rhxy5") -paths = PackedStringArray("/user/hand/left/input/thumbstick", "/user/hand/right/input/thumbstick") - -[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_ekghp"] -action = SubResource("OpenXRAction_sxg5f") -paths = PackedStringArray("/user/hand/left/input/thumbstick/click", "/user/hand/right/input/thumbstick/click") - -[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_lbcu8"] -action = SubResource("OpenXRAction_5os4r") -paths = PackedStringArray("/user/hand/left/output/haptic", "/user/hand/right/output/haptic") - -[sub_resource type="OpenXRInteractionProfile" id="OpenXRInteractionProfile_kxooo"] -interaction_profile_path = "/interaction_profiles/hp/mixed_reality_controller" -bindings = [SubResource("OpenXRIPBinding_gokds"), SubResource("OpenXRIPBinding_pofwu"), SubResource("OpenXRIPBinding_b1pba"), SubResource("OpenXRIPBinding_l18yv"), SubResource("OpenXRIPBinding_3uw3r"), SubResource("OpenXRIPBinding_3a84h"), SubResource("OpenXRIPBinding_fqe4s"), SubResource("OpenXRIPBinding_ddk7k"), SubResource("OpenXRIPBinding_gl8l7"), SubResource("OpenXRIPBinding_pn00s"), SubResource("OpenXRIPBinding_kw4aa"), SubResource("OpenXRIPBinding_03m8e"), SubResource("OpenXRIPBinding_ekghp"), SubResource("OpenXRIPBinding_lbcu8")] - -[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_nxupw"] -action = SubResource("OpenXRAction_mj02j") -paths = PackedStringArray("/user/hand/left/input/aim/pose", "/user/hand/right/input/aim/pose") - -[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_t4825"] -action = SubResource("OpenXRAction_x4afo") -paths = PackedStringArray("/user/hand/left/input/aim/pose", "/user/hand/right/input/aim/pose") - -[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_3y4i7"] -action = SubResource("OpenXRAction_ffdsq") -paths = PackedStringArray("/user/hand/left/input/grip/pose", "/user/hand/right/input/grip/pose") - -[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_ea251"] -action = SubResource("OpenXRAction_80sg0") -paths = PackedStringArray("/user/hand/left/input/palm_ext/pose", "/user/hand/right/input/palm_ext/pose") - -[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_jhak1"] -action = SubResource("OpenXRAction_4uh4f") -paths = PackedStringArray("/user/hand/left/input/menu/click", "/user/hand/right/input/menu/click") - -[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_mg6go"] -action = SubResource("OpenXRAction_qhy06") -paths = PackedStringArray("/user/hand/left/input/trigger/value", "/user/hand/right/input/trigger/value") - -[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_pu8tu"] -action = SubResource("OpenXRAction_2vwe0") -paths = PackedStringArray("/user/hand/left/input/trigger/value", "/user/hand/right/input/trigger/value") - -[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_jvgch"] -action = SubResource("OpenXRAction_473o0") -paths = PackedStringArray("/user/hand/left/input/squeeze/click", "/user/hand/right/input/squeeze/click") - -[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_tae7d"] -action = SubResource("OpenXRAction_8qgll") -paths = PackedStringArray("/user/hand/left/input/squeeze/click", "/user/hand/right/input/squeeze/click") - -[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_t2ie6"] -action = SubResource("OpenXRAction_rhxy5") -paths = PackedStringArray("/user/hand/left/input/thumbstick", "/user/hand/right/input/thumbstick") - -[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_7cage"] -action = SubResource("OpenXRAction_sxg5f") -paths = PackedStringArray("/user/hand/left/input/thumbstick/click", "/user/hand/right/input/thumbstick/click") - -[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_ofsd6"] -action = SubResource("OpenXRAction_53byk") -paths = PackedStringArray("/user/hand/left/input/trackpad", "/user/hand/right/input/trackpad") - -[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_cdtpu"] -action = SubResource("OpenXRAction_bkd5n") -paths = PackedStringArray("/user/hand/left/input/trackpad/click", "/user/hand/right/input/trackpad/click") - -[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_dtyxn"] -action = SubResource("OpenXRAction_mkk7a") -paths = PackedStringArray("/user/hand/left/input/trackpad/touch", "/user/hand/right/input/trackpad/touch") - -[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_yid6j"] -action = SubResource("OpenXRAction_5os4r") -paths = PackedStringArray("/user/hand/left/output/haptic", "/user/hand/right/output/haptic") - -[sub_resource type="OpenXRInteractionProfile" id="OpenXRInteractionProfile_wy3t2"] -interaction_profile_path = "/interaction_profiles/samsung/odyssey_controller" -bindings = [SubResource("OpenXRIPBinding_nxupw"), SubResource("OpenXRIPBinding_t4825"), SubResource("OpenXRIPBinding_3y4i7"), SubResource("OpenXRIPBinding_ea251"), SubResource("OpenXRIPBinding_jhak1"), SubResource("OpenXRIPBinding_mg6go"), SubResource("OpenXRIPBinding_pu8tu"), SubResource("OpenXRIPBinding_jvgch"), SubResource("OpenXRIPBinding_tae7d"), SubResource("OpenXRIPBinding_t2ie6"), SubResource("OpenXRIPBinding_7cage"), SubResource("OpenXRIPBinding_ofsd6"), SubResource("OpenXRIPBinding_cdtpu"), SubResource("OpenXRIPBinding_dtyxn"), SubResource("OpenXRIPBinding_yid6j")] - -[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_30ohe"] -action = SubResource("OpenXRAction_mj02j") -paths = PackedStringArray("/user/hand/left/input/aim/pose", "/user/hand/right/input/aim/pose") - -[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_mo2cy"] -action = SubResource("OpenXRAction_x4afo") -paths = PackedStringArray("/user/hand/left/input/aim/pose", "/user/hand/right/input/aim/pose") - -[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_88il2"] -action = SubResource("OpenXRAction_ffdsq") -paths = PackedStringArray("/user/hand/left/input/grip/pose", "/user/hand/right/input/grip/pose") - -[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_hgr0c"] -action = SubResource("OpenXRAction_80sg0") -paths = PackedStringArray("/user/hand/left/input/palm_ext/pose", "/user/hand/right/input/palm_ext/pose") - -[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_53clm"] -action = SubResource("OpenXRAction_4uh4f") -paths = PackedStringArray("/user/hand/left/input/menu/click") - -[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_krxa6"] -action = SubResource("OpenXRAction_83w55") -paths = PackedStringArray("/user/hand/left/input/system/click") - -[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_rwig7"] -action = SubResource("OpenXRAction_0sqj6") -paths = PackedStringArray("/user/hand/left/input/x/click", "/user/hand/right/input/a/click") - -[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_scly6"] -action = SubResource("OpenXRAction_tblbd") -paths = PackedStringArray("/user/hand/left/input/y/click", "/user/hand/right/input/b/click") - -[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_0xc3c"] -action = SubResource("OpenXRAction_qhy06") -paths = PackedStringArray("/user/hand/left/input/trigger/value", "/user/hand/right/input/trigger/value") - -[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_kilck"] -action = SubResource("OpenXRAction_2vwe0") -paths = PackedStringArray("/user/hand/left/input/trigger/click", "/user/hand/right/input/trigger/click") - -[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_vcgs0"] -action = SubResource("OpenXRAction_473o0") -paths = PackedStringArray("/user/hand/left/input/squeeze/click", "/user/hand/right/input/squeeze/click") - -[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_hdvvr"] -action = SubResource("OpenXRAction_8qgll") -paths = PackedStringArray("/user/hand/left/input/squeeze/click", "/user/hand/right/input/squeeze/click") - -[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_83wki"] -action = SubResource("OpenXRAction_rhxy5") -paths = PackedStringArray("/user/hand/left/input/thumbstick", "/user/hand/right/input/thumbstick") - -[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_c02p5"] -action = SubResource("OpenXRAction_sxg5f") -paths = PackedStringArray("/user/hand/left/input/thumbstick/click", "/user/hand/right/input/thumbstick/click") - -[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_g2rpc"] -action = SubResource("OpenXRAction_3rri5") -paths = PackedStringArray("/user/hand/left/input/thumbstick/touch", "/user/hand/right/input/thumbstick/touch") - -[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_lul31"] -action = SubResource("OpenXRAction_5os4r") -paths = PackedStringArray("/user/hand/left/output/haptic", "/user/hand/right/output/haptic") - -[sub_resource type="OpenXRInteractionProfile" id="OpenXRInteractionProfile_maqsl"] -interaction_profile_path = "/interaction_profiles/htc/vive_cosmos_controller" -bindings = [SubResource("OpenXRIPBinding_30ohe"), SubResource("OpenXRIPBinding_mo2cy"), SubResource("OpenXRIPBinding_88il2"), SubResource("OpenXRIPBinding_hgr0c"), SubResource("OpenXRIPBinding_53clm"), SubResource("OpenXRIPBinding_krxa6"), SubResource("OpenXRIPBinding_rwig7"), SubResource("OpenXRIPBinding_scly6"), SubResource("OpenXRIPBinding_0xc3c"), SubResource("OpenXRIPBinding_kilck"), SubResource("OpenXRIPBinding_vcgs0"), SubResource("OpenXRIPBinding_hdvvr"), SubResource("OpenXRIPBinding_83wki"), SubResource("OpenXRIPBinding_c02p5"), SubResource("OpenXRIPBinding_g2rpc"), SubResource("OpenXRIPBinding_lul31")] - -[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_jfxms"] -action = SubResource("OpenXRAction_mj02j") -paths = PackedStringArray("/user/hand/left/input/aim/pose", "/user/hand/right/input/aim/pose") - -[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_b52tt"] -action = SubResource("OpenXRAction_x4afo") -paths = PackedStringArray("/user/hand/left/input/aim/pose", "/user/hand/right/input/aim/pose") - -[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_2p8m5"] -action = SubResource("OpenXRAction_ffdsq") -paths = PackedStringArray("/user/hand/left/input/grip/pose", "/user/hand/right/input/grip/pose") - -[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_vsjur"] -action = SubResource("OpenXRAction_80sg0") -paths = PackedStringArray("/user/hand/left/input/palm_ext/pose", "/user/hand/right/input/palm_ext/pose") - -[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_bfbcv"] -action = SubResource("OpenXRAction_4uh4f") -paths = PackedStringArray("/user/hand/left/input/menu/click") - -[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_qswlg"] -action = SubResource("OpenXRAction_83w55") -paths = PackedStringArray("/user/hand/left/input/system/click") - -[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_i3jtx"] -action = SubResource("OpenXRAction_0sqj6") -paths = PackedStringArray("/user/hand/left/input/x/click", "/user/hand/right/input/a/click") - -[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_80khm"] -action = SubResource("OpenXRAction_tblbd") -paths = PackedStringArray("/user/hand/left/input/y/click", "/user/hand/right/input/b/click") - -[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_yabtl"] -action = SubResource("OpenXRAction_qhy06") -paths = PackedStringArray("/user/hand/left/input/trigger/value", "/user/hand/right/input/trigger/value") - -[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_qk0dp"] -action = SubResource("OpenXRAction_2vwe0") -paths = PackedStringArray("/user/hand/left/input/trigger/click", "/user/hand/right/input/trigger/click") - -[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_l8guq"] -action = SubResource("OpenXRAction_gpqeh") -paths = PackedStringArray("/user/hand/left/input/trigger/touch", "/user/hand/right/input/trigger/touch") - -[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_jlokn"] -action = SubResource("OpenXRAction_473o0") -paths = PackedStringArray("/user/hand/left/input/squeeze/click", "/user/hand/right/input/squeeze/click") - -[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_fy7c1"] -action = SubResource("OpenXRAction_8qgll") -paths = PackedStringArray("/user/hand/left/input/squeeze/click", "/user/hand/right/input/squeeze/click") - -[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_2c4pk"] -action = SubResource("OpenXRAction_rhxy5") -paths = PackedStringArray("/user/hand/left/input/thumbstick", "/user/hand/right/input/thumbstick") - -[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_41pcr"] -action = SubResource("OpenXRAction_sxg5f") -paths = PackedStringArray("/user/hand/left/input/thumbstick/click", "/user/hand/right/input/thumbstick/click") - -[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_mjifc"] -action = SubResource("OpenXRAction_3rri5") -paths = PackedStringArray("/user/hand/left/input/thumbstick/touch", "/user/hand/right/input/thumbstick/touch") - -[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_j3ms0"] -action = SubResource("OpenXRAction_mkk7a") -paths = PackedStringArray("/user/hand/left/input/thumbrest/touch", "/user/hand/right/input/thumbrest/touch") - -[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_nsg5c"] -action = SubResource("OpenXRAction_5os4r") -paths = PackedStringArray("/user/hand/left/output/haptic", "/user/hand/right/output/haptic") - -[sub_resource type="OpenXRInteractionProfile" id="OpenXRInteractionProfile_qqead"] -interaction_profile_path = "/interaction_profiles/htc/vive_focus3_controller" -bindings = [SubResource("OpenXRIPBinding_jfxms"), SubResource("OpenXRIPBinding_b52tt"), SubResource("OpenXRIPBinding_2p8m5"), SubResource("OpenXRIPBinding_vsjur"), SubResource("OpenXRIPBinding_bfbcv"), SubResource("OpenXRIPBinding_qswlg"), SubResource("OpenXRIPBinding_i3jtx"), SubResource("OpenXRIPBinding_80khm"), SubResource("OpenXRIPBinding_yabtl"), SubResource("OpenXRIPBinding_qk0dp"), SubResource("OpenXRIPBinding_l8guq"), SubResource("OpenXRIPBinding_jlokn"), SubResource("OpenXRIPBinding_fy7c1"), SubResource("OpenXRIPBinding_2c4pk"), SubResource("OpenXRIPBinding_41pcr"), SubResource("OpenXRIPBinding_mjifc"), SubResource("OpenXRIPBinding_j3ms0"), SubResource("OpenXRIPBinding_nsg5c")] - -[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_vkj8f"] -action = SubResource("OpenXRAction_mj02j") -paths = PackedStringArray("/user/vive_tracker_htcx/role/left_foot/input/grip/pose", "/user/vive_tracker_htcx/role/right_foot/input/grip/pose", "/user/vive_tracker_htcx/role/left_shoulder/input/grip/pose", "/user/vive_tracker_htcx/role/right_shoulder/input/grip/pose", "/user/vive_tracker_htcx/role/left_elbow/input/grip/pose", "/user/vive_tracker_htcx/role/right_elbow/input/grip/pose", "/user/vive_tracker_htcx/role/left_knee/input/grip/pose", "/user/vive_tracker_htcx/role/right_knee/input/grip/pose", "/user/vive_tracker_htcx/role/waist/input/grip/pose", "/user/vive_tracker_htcx/role/chest/input/grip/pose", "/user/vive_tracker_htcx/role/camera/input/grip/pose", "/user/vive_tracker_htcx/role/keyboard/input/grip/pose") - -[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_ci8gc"] -action = SubResource("OpenXRAction_5os4r") -paths = PackedStringArray("/user/vive_tracker_htcx/role/left_foot/output/haptic", "/user/vive_tracker_htcx/role/right_foot/output/haptic", "/user/vive_tracker_htcx/role/left_shoulder/output/haptic", "/user/vive_tracker_htcx/role/right_shoulder/output/haptic", "/user/vive_tracker_htcx/role/left_elbow/output/haptic", "/user/vive_tracker_htcx/role/right_elbow/output/haptic", "/user/vive_tracker_htcx/role/left_knee/output/haptic", "/user/vive_tracker_htcx/role/right_knee/output/haptic", "/user/vive_tracker_htcx/role/waist/output/haptic", "/user/vive_tracker_htcx/role/chest/output/haptic", "/user/vive_tracker_htcx/role/camera/output/haptic", "/user/vive_tracker_htcx/role/keyboard/output/haptic") - -[sub_resource type="OpenXRInteractionProfile" id="OpenXRInteractionProfile_bsacy"] -interaction_profile_path = "/interaction_profiles/htc/vive_tracker_htcx" -bindings = [SubResource("OpenXRIPBinding_vkj8f"), SubResource("OpenXRIPBinding_ci8gc")] - -[resource] -action_sets = [SubResource("OpenXRActionSet_dlwup")] -interaction_profiles = [SubResource("OpenXRInteractionProfile_n4f80"), SubResource("OpenXRInteractionProfile_om27o"), SubResource("OpenXRInteractionProfile_tk604"), SubResource("OpenXRInteractionProfile_kc40e"), SubResource("OpenXRInteractionProfile_ammxl"), SubResource("OpenXRInteractionProfile_6eyyg"), SubResource("OpenXRInteractionProfile_kxooo"), SubResource("OpenXRInteractionProfile_wy3t2"), SubResource("OpenXRInteractionProfile_maqsl"), SubResource("OpenXRInteractionProfile_qqead"), SubResource("OpenXRInteractionProfile_bsacy")] diff --git a/example/project.godot b/example/project.godot index ea8978a..a59171d 100644 --- a/example/project.godot +++ b/example/project.godot @@ -20,6 +20,10 @@ config/icon="res://icon.png" T5Interface="*res://addons/tiltfive/T5Interface.gd" +[editor_plugins] + +enabled=PackedStringArray("res://addons/tiltfive/plugin.cfg") + [input] trigger={ diff --git a/extension/src/GodotT5Service.cpp b/extension/src/GodotT5Service.cpp index ae4f487..26b2334 100644 --- a/extension/src/GodotT5Service.cpp +++ b/extension/src/GodotT5Service.cpp @@ -10,6 +10,7 @@ #include #include #include +#include #include using godot::Variant; @@ -90,18 +91,15 @@ void GodotT5Logger::log_warning(const char* message, const char* func_name, cons } void GodotT5Logger::log_string(const char* message) { - Variant msg = message; - UtilityFunctions::print(msg); + Variant v_msg = message; + UtilityFunctions::print_verbose(v_msg); } - GodotT5Service::Ptr GodotT5ObjectRegistry::service() { - - assert(_instance); - return std::static_pointer_cast(ObjectRegistry::service()); + assert(_instance); + return std::static_pointer_cast(ObjectRegistry::service()); } - T5Integration::T5Service::Ptr GodotT5ObjectRegistry::get_service() { GodotT5Service::Ptr service; if (_service.expired()) { @@ -127,15 +125,15 @@ T5Integration::T5Math::Ptr GodotT5ObjectRegistry::get_math() { } T5Integration::Logger::Ptr GodotT5ObjectRegistry::get_logger() { - GodotT5Logger::Ptr logger; - if (_logger.expired()) { - logger = std::make_shared(); - _logger = logger; - } - else { - logger = std::static_pointer_cast(_logger.lock()); - } - return logger; + GodotT5Logger::Ptr logger; + if (_logger.expired()) { + logger = std::make_shared(); + _logger = logger; + } + else { + logger = std::static_pointer_cast(_logger.lock()); + } + return logger; } } \ No newline at end of file diff --git a/extension/src/T5Gameboard.cpp b/extension/src/T5Gameboard.cpp new file mode 100644 index 0000000..ca957f3 --- /dev/null +++ b/extension/src/T5Gameboard.cpp @@ -0,0 +1,188 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include + + +using godot::ClassDB; +using godot::D_METHOD; +using godot::PropertyInfo; +using godot::Variant; +using godot::Callable; +using godot::Object; +using godot::UtilityFunctions; +using godot::ResourceLoader; +using godot::PackedScene; +using godot::SceneTree; +using godot::Vector3; +using godot::Engine; + +const char le_name[] = "LE"; +const char xe_name[] = "XE"; +const char raised_xe_name[] = "Raised XE"; + +void T5Gameboard::set_content_scale(float scale) { + content_scale = scale; + set_board_state(); +} + +float T5Gameboard::get_content_scale() const{ + return content_scale; +} + +void T5Gameboard::set_gameboard_type(String gb_type) { + if(gb_type == le_name) { + gameboard_type = TiltFiveXRInterface::LE_GAMEBOARD; + } + else if(gb_type == xe_name) { + gameboard_type = TiltFiveXRInterface::XE_GAMEBOARD; + } + else if(gb_type == raised_xe_name) { + gameboard_type = TiltFiveXRInterface::XE_RAISED_GAMEBOARD; + } + else { + gameboard_type = TiltFiveXRInterface::NO_GAMEBOARD_SET; + } + set_board_state(); + +} + +String T5Gameboard::get_gameboard_type() const{ + switch (gameboard_type) + { + case TiltFiveXRInterface::LE_GAMEBOARD: + return le_name; + case TiltFiveXRInterface::XE_GAMEBOARD: + return xe_name; + case TiltFiveXRInterface::XE_RAISED_GAMEBOARD: + return raised_xe_name; + default: + break; + } + return "Unknown"; +} + +void T5Gameboard::set_show_at_runtime(bool show) { + show_at_runtime = show; + set_board_state(); +} + +bool T5Gameboard::get_show_at_runtime() const { + return show_at_runtime; +} + +void T5Gameboard::set_layer_mask(uint32_t p_mask) { + layers = p_mask; + set_board_state(); +} + +uint32_t T5Gameboard::get_layer_mask() const { + return layers; +} + +void T5Gameboard::set_layer_mask_value(int p_layer_number, bool p_value) { + ERR_FAIL_COND_MSG(p_layer_number < 1, "Render layer number must be between 1 and 20 inclusive."); + ERR_FAIL_COND_MSG(p_layer_number > 20, "Render layer number must be between 1 and 20 inclusive."); + uint32_t mask = get_layer_mask(); + if (p_value) { + mask |= 1 << (p_layer_number - 1); + } else { + mask &= ~(1 << (p_layer_number - 1)); + } + set_layer_mask(mask); +} + +bool T5Gameboard::get_layer_mask_value(int p_layer_number) const { + ERR_FAIL_COND_V_MSG(p_layer_number < 1, false, "Render layer number must be between 1 and 20 inclusive."); + ERR_FAIL_COND_V_MSG(p_layer_number > 20, false, "Render layer number must be between 1 and 20 inclusive."); + return layers & (1 << (p_layer_number - 1)); +} + + +T5Gameboard::T5Gameboard(){ + +} + +T5Gameboard::~T5Gameboard(){ + +} + +Node3D* T5Gameboard::add_scene(String path) { + Ref scene = ResourceLoader::get_singleton()->load(path, "PackedScene"); + ERR_FAIL_COND_V_MSG(scene.is_null(), nullptr, godot::vformat("Failed to load: %s", path)); + + auto node = scene->instantiate(); + auto node_3d = Object::cast_to(node); + if(!node_3d) { + node->queue_free(); + ERR_FAIL_V_MSG(nullptr, godot::vformat("Not Node3D: %s", path)); + } + if(node_3d->get_child_count() == 0 || node->get_child(0)->get_class() != "MeshInstance3D") { + node->queue_free(); + ERR_FAIL_V_MSG(nullptr, godot::vformat("Not Node3D and MeshInstance3D: %s", path)); + } + + add_child(node_3d); + return node_3d; +} + +void T5Gameboard::set_board_state() { + + bool show_board = show_at_runtime || Engine::get_singleton()->is_editor_hint(); + if(le_node) { + le_node->set_scale(Vector3(content_scale, content_scale, content_scale)); + le_node->set_visible(gameboard_type == TiltFiveXRInterface::LE_GAMEBOARD && show_board); + auto mesh_inst = Object::cast_to(le_node->get_child(0)); + mesh_inst->set_layer_mask(layers); + } + if(xe_node) { + xe_node->set_scale(Vector3(content_scale, content_scale, content_scale)); + xe_node->set_visible(gameboard_type == TiltFiveXRInterface::XE_GAMEBOARD && show_board); + auto mesh_inst = Object::cast_to(le_node->get_child(0)); + mesh_inst->set_layer_mask(layers); + } + if(raised_xe_node) { + raised_xe_node->set_scale(Vector3(content_scale, content_scale, content_scale)); + raised_xe_node->set_visible(gameboard_type == TiltFiveXRInterface::XE_RAISED_GAMEBOARD && show_board); + auto mesh_inst = Object::cast_to(le_node->get_child(0)); + mesh_inst->set_layer_mask(layers); + } +} + +void T5Gameboard::_ready() { + le_node = add_scene("res://addons/tiltfive/assets/T5_border.glb"); + xe_node = add_scene("res://addons/tiltfive/assets/T5_border_XE.glb"); + raised_xe_node = add_scene("res://addons/tiltfive/assets/T5_border_XE_raised.glb"); + set_board_state(); +} + +void T5Gameboard::_bind_methods() { + ClassDB::bind_method(D_METHOD("set_content_scale", "scale"), &T5Gameboard::set_content_scale); + ClassDB::bind_method(D_METHOD("get_content_scale"), &T5Gameboard::get_content_scale); + ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "content_scale", godot::PROPERTY_HINT_RANGE, "0.001, 1000.0, or_greater, hide_slider"), "set_content_scale", "get_content_scale"); + + ClassDB::bind_method(D_METHOD("set_gameboard_type", "gameboard_type"), &T5Gameboard::set_gameboard_type); + ClassDB::bind_method(D_METHOD("get_gameboard_type"), &T5Gameboard::get_gameboard_type); + + auto hint = godot::vformat("%s,%s,%s", le_name, xe_name, raised_xe_name); + ADD_PROPERTY(PropertyInfo(Variant::STRING, "gameboard_type", godot::PROPERTY_HINT_ENUM, hint), "set_gameboard_type", "get_gameboard_type"); + + ClassDB::bind_method(D_METHOD("set_show_at_runtime", "show"), &T5Gameboard::set_show_at_runtime); + ClassDB::bind_method(D_METHOD("get_show_at_runtime"), &T5Gameboard::get_show_at_runtime); + ADD_PROPERTY(PropertyInfo(Variant::BOOL, "show_at_runtime", godot::PROPERTY_HINT_NONE), "set_show_at_runtime", "get_show_at_runtime"); + + ClassDB::bind_method(D_METHOD("set_layer_mask", "mask"), &T5Gameboard::set_layer_mask); + ClassDB::bind_method(D_METHOD("get_layer_mask"), &T5Gameboard::get_layer_mask); + ADD_PROPERTY(PropertyInfo(Variant::INT, "layers", godot::PROPERTY_HINT_LAYERS_3D_RENDER), "set_layer_mask", "get_layer_mask"); + + ClassDB::bind_method(D_METHOD("set_layer_mask_value", "layer_number", "value"), &T5Gameboard::set_layer_mask_value); + ClassDB::bind_method(D_METHOD("get_layer_mask_value", "layer_number"), &T5Gameboard::get_layer_mask_value); + +}; + + \ No newline at end of file diff --git a/extension/src/T5Gameboard.h b/extension/src/T5Gameboard.h new file mode 100644 index 0000000..690d07f --- /dev/null +++ b/extension/src/T5Gameboard.h @@ -0,0 +1,64 @@ +#ifndef T5_GAMEBOARD_H +#define T5_GAMEBOARD_H + +#include +#include +#include +#include +#include +#include +#include + +using godot::Ref; +using godot::String; +using godot::StringName; +using godot::VisualInstance3D; + +class T5Gameboard : public Node3D { + GDCLASS(T5Gameboard, Node3D); + +public: + + void _ready() override; + + void set_content_scale(float scale); + float get_content_scale() const; + + void set_gameboard_type(String gbtype); + String get_gameboard_type() const; + + void set_show_at_runtime(bool show); + bool get_show_at_runtime() const; + + void set_layer_mask(uint32_t p_mask); + uint32_t get_layer_mask() const; + + void set_layer_mask_value(int p_layer_number, bool p_enable); + bool get_layer_mask_value(int p_layer_number) const; + + + T5Gameboard(); + ~T5Gameboard(); + +protected: + + static void _bind_methods(); + +private: + Node3D* add_scene(String path); + void set_board_state(); + + float content_scale = 1.0; + TiltFiveXRInterface::GameBoardType gameboard_type = TiltFiveXRInterface::GameBoardType::LE_GAMEBOARD; + bool show_at_runtime = false; + uint32_t layers = 1; + + Node3D* le_node = nullptr; + Node3D* xe_node = nullptr; + Node3D* raised_xe_node = nullptr; +}; + + + + +#endif // T5_GAMEBOARD_H \ No newline at end of file diff --git a/extension/src/register_types.cpp b/extension/src/register_types.cpp index 2e5906e..b144529 100644 --- a/extension/src/register_types.cpp +++ b/extension/src/register_types.cpp @@ -3,6 +3,7 @@ #include #include #include +#include #include #include #include @@ -21,6 +22,8 @@ void initialize_tiltfive_types(ModuleInitializationLevel p_level) ClassDB::register_class(); ClassDB::register_class(); ClassDB::register_class(); + ClassDB::register_class(); + }