SMG-Decomp
A decompilation of Super Mario Galaxy 1
Loading...
Searching...
No Matches
HitInfo.cpp
1#include "Game/Map/CollisionParts.hpp"
2#include "Game/Map/HitInfo.hpp"
3#include "Game/Map/KCollision.hpp"
4#include "Game/Util/MathUtil.hpp"
5
6Triangle::Triangle() {
7 mParts = nullptr;
8 mIdx = 0xFFFFFFFF;
9 mSensor = nullptr;
10 mNormals[0].zero();
11 mNormals[1].zero();
12 mNormals[2].zero();
13 mNormals[3].zero();
14 mPos[0].zero();
15 mPos[1].zero();
16 mPos[2].zero();
17}
18
19void Triangle::fillData(CollisionParts *pParts, unsigned long index, HitSensor *pSensor) {
20 mParts = pParts;
21 mIdx = index;
22 mSensor = pSensor;
23
24 KCollisionServer *server = pParts->mServer;
25 MtxPtr matrix;
26 KC_PrismData *prism = server->getPrismData(index);
27
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));
32
33 matrix = reinterpret_cast<MtxPtr>(&mParts->mBaseMatrix);
34
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]));
39
40 MR::normalize(&mNormals[0]);
41 MR::normalize(&mNormals[1]);
42 MR::normalize(&mNormals[2]);
43 MR::normalize(&mNormals[3]);
44
45 mPos[0].set(server->getPos(prism, 0));
46 mPos[1].set(server->getPos(prism, 1));
47 mPos[2].set(server->getPos(prism, 2));
48
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]));
52}
53
54const char *Triangle::getHostName() const {
55 return mParts->getHostName();
56}
57
58s32 Triangle::getHostPlacementZoneID() const {
59 return mParts->getPlacementZoneID();
60}
61
62bool Triangle::isHostMoved() const {
63 return mParts->_D4 == 0;
64}
65
66bool Triangle::isValid() const {
67 return mIdx != 0xFFFFFFFF;
68}
69
70const TVec3f *Triangle::getNormal(int index) const {
71 return &mNormals[index];
72}
73
74const TVec3f *Triangle::getFaceNormal() const {
75 return &mNormals[0];
76}
77
78const TVec3f *Triangle::getEdgeNormal(int index) const {
79 return &mNormals[index + 1];
80}
81
82const TVec3f *Triangle::getPos(int index) const {
83 return &mPos[index];
84}
85
86const TVec3f *Triangle::calcAndGetNormal(int index) {
87 KCollisionServer *server = mParts->mServer;
88 KC_PrismData *prism = server->getPrismData(mIdx);
89
90 MtxPtr matrix = reinterpret_cast<MtxPtr>(&mParts->mBaseMatrix);
91
92 switch (index) {
93 case 0: {
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]);
97
98 return &mNormals[0];
99 }
100 break;
101 case 1: {
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]);
105
106 return &mNormals[1];
107 }
108 break;
109 case 2: {
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]);
113
114 return &mNormals[2];
115 }
116 break;
117 case 3: {
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]);
121
122 return &mNormals[3];
123 }
124 break;
125 }
126
127 return &mNormals[index];
128}
129
130const TVec3f *Triangle::calcAndGetEdgeNormal(int index) {
131 KCollisionServer *server = mParts->mServer;
132 KC_PrismData *prism = server->getPrismData(mIdx);
133
134 MtxPtr matrix = reinterpret_cast<MtxPtr>(&mParts->mBaseMatrix);
135
136 switch (index) {
137 case 0: {
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]);
141
142 return &mNormals[1];
143 }
144 break;
145 case 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]);
149
150 return &mNormals[2];
151 }
152 break;
153 case 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]);
157
158 return &mNormals[3];
159 }
160 break;
161 }
162
163 return &mNormals[index + 1];
164}
165
166const TVec3f *Triangle::calcAndGetPos(int index) {
167 KCollisionServer *server = mParts->mServer;
168 KC_PrismData *prism = server->getPrismData(mIdx);
169
170 TVec3f *pos = &mPos[index];
171
172 pos->set(server->getPos(prism, index));
173
174 mParts->mBaseMatrix.mult(*pos, *pos);
175
176 return pos;
177}
178
179void Triangle::calcForceMovePower(TVec3f *a1, const TVec3f &a2) const {
180 mParts->calcForceMovePower(a1, a2);
181}
182
183JMapInfoIter Triangle::getAttributes() const {
184 if (mIdx == 0xFFFFFFFF) {
185 JMapInfoIter iter;
186 iter.mInfo = nullptr;
187 iter._4 = -1;
188
189 return iter;
190 }
191
192 return mParts->mServer->getAttributes(mIdx);
193}
194
195TPos3f *Triangle::getBaseMtx() const {
196 return &mParts->mBaseMatrix;
197}
198
199TPos3f *Triangle::getBaseInvMtx() const {
200 return &mParts->mInvBaseMatrix;
201}
202
203TPos3f *Triangle::getPrevBaseMtx() const {
204 return &mParts->mPrevBaseMatrix;
205}
206
207HitInfo::HitInfo() : mParentTriangle(), _60(0.0f),
208 _64(0, 0, 0), _70(0, 0, 0), _7C(0, 0, 0) {
209 _88 = 0;
210}
211
212bool HitInfo::isCollisionAtFace() const {
213 return _88 == 1;
214}
215
216bool HitInfo::isCollisionAtEdge() const {
217 return _88 == 2 || _88 == 3 || _88 == 4;
218}
219
220bool HitInfo::isCollisionAtCorner() const {
221 return _88 == 5 || _88 == 6 || _88 == 7;
222}