blob: cf083e938b3fafd79418b90aeee1451afe3ca775 (
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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
|
#include "ctorStruct.h"
#include "code_801DD5C8.h"
static ctorStruct gUnk8063F348(1, 4, 0);
// gUnkClass7 implementation
extern "C" {
void func_801DD5C8(gUnkClass7* p1, float p2)
{
if (!p1->unk0 || !(p1->unk6 & 0x1) || (p1->unk6 & 0x8))
return;
p1->unkC += p2 * p1->unk8;
if (p1->unkC < 0.0f) {
p1->unk6 |= 0x4;
switch (p1->unk4) {
case 1:
while (p1->unkC < 0.0f)
p1->unkC += p1->unk0->unk8;
break;
case 2:
p1->unkC = -p1->unkC;
float f2 = p1->unk0->unk8;
if ((float)p1->unkC > f2) {
float f4 = p1->unkC / f2;
s32 r5 = (s32)f4;
f4 -= r5; // get fractional part
if (((r5 & 0x1) ^ ((u32)r5 >> 31 & 0x1)) - ((u32)r5 >> 31 & 0x1) != 0) {
p1->unkC = f2 * (1.0f - f4);
} else {
p1->unkC = f2 * f4;
p1->unk8 = -p1->unk8;
}
} else {
p1->unk8 = -p1->unk8;
}
break;
default:
p1->unk6 |= 0x8;
p1->unkC = 0.0f;
break;
}
} else if (p1->unkC > p1->unk0->unk8) {
p1->unk6 |= 0x4;
switch (p1->unk4) {
case 1:
while (p1->unkC > p1->unk0->unk8)
p1->unkC -= p1->unk0->unk8;
break;
case 2:
float f2 = p1->unk0->unk8;
float f4 = p1->unkC / f2;
s32 r5 = (s32)f4;
f4 -= r5;
if (((r5 & 0x1) ^ ((u32)r5 >> 31 & 0x1)) - ((u32)r5 >> 31 & 0x1) != 0) {
float temp = f2 * (1.0f - f4);
p1->unk8 = -p1->unk8;
p1->unkC = temp;
} else {
p1->unkC = f2 * f4;
}
break;
default:
p1->unk6 |= 0x8;
p1->unkC = p1->unk0->unk8;
break;
}
}
p1->unk6 |= 0x2;
}
// TODO: is p2 a GScamera* ?
void func_801DD7FC(gUnkClass7* p1, void* p2, u32 p3)
{
if (!p1->unk0 || !(p1->unk6 & 0x2))
return;
gUnkClass9* ptr = p1->unk0->unk4;
s32 count = p1->unk0->unk2;
for (s32 i = 0; i < count; i++, ptr++)
if (ptr->unkC)
ptr->unkC(p2, ptr, p3, p1->unkC);
p1->unk6 &= ~0x2;
}
} //extern "C"
|