Merged both dual pass methods and made them selectable via the INI file

This commit is contained in:
Silent 2014-11-30 15:17:47 +01:00
parent 2f3e170922
commit 79758df9b6

View file

@ -372,11 +372,11 @@ RpAtomic* OnePassAlphaRender(RpAtomic* atomic)
return atomic; return atomic;
} }
RpAtomic* TwoPassAlphaRender(RpAtomic* atomic) RpAtomic* TwoPassAlphaRender_aap(RpAtomic* atomic)
{ {
// For cutscenes, fall back to one-pass render // For cutscenes, fall back to one-pass render
if ( CCutsceneMgr__ms_running && !CanSeeOutSideFromCurrArea() ) if ( CCutsceneMgr__ms_running && !CanSeeOutSideFromCurrArea() )
return OnePassAlphaRender(atomic); return AtomicDefaultRenderCallBack(atomic);
int nPushedAlpha, nAlphaFunction; int nPushedAlpha, nAlphaFunction;
int nZWrite; int nZWrite;
@ -412,11 +412,11 @@ RpAtomic* TwoPassAlphaRender(RpAtomic* atomic)
return atomic; return atomic;
} }
RpAtomic* TwoPassAlphaRenderSilent(RpAtomic* atomic) RpAtomic* TwoPassAlphaRender_Silent(RpAtomic* atomic)
{ {
// For cutscenes, fall back to one-pass render // For cutscenes, fall back to one-pass render
if ( CCutsceneMgr__ms_running && !CanSeeOutSideFromCurrArea() ) if ( CCutsceneMgr__ms_running && !CanSeeOutSideFromCurrArea() )
return OnePassAlphaRender(atomic); return AtomicDefaultRenderCallBack(atomic);
int nPushedAlpha, nAlphaFunction; int nPushedAlpha, nAlphaFunction;
int nZWrite; int nZWrite;
@ -465,6 +465,7 @@ RpAtomic* StaticPropellerRender(RpAtomic* pAtomic)
return pAtomic; return pAtomic;
} }
template <RpAtomic* renderer(RpAtomic*)>
RpAtomic* RenderBigVehicleActomic(RpAtomic* pAtomic, float fComp) RpAtomic* RenderBigVehicleActomic(RpAtomic* pAtomic, float fComp)
{ {
UNREFERENCED_PARAMETER(fComp); UNREFERENCED_PARAMETER(fComp);
@ -472,7 +473,7 @@ RpAtomic* RenderBigVehicleActomic(RpAtomic* pAtomic, float fComp)
const char* pNodeName = GetFrameNodeName(RpAtomicGetFrame(pAtomic)); const char* pNodeName = GetFrameNodeName(RpAtomicGetFrame(pAtomic));
if ( !strncmp(pNodeName, "moving_prop", 11) ) if ( !strncmp(pNodeName, "moving_prop", 11) )
return TwoPassAlphaRender(pAtomic); return renderer(pAtomic);
if ( !strncmp(pNodeName, "static_prop", 11) ) if ( !strncmp(pNodeName, "static_prop", 11) )
return StaticPropellerRender(pAtomic); return StaticPropellerRender(pAtomic);
@ -497,10 +498,16 @@ void SetRendererForAtomic(RpAtomic* pAtomic)
BOOL bHasAlpha = FALSE; BOOL bHasAlpha = FALSE;
RpGeometryForAllMaterials(RpAtomicGetGeometry(pAtomic), AlphaTest, &bHasAlpha); RpGeometryForAllMaterials(RpAtomicGetGeometry(pAtomic), AlphaTest, &bHasAlpha);
// if ( bHasAlpha ) if ( bHasAlpha )
RpAtomicSetRenderCallBack(pAtomic, renderer); RpAtomicSetRenderCallBack(pAtomic, renderer);
} }
template <RpAtomic* renderer(RpAtomic*)>
void SetRendererForAtomic_NoTest(RpAtomic* pAtomic)
{
RpAtomicSetRenderCallBack(pAtomic, renderer);
}
void RenderWeapon(CPed* pPed) void RenderWeapon(CPed* pPed)
{ {
pPed->RenderWeapon(false, false); pPed->RenderWeapon(false, false);
@ -549,13 +556,14 @@ void RenderWeaponPedsForPC()
RwRenderStateSet(rwRENDERSTATEVERTEXALPHAENABLE, reinterpret_cast<void*>(nAlphaBlending)); RwRenderStateSet(rwRENDERSTATEVERTEXALPHAENABLE, reinterpret_cast<void*>(nAlphaBlending));
}*/ }*/
template <RpAtomic* renderer(RpAtomic*)>
RpAtomic* RenderPedCB(RpAtomic* pAtomic) RpAtomic* RenderPedCB(RpAtomic* pAtomic)
{ {
BOOL bHasAlpha = FALSE; BOOL bHasAlpha = FALSE;
RpGeometryForAllMaterials(RpAtomicGetGeometry(pAtomic), AlphaTest, &bHasAlpha); RpGeometryForAllMaterials(RpAtomicGetGeometry(pAtomic), AlphaTest, &bHasAlpha);
if ( bHasAlpha ) if ( bHasAlpha )
return TwoPassAlphaRender(pAtomic); return renderer(pAtomic);
return AtomicDefaultRenderCallBack(pAtomic); return AtomicDefaultRenderCallBack(pAtomic);
} }
@ -1706,22 +1714,40 @@ BOOL InjectDelayedPatches_10()
if ( !bSARender ) if ( !bSARender )
{ {
// Twopass rendering (experimental) // Twopass rendering (experimental)
unsigned int dwTwoPassMethod = GetPrivateProfileIntW(L"SilentPatch", L"TwoPassRendering", 0, wcModulePath);
Patch<BYTE>(0x4C441E, 0x57); Patch<BYTE>(0x4C441E, 0x57);
Patch<DWORD>(0x4C4424, 0x5F04C483); Patch<DWORD>(0x4C4424, 0x5F04C483);
Patch<DWORD>(0x4C4428, 0x0004C25E); Patch<DWORD>(0x4C4428, 0x0004C25E);
if ( GetPrivateProfileIntW(L"SilentPatch", L"TwoPassRendering", FALSE, wcModulePath) != FALSE ) if ( dwTwoPassMethod == 1 )
{ {
InjectHook(0x4C441F, SetRendererForAtomic<TwoPassAlphaRender>, PATCH_CALL); // Silent's twopass
InjectHook(0x4C441F, SetRendererForAtomic<TwoPassAlphaRender_Silent>, PATCH_CALL);
Patch<const void*>(0x7341D9, TwoPassAlphaRender_Silent);
Patch<const void*>(0x734127, TwoPassAlphaRender_Silent);
Patch(0x73445E, RenderBigVehicleActomic<TwoPassAlphaRender_Silent>);
// Twopass for peds // Twopass for peds
InjectHook(0x733614, RenderPedCB); InjectHook(0x733614, RenderPedCB<TwoPassAlphaRender_Silent>);
}
else if ( dwTwoPassMethod == 2 )
{
// aap's twopass
InjectHook(0x4C441F, SetRendererForAtomic_NoTest<TwoPassAlphaRender_aap>, PATCH_CALL);
Patch<const void*>(0x7341D9, TwoPassAlphaRender_aap);
Patch<const void*>(0x734127, TwoPassAlphaRender_aap);
Patch(0x73445E, RenderBigVehicleActomic<TwoPassAlphaRender_aap>);
// Twopass for peds
InjectHook(0x733614, RenderPedCB<TwoPassAlphaRender_aap>);
} }
else else
{ {
Patch<const void*>(0x7341D9, TwoPassAlphaRender_aap);
Patch<const void*>(0x734127, TwoPassAlphaRender_aap);
Patch(0x73445E, RenderBigVehicleActomic<TwoPassAlphaRender_aap>);
InjectHook(0x4C441F, SetRendererForAtomic<OnePassAlphaRender>, PATCH_CALL); InjectHook(0x4C441F, SetRendererForAtomic<OnePassAlphaRender>, PATCH_CALL);
} }
if ( !bSAMP && GetPrivateProfileIntW(L"SilentPatch", L"NVCShader", FALSE, wcModulePath) != FALSE ) if ( !bSAMP && GetPrivateProfileIntW(L"SilentPatch", L"NVCShader", TRUE, wcModulePath) != FALSE )
{ {
// Shaders! // Shaders!
// plugin-sdk compatibility // plugin-sdk compatibility
@ -1896,22 +1922,40 @@ BOOL InjectDelayedPatches_11()
if ( !bSARender ) if ( !bSARender )
{ {
// Twopass rendering (experimental) // Twopass rendering (experimental)
unsigned int dwTwoPassMethod = GetPrivateProfileIntW(L"SilentPatch", L"TwoPassRendering", 0, wcModulePath);
Patch<BYTE>(0x4C449E, 0x57); Patch<BYTE>(0x4C449E, 0x57);
Patch<DWORD>(0x4C44A4, 0x5F04C483); Patch<DWORD>(0x4C44A4, 0x5F04C483);
Patch<DWORD>(0x4C44A8, 0x0004C25E); Patch<DWORD>(0x4C44A8, 0x0004C25E);
if ( GetPrivateProfileIntW(L"SilentPatch", L"TwoPassRendering", FALSE, wcModulePath) != FALSE ) if ( dwTwoPassMethod == 1 )
{ {
InjectHook(0x4C449F, SetRendererForAtomic<TwoPassAlphaRender>, PATCH_CALL); // Silent's twopass
InjectHook(0x4C449F, SetRendererForAtomic<TwoPassAlphaRender_Silent>, PATCH_CALL);
Patch<const void*>(0x734A09, TwoPassAlphaRender_Silent);
Patch<const void*>(0x734957, TwoPassAlphaRender_Silent);
Patch(0x734C8E, RenderBigVehicleActomic<TwoPassAlphaRender_Silent>);
// Twopass for peds // Twopass for peds
InjectHook(0x733E44, RenderPedCB); InjectHook(0x733E44, RenderPedCB<TwoPassAlphaRender_Silent>);
}
else if ( dwTwoPassMethod == 2 )
{
// aap's twopass
InjectHook(0x4C449F, SetRendererForAtomic_NoTest<TwoPassAlphaRender_aap>, PATCH_CALL);
Patch<const void*>(0x734A09, TwoPassAlphaRender_aap);
Patch<const void*>(0x734957, TwoPassAlphaRender_aap);
Patch(0x734C8E, RenderBigVehicleActomic<TwoPassAlphaRender_aap>);
// Twopass for peds
InjectHook(0x733E44, RenderPedCB<TwoPassAlphaRender_aap>);
} }
else else
{ {
InjectHook(0x4C449F, SetRendererForAtomic<OnePassAlphaRender>, PATCH_CALL); InjectHook(0x4C449F, SetRendererForAtomic<OnePassAlphaRender>, PATCH_CALL);
Patch<const void*>(0x734A09, TwoPassAlphaRender_aap);
Patch<const void*>(0x734957, TwoPassAlphaRender_aap);
Patch(0x734C8E, RenderBigVehicleActomic<TwoPassAlphaRender_aap>);
} }
if ( !bSAMP && GetPrivateProfileIntW(L"SilentPatch", L"NVCShader", FALSE, wcModulePath) != FALSE ) if ( !bSAMP && GetPrivateProfileIntW(L"SilentPatch", L"NVCShader", TRUE, wcModulePath) != FALSE )
{ {
// Shaders! // Shaders!
// plugin-sdk compatibility // plugin-sdk compatibility
@ -2094,22 +2138,40 @@ BOOL InjectDelayedPatches_Steam()
if ( !bSARender ) if ( !bSARender )
{ {
// Twopass rendering (experimental) // Twopass rendering (experimental)
unsigned int dwTwoPassMethod = GetPrivateProfileIntW(L"SilentPatch", L"TwoPassRendering", 0, wcModulePath);
Patch<BYTE>(0x4CEBF3, 0x57); Patch<BYTE>(0x4CEBF3, 0x57);
Patch<DWORD>(0x4CEBF9, 0xC25E5F5F); Patch<DWORD>(0x4CEBF9, 0xC25E5F5F);
Patch<WORD>(0x4CEBFD, 0x0004); Patch<WORD>(0x4CEBFD, 0x0004);
if ( GetPrivateProfileIntW(L"SilentPatch", L"TwoPassRendering", FALSE, wcModulePath) != FALSE ) if ( dwTwoPassMethod == 1 )
{ {
InjectHook(0x4CEBF4, SetRendererForAtomic<TwoPassAlphaRender>, PATCH_CALL); // Silent's twopass
InjectHook(0x4CEBF4, SetRendererForAtomic<TwoPassAlphaRender_Silent>, PATCH_CALL);
Patch<const void*>(0x76E230, TwoPassAlphaRender_Silent);
Patch<const void*>(0x76E160, TwoPassAlphaRender_Silent);
Patch(0x76E4F0, RenderBigVehicleActomic<TwoPassAlphaRender_Silent>);
// Twopass for peds // Twopass for peds
InjectHook(0x76D88E, RenderPedCB); InjectHook(0x76D88E, RenderPedCB<TwoPassAlphaRender_Silent>);
}
else if ( dwTwoPassMethod == 2 )
{
// aap's twopass
InjectHook(0x4CEBF4, SetRendererForAtomic_NoTest<TwoPassAlphaRender_aap>, PATCH_CALL);
Patch<const void*>(0x76E230, TwoPassAlphaRender_aap);
Patch<const void*>(0x76E160, TwoPassAlphaRender_aap);
Patch(0x76E4F0, RenderBigVehicleActomic<TwoPassAlphaRender_aap>);
// Twopass for peds
InjectHook(0x76D88E, RenderPedCB<TwoPassAlphaRender_aap>);
} }
else else
{ {
InjectHook(0x4CEBF4, SetRendererForAtomic<OnePassAlphaRender>, PATCH_CALL); InjectHook(0x4CEBF4, SetRendererForAtomic<OnePassAlphaRender>, PATCH_CALL);
Patch<const void*>(0x76E230, TwoPassAlphaRender_aap);
Patch<const void*>(0x76E160, TwoPassAlphaRender_aap);
Patch(0x76E4F0, RenderBigVehicleActomic<TwoPassAlphaRender_aap>);
} }
if ( !bSAMP && GetPrivateProfileIntW(L"SilentPatch", L"NVCShader", FALSE, wcModulePath) != FALSE ) if ( !bSAMP && GetPrivateProfileIntW(L"SilentPatch", L"NVCShader", TRUE, wcModulePath) != FALSE )
{ {
// Shaders! // Shaders!
// plugin-sdk compatibility // plugin-sdk compatibility
@ -2271,9 +2333,6 @@ void Patch_SA_10()
InjectHook(0x6CAB70, &CPlane::Render_Stub, PATCH_JUMP); InjectHook(0x6CAB70, &CPlane::Render_Stub, PATCH_JUMP);
InjectHook(0x6C4400, &CHeli::Render_Stub, PATCH_JUMP); InjectHook(0x6C4400, &CHeli::Render_Stub, PATCH_JUMP);
//InjectHook(0x553318, RenderAlphaAtomics); //InjectHook(0x553318, RenderAlphaAtomics);
Patch<const void*>(0x7341D9, TwoPassAlphaRender);
Patch<const void*>(0x734127, TwoPassAlphaRender);
Patch<const void*>(0x73445E, RenderBigVehicleActomic);
//Patch<const void*>(0x73406E, TwoPassAlphaRender); //Patch<const void*>(0x73406E, TwoPassAlphaRender);
// Boats // Boats
@ -2524,9 +2583,6 @@ void Patch_SA_11()
// Heli rotors // Heli rotors
InjectHook(0x6CB390, &CPlane::Render_Stub, PATCH_JUMP); InjectHook(0x6CB390, &CPlane::Render_Stub, PATCH_JUMP);
InjectHook(0x6C4C20, &CHeli::Render_Stub, PATCH_JUMP); InjectHook(0x6C4C20, &CHeli::Render_Stub, PATCH_JUMP);
Patch<const void*>(0x734A09, TwoPassAlphaRender);
Patch<const void*>(0x734957, TwoPassAlphaRender);
Patch<const void*>(0x734C8E, RenderBigVehicleActomic);
// RefFix // RefFix
static const float fRefZVal = 1.0f; static const float fRefZVal = 1.0f;
@ -2772,9 +2828,6 @@ void Patch_SA_Steam()
// Heli rotors // Heli rotors
InjectHook(0x700620, &CPlane::Render_Stub, PATCH_JUMP); InjectHook(0x700620, &CPlane::Render_Stub, PATCH_JUMP);
InjectHook(0x6F9550, &CHeli::Render_Stub, PATCH_JUMP); InjectHook(0x6F9550, &CHeli::Render_Stub, PATCH_JUMP);
Patch<const void*>(0x76E230, TwoPassAlphaRender);
Patch<const void*>(0x76E160, TwoPassAlphaRender);
Patch<const void*>(0x76E4F0, RenderBigVehicleActomic);
// RefFix // RefFix
static const float fRefZVal = 1.0f; static const float fRefZVal = 1.0f;