12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758 |
- #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
|