Skip to content
2 changes: 2 additions & 0 deletions include/rwsdk/rwplcore.h
Original file line number Diff line number Diff line change
Expand Up @@ -960,6 +960,8 @@ enum RwRenderState
rwRENDERSTATESTENCILFUNCTIONREF,
rwRENDERSTATESTENCILFUNCTIONMASK,
rwRENDERSTATESTENCILFUNCTIONWRITEMASK,
rwRENDERSTATEALPHATESTFUNCTION,
rwRENDERSTATEALPHATESTFUNCTIONREF,
rwRENDERSTATEFORCEENUMSIZEINT = RWFORCEENUMSIZEINT
};

Expand Down
81 changes: 81 additions & 0 deletions src/SB/Core/gc/iScrFX.cpp
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
#include "iScrFX.h"
#include "rwcore.h"
#include "rwplcore.h"

extern RwRaster* g_rast_gctapdance;
extern S32 g_alreadyTriedAlloc;
Expand All @@ -10,6 +11,10 @@ void iScrFxLensFlare_Reset()
{
}

void RenderRect(RwRect* rect, F32 unknown)
{
}

S32 iScrFxCameraDestroyed(RwCamera* pCamera)
{
if (sMBD.motionBlurFrontBuffer != NULL)
Expand All @@ -23,6 +28,57 @@ S32 iScrFxCameraDestroyed(RwCamera* pCamera)

void iScrFxCameraEndScene(RwCamera* pCamera)
{
if ((sMotionBlurEnabled != 0) && (sMBD.motionBlurAlpha != 0))
{
U8 alpha = sMBD.motionBlurAlpha;
if (sMBD.motionBlurFrontBuffer != 0x0)
{
sMBD.vertex[0xc] = 0xFF;
sMBD.vertex[0xd] = 0xFF;
sMBD.vertex[0xe] = 0xFF;
sMBD.vertex[0xf] = alpha;
sMBD.vertex[0x24] = 0xFF;
sMBD.vertex[0x25] = 0xFF;
sMBD.vertex[0x26] = 0xFF;
sMBD.vertex[0x27] = alpha;
sMBD.vertex[0x3c] = 0xFF;
sMBD.vertex[0x3d] = 0xFF;
sMBD.vertex[0x3e] = 0xFF;
sMBD.vertex[0x3f] = alpha;
sMBD.vertex[0x54] = 0xFF;
sMBD.vertex[0x55] = 0xFF;
sMBD.vertex[0x56] = 0xFF;
sMBD.vertex[0x57] = alpha;
RwEngineInstance->dOpenDevice.fpRenderStateSet(rwRENDERSTATETEXTUREFILTER,
(void*)rwFILTERNEAREST);
RwEngineInstance->dOpenDevice.fpRenderStateSet(rwRENDERSTATEFOGENABLE,
(void*)rwFOGTYPENAFOGTYPE);
RwEngineInstance->dOpenDevice.fpRenderStateSet(rwRENDERSTATEZTESTENABLE, (void*)false);
RwEngineInstance->dOpenDevice.fpRenderStateSet(rwRENDERSTATEZWRITEENABLE, (void*)false);
RwEngineInstance->dOpenDevice.fpRenderStateSet(rwRENDERSTATETEXTURERASTER,
sMBD.motionBlurFrontBuffer);
RwEngineInstance->dOpenDevice.fpRenderStateSet(rwRENDERSTATEVERTEXALPHAENABLE,
(void*)true);
RwEngineInstance->dOpenDevice.fpRenderStateSet(rwRENDERSTATESRCBLEND,
(void*)rwBLENDSRCALPHA);
RwEngineInstance->dOpenDevice.fpRenderStateSet(rwRENDERSTATEDESTBLEND,
(void*)rwBLENDINVSRCALPHA);
RwEngineInstance->dOpenDevice.fpIm3DRenderIndexedPrimitive(rwPRIMTYPETRILIST,
sMBD.index, 6);
RwEngineInstance->dOpenDevice.fpRenderStateSet(rwRENDERSTATEFOGENABLE,
(void*)rwFOGTYPENAFOGTYPE);
RwEngineInstance->dOpenDevice.fpRenderStateSet(rwRENDERSTATEZTESTENABLE, (void*)true);
RwEngineInstance->dOpenDevice.fpRenderStateSet(rwRENDERSTATEZWRITEENABLE, (void*)true);
RwEngineInstance->dOpenDevice.fpRenderStateSet(rwRENDERSTATETEXTURERASTER, NULL);
RwEngineInstance->dOpenDevice.fpRenderStateSet(rwRENDERSTATEVERTEXALPHAENABLE,
(void*)false);
RwEngineInstance->dOpenDevice.fpRenderStateSet(rwRENDERSTATESRCBLEND,
(void*)rwBLENDSRCALPHA);
RwEngineInstance->dOpenDevice.fpRenderStateSet(rwRENDERSTATEDESTBLEND,
(void*)rwBLENDINVSRCALPHA);
}
}
return;
}

void iScrFxCameraCreated(RwCamera* pCamera)
Expand All @@ -37,8 +93,33 @@ void iScrFxCameraCreated(RwCamera* pCamera)
sMBD.index[5] = 3;
}

void iScrFxEnd()
{
RwEngineInstance->dOpenDevice.fpRenderStateSet(rwRENDERSTATEFOGENABLE,
(void*)rwFOGTYPENAFOGTYPE);
RwEngineInstance->dOpenDevice.fpRenderStateSet(rwRENDERSTATEZTESTENABLE, (void*)true);
RwEngineInstance->dOpenDevice.fpRenderStateSet(rwRENDERSTATEZWRITEENABLE, (void*)true);
RwEngineInstance->dOpenDevice.fpRenderStateSet(rwRENDERSTATETEXTURERASTER, NULL);
RwEngineInstance->dOpenDevice.fpRenderStateSet(rwRENDERSTATEVERTEXALPHAENABLE, (void*)false);
RwEngineInstance->dOpenDevice.fpRenderStateSet(rwRENDERSTATESRCBLEND, (void*)rwBLENDONE);
RwEngineInstance->dOpenDevice.fpRenderStateSet(rwRENDERSTATEDESTBLEND, (void*)rwBLENDZERO);
}

void iScrFxBegin()
{
RwEngineInstance->dOpenDevice.fpRenderStateSet(rwRENDERSTATETEXTUREFILTER,
(void*)rwFILTERNEAREST);
RwEngineInstance->dOpenDevice.fpRenderStateSet(rwRENDERSTATEFOGENABLE,
(void*)rwFOGTYPENAFOGTYPE);
RwEngineInstance->dOpenDevice.fpRenderStateSet(rwRENDERSTATEZTESTENABLE, (void*)false);
RwEngineInstance->dOpenDevice.fpRenderStateSet(rwRENDERSTATEZWRITEENABLE, (void*)false);
RwEngineInstance->dOpenDevice.fpRenderStateSet(rwRENDERSTATETEXTURERASTER, NULL);
RwEngineInstance->dOpenDevice.fpRenderStateSet(rwRENDERSTATEVERTEXALPHAENABLE, (void*)true);
RwEngineInstance->dOpenDevice.fpRenderStateSet(rwRENDERSTATESRCBLEND, (void*)rwBLENDSRCALPHA);
RwEngineInstance->dOpenDevice.fpRenderStateSet(rwRENDERSTATEDESTBLEND,
(void*)rwBLENDINVSRCALPHA);
RwEngineInstance->dOpenDevice.fpRenderStateSet(rwRENDERSTATECULLMODE,
(void*)rwCULLMODECULLNONE);
}

void iScrFxInit()
Expand Down
4 changes: 3 additions & 1 deletion src/SB/Core/gc/iScrFX.h
Original file line number Diff line number Diff line change
Expand Up @@ -23,10 +23,12 @@ struct _iMotionBlurData
{
S32 motionBlurAlpha;
RwRaster* motionBlurFrontBuffer;
RwSky2DVertex vertex[4];
// 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];
U16 index[6];
U32 w;
U32 h;
U8 unk[10]; // There is something here to make this structure 0x88.
};

void iScrFxInit();
Expand Down
2 changes: 1 addition & 1 deletion src/SB/Core/x/xPad.h
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,7 @@ struct _tagxPad
_tagPadAnalog analog2;
_tagPadState state;
U32 flags;
_tagxRumble rumble_head;
//_tagxRumble rumble_head;
S16 port;
S16 slot;
_tagiPad context;
Expand Down
Loading