BiomeVisualiser: initial import
git-svn-id: http://mc-server.googlecode.com/svn/trunk@1192 0a769ca7-a7f5-676a-18bf-c427514a06d6
This commit is contained in:
parent
fdcad8a72d
commit
2c214603e2
333
BiomeVisualiser/BiomeCache.cpp
Normal file
333
BiomeVisualiser/BiomeCache.cpp
Normal file
@ -0,0 +1,333 @@
|
|||||||
|
|
||||||
|
// BiomeCache.cpp
|
||||||
|
|
||||||
|
// Implements the cBiomeCache class representing a biome source that caches data from the underlying biome source
|
||||||
|
|
||||||
|
#include "Globals.h"
|
||||||
|
#include "BiomeCache.h"
|
||||||
|
#include "Timer.h"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
static int GetNumCores(void)
|
||||||
|
{
|
||||||
|
// Get number of cores by querying the system process affinity mask
|
||||||
|
DWORD Affinity, ProcAffinity;
|
||||||
|
GetProcessAffinityMask(GetCurrentProcess(), &ProcAffinity, &Affinity);
|
||||||
|
int NumCores = 0;
|
||||||
|
while (Affinity > 0)
|
||||||
|
{
|
||||||
|
if ((Affinity & 1) == 1)
|
||||||
|
{
|
||||||
|
NumCores++;
|
||||||
|
}
|
||||||
|
Affinity >>= 1;
|
||||||
|
} // while (Affinity > 0)
|
||||||
|
return NumCores;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
cBiomeCache::cBiomeCache(void) :
|
||||||
|
m_Source(NULL),
|
||||||
|
m_BaseX(MAXINT),
|
||||||
|
m_BaseZ(MAXINT),
|
||||||
|
m_Available(NULL),
|
||||||
|
m_IsTerminatingThreads(false)
|
||||||
|
{
|
||||||
|
int NumThreads = GetNumCores();
|
||||||
|
NumThreads--; // One core should be left for the system to run on ;)
|
||||||
|
for (int i = NumThreads; i > 0; i--)
|
||||||
|
{
|
||||||
|
cThread * Thread = new cThread(*this);
|
||||||
|
m_Threads.push_back(Thread);
|
||||||
|
Thread->Start();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
cBiomeCache::~cBiomeCache()
|
||||||
|
{
|
||||||
|
m_IsTerminatingThreads = true;
|
||||||
|
for (cThreads::iterator itr = m_Threads.begin(), end = m_Threads.end(); itr != end; ++itr)
|
||||||
|
{
|
||||||
|
m_evtQueued.Set();
|
||||||
|
}
|
||||||
|
for (cThreads::iterator itr = m_Threads.begin(), end = m_Threads.end(); itr != end; ++itr)
|
||||||
|
{
|
||||||
|
delete *itr;
|
||||||
|
}
|
||||||
|
m_Threads.clear();
|
||||||
|
|
||||||
|
SetSource(NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
cBiomeSource::eAvailability cBiomeCache::GetBiome(int a_ChunkX, int a_ChunkZ, cChunkDef::BiomeMap & a_Biomes)
|
||||||
|
{
|
||||||
|
if (m_Source == NULL)
|
||||||
|
{
|
||||||
|
return baNever;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Look up using the cache:
|
||||||
|
int x = a_ChunkX - m_BaseX;
|
||||||
|
int z = a_ChunkZ - m_BaseZ;
|
||||||
|
if ((x < 0) || (x >= m_Width) || (z < 0) || (z >= m_Height))
|
||||||
|
{
|
||||||
|
// Outside the cached region
|
||||||
|
return baNever;
|
||||||
|
}
|
||||||
|
|
||||||
|
cCSLock Lock(m_CS);
|
||||||
|
cItem * Item = m_Available[x + m_Width * z];
|
||||||
|
if (Item == NULL)
|
||||||
|
{
|
||||||
|
// Item hasn't been processed yet
|
||||||
|
return baLater;
|
||||||
|
}
|
||||||
|
if (Item->m_IsValid)
|
||||||
|
{
|
||||||
|
memcpy(a_Biomes, Item->m_Biomes, sizeof(a_Biomes));
|
||||||
|
return baNow;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Item has been processed, but the underlying source refused to give the data to us
|
||||||
|
return baNever;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void cBiomeCache::HintViewArea(int a_MinChunkX, int a_MaxChunkX, int a_MinChunkZ, int a_MaxChunkZ)
|
||||||
|
{
|
||||||
|
cTimer Timer("Cache: HintViewArea");
|
||||||
|
|
||||||
|
if (
|
||||||
|
(a_MinChunkX == m_BaseX) &&
|
||||||
|
(a_MaxChunkX == m_BaseX + m_Width - 1) &&
|
||||||
|
(a_MinChunkZ == m_BaseZ) &&
|
||||||
|
(a_MaxChunkZ == m_BaseZ + m_Height - 1)
|
||||||
|
)
|
||||||
|
{
|
||||||
|
// The same set of parameters, bail out
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (m_Source != NULL)
|
||||||
|
{
|
||||||
|
m_Source->HintViewArea(a_MinChunkX, a_MaxChunkX, a_MinChunkZ, a_MaxChunkZ);
|
||||||
|
}
|
||||||
|
|
||||||
|
int NewWidth = a_MaxChunkX - a_MinChunkX + 1;
|
||||||
|
int NewHeight = a_MaxChunkZ - a_MinChunkZ + 1;
|
||||||
|
|
||||||
|
// Make a new empty cache table:
|
||||||
|
pItem * NewAvailable = new pItem[NewWidth * NewHeight];
|
||||||
|
for (int i = NewWidth * NewHeight - 1; i >= 0; --i)
|
||||||
|
{
|
||||||
|
NewAvailable[i] = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Move the common contents of the old table into the new table:
|
||||||
|
cCSLock Lock(m_CS);
|
||||||
|
for (int z = 0; z < NewHeight; z++)
|
||||||
|
{
|
||||||
|
int OldZ = z + a_MinChunkZ - m_BaseZ;
|
||||||
|
if ((OldZ < 0) || (OldZ >= m_Height))
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
for (int x = 0; x < NewWidth; x++)
|
||||||
|
{
|
||||||
|
int OldX = x + a_MinChunkX - m_BaseX;
|
||||||
|
if ((OldX < 0) || (OldX >= m_Width))
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
NewAvailable[x + NewWidth * z] = m_Available[OldX + m_Width * OldZ];
|
||||||
|
m_Available[OldX + m_Width * OldZ] = NULL;
|
||||||
|
} // for x
|
||||||
|
} // for z
|
||||||
|
|
||||||
|
// All items that aren't common go into the pool:
|
||||||
|
for (int idx = 0, z = 0; z < m_Height; z++)
|
||||||
|
{
|
||||||
|
for (int x = 0; x < m_Width; ++x, ++idx)
|
||||||
|
{
|
||||||
|
if (m_Available[idx] != NULL)
|
||||||
|
{
|
||||||
|
m_Pool.push_back(m_Available[idx]);
|
||||||
|
m_Available[idx] = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Replace the cache table:
|
||||||
|
delete m_Available;
|
||||||
|
m_Available = NewAvailable;
|
||||||
|
m_Width = NewWidth;
|
||||||
|
m_Height = NewHeight;
|
||||||
|
m_BaseX = a_MinChunkX;
|
||||||
|
m_BaseZ = a_MinChunkZ;
|
||||||
|
|
||||||
|
// Remove all items outside the coords:
|
||||||
|
FilterOutItems(m_Queue, a_MinChunkX, a_MaxChunkX, a_MinChunkZ, a_MaxChunkZ);
|
||||||
|
|
||||||
|
// Queue all items from inside the coords into m_Queue:
|
||||||
|
for (int z = 0; z < NewHeight; z++)
|
||||||
|
{
|
||||||
|
for (int x = 0; x < NewWidth; x++)
|
||||||
|
{
|
||||||
|
if (m_Available[x + m_Width * z] != NULL)
|
||||||
|
{
|
||||||
|
// Already calculated, skip
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (m_Pool.empty())
|
||||||
|
{
|
||||||
|
m_Pool.push_back(new cItem(x + a_MinChunkX, z + a_MinChunkZ));
|
||||||
|
}
|
||||||
|
ASSERT(!m_Pool.empty());
|
||||||
|
m_Pool.back()->m_ChunkX = x + a_MinChunkX;
|
||||||
|
m_Pool.back()->m_ChunkZ = z + a_MinChunkZ;
|
||||||
|
m_Queue.push_back(m_Pool.back());
|
||||||
|
m_Pool.pop_back();
|
||||||
|
m_evtQueued.Set();
|
||||||
|
} // for x
|
||||||
|
} // for z
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void cBiomeCache::SetSource(cBiomeSource * a_Source)
|
||||||
|
{
|
||||||
|
// TODO: Stop all threads, so that they don't use the source anymore!
|
||||||
|
|
||||||
|
delete m_Source;
|
||||||
|
m_Source = a_Source;
|
||||||
|
|
||||||
|
// Invalidate cache contents:
|
||||||
|
cCSLock Lock(m_CS);
|
||||||
|
m_BaseX = MAXINT;
|
||||||
|
m_BaseZ = MAXINT;
|
||||||
|
m_Pool.splice(m_Pool.end(), m_Queue);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void cBiomeCache::FilterOutItems(cItems & a_Items, int a_MinChunkX, int a_MaxChunkX, int a_MinChunkZ, int a_MaxChunkZ)
|
||||||
|
{
|
||||||
|
for (cItems::iterator itr = a_Items.begin(); itr != a_Items.end();)
|
||||||
|
{
|
||||||
|
if (
|
||||||
|
((*itr)->m_ChunkX < a_MinChunkX) ||
|
||||||
|
((*itr)->m_ChunkX > a_MaxChunkX) ||
|
||||||
|
((*itr)->m_ChunkX < a_MinChunkX) ||
|
||||||
|
((*itr)->m_ChunkX > a_MaxChunkX)
|
||||||
|
)
|
||||||
|
{
|
||||||
|
m_Pool.push_back(*itr);
|
||||||
|
itr = a_Items.erase(itr);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
++itr;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void cBiomeCache::thrProcessQueueItem(void)
|
||||||
|
{
|
||||||
|
cItem * Item = NULL;
|
||||||
|
{
|
||||||
|
cCSLock Lock(m_CS);
|
||||||
|
if (m_Queue.empty())
|
||||||
|
{
|
||||||
|
cCSUnlock Unlock(Lock);
|
||||||
|
m_evtQueued.Wait();
|
||||||
|
}
|
||||||
|
if (m_IsTerminatingThreads || m_Queue.empty())
|
||||||
|
{
|
||||||
|
// We've been woken up only to die / spurious wakeup
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
Item = m_Queue.back();
|
||||||
|
m_Queue.pop_back();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Process the item:
|
||||||
|
Item->m_IsValid = (m_Source->GetBiome(Item->m_ChunkX, Item->m_ChunkZ, Item->m_Biomes) == baNow);
|
||||||
|
|
||||||
|
// Store result:
|
||||||
|
cCSLock Lock(m_CS);
|
||||||
|
int x = Item->m_ChunkX - m_BaseX;
|
||||||
|
int z = Item->m_ChunkZ - m_BaseZ;
|
||||||
|
if ((x < 0) || (x >= m_Width) || (z < 0) || (z >= m_Height))
|
||||||
|
{
|
||||||
|
// The cache rectangle has changed under our fingers, drop this chunk
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
m_Available[x + m_Width * z] = Item;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
// cBiomeCache::cItem:
|
||||||
|
|
||||||
|
cBiomeCache::cItem::cItem(int a_ChunkX, int a_ChunkZ) :
|
||||||
|
m_ChunkX(a_ChunkX),
|
||||||
|
m_ChunkZ(a_ChunkZ)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
// cBiomeCache::cThread:
|
||||||
|
|
||||||
|
cBiomeCache::cThread::cThread(cBiomeCache & a_Parent) :
|
||||||
|
super("Biome cache thread"),
|
||||||
|
m_Parent(a_Parent)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void cBiomeCache::cThread::Execute(void)
|
||||||
|
{
|
||||||
|
while (!m_ShouldTerminate && !m_Parent.m_IsTerminatingThreads)
|
||||||
|
{
|
||||||
|
m_Parent.thrProcessQueueItem();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
96
BiomeVisualiser/BiomeCache.h
Normal file
96
BiomeVisualiser/BiomeCache.h
Normal file
@ -0,0 +1,96 @@
|
|||||||
|
|
||||||
|
// BiomeCache.h
|
||||||
|
|
||||||
|
// Declares the cBiomeCache class representing a biome source that caches data from the underlying biome source
|
||||||
|
|
||||||
|
/*
|
||||||
|
This cache works a bit differently than regular caches.
|
||||||
|
It first receives the hint of area that it will need to provide.
|
||||||
|
The Cache uses several threads to request biomes from the underlying source to fill that area.
|
||||||
|
While the area is being filled, requests for biomes may already come, such requests are answered with baLater if no data yet.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#include "BiomeSource.h"
|
||||||
|
#include "../source/OSSupport/IsThread.h"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
class cBiomeCache :
|
||||||
|
public cBiomeSource
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
cBiomeCache(void);
|
||||||
|
~cBiomeCache();
|
||||||
|
|
||||||
|
// cBiomeSource overrides:
|
||||||
|
virtual eAvailability GetBiome(int a_ChunkX, int a_ChunkZ, cChunkDef::BiomeMap & a_Biomes) override;
|
||||||
|
virtual void HintViewArea(int a_MinChunkX, int a_MaxChunkX, int a_MinChunkZ, int a_MaxChunkZ) override;
|
||||||
|
|
||||||
|
void SetSource(cBiomeSource * a_Source); // Takes ownership of the source ptr
|
||||||
|
|
||||||
|
protected:
|
||||||
|
class cItem
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
cItem(int a_ChunkX, int a_ChunkZ);
|
||||||
|
|
||||||
|
int m_ChunkX;
|
||||||
|
int m_ChunkZ;
|
||||||
|
bool m_IsValid;
|
||||||
|
cChunkDef::BiomeMap m_Biomes;
|
||||||
|
} ;
|
||||||
|
|
||||||
|
typedef cItem * pItem;
|
||||||
|
typedef std::list<pItem> cItems;
|
||||||
|
|
||||||
|
class cThread :
|
||||||
|
public cIsThread
|
||||||
|
{
|
||||||
|
typedef cIsThread super;
|
||||||
|
|
||||||
|
public:
|
||||||
|
cThread(cBiomeCache & a_Parent);
|
||||||
|
|
||||||
|
// cIsThread overrides:
|
||||||
|
virtual void Execute(void) override;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
cBiomeCache & m_Parent;
|
||||||
|
} ;
|
||||||
|
|
||||||
|
typedef std::list<cThread *> cThreads;
|
||||||
|
|
||||||
|
cBiomeSource * m_Source;
|
||||||
|
|
||||||
|
cCriticalSection m_CS;
|
||||||
|
int m_BaseX; ///< MinChunkX for the m_Available rectangle
|
||||||
|
int m_BaseZ; ///< MinChunkZ for the m_Available rectangle
|
||||||
|
int m_Width; ///< Width of the m_Available rectangle
|
||||||
|
int m_Height; ///< Height of the m_Available rectangle
|
||||||
|
pItem * m_Available; ///< Items that have already been processed (baNow or baNever), [x + m_Width * z]
|
||||||
|
cItems m_Queue; ///< Items that are queued for processing (baLater)
|
||||||
|
cItems m_Pool; ///< Items that are not needed anymore, can be reused for other coords
|
||||||
|
|
||||||
|
cEvent m_evtQueued; // Triggerred when an item is added to m_Queue
|
||||||
|
|
||||||
|
cThreads m_Threads; // Threads that update the cache.
|
||||||
|
bool m_IsTerminatingThreads; // Set to true to indicate to all threads that they should exit
|
||||||
|
|
||||||
|
/// Removes from a_Items all items that are outside of the given coords, moves those into m_Pool
|
||||||
|
void FilterOutItems(cItems & a_Items, int a_MinChunkX, int a_MaxChunkX, int a_MinChunkZ, int a_MaxChunkZ);
|
||||||
|
|
||||||
|
/// Processes one item from m_Queue into m_Available. Blocks if m_Queue is empty; respects m_IsTerminatingThreads
|
||||||
|
void thrProcessQueueItem(void);
|
||||||
|
} ;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
147
BiomeVisualiser/BiomeRenderer.cpp
Normal file
147
BiomeVisualiser/BiomeRenderer.cpp
Normal file
@ -0,0 +1,147 @@
|
|||||||
|
|
||||||
|
// BiomeRenderer.cpp
|
||||||
|
|
||||||
|
// Implements the cBiomeRenderer class representing the rendering engine
|
||||||
|
|
||||||
|
#include "Globals.h"
|
||||||
|
#include "BiomeRenderer.h"
|
||||||
|
#include "Pixmap.h"
|
||||||
|
#include "Timer.h"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
cBiomeRenderer::cBiomeRenderer(void) :
|
||||||
|
m_OriginX(160),
|
||||||
|
m_OriginY(160),
|
||||||
|
m_Zoom(1)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void cBiomeRenderer::SetSource(cBiomeSource * a_Source)
|
||||||
|
{
|
||||||
|
m_Cache.SetSource(a_Source);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
bool cBiomeRenderer::Render(cPixmap & a_Pixmap)
|
||||||
|
{
|
||||||
|
cTimer Timer("cBiomeRenderer::Render");
|
||||||
|
|
||||||
|
int Wid = a_Pixmap.GetWidth();
|
||||||
|
int Hei = a_Pixmap.GetHeight();
|
||||||
|
|
||||||
|
// Hint the approximate view area to the biome source so that it can adjust its caches:
|
||||||
|
int MinBlockX = ( - m_OriginX) / m_Zoom;
|
||||||
|
int MaxBlockX = (Wid - m_OriginX) / m_Zoom;
|
||||||
|
int MinBlockZ = ( - m_OriginY) / m_Zoom;
|
||||||
|
int MaxBlockZ = (Hei - m_OriginY) / m_Zoom;
|
||||||
|
m_Cache.HintViewArea(MinBlockX / 16 - 1, MaxBlockX / 16 + 1, MinBlockZ / 16 - 1, MaxBlockZ / 16 + 1);
|
||||||
|
|
||||||
|
// Hold one current chunk of biome data:
|
||||||
|
int CurChunkX = MAXINT32;
|
||||||
|
int CurChunkZ = MAXINT32;
|
||||||
|
cChunkDef::BiomeMap CurBiomes;
|
||||||
|
|
||||||
|
bool res = false;
|
||||||
|
|
||||||
|
for (int y = 0; y < Hei; y++)
|
||||||
|
{
|
||||||
|
int BlockZ = (y - m_OriginY) / m_Zoom;
|
||||||
|
int ChunkZ = (BlockZ >= 0) ? (BlockZ / 16) : ((BlockZ + 1) / 16 - 1);
|
||||||
|
int RelZ = BlockZ - ChunkZ * 16;
|
||||||
|
for (int x = 0; x < Wid; x++)
|
||||||
|
{
|
||||||
|
int BlockX = (x - m_OriginX) / m_Zoom;
|
||||||
|
int ChunkX = (BlockX >= 0) ? (BlockX / 16) : ((BlockX + 1) / 16 - 1);
|
||||||
|
int RelX = BlockX - ChunkX * 16;
|
||||||
|
if ((ChunkZ != CurChunkZ) || (ChunkX != CurChunkX))
|
||||||
|
{
|
||||||
|
CurChunkX = ChunkX;
|
||||||
|
CurChunkZ = ChunkZ;
|
||||||
|
switch (m_Cache.GetBiome(CurChunkX, CurChunkZ, CurBiomes))
|
||||||
|
{
|
||||||
|
case cBiomeSource::baLater:
|
||||||
|
{
|
||||||
|
res = true;
|
||||||
|
// fallthrough:
|
||||||
|
}
|
||||||
|
case cBiomeSource::baNever:
|
||||||
|
{
|
||||||
|
for (int i = 0; i < ARRAYCOUNT(CurBiomes); i++)
|
||||||
|
{
|
||||||
|
CurBiomes[i] = (EMCSBiome)-1;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
} // switch (Biome availability)
|
||||||
|
}
|
||||||
|
EMCSBiome Biome = cChunkDef::GetBiome(CurBiomes, RelX, RelZ);
|
||||||
|
a_Pixmap.SetPixel(x, y, GetBiomeColor(Biome));
|
||||||
|
} // for x
|
||||||
|
} // for y
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
int cBiomeRenderer::GetBiomeColor(EMCSBiome a_Biome)
|
||||||
|
{
|
||||||
|
if ((a_Biome < 0) || (a_Biome > biMaxBiome))
|
||||||
|
{
|
||||||
|
return 0xcfcfcf; // LtGray for unknown biomes
|
||||||
|
}
|
||||||
|
|
||||||
|
static int BiomeColor[] =
|
||||||
|
{
|
||||||
|
// RGB:
|
||||||
|
0x0000ff, /* Ocean */
|
||||||
|
0x00cf3f, /* Plains */
|
||||||
|
0xffff00, /* Desert */
|
||||||
|
0x7f7f7f, /* Extreme Hills */
|
||||||
|
0x00cf00, /* Forest */
|
||||||
|
0x007f3f, /* Taiga */
|
||||||
|
0x3f7f00, /* Swampland */
|
||||||
|
0x003fff, /* River */
|
||||||
|
0x7f0000, /* Hell */
|
||||||
|
0x007fff, /* Sky */
|
||||||
|
0x3f3fff, /* Frozen Ocean */
|
||||||
|
0x3f3fff, /* Frozen River */
|
||||||
|
0x7fffcf, /* Ice Plains */
|
||||||
|
0x3fcf7f, /* Ice Mountains */
|
||||||
|
0xcf00cf, /* Mushroom Island */
|
||||||
|
0x7f00ff, /* Mushroom Island Shore */
|
||||||
|
0xffff3f, /* Beach */
|
||||||
|
0xcfcf00, /* Desert Hills */
|
||||||
|
0x00cf3f, /* Forest Hills */
|
||||||
|
0x006f1f, /* Taiga Hills */
|
||||||
|
0x7f8f7f, /* Extreme Hills Edge */
|
||||||
|
0x004f00, /* Jungle */
|
||||||
|
0x003f00, /* Jungle Hills */
|
||||||
|
} ;
|
||||||
|
|
||||||
|
return BiomeColor[a_Biome];
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void cBiomeRenderer::MoveViewBy(int a_OffsX, int a_OffsY)
|
||||||
|
{
|
||||||
|
m_OriginX += a_OffsX;
|
||||||
|
m_OriginY += a_OffsY;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
50
BiomeVisualiser/BiomeRenderer.h
Normal file
50
BiomeVisualiser/BiomeRenderer.h
Normal file
@ -0,0 +1,50 @@
|
|||||||
|
|
||||||
|
// BiomeRenderer.h
|
||||||
|
|
||||||
|
// Declares the cBiomeRenderer class representing the rendering engine
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "BiomeCache.h"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// fwd: Pixmap.h
|
||||||
|
class cPixmap;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
class cBiomeRenderer
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
cBiomeRenderer(void);
|
||||||
|
|
||||||
|
void SetSource(cBiomeSource * a_Source); // Takes ownership of the source
|
||||||
|
|
||||||
|
/// Renders the biomes into the given pixmap. Returns true if some biome data was missing and can be retrieved later
|
||||||
|
bool Render(cPixmap & a_Pixmap);
|
||||||
|
|
||||||
|
/// Returns the RGB color value for the specified biome
|
||||||
|
int GetBiomeColor(EMCSBiome a_Biome);
|
||||||
|
|
||||||
|
void MoveViewBy(int a_OffsX, int a_OffsY);
|
||||||
|
|
||||||
|
protected:
|
||||||
|
cBiomeCache m_Cache;
|
||||||
|
|
||||||
|
int m_OriginX;
|
||||||
|
int m_OriginY;
|
||||||
|
int m_Zoom;
|
||||||
|
} ;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
37
BiomeVisualiser/BiomeSource.h
Normal file
37
BiomeVisualiser/BiomeSource.h
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
|
||||||
|
// BiomeSource.h
|
||||||
|
|
||||||
|
// Declares the cBiomeSource abstract class used as an interface for getting biomes from any source
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#include "ChunkDef.h"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
class cBiomeSource abstract
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
enum eAvailability
|
||||||
|
{
|
||||||
|
baNow, // Data returned now
|
||||||
|
baLater, // Data not returned, but will be available later, try again after a while
|
||||||
|
baNever, // Data not returned, will not be available at all
|
||||||
|
} ;
|
||||||
|
|
||||||
|
/// Fills a_Biomes with the biomes for the chunk specified
|
||||||
|
virtual eAvailability GetBiome(int a_ChunkX, int a_ChunkZ, cChunkDef::BiomeMap & a_Biomes) = 0;
|
||||||
|
|
||||||
|
/// Used to inform the source about the view area that will be queried in the near future.
|
||||||
|
virtual void HintViewArea(int a_MinChunkX, int a_MaxChunkX, int a_MinChunkZ, int a_MaxChunkZ) = 0;
|
||||||
|
} ;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
190
BiomeVisualiser/BiomeViewWnd.cpp
Normal file
190
BiomeVisualiser/BiomeViewWnd.cpp
Normal file
@ -0,0 +1,190 @@
|
|||||||
|
|
||||||
|
// BiomeViewWnd.cpp
|
||||||
|
|
||||||
|
// Implements the cBiomeViewWnd class representing the window that displays biomes
|
||||||
|
|
||||||
|
#include "Globals.h"
|
||||||
|
#include "BiomeViewWnd.h"
|
||||||
|
#include "BiomeCache.h"
|
||||||
|
#include "GeneratorBiomeSource.h"
|
||||||
|
#include "../iniFile/iniFile.h"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
const int TIMER_RERENDER = 1200;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
cBiomeViewWnd::cBiomeViewWnd(void) :
|
||||||
|
m_Wnd(NULL),
|
||||||
|
m_Thunk(&cBiomeViewWnd::WndProc, this),
|
||||||
|
m_IsLButtonDown(false)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
bool cBiomeViewWnd::Create(HWND a_ParentWnd, LPCTSTR a_Title)
|
||||||
|
{
|
||||||
|
ASSERT(m_Wnd == NULL);
|
||||||
|
|
||||||
|
// Create a regular STATIC window, then override its window procedure with our own. No need for obnoxious RegisterWindowClass() stuff.
|
||||||
|
m_Wnd = CreateWindow("STATIC", a_Title, WS_OVERLAPPEDWINDOW | WS_VISIBLE, 0, 0, 400, 300, a_ParentWnd, NULL, GetModuleHandle(NULL), NULL);
|
||||||
|
if (m_Wnd == NULL)
|
||||||
|
{
|
||||||
|
LOGERROR("Cannot create main window: %d", GetLastError());
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
SetWindowLongPtr(m_Wnd, GWLP_WNDPROC, m_Thunk);
|
||||||
|
|
||||||
|
cIniFile IniFile;
|
||||||
|
cBiomeGen * BioGen = new cBioGenMultiStepMap(0);
|
||||||
|
BioGen->Initialize(IniFile);
|
||||||
|
m_Renderer.SetSource(new cGeneratorBiomeSource(BioGen));
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
LRESULT cBiomeViewWnd::WndProc(HWND a_Wnd, UINT a_Msg, WPARAM wParam, LPARAM lParam)
|
||||||
|
{
|
||||||
|
switch (a_Msg)
|
||||||
|
{
|
||||||
|
case WM_CLOSE: return OnClose();
|
||||||
|
case WM_COMMAND: return OnCommand(wParam, lParam);
|
||||||
|
case WM_LBUTTONDOWN: return OnLButtonDown(wParam, lParam);
|
||||||
|
case WM_LBUTTONUP: return OnLButtonUp (wParam, lParam);
|
||||||
|
case WM_MOUSEMOVE: return OnMouseMove (wParam, lParam);
|
||||||
|
case WM_PAINT: return OnPaint();
|
||||||
|
case WM_TIMER: return OnTimer(wParam);
|
||||||
|
}
|
||||||
|
return ::DefWindowProc(a_Wnd, a_Msg, wParam, lParam);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
LRESULT cBiomeViewWnd::OnClose(void)
|
||||||
|
{
|
||||||
|
PostQuitMessage(0);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
LRESULT cBiomeViewWnd::OnCommand(WPARAM wParam, LPARAM lParam)
|
||||||
|
{
|
||||||
|
// TODO: Handle menu commands, when we get menu
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
LRESULT cBiomeViewWnd::OnLButtonDown(WPARAM wParam, LPARAM lParam)
|
||||||
|
{
|
||||||
|
m_IsLButtonDown = true;
|
||||||
|
GetCursorPos(&m_MouseDown);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
LRESULT cBiomeViewWnd::OnMouseMove(WPARAM wParam, LPARAM lParam)
|
||||||
|
{
|
||||||
|
if (!m_IsLButtonDown)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
POINT pnt;
|
||||||
|
GetCursorPos(&pnt);
|
||||||
|
m_Renderer.MoveViewBy(pnt.x - m_MouseDown.x, pnt.y - m_MouseDown.y);
|
||||||
|
if (m_Renderer.Render(m_Pixmap))
|
||||||
|
{
|
||||||
|
SetTimer(m_Wnd, TIMER_RERENDER, 200, NULL);
|
||||||
|
}
|
||||||
|
m_MouseDown = pnt;
|
||||||
|
InvalidateRect(m_Wnd, NULL, FALSE);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
LRESULT cBiomeViewWnd::OnLButtonUp(WPARAM wParam, LPARAM lParam)
|
||||||
|
{
|
||||||
|
OnMouseMove(wParam, lParam); // Last movement - if the mouse move hasn't been reported due to speed
|
||||||
|
m_IsLButtonDown = false;
|
||||||
|
InvalidateRect(m_Wnd, NULL, FALSE);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
LRESULT cBiomeViewWnd::OnPaint(void)
|
||||||
|
{
|
||||||
|
PAINTSTRUCT ps;
|
||||||
|
HDC DC = BeginPaint(m_Wnd, &ps);
|
||||||
|
|
||||||
|
RECT rc;
|
||||||
|
GetClientRect(m_Wnd, &rc);
|
||||||
|
int Wid = rc.right - rc.left;
|
||||||
|
int Hei = rc.bottom - rc.top;
|
||||||
|
if ((m_Pixmap.GetWidth() != Wid) || (m_Pixmap.GetHeight() != Hei))
|
||||||
|
{
|
||||||
|
m_Pixmap.SetSize(Wid, Hei);
|
||||||
|
if (m_Renderer.Render(m_Pixmap))
|
||||||
|
{
|
||||||
|
SetTimer(m_Wnd, TIMER_RERENDER, 200, NULL);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
m_Pixmap.DrawToDC(DC, 0, 0);
|
||||||
|
|
||||||
|
EndPaint(m_Wnd, &ps);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
LRESULT cBiomeViewWnd::OnTimer(WPARAM wParam)
|
||||||
|
{
|
||||||
|
switch (wParam)
|
||||||
|
{
|
||||||
|
case TIMER_RERENDER:
|
||||||
|
{
|
||||||
|
if (!m_Renderer.Render(m_Pixmap))
|
||||||
|
{
|
||||||
|
KillTimer(m_Wnd, TIMER_RERENDER);
|
||||||
|
}
|
||||||
|
InvalidateRect(m_Wnd, NULL, FALSE);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
46
BiomeVisualiser/BiomeViewWnd.h
Normal file
46
BiomeVisualiser/BiomeViewWnd.h
Normal file
@ -0,0 +1,46 @@
|
|||||||
|
|
||||||
|
// BiomeViewWnd.h
|
||||||
|
|
||||||
|
// Declares the cBiomeViewWnd class representing the window that displays biomes
|
||||||
|
|
||||||
|
#include "WndProcThunk.h"
|
||||||
|
#include "BiomeRenderer.h"
|
||||||
|
#include "BiomeCache.h"
|
||||||
|
#include "Pixmap.h"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
class cBiomeViewWnd
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
cBiomeViewWnd(void);
|
||||||
|
|
||||||
|
bool Create(HWND a_ParentWnd, LPCTSTR a_Title);
|
||||||
|
|
||||||
|
protected:
|
||||||
|
HWND m_Wnd;
|
||||||
|
CWndProcThunk<cBiomeViewWnd> m_Thunk;
|
||||||
|
|
||||||
|
cBiomeRenderer m_Renderer;
|
||||||
|
cPixmap m_Pixmap;
|
||||||
|
|
||||||
|
bool m_IsLButtonDown;
|
||||||
|
POINT m_MouseDown;
|
||||||
|
|
||||||
|
LRESULT WndProc(HWND a_Wnd, UINT a_Msg, WPARAM wParam, LPARAM lParam);
|
||||||
|
|
||||||
|
// Message handlers:
|
||||||
|
LRESULT OnClose (void);
|
||||||
|
LRESULT OnCommand (WPARAM wParam, LPARAM lParam);
|
||||||
|
LRESULT OnLButtonDown(WPARAM wParam, LPARAM lParam);
|
||||||
|
LRESULT OnMouseMove (WPARAM wParam, LPARAM lParam);
|
||||||
|
LRESULT OnLButtonUp (WPARAM wParam, LPARAM lParam);
|
||||||
|
LRESULT OnPaint (void);
|
||||||
|
LRESULT OnTimer (WPARAM wParam);
|
||||||
|
} ;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
52
BiomeVisualiser/BiomeVisualiser.cpp
Normal file
52
BiomeVisualiser/BiomeVisualiser.cpp
Normal file
@ -0,0 +1,52 @@
|
|||||||
|
|
||||||
|
// BiomeVisualiser.cpp
|
||||||
|
|
||||||
|
// Implements the cBiomeVisualiser class representing the entire app. Also implements the WinMain() entrypoint
|
||||||
|
|
||||||
|
#include "Globals.h"
|
||||||
|
#include "time.h"
|
||||||
|
#include "BiomeVisualiser.h"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
int WINAPI WinMain(HINSTANCE a_Instance, HINSTANCE a_PrevInstance, LPSTR a_CmdLine, int a_ShowCmd)
|
||||||
|
{
|
||||||
|
cBiomeVisualiser App;
|
||||||
|
return App.Run();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
cBiomeVisualiser::cBiomeVisualiser(void)
|
||||||
|
// : m_Logger(Printf("BiomeVisualiser_%08x", time(NULL)))
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
int cBiomeVisualiser::Run(void)
|
||||||
|
{
|
||||||
|
if (!m_MainWnd.Create(GetDesktopWindow(), TEXT("BiomeVisualiser")))
|
||||||
|
{
|
||||||
|
LOGERROR("Cannot create main window: %d", GetLastError());
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
MSG msg;
|
||||||
|
while (GetMessage(&msg, NULL, 0, 0))
|
||||||
|
{
|
||||||
|
TranslateMessage(&msg);
|
||||||
|
DispatchMessage(&msg);
|
||||||
|
} // while (GetMessage)
|
||||||
|
return msg.lParam;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
31
BiomeVisualiser/BiomeVisualiser.h
Normal file
31
BiomeVisualiser/BiomeVisualiser.h
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
|
||||||
|
// BiomeVisualiser.h
|
||||||
|
|
||||||
|
// Declares the cBiomeVisualiser class representing the entire application
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#include "BiomeViewWnd.h"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
class cBiomeVisualiser
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
cBiomeVisualiser(void);
|
||||||
|
|
||||||
|
int Run(void);
|
||||||
|
|
||||||
|
protected:
|
||||||
|
cBiomeViewWnd m_MainWnd;
|
||||||
|
|
||||||
|
cMCLogger m_Logger;
|
||||||
|
} ;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
23
BiomeVisualiser/BiomeVisualiser.sln
Normal file
23
BiomeVisualiser/BiomeVisualiser.sln
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
|
||||||
|
Microsoft Visual Studio Solution File, Format Version 10.00
|
||||||
|
# Visual C++ Express 2008
|
||||||
|
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "BiomeVisualiser", "BiomeVisualiser.vcproj", "{6DF3D88B-AD47-45B6-B831-1BDE74F86B5C}"
|
||||||
|
EndProject
|
||||||
|
Global
|
||||||
|
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||||
|
Debug|Win32 = Debug|Win32
|
||||||
|
Release profiled|Win32 = Release profiled|Win32
|
||||||
|
Release|Win32 = Release|Win32
|
||||||
|
EndGlobalSection
|
||||||
|
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||||
|
{6DF3D88B-AD47-45B6-B831-1BDE74F86B5C}.Debug|Win32.ActiveCfg = Debug|Win32
|
||||||
|
{6DF3D88B-AD47-45B6-B831-1BDE74F86B5C}.Debug|Win32.Build.0 = Debug|Win32
|
||||||
|
{6DF3D88B-AD47-45B6-B831-1BDE74F86B5C}.Release profiled|Win32.ActiveCfg = Release profiled|Win32
|
||||||
|
{6DF3D88B-AD47-45B6-B831-1BDE74F86B5C}.Release profiled|Win32.Build.0 = Release profiled|Win32
|
||||||
|
{6DF3D88B-AD47-45B6-B831-1BDE74F86B5C}.Release|Win32.ActiveCfg = Release|Win32
|
||||||
|
{6DF3D88B-AD47-45B6-B831-1BDE74F86B5C}.Release|Win32.Build.0 = Release|Win32
|
||||||
|
EndGlobalSection
|
||||||
|
GlobalSection(SolutionProperties) = preSolution
|
||||||
|
HideSolutionNode = FALSE
|
||||||
|
EndGlobalSection
|
||||||
|
EndGlobal
|
483
BiomeVisualiser/BiomeVisualiser.vcproj
Normal file
483
BiomeVisualiser/BiomeVisualiser.vcproj
Normal file
@ -0,0 +1,483 @@
|
|||||||
|
<?xml version="1.0" encoding="windows-1250"?>
|
||||||
|
<VisualStudioProject
|
||||||
|
ProjectType="Visual C++"
|
||||||
|
Version="9,00"
|
||||||
|
Name="BiomeVisualiser"
|
||||||
|
ProjectGUID="{6DF3D88B-AD47-45B6-B831-1BDE74F86B5C}"
|
||||||
|
RootNamespace="BiomeVisualiser"
|
||||||
|
Keyword="Win32Proj"
|
||||||
|
TargetFrameworkVersion="196613"
|
||||||
|
>
|
||||||
|
<Platforms>
|
||||||
|
<Platform
|
||||||
|
Name="Win32"
|
||||||
|
/>
|
||||||
|
</Platforms>
|
||||||
|
<ToolFiles>
|
||||||
|
</ToolFiles>
|
||||||
|
<Configurations>
|
||||||
|
<Configuration
|
||||||
|
Name="Debug|Win32"
|
||||||
|
OutputDirectory="$(SolutionDir)$(ConfigurationName)"
|
||||||
|
IntermediateDirectory="$(ConfigurationName)"
|
||||||
|
ConfigurationType="1"
|
||||||
|
CharacterSet="2"
|
||||||
|
>
|
||||||
|
<Tool
|
||||||
|
Name="VCPreBuildEventTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCCustomBuildTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCXMLDataGeneratorTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCWebServiceProxyGeneratorTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCMIDLTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCCLCompilerTool"
|
||||||
|
Optimization="0"
|
||||||
|
AdditionalIncludeDirectories="../source"
|
||||||
|
PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS"
|
||||||
|
MinimalRebuild="true"
|
||||||
|
BasicRuntimeChecks="3"
|
||||||
|
RuntimeLibrary="1"
|
||||||
|
UsePrecompiledHeader="2"
|
||||||
|
PrecompiledHeaderThrough="Globals.h"
|
||||||
|
WarningLevel="3"
|
||||||
|
DebugInformationFormat="4"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCManagedResourceCompilerTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCResourceCompilerTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCPreLinkEventTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCLinkerTool"
|
||||||
|
AdditionalDependencies="ws2_32.lib"
|
||||||
|
LinkIncremental="2"
|
||||||
|
GenerateDebugInformation="true"
|
||||||
|
SubSystem="2"
|
||||||
|
TargetMachine="1"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCALinkTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCManifestTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCXDCMakeTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCBscMakeTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCFxCopTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCAppVerifierTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCPostBuildEventTool"
|
||||||
|
/>
|
||||||
|
</Configuration>
|
||||||
|
<Configuration
|
||||||
|
Name="Release|Win32"
|
||||||
|
OutputDirectory="$(SolutionDir)$(ConfigurationName)"
|
||||||
|
IntermediateDirectory="$(ConfigurationName)"
|
||||||
|
ConfigurationType="1"
|
||||||
|
CharacterSet="2"
|
||||||
|
WholeProgramOptimization="1"
|
||||||
|
>
|
||||||
|
<Tool
|
||||||
|
Name="VCPreBuildEventTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCCustomBuildTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCXMLDataGeneratorTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCWebServiceProxyGeneratorTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCMIDLTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCCLCompilerTool"
|
||||||
|
Optimization="2"
|
||||||
|
InlineFunctionExpansion="2"
|
||||||
|
EnableIntrinsicFunctions="true"
|
||||||
|
FavorSizeOrSpeed="1"
|
||||||
|
AdditionalIncludeDirectories="../source"
|
||||||
|
PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS"
|
||||||
|
RuntimeLibrary="0"
|
||||||
|
EnableFunctionLevelLinking="true"
|
||||||
|
EnableEnhancedInstructionSet="2"
|
||||||
|
UsePrecompiledHeader="2"
|
||||||
|
PrecompiledHeaderThrough="Globals.h"
|
||||||
|
WarningLevel="3"
|
||||||
|
DebugInformationFormat="3"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCManagedResourceCompilerTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCResourceCompilerTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCPreLinkEventTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCLinkerTool"
|
||||||
|
AdditionalDependencies="ws2_32.lib"
|
||||||
|
LinkIncremental="1"
|
||||||
|
GenerateDebugInformation="true"
|
||||||
|
SubSystem="2"
|
||||||
|
OptimizeReferences="2"
|
||||||
|
EnableCOMDATFolding="2"
|
||||||
|
TargetMachine="1"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCALinkTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCManifestTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCXDCMakeTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCBscMakeTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCFxCopTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCAppVerifierTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCPostBuildEventTool"
|
||||||
|
/>
|
||||||
|
</Configuration>
|
||||||
|
<Configuration
|
||||||
|
Name="Release profiled|Win32"
|
||||||
|
OutputDirectory="$(SolutionDir)$(ConfigurationName)"
|
||||||
|
IntermediateDirectory="$(ConfigurationName)"
|
||||||
|
ConfigurationType="1"
|
||||||
|
CharacterSet="2"
|
||||||
|
WholeProgramOptimization="1"
|
||||||
|
>
|
||||||
|
<Tool
|
||||||
|
Name="VCPreBuildEventTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCCustomBuildTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCXMLDataGeneratorTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCWebServiceProxyGeneratorTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCMIDLTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCCLCompilerTool"
|
||||||
|
Optimization="2"
|
||||||
|
InlineFunctionExpansion="2"
|
||||||
|
EnableIntrinsicFunctions="true"
|
||||||
|
FavorSizeOrSpeed="1"
|
||||||
|
AdditionalIncludeDirectories="../source"
|
||||||
|
PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS"
|
||||||
|
RuntimeLibrary="0"
|
||||||
|
EnableFunctionLevelLinking="true"
|
||||||
|
EnableEnhancedInstructionSet="2"
|
||||||
|
UsePrecompiledHeader="2"
|
||||||
|
PrecompiledHeaderThrough="Globals.h"
|
||||||
|
WarningLevel="3"
|
||||||
|
DebugInformationFormat="3"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCManagedResourceCompilerTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCResourceCompilerTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCPreLinkEventTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCLinkerTool"
|
||||||
|
AdditionalDependencies="ws2_32.lib"
|
||||||
|
LinkIncremental="1"
|
||||||
|
GenerateDebugInformation="true"
|
||||||
|
SubSystem="2"
|
||||||
|
OptimizeReferences="2"
|
||||||
|
EnableCOMDATFolding="2"
|
||||||
|
TargetMachine="1"
|
||||||
|
Profile="true"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCALinkTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCManifestTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCXDCMakeTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCBscMakeTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCFxCopTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCAppVerifierTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCPostBuildEventTool"
|
||||||
|
/>
|
||||||
|
</Configuration>
|
||||||
|
</Configurations>
|
||||||
|
<References>
|
||||||
|
</References>
|
||||||
|
<Files>
|
||||||
|
<Filter
|
||||||
|
Name="Source Files"
|
||||||
|
Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
|
||||||
|
UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
|
||||||
|
>
|
||||||
|
<File
|
||||||
|
RelativePath=".\BiomeCache.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath=".\BiomeCache.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath=".\BiomeRenderer.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath=".\BiomeRenderer.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath=".\BiomeSource.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath=".\BiomeViewWnd.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath=".\BiomeViewWnd.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath=".\BiomeVisualiser.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath=".\BiomeVisualiser.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath=".\GeneratorBiomeSource.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath=".\Pixmap.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath=".\Pixmap.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath=".\Timer.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath=".\WndProcThunk.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<Filter
|
||||||
|
Name="Shared"
|
||||||
|
>
|
||||||
|
<File
|
||||||
|
RelativePath="..\source\BlockID.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\source\BlockID.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\source\ChunkDef.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\source\Globals.cpp"
|
||||||
|
>
|
||||||
|
<FileConfiguration
|
||||||
|
Name="Debug|Win32"
|
||||||
|
>
|
||||||
|
<Tool
|
||||||
|
Name="VCCLCompilerTool"
|
||||||
|
UsePrecompiledHeader="1"
|
||||||
|
/>
|
||||||
|
</FileConfiguration>
|
||||||
|
<FileConfiguration
|
||||||
|
Name="Release|Win32"
|
||||||
|
>
|
||||||
|
<Tool
|
||||||
|
Name="VCCLCompilerTool"
|
||||||
|
UsePrecompiledHeader="1"
|
||||||
|
/>
|
||||||
|
</FileConfiguration>
|
||||||
|
<FileConfiguration
|
||||||
|
Name="Release profiled|Win32"
|
||||||
|
>
|
||||||
|
<Tool
|
||||||
|
Name="VCCLCompilerTool"
|
||||||
|
UsePrecompiledHeader="1"
|
||||||
|
/>
|
||||||
|
</FileConfiguration>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\source\Globals.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\source\Log.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\source\Log.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\source\MCLogger.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\source\MCLogger.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\source\Noise.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\source\Noise.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\source\Noise.inc"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\source\StringUtils.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\source\StringUtils.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<Filter
|
||||||
|
Name="OSSupport"
|
||||||
|
>
|
||||||
|
<File
|
||||||
|
RelativePath="..\source\OSSupport\CriticalSection.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\source\OSSupport\CriticalSection.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\source\OSSupport\Event.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\source\OSSupport\Event.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\source\OSSupport\File.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\source\OSSupport\File.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\source\OSSupport\IsThread.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\source\OSSupport\IsThread.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\source\OSSupport\MakeDir.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\source\OSSupport\MakeDir.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\source\OSSupport\Sleep.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
</Filter>
|
||||||
|
<Filter
|
||||||
|
Name="Generating"
|
||||||
|
>
|
||||||
|
<File
|
||||||
|
RelativePath="..\source\Generating\BioGen.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\source\Generating\BioGen.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\source\Generating\ComposableGenerator.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
</Filter>
|
||||||
|
<Filter
|
||||||
|
Name="iniFile"
|
||||||
|
>
|
||||||
|
<File
|
||||||
|
RelativePath="..\iniFile\iniFile.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\iniFile\iniFile.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
</Filter>
|
||||||
|
</Filter>
|
||||||
|
</Filter>
|
||||||
|
</Files>
|
||||||
|
<Globals>
|
||||||
|
</Globals>
|
||||||
|
</VisualStudioProject>
|
42
BiomeVisualiser/GeneratorBiomeSource.h
Normal file
42
BiomeVisualiser/GeneratorBiomeSource.h
Normal file
@ -0,0 +1,42 @@
|
|||||||
|
|
||||||
|
// GeneratorBiomeSource.h
|
||||||
|
|
||||||
|
// Declares the cGeneratorBiomeSource that adapts a cBiomeGen into a cBiomeSource
|
||||||
|
|
||||||
|
#include "../source/Generating/BioGen.h"
|
||||||
|
#include "BiomeSource.h"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
class cGeneratorBiomeSource :
|
||||||
|
public cBiomeSource
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
cGeneratorBiomeSource(cBiomeGen * a_Generator) : m_Generator(a_Generator) {} // Takes ownership of the generator ptr
|
||||||
|
|
||||||
|
~cGeneratorBiomeSource()
|
||||||
|
{
|
||||||
|
delete m_Generator;
|
||||||
|
}
|
||||||
|
|
||||||
|
// cBiomeSource overrides:
|
||||||
|
virtual eAvailability GetBiome(int a_ChunkX, int a_ChunkZ, cChunkDef::BiomeMap & a_Biomes) override
|
||||||
|
{
|
||||||
|
m_Generator->GenBiomes(a_ChunkX, a_ChunkZ, a_Biomes);
|
||||||
|
return baNow;
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual void HintViewArea(int a_MinChunkX, int a_MaxChunkX, int a_MinChunkZ, int a_MaxChunkZ) override
|
||||||
|
{
|
||||||
|
// Nothing needed
|
||||||
|
}
|
||||||
|
|
||||||
|
protected:
|
||||||
|
cBiomeGen * m_Generator;
|
||||||
|
} ;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
120
BiomeVisualiser/Pixmap.cpp
Normal file
120
BiomeVisualiser/Pixmap.cpp
Normal file
@ -0,0 +1,120 @@
|
|||||||
|
|
||||||
|
// Pixmap.cpp
|
||||||
|
|
||||||
|
// Implements the cPixmap class that represents a RGB pixmap and allows simple operations on it
|
||||||
|
|
||||||
|
#include "Globals.h"
|
||||||
|
#include "Pixmap.h"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
cPixmap::cPixmap(void) :
|
||||||
|
m_Width(0),
|
||||||
|
m_Height(0),
|
||||||
|
m_Stride(0),
|
||||||
|
m_Pixels(NULL)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
cPixmap::cPixmap(int a_Width, int a_Height) :
|
||||||
|
m_Width(0),
|
||||||
|
m_Height(0),
|
||||||
|
m_Stride(0),
|
||||||
|
m_Pixels(NULL)
|
||||||
|
{
|
||||||
|
SetSize(a_Width, a_Height);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
cPixmap::~cPixmap()
|
||||||
|
{
|
||||||
|
delete m_Pixels;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void cPixmap::SetSize(int a_Width, int a_Height)
|
||||||
|
{
|
||||||
|
delete m_Pixels;
|
||||||
|
m_Pixels = new int[a_Width * a_Height];
|
||||||
|
m_Width = a_Width;
|
||||||
|
m_Height = a_Height;
|
||||||
|
m_Stride = m_Width; // Currently we don't need a special stride value, but let's support it for the future :)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void cPixmap::SetPixel(int a_X, int a_Y, int a_Color)
|
||||||
|
{
|
||||||
|
ASSERT(a_X >= 0);
|
||||||
|
ASSERT(a_X < m_Width);
|
||||||
|
ASSERT(a_Y >= 0);
|
||||||
|
ASSERT(a_Y < m_Height);
|
||||||
|
|
||||||
|
m_Pixels[a_X + a_Y * m_Stride] = a_Color;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
int cPixmap::GetPixel(int a_X, int a_Y) const
|
||||||
|
{
|
||||||
|
ASSERT(a_X >= 0);
|
||||||
|
ASSERT(a_X < m_Width);
|
||||||
|
ASSERT(a_Y >= 0);
|
||||||
|
ASSERT(a_Y < m_Height);
|
||||||
|
|
||||||
|
return m_Pixels[a_X + a_Y * m_Stride];
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void cPixmap::Fill(int a_Color)
|
||||||
|
{
|
||||||
|
int NumElements = m_Height * m_Stride;
|
||||||
|
for (int i = 0; i < NumElements; i++)
|
||||||
|
{
|
||||||
|
m_Pixels[i] = a_Color;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void cPixmap::DrawToDC(HDC a_DC, int a_OriginX, int a_OriginY)
|
||||||
|
{
|
||||||
|
BITMAPINFO bmi;
|
||||||
|
bmi.bmiHeader.biSize = sizeof(bmi.bmiHeader);
|
||||||
|
bmi.bmiHeader.biWidth = m_Width;
|
||||||
|
bmi.bmiHeader.biHeight = -m_Height; // Negative, we are top-down, unlike BMPs
|
||||||
|
bmi.bmiHeader.biPlanes = 1;
|
||||||
|
bmi.bmiHeader.biBitCount = 32;
|
||||||
|
bmi.bmiHeader.biCompression = BI_RGB;
|
||||||
|
bmi.bmiHeader.biSizeImage = m_Stride * m_Height * 4;
|
||||||
|
bmi.bmiHeader.biXPelsPerMeter = 1440;
|
||||||
|
bmi.bmiHeader.biYPelsPerMeter = 1440;
|
||||||
|
bmi.bmiHeader.biClrUsed = 0;
|
||||||
|
bmi.bmiHeader.biClrImportant = 0;
|
||||||
|
SetDIBitsToDevice(a_DC, a_OriginX, a_OriginY, m_Width, m_Height, 0, 0, 0, m_Height, m_Pixels, &bmi, DIB_RGB_COLORS);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
39
BiomeVisualiser/Pixmap.h
Normal file
39
BiomeVisualiser/Pixmap.h
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
|
||||||
|
// Pixmap.h
|
||||||
|
|
||||||
|
// Declares a cPixmap class that represents a RGB pixmap and allows simple operations on it
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
class cPixmap
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
cPixmap(void);
|
||||||
|
cPixmap(int a_Width, int a_Height);
|
||||||
|
~cPixmap();
|
||||||
|
|
||||||
|
void SetSize(int a_Width, int a_Height);
|
||||||
|
|
||||||
|
int GetWidth (void) const { return m_Width; }
|
||||||
|
int GetHeight(void) const { return m_Height; }
|
||||||
|
|
||||||
|
void SetPixel(int a_X, int a_Y, int a_Color);
|
||||||
|
int GetPixel(int a_X, int a_Y) const;
|
||||||
|
void Fill(int a_Color);
|
||||||
|
|
||||||
|
void DrawToDC(HDC a_DC, int a_OriginX, int a_OriginY);
|
||||||
|
|
||||||
|
protected:
|
||||||
|
int m_Width;
|
||||||
|
int m_Height;
|
||||||
|
int m_Stride;
|
||||||
|
int * m_Pixels;
|
||||||
|
} ;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
40
BiomeVisualiser/Timer.h
Normal file
40
BiomeVisualiser/Timer.h
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
|
||||||
|
// Timer.h
|
||||||
|
|
||||||
|
// Declares the cTimer class representing a RAII class that measures time from its creation till its destruction
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "time.h"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
class cTimer
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
cTimer(const AString & a_Title) :
|
||||||
|
m_Title(a_Title),
|
||||||
|
m_StartTime(clock())
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
~cTimer()
|
||||||
|
{
|
||||||
|
clock_t NumTicks = clock() - m_StartTime;
|
||||||
|
LOG("%s took %d ticks (%.02f sec)", m_Title.c_str(), NumTicks, (double)NumTicks / CLOCKS_PER_SEC);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected:
|
||||||
|
AString m_Title;
|
||||||
|
clock_t m_StartTime;
|
||||||
|
} ;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
143
BiomeVisualiser/WndProcThunk.h
Normal file
143
BiomeVisualiser/WndProcThunk.h
Normal file
@ -0,0 +1,143 @@
|
|||||||
|
|
||||||
|
// WndProcThunk.h
|
||||||
|
|
||||||
|
// Interfaces to the CWndProcThunk class responsible for WNDPROC class-thunking
|
||||||
|
// For details, see http://www.hackcraft.net/cpp/windowsThunk/thiscall/
|
||||||
|
// Also available is a CDlgProcThunk class doing the same work for DIALOGPROC
|
||||||
|
|
||||||
|
// MD: Made NX-compat by allocating the code structure using VirtualAlloc(..., PAGE_EXECUTE_READWRITE)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// fwd:
|
||||||
|
template <class W> class CWndProcThunk;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef WNDPROCTHUNK_H_INCLUDED
|
||||||
|
#define WNDPROCTHUNK_H_INCLUDED
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
template<typename To, typename From> inline To union_cast(From fr) throw()
|
||||||
|
{
|
||||||
|
union
|
||||||
|
{
|
||||||
|
From f;
|
||||||
|
To t;
|
||||||
|
} uc;
|
||||||
|
uc.f = fr;
|
||||||
|
return uc.t;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#pragma warning(push)
|
||||||
|
#pragma warning(disable : 4355)
|
||||||
|
|
||||||
|
#if defined(_M_IX86)
|
||||||
|
|
||||||
|
#pragma pack(push,1)
|
||||||
|
|
||||||
|
template <class W> class CWndProcThunk
|
||||||
|
{
|
||||||
|
typedef ::LRESULT (W::* WndProc)(::HWND, ::UINT, ::WPARAM, ::LPARAM);
|
||||||
|
typedef CWndProcThunk ThisClass;
|
||||||
|
|
||||||
|
struct SCode
|
||||||
|
{
|
||||||
|
BYTE m_mov; // mov ECX, m_this
|
||||||
|
W * m_this; //
|
||||||
|
BYTE m_jmp; // jmp m_relproc
|
||||||
|
ptrdiff_t m_relproc; // relative jmp
|
||||||
|
};
|
||||||
|
|
||||||
|
SCode * Code;
|
||||||
|
|
||||||
|
public:
|
||||||
|
ThisClass(WndProc proc, W * obj)
|
||||||
|
{
|
||||||
|
Code = (SCode *)VirtualAlloc(NULL, sizeof(SCode), MEM_COMMIT, PAGE_EXECUTE_READWRITE);
|
||||||
|
Code->m_mov = 0xB9,
|
||||||
|
Code->m_this = obj,
|
||||||
|
Code->m_jmp = 0xE9,
|
||||||
|
Code->m_relproc = union_cast<char *>(proc) - reinterpret_cast<char *>(Code) - sizeof(*Code);
|
||||||
|
::FlushInstructionCache(::GetCurrentProcess(), Code, sizeof(*Code));
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual ~CWndProcThunk()
|
||||||
|
{
|
||||||
|
VirtualFree(Code, sizeof(*Code), MEM_RELEASE);
|
||||||
|
Code = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
operator ::WNDPROC() const {return reinterpret_cast<::WNDPROC>(Code); }
|
||||||
|
operator ::LONG_PTR() const {return reinterpret_cast<::LONG_PTR>(Code); }
|
||||||
|
} ;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
template <class W> class CDlgProcThunk
|
||||||
|
{
|
||||||
|
typedef ::BOOL (W::* DlgProc)(::HWND, ::UINT, ::WPARAM, ::LPARAM);
|
||||||
|
typedef CDlgProcThunk ThisClass;
|
||||||
|
|
||||||
|
struct SCode
|
||||||
|
{
|
||||||
|
BYTE m_mov; // mov ECX, m_this
|
||||||
|
W * m_this; //
|
||||||
|
BYTE m_jmp; // jmp m_relproc
|
||||||
|
ptrdiff_t m_relproc; // relative jmp
|
||||||
|
};
|
||||||
|
|
||||||
|
SCode * Code;
|
||||||
|
|
||||||
|
public:
|
||||||
|
CDlgProcThunk(DlgProc proc, W * obj)
|
||||||
|
{
|
||||||
|
Code = (SCode *)VirtualAlloc(NULL, sizeof(SCode), MEM_COMMIT, PAGE_EXECUTE_READWRITE);
|
||||||
|
Code->m_mov = 0xB9,
|
||||||
|
Code->m_this = obj,
|
||||||
|
Code->m_jmp = 0xE9,
|
||||||
|
Code->m_relproc = union_cast<char *>(proc) - reinterpret_cast<char *>(Code) - sizeof(*Code);
|
||||||
|
::FlushInstructionCache(::GetCurrentProcess(), Code, sizeof(*Code));
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual ~CDlgProcThunk()
|
||||||
|
{
|
||||||
|
VirtualFree(Code, sizeof(*Code), MEM_RELEASE);
|
||||||
|
Code = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
operator ::DLGPROC() const {return reinterpret_cast<::DLGPROC>(Code); }
|
||||||
|
operator ::LONG_PTR() const {return reinterpret_cast<::LONG_PTR>(Code); }
|
||||||
|
} ;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#pragma pack(pop)
|
||||||
|
|
||||||
|
#else // _M_IX86
|
||||||
|
#error Only X86 supported
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#endif // WNDPROCTHUNK_H_INCLUDED
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
70
BiomeVisualiser/profile_run.cmd
Normal file
70
BiomeVisualiser/profile_run.cmd
Normal file
@ -0,0 +1,70 @@
|
|||||||
|
@echo off
|
||||||
|
::
|
||||||
|
:: Profiling using a MSVC standalone profiler
|
||||||
|
::
|
||||||
|
:: See http://www.codeproject.com/Articles/144643/Profiling-of-C-Applications-in-Visual-Studio-for-F for details
|
||||||
|
::
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
set pt="C:\Program Files\Microsoft Visual Studio 9.0\Team Tools\Performance Tools"
|
||||||
|
set appdir="Release profiled"
|
||||||
|
set app="Release profiled\BiomeVisualiser.exe"
|
||||||
|
set args=""
|
||||||
|
|
||||||
|
:: outputdir is relative to appdir!
|
||||||
|
set outputdir=Profiling
|
||||||
|
set output=profile.vsp
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
::Create the output directory, if it didn't exist
|
||||||
|
mkdir %outputdir%
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
:: Start the profiler
|
||||||
|
%pt%\vsperfcmd /start:sample /output:%outputdir%\%output%
|
||||||
|
if errorlevel 1 goto haderror
|
||||||
|
|
||||||
|
:: Launch the application via the profiler
|
||||||
|
%pt%\vsperfcmd /launch:%app% /args:%args%
|
||||||
|
if errorlevel 1 goto haderror
|
||||||
|
|
||||||
|
:: Shut down the profiler (this command waits, until the application is terminated)
|
||||||
|
%pt%\vsperfcmd /shutdown
|
||||||
|
if errorlevel 1 goto haderror
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
:: cd to outputdir, so that the reports are generated there
|
||||||
|
cd %outputdir%
|
||||||
|
|
||||||
|
:: generate the report files (.csv)
|
||||||
|
%pt%\vsperfreport /summary:all %output% /symbolpath:"srv*C:\Programovani\Symbols*http://msdl.microsoft.com/download/symbols"
|
||||||
|
if errorlevel 1 goto haderror
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
goto finished
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
:haderror
|
||||||
|
echo An error was encountered
|
||||||
|
pause
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
:finished
|
@ -138,7 +138,7 @@ void cLog::Log(const char * a_Format, va_list argList)
|
|||||||
|
|
||||||
#if defined (_WIN32) && defined(_DEBUG)
|
#if defined (_WIN32) && defined(_DEBUG)
|
||||||
// In a Windows Debug build, output the log to debug console as well:
|
// In a Windows Debug build, output the log to debug console as well:
|
||||||
OutputDebugString(Line.c_str());
|
OutputDebugStringA(Line.c_str());
|
||||||
#endif // _WIN32
|
#endif // _WIN32
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -8,7 +8,11 @@
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
cMCLogger* cMCLogger::s_MCLogger = 0;
|
cMCLogger * cMCLogger::s_MCLogger = NULL;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
cMCLogger* cMCLogger::GetInstance()
|
cMCLogger* cMCLogger::GetInstance()
|
||||||
{
|
{
|
||||||
@ -19,10 +23,10 @@ cMCLogger* cMCLogger::GetInstance()
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
cMCLogger::cMCLogger()
|
cMCLogger::cMCLogger(void)
|
||||||
{
|
{
|
||||||
AString FileName;
|
AString FileName;
|
||||||
Printf(FileName, "LOG_%d.txt", (int)time(0) );
|
Printf(FileName, "LOG_%d.txt", (int)time(NULL));
|
||||||
m_Log = new cLog(FileName);
|
m_Log = new cLog(FileName);
|
||||||
m_Log->Log("--- Started Log ---");
|
m_Log->Log("--- Started Log ---");
|
||||||
|
|
||||||
@ -33,9 +37,9 @@ cMCLogger::cMCLogger()
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
cMCLogger::cMCLogger( char* a_File )
|
cMCLogger::cMCLogger(const AString & a_FileName)
|
||||||
{
|
{
|
||||||
m_Log = new cLog( a_File );
|
m_Log = new cLog(a_FileName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -13,8 +13,8 @@ class cLog;
|
|||||||
class cMCLogger // tolua_export
|
class cMCLogger // tolua_export
|
||||||
{ // tolua_export
|
{ // tolua_export
|
||||||
public: // tolua_export
|
public: // tolua_export
|
||||||
cMCLogger();
|
cMCLogger(void);
|
||||||
cMCLogger( char* a_File ); // tolua_export
|
cMCLogger(const AString & a_FileName); // tolua_export
|
||||||
~cMCLogger(); // tolua_export
|
~cMCLogger(); // tolua_export
|
||||||
|
|
||||||
void Log(const char* a_Format, va_list a_ArgList);
|
void Log(const char* a_Format, va_list a_ArgList);
|
||||||
|
Loading…
Reference in New Issue
Block a user