|
| 1 | +extends Node2D |
| 2 | + |
| 3 | +var vr_render_size : Vector2 |
| 4 | +var window_size : Vector2 |
| 5 | +var hmd_view_material : ShaderMaterial |
| 6 | + |
| 7 | +@onready var tracked_camera_original_transform : Transform3D = %TrackedCamera.global_transform |
| 8 | + |
| 9 | +func _reposition_texture_rect(): |
| 10 | + if window_size != Vector2() and vr_render_size != Vector2(): |
| 11 | + %HMDView.size = vr_render_size |
| 12 | + %HMDView.position = (window_size - vr_render_size) * 0.5 |
| 13 | + |
| 14 | + |
| 15 | +func _on_size_changed(): |
| 16 | + # Get our hmd view material |
| 17 | + hmd_view_material = %HMDView.material |
| 18 | + |
| 19 | + # Get the new size of our window |
| 20 | + window_size = get_tree().get_root().size |
| 21 | + |
| 22 | + # Set our container to full screen, this should update our viewport |
| 23 | + $SubViewportContainer.size = window_size |
| 24 | + |
| 25 | + _reposition_texture_rect() |
| 26 | + |
| 27 | + |
| 28 | +# Called when the node enters the scene tree for the first time. |
| 29 | +func _ready(): |
| 30 | + # Get a signal when our window size changes |
| 31 | + get_tree().get_root().size_changed.connect(_on_size_changed) |
| 32 | + |
| 33 | + # Call atleast once to initialise |
| 34 | + _on_size_changed() |
| 35 | + |
| 36 | + # Select our default view mode |
| 37 | + _on_spectator_view_item_selected(%SpectatorView.selected) |
| 38 | + |
| 39 | + # Setup our tracked camera |
| 40 | + _on_track_camera_toggled(%TrackCamera.button_pressed) |
| 41 | + |
| 42 | +func _on_spectator_view_item_selected(index): |
| 43 | + match index: |
| 44 | + 0: # Spectator camera |
| 45 | + %DesktopSubViewport.disable_3d = false |
| 46 | + %SpectatorCamera.current = true |
| 47 | + %HMDView.visible = false |
| 48 | + %TrackCamera.visible = true |
| 49 | + 1: # Left eye |
| 50 | + %DesktopSubViewport.disable_3d = true |
| 51 | + %HMDView.visible = true |
| 52 | + %TrackCamera.visible = false |
| 53 | + if hmd_view_material: |
| 54 | + var vp_texture = $VRSubViewport.get_texture() |
| 55 | + hmd_view_material.set_shader_parameter("xr_texture", vp_texture) |
| 56 | + hmd_view_material.set_shader_parameter("layer", 0) |
| 57 | + 2: # Right eye |
| 58 | + %DesktopSubViewport.disable_3d = true |
| 59 | + %HMDView.visible = true |
| 60 | + %TrackCamera.visible = false |
| 61 | + if hmd_view_material: |
| 62 | + var vp_texture = $VRSubViewport.get_texture() |
| 63 | + hmd_view_material.set_shader_parameter("xr_texture", vp_texture) |
| 64 | + hmd_view_material.set_shader_parameter("layer", 1) |
| 65 | + |
| 66 | + |
| 67 | +func _on_main_focus_gained(): |
| 68 | + vr_render_size = %Main.get_vr_render_size() |
| 69 | + _reposition_texture_rect() |
| 70 | + |
| 71 | + |
| 72 | +func _on_track_camera_toggled(toggled_on): |
| 73 | + # TODO should detect if we have camera tracking available |
| 74 | + |
| 75 | + if toggled_on: |
| 76 | + %Main.tracked_camera = %TrackedCamera |
| 77 | + else: |
| 78 | + %Main.tracked_camera = null |
| 79 | + %TrackedCamera.global_transform = tracked_camera_original_transform |
0 commit comments