mirror of https://github.com/PrimeDecomp/prime.git
Add CAABoxFilter
This commit is contained in:
parent
6a7cfb135f
commit
5549e1b6d4
|
@ -0,0 +1,30 @@
|
||||||
|
#ifndef _CCOLLISIONINFOLIST
|
||||||
|
#define _CCOLLISIONINFOLIST
|
||||||
|
|
||||||
|
#include "Collision/CCollisionInfo.hpp"
|
||||||
|
|
||||||
|
#include "rstl/reserved_vector.hpp"
|
||||||
|
|
||||||
|
class CCollisionInfoList {
|
||||||
|
rstl::reserved_vector< CCollisionInfo, 32 > x0_list;
|
||||||
|
|
||||||
|
public:
|
||||||
|
typedef rstl::reserved_vector< CCollisionInfo, 32 >::iterator iterator;
|
||||||
|
typedef rstl::reserved_vector< CCollisionInfo, 32 >::const_iterator const_iterator;
|
||||||
|
|
||||||
|
void Add(const CCollisionInfo& info, bool swap) {
|
||||||
|
if (x0_list.size() == 32)
|
||||||
|
return;
|
||||||
|
if (!swap)
|
||||||
|
x0_list.push_back(info);
|
||||||
|
else
|
||||||
|
x0_list.push_back(info.GetSwapped());
|
||||||
|
}
|
||||||
|
|
||||||
|
iterator end() { return x0_list.end(); }
|
||||||
|
const_iterator end() const { return x0_list.end(); }
|
||||||
|
iterator begin() { return x0_list.begin(); }
|
||||||
|
const_iterator begin() const { return x0_list.begin(); }
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // _CCOLLISIONINFOLIST
|
|
@ -0,0 +1,15 @@
|
||||||
|
#ifndef _CAABOXFILTER
|
||||||
|
#define _CAABOXFILTER
|
||||||
|
|
||||||
|
#include "MetroidPrime/ICollisionFilter.hpp"
|
||||||
|
|
||||||
|
class CCollisionInfoList;
|
||||||
|
|
||||||
|
class CAABoxFilter : public ICollisionFilter {
|
||||||
|
public:
|
||||||
|
explicit CAABoxFilter(CActor& actor) : ICollisionFilter(actor) {}
|
||||||
|
static void FilterBoxFloorCollisions(const CCollisionInfoList& in, CCollisionInfoList& out);
|
||||||
|
void Filter(const CCollisionInfoList& in, CCollisionInfoList& out) const;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // _CAABOXFILTER
|
|
@ -0,0 +1,30 @@
|
||||||
|
#include "MetroidPrime/CAABoxFilter.hpp"
|
||||||
|
|
||||||
|
#include "Collision/CCollisionInfoList.hpp"
|
||||||
|
#include "Collision/CollisionUtil.hpp"
|
||||||
|
|
||||||
|
void CAABoxFilter::FilterBoxFloorCollisions(const CCollisionInfoList& in, CCollisionInfoList& out) {
|
||||||
|
float minZ = 10000.f;
|
||||||
|
|
||||||
|
for (CCollisionInfoList::const_iterator it = in.begin(); it != in.end(); ++it) {
|
||||||
|
if (it->GetMaterialLeft().HasMaterial(kMT_Wall) && it->GetPoint().GetZ() < minZ) {
|
||||||
|
minZ = it->GetPoint().GetZ();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
CCollisionInfoList temp;
|
||||||
|
for (CCollisionInfoList::const_iterator it = in.begin(); it != in.end(); ++it) {
|
||||||
|
if (it->GetMaterialLeft().HasMaterial(kMT_Floor)) {
|
||||||
|
if (it->GetPoint().GetZ() < minZ) {
|
||||||
|
temp.Add(*it, false);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
temp.Add(*it, false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
CollisionUtil::AddAverageToFront(temp, out);
|
||||||
|
}
|
||||||
|
|
||||||
|
void CAABoxFilter::Filter(const CCollisionInfoList& in, CCollisionInfoList& out) const {
|
||||||
|
FilterBoxFloorCollisions(in, out);
|
||||||
|
}
|
Loading…
Reference in New Issue