1#include "Game/Map/CollisionParts.hpp"
2#include "Game/Map/HitInfo.hpp"
3#include "Game/Map/KCollision.hpp"
4#include "Game/Util/MathUtil.hpp"
28 mNormals[0].set(*server->getFaceNormal(prism));
29 mNormals[1].set(*server->getEdgeNormal1(prism));
30 mNormals[2].set(*server->getEdgeNormal2(prism));
31 mNormals[3].set(*server->getEdgeNormal3(prism));
33 matrix =
reinterpret_cast<MtxPtr
>(&mParts->mBaseMatrix);
35 PSMTXMultVecSR(matrix,
reinterpret_cast<Vec *
>(&mNormals[0]),
reinterpret_cast<Vec *
>(&mNormals[0]));
36 PSMTXMultVecSR(matrix,
reinterpret_cast<Vec *
>(&mNormals[1]),
reinterpret_cast<Vec *
>(&mNormals[1]));
37 PSMTXMultVecSR(matrix,
reinterpret_cast<Vec *
>(&mNormals[2]),
reinterpret_cast<Vec *
>(&mNormals[2]));
38 PSMTXMultVecSR(matrix,
reinterpret_cast<Vec *
>(&mNormals[3]),
reinterpret_cast<Vec *
>(&mNormals[3]));
40 MR::normalize(&mNormals[0]);
41 MR::normalize(&mNormals[1]);
42 MR::normalize(&mNormals[2]);
43 MR::normalize(&mNormals[3]);
45 mPos[0].set(server->getPos(prism, 0));
46 mPos[1].set(server->getPos(prism, 1));
47 mPos[2].set(server->getPos(prism, 2));
49 PSMTXMultVecSR(matrix,
reinterpret_cast<Vec *
>(&mPos[0]),
reinterpret_cast<Vec *
>(&mPos[0]));
50 PSMTXMultVecSR(matrix,
reinterpret_cast<Vec *
>(&mPos[1]),
reinterpret_cast<Vec *
>(&mPos[1]));
51 PSMTXMultVecSR(matrix,
reinterpret_cast<Vec *
>(&mPos[2]),
reinterpret_cast<Vec *
>(&mPos[2]));
54const char *Triangle::getHostName()
const {
55 return mParts->getHostName();
58s32 Triangle::getHostPlacementZoneID()
const {
59 return mParts->getPlacementZoneID();
62bool Triangle::isHostMoved()
const {
63 return mParts->_D4 == 0;
66bool Triangle::isValid()
const {
67 return mIdx != 0xFFFFFFFF;
70const TVec3f *Triangle::getNormal(
int index)
const {
71 return &mNormals[index];
74const TVec3f *Triangle::getFaceNormal()
const {
78const TVec3f *Triangle::getEdgeNormal(
int index)
const {
79 return &mNormals[index + 1];
82const TVec3f *Triangle::getPos(
int index)
const {
86const TVec3f *Triangle::calcAndGetNormal(
int index) {
90 MtxPtr matrix =
reinterpret_cast<MtxPtr
>(&mParts->mBaseMatrix);
94 mNormals[0].set(*server->getFaceNormal(prism));
95 PSMTXMultVecSR(matrix,
reinterpret_cast<Vec *
>(&mNormals[0]),
reinterpret_cast<Vec *
>(&mNormals[0]));
96 MR::normalize(&mNormals[0]);
102 mNormals[1].set(*server->getEdgeNormal1(prism));
103 PSMTXMultVecSR(matrix,
reinterpret_cast<Vec *
>(&mNormals[1]),
reinterpret_cast<Vec *
>(&mNormals[1]));
104 MR::normalize(&mNormals[1]);
110 mNormals[2].set(*server->getEdgeNormal2(prism));
111 PSMTXMultVecSR(matrix,
reinterpret_cast<Vec *
>(&mNormals[2]),
reinterpret_cast<Vec *
>(&mNormals[2]));
112 MR::normalize(&mNormals[2]);
118 mNormals[3].set(*server->getEdgeNormal3(prism));
119 PSMTXMultVecSR(matrix,
reinterpret_cast<Vec *
>(&mNormals[3]),
reinterpret_cast<Vec *
>(&mNormals[3]));
120 MR::normalize(&mNormals[3]);
127 return &mNormals[index];
130const TVec3f *Triangle::calcAndGetEdgeNormal(
int index) {
134 MtxPtr matrix =
reinterpret_cast<MtxPtr
>(&mParts->mBaseMatrix);
138 mNormals[1].set(*server->getEdgeNormal1(prism));
139 PSMTXMultVecSR(matrix,
reinterpret_cast<Vec *
>(&mNormals[1]),
reinterpret_cast<Vec *
>(&mNormals[1]));
140 MR::normalize(&mNormals[1]);
146 mNormals[2].set(*server->getEdgeNormal2(prism));
147 PSMTXMultVecSR(matrix,
reinterpret_cast<Vec *
>(&mNormals[2]),
reinterpret_cast<Vec *
>(&mNormals[2]));
148 MR::normalize(&mNormals[2]);
154 mNormals[3].set(*server->getEdgeNormal3(prism));
155 PSMTXMultVecSR(matrix,
reinterpret_cast<Vec *
>(&mNormals[3]),
reinterpret_cast<Vec *
>(&mNormals[3]));
156 MR::normalize(&mNormals[3]);
163 return &mNormals[index + 1];
166const TVec3f *Triangle::calcAndGetPos(
int index) {
170 TVec3f *pos = &mPos[index];
172 pos->set(server->getPos(prism, index));
174 mParts->mBaseMatrix.mult(*pos, *pos);
179void Triangle::calcForceMovePower(TVec3f *a1,
const TVec3f &a2)
const {
180 mParts->calcForceMovePower(a1, a2);
184 if (mIdx == 0xFFFFFFFF) {
186 iter.mInfo =
nullptr;
192 return mParts->mServer->getAttributes(mIdx);
195TPos3f *Triangle::getBaseMtx()
const {
196 return &mParts->mBaseMatrix;
199TPos3f *Triangle::getBaseInvMtx()
const {
200 return &mParts->mInvBaseMatrix;
203TPos3f *Triangle::getPrevBaseMtx()
const {
204 return &mParts->mPrevBaseMatrix;
207HitInfo::HitInfo() : mParentTriangle(), _60(0.0f),
208 _64(0, 0, 0), _70(0, 0, 0), _7C(0, 0, 0) {
212bool HitInfo::isCollisionAtFace()
const {
216bool HitInfo::isCollisionAtEdge()
const {
217 return _88 == 2 || _88 == 3 || _88 == 4;
220bool HitInfo::isCollisionAtCorner()
const {
221 return _88 == 5 || _88 == 6 || _88 == 7;