summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorlepelog <25211966+lepelog@users.noreply.github.com>2021-11-09 21:09:33 +0100
committerlepelog <25211966+lepelog@users.noreply.github.com>2021-11-13 13:14:38 +0100
commit58715df2cbe3555f4de0d3bcc6a8a8ede1239fc8 (patch)
tree582f2efddfbc93392ea0d4bcd1f1bd5e5fc49211
parent891b4f14b1c380bf5fd9948da348b3c6082b8244 (diff)
cLib_addCalcPos
-rw-r--r--include/SSystem/SComponent/c_lib.h5
-rw-r--r--include/SSystem/SComponent/c_xyz.h5
-rw-r--r--libs/SSystem/SComponent/c_lib.cpp27
3 files changed, 37 insertions, 0 deletions
diff --git a/include/SSystem/SComponent/c_lib.h b/include/SSystem/SComponent/c_lib.h
index 8ff0092bc1..cdbfb6356e 100644
--- a/include/SSystem/SComponent/c_lib.h
+++ b/include/SSystem/SComponent/c_lib.h
@@ -4,6 +4,11 @@
#include "SSystem/SComponent/c_xyz.h"
#include "dolphin/mtx/mtx.h"
#include "dolphin/types.h"
+#include "msl_c/math.h"
+
+inline bool cLib_IsZero(f32 f) {
+ return fabsf(f) < 8e-11;
+}
void cLib_memCpy(void* dst, const void* src, unsigned long size);
void cLib_memSet(void* ptr, int value, unsigned long size);
diff --git a/include/SSystem/SComponent/c_xyz.h b/include/SSystem/SComponent/c_xyz.h
index 0f28e22048..5cef049e7f 100644
--- a/include/SSystem/SComponent/c_xyz.h
+++ b/include/SSystem/SComponent/c_xyz.h
@@ -3,6 +3,7 @@
#include "dolphin/mtx/vec.h"
#include "global.h"
+#include "msl_c/math.h"
struct cXyz : Vec {
static const cXyz Zero;
@@ -50,11 +51,13 @@ struct cXyz : Vec {
y -= f;
z -= f;
}
+ void operator-=(const Vec& other) { PSVECSubtract(this, &other, this); }
void operator+=(const Vec& vec) {
x += vec.x;
y += vec.y;
z += vec.z;
}
+ void operator*=(f32 scale) { PSVECScale(this, this, scale); }
/* 80266C6C */ cXyz getCrossProduct(Vec const&) const;
/* 80266CBC */ cXyz outprod(Vec const&) const;
/* 80266CE4 */ cXyz norm() const;
@@ -116,6 +119,8 @@ struct cXyz : Vec {
cXyz tmp2(other.x, 0, other.z);
return tmp.abs2(tmp2);
}
+ f32 abs() const { return sqrtf(this->abs2()); }
+ f32 abs(const Vec& other) const { return sqrtf(this->abs2(other)); }
f32 getMagXZ() const { return cXyz(this->x, 0, this->z).getSquareMag(); }
};
diff --git a/libs/SSystem/SComponent/c_lib.cpp b/libs/SSystem/SComponent/c_lib.cpp
index 4f47d34749..516c7d7151 100644
--- a/libs/SSystem/SComponent/c_lib.cpp
+++ b/libs/SSystem/SComponent/c_lib.cpp
@@ -158,6 +158,32 @@ SECTION_SDATA2 static f32 lit_2382[1 + 1 /* padding */] = {
};
/* 8026FAB8-8026FDF4 26A3F8 033C+00 0/0 3/3 78/78 .text cLib_addCalcPos__FP4cXyzRC4cXyzfff */
+#ifdef NON_MATCHING
+// matches besides data
+f32 cLib_addCalcPos(cXyz* pValue, cXyz const& target, f32 scale, f32 param_3, f32 param_4) {
+ if (*pValue != target) {
+ cXyz diff = (*pValue - target);
+ f32 step = diff.abs();
+ if (step < param_4) {
+ *pValue = target;
+ } else {
+ step *= scale;
+ diff *= scale;
+ if (!cLib_IsZero(step)) {
+ if (step > param_3) {
+ diff *= (param_3 / step);
+ } else if (step < param_4) {
+ diff *= (param_4 / step);
+ }
+ *pValue -= diff;
+ } else {
+ *pValue = target;
+ }
+ }
+ }
+ return pValue->abs(target);
+}
+#else
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
@@ -166,6 +192,7 @@ asm f32 cLib_addCalcPos(cXyz* param_0, cXyz const& param_1, f32 param_2, f32 par
#include "asm/SSystem/SComponent/c_lib/cLib_addCalcPos__FP4cXyzRC4cXyzfff.s"
}
#pragma pop
+#endif
/* 8026FDF4-80270178 26A734 0384+00 0/0 1/1 4/4 .text cLib_addCalcPosXZ__FP4cXyzRC4cXyzfff */
#pragma push