Made cLightingThread own its callbacks
This commit is contained in:
parent
4feccaa64a
commit
06a74e45e2
@ -303,10 +303,9 @@ static int tolua_cWorld_PrepareChunk(lua_State * tolua_S)
|
|||||||
cLuaState m_LuaState;
|
cLuaState m_LuaState;
|
||||||
cLuaState::cRef m_Callback;
|
cLuaState::cRef m_Callback;
|
||||||
};
|
};
|
||||||
cCallback * callback = new cCallback(tolua_S);
|
|
||||||
|
|
||||||
// Call the chunk preparation:
|
// Call the chunk preparation:
|
||||||
world->PrepareChunk(chunkX, chunkZ, callback);
|
world->PrepareChunk(chunkX, chunkZ, cpp14::make_unique<cCallback>(tolua_S));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2401,7 +2401,7 @@ void cChunkMap::TouchChunk(int a_ChunkX, int a_ChunkZ)
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
void cChunkMap::PrepareChunk(int a_ChunkX, int a_ChunkZ, cChunkCoordCallback * a_Callback)
|
void cChunkMap::PrepareChunk(int a_ChunkX, int a_ChunkZ, std::unique_ptr<cChunkCoordCallback> a_Callback)
|
||||||
{
|
{
|
||||||
cCSLock Lock(m_CSLayers);
|
cCSLock Lock(m_CSLayers);
|
||||||
cChunkPtr Chunk = GetChunkNoLoad(a_ChunkX, a_ChunkZ);
|
cChunkPtr Chunk = GetChunkNoLoad(a_ChunkX, a_ChunkZ);
|
||||||
@ -2409,7 +2409,7 @@ void cChunkMap::PrepareChunk(int a_ChunkX, int a_ChunkZ, cChunkCoordCallback * a
|
|||||||
// If the chunk is not prepared, queue it in the lighting thread, that will do all the needed processing:
|
// If the chunk is not prepared, queue it in the lighting thread, that will do all the needed processing:
|
||||||
if ((Chunk == nullptr) || !Chunk->IsValid() || !Chunk->IsLightValid())
|
if ((Chunk == nullptr) || !Chunk->IsValid() || !Chunk->IsLightValid())
|
||||||
{
|
{
|
||||||
m_World->GetLightingThread().QueueChunk(a_ChunkX, a_ChunkZ, a_Callback);
|
m_World->GetLightingThread().QueueChunk(a_ChunkX, a_ChunkZ, std::move(a_Callback));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -322,7 +322,7 @@ public:
|
|||||||
The specified chunk is queued to be loaded or generated, and lit if needed.
|
The specified chunk is queued to be loaded or generated, and lit if needed.
|
||||||
The specified callback is called after the chunk has been prepared. If there's no preparation to do, only the callback is called.
|
The specified callback is called after the chunk has been prepared. If there's no preparation to do, only the callback is called.
|
||||||
It is legal to call without the callback. */
|
It is legal to call without the callback. */
|
||||||
void PrepareChunk(int a_ChunkX, int a_ChunkZ, cChunkCoordCallback * a_CallAfter = nullptr); // Lua-accessible
|
void PrepareChunk(int a_ChunkX, int a_ChunkZ, std::unique_ptr<cChunkCoordCallback> a_CallAfter = {}); // Lua-accessible
|
||||||
|
|
||||||
/** Queues the chunk for generating.
|
/** Queues the chunk for generating.
|
||||||
First attempts to load the chunk from the storage. If that fails, queues the chunk for generating.
|
First attempts to load the chunk from the storage. If that fails, queues the chunk for generating.
|
||||||
|
@ -21,10 +21,21 @@
|
|||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
// cNotifyChunkSender:
|
// cNotifyChunkSender:
|
||||||
|
|
||||||
void cNotifyChunkSender::Call(int a_ChunkX, int a_ChunkZ)
|
|
||||||
|
/// Callback that can be used to notify chunk sender upon another chunkcoord notification
|
||||||
|
class cNotifyChunkSender :
|
||||||
|
public cChunkCoordCallback
|
||||||
{
|
{
|
||||||
m_ChunkSender->ChunkReady(a_ChunkX, a_ChunkZ);
|
virtual void Call(int a_ChunkX, int a_ChunkZ) override
|
||||||
}
|
{
|
||||||
|
m_ChunkSender->ChunkReady(a_ChunkX, a_ChunkZ);
|
||||||
|
}
|
||||||
|
|
||||||
|
cChunkSender * m_ChunkSender;
|
||||||
|
public:
|
||||||
|
cNotifyChunkSender(cChunkSender * a_ChunkSender) : m_ChunkSender(a_ChunkSender) {}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -36,10 +47,8 @@ void cNotifyChunkSender::Call(int a_ChunkX, int a_ChunkZ)
|
|||||||
cChunkSender::cChunkSender(void) :
|
cChunkSender::cChunkSender(void) :
|
||||||
super("ChunkSender"),
|
super("ChunkSender"),
|
||||||
m_World(nullptr),
|
m_World(nullptr),
|
||||||
m_RemoveCount(0),
|
m_RemoveCount(0)
|
||||||
m_Notify(nullptr)
|
|
||||||
{
|
{
|
||||||
m_Notify.SetChunkSender(this);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -272,7 +281,7 @@ void cChunkSender::SendChunk(int a_ChunkX, int a_ChunkZ, cClientHandle * a_Clien
|
|||||||
// If the chunk is not lighted, queue it for relighting and get notified when it's ready:
|
// If the chunk is not lighted, queue it for relighting and get notified when it's ready:
|
||||||
if (!m_World->IsChunkLighted(a_ChunkX, a_ChunkZ))
|
if (!m_World->IsChunkLighted(a_ChunkX, a_ChunkZ))
|
||||||
{
|
{
|
||||||
m_World->QueueLightChunk(a_ChunkX, a_ChunkZ, &m_Notify);
|
m_World->QueueLightChunk(a_ChunkX, a_ChunkZ, cpp14::make_unique<cNotifyChunkSender>(this));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -47,26 +47,6 @@ class cChunkSender;
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
/// Callback that can be used to notify chunk sender upon another chunkcoord notification
|
|
||||||
class cNotifyChunkSender :
|
|
||||||
public cChunkCoordCallback
|
|
||||||
{
|
|
||||||
virtual void Call(int a_ChunkX, int a_ChunkZ) override;
|
|
||||||
|
|
||||||
cChunkSender * m_ChunkSender;
|
|
||||||
public:
|
|
||||||
cNotifyChunkSender(cChunkSender * a_ChunkSender) : m_ChunkSender(a_ChunkSender) {}
|
|
||||||
|
|
||||||
void SetChunkSender(cChunkSender * a_ChunkSender)
|
|
||||||
{
|
|
||||||
m_ChunkSender = a_ChunkSender;
|
|
||||||
}
|
|
||||||
} ;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class cChunkSender:
|
class cChunkSender:
|
||||||
public cIsThread,
|
public cIsThread,
|
||||||
public cChunkDataSeparateCollector
|
public cChunkDataSeparateCollector
|
||||||
@ -150,8 +130,6 @@ protected:
|
|||||||
cEvent m_evtRemoved; // Set when removed clients are safe to be deleted
|
cEvent m_evtRemoved; // Set when removed clients are safe to be deleted
|
||||||
int m_RemoveCount; // Number of threads waiting for a client removal (m_evtRemoved needs to be set this many times)
|
int m_RemoveCount; // Number of threads waiting for a client removal (m_evtRemoved needs to be set this many times)
|
||||||
|
|
||||||
cNotifyChunkSender m_Notify; // Used for chunks that don't have a valid lighting - they will be re-queued after lightcalc
|
|
||||||
|
|
||||||
// Data about the chunk that is being sent:
|
// Data about the chunk that is being sent:
|
||||||
// NOTE that m_BlockData[] is inherited from the cChunkDataCollector
|
// NOTE that m_BlockData[] is inherited from the cChunkDataCollector
|
||||||
unsigned char m_BiomeMap[cChunkDef::Width * cChunkDef::Width];
|
unsigned char m_BiomeMap[cChunkDef::Width * cChunkDef::Width];
|
||||||
|
@ -149,11 +149,11 @@ void cLightingThread::Stop(void)
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
void cLightingThread::QueueChunk(int a_ChunkX, int a_ChunkZ, cChunkCoordCallback * a_CallbackAfter)
|
void cLightingThread::QueueChunk(int a_ChunkX, int a_ChunkZ, std::unique_ptr<cChunkCoordCallback> a_CallbackAfter)
|
||||||
{
|
{
|
||||||
ASSERT(m_World != nullptr); // Did you call Start() properly?
|
ASSERT(m_World != nullptr); // Did you call Start() properly?
|
||||||
|
|
||||||
cChunkStay * ChunkStay = new cLightingChunkStay(*this, a_ChunkX, a_ChunkZ, a_CallbackAfter);
|
cChunkStay * ChunkStay = new cLightingChunkStay(*this, a_ChunkX, a_ChunkZ, std::move(a_CallbackAfter));
|
||||||
{
|
{
|
||||||
// The ChunkStay will enqueue itself using the QueueChunkStay() once it is fully loaded
|
// The ChunkStay will enqueue itself using the QueueChunkStay() once it is fully loaded
|
||||||
// In the meantime, put it into the PendingQueue so that it can be removed when stopping the thread
|
// In the meantime, put it into the PendingQueue so that it can be removed when stopping the thread
|
||||||
@ -599,11 +599,11 @@ void cLightingThread::QueueChunkStay(cLightingChunkStay & a_ChunkStay)
|
|||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
// cLightingThread::cLightingChunkStay:
|
// cLightingThread::cLightingChunkStay:
|
||||||
|
|
||||||
cLightingThread::cLightingChunkStay::cLightingChunkStay(cLightingThread & a_LightingThread, int a_ChunkX, int a_ChunkZ, cChunkCoordCallback * a_CallbackAfter) :
|
cLightingThread::cLightingChunkStay::cLightingChunkStay(cLightingThread & a_LightingThread, int a_ChunkX, int a_ChunkZ, std::unique_ptr<cChunkCoordCallback> a_CallbackAfter) :
|
||||||
m_LightingThread(a_LightingThread),
|
m_LightingThread(a_LightingThread),
|
||||||
m_ChunkX(a_ChunkX),
|
m_ChunkX(a_ChunkX),
|
||||||
m_ChunkZ(a_ChunkZ),
|
m_ChunkZ(a_ChunkZ),
|
||||||
m_CallbackAfter(a_CallbackAfter)
|
m_CallbackAfter(std::move(a_CallbackAfter))
|
||||||
{
|
{
|
||||||
Add(a_ChunkX + 1, a_ChunkZ + 1);
|
Add(a_ChunkX + 1, a_ChunkZ + 1);
|
||||||
Add(a_ChunkX + 1, a_ChunkZ);
|
Add(a_ChunkX + 1, a_ChunkZ);
|
||||||
|
@ -61,7 +61,7 @@ public:
|
|||||||
void Stop(void);
|
void Stop(void);
|
||||||
|
|
||||||
/** Queues the entire chunk for lighting */
|
/** Queues the entire chunk for lighting */
|
||||||
void QueueChunk(int a_ChunkX, int a_ChunkZ, cChunkCoordCallback * a_CallbackAfter = nullptr);
|
void QueueChunk(int a_ChunkX, int a_ChunkZ, std::unique_ptr<cChunkCoordCallback> a_CallbackAfter);
|
||||||
|
|
||||||
/** Blocks until the queue is empty or the thread is terminated */
|
/** Blocks until the queue is empty or the thread is terminated */
|
||||||
void WaitForQueueEmpty(void);
|
void WaitForQueueEmpty(void);
|
||||||
@ -77,9 +77,9 @@ protected:
|
|||||||
cLightingThread & m_LightingThread;
|
cLightingThread & m_LightingThread;
|
||||||
int m_ChunkX;
|
int m_ChunkX;
|
||||||
int m_ChunkZ;
|
int m_ChunkZ;
|
||||||
cChunkCoordCallback * m_CallbackAfter;
|
std::unique_ptr<cChunkCoordCallback> m_CallbackAfter;
|
||||||
|
|
||||||
cLightingChunkStay(cLightingThread & a_LightingThread, int a_ChunkX, int a_ChunkZ, cChunkCoordCallback * a_CallbackAfter);
|
cLightingChunkStay(cLightingThread & a_LightingThread, int a_ChunkX, int a_ChunkZ, std::unique_ptr<cChunkCoordCallback> a_CallbackAfter);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
virtual void OnChunkAvailable(int a_ChunkX, int a_ChunkZ) override
|
virtual void OnChunkAvailable(int a_ChunkX, int a_ChunkZ) override
|
||||||
|
@ -8,6 +8,26 @@
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
class cSpawnPrepareCallback :
|
||||||
|
public cChunkCoordCallback
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
cSpawnPrepareCallback(cSpawnPrepare & a_SpawnPrepare) :
|
||||||
|
m_SpawnPrepare(a_SpawnPrepare)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
protected:
|
||||||
|
|
||||||
|
cSpawnPrepare & m_SpawnPrepare;
|
||||||
|
|
||||||
|
virtual void Call(int a_ChunkX, int a_ChunkZ) override
|
||||||
|
{
|
||||||
|
m_SpawnPrepare.PreparedChunkCallback(a_ChunkX, a_ChunkZ);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
cSpawnPrepare::cSpawnPrepare(cWorld & a_World, int a_SpawnChunkX, int a_SpawnChunkZ, int a_PrepareDistance, int a_FirstIdx):
|
cSpawnPrepare::cSpawnPrepare(cWorld & a_World, int a_SpawnChunkX, int a_SpawnChunkZ, int a_PrepareDistance, int a_FirstIdx):
|
||||||
@ -40,7 +60,7 @@ void cSpawnPrepare::PrepareChunks(cWorld & a_World, int a_SpawnChunkX, int a_Spa
|
|||||||
{
|
{
|
||||||
int chunkX, chunkZ;
|
int chunkX, chunkZ;
|
||||||
prep.DecodeChunkCoords(i, chunkX, chunkZ);
|
prep.DecodeChunkCoords(i, chunkX, chunkZ);
|
||||||
a_World.PrepareChunk(chunkX, chunkZ, &prep);
|
a_World.PrepareChunk(chunkX, chunkZ, cpp14::make_unique<cSpawnPrepareCallback>(prep));
|
||||||
} // for i
|
} // for i
|
||||||
|
|
||||||
// Wait for the lighting thread to prepare everything. Event is set in the Call() callback:
|
// Wait for the lighting thread to prepare everything. Event is set in the Call() callback:
|
||||||
@ -69,7 +89,7 @@ void cSpawnPrepare::DecodeChunkCoords(int a_Idx, int & a_ChunkX, int & a_ChunkZ)
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
void cSpawnPrepare::Call(int a_ChunkX, int a_ChunkZ)
|
void cSpawnPrepare::PreparedChunkCallback(int a_ChunkX, int a_ChunkZ)
|
||||||
{
|
{
|
||||||
// Check if this was the last chunk:
|
// Check if this was the last chunk:
|
||||||
m_NumPrepared += 1;
|
m_NumPrepared += 1;
|
||||||
@ -85,7 +105,7 @@ void cSpawnPrepare::Call(int a_ChunkX, int a_ChunkZ)
|
|||||||
{
|
{
|
||||||
int chunkX, chunkZ;
|
int chunkX, chunkZ;
|
||||||
DecodeChunkCoords(m_NextIdx, chunkX, chunkZ);
|
DecodeChunkCoords(m_NextIdx, chunkX, chunkZ);
|
||||||
m_World.GetLightingThread().QueueChunk(chunkX, chunkZ, this);
|
m_World.GetLightingThread().QueueChunk(chunkX, chunkZ, cpp14::make_unique<cSpawnPrepareCallback>(*this));
|
||||||
m_NextIdx += 1;
|
m_NextIdx += 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -6,8 +6,7 @@ class cWorld;
|
|||||||
|
|
||||||
|
|
||||||
/** Generates and lights the spawn area of the world. Runs as a separate thread. */
|
/** Generates and lights the spawn area of the world. Runs as a separate thread. */
|
||||||
class cSpawnPrepare:
|
class cSpawnPrepare
|
||||||
public cChunkCoordCallback
|
|
||||||
{
|
{
|
||||||
|
|
||||||
public:
|
public:
|
||||||
@ -39,9 +38,12 @@ protected:
|
|||||||
|
|
||||||
cSpawnPrepare(cWorld & a_World, int a_SpawnChunkX, int a_SpawnChunkZ, int a_PrepareDistance, int a_FirstIdx);
|
cSpawnPrepare(cWorld & a_World, int a_SpawnChunkX, int a_SpawnChunkZ, int a_PrepareDistance, int a_FirstIdx);
|
||||||
|
|
||||||
virtual void Call(int a_ChunkX, int a_ChunkZ) override;
|
void PreparedChunkCallback(int a_ChunkX, int a_ChunkZ);
|
||||||
|
|
||||||
/** Decodes the index into chunk coords. Provides the specific chunk ordering. */
|
/** Decodes the index into chunk coords. Provides the specific chunk ordering. */
|
||||||
void DecodeChunkCoords(int a_Idx, int & a_ChunkX, int & a_ChunkZ);
|
void DecodeChunkCoords(int a_Idx, int & a_ChunkX, int & a_ChunkZ);
|
||||||
|
|
||||||
|
friend class cSpawnPrepareCallback;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -2872,9 +2872,9 @@ void cWorld::TouchChunk(int a_ChunkX, int a_ChunkZ)
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
void cWorld::PrepareChunk(int a_ChunkX, int a_ChunkZ, cChunkCoordCallback * a_CallAfter)
|
void cWorld::PrepareChunk(int a_ChunkX, int a_ChunkZ, std::unique_ptr<cChunkCoordCallback> a_CallAfter)
|
||||||
{
|
{
|
||||||
m_ChunkMap->PrepareChunk(a_ChunkX, a_ChunkZ, a_CallAfter);
|
m_ChunkMap->PrepareChunk(a_ChunkX, a_ChunkZ, std::move(a_CallAfter));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -2998,9 +2998,9 @@ void cWorld::GenerateChunk(int a_ChunkX, int a_ChunkZ)
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
void cWorld::QueueLightChunk(int a_ChunkX, int a_ChunkZ, cChunkCoordCallback * a_Callback)
|
void cWorld::QueueLightChunk(int a_ChunkX, int a_ChunkZ, std::unique_ptr<cChunkCoordCallback> a_Callback)
|
||||||
{
|
{
|
||||||
m_Lighting.QueueChunk(a_ChunkX, a_ChunkZ, a_Callback);
|
m_Lighting.QueueChunk(a_ChunkX, a_ChunkZ, std::move(a_Callback));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -385,7 +385,7 @@ public:
|
|||||||
The specified chunk is queued to be loaded or generated, and lit if needed.
|
The specified chunk is queued to be loaded or generated, and lit if needed.
|
||||||
The specified callback is called after the chunk has been prepared. If there's no preparation to do, only the callback is called.
|
The specified callback is called after the chunk has been prepared. If there's no preparation to do, only the callback is called.
|
||||||
It is legal to call with no callback. */
|
It is legal to call with no callback. */
|
||||||
void PrepareChunk(int a_ChunkX, int a_ChunkZ, cChunkCoordCallback * a_CallAfter = nullptr);
|
void PrepareChunk(int a_ChunkX, int a_ChunkZ, std::unique_ptr<cChunkCoordCallback> a_CallAfter = {});
|
||||||
|
|
||||||
/** Marks the chunk as failed-to-load: */
|
/** Marks the chunk as failed-to-load: */
|
||||||
void ChunkLoadFailed(int a_ChunkX, int a_ChunkZ);
|
void ChunkLoadFailed(int a_ChunkX, int a_ChunkZ);
|
||||||
@ -409,7 +409,7 @@ public:
|
|||||||
void GenerateChunk(int a_ChunkX, int a_ChunkZ); // tolua_export
|
void GenerateChunk(int a_ChunkX, int a_ChunkZ); // tolua_export
|
||||||
|
|
||||||
/** Queues a chunk for lighting; a_Callback is called after the chunk is lighted */
|
/** Queues a chunk for lighting; a_Callback is called after the chunk is lighted */
|
||||||
void QueueLightChunk(int a_ChunkX, int a_ChunkZ, cChunkCoordCallback * a_Callback = nullptr);
|
void QueueLightChunk(int a_ChunkX, int a_ChunkZ, std::unique_ptr<cChunkCoordCallback> a_Callback = {});
|
||||||
|
|
||||||
bool IsChunkLighted(int a_ChunkX, int a_ChunkZ);
|
bool IsChunkLighted(int a_ChunkX, int a_ChunkZ);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user