SMG-Decomp
A decompilation of Super Mario Galaxy 1
Loading...
Searching...
No Matches
PlanetGravityManager.cpp
1#include "Game/Gravity.hpp"
2
4 mNumGravities = 0;
5}
6
8
9}
10
11bool PlanetGravityManager::calcTotalGravityVector(TVec3f *pGravity, GravityInfo *pInfo, const TVec3f &rPosition, u32 gravityType, u32 host) const {
12 TVec3f totalGravity;
13 totalGravity.z = 0.0f;
14 totalGravity.y = 0.0f;
15 totalGravity.x = 0.0f;
16
17 PlanetGravity** pGravities = (PlanetGravity**)&mGravities;
18 bool hasCalculated = false;
19
20 if (pInfo) {
21 pInfo->init();
22 }
23
24 f32 largestScalar = -1.0f;
25 s32 largestPriority = -1;
26
27 while (pGravities != &mGravities[mNumGravities]) {
28 // Is gravity valid/active?
29 bool validGravity = false;
30
31 if ((*pGravities)->mActivated && (*pGravities)->mValidFollower && (*pGravities)->mAppeared) {
32 validGravity = true;
33 }
34
35 // Gravity is valid, matches specified gravity type(s) and does not have same host
36 if (validGravity && ((gravityType & (*pGravities)->mGravityType) != 0) && (host != (u32)(*pGravities)->mHost)) {
37 // Is priority lower -> end of list reached as it's sorted in descending order
38 s32 priority = (*pGravities)->mPriority;
39
40 if (priority < largestPriority) {
41 break;
42 }
43
44 // Calculate gravity
45 TVec3f gravityVec;
46
47 if ((*pGravities)->calcGravity(&gravityVec, rPosition)) {
48 bool storeInfo = false;
49 f32 scalar = VECMag(reinterpret_cast<const Vec*>(&gravityVec));
50
51 // If same priority, add gravity vector to total result
52 if (priority == largestPriority) {
53 totalGravity.addInline(gravityVec);
54 hasCalculated = true;
55
56 if (largestScalar < scalar) {
57 storeInfo = true;
58 }
59 }
60 // If larger priority, total gravity gets overriden
61 else if (priority > largestPriority) {
62 largestPriority = priority;
63 hasCalculated = true;
64 storeInfo = true;
65 totalGravity = gravityVec;
66 }
67
68 // Try to store gravity info if necessary
69 if (pInfo && storeInfo) {
70 largestScalar = scalar;
71 pInfo->mGravityVector = gravityVec;
72 pInfo->mLargestPriority = largestPriority;
73 pInfo->mGravityInstance = *pGravities;
74 }
75 }
76 }
77
78 pGravities++;
79 }
80
81 // Store normalized vector as result if necessary
82 if (pGravity) {
83 MR::normalizeOrZero(&totalGravity);
84 *pGravity = totalGravity;
85 }
86
87 return hasCalculated;
88}
89
91 pGravity->mIsRegistered = true;
92 int index = mNumGravities++;
93 mGravities[index] = pGravity;
94
96}
97
99 for (s32 i = mNumGravities - 1; i >= 1; i--) {
100 if (mGravities[i]->mPriority > mGravities[i - 1]->mPriority) {
101 bubbleDown(i);
102 }
103 else {
104 break;
105 }
106 }
107}
108
110 PlanetGravity *temp = mGravities[i - 1];
111 mGravities[i - 1] = mGravities[i];
112 mGravities[i] = temp;
113}
The most basic form of an object.
Definition NameObj.hpp:11
PlanetGravityManager(const char *pName)
Constructs a new PlanetGravityManager instance.
virtual void init(const JMapInfoIter &rIter)
Effectively does nothing.
void bubbleDown(int i)
Swaps the PlanetGravity instance at the specified index with the one instance right before it.
void sortGravities()
Sorts all PlanetGravity instances by their priority in reverse order. The higher the priority is,...
bool calcTotalGravityVector(TVec3f *pGravity, GravityInfo *pInfo, const TVec3f &rPosition, u32 gravityType, u32 requester) const
Calculates the total gravity vector at the specified position in space. If the object that requests g...
void registerGravity(PlanetGravity *pGravity)
Registers a PlanetGravity instance to the array of gravities. The higher the gravity's priority is,...