citro3d/source/mtxstack.c

44 lines
894 B
C
Raw Normal View History

2014-12-20 21:34:19 +01:00
#include <c3d/mtxstack.h>
#include <c3d/uniforms.h>
void MtxStack_Init(C3D_MtxStack* stk)
{
stk->pos = 0;
stk->unifPos = 0xFF;
stk->isDirty = true;
Mtx_Identity(&stk->m[0]);
}
2015-03-05 23:05:14 +01:00
void MtxStack_Bind(C3D_MtxStack* stk, GPU_SHADER_TYPE unifType, int unifPos, int unifLen)
2014-12-20 21:34:19 +01:00
{
2015-03-05 23:05:14 +01:00
stk->unifType = unifType;
2014-12-20 21:34:19 +01:00
stk->unifPos = unifPos;
stk->unifLen = unifLen;
stk->isDirty = true;
}
C3D_Mtx* MtxStack_Push(C3D_MtxStack* stk)
2014-12-20 21:34:19 +01:00
{
if (stk->pos == (C3D_MTXSTACK_SIZE-1)) return NULL;
2014-12-20 21:34:19 +01:00
stk->pos ++;
Mtx_Copy(&stk->m[stk->pos], &stk->m[stk->pos-1]);
return MtxStack_Cur(stk);
2014-12-20 21:34:19 +01:00
}
C3D_Mtx* MtxStack_Pop(C3D_MtxStack* stk)
2014-12-20 21:34:19 +01:00
{
if (stk->pos == 0) return NULL;
2014-12-20 21:34:19 +01:00
stk->pos --;
return MtxStack_Cur(stk);
2014-12-20 21:34:19 +01:00
}
void MtxStack_Update(C3D_MtxStack* stk)
{
if (!stk->isDirty) return;
if (stk->unifPos != 0xFF)
C3D_FVUnifMtxNx4(stk->unifType, stk->unifPos, &stk->m[stk->pos], stk->unifLen);
2014-12-20 21:34:19 +01:00
stk->isDirty = false;
}