Skip to content

Commit c8c809c

Browse files
authored
feat(headless): Implement ParticleSystemManagerDummy (#2247)
1 parent 2b6c729 commit c8c809c

7 files changed

Lines changed: 25 additions & 8 deletions

File tree

Core/GameEngine/Include/GameClient/ParticleSys.h

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -835,6 +835,21 @@ class ParticleSystemManager : public SubsystemInterface,
835835
ParticleSystemIDMap m_systemMap; ///< a hash map of all particle systems
836836
};
837837

838+
// TheSuperHackers @feature bobtista 31/01/2026
839+
// ParticleSystemManager that does nothing. Used for Headless Mode.
840+
class ParticleSystemManagerDummy : public ParticleSystemManager
841+
{
842+
public:
843+
Int getOnScreenParticleCount() override { return 0; }
844+
void doParticles(RenderInfoClass &rinfo) override {}
845+
void queueParticleRender() override {}
846+
847+
protected:
848+
void crc( Xfer *xfer ) override {}
849+
void xfer( Xfer *xfer ) override {}
850+
void loadPostProcess() override {}
851+
};
852+
838853
/// The particle system manager singleton
839854
extern ParticleSystemManager *TheParticleSystemManager;
840855

Generals/Code/GameEngine/Include/Common/GameEngine.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@ class GameEngine : public SubsystemInterface
9595
virtual FunctionLexicon *createFunctionLexicon() = 0; ///< Factory for Function Lexicon
9696
virtual Radar *createRadar() = 0; ///< Factory for radar
9797
virtual WebBrowser *createWebBrowser() = 0; ///< Factory for embedded browser
98-
virtual ParticleSystemManager* createParticleSystemManager() = 0;
98+
virtual ParticleSystemManager* createParticleSystemManager(Bool dummy) = 0;
9999
virtual AudioManager *createAudioManager() = 0; ///< Factory for Audio Manager
100100

101101
Real m_logicTimeAccumulator; ///< Frame time accumulated towards submitting a new logic frame

Generals/Code/GameEngine/Source/Common/GameEngine.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -455,7 +455,7 @@ void GameEngine::init()
455455
initSubsystem(TheCaveSystem,"TheCaveSystem", MSGNEW("GameEngineSubsystem") CaveSystem(), nullptr);
456456
initSubsystem(TheRankInfoStore,"TheRankInfoStore", MSGNEW("GameEngineSubsystem") RankInfoStore(), &xferCRC, nullptr, "Data\\INI\\Rank");
457457
initSubsystem(ThePlayerTemplateStore,"ThePlayerTemplateStore", MSGNEW("GameEngineSubsystem") PlayerTemplateStore(), &xferCRC, "Data\\INI\\Default\\PlayerTemplate", "Data\\INI\\PlayerTemplate");
458-
initSubsystem(TheParticleSystemManager,"TheParticleSystemManager", createParticleSystemManager(), nullptr);
458+
initSubsystem(TheParticleSystemManager,"TheParticleSystemManager", createParticleSystemManager(TheGlobalData->m_headless), nullptr);
459459
initSubsystem(TheFXListStore,"TheFXListStore", MSGNEW("GameEngineSubsystem") FXListStore(), &xferCRC, "Data\\INI\\Default\\FXList", "Data\\INI\\FXList");
460460
initSubsystem(TheWeaponStore,"TheWeaponStore", MSGNEW("GameEngineSubsystem") WeaponStore(), &xferCRC, nullptr, "Data\\INI\\Weapon");
461461
initSubsystem(TheObjectCreationListStore,"TheObjectCreationListStore", MSGNEW("GameEngineSubsystem") ObjectCreationListStore(), &xferCRC, "Data\\INI\\Default\\ObjectCreationList", "Data\\INI\\ObjectCreationList");

Generals/Code/GameEngineDevice/Include/Win32Device/Common/Win32GameEngine.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
#pragma once
3434

3535
#include "Common/GameEngine.h"
36+
#include "GameClient/ParticleSys.h"
3637
#include "GameLogic/GameLogic.h"
3738
#include "GameNetwork/NetworkInterface.h"
3839
#include "MilesAudioDevice/MilesAudioManager.h"
@@ -78,7 +79,7 @@ class Win32GameEngine : public GameEngine
7879
virtual Radar *createRadar(); ///< Factory for radar
7980
virtual WebBrowser *createWebBrowser(); ///< Factory for embedded browser
8081
virtual AudioManager *createAudioManager(); ///< Factory for audio device
81-
virtual ParticleSystemManager* createParticleSystemManager();
82+
virtual ParticleSystemManager* createParticleSystemManager(Bool dummy);
8283

8384

8485
protected:
@@ -93,7 +94,7 @@ inline ThingFactory *Win32GameEngine::createThingFactory() { return NEW W3DThing
9394
inline FunctionLexicon *Win32GameEngine::createFunctionLexicon() { return NEW W3DFunctionLexicon; }
9495
inline LocalFileSystem *Win32GameEngine::createLocalFileSystem() { return NEW Win32LocalFileSystem; }
9596
inline ArchiveFileSystem *Win32GameEngine::createArchiveFileSystem() { return NEW Win32BIGFileSystem; }
96-
inline ParticleSystemManager* Win32GameEngine::createParticleSystemManager() { return NEW W3DParticleSystemManager; }
97+
inline ParticleSystemManager* Win32GameEngine::createParticleSystemManager(Bool dummy) { return dummy ? static_cast<ParticleSystemManager*>(NEW ParticleSystemManagerDummy) : NEW W3DParticleSystemManager; }
9798

9899
inline NetworkInterface *Win32GameEngine::createNetwork() { return NetworkInterface::createNetwork(); }
99100
inline Radar *Win32GameEngine::createRadar() { return NEW W3DRadar; }

GeneralsMD/Code/GameEngine/Include/Common/GameEngine.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,7 @@ class GameEngine : public SubsystemInterface
9494
virtual FunctionLexicon *createFunctionLexicon() = 0; ///< Factory for Function Lexicon
9595
virtual Radar *createRadar() = 0; ///< Factory for radar
9696
virtual WebBrowser *createWebBrowser() = 0; ///< Factory for embedded browser
97-
virtual ParticleSystemManager* createParticleSystemManager() = 0;
97+
virtual ParticleSystemManager* createParticleSystemManager(Bool dummy) = 0;
9898
virtual AudioManager *createAudioManager() = 0; ///< Factory for Audio Manager
9999

100100
Real m_logicTimeAccumulator; ///< Frame time accumulated towards submitting a new logic frame

GeneralsMD/Code/GameEngine/Source/Common/GameEngine.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -548,7 +548,7 @@ void GameEngine::init()
548548
initSubsystem(TheCaveSystem,"TheCaveSystem", MSGNEW("GameEngineSubsystem") CaveSystem(), nullptr);
549549
initSubsystem(TheRankInfoStore,"TheRankInfoStore", MSGNEW("GameEngineSubsystem") RankInfoStore(), &xferCRC, nullptr, "Data\\INI\\Rank");
550550
initSubsystem(ThePlayerTemplateStore,"ThePlayerTemplateStore", MSGNEW("GameEngineSubsystem") PlayerTemplateStore(), &xferCRC, "Data\\INI\\Default\\PlayerTemplate", "Data\\INI\\PlayerTemplate");
551-
initSubsystem(TheParticleSystemManager,"TheParticleSystemManager", createParticleSystemManager(), nullptr);
551+
initSubsystem(TheParticleSystemManager,"TheParticleSystemManager", createParticleSystemManager(TheGlobalData->m_headless), nullptr);
552552

553553
#ifdef DUMP_PERF_STATS///////////////////////////////////////////////////////////////////////////
554554
GetPrecisionTimer(&endTime64);//////////////////////////////////////////////////////////////////

GeneralsMD/Code/GameEngineDevice/Include/Win32Device/Common/Win32GameEngine.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
#pragma once
3434

3535
#include "Common/GameEngine.h"
36+
#include "GameClient/ParticleSys.h"
3637
#include "GameLogic/GameLogic.h"
3738
#include "GameNetwork/NetworkInterface.h"
3839
#include "MilesAudioDevice/MilesAudioManager.h"
@@ -78,7 +79,7 @@ class Win32GameEngine : public GameEngine
7879
virtual Radar *createRadar(); ///< Factory for radar
7980
virtual WebBrowser *createWebBrowser(); ///< Factory for embedded browser
8081
virtual AudioManager *createAudioManager(); ///< Factory for audio device
81-
virtual ParticleSystemManager* createParticleSystemManager();
82+
virtual ParticleSystemManager* createParticleSystemManager(Bool dummy);
8283

8384

8485
protected:
@@ -93,7 +94,7 @@ inline ThingFactory *Win32GameEngine::createThingFactory() { return NEW W3DThing
9394
inline FunctionLexicon *Win32GameEngine::createFunctionLexicon() { return NEW W3DFunctionLexicon; }
9495
inline LocalFileSystem *Win32GameEngine::createLocalFileSystem() { return NEW Win32LocalFileSystem; }
9596
inline ArchiveFileSystem *Win32GameEngine::createArchiveFileSystem() { return NEW Win32BIGFileSystem; }
96-
inline ParticleSystemManager* Win32GameEngine::createParticleSystemManager() { return NEW W3DParticleSystemManager; }
97+
inline ParticleSystemManager* Win32GameEngine::createParticleSystemManager(Bool dummy) { return dummy ? static_cast<ParticleSystemManager*>(NEW ParticleSystemManagerDummy) : NEW W3DParticleSystemManager; }
9798

9899
inline NetworkInterface *Win32GameEngine::createNetwork() { return NetworkInterface::createNetwork(); }
99100
inline Radar *Win32GameEngine::createRadar() { return NEW W3DRadar; }

0 commit comments

Comments
 (0)