From eacc127aaea5a65e1cc1b7432603887b71e61758 Mon Sep 17 00:00:00 2001 From: escape209 Date: Wed, 14 May 2025 21:16:15 +0100 Subject: [PATCH] iparmgr work --- src/SB/Core/gc/iParMgr.cpp | 111 +++++++++++++++++++++++++++++++++++++ src/SB/Core/gc/iParMgr.h | 40 +++++++++---- 2 files changed, 140 insertions(+), 11 deletions(-) diff --git a/src/SB/Core/gc/iParMgr.cpp b/src/SB/Core/gc/iParMgr.cpp index b8e280c8c..befa60fe3 100644 --- a/src/SB/Core/gc/iParMgr.cpp +++ b/src/SB/Core/gc/iParMgr.cpp @@ -1,6 +1,15 @@ #include "iParMgr.h" +#include "zGlobals.h" #include +#include +#include + +tagiRenderArrays gRenderArr; +tagiRenderInput gRenderBuffer; + +static S32 gColorTableInit; +static F32 gColorTable[256]; void iParMgrUpdate(F32) { @@ -9,3 +18,105 @@ void iParMgrUpdate(F32) void iParMgrRender() { } + +void iRenderInit() +{ + gRenderBuffer.m_mode = 0; + gRenderBuffer.m_indexCount = 0; + gRenderBuffer.m_vertexCount = 0; + gRenderBuffer.m_vertexTypeSize = 0x24; + gRenderBuffer.m_index = &gRenderArr.m_index[0]; + gRenderBuffer.m_vertex = &gRenderArr.m_vertex[0]; + gRenderBuffer.m_vertexTZ = gRenderArr.m_vertexTZ; +} + +void iRenderSetCameraViewMatrix(xMat4x3* m) +{ + if ((m == NULL) && (globals.camera.lo_cam != NULL)) + { + gRenderBuffer.m_camViewMatrix = *(xMat4x3 *)(*(int *)(*(int*)RwEngineInstance + 4) + 0x10); + } + else + { + gRenderBuffer.m_camViewMatrix = *m; + } + xVec3Inv((xVec3*)(&gRenderBuffer.m_camViewR), (xVec3*)(&gRenderBuffer.m_camViewMatrix.right)); + xVec3Inv((xVec3*)(&gRenderBuffer.m_camViewU), (xVec3*)(&gRenderBuffer.m_camViewMatrix.up)); +} + +void iRenderFlush() +{ + if (gRenderBuffer.m_vertexCount > 0) + { + iRenderTrianglesImmediate(gRenderBuffer.m_vertexType, gRenderBuffer.m_vertexTypeSize, gRenderBuffer.m_vertex, gRenderBuffer.m_vertexCount, gRenderBuffer.m_index, gRenderBuffer.m_indexCount); + } + + gRenderBuffer.m_indexCount = 0; + gRenderBuffer.m_vertexCount = 0; +} + +void iRenderTrianglesImmediate(S32 vertType, S32 vertTypeSize, void* data, S32 dataSize, U16* index, S32 indexSize) +{ + if (RwIm3DTransform((_RxObjSpace3DVertex *)data, dataSize, NULL, 1) != NULL) + { + if (indexSize != 0) + { + RwIm3DRenderIndexedPrimitive(rwPRIMTYPETRILIST, index, indexSize); + } + else + { + RwIm3DRenderPrimitive(rwPRIMTYPETRILIST); + } + RwIm3DEnd(); + } + +} + +static void iRenderPushFlat(xPar* p, xParCmdTex* tex); + +void iParMgrRenderParSys_QuadStreak(void* data, xParGroup* ps) +{ + xPar* idx = ps->m_root; + iRenderSetCameraViewMatrix(NULL); + RwTexture* texture = (RwTexture *)xSTFindAsset(*(U32 *)(*(S32 *)((S32)data + 0x10) + 0x10), NULL); + if (texture != NULL) + { + RwRaster* raster = texture->raster; + if (texture->raster != NULL) + { + RwRenderStateSet(rwRENDERSTATETEXTURERASTER, raster); + } + } + else + { + RwRenderStateSet(rwRENDERSTATETEXTURERASTER, NULL); + } + + for (; idx != NULL; idx = idx->m_next) + { + iRenderPushFlat(idx, *(xParCmdTex **)((S32)ps + 0x20)); + } + iRenderFlush(); +} + +void iParMgrRenderParSys_Static(void*, xParGroup*) { } + +void iParMgrRenderParSys_Flat(void* data, xParGroup* ps) +{ + xPar* idx = ps->m_root; + iRenderSetCameraViewMatrix(NULL); + RwTexture* texture = (RwTexture *)xSTFindAsset(*(U32 *)(*(S32 *)((S32)data + 0x10) + 0x10), NULL); + if (texture != NULL) + { + RwRaster* raster = texture->raster; + if (texture->raster != NULL) + { + RwRenderStateSet(rwRENDERSTATETEXTURERASTER, raster); + } + } + for (; idx != NULL; idx = idx->m_next) + { + iRenderPushFlat(idx, *(xParCmdTex **)((S32)ps + 0x20)); + } + iRenderFlush(); +} \ No newline at end of file diff --git a/src/SB/Core/gc/iParMgr.h b/src/SB/Core/gc/iParMgr.h index d64f594f6..3f2e89afd 100644 --- a/src/SB/Core/gc/iParMgr.h +++ b/src/SB/Core/gc/iParMgr.h @@ -2,26 +2,44 @@ #define IPARMGR_H #include "xMath3.h" +#include "xParGroup.h" #include +struct tagiRenderArrays +{ + // total size: 0x5280 +public: + U16 m_index[960]; // offset 0x0, size 0x780 + RxObjSpace3DVertex m_vertex[480]; // offset 0x780, size 0x4380 + F32 m_vertexTZ[480]; // offset 0x4B00, size 0x780 +}; + struct tagiRenderInput { - U16* m_index; - RwIm3DVertex* m_vertex; - F32* m_vertexTZ; - U32 m_mode; - S32 m_vertexType; - S32 m_vertexTypeSize; - S32 m_indexCount; - S32 m_vertexCount; - xMat4x3 m_camViewMatrix; - xVec4 m_camViewR; - xVec4 m_camViewU; + // total size: 0x80 +public: + U16* m_index; // offset 0x0, size 0x4 + RxObjSpace3DVertex * m_vertex; // offset 0x4, size 0x4 + F32* m_vertexTZ; // offset 0x8, size 0x4 + U32 m_mode; // offset 0xC, size 0x4 + S32 m_vertexType; // offset 0x10, size 0x4 + S32 m_vertexTypeSize; // offset 0x14, size 0x4 + S32 m_indexCount; // offset 0x18, size 0x4 + S32 m_vertexCount; // offset 0x1C, size 0x4 + xMat4x3 m_camViewMatrix; // offset 0x20, size 0x40 + xVec4 m_camViewR; // offset 0x60, size 0x10 + xVec4 m_camViewU; // offset 0x70, size 0x10 }; void iParMgrInit(); void iParMgrUpdate(F32 elapsedTime); void iParMgrRender(); +void iRenderInit(); +void iRenderSetCameraViewMatrix(xMat4x3* m); +void iRenderFlush(); +void iRenderTrianglesImmediate(S32 vertType, S32 vertTypeSize, void* data, S32 dataSize, U16* index, S32 indexSize); +void iParMgrRenderParSys_QuadStreak(void* data, xParGroup* ps); +void iParMgrRenderParSys_Flat(void* data, xParGroup* ps); #endif