SMG-Decomp
A decompilation of Super Mario Galaxy 1
Loading...
Searching...
No Matches
GravityCreator.cpp
1#include "Game/Gravity.hpp"
2#include "Game/Util.hpp"
3
4GravityCreator::GravityCreator() {
5
6}
7
8PlanetGravity* GravityCreator::createFromJMap(const JMapInfoIter &rIter) {
9 PlanetGravity* instance = createInstance();
10
11 if (instance) {
12 TVec3f trans(0, 0, 0);
13 TVec3f rotate(0, 0, 0);
14 TVec3f scale(1, 1, 1);
15 MR::getJMapInfoTrans(rIter, &trans);
16 MR::getJMapInfoRotate(rIter, &rotate);
17 MR::getJMapInfoScale(rIter, &scale);
18 settingFromSRT(trans, rotate, scale);
19
20 s32 arg0;
21 s32 arg1;
22 s32 arg2;
23 MR::getJMapInfoArg0WithInit(rIter, &arg0);
24 MR::getJMapInfoArg1WithInit(rIter, &arg1);
25 MR::getJMapInfoArg2WithInit(rIter, &arg2);
26 settingFromJMapArgs(arg0, arg1, arg2);
27
28 settingFromJMapOtherParam(rIter);
29
30 MR::settingGravityParamFromJMap(instance, rIter);
31 getGravity()->updateIdentityMtx();
32 MR::registerGravity(instance);
33 }
34
35 return instance;
36}
37
38PlanetGravity* CubeGravityCreator::createInstance() {
39 mGravityInstance = new CubeGravity();
40 return mGravityInstance;
41}
42
43void CubeGravityCreator::settingFromSRT(const TVec3f &rTrans, const TVec3f &rRotate, const TVec3f &rScale) {
44 // Calculate TR matrix
45 TPos3f mtx;
46 MR::makeMtxTR(reinterpret_cast<MtxPtr>(&mtx), rTrans, rRotate);
47
48 // Get up vector and calculate scale
49 TVec3f upVec;
50 TVec3f scale;
51 scale.setInline(rScale * 500.0f);
52 mtx.getYDir(upVec);
53
54 // Translate and scale matrix
55 mtx.setTrans(rTrans + upVec * scale.y);
56 MR::preScaleMtx(reinterpret_cast<MtxPtr>(&mtx), scale);
57
58 // Set cube matrix
59 mGravityInstance->setCube(mtx);
60}
61
62void CubeGravityCreator::settingFromJMapArgs(s32 arg0, s32 arg1, s32 arg2) {
63 u8 activeFaces = 0;
64
65 if (arg0 & 1) {
66 activeFaces |= 1;
67 }
68 if (arg0 & 2) {
69 activeFaces |= 2;
70 }
71 if (arg1 & 1) {
72 activeFaces |= 4;
73 }
74 if (arg1 & 2) {
75 activeFaces |= 8;
76 }
77 if (arg2 & 1) {
78 activeFaces |= 16;
79 }
80 if (arg2 & 2) {
81 activeFaces |= 32;
82 }
83
84 mGravityInstance->mActiveFaces = activeFaces;
85}
86
87PlanetGravity* CubeGravityCreator::getGravity() {
88 return mGravityInstance;
89}
90
91PlanetGravity* DiskGravityCreator::createInstance() {
92 mGravityInstance = new DiskGravity();
93 return mGravityInstance;
94}
95
96void DiskGravityCreator::settingFromSRT(const TVec3f &rTrans, const TVec3f &rRotate, const TVec3f &rScale) {
97 // Calculate TR matrix
98 TPos3f mtx;
99 MR::makeMtxTR(reinterpret_cast<MtxPtr>(&mtx), rTrans, rRotate);
100
101 // Calculate side and up vectors
102 TVec3f sideVec, upVec;
103 mtx.getXDir(sideVec);
104 mtx.getYDir(upVec);
105
106 // Populate gravity attributes
107 mGravityInstance->setLocalPosition(rTrans);
108 mGravityInstance->setLocalDirection(upVec);
109 mGravityInstance->setSideDirection(sideVec);
110 mGravityInstance->setRadius(500.0f * MR::getMaxElement(rScale));
111}
112
113void DiskGravityCreator::settingFromJMapArgs(s32 arg0, s32 arg1, s32 arg2) {
114 // Obj_arg0 = enable both sides?
115 mGravityInstance->setBothSide(arg0 != 0);
116
117 // Obj_arg1 = enable edge gravity?
118 mGravityInstance->setEnableEdgeGravity(arg1 != 0);
119
120 // Obj_arg3 = valid degree
121 if (arg2 >= 0) {
122 mGravityInstance->setValidDegee(arg2);
123 }
124 else {
125 mGravityInstance->setValidDegee(360.0f);
126 }
127}
128
129PlanetGravity* DiskGravityCreator::getGravity() {
130 return mGravityInstance;
131}
132
133PlanetGravity* DiskTorusGravityCreator::createInstance() {
134 mGravityInstance = new DiskTorusGravity();
135 return mGravityInstance;
136}
137
138void DiskTorusGravityCreator::settingFromSRT(const TVec3f &rTrans, const TVec3f &rRotate, const TVec3f &rScale) {
139 // Calculate TR matrix
140 TPos3f mtx;
141 MR::makeMtxTR(reinterpret_cast<MtxPtr>(&mtx), rTrans, rRotate);
142
143 // Calculate side and up vectors
144 TVec3f upVec;
145 mtx.getYDir(upVec);
146
147 // Populate gravity attributes
148 mGravityInstance->setPosition(rTrans);
149 mGravityInstance->setDirection(upVec);
150 mGravityInstance->setRadius(500.0f * MR::getMaxElement(rScale));
151}
152
153void DiskTorusGravityCreator::settingFromJMapArgs(s32 arg0, s32 arg1, s32 arg2) {
154 // Obj_arg0 = enable both sides?
155 mGravityInstance->setBothSide(arg0 != 0);
156
157 // Obj_arg1 = edge type
158 switch (arg1) {
159 case 0:
160 mGravityInstance->setEdgeType(0);
161 break;
162 case 1:
163 mGravityInstance->setEdgeType(1);
164 break;
165 case 2:
166 mGravityInstance->setEdgeType(2);
167 break;
168 default:
169 mGravityInstance->setEdgeType(3);
170 break;
171 }
172
173 // Obj_arg2 = disk radius
174 mGravityInstance->setDiskRadius(arg2);
175}
176
177PlanetGravity* DiskTorusGravityCreator::getGravity() {
178 return mGravityInstance;
179}
180
181PlanetGravity* ConeGravityCreator::createInstance() {
182 mGravityInstance = new ConeGravity();
183 return mGravityInstance;
184}
185
186void ConeGravityCreator::settingFromSRT(const TVec3f &rTrans, const TVec3f &rRotate, const TVec3f &rScale) {
187 // Calculate local matrix
188 TPos3f localMtx;
189 MR::makeMtxTRS(reinterpret_cast<MtxPtr>(&localMtx), rTrans, rRotate, rScale * 500.0f);
190 mGravityInstance->setLocalMatrix(localMtx);
191}
192
193void ConeGravityCreator::settingFromJMapArgs(s32 arg0, s32 arg1, s32 arg2) {
194 // Obj_arg0 = is enable bottom?
195 mGravityInstance->setEnableBottom(arg0 != 0);
196
197 // Obj_arg1 = top cut rate
198 mGravityInstance->setTopCutRate(arg1 / 1000.0f);
199}
200
201PlanetGravity* ConeGravityCreator::getGravity() {
202 return mGravityInstance;
203}
204
205PlanetGravity* PlaneGravityCreator::createInstance() {
206 mGravityInstance = new ParallelGravity();
207 return mGravityInstance;
208}
209
210void PlaneGravityCreator::settingFromSRT(const TVec3f &rTrans, const TVec3f &rRotate, const TVec3f &rScale) {
211 // Calculate rotate matrix
212 TPos3f mtx;
213 MR::makeMtxRotate(reinterpret_cast<MtxPtr>(&mtx), rRotate);
214
215 // Set normal-form plane
216 TVec3f upVec;
217 mtx.getYDir(upVec);
218 mGravityInstance->setPlane(upVec, rTrans);
219}
220
221PlanetGravity* PlaneGravityCreator::getGravity() {
222 return mGravityInstance;
223}
224
225PlanetGravity* PlaneInBoxGravityCreator::createInstance() {
226 mGravityInstance = new ParallelGravity();
227 mGravityInstance->setRangeType(ParallelGravity::RangeType_Box);
228 return mGravityInstance;
229}
230
231void PlaneInBoxGravityCreator::settingFromSRT(const TVec3f &rTrans, const TVec3f &rRotate, const TVec3f &rScale) {
232 // Calculate scale and TR matrix
233 TPos3f mtx;
234 TVec3f scale = rScale * 500.0f;
235 MR::makeMtxTR(reinterpret_cast<MtxPtr>(&mtx), rTrans, rRotate);
236
237 // Get up vector
238 TVec3f upVec;
239 mtx.getYDir(upVec);
240
241 // Translate and scale matrix
242 mtx.setTrans(rTrans + upVec * scale.y);
243 MR::preScaleMtx(reinterpret_cast<MtxPtr>(&mtx), scale);
244
245 // Set cube matrix
246 mGravityInstance->setPlane(upVec, rTrans);
247 mGravityInstance->setRangeBox(mtx);
248}
249
250PlanetGravity* PlaneInBoxGravityCreator::getGravity() {
251 return mGravityInstance;
252}
253
254void PlaneInBoxGravityCreator::settingFromJMapArgs(s32 arg0, s32 arg1, s32 arg2) {
255 // Obj_arg0 = base distance
256 mGravityInstance->setBaseDistance(arg0);
257
258 // Obj_arg1 = distance calc type
259 switch (arg1) {
260 case 0:
261 mGravityInstance->setDistanceCalcType(ParallelGravity::DistanceCalcType_X);
262 break;
263 case 1:
264 mGravityInstance->setDistanceCalcType(ParallelGravity::DistanceCalcType_Y);
265 break;
266 case 2:
267 mGravityInstance->setDistanceCalcType(ParallelGravity::DistanceCalcType_Z);
268 break;
269 default:
270 mGravityInstance->setDistanceCalcType(ParallelGravity::DistanceCalcType_Default);
271 break;
272 }
273}
274
275PlanetGravity* PlaneInCylinderGravityCreator::createInstance() {
276 mGravityInstance = new ParallelGravity();
277 mGravityInstance->setRangeType(ParallelGravity::RangeType_Cylinder);
278 return mGravityInstance;
279}
280
281PlanetGravity* PlaneInCylinderGravityCreator::getGravity() {
282 return mGravityInstance;
283}
284
285void PlaneInCylinderGravityCreator::settingFromSRT(const TVec3f &rTrans, const TVec3f &rRotate, const TVec3f &rScale) {
286 // Calculate TR matrix
287 TPos3f mtx;
288 MR::makeMtxTR(reinterpret_cast<MtxPtr>(&mtx), rTrans, rRotate);
289
290 // Set normal-form plane
291 TVec3f upVec;
292 mtx.getYDir(upVec);
293 mGravityInstance->setPlane(upVec, rTrans);
294
295 // Set cylinder range
296 mGravityInstance->setRangeCylinder(500.0f * rScale.x, 500.0f * rScale.y);
297}
298
299void PlaneInCylinderGravityCreator::settingFromJMapArgs(s32 arg0, s32 arg1, s32 arg2) {
300 // Obj_arg0 = base distance
301 mGravityInstance->setBaseDistance(arg0);
302}
303
304PlanetGravity* PointGravityCreator::createInstance() {
305 mGravityInstance = new PointGravity();
306 return mGravityInstance;
307}
308
309void PointGravityCreator::settingFromSRT(const TVec3f &rTrans, const TVec3f &rRotate, const TVec3f &rScale) {
310 mGravityInstance->mDistant = 500.0f * rScale.x;
311 mGravityInstance->mTranslation.setInlinePS(rTrans);
312}
313
314PlanetGravity* PointGravityCreator::getGravity() {
315 return mGravityInstance;
316}
317
318PlanetGravity* SegmentGravityCreator::createInstance() {
319 mGravityInstance = new SegmentGravity();
320 return mGravityInstance;
321}
322
323void SegmentGravityCreator::settingFromSRT(const TVec3f &rTrans, const TVec3f &rRotate, const TVec3f &rScale) {
324 // Calculate TRS matrix
325 TPos3f mtx;
326 MR::makeMtxTRS(reinterpret_cast<MtxPtr>(&mtx), rTrans, rRotate, rScale);
327
328 // Get side and up vectors
329 TVec3f sideVec, upVec;
330 mtx.getXDir(sideVec);
331 mtx.getYDir(upVec);
332
333 // Set gravity points and side vec
334 mGravityInstance->setGravityPoint(0, rTrans);
335 mGravityInstance->setGravityPoint(1, rTrans + upVec * 1000.0f);
336 mGravityInstance->setSideVector(sideVec);
337}
338
339void SegmentGravityCreator::settingFromJMapArgs(s32 arg0, s32 arg1, s32 arg2) {
340 // Obj_arg0 = valid edge
341 switch (arg0) {
342 case 0:
343 mGravityInstance->setEdgeValid(0, false);
344 mGravityInstance->setEdgeValid(1, false);
345 break;
346 case 1:
347 mGravityInstance->setEdgeValid(0, true);
348 mGravityInstance->setEdgeValid(1, false);
349 break;
350 case 2:
351 mGravityInstance->setEdgeValid(0, false);
352 mGravityInstance->setEdgeValid(1, true);
353 break;
354 default:
355 mGravityInstance->setEdgeValid(0, true);
356 mGravityInstance->setEdgeValid(1, true);
357 break;
358 }
359
360 // Obj_arg1 = valid side degree
361 if (arg1 >= 0.0f) {
362 mGravityInstance->setValidSideDegree(arg1);
363 }
364 else {
365 mGravityInstance->setValidSideDegree(360.0f);
366 }
367}
368
369PlanetGravity* SegmentGravityCreator::getGravity() {
370 return mGravityInstance;
371}
372
373PlanetGravity* WireGravityCreator::createInstance() {
374 mGravityInstance = new WireGravity();
375 return mGravityInstance;
376}
377
378void WireGravityCreator::settingFromJMapOtherParam(const JMapInfoIter &rIter) {
379 // Get data from JMap
380 mRailRider = new RailRider(rIter);
381 s32 numPointsInBetween = 20;
382 MR::getJMapInfoArg0NoInit(rIter, &numPointsInBetween);
383
384 // Determine number of points, the interval and allocate the necessary space
385 u32 numPoints = numPointsInBetween + 2;
386 f32 railInterval = mRailRider->getTotalLength() / (numPoints - 1);
387 mGravityInstance->setPointListSize(numPoints);
388
389 // Iterate over the points and add them to the gravity
390 mRailRider->setCoord(0.0f);
391 mRailRider->setSpeed(railInterval);
392
393 for (s32 i = 0; i < numPoints - 1; i++) {
394 mGravityInstance->addPoint(mRailRider->mCurPos);
395 mRailRider->move();
396 }
397}
398
399PlanetGravity* WireGravityCreator::getGravity() {
400 return mGravityInstance;
401}