1#include "Game/Util/MathUtil.hpp"
2#include "JSystem/JGeometry/TUtil.hpp"
3#include "JSystem/JMath/JMath.hpp"
4#include "JSystem/JMath/JMATrigonometric.hpp"
6#include "math_types.hpp"
11 f32 getRandom(f32 min, f32 max) {
12 return (min + ((max - min) * getRandom()));
17 f32 getRandomDegree() {
18 return minDegree + (maxDegree * getRandom());
21 void calcRandomVec(TVec3f *pOut, f32 a2, f32 a3) {
22 f32 v10 = (a2 + ((a3 - a2) * getRandom()));
23 f32 v11 = (a2 + ((a3 - a2) * getRandom()));
24 f32 v12 = getRandom();
27 pOut->set<f32>((a2 + (dist * v12)), v11, v10);
30 u8 isHalfProbability() {
31 return MR::getRandom() < 0.5f;
34 f32 getSignHalfProbability() {
35 if (isHalfProbability()) {
42 void getRandomVector(TVec3f *pOut, f32 a2) {
43 f32 z = (-a2 + ((a2 - -a2) * getRandom()));
44 f32 y = (-a2 + ((a2 - -a2) * getRandom()));
45 pOut->set((-a2 + ((a2 - -a2) * getRandom())), y, z);
50 void addRandomVector(TVec3f *pOut,
const TVec3f &rOtherVec, f32 a3) {
52 f32 x = -a3 + ((a3 - -a3) * getRandom());
53 f32 y = -a3 + ((a3 - -a3) * getRandom());
54 f32 z = -a3 + ((a3 - -a3) * getRandom());
61 TVec3f otherVec(rOtherVec);
62 otherVec.add(randVec);
67 void turnRandomVector(TVec3f *pOut,
const TVec3f &rOtherVec, f32 a3) {
68 f32 mag = PSVECMag((Vec*)(&rOtherVec));
69 addRandomVector(pOut, rOtherVec, a3);
71 if (isNearZero(*pOut, 0.001f)) {
80 f32 getInterpolateValue(f32 a1, f32 a2, f32 a3) {
81 return (a2 + (a1 * (a3 - a2)));
84 f32 getLinerValue(f32 a1, f32 a2, f32 a3, f32 a4) {
85 return (a2 + (a1 / a4) * (a3 - a2));
88 f32 getLinerValueFromMinMax(f32 a1, f32 a2, f32 a3, f32 a4, f32 a5) {
89 f32 val = (JGeometry::TUtil<f32>::clamp(a1, a2, a3) - a2) / (a3 - a2);
90 return a4 + ((a5 - a4) * val);
95 f32 getEaseInValue(f32 a1, f32 a2, f32 a3, f32 a4) {
96 f32 val = (1.0f - JMACosRadian((((a1 / a4) * PI) * 0.5f)));
97 return a2 + ((a3 - a2) * val);
103 f32 getEaseOutValue(f32 a1, f32 a2, f32 a3, f32 a4) {
104 f32 val = (JMASinRadian((((a1 / a4) * PI) * 0.5f)) * (a3 - a2));
114 void makeAxisFrontUp(TVec3f *a1, TVec3f *a2,
const TVec3f &a3,
const TVec3f &a4) {
115 PSVECCrossProduct((Vec*)&a4, (Vec*)&a3, (Vec*)a1);
116 PSVECNormalize((Vec*)a1, (Vec*)a1);
117 PSVECCrossProduct((Vec*)&a3, (Vec*)a1, (Vec*)a2);
131 void clampLength(TVec3f *a1,
const TVec3f &a2, f32 a3) {
132 if (a2.squared() > (a3 * a3)) {
133 f32 sqr = a2.squared();
135 if (sqr <= 0.0000038146973f) {
139 f32 inv_sqr = JGeometry::TUtil<f32>::inv_sqrt(sqr);
140 a1->scale((inv_sqr * a3), a2);
151 bool isInRange(f32 a1, f32 a2, f32 a3) {
176 f32 calcDistanceXY(
const TVec3f &a1,
const TVec3f &a2) {
177 f32 x_diff = a1.x - a2.x;
178 f32 y_diff = a1.y - a2.y;
179 return JGeometry::TUtil<f32>::sqrt((x_diff * x_diff) + (y_diff * y_diff));
182 bool isNearZero(f32 a1, f32 a2) {
194 bool isNearZero(
const TVec3f &rVec, f32 a2) {
215 return !(rVec.z < -a2);
219 f32 diffAngleAbs(f32 a1, f32 a2) {
220 f32 normalize = normalizeAngleAbs(a1 - a2);
222 if (normalize > PI) {
223 normalize = (TWO_PI - normalize);
229 f32 normalizeAngleAbs(f32 angle) {
235 if (!(angle > TWO_PI)) {
245 bool isAngleBetween(f32 a1, f32 a2, f32 a3) {
246 f32 a1_n = normalizeAngleAbs(a1);
247 f32 a2_n = normalizeAngleAbs(a2);
248 f32 a3_n = normalizeAngleAbs(a3);
258 if (a1_n >= a3_n && a1_n <= a2_n) {
262 if ((a2_n - a3_n) > PI) {
271 f32 blendAngle(f32 a1, f32 a2, f32 a3) {
272 f32 a1_n = normalizeAngleAbs(a1);
273 f32 a2_n = normalizeAngleAbs(a2);
275 if (!isAngleBetween(0.5f * (a1_n + a2_n), a1_n, a2_n)) {
284 return normalizeAngleAbs((((1.0f - a3) * a1_n) + (a3 * a2_n)));
288 u8 lerp(u8 a1, u8 a2, f32 a3) {
289 return JGeometry::TUtil<f32>::clamp(a1 + (a3 * (a2 - a1)), 0.0f, 255.0f);
303 f32 vecKillElement(
const TVec3f &a1,
const TVec3f &a2, TVec3f *a3) {
304 if (isNearZero(a2, 0.001f)) {
309 return PSVECKillElement((
const Vec*)&a1, (
const Vec*)&a2, (
const Vec*)a3);
312 void vecScaleAdd(
const register TVec3f *a1,
const register TVec3f *a2,
register f32 a3) {
314 psq_l f0, 0(a1), 0, 0
315 psq_l f3, 0(a2), 0, 0
316 psq_l f2, 8(a1), 1, 0
317 psq_l f4, 8(a2), 1, 0
318 ps_madds0 f0, f3, a3, f0
319 ps_madds0 f2, f4, a3, f2
320 psq_st f0, 0(a1), 0, 0
321 psq_st f2, 8(a1), 1, 0
325 void PSvecBlend(
const register TVec3f *a1,
const register TVec3f *a2,
register TVec3f *a3,
register f32 a4,
register f32 a5) {
327 psq_l f0, 0(a1), 0, 0
328 psq_l f3, 8(a1), 1, 0
330 psq_l f0, 0(a2), 0, 0
332 psq_l f1, 8(a2), 1, 0
333 ps_madds0 f4, f0, f2, f4
334 ps_madds0 f3, f1, f2, f3
335 psq_st f4, 0(a3), 0, 0
336 psq_st f3, 8(a3), 1, 0
340 void vecBlend(
const TVec3f &a1,
const TVec3f &a2, TVec3f *a3, f32 a4) {
341 PSvecBlend(&a1, &a2, a3, 1.0f - a4, a4);
348 void blendColor(_GXColor *a1,
const _GXColor &a2,
const _GXColor &a3, f32 a4) {
349 a1->r = getInterpolateValue(a4, a2.r, a3.r);
350 a1->g = getInterpolateValue(a4, a2.g, a3.g);
351 a1->b = getInterpolateValue(a4, a2.b, a3.b);
352 a1->a = getInterpolateValue(a4, a2.a, a3.a);
355 void blendVec(Vec *a1,
const Vec &a2,
const Vec &a3, f32 a4) {
356 a1->x = getInterpolateValue(a4, a2.x, a3.x);
357 a1->y = getInterpolateValue(a4, a2.y, a3.y);
358 a1->z = getInterpolateValue(a4, a2.z, a3.z);
363 int getMinAbsElementIndex(
const TVec3f &rVec) {
364 f64 abs_x = __fabs(rVec.x);
365 f64 abs_y = __fabs(rVec.y);
366 f64 abs_z = __fabs(rVec.z);
368 if (abs_x < abs_y && abs_x < abs_z) {
379 f32 getMaxElement(
const TVec3f &rVec) {
380 f32* vec_arr = (f32*)(&rVec);
381 return vec_arr[getMaxElementIndex(rVec)];
384 f32 getMaxAbsElement(
const TVec3f &rVec) {
385 f32* vec_arr = (f32*)(&rVec);
386 return vec_arr[getMaxAbsElementIndex(rVec)];
389 int getMaxElementIndex(
const TVec3f &rVec) {
390 if (rVec.x > rVec.y && rVec.x > rVec.z) {
394 if (rVec.y > rVec.z) {
401 int getMaxAbsElementIndex(
const TVec3f &rVec) {
402 f64 abs_x = __fabs(rVec.x);
403 f64 abs_y = __fabs(rVec.y);
404 f64 abs_z = __fabs(rVec.z);
406 if (abs_x > abs_y && abs_x > abs_z) {