citro3d/source/mtxstack.c

46 lines
921 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;
}
void MtxStack_Push(C3D_MtxStack* stk)
{
if (stk->pos == (C3D_MTXSTACK_SIZE-1)) return;
stk->pos ++;
Mtx_Copy(&stk->m[stk->pos], &stk->m[stk->pos-1]);
}
void MtxStack_Pop(C3D_MtxStack* stk)
{
if (stk->pos == 0) return;
stk->pos --;
stk->isDirty = true;
}
void MtxStack_Update(C3D_MtxStack* stk)
{
if (!stk->isDirty) return;
if (stk->unifPos != 0xFF)
{
2015-03-05 23:05:14 +01:00
C3D_FVec* out = C3D_FVUnifWritePtr(stk->unifType, stk->unifPos, stk->unifLen);
2014-12-20 21:34:19 +01:00
memcpy(out, &stk->m[stk->pos], (u32)stk->unifLen * sizeof(C3D_FVec));
}
stk->isDirty = false;
}