66 lines
1.8 KiB
C#
66 lines
1.8 KiB
C#
using UnityEngine;
|
|
|
|
public class BoundsLockedObject : MonoBehaviour
|
|
{
|
|
private Vector3 m_initialOffset;
|
|
|
|
public OVRCameraRig m_playerOrigin;
|
|
|
|
public GuardianBoundaryEnforcer m_enforcer;
|
|
|
|
private Bounds? m_bounds;
|
|
|
|
private void Start()
|
|
{
|
|
m_enforcer.TrackingChanged += RefreshDisplay;
|
|
m_initialOffset = base.gameObject.transform.position - m_playerOrigin.transform.position;
|
|
Renderer component = base.gameObject.GetComponent<Renderer>();
|
|
if (component != null)
|
|
{
|
|
m_bounds = component.bounds;
|
|
}
|
|
RefreshDisplay();
|
|
}
|
|
|
|
private void RefreshDisplay()
|
|
{
|
|
if (OVRManager.boundary.GetConfigured())
|
|
{
|
|
Vector3[] geometry = OVRManager.boundary.GetGeometry(OVRBoundary.BoundaryType.PlayArea);
|
|
float num = 10000f;
|
|
float num2 = 10000f;
|
|
float num3 = -10000f;
|
|
float num4 = -10000f;
|
|
for (int i = 0; i < geometry.Length; i++)
|
|
{
|
|
geometry[i] = m_enforcer.OrientToOriginalForward * geometry[i];
|
|
num = Mathf.Min(num, geometry[i].x);
|
|
num2 = Mathf.Min(num2, geometry[i].z);
|
|
num3 = Mathf.Max(num3, geometry[i].x);
|
|
num4 = Mathf.Max(num4, geometry[i].z);
|
|
}
|
|
Bounds? bounds = m_bounds;
|
|
if (bounds.HasValue)
|
|
{
|
|
Bounds? bounds2 = m_bounds;
|
|
float num5 = bounds2.Value.size.x * 0.5f;
|
|
Bounds? bounds3 = m_bounds;
|
|
float num6 = bounds3.Value.size.z * 0.5f;
|
|
num += num5;
|
|
num3 -= num5;
|
|
num2 += num6;
|
|
num4 -= num6;
|
|
}
|
|
Vector3 vector = m_initialOffset;
|
|
vector.x = Mathf.Max(Mathf.Min(num3, m_initialOffset.x), num);
|
|
vector.z = Mathf.Max(Mathf.Min(num4, m_initialOffset.z), num2);
|
|
vector.y = base.gameObject.transform.position.y;
|
|
if (m_enforcer.m_AllowRecenter)
|
|
{
|
|
vector = Quaternion.Inverse(m_enforcer.OrientToOriginalForward) * vector;
|
|
}
|
|
base.gameObject.transform.position = vector;
|
|
}
|
|
}
|
|
}
|