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(); 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; } } }