Skip to content

Commit 08827b4

Browse files
committed
fix(Presence): prevent position rewind when body physics collisions off
If the Body Physics script is present and the enable collisions is disabled, then prevent a position rewind from happening as it probably means the user is wanting to clip inside geometry. If no Body Physics script is present then it will always rewind.
1 parent 94644f5 commit 08827b4

File tree

1 file changed

+26
-20
lines changed

1 file changed

+26
-20
lines changed

Assets/VRTK/Scripts/Presence/VRTK_PositionRewind.cs

Lines changed: 26 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -21,26 +21,27 @@ public class VRTK_PositionRewind : MonoBehaviour
2121
[Tooltip("The threshold to determind how low the headset can be to perform a position rewind. If the headset Y position is lower than this threshold then a rewind won't occur.")]
2222
public float crouchRewindThreshold = 0.1f;
2323

24-
private Transform headset;
25-
private Transform playArea;
24+
protected Transform headset;
25+
protected Transform playArea;
2626
protected Rigidbody playareaRigidbody;
27-
28-
private VRTK_HeadsetCollision headsetCollision;
29-
30-
private Vector3 lastGoodStandingPosition;
31-
private Vector3 lastGoodHeadsetPosition;
32-
private float highestHeadsetY;
33-
private float lastPlayAreaY;
34-
private bool lastGoodPositionSet = false;
35-
private bool hasCollided = false;
36-
private bool isColliding = false;
37-
private float collideTimer = 0f;
27+
protected VRTK_BodyPhysics bodyPhysics;
28+
protected VRTK_HeadsetCollision headsetCollision;
29+
30+
protected Vector3 lastGoodStandingPosition;
31+
protected Vector3 lastGoodHeadsetPosition;
32+
protected float highestHeadsetY;
33+
protected float lastPlayAreaY;
34+
protected bool lastGoodPositionSet = false;
35+
protected bool hasCollided = false;
36+
protected bool isColliding = false;
37+
protected float collideTimer = 0f;
3838

3939
protected virtual void OnEnable()
4040
{
4141
lastGoodPositionSet = false;
4242
headset = VRTK_DeviceFinder.HeadsetTransform();
4343
playArea = VRTK_DeviceFinder.PlayAreaTransform();
44+
bodyPhysics = FindObjectOfType<VRTK_BodyPhysics>();
4445
playareaRigidbody = playArea.GetComponent<Rigidbody>();
4546
headsetCollision = GetComponent<VRTK_HeadsetCollision>();
4647
ManageHeadsetListeners(true);
@@ -100,7 +101,7 @@ protected virtual void FixedUpdate()
100101
}
101102
}
102103

103-
private void StartCollision()
104+
protected virtual void StartCollision()
104105
{
105106
isColliding = true;
106107
if (!hasCollided && collideTimer <= 0f)
@@ -110,15 +111,20 @@ private void StartCollision()
110111
}
111112
}
112113

113-
private void EndCollision()
114+
protected virtual void EndCollision()
114115
{
115116
isColliding = false;
116117
hasCollided = false;
117118
}
118119

119-
private void RewindPosition()
120+
protected virtual bool BodyCollisionsEnabled()
121+
{
122+
return (bodyPhysics == null || bodyPhysics.enableBodyCollisions);
123+
}
124+
125+
protected virtual void RewindPosition()
120126
{
121-
if (lastGoodPositionSet && headset.localPosition.y > crouchRewindThreshold)
127+
if (lastGoodPositionSet && headset.localPosition.y > crouchRewindThreshold && BodyCollisionsEnabled())
122128
{
123129
var xReset = playArea.position.x - (headset.position.x - lastGoodHeadsetPosition.x);
124130
var zReset = playArea.position.z - (headset.position.z - lastGoodHeadsetPosition.z);
@@ -136,7 +142,7 @@ private void RewindPosition()
136142
}
137143
}
138144

139-
private void ManageHeadsetListeners(bool state)
145+
protected virtual void ManageHeadsetListeners(bool state)
140146
{
141147
if (headsetCollision)
142148
{
@@ -153,12 +159,12 @@ private void ManageHeadsetListeners(bool state)
153159
}
154160
}
155161

156-
private void HeadsetCollision_HeadsetCollisionDetect(object sender, HeadsetCollisionEventArgs e)
162+
protected virtual void HeadsetCollision_HeadsetCollisionDetect(object sender, HeadsetCollisionEventArgs e)
157163
{
158164
StartCollision();
159165
}
160166

161-
private void HeadsetCollision_HeadsetCollisionEnded(object sender, HeadsetCollisionEventArgs e)
167+
protected virtual void HeadsetCollision_HeadsetCollisionEnded(object sender, HeadsetCollisionEventArgs e)
162168
{
163169
EndCollision();
164170
}

0 commit comments

Comments
 (0)