Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Pushing towards a more useable prerelease version #39

Merged
merged 1 commit into from
Oct 22, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .gitmodules
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
[submodule "godot-cpp"]
path = godot-cpp
url = https://github.com/godotengine/godot-cpp.git
branch = master
branch = 4.1
28 changes: 9 additions & 19 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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.
1 change: 0 additions & 1 deletion example/T5Glasses.tscn
Original file line number Diff line number Diff line change
Expand Up @@ -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")]
Expand Down
5 changes: 1 addition & 4 deletions example/XROrigin3D.gd
Original file line number Diff line number Diff line change
Expand Up @@ -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

147 changes: 118 additions & 29 deletions example/addons/tiltfive/T5Interface.gd
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
@tool
extends Node

## This script should be configured as an autoload script.
Expand All @@ -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_GLASSES_AVAILABLE:
print_verbose(glasses_id, " E_AVAILABLE")
glasses_state.available = true
_process_glasses()

TiltFiveXRInterface.E_GLASSES_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_GLASSES_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_GLASSES_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_GLASSES_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_GLASSES_NOT_TRACKING:
print_verbose(glasses_id, " E_NOT_TRACKING")

_:
print_verbose(glasses_id, " - unknown event: ", event_num)
Loading