SMG-Decomp
A decompilation of Super Mario Galaxy 1
Loading...
Searching...
No Matches
GravityUtil.cpp
1#include "Game/Gravity.hpp"
2#include "Game/Util/GravityUtil.hpp"
3#include "Game/Util/JMapInfo.hpp"
4#include "Game/Scene/SceneObjHolder.hpp"
5#include "Game/LiveActor/LiveActor.hpp"
6#include <cstring>
7
8namespace {
9 void getJMapInfoArgPlus(const JMapInfoIter &rIter, const char *pFieldName, f32 *pDest) {
10
11 }
12
13 void getJMapInfoArgPlus(const JMapInfoIter &rIter, const char *pFieldName, s32 *pDest) {
14 // Get row and column of data
15 s32 row = rIter._4;
16 JMapInfo* pInfo = rIter.mInfo;
17 s32 column = pInfo->searchItemInfo(pFieldName);
18
19 // Try to read value
20 s32 result;
21 bool read = column < 0 ? false : pInfo->getValueFast(row, column, &result);
22
23 // Set result if applicable
24 if (read && result >= 0.0f) {
25 *pDest = result;
26 }
27 }
28
29 bool calcGravityVectorOrZero(const NameObj *pActor, const TVec3f &rPosition, u32 gravityType, TVec3f * pDest, GravityInfo *pInfo, u32 host) {
30 if (!host) {
31 host = (u32)pActor;
32 }
33
34 PlanetGravityManager* pManager
35 = static_cast<PlanetGravityManager*>(MR::getSceneObjHolder()->getObj(SceneObj_PlanetGravityManager));
36 return pManager->calcTotalGravityVector(pDest, pInfo, rPosition, gravityType, host);
37 }
38}
39
40namespace MR {
41 void registerGravity(PlanetGravity *pGravity) {
42 PlanetGravityManager* pManager
43 = static_cast<PlanetGravityManager*>(MR::getSceneObjHolder()->getObj(SceneObj_PlanetGravityManager));
44 pManager->registerGravity(pGravity);
45 }
46
47 bool calcGravityVector(const LiveActor *pActor, TVec3f *pDest, GravityInfo *pInfo, u32 host) {
48 u32 typeFlags = GRAVITY_TYPE_NORMAL;
49 return ::calcGravityVectorOrZero(pActor, pActor->mPosition, typeFlags, pDest, pInfo, host);
50 }
51
52 bool calcGravityVector(const NameObj *pActor, const TVec3f &rPosition, TVec3f *pDest, GravityInfo *pInfo, u32 host) {
53 u32 typeFlags = GRAVITY_TYPE_NORMAL;
54 return ::calcGravityVectorOrZero(pActor, rPosition, typeFlags, pDest, pInfo, host);
55 }
56
57 bool calcDropShadowVector(const LiveActor *pActor, TVec3f *pDest, GravityInfo *pInfo, u32 host) {
58 u32 typeFlags = GRAVITY_TYPE_SHADOW;
59 return ::calcGravityVectorOrZero(pActor, pActor->mPosition, typeFlags, pDest, pInfo, host);
60 }
61
62 bool calcDropShadowVector(const NameObj *pActor, const TVec3f &rPosition, TVec3f *pDest, GravityInfo *pInfo, u32 host) {
63 u32 typeFlags = GRAVITY_TYPE_SHADOW;
64 return ::calcGravityVectorOrZero(pActor, rPosition, typeFlags, pDest, pInfo, host);
65 }
66
67 bool calcGravityAndDropShadowVector(const LiveActor *pActor, TVec3f *pDest, GravityInfo *pInfo, u32 host) {
68 u32 typeFlags = GRAVITY_TYPE_NORMAL | GRAVITY_TYPE_SHADOW;
69 return ::calcGravityVectorOrZero(pActor, pActor->mPosition, typeFlags, pDest, pInfo, host);
70 }
71
72 bool calcGravityAndMagnetVector(const NameObj *pActor, const TVec3f &rPosition, TVec3f *pDest, GravityInfo *pInfo, u32 host) {
73 u32 typeFlags = GRAVITY_TYPE_NORMAL | GRAVITY_TYPE_MAGNET;
74 return ::calcGravityVectorOrZero(pActor, rPosition, typeFlags, pDest, pInfo, host);
75 }
76
77 bool calcGravityVectorOrZero(const LiveActor *pActor, TVec3f *pDest, GravityInfo *pInfo, u32 host) {
78 u32 typeFlags = GRAVITY_TYPE_NORMAL;
79 return ::calcGravityVectorOrZero(pActor, pActor->mPosition, typeFlags, pDest, pInfo, host);
80 }
81
82 bool calcGravityVectorOrZero(const NameObj *pActor, const TVec3f &rPosition, TVec3f *pDest, GravityInfo *pInfo, u32 host) {
83 u32 typeFlags = GRAVITY_TYPE_NORMAL;
84 return ::calcGravityVectorOrZero(pActor, rPosition, typeFlags, pDest, pInfo, host);
85 }
86
87 bool calcDropShadowVectorOrZero(const NameObj *pActor, const TVec3f &rPosition, TVec3f *pDest, GravityInfo *pInfo, u32 host) {
88 u32 typeFlags = GRAVITY_TYPE_SHADOW;
89 return ::calcGravityVectorOrZero(pActor, rPosition, typeFlags, pDest, pInfo, host);
90 }
91
92 bool calcGravityAndDropShadowVectorOrZero(const LiveActor *pActor, TVec3f *pDest, GravityInfo *pInfo, u32 host) {
93 u32 typeFlags = GRAVITY_TYPE_NORMAL | GRAVITY_TYPE_SHADOW;
94 return ::calcGravityVectorOrZero(pActor, pActor->mPosition, typeFlags, pDest, pInfo, host);
95 }
96
97 bool calcAttractMarioLauncherOrZero(const LiveActor *pActor, TVec3f *pDest, GravityInfo *pInfo, u32 host) {
98 u32 typeFlags = GRAVITY_TYPE_MARIO_LAUNCHER;
99 return ::calcGravityVectorOrZero(pActor, pActor->mPosition, typeFlags, pDest, pInfo, host);
100 }
101
102 bool isZeroGravity(const LiveActor *pActor) {
103 TVec3f dummyGravity;
104 return ::calcGravityVectorOrZero(pActor, pActor->mPosition, GRAVITY_TYPE_NORMAL, &dummyGravity, nullptr, 0) == false;
105 }
106
107 bool isLightGravity(const GravityInfo &rInfo) {
108 PlanetGravity* pGravity = rInfo.mGravityInstance;
109 return !pGravity ? false : pGravity->mGravityPower == GRAVITY_POWER_LIGHT;
110 }
111
112 void settingGravityParamFromJMap(PlanetGravity *pGravity, const JMapInfoIter &rIter) {
113 // Get range, distant and priority
114 f32 argRange = pGravity->mRange;
115 ::getJMapInfoArgPlus(rIter, "Range", &argRange);
116 f32 distant = pGravity->mDistant;
117 pGravity->mRange = argRange;
118 f32 argDistant = distant;
119 ::getJMapInfoArgPlus(rIter, "Distant", &argDistant);
120 s32 priority = pGravity->mPriority;
121 pGravity->mDistant = argDistant;
122 s32 argPriority = priority;
123 ::getJMapInfoArgPlus(rIter, "Priority", &argPriority);
124 pGravity->setPriority(argPriority);
125
126 // Get gravity ID
127 s32 gravityId = pGravity->mGravityId;
128 ::getJMapInfoArgPlus(rIter, "Gravity_id", &gravityId);
129 pGravity->mGravityId = gravityId;
130
131 // Get gravity type and power
132 getJMapInfoGravityType(rIter, pGravity);
133 getJMapInfoGravityPower(rIter, pGravity);
134
135 // Check if gravity is inverse
136 s32 inverse = pGravity->mIsInverse != false;
137 ::getJMapInfoArgPlus(rIter, "Inverse", &inverse);
138 pGravity->mIsInverse = inverse;
139 }
140
141 void getJMapInfoGravityType(const JMapInfoIter &rIter, PlanetGravity *pGravity) {
142 const char *pType = nullptr;
143
144 if (rIter.getValue("Gravity_type", &pType)) {
145 if (!strcmp(pType, "Normal")) {
146 pGravity->mGravityType = GRAVITY_TYPE_NORMAL;
147 }
148 else if (!strcmp(pType, "Shadow")) {
149 pGravity->mGravityType = GRAVITY_TYPE_SHADOW;
150 }
151 else if (!strcmp(pType, "Magnet")) {
152 pGravity->mGravityType = GRAVITY_TYPE_MAGNET;
153 }
154 }
155 }
156
157 void getJMapInfoGravityPower(const JMapInfoIter &rIter, PlanetGravity *pGravity) {
158 const char *pPower = nullptr;
159
160 if (rIter.getValue("Power", &pPower)) {
161 if (!strcmp(pPower, "Light")) {
162 pGravity->mGravityPower = GRAVITY_POWER_LIGHT;
163 }
164 else if (!strcmp(pPower, "Normal")) {
165 pGravity->mGravityPower = GRAVITY_POWER_NORMAL;
166 }
167 else if (!strcmp(pPower, "Heavy")) {
168 pGravity->mGravityPower = GRAVITY_POWER_HEAVY;
169 }
170 }
171 }
172}
The basis of a drawable actor that can contain states (see: Nerve)
Definition LiveActor.hpp:24
TVec3f mPosition
3D vector of the actor's position.
Definition LiveActor.hpp:95
The most basic form of an object.
Definition NameObj.hpp:11
Registers and holds individual PlanetGravity instances. Also provides the main function for calculati...
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,...