mirror of
https://github.com/halpz/re3.git
synced 2025-07-26 00:02:45 +00:00
work on colourfilters
This commit is contained in:
@ -16,13 +16,15 @@
|
||||
RwRaster *CPostFX::pFrontBuffer;
|
||||
RwRaster *CPostFX::pBackBuffer;
|
||||
bool CPostFX::bJustInitialised;
|
||||
int CPostFX::EffectSwitch = POSTFX_NORMAL;
|
||||
int CPostFX::EffectSwitch = POSTFX_PS2;
|
||||
bool CPostFX::BlurOn = false;
|
||||
bool CPostFX::MotionBlurOn = false;
|
||||
|
||||
static RwIm2DVertex Vertex[4];
|
||||
static RwIm2DVertex Vertex2[4];
|
||||
static RwImVertexIndex Index[6] = { 0, 1, 2, 0, 2, 3 };
|
||||
static RwIm2DVertex BlurVertex[12];
|
||||
static RwImVertexIndex BlurIndex[18] = { 0, 1, 2, 0, 2, 3, 4, 5, 6, 4, 6, 7, 8, 9, 10, 8, 10, 11 };
|
||||
|
||||
#ifdef RW_D3D9
|
||||
void *colourfilterLCS_PS;
|
||||
@ -205,9 +207,44 @@ CPostFX::Close(void)
|
||||
#endif
|
||||
}
|
||||
|
||||
static float blurOffset = 0.6f;//3.0f/16.0f; // not quite sure sure about this
|
||||
static float blurIntensity = 0.25f;
|
||||
|
||||
void
|
||||
CPostFX::RenderOverlayBlur(RwCamera *cam, int32 r, int32 g, int32 b, int32 a)
|
||||
{
|
||||
memcpy(BlurVertex, Vertex, sizeof(Vertex));
|
||||
memcpy(BlurVertex+4, Vertex, sizeof(Vertex));
|
||||
memcpy(BlurVertex+8, Vertex, sizeof(Vertex));
|
||||
int intensity = 255*blurIntensity;
|
||||
int i;
|
||||
for(i = 0; i < 4; i++){
|
||||
RwIm2DVertexSetScreenX(&BlurVertex[i], RwIm2DVertexGetScreenX(&BlurVertex[i]) + blurOffset);
|
||||
RwIm2DVertexSetIntRGBA(&BlurVertex[i], 255, 255, 255, intensity);
|
||||
}
|
||||
for(i = 4; i < 8; i++){
|
||||
RwIm2DVertexSetScreenX(&BlurVertex[i], RwIm2DVertexGetScreenX(&BlurVertex[i]) + blurOffset);
|
||||
RwIm2DVertexSetScreenY(&BlurVertex[i], RwIm2DVertexGetScreenY(&BlurVertex[i]) + blurOffset);
|
||||
RwIm2DVertexSetIntRGBA(&BlurVertex[i], 255, 255, 255, intensity);
|
||||
}
|
||||
for(i = 8; i < 12; i++){
|
||||
RwIm2DVertexSetScreenY(&BlurVertex[i], RwIm2DVertexGetScreenY(&BlurVertex[i]) + blurOffset);
|
||||
RwIm2DVertexSetIntRGBA(&BlurVertex[i], 255, 255, 255, intensity);
|
||||
}
|
||||
|
||||
RwRenderStateSet(rwRENDERSTATETEXTURERASTER, pBackBuffer);
|
||||
RwRenderStateSet(rwRENDERSTATETEXTUREFILTER, (void*)rwFILTERLINEAR);
|
||||
RwRenderStateSet(rwRENDERSTATEVERTEXALPHAENABLE, (void*)TRUE);
|
||||
RwRenderStateSet(rwRENDERSTATESRCBLEND, (void*)rwBLENDSRCALPHA);
|
||||
RwRenderStateSet(rwRENDERSTATEDESTBLEND, (void*)rwBLENDINVSRCALPHA);
|
||||
|
||||
RwIm2DRenderIndexedPrimitive(rwPRIMTYPETRILIST, BlurVertex, 12, BlurIndex, 18);
|
||||
|
||||
// this sucks: should render colourfilter with blending instead
|
||||
// but can't change equation to subtraction for PSP here
|
||||
GetBackBuffer(cam);
|
||||
|
||||
/* the old way
|
||||
RwRenderStateSet(rwRENDERSTATETEXTURERASTER, pFrontBuffer);
|
||||
RwRenderStateSet(rwRENDERSTATEVERTEXALPHAENABLE, (void*)TRUE);
|
||||
|
||||
@ -240,6 +277,7 @@ CPostFX::RenderOverlayBlur(RwCamera *cam, int32 r, int32 g, int32 b, int32 a)
|
||||
|
||||
RwIm2DRenderIndexedPrimitive(rwPRIMTYPETRILIST, Vertex, 4, Index, 6);
|
||||
RwIm2DRenderIndexedPrimitive(rwPRIMTYPETRILIST, BlurOn ? Vertex2 : Vertex, 4, Index, 6);
|
||||
*/
|
||||
}
|
||||
|
||||
void
|
||||
@ -291,7 +329,7 @@ CPostFX::RenderOverlayShader(RwCamera *cam, int32 r, int32 g, int32 b, int32 a)
|
||||
blurcolors[0] = r*f/255.0f;
|
||||
blurcolors[1] = g*f/255.0f;
|
||||
blurcolors[2] = b*f/255.0f;
|
||||
blurcolors[3] = 30/255.0f;
|
||||
blurcolors[3] = EffectSwitch == POSTFX_PSP ? -1.0f : 1.0f;
|
||||
#ifdef RW_D3D9
|
||||
rw::d3d::d3ddevice->SetPixelShaderConstantF(10, blurcolors, 1);
|
||||
rw::d3d::im2dOverridePS = colourfilterLCS_PS;
|
||||
@ -339,11 +377,8 @@ CPostFX::NeedBackBuffer(void)
|
||||
case POSTFX_SIMPLE:
|
||||
// no actual rendering here
|
||||
return false;
|
||||
case POSTFX_NORMAL:
|
||||
if(MotionBlurOn)
|
||||
return false;
|
||||
else
|
||||
return true;
|
||||
case POSTFX_PSP:
|
||||
case POSTFX_PS2:
|
||||
case POSTFX_MOBILE:
|
||||
return true;
|
||||
}
|
||||
@ -354,24 +389,11 @@ bool
|
||||
CPostFX::NeedFrontBuffer(int32 type)
|
||||
{
|
||||
// Last frame -- needed for motion blur
|
||||
if(CMBlur::Drunkness > 0.0f)
|
||||
if(MotionBlurOn)
|
||||
return true;
|
||||
if(type == MOTION_BLUR_SNIPER)
|
||||
return true;
|
||||
|
||||
switch(EffectSwitch){
|
||||
case POSTFX_OFF:
|
||||
case POSTFX_SIMPLE:
|
||||
// no actual rendering here
|
||||
return false;
|
||||
case POSTFX_NORMAL:
|
||||
if(MotionBlurOn)
|
||||
return true;
|
||||
else
|
||||
return false;
|
||||
case POSTFX_MOBILE:
|
||||
return false;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
@ -386,11 +408,17 @@ CPostFX::GetBackBuffer(RwCamera *cam)
|
||||
void
|
||||
CPostFX::Render(RwCamera *cam, uint32 red, uint32 green, uint32 blue, uint32 blur, int32 type, uint32 bluralpha)
|
||||
{
|
||||
// LCS PS2 blur is drawn in three passes:
|
||||
// blend frame with current frame 3 times to blur a bit
|
||||
// blend one more time with colour filter
|
||||
// motion blur like normal
|
||||
|
||||
if(pFrontBuffer == nil)
|
||||
Open(cam);
|
||||
assert(pFrontBuffer);
|
||||
assert(pBackBuffer);
|
||||
|
||||
/* // LCS: don't need that anymore
|
||||
if(type == MOTION_BLUR_LIGHT_SCENE){
|
||||
SmoothColor(red, green, blue, blur);
|
||||
red = AvgRed;
|
||||
@ -398,6 +426,7 @@ CPostFX::Render(RwCamera *cam, uint32 red, uint32 green, uint32 blue, uint32 blu
|
||||
blue = AvgBlue;
|
||||
blur = AvgAlpha;
|
||||
}
|
||||
*/
|
||||
|
||||
if(NeedBackBuffer())
|
||||
GetBackBuffer(cam);
|
||||
@ -405,10 +434,15 @@ CPostFX::Render(RwCamera *cam, uint32 red, uint32 green, uint32 blue, uint32 blu
|
||||
DefinedState();
|
||||
|
||||
RwRenderStateSet(rwRENDERSTATEFOGENABLE, (void*)FALSE);
|
||||
RwRenderStateSet(rwRENDERSTATETEXTUREFILTER, (void*)rwFILTERNEAREST);
|
||||
RwRenderStateSet(rwRENDERSTATEZTESTENABLE, (void*)FALSE);
|
||||
RwRenderStateSet(rwRENDERSTATEZWRITEENABLE, (void*)FALSE);
|
||||
|
||||
if(BlurOn)
|
||||
RenderOverlayBlur(cam, 0, 0, 0, 0);
|
||||
|
||||
RwRenderStateSet(rwRENDERSTATETEXTUREFILTER, (void*)rwFILTERNEAREST);
|
||||
|
||||
// TODO(LCS): check this out
|
||||
if(type == MOTION_BLUR_SNIPER){
|
||||
if(!bJustInitialised)
|
||||
RenderOverlaySniper(cam, red, green, blue, blur);
|
||||
@ -417,21 +451,16 @@ CPostFX::Render(RwCamera *cam, uint32 red, uint32 green, uint32 blue, uint32 blu
|
||||
case POSTFX_SIMPLE:
|
||||
// no actual rendering here
|
||||
break;
|
||||
case POSTFX_NORMAL:
|
||||
if(MotionBlurOn){
|
||||
if(!bJustInitialised)
|
||||
RenderOverlayBlur(cam, red, green, blue, blur);
|
||||
}else{
|
||||
RenderOverlayShader(cam, red, green, blue, blur);
|
||||
}
|
||||
break;
|
||||
case POSTFX_PSP:
|
||||
case POSTFX_PS2:
|
||||
case POSTFX_MOBILE:
|
||||
RenderOverlayShader(cam, red, green, blue, blur);
|
||||
break;
|
||||
}
|
||||
|
||||
if(!bJustInitialised)
|
||||
RenderMotionBlur(cam, 175.0f * CMBlur::Drunkness);
|
||||
if(MotionBlurOn)
|
||||
if(!bJustInitialised)
|
||||
RenderMotionBlur(cam, bluralpha);
|
||||
|
||||
RwRenderStateSet(rwRENDERSTATEZTESTENABLE, (void*)TRUE);
|
||||
RwRenderStateSet(rwRENDERSTATEZWRITEENABLE, (void*)TRUE);
|
||||
|
@ -7,9 +7,8 @@ class CPostFX
|
||||
public:
|
||||
enum {
|
||||
POSTFX_OFF,
|
||||
// POSTFX_SIMPLE,
|
||||
POSTFX_NORMAL,
|
||||
// POSTFX_MOBILE
|
||||
POSTFX_PSP,
|
||||
POSTFX_PS2,
|
||||
|
||||
// not so sensible for the moment
|
||||
POSTFX_SIMPLE = -1,
|
||||
|
@ -1,13 +1,10 @@
|
||||
sampler2D tex : register(s0);
|
||||
float4 blurcol : register(c10);
|
||||
|
||||
//float4 blurcols[10] : register(c15);
|
||||
|
||||
|
||||
float4 main(in float2 texcoord : TEXCOORD0) : COLOR0
|
||||
{
|
||||
float4 dst = tex2D(tex, texcoord.xy);
|
||||
dst += dst*blurcol;
|
||||
dst += dst*blurcol*blurcol.a;
|
||||
dst.a = 1.0;
|
||||
return dst;
|
||||
}
|
||||
|
Binary file not shown.
@ -19,9 +19,10 @@ static unsigned char colourfilterLCS_PS_cso[] = {
|
||||
0x1f, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x03, 0xb0,
|
||||
0x1f, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x90, 0x00, 0x08, 0x0f, 0xa0,
|
||||
0x42, 0x00, 0x00, 0x03, 0x00, 0x00, 0x0f, 0x80, 0x00, 0x00, 0xe4, 0xb0,
|
||||
0x00, 0x08, 0xe4, 0xa0, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x07, 0x80,
|
||||
0x00, 0x00, 0xe4, 0x80, 0x0a, 0x00, 0xe4, 0xa0, 0x00, 0x00, 0xe4, 0x80,
|
||||
0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x08, 0x80, 0x00, 0x00, 0x00, 0xa0,
|
||||
0x01, 0x00, 0x00, 0x02, 0x00, 0x08, 0x0f, 0x80, 0x00, 0x00, 0xe4, 0x80,
|
||||
0xff, 0xff, 0x00, 0x00
|
||||
0x00, 0x08, 0xe4, 0xa0, 0x05, 0x00, 0x00, 0x03, 0x01, 0x00, 0x07, 0x80,
|
||||
0x00, 0x00, 0xe4, 0x80, 0x0a, 0x00, 0xe4, 0xa0, 0x04, 0x00, 0x00, 0x04,
|
||||
0x00, 0x00, 0x07, 0x80, 0x01, 0x00, 0xe4, 0x80, 0x0a, 0x00, 0xff, 0xa0,
|
||||
0x00, 0x00, 0xe4, 0x80, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x08, 0x80,
|
||||
0x00, 0x00, 0x00, 0xa0, 0x01, 0x00, 0x00, 0x02, 0x00, 0x08, 0x0f, 0x80,
|
||||
0x00, 0x00, 0xe4, 0x80, 0xff, 0xff, 0x00, 0x00
|
||||
};
|
||||
|
Reference in New Issue
Block a user