mirror of
https://github.com/CrispyPin/ovr-utils.git
synced 2024-11-22 23:50:25 +01:00
create overlay plugin with support for tracking controllers or headset
This commit is contained in:
parent
e7fb97cf4d
commit
a2aae82364
12 changed files with 205 additions and 41 deletions
|
@ -3,8 +3,10 @@
|
||||||
[ext_resource path="res://icon.png" type="Texture" id=1]
|
[ext_resource path="res://icon.png" type="Texture" id=1]
|
||||||
|
|
||||||
[node name="Overlay" type="Control"]
|
[node name="Overlay" type="Control"]
|
||||||
margin_right = 561.0
|
anchor_right = 1.0
|
||||||
margin_bottom = 391.0
|
anchor_bottom = 1.0
|
||||||
|
size_flags_horizontal = 3
|
||||||
|
size_flags_vertical = 3
|
||||||
__meta__ = {
|
__meta__ = {
|
||||||
"_edit_use_anchors_": false
|
"_edit_use_anchors_": false
|
||||||
}
|
}
|
||||||
|
@ -14,3 +16,6 @@ anchor_right = 1.0
|
||||||
anchor_bottom = 1.0
|
anchor_bottom = 1.0
|
||||||
texture = ExtResource( 1 )
|
texture = ExtResource( 1 )
|
||||||
expand = true
|
expand = true
|
||||||
|
__meta__ = {
|
||||||
|
"_edit_use_anchors_": false
|
||||||
|
}
|
17
ovr-utils/Main.tscn
Normal file
17
ovr-utils/Main.tscn
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
[gd_scene load_steps=3 format=2]
|
||||||
|
|
||||||
|
[ext_resource path="res://addons/openvr_overlay/OverlayInstance.tscn" type="PackedScene" id=1]
|
||||||
|
[ext_resource path="res://DemoOverlay.tscn" type="PackedScene" id=2]
|
||||||
|
|
||||||
|
[node name="Overlays" type="Node"]
|
||||||
|
|
||||||
|
[node name="OverlayInstance" parent="." instance=ExtResource( 1 )]
|
||||||
|
target = 1
|
||||||
|
overlay_scene = ExtResource( 2 )
|
||||||
|
offset_pos = Vector3( 0, 0, 0.2 )
|
||||||
|
offset_rot = Vector3( 0, -60, -45 )
|
||||||
|
fallback_to_hmd = true
|
||||||
|
|
||||||
|
[node name="OverlayInstance2" parent="." instance=ExtResource( 1 )]
|
||||||
|
target = 2
|
||||||
|
offset_pos = Vector3( 0, 0, -0.2 )
|
24
ovr-utils/addons/openvr_overlay/MissingOverlay.tscn
Normal file
24
ovr-utils/addons/openvr_overlay/MissingOverlay.tscn
Normal file
|
@ -0,0 +1,24 @@
|
||||||
|
[gd_scene format=2]
|
||||||
|
|
||||||
|
[node name="Overlay" type="Control"]
|
||||||
|
anchor_right = 1.0
|
||||||
|
anchor_bottom = 1.0
|
||||||
|
size_flags_horizontal = 3
|
||||||
|
size_flags_vertical = 3
|
||||||
|
__meta__ = {
|
||||||
|
"_edit_use_anchors_": false
|
||||||
|
}
|
||||||
|
|
||||||
|
[node name="ColorRect" type="ColorRect" parent="."]
|
||||||
|
anchor_right = 1.0
|
||||||
|
anchor_bottom = 1.0
|
||||||
|
color = Color( 0.601562, 0, 0, 0.501961 )
|
||||||
|
__meta__ = {
|
||||||
|
"_edit_use_anchors_": false
|
||||||
|
}
|
||||||
|
|
||||||
|
[node name="Label" type="Label" parent="."]
|
||||||
|
anchor_right = 1.0
|
||||||
|
anchor_bottom = 1.0
|
||||||
|
rect_scale = Vector2( 8, 8 )
|
||||||
|
text = "No overlay assigned"
|
19
ovr-utils/addons/openvr_overlay/OverlayInstance.tscn
Normal file
19
ovr-utils/addons/openvr_overlay/OverlayInstance.tscn
Normal file
|
@ -0,0 +1,19 @@
|
||||||
|
[gd_scene load_steps=3 format=2]
|
||||||
|
|
||||||
|
[ext_resource path="res://addons/openvr_overlay/overlay_instance.gd" type="Script" id=1]
|
||||||
|
[ext_resource path="res://addons/godot-openvr/OpenVROverlay.gdns" type="Script" id=3]
|
||||||
|
|
||||||
|
[node name="OverlayInstance" type="Node"]
|
||||||
|
script = ExtResource( 1 )
|
||||||
|
|
||||||
|
[node name="OverlayViewport" type="Viewport" parent="."]
|
||||||
|
size = Vector2( 2160, 2160 )
|
||||||
|
transparent_bg = true
|
||||||
|
handle_input_locally = false
|
||||||
|
msaa = 3
|
||||||
|
hdr = false
|
||||||
|
render_target_update_mode = 3
|
||||||
|
script = ExtResource( 3 )
|
||||||
|
overlay_width_in_meters = 0.4
|
||||||
|
|
||||||
|
[node name="Offset" type="Spatial" parent="."]
|
10
ovr-utils/addons/openvr_overlay/openvr_overlay.gd
Normal file
10
ovr-utils/addons/openvr_overlay/openvr_overlay.gd
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
tool
|
||||||
|
extends EditorPlugin
|
||||||
|
|
||||||
|
|
||||||
|
func _enter_tree() -> void:
|
||||||
|
add_autoload_singleton("OverlayInit", "res://addons/openvr_overlay/overlay_init.gd")
|
||||||
|
|
||||||
|
|
||||||
|
func _exit_tree() -> void:
|
||||||
|
remove_autoload_singleton("OverlayInit")
|
18
ovr-utils/addons/openvr_overlay/overlay_init.gd
Normal file
18
ovr-utils/addons/openvr_overlay/overlay_init.gd
Normal file
|
@ -0,0 +1,18 @@
|
||||||
|
extends Node
|
||||||
|
|
||||||
|
var ovr_interface: ARVRInterface
|
||||||
|
|
||||||
|
func _init() -> void:
|
||||||
|
var ovr_config = preload("res://addons/godot-openvr/OpenVRConfig.gdns").new()
|
||||||
|
ovr_config.set_application_type(2) # Set to OVERLAY MODE = 2, NORMAL MODE = 1
|
||||||
|
ovr_config.set_tracking_universe(1) # Set to SEATED MODE = 0, STANDING MODE = 1, RAW MODE = 2
|
||||||
|
|
||||||
|
# Find the OpenVR interface and initialise it
|
||||||
|
ovr_interface = ARVRServer.find_interface("OpenVR")
|
||||||
|
if ovr_interface and ovr_interface.initialize():
|
||||||
|
pass
|
||||||
|
|
||||||
|
func _ready() -> void:
|
||||||
|
for i in ARVRServer.get_tracker_count():
|
||||||
|
var tracker = ARVRServer.get_tracker(i)
|
||||||
|
print(tracker.get_name(), ": hand ", tracker.get_hand())
|
87
ovr-utils/addons/openvr_overlay/overlay_instance.gd
Normal file
87
ovr-utils/addons/openvr_overlay/overlay_instance.gd
Normal file
|
@ -0,0 +1,87 @@
|
||||||
|
extends Node
|
||||||
|
|
||||||
|
enum TARGETS { head, left, right, world }
|
||||||
|
export (TARGETS) var target = TARGETS.head
|
||||||
|
export var overlay_scene = preload("res://addons/openvr_overlay/MissingOverlay.tscn") setget _set_overlay_scene
|
||||||
|
export var offset_pos := Vector3(0, 0, -1) setget _set_offset_pos
|
||||||
|
export var offset_rot: Vector3 setget _set_offset_rot
|
||||||
|
export var width_meters = 0.4
|
||||||
|
export var fallback_to_hmd = false
|
||||||
|
|
||||||
|
var _tracker_id: int = 0 setget ,get_tracker_id
|
||||||
|
|
||||||
|
|
||||||
|
func _ready() -> void:
|
||||||
|
ARVRServer.connect("tracker_added", self, "_tracker_changed")
|
||||||
|
ARVRServer.connect("tracker_removed", self, "_tracker_changed")
|
||||||
|
|
||||||
|
$OverlayViewport.overlay_width_in_meters = width_meters
|
||||||
|
$OverlayViewport.size = OverlayInit.ovr_interface.get_render_targetsize()
|
||||||
|
if overlay_scene:
|
||||||
|
$OverlayViewport.add_child(overlay_scene.instance())
|
||||||
|
|
||||||
|
update_tracker_id()
|
||||||
|
update_offset()
|
||||||
|
|
||||||
|
|
||||||
|
#func _process(_delta: float) -> void:
|
||||||
|
# update_offset()
|
||||||
|
|
||||||
|
|
||||||
|
func update_tracker_id() -> void:
|
||||||
|
_tracker_id = -1
|
||||||
|
|
||||||
|
if target in [TARGETS.left, TARGETS.right]: # target is a controller
|
||||||
|
for i in ARVRServer.get_tracker_count():
|
||||||
|
var tracker = ARVRServer.get_tracker(i)
|
||||||
|
if tracker.get_hand() == target:
|
||||||
|
_tracker_id = int(tracker.get_name().split("_")[-1])
|
||||||
|
|
||||||
|
if _tracker_id == -1:
|
||||||
|
print("cound not find controller")
|
||||||
|
# could not find controller, overlay will revert to fallback
|
||||||
|
if fallback_to_hmd:
|
||||||
|
_tracker_id = 0 # HMD
|
||||||
|
else:
|
||||||
|
_tracker_id = 63 # World origin
|
||||||
|
|
||||||
|
|
||||||
|
func update_offset() -> void:
|
||||||
|
$Offset.translation = offset_pos
|
||||||
|
$Offset.rotation_degrees = offset_rot
|
||||||
|
print(_tracker_id)
|
||||||
|
match target:
|
||||||
|
TARGETS.head:
|
||||||
|
$OverlayViewport.track_relative_to_device(0, $Offset.transform)
|
||||||
|
TARGETS.world:
|
||||||
|
$OverlayViewport.overlay_position_absolute($Offset.transform)
|
||||||
|
_:
|
||||||
|
$OverlayViewport.track_relative_to_device(_tracker_id, $Offset.transform)
|
||||||
|
|
||||||
|
|
||||||
|
func _tracker_changed(tracker_name: String, type: int, id: int):
|
||||||
|
print("tracker changed: ", tracker_name)
|
||||||
|
update_tracker_id()
|
||||||
|
update_offset()
|
||||||
|
|
||||||
|
|
||||||
|
func get_tracker_id() -> int:
|
||||||
|
return _tracker_id
|
||||||
|
|
||||||
|
|
||||||
|
func _set_offset_pos(pos: Vector3):
|
||||||
|
offset_pos = pos
|
||||||
|
update_offset()
|
||||||
|
|
||||||
|
|
||||||
|
func _set_offset_rot(rot: Vector3):
|
||||||
|
offset_rot = rot
|
||||||
|
update_offset()
|
||||||
|
|
||||||
|
|
||||||
|
func _set_overlay_scene(scene: PackedScene):
|
||||||
|
overlay_scene = scene
|
||||||
|
if $OverlayViewport.get_children():
|
||||||
|
$OverlayViewport.get_child(0).queue_free()
|
||||||
|
$OverlayViewport.add_child(overlay_scene.instance())
|
||||||
|
|
7
ovr-utils/addons/openvr_overlay/plugin.cfg
Normal file
7
ovr-utils/addons/openvr_overlay/plugin.cfg
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
[plugin]
|
||||||
|
|
||||||
|
name="OpenVR Overlay"
|
||||||
|
description="Toolkit for making OpenVR overlays in Godot."
|
||||||
|
author="CrispyPin"
|
||||||
|
version=""
|
||||||
|
script="openvr_overlay.gd"
|
|
@ -1,21 +0,0 @@
|
||||||
extends Spatial
|
|
||||||
|
|
||||||
var size : Vector2
|
|
||||||
|
|
||||||
func _init() -> void:
|
|
||||||
#pass
|
|
||||||
#func _ready() -> void:
|
|
||||||
var OpenVRConfig = preload("res://addons/godot-openvr/OpenVRConfig.gdns").new()
|
|
||||||
OpenVRConfig.set_application_type(2) # Set to OVERLAY MODE = 2, NORMAL MODE = 1
|
|
||||||
OpenVRConfig.set_tracking_universe(1) # Set to SEATED MODE = 0, STANDING MODE = 1, RAW MODE = 2
|
|
||||||
|
|
||||||
# Find the OpenVR interface and initialise it
|
|
||||||
var arvr_interface : ARVRInterface = ARVRServer.find_interface("OpenVR")
|
|
||||||
|
|
||||||
if arvr_interface and arvr_interface.initialize():
|
|
||||||
size = arvr_interface.get_render_targetsize()
|
|
||||||
|
|
||||||
func _ready() -> void:
|
|
||||||
$Viewport.size = size
|
|
||||||
#$VRViewport.size = size
|
|
||||||
|
|
|
@ -1,17 +0,0 @@
|
||||||
[gd_scene load_steps=4 format=2]
|
|
||||||
|
|
||||||
[ext_resource path="res://main.gd" type="Script" id=1]
|
|
||||||
[ext_resource path="res://addons/godot-openvr/OpenVROverlay.gdns" type="Script" id=3]
|
|
||||||
[ext_resource path="res://Overlay.tscn" type="PackedScene" id=4]
|
|
||||||
|
|
||||||
[node name="Spatial" type="Spatial"]
|
|
||||||
script = ExtResource( 1 )
|
|
||||||
|
|
||||||
[node name="Viewport" type="Viewport" parent="."]
|
|
||||||
arvr = true
|
|
||||||
size = Vector2( 100, 100 )
|
|
||||||
transparent_bg = true
|
|
||||||
render_target_update_mode = 3
|
|
||||||
script = ExtResource( 3 )
|
|
||||||
|
|
||||||
[node name="Overlay" parent="Viewport" instance=ExtResource( 4 )]
|
|
|
@ -11,9 +11,17 @@ config_version=4
|
||||||
[application]
|
[application]
|
||||||
|
|
||||||
config/name="ovr-utils"
|
config/name="ovr-utils"
|
||||||
run/main_scene="res://main.tscn"
|
run/main_scene="res://Main.tscn"
|
||||||
config/icon="res://icon.png"
|
config/icon="res://icon.png"
|
||||||
|
|
||||||
|
[autoload]
|
||||||
|
|
||||||
|
OverlayInit="*res://addons/openvr_overlay/overlay_init.gd"
|
||||||
|
|
||||||
|
[editor_plugins]
|
||||||
|
|
||||||
|
enabled=PoolStringArray( "res://addons/openvr_overlay/plugin.cfg" )
|
||||||
|
|
||||||
[gdnative]
|
[gdnative]
|
||||||
|
|
||||||
singletons=[ "res://addons/godot-openvr/godot_openvr.gdnlib" ]
|
singletons=[ "res://addons/godot-openvr/godot_openvr.gdnlib" ]
|
||||||
|
|
7
ovr-utils/test.gd
Normal file
7
ovr-utils/test.gd
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
extends Node
|
||||||
|
|
||||||
|
|
||||||
|
func _ready() -> void:
|
||||||
|
$OverlayInstance.offset_pos = Vector3(1,2,3)
|
||||||
|
$OverlayInstance.offset_pos.x = 4
|
||||||
|
|
Loading…
Reference in a new issue