Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit c2b75c1

Browse files
authored
Postfx stage fix (#3478)
Fixes #3457
1 parent af4f7fa commit c2b75c1

File tree

8 files changed

+56
-16
lines changed

8 files changed

+56
-16
lines changed

‎Client/core/CCore.cpp‎

Lines changed: 13 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1787,6 +1787,19 @@ void CCore::UpdateRecentlyPlayed()
17871787
CCore::GetSingleton().SaveConfig();
17881788
}
17891789

1790+
void CCore::OnPostColorFilterRender()
1791+
{
1792+
if (!CGraphics::GetSingleton().HasLine3DPostFXQueueItems() && !CGraphics::GetSingleton().HasPrimitive3DPostFXQueueItems())
1793+
return;
1794+
1795+
CGraphics::GetSingleton().EnteringMTARenderZone();
1796+
1797+
CGraphics::GetSingleton().DrawPrimitive3DPostFXQueue();
1798+
CGraphics::GetSingleton().DrawLine3DPostFXQueue();
1799+
1800+
CGraphics::GetSingleton().LeavingMTARenderZone();
1801+
}
1802+
17901803
void CCore::ApplyCoreInitSettings()
17911804
{
17921805
#if (_WIN32_WINNT >= _WIN32_WINNT_LONGHORN) // Windows Vista
@@ -2010,22 +2023,6 @@ void CCore::OnPreFxRender()
20102023
//
20112024
void CCore::OnPreHUDRender()
20122025
{
2013-
IDirect3DDevice9* pDevice = CGraphics::GetSingleton().GetDevice();
2014-
2015-
if (CGraphics::GetSingleton().HasLine3DPostFXQueueItems() || CGraphics::GetSingleton().HasPrimitive3DPostFXQueueItems())
2016-
{
2017-
/*
2018-
Although MTA render zones are expensive, we should use them twice in the bounds of the function
2019-
because some of render states from PostFX drain to the 2D part of the frame.
2020-
*/
2021-
CGraphics::GetSingleton().EnteringMTARenderZone();
2022-
2023-
CGraphics::GetSingleton().DrawPrimitive3DPostFXQueue();
2024-
CGraphics::GetSingleton().DrawLine3DPostFXQueue();
2025-
2026-
CGraphics::GetSingleton().LeavingMTARenderZone();
2027-
}
2028-
20292026
CGraphics::GetSingleton().EnteringMTARenderZone();
20302027

20312028
// Maybe capture screen and other stuff

‎Client/core/CCore.h‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -289,6 +289,8 @@ class CCore : public CCoreInterface, public CSingleton<CCore>
289289
const SString& GetLastConnectedServerName() const { return m_strLastConnectedServerName; }
290290
void SetLastConnectedServerName(const SString& strServerName) { m_strLastConnectedServerName = strServerName; }
291291

292+
void OnPostColorFilterRender() override;
293+
292294
private:
293295
void ApplyCoreInitSettings();
294296

‎Client/mods/deathmatch/logic/CClientGame.cpp‎

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -271,6 +271,7 @@ CClientGame::CClientGame(bool bLocalPlay) : m_ServerInfo(new CServerInfo())
271271
g_pMultiplayer->SetPostWorldProcessHandler(CClientGame::StaticPostWorldProcessHandler);
272272
g_pMultiplayer->SetPostWorldProcessPedsAfterPreRenderHandler(CClientGame::StaticPostWorldProcessPedsAfterPreRenderHandler);
273273
g_pMultiplayer->SetPreFxRenderHandler(CClientGame::StaticPreFxRenderHandler);
274+
g_pMultiplayer->SetPostColorFilterRenderHandler(CClientGame::StaticPostColorFilterRenderHandler);
274275
g_pMultiplayer->SetPreHudRenderHandler(CClientGame::StaticPreHudRenderHandler);
275276
g_pMultiplayer->DisableCallsToCAnimBlendNode(false);
276277
g_pMultiplayer->SetCAnimBlendAssocDestructorHandler(CClientGame::StaticCAnimBlendAssocDestructorHandler);
@@ -3607,6 +3608,11 @@ void CClientGame::StaticPreFxRenderHandler()
36073608
g_pCore->OnPreFxRender();
36083609
}
36093610

3611+
void CClientGame::StaticPostColorFilterRenderHandler()
3612+
{
3613+
g_pCore->OnPostColorFilterRender();
3614+
}
3615+
36103616
void CClientGame::StaticPreHudRenderHandler()
36113617
{
36123618
g_pCore->OnPreHUDRender();

‎Client/mods/deathmatch/logic/CClientGame.h‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -511,6 +511,7 @@ class CClientGame
511511
static void StaticPostWorldProcessHandler();
512512
static void StaticPostWorldProcessPedsAfterPreRenderHandler();
513513
static void StaticPreFxRenderHandler();
514+
static void StaticPostColorFilterRenderHandler();
514515
static void StaticPreHudRenderHandler();
515516
static void StaticCAnimBlendAssocDestructorHandler(CAnimBlendAssociationSAInterface* pThis);
516517
static CAnimBlendAssociationSAInterface* StaticAddAnimationHandler(RpClump* pClump, AssocGroupId animGroup, AnimationId animID);

‎Client/multiplayer_sa/CMultiplayerSA.cpp‎

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -198,6 +198,9 @@ DWORD RETURN_ProcessEntityCollision = 0x4185C0;
198198
#define HOOKPOS_PreFxRender 0x049E650
199199
DWORD RETURN_PreFxRender = 0x0404D1E;
200200

201+
#define HOOKPOS_PostColorFilterRender 0x705099
202+
DWORD RETURN_PostColorFilterRender = 0x70509E;
203+
201204
#define HOOKPOS_PreHUDRender 0x053EAD8
202205
DWORD RETURN_PreHUDRender = 0x053EADD;
203206

@@ -377,6 +380,7 @@ PostWorldProcessHandler* m_pPostWorldProcessHandler = NULL;
377380
PostWorldProcessPedsAfterPreRenderHandler* m_postWorldProcessPedsAfterPreRenderHandler = nullptr;
378381
IdleHandler* m_pIdleHandler = NULL;
379382
PreFxRenderHandler* m_pPreFxRenderHandler = NULL;
383+
PostColorFilterRenderHandler* m_pPostColorFilterRenderHandler = nullptr;
380384
PreHudRenderHandler* m_pPreHudRenderHandler = NULL;
381385
ProcessCollisionHandler* m_pProcessCollisionHandler = NULL;
382386
HeliKillHandler* m_pHeliKillHandler = NULL;
@@ -479,6 +483,7 @@ void HOOK_Transmission_CalculateDriveAcceleration();
479483
void HOOK_isVehDriveTypeNotRWD();
480484
void HOOK_isVehDriveTypeNotFWD();
481485
void HOOK_PreFxRender();
486+
void HOOK_PostColorFilterRender();
482487
void HOOK_PreHUDRender();
483488

484489
void HOOK_CTrafficLights_GetPrimaryLightState();
@@ -657,6 +662,7 @@ void CMultiplayerSA::InitHooks()
657662
HookInstall(HOOKPOS_VehColCB, (DWORD)HOOK_VehColCB, 29);
658663
HookInstall(HOOKPOS_VehCol, (DWORD)HOOK_VehCol, 9);
659664
HookInstall(HOOKPOS_PreFxRender, (DWORD)HOOK_PreFxRender, 5);
665+
HookInstall(HOOKPOS_PostColorFilterRender, (DWORD)HOOK_PostColorFilterRender, 5);
660666
HookInstall(HOOKPOS_PreHUDRender, (DWORD)HOOK_PreHUDRender, 5);
661667
HookInstall(HOOKPOS_CAutomobile__ProcessSwingingDoor, (DWORD)HOOK_CAutomobile__ProcessSwingingDoor, 7);
662668

@@ -2315,6 +2321,11 @@ void CMultiplayerSA::SetPreFxRenderHandler(PreFxRenderHandler* pHandler)
23152321
m_pPreFxRenderHandler = pHandler;
23162322
}
23172323

2324+
void CMultiplayerSA::SetPostColorFilterRenderHandler(PostColorFilterRenderHandler* pHandler)
2325+
{
2326+
m_pPostColorFilterRenderHandler = pHandler;
2327+
}
2328+
23182329
void CMultiplayerSA::SetPreHudRenderHandler(PreHudRenderHandler* pHandler)
23192330
{
23202331
m_pPreHudRenderHandler = pHandler;
@@ -4780,6 +4791,24 @@ void _declspec(naked) HOOK_PreFxRender()
47804791
}
47814792
}
47824793

4794+
// Hooked from 00705099 5 bytes
4795+
void _declspec(naked) HOOK_PostColorFilterRender()
4796+
{
4797+
_asm
4798+
{
4799+
pushad
4800+
}
4801+
4802+
if (m_pPostColorFilterRenderHandler) m_pPostColorFilterRenderHandler();
4803+
4804+
_asm
4805+
{
4806+
popad
4807+
mov al, ds:0C402BAh
4808+
jmp RETURN_PostColorFilterRender // 0070509E
4809+
}
4810+
}
4811+
47834812
// Hooked from 0053EAD8 5 bytes
47844813
void _declspec(naked) HOOK_PreHUDRender()
47854814
{

‎Client/multiplayer_sa/CMultiplayerSA.h‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,7 @@ class CMultiplayerSA : public CMultiplayer
115115
void SetPostWorldProcessPedsAfterPreRenderHandler(PostWorldProcessPedsAfterPreRenderHandler* pHandler);
116116
void SetIdleHandler(IdleHandler* pHandler);
117117
void SetPreFxRenderHandler(PreFxRenderHandler* pHandler);
118+
void SetPostColorFilterRenderHandler(PostColorFilterRenderHandler* pHandler) override;
118119
void SetPreHudRenderHandler(PreHudRenderHandler* pHandler);
119120
void DisableCallsToCAnimBlendNode(bool bDisableCalls);
120121
void SetCAnimBlendAssocDestructorHandler(CAnimBlendAssocDestructorHandler* pHandler);

‎Client/sdk/core/CCoreInterface.h‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -192,6 +192,8 @@ class CCoreInterface
192192

193193
virtual const SString& GetLastConnectedServerName() const = 0;
194194
virtual void SetLastConnectedServerName(const SString& strServerName) = 0;
195+
196+
virtual void OnPostColorFilterRender() = 0;
195197
};
196198

197199
class CClientTime

‎Client/sdk/multiplayer/CMultiplayer.h‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,7 @@ typedef void(PostWorldProcessHandler)();
102102
typedef void(PostWorldProcessPedsAfterPreRenderHandler)();
103103
typedef void(IdleHandler)();
104104
typedef void(PreFxRenderHandler)();
105+
typedef void(PostColorFilterRenderHandler)();
105106
typedef void(PreHudRenderHandler)();
106107
typedef CAnimBlendAssociationSAInterface*(AddAnimationHandler)(RpClump* pClump, AssocGroupId animGroup, AnimationId animID);
107108
typedef CAnimBlendAssociationSAInterface*(AddAnimationAndSyncHandler)(RpClump* pClump, CAnimBlendAssociationSAInterface* pAnimAssocToSyncWith,
@@ -231,6 +232,7 @@ class CMultiplayer
231232
virtual void SetPostWorldProcessPedsAfterPreRenderHandler(PostWorldProcessPedsAfterPreRenderHandler* pHandler) = 0;
232233
virtual void SetIdleHandler(IdleHandler* pHandler) = 0;
233234
virtual void SetPreFxRenderHandler(PreFxRenderHandler* pHandler) = 0;
235+
virtual void SetPostColorFilterRenderHandler(PostColorFilterRenderHandler* pHandler) = 0;
234236
virtual void SetPreHudRenderHandler(PreHudRenderHandler* pHandler) = 0;
235237
virtual void DisableCallsToCAnimBlendNode(bool bDisableCalls) = 0;
236238
virtual void SetCAnimBlendAssocDestructorHandler(CAnimBlendAssocDestructorHandler* pHandler) = 0;

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /