123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105 |
- #pragma once
- #include <Mathematics/IntrRay2OrientedBox2.h>
- #include <Mathematics/Cone.h>
- namespace WwiseGTE
- {
- template <typename Real>
- class TIQuery<Real, OrientedBox<2, Real>, Cone<2, Real>>
- {
- public:
- struct Result
- {
-
-
-
-
-
- bool intersect;
- };
- Result operator()(OrientedBox<2, Real> const& box, Cone<2, Real>& cone)
- {
- Result result;
- TIQuery<Real, Ray<2, Real>, OrientedBox<2, Real>> rbQuery;
- auto rbResult = rbQuery(cone.ray, box);
- if (rbResult.intersect)
- {
-
- result.intersect = true;
- return result;
- }
-
-
-
-
-
-
-
-
-
- Vector<2, Real> diff = box.center - cone.ray.origin;
- Real a0 = Dot(cone.ray.direction, box.axis[0]);
- Real a1 = Dot(cone.ray.direction, box.axis[1]);
- Real a2 = Dot(cone.ray.direction, diff);
- Real b0 = Dot(box.axis[0], diff);
- Real b1 = Dot(box.axis[1], diff);
- Real b2 = Dot(diff, diff);
- Real csSqr = cone.cosAngle * cone.cosAngle;
- for (int i1 = 0; i1 < 2; ++i1)
- {
- Real sign1 = i1 * (Real)2 - (Real)1;
- Real y = sign1 * box.extent[1];
- for (int i0 = 0; i0 < 2; ++i0)
- {
- Real sign0 = i0 * (Real)2 - (Real)1;
- Real x = sign0 * box.extent[0];
- Real fNumerator = a0 * x + a1 * y + a2;
- if (fNumerator > (Real)0)
- {
- Real dSqr = x * x + y * y + (b0 * x + b1 * y) * (Real)2 + b2;
- Real nSqr = fNumerator * fNumerator;
- if (nSqr > dSqr * csSqr)
- {
- result.intersect = true;
- return result;
- }
- }
- }
- }
- result.intersect = false;
- return result;
- }
- };
- }
|