Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- struct PROJECTION {
- float fMin;
- float fMax;
- bool Overlap(const PROJECTION& _pOther) const {
- return !(fMax < _pOther.fMin || _pOther.fMax < fMin);
- }
- };
- bool CSat::TestFaces(const CShapeInstance* _psiShape0, const CShapeInstance* _psiShape1) const {
- const CConvexPolyhedron* pcpConvex0 = static_cast<const CConvexPolyhedron*>(_psiShape0->m_psShape);
- const CConvexPolyhedron* pcpConvex1 = static_cast<const CConvexPolyhedron*>(_psiShape1->m_psShape);
- for (unsigned int I = 0; I < pcpConvex0->m_ui32TotalFaces; ++I) {
- CVector3 vAxis = _psiShape0->m_mTransform * pcpConvex0->m_pvFaces[I];
- PROJECTION pProj0;
- PROJECTION pProj1;
- Project(pcpConvex0, _psiShape0->m_mTransform, vAxis, pProj0);
- Project(pcpConvex1, _psiShape1->m_mTransform, vAxis, pProj1);
- if (!pProj0.Overlap(pProj1)) {
- return false;
- }
- }
- return true;
- }
- void CSat::Project(const CConvexPolyhedron* _pcpHull, const CMatrix4x4& _mTransform, const CVector3& _vAxis, PROJECTION& _pProj) const {
- _pProj.fMin = _pProj.fMax = _vAxis.Dot(_mTransform * _pcpHull->m_pvVerts[0]);
- for (unsigned int I = 1; I < _pcpHull->m_ui32TotalVerts; ++I) {
- float fProj = _vAxis.Dot(_mTransform * _pcpHull->m_pvVerts[I]);
- if (fProj < _pProj.fMin) {
- _pProj.fMin = fProj;
- }
- if (fProj > _pProj.fMax) {
- _pProj.fMax = fProj;
- }
- }
- }
- bool CSat::TestEdges(const CShapeInstance* _psiShape0, const CShapeInstance* _psiShape1) const {
- const CConvexPolyhedron* pcpConvex0 = static_cast<const CConvexPolyhedron*>(_psiShape0->m_psShape);
- const CConvexPolyhedron* pcpConvex1 = static_cast<const CConvexPolyhedron*>(_psiShape1->m_psShape);
- for (unsigned int I = 0; I < pcpConvex0->m_ui32TotalEdges; ++I) {
- CVector3 vAxis0 = _psiShape0->m_mTransform * pcpConvex0->m_pvEdges[I].vNormal;
- for (unsigned int J = 0; J < pcpConvex1->m_ui32TotalEdges; ++J) {
- CVector3 vAxis1 = _psiShape1->m_mTransform * pcpConvex1->m_pvEdges[J].vNormal;
- CVector3 vAxis = vAxis0.Cross(vAxis1);
- PROJECTION pProj0;
- PROJECTION pProj1;
- Project(pcpConvex0, _psiShape0->m_mTransform, vAxis, pProj0);
- Project(pcpConvex1, _psiShape1->m_mTransform, vAxis, pProj1);
- if (!pProj0.Overlap(pProj1)) {
- return false;
- }
- }
- }
- return true;
- }
- bool CSat::Intersect(const CShapeInstance* _psiShape0, const CShapeInstance* _psiShape1) {
- if (TestFaces(_psiShape0, _psiShape1)) {
- return true;
- }
- if (TestFaces(_psiShape1, _psiShape0)) {
- return true;
- }
- if (TestEdges(_psiShape0, _psiShape1)) {
- return true;
- }
- return false;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement