SMG-Decomp
A decompilation of Super Mario Galaxy 1
Loading...
Searching...
No Matches
LiveActorUtil.cpp
1#include "Game/Util.hpp"
2#include "Game/LiveActor/LiveActor.hpp"
3#include "Game/LiveActor/ActorLightCtrl.hpp"
4#include "Game/LiveActor/ClippingDirector.hpp"
5#include "Game/Map/LightFunction.hpp"
6
7namespace MR {
8 void initDefaultPos(LiveActor *pActor, const JMapInfoIter &rIter) {
9 if (!rIter.isValid()) {
10 return;
11 }
12
13 MR::getJMapInfoTrans(rIter, &pActor->mPosition);
14 MR::getJMapInfoRotate(rIter, &pActor->mRotation);
15 MR::getJMapInfoScale(rIter, &pActor->mScale);
16
17 f32 rot_x = fmod(360.0f + (pActor->mRotation.x) - 0.0f, 360.0f);
18 f32 rot_y = fmod(360.0f + (pActor->mRotation.y) - 0.0f, 360.0f);
19 pActor->mRotation.x = 0.0f + rot_x;
20 }
21
22 void initDefaultPosNoRepeat(LiveActor *pActor, const JMapInfoIter &rIter) {
23 MR::getJMapInfoTrans(rIter, &pActor->mPosition);
24 MR::getJMapInfoRotate(rIter, &pActor->mRotation);
25 MR::getJMapInfoScale(rIter, &pActor->mScale);
26 }
27
28 bool isValidMovement(const LiveActor *pActor) {
29 if (pActor->mFlags.mIsDead || pActor->mFlags.mIsClipped) {
30 return false;
31 }
32
33 return true;
34 }
35
36 bool isValidCalcAnim(const LiveActor *pActor) {
37 if (pActor->mFlags.mIsDead || pActor->mFlags.mIsClipped || pActor->mFlags.mIsNoCalcAnim) {
38 return false;
39 }
40
41 return true;
42 }
43
44 bool isValidCalcViewAndEntry(const LiveActor *pActor) {
45 if (pActor->mFlags.mIsDead || pActor->mFlags.mIsClipped) {
46 return false;
47 }
48
49 return true;
50 }
51
52 bool isValidDraw(const LiveActor *pActor) {
53 if (pActor->mFlags.mIsDead || pActor->mFlags.mIsClipped || pActor->mFlags.mIsHiddenModel) {
54 return false;
55 }
56
57 return true;
58 }
59
60 void calcAnimDirect(LiveActor *pActor) {
61 bool isNoCalcAnim = pActor->mFlags.mIsNoCalcAnim;
62 pActor->mFlags.mIsNoCalcAnim = false;
63 pActor->calcAnim();
64 if (isNoCalcAnim) {
65 pActor->mFlags.mIsNoCalcAnim = true;
66 }
67 }
68
69 void setClippingTypeSphere(LiveActor *pActor, f32 rad) {
70 MR::getClippingDirector()->mActorHolder->setTypeToSphere(pActor, rad, 0);
71 }
72
73 void setClippingTypeSphere(LiveActor *pActor, f32 rad, const TVec3f *a3) {
74 MR::getClippingDirector()->mActorHolder->setTypeToSphere(pActor, rad, a3);
75 }
76
77 void setClippingTypeSphereContainsModelBoundingBox(LiveActor *pActor, f32 a2) {
78 f32 radius = 0.0f;
79 MR::calcModelBoundingRadius(&radius, pActor);
80 f32 rad = radius * a2;
81 MR::getClippingDirector()->mActorHolder->setTypeToSphere(pActor, rad, 0);
82 }
83
84 void setClippingFar50m(LiveActor *pActor) {
85 MR::getClippingDirector()->mActorHolder->setFarClipLevel(pActor, 7);
86 }
87
88 void setClippingFar100m(LiveActor *pActor) {
89 MR::getClippingDirector()->mActorHolder->setFarClipLevel(pActor, 6);
90 }
91
92 void setClippingFar200m(LiveActor *pActor) {
93 MR::getClippingDirector()->mActorHolder->setFarClipLevel(pActor, 5);
94 }
95
96 void setClippingFar300m(LiveActor *pActor) {
97 MR::getClippingDirector()->mActorHolder->setFarClipLevel(pActor, 4);
98 }
99
100 void setClippingFarMax(LiveActor *pActor) {
101 MR::getClippingDirector()->mActorHolder->setFarClipLevel(pActor, 0);
102 }
103
104 void setClippingFar(LiveActor *pActor, f32 clipping) {
105 s32 clip = clipping;
106 switch (clip) {
107 case 0x32:
108 MR::getClippingDirector()->mActorHolder->setFarClipLevel(pActor, 7);
109 break;
110 case 0x64:
111 MR::getClippingDirector()->mActorHolder->setFarClipLevel(pActor, 6);
112 break;
113 case 0xC8:
114 MR::getClippingDirector()->mActorHolder->setFarClipLevel(pActor, 5);
115 break;
116 case 0x12C:
117 MR::getClippingDirector()->mActorHolder->setFarClipLevel(pActor, 4);
118 break;
119 case 0x190:
120 MR::getClippingDirector()->mActorHolder->setFarClipLevel(pActor, 3);
121 break;
122 case 0x1F4:
123 MR::getClippingDirector()->mActorHolder->setFarClipLevel(pActor, 2);
124 break;
125 case 0x258:
126 MR::getClippingDirector()->mActorHolder->setFarClipLevel(pActor, 1);
127 break;
128 case -1:
129 MR::getClippingDirector()->mActorHolder->setFarClipLevel(pActor, 0);
130 break;
131 }
132 }
133
134 void setGroupClipping(LiveActor *pActor, const JMapInfoIter &rIter, int a3) {
135 MR::getClippingDirector()->joinToGroupClipping(pActor, rIter, a3);
136 }
137
138 void validateClipping(LiveActor *pActor) {
139 if (pActor->mFlags.mIsInvalidClipping) {
140 MR::getClippingDirector()->mActorHolder->validateClipping(pActor);
141 }
142 }
143
144 void invalidateClipping(LiveActor *pActor) {
145 if (pActor->mFlags.mIsInvalidClipping) {
146 if (pActor->mFlags.mIsClipped) {
147 pActor->endClipped();
148 }
149 }
150 else {
151 MR::getClippingDirector()->mActorHolder->invalidateClipping(pActor);
152 }
153 }
154
155 void initLightCtrl(LiveActor *pActor) {
156 pActor->initActorLightCtrl();
157 pActor->mActorLightCtrl->init(-1, false);
158 }
159
160 void initLightCtrlForPlayer(LiveActor *pActor) {
161 pActor->initActorLightCtrl();
162 pActor->mActorLightCtrl->init(-1, false);
163 LightFunction::registerPlayerLightCtrl(pActor->mActorLightCtrl);
164 }
165
166 void initLightCtrlNoDrawEnemy(LiveActor *pActor) {
167 pActor->initActorLightCtrl();
168 pActor->mActorLightCtrl->init(1, true);
169 }
170
171 void initLightCtrlNoDrawMapObj(LiveActor *pActor) {
172 pActor->initActorLightCtrl();
173 pActor->mActorLightCtrl->init(3, true);
174 }
175
176 void updateLightCtrl(LiveActor *pActor) {
177 pActor->mActorLightCtrl->update(false);
178 }
179
180 void updateLightCtrlDirect(LiveActor *pActor) {
181 pActor->mActorLightCtrl->update(true);
182 }
183
184 void loadActorLight(const LiveActor *pActor) {
185 pActor->mActorLightCtrl->loadLight();
186 }
187
188 void calcLightPos0(TVec3f *pPos, const LiveActor *pActor) {
189 LightFunction::calcLightWorldPos(pPos, pActor->mActorLightCtrl->getActorLight()->mInfo0);
190 }
191
192 void calcLightPos1(TVec3f *pPos, const LiveActor *pActor) {
193 LightFunction::calcLightWorldPos(pPos, pActor->mActorLightCtrl->getActorLight()->mInfo1);
194 }
195
196 const GXColor* getLightAmbientColor(const LiveActor *pActor) {
197 return &pActor->mActorLightCtrl->getActorLight()->mColor;
198 }
199
200 ActorLightCtrl* getLightCtrl(const LiveActor *pActor) {
201 return pActor->mActorLightCtrl;
202 }
203
204 bool isStep(const LiveActor *pActor, s32 step) {
205 return pActor->getNerveStep() == step;
206 }
207
208 /*
209 bool isFirstStep(const LiveActor *pActor) {
210 return MR::isStep(pActor, 0);
211 }
212 */
213
214 bool isLessStep(const LiveActor *pActor, s32 step) {
215 return pActor->getNerveStep() < step;
216 }
217
218 bool isLessEqualStep(const LiveActor *pActor, s32 step) {
219 return pActor->getNerveStep() <= step;
220 }
221
222 bool isGreaterStep(const LiveActor *pActor, s32 step) {
223 return pActor->getNerveStep() > step;
224 }
225
226 bool isGreaterEqualStep(const LiveActor *pActor, s32 step) {
227 return pActor->getNerveStep() >= step;
228 }
229
230 bool isIntervalStep(const LiveActor *pActor, s32 step) {
231 s32 curStep = pActor->getNerveStep();
232 s32 ratio = curStep / step;
233 s32 mult = ratio * step;
234 return mult == curStep;
235 }
236
237
238};
The basis of a drawable actor that can contain states (see: Nerve)
Definition LiveActor.hpp:24
TVec3f mRotation
3D vector of the actor's rotation.
Definition LiveActor.hpp:96
TVec3f mPosition
3D vector of the actor's position.
Definition LiveActor.hpp:95
TVec3f mScale
3D vector of the actor's scale.
Definition LiveActor.hpp:97
LiveActorFlag mFlags
Flags relating to drawing, animation calculation, etc.