mirror of
https://github.com/GTAmodding/re3.git
synced 2025-07-14 04:44:09 +00:00
implemented most of timecycle and mblur
This commit is contained in:
parent
68d3ea9c42
commit
31f9bb566b
7 changed files with 272 additions and 76 deletions
|
@ -11,6 +11,7 @@ bool CMBlur::ms_bJustInitialised;
|
|||
bool CMBlur::BlurOn;
|
||||
|
||||
static RwIm2DVertex Vertex[4];
|
||||
static RwIm2DVertex Vertex2[4];
|
||||
static RwImVertexIndex Index[6] = { 0, 1, 2, 0, 2, 3 };
|
||||
|
||||
void
|
||||
|
@ -103,29 +104,62 @@ CMBlur::CreateImmediateModeData(RwCamera *cam, RwRect *rect)
|
|||
RwIm2DVertexSetV(&Vertex[3], 0.0f, 1.0f/RwCameraGetNearClipPlane(cam));
|
||||
RwIm2DVertexSetIntRGBA(&Vertex[3], 255, 255, 255, 255);
|
||||
|
||||
|
||||
RwIm2DVertexSetScreenX(&Vertex2[0], zero);
|
||||
RwIm2DVertexSetScreenY(&Vertex2[0], zero);
|
||||
RwIm2DVertexSetScreenZ(&Vertex2[0], RwIm2DGetNearScreenZ());
|
||||
RwIm2DVertexSetCameraZ(&Vertex2[0], RwCameraGetNearClipPlane(cam));
|
||||
RwIm2DVertexSetRecipCameraZ(&Vertex2[0], 1.0f/RwCameraGetNearClipPlane(cam));
|
||||
RwIm2DVertexSetU(&Vertex2[0], 0.0f, 1.0f/RwCameraGetNearClipPlane(cam));
|
||||
RwIm2DVertexSetV(&Vertex2[0], 0.0f, 1.0f/RwCameraGetNearClipPlane(cam));
|
||||
RwIm2DVertexSetIntRGBA(&Vertex2[0], 255, 255, 255, 255);
|
||||
|
||||
RwIm2DVertexSetScreenX(&Vertex2[1], zero);
|
||||
RwIm2DVertexSetScreenY(&Vertex2[1], ymax);
|
||||
RwIm2DVertexSetScreenZ(&Vertex2[1], RwIm2DGetNearScreenZ());
|
||||
RwIm2DVertexSetCameraZ(&Vertex2[1], RwCameraGetNearClipPlane(cam));
|
||||
RwIm2DVertexSetRecipCameraZ(&Vertex2[1], 1.0f/RwCameraGetNearClipPlane(cam));
|
||||
RwIm2DVertexSetU(&Vertex2[1], 0.0f, 1.0f/RwCameraGetNearClipPlane(cam));
|
||||
RwIm2DVertexSetV(&Vertex2[1], 1.0f, 1.0f/RwCameraGetNearClipPlane(cam));
|
||||
RwIm2DVertexSetIntRGBA(&Vertex2[1], 255, 255, 255, 255);
|
||||
|
||||
RwIm2DVertexSetScreenX(&Vertex2[2], xmax);
|
||||
RwIm2DVertexSetScreenY(&Vertex2[2], ymax);
|
||||
RwIm2DVertexSetScreenZ(&Vertex2[2], RwIm2DGetNearScreenZ());
|
||||
RwIm2DVertexSetCameraZ(&Vertex2[2], RwCameraGetNearClipPlane(cam));
|
||||
RwIm2DVertexSetRecipCameraZ(&Vertex2[2], 1.0f/RwCameraGetNearClipPlane(cam));
|
||||
RwIm2DVertexSetU(&Vertex2[2], 1.0f, 1.0f/RwCameraGetNearClipPlane(cam));
|
||||
RwIm2DVertexSetV(&Vertex2[2], 1.0f, 1.0f/RwCameraGetNearClipPlane(cam));
|
||||
RwIm2DVertexSetIntRGBA(&Vertex2[2], 255, 255, 255, 255);
|
||||
|
||||
RwIm2DVertexSetScreenX(&Vertex2[3], xmax);
|
||||
RwIm2DVertexSetScreenY(&Vertex2[3], zero);
|
||||
RwIm2DVertexSetScreenZ(&Vertex2[3], RwIm2DGetNearScreenZ());
|
||||
RwIm2DVertexSetCameraZ(&Vertex2[3], RwCameraGetNearClipPlane(cam));
|
||||
RwIm2DVertexSetRecipCameraZ(&Vertex2[3], 1.0f/RwCameraGetNearClipPlane(cam));
|
||||
RwIm2DVertexSetU(&Vertex2[3], 1.0f, 1.0f/RwCameraGetNearClipPlane(cam));
|
||||
RwIm2DVertexSetV(&Vertex2[3], 0.0f, 1.0f/RwCameraGetNearClipPlane(cam));
|
||||
RwIm2DVertexSetIntRGBA(&Vertex2[3], 255, 255, 255, 255);
|
||||
|
||||
}
|
||||
|
||||
void
|
||||
CMBlur::MotionBlurRender(RwCamera *cam, uint32 red, uint32 green, uint32 blue, uint32 blur, int32 type, uint32 addalpha)
|
||||
CMBlur::MotionBlurRender(RwCamera *cam, uint32 red, uint32 green, uint32 blue, uint32 blur, int32 type)
|
||||
{
|
||||
RwRGBA color = { (RwUInt8)red, (RwUInt8)green, (RwUInt8)blue, (RwUInt8)blur };
|
||||
if(ms_bJustInitialised)
|
||||
ms_bJustInitialised = false;
|
||||
else
|
||||
OverlayRender(cam, pFrontBuffer, color, type);
|
||||
if(BlurOn){
|
||||
if(pFrontBuffer){
|
||||
if(ms_bJustInitialised)
|
||||
ms_bJustInitialised = false;
|
||||
else
|
||||
OverlayRender(cam, pFrontBuffer, color, type, addalpha);
|
||||
}
|
||||
RwRasterPushContext(pFrontBuffer);
|
||||
RwRasterRenderFast(RwCameraGetRaster(cam), 0, 0);
|
||||
RwRasterPopContext();
|
||||
}else{
|
||||
OverlayRender(cam, nil, color, type, addalpha);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
CMBlur::OverlayRender(RwCamera *cam, RwRaster *raster, RwRGBA color, int32 type, uint32 addalpha)
|
||||
CMBlur::OverlayRender(RwCamera *cam, RwRaster *raster, RwRGBA color, int32 type)
|
||||
{
|
||||
int r, g, b, a;
|
||||
|
||||
|
@ -170,41 +204,75 @@ CMBlur::OverlayRender(RwCamera *cam, RwRaster *raster, RwRGBA color, int32 type,
|
|||
}
|
||||
|
||||
if(!BlurOn){
|
||||
r *= 0.6f;
|
||||
g *= 0.6f;
|
||||
b *= 0.6f;
|
||||
if(type != 1)
|
||||
a *= 0.6f;
|
||||
// game clamps to 255 here, but why?
|
||||
// gta clamps these to 255 (probably a macro or inlined function)
|
||||
int ovR = r * 0.6f;
|
||||
int ovG = g * 0.6f;
|
||||
int ovB = b * 0.6f;
|
||||
int ovA = type == MBLUR_SNIPER ? a : a*0.6f;
|
||||
RwIm2DVertexSetIntRGBA(&Vertex[0], ovR, ovG, ovB, ovA);
|
||||
RwIm2DVertexSetIntRGBA(&Vertex[1], ovR, ovG, ovB, ovA);
|
||||
RwIm2DVertexSetIntRGBA(&Vertex[2], ovR, ovG, ovB, ovA);
|
||||
RwIm2DVertexSetIntRGBA(&Vertex[3], ovR, ovG, ovB, ovA);
|
||||
}else{
|
||||
RwIm2DVertexSetIntRGBA(&Vertex2[0], r, g, b, a);
|
||||
RwIm2DVertexSetIntRGBA(&Vertex[0], r, g, b, a);
|
||||
RwIm2DVertexSetIntRGBA(&Vertex2[1], r, g, b, a);
|
||||
RwIm2DVertexSetIntRGBA(&Vertex[1], r, g, b, a);
|
||||
RwIm2DVertexSetIntRGBA(&Vertex2[2], r, g, b, a);
|
||||
RwIm2DVertexSetIntRGBA(&Vertex[2], r, g, b, a);
|
||||
RwIm2DVertexSetIntRGBA(&Vertex2[3], r, g, b, a);
|
||||
RwIm2DVertexSetIntRGBA(&Vertex[3], r, g, b, a);
|
||||
}
|
||||
RwIm2DVertexSetIntRGBA(&Vertex[0], r, g, b, a);
|
||||
RwIm2DVertexSetIntRGBA(&Vertex[1], r, g, b, a);
|
||||
RwIm2DVertexSetIntRGBA(&Vertex[2], r, g, b, a);
|
||||
RwIm2DVertexSetIntRGBA(&Vertex[3], r, g, b, a);
|
||||
|
||||
RwRenderStateSet(rwRENDERSTATETEXTUREFILTER, (void*)rwFILTERNEAREST);
|
||||
RwRenderStateSet(rwRENDERSTATEFOGENABLE, (void*)FALSE);
|
||||
RwRenderStateSet(rwRENDERSTATEZTESTENABLE, (void*)FALSE);
|
||||
RwRenderStateSet(rwRENDERSTATEZWRITEENABLE, (void*)FALSE);
|
||||
|
||||
RwRenderStateSet(rwRENDERSTATETEXTURERASTER, BlurOn ? raster : nil);
|
||||
RwRenderStateSet(rwRENDERSTATETEXTURERASTER, raster);
|
||||
RwRenderStateSet(rwRENDERSTATEVERTEXALPHAENABLE, (void*)TRUE);
|
||||
RwRenderStateSet(rwRENDERSTATESRCBLEND, (void*)rwBLENDSRCALPHA);
|
||||
RwRenderStateSet(rwRENDERSTATEDESTBLEND, (void*)rwBLENDINVSRCALPHA);
|
||||
RwIm2DRenderIndexedPrimitive(rwPRIMTYPETRILIST, Vertex, 4, Index, 6);
|
||||
RwRenderStateSet(rwRENDERSTATESRCBLEND, (void*)rwBLENDONE);
|
||||
RwRenderStateSet(rwRENDERSTATEDESTBLEND, (void*)rwBLENDONE);
|
||||
|
||||
a = addalpha/2;
|
||||
if(a < 30)
|
||||
a = 30;
|
||||
if(BlurOn){
|
||||
if(type == MBLUR_SNIPER){
|
||||
RwIm2DVertexSetIntRGBA(&Vertex2[0], r, g, b, 80);
|
||||
RwIm2DVertexSetIntRGBA(&Vertex2[1], r, g, b, 80);
|
||||
RwIm2DVertexSetIntRGBA(&Vertex2[2], r, g, b, 80);
|
||||
RwIm2DVertexSetIntRGBA(&Vertex2[3], r, g, b, 80);
|
||||
RwRenderStateSet(rwRENDERSTATESRCBLEND, (void*)rwBLENDSRCALPHA);
|
||||
RwRenderStateSet(rwRENDERSTATEDESTBLEND, (void*)rwBLENDINVSRCALPHA);
|
||||
// TODO(MIAMI): pBufVertCount = 0;
|
||||
}else{
|
||||
RwIm2DVertexSetIntRGBA(&Vertex2[0], r*2, g*2, b*2, 30);
|
||||
RwIm2DVertexSetIntRGBA(&Vertex2[1], r*2, g*2, b*2, 30);
|
||||
RwIm2DVertexSetIntRGBA(&Vertex2[2], r*2, g*2, b*2, 30);
|
||||
RwIm2DVertexSetIntRGBA(&Vertex2[3], r*2, g*2, b*2, 30);
|
||||
RwRenderStateSet(rwRENDERSTATESRCBLEND, (void*)rwBLENDSRCALPHA);
|
||||
RwRenderStateSet(rwRENDERSTATEDESTBLEND, (void*)rwBLENDINVSRCALPHA);
|
||||
|
||||
if(BlurOn && a != 0){ // the second condition should always be true
|
||||
RwIm2DVertexSetIntRGBA(&Vertex[0], 255, 255, 255, a);
|
||||
RwIm2DVertexSetIntRGBA(&Vertex[1], 255, 255, 255, a);
|
||||
RwIm2DVertexSetIntRGBA(&Vertex[2], 255, 255, 255, a);
|
||||
RwIm2DVertexSetIntRGBA(&Vertex[3], 255, 255, 255, a);
|
||||
RwIm2DRenderIndexedPrimitive(rwPRIMTYPETRILIST, Vertex, 4, Index, 6);
|
||||
RwIm2DRenderIndexedPrimitive(rwPRIMTYPETRILIST, Vertex2, 4, Index, 6);
|
||||
|
||||
RwRenderStateSet(rwRENDERSTATESRCBLEND, (void*)rwBLENDONE);
|
||||
RwRenderStateSet(rwRENDERSTATEDESTBLEND, (void*)rwBLENDONE);
|
||||
|
||||
RwIm2DVertexSetIntRGBA(&Vertex2[0], r, g, b, a);
|
||||
RwIm2DVertexSetIntRGBA(&Vertex[0], r, g, b, a);
|
||||
RwIm2DVertexSetIntRGBA(&Vertex2[1], r, g, b, a);
|
||||
RwIm2DVertexSetIntRGBA(&Vertex[1], r, g, b, a);
|
||||
RwIm2DVertexSetIntRGBA(&Vertex2[2], r, g, b, a);
|
||||
RwIm2DVertexSetIntRGBA(&Vertex[2], r, g, b, a);
|
||||
RwIm2DVertexSetIntRGBA(&Vertex2[3], r, g, b, a);
|
||||
RwIm2DVertexSetIntRGBA(&Vertex[3], r, g, b, a);
|
||||
RwIm2DRenderIndexedPrimitive(rwPRIMTYPETRILIST, Vertex, 4, Index, 6);
|
||||
RwIm2DRenderIndexedPrimitive(rwPRIMTYPETRILIST, Vertex2, 4, Index, 6);
|
||||
}
|
||||
}
|
||||
|
||||
// TODO(MIAMI): drunkness
|
||||
|
||||
// TODO(MIAMI): OverlayRenderFx
|
||||
|
||||
RwRenderStateSet(rwRENDERSTATEFOGENABLE, (void*)FALSE);
|
||||
RwRenderStateSet(rwRENDERSTATEZTESTENABLE, (void*)TRUE);
|
||||
RwRenderStateSet(rwRENDERSTATEZWRITEENABLE, (void*)TRUE);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue