From 7e136a792f381b4c1d310c7058d779e9e87aeb6c Mon Sep 17 00:00:00 2001 From: aap Date: Tue, 19 Jan 2021 20:42:16 +0100 Subject: [PATCH] work on colourfilters --- src/core/Camera.cpp | 5 +- src/core/re3.cpp | 4 +- src/extras/postfx.cpp | 93 ++++++++++++------ src/extras/postfx.h | 5 +- src/extras/shaders/colourfilterLCS_PS.hlsl | 5 +- src/extras/shaders/obj/colourfilterLCS_PS.cso | Bin 292 -> 308 bytes src/extras/shaders/obj/colourfilterLCS_PS.inc | 11 ++- src/fakerw/fake.cpp | 3 + src/fakerw/rwcore.h | 3 + 9 files changed, 81 insertions(+), 48 deletions(-) diff --git a/src/core/Camera.cpp b/src/core/Camera.cpp index 992c7d74..951b7c41 100644 --- a/src/core/Camera.cpp +++ b/src/core/Camera.cpp @@ -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 diff --git a/src/core/re3.cpp b/src/core/re3.cpp index bbc02d26..12b49c9a 100644 --- a/src/core/re3.cpp +++ b/src/core/re3.cpp @@ -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); diff --git a/src/extras/postfx.cpp b/src/extras/postfx.cpp index 360b4f7a..a9e0604b 100644 --- a/src/extras/postfx.cpp +++ b/src/extras/postfx.cpp @@ -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); diff --git a/src/extras/postfx.h b/src/extras/postfx.h index 9538f8e1..232c151b 100644 --- a/src/extras/postfx.h +++ b/src/extras/postfx.h @@ -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, diff --git a/src/extras/shaders/colourfilterLCS_PS.hlsl b/src/extras/shaders/colourfilterLCS_PS.hlsl index bd91567d..df1beefc 100644 --- a/src/extras/shaders/colourfilterLCS_PS.hlsl +++ b/src/extras/shaders/colourfilterLCS_PS.hlsl @@ -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; } diff --git a/src/extras/shaders/obj/colourfilterLCS_PS.cso b/src/extras/shaders/obj/colourfilterLCS_PS.cso index e5ffa3f191465e8611778f35f764aa98217a7a7b..17f2d6129d7f4e63cfb3fa932ad446cd17f71dfe 100644 GIT binary patch delta 42 tcmZ3&w1sKH7kO3&24+SE_67!qCksetR 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); } diff --git a/src/fakerw/rwcore.h b/src/fakerw/rwcore.h index e5d21865..7a142abd 100644 --- a/src/fakerw/rwcore.h +++ b/src/fakerw/rwcore.h @@ -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);