diff --git a/src/SB/Core/gc/iScrFX.cpp b/src/SB/Core/gc/iScrFX.cpp index 43fbae433..e3e415c60 100644 --- a/src/SB/Core/gc/iScrFX.cpp +++ b/src/SB/Core/gc/iScrFX.cpp @@ -1,15 +1,12 @@ #include "iScrFX.h" +#include "rwplcore.h" #include -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() { @@ -22,7 +19,7 @@ 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); } @@ -30,14 +27,41 @@ void iScrFxBegin() 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; @@ -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; } } @@ -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); } @@ -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; } @@ -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); } } diff --git a/src/SB/Core/gc/iScrFX.h b/src/SB/Core/gc/iScrFX.h index 624b1b749..8eb6d3695 100644 --- a/src/SB/Core/gc/iScrFX.h +++ b/src/SB/Core/gc/iScrFX.h @@ -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);