2
0
mirror of https://github.com/AxioDL/metaforce.git synced 2025-05-13 15:11:22 +00:00

CCollisionSurface: Return std::array by reference from GetVerts()

Same behavior, facilitates better static analysis for out-of-bounds
accesses, and also even allows size querying if necessary.
This commit is contained in:
Lioncash 2020-04-06 06:02:49 -04:00
parent ecf3cfdb49
commit c97fedd989
5 changed files with 16 additions and 12 deletions

View File

@ -9,7 +9,11 @@
namespace urde { namespace urde {
class CCollisionSurface { class CCollisionSurface {
std::array<zeus::CVector3f, 3> x0_data; public:
using Vertices = std::array<zeus::CVector3f, 3>;
private:
Vertices x0_data;
u32 x24_flags; u32 x24_flags;
public: public:
@ -17,7 +21,7 @@ public:
zeus::CVector3f GetNormal() const; zeus::CVector3f GetNormal() const;
const zeus::CVector3f& GetVert(s32 idx) const { return x0_data[idx]; } const zeus::CVector3f& GetVert(s32 idx) const { return x0_data[idx]; }
const zeus::CVector3f* GetVerts() const { return x0_data.data(); } const Vertices& GetVerts() const { return x0_data; }
zeus::CPlane GetPlane() const; zeus::CPlane GetPlane() const;
u32 GetSurfaceFlags() const { return x24_flags; } u32 GetSurfaceFlags() const { return x24_flags; }
}; };

View File

@ -199,8 +199,8 @@ static zeus::CVector3f ClipRayToPlane(const zeus::CVector3f& a, const zeus::CVec
return (1.f - -plane.pointToPlaneDist(a) / (b - a).dot(plane.normal())) * (a - b) + b; return (1.f - -plane.pointToPlaneDist(a) / (b - a).dot(plane.normal())) * (a - b) + b;
} }
bool CMetroidAreaCollider::ConvexPolyCollision(const std::array<zeus::CPlane, 6>& planes, const zeus::CVector3f* verts, bool CMetroidAreaCollider::ConvexPolyCollision(const std::array<zeus::CPlane, 6>& planes,
zeus::CAABox& aabb) { const std::array<zeus::CVector3f, 3>& verts, zeus::CAABox& aabb) {
std::array<rstl::reserved_vector<zeus::CVector3f, 20>, 2> vecs; std::array<rstl::reserved_vector<zeus::CVector3f, 20>, 2> vecs;
g_CalledClip += 1; g_CalledClip += 1;

View File

@ -133,8 +133,8 @@ public:
}; };
static void BuildOctreeLeafCache(const CAreaOctTree::Node& root, const zeus::CAABox& aabb, static void BuildOctreeLeafCache(const CAreaOctTree::Node& root, const zeus::CAABox& aabb,
CMetroidAreaCollider::COctreeLeafCache& cache); CMetroidAreaCollider::COctreeLeafCache& cache);
static bool ConvexPolyCollision(const std::array<zeus::CPlane, 6>& planes, const zeus::CVector3f* verts, static bool ConvexPolyCollision(const std::array<zeus::CPlane, 6>& planes,
zeus::CAABox& aabb); const std::array<zeus::CVector3f, 3>& verts, zeus::CAABox& aabb);
static bool AABoxCollisionCheckBoolean_Cached(const COctreeLeafCache& leafCache, const zeus::CAABox& aabb, static bool AABoxCollisionCheckBoolean_Cached(const COctreeLeafCache& leafCache, const zeus::CAABox& aabb,
const CMaterialFilter& filter); const CMaterialFilter& filter);

View File

@ -263,7 +263,7 @@ bool RaySphereIntersection(const zeus::CSphere& sphere, const zeus::CVector3f& p
} }
bool RayTriangleIntersection_Double(const zeus::CVector3f& point, const zeus::CVector3f& dir, bool RayTriangleIntersection_Double(const zeus::CVector3f& point, const zeus::CVector3f& dir,
const zeus::CVector3f* verts, double& d) { const std::array<zeus::CVector3f, 3>& verts, double& d) {
const zeus::CVector3d v0tov1 = verts[1] - verts[0]; const zeus::CVector3d v0tov1 = verts[1] - verts[0];
const zeus::CVector3d v0tov2 = verts[2] - verts[0]; const zeus::CVector3d v0tov2 = verts[2] - verts[0];
const zeus::CVector3d cross0 = zeus::CVector3d(dir).cross(v0tov2); const zeus::CVector3d cross0 = zeus::CVector3d(dir).cross(v0tov2);
@ -293,8 +293,8 @@ bool RayTriangleIntersection_Double(const zeus::CVector3f& point, const zeus::CV
return true; return true;
} }
bool RayTriangleIntersection(const zeus::CVector3f& point, const zeus::CVector3f& dir, const zeus::CVector3f* verts, bool RayTriangleIntersection(const zeus::CVector3f& point, const zeus::CVector3f& dir,
float& d) { const std::array<zeus::CVector3f, 3>& verts, float& d) {
const zeus::CVector3f v0tov1 = verts[1] - verts[0]; const zeus::CVector3f v0tov1 = verts[1] - verts[0];
const zeus::CVector3f v0tov2 = verts[2] - verts[0]; const zeus::CVector3f v0tov2 = verts[2] - verts[0];
const zeus::CVector3f cross0 = dir.cross(v0tov2); const zeus::CVector3f cross0 = dir.cross(v0tov2);

View File

@ -20,9 +20,9 @@ bool RaySphereIntersection_Double(const zeus::CSphere&, const zeus::CVector3f&,
bool RaySphereIntersection(const zeus::CSphere& sphere, const zeus::CVector3f& pos, const zeus::CVector3f& dir, bool RaySphereIntersection(const zeus::CSphere& sphere, const zeus::CVector3f& pos, const zeus::CVector3f& dir,
float mag, float& T, zeus::CVector3f& point); float mag, float& T, zeus::CVector3f& point);
bool RayTriangleIntersection_Double(const zeus::CVector3f& point, const zeus::CVector3f& dir, bool RayTriangleIntersection_Double(const zeus::CVector3f& point, const zeus::CVector3f& dir,
const zeus::CVector3f* verts, double& d); const std::array<zeus::CVector3f, 3>& verts, double& d);
bool RayTriangleIntersection(const zeus::CVector3f& point, const zeus::CVector3f& dir, const zeus::CVector3f* verts, bool RayTriangleIntersection(const zeus::CVector3f& point, const zeus::CVector3f& dir,
float& d); const std::array<zeus::CVector3f, 3>& verts, float& d);
void FilterOutBackfaces(const zeus::CVector3f& vec, const CCollisionInfoList& in, CCollisionInfoList& out); void FilterOutBackfaces(const zeus::CVector3f& vec, const CCollisionInfoList& in, CCollisionInfoList& out);
void FilterByClosestNormal(const zeus::CVector3f& norm, const CCollisionInfoList& in, CCollisionInfoList& out); void FilterByClosestNormal(const zeus::CVector3f& norm, const CCollisionInfoList& in, CCollisionInfoList& out);
bool AABoxAABoxIntersection(const zeus::CAABox& aabb0, const CMaterialList& list0, const zeus::CAABox& aabb1, bool AABoxAABoxIntersection(const zeus::CAABox& aabb0, const CMaterialList& list0, const zeus::CAABox& aabb1,