using System;
using System.Runtime.InteropServices;
using UnityEngine;

public class OVRBoundary
{
	public bool GetConfigured()
	{
		return OVRPlugin.GetBoundaryConfigured();
	}

	public OVRBoundary.BoundaryTestResult TestNode(OVRBoundary.Node node, OVRBoundary.BoundaryType boundaryType)
	{
		OVRPlugin.BoundaryTestResult boundaryTestResult = OVRPlugin.TestBoundaryNode((OVRPlugin.Node)node, (OVRPlugin.BoundaryType)boundaryType);
		return new OVRBoundary.BoundaryTestResult
		{
			IsTriggering = (boundaryTestResult.IsTriggering == OVRPlugin.Bool.True),
			ClosestDistance = boundaryTestResult.ClosestDistance,
			ClosestPoint = boundaryTestResult.ClosestPoint.FromFlippedZVector3f(),
			ClosestPointNormal = boundaryTestResult.ClosestPointNormal.FromFlippedZVector3f()
		};
	}

	public OVRBoundary.BoundaryTestResult TestPoint(Vector3 point, OVRBoundary.BoundaryType boundaryType)
	{
		OVRPlugin.BoundaryTestResult boundaryTestResult = OVRPlugin.TestBoundaryPoint(point.ToFlippedZVector3f(), (OVRPlugin.BoundaryType)boundaryType);
		return new OVRBoundary.BoundaryTestResult
		{
			IsTriggering = (boundaryTestResult.IsTriggering == OVRPlugin.Bool.True),
			ClosestDistance = boundaryTestResult.ClosestDistance,
			ClosestPoint = boundaryTestResult.ClosestPoint.FromFlippedZVector3f(),
			ClosestPointNormal = boundaryTestResult.ClosestPointNormal.FromFlippedZVector3f()
		};
	}

	public void SetLookAndFeel(OVRBoundary.BoundaryLookAndFeel lookAndFeel)
	{
		OVRPlugin.BoundaryLookAndFeel boundaryLookAndFeel = new OVRPlugin.BoundaryLookAndFeel
		{
			Color = lookAndFeel.Color.ToColorf()
		};
		OVRPlugin.SetBoundaryLookAndFeel(boundaryLookAndFeel);
	}

	public void ResetLookAndFeel()
	{
		OVRPlugin.ResetBoundaryLookAndFeel();
	}

	public Vector3[] GetGeometry(OVRBoundary.BoundaryType boundaryType)
	{
		int num = 0;
		if (OVRPlugin.GetBoundaryGeometry2((OVRPlugin.BoundaryType)boundaryType, IntPtr.Zero, ref num))
		{
			int num2 = num * OVRBoundary.cachedVector3fSize;
			if (OVRBoundary.cachedGeometryNativeBuffer.GetCapacity() < num2)
			{
				OVRBoundary.cachedGeometryNativeBuffer.Reset(num2);
			}
			int num3 = num * 3;
			if (OVRBoundary.cachedGeometryManagedBuffer.Length < num3)
			{
				OVRBoundary.cachedGeometryManagedBuffer = new float[num3];
			}
			if (OVRPlugin.GetBoundaryGeometry2((OVRPlugin.BoundaryType)boundaryType, OVRBoundary.cachedGeometryNativeBuffer.GetPointer(0), ref num))
			{
				Marshal.Copy(OVRBoundary.cachedGeometryNativeBuffer.GetPointer(0), OVRBoundary.cachedGeometryManagedBuffer, 0, num3);
				Vector3[] array = new Vector3[num];
				for (int i = 0; i < num; i++)
				{
					array[i] = new OVRPlugin.Vector3f
					{
						x = OVRBoundary.cachedGeometryManagedBuffer[3 * i],
						y = OVRBoundary.cachedGeometryManagedBuffer[3 * i + 1],
						z = OVRBoundary.cachedGeometryManagedBuffer[3 * i + 2]
					}.FromFlippedZVector3f();
				}
				return array;
			}
		}
		return new Vector3[0];
	}

	public Vector3 GetDimensions(OVRBoundary.BoundaryType boundaryType)
	{
		return OVRPlugin.GetBoundaryDimensions((OVRPlugin.BoundaryType)boundaryType).FromVector3f();
	}

	public bool GetVisible()
	{
		return OVRPlugin.GetBoundaryVisible();
	}

	public void SetVisible(bool value)
	{
		OVRPlugin.SetBoundaryVisible(value);
	}

	private static int cachedVector3fSize = Marshal.SizeOf(typeof(OVRPlugin.Vector3f));

	private static OVRNativeBuffer cachedGeometryNativeBuffer = new OVRNativeBuffer(0);

	private static float[] cachedGeometryManagedBuffer = new float[0];

	public enum Node
	{
		HandLeft = 3,
		HandRight,
		Head = 9
	}

	public enum BoundaryType
	{
		OuterBoundary = 1,
		PlayArea = 256
	}

	public struct BoundaryTestResult
	{
		public bool IsTriggering;

		public float ClosestDistance;

		public Vector3 ClosestPoint;

		public Vector3 ClosestPointNormal;
	}

	public struct BoundaryLookAndFeel
	{
		public Color Color;
	}
}
