diff --git a/resources/player.tscn b/resources/player.tscn index 9d8cfc8..369f029 100644 --- a/resources/player.tscn +++ b/resources/player.tscn @@ -81,6 +81,10 @@ shape = SubResource("SphereShape3D_ucfva") [connection signal="button_pressed" from="LeftHand" to="LeftHand" method="OnPress"] [connection signal="button_released" from="LeftHand" to="LeftHand" method="OnRelease"] [connection signal="input_float_changed" from="LeftHand" to="LeftHand" method="OnFloat"] +[connection signal="body_entered" from="LeftHand/Area3D" to="LeftHand" method="OnEnter"] +[connection signal="body_exited" from="LeftHand/Area3D" to="LeftHand" method="OnLeave"] [connection signal="button_pressed" from="RightHand" to="RightHand" method="OnPress"] [connection signal="button_released" from="RightHand" to="RightHand" method="OnRelease"] [connection signal="input_float_changed" from="RightHand" to="RightHand" method="OnFloat"] +[connection signal="body_entered" from="RightHand/Area3D" to="RightHand" method="OnEnter"] +[connection signal="body_exited" from="RightHand/Area3D" to="RightHand" method="OnLeave"] diff --git a/scripts/XRHand.cs b/scripts/XRHand.cs index 960f2f3..897d06c 100644 --- a/scripts/XRHand.cs +++ b/scripts/XRHand.cs @@ -8,35 +8,37 @@ public partial class XRHand : XRController3D [Export] RigidBody3D body; + List overlaps; + [Export] public float Strength = 1.0f; + public void OnEnter(Node3D node) + { + try + { + RigidBody3D body = (RigidBody3D)node; + overlaps.Add(body); + } + catch (System.InvalidCastException) { } + } + + public void OnLeave(Node3D node) + { + try + { + RigidBody3D body = (RigidBody3D)node; + overlaps.Remove(body); + } + catch (System.InvalidCastException) { } + } + public void OnPress(string name) { if (name == "select_button") { - var query = new PhysicsShapeQueryParameters3D(); - var sphere = new SphereShape3D(); - sphere.Radius = 0.1f * Scale.X; - query.Shape = sphere; - query.CollideWithBodies = true; - query.CollideWithAreas = false; - query.Transform = ((Node3D)GetParent()).GlobalTransform; - var overlaps = GetWorld3D().DirectSpaceState.IntersectShape(query); - foreach (var fuckingcollider in overlaps) + foreach (RigidBody3D body in overlaps) { - RigidBody3D body = null; - try - { - body = (RigidBody3D)fuckingcollider["collider"]; - } - catch (System.InvalidCastException) - { - continue; - } - - GD.Print("Detected body with mass", body.Mass); - if (body.Mass > Strength) continue; @@ -45,11 +47,13 @@ public partial class XRHand : XRController3D PinJoint3D joint = new(); joint.NodeA = body.GetPath(); joint.NodeB = this.body.GetPath(); + joint.SetParam(PinJoint3D.Param.Bias, 10f); joints.Add(joint); - + PinJoint3D joint2 = new(); joint2.NodeA = this.body.GetPath(); joint2.NodeB = body.GetPath(); + joint2.SetParam(PinJoint3D.Param.Bias, 10f); joints.Add(joint2); this.body.AddChild(joint);