diff --git a/src/xrEngine/ISheduled.cpp b/src/xrEngine/ISheduled.cpp index d4d3c9e4f38..f4ec374aa58 100644 --- a/src/xrEngine/ISheduled.cpp +++ b/src/xrEngine/ISheduled.cpp @@ -1,20 +1,20 @@ #include "stdafx.h" #include "xrSheduler.h" #include "xr_object.h" - -ISheduled::ISheduled() +// XXX: rename this file to ScheduledBase.cpp +ScheduledBase::ScheduledBase() { shedule.t_min = 20; shedule.t_max = 1000; shedule.b_locked = FALSE; #ifdef DEBUG - dbg_startframe = 1; - dbg_update_shedule = 0; + shedule.dbg_startframe = 1; + shedule.dbg_update_shedule = 0; #endif } extern BOOL g_bSheduleInProgress; -ISheduled::~ISheduled() +ScheduledBase::~ScheduledBase() { VERIFY2( !Engine.Sheduler.Registered(this), @@ -28,26 +28,26 @@ ISheduled::~ISheduled() #endif // DEBUG } -void ISheduled::shedule_register() +void ScheduledBase::shedule_register() { Engine.Sheduler.Register(this); } -void ISheduled::shedule_unregister() +void ScheduledBase::shedule_unregister() { Engine.Sheduler.Unregister(this); } -void ISheduled::shedule_Update(u32 dt) +void ScheduledBase::shedule_Update(u32 dt) { #ifdef DEBUG - if (dbg_startframe == dbg_update_shedule) + if (shedule.dbg_startframe == shedule.dbg_update_shedule) { LPCSTR name = "unknown"; CObject* O = dynamic_cast (this); if (O) name = *O->cName(); Debug.fatal(DEBUG_INFO, "'shedule_Update' called twice per frame for %s", name); } - dbg_update_shedule = dbg_startframe; + shedule.dbg_update_shedule = shedule.dbg_startframe; #endif } diff --git a/src/xrEngine/ISheduled.h b/src/xrEngine/ISheduled.h index 8771523c03d..ced648345b4 100644 --- a/src/xrEngine/ISheduled.h +++ b/src/xrEngine/ISheduled.h @@ -1,33 +1,48 @@ #ifndef XRENGINE_ISHEDULED_H_INCLUDED #define XRENGINE_ISHEDULED_H_INCLUDED -class ENGINE_API ISheduled +class SchedulerData { public: - struct - { - u32 t_min : 14; // minimal bound of update time (sample: 20ms) - u32 t_max : 14; // maximal bound of update time (sample: 200ms) - u32 b_RT : 1; - u32 b_locked : 1; - } shedule; - + u32 t_min : 14; // minimal bound of update time (sample: 20ms) + u32 t_max : 14; // maximal bound of update time (sample: 200ms) + u32 b_RT : 1; + u32 b_locked : 1; #ifdef DEBUG u32 dbg_startframe; u32 dbg_update_shedule; #endif +}; - ISheduled(); - virtual ~ISheduled(); - - void shedule_register(); - void shedule_unregister(); - +class ISheduled +{ +public: + virtual ~ISheduled() = 0; + virtual SchedulerData &GetSchedulerData() = 0; virtual float shedule_Scale() = 0; - virtual void shedule_Update(u32 dt); - virtual shared_str shedule_Name() const { return shared_str("unknown"); }; + virtual void shedule_Update(u32 dt) = 0; + // XXX nitrocaster: return (const char *) to reduce string pool spoiling + virtual shared_str shedule_Name() const = 0; virtual bool shedule_Needed() = 0; +}; +inline ISheduled::~ISheduled() {} + +class ENGINE_API ScheduledBase : public ISheduled +{ +public: + SchedulerData shedule; + + ScheduledBase(); + virtual ~ScheduledBase(); + + virtual SchedulerData &GetSchedulerData() override { return shedule; } + virtual void shedule_Update(u32 dt) override; + virtual shared_str shedule_Name() const override { return shared_str("unknown"); } + +protected: + void shedule_register(); + void shedule_unregister(); }; #endif // #ifndef XRENGINE_ISHEDULED_H_INCLUDED \ No newline at end of file diff --git a/src/xrEngine/PS_instance.cpp b/src/xrEngine/PS_instance.cpp index 1958988f374..411e7e4b6f4 100644 --- a/src/xrEngine/PS_instance.cpp +++ b/src/xrEngine/PS_instance.cpp @@ -41,7 +41,7 @@ void CPS_Instance::shedule_Update(u32 dt) { if (renderable.pROS) GlobalEnv.Render->ros_destroy(renderable.pROS); //. particles doesn't need ROS - ISheduled::shedule_Update(dt); + ScheduledBase::shedule_Update(dt); m_iLifeTime -= dt; // remove??? diff --git a/src/xrEngine/PS_instance.h b/src/xrEngine/PS_instance.h index 89e79120349..b94a602cbc0 100644 --- a/src/xrEngine/PS_instance.h +++ b/src/xrEngine/PS_instance.h @@ -7,7 +7,7 @@ class ENGINE_API CPS_Instance : public SpatialBase, - public ISheduled, + public ScheduledBase, public IRenderable { friend class IGame_Persistent; diff --git a/src/xrEngine/xrSheduler.cpp b/src/xrEngine/xrSheduler.cpp index 923d1840c3d..04f145bf38d 100644 --- a/src/xrEngine/xrSheduler.cpp +++ b/src/xrEngine/xrSheduler.cpp @@ -104,7 +104,7 @@ void CSheduler::internal_Registration() void CSheduler::internal_Register(ISheduled* O, BOOL RT) { - VERIFY(!O->shedule.b_locked); + VERIFY(!O->GetSchedulerData().b_locked); if (RT) { // Fill item structure @@ -113,7 +113,7 @@ void CSheduler::internal_Register(ISheduled* O, BOOL RT) TNext.dwTimeOfLastExecute = Device.dwTimeGlobal; TNext.Object = O; TNext.scheduled_name = O->shedule_Name(); - O->shedule.b_RT = TRUE; + O->GetSchedulerData().b_RT = TRUE; ItemsRT.push_back(TNext); } @@ -125,7 +125,7 @@ void CSheduler::internal_Register(ISheduled* O, BOOL RT) TNext.dwTimeOfLastExecute = Device.dwTimeGlobal; TNext.Object = O; TNext.scheduled_name = O->shedule_Name(); - O->shedule.b_RT = FALSE; + O->GetSchedulerData().b_RT = FALSE; // Insert into priority Queue Push(TNext); @@ -265,7 +265,7 @@ void CSheduler::Register(ISheduled* A, BOOL RT) R.OP = TRUE; R.RT = RT; R.Object = A; - R.Object->shedule.b_RT = RT; + R.Object->GetSchedulerData().b_RT = RT; #ifdef DEBUG_SCHEDULER Msg("SCHEDULER: register [%s][%x]", *A->shedule_Name(), A); @@ -284,13 +284,13 @@ void CSheduler::Unregister(ISheduled* A) if (m_processing_now) { - if (internal_Unregister(A, A->shedule.b_RT, false)) + if (internal_Unregister(A, A->GetSchedulerData().b_RT, false)) return; } ItemReg R; R.OP = FALSE; - R.RT = A->shedule.b_RT; + R.RT = A->GetSchedulerData().b_RT; R.Object = A; Registration.push_back(R); @@ -298,7 +298,7 @@ void CSheduler::Unregister(ISheduled* A) void CSheduler::EnsureOrder(ISheduled* Before, ISheduled* After) { - VERIFY(Before->shedule.b_RT && After->shedule.b_RT); + VERIFY(Before->GetSchedulerData().b_RT && After->GetSchedulerData().b_RT); for (u32 i = 0; i < ItemsRT.size(); i++) { @@ -362,14 +362,14 @@ void CSheduler::ProcessStep() // Real update call // Msg ("------- %d:",Device.dwFrame); #ifdef DEBUG - T.Object->dbg_startframe = Device.dwFrame; + T.Object->GetSchedulerData().dbg_startframe = Device.dwFrame; eTimer.Start(); // LPCSTR _obj_name = T.Object->shedule_Name().c_str(); #endif // DEBUG // Calc next update interval - u32 dwMin = _max(u32(30), T.Object->shedule.t_min); - u32 dwMax = (1000 + T.Object->shedule.t_max) / 2; + u32 dwMin = _max(u32(30), T.Object->GetSchedulerData().t_min); + u32 dwMax = (1000 + T.Object->GetSchedulerData().t_max) / 2; float scale = T.Object->shedule_Scale(); u32 dwUpdate = dwMin + iFloor(float(dwMax - dwMin)*scale); clamp(dwUpdate, u32(_max(dwMin, u32(20))), dwMax); @@ -378,7 +378,7 @@ void CSheduler::ProcessStep() m_current_step_obj = T.Object; // try { - T.Object->shedule_Update(clampr(Elapsed, u32(1), u32(_max(u32(T.Object->shedule.t_max), u32(1000))))); + T.Object->shedule_Update(clampr(Elapsed, u32(1), u32(_max(u32(T.Object->GetSchedulerData().t_max), u32(1000))))); if (!m_current_step_obj) { #ifdef DEBUG_SCHEDULER @@ -484,8 +484,8 @@ void CSheduler::Update() u32 Elapsed = dwTime - T.dwTimeOfLastExecute; #ifdef DEBUG - VERIFY(T.Object->dbg_startframe != Device.dwFrame); - T.Object->dbg_startframe = Device.dwFrame; + VERIFY(T.Object->GetSchedulerData().dbg_startframe != Device.dwFrame); + T.Object->GetSchedulerData().dbg_startframe = Device.dwFrame; #endif T.Object->shedule_Update(Elapsed); T.dwTimeOfLastExecute = dwTime; diff --git a/src/xrEngine/xr_object.cpp b/src/xrEngine/xr_object.cpp index 9293e3f539e..341e8474444 100644 --- a/src/xrEngine/xr_object.cpp +++ b/src/xrEngine/xr_object.cpp @@ -170,7 +170,7 @@ CObject::CObject() : NameVisual = NULL; #ifdef DEBUG - dbg_update_shedule = u32(-1) / 2; + shedule.dbg_update_shedule = u32(-1) / 2; dbg_update_cl = u32(-1) / 2; #endif } @@ -347,7 +347,7 @@ void CObject::shedule_Update(u32 T) { // consistency check // Msg ("-SUB-:[%x][%s] CObject::shedule_Update",dynamic_cast(this),*cName()); - ISheduled::shedule_Update(T); + ScheduledBase::shedule_Update(T); spatial_update(base_spu_epsP * 1, base_spu_epsR * 1); // Always make me crow on shedule-update diff --git a/src/xrEngine/xr_object.h b/src/xrEngine/xr_object.h index ba75c4477f2..23f6eeb905d 100644 --- a/src/xrEngine/xr_object.h +++ b/src/xrEngine/xr_object.h @@ -29,7 +29,7 @@ xr_pure_interface IObjectPhysicsCollision; class ENGINE_API CObject : public DLL_Pure, public SpatialBase, - public ISheduled, + public ScheduledBase, public IRenderable, public CollidableBase { diff --git a/src/xrGame/GamePersistent.cpp b/src/xrGame/GamePersistent.cpp index fa143cdb22f..0772994dac9 100644 --- a/src/xrGame/GamePersistent.cpp +++ b/src/xrGame/GamePersistent.cpp @@ -609,13 +609,13 @@ void CGamePersistent::OnFrame () if(psActorFlags.test(AF_NO_CLIP)) { Actor()->dbg_update_cl = 0; - Actor()->dbg_update_shedule = 0; + Actor()->GetSchedulerData().dbg_update_shedule = 0; Device.dwTimeDelta = 0; Device.fTimeDelta = 0.01f; Actor()->UpdateCL (); Actor()->shedule_Update (0); Actor()->dbg_update_cl = 0; - Actor()->dbg_update_shedule = 0; + Actor()->GetSchedulerData().dbg_update_shedule = 0; CSE_Abstract* e = Level().Server->ID_to_entity(Actor()->ID()); VERIFY (e); @@ -627,11 +627,11 @@ void CGamePersistent::OnFrame () CObject* obj = Level().Objects.net_Find(*it); if(obj && Engine.Sheduler.Registered(obj)) { - obj->dbg_update_shedule = 0; + obj->GetSchedulerData().dbg_update_shedule = 0; obj->dbg_update_cl = 0; obj->shedule_Update (0); obj->UpdateCL(); - obj->dbg_update_shedule = 0; + obj->GetSchedulerData().dbg_update_shedule = 0; obj->dbg_update_cl = 0; } } diff --git a/src/xrGame/Spectator.cpp b/src/xrGame/Spectator.cpp index 51bdb1efe40..fbb8c0559c7 100644 --- a/src/xrGame/Spectator.cpp +++ b/src/xrGame/Spectator.cpp @@ -85,8 +85,8 @@ void CSpectator::UpdateCL() { #ifdef DEBUG m_pActorToLookAt->dbg_update_cl = 0; - m_pActorToLookAt->dbg_update_shedule = 0; - Game().dbg_update_shedule = 0; + m_pActorToLookAt->GetSchedulerData().dbg_update_shedule = 0; + Game().GetSchedulerData().dbg_update_shedule = 0; #endif Device.dwTimeDelta = 0; m_pActorToLookAt->UpdateCL(); @@ -94,8 +94,8 @@ void CSpectator::UpdateCL() Game().shedule_Update (0); #ifdef DEBUG m_pActorToLookAt->dbg_update_cl = 0; - m_pActorToLookAt->dbg_update_shedule = 0; - Game().dbg_update_shedule = 0; + m_pActorToLookAt->GetSchedulerData().dbg_update_shedule = 0; + Game().GetSchedulerData().dbg_update_shedule = 0; #endif } } @@ -352,14 +352,14 @@ void CSpectator::FirstEye_ToPlayer(CObject* pObject) { #ifdef DEBUG pOldActor->dbg_update_cl = 0; - pOldActor->dbg_update_shedule = 0; + pOldActor->GetSchedulerData().dbg_update_shedule = 0; #endif Device.dwTimeDelta = 0; pOldActor->UpdateCL (); pOldActor->shedule_Update (0); #ifdef DEBUG pOldActor->dbg_update_cl = 0; - pOldActor->dbg_update_shedule = 0; + pOldActor->GetSchedulerData().dbg_update_shedule = 0; #endif } }; diff --git a/src/xrGame/agent_manager.cpp b/src/xrGame/agent_manager.cpp index 3aacc3ad70b..b5294f397b5 100644 --- a/src/xrGame/agent_manager.cpp +++ b/src/xrGame/agent_manager.cpp @@ -103,7 +103,7 @@ void CAgentManager::shedule_Update (u32 time_delta) { START_PROFILE("Agent_Manager") - ISheduled::shedule_Update (time_delta); + ScheduledBase::shedule_Update (time_delta); update_impl (); diff --git a/src/xrGame/agent_manager.h b/src/xrGame/agent_manager.h index 3f3866c4236..6e6c4282a0d 100644 --- a/src/xrGame/agent_manager.h +++ b/src/xrGame/agent_manager.h @@ -19,7 +19,7 @@ class CAgentManagerPlanner; //#define USE_SCHEDULER_IN_AGENT_MANAGER #ifdef USE_SCHEDULER_IN_AGENT_MANAGER - class CAgentManager : public ISheduled { + class CAgentManager : public ScheduledBase { #else // USE_SCHEDULER_IN_AGENT_MANAGER class CAgentManager { #endif // USE_SCHEDULER_IN_AGENT_MANAGER diff --git a/src/xrGame/alife_update_manager.cpp b/src/xrGame/alife_update_manager.cpp index 17b207c72a6..6ba395d6c2c 100644 --- a/src/xrGame/alife_update_manager.cpp +++ b/src/xrGame/alife_update_manager.cpp @@ -112,7 +112,7 @@ void CALifeUpdateManager::update () void CALifeUpdateManager::shedule_Update (u32 dt) { - ISheduled::shedule_Update (dt); + ScheduledBase::shedule_Update (dt); if (!initialized()) return; diff --git a/src/xrGame/alife_update_manager.h b/src/xrGame/alife_update_manager.h index 367b9397c17..2d6e57f683d 100644 --- a/src/xrGame/alife_update_manager.h +++ b/src/xrGame/alife_update_manager.h @@ -20,7 +20,7 @@ class CALifeUpdateManager : public CALifeSwitchManager, public CALifeSurgeManager, public CALifeStorageManager, - public ISheduled + public ScheduledBase { private: bool m_first_time; diff --git a/src/xrGame/autosave_manager.h b/src/xrGame/autosave_manager.h index f4cbbe3b806..a57a207d2af 100644 --- a/src/xrGame/autosave_manager.h +++ b/src/xrGame/autosave_manager.h @@ -8,9 +8,9 @@ #pragma once -class CAutosaveManager : public ISheduled { +class CAutosaveManager : public ScheduledBase { private: - typedef ISheduled inherited; + typedef ScheduledBase inherited; private: u32 m_autosave_interval; diff --git a/src/xrGame/configs_dumper.h b/src/xrGame/configs_dumper.h index 5542f560428..45a5b77a6ab 100644 --- a/src/xrGame/configs_dumper.h +++ b/src/xrGame/configs_dumper.h @@ -22,7 +22,7 @@ class dump_signer : public xr_dsa_signer void feel_private_dsa_key (); }; -class configs_dumper : public ISheduled +class configs_dumper : public ScheduledBase { public: typedef fastdelegate::FastDelegate3 complete_callback_t; diff --git a/src/xrGame/game_cl_base.cpp b/src/xrGame/game_cl_base.cpp index ad1944bd7c8..fc9901e90cc 100644 --- a/src/xrGame/game_cl_base.cpp +++ b/src/xrGame/game_cl_base.cpp @@ -330,7 +330,7 @@ ClientID game_cl_GameState::GetClientIDByOrderID (u32 idx) void game_cl_GameState::shedule_Update (u32 dt) { - ISheduled::shedule_Update (dt); + ScheduledBase::shedule_Update (dt); if(!m_game_ui_custom) { diff --git a/src/xrGame/game_cl_base.h b/src/xrGame/game_cl_base.h index b5a61656941..8e6283880f1 100644 --- a/src/xrGame/game_cl_base.h +++ b/src/xrGame/game_cl_base.h @@ -18,7 +18,7 @@ struct SZoneMapEntityData{ struct WeaponUsageStatistic; -class game_cl_GameState : public game_GameState, public ISheduled +class game_cl_GameState : public game_GameState, public ScheduledBase { typedef game_GameState inherited; shared_str m_game_type_name; diff --git a/src/xrGame/profile_store.h b/src/xrGame/profile_store.h index 01d68e81d8e..254baf0047d 100644 --- a/src/xrGame/profile_store.h +++ b/src/xrGame/profile_store.h @@ -22,7 +22,7 @@ class awards_store; class best_scores_store; class profile_store : - public ISheduled, + public ScheduledBase, private boost::noncopyable { public: diff --git a/src/xrGame/screenshot_manager.h b/src/xrGame/screenshot_manager.h index 6b45ac6ef9a..59c0e21a512 100644 --- a/src/xrGame/screenshot_manager.h +++ b/src/xrGame/screenshot_manager.h @@ -3,7 +3,7 @@ #define RESULT_WIDTH 640 #define RESULT_HEIGHT 480 -class screenshot_manager : public ISheduled +class screenshot_manager : public ScheduledBase { public: enum ss_manager_state_mask_t diff --git a/src/xrGame/stats_submitter.h b/src/xrGame/stats_submitter.h index cdb85377557..7cfd7737b9b 100644 --- a/src/xrGame/stats_submitter.h +++ b/src/xrGame/stats_submitter.h @@ -19,7 +19,7 @@ namespace gamespy_profile { class stats_submitter : - public ISheduled, + public ScheduledBase, private boost::noncopyable { public: diff --git a/src/xrGame/vision_client.h b/src/xrGame/vision_client.h index b6d3b203076..2bb52880143 100644 --- a/src/xrGame/vision_client.h +++ b/src/xrGame/vision_client.h @@ -16,11 +16,11 @@ class CEntity; class CVisualMemoryManager; class vision_client : - public ISheduled, + public ScheduledBase, public Feel::Vision { private: - typedef ISheduled inherited; + typedef ScheduledBase inherited; private: CEntity *m_object;