void OBB::SetNegativeInfinity() { pos = POINT_VEC_SCALAR(0.f); r.SetFromScalar(-FLOAT_INF); axis[0] = DIR_VEC(1,0,0); axis[1] = DIR_VEC(0, 1, 0); axis[2] = DIR_VEC(0, 0, 1); }
vec Plane::PointOnPlane() const { #ifdef MATH_AUTOMATIC_SSE return normal * d + vec(POINT_VEC_SCALAR(0.f)); #else return normal * d; #endif }
void AABB::Enclose(const Capsule &capsule) { vec d = POINT_VEC_SCALAR(capsule.r); Enclose(capsule.l.a - d); Enclose(capsule.l.a + d); Enclose(capsule.l.b - d); Enclose(capsule.l.b + d); }
void OBB::Triangulate(int x, int y, int z, vec *outPos, vec *outNormal, float2 *outUV, bool ccwIsFrontFacing) const { AABB aabb(POINT_VEC_SCALAR(0), r*2.f); aabb.Triangulate(x, y, z, outPos, outNormal, outUV, ccwIsFrontFacing); float3x4 localToWorld = LocalToWorld(); assume(localToWorld.HasUnitaryScale()); // Transforming of normals will fail otherwise. localToWorld.BatchTransformPos(outPos, NumVerticesInTriangulation(x,y,z), sizeof(vec)); localToWorld.BatchTransformDir(outNormal, NumVerticesInTriangulation(x,y,z), sizeof(vec)); }
void TriangleMesh::Set(const Polyhedron &polyhedron) { TriangleArray tris = polyhedron.Triangulate(); if (!tris.empty()) { int alignment = (simdCapability == SIMD_AVX) ? 8 : ((simdCapability == SIMD_SSE41 || simdCapability == SIMD_SSE2) ? 4 : 1); vec degen = POINT_VEC_SCALAR(-FLOAT_INF); Triangle degent(degen, degen, degen); while(tris.size() % alignment != 0) tris.push_back(degent); Set((Triangle*)&tris[0], (int)tris.size()); } }
MATH_IGNORE_UNUSED_VARS_WARNING RANDOMIZED_TEST(AABBPBVolumeIntersect) { vec pt = vec::RandomBox(rng, POINT_VEC_SCALAR(-SCALE), POINT_VEC_SCALAR(SCALE)); Frustum b = RandomFrustumContainingPoint(pt); AABB a = RandomAABBContainingPoint(pt, 10.f); assert(a.Intersects(b)); assert(b.Intersects(a)); bool contained = b.Contains(a); vec centerPoint = b.CenterPoint(); assert(b.Contains(b.CenterPoint())); PBVolume<6> pbVolume = ToPBVolume(b); assert(pbVolume.Contains(b.CenterPoint())); CullTestResult r = pbVolume.InsideOrIntersects(a); assert(r == TestInside || r == TestNotContained); if (contained) assert(r == TestInside); }
bool OBB::Intersects(const Line &line, float &dNear, float &dFar) const { AABB aabb(POINT_VEC_SCALAR(0.f), Size()); Line l = WorldToLocal() * line; return aabb.Intersects(l, dNear, dFar); }
bool OBB::Intersects(const Line &line) const { AABB aabb(POINT_VEC_SCALAR(0.f), Size()); Line l = WorldToLocal() * line; return aabb.Intersects(l); }
bool OBB::Intersects(const Ray &ray, float &dNear, float &dFar) const { AABB aabb(POINT_VEC_SCALAR(0.f), Size()); Ray r = WorldToLocal() * ray; return aabb.Intersects(r, dNear, dFar); }
bool OBB::Intersects(const Triangle &triangle) const { AABB aabb(POINT_VEC_SCALAR(0.f), Size()); Triangle t = WorldToLocal() * triangle; return t.Intersects(aabb); }
void AABB::Enclose(const Sphere &sphere) { vec d = POINT_VEC_SCALAR(sphere.r); Enclose(sphere.pos - d); Enclose(sphere.pos + d); }
vec RandomPointNearOrigin(float maxDistanceFromOrigin) { return Sphere(POINT_VEC_SCALAR(0.f), maxDistanceFromOrigin).RandomPointInside(rng); }