GFX3D: Rework how matrix stacks are initialized in an attempt to get MSVC to successfully build Win32.
- Access to the matrix stacks has been simplified to the point where MatrixStackInit() and MatrixStackGet() are now obsolete. These functions have been removed.
This commit is contained in:
parent
965419d7ca
commit
899ab48d78
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
Copyright (C) 2006 yopyop
|
Copyright (C) 2006 yopyop
|
||||||
Copyright (C) 2008-2021 DeSmuME team
|
Copyright (C) 2008-2022 DeSmuME team
|
||||||
|
|
||||||
This file is free software: you can redistribute it and/or modify
|
This file is free software: you can redistribute it and/or modify
|
||||||
it under the terms of the GNU General Public License as published by
|
it under the terms of the GNU General Public License as published by
|
||||||
|
@ -286,11 +286,12 @@ static float normalTable[1024];
|
||||||
static CACHE_ALIGN FragmentColor _gfx3d_savestateBuffer[GPU_FRAMEBUFFER_NATIVE_WIDTH * GPU_FRAMEBUFFER_NATIVE_HEIGHT];
|
static CACHE_ALIGN FragmentColor _gfx3d_savestateBuffer[GPU_FRAMEBUFFER_NATIVE_WIDTH * GPU_FRAMEBUFFER_NATIVE_HEIGHT];
|
||||||
|
|
||||||
// Matrix stack handling
|
// Matrix stack handling
|
||||||
//TODO: decouple stack pointers from matrix stack type
|
CACHE_ALIGN NDSMatrixStack1 mtxStackProjection;
|
||||||
CACHE_ALIGN MatrixStack<MATRIXMODE_PROJECTION> mtxStackProjection;
|
CACHE_ALIGN NDSMatrixStack32 mtxStackPosition;
|
||||||
CACHE_ALIGN MatrixStack<MATRIXMODE_POSITION> mtxStackPosition;
|
CACHE_ALIGN NDSMatrixStack32 mtxStackPositionVector;
|
||||||
CACHE_ALIGN MatrixStack<MATRIXMODE_POSITION_VECTOR> mtxStackPositionVector;
|
CACHE_ALIGN NDSMatrixStack1 mtxStackTexture;
|
||||||
CACHE_ALIGN MatrixStack<MATRIXMODE_TEXTURE> mtxStackTexture;
|
|
||||||
|
u32 mtxStackIndex[4];
|
||||||
|
|
||||||
static CACHE_ALIGN s32 mtxCurrent[4][16];
|
static CACHE_ALIGN s32 mtxCurrent[4][16];
|
||||||
static CACHE_ALIGN s32 mtxTemporal[16];
|
static CACHE_ALIGN s32 mtxTemporal[16];
|
||||||
|
@ -633,10 +634,15 @@ void gfx3d_reset()
|
||||||
MatrixInit(mtxCurrent[MATRIXMODE_TEXTURE]);
|
MatrixInit(mtxCurrent[MATRIXMODE_TEXTURE]);
|
||||||
MatrixInit(mtxTemporal);
|
MatrixInit(mtxTemporal);
|
||||||
|
|
||||||
MatrixStackInit(&mtxStackProjection);
|
mtxStackIndex[MATRIXMODE_PROJECTION] = 0;
|
||||||
MatrixStackInit(&mtxStackPosition);
|
mtxStackIndex[MATRIXMODE_POSITION] = 0;
|
||||||
MatrixStackInit(&mtxStackPositionVector);
|
mtxStackIndex[MATRIXMODE_POSITION_VECTOR] = 0;
|
||||||
MatrixStackInit(&mtxStackTexture);
|
mtxStackIndex[MATRIXMODE_TEXTURE] = 0;
|
||||||
|
|
||||||
|
MatrixInit(mtxStackProjection[0]);
|
||||||
|
for (size_t i = 0; i < NDSMATRIXSTACK_COUNT(MATRIXMODE_POSITION); i++) { MatrixInit(mtxStackPosition[i]); }
|
||||||
|
for (size_t i = 0; i < NDSMATRIXSTACK_COUNT(MATRIXMODE_POSITION_VECTOR); i++) { MatrixInit(mtxStackPositionVector[i]); }
|
||||||
|
MatrixInit(mtxStackTexture[0]);
|
||||||
|
|
||||||
clCmd = 0;
|
clCmd = 0;
|
||||||
clInd = 0;
|
clInd = 0;
|
||||||
|
@ -1028,9 +1034,9 @@ static void gfx3d_glPushMatrix()
|
||||||
{
|
{
|
||||||
if (mode == MATRIXMODE_PROJECTION)
|
if (mode == MATRIXMODE_PROJECTION)
|
||||||
{
|
{
|
||||||
MatrixCopy(mtxStackProjection.matrix[0], mtxCurrent[mode]);
|
MatrixCopy(mtxStackProjection[0], mtxCurrent[mode]);
|
||||||
|
|
||||||
u32 &index = mtxStackProjection.position;
|
u32 &index = mtxStackIndex[MATRIXMODE_PROJECTION];
|
||||||
if (index == 1) MMU_new.gxstat.se = 1;
|
if (index == 1) MMU_new.gxstat.se = 1;
|
||||||
index += 1;
|
index += 1;
|
||||||
index &= 1;
|
index &= 1;
|
||||||
|
@ -1039,9 +1045,9 @@ static void gfx3d_glPushMatrix()
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
MatrixCopy(mtxStackTexture.matrix[0], mtxCurrent[mode]);
|
MatrixCopy(mtxStackTexture[0], mtxCurrent[mode]);
|
||||||
|
|
||||||
u32 &index = mtxStackTexture.position;
|
u32 &index = mtxStackIndex[MATRIXMODE_TEXTURE];
|
||||||
if (index == 1) MMU_new.gxstat.se = 1; //unknown if this applies to the texture matrix
|
if (index == 1) MMU_new.gxstat.se = 1; //unknown if this applies to the texture matrix
|
||||||
index += 1;
|
index += 1;
|
||||||
index &= 1;
|
index &= 1;
|
||||||
|
@ -1049,10 +1055,10 @@ static void gfx3d_glPushMatrix()
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
u32 &index = mtxStackPosition.position;
|
u32 &index = mtxStackIndex[MATRIXMODE_POSITION];
|
||||||
|
|
||||||
MatrixCopy(mtxStackPosition.matrix[index & 31], mtxCurrent[MATRIXMODE_POSITION]);
|
MatrixCopy(mtxStackPosition[index & 31], mtxCurrent[MATRIXMODE_POSITION]);
|
||||||
MatrixCopy(mtxStackPositionVector.matrix[index & 31], mtxCurrent[MATRIXMODE_POSITION_VECTOR]);
|
MatrixCopy(mtxStackPositionVector[index & 31], mtxCurrent[MATRIXMODE_POSITION_VECTOR]);
|
||||||
|
|
||||||
index += 1;
|
index += 1;
|
||||||
index &= 63;
|
index &= 63;
|
||||||
|
@ -1079,31 +1085,31 @@ static void gfx3d_glPopMatrix(u32 v)
|
||||||
|
|
||||||
if (mode == MATRIXMODE_PROJECTION)
|
if (mode == MATRIXMODE_PROJECTION)
|
||||||
{
|
{
|
||||||
u32 &index = mtxStackProjection.position;
|
u32 &index = mtxStackIndex[MATRIXMODE_PROJECTION];
|
||||||
index ^= 1;
|
index ^= 1;
|
||||||
if (index == 1) MMU_new.gxstat.se = 1;
|
if (index == 1) MMU_new.gxstat.se = 1;
|
||||||
MatrixCopy(mtxCurrent[mode], mtxStackProjection.matrix[0]);
|
MatrixCopy(mtxCurrent[mode], mtxStackProjection[0]);
|
||||||
|
|
||||||
UpdateProjection();
|
UpdateProjection();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
u32 &index = mtxStackTexture.position;
|
u32 &index = mtxStackIndex[MATRIXMODE_TEXTURE];
|
||||||
index ^= 1;
|
index ^= 1;
|
||||||
if (index == 1) MMU_new.gxstat.se = 1; //unknown if this applies to the texture matrix
|
if (index == 1) MMU_new.gxstat.se = 1; //unknown if this applies to the texture matrix
|
||||||
MatrixCopy(mtxCurrent[mode], mtxStackTexture.matrix[0]);
|
MatrixCopy(mtxCurrent[mode], mtxStackTexture[0]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
u32 &index = mtxStackPosition.position;
|
u32 &index = mtxStackIndex[MATRIXMODE_POSITION];
|
||||||
|
|
||||||
index -= v & 63;
|
index -= v & 63;
|
||||||
index &= 63;
|
index &= 63;
|
||||||
if (index >= 32) MMU_new.gxstat.se = 1; //(not sure, this might be off by 1)
|
if (index >= 32) MMU_new.gxstat.se = 1; //(not sure, this might be off by 1)
|
||||||
|
|
||||||
MatrixCopy(mtxCurrent[MATRIXMODE_POSITION], mtxStackPosition.matrix[index & 31]);
|
MatrixCopy(mtxCurrent[MATRIXMODE_POSITION], mtxStackPosition[index & 31]);
|
||||||
MatrixCopy(mtxCurrent[MATRIXMODE_POSITION_VECTOR], mtxStackPositionVector.matrix[index & 31]);
|
MatrixCopy(mtxCurrent[MATRIXMODE_POSITION_VECTOR], mtxStackPositionVector[index & 31]);
|
||||||
}
|
}
|
||||||
|
|
||||||
//printf("%d %d %d %d\n",mtxStack[0].position,mtxStack[1].position,mtxStack[2].position,mtxStack[3].position);
|
//printf("%d %d %d %d\n",mtxStack[0].position,mtxStack[1].position,mtxStack[2].position,mtxStack[3].position);
|
||||||
|
@ -1123,12 +1129,12 @@ static void gfx3d_glStoreMatrix(u32 v)
|
||||||
|
|
||||||
if (mode == MATRIXMODE_PROJECTION)
|
if (mode == MATRIXMODE_PROJECTION)
|
||||||
{
|
{
|
||||||
MatrixCopy(mtxStackProjection.matrix[0], mtxCurrent[MATRIXMODE_PROJECTION]);
|
MatrixCopy(mtxStackProjection[0], mtxCurrent[MATRIXMODE_PROJECTION]);
|
||||||
UpdateProjection();
|
UpdateProjection();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
MatrixCopy(mtxStackTexture.matrix[0], mtxCurrent[MATRIXMODE_TEXTURE]);
|
MatrixCopy(mtxStackTexture[0], mtxCurrent[MATRIXMODE_TEXTURE]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -1138,8 +1144,8 @@ static void gfx3d_glStoreMatrix(u32 v)
|
||||||
//out of bounds function fully properly, but set errors (not sure, this might be off by 1)
|
//out of bounds function fully properly, but set errors (not sure, this might be off by 1)
|
||||||
if (v >= 31) MMU_new.gxstat.se = 1;
|
if (v >= 31) MMU_new.gxstat.se = 1;
|
||||||
|
|
||||||
MatrixCopy(mtxStackPosition.matrix[v], mtxCurrent[MATRIXMODE_POSITION]);
|
MatrixCopy(mtxStackPosition[v], mtxCurrent[MATRIXMODE_POSITION]);
|
||||||
MatrixCopy(mtxStackPositionVector.matrix[v], mtxCurrent[MATRIXMODE_POSITION_VECTOR]);
|
MatrixCopy(mtxStackPositionVector[v], mtxCurrent[MATRIXMODE_POSITION_VECTOR]);
|
||||||
}
|
}
|
||||||
|
|
||||||
//printf("%d %d %d %d\n",mtxStack[0].position,mtxStack[1].position,mtxStack[2].position,mtxStack[3].position);
|
//printf("%d %d %d %d\n",mtxStack[0].position,mtxStack[1].position,mtxStack[2].position,mtxStack[3].position);
|
||||||
|
@ -1156,12 +1162,12 @@ static void gfx3d_glRestoreMatrix(u32 v)
|
||||||
|
|
||||||
if (mode == MATRIXMODE_PROJECTION)
|
if (mode == MATRIXMODE_PROJECTION)
|
||||||
{
|
{
|
||||||
MatrixCopy(mtxCurrent[MATRIXMODE_PROJECTION], mtxStackProjection.matrix[0]);
|
MatrixCopy(mtxCurrent[MATRIXMODE_PROJECTION], mtxStackProjection[0]);
|
||||||
UpdateProjection();
|
UpdateProjection();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
MatrixCopy(mtxCurrent[MATRIXMODE_TEXTURE], mtxStackTexture.matrix[0]);
|
MatrixCopy(mtxCurrent[MATRIXMODE_TEXTURE], mtxStackTexture[0]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -1169,8 +1175,8 @@ static void gfx3d_glRestoreMatrix(u32 v)
|
||||||
//out of bounds errors function fully properly, but set errors
|
//out of bounds errors function fully properly, but set errors
|
||||||
MMU_new.gxstat.se = (v >= 31) ? 1 : 0; //(not sure, this might be off by 1)
|
MMU_new.gxstat.se = (v >= 31) ? 1 : 0; //(not sure, this might be off by 1)
|
||||||
|
|
||||||
MatrixCopy(mtxCurrent[MATRIXMODE_POSITION], mtxStackPosition.matrix[v]);
|
MatrixCopy(mtxCurrent[MATRIXMODE_POSITION], mtxStackPosition[v]);
|
||||||
MatrixCopy(mtxCurrent[MATRIXMODE_POSITION_VECTOR], mtxStackPositionVector.matrix[v]);
|
MatrixCopy(mtxCurrent[MATRIXMODE_POSITION_VECTOR], mtxStackPositionVector[v]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -2659,19 +2665,19 @@ void gfx3d_glGetMatrix(const int index, float (&dst)[16])
|
||||||
switch (MODE)
|
switch (MODE)
|
||||||
{
|
{
|
||||||
case MATRIXMODE_PROJECTION:
|
case MATRIXMODE_PROJECTION:
|
||||||
MatrixCopy(dst, mtxStackProjection.matrix[0]);
|
MatrixCopy(dst, mtxStackProjection[0]);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case MATRIXMODE_POSITION:
|
case MATRIXMODE_POSITION:
|
||||||
MatrixCopy(dst, mtxStackPosition.matrix[0]);
|
MatrixCopy(dst, mtxStackPosition[0]);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case MATRIXMODE_POSITION_VECTOR:
|
case MATRIXMODE_POSITION_VECTOR:
|
||||||
MatrixCopy(dst, mtxStackPositionVector.matrix[0]);
|
MatrixCopy(dst, mtxStackPositionVector[0]);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case MATRIXMODE_TEXTURE:
|
case MATRIXMODE_TEXTURE:
|
||||||
MatrixCopy(dst, mtxStackTexture.matrix[0]);
|
MatrixCopy(dst, mtxStackTexture[0]);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
@ -2859,34 +2865,34 @@ void gfx3d_savestate(EMUFILE &os)
|
||||||
polylist->list[i].save(os);
|
polylist->list[i].save(os);
|
||||||
|
|
||||||
// Write matrix stack data
|
// Write matrix stack data
|
||||||
os.write_32LE(mtxStackProjection.position);
|
os.write_32LE(mtxStackIndex[MATRIXMODE_PROJECTION]);
|
||||||
for (size_t j = 0; j < 16; j++)
|
for (size_t j = 0; j < 16; j++)
|
||||||
{
|
{
|
||||||
os.write_32LE(mtxStackProjection.matrix[0][j]);
|
os.write_32LE(mtxStackProjection[0][j]);
|
||||||
}
|
}
|
||||||
|
|
||||||
os.write_32LE(mtxStackPosition.position);
|
os.write_32LE(mtxStackIndex[MATRIXMODE_POSITION]);
|
||||||
for (size_t i = 0; i < MatrixStack<MATRIXMODE_POSITION>::size; i++)
|
for (size_t i = 0; i < NDSMATRIXSTACK_COUNT(MATRIXMODE_POSITION); i++)
|
||||||
{
|
{
|
||||||
for (size_t j = 0; j < 16; j++)
|
for (size_t j = 0; j < 16; j++)
|
||||||
{
|
{
|
||||||
os.write_32LE(mtxStackPosition.matrix[i][j]);
|
os.write_32LE(mtxStackPosition[i][j]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
os.write_32LE(mtxStackPositionVector.position);
|
os.write_32LE(mtxStackIndex[MATRIXMODE_POSITION_VECTOR]);
|
||||||
for (size_t i = 0; i < MatrixStack<MATRIXMODE_POSITION_VECTOR>::size; i++)
|
for (size_t i = 0; i < NDSMATRIXSTACK_COUNT(MATRIXMODE_POSITION_VECTOR); i++)
|
||||||
{
|
{
|
||||||
for (size_t j = 0; j < 16; j++)
|
for (size_t j = 0; j < 16; j++)
|
||||||
{
|
{
|
||||||
os.write_32LE(mtxStackPositionVector.matrix[i][j]);
|
os.write_32LE(mtxStackPositionVector[i][j]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
os.write_32LE(mtxStackTexture.position);
|
os.write_32LE(mtxStackIndex[MATRIXMODE_TEXTURE]);
|
||||||
for (size_t j = 0; j < 16; j++)
|
for (size_t j = 0; j < 16; j++)
|
||||||
{
|
{
|
||||||
os.write_32LE(mtxStackTexture.matrix[0][j]);
|
os.write_32LE(mtxStackTexture[0][j]);
|
||||||
}
|
}
|
||||||
|
|
||||||
gxf_hardware.savestate(os);
|
gxf_hardware.savestate(os);
|
||||||
|
@ -2953,34 +2959,34 @@ bool gfx3d_loadstate(EMUFILE &is, int size)
|
||||||
if (version >= 2)
|
if (version >= 2)
|
||||||
{
|
{
|
||||||
// Read matrix stack data
|
// Read matrix stack data
|
||||||
is.read_32LE(mtxStackProjection.position);
|
is.read_32LE(mtxStackIndex[MATRIXMODE_PROJECTION]);
|
||||||
for (size_t j = 0; j < 16; j++)
|
for (size_t j = 0; j < 16; j++)
|
||||||
{
|
{
|
||||||
is.read_32LE(mtxStackProjection.matrix[0][j]);
|
is.read_32LE(mtxStackProjection[0][j]);
|
||||||
}
|
}
|
||||||
|
|
||||||
is.read_32LE(mtxStackPosition.position);
|
is.read_32LE(mtxStackIndex[MATRIXMODE_POSITION]);
|
||||||
for (size_t i = 0; i < MatrixStack<MATRIXMODE_POSITION>::size; i++)
|
for (size_t i = 0; i < NDSMATRIXSTACK_COUNT(MATRIXMODE_POSITION); i++)
|
||||||
{
|
{
|
||||||
for (size_t j = 0; j < 16; j++)
|
for (size_t j = 0; j < 16; j++)
|
||||||
{
|
{
|
||||||
is.read_32LE(mtxStackPosition.matrix[i][j]);
|
is.read_32LE(mtxStackPosition[i][j]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
is.read_32LE(mtxStackPositionVector.position);
|
is.read_32LE(mtxStackIndex[MATRIXMODE_POSITION_VECTOR]);
|
||||||
for (size_t i = 0; i < MatrixStack<MATRIXMODE_POSITION_VECTOR>::size; i++)
|
for (size_t i = 0; i < NDSMATRIXSTACK_COUNT(MATRIXMODE_POSITION_VECTOR); i++)
|
||||||
{
|
{
|
||||||
for (size_t j = 0; j < 16; j++)
|
for (size_t j = 0; j < 16; j++)
|
||||||
{
|
{
|
||||||
is.read_32LE(mtxStackPositionVector.matrix[i][j]);
|
is.read_32LE(mtxStackPositionVector[i][j]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
is.read_32LE(mtxStackTexture.position);
|
is.read_32LE(mtxStackIndex[MATRIXMODE_TEXTURE]);
|
||||||
for (size_t j = 0; j < 16; j++)
|
for (size_t j = 0; j < 16; j++)
|
||||||
{
|
{
|
||||||
is.read_32LE(mtxStackTexture.matrix[0][j]);
|
is.read_32LE(mtxStackTexture[0][j]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
Copyright (C) 2006 yopyop
|
Copyright (C) 2006 yopyop
|
||||||
Copyright (C) 2008-2019 DeSmuME team
|
Copyright (C) 2008-2022 DeSmuME team
|
||||||
|
|
||||||
This file is free software: you can redistribute it and/or modify
|
This file is free software: you can redistribute it and/or modify
|
||||||
it under the terms of the GNU General Public License as published by
|
it under the terms of the GNU General Public License as published by
|
||||||
|
@ -77,10 +77,12 @@ class EMUFILE;
|
||||||
extern CACHE_ALIGN u32 dsDepthExtend_15bit_to_24bit[32768];
|
extern CACHE_ALIGN u32 dsDepthExtend_15bit_to_24bit[32768];
|
||||||
#define DS_DEPTH15TO24(depth) ( dsDepthExtend_15bit_to_24bit[(depth) & 0x7FFF] )
|
#define DS_DEPTH15TO24(depth) ( dsDepthExtend_15bit_to_24bit[(depth) & 0x7FFF] )
|
||||||
|
|
||||||
extern CACHE_ALIGN MatrixStack<MATRIXMODE_PROJECTION> mtxStackProjection;
|
extern CACHE_ALIGN NDSMatrixStack1 mtxStackProjection;
|
||||||
extern CACHE_ALIGN MatrixStack<MATRIXMODE_POSITION> mtxStackPosition;
|
extern CACHE_ALIGN NDSMatrixStack32 mtxStackPosition;
|
||||||
extern CACHE_ALIGN MatrixStack<MATRIXMODE_POSITION_VECTOR> mtxStackPositionVector;
|
extern CACHE_ALIGN NDSMatrixStack32 mtxStackPositionVector;
|
||||||
extern CACHE_ALIGN MatrixStack<MATRIXMODE_TEXTURE> mtxStackTexture;
|
extern CACHE_ALIGN NDSMatrixStack1 mtxStackTexture;
|
||||||
|
|
||||||
|
extern u32 mtxStackIndex[4];
|
||||||
|
|
||||||
// POLYGON PRIMITIVE TYPES
|
// POLYGON PRIMITIVE TYPES
|
||||||
enum PolygonPrimitiveType
|
enum PolygonPrimitiveType
|
||||||
|
|
|
@ -1263,33 +1263,6 @@ float MatrixGetMultipliedIndex(const u32 index, const float (&__restrict mtxA)[1
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
template <MatrixMode MODE>
|
|
||||||
void MatrixStackInit(MatrixStack<MODE> *stack)
|
|
||||||
{
|
|
||||||
for (size_t i = 0; i < MatrixStack<MODE>::size; i++)
|
|
||||||
{
|
|
||||||
MatrixInit(stack->matrix[i]);
|
|
||||||
}
|
|
||||||
|
|
||||||
stack->position = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
template <MatrixMode MODE>
|
|
||||||
s32* MatrixStackGet(MatrixStack<MODE> *stack)
|
|
||||||
{
|
|
||||||
return stack->matrix[stack->position];
|
|
||||||
}
|
|
||||||
|
|
||||||
template void MatrixStackInit(MatrixStack<MATRIXMODE_PROJECTION> *stack);
|
|
||||||
template void MatrixStackInit(MatrixStack<MATRIXMODE_POSITION> *stack);
|
|
||||||
template void MatrixStackInit(MatrixStack<MATRIXMODE_POSITION_VECTOR> *stack);
|
|
||||||
template void MatrixStackInit(MatrixStack<MATRIXMODE_TEXTURE> *stack);
|
|
||||||
|
|
||||||
template s32* MatrixStackGet(MatrixStack<MATRIXMODE_PROJECTION> *stack);
|
|
||||||
template s32* MatrixStackGet(MatrixStack<MATRIXMODE_POSITION> *stack);
|
|
||||||
template s32* MatrixStackGet(MatrixStack<MATRIXMODE_POSITION_VECTOR> *stack);
|
|
||||||
template s32* MatrixStackGet(MatrixStack<MATRIXMODE_TEXTURE> *stack);
|
|
||||||
|
|
||||||
// TODO: All of these float-based vector functions are obsolete and should be deleted.
|
// TODO: All of these float-based vector functions are obsolete and should be deleted.
|
||||||
void Vector2Copy(float *dst, const float *src)
|
void Vector2Copy(float *dst, const float *src)
|
||||||
{
|
{
|
||||||
|
|
|
@ -45,15 +45,12 @@ enum MatrixMode
|
||||||
MATRIXMODE_TEXTURE = 3
|
MATRIXMODE_TEXTURE = 3
|
||||||
};
|
};
|
||||||
|
|
||||||
template<MatrixMode MODE>
|
#define NDSMATRIXSTACK_COUNT(mode) ( (((mode) == MATRIXMODE_PROJECTION) || ((mode) == MATRIXMODE_TEXTURE)) ? 1 : 32 )
|
||||||
struct MatrixStack
|
|
||||||
{
|
|
||||||
static const size_t size = ((MODE == MATRIXMODE_PROJECTION) || (MODE == MATRIXMODE_TEXTURE)) ? 1 : 32;
|
|
||||||
static const MatrixMode type = MODE;
|
|
||||||
|
|
||||||
s32 matrix[size][16];
|
typedef float NDSMatrixFloat[16];
|
||||||
u32 position;
|
typedef s32 NDSMatrix[16];
|
||||||
};
|
typedef NDSMatrix NDSMatrixStack1[1]; // Used for MATRIXMODE_PROJECTION and MATRIXMODE_TEXTURE
|
||||||
|
typedef NDSMatrix NDSMatrixStack32[32]; // Used for MATRIXMODE_POSITION and MATRIXMODE_POSITION_VECTOR
|
||||||
|
|
||||||
void MatrixInit(s32 (&mtx)[16]);
|
void MatrixInit(s32 (&mtx)[16]);
|
||||||
void MatrixInit(float (&mtx)[16]);
|
void MatrixInit(float (&mtx)[16]);
|
||||||
|
@ -75,9 +72,6 @@ int MatrixCompare(const float (&__restrict mtxDst)[16], const float (&__restrict
|
||||||
s32 MatrixGetMultipliedIndex(const u32 index, const s32 (&__restrict mtxA)[16], const s32 (&__restrict mtxB)[16]);
|
s32 MatrixGetMultipliedIndex(const u32 index, const s32 (&__restrict mtxA)[16], const s32 (&__restrict mtxB)[16]);
|
||||||
float MatrixGetMultipliedIndex(const u32 index, const float (&__restrict mtxA)[16], const float (&__restrict mtxB)[16]);
|
float MatrixGetMultipliedIndex(const u32 index, const float (&__restrict mtxA)[16], const float (&__restrict mtxB)[16]);
|
||||||
|
|
||||||
template<MatrixMode MODE> void MatrixStackInit(MatrixStack<MODE> *stack);
|
|
||||||
template<MatrixMode MODE> s32* MatrixStackGet(MatrixStack<MODE> *stack);
|
|
||||||
|
|
||||||
void Vector2Copy(float *dst, const float *src);
|
void Vector2Copy(float *dst, const float *src);
|
||||||
void Vector2Add(float *dst, const float *src);
|
void Vector2Add(float *dst, const float *src);
|
||||||
void Vector2Subtract(float *dst, const float *src);
|
void Vector2Subtract(float *dst, const float *src);
|
||||||
|
|
Loading…
Reference in New Issue