| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448 |
- /*
- * Copyright 2011-2019 Branimir Karadzic. All rights reserved.
- * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
- */
- #ifndef BOUNDS_H_HEADER_GUARD
- #define BOUNDS_H_HEADER_GUARD
- #include <bx/math.h>
- ///
- struct Aabb
- {
- bx::Vec3 min;
- bx::Vec3 max;
- };
- ///
- struct Capsule
- {
- bx::Vec3 pos;
- bx::Vec3 end;
- float radius;
- };
- ///
- struct Cone
- {
- bx::Vec3 pos;
- bx::Vec3 end;
- float radius;
- };
- ///
- struct Cylinder
- {
- bx::Vec3 pos;
- bx::Vec3 end;
- float radius;
- };
- ///
- struct Disk
- {
- bx::Vec3 center;
- bx::Vec3 normal;
- float radius;
- };
- ///
- struct Obb
- {
- float mtx[16];
- };
- ///
- struct Sphere
- {
- bx::Vec3 center;
- float radius;
- };
- ///
- struct Triangle
- {
- bx::Vec3 v0;
- bx::Vec3 v1;
- bx::Vec3 v2;
- };
- ///
- struct Ray
- {
- bx::Vec3 pos;
- bx::Vec3 dir;
- };
- ///
- struct Hit
- {
- bx::Vec3 pos;
- bx::Plane plane;
- };
- ///
- bx::Vec3 getCenter(const Aabb& _aabb);
- ///
- bx::Vec3 getExtents(const Aabb& _aabb);
- ///
- bx::Vec3 getCenter(const Triangle& _triangle);
- ///
- void toAabb(Aabb& _outAabb, const bx::Vec3& _extents);
- ///
- void toAabb(Aabb& _outAabb, const bx::Vec3& _center, const bx::Vec3& _extents);
- /// Convert cylinder to axis aligned bounding box.
- void toAabb(Aabb& _outAabb, const Cylinder& _cylinder);
- /// Convert disk to axis aligned bounding box.
- void toAabb(Aabb& _outAabb, const Disk& _disk);
- /// Convert oriented bounding box to axis aligned bounding box.
- void toAabb(Aabb& _outAabb, const Obb& _obb);
- /// Convert sphere to axis aligned bounding box.
- void toAabb(Aabb& _outAabb, const Sphere& _sphere);
- /// Convert triangle to axis aligned bounding box.
- void toAabb(Aabb& _outAabb, const Triangle& _triangle);
- /// Calculate axis aligned bounding box.
- void toAabb(Aabb& _outAabb, const void* _vertices, uint32_t _numVertices, uint32_t _stride);
- /// Transform vertices and calculate axis aligned bounding box.
- void toAabb(Aabb& _outAabb, const float* _mtx, const void* _vertices, uint32_t _numVertices, uint32_t _stride);
- /// Expand AABB.
- void aabbExpand(Aabb& _outAabb, float _factor);
- /// Expand AABB with xyz.
- void aabbExpand(Aabb& _outAabb, const bx::Vec3& _pos);
- /// Calculate surface area of axis aligned bounding box.
- float calcAreaAabb(const Aabb& _aabb);
- /// Convert axis aligned bounding box to oriented bounding box.
- void toObb(Obb& _outObb, const Aabb& _aabb);
- /// Calculate oriented bounding box.
- void calcObb(Obb& _outObb, const void* _vertices, uint32_t _numVertices, uint32_t _stride, uint32_t _steps = 17);
- /// Calculate maximum bounding sphere.
- void calcMaxBoundingSphere(Sphere& _outSphere, const void* _vertices, uint32_t _numVertices, uint32_t _stride);
- /// Calculate minimum bounding sphere.
- void calcMinBoundingSphere(Sphere& _outSphere, const void* _vertices, uint32_t _numVertices, uint32_t _stride, float _step = 0.01f);
- /// Returns 6 (near, far, left, right, top, bottom) planes representing frustum planes.
- void buildFrustumPlanes(bx::Plane* _outPlanes, const float* _viewProj);
- /// Returns point from 3 intersecting planes.
- bx::Vec3 intersectPlanes(const bx::Plane& _pa, const bx::Plane& _pb, const bx::Plane& _pc);
- /// Make screen space ray from x, y coordinate and inverse view-projection matrix.
- Ray makeRay(float _x, float _y, const float* _invVp);
- /// Intersect ray / AABB.
- bool intersect(const Ray& _ray, const Aabb& _aabb, Hit* _hit = NULL);
- /// Intersect ray / OBB.
- bool intersect(const Ray& _ray, const Obb& _obb, Hit* _hit = NULL);
- /// Intersect ray / cylinder.
- bool intersect(const Ray& _ray, const Cylinder& _cylinder, Hit* _hit = NULL);
- /// Intersect ray / capsule.
- bool intersect(const Ray& _ray, const Capsule& _capsule, Hit* _hit = NULL);
- /// Intersect ray / cone.
- bool intersect(const Ray& _ray, const Cone& _cone, Hit* _hit = NULL);
- /// Intersect ray / disk.
- bool intersect(const Ray& _ray, const Disk& _disk, Hit* _hit = NULL);
- /// Intersect ray / plane.
- bool intersect(const Ray& _ray, const bx::Plane& _plane, Hit* _hit = NULL);
- /// Intersect ray / sphere.
- bool intersect(const Ray& _ray, const Sphere& _sphere, Hit* _hit = NULL);
- /// Intersect ray / triangle.
- bool intersect(const Ray& _ray, const Triangle& _triangle, Hit* _hit = NULL);
- ///
- bool overlap(const Aabb& _aabb, const bx::Vec3& _pos);
- ///
- bool overlap(const Aabb& _aabb, const Sphere& _sphere);
- ///
- bool overlap(const Aabb& _aabbA, const Aabb& _aabbB);
- ///
- bool overlap(const Aabb& _aabb, const bx::Plane& _plane);
- ///
- bool overlap(const Aabb& _aabb, const Triangle& _triangle);
- ///
- bool overlap(const Aabb& _aabb, const Cylinder& _cylinder);
- ///
- bool overlap(const Aabb& _aabb, const Capsule& _capsule);
- ///
- bool overlap(const Aabb& _aabb, const Cone& _cone);
- ///
- bool overlap(const Aabb& _aabb, const Disk& _disk);
- ///
- bool overlap(const Aabb& _aabb, const Obb& _obb);
- ///
- bool overlap(const Capsule& _capsule, const bx::Vec3& _pos);
- ///
- bool overlap(const Capsule& _capsule, const Sphere& _sphere);
- ///
- bool overlap(const Capsule& _capsule, const Aabb& _aabb);
- ///
- bool overlap(const Capsule& _capsule, const bx::Plane& _plane);
- ///
- bool overlap(const Capsule& _capsule, const Triangle& _triangle);
- ///
- bool overlap(const Capsule& _capsule, const Cylinder& _cylinder);
- ///
- bool overlap(const Capsule& _capsuleA, const Capsule& _capsuleB);
- ///
- bool overlap(const Capsule& _capsule, const Cone& _cone);
- ///
- bool overlap(const Capsule& _capsule, const Disk& _disk);
- ///
- bool overlap(const Capsule& _capsule, const Obb& _obb);
- ///
- bool overlap(const Cone& _cone, const bx::Vec3& _pos);
- ///
- bool overlap(const Cone& _cone, const Sphere& _sphere);
- ///
- bool overlap(const Cone& _cone, const Aabb& _aabb);
- ///
- bool overlap(const Cone& _cone, const bx::Plane& _plane);
- ///
- bool overlap(const Cone& _cone, const Triangle& _triangle);
- ///
- bool overlap(const Cone& _cone, const Cylinder& _cylinder);
- ///
- bool overlap(const Cone& _cone, const Capsule& _capsule);
- ///
- bool overlap(const Cone& _coneA, const Cone& _coneB);
- ///
- bool overlap(const Cone& _cone, const Disk& _disk);
- ///
- bool overlap(const Cone& _cone, const Obb& _obb);
- ///
- bool overlap(const Cylinder& _cylinder, const bx::Vec3& _pos);
- ///
- bool overlap(const Cylinder& _cylinder, const Sphere& _sphere);
- ///
- bool overlap(const Cylinder& _cylinder, const Aabb& _aabb);
- ///
- bool overlap(const Cylinder& _cylinder, const bx::Plane& _plane);
- ///
- bool overlap(const Cylinder& _cylinder, const Triangle& _triangle);
- ///
- bool overlap(const Cylinder& _cylinderA, const Cylinder& _cylinderB);
- ///
- bool overlap(const Cylinder& _cylinder, const Capsule& _capsule);
- ///
- bool overlap(const Cylinder& _cylinder, const Cone& _cone);
- ///
- bool overlap(const Cylinder& _cylinder, const Disk& _disk);
- ///
- bool overlap(const Cylinder& _cylinder, const Obb& _obb);
- ///
- bool overlap(const Disk& _disk, const bx::Vec3& _pos);
- ///
- bool overlap(const Disk& _disk, const Sphere& _sphere);
- ///
- bool overlap(const Disk& _disk, const Aabb& _aabb);
- ///
- bool overlap(const Disk& _disk, const bx::Plane& _plane);
- ///
- bool overlap(const Disk& _disk, const Triangle& _triangle);
- ///
- bool overlap(const Disk& _disk, const Cylinder& _cylinder);
- ///
- bool overlap(const Disk& _disk, const Capsule& _capsule);
- ///
- bool overlap(const Disk& _disk, const Cone& _cone);
- ///
- bool overlap(const Disk& _diskA, const Disk& _diskB);
- ///
- bool overlap(const Disk& _disk, const Obb& _obb);
- ///
- bool overlap(const Obb& _obb, const bx::Vec3& _pos);
- ///
- bool overlap(const Obb& _obb, const Sphere& _sphere);
- ///
- bool overlap(const Obb& _obb, const Aabb& _aabb);
- ///
- bool overlap(const Obb& _obb, const bx::Plane& _plane);
- ///
- bool overlap(const Obb& _obb, const Triangle& _triangle);
- ///
- bool overlap(const Obb& _obb, const Cylinder& _cylinder);
- ///
- bool overlap(const Obb& _obb, const Capsule& _capsule);
- ///
- bool overlap(const Obb& _obb, const Cone& _cone);
- ///
- bool overlap(const Obb& _obb, const Disk& _disk);
- ///
- bool overlap(const Obb& _obbA, const Obb& _obbB);
- ///
- bool overlap(const bx::Plane& _plane, const bx::Vec3& _pos);
- ///
- bool overlap(const bx::Plane& _plane, const Sphere& _sphere);
- ///
- bool overlap(const bx::Plane& _plane, const Aabb& _aabb);
- ///
- bool overlap(const bx::Plane& _planeA, const bx::Plane& _planeB);
- ///
- bool overlap(const bx::Plane& _plane, const Triangle& _triangle);
- ///
- bool overlap(const bx::Plane& _plane, const Cylinder& _cylinder);
- ///
- bool overlap(const bx::Plane& _plane, const Capsule& _capsule);
- ///
- bool overlap(const bx::Plane& _plane, const Cone& _cone);
- ///
- bool overlap(const bx::Plane& _plane, const Disk& _disk);
- ///
- bool overlap(const bx::Plane& _plane, const Obb& _obb);
- ///
- bool overlap(const Sphere& _sphere, const bx::Vec3& _pos);
- ///
- bool overlap(const Sphere& _sphereA, const Sphere& _sphereB);
- ///
- bool overlap(const Sphere& _sphere, const Aabb& _aabb);
- ///
- bool overlap(const Sphere& _sphere, const bx::Plane& _plane);
- ///
- bool overlap(const Sphere& _sphere, const Triangle& _triangle);
- ///
- bool overlap(const Sphere& _sphere, const Cylinder& _cylinder);
- ///
- bool overlap(const Sphere& _sphere, const Capsule& _capsule);
- ///
- bool overlap(const Sphere& _sphere, const Cone& _cone);
- ///
- bool overlap(const Sphere& _sphere, const Disk& _disk);
- ///
- bool overlap(const Sphere& _sphere, const Obb& _obb);
- ///
- bool overlap(const Triangle& _triangle, const bx::Vec3& _pos);
- ///
- bool overlap(const Triangle& _triangle, const Sphere& _sphere);
- ///
- bool overlap(const Triangle& _triangle, const Aabb& _aabb);
- ///
- bool overlap(const Triangle& _triangle, const bx::Plane& _plane);
- ///
- bool overlap(const Triangle& _triangleA, const Triangle& _triangleB);
- ///
- bool overlap(const Triangle& _triangle, const Cylinder& _cylinder);
- ///
- bool overlap(const Triangle& _triangle, const Capsule& _capsule);
- ///
- bool overlap(const Triangle& _triangle, const Cone& _cone);
- ///
- bool overlap(const Triangle& _triangle, const Disk& _disk);
- ///
- bool overlap(const Triangle& _triangle, const Obb& _obb);
- #endif // BOUNDS_H_HEADER_GUARD
|