2020-06-27 21:01:51 +00:00
|
|
|
#define WITHWINDOWS
|
2020-06-30 05:08:50 +00:00
|
|
|
#ifndef LIBRW
|
2020-06-30 04:43:20 +00:00
|
|
|
#define WITHD3D
|
2020-06-30 05:08:50 +00:00
|
|
|
#endif
|
2019-05-30 11:35:13 +00:00
|
|
|
#include "common.h"
|
2020-06-30 04:43:20 +00:00
|
|
|
#ifndef LIBRW
|
|
|
|
#include <d3d8caps.h>
|
|
|
|
#endif
|
2020-04-17 13:31:11 +00:00
|
|
|
|
2019-05-30 11:35:13 +00:00
|
|
|
#include "RwHelper.h"
|
2019-05-31 09:44:43 +00:00
|
|
|
#include "Camera.h"
|
2019-05-30 11:35:13 +00:00
|
|
|
#include "MBlur.h"
|
2020-05-15 14:30:25 +00:00
|
|
|
#include "Timer.h"
|
2019-05-30 11:35:13 +00:00
|
|
|
|
2020-04-09 14:35:24 +00:00
|
|
|
// Originally taken from RW example 'mblur'
|
|
|
|
|
2020-04-17 05:54:14 +00:00
|
|
|
RwRaster *CMBlur::pFrontBuffer;
|
|
|
|
bool CMBlur::ms_bJustInitialised;
|
2020-06-27 21:01:51 +00:00
|
|
|
bool CMBlur::ms_bScaledBlur;
|
2020-04-17 05:54:14 +00:00
|
|
|
bool CMBlur::BlurOn;
|
2020-05-15 14:30:25 +00:00
|
|
|
float CMBlur::Drunkness;
|
2019-05-30 11:35:13 +00:00
|
|
|
|
|
|
|
static RwIm2DVertex Vertex[4];
|
2020-05-05 22:53:26 +00:00
|
|
|
static RwIm2DVertex Vertex2[4];
|
2019-05-30 11:35:13 +00:00
|
|
|
static RwImVertexIndex Index[6] = { 0, 1, 2, 0, 2, 3 };
|
|
|
|
|
2020-06-30 04:43:20 +00:00
|
|
|
#ifndef LIBRW
|
|
|
|
extern "C" D3DCAPS8 _RwD3D8DeviceCaps;
|
|
|
|
#endif
|
2020-06-27 21:01:51 +00:00
|
|
|
RwBool
|
2019-05-30 11:35:13 +00:00
|
|
|
CMBlur::MotionBlurOpen(RwCamera *cam)
|
|
|
|
{
|
2020-06-27 21:01:51 +00:00
|
|
|
#ifdef GTA_PS2
|
|
|
|
RwRect rect = {0, 0, 0, 0};
|
2020-06-27 21:31:45 +00:00
|
|
|
|
2020-06-27 21:01:51 +00:00
|
|
|
if (pFrontBuffer)
|
2020-06-27 21:31:45 +00:00
|
|
|
return TRUE;
|
2020-06-27 21:01:51 +00:00
|
|
|
|
|
|
|
BlurOn = true;
|
|
|
|
|
|
|
|
rect.w = RwRasterGetWidth(RwCameraGetRaster(cam));
|
2020-06-27 21:31:45 +00:00
|
|
|
rect.h = RwRasterGetHeight(RwCameraGetRaster(cam));
|
2020-06-27 21:01:51 +00:00
|
|
|
|
|
|
|
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
|
2019-05-30 11:35:13 +00:00
|
|
|
RwRect rect = { 0, 0, 0, 0 };
|
|
|
|
|
|
|
|
if(pFrontBuffer)
|
|
|
|
MotionBlurClose();
|
2020-06-27 21:01:51 +00:00
|
|
|
|
2020-06-29 08:14:00 +00:00
|
|
|
#ifndef LIBRW
|
2020-06-29 07:36:35 +00:00
|
|
|
extern void _GetVideoMemInfo(LPDWORD total, LPDWORD avaible);
|
2020-06-29 07:40:06 +00:00
|
|
|
DWORD total, avaible;
|
2020-06-27 21:01:51 +00:00
|
|
|
|
|
|
|
_GetVideoMemInfo(&total, &avaible);
|
|
|
|
debug("Available video memory %d\n", avaible);
|
2020-06-29 07:36:35 +00:00
|
|
|
#endif
|
2020-06-27 21:01:51 +00:00
|
|
|
|
|
|
|
if(BlurOn)
|
|
|
|
{
|
2020-06-30 04:43:20 +00:00
|
|
|
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));
|
2020-06-27 21:01:51 +00:00
|
|
|
|
|
|
|
#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
|
2019-05-30 11:35:13 +00:00
|
|
|
BlurOn = false;
|
2020-06-27 21:01:51 +00:00
|
|
|
#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
|
|
|
|
{
|
2019-05-30 11:35:13 +00:00
|
|
|
rect.w = RwRasterGetWidth(RwCameraGetRaster(cam));
|
|
|
|
rect.h = RwRasterGetHeight(RwCameraGetRaster(cam));
|
|
|
|
}
|
2020-06-27 21:01:51 +00:00
|
|
|
|
2020-06-29 08:14:00 +00:00
|
|
|
#ifndef LIBRW
|
2020-06-27 21:01:51 +00:00
|
|
|
_GetVideoMemInfo(&total, &avaible);
|
|
|
|
debug("Available video memory %d\n", avaible);
|
2020-06-29 07:36:35 +00:00
|
|
|
#endif
|
2019-05-30 11:35:13 +00:00
|
|
|
CreateImmediateModeData(cam, &rect);
|
2020-06-27 21:01:51 +00:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2019-05-30 11:35:13 +00:00
|
|
|
rect.w = RwRasterGetWidth(RwCameraGetRaster(cam));
|
|
|
|
rect.h = RwRasterGetHeight(RwCameraGetRaster(cam));
|
|
|
|
CreateImmediateModeData(cam, &rect);
|
|
|
|
}
|
2020-06-27 21:01:51 +00:00
|
|
|
|
|
|
|
return TRUE;
|
|
|
|
#endif
|
2019-05-30 11:35:13 +00:00
|
|
|
}
|
|
|
|
|
2020-06-27 21:01:51 +00:00
|
|
|
RwBool
|
2019-05-30 11:35:13 +00:00
|
|
|
CMBlur::MotionBlurClose(void)
|
|
|
|
{
|
|
|
|
if(pFrontBuffer){
|
|
|
|
RwRasterDestroy(pFrontBuffer);
|
|
|
|
pFrontBuffer = nil;
|
2020-06-27 21:01:51 +00:00
|
|
|
|
|
|
|
return TRUE;
|
2019-05-30 11:35:13 +00:00
|
|
|
}
|
2020-06-27 21:01:51 +00:00
|
|
|
|
|
|
|
return FALSE;
|
2019-05-30 11:35:13 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
CMBlur::CreateImmediateModeData(RwCamera *cam, RwRect *rect)
|
|
|
|
{
|
|
|
|
float zero, xmax, ymax;
|
|
|
|
|
|
|
|
if(RwRasterGetDepth(RwCameraGetRaster(cam)) == 16){
|
2020-04-26 19:50:52 +00:00
|
|
|
zero = HALFPX;
|
|
|
|
xmax = rect->w + HALFPX;
|
|
|
|
ymax = rect->h + HALFPX;
|
2019-05-30 11:35:13 +00:00
|
|
|
}else{
|
2020-04-26 19:50:52 +00:00
|
|
|
zero = -HALFPX;
|
|
|
|
xmax = rect->w - HALFPX;
|
|
|
|
ymax = rect->h - HALFPX;
|
2019-05-30 11:35:13 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
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);
|
|
|
|
|
2020-05-05 22:53:26 +00:00
|
|
|
|
|
|
|
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);
|
|
|
|
|
2019-05-30 11:35:13 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void
|
2020-06-29 10:12:43 +00:00
|
|
|
CMBlur::MotionBlurRender(RwCamera *cam, uint32 red, uint32 green, uint32 blue, uint32 blur, int32 type, uint32 bluralpha)
|
2019-05-30 11:35:13 +00:00
|
|
|
{
|
2019-06-30 10:53:39 +00:00
|
|
|
RwRGBA color = { (RwUInt8)red, (RwUInt8)green, (RwUInt8)blue, (RwUInt8)blur };
|
2020-06-27 21:01:51 +00:00
|
|
|
#ifdef GTA_PS2
|
|
|
|
if( pFrontBuffer )
|
2020-06-29 10:12:43 +00:00
|
|
|
OverlayRender(cam, pFrontBuffer, color, type, bluralpha);
|
2020-06-27 21:01:51 +00:00
|
|
|
#else
|
2020-05-05 22:53:26 +00:00
|
|
|
if(ms_bJustInitialised)
|
|
|
|
ms_bJustInitialised = false;
|
|
|
|
else
|
2020-06-29 10:12:43 +00:00
|
|
|
OverlayRender(cam, pFrontBuffer, color, type, bluralpha);
|
2019-05-30 11:35:13 +00:00
|
|
|
if(BlurOn){
|
|
|
|
RwRasterPushContext(pFrontBuffer);
|
|
|
|
RwRasterRenderFast(RwCameraGetRaster(cam), 0, 0);
|
|
|
|
RwRasterPopContext();
|
|
|
|
}
|
2020-06-27 21:01:51 +00:00
|
|
|
#endif
|
2019-05-30 11:35:13 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void
|
2020-06-29 10:12:43 +00:00
|
|
|
CMBlur::OverlayRender(RwCamera *cam, RwRaster *raster, RwRGBA color, int32 type, int32 bluralpha)
|
2019-05-30 11:35:13 +00:00
|
|
|
{
|
|
|
|
int r, g, b, a;
|
|
|
|
|
|
|
|
r = color.red;
|
|
|
|
g = color.green;
|
|
|
|
b = color.blue;
|
|
|
|
a = color.alpha;
|
|
|
|
|
|
|
|
DefinedState();
|
|
|
|
|
2020-06-27 21:01:51 +00:00
|
|
|
switch(type)
|
|
|
|
{
|
|
|
|
case MOTION_BLUR_SECURITY_CAM:
|
2019-05-30 11:35:13 +00:00
|
|
|
r = 0;
|
|
|
|
g = 255;
|
|
|
|
b = 0;
|
|
|
|
a = 128;
|
|
|
|
break;
|
2020-06-27 21:01:51 +00:00
|
|
|
case MOTION_BLUR_INTRO:
|
2019-05-30 11:35:13 +00:00
|
|
|
r = 100;
|
|
|
|
g = 220;
|
|
|
|
b = 230;
|
|
|
|
a = 158;
|
|
|
|
break;
|
2020-06-27 21:01:51 +00:00
|
|
|
case MOTION_BLUR_INTRO2:
|
2019-05-30 11:35:13 +00:00
|
|
|
r = 80;
|
|
|
|
g = 255;
|
|
|
|
b = 230;
|
|
|
|
a = 138;
|
|
|
|
break;
|
2020-06-27 21:01:51 +00:00
|
|
|
case MOTION_BLUR_INTRO3:
|
2019-05-30 11:35:13 +00:00
|
|
|
r = 255;
|
|
|
|
g = 60;
|
|
|
|
b = 60;
|
|
|
|
a = 200;
|
|
|
|
break;
|
2020-06-27 21:01:51 +00:00
|
|
|
case MOTION_BLUR_INTRO4:
|
2019-05-30 11:35:13 +00:00
|
|
|
r = 255;
|
|
|
|
g = 180;
|
|
|
|
b = 180;
|
|
|
|
a = 128;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
if(!BlurOn){
|
2020-05-05 22:53:26 +00:00
|
|
|
// 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;
|
2020-06-29 09:56:50 +00:00
|
|
|
int ovA = type == MOTION_BLUR_SNIPER ? a : a*0.6f;
|
2020-05-05 22:53:26 +00:00
|
|
|
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);
|
2019-05-30 11:35:13 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
RwRenderStateSet(rwRENDERSTATETEXTUREFILTER, (void*)rwFILTERNEAREST);
|
|
|
|
RwRenderStateSet(rwRENDERSTATEFOGENABLE, (void*)FALSE);
|
|
|
|
RwRenderStateSet(rwRENDERSTATEZTESTENABLE, (void*)FALSE);
|
|
|
|
RwRenderStateSet(rwRENDERSTATEZWRITEENABLE, (void*)FALSE);
|
|
|
|
|
2020-05-05 22:53:26 +00:00
|
|
|
RwRenderStateSet(rwRENDERSTATETEXTURERASTER, raster);
|
2019-05-30 11:35:13 +00:00
|
|
|
RwRenderStateSet(rwRENDERSTATEVERTEXALPHAENABLE, (void*)TRUE);
|
2020-05-05 22:53:26 +00:00
|
|
|
RwRenderStateSet(rwRENDERSTATESRCBLEND, (void*)rwBLENDONE);
|
|
|
|
RwRenderStateSet(rwRENDERSTATEDESTBLEND, (void*)rwBLENDONE);
|
|
|
|
|
|
|
|
if(BlurOn){
|
2020-06-29 09:56:50 +00:00
|
|
|
if(type == MOTION_BLUR_SNIPER){
|
2020-05-05 22:53:26 +00:00
|
|
|
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);
|
|
|
|
|
|
|
|
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);
|
|
|
|
}
|
2019-05-30 11:35:13 +00:00
|
|
|
}
|
|
|
|
|
2020-05-05 22:53:26 +00:00
|
|
|
// TODO(MIAMI): drunkness
|
|
|
|
|
|
|
|
// TODO(MIAMI): OverlayRenderFx
|
|
|
|
|
2019-05-30 11:35:13 +00:00
|
|
|
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);
|
|
|
|
}
|
2020-05-15 14:30:25 +00:00
|
|
|
|
2020-06-18 22:10:41 +00:00
|
|
|
void
|
|
|
|
CMBlur::SetDrunkBlur(float drunkness)
|
|
|
|
{
|
|
|
|
Drunkness = clamp(drunkness, 0.0f, 1.0f);
|
|
|
|
}
|
|
|
|
|
2020-05-15 14:30:25 +00:00
|
|
|
void
|
|
|
|
CMBlur::ClearDrunkBlur()
|
|
|
|
{
|
|
|
|
Drunkness = 0.0f;
|
|
|
|
CTimer::SetTimeScale(1.0f);
|
|
|
|
}
|