// Copyright (c) 2012-2023 Wojciech Figat. All rights reserved. #pragma once #include "Engine/Level/Types.h" #include "Engine/Core/Collections/Array.h" /// /// Scene gameplay updating helper subsystem that boosts the level ticking by providing efficient objects cache. /// class FLAXENGINE_API SceneTicking { public: /// /// Tick function type. /// struct FLAXENGINE_API Tick { typedef void (*Signature)(); typedef void (*SignatureObj)(void*); template static void MethodCaller(void* callee) { (static_cast(callee)->*Method)(); } void* Callee; SignatureObj FunctionObj; template void Bind(T* callee) { Callee = callee; FunctionObj = &MethodCaller; } FORCE_INLINE void Call() const { (*FunctionObj)(Callee); } }; /// /// Ticking data container. /// class FLAXENGINE_API TickData { public: Array Scripts; Array Ticks; #if USE_EDITOR Array ScriptsExecuteInEditor; Array TicksExecuteInEditor; #endif TickData(int32 capacity); virtual void TickScripts(const Array& scripts) = 0; void AddScript(Script* script); void RemoveScript(Script* script); template void AddTick(T* callee) { SceneTicking::Tick tick; tick.Bind(callee); Ticks.Add(tick); } void RemoveTick(void* callee); void Tick(); #if USE_EDITOR template void AddTickExecuteInEditor(T* callee) { SceneTicking::Tick tick; tick.Bind(callee); TicksExecuteInEditor.Add(tick); } void RemoveTickExecuteInEditor(void* callee); void TickExecuteInEditor(); #endif void Clear(); }; class FLAXENGINE_API FixedUpdateTickData : public TickData { public: FixedUpdateTickData(); void TickScripts(const Array& scripts) override; }; class FLAXENGINE_API UpdateTickData : public TickData { public: UpdateTickData(); void TickScripts(const Array& scripts) override; }; class FLAXENGINE_API LateUpdateTickData : public TickData { public: LateUpdateTickData(); void TickScripts(const Array& scripts) override; }; class FLAXENGINE_API LateFixedUpdateTickData : public TickData { public: LateFixedUpdateTickData(); void TickScripts(const Array& scripts) override; }; public: /// /// Adds the script to scene ticking system. /// /// The object. void AddScript(Script* obj); /// /// Removes the script from scene ticking system. /// /// The object. void RemoveScript(Script* obj); /// /// Clears this instance data. /// void Clear(); public: /// /// The fixed update tick function. /// FixedUpdateTickData FixedUpdate; /// /// The update tick function. /// UpdateTickData Update; /// /// The late update tick function. /// LateUpdateTickData LateUpdate; /// /// The late fixed update tick function. /// LateFixedUpdateTickData LateFixedUpdate; };