From 7a9925f982e43fcc1d798318905d83b5805b12cc Mon Sep 17 00:00:00 2001 From: "madmaxoft@gmail.com" Date: Fri, 17 Feb 2012 18:24:34 +0000 Subject: Added the skeleton of the cLightingThread object git-svn-id: http://mc-server.googlecode.com/svn/trunk@286 0a769ca7-a7f5-676a-18bf-c427514a06d6 --- VC2008/MCServer.vcproj | 8 +++ VC2010/MCServer.vcxproj | 2 + VC2010/MCServer.vcxproj.filters | 2 + source/LightingThread.cpp | 114 ++++++++++++++++++++++++++++++++++++++++ source/LightingThread.h | 82 +++++++++++++++++++++++++++++ 5 files changed, 208 insertions(+) create mode 100644 source/LightingThread.cpp create mode 100644 source/LightingThread.h diff --git a/VC2008/MCServer.vcproj b/VC2008/MCServer.vcproj index 504ffc9ae..9bc013b95 100644 --- a/VC2008/MCServer.vcproj +++ b/VC2008/MCServer.vcproj @@ -553,6 +553,14 @@ RelativePath="..\source\LeakFinder.h" > + + + + diff --git a/VC2010/MCServer.vcxproj b/VC2010/MCServer.vcxproj index 620e3fb54..f4fb93398 100644 --- a/VC2010/MCServer.vcxproj +++ b/VC2010/MCServer.vcxproj @@ -399,6 +399,7 @@ NotUsing true + @@ -572,6 +573,7 @@ + diff --git a/VC2010/MCServer.vcxproj.filters b/VC2010/MCServer.vcxproj.filters index 5aa4a95a0..e8d4574b5 100644 --- a/VC2010/MCServer.vcxproj.filters +++ b/VC2010/MCServer.vcxproj.filters @@ -911,6 +911,7 @@ + @@ -1406,6 +1407,7 @@ + diff --git a/source/LightingThread.cpp b/source/LightingThread.cpp new file mode 100644 index 000000000..e70dc252e --- /dev/null +++ b/source/LightingThread.cpp @@ -0,0 +1,114 @@ + +// LightingThread.cpp + +// Implements the cLightingThread class representing the thread that processes requests for lighting + +#include "Globals.h" +#include "LightingThread.h" + + + + + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// cLightingThread: + +cLightingThread::cLightingThread(void) : + super("cLightingThread") +{ +} + + + + + +cLightingThread::~cLightingThread() +{ + Stop(); +} + + + + + +void cLightingThread::Stop(void) +{ + { + cCSLock Lock(m_CS); + for (cLightingBufferQueue::iterator itr = m_Queue.begin(); itr != m_Queue.end(); ++itr) + { + delete *itr; + } // for itr - m_Queue[] + } + mShouldTerminate = true; + m_Event.Set(); + + Wait(); +} + + + + + +void cLightingThread::QueueLighting(cWorld * a_World, int a_MinX, int a_MaxX, int a_MinY, int a_MaxY, int a_MinZ, int a_MaxZ) +{ + // TODO +} + + + + + +void cLightingThread::Execute(void) +{ + // TODO +} + + + + + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// cLightingThread::cLightingBuffer: + +cLightingThread::cLightingBuffer::cLightingBuffer(int a_MinX, int a_MaxX, int a_MinY, int a_MaxY, int a_MinZ, int a_MaxZ) : + m_MinX(a_MinX), + m_MaxX(a_MaxX), + m_MinY(a_MinY), + m_MaxY(a_MaxY), + m_MinZ(a_MinZ), + m_MaxZ(a_MaxZ) +{ + // TODO: initialize strides +} + + + + + +void cLightingThread::cLightingBuffer::GetFromWorld(cWorld * a_World) +{ + // TODO: Set m_BlockData, m_SkyLight and m_BlockLight from the world's chunks +} + + + + + +void cLightingThread::cLightingBuffer::SetToWorld (cWorld * a_World) +{ + // TODO: Set world's chunks from m_BlockData, m_SkyLight and m_BlockLight +} + + + + + +void cLightingThread::cLightingBuffer::Process(void) +{ + // TODO: Does the actual lighting on this buffer +} + + + + diff --git a/source/LightingThread.h b/source/LightingThread.h new file mode 100644 index 000000000..5b60d34bf --- /dev/null +++ b/source/LightingThread.h @@ -0,0 +1,82 @@ + +// LightingThread.h + +// Interfaces to the cLightingThread class representing the thread that processes requests for lighting +// Note that the world generators need direct access to the lighting methods so that they can light the generated chunk + + + + +#pragma once + +#include "cIsThread.h" + + + + + +// fwd: +class cWorld; + + + + + +class cLightingThread : + public cIsThread +{ + typedef cIsThread super; + +public: + + class cLightingBuffer + { + public: + cLightingBuffer(int m_MinX, int m_MaxX, int m_MinY, int m_MaxY, int m_MinZ, int m_MaxZ); + + /// Copies the world's existing chunks into m_BlockData, m_Skylight and m_BlockLight + void GetFromWorld(cWorld * a_World); + void SetToWorld (cWorld * a_World); + + void Process(void); // Does the actual lighting on this buffer + + protected: + + // Block coords: + int m_MinX, m_MaxX; + int m_MinY, m_MaxY; + int m_MinZ, m_MaxZ; + + int m_StrideX; // = OffsetOfBlock(x, y, z) - OffsetOfBlock(x + 1, y, z) + int m_StrideZ; // = OffsetOfBlock(x, y, z) - OffsetOfBlock(x, y, z + 1) + + // These buffers actually store 1 block in each direction more than is specified in the coords + // This way we can throw out a lot of conditions inside the processing cycles + // And it allows us to light a chunk with regard to its surrounding chunks without much work + // (So if m_MinX is 16 and m_MaxX is 32, the buffers actually contain data for X in range from 15 to 33 (18 items) + char * m_BlockData; + char * m_SkyLight; + char * m_BlockLight; + } ; + + cLightingThread(void); + ~cLightingThread(); + + void Stop(void); + + void QueueLighting(cWorld * a_World, int a_MinX, int a_MaxX, int a_MinY, int a_MaxY, int a_MinZ, int a_MaxZ); // queues the request + +protected: + + typedef std::list cLightingBufferQueue; + + cCriticalSection m_CS; + cLightingBufferQueue m_Queue; + cEvent m_Event; // Set when queue is appended or to stop the thread + + virtual void Execute(void) override; +} ; + + + + -- cgit v1.2.3