Compare commits

...

2 Commits

Author SHA1 Message Date
rodolpheh 56c5ee15e0 Make cube demo XR compatible 2023-11-06 22:52:47 +00:00
rodolpheh d5ed6a0d32 Add post-action copy dll for Windows 2023-11-06 20:35:49 +00:00
11 changed files with 103 additions and 22 deletions

View File

@ -16,6 +16,8 @@ env = SConscript("godot-cpp/SConstruct")
# tweak this if you want to use different folders, or more folders, to store your source code in.
env.Append(CPPPATH=["src/"])
sources = Glob("src/*.cpp")
post_actions = []
library = None
if env["platform"] == "macos":
target = "demo/addons/godot_ultraleap_plugin/bin/libgdultraleap.{}.{}.framework/libgdultraleap.{}.{}".format(
@ -51,6 +53,10 @@ elif env["platform"] == "windows":
env.Append(LIBS=['LeapC'])
env.Append(LIBPATH = ['C:/Program Files/Ultraleap/LeapSDK/lib/x64'])
env.Append(CPPPATH = ["C:/Program Files/Ultraleap/LeapSDK/include"])
post_actions = [
Copy("demo/addons/godot_ultraleap_plugin/bin/LeapC.dll", "C:/Program Files/Ultraleap/LeapSDK/lib/x64/LeapC.dll")
]
elif env["platform"] == "android":
library = env.SharedLibrary(
"demo/addons/godot_ultraleap_plugin/bin/libgdultraleap{}{}".format(env["suffix"], env["SHLIBSUFFIX"]),
@ -69,9 +75,6 @@ elif env["platform"] == "android":
Copy("demo/android/plugins/ultraleap_binder/ultraleap-binder-debug.aar", "godot-ultraleap-binder/ultraleap-binder/build/outputs/aar/ultraleap-binder-debug.aar"),
Copy("demo/addons/godot_ultraleap_plugin/bin/libLeapC.so", "android/libLeapC.so")
]
for post_action in post_actions:
AddPostAction(library, post_action)
else:
library = env.SharedLibrary(
"demo/addons/godot_ultraleap_plugin/bin/libgdultraleap{}{}".format(env["suffix"], env["SHLIBSUFFIX"]),
@ -80,4 +83,10 @@ else:
env.Append(LIBS=['LeapC'])
env.Append(LIBPATH = ['/usr/lib/ultraleap-hand-tracking-service'])
Default(library)
if library is not None:
for post_action in post_actions:
AddPostAction(library, post_action)
Default(library)
else:
print("Nothing to build, weird")

View File

@ -16,6 +16,7 @@ android.release.arm64 = "bin/libgdultraleap.android.template_release.arm64.so"
[dependencies]
android.debug.arm64 = {
"bin/libLeapC.so": ""
}
android.debug.arm64 = { "bin/libLeapC.so": "" }
android.release.arm64 = { "bin/libLeapC.so": "" }
windows.debug.x86_64 = { "bin/LeapC.dll": "" }
windows.release.x86_64 = { "bin/LeapC.dll": "" }

View File

@ -86,7 +86,7 @@ name="Android"
platform="Android"
runnable=true
dedicated_server=false
custom_features=""
custom_features="openxr"
export_filter="all_resources"
include_filter=""
exclude_filter=""
@ -104,6 +104,10 @@ gradle_build/use_gradle_build=true
gradle_build/export_format=0
gradle_build/min_sdk="29"
gradle_build/target_sdk=""
plugins/GodotOpenXRMeta=false
plugins/GodotOpenXRLynx=false
plugins/GodotOpenXRKHR=false
plugins/GodotOpenXRPico=true
plugins/UltraleapBinder=true
architectures/armeabi-v7a=false
architectures/arm64-v8a=true

View File

@ -11,7 +11,7 @@ config_version=5
[application]
config/name="UltraleapPluginDemo"
run/main_scene="res://main.tscn"
run/main_scene="res://scenes/RiggedHand.tscn"
config/features=PackedStringArray("4.1", "Forward Plus")
config/icon="res://icon.svg"
@ -84,9 +84,15 @@ paths=["res://addons/godot_ultraleap_plugin/godot_ultraleap_plugin.gdextension"]
[physics]
common/physics_ticks_per_second=120
3d/default_gravity=0.0
[rendering]
textures/vram_compression/import_etc2_astc=true
lights_and_shadows/directional_shadow/soft_shadow_filter_quality=5
anti_aliasing/quality/msaa_3d=3
[xr]
openxr/enabled.openxr=true
shaders/enabled.openxr=true

View File

@ -0,0 +1,7 @@
[gd_scene format=3 uid="uid://bnd6tg32nxvmv"]
[node name="Player" type="Node3D"]
[node name="Camera3D" type="Camera3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 0.903336, 0.428935, 0, -0.428935, 0.903336, 0, 0.33, 0.355)
near = 0.001

View File

@ -0,0 +1,11 @@
[gd_scene format=3 uid="uid://cjktnaeh5lf7n"]
[node name="XRPlayer" type="Node3D"]
[node name="XROrigin3D" type="XROrigin3D" parent="."]
[node name="XRCamera3D" type="XRCamera3D" parent="XROrigin3D"]
near = 0.001
[node name="DeviceContainer" type="Node3D" parent="XROrigin3D/XRCamera3D"]
transform = Transform3D(-1, 0, -8.74228e-08, 8.74228e-08, -4.37114e-08, -1, -3.82137e-15, -1, 4.37114e-08, 0, 0, 0)

View File

@ -188,6 +188,7 @@ radius = 0.00197651
height = 0.0197651
[node name="RiggedHand" type="Node3D" node_paths=PackedStringArray("origin_hands", "rigged_hands", "spawner")]
process_mode = 4
script = ExtResource("1_58k8d")
origin_hands = NodePath("HandTracking/Debug/OriginHands")
rigged_hands = NodePath("Scene/XRToolsHands")
@ -852,10 +853,6 @@ shape = SubResource("CapsuleShape3D_yy4pl")
visible = false
update_mode = 1
[node name="Camera3D" type="Camera3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 0.903336, 0.428935, 0, -0.428935, 0.903336, 0, 0.33, 0.355)
near = 0.001
[node name="HandTracking" type="Node3D" parent="."]
[node name="UltraleapHandTracking" type="UltraleapHandTracking" parent="HandTracking"]
@ -863,7 +860,6 @@ script = ExtResource("1_r2upn")
[node name="UltraleapDeviceNode" type="UltraleapDeviceNode" parent="HandTracking"]
tracker = NodePath("../UltraleapHandTracking")
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.252083, 0, 0)
[node name="HandRiggers" type="Node3D" parent="HandTracking"]

View File

@ -4,6 +4,37 @@ extends Node3D
@export var rigged_hands : Node3D
@export var spawner : CubeSpawner
@export var cube_material : PhysicsMaterial
@export var xr : bool = true
var xr_interface: XRInterface
func _ready():
if not xr:
var player : Resource = load("res://scenes/Players/Player.tscn")
var player_node : Node3D = player.instantiate()
add_child(player_node)
return
xr_interface = XRServer.find_interface("OpenXR")
if xr_interface and xr_interface.is_initialized():
print("OpenXR initialised successfully")
var player : Resource = load("res://scenes/Players/XRPlayer.tscn")
var player_node : Node3D = player.instantiate()
add_child(player_node)
var source : UltraleapDeviceNode = $HandTracking/UltraleapDeviceNode
var target : Node3D = player_node.get_node("XROrigin3D").get_node("XRCamera3D").get_node("DeviceContainer")
source.reparent(target, false)
# Turn off v-sync!
DisplayServer.window_set_vsync_mode(DisplayServer.VSYNC_DISABLED)
# Change our main viewport to output to the HMD
get_viewport().use_xr = true
else:
print("OpenXR not initialized, please check if your headset is connected")
func disable_gravity():
PhysicsServer3D.area_set_param(get_viewport().find_world_3d().space, PhysicsServer3D.AREA_PARAM_GRAVITY, 0)

View File

@ -53,7 +53,10 @@ func _physics_process(delta):
var left_hand : UltraleapHand = left_hand_pinch_detector.hand
var right_hand : UltraleapHand = right_hand_pinch_detector.hand
var dist : float = left_hand.thumb.distal.next_joint.distance_to(right_hand.thumb.distal.next_joint)
#var dist : float = left_hand.thumb.distal.next_joint.distance_to(right_hand.thumb.distal.next_joint)
var dist : float = left_hand_pinch_detector.pinch_transform.origin.distance_to(
right_hand_pinch_detector.pinch_transform.origin
)
# Detect when they just got pinched
if !both_pinched && dist <= pinch_distance:
@ -81,10 +84,14 @@ func _physics_process(delta):
var size : float = clamp(dist - size_offset, min_cube_size, max_cube_size)
spawn_size = Vector3(size, size, size)
spawn_position = (right_hand.thumb.distal.next_joint + left_hand.thumb.distal.next_joint) / 2
var line : Vector3 = right_hand.thumb.distal.next_joint - left_hand.thumb.distal.next_joint
#spawn_position = (right_hand.thumb.distal.next_joint + left_hand.thumb.distal.next_joint) / 2
spawn_position = left_hand_pinch_detector.pinch_transform.interpolate_with(
right_hand_pinch_detector.pinch_transform, 0.5
).origin
#var line : Vector3 = right_hand.thumb.distal.next_joint - left_hand.thumb.distal.next_joint
var line : Vector3 = right_hand_pinch_detector.pinch_transform.origin - left_hand_pinch_detector.pinch_transform.origin
# Meh... Calculating the euler angles. Feels like it could be better...
var z_angle : float = -atan2(line.y, line.x)
var y_angle : float = -atan2(line.z, line.x)

View File

@ -50,8 +50,9 @@ func _process(_delta):
skeleton.hide()
func set_hand(hand : UltraleapHand):
transform_offset = tracking.global_transform.inverse()
if rig_settings.set_arm:
transform_offset = set_arm(hand)
transform_offset *= set_arm(hand)
if rig_settings.set_palm:
set_palm(hand)

View File

@ -14,6 +14,8 @@ signal unpinched
var is_pinched : bool = false
var hand : UltraleapHand = null
var pinch_transform : Transform3D = Transform3D.IDENTITY
func _ready():
pass
@ -36,6 +38,11 @@ func _process(_delta):
var pinch_strength : float = hand.pinch_strength
var pinch_position : Vector3 = (hand.index.distal.next_joint + hand.thumb.distal.next_joint) / 2.0
var pinch_base : Basis = Basis(hand.thumb.distal.rotation.slerp(hand.index.distal.rotation, 0.5))
pinch_transform = tracking.global_transform * Transform3D(pinch_base, pinch_position)
if pinch_strength > pinch_threshold && !is_pinched:
is_pinched = true
pinched.emit()
@ -46,5 +53,6 @@ func _process(_delta):
if debug:
display.set_pinch_strength(pinch_strength)
display.set_pinch_position((hand.index.distal.next_joint + hand.thumb.distal.next_joint) / 2.0)
display.set_pinch_rotation(hand.thumb.distal.rotation.slerp(hand.index.distal.rotation, 0.5))
display.set_pinch_position(pinch_transform.origin)
display.set_pinch_rotation(pinch_transform.basis.get_rotation_quaternion())