Add camera mWork union; also fix clang union handling

Union members with non-trivial ctors/dtors is undefined behavior and clangd normally throws a fit and refuses to parse the whole union, but it seems to be possible to ifdef the problematic ctors out for non-mwerks compilers and explicitly tell modern compilers to use the defaults instead. Thanks to encounter for this fix.
This commit is contained in:
LagoLunatic
2025-05-07 01:19:23 -04:00
parent 18fb9de306
commit f690b92d28
9 changed files with 373 additions and 341 deletions
+1
View File
@@ -4,6 +4,7 @@ CompileFlags:
"-Wno-c++11-compat-deprecated-writable-strings",
"-Wno-undefined-inline",
"-Wno-multichar",
"-Wno-c++11-extensions",
"-Wsometimes-uninitialized",
"-Wlogical-op-parentheses",
"-Wbitwise-op-parentheses",
+17 -3
View File
@@ -13,9 +13,15 @@ public:
const static cSAngle _90;
const static cSAngle _180;
const static cSAngle _270;
#ifdef __MWERKS__
cSAngle() {}
~cSAngle() {}
cSAngle(const cSAngle&);
#else
cSAngle() = default;
~cSAngle() = default;
cSAngle(const cSAngle&) = default;
#endif
cSAngle(s16);
cSAngle(float);
s16 Val() const { return mAngle; }
@@ -45,7 +51,9 @@ public:
bool operator<(const cSAngle& other) const { return mAngle < other.mAngle; }
bool operator>(const cSAngle& other) const { return mAngle > other.mAngle; }
operator s16() const { return mAngle; }
#ifdef __MWERKS__
void operator=(const cSAngle& other) { mAngle = other.mAngle; }
#endif
static inline cSAngle getMaxNegative() { return cSAngle((s16)-0x8000); }
inline void mirrorAtMaxNeg() { *this = cSAngle((s16)-0x8000) - *this; }
};
@@ -131,12 +139,18 @@ private:
cSAngle mInclination; // original: U
public:
cSGlobe() {};
#ifdef __MWERKS__
cSGlobe() {}
~cSGlobe() {}
cSGlobe(const cSGlobe&);
#else
cSGlobe() = default;
~cSGlobe() = default;
cSGlobe(const cSGlobe&) = default;
#endif
cSGlobe(float, short, short);
cSGlobe(float, const cSAngle&, const cSAngle&);
cSGlobe(const cXyz&);
~cSGlobe() {}
cSGlobe& Formal();
void Val(const cSGlobe&);
void Val(float, short, short);
@@ -154,6 +168,6 @@ public:
void Polar(cSPolar*) const;
cXyz Norm() const;
cSGlobe& Invert();
};
}; // Size: 0x8
#endif /* C_ANGLE_H */
+12 -6
View File
@@ -18,18 +18,24 @@ struct cXyz : Vec {
static const cXyz BaseXZ;
static const cXyz BaseYZ;
static const cXyz BaseXYZ;
#ifdef __MWERKS__
cXyz() {}
~cXyz() {}
/* inlined */ cXyz() {}
cXyz(f32 pX, f32 pY, f32 pZ) {
x = pX;
y = pY;
z = pZ;
}
cXyz(const cXyz& vec) {
x = vec.x;
y = vec.y;
z = vec.z;
}
#else
cXyz() = default;
~cXyz() = default;
cXyz(const cXyz& vec) = default;
#endif
cXyz(f32 pX, f32 pY, f32 pZ) {
x = pX;
y = pY;
z = pZ;
}
cXyz(const Vec& vec) {
x = vec.x;
y = vec.y;
+64 -35
View File
@@ -260,41 +260,70 @@ public:
/* 0x364 */ int m364;
/* 0x368 */ f32 m368;
/* 0x36C */ cXyz m36C;
/* 0x378 */ int m378;
/* 0x37C */ u8 m37C; // `CalcSubjectAngle` suggests this should be u8 but `followCamera` suggests it should be int
/* 0x37D */ u8 m37D; // The fact that this a referenced in `CalcSubjectAngle` suggests m37C can't be an int?
/* 0x37E */ s16 m37E;
/* 0x380 */ int m380;
/* 0x384 */ f32 m384;
/* 0x388 */ f32 m388; // `CalcSubjectAngle` suggests this should be a float but `followCamera` suggests it should be int
/* 0x38C */ f32 m38C; // Similar issue for 38C
/* 0x390 */ s16 m390;
/* 0x392 */ s16 m392;
/* 0x394 */ f32 m394;
/* 0x398 */ f32 m398;
/* 0x39C */ f32 m39C;
/* 0x3A0 */ f32 m3A0;
/* 0x3A4 */ f32 m3A4;
/* 0x3A8 */ f32 m3A8;
/* 0x3AC */ f32 m3AC;
/* 0x3B0 */ f32 m3B0;
/* 0x3B4 */ int m3B4;
/* 0x3B8 */ cSAngle m3B8; // `CalcSubjectAngle` thinks this is a cSAngle but `followCamera` thinks its a float (could also be cSGlobe since m3BA is a cSAngle and m3BC is a float)
/* 0x3BA */ cSAngle m3BA;
/* 0x3BC */ f32 m3BC;
/* 0x3C0 */ cXyz m3C0;
/* 0x3CC */ cXyz m3CC;
/* 0x3D8 */ u8 m3D8;
/* 0x3D9 */ u8 m3D9;
/* 0x3DA */ u8 m3DA;
/* 0x3DB */ u8 m3DB;
/* 0x3DC */ f32 m3DC;
/* 0x3E0 */ f32 m3E0;
/* 0x3E4 */ f32 m3E4;
/* 0x3E8 */ f32 m3E8;
/* 0x3EC */ f32 m3EC;
/* 0x3F0 */ f32 m3F0;
/* 0x3F4 */ u8 m3F4[0x3F8 - 0x3F4];
/* 0x314 */ union Work {
struct {
/* 0x378 */ int m378;
/* 0x37C */ int m37C;
/* 0x380 */ int m380;
/* 0x384 */ f32 m384;
/* 0x388 */ int m388;
/* 0x38C */ int m38C;
/* 0x390 */ s16 m390;
/* 0x392 */ s16 m392;
/* 0x394 */ f32 m394;
/* 0x398 */ f32 m398;
/* 0x39C */ f32 m39C;
/* 0x3A0 */ f32 m3A0;
/* 0x3A4 */ f32 m3A4;
/* 0x3A8 */ f32 m3A8;
/* 0x3AC */ f32 m3AC;
/* 0x3B0 */ f32 m3B0;
/* 0x3B4 */ int m3B4;
/* 0x3B8 */ f32 m3B8;
/* 0x3BC */ f32 m3BC;
/* 0x3C0 */ cXyz m3C0;
/* 0x3CC */ cXyz m3CC;
/* 0x3D8 */ u8 m3D8;
/* 0x3D9 */ u8 m3D9;
/* 0x3DA */ u8 m3DA;
/* 0x3DB */ u8 m3DB;
/* 0x3DC */ f32 m3DC;
/* 0x3E0 */ f32 m3E0;
/* 0x3E4 */ f32 m3E4;
/* 0x3E8 */ f32 m3E8;
/* 0x3EC */ f32 m3EC;
/* 0x3F0 */ f32 m3F0;
/* 0x3F4 */ u8 m3F4[0x3F8 - 0x3F4];
} follow;
struct {
/* 0x378 */ int m378;
/* 0x37C */ u8 m37C[0x380 - 0x37C];
/* 0x380 */ int m380;
/* 0x384 */ f32 m384;
/* 0x388 */ int m388;
/* 0x38C */ u8 m38C;
/* 0x390 */ cXyz m390;
/* 0x39C */ u8 m39C;
/* 0x3A0 */ f32 m3A0;
/* 0x3A4 */ f32 m3A4;
/* 0x3A8 */ cSGlobe m3A8;
/* 0x3B0 */ f32 m3B0;
/* 0x3B4 */ f32 m3B4;
/* 0x3B8 */ f32 m3B8;
} lockon;
struct {
/* 0x378 */ int m378;
/* 0x37C */ u8 m37C;
/* 0x37D */ u8 m37D;
/* 0x380 */ int m380;
/* 0x384 */ f32 m384;
/* 0x388 */ f32 m388;
/* 0x38C */ f32 m38C;
/* 0x390 */ u8 m390[0x3B8 - 0x390];
/* 0x3B8 */ cSAngle m3B8;
/* 0x3BA */ cSAngle m3BA;
} subject;
} mWork;
/* 0x3F8 */ dCamera_event_data mEventData;
/* 0x50C */ u32 mEventFlags;
/* 0x510 */ int mCurStyle;
+13 -20
View File
@@ -227,54 +227,47 @@ class JntHit_c;
struct fopAc_cullSizeSphere {
public:
#ifdef __MWERKS__
/* 0x0 */ cXyz center;
/* 0xC */ f32 radius;
fopAc_cullSizeSphere() {}
~fopAc_cullSizeSphere() {}
#else
fopAc_cullSizeSphere() = default;
~fopAc_cullSizeSphere() = default;
#endif
fopAc_cullSizeSphere(cXyz p, f32 r) {
center = p;
radius = r;
}
~fopAc_cullSizeSphere() {}
#else
/* 0x0 */ Vec center;
/* 0x0 */ cXyz center;
/* 0xC */ f32 radius;
#endif
};
#ifdef __MWERKS__
#define fopAc_MakeCullSizeSphere(center, radius) fopAc_cullSizeSphere(center, radius)
#else
#define fopAc_MakeCullSizeSphere(center, radius) {(Vec)center, radius}
#endif
struct fopAc_cullSizeBox {
public:
#ifdef __MWERKS__
fopAc_cullSizeBox() {}
~fopAc_cullSizeBox() {}
fopAc_cullSizeBox(const fopAc_cullSizeBox& box) {
min = box.min;
max = box.max;
}
#else
fopAc_cullSizeBox() = default;
~fopAc_cullSizeBox() = default;
fopAc_cullSizeBox(const fopAc_cullSizeBox& box) = default;
#endif
fopAc_cullSizeBox(cXyz min, cXyz max) {
this->min = min;
this->max = max;
}
~fopAc_cullSizeBox() {}
/* 0x0 */ cXyz min;
/* 0xC */ cXyz max;
#else
/* 0x0 */ Vec min;
/* 0xC */ Vec max;
#endif
};
#ifdef __MWERKS__
#define fopAc_MakeCullSizeBox(min, max) fopAc_cullSizeBox(min, max)
#else
#define fopAc_MakeCullSizeBox(min, max) {(Vec)min, (Vec)max}
#endif
class fopAc_ac_c : public leafdraw_class {
public:
-12
View File
@@ -502,23 +502,11 @@ void fopAcM_DeleteHeap(fopAc_ac_c* p_actor);
bool fopAcM_entrySolidHeap(fopAc_ac_c* p_actor, heapCallbackFunc p_heapCallback, u32 estimatedHeapSize);
inline void fopAcM_SetMin(fopAc_ac_c* p_actor, f32 minX, f32 minY, f32 minZ) {
#ifdef __MWERKS__
p_actor->cull.box.min.set(minX, minY, minZ);
#else
p_actor->cull.box.min.x = minX;
p_actor->cull.box.min.y = minY;
p_actor->cull.box.min.z = minZ;
#endif
}
inline void fopAcM_SetMax(fopAc_ac_c* p_actor, f32 maxX, f32 maxY, f32 maxZ) {
#ifdef __MWERKS__
p_actor->cull.box.max.set(maxX, maxY, maxZ);
#else
p_actor->cull.box.max.x = maxX;
p_actor->cull.box.max.y = maxY;
p_actor->cull.box.max.z = maxZ;
#endif
}
void fopAcM_setCullSizeBox(fopAc_ac_c* p_actor, f32 minX, f32 minY, f32 minZ, f32 maxX, f32 maxY,
+4
View File
@@ -14,10 +14,12 @@ const cSAngle cSAngle::_90(static_cast<s16>(0x4000));
const cSAngle cSAngle::_180(static_cast<s16>(-0x8000));
const cSAngle cSAngle::_270(static_cast<s16>(-0x4000));
#ifdef __MWERKS__
/* 80253BB0-80253BE0 .text __ct__7cSAngleFRC7cSAngle */
cSAngle::cSAngle(const cSAngle& angle) {
Val(angle);
}
#endif
/* 80253BE0-80253C10 .text __ct__7cSAngleFs */
cSAngle::cSAngle(s16 angle) {
@@ -246,10 +248,12 @@ void cSPolar::Globe(cSGlobe* globe) const {
globe->Val(mRadial, 0x4000 - mAngle1.Val(), mAngle2.Val());
}
#ifdef __MWERKS__
/* 80254524-80254554 .text __ct__7cSGlobeFRC7cSGlobe */
cSGlobe::cSGlobe(const cSGlobe& other) {
Val(other);
}
#endif
/* 80254554-80254584 .text __ct__7cSGlobeFfss */
cSGlobe::cSGlobe(f32 f, s16 s1, s16 s2) {
+240 -243
View File
@@ -2681,9 +2681,9 @@ bool dCamera_c::followCamera(s32 param_1) {
bVar2 = false;
if (m108 == 0) {
m3AC = 0;
m3B0 = 0.0f;
m3D9 = 0;
mWork.follow.m3AC = 0;
mWork.follow.m3B0 = 0.0f;
mWork.follow.m3D9 = 0;
}
bVar1 = false;
@@ -2746,11 +2746,11 @@ bool dCamera_c::followCamera(s32 param_1) {
if (check_owner_action(mPadId, daPyStts0_UNK200_e | daPyStts0_UNK100_e) && !check_owner_action(mPadId, daPyStts0_UNK2000000_e)) {
if (dVar21 > -10.0f) {
m3B0 = -10.0f;
mWork.follow.m3B0 = -10.0f;
}
}
else {
m3B0 += ((dVar21 - m3B0) * 0.06f);
mWork.follow.m3B0 += ((dVar21 - mWork.follow.m3B0) * 0.06f);
}
if (check_owner_action1(mPadId, daPyStts1_UNK40000_e)) {
@@ -2783,61 +2783,61 @@ bool dCamera_c::followCamera(s32 param_1) {
if (bVar3) {
if (mStickMainPosXLast < -0.2f) {
m3D9 = 1;
mWork.follow.m3D9 = 1;
}
if (mStickMainPosXLast > 0.2f) {
m3D9 = 0;
mWork.follow.m3D9 = 0;
}
f32 temp_004 = 0.04f;
if (m3D9) {
if (mWork.follow.m3D9) {
fVar37 = -45.0f;
}
else {
fVar37 = 45.0f;
}
m3AC += (fVar37 - m3AC) * temp_004;
mWork.follow.m3AC += (fVar37 - mWork.follow.m3AC) * temp_004;
}
else {
m3AC += (dVar19 - m3AC) * 0.06f;
mWork.follow.m3AC += (dVar19 - mWork.follow.m3AC) * 0.06f;
}
}
cXyz local_314(m3AC, dVar20, m3B0);
cXyz local_314(mWork.follow.m3AC, dVar20, mWork.follow.m3B0);
cXyz local_158;
if (m108 == 0) {
m03C.Val(m050 - m044);
m378 = 'FLLW';
m394 = fVar40;
m388 = 0x50;
m398 = dVar25;
m39C = dVar24;
m38C = m392 = m390 = 0;
m3A0 = m3BC = mDirection.V().Degree();
m3C0 = m044;
m3CC = m050;
m3E8 = m3E0 = m3E4 = 0.01f;
m3DC = 0.75f;
m3EC = dVar23;
m3F0 = dVar22;
m3B4 = 0;
m3D8 = 1;
m3A8 = m060;
m3B8 = 0.0f;
m3DA = 0;
mWork.follow.m378 = 'FLLW';
mWork.follow.m394 = fVar40;
mWork.follow.m388 = 0x50;
mWork.follow.m398 = dVar25;
mWork.follow.m39C = dVar24;
mWork.follow.m38C = mWork.follow.m392 = mWork.follow.m390 = 0;
mWork.follow.m3A0 = mWork.follow.m3BC = mDirection.V().Degree();
mWork.follow.m3C0 = m044;
mWork.follow.m3CC = m050;
mWork.follow.m3E8 = mWork.follow.m3E0 = mWork.follow.m3E4 = 0.01f;
mWork.follow.m3DC = 0.75f;
mWork.follow.m3EC = dVar23;
mWork.follow.m3F0 = dVar22;
mWork.follow.m3B4 = 0;
mWork.follow.m3D8 = 1;
mWork.follow.m3A8 = m060;
mWork.follow.m3B8 = 0.0f;
mWork.follow.m3DA = 0;
m3A4 = positionOf(mpPlayerActor).y;
mWork.follow.m3A4 = positionOf(mpPlayerActor).y;
if (chkFlag(0x8000) || !m110) {
m102 = 1;
m101 = 1;
m100 = 1;
m37C = 1;
mWork.follow.m37C = 1;
}
else {
cXyz cStack_248 = relationalPos(mpPlayerActor, &local_314);
@@ -2873,13 +2873,13 @@ bool dCamera_c::followCamera(s32 param_1) {
dVar20 = 10.0f;
}
m37C = (std::sqrtf(playerHeight / dVar20) * 3.8f) + 1;
mWork.follow.m37C = (std::sqrtf(playerHeight / dVar20) * 3.8f) + 1;
}
m398 = m39C = mDirection.R();
m3A8 = mFovY;
m380 = m37C * (m37C + 1) >> 1;
m384 = 0.0f;
mWork.follow.m398 = mWork.follow.m39C = mDirection.R();
mWork.follow.m3A8 = mFovY;
mWork.follow.m380 = mWork.follow.m37C * (mWork.follow.m37C + 1) >> 1;
mWork.follow.m384 = 0.0f;
}
cXyz cStack_260 = relationalPos(mpPlayerActor, &local_314);
@@ -2890,17 +2890,17 @@ bool dCamera_c::followCamera(s32 param_1) {
cXyz cross;
if (m100 == 0) {
if (m31D != 0) {
dComIfG_Bgsp()->MoveBgMatrixCrrPos(mBG.m5C.m04, true, &m3C0, NULL, NULL);
dComIfG_Bgsp()->MoveBgMatrixCrrPos(mBG.m5C.m04, true, &mWork.follow.m3C0, NULL, NULL);
}
m384 = m37C - m108;
mWork.follow.m384 = mWork.follow.m37C - m108;
f32 temp = (m384 / m380);
m3C0 += (cStack_260 - m3C0) * temp;
f32 temp = (mWork.follow.m384 / mWork.follow.m380);
mWork.follow.m3C0 += (cStack_260 - mWork.follow.m3C0) * temp;
m044 += (m3C0 - m044) * dVar23;
m044 += (mWork.follow.m3C0 - m044) * dVar23;
f32 xyzDist = dCamMath::xyzHorizontalDistance(cStack_260, m3C0);
f32 xyzDist = dCamMath::xyzHorizontalDistance(cStack_260, mWork.follow.m3C0);
if (local_314.x > local_314.z) {
local_314.z = local_314.x;
@@ -2937,19 +2937,18 @@ bool dCamera_c::followCamera(s32 param_1) {
m03C.U(m03C.U() + ((acStack_4a8.Inv() - m03C.U()) * fVar40));
}
m3CC = m050 = m044 + m03C.Xyz();
mWork.follow.m3CC = m050 = m044 + m03C.Xyz();
if (m37C <= m108) {
if (mWork.follow.m37C <= m108) {
m102 = 1;
m101 = 1;
m100 = 1;
}
m3A0 = m03C.V().Degree();
m39C = m03C.R();
//m398 = pfVar14;
mWork.follow.m3A0 = m03C.V().Degree();
mWork.follow.m398 = mWork.follow.m39C = m03C.R();
m060 += (fVar40 * (dVar31 - m060));
m380 -= m384;
mWork.follow.m380 -= mWork.follow.m384;
return true;
}
@@ -2959,16 +2958,16 @@ bool dCamera_c::followCamera(s32 param_1) {
fVar37 -= groundHeight(&player_pos);
if (m360 && (check_owner_action(mPadId, daPyStts0_SWIM_e) || daNpc_kam_c::m_hyoi_kamome == 0 || check_owner_action(mPadId, 0x200))) {
if (m388 < 0x50) {
m388++;
if (mWork.follow.m388 < 0x50) {
mWork.follow.m388++;
local_158.x = 176.0f;
local_158.y = m388;
m394 += (fVar40 - m394) * dCamMath::rationalBezierRatio(m388 / 80.0f, 1.25f);
local_158.y = mWork.follow.m388;
mWork.follow.m394 += (fVar40 - mWork.follow.m394) * dCamMath::rationalBezierRatio(mWork.follow.m388 / 80.0f, 1.25f);
}
}
else {
m394 = 0.0F;
m388 = 0;
mWork.follow.m394 = 0.0F;
mWork.follow.m388 = 0;
}
if (check_owner_action(mPadId, daPyStts0_UNK4000000_e | daPyStts0_UNK2000000_e | daPyStts0_UNK800000_e | daPyStts0_UNK40_e | daPyStts0_UNK20_e | daPyStts0_UNK1_e) || (check_owner_action1(mPadId, daPyStts1_UNK10000_e) && mDMCSystem.field_0x0 == 0)) {
@@ -2976,29 +2975,29 @@ bool dCamera_c::followCamera(s32 param_1) {
}
if ((check_owner_action(mPadId, daPyStts0_UNK2000000_e | daPyStts0_UNK100_e | daPyStts0_UNK40_e | daPyStts0_UNK20_e | daPyStts0_UNK1_e) && check_owner_action1(mPadId, daPyStts1_UNK10000_e)) || (cSAngle::_270 < local_4ac && local_4ac < cSAngle::_90)) {
m3EC = dVar23;
mWork.follow.m3EC = dVar23;
}
else {
m3EC = 0.1f;
mWork.follow.m3EC = 0.1f;
}
if (m388 == 0) {
m3F0 = dVar22;
if (mWork.follow.m388 == 0) {
mWork.follow.m3F0 = dVar22;
}
else {
m3F0 = dVar22 * 0.1f + (1.0f - (dVar22 * 0.1f)) * m394;
if (chkFlag(0x100000) || m3EC <= 0.25f) {
mWork.follow.m3F0 = dVar22 * 0.1f + (1.0f - (dVar22 * 0.1f)) * mWork.follow.m394;
if (chkFlag(0x100000) || mWork.follow.m3EC <= 0.25f) {
bVar3 = false;
if (daNpc_Cb1_c::isFlying() || daNpc_Md_c::isFlying()) {
bVar3 = true;
}
if (!bVar3 && check_owner_action1(mPadId, daPyStts1_UNK40000_e)) goto LAB_8016b24c;
}
m3EC = m394 * 0.75f + 0.25f;
mWork.follow.m3EC = mWork.follow.m394 * 0.75f + 0.25f;
}
LAB_8016b24c:
cXyz cStack_284(m3EC, m3F0, m3EC);
cXyz cStack_284(mWork.follow.m3EC, mWork.follow.m3F0, mWork.follow.m3EC);
bVar4 = true;
bVar3 = false;
@@ -3006,7 +3005,7 @@ bool dCamera_c::followCamera(s32 param_1) {
bVar3 = true;
}
if (chkFlag(0x100000) || check_owner_action(mPadId, daPyStts0_UNK4000000_e | daPyStts0_UNK2000000_e | daPyStts0_UNK800000_e | daPyStts0_TELESCOPE_LOOK_e | daPyStts0_UNK40_e | daPyStts0_UNK20_e | daPyStts0_UNK1_e) || check_owner_action1(mPadId, daPyStts1_UNK10000_e | daPyStts1_DEKU_LEAF_FAN_e) || m388) {
if (chkFlag(0x100000) || check_owner_action(mPadId, daPyStts0_UNK4000000_e | daPyStts0_UNK2000000_e | daPyStts0_UNK800000_e | daPyStts0_TELESCOPE_LOOK_e | daPyStts0_UNK40_e | daPyStts0_UNK20_e | daPyStts0_UNK1_e) || check_owner_action1(mPadId, daPyStts1_UNK10000_e | daPyStts1_DEKU_LEAF_FAN_e) || mWork.follow.m388) {
bVar4 = false;
}
@@ -3043,107 +3042,107 @@ bool dCamera_c::followCamera(s32 param_1) {
cSGlobe local_484(m050 - m044);
if (m392 <= 0 || iVar17 <= m392) {
if (mWork.follow.m392 <= 0 || iVar17 <= mWork.follow.m392) {
dVar20 = dCamMath::rationalBezierRatio((float) iVar5 / (float)iVar17, fVar38);
m3D8 = 1;
m3B8 = (1.0f - m3B8.Val()) * dVar20;
mWork.follow.m3D8 = 1;
mWork.follow.m3B8 = (1.0f - mWork.follow.m3B8) * dVar20;
}
else if (chkFlag(0x100000) || daNpc_Cb1_c::isFlying()) {
if (m3D8) {
m3B8 = 0.05f;
if (mWork.follow.m3D8) {
mWork.follow.m3B8 = 0.05f;
}
m3D8 = 0;
m3B8 += (1.0f - m3B8.Val()) * 0.2f;
mWork.follow.m3D8 = 0;
mWork.follow.m3B8 += (1.0f - mWork.follow.m3B8) * 0.2f;
}
else if (daNpc_Md_c::isFlying() || daNpc_kam_c::m_hyoi_kamome) {
m3D8 = 1;
mWork.follow.m3D8 = 1;
}
else if (check_owner_action1(mPadId, check_owner_action1(mPadId, daPyStts1_UNK40000_e | daPyStts1_DEKU_LEAF_FAN_e))) {
if (m3D8) {
m3B8 = 0.05f;
if (mWork.follow.m3D8) {
mWork.follow.m3B8 = 0.05f;
}
m3D8 = 0;
m3B8 += (0.5f - m3B8.Val()) * 0.05f;
mWork.follow.m3D8 = 0;
mWork.follow.m3B8 += (0.5f - mWork.follow.m3B8) * 0.05f;
}
else {
m3D8 = 1;
mWork.follow.m3D8 = 1;
if (mDMCSystem.field_0x0) {
m3B8 = 0.0f;
mWork.follow.m3B8 = 0.0f;
}
else if (mStickMainPosYLast >= 0.0f) {
m3B8 = 1.0f - ((cSAngle(dCamMath::rationalBezierRatio(mStickMainPosXLast, dVar33) * 180.0f).Cos() * 0.5f) + 0.5f);
mWork.follow.m3B8 = 1.0f - ((cSAngle(dCamMath::rationalBezierRatio(mStickMainPosXLast, dVar33) * 180.0f).Cos() * 0.5f) + 0.5f);
}
else {
m3B8 = 1.0f - ((cSAngle(dCamMath::rationalBezierRatio(mStickMainPosXLast, dVar34) * 180.0f).Cos() * 0.25f) + 0.75f);
mWork.follow.m3B8 = 1.0f - ((cSAngle(dCamMath::rationalBezierRatio(mStickMainPosXLast, dVar34) * 180.0f).Cos() * 0.25f) + 0.75f);
}
m3B8 *= mStickMainValueLast;
mWork.follow.m3B8 *= mStickMainValueLast;
if (chkFlag(0x80000)) {
m3B8 *= 0.5f;
mWork.follow.m3B8 *= 0.5f;
}
else {
m3B8 *= 0.1f;
mWork.follow.m3B8 *= 0.1f;
}
if (check_owner_action(mPadId, daPyStts0_UNK2000000_e | daPyStts0_UNK100_e) || check_owner_action1(mPadId, check_owner_action1(mPadId, daPyStts1_UNK10000_e))) {
if (m38C == 0) {
if (mWork.follow.m38C == 0) {
if (local_4ac > cSAngle::_270 && local_4ac < cSAngle::_90) {
m38C = 1;
mWork.follow.m38C = 1;
}
else {
m38C = -1;
mWork.follow.m38C = -1;
}
}
else if (m38C < 0) {
m38C--;
if (m38C <= -0x20) {
m38C = 0x10;
else if (mWork.follow.m38C < 0) {
mWork.follow.m38C--;
if (mWork.follow.m38C <= -0x20) {
mWork.follow.m38C = 0x10;
}
}
else if (m38C < 0xf) {
m3B8 = m38C * 0.033333335f;
m38C++;
else if (mWork.follow.m38C < 0xf) {
mWork.follow.m3B8 = mWork.follow.m38C * 0.033333335f;
mWork.follow.m38C++;
}
else if (!check_owner_action(mPadId, daPyStts0_UNK2000000_e)) {
if (mStickMainValueLast < 0.1f) {
m3B8 = 0.05f;
mWork.follow.m3B8 = 0.05f;
}
else {
m3B8 = dCamMath::rationalBezierRatio(std::fabsf(local_4ac.Sin()), 12.0f);
mWork.follow.m3B8 = dCamMath::rationalBezierRatio(std::fabsf(local_4ac.Sin()), 12.0f);
}
}
}
else if (bVar1) {
if (m38C == 0 && (local_4ac <= cSAngle::_270 || local_4ac >= cSAngle::_90)) {
m38C = 1;
if (mWork.follow.m38C == 0 && (local_4ac <= cSAngle::_270 || local_4ac >= cSAngle::_90)) {
mWork.follow.m38C = 1;
}
else if (m38C < 0xf) {
m3B8 = iVar5 * 0.033333335f;
m38C++;
else if (mWork.follow.m38C < 0xf) {
mWork.follow.m3B8 = iVar5 * 0.033333335f;
mWork.follow.m38C++;
}
else if (check_owner_action(mPadId, daPyStts0_UNK40_e | daPyStts0_UNK20_e)) {
m3B8 = 0.15f;
mWork.follow.m3B8 = 0.15f;
}
else if (mStickMainValueLast < 0.1f) {
m3B8 = 0.05f;
mWork.follow.m3B8 = 0.05f;
}
else {
m3B8 = dCamMath::rationalBezierRatio(std::fabsf(local_4ac.Sin()), 12.0f);
mWork.follow.m3B8 = dCamMath::rationalBezierRatio(std::fabsf(local_4ac.Sin()), 12.0f);
}
}
else {
m3B8 *= dVar35;
m38C = 0;
mWork.follow.m3B8 *= dVar35;
mWork.follow.m38C = 0;
}
}
cSAngle acStack_4b4;
if (chkFlag(0x80) && !chkFlag(0x80000) && mCurMode == 0 && m38C == 0) {
if (chkFlag(0x80) && !chkFlag(0x80000) && mCurMode == 0 && mWork.follow.m38C == 0) {
acStack_4b4 = cSAngle(mDirection.U().Val());
}
else if (bVar1) {
@@ -3157,93 +3156,93 @@ bool dCamera_c::followCamera(s32 param_1) {
}
cSAngle acStack_4b8 = cSAngle((s16)0);
cSAngle acStack_51c = (acStack_4b4 - local_484.V()) * m3B8.Degree() * local_484.U().Cos();
cSAngle acStack_51c = (acStack_4b4 - local_484.V()) * mWork.follow.m3B8 * local_484.U().Cos();
m03C.U(local_484.V() + acStack_51c + acStack_4b8);
cSAngle local_4bc;
if (check_owner_action1(mPadId, daPyStts1_UNK20000_e)) {
if (m392 <= iVar17) {
if (mWork.follow.m392 <= iVar17) {
local_4bc = acStack_490;
m3E0 = dCamMath::rationalBezierRatio((float)m392 / (float)iVar17, fVar38);
mWork.follow.m3E0 = dCamMath::rationalBezierRatio((float)mWork.follow.m392 / (float)iVar17, fVar38);
setFlag(0x4000000);
m392++;
mWork.follow.m392++;
}
else {
local_4bc = acStack_490;
m3E0 = 1.0f;
mWork.follow.m3E0 = 1.0f;
}
m3BC = m3A0 = local_4bc.Degree();
mWork.follow.m3BC = mWork.follow.m3A0 = local_4bc.Degree();
}
else {
if (m392 != 0) {
m3E0 = 0.0f;
if (mWork.follow.m392 != 0) {
mWork.follow.m3E0 = 0.0f;
}
m392 = 0;
mWork.follow.m392 = 0;
if (mCurMode == 1) {
m3E0 = 0.5f;
m3BC = m3A0 = m3A0 + (m3B8.Val() * (dVar28 - m3A0));
local_4bc = cAngle::d2s(m3A0);
m3E0 += (fVar40 - m3E0) * 0.5f;
mWork.follow.m3E0 = 0.5f;
mWork.follow.m3BC = mWork.follow.m3A0 = mWork.follow.m3A0 + (mWork.follow.m3B8 * (dVar28 - mWork.follow.m3A0));
local_4bc = cAngle::d2s(mWork.follow.m3A0);
mWork.follow.m3E0 += (fVar40 - mWork.follow.m3E0) * 0.5f;
}
else if (m388 == 0) {
m3BC += dVar27 * (dVar28 - m3BC);
else if (mWork.follow.m388 == 0) {
mWork.follow.m3BC += dVar27 * (dVar28 - mWork.follow.m3BC);
dVar20 = 0.01f;
if (m3B4 != 0) {
if (mWork.follow.m3B4 != 0) {
dVar20 = 0.25f;
dVar29 = dVar20;
}
m3A0 += dVar29 * ((m3BC + m148.Degree()) - m3A0);
local_4bc = cAngle::d2s(m3A0);
mWork.follow.m3A0 += dVar29 * ((mWork.follow.m3BC + m148.Degree()) - mWork.follow.m3A0);
local_4bc = cAngle::d2s(mWork.follow.m3A0);
if (chkFlag(0x80000)) {
m3E0 = 0.0f;
mWork.follow.m3E0 = 0.0f;
}
else if (m3B4) {
m3E0 += dVar20 * (fVar40 - m3E0);
else if (mWork.follow.m3B4) {
mWork.follow.m3E0 += dVar20 * (fVar40 - mWork.follow.m3E0);
}
else if (mMonitor.mPos.y < 0.01f && mCurMode == 0) {
m3E0 += (0.1f - m3E0) * 0.05f;
mWork.follow.m3E0 += (0.1f - mWork.follow.m3E0) * 0.05f;
}
else {
m3E0 += dVar20 * (fVar40 - m3E0);
mWork.follow.m3E0 += dVar20 * (fVar40 - mWork.follow.m3E0);
}
}
else {
if (check_owner_action(mPadId, daPyStts0_UNK2000000_e) || check_owner_action1(mPadId, daPyStts1_UNK10000_e)) {
local_4bc = acStack_51c;
m3BC = m3A0 = local_4bc.Degree();
m3E0 = 0.95f;
mWork.follow.m3BC = mWork.follow.m3A0 = local_4bc.Degree();
mWork.follow.m3E0 = 0.95f;
}
else if (isPlayerFlying(mPadId) || daNpc_kam_c::m_hyoi_kamome) {
local_4bc = acStack_51c;
if (m3A4 < positionOf(mpPlayerActor).y) {
m3E0 = dCamMath::rationalBezierRatio(m394, dVar30);
if (mWork.follow.m3A4 < positionOf(mpPlayerActor).y) {
mWork.follow.m3E0 = dCamMath::rationalBezierRatio(mWork.follow.m394, dVar30);
}
else {
m3E0 += (0.75f - m3E0) * 0.15f;
mWork.follow.m3E0 += (0.75f - mWork.follow.m3E0) * 0.15f;
}
m3BC = m3A0 = local_4bc.Degree();
mWork.follow.m3BC = mWork.follow.m3A0 = local_4bc.Degree();
}
else {
local_4bc = acStack_51c;
m3BC = m3A0 = local_4bc.Degree();
m3E0 = dCamMath::rationalBezierRatio(m394, dVar30);
mWork.follow.m3BC = mWork.follow.m3A0 = local_4bc.Degree();
mWork.follow.m3E0 = dCamMath::rationalBezierRatio(mWork.follow.m394, dVar30);
}
}
}
m3A4 = positionOf(mpPlayerActor).y;
mWork.follow.m3A4 = positionOf(mpPlayerActor).y;
if (check_owner_action(mPadId, daPyStts0_UNK2000000_e | daPyStts0_UNK100_e | daPyStts0_UNK40_e | daPyStts0_UNK20_e | daPyStts0_UNK1_e || check_owner_action1(mPadId, daPyStts1_UNK10000_e))) {
m3B4 = 1;
mWork.follow.m3B4 = 1;
}
else {
m3B4 = 0;
mWork.follow.m3B4 = 0;
}
if (local_4bc < local_498) {
@@ -3253,30 +3252,30 @@ bool dCamera_c::followCamera(s32 param_1) {
local_4bc.Val(local_49c);
}
m03C.V(m03C.U() + ((local_4bc - m03C.U()) * m3E0));
m03C.V(m03C.U() + ((local_4bc - m03C.U()) * mWork.follow.m3E0));
if (local_494 > m03C.U()) {
m03C.V(local_494);
}
m398 += dVar27 * (dVar25 - m398);
m39C += dVar27 * (dVar24 - m39C);
mWork.follow.m398 += dVar27 * (dVar25 - mWork.follow.m398);
mWork.follow.m39C += dVar27 * (dVar24 - mWork.follow.m39C);
if (m398 < local_484.R()) {
m3DC += (dVar26 - m3DC) * 0.01f;
local_484.R(m398);
if (mWork.follow.m398 < local_484.R()) {
mWork.follow.m3DC += (dVar26 - mWork.follow.m3DC) * 0.01f;
local_484.R(mWork.follow.m398);
}
else if (local_484.R() > m39C) {
m3DC += (dVar26 - m3DC) * 0.01f;
local_484.R(m39C);
else if (local_484.R() > mWork.follow.m39C) {
mWork.follow.m3DC += (dVar26 - mWork.follow.m3DC) * 0.01f;
local_484.R(mWork.follow.m39C);
}
else {
m3DC = 1.0f;
mWork.follow.m3DC = 1.0f;
}
m03C.R(m03C.R() + m3DC * (local_484.R() - m03C.R()));
m3CC = m044 + m03C.Xyz();
m03C.R(m03C.R() + mWork.follow.m3DC * (local_484.R() - m03C.R()));
mWork.follow.m3CC = m044 + m03C.Xyz();
if (bVar3 && bVar4 && mCamParam.Flag(param_1, dCamPrmFlg_UNK001)) {
cSGlobe cStack_48c(m03C);
@@ -3287,15 +3286,15 @@ bool dCamera_c::followCamera(s32 param_1) {
}
}
m050 += (m3CC - m050) * 0.75f;
m050 += (mWork.follow.m3CC - m050) * 0.75f;
m03C.Val(m050 - m044);
if (chkFlag(8)) {
m3DA = 1;
mWork.follow.m3DA = 1;
}
m3E8 += (dVar32 - m3E8) * 0.01f;
m060 += m3E8 * (dVar31 - m060);
mWork.follow.m3E8 += (dVar32 - mWork.follow.m3E8) * 0.01f;
m060 += mWork.follow.m3E8 * (dVar31 - m060);
if (check_owner_action1(mPadId, daPyStts1_DEKU_LEAF_FAN_e)) {
m060 += cM_rndFX(mCamSetup.m078);
@@ -3349,22 +3348,19 @@ bool dCamera_c::lockonCamera(s32 param_1) {
m100 = 1;
m101 = 1;
m102 = 1;
m378 = 'LOCK';
m380 = 0;
m384 = 1.0f;
m38C = 0;
m588 = 0;
m390 = m044.x;
m394 = m044.y;
m398 = m044.z;
mWork.lockon.m378 = 'LOCK';
mWork.lockon.m380 = 0;
mWork.lockon.m384 = 1.0f;
mWork.lockon.m38C = 0;
mWork.lockon.m39C = 0;
mWork.lockon.m390 = m044;
cXyz cStack_150 = m044 - attentionPos(mpPlayerActor);
//m3A8.Val()
//cSGlobe::Val((cSGlobe *)&this->field304_0x3a8,&cStack_150);
m3A0 = m39C = 0.0f;
m3B8 = mCamSetup.Cushion4Base();
m388 = 0;
m3A0 = 0;
m3A4 = 0;
mWork.lockon.m3A8.Val(cStack_150);
mWork.lockon.m3A0 = mWork.lockon.m39C = 0.0f;
mWork.lockon.m3B8 = mCamSetup.Cushion4Base();
mWork.lockon.m388 = 0;
mWork.lockon.m3A0 = 0;
mWork.lockon.m3A4 = 0;
if (mpLockonTarget) {
radiusActorInSight(mpPlayerActor, mpLockonTarget);
@@ -3375,20 +3371,20 @@ bool dCamera_c::lockonCamera(s32 param_1) {
dComIfG_Bgsp()->MoveBgMatrixCrrPos(mBG.m5C.m04, true, &m36C, NULL, NULL);
}
if (dComIfGp_getAttention().LockonTruth() && check_owner_action(mPadId, daPyStts0_BOOMERANG_WAIT_e)) {
m38C = 1;
mWork.lockon.m38C = 1;
}
else {
m38C = 0;
mWork.lockon.m38C = 0;
}
if (check_owner_action(mPadId, daPyStts0_UNK400_e)) {
m38C = 0;
mWork.lockon.m38C = 0;
}
else {
if (m38C) {
if (mWork.lockon.m38C) {
dComIfGp_getVibration().StartShock(2, 0x10, cXyz(0.0f, 1.0f, 0.0f));
}
m38C = 1;
mWork.lockon.m38C = 1;
}
bool bVar6 = true;
@@ -3449,12 +3445,12 @@ bool dCamera_c::lockonCamera(s32 param_1) {
cSAngle local_25c = m03C.U().Inv() - acStack_254;
if (local_25c < cSAngle::_0) {
m38C = 0;
mWork.lockon.m38C = 0;
acStack_254 -= local_258;
local_25c = -acStack_254;
}
else {
m38C = 1;
mWork.lockon.m38C = 1;
acStack_254 += local_258;
}
@@ -3463,24 +3459,24 @@ bool dCamera_c::lockonCamera(s32 param_1) {
if (chkFlag(0x80080)) {
cXyz local_114 = attentionPos(mpPlayerActor);
if (pointInSight(&local_114)) {
if (m388 == 0) {
int iVar10 = -m38C + 1;
m390 = iVar10 - (-m38C + (iVar10 == 0));
if (mWork.lockon.m388 == 0) {
int iVar10 = -mWork.lockon.m38C + 1;
mWork.lockon.m388 = iVar10 - (-mWork.lockon.m38C + (iVar10 == 0));
}
bVar6 = true;
m388 = 0x3c;
mWork.lockon.m388 = 0x3c;
}
}
if (lineBGCheckBack(&m044, &local_108, 0x7f) && lineBGCheck(&m050, &m044, 0x7f)) {
bVar6 = true;
m388 = 0x3c;
mWork.lockon.m388 = 0x3c;
}
if (m388) {
m388--;
if (m388 && mStickMainValueLast <= 0.1f) {
m388 = 1;
if (mWork.lockon.m388) {
mWork.lockon.m388--;
if (mWork.lockon.m388 && mStickMainValueLast <= 0.1f) {
mWork.lockon.m388 = 1;
}
bVar6 = true;
}
@@ -3490,7 +3486,7 @@ bool dCamera_c::lockonCamera(s32 param_1) {
if (chkFlag(0x10)) {
fVar3 = 0.01f;
m3B8 = 0.01f;
mWork.lockon.m3B8 = 0.01f;
}
else if (m360) {
fVar3 = mCamSetup.Cushion4Base();
@@ -3499,9 +3495,9 @@ bool dCamera_c::lockonCamera(s32 param_1) {
fVar3 = mCamSetup.Cushion4Jump();
}
m3B8 += (fVar3 - m3B8.Val()) * mCamSetup.CusCus();
m390 = local_108.x;
m398 = local_108.z;
mWork.lockon.m3B8 += (fVar3 - mWork.lockon.m3B8) * mCamSetup.CusCus();
mWork.lockon.m390.x = local_108.x;
mWork.lockon.m390.z = local_108.z;
if (bVar6) {
dVar17 = mCamParam.LockonCenterHeight(fVar4);
@@ -3510,13 +3506,13 @@ bool dCamera_c::lockonCamera(s32 param_1) {
dVar17 = mCamParam.LockonCenterHeight(fVar4) + 25.0f;
}
m398 += m3B8 * ((local_108.y + dVar17) - m398);
mWork.lockon.m390.z += mWork.lockon.m3B8 * ((local_108.y + dVar17) - mWork.lockon.m390.z);
dVar17 = local_230.R();
f32 dVar19;
if (mpLockonTarget) {
f32 dVar18 = local_25c.Cos();
dVar19 = (local_230.U() * 1.3f).Cos();
dVar19 = cSAngle(local_230.U() * 1.3f).Cos();
if (std::fabsf(dVar18) < std::fabsf(dVar19)) {
dVar19 = dVar18;
}
@@ -3527,22 +3523,22 @@ bool dCamera_c::lockonCamera(s32 param_1) {
}
cSAngle acStack_260 = local_230.U();
m3E8 += (fVar21 - m3E8) * mCamSetup.CusCus();
m3E0 += (fVar2 - m3E0) * mCamSetup.CusCus();
cSAngle temp(m3E0 + 2);
cSAngle acStack_264 = temp + (acStack_260 - temp) * m3E8;
mWork.lockon.m3B4 += (fVar21 - mWork.lockon.m3B4) * mCamSetup.CusCus();
mWork.lockon.m3B0 += (fVar2 - mWork.lockon.m3B0) * mCamSetup.CusCus();
cSAngle temp(mWork.lockon.m3B0 + 2);
cSAngle acStack_264 = temp + (acStack_260 - temp) * mWork.lockon.m3B4;
cSAngle acStack_268;
if (bVar6) {
fVar2 = m3A8 * 0.75f;
fVar2 = mWork.lockon.m3A8.R() * 0.75f;
acStack_268.Val(m534 + (local_230.U() - m534) * 0.05f);
}
else {
fVar2 = m3A8 + m3E4 * (m384 * (dVar19 + dVar17 * 0.05f) - m3A8);
acStack_268.Val(m534 + m3E8 * (local_230.U() - m534));
fVar2 = mWork.lockon.m3A8.R() + mWork.lockon.m3B0 * (mWork.lockon.m384 * (dVar19 + dVar17 * 0.05f) - mWork.lockon.m3A8.R());
acStack_268.Val(m534 + mWork.lockon.m3B4 * (local_230.U() - m534));
}
//m3A8.Val(fVar2, acStack_268, acStack_264);
//m044 = m390 + m3A8.Xyz();
mWork.lockon.m3A8.Val(fVar2, acStack_268, acStack_264);
m044 = mWork.lockon.m390 + mWork.lockon.m3A8.Xyz();
if (mpLockonTarget && mLockOnActorId != -1) {
cXyz local_120 = attentionPos(mpPlayerActor);
if (lineBGCheck(&local_120, &m044, 0x7f)) {
@@ -3586,9 +3582,10 @@ bool dCamera_c::lockonCamera(s32 param_1) {
}
else {
iVar15 = local_258.Val();
f32 f1 = (float)local_274.Val() / (float)iVar15;
if (local_25c.Val() < iVar15) {
fVar22 = mCamParam.Val(param_1, dCamStyleParam_UNK15);
fVar21 = dCamMath::customRBRatio(-((float)local_274.Val() / (float)iVar15), fVar21);
fVar21 = dCamMath::customRBRatio(-f1, fVar21);
dVar17 = fVar22 * fVar21;
}
else {
@@ -3599,7 +3596,7 @@ bool dCamera_c::lockonCamera(s32 param_1) {
local_27c = cSAngle::_180 - local_258;
}
dVar17 = mCamParam.Val(param_1, dCamStyleParam_UNK20) * dCamMath::rationalBezierRatio((float)local_274.Val() / (float)local_27c.Val(), fVar21);
dVar17 = mCamParam.Val(param_1, dCamStyleParam_UNK20) * dCamMath::rationalBezierRatio(f1, fVar21);
if (dVar20 < 100.0f) {
dVar17 *= dCamMath::rationalBezierRatio(dVar20 / 100.0f, 1.0f);
@@ -3612,12 +3609,12 @@ bool dCamera_c::lockonCamera(s32 param_1) {
}
if (check_owner_action1(mPadId, daPyStts1_UNK20000_e)) {
iVar15 = m380;
iVar15 = mWork.lockon.m380;
if (iVar15 <= iVar16) {
f32 bezier_ratio = dCamMath::rationalBezierRatio((float)iVar15 / (float)iVar16, fVar1);
local_270 += (local_250 - local_270) * bezier_ratio;
setFlag(0x4000000);
m380++;
mWork.lockon.m380++;
}
else {
local_270 = local_250;
@@ -3628,12 +3625,12 @@ bool dCamera_c::lockonCamera(s32 param_1) {
local_270 -= (local_230.U() * 0.7f + local_270) * 0.1f;
}
else {
m380 = 0;
mWork.lockon.m380 = 0;
if (chkFlag(0x10)) {
local_270 += (mCamParam.LockonLatitude(fVar4) - local_270) * 0.05f;
}
else if (!m360 && !check_owner_action(mPadId, daPyStts0_UNK400_e)) {
//dVar17 = m3A8.V().Cos();
//dVar17 = mWork.lockon.m3A8.V().Cos();
local_270 += (local_240.U() - local_270) * (1.0f - std::fabsf(fVar5)) * std::fabsf(dVar17);
}
else {
@@ -3762,7 +3759,7 @@ bool dCamera_c::CalcSubjectAngle(s16* param_1, s16* param_2) {
return false;
}
if (m378 != 'SUBJ') {
if (mWork.subject.m378 != 'SUBJ') {
return false;
}
@@ -3770,19 +3767,19 @@ bool dCamera_c::CalcSubjectAngle(s16* param_1, s16* param_2) {
return false;
}
if (!m37C) {
if (!mWork.subject.m37C) {
bVar9 = false;
}
fVar1 = mCamParam.Val(m380, 19);
fVar2 = mCamParam.Val(m380, 24);
fVar3 = mCamParam.Val(m380, 21);
fVar1 = mCamParam.Val(mWork.subject.m380, 19);
fVar2 = mCamParam.Val(mWork.subject.m380, 24);
fVar3 = mCamParam.Val(mWork.subject.m380, 21);
fVar4 = mCamSetup.m030;
if (!bVar9) {
cSAngle local_88(fVar2 * m384);
cSAngle local_8c(fVar1 * m388);
s16 local_98 = local_88.Val() + m3BA;
cSAngle local_88(fVar2 * mWork.subject.m384);
cSAngle local_8c(fVar1 * mWork.subject.m388);
s16 local_98 = local_88.Val() + mWork.subject.m3BA;
*param_2 = local_98;
*param_1 = local_8c.Val();
}
@@ -3791,13 +3788,13 @@ bool dCamera_c::CalcSubjectAngle(s16* param_1, s16* param_2) {
fVar5 = g_mDoCPd_cpadInfo[mPadId].mMainStickPosY;
if (is_player(mpPlayerActor)) {
m3B8 = ((daPy_py_c*)mpPlayerActor)->getBodyAngleX();
mWork.subject.m3B8 = ((daPy_py_c*)mpPlayerActor)->getBodyAngleX();
}
else {
m3B8 = mpPlayerActor->shape_angle.x;
mWork.subject.m3B8 = mpPlayerActor->shape_angle.x;
}
m3BA = mpPlayerActor->shape_angle.y;
mWork.subject.m3BA = mpPlayerActor->shape_angle.y;
f32 f1;
if (fVar6 > 0.7f) {
@@ -3823,7 +3820,7 @@ bool dCamera_c::CalcSubjectAngle(s16* param_1, s16* param_2) {
fVar5 = f3;
f32 f2 = 5.0f;
if ((mEye.y <= m354 + f2 || mEye.y <= mBG.m5C.m58 + f2) && ((m388 >= 0.0f && f3 > 0.0f) || (m388 < 0.0f && f3 <= 0.0f))) {
if ((mEye.y <= m354 + f2 || mEye.y <= mBG.m5C.m58 + f2) && ((mWork.subject.m388 >= 0.0f && f3 > 0.0f) || (mWork.subject.m388 < 0.0f && f3 <= 0.0f))) {
fVar5 = 0.0f;
}
@@ -3832,53 +3829,53 @@ bool dCamera_c::CalcSubjectAngle(s16* param_1, s16* param_2) {
}
if (!check_owner_action(mPadId, daPyStts0_UNK40000_e)) {
if (mCamParam.Flag(m380, dCamPrmFlg_UNK020)) {
m384 = -f1;
m388 = fVar5;
if (mCamParam.Flag(mWork.subject.m380, dCamPrmFlg_UNK020)) {
mWork.subject.m384 = -f1;
mWork.subject.m388 = fVar5;
}
else {
dVar11 = dCamMath::rationalBezierRatio(f1, mCamSetup.CurveWeight());
dVar12 = dCamMath::rationalBezierRatio(fVar5, mCamSetup.CurveWeight());
if (check_owner_action(mPadId, daPyStts0_UNK2000_e)) {
m384 = -dVar11 * fVar3;
m388 += dVar12 * fVar3;
mWork.subject.m384 = -dVar11 * fVar3;
mWork.subject.m388 += dVar12 * fVar3;
}
else {
if (mCamParam.Flag(m380, dCamPrmFlg_UNK010)) {
f32 temp = fVar3 - (m38C * (fVar3 * fVar4));
m384 = -dVar11 * temp;
m388 += dVar12 * temp;
if (mCamParam.Flag(mWork.subject.m380, dCamPrmFlg_UNK010)) {
f32 temp = fVar3 - (mWork.subject.m38C * (fVar3 * fVar4));
mWork.subject.m384 = -dVar11 * temp;
mWork.subject.m388 += dVar12 * temp;
}
else {
m384 = -dVar11 * fVar3;
m388 += dVar12 * fVar3;
mWork.subject.m384 = -dVar11 * fVar3;
mWork.subject.m388 += dVar12 * fVar3;
}
}
if (m384 > 1.0f) {
m384 = 1.0f;
if (mWork.subject.m384 > 1.0f) {
mWork.subject.m384 = 1.0f;
}
if (m384 < -1.0f) {
m384 = -1.0f;
if (mWork.subject.m384 < -1.0f) {
mWork.subject.m384 = -1.0f;
}
if (m388 > 1.0f) {
m388 = 1.0f;
if (mWork.subject.m388 > 1.0f) {
mWork.subject.m388 = 1.0f;
}
if (m388 < -1.0f) {
m388 = -1.0f;
if (mWork.subject.m388 < -1.0f) {
mWork.subject.m388 = -1.0f;
}
}
}
else {
m384 = 0.0f;
mWork.subject.m384 = 0.0f;
}
cSAngle local_90(fVar2 * m384);
cSAngle local_94(fVar1 * m388);
cSAngle local_90(fVar2 * mWork.subject.m384);
cSAngle local_94(fVar1 * mWork.subject.m388);
s16 local_a8 = local_90.Val() + m3BA;
s16 local_a8 = local_90.Val() + mWork.subject.m3BA;
*param_2 = local_a8;
*param_1 = local_94.Val();
m37D = 0;
mWork.subject.m37D = 0;
return bVar9;
}
+22 -22
View File
@@ -548,30 +548,30 @@ s32 fopAcM_checkCullingBox(Mtx pMtx, f32 x0, f32 y0, f32 z0, f32 x1, f32 y1, f32
static l_HIO l_hio;
static fopAc_cullSizeBox l_cullSizeBox[14] = {
/* fopAc_CULLBOX_0_e */ fopAc_MakeCullSizeBox(cXyz(-40.0f, 0.0f, -40.0f), cXyz(40.0f, 125.0f, 40.0f)),
/* fopAc_CULLBOX_1_e */ fopAc_MakeCullSizeBox(cXyz(-25.0f, 0.0f, -25.0f), cXyz(25.0f, 50.0f, 25.0f)),
/* fopAc_CULLBOX_2_e */ fopAc_MakeCullSizeBox(cXyz(-50.0f, 0.0f, -50.0f), cXyz(50.0f, 100.0f, 50.0f)),
/* fopAc_CULLBOX_3_e */ fopAc_MakeCullSizeBox(cXyz(-75.0f, 0.0f, -75.0f), cXyz(75.0f, 150.0f, 75.0f)),
/* fopAc_CULLBOX_4_e */ fopAc_MakeCullSizeBox(cXyz(-100.0f, 0.0f, -100.0f), cXyz(100.0f, 800.0f, 100.0f)),
/* fopAc_CULLBOX_5_e */ fopAc_MakeCullSizeBox(cXyz(-125.0f, 0.0f, -125.0f), cXyz(125.0f, 250.0f, 125.0f)),
/* fopAc_CULLBOX_6_e */ fopAc_MakeCullSizeBox(cXyz(-150.0f, 0.0f, -150.0f), cXyz(150.0f, 300.0f, 150.0f)),
/* fopAc_CULLBOX_7_e */ fopAc_MakeCullSizeBox(cXyz(-200.0f, 0.0f, -200.0f), cXyz(200.0f, 400.0f, 200.0f)),
/* fopAc_CULLBOX_8_e */ fopAc_MakeCullSizeBox(cXyz(-600.0f, 0.0f, -600.0f), cXyz(600.0f, 900.0f, 600.0f)),
/* fopAc_CULLBOX_9_e */ fopAc_MakeCullSizeBox(cXyz(-250.0f, 0.0f, -50.0f), cXyz(250.0f, 450.0f, 50.0f)),
/* fopAc_CULLBOX_10_e */ fopAc_MakeCullSizeBox(cXyz(-60.0f, 0.0f, -20.0f), cXyz(40.0f, 130.0f, 150.0f)),
/* fopAc_CULLBOX_11_e */ fopAc_MakeCullSizeBox(cXyz(-75.0f, 0.0f, -75.0f), cXyz(75.0f, 210.0f, 75.0f)),
/* fopAc_CULLBOX_12_e */ fopAc_MakeCullSizeBox(cXyz(-70.0f, -100.0f, -80.0f), cXyz(70.0f, 240.0f, 100.0f)),
/* fopAc_CULLBOX_13_e */ fopAc_MakeCullSizeBox(cXyz(-60.0f, -20.0f, -60.0f), cXyz(60.0f, 160.0f, 60.0f)),
/* fopAc_CULLBOX_0_e */ fopAc_cullSizeBox(cXyz(-40.0f, 0.0f, -40.0f), cXyz(40.0f, 125.0f, 40.0f)),
/* fopAc_CULLBOX_1_e */ fopAc_cullSizeBox(cXyz(-25.0f, 0.0f, -25.0f), cXyz(25.0f, 50.0f, 25.0f)),
/* fopAc_CULLBOX_2_e */ fopAc_cullSizeBox(cXyz(-50.0f, 0.0f, -50.0f), cXyz(50.0f, 100.0f, 50.0f)),
/* fopAc_CULLBOX_3_e */ fopAc_cullSizeBox(cXyz(-75.0f, 0.0f, -75.0f), cXyz(75.0f, 150.0f, 75.0f)),
/* fopAc_CULLBOX_4_e */ fopAc_cullSizeBox(cXyz(-100.0f, 0.0f, -100.0f), cXyz(100.0f, 800.0f, 100.0f)),
/* fopAc_CULLBOX_5_e */ fopAc_cullSizeBox(cXyz(-125.0f, 0.0f, -125.0f), cXyz(125.0f, 250.0f, 125.0f)),
/* fopAc_CULLBOX_6_e */ fopAc_cullSizeBox(cXyz(-150.0f, 0.0f, -150.0f), cXyz(150.0f, 300.0f, 150.0f)),
/* fopAc_CULLBOX_7_e */ fopAc_cullSizeBox(cXyz(-200.0f, 0.0f, -200.0f), cXyz(200.0f, 400.0f, 200.0f)),
/* fopAc_CULLBOX_8_e */ fopAc_cullSizeBox(cXyz(-600.0f, 0.0f, -600.0f), cXyz(600.0f, 900.0f, 600.0f)),
/* fopAc_CULLBOX_9_e */ fopAc_cullSizeBox(cXyz(-250.0f, 0.0f, -50.0f), cXyz(250.0f, 450.0f, 50.0f)),
/* fopAc_CULLBOX_10_e */ fopAc_cullSizeBox(cXyz(-60.0f, 0.0f, -20.0f), cXyz(40.0f, 130.0f, 150.0f)),
/* fopAc_CULLBOX_11_e */ fopAc_cullSizeBox(cXyz(-75.0f, 0.0f, -75.0f), cXyz(75.0f, 210.0f, 75.0f)),
/* fopAc_CULLBOX_12_e */ fopAc_cullSizeBox(cXyz(-70.0f, -100.0f, -80.0f), cXyz(70.0f, 240.0f, 100.0f)),
/* fopAc_CULLBOX_13_e */ fopAc_cullSizeBox(cXyz(-60.0f, -20.0f, -60.0f), cXyz(60.0f, 160.0f, 60.0f)),
};
static fopAc_cullSizeSphere l_cullSizeSphere[8] = {
/* fopAc_CULLSPHERE_0_e */ fopAc_MakeCullSizeSphere(cXyz(0.0f, 0.0f, 0.0f), 80.0f),
/* fopAc_CULLSPHERE_1_e */ fopAc_MakeCullSizeSphere(cXyz(0.0f, 0.0f, 0.0f), 50.0f),
/* fopAc_CULLSPHERE_2_e */ fopAc_MakeCullSizeSphere(cXyz(0.0f, 0.0f, 0.0f), 100.0f),
/* fopAc_CULLSPHERE_3_e */ fopAc_MakeCullSizeSphere(cXyz(0.0f, 0.0f, 0.0f), 150.0f),
/* fopAc_CULLSPHERE_4_e */ fopAc_MakeCullSizeSphere(cXyz(0.0f, 0.0f, 0.0f), 200.0f),
/* fopAc_CULLSPHERE_5_e */ fopAc_MakeCullSizeSphere(cXyz(0.0f, 0.0f, 0.0f), 250.0f),
/* fopAc_CULLSPHERE_6_e */ fopAc_MakeCullSizeSphere(cXyz(0.0f, 0.0f, 0.0f), 300.0f),
/* fopAc_CULLSPHERE_7_e */ fopAc_MakeCullSizeSphere(cXyz(0.0f, 0.0f, 0.0f), 400.0f),
/* fopAc_CULLSPHERE_0_e */ fopAc_cullSizeSphere(cXyz(0.0f, 0.0f, 0.0f), 80.0f),
/* fopAc_CULLSPHERE_1_e */ fopAc_cullSizeSphere(cXyz(0.0f, 0.0f, 0.0f), 50.0f),
/* fopAc_CULLSPHERE_2_e */ fopAc_cullSizeSphere(cXyz(0.0f, 0.0f, 0.0f), 100.0f),
/* fopAc_CULLSPHERE_3_e */ fopAc_cullSizeSphere(cXyz(0.0f, 0.0f, 0.0f), 150.0f),
/* fopAc_CULLSPHERE_4_e */ fopAc_cullSizeSphere(cXyz(0.0f, 0.0f, 0.0f), 200.0f),
/* fopAc_CULLSPHERE_5_e */ fopAc_cullSizeSphere(cXyz(0.0f, 0.0f, 0.0f), 250.0f),
/* fopAc_CULLSPHERE_6_e */ fopAc_cullSizeSphere(cXyz(0.0f, 0.0f, 0.0f), 300.0f),
/* fopAc_CULLSPHERE_7_e */ fopAc_cullSizeSphere(cXyz(0.0f, 0.0f, 0.0f), 400.0f),
};
static void dummy() {