summaryrefslogtreecommitdiff
path: root/soh/src/code/code_8006C510.c
blob: 833009e8145994c88d44316f1547cbb1d3d99ced (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#include "global.h"

f32 func_8006C510(f32 arg0, f32 arg1, f32 arg2, f32 arg3, f32 arg4, f32 arg5) {
    char pad[0x1C];
    f32 sq = SQ(arg0);
    f32 cube = sq * arg0;

    return (((cube + cube) - sq * 3.0f) + 1.0f) * arg2 + (sq * 3.0f - (cube + cube)) * arg3 +
           ((cube - (sq + sq)) + arg0) * arg4 * arg1 + (cube - sq) * arg5 * arg1;
}

f32 func_8006C5A8(f32 target, TransformData* transData, s32 refIdx) {
    s32 i;
    s32 j;

    if (target <= transData->unk_02) {
        return transData->unk_08;
    }
    if (target >= transData[refIdx - 1].unk_02) {
        return transData[refIdx - 1].unk_08;
    }

    for (i = 0;; i++) {
        j = i + 1;
        if (transData[j].unk_02 > target) {
            if (transData[i].unk_00 & 1) {
                return transData[i].unk_08;
            } else if (transData[i].unk_00 & 2) {
                return transData[i].unk_08 +
                       ((target - (f32)transData[i].unk_02) / ((f32)transData[j].unk_02 - (f32)transData[i].unk_02)) *
                           (transData[j].unk_08 - transData[i].unk_08);
            } else {
                f32 diff = (f32)transData[j].unk_02 - (f32)transData[i].unk_02;
                return func_8006C510((target - transData[i].unk_02) / ((f32)transData[j].unk_02 - transData[i].unk_02),
                                     diff * (1.0f / 30.0f), transData[i].unk_08, transData[j].unk_08,
                                     transData[i].unk_06, transData[j].unk_04);
            }
        }
    }
}