WorldStorage no longer queues chunks into generator.
This commit is contained in:
parent
4230eb3d92
commit
103fa8812d
@ -163,7 +163,7 @@ cChunkPtr cChunkMap::GetChunk(int a_ChunkX, int a_ChunkZ)
|
|||||||
{
|
{
|
||||||
Chunk->SetPresence(cChunk::cpQueued);
|
Chunk->SetPresence(cChunk::cpQueued);
|
||||||
Chunk->SetShouldGenerateIfLoadFailed(true);
|
Chunk->SetShouldGenerateIfLoadFailed(true);
|
||||||
m_World->GetStorage().QueueLoadChunk(a_ChunkX, a_ChunkZ, true);
|
m_World->GetStorage().QueueLoadChunk(a_ChunkX, a_ChunkZ);
|
||||||
}
|
}
|
||||||
return Chunk;
|
return Chunk;
|
||||||
}
|
}
|
||||||
@ -191,7 +191,7 @@ cChunkPtr cChunkMap::GetChunkNoGen(int a_ChunkX, int a_ChunkZ)
|
|||||||
if (!Chunk->IsValid() && !Chunk->IsQueued())
|
if (!Chunk->IsValid() && !Chunk->IsQueued())
|
||||||
{
|
{
|
||||||
Chunk->SetPresence(cChunk::cpQueued);
|
Chunk->SetPresence(cChunk::cpQueued);
|
||||||
m_World->GetStorage().QueueLoadChunk(a_ChunkX, a_ChunkZ, false);
|
m_World->GetStorage().QueueLoadChunk(a_ChunkX, a_ChunkZ);
|
||||||
}
|
}
|
||||||
|
|
||||||
return Chunk;
|
return Chunk;
|
||||||
|
@ -112,6 +112,8 @@ void cChunkGenerator::Stop(void)
|
|||||||
|
|
||||||
void cChunkGenerator::QueueGenerateChunk(int a_ChunkX, int a_ChunkZ, bool a_ForceGenerate)
|
void cChunkGenerator::QueueGenerateChunk(int a_ChunkX, int a_ChunkZ, bool a_ForceGenerate)
|
||||||
{
|
{
|
||||||
|
ASSERT(m_ChunkSink->IsChunkQueued(a_ChunkX, a_ChunkZ));
|
||||||
|
|
||||||
{
|
{
|
||||||
cCSLock Lock(m_CS);
|
cCSLock Lock(m_CS);
|
||||||
|
|
||||||
|
@ -141,11 +141,11 @@ size_t cWorldStorage::GetSaveQueueLength(void)
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
void cWorldStorage::QueueLoadChunk(int a_ChunkX, int a_ChunkZ, bool a_Generate)
|
void cWorldStorage::QueueLoadChunk(int a_ChunkX, int a_ChunkZ)
|
||||||
{
|
{
|
||||||
ASSERT(m_World->IsChunkQueued(a_ChunkX, a_ChunkZ));
|
ASSERT(m_World->IsChunkQueued(a_ChunkX, a_ChunkZ));
|
||||||
|
|
||||||
m_LoadQueue.EnqueueItem(sChunkLoad(a_ChunkX, a_ChunkZ, a_Generate));
|
m_LoadQueue.EnqueueItem(cChunkCoords(a_ChunkX, a_ChunkZ));
|
||||||
m_Event.Set();
|
m_Event.Set();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -167,7 +167,7 @@ void cWorldStorage::QueueSaveChunk(int a_ChunkX, int a_ChunkZ)
|
|||||||
|
|
||||||
void cWorldStorage::UnqueueLoad(int a_ChunkX, int a_ChunkZ)
|
void cWorldStorage::UnqueueLoad(int a_ChunkX, int a_ChunkZ)
|
||||||
{
|
{
|
||||||
m_LoadQueue.Remove(sChunkLoad(a_ChunkX, a_ChunkZ, true));
|
m_LoadQueue.Remove(cChunkCoords(a_ChunkX, a_ChunkZ));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -246,23 +246,14 @@ void cWorldStorage::Execute(void)
|
|||||||
|
|
||||||
bool cWorldStorage::LoadOneChunk(void)
|
bool cWorldStorage::LoadOneChunk(void)
|
||||||
{
|
{
|
||||||
sChunkLoad ToLoad(0, 0, false);
|
cChunkCoords ToLoad(0, 0);
|
||||||
bool ShouldLoad = m_LoadQueue.TryDequeueItem(ToLoad);
|
bool ShouldLoad = m_LoadQueue.TryDequeueItem(ToLoad);
|
||||||
|
|
||||||
if (ShouldLoad && !LoadChunk(ToLoad.m_ChunkX, ToLoad.m_ChunkZ))
|
if (ShouldLoad)
|
||||||
{
|
{
|
||||||
if (ToLoad.m_Generate)
|
return LoadChunk(ToLoad.m_ChunkX, ToLoad.m_ChunkZ);
|
||||||
{
|
|
||||||
// The chunk couldn't be loaded, generate it:
|
|
||||||
m_World->GetGenerator().QueueGenerateChunk(ToLoad.m_ChunkX, ToLoad.m_ChunkZ, false);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// TODO: Notify the world that the load has failed:
|
|
||||||
// m_World->ChunkLoadFailed(ToLoad.m_ChunkX, ToLoad.m_ChunkZ);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return ShouldLoad;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -64,12 +64,9 @@ public:
|
|||||||
cWorldStorage(void);
|
cWorldStorage(void);
|
||||||
~cWorldStorage();
|
~cWorldStorage();
|
||||||
|
|
||||||
void QueueLoadChunk(int a_ChunkX, int a_ChunkZ, bool a_Generate); // Queues the chunk for loading; if not loaded, the chunk will be generated if a_Generate is true
|
void QueueLoadChunk(int a_ChunkX, int a_ChunkZ);
|
||||||
void QueueSaveChunk(int a_ChunkX, int a_ChunkZ);
|
void QueueSaveChunk(int a_ChunkX, int a_ChunkZ);
|
||||||
|
|
||||||
/// Loads the chunk specified; returns true on success, false on failure
|
|
||||||
bool LoadChunk(int a_ChunkX, int a_ChunkZ);
|
|
||||||
|
|
||||||
void UnqueueLoad(int a_ChunkX, int a_ChunkZ);
|
void UnqueueLoad(int a_ChunkX, int a_ChunkZ);
|
||||||
void UnqueueSave(const cChunkCoords & a_Chunk);
|
void UnqueueSave(const cChunkCoords & a_Chunk);
|
||||||
|
|
||||||
@ -84,38 +81,10 @@ public:
|
|||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
|
||||||
struct sChunkLoad
|
|
||||||
{
|
|
||||||
int m_ChunkX;
|
|
||||||
int m_ChunkZ;
|
|
||||||
bool m_Generate; // If true, the chunk will be generated if it cannot be loaded
|
|
||||||
|
|
||||||
sChunkLoad(int a_ChunkX, int a_ChunkZ, bool a_Generate) : m_ChunkX(a_ChunkX), m_ChunkZ(a_ChunkZ), m_Generate(a_Generate) {}
|
|
||||||
|
|
||||||
bool operator ==(const sChunkLoad other) const
|
|
||||||
{
|
|
||||||
return (
|
|
||||||
(this->m_ChunkX == other.m_ChunkX) &&
|
|
||||||
(this->m_ChunkZ == other.m_ChunkZ)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
} ;
|
|
||||||
|
|
||||||
struct FuncTable
|
|
||||||
{
|
|
||||||
static void Delete(sChunkLoad) {}
|
|
||||||
static void Combine(sChunkLoad & a_orig, const sChunkLoad a_new)
|
|
||||||
{
|
|
||||||
a_orig.m_Generate |= a_new.m_Generate;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
typedef cQueue<sChunkLoad, FuncTable> sChunkLoadQueue;
|
|
||||||
|
|
||||||
cWorld * m_World;
|
cWorld * m_World;
|
||||||
AString m_StorageSchemaName;
|
AString m_StorageSchemaName;
|
||||||
|
|
||||||
sChunkLoadQueue m_LoadQueue;
|
cChunkCoordsQueue m_LoadQueue;
|
||||||
cChunkCoordsQueue m_SaveQueue;
|
cChunkCoordsQueue m_SaveQueue;
|
||||||
|
|
||||||
/// All the storage schemas (all used for loading)
|
/// All the storage schemas (all used for loading)
|
||||||
@ -123,7 +92,11 @@ protected:
|
|||||||
|
|
||||||
/// The one storage schema used for saving
|
/// The one storage schema used for saving
|
||||||
cWSSchema * m_SaveSchema;
|
cWSSchema * m_SaveSchema;
|
||||||
|
|
||||||
|
|
||||||
|
/// Loads the chunk specified; returns true on success, false on failure
|
||||||
|
bool LoadChunk(int a_ChunkX, int a_ChunkZ);
|
||||||
|
|
||||||
void InitSchemas(int a_StorageCompressionFactor);
|
void InitSchemas(int a_StorageCompressionFactor);
|
||||||
|
|
||||||
virtual void Execute(void) override;
|
virtual void Execute(void) override;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user