ZeroVR/ZeroPacientVR/Assets/Octave3D World Builder/Scripts/Math/Box/OrientedBoxRayHit.cs

58 lines
1.9 KiB
C#

#if UNITY_EDITOR
using UnityEngine;
namespace O3DWB
{
public class OrientedBoxRayHit
{
#region Private Variables
private Ray _ray;
private float _hitEnter;
private OrientedBox _hitBox;
private Octave3DBoxCollider _hitCollider;
private Vector3 _hitPoint;
private Vector3 _hitNormal;
private BoxFace _hitFace;
#endregion
#region Public Properties
public Ray Ray { get { return _ray; } }
public float HitEnter { get { return _hitEnter; } }
public OrientedBox HitBox { get { return new OrientedBox(_hitBox); } }
public Octave3DBoxCollider HitCollider { get { return _hitCollider; } }
public Vector3 HitPoint { get { return _hitPoint; } }
public Vector3 HitNormal { get { return _hitNormal; } }
public BoxFace HitFace { get { return _hitFace; } }
#endregion
#region Constructors
public OrientedBoxRayHit(Ray ray, float hitEnter, OrientedBox hitBox)
{
_ray = ray;
_hitEnter = hitEnter;
_hitBox = new OrientedBox(hitBox);
_hitCollider = new Octave3DBoxCollider(_hitBox);
_hitPoint = ray.GetPoint(hitEnter);
_hitFace = hitBox.GetBoxFaceClosestToPoint(_hitPoint);
_hitNormal = hitBox.GetBoxFacePlane(_hitFace).normal;
CorrectHitDataForThinPlanes();
}
#endregion
#region Private Methods
private void CorrectHitDataForThinPlanes()
{
float boxSizeAlongHitNormal = _hitBox.GetSizeAlongDirection(_hitNormal);
if(boxSizeAlongHitNormal < 1e-4f &&
Vector3.Dot(_hitNormal, SceneViewCamera.Camera.transform.forward) > 0.0f)
{
_hitFace = BoxFaces.GetOpposite(_hitFace);
_hitNormal = _hitBox.GetBoxFacePlane(_hitFace).normal;
}
}
#endregion
}
}
#endif