summaryrefslogtreecommitdiffstats
path: root/src/render/MBlur.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/render/MBlur.cpp')
-rw-r--r--src/render/MBlur.cpp801
1 files changed, 0 insertions, 801 deletions
diff --git a/src/render/MBlur.cpp b/src/render/MBlur.cpp
deleted file mode 100644
index cc8270ce..00000000
--- a/src/render/MBlur.cpp
+++ /dev/null
@@ -1,801 +0,0 @@
-#ifndef LIBRW
-#define WITHD3D
-#endif
-#include "common.h"
-#ifndef LIBRW
-#include <d3d8caps.h>
-#endif
-
-#include "main.h"
-#include "General.h"
-#include "RwHelper.h"
-#include "Camera.h"
-#include "Timecycle.h"
-#include "Particle.h"
-#include "Timer.h"
-#include "Hud.h"
-#include "Frontend.h"
-#include "MBlur.h"
-#include "postfx.h"
-
-// Originally taken from RW example 'mblur'
-
-RwRaster *CMBlur::pFrontBuffer;
-bool CMBlur::ms_bJustInitialised;
-bool CMBlur::ms_bScaledBlur;
-bool CMBlur::BlurOn;
-float CMBlur::Drunkness;
-
-int32 CMBlur::pBufVertCount;
-
-static RwIm2DVertex Vertex[4];
-static RwIm2DVertex Vertex2[4];
-static RwImVertexIndex Index[6] = { 0, 1, 2, 0, 2, 3 };
-
-#ifndef LIBRW
-extern "C" D3DCAPS8 _RwD3D8DeviceCaps;
-#endif
-RwBool
-CMBlur::MotionBlurOpen(RwCamera *cam)
-{
-#ifdef EXTENDED_COLOURFILTER
- CPostFX::Open(cam);
- return TRUE;
-#else
-#ifdef GTA_PS2
- RwRect rect = {0, 0, 0, 0};
-
- if (pFrontBuffer)
- return TRUE;
-
- BlurOn = true;
-
- rect.w = RwRasterGetWidth(RwCameraGetRaster(cam));
- rect.h = RwRasterGetHeight(RwCameraGetRaster(cam));
-
- pFrontBuffer = RwRasterCreate(0, 0, 0, rwRASTERDONTALLOCATE|rwRASTERTYPECAMERATEXTURE);
- if (!pFrontBuffer)
- {
- printf("Error creating raster\n");
- return FALSE;
- }
-
- RwRaster *raster = RwRasterSubRaster(pFrontBuffer, RwCameraGetRaster(cam), &rect);
- if (!raster)
- {
- RwRasterDestroy(pFrontBuffer);
- pFrontBuffer = NULL;
- printf("Error subrastering\n");
- return FALSE;
- }
-
- CreateImmediateModeData(cam, &rect);
-#else
- RwRect rect = { 0, 0, 0, 0 };
-
- if(pFrontBuffer)
- MotionBlurClose();
-
-#ifndef LIBRW
- extern void _GetVideoMemInfo(LPDWORD total, LPDWORD avaible);
- DWORD total, avaible;
-
- _GetVideoMemInfo(&total, &avaible);
- debug("Available video memory %d\n", avaible);
-#endif
-
- if(BlurOn)
- {
- uint32 width = Pow(2.0f, int32(log2(RwRasterGetWidth (RwCameraGetRaster(cam))))+1);
- uint32 height = Pow(2.0f, int32(log2(RwRasterGetHeight(RwCameraGetRaster(cam))))+1);
- uint32 depth = RwRasterGetDepth(RwCameraGetRaster(cam));
-
-#ifndef LIBRW
- extern DWORD _dwMemTotalVideo;
- if ( _RwD3D8DeviceCaps.MaxTextureWidth >= width && _RwD3D8DeviceCaps.MaxTextureHeight >= height )
- {
- total = _dwMemTotalVideo - 3 *
- ( RwRasterGetDepth(RwCameraGetRaster(cam))
- * RwRasterGetHeight(RwCameraGetRaster(cam))
- * RwRasterGetWidth(RwCameraGetRaster(cam)) / 8 );
- BlurOn = total >= height*width*(depth/8) + (12*1024*1024) /*12 MB*/;
- }
- else
- BlurOn = false;
-#endif
-
- if ( BlurOn )
- {
- ms_bScaledBlur = false;
- rect.w = width;
- rect.h = height;
-
- pFrontBuffer = RwRasterCreate(rect.w, rect.h, depth, rwRASTERTYPECAMERATEXTURE);
- if ( !pFrontBuffer )
- {
- debug("MBlurOpen can't create raster.");
- BlurOn = false;
- rect.w = RwRasterGetWidth(RwCameraGetRaster(cam));
- rect.h = RwRasterGetHeight(RwCameraGetRaster(cam));
- }
- else
- ms_bJustInitialised = true;
- }
- else
- {
- rect.w = RwRasterGetWidth(RwCameraGetRaster(cam));
- rect.h = RwRasterGetHeight(RwCameraGetRaster(cam));
- }
-
-#ifndef LIBRW
- _GetVideoMemInfo(&total, &avaible);
- debug("Available video memory %d\n", avaible);
-#endif
- CreateImmediateModeData(cam, &rect);
- }
- else
- {
- rect.w = RwRasterGetWidth(RwCameraGetRaster(cam));
- rect.h = RwRasterGetHeight(RwCameraGetRaster(cam));
- CreateImmediateModeData(cam, &rect);
- }
-
- return TRUE;
-#endif
-#endif
-}
-
-RwBool
-CMBlur::MotionBlurClose(void)
-{
-#ifdef EXTENDED_COLOURFILTER
- CPostFX::Close();
-#else
- if(pFrontBuffer){
- RwRasterDestroy(pFrontBuffer);
- pFrontBuffer = nil;
-
- return TRUE;
- }
-#endif
- return FALSE;
-}
-
-void
-CMBlur::CreateImmediateModeData(RwCamera *cam, RwRect *rect)
-{
- float zero, xmax, ymax;
-
- if(RwRasterGetDepth(RwCameraGetRaster(cam)) == 16){
- zero = HALFPX;
- xmax = rect->w + HALFPX;
- ymax = rect->h + HALFPX;
- }else{
- zero = -HALFPX;
- xmax = rect->w - HALFPX;
- ymax = rect->h - HALFPX;
- }
-
- RwIm2DVertexSetScreenX(&Vertex[0], zero);
- RwIm2DVertexSetScreenY(&Vertex[0], zero);
- RwIm2DVertexSetScreenZ(&Vertex[0], RwIm2DGetNearScreenZ());
- RwIm2DVertexSetCameraZ(&Vertex[0], RwCameraGetNearClipPlane(cam));
- RwIm2DVertexSetRecipCameraZ(&Vertex[0], 1.0f/RwCameraGetNearClipPlane(cam));
- RwIm2DVertexSetU(&Vertex[0], 0.0f, 1.0f/RwCameraGetNearClipPlane(cam));
- RwIm2DVertexSetV(&Vertex[0], 0.0f, 1.0f/RwCameraGetNearClipPlane(cam));
- RwIm2DVertexSetIntRGBA(&Vertex[0], 255, 255, 255, 255);
-
- RwIm2DVertexSetScreenX(&Vertex[1], zero);
- RwIm2DVertexSetScreenY(&Vertex[1], ymax);
- RwIm2DVertexSetScreenZ(&Vertex[1], RwIm2DGetNearScreenZ());
- RwIm2DVertexSetCameraZ(&Vertex[1], RwCameraGetNearClipPlane(cam));
- RwIm2DVertexSetRecipCameraZ(&Vertex[1], 1.0f/RwCameraGetNearClipPlane(cam));
- RwIm2DVertexSetU(&Vertex[1], 0.0f, 1.0f/RwCameraGetNearClipPlane(cam));
- RwIm2DVertexSetV(&Vertex[1], 1.0f, 1.0f/RwCameraGetNearClipPlane(cam));
- RwIm2DVertexSetIntRGBA(&Vertex[1], 255, 255, 255, 255);
-
- RwIm2DVertexSetScreenX(&Vertex[2], xmax);
- RwIm2DVertexSetScreenY(&Vertex[2], ymax);
- RwIm2DVertexSetScreenZ(&Vertex[2], RwIm2DGetNearScreenZ());
- RwIm2DVertexSetCameraZ(&Vertex[2], RwCameraGetNearClipPlane(cam));
- RwIm2DVertexSetRecipCameraZ(&Vertex[2], 1.0f/RwCameraGetNearClipPlane(cam));
- RwIm2DVertexSetU(&Vertex[2], 1.0f, 1.0f/RwCameraGetNearClipPlane(cam));
- RwIm2DVertexSetV(&Vertex[2], 1.0f, 1.0f/RwCameraGetNearClipPlane(cam));
- RwIm2DVertexSetIntRGBA(&Vertex[2], 255, 255, 255, 255);
-
- RwIm2DVertexSetScreenX(&Vertex[3], xmax);
- RwIm2DVertexSetScreenY(&Vertex[3], zero);
- RwIm2DVertexSetScreenZ(&Vertex[3], RwIm2DGetNearScreenZ());
- RwIm2DVertexSetCameraZ(&Vertex[3], RwCameraGetNearClipPlane(cam));
- RwIm2DVertexSetRecipCameraZ(&Vertex[3], 1.0f/RwCameraGetNearClipPlane(cam));
- RwIm2DVertexSetU(&Vertex[3], 1.0f, 1.0f/RwCameraGetNearClipPlane(cam));
- RwIm2DVertexSetV(&Vertex[3], 0.0f, 1.0f/RwCameraGetNearClipPlane(cam));
- RwIm2DVertexSetIntRGBA(&Vertex[3], 255, 255, 255, 255);
-
-
- RwIm2DVertexSetScreenX(&Vertex2[0], zero + 2.0f);
- RwIm2DVertexSetScreenY(&Vertex2[0], zero + 2.0f);
- 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], 2.0f);
- RwIm2DVertexSetScreenY(&Vertex2[1], ymax + 2.0f);
- 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 + 2.0f);
- RwIm2DVertexSetScreenY(&Vertex2[2], ymax + 2.0f);
- 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 + 2.0f);
- RwIm2DVertexSetScreenY(&Vertex2[3], zero + 2.0f);
- 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::CreateImmediateModeData(RwCamera *cam, RwRect *rect, RwIm2DVertex *verts, RwRGBA color, float u1Off, float v1Off, float u2Off, float v2Off, float z, int fullTexture)
-{
- float x1 = rect->x;
- float y1 = rect->y;
- float x2 = rect->w;
- float y2 = rect->h;
-
- float u1, v1, u2, v2;
- if(fullTexture){
- u1 = 0.0f;
- v1 = 0.0f;
- u2 = 1.0f;
- v2 = 1.0f;
- }else{
- if(RwRasterGetDepth(RwCameraGetRaster(cam)) == 16){
- x1 += HALFPX;
- y1 += HALFPX;
- x2 += HALFPX;
- y2 += HALFPX;
- }else{
- x1 -= HALFPX;
- y1 -= HALFPX;
- x2 -= HALFPX;
- y2 -= HALFPX;
- }
-
- int32 width = Pow(2.0f, int32(log2(RwRasterGetWidth (RwCameraGetRaster(cam))))+1);
- int32 height = Pow(2.0f, int32(log2(RwRasterGetHeight(RwCameraGetRaster(cam))))+1);
- u1 = x1/width + u1Off;
- v1 = y1/height + v1Off;
- u2 = x2/width + u2Off;
- v2 = y2/height + v2Off;
- u1 = Clamp(u1, 0.0f, 1.0f);
- v1 = Clamp(v1, 0.0f, 1.0f);
- u2 = Clamp(u2, 0.0f, 1.0f);
- v2 = Clamp(v2, 0.0f, 1.0f);
- }
-
- float recipz = 1.0f/z;
- // TODO: CameraZ is wrong, what should we do?
- RwIm2DVertexSetScreenX(&verts[0], x1);
- RwIm2DVertexSetScreenY(&verts[0], y1);
- RwIm2DVertexSetScreenZ(&verts[0], z);
- RwIm2DVertexSetCameraZ(&verts[0], RwCameraGetNearClipPlane(cam));
- RwIm2DVertexSetRecipCameraZ(&verts[0], recipz);
- RwIm2DVertexSetU(&verts[0], u1, recipz);
- RwIm2DVertexSetV(&verts[0], v1, recipz);
- RwIm2DVertexSetIntRGBA(&verts[0], color.red, color.green, color.blue, color.alpha);
-
- RwIm2DVertexSetScreenX(&verts[1], x1);
- RwIm2DVertexSetScreenY(&verts[1], y2);
- RwIm2DVertexSetScreenZ(&verts[1], z);
- RwIm2DVertexSetCameraZ(&verts[1], RwCameraGetNearClipPlane(cam));
- RwIm2DVertexSetRecipCameraZ(&verts[1], recipz);
- RwIm2DVertexSetU(&verts[1], u1, recipz);
- RwIm2DVertexSetV(&verts[1], v2, recipz);
- RwIm2DVertexSetIntRGBA(&verts[1], color.red, color.green, color.blue, color.alpha);
-
- RwIm2DVertexSetScreenX(&verts[2], x2);
- RwIm2DVertexSetScreenY(&verts[2], y2);
- RwIm2DVertexSetScreenZ(&verts[2], z);
- RwIm2DVertexSetCameraZ(&verts[2], RwCameraGetNearClipPlane(cam));
- RwIm2DVertexSetRecipCameraZ(&verts[2], recipz);
- RwIm2DVertexSetU(&verts[2], u2, recipz);
- RwIm2DVertexSetV(&verts[2], v2, recipz);
- RwIm2DVertexSetIntRGBA(&verts[2], color.red, color.green, color.blue, color.alpha);
-
- RwIm2DVertexSetScreenX(&verts[3], x2);
- RwIm2DVertexSetScreenY(&verts[3], y1);
- RwIm2DVertexSetScreenZ(&verts[3], z);
- RwIm2DVertexSetCameraZ(&verts[3], RwCameraGetNearClipPlane(cam));
- RwIm2DVertexSetRecipCameraZ(&verts[3], recipz);
- RwIm2DVertexSetU(&verts[3], u2, recipz);
- RwIm2DVertexSetV(&verts[3], v1, recipz);
- RwIm2DVertexSetIntRGBA(&verts[3], color.red, color.green, color.blue, color.alpha);
-}
-
-void
-CMBlur::MotionBlurRender(RwCamera *cam, uint32 red, uint32 green, uint32 blue, uint32 blur, int32 type, uint32 bluralpha)
-{
-#ifdef EXTENDED_COLOURFILTER
- CPostFX::Render(cam, red, green, blue, blur, type, bluralpha);
-#else
- PUSH_RENDERGROUP("CMBlur::MotionBlurRender");
- RwRGBA color = { (RwUInt8)red, (RwUInt8)green, (RwUInt8)blue, (RwUInt8)blur };
-#ifdef GTA_PS2
- if( pFrontBuffer )
- OverlayRender(cam, pFrontBuffer, color, type, bluralpha);
-#else
- if(ms_bJustInitialised)
- ms_bJustInitialised = false;
- else
- OverlayRender(cam, pFrontBuffer, color, type, bluralpha);
- if(BlurOn){
- RwRasterPushContext(pFrontBuffer);
- RwRasterRenderFast(RwCameraGetRaster(cam), 0, 0);
- RwRasterPopContext();
- }
-#endif
- POP_RENDERGROUP();
-#endif
-}
-
-static uint8 DrunkBlurRed = 128;
-static uint8 DrunkBlurGreen = 128;
-static uint8 DrunkBlurBlue = 128;
-static int32 DrunkBlurIncrement = 1;
-
-void
-CMBlur::OverlayRender(RwCamera *cam, RwRaster *raster, RwRGBA color, int32 type, int32 bluralpha)
-{
- int r, g, b, a;
-
- r = color.red;
- g = color.green;
- b = color.blue;
- a = color.alpha;
-
- DefinedState();
-
- switch(type)
- {
- case MOTION_BLUR_SECURITY_CAM:
- r = 0;
- g = 255;
- b = 0;
- a = 128;
- break;
- case MOTION_BLUR_INTRO:
- r = 100;
- g = 220;
- b = 230;
- a = 158;
- break;
- case MOTION_BLUR_INTRO2:
- r = 80;
- g = 255;
- b = 230;
- a = 138;
- break;
- case MOTION_BLUR_INTRO3:
- r = 255;
- g = 60;
- b = 60;
- a = 200;
- break;
- case MOTION_BLUR_INTRO4:
- r = 255;
- g = 180;
- b = 180;
- a = 128;
- break;
- }
-
- if(!BlurOn){
- // 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 == MOTION_BLUR_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);
- }
-
- RwRenderStateSet(rwRENDERSTATETEXTUREFILTER, (void*)rwFILTERNEAREST);
- RwRenderStateSet(rwRENDERSTATEFOGENABLE, (void*)FALSE);
- RwRenderStateSet(rwRENDERSTATEZTESTENABLE, (void*)FALSE);
- RwRenderStateSet(rwRENDERSTATEZWRITEENABLE, (void*)FALSE);
-
- RwRenderStateSet(rwRENDERSTATETEXTURERASTER, raster);
- RwRenderStateSet(rwRENDERSTATEVERTEXALPHAENABLE, (void*)TRUE);
- RwRenderStateSet(rwRENDERSTATESRCBLEND, (void*)rwBLENDONE);
- RwRenderStateSet(rwRENDERSTATEDESTBLEND, (void*)rwBLENDONE);
-
- if(BlurOn){
- if(type == MOTION_BLUR_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);
- 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);
-
- 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);
- }
- }
-
- int DrunkBlurAlpha = 175.0f * Drunkness;
- if(DrunkBlurAlpha != 0){
- RwRenderStateSet(rwRENDERSTATESRCBLEND, (void*)rwBLENDSRCALPHA);
- RwRenderStateSet(rwRENDERSTATEDESTBLEND, (void*)rwBLENDINVSRCALPHA);
- if(BlurOn){
- RwIm2DVertexSetIntRGBA(&Vertex[0], 255, 255, 255, DrunkBlurAlpha);
- RwIm2DVertexSetIntRGBA(&Vertex[1], 255, 255, 255, DrunkBlurAlpha);
- RwIm2DVertexSetIntRGBA(&Vertex[2], 255, 255, 255, DrunkBlurAlpha);
- RwIm2DVertexSetIntRGBA(&Vertex[3], 255, 255, 255, DrunkBlurAlpha);
- }else{
- RwIm2DVertexSetIntRGBA(&Vertex[0], DrunkBlurRed, DrunkBlurGreen, DrunkBlurBlue, DrunkBlurAlpha);
- RwIm2DVertexSetIntRGBA(&Vertex[1], DrunkBlurRed, DrunkBlurGreen, DrunkBlurBlue, DrunkBlurAlpha);
- RwIm2DVertexSetIntRGBA(&Vertex[2], DrunkBlurRed, DrunkBlurGreen, DrunkBlurBlue, DrunkBlurAlpha);
- RwIm2DVertexSetIntRGBA(&Vertex[3], DrunkBlurRed, DrunkBlurGreen, DrunkBlurBlue, DrunkBlurAlpha);
- if(DrunkBlurIncrement){
- if(DrunkBlurRed < 255) DrunkBlurRed++;
- if(DrunkBlurGreen < 255) DrunkBlurGreen++;
- if(DrunkBlurBlue < 255) DrunkBlurBlue++;
- if(DrunkBlurRed == 255)
- DrunkBlurIncrement = 0;
- }else{
- if(DrunkBlurRed > 128) DrunkBlurRed--;
- if(DrunkBlurGreen > 128) DrunkBlurGreen--;
- if(DrunkBlurBlue > 128) DrunkBlurBlue--;
- if(DrunkBlurRed == 128)
- DrunkBlurIncrement = 1;
- }
- }
- RwIm2DRenderIndexedPrimitive(rwPRIMTYPETRILIST, Vertex, 4, Index, 6);
- }
-
- if(type != MOTION_BLUR_SNIPER)
- OverlayRenderFx(cam, pFrontBuffer);
-
- RwRenderStateSet(rwRENDERSTATEFOGENABLE, (void*)FALSE);
- RwRenderStateSet(rwRENDERSTATEZTESTENABLE, (void*)TRUE);
- RwRenderStateSet(rwRENDERSTATEZWRITEENABLE, (void*)TRUE);
- RwRenderStateSet(rwRENDERSTATETEXTURERASTER, nil);
- RwRenderStateSet(rwRENDERSTATEVERTEXALPHAENABLE, (void*)FALSE);
- RwRenderStateSet(rwRENDERSTATESRCBLEND, (void*)rwBLENDSRCALPHA);
- RwRenderStateSet(rwRENDERSTATEDESTBLEND, (void*)rwBLENDINVSRCALPHA);
-}
-
-void
-CMBlur::SetDrunkBlur(float drunkness)
-{
- Drunkness = Clamp(drunkness, 0.0f, 1.0f);
-}
-
-void
-CMBlur::ClearDrunkBlur()
-{
- Drunkness = 0.0f;
- CTimer::SetTimeScale(1.0f);
-}
-
-#define NUM_RENDER_FX 64
-
-static RwRect fxRect[NUM_RENDER_FX];
-static FxType fxType[NUM_RENDER_FX];
-static float fxZ[NUM_RENDER_FX];
-
-bool
-CMBlur::PosInside(RwRect *rect, float x1, float y1, float x2, float y2)
-{
- if((rect->x < x1 - 10.0f || rect->x > x2 + 10.0f || rect->y < y1 - 10.0f || rect->y > y2 + 10.0f) &&
- (rect->w < x1 - 10.0f || rect->w > x2 + 10.0f || rect->h < y1 - 10.0f || rect->h > y2 + 10.0f) &&
- (rect->x < x1 - 10.0f || rect->x > x2 + 10.0f || rect->h < y1 - 10.0f || rect->h > y2 + 10.0f) &&
- (rect->w < x1 - 10.0f || rect->w > x2 + 10.0f || rect->y < y1 - 10.0f || rect->y > y2 + 10.0f))
- return false;
- return true;
-}
-
-bool
-CMBlur::AddRenderFx(RwCamera *cam, RwRect *rect, float z, FxType type)
-{
- if(pBufVertCount >= NUM_RENDER_FX)
- return false;
-
- rect->x = Max(rect->x, 0);
- rect->y = Max(rect->y, 0);
- rect->w = Min(rect->w, SCREEN_WIDTH);
- rect->h = Min(rect->h, SCREEN_HEIGHT);
- if(rect->x >= rect->w || rect->y >= rect->h)
- return false;
-
- switch(type){
- case FXTYPE_WATER1:
- case FXTYPE_WATER2:
- case FXTYPE_BLOOD1:
- case FXTYPE_BLOOD2:
- case FXTYPE_HEATHAZE: // code seems to be duplicated for this case
- for(int i = 0; i < pBufVertCount; i++)
- if(fxType[i] == type && PosInside(rect, fxRect[i].x-10.0f, fxRect[i].y-10.0f, fxRect[i].w+10.0f, fxRect[i].h+10.0f))
- return false;
- // TODO: fix aspect ratio scaling
- // radar
- if(PosInside(rect, 40.0f, SCREEN_SCALE_FROM_BOTTOM(116.0f), 40.0f + SCREEN_SCALE_X(94.0f), SCREEN_SCALE_FROM_BOTTOM(116.0f - 76.0f)))
- return false;
- // HUD
- if(PosInside(rect, 400.0f, 0.0f, SCREEN_WIDTH, 90.0f))
- return false;
- // vehicle name
- if(CHud::m_VehicleState != 0 && PosInside(rect, SCREEN_WIDTH/2, 350.0f, SCREEN_WIDTH, SCREEN_HEIGHT))
- return false;
- // zone name
- if(CHud::m_ZoneState != 0 && PosInside(rect, SCREEN_WIDTH/2, 350.0f, SCREEN_WIDTH, SCREEN_HEIGHT))
- return false;
- break;
- }
-
- fxRect[pBufVertCount] = *rect;
- fxZ[pBufVertCount] = z;
- fxType[pBufVertCount] = type;
- pBufVertCount++;
-
- return true;
-}
-
-void
-CMBlur::OverlayRenderFx(RwCamera *cam, RwRaster *frontBuf)
-{
- bool drawWaterDrops = false;
- RwIm2DVertex verts[4];
- int red = (0.75f*CTimeCycle::GetDirectionalRed() + CTimeCycle::GetAmbientRed())*0.55f * 255;
- int green = (0.75f*CTimeCycle::GetDirectionalGreen() + CTimeCycle::GetAmbientGreen())*0.55f * 255;
- int blue = (0.75f*CTimeCycle::GetDirectionalBlue() + CTimeCycle::GetAmbientBlue())*0.55f * 255;
- red = Clamp(red, 0, 255);
- green = Clamp(green, 0, 255);
- blue = Clamp(blue, 0, 255);
-
- RwRenderStateSet(rwRENDERSTATEZTESTENABLE, (void*)TRUE);
- RwRenderStateSet(rwRENDERSTATEVERTEXALPHAENABLE, (void*)TRUE);
-
-#ifdef LIBRW
- rw::SetRenderState(rw::STENCILENABLE, TRUE);
-#else
- RwD3D8SetRenderState(D3DRS_STENCILENABLE, TRUE);
-#endif
-
- for(int i = 0; i < pBufVertCount; i++)
- switch(fxType[i]){
- case FXTYPE_WATER1:
- case FXTYPE_WATER2:
- case FXTYPE_BLOOD1:
- case FXTYPE_BLOOD2: {
- drawWaterDrops = true;
- int32 width = Pow(2.0f, int32(log2(RwRasterGetWidth (RwCameraGetRaster(cam))))+1);
- int32 height = Pow(2.0f, int32(log2(RwRasterGetHeight(RwCameraGetRaster(cam))))+1);
-
- float u1Off = (fxRect[i].w - fxRect[i].x)/width;
- float u2Off = u1Off - (fxRect[i].w - fxRect[i].x + 0.5f)*0.66f/width;
- float halfHeight = (fxRect[i].h - fxRect[i].y + 0.5f)*0.25f/height;
-
- if(RwRasterGetDepth(RwCameraGetRaster(cam)) == 16){
- if(fxType[i] == FXTYPE_BLOOD1 || fxType[i] == FXTYPE_BLOOD2)
- CreateImmediateModeData(cam, &fxRect[i], verts, CRGBA(255, 0, 0, 128), 0.0f, 0.0f, 0.0f, 0.0f, fxZ[i], true);
- else
- CreateImmediateModeData(cam, &fxRect[i], verts, CRGBA(32, 32, 32, 225), 0.0f, 0.0f, 0.0f, 0.0f, fxZ[i], true);
- }else{
- CreateImmediateModeData(cam, &fxRect[i], verts, CRGBA(32, 32, 32, 225), 0.0f, 0.0f, 0.0f, 0.0f, fxZ[i], true);
- }
-
- RwRenderStateSet(rwRENDERSTATETEXTURERASTER, gpDotRaster);
-#ifdef LIBRW
- rw::SetRenderState(rw::STENCILFUNCTION, rw::STENCILALWAYS);
- rw::SetRenderState(rw::STENCILFUNCTIONREF, 1);
- rw::SetRenderState(rw::STENCILFUNCTIONMASK, 0xFFFFFFFF);
- rw::SetRenderState(rw::STENCILFUNCTIONWRITEMASK, 0xFFFFFFFF);
- rw::SetRenderState(rw::STENCILZFAIL, rw::STENCILKEEP);
- rw::SetRenderState(rw::STENCILFAIL, rw::STENCILKEEP);
- rw::SetRenderState(rw::STENCILPASS, rw::STENCILREPLACE);
-#else
- RwD3D8SetRenderState(D3DRS_STENCILFUNC, D3DCMP_ALWAYS);
- RwD3D8SetRenderState(D3DRS_STENCILREF, 1);
- RwD3D8SetRenderState(D3DRS_STENCILMASK, 0xFFFFFFFF);
- RwD3D8SetRenderState(D3DRS_STENCILWRITEMASK, 0xFFFFFFFF);
- RwD3D8SetRenderState(D3DRS_STENCILZFAIL, D3DSTENCILOP_KEEP);
- RwD3D8SetRenderState(D3DRS_STENCILFAIL, D3DSTENCILOP_KEEP);
- RwD3D8SetRenderState(D3DRS_STENCILPASS, D3DSTENCILOP_REPLACE);
-#endif
- RwRenderStateSet(rwRENDERSTATESRCBLEND, (void*)rwBLENDSRCALPHA);
- RwRenderStateSet(rwRENDERSTATEDESTBLEND, (void*)rwBLENDONE);
- RwIm2DRenderIndexedPrimitive(rwPRIMTYPETRILIST, verts, 4, Index, 6);
-
- if(RwRasterGetDepth(RwCameraGetRaster(cam)) != 16){
- RwRenderStateSet(rwRENDERSTATETEXTURERASTER, frontBuf);
-#ifdef LIBRW
- rw::SetRenderState(rw::STENCILFUNCTION, rw::STENCILEQUAL);
- rw::SetRenderState(rw::STENCILPASS, rw::STENCILKEEP);
-#else
- RwD3D8SetRenderState(D3DRS_STENCILFUNC, D3DCMP_EQUAL);
- RwD3D8SetRenderState(D3DRS_STENCILPASS, D3DSTENCILOP_KEEP);
-#endif
- if(BlurOn){
- if(fxType[i] == FXTYPE_BLOOD1 || fxType[i] == FXTYPE_BLOOD2)
- CreateImmediateModeData(cam, &fxRect[i], verts, CRGBA(255, 0, 0, 255), u1Off, 0.0f+halfHeight, u2Off, 0.0f-halfHeight, fxZ[i], false);
- else
- CreateImmediateModeData(cam, &fxRect[i], verts, CRGBA(225, 225, 225, 160), u1Off, 0.0f+halfHeight, u2Off, 0.0f-halfHeight, fxZ[i], false);
- RwRenderStateSet(rwRENDERSTATESRCBLEND, (void*)rwBLENDDESTALPHA);
- RwRenderStateSet(rwRENDERSTATEDESTBLEND, (void*)rwBLENDINVDESTALPHA);
- }else{
- if(fxType[i] == FXTYPE_BLOOD1 || fxType[i] == FXTYPE_BLOOD2)
- CreateImmediateModeData(cam, &fxRect[i], verts, CRGBA(255, 0, 0, 128), u1Off, 0.0f+halfHeight, u2Off, 0.0f-halfHeight, fxZ[i], false);
- else
- CreateImmediateModeData(cam, &fxRect[i], verts, CRGBA(128, 128, 128, 32), u1Off, 0.0f+halfHeight, u2Off, 0.0f-halfHeight, fxZ[i], false);
- RwRenderStateSet(rwRENDERSTATESRCBLEND, (void*)rwBLENDSRCALPHA);
- RwRenderStateSet(rwRENDERSTATEDESTBLEND, (void*)rwBLENDINVSRCALPHA);
- }
- RwIm2DRenderIndexedPrimitive(rwPRIMTYPETRILIST, verts, 4, Index, 6);
- }
- break;
- }
- case FXTYPE_SPLASH1:
- case FXTYPE_SPLASH2:
- case FXTYPE_SPLASH3:
- drawWaterDrops = true;
- break;
-
- case FXTYPE_HEATHAZE:
- if(TheCamera.GetScreenFadeStatus() == FADE_0 && frontBuf){
- int alpha = FrontEndMenuManager.m_PrefsBrightness > 255 ?
- FrontEndMenuManager.m_PrefsBrightness - 90 :
- FrontEndMenuManager.m_PrefsBrightness - 130;
- alpha = Clamp(alpha, 16, 200)/2;
-
- CreateImmediateModeData(cam, &fxRect[i], verts, CRGBA(0, 0, 0, alpha), 0.0f, 0.0f, 0.0f, 0.0f, fxZ[i], true);
- RwRenderStateSet(rwRENDERSTATETEXTURERASTER, gpHeatHazeRaster);
-#ifdef LIBRW
- rw::SetRenderState(rw::STENCILFUNCTION, rw::STENCILALWAYS);
- rw::SetRenderState(rw::STENCILFUNCTIONREF, 1);
- rw::SetRenderState(rw::STENCILFUNCTIONMASK, 0xFFFFFFFF);
- rw::SetRenderState(rw::STENCILFUNCTIONWRITEMASK, 0xFFFFFFFF);
- rw::SetRenderState(rw::STENCILZFAIL, rw::STENCILKEEP);
- rw::SetRenderState(rw::STENCILFAIL, rw::STENCILKEEP);
- rw::SetRenderState(rw::STENCILPASS, rw::STENCILREPLACE);
-#else
- RwD3D8SetRenderState(D3DRS_STENCILFUNC, D3DCMP_ALWAYS);
- RwD3D8SetRenderState(D3DRS_STENCILREF, 1);
- RwD3D8SetRenderState(D3DRS_STENCILMASK, 0xFFFFFFFF);
- RwD3D8SetRenderState(D3DRS_STENCILWRITEMASK, 0xFFFFFFFF);
- RwD3D8SetRenderState(D3DRS_STENCILZFAIL, D3DSTENCILOP_KEEP);
- RwD3D8SetRenderState(D3DRS_STENCILFAIL, D3DSTENCILOP_KEEP);
- RwD3D8SetRenderState(D3DRS_STENCILPASS, D3DSTENCILOP_REPLACE);
-#endif
- RwRenderStateSet(rwRENDERSTATESRCBLEND, (void*)rwBLENDSRCALPHA);
- RwRenderStateSet(rwRENDERSTATEDESTBLEND, (void*)rwBLENDONE);
- RwIm2DRenderIndexedPrimitive(rwPRIMTYPETRILIST, verts, 4, Index, 6);
-
- CreateImmediateModeData(cam, &fxRect[i], verts, CRGBA(255, 255, 255, alpha),
- CGeneral::GetRandomNumberInRange(-0.002f, 0.002f),
- CGeneral::GetRandomNumberInRange(-0.002f, 0.002f),
- CGeneral::GetRandomNumberInRange(-0.002f, 0.002f),
- CGeneral::GetRandomNumberInRange(-0.002f, 0.002f),
- fxZ[i], false);
- RwRenderStateSet(rwRENDERSTATETEXTURERASTER, frontBuf);
-#ifdef LIBRW
- rw::SetRenderState(rw::STENCILFUNCTION, rw::STENCILEQUAL);
- rw::SetRenderState(rw::STENCILPASS, rw::STENCILKEEP);
-#else
- RwD3D8SetRenderState(D3DRS_STENCILFUNC, D3DCMP_EQUAL);
- RwD3D8SetRenderState(D3DRS_STENCILPASS, D3DSTENCILOP_KEEP);
-#endif
- RwRenderStateSet(rwRENDERSTATESRCBLEND, (void*)rwBLENDSRCALPHA);
- RwRenderStateSet(rwRENDERSTATEDESTBLEND, (void*)rwBLENDINVSRCALPHA);
- RwIm2DRenderIndexedPrimitive(rwPRIMTYPETRILIST, verts, 4, Index, 6);
- }
- break;
- }
-#ifdef LIBRW
- rw::SetRenderState(rw::STENCILENABLE, FALSE);
-#else
- RwD3D8SetRenderState(D3DRS_STENCILENABLE, FALSE);
-#endif
-
- if(drawWaterDrops){
- RwRenderStateSet(rwRENDERSTATESRCBLEND, (void*)rwBLENDSRCALPHA);
- RwRenderStateSet(rwRENDERSTATEDESTBLEND, (void*)rwBLENDONE);
-
- // Draw drops
- RwRenderStateSet(rwRENDERSTATETEXTURERASTER, gpRainDripRaster[0]);
- for(int i = 0; i < pBufVertCount; i++)
- if(fxType[i] == FXTYPE_WATER1 || fxType[i] == FXTYPE_BLOOD1){
- CreateImmediateModeData(cam, &fxRect[i], verts, CRGBA(red, green, blue, fxType[i] == FXTYPE_BLOOD1 ? 255 : 192),
- 0.0f, 0.0f, 0.0f, 0.0f, fxZ[i], true);
- RwIm2DRenderIndexedPrimitive(rwPRIMTYPETRILIST, verts, 4, Index, 6);
- }
- RwRenderStateSet(rwRENDERSTATETEXTURERASTER, gpRainDripRaster[1]);
- for(int i = 0; i < pBufVertCount; i++)
- if(fxType[i] == FXTYPE_WATER2 || fxType[i] == FXTYPE_BLOOD2){
- CreateImmediateModeData(cam, &fxRect[i], verts, CRGBA(red, green, blue, fxType[i] == FXTYPE_BLOOD2 ? 255 : 192),
- 0.0f, 0.0f, 0.0f, 0.0f, fxZ[i], true);
- RwIm2DRenderIndexedPrimitive(rwPRIMTYPETRILIST, verts, 4, Index, 6);
- }
-
- RwRenderStateSet(rwRENDERSTATETEXTURERASTER, gpCarSplashRaster[0]);
- for(int i = 0; i < pBufVertCount; i++)
- if(fxType[i] == FXTYPE_SPLASH1 || fxType[i] == FXTYPE_SPLASH2 || fxType[i] == FXTYPE_SPLASH3){
- CreateImmediateModeData(cam, &fxRect[i], verts, CRGBA(200, 200, 200, 255),
- 0.0f, 0.0f, 0.0f, 0.0f, fxZ[i], true);
- RwIm2DRenderIndexedPrimitive(rwPRIMTYPETRILIST, verts, 4, Index, 6);
- }
-
- // Darken the water drops
- int alpha = 192*0.5f;
- RwRenderStateSet(rwRENDERSTATESRCBLEND, (void*)rwBLENDSRCALPHA);
- RwRenderStateSet(rwRENDERSTATEDESTBLEND, (void*)rwBLENDINVSRCALPHA);
-
- RwRenderStateSet(rwRENDERSTATETEXTURERASTER, gpRainDripDarkRaster[0]);
- for(int i = 0; i < pBufVertCount; i++)
- if(fxType[i] == FXTYPE_WATER1){
- CreateImmediateModeData(cam, &fxRect[i], verts, CRGBA(red, green, blue, alpha),
- 0.0f, 0.0f, 0.0f, 0.0f, fxZ[i], true);
- RwIm2DRenderIndexedPrimitive(rwPRIMTYPETRILIST, verts, 4, Index, 6);
- }
- RwRenderStateSet(rwRENDERSTATETEXTURERASTER, gpRainDripDarkRaster[1]);
- for(int i = 0; i < pBufVertCount; i++)
- if(fxType[i] == FXTYPE_WATER2){
- CreateImmediateModeData(cam, &fxRect[i], verts, CRGBA(red, green, blue, alpha),
- 0.0f, 0.0f, 0.0f, 0.0f, fxZ[i], true);
- RwIm2DRenderIndexedPrimitive(rwPRIMTYPETRILIST, verts, 4, Index, 6);
- }
- }
-
- RwRenderStateSet(rwRENDERSTATEZTESTENABLE, (void*)FALSE);
- RwRenderStateSet(rwRENDERSTATEVERTEXALPHAENABLE, (void*)FALSE);
- pBufVertCount = 0;
-}