SMG-Decomp
A decompilation of Super Mario Galaxy 1
Loading...
Searching...
No Matches
DiskGravity.cpp
1#include "Game/Gravity.hpp"
2#include "Game/Util.hpp"
3#include "Inline.hpp"
4
5DiskGravity::DiskGravity() :
7 CALL_INLINE_FUNC(mLocalPosition, 0.0f, 50.0f, 0.0f),
8 CALL_INLINE_FUNC(mTranslation, 0.0f, 50.0f, 0.0f),
9 mLocalDirection(0, 1, 0),
10 mRotation(0, 1, 0),
11 mSideDirection(1, 0, 0),
12 mSideVecOrtho(1, 0, 0),
13 mWorldSideDir(1, 0, 0)
14{
15 mRadius = 2500.0f;
16 mWorldRadius = 2500.0f;
17 mValidDegree = 360.0f;
18 mValidCos = -1.0f;
19 mEnableBothSide = true;
20 mEnableEdgeGravity = true;
21}
22
23void DiskGravity::setLocalPosition(const TVec3f &rLocalPos) {
24 mLocalPosition = rLocalPos;
25}
26
27void DiskGravity::setLocalDirection(const TVec3f &rLocalDir) {
28 mLocalDirection.set(rLocalDir);
29 MR::normalizeOrZero(&mLocalDirection);
30 updateLocalParam();
31}
32
33void DiskGravity::setSideDirection(const TVec3f &rSideDir) {
34 mSideDirection.set(rSideDir);
35 updateLocalParam();
36}
37
38void DiskGravity::setRadius(f32 val) {
39 mRadius = val;
40}
41
42void DiskGravity::setValidDegee(f32 val) {
43 mValidDegree = val;
44 updateLocalParam();
45}
46
47void DiskGravity::setBothSide(bool val) {
48 mEnableBothSide = val;
49}
50
51void DiskGravity::setEnableEdgeGravity(bool val) {
52 mEnableEdgeGravity = val;
53}
54
55#ifdef NON_MATCHING
56// matching this with the stack is fucking impossible
57bool DiskGravity::calcOwnGravityVector(TVec3f *pDest, f32 *pDistance, const TVec3f &rPosition) const {
58 TVec3f dirToPos;
59 dirToPos = rPosition - mTranslation;
60 f32 dot = dirToPos.dot(mRotation);
61
62 if (!mEnableBothSide && dot < 0.0f)
63 return false;
64
65 TVec3f v33 = dirToPos - mRotation * dot;
66 f32 scalar;
67 MR::separateScalarAndDirection(&scalar, &v33, v33);
68
69 if (mValidCos > -1.0f && v33.dot(mWorldSideDir) < mValidCos)
70 return false;
71
72 TVec3f gravity(0, 0, 0);
73 f32 distance = 0.0f;
74
75 if (scalar <= mWorldRadius) {
76 // This entire thing doesn't make much sense
77 const TVec3f* grav;
78
79 if (dot >= 0.0f) {
80 TVec3f neg;
81 neg.negateInline_2(mRotation);
82 grav = &neg;
83 }
84 else {
85 grav = &mRotation;
86 }
87
88 gravity = *grav;
89 distance = __fabsf(dot);
90 }
91 else {
92 if (!mEnableBothSide) {
93 return false;
94 }
95
96 TVec3f v31;
97 v31.set(v33 * mWorldRadius);
98 v31.addInline2(mTranslation);
99
100 gravity = v31 - rPosition;
101 MR::separateScalarAndDirection(&distance, &gravity, gravity);
102 }
103
104 if (!isInRangeDistance(distance)) {
105 return false;
106 }
107
108 // Set gravity and scalar results
109 if (pDest) {
110 *pDest = gravity;
111 }
112 if (pDistance) {
113 *pDistance = distance;
114 }
115
116 return true;
117}
118#endif
119
120void DiskGravity::updateMtx(const TPos3f &rMtx) {
121 rMtx.mult(mLocalPosition, mTranslation);
122 rMtx.mult33(mLocalDirection, mRotation);
123 rMtx.mult33(mSideVecOrtho, mWorldSideDir);
124
125 f32 _8;
126 MR::separateScalarAndDirection(&_8, &mRotation, mRotation);
127 mWorldRadius = mRadius * _8;
128}