Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
111 changes: 111 additions & 0 deletions src/SB/Core/gc/iParMgr.cpp
Original file line number Diff line number Diff line change
@@ -1,6 +1,15 @@
#include "iParMgr.h"
#include "zGlobals.h"

#include <types.h>
#include <xstransvc.h>
#include <rwplcore.h>

tagiRenderArrays gRenderArr;
tagiRenderInput gRenderBuffer;

static S32 gColorTableInit;
static F32 gColorTable[256];

void iParMgrUpdate(F32)
{
Expand All @@ -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();
}
40 changes: 29 additions & 11 deletions src/SB/Core/gc/iParMgr.h
Original file line number Diff line number Diff line change
Expand Up @@ -2,26 +2,44 @@
#define IPARMGR_H

#include "xMath3.h"
#include "xParGroup.h"

#include <rwcore.h>

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