58 lines
1.9 KiB
C#
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 |