SMG-Decomp
A decompilation of Super Mario Galaxy 1
Loading...
Searching...
No Matches
BezierRail.cpp
1#include "Game/Map/BezierRail.hpp"
2#include "Game/Map/RailPart.hpp"
3#include "Game/Util/MathUtil.hpp"
4#include <revolution/mtx.h>
5
6#include "JSystem/JGeometry/TMatrix.hpp"
7
8namespace {
9 void calcRailDirection(TVec3f *pOut, const RailPart *pRailPart, f32 a3) {
10 pRailPart->calcVelocity(pOut, a3);
11
12 f32 v8;
13
14 if (MR::isNearZero(*pOut, 0.001f)) {
15 if ((a3 < 0.5f)) {
16 v8 = 0.0099999998f + a3;
17 }
18 else {
19 v8 = a3;
20 a3 = a3 - 0.0099999998f;
21 }
22
23 TVec3f pos;
24 pRailPart->calcPos(&pos, a3);
25 pRailPart->calcPos(pOut, v8);
26
27 pOut->sub(pos);
28 }
29
30 MR::normalize(pOut);
31 }
32};
33
34void BezierRailPart::set(const TVec3f &a1, const TVec3f &a2, const TVec3f &a3, const TVec3f &a4) {
35 TVec3f v21, v20, v19, v18, v17, v16;
36
37 TVec3f v15(a2);
38 v15.sub(a2);
39
40 v21 = v15;
41 TVec3f v14(a3);
42 v14.sub(a2);
43
44 v20 = v14;
45 TVec3f v13(a4);
46 v13.sub(a3);
47
48 v19 = v13;
49 TVec3f v12(v20);
50 v12.sub(v21);
51
52 v18 = v12;
53 TVec3f v11(v19);
54 v11.sub(v20);
55
56 v17 = v11;
57 TVec3f v10(v17);
58 v10.sub(v18);
59
60 v16 = v10;
61 _0 = a1;
62 _C = v12;
63 _18 = v18;
64 _24 = v16;
65
66 mLength = getLength(0.0f, 1.0f, 0xA);
67}
68
69void BezierRailPart::calcPos(TVec3f *pOut, f32 a2) const {
70 f32 v7 = 3.0f * a2;
71 f32 v10 = ((3.0f * a2) * a2);
72 f32 v9 = (a2 * (a2 * a2));
73
74 TVec3f v16(_C);
75 TVec3f v15(_18);
76 TVec3f v14(_24);
77
78 v16.scale(v7);
79 v15.scale(v10);
80 v14.scale(v9);
81
82 pOut->set(_0);
83 pOut->add(v16);
84 pOut->add(v15);
85 pOut->add(v14);
86}
87
88void BezierRailPart::calcVelocity(TVec3f *pOut, f32 a2) const {
89 f32 v5 = (a2 * a2);
90 f32 v7 = (2.0f * a2);
91
92 TVec3f v12(_24);
93 TVec3f v11(_18);
94 v12.scale(v5);
95 v11.scale(v7);
96
97 pOut->set<f32>(_C);
98 pOut->add(v11);
99 pOut->add(v12);
100 pOut->scale(3.0f);
101}
102
103// BezierRailPart::getLength
104// BezierRailPart::getParam
105// BezierRailPart::getNearestParam
106// BezierRail::normalizePos
107
108f32 BezierRail::getTotalLength() const {
109 return _10[_8 - 1];
110}
111
112f32 BezierRail::getPartLength(int idx) const {
113 return mRailParts[idx].getTotalLength();
114}
115
116void BezierRail::calcPos(TVec3f *pOut, f32 a2) const {
117 const RailPart* part;
118 f32 param;
119
120 getIncludedSection(&part, &param, a2, 1);
121 part->calcPos(pOut, part->getParam(param));
122}
123
124void BezierRail::calcDirection(TVec3f *pOut, f32 a2) const {
125 const RailPart* part;
126 f32 param;
127
128 getIncludedSection(&part, &param, a2, 1);
129 calcRailDirection(pOut, part, part->getParam(param));
130}
131
132void BezierRail::calcPosDir(TVec3f *pPos, TVec3f *pDir, f32 a3) const {
133 const RailPart* part;
134 f32 param;
135
136 getIncludedSection(&part, &param, a3, 1);
137 f32 val = part->getParam(param);
138 part->calcPos(pPos, val);
139 calcRailDirection(pDir, part, val);
140}
141
142#ifdef NON_MATCHING
143// regalloc issues
144f32 BezierRail::getNearestRailPosCoord(const TVec3f &a1) const {
145 RailPart* part = mRailParts;
146 int idx = 0;
147
148 f32 length = part->getTotalLength();
149 f32 nearestParam = part->getNearestParam(a1, 100.0f / length);
150
151 TVec3f pos;
152 part->calcPos(&pos, nearestParam);
153 pos.sub(a1);
154
155 f32 sqrt = pos.squared();
156
157 for (int i = 1; i < _8; i++) {
158 RailPart* curPart = &mRailParts[i];
159
160 f32 curPartLength = curPart->getTotalLength();
161 f32 curNearParam = curPart->getNearestParam(a1, 100.0f / curPartLength);
162 curPart->calcPos(&pos, curNearParam);
163
164 pos.sub(a1);
165 f32 curSqrt = pos.squared();
166
167 if (curSqrt < sqrt) {
168 sqrt = curSqrt;
169 idx = i;
170 nearestParam = curNearParam;
171 }
172 }
173
174 f32 val = !idx ? 0.0f : _10[idx - 1];
175 return (val + mRailParts[idx].getLength(0.0f, nearestParam, 10));
176}
177#endif
178
179f32 BezierRail::getRailPosCoord(int idx) const {
180 if (!idx) {
181 return 0.0f;
182 }
183 else {
184 if (mIsClosed || mPointNum - 1 != idx) {
185 return _10[idx - 1];
186 }
187 }
188
189 return getTotalLength();
190}
191
192void BezierRail::calcCurrentRailCtrlPointIter(JMapInfoIter *pIter, f32 a2, bool a3) const {
193 int idx = getCurrentCtrlPointIndex(a2, a3);
194 calcRailCtrlPointIter(pIter, idx);
195}
196
197void BezierRail::calcRailCtrlPointIter(JMapInfoIter *pIter, int idx) const {
198 pIter->_4 = idx;
199 pIter->mInfo = _18;
200}
201
202// BezierRail::getIncludedSection
203// BezierRail::getCurrentCtrlPointIndex
204// BezierRail::BezierRail