diff options
Diffstat (limited to 'src/revolution/homebuttonLib/nw4hbm/math/math_triangular.cpp')
| -rw-r--r-- | src/revolution/homebuttonLib/nw4hbm/math/math_triangular.cpp | 433 |
1 files changed, 433 insertions, 0 deletions
diff --git a/src/revolution/homebuttonLib/nw4hbm/math/math_triangular.cpp b/src/revolution/homebuttonLib/nw4hbm/math/math_triangular.cpp new file mode 100644 index 0000000000..b3655c49ca --- /dev/null +++ b/src/revolution/homebuttonLib/nw4hbm/math/math_triangular.cpp @@ -0,0 +1,433 @@ +#include "arithmetic.h" +#include <revolution/types.h> + +typedef struct { + /* 0x00 */ f32 sin_val; + /* 0x04 */ f32 cos_val; + /* 0x08 */ f32 sin_delta; + /* 0x0C */ f32 cos_delta; +} SinCosSample; // size = 0x10 + +typedef struct { + /* 0x00 */ f32 atan_val; + /* 0x04 */ f32 atan_delta; +} ArcTanSample; // size = 0x08 + +namespace nw4hbm { + namespace math { + namespace { + f32 AtanFIdx_(f32 x); + + static SinCosSample sSinCosTbl[] = { + {0.0f, 1.0f, 0.024541f, -3.01e-4f}, + {0.024541f, 0.999699f, 0.024526f, -9.03e-4f}, + {0.049068f, 0.998795f, 0.024497f, -0.001505f}, + {0.073565f, 0.99729f, 0.024453f, -0.002106f}, + {0.098017f, 0.995185f, 0.024394f, -0.002705f}, + {0.122411f, 0.99248f, 0.02432f, -0.003303f}, + {0.14673f, 0.989177f, 0.024231f, -0.003899f}, + {0.170962f, 0.985278f, 0.024128f, -0.004492f}, + {0.19509f, 0.980785f, 0.024011f, -0.005083f}, + {0.219101f, 0.975702f, 0.023879f, -0.005671f}, + {0.24298f, 0.970031f, 0.023733f, -0.006255f}, + {0.266713f, 0.963776f, 0.023572f, -0.006836f}, + {0.290285f, 0.95694f, 0.023397f, -0.007412f}, + {0.313682f, 0.949528f, 0.023208f, -0.007984f}, + {0.33689f, 0.941544f, 0.023005f, -0.008551f}, + {0.359895f, 0.932993f, 0.022788f, -0.009113f}, + {0.382683f, 0.92388f, 0.022558f, -0.00967f}, + {0.405241f, 0.91421f, 0.022314f, -0.01022f}, + {0.427555f, 0.903989f, 0.022056f, -0.010765f}, + {0.449611f, 0.893224f, 0.021785f, -0.011303f}, + {0.471397f, 0.881921f, 0.021501f, -0.011834f}, + {0.492898f, 0.870087f, 0.021205f, -0.012358f}, + {0.514103f, 0.857729f, 0.020895f, -0.012875f}, + {0.534998f, 0.844854f, 0.020573f, -0.013384f}, + {0.55557f, 0.83147f, 0.020238f, -0.013885f}, + {0.575808f, 0.817585f, 0.019891f, -0.014377f}, + {0.595699f, 0.803208f, 0.019532f, -0.014861f}, + {0.615232f, 0.788346f, 0.019162f, -0.015336f}, + {0.634393f, 0.77301f, 0.01878f, -0.015802f}, + {0.653173f, 0.757209f, 0.018386f, -0.016258f}, + {0.671559f, 0.740951f, 0.017982f, -0.016704f}, + {0.689541f, 0.724247f, 0.017566f, -0.01714f}, + {0.707107f, 0.707107f, 0.01714f, -0.017566f}, + {0.724247f, 0.689541f, 0.016704f, -0.017982f}, + {0.740951f, 0.671559f, 0.016258f, -0.018386f}, + {0.757209f, 0.653173f, 0.015802f, -0.01878f}, + {0.77301f, 0.634393f, 0.015336f, -0.019162f}, + {0.788346f, 0.615232f, 0.014861f, -0.019532f}, + {0.803208f, 0.595699f, 0.014377f, -0.019891f}, + {0.817585f, 0.575808f, 0.013885f, -0.020238f}, + {0.83147f, 0.55557f, 0.013384f, -0.020573f}, + {0.844854f, 0.534998f, 0.012875f, -0.020895f}, + {0.857729f, 0.514103f, 0.012358f, -0.021205f}, + {0.870087f, 0.492898f, 0.011834f, -0.021501f}, + {0.881921f, 0.471397f, 0.011303f, -0.021785f}, + {0.893224f, 0.449611f, 0.010765f, -0.022056f}, + {0.903989f, 0.427555f, 0.01022f, -0.022314f}, + {0.91421f, 0.405241f, 0.00967f, -0.022558f}, + {0.92388f, 0.382683f, 0.009113f, -0.022788f}, + {0.932993f, 0.359895f, 0.008551f, -0.023005f}, + {0.941544f, 0.33689f, 0.007984f, -0.023208f}, + {0.949528f, 0.313682f, 0.007412f, -0.023397f}, + {0.95694f, 0.290285f, 0.006836f, -0.023572f}, + {0.963776f, 0.266713f, 0.006255f, -0.023733f}, + {0.970031f, 0.24298f, 0.005671f, -0.023879f}, + {0.975702f, 0.219101f, 0.005083f, -0.024011f}, + {0.980785f, 0.19509f, 0.004492f, -0.024128f}, + {0.985278f, 0.170962f, 0.003899f, -0.024231f}, + {0.989177f, 0.14673f, 0.003303f, -0.02432f}, + {0.99248f, 0.122411f, 0.002705f, -0.024394f}, + {0.995185f, 0.098017f, 0.002106f, -0.024453f}, + {0.99729f, 0.073565f, 0.001505f, -0.024497f}, + {0.998795f, 0.049068f, 9.03e-4f, -0.024526f}, + {0.999699f, 0.024541f, 3.01e-4f, -0.024541f}, + {1.0f, 0.0f, -3.01e-4f, -0.024541f}, + {0.999699f, -0.024541f, -9.03e-4f, -0.024526f}, + {0.998795f, -0.049068f, -0.001505f, -0.024497f}, + {0.99729f, -0.073565f, -0.002106f, -0.024453f}, + {0.995185f, -0.098017f, -0.002705f, -0.024394f}, + {0.99248f, -0.122411f, -0.003303f, -0.02432f}, + {0.989177f, -0.14673f, -0.003899f, -0.024231f}, + {0.985278f, -0.170962f, -0.004492f, -0.024128f}, + {0.980785f, -0.19509f, -0.005083f, -0.024011f}, + {0.975702f, -0.219101f, -0.005671f, -0.023879f}, + {0.970031f, -0.24298f, -0.006255f, -0.023733f}, + {0.963776f, -0.266713f, -0.006836f, -0.023572f}, + {0.95694f, -0.290285f, -0.007412f, -0.023397f}, + {0.949528f, -0.313682f, -0.007984f, -0.023208f}, + {0.941544f, -0.33689f, -0.008551f, -0.023005f}, + {0.932993f, -0.359895f, -0.009113f, -0.022788f}, + {0.92388f, -0.382683f, -0.00967f, -0.022558f}, + {0.91421f, -0.405241f, -0.01022f, -0.022314f}, + {0.903989f, -0.427555f, -0.010765f, -0.022056f}, + {0.893224f, -0.449611f, -0.011303f, -0.021785f}, + {0.881921f, -0.471397f, -0.011834f, -0.021501f}, + {0.870087f, -0.492898f, -0.012358f, -0.021205f}, + {0.857729f, -0.514103f, -0.012875f, -0.020895f}, + {0.844854f, -0.534998f, -0.013384f, -0.020573f}, + {0.83147f, -0.55557f, -0.013885f, -0.020238f}, + {0.817585f, -0.575808f, -0.014377f, -0.019891f}, + {0.803208f, -0.595699f, -0.014861f, -0.019532f}, + {0.788346f, -0.615232f, -0.015336f, -0.019162f}, + {0.77301f, -0.634393f, -0.015802f, -0.01878f}, + {0.757209f, -0.653173f, -0.016258f, -0.018386f}, + {0.740951f, -0.671559f, -0.016704f, -0.017982f}, + {0.724247f, -0.689541f, -0.01714f, -0.017566f}, + {0.707107f, -0.707107f, -0.017566f, -0.01714f}, + {0.689541f, -0.724247f, -0.017982f, -0.016704f}, + {0.671559f, -0.740951f, -0.018386f, -0.016258f}, + {0.653173f, -0.757209f, -0.01878f, -0.015802f}, + {0.634393f, -0.77301f, -0.019162f, -0.015336f}, + {0.615232f, -0.788346f, -0.019532f, -0.014861f}, + {0.595699f, -0.803208f, -0.019891f, -0.014377f}, + {0.575808f, -0.817585f, -0.020238f, -0.013885f}, + {0.55557f, -0.83147f, -0.020573f, -0.013384f}, + {0.534998f, -0.844854f, -0.020895f, -0.012875f}, + {0.514103f, -0.857729f, -0.021205f, -0.012358f}, + {0.492898f, -0.870087f, -0.021501f, -0.011834f}, + {0.471397f, -0.881921f, -0.021785f, -0.011303f}, + {0.449611f, -0.893224f, -0.022056f, -0.010765f}, + {0.427555f, -0.903989f, -0.022314f, -0.01022f}, + {0.405241f, -0.91421f, -0.022558f, -0.00967f}, + {0.382683f, -0.92388f, -0.022788f, -0.009113f}, + {0.359895f, -0.932993f, -0.023005f, -0.008551f}, + {0.33689f, -0.941544f, -0.023208f, -0.007984f}, + {0.313682f, -0.949528f, -0.023397f, -0.007412f}, + {0.290285f, -0.95694f, -0.023572f, -0.006836f}, + {0.266713f, -0.963776f, -0.023733f, -0.006255f}, + {0.24298f, -0.970031f, -0.023879f, -0.005671f}, + {0.219101f, -0.975702f, -0.024011f, -0.005083f}, + {0.19509f, -0.980785f, -0.024128f, -0.004492f}, + {0.170962f, -0.985278f, -0.024231f, -0.003899f}, + {0.14673f, -0.989177f, -0.02432f, -0.003303f}, + {0.122411f, -0.99248f, -0.024394f, -0.002705f}, + {0.098017f, -0.995185f, -0.024453f, -0.002106f}, + {0.073565f, -0.99729f, -0.024497f, -0.001505f}, + {0.049068f, -0.998795f, -0.024526f, -9.03e-4f}, + {0.024541f, -0.999699f, -0.024541f, -3.01e-4f}, + {0.0f, -1.0f, -0.024541f, 3.01e-4f}, + {-0.024541f, -0.999699f, -0.024526f, 9.03e-4f}, + {-0.049068f, -0.998795f, -0.024497f, 0.001505f}, + {-0.073565f, -0.99729f, -0.024453f, 0.002106f}, + {-0.098017f, -0.995185f, -0.024394f, 0.002705f}, + {-0.122411f, -0.99248f, -0.02432f, 0.003303f}, + {-0.14673f, -0.989177f, -0.024231f, 0.003899f}, + {-0.170962f, -0.985278f, -0.024128f, 0.004492f}, + {-0.19509f, -0.980785f, -0.024011f, 0.005083f}, + {-0.219101f, -0.975702f, -0.023879f, 0.005671f}, + {-0.24298f, -0.970031f, -0.023733f, 0.006255f}, + {-0.266713f, -0.963776f, -0.023572f, 0.006836f}, + {-0.290285f, -0.95694f, -0.023397f, 0.007412f}, + {-0.313682f, -0.949528f, -0.023208f, 0.007984f}, + {-0.33689f, -0.941544f, -0.023005f, 0.008551f}, + {-0.359895f, -0.932993f, -0.022788f, 0.009113f}, + {-0.382683f, -0.92388f, -0.022558f, 0.00967f}, + {-0.405241f, -0.91421f, -0.022314f, 0.01022f}, + {-0.427555f, -0.903989f, -0.022056f, 0.010765f}, + {-0.449611f, -0.893224f, -0.021785f, 0.011303f}, + {-0.471397f, -0.881921f, -0.021501f, 0.011834f}, + {-0.492898f, -0.870087f, -0.021205f, 0.012358f}, + {-0.514103f, -0.857729f, -0.020895f, 0.012875f}, + {-0.534998f, -0.844854f, -0.020573f, 0.013384f}, + {-0.55557f, -0.83147f, -0.020238f, 0.013885f}, + {-0.575808f, -0.817585f, -0.019891f, 0.014377f}, + {-0.595699f, -0.803208f, -0.019532f, 0.014861f}, + {-0.615232f, -0.788346f, -0.019162f, 0.015336f}, + {-0.634393f, -0.77301f, -0.01878f, 0.015802f}, + {-0.653173f, -0.757209f, -0.018386f, 0.016258f}, + {-0.671559f, -0.740951f, -0.017982f, 0.016704f}, + {-0.689541f, -0.724247f, -0.017566f, 0.01714f}, + {-0.707107f, -0.707107f, -0.01714f, 0.017566f}, + {-0.724247f, -0.689541f, -0.016704f, 0.017982f}, + {-0.740951f, -0.671559f, -0.016258f, 0.018386f}, + {-0.757209f, -0.653173f, -0.015802f, 0.01878f}, + {-0.77301f, -0.634393f, -0.015336f, 0.019162f}, + {-0.788346f, -0.615232f, -0.014861f, 0.019532f}, + {-0.803208f, -0.595699f, -0.014377f, 0.019891f}, + {-0.817585f, -0.575808f, -0.013885f, 0.020238f}, + {-0.83147f, -0.55557f, -0.013384f, 0.020573f}, + {-0.844854f, -0.534998f, -0.012875f, 0.020895f}, + {-0.857729f, -0.514103f, -0.012358f, 0.021205f}, + {-0.870087f, -0.492898f, -0.011834f, 0.021501f}, + {-0.881921f, -0.471397f, -0.011303f, 0.021785f}, + {-0.893224f, -0.449611f, -0.010765f, 0.022056f}, + {-0.903989f, -0.427555f, -0.01022f, 0.022314f}, + {-0.91421f, -0.405241f, -0.00967f, 0.022558f}, + {-0.92388f, -0.382683f, -0.009113f, 0.022788f}, + {-0.932993f, -0.359895f, -0.008551f, 0.023005f}, + {-0.941544f, -0.33689f, -0.007984f, 0.023208f}, + {-0.949528f, -0.313682f, -0.007412f, 0.023397f}, + {-0.95694f, -0.290285f, -0.006836f, 0.023572f}, + {-0.963776f, -0.266713f, -0.006255f, 0.023733f}, + {-0.970031f, -0.24298f, -0.005671f, 0.023879f}, + {-0.975702f, -0.219101f, -0.005083f, 0.024011f}, + {-0.980785f, -0.19509f, -0.004492f, 0.024128f}, + {-0.985278f, -0.170962f, -0.003899f, 0.024231f}, + {-0.989177f, -0.14673f, -0.003303f, 0.02432f}, + {-0.99248f, -0.122411f, -0.002705f, 0.024394f}, + {-0.995185f, -0.098017f, -0.002106f, 0.024453f}, + {-0.99729f, -0.073565f, -0.001505f, 0.024497f}, + {-0.998795f, -0.049068f, -9.03e-4f, 0.024526f}, + {-0.999699f, -0.024541f, -3.01e-4f, 0.024541f}, + {-1.0f, -0.0f, 3.01e-4f, 0.024541f}, + {-0.999699f, 0.024541f, 9.03e-4f, 0.024526f}, + {-0.998795f, 0.049068f, 0.001505f, 0.024497f}, + {-0.99729f, 0.073565f, 0.002106f, 0.024453f}, + {-0.995185f, 0.098017f, 0.002705f, 0.024394f}, + {-0.99248f, 0.122411f, 0.003303f, 0.02432f}, + {-0.989177f, 0.14673f, 0.003899f, 0.024231f}, + {-0.985278f, 0.170962f, 0.004492f, 0.024128f}, + {-0.980785f, 0.19509f, 0.005083f, 0.024011f}, + {-0.975702f, 0.219101f, 0.005671f, 0.023879f}, + {-0.970031f, 0.24298f, 0.006255f, 0.023733f}, + {-0.963776f, 0.266713f, 0.006836f, 0.023572f}, + {-0.95694f, 0.290285f, 0.007412f, 0.023397f}, + {-0.949528f, 0.313682f, 0.007984f, 0.023208f}, + {-0.941544f, 0.33689f, 0.008551f, 0.023005f}, + {-0.932993f, 0.359895f, 0.009113f, 0.022788f}, + {-0.92388f, 0.382683f, 0.00967f, 0.022558f}, + {-0.91421f, 0.405241f, 0.01022f, 0.022314f}, + {-0.903989f, 0.427555f, 0.010765f, 0.022056f}, + {-0.893224f, 0.449611f, 0.011303f, 0.021785f}, + {-0.881921f, 0.471397f, 0.011834f, 0.021501f}, + {-0.870087f, 0.492898f, 0.012358f, 0.021205f}, + {-0.857729f, 0.514103f, 0.012875f, 0.020895f}, + {-0.844854f, 0.534998f, 0.013384f, 0.020573f}, + {-0.83147f, 0.55557f, 0.013885f, 0.020238f}, + {-0.817585f, 0.575808f, 0.014377f, 0.019891f}, + {-0.803208f, 0.595699f, 0.014861f, 0.019532f}, + {-0.788346f, 0.615232f, 0.015336f, 0.019162f}, + {-0.77301f, 0.634393f, 0.015802f, 0.01878f}, + {-0.757209f, 0.653173f, 0.016258f, 0.018386f}, + {-0.740951f, 0.671559f, 0.016704f, 0.017982f}, + {-0.724247f, 0.689541f, 0.01714f, 0.017566f}, + {-0.707107f, 0.707107f, 0.017566f, 0.01714f}, + {-0.689541f, 0.724247f, 0.017982f, 0.016704f}, + {-0.671559f, 0.740951f, 0.018386f, 0.016258f}, + {-0.653173f, 0.757209f, 0.01878f, 0.015802f}, + {-0.634393f, 0.77301f, 0.019162f, 0.015336f}, + {-0.615232f, 0.788346f, 0.019532f, 0.014861f}, + {-0.595699f, 0.803208f, 0.019891f, 0.014377f}, + {-0.575808f, 0.817585f, 0.020238f, 0.013885f}, + {-0.55557f, 0.83147f, 0.020573f, 0.013384f}, + {-0.534998f, 0.844854f, 0.020895f, 0.012875f}, + {-0.514103f, 0.857729f, 0.021205f, 0.012358f}, + {-0.492898f, 0.870087f, 0.021501f, 0.011834f}, + {-0.471397f, 0.881921f, 0.021785f, 0.011303f}, + {-0.449611f, 0.893224f, 0.022056f, 0.010765f}, + {-0.427555f, 0.903989f, 0.022314f, 0.01022f}, + {-0.405241f, 0.91421f, 0.022558f, 0.00967f}, + {-0.382683f, 0.92388f, 0.022788f, 0.009113f}, + {-0.359895f, 0.932993f, 0.023005f, 0.008551f}, + {-0.33689f, 0.941544f, 0.023208f, 0.007984f}, + {-0.313682f, 0.949528f, 0.023397f, 0.007412f}, + {-0.290285f, 0.95694f, 0.023572f, 0.006836f}, + {-0.266713f, 0.963776f, 0.023733f, 0.006255f}, + {-0.24298f, 0.970031f, 0.023879f, 0.005671f}, + {-0.219101f, 0.975702f, 0.024011f, 0.005083f}, + {-0.19509f, 0.980785f, 0.024128f, 0.004492f}, + {-0.170962f, 0.985278f, 0.024231f, 0.003899f}, + {-0.14673f, 0.989177f, 0.02432f, 0.003303f}, + {-0.122411f, 0.99248f, 0.024394f, 0.002705f}, + {-0.098017f, 0.995185f, 0.024453f, 0.002106f}, + {-0.073565f, 0.99729f, 0.024497f, 0.001505f}, + {-0.049068f, 0.998795f, 0.024526f, 9.03e-4f}, + {-0.024541f, 0.999699f, 0.024541f, 3.01e-4f}, + {-0.0f, 1.0f, 0.024541f, -3.01e-4f}, + }; + + static ArcTanSample sArcTanTbl[] = { + {0.0f, 1.2728254f}, {1.2728254f, 1.2703458f}, {2.5431712f, 1.2654155f}, + {3.8085866f, 1.2580916f}, {5.0666785f, 1.2484571f}, {6.3151355f, 1.2366195f}, + {7.551755f, 1.2227072f}, {8.774462f, 1.2068666f}, {9.981329f, 1.1892582f}, + {11.170587f, 1.1700529f}, {12.34064f, 1.149428f}, {13.4900675f, 1.1275644f}, + {14.617632f, 1.1046423f}, {15.722275f, 1.0808387f}, {16.803114f, 1.0563251f}, + {17.859438f, 1.0312649f}, {18.890703f, 1.005812f}, {19.896515f, 0.98010963f}, + {20.876625f, 0.9542891f}, {21.830914f, 0.9284698f}, {22.759384f, 0.90275896f}, + {23.662142f, 0.87725157f}, {24.539394f, 0.8520309f}, {25.391424f, 0.8271689f}, + {26.218594f, 0.802727f}, {27.02132f, 0.77875656f}, {27.800077f, 0.7553001f}, + {28.555378f, 0.7323915f}, {29.28777f, 0.7100574f}, {29.997826f, 0.6883175f}, + {30.686144f, 0.66718566f}, {31.353329f, 0.6466705f}, {32.0f, 0.62677616f}, + }; + + } // namespace + + namespace { + + f32 AtanFIdx_(f32 x) { + u16 idx; + f32 val; + f32 r; + + x *= 32.0f; + + idx = F32ToU16(x); + r = x - U16ToF32(idx); + val = sArcTanTbl[idx].atan_val + r * sArcTanTbl[idx].atan_delta; + + return val; + } + + } // unnamed namespace + + f32 SinFIdx(f32 fidx) { + f32 abs_fidx = FAbs(fidx); // hm + f32 val; + u16 idx; + f32 r; + + while (abs_fidx >= 65536.0f) { + abs_fidx -= 65536.0f; + } + + idx = F32ToU16(abs_fidx); + r = abs_fidx - U16ToF32(idx); + + idx &= 0xff; + val = sSinCosTbl[idx].sin_val + r * sSinCosTbl[idx].sin_delta; + + return fidx < 0.0f ? -val : val; + } + + f32 CosFIdx(f32 fidx) { + u16 idx; + f32 r; + + fidx = FAbs(fidx); + while (fidx >= 65536.0f) { + fidx -= 65536.0f; + } + + idx = F32ToU16(fidx); + r = fidx - U16ToF32(idx); + + idx &= 0xff; + + return sSinCosTbl[idx].cos_val + r * sSinCosTbl[idx].cos_delta; + } + + extern void __deadstrip1(); + extern void __deadstrip1() { + (void)32.0f; + (void)64.0f; + } + + f32 Atan2FIdx(f32 y, f32 x) { + f32 a; + f32 b; + f32 c; + bool minus; + + if (x == 0.0f && y == 0.0f) { + return 0.0f; + } + + if (x >= 0.0f) { + if (y >= 0.0f) { + if (x >= y) { + a = x; + b = y; + c = 0.0f; + + minus = false; + } else { + a = y; + b = x; + c = 64.0f; + + minus = true; + } + } else { + if (x >= -y) { + a = x; + b = -y; + c = 0.0f; + + minus = true; + } else { + a = -y; + b = x; + c = -64.0f; + + minus = false; + } + } + } else { + if (y >= 0.0f) { + if (-x >= y) { + a = -x; + b = y; + c = 128.0f; + + minus = true; + } else { + a = y; + b = -x; + c = 64.0f; + + minus = false; + } + } else { + if (-x >= -y) { + a = -x; + b = -y; + c = -128.0f; + + minus = false; + } else { + a = -y; + b = -x; + c = -64.0f; + + minus = true; + } + } + } + + return minus ? c - AtanFIdx_(b / a) : c + AtanFIdx_(b / a); + } + + } // namespace math +} // namespace nw4hbm |
