blob: de1b081d54dbae7a1d05b1770bdf0b23d846ccc3 (
plain) (
tree)
|
|
// cChunkGenerator.h
// Interfaces to the cChunkGenerator class representing the thread that generates chunks
// The object takes requests for generating chunks and processes them in a separate thread one by one.
// The requests are not added to the queue if there is already a request with the same coords
// Before generating, the thread checks if the chunk hasn't been already generated.
// It is theoretically possible to have multiple generator threads by having multiple instances of this object
// but then it MAY happen that the chunk is generated twice
// If the generator queue is overloaded, the generator skips chunks with no clients in them
#pragma once
#include "cIsThread.h"
#include "cChunk.h"
class cWorld;
class cWorldGenerator;
class cChunkGenerator :
cIsThread
{
typedef cIsThread super;
public:
cChunkGenerator (void);
~cChunkGenerator();
bool Start(cWorld * a_World, const AString & a_WorldGeneratorName);
void Stop(void);
void GenerateChunk(int a_ChunkX, int a_ChunkY, int a_ChunkZ); // Queues the chunk for generation; removes duplicate requests
void WaitForQueueEmpty(void);
int GetQueueLength(void);
private:
cWorld * m_World;
cWorldGenerator * m_pWorldGenerator;
cCriticalSection m_CS;
cChunkCoordsList 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
// cIsThread override:
virtual void Execute(void) override;
void DoGenerate(int a_ChunkX, int a_ChunkY, int a_ChunkZ);
};
|