Citro3d
Loading...
Searching...
No Matches
mtxstack.c
Go to the documentation of this file.
1#include <c3d/mtxstack.h>
2#include <c3d/uniforms.h>
3
4void MtxStack_Init(C3D_MtxStack* stk)
5{
6 stk->pos = 0;
7 stk->unifPos = 0xFF;
8 stk->isDirty = true;
9 Mtx_Identity(&stk->m[0]);
10}
11
12void MtxStack_Bind(C3D_MtxStack* stk, GPU_SHADER_TYPE unifType, int unifPos, int unifLen)
13{
14 stk->unifType = unifType;
15 stk->unifPos = unifPos;
16 stk->unifLen = unifLen;
17 stk->isDirty = true;
18}
19
20C3D_Mtx* MtxStack_Push(C3D_MtxStack* stk)
21{
22 if (stk->pos == (C3D_MTXSTACK_SIZE-1)) return NULL;
23 stk->pos ++;
24 Mtx_Copy(&stk->m[stk->pos], &stk->m[stk->pos-1]);
25 return MtxStack_Cur(stk);
26}
27
28C3D_Mtx* MtxStack_Pop(C3D_MtxStack* stk)
29{
30 if (stk->pos == 0) return NULL;
31 stk->pos --;
32 return MtxStack_Cur(stk);
33}
34
35void MtxStack_Update(C3D_MtxStack* stk)
36{
37 if (!stk->isDirty) return;
38
39 if (stk->unifPos != 0xFF)
40 C3D_FVUnifMtxNx4(stk->unifType, stk->unifPos, &stk->m[stk->pos], stk->unifLen);
41
42 stk->isDirty = false;
43}
void MtxStack_Update(C3D_MtxStack *stk)
Definition: mtxstack.c:35
C3D_Mtx * MtxStack_Push(C3D_MtxStack *stk)
Definition: mtxstack.c:20
void MtxStack_Init(C3D_MtxStack *stk)
Definition: mtxstack.c:4
void MtxStack_Bind(C3D_MtxStack *stk, GPU_SHADER_TYPE unifType, int unifPos, int unifLen)
Definition: mtxstack.c:12
C3D_Mtx * MtxStack_Pop(C3D_MtxStack *stk)
Definition: mtxstack.c:28