use spatial node for overlays for easier offsets

This commit is contained in:
Crispy 2021-05-20 10:33:39 +02:00
parent 34bf10eb18
commit e33ea49aaf
8 changed files with 35 additions and 74 deletions

View file

@ -1,8 +1,9 @@
[gd_scene load_steps=8 format=2] [gd_scene load_steps=9 format=2]
[ext_resource path="res://addons/openvr_overlay/OverlayInstance.tscn" type="PackedScene" id=1] [ext_resource path="res://addons/openvr_overlay/OverlayInstance.tscn" type="PackedScene" id=1]
[ext_resource path="res://overlays/FPSOverlay.tscn" type="PackedScene" id=2] [ext_resource path="res://overlays/FPSOverlay.tscn" type="PackedScene" id=2]
[ext_resource path="res://overlays/TimeOverlay.tscn" type="PackedScene" id=3] [ext_resource path="res://overlays/TimeOverlay.tscn" type="PackedScene" id=3]
[ext_resource path="res://overlays/xyz_widget/XYZ Widget.tscn" type="PackedScene" id=4]
[ext_resource path="res://overlays/UI_demo.tscn" type="PackedScene" id=5] [ext_resource path="res://overlays/UI_demo.tscn" type="PackedScene" id=5]
[ext_resource path="res://overlays/BatteryOverlay.tscn" type="PackedScene" id=7] [ext_resource path="res://overlays/BatteryOverlay.tscn" type="PackedScene" id=7]
[ext_resource path="res://addons/openvr_overlay/OverlayInteraction.tscn" type="PackedScene" id=8] [ext_resource path="res://addons/openvr_overlay/OverlayInteraction.tscn" type="PackedScene" id=8]
@ -14,35 +15,32 @@ background_color = Color( 0.113725, 0.0705882, 0.196078, 1 )
[node name="Overlays" type="Node"] [node name="Overlays" type="Node"]
[node name="OverlayInstance FPS" parent="." instance=ExtResource( 1 )] [node name="OverlayInstance FPS" parent="." instance=ExtResource( 1 )]
transform = Transform( -4.37114e-08, -0.707107, -0.707107, 0, -0.707107, 0.707107, -1, 3.09086e-08, 3.09086e-08, 0.05, -0.01, 0.15 )
target = 1 target = 1
overlay_scene = ExtResource( 2 ) overlay_scene = ExtResource( 2 )
offset_pos = Vector3( 0.05, -0.01, 0.15 )
offset_rot = Vector3( -135, 90, 0 )
[node name="OverlayInstance Time" parent="." instance=ExtResource( 1 )] [node name="OverlayInstance Time" parent="." instance=ExtResource( 1 )]
transform = Transform( -4.37114e-08, -0.707107, -0.707107, 0, -0.707107, 0.707107, -1, 3.09086e-08, 3.09086e-08, -0.05, 0.02, 0.15 )
target = 1 target = 1
overlay_scene = ExtResource( 3 ) overlay_scene = ExtResource( 3 )
offset_pos = Vector3( -0.05, 0.02, 0.15 )
offset_rot = Vector3( -135, 90, 0 )
width_meters = 0.1 width_meters = 0.1
[node name="OverlayInteraction" parent="OverlayInstance Time" instance=ExtResource( 8 )] [node name="OverlayInteraction" parent="OverlayInstance Time" instance=ExtResource( 8 )]
[node name="Spatial" type="Spatial" parent="."]
[node name="WorldEnvironment" type="WorldEnvironment" parent="."] [node name="WorldEnvironment" type="WorldEnvironment" parent="."]
environment = SubResource( 1 ) environment = SubResource( 1 )
[node name="OverlayInstance Battery" parent="." instance=ExtResource( 1 )] [node name="OverlayInstance Battery" parent="." instance=ExtResource( 1 )]
transform = Transform( -4.37114e-08, -0.707107, -0.707107, 0, -0.707107, 0.707107, -1, 3.09086e-08, 3.09086e-08, -0.12, 0, 0.1 )
target = 1 target = 1
overlay_scene = ExtResource( 7 ) overlay_scene = ExtResource( 7 )
offset_pos = Vector3( -0.12, 0, 0.1 )
offset_rot = Vector3( -135, 90, 0 )
[node name="OverlayInstance UI demo" parent="." instance=ExtResource( 1 )] [node name="OverlayInstance UI demo" parent="." instance=ExtResource( 1 )]
transform = Transform( -4.37114e-08, 0, 1, 0, 1, 0, -1, 0, -4.37114e-08, 0, 0, -0.2 )
target = 1 target = 1
overlay_scene = ExtResource( 5 ) overlay_scene = ExtResource( 5 )
offset_pos = Vector3( 0, 0, -0.2 )
offset_rot = Vector3( 0, 90, 0 )
[node name="OverlayInteraction" parent="OverlayInstance UI demo" instance=ExtResource( 8 )] [node name="OverlayInteraction" parent="OverlayInstance UI demo" instance=ExtResource( 8 )]
[node name="XYZ Widget" parent="." instance=ExtResource( 4 )]
transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, -0.123379, 0, 0 )

View file

@ -4,7 +4,7 @@
[ext_resource path="res://addons/godot-openvr/OpenVROverlay.gdns" type="Script" id=3] [ext_resource path="res://addons/godot-openvr/OpenVROverlay.gdns" type="Script" id=3]
[ext_resource path="res://addons/openvr_overlay/styles/normal.theme" type="Theme" id=5] [ext_resource path="res://addons/openvr_overlay/styles/normal.theme" type="Theme" id=5]
[node name="OverlayInstance" type="Node"] [node name="OverlayInstance" type="Spatial"]
script = ExtResource( 1 ) script = ExtResource( 1 )
[node name="OverlayViewport" type="Viewport" parent="."] [node name="OverlayViewport" type="Viewport" parent="."]
@ -24,5 +24,3 @@ overlay_width_in_meters = 0.4
anchor_right = 1.0 anchor_right = 1.0
anchor_bottom = 1.0 anchor_bottom = 1.0
theme = ExtResource( 5 ) theme = ExtResource( 5 )
[node name="Offset" type="RemoteTransform" parent="."]

View file

@ -1,16 +1,10 @@
[gd_scene load_steps=6 format=2] [gd_scene load_steps=3 format=2]
[ext_resource path="res://addons/openvr_overlay/interaction/overlay_interaction.gd" type="Script" id=1] [ext_resource path="res://addons/openvr_overlay/interaction/overlay_interaction.gd" type="Script" id=1]
[ext_resource path="res://addons/openvr_overlay/styles/active.theme" type="Theme" id=2]
[ext_resource path="res://addons/openvr_overlay/styles/normal.theme" type="Theme" id=3]
[ext_resource path="res://addons/openvr_overlay/styles/touching.theme" type="Theme" id=4]
[ext_resource path="res://addons/openvr_overlay/interaction/OverlayActivator.tscn" type="PackedScene" id=6] [ext_resource path="res://addons/openvr_overlay/interaction/OverlayActivator.tscn" type="PackedScene" id=6]
[node name="OverlayInteraction" type="ARVROrigin"] [node name="OverlayInteraction" type="ARVROrigin"]
script = ExtResource( 1 ) script = ExtResource( 1 )
active_theme = ExtResource( 2 )
normal_theme = ExtResource( 3 )
touching_theme = ExtResource( 4 )
[node name="LeftHand" type="ARVRController" parent="."] [node name="LeftHand" type="ARVRController" parent="."]
@ -22,6 +16,7 @@ controller_id = 2
[node name="OverlayActivator" parent="RightHand" instance=ExtResource( 6 )] [node name="OverlayActivator" parent="RightHand" instance=ExtResource( 6 )]
[node name="Head" type="ARVRCamera" parent="."] [node name="Head" type="ARVRCamera" parent="."]
visible = false
[connection signal="button_pressed" from="LeftHand" to="." method="_on_LeftHand_button_pressed"] [connection signal="button_pressed" from="LeftHand" to="." method="_on_LeftHand_button_pressed"]
[connection signal="button_release" from="LeftHand" to="." method="_on_LeftHand_button_release"] [connection signal="button_release" from="LeftHand" to="." method="_on_LeftHand_button_release"]

View file

@ -107,8 +107,8 @@ func _update_width():
func _update_offset(): func _update_offset():
_overlay_area.translation = get_parent().offset_pos _overlay_area.translation = get_parent().translation
_overlay_area.rotation_degrees = get_parent().offset_rot _overlay_area.rotation_degrees = get_parent().rotation_degrees
func _update_target(): func _update_target():

View file

@ -1,5 +1,5 @@
class_name OverlayInstance class_name OverlayInstance
extends Node extends Spatial
signal width_changed signal width_changed
signal offset_changed signal offset_changed
@ -9,8 +9,8 @@ enum TARGETS { head, left, right, world }
export (TARGETS) var target = TARGETS.head setget _set_target export (TARGETS) var target = TARGETS.head setget _set_target
export var overlay_scene = preload("res://addons/openvr_overlay/MissingOverlay.tscn")\ export var overlay_scene = preload("res://addons/openvr_overlay/MissingOverlay.tscn")\
setget set_overlay_scene setget set_overlay_scene
export var offset_pos := Vector3(0, 0, -1) setget set_offset_pos #export var offset_pos := Vector3(0, 0, -1) setget set_offset_pos
export var offset_rot: Vector3 setget set_offset_rot #export var offset_rot: Vector3 setget set_offset_rot
export var width_meters = 0.4 setget set_width_in_meters export var width_meters = 0.4 setget set_width_in_meters
export var fallback_to_hmd = false # fallback is only applied if tracker is not present at startup export var fallback_to_hmd = false # fallback is only applied if tracker is not present at startup
# so this is not fully implemented # so this is not fully implemented
@ -31,6 +31,13 @@ func _ready() -> void:
update_tracker_id() update_tracker_id()
update_offset() update_offset()
set_notify_transform(true)
func _notification(what: int) -> void:
if what == NOTIFICATION_TRANSFORM_CHANGED:
update_offset()
emit_signal("offset_changed")
func update_tracker_id() -> void: func update_tracker_id() -> void:
@ -52,16 +59,13 @@ func update_tracker_id() -> void:
func update_offset() -> void: func update_offset() -> void:
$Offset.translation = offset_pos
$Offset.rotation_degrees = offset_rot
match target: match target:
TARGETS.head: TARGETS.head:
$OverlayViewport.track_relative_to_device(0, $Offset.transform) $OverlayViewport.track_relative_to_device(0, global_transform)
TARGETS.world: TARGETS.world:
$OverlayViewport.overlay_position_absolute($Offset.transform) $OverlayViewport.overlay_position_absolute(global_transform)
_: _:
$OverlayViewport.track_relative_to_device(_tracker_id, $Offset.transform) $OverlayViewport.track_relative_to_device(_tracker_id, global_transform)
func _tracker_changed(tracker_name: String, type: int, id: int): func _tracker_changed(tracker_name: String, type: int, id: int):
@ -80,18 +84,6 @@ func _set_target(new: int):
emit_signal("target_changed") emit_signal("target_changed")
func set_offset_pos(pos: Vector3):
offset_pos = pos
update_offset()
emit_signal("offset_changed")
func set_offset_rot(rot: Vector3):
offset_rot = rot
update_offset()
emit_signal("offset_changed")
func set_width_in_meters(width: float): func set_width_in_meters(width: float):
width_meters = width width_meters = width
$OverlayViewport.overlay_width_in_meters = width_meters $OverlayViewport.overlay_width_in_meters = width_meters

View file

@ -5,7 +5,7 @@ func _ready() -> void:
pass pass
func _process(delta: float) -> void: func _process(_delta: float) -> void:
_update_time() _update_time()

View file

@ -1,39 +1,17 @@
[gd_scene load_steps=10 format=2] [gd_scene load_steps=4 format=2]
[ext_resource path="res://addons/openvr_overlay/styles/normal.theme" type="Theme" id=1]
[ext_resource path="res://overlays/xyz_widget/zx.tscn" type="PackedScene" id=2] [ext_resource path="res://overlays/xyz_widget/zx.tscn" type="PackedScene" id=2]
[ext_resource path="res://addons/openvr_overlay/overlay_instance.gd" type="Script" id=3]
[ext_resource path="res://addons/openvr_overlay/styles/active.theme" type="Theme" id=4]
[ext_resource path="res://addons/openvr_overlay/interaction/overlay_interaction.gd" type="Script" id=5]
[ext_resource path="res://addons/openvr_overlay/styles/touching.theme" type="Theme" id=6]
[ext_resource path="res://overlays/xyz_widget/yz.tscn" type="PackedScene" id=7] [ext_resource path="res://overlays/xyz_widget/yz.tscn" type="PackedScene" id=7]
[ext_resource path="res://addons/openvr_overlay/OverlayInteraction.tscn" type="PackedScene" id=8]
[ext_resource path="res://addons/openvr_overlay/OverlayInstance.tscn" type="PackedScene" id=9] [ext_resource path="res://addons/openvr_overlay/OverlayInstance.tscn" type="PackedScene" id=9]
[node name="XYZ Widget" type="Node"] [node name="XYZ Widget" type="Spatial"]
[node name="YZ" type="Node" parent="." instance=ExtResource( 9 )] [node name="YZ" parent="." instance=ExtResource( 9 )]
script = ExtResource( 3 ) transform = Transform( -4.37114e-08, 0, 1, 0, 1, 0, -1, 0, -4.37114e-08, 0, 0, 0 )
target = 1 target = 1
overlay_scene = ExtResource( 7 ) overlay_scene = ExtResource( 7 )
offset_pos = Vector3( 0, 0, 0 )
offset_rot = Vector3( 0, 90, 0 )
[node name="OverlayInteraction" type="ARVROrigin" parent="YZ" instance=ExtResource( 8 )] [node name="ZX" parent="." instance=ExtResource( 9 )]
script = ExtResource( 5 ) transform = Transform( 1, 0, 0, 0, -4.37114e-08, 1, 0, -1, -4.37114e-08, 0, 0, 0 )
active_theme = ExtResource( 4 )
normal_theme = ExtResource( 1 )
touching_theme = ExtResource( 6 )
[node name="ZX" type="Node" parent="." instance=ExtResource( 9 )]
script = ExtResource( 3 )
target = 1 target = 1
overlay_scene = ExtResource( 2 ) overlay_scene = ExtResource( 2 )
offset_pos = Vector3( 0, 0, 0 )
offset_rot = Vector3( -90, 0, 0 )
[node name="OverlayInteraction" type="ARVROrigin" parent="ZX" instance=ExtResource( 8 )]
script = ExtResource( 5 )
active_theme = ExtResource( 4 )
normal_theme = ExtResource( 1 )
touching_theme = ExtResource( 6 )

View file

@ -9,7 +9,7 @@
config_version=4 config_version=4
_global_script_classes=[ { _global_script_classes=[ {
"base": "Node", "base": "Spatial",
"class": "OverlayInstance", "class": "OverlayInstance",
"language": "GDScript", "language": "GDScript",
"path": "res://addons/openvr_overlay/overlay_instance.gd" "path": "res://addons/openvr_overlay/overlay_instance.gd"