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
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
|
#include <revolution.h>
#include <revolution/mtx.h>
#include "sdk_math.h"
void MTXInitStack(MTXStack* sPtr, u32 numMtx) {
ASSERTMSGLINE(74, sPtr, "MTXInitStack(): NULL MtxStackPtr 'sPtr' ");
ASSERTMSGLINE(75, sPtr->stackBase, "MTXInitStack(): 'sPtr' contains a NULL ptr to stack memory ");
ASSERTMSGLINE(76, numMtx, "MTXInitStack(): 'numMtx' is 0 ");
sPtr->numMtx = numMtx;
sPtr->stackPtr = 0;
}
MtxPtr MTXPush(MTXStack* sPtr, const Mtx m) {
ASSERTMSGLINE(104, sPtr, "MTXPush(): NULL MtxStackPtr 'sPtr' ");
ASSERTMSGLINE(105, sPtr->stackBase, "MTXPush(): 'sPtr' contains a NULL ptr to stack memory ");
ASSERTMSGLINE(106, m, "MTXPush(): NULL MtxPtr 'm' ");
if (sPtr->stackPtr == NULL) {
sPtr->stackPtr = sPtr->stackBase;
MTXCopy(m, sPtr->stackPtr);
} else {
ASSERTMSGLINE(121, ((((s32)sPtr->stackPtr - (s32)sPtr->stackBase) / 16) / 3) < (sPtr->numMtx - 1), "MTXPush(): stack overflow ");
MTXCopy(m, sPtr->stackPtr + 3);
sPtr->stackPtr += 3;
}
return sPtr->stackPtr;
}
MtxPtr MTXPushFwd(MTXStack* sPtr, const Mtx m) {
ASSERTMSGLINE(157, sPtr, "MTXPushFwd(): NULL MtxStackPtr 'sPtr' ");
ASSERTMSGLINE(158, sPtr->stackBase, "MTXPushFwd(): 'sPtr' contains a NULL ptr to stack memory ");
ASSERTMSGLINE(159, m, "MTXPushFwd(): NULL MtxPtr 'm' ");
if (sPtr->stackPtr == NULL) {
sPtr->stackPtr = sPtr->stackBase;
MTXCopy(m, sPtr->stackPtr);
} else {
ASSERTMSGLINE(174, ((((s32)sPtr->stackPtr - (s32)sPtr->stackBase) / 16) / 3) < (sPtr->numMtx - 1), "MTXPushFwd(): stack overflow");
MTXConcat(sPtr->stackPtr, m, sPtr->stackPtr + 3);
sPtr->stackPtr += 3;
}
return sPtr->stackPtr;
}
MtxPtr MTXPushInv(MTXStack* sPtr, const Mtx m) {
Mtx mInv;
ASSERTMSGLINE(216, sPtr, "MTXPushInv(): NULL MtxStackPtr 'sPtr' ");
ASSERTMSGLINE(217, sPtr->stackBase, "MTXPushInv(): 'sPtr' contains a NULL ptr to stack memory ");
ASSERTMSGLINE(218, m, "MTXPushInv(): NULL MtxPtr 'm' ");
MTXInverse(m, mInv);
if (sPtr->stackPtr == NULL) {
sPtr->stackPtr = sPtr->stackBase;
MTXCopy(mInv, sPtr->stackPtr);
} else {
ASSERTMSGLINE(236, ((((s32)sPtr->stackPtr - (s32)sPtr->stackBase) / 16) / 3) < (sPtr->numMtx - 1), "MTXPushInv(): stack overflow");
MTXConcat(mInv, sPtr->stackPtr, sPtr->stackPtr + 3);
sPtr->stackPtr += 3;
}
return sPtr->stackPtr;
}
MtxPtr MTXPushInvXpose(MTXStack* sPtr, const Mtx m) {
Mtx mIT;
ASSERTMSGLINE(279, sPtr, "MTXPushInvXpose(): NULL MtxStackPtr 'sPtr' ");
ASSERTMSGLINE(280, sPtr->stackBase, "MTXPushInvXpose(): 'sPtr' contains a NULL ptr to stack memory ");
ASSERTMSGLINE(281, m, "MTXPushInvXpose(): NULL MtxPtr 'm' ");
MTXInverse(m, mIT);
MTXTranspose(mIT, mIT);
if (sPtr->stackPtr == NULL) {
sPtr->stackPtr = sPtr->stackBase;
MTXCopy(mIT, sPtr->stackPtr);
} else {
ASSERTMSGLINE(300, ((((s32)sPtr->stackPtr - (s32)sPtr->stackBase) / 16) / 3) < (sPtr->numMtx - 1), "MTXPushInvXpose(): stack overflow ");
MTXConcat(sPtr->stackPtr, mIT, sPtr->stackPtr + 3);
sPtr->stackPtr += 3;
}
return sPtr->stackPtr;
}
MtxPtr MTXPop(MTXStack* sPtr) {
ASSERTMSGLINE(328, sPtr, "MTXPop(): NULL MtxStackPtr 'sPtr' ");
ASSERTMSGLINE(329, sPtr->stackBase, "MTXPop(): 'sPtr' contains a NULL ptr to stack memory ");
if (sPtr->stackPtr == NULL) {
return NULL;
}
if (sPtr->stackBase == sPtr->stackPtr) {
sPtr->stackPtr = NULL;
return NULL;
}
sPtr->stackPtr -= 3;
return sPtr->stackPtr;
}
MtxPtr MTXGetStackPtr(const MTXStack* sPtr) {
ASSERTMSGLINE(366, sPtr, "MTXGetStackPtr(): NULL MtxStackPtr 'sPtr' ");
ASSERTMSGLINE(367, sPtr->stackBase, "MTXGetStackPtr(): 'sPtr' contains a NULL ptr to stack memory ");
return sPtr->stackPtr;
}
|