OrientedBoxRayHit.cs 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. #if UNITY_EDITOR
  2. using UnityEngine;
  3. namespace O3DWB
  4. {
  5. public class OrientedBoxRayHit
  6. {
  7. #region Private Variables
  8. private Ray _ray;
  9. private float _hitEnter;
  10. private OrientedBox _hitBox;
  11. private Octave3DBoxCollider _hitCollider;
  12. private Vector3 _hitPoint;
  13. private Vector3 _hitNormal;
  14. private BoxFace _hitFace;
  15. #endregion
  16. #region Public Properties
  17. public Ray Ray { get { return _ray; } }
  18. public float HitEnter { get { return _hitEnter; } }
  19. public OrientedBox HitBox { get { return new OrientedBox(_hitBox); } }
  20. public Octave3DBoxCollider HitCollider { get { return _hitCollider; } }
  21. public Vector3 HitPoint { get { return _hitPoint; } }
  22. public Vector3 HitNormal { get { return _hitNormal; } }
  23. public BoxFace HitFace { get { return _hitFace; } }
  24. #endregion
  25. #region Constructors
  26. public OrientedBoxRayHit(Ray ray, float hitEnter, OrientedBox hitBox)
  27. {
  28. _ray = ray;
  29. _hitEnter = hitEnter;
  30. _hitBox = new OrientedBox(hitBox);
  31. _hitCollider = new Octave3DBoxCollider(_hitBox);
  32. _hitPoint = ray.GetPoint(hitEnter);
  33. _hitFace = hitBox.GetBoxFaceClosestToPoint(_hitPoint);
  34. _hitNormal = hitBox.GetBoxFacePlane(_hitFace).normal;
  35. CorrectHitDataForThinPlanes();
  36. }
  37. #endregion
  38. #region Private Methods
  39. private void CorrectHitDataForThinPlanes()
  40. {
  41. float boxSizeAlongHitNormal = _hitBox.GetSizeAlongDirection(_hitNormal);
  42. if(boxSizeAlongHitNormal < 1e-4f &&
  43. Vector3.Dot(_hitNormal, SceneViewCamera.Camera.transform.forward) > 0.0f)
  44. {
  45. _hitFace = BoxFaces.GetOpposite(_hitFace);
  46. _hitNormal = _hitBox.GetBoxFacePlane(_hitFace).normal;
  47. }
  48. }
  49. #endregion
  50. }
  51. }
  52. #endif