Skip to content

Commit 29f9a4a

Browse files
committed
feat(Portal): Separated PortalVicinity and PortalCollisionFiltering
1 parent 2bfe7a5 commit 29f9a4a

17 files changed

+499
-563
lines changed

Assets/MainScene.unity

+129-129
Large diffs are not rendered by default.

Assets/Prefabs/Portal.prefab

+76-203
Large diffs are not rendered by default.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
using UnityEngine;
2+
using PerceptionVR.Portal;
3+
4+
namespace PerceptionVR.Extensions
5+
{
6+
public static class PortalExtensions
7+
{
8+
public static Pose PairPose(this Portal.Portal portal, Pose pose) => portal.PairPose(pose, out _);
9+
10+
public static Pose PairPose(this Portal.Portal portal, Pose pose, out Quaternion portalRotationDelta)
11+
{
12+
Pose resultPose;
13+
14+
portalRotationDelta = portal.portalPair.transform.rotation * Quaternion.Euler(0, 180, 0) * Quaternion.Inverse(portal.transform.rotation);
15+
16+
// Calculate position
17+
resultPose.position = portal.portalPair.transform.position + portalRotationDelta * (pose.position - portal.transform.position);
18+
19+
// Rotation rotation
20+
resultPose.rotation = portalRotationDelta * pose.rotation;
21+
22+
return resultPose;
23+
}
24+
}
25+
}

Assets/Scripts/Extensions/PortalExtensions.cs.meta

+3
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Assets/Scripts/Physics/Colliders/Subscribable/SubscribableTrigger.cs

+3-13
Original file line numberDiff line numberDiff line change
@@ -40,20 +40,10 @@ private void ProcessQueue()
4040
{
4141
OnBeforeProcessQueue?.Invoke();
4242
while (onTriggerEnterQueue.Count > 0)
43-
{
44-
var col = onTriggerEnterQueue.Dequeue();
45-
if(col == null) continue;
46-
Debugger.LogInfo($"TriggerEnter dequeue {col}");
47-
onTriggerEnter?.Invoke(col);
48-
}
49-
43+
onTriggerEnter?.Invoke(onTriggerEnterQueue.Dequeue());
44+
5045
while (onTriggerExitQueue.Count > 0)
51-
{
52-
var col = onTriggerExitQueue.Dequeue();
53-
if(col == null) continue;
54-
Debugger.LogInfo($"TriggerExit dequeue {col}");
55-
onTriggerExit?.Invoke(col);
56-
}
46+
onTriggerExit?.Invoke(onTriggerExitQueue.Dequeue());
5747
}
5848

5949
protected virtual void OnTriggerEnter(Collider other)

Assets/Scripts/Player/PlayerInputAction.cs

+22
Original file line numberDiff line numberDiff line change
@@ -475,6 +475,17 @@ public @PlayerInputAction()
475475
""isComposite"": false,
476476
""isPartOfComposite"": false
477477
},
478+
{
479+
""name"": """",
480+
""id"": ""4f2d01e6-ed72-427c-a9b6-9d79ba4594cc"",
481+
""path"": ""<ViveWand>{LeftHand}/trackpad"",
482+
""interactions"": """",
483+
""processors"": """",
484+
""groups"": """",
485+
""action"": ""Move"",
486+
""isComposite"": false,
487+
""isPartOfComposite"": false
488+
},
478489
{
479490
""name"": """",
480491
""id"": ""103599a4-4b1b-4263-865d-36cffb67fdeb"",
@@ -486,6 +497,17 @@ public @PlayerInputAction()
486497
""isComposite"": false,
487498
""isPartOfComposite"": false
488499
},
500+
{
501+
""name"": """",
502+
""id"": ""2844d8da-04ba-4277-b839-58adde80e639"",
503+
""path"": ""<ViveWand>{RightHand}/trackpad"",
504+
""interactions"": """",
505+
""processors"": """",
506+
""groups"": """",
507+
""action"": ""Rotate"",
508+
""isComposite"": false,
509+
""isPartOfComposite"": false
510+
},
489511
{
490512
""name"": """",
491513
""id"": ""1fe5a410-5756-462b-beb4-01f8d7455f3d"",

Assets/Scripts/Player/PlayerInputAction.inputactions

+22
Original file line numberDiff line numberDiff line change
@@ -453,6 +453,17 @@
453453
"isComposite": false,
454454
"isPartOfComposite": false
455455
},
456+
{
457+
"name": "",
458+
"id": "4f2d01e6-ed72-427c-a9b6-9d79ba4594cc",
459+
"path": "<ViveWand>{LeftHand}/trackpad",
460+
"interactions": "",
461+
"processors": "",
462+
"groups": "",
463+
"action": "Move",
464+
"isComposite": false,
465+
"isPartOfComposite": false
466+
},
456467
{
457468
"name": "",
458469
"id": "103599a4-4b1b-4263-865d-36cffb67fdeb",
@@ -464,6 +475,17 @@
464475
"isComposite": false,
465476
"isPartOfComposite": false
466477
},
478+
{
479+
"name": "",
480+
"id": "2844d8da-04ba-4277-b839-58adde80e639",
481+
"path": "<ViveWand>{RightHand}/trackpad",
482+
"interactions": "",
483+
"processors": "",
484+
"groups": "",
485+
"action": "Rotate",
486+
"isComposite": false,
487+
"isPartOfComposite": false
488+
},
467489
{
468490
"name": "",
469491
"id": "1fe5a410-5756-462b-beb4-01f8d7455f3d",

Assets/Scripts/Portal/Clone/PortalCloneSystem.cs

+36-17
Original file line numberDiff line numberDiff line change
@@ -10,45 +10,60 @@
1010

1111
namespace PerceptionVR.Portal
1212
{
13-
public class PortalCloneSystem : PortalCollisionFilteringSystem
13+
[RequireComponent(typeof(Portal), typeof(PortalVicinity), typeof(PortalCollisionFilteringSystem))]
14+
public class PortalCloneSystem : MonoBehaviour
1415
{
15-
[SerializeField] private List<NearbyTeleportable> vicinity = new();
16+
[SerializeField] private List<NearbyTeleportable> objectsInVicinity = new();
1617

18+
private Portal portal;
19+
private PortalVicinity vicinity;
20+
private PortalCollisionFilteringSystem collisionFilteringSystem;
1721
private PortalCloneSystem pairCloneSystem;
1822

19-
protected override void Awake()
23+
private void Awake()
2024
{
21-
base.Awake();
25+
portal = GetComponent<Portal>();
26+
vicinity = GetComponent<PortalVicinity>();
27+
collisionFilteringSystem = GetComponent<PortalCollisionFilteringSystem>();
28+
2229
portal.OnPortalPairSet += portalPair =>
2330
{
2431
pairCloneSystem = portalPair.transform.GetComponentInChildren<PortalCloneSystem>();
2532
};
2633
portal.OnPortalPairUnset += () =>
2734
{
28-
vicinity.ToList().ForEach(UnregisterTeleportable);
35+
objectsInVicinity.ToList().ForEach(UnregisterTeleportable);
2936
pairCloneSystem = null;
3037
};
3138

32-
OnEnteredVicinity += OnVicinityEnter;
33-
OnExitedVicinity += OnVicinityExit;
39+
vicinity.OnOutsideToFront += OnVicinityEnter;
40+
vicinity.OnFrontToOutside += OnVicinityExit;
41+
42+
vicinity.OnBackToFront += OnVicinityEnter;
43+
vicinity.OnFrontToBack += OnVicinityExit;
44+
3445
GlobalEvents.OnTeleport += OnTeleportCallback;
3546
}
3647

3748

3849
private void OnVicinityEnter(Collider other)
3950
{
51+
// Ignore if clone is coming around the portal
52+
if(collisionFilteringSystem.cloneGroup.Contains(other))
53+
return;
54+
4055
Debugger.LogInfo($"{other} entered vicinity of {this}");
4156
var tp = other.GetComponentInParent<ITeleportable>();
4257

4358
// Get nearby teleportable
44-
var nearbyTeleportable = vicinity.FirstOrDefault(x => x.teleportable == tp);
59+
var nearbyTeleportable = objectsInVicinity.FirstOrDefault(x => x.teleportable == tp);
4560
if (nearbyTeleportable != null)
4661
{
4762
nearbyTeleportable.collidersInVicinity.Add(other);
4863
return;
4964
}
5065

51-
nearbyTeleportable = pairCloneSystem.vicinity.FirstOrDefault(x => x.cloneTeleportable == tp);
66+
nearbyTeleportable = pairCloneSystem.objectsInVicinity.FirstOrDefault(x => x.cloneTeleportable == tp);
5267
if (nearbyTeleportable != null)
5368
{
5469
nearbyTeleportable.cloneColliderInPairVicinity.Add(other);
@@ -64,10 +79,14 @@ private void OnVicinityEnter(Collider other)
6479

6580
private void OnVicinityExit(Collider other)
6681
{
82+
// Ignore if clone is coming around the portal
83+
if(collisionFilteringSystem.cloneGroup.Contains(other))
84+
return;
85+
6786
Debugger.LogInfo($"{other} exited vicinity of {this}");
6887
var tp = other.GetComponentInParent<ITeleportable>();
6988

70-
var nearbyTeleportable = vicinity.FirstOrDefault(x => x.teleportable == tp);
89+
var nearbyTeleportable = objectsInVicinity.FirstOrDefault(x => x.teleportable == tp);
7190
if (nearbyTeleportable != null)
7291
{
7392
nearbyTeleportable.collidersInVicinity.Remove(other);
@@ -76,7 +95,7 @@ private void OnVicinityExit(Collider other)
7695
return;
7796
}
7897

79-
nearbyTeleportable = pairCloneSystem.vicinity.FirstOrDefault(x => x.cloneTeleportable == tp);
98+
nearbyTeleportable = pairCloneSystem.objectsInVicinity.FirstOrDefault(x => x.cloneTeleportable == tp);
8099
if (nearbyTeleportable != null)
81100
nearbyTeleportable.cloneColliderInPairVicinity.Remove(other);
82101
}
@@ -90,12 +109,12 @@ private NearbyTeleportable RegisterTeleportable(ITeleportable teleportable)
90109

91110
// Register teleportable
92111
var nearbyTeleportable = new NearbyTeleportable(teleportable, clone);
93-
vicinity.Add(nearbyTeleportable);
112+
objectsInVicinity.Add(nearbyTeleportable);
94113

95114
// Add clone colliders to nearbyTeleportable and pair's cloneGroup
96115
var cloneColliders = clone.transform.GetComponentsInChildren<Collider>();
97116
nearbyTeleportable.cloneColliderInPairVicinity.AddRange(cloneColliders);
98-
pairCloneSystem.cloneGroup.AddRange(cloneColliders);
117+
pairCloneSystem.collisionFilteringSystem.cloneGroup.AddRange(cloneColliders);
99118

100119
return nearbyTeleportable;
101120
}
@@ -108,15 +127,15 @@ private void UnregisterTeleportable(NearbyTeleportable teleportable)
108127
GameObjectUtility.DestroyNotify(teleportable.cloneTeleportable.gameObject);
109128

110129
// Unregister teleportable
111-
vicinity.Remove(teleportable);
130+
objectsInVicinity.Remove(teleportable);
112131
}
113132

114133

115134
private void OnTeleportCallback(TeleportData teleportData)
116135
{
117136
// nt = "nearby teleportable"
118137

119-
var nt = vicinity.FirstOrDefault(x => x.teleportable == teleportData.teleportable && portal == teleportData.inPortal);
138+
var nt = objectsInVicinity.FirstOrDefault(x => x.teleportable == teleportData.teleportable && portal == teleportData.inPortal);
120139
if(nt == null)
121140
return;
122141

@@ -135,8 +154,8 @@ private void OnTeleportCallback(TeleportData teleportData)
135154
(nt.collidersInVicinity, nt.cloneColliderInPairVicinity) = (nt.cloneColliderInPairVicinity, nt.collidersInVicinity);
136155

137156
// Transfer nt to pair
138-
vicinity.Remove(nt);
139-
pairCloneSystem.vicinity.Add(nt);
157+
objectsInVicinity.Remove(nt);
158+
pairCloneSystem.objectsInVicinity.Add(nt);
140159
}
141160

142161

Assets/Scripts/Portal/Portal.cs

+2-23
Original file line numberDiff line numberDiff line change
@@ -30,10 +30,9 @@ private void Start()
3030

3131
public void Teleport(ITeleportable teleportable)
3232
{
33-
var pairPose = PairPose(teleportable.transform.GetPose(), out var rotationDelta);
34-
3533
// Teleport the object
36-
teleportable.transform.SetPositionAndRotation(pairPose.position, pairPose.rotation);
34+
var pairPose = this.PairPose(teleportable.transform.GetPose(), out var rotationDelta);
35+
teleportable.transform.SetPose(pairPose);
3736

3837
// Translate velocity
3938
foreach (var teleportedRB in teleportable.transform.GetComponentsInChildren<Rigidbody>())
@@ -55,25 +54,5 @@ public void Teleport(ITeleportable teleportable)
5554
GlobalEvents.OnTeleport?.Invoke(teleportData);
5655
teleportable.OnTeleport?.Invoke(teleportData);
5756
}
58-
59-
60-
public virtual Pose PairPose(Pose pose) => PairPose(pose, out _);
61-
62-
public virtual Pose PairPose(Pose pose, out Quaternion portalRotationDelta)
63-
{
64-
Pose resultPose;
65-
66-
portalRotationDelta = portalPair.transform.rotation * Quaternion.Euler(0, 180, 0) * Quaternion.Inverse(transform.rotation);
67-
68-
// Calculate position
69-
resultPose.position = portalPair.transform.position + portalRotationDelta * (pose.position - transform.position);
70-
71-
// Rotation rotation
72-
resultPose.rotation = portalRotationDelta * pose.rotation;
73-
74-
return resultPose;
75-
}
7657
}
7758
}
78-
79-

0 commit comments

Comments
 (0)