SMG-Decomp
A decompilation of Super Mario Galaxy 1
Loading...
Searching...
No Matches
PlanetGravity.cpp
1#include "Game/Gravity.hpp"
2#include "Game/Util.hpp"
3
4PlanetGravity::PlanetGravity() {
5 mRange = -1.0f;
6 mDistant = 0.0f;
7 mPriority = 0;
8 mGravityId = -1;
9 mHost = this;
10 mGravityType = GRAVITY_TYPE_NORMAL;
11 mGravityPower = GRAVITY_POWER_NORMAL;
12 mActivated = true;
13 mIsInverse = false;
14 mValidFollower = true;
15 mIsRegistered = false;
16 mAppeared = true;
17}
18
19void PlanetGravity::setPriority(s32 priority) {
20 mPriority = priority;
21}
22
23bool PlanetGravity::calcGravity(TVec3f *pDest, const TVec3f &rPosition) const {
24 // Calculate raw gravity vector
25 f32 radius = 0.0f;
26 TVec3f gravity;
27 gravity.x = 0.0f;
28 gravity.y = 0.0f;
29 gravity.z = 0.0f;
30
31 if (!calcOwnGravityVector(&gravity, &radius, rPosition))
32 return false;
33
34 // Adjust radius
35 radius -= mDistant;
36
37 if (radius < 1.0f) {
38 radius = 1.0f;
39 }
40
41 // Apply gravity speed
42 gravity.scaleInline(4000000.0f / (radius * radius));
43
44 // Invert vector if necessary
45 if (mIsInverse) {
46 TVec3f inverse;
47 inverse.negateInline(gravity);
48 gravity = inverse;
49 }
50
51 // Set result vector
52 pDest->x = gravity.x;
53 pDest->y = gravity.y;
54 pDest->z = gravity.z;
55
56 return true;
57}
58
59bool PlanetGravity::isInRangeSquare(f32 radius) const {
60 f32 range = mRange;
61
62 if (range < 0.0f) {
63 return true;
64 }
65 else {
66 f32 distance = range + mDistant;
67 return radius < distance * distance;
68 }
69}
70
71bool PlanetGravity::isInRangeDistance(f32 radius) const {
72 f32 range = mRange;
73
74 if (range < 0.0f) {
75 return true;
76 }
77 else {
78 f32 distance = range + mDistant;
79 return radius < distance;
80 }
81}
82
83bool PlanetGravity::calcGravityFromMassPosition(TVec3f *pDirection, f32 *pScalar, const TVec3f &rPosition, const TVec3f &rMassPosition) const {
84 TVec3f direction;
85 f32 scalar;
86
87 direction.subInline(rPosition, rMassPosition);
88 MR::separateScalarAndDirection(&scalar, &direction, direction);
89
90 if (!isInRangeDistance(scalar))
91 return false;
92
93 if (pDirection) {
94 *pDirection = direction;
95 }
96 if (pScalar) {
97 *pScalar = scalar;
98 }
99
100 return true;
101}
102
103void PlanetGravity::updateIdentityMtx() {
104 TPos3f mtx;
105 mtx.identity();
106 updateMtx(mtx);
107}