From 1e8d5dbb06156dc2c540674d1ef2eb8f1e631e51 Mon Sep 17 00:00:00 2001 From: patrickdown Date: Sun, 19 Nov 2023 16:15:43 -0500 Subject: [PATCH] Add a C# version of the plugin Add a C# version of the plugin --- .gitignore | 3 + SConstruct | 4 +- example.csharp/Controls.tscn | 50 ++++ example.csharp/ExampleRig.tscn | 30 ++ example.csharp/WandControl.cs | 113 ++++++++ example.csharp/addons/tiltfive/T5Interface.cs | 261 ++++++++++++++++++ example.csharp/addons/tiltfive/T5Manager.cs | 111 ++++++++ .../addons/tiltfive/T5ManagerInterface.cs | 55 ++++ .../addons/tiltfive/T5ProjectSettings.cs | 59 ++++ .../addons/tiltfive/assets/AutoScale.cs | 35 +++ .../addons/tiltfive/assets/T5-glasses.glb | Bin 0 -> 91668 bytes .../tiltfive/assets/T5-glasses.glb.import | 32 +++ .../addons/tiltfive/assets/T5-wand.glb | Bin 0 -> 195540 bytes .../addons/tiltfive/assets/T5-wand.glb.import | 43 +++ .../tiltfive/assets/T5GlassesModel.tscn | 5 + .../addons/tiltfive/assets/T5WandModel.tscn | 5 + .../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 +++ .../addons/tiltfive/assets/board.svg | 50 ++++ .../addons/tiltfive/assets/board.svg.import | 37 +++ .../addons/tiltfive/assets/glasses.svg | 69 +++++ .../addons/tiltfive/assets/glasses.svg.import | 37 +++ .../tiltfive/assets/materials/Black.tres | 6 + .../assets/materials/T5BorderMat.tres | 6 + .../assets/materials/T5_border_tex.png | Bin 0 -> 2140 bytes .../assets/materials/T5_border_tex.png.import | 36 +++ .../tiltfive/assets/materials/White.tres | 6 + example.csharp/addons/tiltfive/plugin.cfg | 7 + example.csharp/addons/tiltfive/plugin.cs | 42 +++ .../addons/tiltfive/scenes/T5ControllerCS.cs | 25 ++ .../addons/tiltfive/scenes/T5OriginCS.cs | 17 ++ .../addons/tiltfive/scenes/T5XRRig.cs | 56 ++++ .../addons/tiltfive/scenes/T5XRRig.tscn | 16 ++ .../addons/tiltfive/tiltfive.gdextension | 22 ++ example.csharp/icon.svg | 1 + example.csharp/icon.svg.import | 37 +++ example.csharp/main.tscn | 73 +++++ example.csharp/project.godot | 32 +++ example.gd/project.godot | 10 +- extension/src/T5Origin3D.cpp | 5 + 44 files changed, 1503 insertions(+), 10 deletions(-) create mode 100644 example.csharp/Controls.tscn create mode 100644 example.csharp/ExampleRig.tscn create mode 100644 example.csharp/WandControl.cs create mode 100644 example.csharp/addons/tiltfive/T5Interface.cs create mode 100644 example.csharp/addons/tiltfive/T5Manager.cs create mode 100644 example.csharp/addons/tiltfive/T5ManagerInterface.cs create mode 100644 example.csharp/addons/tiltfive/T5ProjectSettings.cs create mode 100644 example.csharp/addons/tiltfive/assets/AutoScale.cs create mode 100644 example.csharp/addons/tiltfive/assets/T5-glasses.glb create mode 100644 example.csharp/addons/tiltfive/assets/T5-glasses.glb.import create mode 100644 example.csharp/addons/tiltfive/assets/T5-wand.glb create mode 100644 example.csharp/addons/tiltfive/assets/T5-wand.glb.import create mode 100644 example.csharp/addons/tiltfive/assets/T5GlassesModel.tscn create mode 100644 example.csharp/addons/tiltfive/assets/T5WandModel.tscn create mode 100644 example.csharp/addons/tiltfive/assets/T5_border.glb create mode 100644 example.csharp/addons/tiltfive/assets/T5_border.glb.import create mode 100644 example.csharp/addons/tiltfive/assets/T5_border_XE.glb create mode 100644 example.csharp/addons/tiltfive/assets/T5_border_XE.glb.import create mode 100644 example.csharp/addons/tiltfive/assets/T5_border_XE_raised.glb create mode 100644 example.csharp/addons/tiltfive/assets/T5_border_XE_raised.glb.import create mode 100644 example.csharp/addons/tiltfive/assets/board.svg create mode 100644 example.csharp/addons/tiltfive/assets/board.svg.import create mode 100644 example.csharp/addons/tiltfive/assets/glasses.svg create mode 100644 example.csharp/addons/tiltfive/assets/glasses.svg.import create mode 100644 example.csharp/addons/tiltfive/assets/materials/Black.tres create mode 100644 example.csharp/addons/tiltfive/assets/materials/T5BorderMat.tres create mode 100644 example.csharp/addons/tiltfive/assets/materials/T5_border_tex.png create mode 100644 example.csharp/addons/tiltfive/assets/materials/T5_border_tex.png.import create mode 100644 example.csharp/addons/tiltfive/assets/materials/White.tres create mode 100644 example.csharp/addons/tiltfive/plugin.cfg create mode 100644 example.csharp/addons/tiltfive/plugin.cs create mode 100644 example.csharp/addons/tiltfive/scenes/T5ControllerCS.cs create mode 100644 example.csharp/addons/tiltfive/scenes/T5OriginCS.cs create mode 100644 example.csharp/addons/tiltfive/scenes/T5XRRig.cs create mode 100644 example.csharp/addons/tiltfive/scenes/T5XRRig.tscn create mode 100644 example.csharp/addons/tiltfive/tiltfive.gdextension create mode 100644 example.csharp/icon.svg create mode 100644 example.csharp/icon.svg.import create mode 100644 example.csharp/main.tscn create mode 100644 example.csharp/project.godot diff --git a/.gitignore b/.gitignore index b279381..51f4e69 100644 --- a/.gitignore +++ b/.gitignore @@ -5,6 +5,9 @@ build .vscode .vs +*.sln +*.csproj + # Binaries *.o *.os diff --git a/SConstruct b/SConstruct index 3fa320d..91efbd8 100644 --- a/SConstruct +++ b/SConstruct @@ -39,7 +39,9 @@ if env['platform'] == 'windows': f1 = env.Command('example.gd/addons/tiltfive/bin/libgdtiltfive{}{}'.format(env['suffix'], env['SHLIBSUFFIX']), library, Copy('$TARGET', '$SOURCE') ) f2 = env.Command('example.gd/addons/tiltfive/bin/TiltFiveNative.dll', tilt_five_library_path + '/TiltFiveNative.dll', Copy('$TARGET', '$SOURCE') ) +f3 = env.Command('example.csharp/addons/tiltfive/bin/libgdtiltfive{}{}'.format(env['suffix'], env['SHLIBSUFFIX']), library, Copy('$TARGET', '$SOURCE') ) +f4 = env.Command('example.csharp/addons/tiltfive/bin/TiltFiveNative.dll', tilt_five_library_path + '/TiltFiveNative.dll', Copy('$TARGET', '$SOURCE') ) -env.Alias('example', [f1, f2]) +env.Alias('example', [f1, f2, f3, f4]) Default(library) diff --git a/example.csharp/Controls.tscn b/example.csharp/Controls.tscn new file mode 100644 index 0000000..f393380 --- /dev/null +++ b/example.csharp/Controls.tscn @@ -0,0 +1,50 @@ +[gd_scene load_steps=4 format=3 uid="uid://dnx42xctfl3mx"] + +[sub_resource type="CapsuleMesh" id="4"] + +[sub_resource type="BoxMesh" id="BoxMesh_dc5d6"] + +[sub_resource type="SphereMesh" id="3"] + +[node name="Controls" type="Node3D"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.0748157, -0.00207818, 0.009782) + +[node name="Trigger" type="MeshInstance3D" parent="."] +transform = Transform3D(0.01, 0, 0, 0, 0.01, 0, 0, 0, 0.01, -0.000888377, -0.0415742, -0.0168045) +mesh = SubResource("4") + +[node name="TriggerClick" type="MeshInstance3D" parent="."] +transform = Transform3D(0.01, 0, 0, 0, 0.01, 0, 0, 0, 0.01, -0.000888377, -0.00848173, -0.0840266) +mesh = SubResource("BoxMesh_dc5d6") + +[node name="Three" type="MeshInstance3D" parent="."] +transform = Transform3D(0.01, 0, 0, 0, 0.01, 0, 0, 0, 0.01, 0, 0, 0) +mesh = SubResource("3") + +[node name="One" type="MeshInstance3D" parent="."] +transform = Transform3D(0.01, 0, 0, 0, 0.01, 0, 0, 0, 0.01, -0.02, 0, 0.05) +mesh = SubResource("3") + +[node name="Two" type="MeshInstance3D" parent="."] +transform = Transform3D(0.01, 0, 0, 0, 0.01, 0, 0, 0, 0.01, 0.02, 0, 0.05) +mesh = SubResource("3") + +[node name="T5" type="MeshInstance3D" parent="."] +transform = Transform3D(-4.37114e-10, -0.01, 0, 0.01, -4.37114e-10, 0, 0, 0, 0.01, 0, 0, 0.08) +mesh = SubResource("4") + +[node name="X" type="MeshInstance3D" parent="."] +transform = Transform3D(0.01, 0, 0, 0, 0.01, 0, 0, 0, 0.01, 0, 0, 0.15) +mesh = SubResource("3") + +[node name="B" type="MeshInstance3D" parent="."] +transform = Transform3D(0.01, 0, 0, 0, 0.01, 0, 0, 0, 0.01, 0, 0, 0.21) +mesh = SubResource("3") + +[node name="Y" type="MeshInstance3D" parent="."] +transform = Transform3D(0.01, 0, 0, 0, 0.01, 0, 0, 0, 0.01, 0.03, 0, 0.18) +mesh = SubResource("3") + +[node name="A" type="MeshInstance3D" parent="."] +transform = Transform3D(0.01, 0, 0, 0, 0.01, 0, 0, 0, 0.01, -0.03, 0, 0.18) +mesh = SubResource("3") diff --git a/example.csharp/ExampleRig.tscn b/example.csharp/ExampleRig.tscn new file mode 100644 index 0000000..a508db9 --- /dev/null +++ b/example.csharp/ExampleRig.tscn @@ -0,0 +1,30 @@ +[gd_scene load_steps=9 format=3 uid="uid://ba8h6c1mtb3h0"] + +[ext_resource type="PackedScene" uid="uid://dpbt52d0p5wjw" path="res://addons/tiltfive/scenes/T5XRRig.tscn" id="1_x7gas"] +[ext_resource type="PackedScene" uid="uid://b1cd3jc00rhal" path="res://addons/tiltfive/assets/T5GlassesModel.tscn" id="2_dp1ep"] +[ext_resource type="Script" path="res://WandControl.cs" id="2_epf7w"] +[ext_resource type="PackedScene" uid="uid://dnx42xctfl3mx" path="res://Controls.tscn" id="2_ge6xw"] +[ext_resource type="Script" path="res://addons/tiltfive/assets/AutoScale.cs" id="3_qxj3p"] +[ext_resource type="PackedScene" uid="uid://bggv3rg34lcs6" path="res://addons/tiltfive/assets/T5-wand.glb" id="6_7gqrr"] + +[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_tnkdi"] +albedo_color = Color(0.580392, 0.396078, 0.278431, 1) + +[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_kgxv6"] +albedo_color = Color(0.0352941, 1, 0, 1) + +[node name="T5XRRig" instance=ExtResource("1_x7gas")] + +[node name="T5-glasses" parent="Origin/Camera" index="0" instance=ExtResource("2_dp1ep")] +script = ExtResource("3_qxj3p") + +[node name="Wand_1" parent="Origin" index="1"] +script = ExtResource("2_epf7w") +unselected = SubResource("StandardMaterial3D_tnkdi") +selected = SubResource("StandardMaterial3D_kgxv6") + +[node name="Controls" parent="Origin/Wand_1" index="0" instance=ExtResource("2_ge6xw")] +transform = Transform3D(10, 0, 0, 0, 10, 0, 0, 0, 10, 0.585525, -0.00207818, 0.223126) + +[node name="T5-wand" parent="Origin/Wand_1" index="1" instance=ExtResource("6_7gqrr")] +script = ExtResource("3_qxj3p") diff --git a/example.csharp/WandControl.cs b/example.csharp/WandControl.cs new file mode 100644 index 0000000..a39f62b --- /dev/null +++ b/example.csharp/WandControl.cs @@ -0,0 +1,113 @@ +using Godot; +using System; +using System.Collections.Generic; +using System.Threading; + +public partial class WandControl : T5ControllerCS +{ + static Dictionary buttons = new() + { + {"button_a", "Controls/A" }, + {"button_b", "Controls/B" }, + {"button_x", "Controls/X" }, + {"button_y", "Controls/Y" }, + {"button_1", "Controls/One" }, + {"button_2", "Controls/Two" }, + {"button_3", "Controls/Three" }, + {"button_t5", "Controls/T5" }, + { "trigger_click", "Controls/TriggerClick" } + + }; + + [Export] + public Material unselected; + + [Export] + public Material selected; + + Vector3 triggerPos; + Vector3 stickPos; + + public override void _EnterTree() + { + base._EnterTree(); + + Connect("button_pressed", Callable.From(OnButtonPressed)); + Connect("button_released", Callable.From(OnButtonReleased)); + } + + public override void _ExitTree() + { + Disconnect("button_pressed", Callable.From(OnButtonPressed)); + Disconnect("button_released", Callable.From(OnButtonReleased)); + + base._ExitTree(); + } + + // Called when the node enters the scene tree for the first time. + public override void _Ready() + { + foreach (var entry in buttons) + { + var node = GetNodeOrNull(entry.Value); + if (node != null) + node.MaterialOverride = unselected; + } + var triggerNode = GetNodeOrNull("Controls/Trigger"); + if (triggerNode != null) + { + triggerNode.MaterialOverride = unselected; + triggerPos = triggerNode.Transform.Origin; + } + var stickNode = GetNodeOrNull("Controls/Three"); + if (stickNode != null) + { + stickNode.MaterialOverride = unselected; + stickPos = stickNode.Transform.Origin; + } + } + + // Called every frame. 'delta' is the elapsed time since the previous frame. + public override void _Process(double delta) + { + base._Process(delta); + + var triggerNode = GetNodeOrNull("Controls/Trigger"); + if(triggerNode != null) + { + var triggerValue = GetFloat("trigger") * 0.03f; + var transform = triggerNode.Transform; + transform.Origin = triggerPos + new Vector3(0, 0, triggerValue); + triggerNode.Transform = transform; + } + + var stickNode = GetNodeOrNull("Controls/Three"); + if (stickNode != null) + { + var stickValue = GetVector2("stick") * 0.03f; + var transform = stickNode.Transform; + transform.Origin = stickPos + new Vector3(stickValue.X, 0, -stickValue.Y); + stickNode.Transform = transform; + } + } + + public void OnButtonPressed(StringName name) + { + if(buttons.TryGetValue(name, out var button)) + { + var node = GetNodeOrNull(button); + if (node != null) + node.MaterialOverride = selected; + } + } + + public void OnButtonReleased(StringName name) + { + if (buttons.TryGetValue(name, out var button)) + { + var node = GetNodeOrNull(button); + if (node != null) + node.MaterialOverride = unselected; + } + } +} diff --git a/example.csharp/addons/tiltfive/T5Interface.cs b/example.csharp/addons/tiltfive/T5Interface.cs new file mode 100644 index 0000000..466f88f --- /dev/null +++ b/example.csharp/addons/tiltfive/T5Interface.cs @@ -0,0 +1,261 @@ +using Godot; +using System; +using System.Collections.Generic; + +public partial class T5Interface : Node +{ + enum ServiceEventType + { + E_SERVICE_STOPPED = 1, + E_SERVICE_RUNNING = 2, + E_SERVICE_T5_UNAVAILABLE = 3, + E_SERVICE_T5_INCOMPATIBLE_VERSION = 4 + } + + enum GlassesEventType + { + E_GLASSES_ADDED = 1, + E_GLASSES_LOST = 2, + E_GLASSES_AVAILABLE = 3, + E_GLASSES_UNAVAILABLE = 4, + E_GLASSES_RESERVED = 5, + E_GLASSES_DROPPED = 6, + E_GLASSES_TRACKING = 7, + E_GLASSES_NOT_TRACKING = 8, + E_GLASSES_STOPPED_ON_ERROR = 9 + } + + public enum GameboardType + { + Unknown = 1, + LE = 2, + XE = 3, + XE_Raised = 4 + } + + // State of a set of glasses. + class XRRigState { + public bool available = false; + public bool attemptingToReserve = false; + public bool reserved = false; + + public T5XRRig rig; + public GameboardType gameboardType; + + public bool CanAttemptToReserve { get { return available && !attemptingToReserve && !reserved; } } + } + + XRInterface xrInterface; + Dictionary glassesDictionary = new(); + + public T5ManagerInterface Manager { get; set; } + + public override void _EnterTree() + { + base._EnterTree(); + + xrInterface = ClassDB.Instantiate("TiltFiveXRInterface").As(); + + xrInterface.Set("application_id", T5ProjectSettings.ApplicationID); + xrInterface.Set("application_version", T5ProjectSettings.ApplicationVersion); + xrInterface.Set("trigger_click_threshold", T5ProjectSettings.TriggerClickThreshhold); + + XRServer.AddInterface(xrInterface as XRInterface); + + xrInterface.Connect("glasses_event", Callable.From(_OnGlassesEvent)); + xrInterface.Connect("service_event", Callable.From(_OnServiceEvent)); + } + + public override void _ExitTree() + { + xrInterface.Disconnect("service_event", Callable.From(_OnServiceEvent)); + xrInterface.Disconnect("glasses_event", Callable.From(_OnGlassesEvent)); + + if (xrInterface.Get("is_initialized").AsBool()) + { + xrInterface.Call("uninitialize"); + } + XRServer.RemoveInterface(xrInterface as XRInterface); + + base._ExitTree(); + } + + public override void _Ready() + { + base._Ready(); + + if(Manager == null) + { + GD.PrintErr("T5Interface does not have a manager set."); + return; + } + + if(!xrInterface.IsInitialized()) + { + xrInterface.Initialize(); + } + } + + void StartDisplay(string glassesID, T5XRRig xrRig) { + + xrInterface.Call("start_display", glassesID, xrRig, xrRig.Origin); + xrRig.Camera.Set("tracker", $"/user/{glassesID}/head"); + for(int i = 0; i < 4; i++) + { + var wand = xrRig.Wand(i); + if (wand != null) + { + wand.Set("tracker", $"/user/{glassesID}/wand_{i + 1}"); + } + } + } + + void ProcessGlasses() + { + foreach(var entry in glassesDictionary) + { + if(entry.Value.CanAttemptToReserve && Manager.ShouldUseGlasses(entry.Key)) + { + entry.Value.attemptingToReserve = true; + xrInterface.Call("reserve_glasses", entry.Key, Manager.GetUIDisplayName(entry.Key)); + } + } + } + + void _OnGlassesEvent(String glassesID, int eventNum) + { + XRRigState xrRigState; + if(!glassesDictionary.TryGetValue(glassesID, out xrRigState)) + { + xrRigState = new XRRigState(); + glassesDictionary.Add(glassesID, xrRigState); + } + + switch ((GlassesEventType)eventNum) + { + case GlassesEventType.E_GLASSES_ADDED: + { + GD.Print(glassesID, " E_GLASSES_ADDED"); + break; + } + case GlassesEventType.E_GLASSES_LOST: + { + GD.Print(glassesID, " E_GLASSES_LOST"); + break; + } + case GlassesEventType.E_GLASSES_AVAILABLE: + { + GD.Print(glassesID, " E_GLASSES_AVAILABLE"); + xrRigState.available = true; + ProcessGlasses(); + break; + } + case GlassesEventType.E_GLASSES_UNAVAILABLE: + { + GD.Print(glassesID, " E_GLASSES_UNAVAILABLE"); + xrRigState.available = false; + if(xrRigState.attemptingToReserve) + { + xrRigState.attemptingToReserve = false; + ProcessGlasses(); + } + break; + } + case GlassesEventType.E_GLASSES_RESERVED: + { + GD.Print(glassesID, " E_GLASSES_RESERVED"); + + xrRigState.reserved = true; + xrRigState.attemptingToReserve = false; + + var xrRig = Manager.CreateXRRig(glassesID); + + // instance our scene + if(xrRig != null) + { + xrRig.GlassesID = glassesID; + xrRigState.rig = xrRig; + StartDisplay(glassesID, xrRig); + } + else + { + xrInterface.Call("release_glasses", glassesID); + } + break; + } + case GlassesEventType.E_GLASSES_DROPPED: + { + GD.Print(glassesID, " E_DROPPED"); + + xrRigState.reserved = false; + xrRigState.attemptingToReserve = false; + + var xrRig = xrRigState.rig; + + if(xrRig != null) { + xrInterface.Call("stop_display", glassesID); + xrRigState.rig = null; + Manager.ReleaseXRRig(xrRig); + + } + break; + } + case GlassesEventType.E_GLASSES_TRACKING: + { + GD.Print(glassesID, " E_GLASSES_TRACKING"); + var gbt = xrInterface.Call("get_gameboard_type", glassesID).As(); + if(xrRigState.gameboardType != gbt) + { + xrRigState.gameboardType = gbt; + if(xrRigState.rig != null) + { + xrRigState.rig.GameboardType = gbt; + xrRigState.rig.GameboardSize = xrInterface.Call("get_gameboard_extents", (int)gbt).AsAabb(); + Manager.SetGameboardType(xrRigState.rig, gbt); + } + } + break; + } + case GlassesEventType.E_GLASSES_NOT_TRACKING: + { + GD.Print(glassesID, " E_GLASSES_NOT_TRACKING"); + break; + } + default: + { + GD.PrintErr(glassesID, " unknown event"); + break; + } + } + + } + + void _OnServiceEvent(int eventNum) + { + switch((ServiceEventType)eventNum) + { + case ServiceEventType.E_SERVICE_STOPPED: + { + Manager.ServiceStopped(); + break; + } + case ServiceEventType.E_SERVICE_RUNNING: + { + Manager.ServiceStarted(); + break; + } + case ServiceEventType.E_SERVICE_T5_UNAVAILABLE: + { + Manager.ServiceUnavailable(); + break; + } + case ServiceEventType.E_SERVICE_T5_INCOMPATIBLE_VERSION: + { + Manager.ServiceIncorrectVersion(); + break; + } + } + } + + +} diff --git a/example.csharp/addons/tiltfive/T5Manager.cs b/example.csharp/addons/tiltfive/T5Manager.cs new file mode 100644 index 0000000..38cbbe7 --- /dev/null +++ b/example.csharp/addons/tiltfive/T5Manager.cs @@ -0,0 +1,111 @@ +using Godot; +using System; + +[GlobalClass] +public partial class T5Manager : Node3D, T5ManagerInterface +{ + [Signal] + public delegate void XRRigWasAddedEventHandler(T5XRRig rig); + + [Signal] + public delegate void XRRigWillBeRemovedEventHandler(T5XRRig rig); + + [Export] + public PackedScene xrRigScene; + + [Export] + public Node3D startLocation; + + Node3D rigs; + + T5Interface t5Interface; + + public override void _EnterTree() + { + base._EnterTree(); + + if (xrRigScene == null) + { + xrRigScene = (PackedScene)ResourceLoader.Load("res://addons/tiltfive/scenes/T5XRRig.tscn"); + } + + t5Interface = GetNode("/root/T5Interface"); + if (t5Interface != null) + { + t5Interface.Manager = this; + } + } + + public override void _ExitTree() + { + if(t5Interface != null) + { + t5Interface.Manager = null; + } + base._ExitTree(); + } + + public override void _Ready() + { + rigs = new Node3D(); + rigs.Name = "T5XRRigs"; + GetTree().Root.CallDeferred(MethodName.AddChild, rigs); + } + + public void ServiceStarted() + { + } + + public void ServiceStopped() + { + } + + public void ServiceUnavailable() + { + GD.PrintErr("Tilt Five Service is unavailable"); + } + + public void ServiceIncorrectVersion() + { + GD.PrintErr("Tilt Five Service version is incompatible"); + } + + public bool ShouldUseGlasses(string glassesID) + { + return true; + } + + public string GetUIDisplayName(string glassesID) + { + return T5ProjectSettings.DefaultDisplayName; + } + + public T5XRRig CreateXRRig(string glassesID) + { + var newRig = xrRigScene.Instantiate(); + newRig.Name = glassesID; + rigs.AddChild(newRig); + if(startLocation != null) + { + var origin = newRig.Origin; + origin.Transform = startLocation.Transform; + if(startLocation.IsClass("T5Gameboard")) { + var contentScale = startLocation.Get("content_scale").As(); + origin.Set( "gameboard_scale", contentScale); + } + } + EmitSignal(SignalName.XRRigWasAdded, newRig); + return newRig; + } + + public void ReleaseXRRig(T5XRRig xrRig) + { + EmitSignal(SignalName.XRRigWillBeRemoved, xrRig); + rigs.RemoveChild(xrRig); + xrRig.QueueFree(); + } + + public void SetGameboardType(T5XRRig rig, T5Interface.GameboardType gameboard_type) + { + } +} diff --git a/example.csharp/addons/tiltfive/T5ManagerInterface.cs b/example.csharp/addons/tiltfive/T5ManagerInterface.cs new file mode 100644 index 0000000..7ba50d5 --- /dev/null +++ b/example.csharp/addons/tiltfive/T5ManagerInterface.cs @@ -0,0 +1,55 @@ +// Interface for all T5Managers. Should not be used directly. +// +// Classes derived from T5ManagerBase implement these voidtions +// to customize the process of connecting the XR rigs in the scene +// to the Tilt Five glasses hardware that is found. +// +// These voidtions 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. + +public interface T5ManagerInterface +{ + + // Invoked by T5Interface when the Tilt Five service has started + public void ServiceStarted(); + + // Invoked by T5Interface when the Tilt Five service has stopped + public void ServiceStopped(); + + // Invoked by T5Interface when the Tilt Five service is not available + // The driver might not be installed + public void ServiceUnavailable(); + + // Invoked by T5Interface when the Tilt Five service installed does + // not meet the minimum version requirements + public void ServiceIncorrectVersion(); + + // Invoked by the T5Interface to find out if the glasses should be used in + // game + public bool ShouldUseGlasses(string glassesID); + + // 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 + public string GetUIDisplayName(string glassesID); + //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) + public T5XRRig CreateXRRig(string glassesID); + + // Invoked by the T5Interface if the Tilt Five glasses become unavailable + public void ReleaseXRRig(T5XRRig xrRig); + + // Invoked by the T5Interface to set the gameboard type the Tilt Five glasses detected + public void SetGameboardType(T5XRRig rig, T5Interface.GameboardType gameboard_type); +} + diff --git a/example.csharp/addons/tiltfive/T5ProjectSettings.cs b/example.csharp/addons/tiltfive/T5ProjectSettings.cs new file mode 100644 index 0000000..23a45f7 --- /dev/null +++ b/example.csharp/addons/tiltfive/T5ProjectSettings.cs @@ -0,0 +1,59 @@ +using Godot; +using System; + + +public static class T5ProjectSettings +{ + static bool isInitialized = false; + + static void DefineProjectSetting(String name, Variant.Type setting_type, PropertyHint hint, String hintString, Variant defaultValue) + { + if(!ProjectSettings.HasSetting(name)) + { + ProjectSettings.SetSetting(name, defaultValue); + } + + var propertyInfo = new Godot.Collections.Dictionary(); + + propertyInfo["name"] = name; + propertyInfo["type"] = (int)setting_type; + propertyInfo["hint"] = (int)hint; + propertyInfo["hint_string"] = hintString; + + ProjectSettings.AddPropertyInfo(propertyInfo); + ProjectSettings.SetAsBasic(name, true); + ProjectSettings.SetInitialValue(name, defaultValue); + } + + static void setup_properties() { + if (!isInitialized) { + DefineProjectSetting("xr/tilt_five/application_id", Variant.Type.String, PropertyHint.None, "", "my.game.com"); + DefineProjectSetting("xr/tilt_five/application_version", Variant.Type.String, PropertyHint.None, "", "0.1.0"); + DefineProjectSetting("xr/tilt_five/default_display_name", Variant.Type.String, PropertyHint.None, "", "Game: Player One"); + DefineProjectSetting("xr/tilt_five/trigger_click_threshhold", Variant.Type.Float, PropertyHint.Range, "0,1,0.01", 0.3); + + isInitialized = true; + } + } + + public static String ApplicationID + { + get { setup_properties(); return ProjectSettings.GetSettingWithOverride("xr/tilt_five/application_id").AsString(); } + } + + public static String ApplicationVersion + { + get { setup_properties(); return ProjectSettings.GetSettingWithOverride("xr/tilt_five/application_version").AsString(); } + } + + public static String DefaultDisplayName + { + get { setup_properties(); return ProjectSettings.GetSettingWithOverride("xr/tilt_five/default_display_name").AsString(); } + } + + public static float TriggerClickThreshhold + { + get { setup_properties(); return (float)ProjectSettings.GetSettingWithOverride("xr/tilt_five/trigger_click_threshhold").AsDouble(); } + } +} + diff --git a/example.csharp/addons/tiltfive/assets/AutoScale.cs b/example.csharp/addons/tiltfive/assets/AutoScale.cs new file mode 100644 index 0000000..10eff3d --- /dev/null +++ b/example.csharp/addons/tiltfive/assets/AutoScale.cs @@ -0,0 +1,35 @@ +using Godot; +using System; + +public partial class AutoScale : Node3D +{ + T5OriginCS origin; + // Called when the node enters the scene tree for the first time. + public override void _Ready() + { + var parent = GetParent(); + while(parent != null && !parent.IsClass("T5Origin3D")) + parent = parent.GetParent(); + + if(parent != null) + { + origin = parent as T5OriginCS; + float scale = origin.GameboardScale; + Scale = new Vector3(scale, scale, scale); + origin.Connect("gameboard_scale_changed", Callable.From(OnGameboardScaleChanged)); + } + } + + public override void _ExitTree() + { + if(origin != null) + origin.Disconnect("gameboard_scale_changed", Callable.From(OnGameboardScaleChanged)); + origin = null; + base._ExitTree(); + } + + public void OnGameboardScaleChanged(float scale) + { + Scale = new Vector3(scale, scale, scale); + } +} diff --git a/example.csharp/addons/tiltfive/assets/T5-glasses.glb b/example.csharp/addons/tiltfive/assets/T5-glasses.glb new file mode 100644 index 0000000000000000000000000000000000000000..58aa5512d31184f74ce538e6082c034aede42288 GIT binary patch literal 91668 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
  • PMDnm57nMf?TE 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 literal 0 HcmV?d00001 diff --git a/example.csharp/addons/tiltfive/assets/T5-wand.glb.import b/example.csharp/addons/tiltfive/assets/T5-wand.glb.import new file mode 100644 index 0000000..d1de8b3 --- /dev/null +++ b/example.csharp/addons/tiltfive/assets/T5-wand.glb.import @@ -0,0 +1,43 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://bggv3rg34lcs6" +path="res://.godot/imported/T5-wand.glb-63815c4ecd00240c691007ffae3a6ad5.scn" + +[deps] + +source_file="res://addons/tiltfive/assets/T5-wand.glb" +dest_files=["res://.godot/imported/T5-wand.glb-63815c4ecd00240c691007ffae3a6ad5.scn"] + +[params] + +nodes/root_type="Node3D" +nodes/root_name="Scene Root" +nodes/apply_root_scale=true +nodes/root_scale=0.5 +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": { +"Black": { +"use_external/enabled": true, +"use_external/path": "res://addons/tiltfive/assets/materials/Black.tres" +}, +"White": { +"use_external/enabled": true, +"use_external/path": "res://addons/tiltfive/assets/materials/White.tres" +} +} +} +gltf/embedded_image_handling=1 diff --git a/example.csharp/addons/tiltfive/assets/T5GlassesModel.tscn b/example.csharp/addons/tiltfive/assets/T5GlassesModel.tscn new file mode 100644 index 0000000..ef3e79f --- /dev/null +++ b/example.csharp/addons/tiltfive/assets/T5GlassesModel.tscn @@ -0,0 +1,5 @@ +[gd_scene load_steps=2 format=3 uid="uid://b1cd3jc00rhal"] + +[ext_resource type="PackedScene" uid="uid://c44ott7hdtkjs" path="res://addons/tiltfive/assets/T5-glasses.glb" id="1_22or3"] + +[node name="T5-glasses" instance=ExtResource("1_22or3")] diff --git a/example.csharp/addons/tiltfive/assets/T5WandModel.tscn b/example.csharp/addons/tiltfive/assets/T5WandModel.tscn new file mode 100644 index 0000000..aa8eec3 --- /dev/null +++ b/example.csharp/addons/tiltfive/assets/T5WandModel.tscn @@ -0,0 +1,5 @@ +[gd_scene load_steps=2 format=3 uid="uid://fipea8dbocg4"] + +[ext_resource type="PackedScene" uid="uid://bggv3rg34lcs6" path="res://addons/tiltfive/assets/T5-wand.glb" id="1_rqv18"] + +[node name="T5-wand" instance=ExtResource("1_rqv18")] diff --git a/example.csharp/addons/tiltfive/assets/T5_border.glb b/example.csharp/addons/tiltfive/assets/T5_border.glb new file mode 100644 index 0000000000000000000000000000000000000000..f630e656cca6ba3fea07a4364c7d8ec8c6a5b59a GIT binary patch literal 15264 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 JHRJ>G_CI#u7h?bb literal 0 HcmV?d00001 diff --git a/example.csharp/addons/tiltfive/assets/T5_border.glb.import b/example.csharp/addons/tiltfive/assets/T5_border.glb.import new file mode 100644 index 0000000..ec70317 --- /dev/null +++ b/example.csharp/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.csharp/addons/tiltfive/assets/T5_border_XE.glb b/example.csharp/addons/tiltfive/assets/T5_border_XE.glb new file mode 100644 index 0000000000000000000000000000000000000000..f10e074b5a4bbe786fb44dfc507c7f7671ab447b GIT binary patch literal 25796 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 NuddmhqrZgK{s*{uok#!x literal 0 HcmV?d00001 diff --git a/example.csharp/addons/tiltfive/assets/T5_border_XE.glb.import b/example.csharp/addons/tiltfive/assets/T5_border_XE.glb.import new file mode 100644 index 0000000..285d74f --- /dev/null +++ b/example.csharp/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.csharp/addons/tiltfive/assets/T5_border_XE_raised.glb b/example.csharp/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.csharp/addons/tiltfive/assets/board.svg.import b/example.csharp/addons/tiltfive/assets/board.svg.import new file mode 100644 index 0000000..131f8eb --- /dev/null +++ b/example.csharp/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.csharp/addons/tiltfive/assets/glasses.svg b/example.csharp/addons/tiltfive/assets/glasses.svg new file mode 100644 index 0000000..d127c68 --- /dev/null +++ b/example.csharp/addons/tiltfive/assets/glasses.svg @@ -0,0 +1,69 @@ + + + + + + + + + + + + + diff --git a/example.csharp/addons/tiltfive/assets/glasses.svg.import b/example.csharp/addons/tiltfive/assets/glasses.svg.import new file mode 100644 index 0000000..fd92c68 --- /dev/null +++ b/example.csharp/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.csharp/addons/tiltfive/assets/materials/Black.tres b/example.csharp/addons/tiltfive/assets/materials/Black.tres new file mode 100644 index 0000000..68eb947 --- /dev/null +++ b/example.csharp/addons/tiltfive/assets/materials/Black.tres @@ -0,0 +1,6 @@ +[gd_resource type="StandardMaterial3D" format=3 uid="uid://di5e6v7te1n6w"] + +[resource] +resource_name = "Black" +albedo_color = Color(0.00392157, 0.00392157, 0.00392157, 1) +roughness = 0.693214 diff --git a/example.csharp/addons/tiltfive/assets/materials/T5BorderMat.tres b/example.csharp/addons/tiltfive/assets/materials/T5BorderMat.tres new file mode 100644 index 0000000..9cdce6d --- /dev/null +++ b/example.csharp/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.csharp/addons/tiltfive/assets/materials/T5_border_tex.png b/example.csharp/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.csharp/addons/tiltfive/assets/materials/T5_border_tex.png.import b/example.csharp/addons/tiltfive/assets/materials/T5_border_tex.png.import new file mode 100644 index 0000000..9a22f78 --- /dev/null +++ b/example.csharp/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.csharp/addons/tiltfive/assets/materials/White.tres b/example.csharp/addons/tiltfive/assets/materials/White.tres new file mode 100644 index 0000000..5f922b6 --- /dev/null +++ b/example.csharp/addons/tiltfive/assets/materials/White.tres @@ -0,0 +1,6 @@ +[gd_resource type="StandardMaterial3D" format=3 uid="uid://rb4v56b7v6vr"] + +[resource] +resource_name = "White" +albedo_color = Color(0.905882, 0.905882, 0.905882, 1) +roughness = 0.693214 diff --git a/example.csharp/addons/tiltfive/plugin.cfg b/example.csharp/addons/tiltfive/plugin.cfg new file mode 100644 index 0000000..3d8028a --- /dev/null +++ b/example.csharp/addons/tiltfive/plugin.cfg @@ -0,0 +1,7 @@ +[plugin] + +name="tiltfive" +description="A plugin for interfacing with the Tilt Five AR glasses" +author="Patrick Down" +version="1.0.0" +script="plugin.cs" diff --git a/example.csharp/addons/tiltfive/plugin.cs b/example.csharp/addons/tiltfive/plugin.cs new file mode 100644 index 0000000..57dcf47 --- /dev/null +++ b/example.csharp/addons/tiltfive/plugin.cs @@ -0,0 +1,42 @@ +#if TOOLS +using Godot; +using System; + +[Tool] +public partial class plugin : EditorPlugin +{ + static bool isInitialized = false; + + private void Setup() + { + if (!isInitialized) + { + AddAutoloadSingleton("T5Interface", "res://addons/tiltfive/T5Interface.cs"); + isInitialized = true; + } + + } + + public override void _EnterTree() + { + Setup(); + + } + + public override void _EnablePlugin() + { + base._EnablePlugin(); + Setup(); + } + + public override void _DisablePlugin() + { + base._EnablePlugin(); + if(isInitialized) + { + RemoveAutoloadSingleton("T5Interface"); + isInitialized = false; + } + } +} +#endif diff --git a/example.csharp/addons/tiltfive/scenes/T5ControllerCS.cs b/example.csharp/addons/tiltfive/scenes/T5ControllerCS.cs new file mode 100644 index 0000000..f96f960 --- /dev/null +++ b/example.csharp/addons/tiltfive/scenes/T5ControllerCS.cs @@ -0,0 +1,25 @@ +using Godot; +using System; + +public partial class T5ControllerCS : Node3D +{ + public bool IsButtonPressed(StringName name) + { + return Call("is_button_pressed", name).AsBool(); + } + + public Variant GetInput(StringName name) + { + return Call("get_input", name); + } + + public float GetFloat(StringName name) + { + return Call("get_float", name).As(); + } + + public Vector2 GetVector2(StringName name) + { + return Call("get_vector2", name).As(); + } +} diff --git a/example.csharp/addons/tiltfive/scenes/T5OriginCS.cs b/example.csharp/addons/tiltfive/scenes/T5OriginCS.cs new file mode 100644 index 0000000..5f78477 --- /dev/null +++ b/example.csharp/addons/tiltfive/scenes/T5OriginCS.cs @@ -0,0 +1,17 @@ +using Godot; +using System; + +public partial class T5OriginCS : Node3D +{ + public float GameboardScale + { + get + { + return Get("gameboard_scale").As(); + } + set + { + Set("gameboard_scale", value); + } + } +} diff --git a/example.csharp/addons/tiltfive/scenes/T5XRRig.cs b/example.csharp/addons/tiltfive/scenes/T5XRRig.cs new file mode 100644 index 0000000..05590c0 --- /dev/null +++ b/example.csharp/addons/tiltfive/scenes/T5XRRig.cs @@ -0,0 +1,56 @@ +using Godot; +using System; + +public partial class T5XRRig : SubViewport +{ + Node3D origin; + Camera3D camera; + Node3D[] wands = new Node3D[4]; + + public string GlassesID { get; set; } + public T5Interface.GameboardType GameboardType { get; set; } + public Aabb GameboardSize { get; set; } + public Node3D Origin { get { return origin; } } + public Node3D Camera { get { return camera; } } + public Node3D Wand(int i) + { + if(i >= 0 && i < wands.Length) { return wands[i]; } + return null; + } + + static string[] wandPaths = { "Origin/Wand_1", "Origin/Wand_2", "Origin/Wand_3", "Origin/Wand_4" }; + + // Called when the node enters the scene tree for the first time. + public override void _Ready() + { + base._Ready(); + + origin = GetNode("Origin"); + camera = GetNode("Origin/Camera"); + for(int i = 0; i < wandPaths.Length; i++) + { + wands[i] = GetNodeOrNull(wandPaths[i]); + } + } + + // Called every frame. 'delta' is the elapsed time since the previous frame. + public override void _Process(double delta) + { + foreach(var wand in wands) + { + if(wand != null) + { + var wandPose = wand.Call("get_pose").As(); + + if (wandPose != null) + { + wand.Visible = wandPose.TrackingConfidence != XRPose.TrackingConfidenceEnum.None; + } + else + { + wand.Visible = false; + } + } + } + } +} diff --git a/example.csharp/addons/tiltfive/scenes/T5XRRig.tscn b/example.csharp/addons/tiltfive/scenes/T5XRRig.tscn new file mode 100644 index 0000000..b0989ca --- /dev/null +++ b/example.csharp/addons/tiltfive/scenes/T5XRRig.tscn @@ -0,0 +1,16 @@ +[gd_scene load_steps=4 format=3 uid="uid://dpbt52d0p5wjw"] + +[ext_resource type="Script" path="res://addons/tiltfive/scenes/T5XRRig.cs" id="1_rshxt"] +[ext_resource type="Script" path="res://addons/tiltfive/scenes/T5OriginCS.cs" id="2_jxn4b"] +[ext_resource type="Script" path="res://addons/tiltfive/scenes/T5ControllerCS.cs" id="3_olh3w"] + +[node name="T5XRRig" type="SubViewport"] +script = ExtResource("1_rshxt") + +[node name="Origin" type="T5Origin3D" parent="."] +script = ExtResource("2_jxn4b") + +[node name="Camera" type="T5Camera3D" parent="Origin"] + +[node name="Wand_1" type="T5Controller3D" parent="Origin"] +script = ExtResource("3_olh3w") diff --git a/example.csharp/addons/tiltfive/tiltfive.gdextension b/example.csharp/addons/tiltfive/tiltfive.gdextension new file mode 100644 index 0000000..96362ae --- /dev/null +++ b/example.csharp/addons/tiltfive/tiltfive.gdextension @@ -0,0 +1,22 @@ +[configuration] + +entry_symbol = "tiltfive_library_init" +compatibility_minimum = "4.1.2" + +[icons] +T5Gameboard = "res://addons/tiltfive/assets/board.svg" + +[libraries] + +windows.x86_64.debug = "res://addons/tiltfive/bin/libgdtiltfive.windows.template_debug.x86_64.dll" +windows.x86_64.release = "res://addons/tiltfive/bin/libgdtiltfive.windows.template_release.x86_64.dll" + +[dependencies] + +windows.x86_64.debug = { + "res://addons/tiltfive/bin/TiltFiveNative.dll" : "" +} +windows.x86_64.release = { + "res://addons/tiltfive/bin/TiltFiveNative.dll" : "" +} + diff --git a/example.csharp/icon.svg b/example.csharp/icon.svg new file mode 100644 index 0000000..b370ceb --- /dev/null +++ b/example.csharp/icon.svg @@ -0,0 +1 @@ + diff --git a/example.csharp/icon.svg.import b/example.csharp/icon.svg.import new file mode 100644 index 0000000..b22832d --- /dev/null +++ b/example.csharp/icon.svg.import @@ -0,0 +1,37 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://b1nhkwhg1osuj" +path="res://.godot/imported/icon.svg-218a8f2b3041327d8a5756f3a245f83b.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://icon.svg" +dest_files=["res://.godot/imported/icon.svg-218a8f2b3041327d8a5756f3a245f83b.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.csharp/main.tscn b/example.csharp/main.tscn new file mode 100644 index 0000000..684778a --- /dev/null +++ b/example.csharp/main.tscn @@ -0,0 +1,73 @@ +[gd_scene load_steps=10 format=3 uid="uid://cc7yui6nxllyl"] + +[ext_resource type="Script" path="res://addons/tiltfive/T5Manager.cs" id="1_e8x2j"] +[ext_resource type="PackedScene" uid="uid://ba8h6c1mtb3h0" path="res://ExampleRig.tscn" id="2_vyjmk"] + +[sub_resource type="BoxMesh" id="BoxMesh_r54is"] + +[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_v64xu"] +albedo_color = Color(1, 0, 0, 1) + +[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_ldtrq"] +albedo_color = Color(0.957524, 0.204212, 0, 1) + +[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_3igwb"] +albedo_color = Color(5.0056e-06, 0.999087, 0.127906, 1) + +[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_lunuq"] +albedo_color = Color(0, 1, 0.584314, 1) + +[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_ufftv"] +albedo_color = Color(0.0313726, 0, 1, 1) + +[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_bbl8k"] +albedo_color = Color(0.45098, 0, 1, 1) + +[node name="Main" type="Node3D"] + +[node name="T5Manager" type="Node3D" parent="." node_paths=PackedStringArray("startLocation")] +script = ExtResource("1_e8x2j") +xrRigScene = ExtResource("2_vyjmk") +startLocation = NodePath("../T5Gameboard") + +[node name="T5Gameboard" type="T5Gameboard" parent="."] +content_scale = 16.0 + +[node name="Center" type="MeshInstance3D" parent="."] +mesh = SubResource("BoxMesh_r54is") + +[node name="Positive X" type="MeshInstance3D" parent="."] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 1.32374, 0, 0) +mesh = SubResource("BoxMesh_r54is") +surface_material_override/0 = SubResource("StandardMaterial3D_v64xu") + +[node name="Negative X" type="MeshInstance3D" parent="."] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -1.2, 0, 0) +mesh = SubResource("BoxMesh_r54is") +surface_material_override/0 = SubResource("StandardMaterial3D_ldtrq") + +[node name="Positive Y" type="MeshInstance3D" parent="."] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.2, 0) +mesh = SubResource("BoxMesh_r54is") +surface_material_override/0 = SubResource("StandardMaterial3D_3igwb") + +[node name="Negative Y" type="MeshInstance3D" parent="."] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -1.2, 0) +mesh = SubResource("BoxMesh_r54is") +surface_material_override/0 = SubResource("StandardMaterial3D_lunuq") + +[node name="Positive Z" type="MeshInstance3D" parent="."] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1.2) +mesh = SubResource("BoxMesh_r54is") +surface_material_override/0 = SubResource("StandardMaterial3D_ufftv") + +[node name="Positive Z2" type="MeshInstance3D" parent="."] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, -1.2) +mesh = SubResource("BoxMesh_r54is") +surface_material_override/0 = SubResource("StandardMaterial3D_bbl8k") + +[node name="DirectionalLight3D" type="DirectionalLight3D" parent="."] +transform = Transform3D(0.99099, 0.062492, 0.118462, -0.133934, 0.462383, 0.876506, 0, -0.884475, 0.466587, -5.18588, 2.90804, 2.01052) + +[node name="SpectatorCamera" type="Camera3D" parent="."] +transform = Transform3D(0.518176, -0.550674, 0.654409, -7.45058e-09, 0.765146, 0.643857, -0.855274, -0.333631, 0.396481, 8.04684, 5.20446, 5.82711) diff --git a/example.csharp/project.godot b/example.csharp/project.godot new file mode 100644 index 0000000..eed6b6f --- /dev/null +++ b/example.csharp/project.godot @@ -0,0 +1,32 @@ +; Engine configuration file. +; It's best edited using the editor UI and not directly, +; since the parameters that go here are not all obvious. +; +; Format: +; [section] ; section goes between [] +; param=value ; assign values to parameters + +config_version=5 + +[application] + +config/name="T5Example.csharp" +run/main_scene="res://main.tscn" +config/features=PackedStringArray("4.1", "C#", "Forward Plus") +config/icon="res://icon.svg" + +[autoload] + +T5Interface="*res://addons/tiltfive/T5Interface.cs" + +[dotnet] + +project/assembly_name="example.csharp" + +[editor_plugins] + +enabled=PackedStringArray("res://addons/tiltfive/plugin.cfg") + +[xr] + +shaders/enabled=true diff --git a/example.gd/project.godot b/example.gd/project.godot index a59171d..3c486ef 100644 --- a/example.gd/project.godot +++ b/example.gd/project.godot @@ -1,16 +1,8 @@ -; Engine configuration file. -; It's best edited using the editor UI and not directly, -; since the parameters that go here are not all obvious. -; -; Format: -; [section] ; section goes between [] -; param=value ; assign values to parameters - config_version=5 [application] -config/name="TiltFiveGodot4" +config/name="T5Example.gd" run/main_scene="res://main.tscn" config/features=PackedStringArray("4.1") run/max_fps=60 diff --git a/extension/src/T5Origin3D.cpp b/extension/src/T5Origin3D.cpp index addbe79..fac12d0 100644 --- a/extension/src/T5Origin3D.cpp +++ b/extension/src/T5Origin3D.cpp @@ -2,6 +2,7 @@ #include using godot::ClassDB; +using godot::MethodInfo; using godot::PropertyInfo; using godot::D_METHOD; using godot::Variant; @@ -13,6 +14,9 @@ void T5Origin3D::_bind_methods() { // Properties. ClassDB::add_property("T5Origin3D", PropertyInfo(Variant::FLOAT, "gameboard_scale"), "set_gameboard_scale", "get_gameboard_scale"); + + // Signals + ADD_SIGNAL(MethodInfo("gameboard_scale_changed", PropertyInfo(Variant::FLOAT, "scale"))); } @@ -22,4 +26,5 @@ real_t T5Origin3D::get_gameboard_scale() { void T5Origin3D::set_gameboard_scale(real_t scale) { _scale = scale; + emit_signal("gameboard_scale_changed", _scale); }