mirror of
https://git.rip/DMCA_FUCKER/re3.git
synced 2024-12-23 05:30:00 +00:00
work on colourfilters
This commit is contained in:
parent
8baae4c77f
commit
7e136a792f
|
@ -3863,7 +3863,7 @@ CCamera::GetScreenFadeStatus(void)
|
|||
}
|
||||
|
||||
|
||||
|
||||
//--LCS: TODO
|
||||
void
|
||||
CCamera::RenderMotionBlur(void)
|
||||
{
|
||||
|
@ -3872,7 +3872,8 @@ CCamera::RenderMotionBlur(void)
|
|||
|
||||
CMBlur::MotionBlurRender(m_pRwCamera,
|
||||
m_BlurRed, m_BlurGreen, m_BlurBlue,
|
||||
m_motionBlur, m_BlurType, m_imotionBlurAddAlpha);
|
||||
// m_motionBlur, m_BlurType, m_imotionBlurAddAlpha);
|
||||
m_motionBlur, m_BlurType, 32); // hack hack
|
||||
}
|
||||
|
||||
void
|
||||
|
|
|
@ -651,8 +651,8 @@ extern bool gbRenderWorld2;
|
|||
#endif
|
||||
|
||||
#ifdef EXTENDED_COLOURFILTER
|
||||
static const char *filternames[] = { "None", "PS2" };
|
||||
e = DebugMenuAddVar("Render", "Colourfilter", &CPostFX::EffectSwitch, nil, 1, CPostFX::POSTFX_OFF, CPostFX::POSTFX_NORMAL, filternames);
|
||||
static const char *filternames[] = { "None", "PSP", "PS2" };
|
||||
e = DebugMenuAddVar("Render", "Colourfilter", &CPostFX::EffectSwitch, nil, 1, CPostFX::POSTFX_OFF, CPostFX::POSTFX_PS2, filternames);
|
||||
DebugMenuEntrySetWrap(e, true);
|
||||
DebugMenuAddVar("Render", "Intensity", &CPostFX::Intensity, nil, 0.05f, 0, 10.0f);
|
||||
DebugMenuAddVarBool8("Render", "Blur", &CPostFX::BlurOn, nil);
|
||||
|
|
|
@ -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
|
||||
};
|
||||
|
|
|
@ -411,6 +411,9 @@ void RwIm2DVertexSetRecipCameraZ(RwIm2DVertex *vert, RwReal recipz) { vert->setR
|
|||
void RwIm2DVertexSetScreenX(RwIm2DVertex *vert, RwReal scrnx) { vert->setScreenX(scrnx); }
|
||||
void RwIm2DVertexSetScreenY(RwIm2DVertex *vert, RwReal scrny) { vert->setScreenY(scrny); }
|
||||
void RwIm2DVertexSetScreenZ(RwIm2DVertex *vert, RwReal scrnz) { vert->setScreenZ(scrnz); }
|
||||
float RwIm2DVertexGetScreenX(RwIm2DVertex *vert) { return vert->getScreenX(); }
|
||||
float RwIm2DVertexGetScreenY(RwIm2DVertex *vert) { return vert->getScreenY(); }
|
||||
float RwIm2DVertexGetScreenZ(RwIm2DVertex *vert) { return vert->getScreenZ(); }
|
||||
void RwIm2DVertexSetU(RwIm2DVertex *vert, RwReal texU, RwReal recipz) { vert->setU(texU, recipz); }
|
||||
void RwIm2DVertexSetV(RwIm2DVertex *vert, RwReal texV, RwReal recipz) { vert->setV(texV, recipz); }
|
||||
void RwIm2DVertexSetIntRGBA(RwIm2DVertex *vert, RwUInt8 red, RwUInt8 green, RwUInt8 blue, RwUInt8 alpha) { vert->setColor(red, green, blue, alpha); }
|
||||
|
|
|
@ -34,6 +34,9 @@ void RwIm2DVertexSetRecipCameraZ(RwIm2DVertex *vert, RwReal recipz);
|
|||
void RwIm2DVertexSetScreenX(RwIm2DVertex *vert, RwReal scrnx);
|
||||
void RwIm2DVertexSetScreenY(RwIm2DVertex *vert, RwReal scrny);
|
||||
void RwIm2DVertexSetScreenZ(RwIm2DVertex *vert, RwReal scrnz);
|
||||
float RwIm2DVertexGetScreenX(RwIm2DVertex *vert);
|
||||
float RwIm2DVertexGetScreenY(RwIm2DVertex *vert);
|
||||
float RwIm2DVertexGetScreenZ(RwIm2DVertex *vert);
|
||||
void RwIm2DVertexSetU(RwIm2DVertex *vert, RwReal texU, RwReal recipz);
|
||||
void RwIm2DVertexSetV(RwIm2DVertex *vert, RwReal texV, RwReal recipz);
|
||||
void RwIm2DVertexSetIntRGBA(RwIm2DVertex *vert, RwUInt8 red, RwUInt8 green, RwUInt8 blue, RwUInt8 alpha);
|
||||
|
|
Loading…
Reference in a new issue