hopefully the last commit for removing y-coord from chunks. :)
This commit is contained in:
parent
4c9abab2d1
commit
a600e3bdfe
@ -389,6 +389,27 @@ typedef std::vector<cChunkCoords> cChunkCoordsVector;
|
||||
|
||||
|
||||
|
||||
class cChunkCoordsWithBool
|
||||
{
|
||||
public:
|
||||
int m_ChunkX;
|
||||
int m_ChunkZ;
|
||||
bool m_ForceGenerate;
|
||||
|
||||
cChunkCoordsWithBool(int a_ChunkX, int a_ChunkZ, bool a_ForceGenerate) : m_ChunkX(a_ChunkX), m_ChunkZ(a_ChunkZ), m_ForceGenerate(a_ForceGenerate){}
|
||||
|
||||
bool operator == (const cChunkCoordsWithBool & a_Other) const
|
||||
{
|
||||
return ((m_ChunkX == a_Other.m_ChunkX) && (m_ChunkZ == a_Other.m_ChunkZ) && (m_ForceGenerate == a_Other.m_ForceGenerate));
|
||||
}
|
||||
};
|
||||
|
||||
typedef std::list<cChunkCoordsWithBool> cChunkCoordWithBoolList;
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/// Interface class used as a callback for operations that involve chunk coords
|
||||
class cChunkCoordCallback
|
||||
{
|
||||
|
@ -99,13 +99,13 @@ void cChunkGenerator::Stop(void)
|
||||
|
||||
|
||||
|
||||
void cChunkGenerator::QueueGenerateChunk(int a_ChunkX, int a_ChunkZ)
|
||||
void cChunkGenerator::QueueGenerateChunk(int a_ChunkX, int a_ChunkZ, bool a_ForceGenerate)
|
||||
{
|
||||
{
|
||||
cCSLock Lock(m_CS);
|
||||
|
||||
// Check if it is already in the queue:
|
||||
for (cChunkCoordsList::iterator itr = m_Queue.begin(); itr != m_Queue.end(); ++itr)
|
||||
for (cChunkCoordWithBoolList::iterator itr = m_Queue.begin(); itr != m_Queue.end(); ++itr)
|
||||
{
|
||||
if ((itr->m_ChunkX == a_ChunkX) && (itr->m_ChunkZ == a_ChunkZ))
|
||||
{
|
||||
@ -119,7 +119,7 @@ void cChunkGenerator::QueueGenerateChunk(int a_ChunkX, int a_ChunkZ)
|
||||
{
|
||||
LOGWARN("WARNING: Adding chunk [%i, %i] to generation queue; Queue is too big! (" SIZE_T_FMT ")", a_ChunkX, a_ChunkZ, m_Queue.size());
|
||||
}
|
||||
m_Queue.push_back(cChunkCoords(a_ChunkX, a_ChunkZ));
|
||||
m_Queue.push_back(cChunkCoordsWithBool(a_ChunkX, a_ChunkZ, a_ForceGenerate));
|
||||
}
|
||||
|
||||
m_Event.Set();
|
||||
@ -229,8 +229,9 @@ void cChunkGenerator::Execute(void)
|
||||
continue;
|
||||
}
|
||||
|
||||
cChunkCoords coords = m_Queue.front(); // Get next coord from queue
|
||||
cChunkCoordsWithBool coords = m_Queue.front(); // Get next coord from queue
|
||||
bool SkipEnabled = (m_Queue.size() > QUEUE_SKIP_LIMIT);
|
||||
m_Queue.erase(m_Queue.begin()); // Remove coordinate from queue
|
||||
Lock.Unlock(); // Unlock ASAP
|
||||
m_evtRemoved.Set();
|
||||
|
||||
@ -244,6 +245,13 @@ void cChunkGenerator::Execute(void)
|
||||
LastReportTick = clock();
|
||||
}
|
||||
|
||||
if (!coords.m_ForceGenerate && m_ChunkSink->IsChunkValid(coords.m_ChunkX, coords.m_ChunkZ))
|
||||
{
|
||||
LOGD("Chunk [%d, %d] already generated, skipping generation", coords.m_ChunkX, coords.m_ChunkZ);
|
||||
// Already generated, ignore request
|
||||
continue;
|
||||
}
|
||||
|
||||
if (SkipEnabled && !m_ChunkSink->HasChunkAnyClients(coords.m_ChunkX, coords.m_ChunkZ))
|
||||
{
|
||||
LOGWARNING("Chunk generator overloaded, skipping chunk [%d, %d]", coords.m_ChunkX, coords.m_ChunkZ);
|
||||
@ -253,8 +261,6 @@ void cChunkGenerator::Execute(void)
|
||||
LOGD("Generating chunk [%d, %d]", coords.m_ChunkX, coords.m_ChunkZ);
|
||||
DoGenerate(coords.m_ChunkX, coords.m_ChunkZ);
|
||||
|
||||
m_Queue.erase(m_Queue.begin()); // Remove coordinate from queue
|
||||
|
||||
NumChunksGenerated++;
|
||||
} // while (!bStop)
|
||||
}
|
||||
|
@ -116,7 +116,7 @@ public:
|
||||
void Stop(void);
|
||||
|
||||
/// Queues the chunk for generation; removes duplicate requests
|
||||
void QueueGenerateChunk(int a_ChunkX, int a_ChunkZ);
|
||||
void QueueGenerateChunk(int a_ChunkX, int a_ChunkZ, bool a_ForceGenerate);
|
||||
|
||||
/// Generates the biomes for the specified chunk (directly, not in a separate thread). Used by the world loader if biomes failed loading.
|
||||
void GenerateBiomes(int a_ChunkX, int a_ChunkZ, cChunkDef::BiomeMap & a_BiomeMap);
|
||||
@ -138,7 +138,7 @@ private:
|
||||
int m_Seed;
|
||||
|
||||
cCriticalSection m_CS;
|
||||
cChunkCoordsList m_Queue;
|
||||
cChunkCoordWithBoolList m_Queue;
|
||||
cEvent m_Event; ///< Set when an item is added to the queue or the thread should terminate
|
||||
cEvent m_evtRemoved; ///< Set when an item is removed from the queue
|
||||
|
||||
|
@ -2900,7 +2900,7 @@ void cWorld::RegenerateChunk(int a_ChunkX, int a_ChunkZ)
|
||||
{
|
||||
m_ChunkMap->MarkChunkRegenerating(a_ChunkX, a_ChunkZ);
|
||||
|
||||
m_Generator.QueueGenerateChunk(a_ChunkX, a_ChunkZ);
|
||||
m_Generator.QueueGenerateChunk(a_ChunkX, a_ChunkZ, true);
|
||||
}
|
||||
|
||||
|
||||
@ -2909,16 +2909,7 @@ void cWorld::RegenerateChunk(int a_ChunkX, int a_ChunkZ)
|
||||
|
||||
void cWorld::GenerateChunk(int a_ChunkX, int a_ChunkZ)
|
||||
{
|
||||
/** Add a chunk to the generation queue, if it's not already present. */
|
||||
if (!(m_ChunkMap->IsChunkValid(a_ChunkX, a_ChunkZ)))
|
||||
{
|
||||
LOGD("Chunk [%d, %d] already generated, skipping generation", a_ChunkX, a_ChunkZ);
|
||||
/** Already generated, ignore request */
|
||||
}
|
||||
else
|
||||
{
|
||||
m_Generator.QueueGenerateChunk(a_ChunkX, a_ChunkZ);
|
||||
}
|
||||
m_Generator.QueueGenerateChunk(a_ChunkX, a_ChunkZ, false);
|
||||
}
|
||||
|
||||
|
||||
|
@ -249,7 +249,7 @@ bool cWorldStorage::LoadOneChunk(void)
|
||||
if (ToLoad.m_Generate)
|
||||
{
|
||||
// The chunk couldn't be loaded, generate it:
|
||||
m_World->GetGenerator().QueueGenerateChunk(ToLoad.m_ChunkX, ToLoad.m_ChunkZ);
|
||||
m_World->GetGenerator().QueueGenerateChunk(ToLoad.m_ChunkX, ToLoad.m_ChunkZ, true);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
Loading…
Reference in New Issue
Block a user