From 99856df6869d32731e6fdcfeb1460297410f5820 Mon Sep 17 00:00:00 2001 From: Tiger Wang Date: Wed, 29 Jul 2020 00:12:45 +0100 Subject: Add WakeUp/AddBlock distinction * WakeUp is for singular changes (block breaking for example). The simulator should check blocks around the position and discover other affected blocks as it sees fit * AddBlock is for when you know a whole area is to be updated; chunk loading, or area wakeups for example + Prepares for correct handling of destroyed blocks after removal of SolidBlockHandler in the redstone simulator --- src/Simulator/SimulatorManager.h | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) (limited to 'src/Simulator/SimulatorManager.h') diff --git a/src/Simulator/SimulatorManager.h b/src/Simulator/SimulatorManager.h index 98a60b4ee..b5f54381c 100644 --- a/src/Simulator/SimulatorManager.h +++ b/src/Simulator/SimulatorManager.h @@ -28,26 +28,30 @@ class cWorld; class cSimulatorManager { public: + cSimulatorManager(cWorld & a_World); ~cSimulatorManager(); + /** Called in each tick, a_Dt is the time passed since the last tick, in msec. */ void Simulate(float a_Dt); + /** Called in each tick for each chunk, a_Dt is the time passed since the last tick, in msec; direct access to chunk data available. */ void SimulateChunk(std::chrono::milliseconds a_DT, int a_ChunkX, int a_ChunkZ, cChunk * a_Chunk); - /* Called when a single block changes, wakes all simulators up for the block and its face-neighbors. */ - void WakeUp(Vector3i a_Block, cChunk * a_Chunk); + /* Called when a single block changes, wakes all simulators up for the block. + The simulator implementation may also decide to wake the block's face-neighbors or blocks farther away. */ + void WakeUp(cChunk & a_Chunk, Vector3i a_Position); /** Does the same processing as WakeUp, but for all blocks within the specified area. Has better performance than calling WakeUp for each block individually, due to neighbor-checking. All chunks intersected by the area should be valid (outputs a warning if not). - Note that, unlike WakeUp(), this call adds blocks not only face-neighboring, but also edge-neighboring and - corner-neighboring the specified area. So far none of the simulators care about that. */ - void WakeUpArea(const cCuboid & a_Area); + Note that, unlike WakeUp(), this call adds blocks not only face-neighboring, but also edge-neighboring and corner-neighboring the specified area. */ + void WakeUp(const cCuboid & a_Area); void RegisterSimulator(cSimulator * a_Simulator, int a_Rate); // Takes ownership of the simulator object! protected: + typedef std::vector > cSimulators; cWorld & m_World; -- cgit v1.2.3