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
110 changes: 86 additions & 24 deletions src/SB/Core/gc/iScrFX.cpp
Original file line number Diff line number Diff line change
@@ -1,15 +1,12 @@
#include "iScrFX.h"

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

extern RwRaster* g_rast_gctapdance;
extern S32 g_alreadyTriedAlloc;
extern _iMotionBlurData sMBD;
extern U32 sMotionBlurEnabled;
extern F32 lbl_803CE168; // 0.0f
extern F32 lbl_803CE174; // 1.0f
extern F32 lbl_803CE178; // 0.5f
extern F32 lbl_803CE17C; // 254f
static U32 sMotionBlurEnabled;
static RwRaster* g_rast_gctapdance;
static S32 g_alreadyTriedAlloc;
static _iMotionBlurData sMBD = {};

void iScrFxInit()
{
Expand All @@ -22,22 +19,49 @@ void iScrFxBegin()
RwRenderStateSet(rwRENDERSTATEZTESTENABLE, NULL);
RwRenderStateSet(rwRENDERSTATEZWRITEENABLE, NULL);
RwRenderStateSet(rwRENDERSTATETEXTURERASTER, NULL);
RwRenderStateSet(rwRENDERSTATEVERTEXALPHAENABLE, (void*)true);
RwRenderStateSet(rwRENDERSTATEVERTEXALPHAENABLE, (void*)TRUE);
RwRenderStateSet(rwRENDERSTATESRCBLEND, (void*)rwBLENDSRCALPHA);
RwRenderStateSet(rwRENDERSTATEDESTBLEND, (void*)rwBLENDINVSRCALPHA);
}

void iScrFxEnd()
{
RwRenderStateSet(rwRENDERSTATEFOGENABLE, (void*)rwFOGTYPENAFOGTYPE);
RwRenderStateSet(rwRENDERSTATEZTESTENABLE, (void*)true);
RwRenderStateSet(rwRENDERSTATEZWRITEENABLE, (void*)true);
RwRenderStateSet(rwRENDERSTATEZTESTENABLE, (void*)TRUE);
RwRenderStateSet(rwRENDERSTATEZWRITEENABLE, (void*)TRUE);
RwRenderStateSet(rwRENDERSTATETEXTURERASTER, NULL);
RwRenderStateSet(rwRENDERSTATEVERTEXALPHAENABLE, (void*)false);
RwRenderStateSet(rwRENDERSTATEVERTEXALPHAENABLE, (void*)FALSE);
RwRenderStateSet(rwRENDERSTATESRCBLEND, (void*)rwBLENDONE);
RwRenderStateSet(rwRENDERSTATEDESTBLEND, (void*)rwBLENDZERO);
}

void iScrFxDrawBox(F32 x1, F32 y1, F32 x2, F32 y2, U8 red, U8 green, U8 blue, U8 alpha)
{
U16 indices[4] = { 0, 1, 2, 3 };
rwGameCube2DVertex v[4];
F32 nearZ = RwIm2DGetNearScreenZ();

RwIm2DVertexSetScreenX(&v[0], x1);
RwIm2DVertexSetScreenY(&v[0], y1);
RwIm2DVertexSetScreenZ(&v[0], nearZ);
RwIm2DVertexSetScreenX(&v[1], x2);
RwIm2DVertexSetScreenY(&v[1], y1);
RwIm2DVertexSetScreenZ(&v[1], nearZ);
RwIm2DVertexSetScreenX(&v[2], x1);
RwIm2DVertexSetScreenY(&v[2], y2);
RwIm2DVertexSetScreenZ(&v[2], nearZ);
RwIm2DVertexSetScreenX(&v[3], x2);
RwIm2DVertexSetScreenY(&v[3], y2);
RwIm2DVertexSetScreenZ(&v[3], nearZ);

for (S32 i = 0; i < 4; i++)
{
RwIm2DVertexSetRealRGBA(&v[i], red, green, blue, alpha);
}

RwIm2DRenderIndexedPrimitive(rwPRIMTYPETRISTRIP, v, 4, indices, 4);
}

void iCameraMotionBlurActivate(U32 activate)
{
sMotionBlurEnabled = activate;
Expand All @@ -46,18 +70,19 @@ void iCameraMotionBlurActivate(U32 activate)
// The instructions regarding the setting of sMotionBlurEnabled and sMBD.motionBlurAlpha are in the wrong order.
void iCameraSetBlurriness(F32 amount)
{
if (amount <= lbl_803CE168)
if (amount <= 0.0f)
{
sMotionBlurEnabled = 0;
sMotionBlurEnabled = FALSE;
}
else
{
if (amount > lbl_803CE174)
if (amount > 1.0f)
{
amount = lbl_803CE174;
amount = 1.0f;
}
sMotionBlurEnabled = 1;
sMBD.motionBlurAlpha = (S32)(lbl_803CE17C * amount + lbl_803CE178);
sMotionBlurEnabled = TRUE;

sMBD.motionBlurAlpha = 254.0f * amount + 0.5f;
}
}

Expand All @@ -77,7 +102,7 @@ void iScrFxCameraCreated(RwCamera* pCamera)

void iScrFxCameraEndScene(RwCamera* pCamera)
{
if ((sMotionBlurEnabled != 0) && (sMBD.motionBlurAlpha != 0))
if (sMotionBlurEnabled && sMBD.motionBlurAlpha != 0)
{
iScrFxMotionBlurRender(pCamera, sMBD.motionBlurAlpha & 0xff);
}
Expand All @@ -88,7 +113,46 @@ void iScrFxPostCameraEnd(RwCamera* pCamera)
GCMB_SiphonFrameBuffer(pCamera);
}

RwRaster* FBMBlur_DebugIntervention(RwCamera* camera, RwRaster* ras)
static void iCameraOverlayRender(RwCamera* pCamera, RwRaster* ras, RwRGBA col)
{
//RwRect rect; // from dwarf, not sure where it's used
RwRaster* raster = FBMBlur_DebugIntervention(pCamera, ras);

for (S32 i = 0; i < 4; i++)
{
sMBD.vertex[i].emissiveColor.red = col.red;
sMBD.vertex[i].emissiveColor.green = col.green;
sMBD.vertex[i].emissiveColor.blue = col.blue;
sMBD.vertex[i].emissiveColor.alpha = col.alpha;
}

RwRenderStateSet(rwRENDERSTATETEXTUREFILTER, (void*)TRUE);
RwRenderStateSet(rwRENDERSTATEFOGENABLE, (void*)FALSE);
RwRenderStateSet(rwRENDERSTATEZTESTENABLE, (void*)FALSE);
RwRenderStateSet(rwRENDERSTATEZWRITEENABLE, (void*)FALSE);
RwRenderStateSet(rwRENDERSTATETEXTURERASTER, raster);
RwRenderStateSet(rwRENDERSTATEVERTEXALPHAENABLE, (void*)TRUE);
RwRenderStateSet(rwRENDERSTATESRCBLEND, (void*)rwBLENDSRCALPHA);
RwRenderStateSet(rwRENDERSTATEDESTBLEND, (void*)rwBLENDINVSRCALPHA);
if (raster != 0)
{
RwRasterLock(raster, 0, 2);
}
RwIm2DRenderIndexedPrimitive(rwPRIMTYPETRILIST, sMBD.vertex, 4, sMBD.index, 6);
if (raster != 0)
{
RwRasterUnlock(raster);
}
RwRenderStateSet(rwRENDERSTATEFOGENABLE, (void*)FALSE);
RwRenderStateSet(rwRENDERSTATEZTESTENABLE, (void*)TRUE);
RwRenderStateSet(rwRENDERSTATEZWRITEENABLE, (void*)TRUE);
RwRenderStateSet(rwRENDERSTATETEXTURERASTER, NULL);
RwRenderStateSet(rwRENDERSTATEVERTEXALPHAENABLE, (void*)FALSE);
RwRenderStateSet(rwRENDERSTATESRCBLEND, (void*)rwBLENDSRCALPHA);
RwRenderStateSet(rwRENDERSTATEDESTBLEND, (void*)rwBLENDINVSRCALPHA);
}

inline RwRaster* FBMBlur_DebugIntervention(RwCamera* camera, RwRaster* ras)
{
return ras;
}
Expand All @@ -110,13 +174,11 @@ S32 iScrFxCameraDestroyed(RwCamera* pCamera)
return 0;
}

// WIP.
void iScrFxMotionBlurRender(RwCamera* camera, U32 col)
void iScrFxMotionBlurRender(RwCamera* camera, U32 alpha)
{
if (sMBD.motionBlurFrontBuffer != NULL)
{
RwRGBA col;
col.alpha = 0xf8;
RwRGBA col = { 0xff, 0xff, 0xff, (U8)alpha };
iCameraOverlayRender(camera, (RwRaster*)sMBD.motionBlurFrontBuffer, col);
}
}
Expand Down
10 changes: 4 additions & 6 deletions src/SB/Core/gc/iScrFX.h
Original file line number Diff line number Diff line change
Expand Up @@ -8,25 +8,23 @@ struct _iMotionBlurData
{
S32 motionBlurAlpha;
RwRaster* motionBlurFrontBuffer;
// RwSky2DVertex vertex[4]; This doesn't seem right... Due to how the data is used, it only makes sense for this to be 96 only.
U8 vertex[96];
rwGameCube2DVertex vertex[4];
U16 index[6];
U32 w;
U32 h;
U8 unk[10]; // There is something here to make this structure 0x88.
U8 unk[8];
};

void iScrFxInit();
void iScrFxBegin();
void iScrFxEnd();
void iScrFxDrawBox(F32 x1, F32 y1, F32 x2, F32 y2, U8 red, U8 green,
U8 blue, U8 alpha);
void iScrFxDrawBox(F32 x1, F32 y1, F32 x2, F32 y2, U8 red, U8 green, U8 blue, U8 alpha);
void iCameraMotionBlurActivate(U32 activate);
void iCameraSetBlurriness(F32 amount);
void iScrFxCameraCreated(RwCamera* pCamera);
void iScrFxCameraEndScene(RwCamera* pCamera);
void iScrFxPostCameraEnd(RwCamera* pCamera);
void iCameraOverlayRender(RwCamera* pcamera, RwRaster* ras, RwRGBA col);
static void iCameraOverlayRender(RwCamera* pCamera, RwRaster* ras, RwRGBA col);
RwRaster* FBMBlur_DebugIntervention(RwCamera* camera, RwRaster* ras);
S32 iScrFxMotionBlurOpen(RwCamera* camera);
S32 iScrFxCameraDestroyed(RwCamera* pCamera);
Expand Down