2024-05-08 07:40:09 +00:00
|
|
|
extends Node3D
|
|
|
|
|
|
|
|
|
|
var xr_interface: XRInterface
|
2024-05-10 13:41:20 +02:00
|
|
|
var xrf
|
|
|
|
|
var scene
|
|
|
|
|
var player:CharacterBody3D
|
2024-05-08 07:40:09 +00:00
|
|
|
|
|
|
|
|
func _ready():
|
2024-05-10 13:41:20 +02:00
|
|
|
xrf = preload("res://xrfragment.gd").new()
|
2024-05-17 17:44:04 +02:00
|
|
|
|
|
|
|
|
# browser extensions src regex handler func
|
|
|
|
|
# ---------- -------------
|
|
|
|
|
xrf.src.addExtension.call("^#", xrf.src.model ) # enable internal embeds
|
|
|
|
|
xrf.src.addExtension.call(".*\\.glb", xrf.src.model ) # enable external embeds
|
|
|
|
|
xrf.src.addExtension.call(".*\\.gltf", xrf.src.model ) #
|
|
|
|
|
xrf.src.addExtension.call(".*\\.wav$", xrf.src.audio ) #
|
|
|
|
|
xrf.src.addExtension.call(".*\\.ogg$", xrf.src.audio ) #
|
|
|
|
|
xrf.src.addExtension.call(".*\\.mp3$", xrf.src.audio ) #
|
2024-05-16 19:11:43 +02:00
|
|
|
|
2024-05-08 07:40:09 +00:00
|
|
|
add_child(xrf)
|
2024-05-17 18:29:30 +02:00
|
|
|
xrf.to("https://xrfragment.org/other.glb", _onXRF )
|
2024-05-16 14:22:00 +02:00
|
|
|
player = find_child("PlayerBody") # optional: use PlayerBody from godot-xr-tools
|
|
|
|
|
player.enabled = false # optional: turn off gravity
|
|
|
|
|
|
2024-05-08 07:40:09 +00:00
|
|
|
|
2024-05-10 13:41:20 +02:00
|
|
|
func _onXRF(event:String,data ):
|
|
|
|
|
if event == "scene_loaded":
|
|
|
|
|
scene = data
|
2024-05-16 14:22:00 +02:00
|
|
|
if event == 'href':
|
2024-05-13 14:11:02 +02:00
|
|
|
print(data)
|
2024-05-16 14:22:00 +02:00
|
|
|
if event == 'src':
|
2024-05-14 17:14:01 +02:00
|
|
|
print(data)
|
2024-05-13 14:11:02 +02:00
|
|
|
if event == 'teleport':
|
|
|
|
|
print("teleport!")
|
2024-05-14 17:14:01 +02:00
|
|
|
#player.teleport( data ) # optional: use PlayerBody
|
2024-05-13 14:11:02 +02:00
|
|
|
find_child("XROrigin3D").position = data.origin
|
2024-05-14 17:14:01 +02:00
|
|
|
|
|
|
|
|
# update URL bar
|
|
|
|
|
# spec 4 @ https://xrfragment.org/doc/RFC_XR_Fragments.html#navigating-content-href-portals
|
|
|
|
|
var URLbar:RichTextLabel = find_child("URLbar")
|
|
|
|
|
URLbar.text = xrf.URI.string
|
2024-05-13 14:11:02 +02:00
|
|
|
|
2024-05-10 13:41:20 +02:00
|
|
|
|
|
|
|
|
func _input(event):
|
2024-05-13 14:11:02 +02:00
|
|
|
var cam = find_child("XRCamera3D")
|
2024-05-10 13:41:20 +02:00
|
|
|
if event is InputEventMouseMotion:
|
2024-05-14 17:14:01 +02:00
|
|
|
var mouse_sens = 0.3
|
2024-05-10 13:41:20 +02:00
|
|
|
cam.rotate_y(deg_to_rad(-event.relative.x*mouse_sens))
|
2024-05-14 17:14:01 +02:00
|
|
|
if event is InputEventMouseButton and event.pressed:
|
|
|
|
|
if event.button_index == 2:
|
|
|
|
|
xrf.back()
|
|
|
|
|
|
|
|
|
|
if event.button_index == 3:
|
|
|
|
|
xrf.forward()
|
|
|
|
|
|
|
|
|
|
if event.button_index == 1:
|
|
|
|
|
# raycast to detect clicked item
|
|
|
|
|
var mouse_pos = get_viewport().get_mouse_position()
|
|
|
|
|
var from = cam.project_ray_origin(mouse_pos)
|
|
|
|
|
var to = from + cam.project_ray_normal(mouse_pos) * 20000 #200
|
|
|
|
|
var space_state = get_world_3d().direct_space_state
|
|
|
|
|
var handle_query = PhysicsRayQueryParameters3D.create(from, to)
|
|
|
|
|
handle_query.collide_with_areas = true
|
|
|
|
|
var mesh_query = PhysicsRayQueryParameters3D.create(from, to)
|
|
|
|
|
mesh_query.collide_with_areas = true
|
|
|
|
|
var intersectMesh = space_state.intersect_ray(mesh_query)
|
|
|
|
|
var intersectHandle = space_state.intersect_ray(handle_query)
|
|
|
|
|
if intersectMesh.has('collider'):
|
2024-05-16 14:22:00 +02:00
|
|
|
xrf.traverse( intersectMesh.collider, xrf.href.click )
|
2024-05-10 13:41:20 +02:00
|
|
|
|
|
|
|
|
|