mirror of
https://github.com/HarbourMasters/SpaghettiKart
synced 2026-07-08 14:37:09 -04:00
Fix matrix stack heap corruption (#166)
* Fix matrix stack heap corruption * Fix matrix overflow bug
This commit is contained in:
+21
-20
@@ -34,29 +34,30 @@ void AddMatrixFixed(std::vector<Mtx>& stack, s32 flags) {
|
||||
}
|
||||
|
||||
// Used in func_80095BD0
|
||||
void SetTextMatrix(f32 arg1, f32 arg2, f32 arg3, f32 arg4) {
|
||||
Mat4 mtx;
|
||||
mtx[0][0] = arg3;
|
||||
mtx[0][1] = 0.0f;
|
||||
mtx[0][2] = 0.0f;
|
||||
mtx[0][3] = 0.0f;
|
||||
mtx[1][0] = 0.0f;
|
||||
mtx[1][1] = arg4;
|
||||
mtx[1][2] = 0.0f;
|
||||
mtx[1][3] = 0.0f;
|
||||
mtx[2][0] = 0.0f;
|
||||
mtx[2][1] = 0.0f;
|
||||
mtx[2][2] = 1.0f;
|
||||
mtx[2][3] = 0.0f;
|
||||
mtx[3][0] = arg1;
|
||||
mtx[3][1] = arg2;
|
||||
mtx[3][2] = 0.0f;
|
||||
mtx[3][3] = 1.0f;
|
||||
Mtx* SetTextMatrix(f32 arg1, f32 arg2, f32 arg3, f32 arg4) {
|
||||
Mat4 matrix;
|
||||
matrix[0][0] = arg3;
|
||||
matrix[0][1] = 0.0f;
|
||||
matrix[0][2] = 0.0f;
|
||||
matrix[0][3] = 0.0f;
|
||||
matrix[1][0] = 0.0f;
|
||||
matrix[1][1] = arg4;
|
||||
matrix[1][2] = 0.0f;
|
||||
matrix[1][3] = 0.0f;
|
||||
matrix[2][0] = 0.0f;
|
||||
matrix[2][1] = 0.0f;
|
||||
matrix[2][2] = 1.0f;
|
||||
matrix[2][3] = 0.0f;
|
||||
matrix[3][0] = arg1;
|
||||
matrix[3][1] = arg2;
|
||||
matrix[3][2] = 0.0f;
|
||||
matrix[3][3] = 1.0f;
|
||||
Mtx* mtx = GetMatrix(gWorldInstance.Mtx.Effects);
|
||||
guMtxF2L(matrix, mtx);
|
||||
|
||||
AddMatrix(gWorldInstance.Mtx.Effects, mtx, G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
|
||||
return mtx;
|
||||
}
|
||||
|
||||
|
||||
// API
|
||||
extern "C" {
|
||||
|
||||
|
||||
+1
-1
@@ -14,7 +14,7 @@ void AddObjectMatrix(Mat4 mtx, s32 flags);
|
||||
void AddEffectMatrix(Mat4 mtx, s32 flags);
|
||||
void AddEffectMatrixOrtho(void);
|
||||
void AddEffectMatrixFixed(s32 flags);
|
||||
void SetTextMatrix(f32 arg1, f32 arg2, f32 arg3, f32 arg4);
|
||||
Mtx* SetTextMatrix(f32 arg1, f32 arg2, f32 arg3, f32 arg4);
|
||||
Mtx* GetEffectMatrix(void);
|
||||
void ClearHudMatrixPool(void);
|
||||
void ClearEffectsMatrixPool(void);
|
||||
|
||||
+13
-11
@@ -2732,8 +2732,9 @@ func_80095BD0_label1:
|
||||
rmonPrintf("MAX effectcount(760) over!!!!(kawano)\n");
|
||||
return displayListHead;
|
||||
func_80095BD0_label2:
|
||||
func_80095AE0(&gGfxPool->mtxEffect[gMatrixEffectCount], arg2, arg3, arg6, arg7);
|
||||
gSPMatrix(displayListHead++, VIRTUAL_TO_PHYSICAL(&gGfxPool->mtxEffect[gMatrixEffectCount++]),
|
||||
//func_80095AE0(&gGfxPool->mtxEffect[gMatrixEffectCount], arg2, arg3, arg6, arg7);
|
||||
Mtx* mtx = SetTextMatrix(arg2, arg3, arg6, arg7);
|
||||
gSPMatrix(displayListHead++, mtx,
|
||||
G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
|
||||
gMKLoadTextureTile_4b(displayListHead++, arg1, G_IM_FMT_I, arg4, 0, 0, 0, arg4, arg5, 0, G_TX_NOMIRROR | G_TX_WRAP,
|
||||
G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD);
|
||||
@@ -8299,7 +8300,8 @@ void func_800A66A8(MenuItem* arg0, Unk_D_800E70A0* arg1) {
|
||||
static float x2, y2, z2;
|
||||
static float x1, y1, z1;
|
||||
|
||||
mtx = GetEffectMatrix(); // &gGfxPool->mtxEffect[gMatrixEffectCount];
|
||||
mtx = GetEffectMatrix();
|
||||
mtx2 = GetEffectMatrix();
|
||||
if (arg0->paramf > 1.5) {
|
||||
arg0->paramf *= 0.95;
|
||||
} else {
|
||||
@@ -8321,14 +8323,14 @@ void func_800A66A8(MenuItem* arg0, Unk_D_800E70A0* arg1) {
|
||||
// clang-format on
|
||||
|
||||
guScale(mtx, 1.2f, 1.2f, 1.2f);
|
||||
guRotate(mtx + 1, y2, 0.0f, 1.0f, 0.0f);
|
||||
guMtxCatL(mtx, mtx + 1, mtx);
|
||||
guRotate(mtx + 1, z2, 0.0f, 0.0f, 1.0f);
|
||||
guMtxCatL(mtx, mtx + 1, mtx);
|
||||
guRotate(mtx + 1, x2, 1.0f, 0.0f, 0.0f);
|
||||
guMtxCatL(mtx, mtx + 1, mtx);
|
||||
guTranslate(mtx + 1, arg1->column, arg1->row, 0.0f);
|
||||
guMtxCatL(mtx, mtx + 1, mtx);
|
||||
guRotate(mtx2, y2, 0.0f, 1.0f, 0.0f);
|
||||
guMtxCatL(mtx, mtx2, mtx);
|
||||
guRotate(mtx2, z2, 0.0f, 0.0f, 1.0f);
|
||||
guMtxCatL(mtx, mtx2, mtx);
|
||||
guRotate(mtx2, x2, 1.0f, 0.0f, 0.0f);
|
||||
guMtxCatL(mtx, mtx2, mtx);
|
||||
guTranslate(mtx2, arg1->column, arg1->row, 0.0f);
|
||||
guMtxCatL(mtx, mtx2, mtx);
|
||||
// gSPMatrix(gDisplayListHead++, VIRTUAL_TO_PHYSICAL(&gGfxPool->mtxEffect[gMatrixEffectCount++]),
|
||||
// (G_MTX_NOPUSH | G_MTX_LOAD) | G_MTX_MODELVIEW);
|
||||
AddEffectMatrixFixed(G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
|
||||
|
||||
@@ -57,7 +57,7 @@ void osInitialize(void) {
|
||||
}
|
||||
osClockRate = osClockRate * 3 / 4;
|
||||
if (osResetType == RESET_TYPE_COLD_RESET) {
|
||||
// bzero(osAppNmiBuffer, sizeof(osAppNmiBuffer));
|
||||
bzero(osAppNmiBuffer, sizeof(osAppNmiBuffer));
|
||||
}
|
||||
|
||||
eu_sp30 = HW_REG(PI_STATUS_REG, u32);
|
||||
|
||||
Reference in New Issue
Block a user