From 66670f5d5ccabb3b560c2342d79d0cb1e8550899 Mon Sep 17 00:00:00 2001 From: "madmaxoft@gmail.com" Date: Sat, 2 Mar 2013 15:44:31 +0000 Subject: Floody fluid simulator has been converted to use direct chunk access git-svn-id: http://mc-server.googlecode.com/svn/trunk@1236 0a769ca7-a7f5-676a-18bf-c427514a06d6 --- source/Simulator/DelayedFluidSimulator.cpp | 77 +++++++++++++++++++++--------- 1 file changed, 55 insertions(+), 22 deletions(-) (limited to 'source/Simulator/DelayedFluidSimulator.cpp') diff --git a/source/Simulator/DelayedFluidSimulator.cpp b/source/Simulator/DelayedFluidSimulator.cpp index d6d9a8793..babeff733 100644 --- a/source/Simulator/DelayedFluidSimulator.cpp +++ b/source/Simulator/DelayedFluidSimulator.cpp @@ -8,25 +8,25 @@ #include "DelayedFluidSimulator.h" #include "../World.h" +#include "../Chunk.h" -cDelayedFluidSimulator::cDelayedFluidSimulator(cWorld & a_World, BLOCKTYPE a_Fluid, BLOCKTYPE a_StationaryFluid, int a_TickDelay) : - super(a_World, a_Fluid, a_StationaryFluid), - m_TickDelay(a_TickDelay), - m_Slots(NULL), - m_CurrentSlotNum(0) +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// cDelayedFluidSimulatorChunkData: + +cDelayedFluidSimulatorChunkData::cDelayedFluidSimulatorChunkData(int a_TickDelay) : + m_Slots(new cCoordWithIntList[a_TickDelay]) { - m_Slots = new CoordsArray[a_TickDelay]; } -cDelayedFluidSimulator::~cDelayedFluidSimulator() +cDelayedFluidSimulatorChunkData::~cDelayedFluidSimulatorChunkData() { delete[] m_Slots; m_Slots = NULL; @@ -36,6 +36,22 @@ cDelayedFluidSimulator::~cDelayedFluidSimulator() +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// cDelayedFluidSimulator: + +cDelayedFluidSimulator::cDelayedFluidSimulator(cWorld & a_World, BLOCKTYPE a_Fluid, BLOCKTYPE a_StationaryFluid, int a_TickDelay) : + super(a_World, a_Fluid, a_StationaryFluid), + m_TickDelay(a_TickDelay), + m_AddSlotNum(a_TickDelay - 1), + m_SimSlotNum(0), + m_TotalBlocks(0) +{ +} + + + + + void cDelayedFluidSimulator::AddBlock(int a_BlockX, int a_BlockY, int a_BlockZ, cChunk * a_Chunk) { if ((a_BlockY < 0) || (a_BlockY >= cChunkDef::Height)) @@ -44,25 +60,29 @@ void cDelayedFluidSimulator::AddBlock(int a_BlockX, int a_BlockY, int a_BlockZ, return; } - // TODO: This can be optimized: - BLOCKTYPE BlockType = m_World.GetBlock(a_BlockX, a_BlockY, a_BlockZ); + int RelX = a_BlockX - a_Chunk->GetPosX() * cChunkDef::Width; + int RelZ = a_BlockZ - a_Chunk->GetPosZ() * cChunkDef::Width; + BLOCKTYPE BlockType = a_Chunk->GetBlock(RelX, a_BlockY, RelZ); if (BlockType != m_FluidBlock) { return; } - CoordsArray & Blocks = m_Slots[m_CurrentSlotNum]; + void * ChunkDataRaw = (m_FluidBlock == E_BLOCK_WATER) ? a_Chunk->GetWaterSimulatorData() : a_Chunk->GetLavaSimulatorData(); + cDelayedFluidSimulatorChunkData * ChunkData = (cDelayedFluidSimulatorChunkData *)ChunkDataRaw; + cCoordWithIntList & Blocks = ChunkData->m_Slots[m_AddSlotNum]; // Check for duplicates: - for (CoordsArray::iterator itr = Blocks.begin(), end = Blocks.end(); itr != end; ++itr) + for (cCoordWithIntList::iterator itr = Blocks.begin(), end = Blocks.end(); itr != end; ++itr) { - if ((itr->x == a_BlockX) && (itr->y == a_BlockY) && (itr->z == a_BlockZ)) + if ((itr->x == RelX) && (itr->y == a_BlockY) && (itr->z == RelZ)) { return; } } - Blocks.push_back(Vector3i(a_BlockX, a_BlockY, a_BlockZ)); + ++m_TotalBlocks; + Blocks.push_back(cCoordWithInt(RelX, a_BlockY, RelZ)); } @@ -71,22 +91,35 @@ void cDelayedFluidSimulator::AddBlock(int a_BlockX, int a_BlockY, int a_BlockZ, void cDelayedFluidSimulator::Simulate(float a_Dt) { - int SlotNum = m_CurrentSlotNum + 1; - if (SlotNum >= m_TickDelay) + if (m_TotalBlocks > 0) { - SlotNum = 0; + LOGD("DFS: %d blocks in queue", m_TotalBlocks); } - - CoordsArray & Blocks = m_Slots[SlotNum]; + m_AddSlotNum = m_SimSlotNum; + m_SimSlotNum += 1; + if (m_SimSlotNum >= m_TickDelay) + { + m_SimSlotNum = 0; + } +} + + + + + +void cDelayedFluidSimulator::SimulateChunk(float a_Dt, int a_ChunkX, int a_ChunkZ, cChunk * a_Chunk) +{ + void * ChunkDataRaw = (m_FluidBlock == E_BLOCK_WATER) ? a_Chunk->GetWaterSimulatorData() : a_Chunk->GetLavaSimulatorData(); + cDelayedFluidSimulatorChunkData * ChunkData = (cDelayedFluidSimulatorChunkData *)ChunkDataRaw; + cCoordWithIntList & Blocks = ChunkData->m_Slots[m_SimSlotNum]; // Simulate the blocks in the scheduled slot: - for (CoordsArray::iterator itr = Blocks.begin(), end = Blocks.end(); itr != end; ++itr) + for (cCoordWithIntList::iterator itr = Blocks.begin(), end = Blocks.end(); itr != end; ++itr) { - SimulateBlock(itr->x, itr->y, itr->z); + SimulateBlock(a_Chunk, itr->x, itr->y, itr->z); } + m_TotalBlocks -= Blocks.size(); Blocks.clear(); - - m_CurrentSlotNum = SlotNum; } -- cgit v1.2.3