Fix style of Tools
This commit is contained in:
parent
aff140365d
commit
1926181cb7
@ -31,7 +31,7 @@ int main(int argc, char * argv[])
|
||||
LOG("\nNo method number present, aborting.");
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
AString WorldFolder;
|
||||
if (argc > 2)
|
||||
{
|
||||
@ -41,7 +41,7 @@ int main(int argc, char * argv[])
|
||||
{
|
||||
WorldFolder = "." + cFile::PathSeparator;
|
||||
}
|
||||
|
||||
|
||||
cCallbackFactory * Factory = NULL;
|
||||
switch (atol(argv[1]))
|
||||
{
|
||||
@ -59,14 +59,10 @@ int main(int argc, char * argv[])
|
||||
}
|
||||
cProcessor Processor;
|
||||
Processor.ProcessWorld(WorldFolder, *Factory);
|
||||
|
||||
|
||||
LOG("Processing finished");
|
||||
|
||||
|
||||
delete Factory;
|
||||
|
||||
|
||||
LOG("Done");
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -123,7 +123,7 @@ void cBiomeMap::StartNewRegion(int a_RegionX, int a_RegionZ)
|
||||
|
||||
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
// cBiomeMapFactory:
|
||||
|
||||
cBiomeMapFactory::~cBiomeMapFactory()
|
||||
@ -135,7 +135,3 @@ cBiomeMapFactory::~cBiomeMapFactory()
|
||||
}
|
||||
// TODO: Join all the files into one giant image file
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -20,8 +20,8 @@ class cBiomeMap :
|
||||
{
|
||||
public:
|
||||
cBiomeMap(void);
|
||||
|
||||
/// Saves the last region that it was processing
|
||||
|
||||
/** Saves the last region that it was processing */
|
||||
void Finish(void);
|
||||
|
||||
protected:
|
||||
@ -33,7 +33,7 @@ protected:
|
||||
int m_CurrentRegionZ;
|
||||
bool m_IsCurrentRegionValid;
|
||||
char m_Biomes[16 * 32 * 16 * 32]; // Biome map of the entire current region [x + 16 * 32 * z]
|
||||
|
||||
|
||||
// cCallback overrides:
|
||||
virtual bool OnNewChunk(int a_ChunkX, int a_ChunkZ) override;
|
||||
virtual bool OnHeader(int a_FileOffset, unsigned char a_NumSectors, int a_Timestamp) override { return false; }
|
||||
@ -43,7 +43,7 @@ protected:
|
||||
virtual bool OnLastUpdate(Int64 a_LastUpdate) override { return false; }
|
||||
virtual bool OnTerrainPopulated(bool a_Populated) override { return false; } // We don't care about "populated", the biomes are the same
|
||||
virtual bool OnBiomes(const unsigned char * a_BiomeData) override;
|
||||
|
||||
|
||||
void StartNewRegion(int a_RegionX, int a_RegionZ);
|
||||
} ;
|
||||
|
||||
@ -56,14 +56,10 @@ class cBiomeMapFactory :
|
||||
{
|
||||
public:
|
||||
virtual ~cBiomeMapFactory();
|
||||
|
||||
|
||||
virtual cCallback * CreateNewCallback(void) override
|
||||
{
|
||||
return new cBiomeMap;
|
||||
}
|
||||
|
||||
} ;
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -37,39 +37,39 @@ public:
|
||||
CALLBACK_CONTINUE = false,
|
||||
CALLBACK_ABORT = true,
|
||||
} ;
|
||||
|
||||
|
||||
virtual ~cCallback() {} // Force a virtual destructor in each descendant
|
||||
|
||||
/// Called when a new region file is about to be opened; by default allow the region
|
||||
/** Called when a new region file is about to be opened; by default allow the region */
|
||||
virtual bool OnNewRegion(int a_RegionX, int a_RegionZ) { return CALLBACK_CONTINUE; }
|
||||
|
||||
/// Called to inform the stats module of the chunk coords for newly processing chunk
|
||||
|
||||
/** Called to inform the stats module of the chunk coords for newly processing chunk */
|
||||
virtual bool OnNewChunk(int a_ChunkX, int a_ChunkZ) = 0;
|
||||
|
||||
/// Called to inform about the chunk's data offset in the file (chunk mini-header), the number of sectors it uses and the timestamp field value
|
||||
|
||||
/** Called to inform about the chunk's data offset in the file (chunk mini-header), the number of sectors it uses and the timestamp field value */
|
||||
virtual bool OnHeader(int a_FileOffset, unsigned char a_NumSectors, int a_Timestamp) { return CALLBACK_ABORT; }
|
||||
|
||||
/// Called to inform of the compressed chunk data size and position in the file (offset from file start to the actual data)
|
||||
|
||||
/** Called to inform of the compressed chunk data size and position in the file (offset from file start to the actual data) */
|
||||
virtual bool OnCompressedDataSizePos(int a_CompressedDataSize, int a_DataOffset, char a_CompressionMethod) { return CALLBACK_ABORT; }
|
||||
|
||||
/// Just in case you wanted to process the NBT yourself ;)
|
||||
|
||||
/** Just in case you wanted to process the NBT yourself ;) */
|
||||
virtual bool OnDecompressedData(const char * a_DecompressedNBT, int a_DataSize) { return CALLBACK_ABORT; }
|
||||
|
||||
/// The chunk's NBT should specify chunk coords, these are sent here:
|
||||
|
||||
/** The chunk's NBT should specify chunk coords, these are sent here: */
|
||||
virtual bool OnRealCoords(int a_ChunkX, int a_ChunkZ) { return CALLBACK_ABORT; }
|
||||
|
||||
/// The chunk contains a LastUpdate value specifying the last tick in which it was saved.
|
||||
|
||||
/** The chunk contains a LastUpdate value specifying the last tick in which it was saved. */
|
||||
virtual bool OnLastUpdate(Int64 a_LastUpdate) { return CALLBACK_ABORT; }
|
||||
|
||||
|
||||
virtual bool OnTerrainPopulated(bool a_Populated) { return CALLBACK_ABORT; }
|
||||
|
||||
|
||||
virtual bool OnBiomes(const unsigned char * a_BiomeData) { return CALLBACK_ABORT; }
|
||||
|
||||
|
||||
/** Called when a heightmap for the chunk is read from the file.
|
||||
Note that the heightmap is given in big-endian ints, so if you want it, you need to ntohl() it first!
|
||||
*/
|
||||
virtual bool OnHeightMap(const int * a_HeightMapBE) { return CALLBACK_ABORT; }
|
||||
|
||||
|
||||
/** If there is data for the section, this callback is called; otherwise OnEmptySection() is called instead.
|
||||
All OnSection() callbacks are called first, and only then all the remaining sections are reported in OnEmptySection().
|
||||
*/
|
||||
@ -81,16 +81,16 @@ public:
|
||||
const NIBBLETYPE * a_BlockLight,
|
||||
const NIBBLETYPE * a_BlockSkyLight
|
||||
) { return CALLBACK_ABORT; }
|
||||
|
||||
/** If there is no data for a section, this callback is called; otherwise OnSection() is called instead.
|
||||
|
||||
/** If there is no data for a section, this callback is called; otherwise OnSection() is called instead.
|
||||
OnEmptySection() callbacks are called after all OnSection() callbacks.
|
||||
*/
|
||||
virtual bool OnEmptySection(unsigned char a_Y) { return CALLBACK_CONTINUE; }
|
||||
|
||||
|
||||
/** Called after all sections have been processed via either OnSection() or OnEmptySection().
|
||||
*/
|
||||
virtual bool OnSectionsFinished(void) { return CALLBACK_ABORT; }
|
||||
|
||||
|
||||
/** Called for each entity in the chunk.
|
||||
Common parameters are parsed from the NBT.
|
||||
The callback may parse any other param from the a_NBT and a_NBTTag parameters.
|
||||
@ -108,7 +108,7 @@ public:
|
||||
cParsedNBT & a_NBT,
|
||||
int a_NBTTag
|
||||
) { return CALLBACK_ABORT; }
|
||||
|
||||
|
||||
/** Called for each tile entity in the chunk.
|
||||
Common parameters are parsed from the NBT.
|
||||
The callback may parse any other param from the a_NBT and a_NBTTag parameters.
|
||||
@ -121,14 +121,14 @@ public:
|
||||
int a_NBTTag
|
||||
) { return CALLBACK_ABORT; }
|
||||
|
||||
/// Called for each tile tick in the chunk
|
||||
/** Called for each tile tick in the chunk */
|
||||
virtual bool OnTileTick(
|
||||
int a_BlockType,
|
||||
int a_TicksLeft,
|
||||
int a_PosX, int a_PosY, int a_PosZ
|
||||
) { return CALLBACK_ABORT; }
|
||||
|
||||
/// Called after the entire region file has been processed. No more callbacks for this region will be called. No processing by default
|
||||
|
||||
/** Called after the entire region file has been processed. No more callbacks for this region will be called. No processing by default */
|
||||
virtual void OnRegionFinished(int a_RegionX, int a_RegionZ) {}
|
||||
} ;
|
||||
|
||||
@ -153,11 +153,11 @@ public:
|
||||
delete *itr;
|
||||
}
|
||||
}
|
||||
|
||||
/// Descendants override this method to return the correct callback type
|
||||
|
||||
/** Descendants override this method to return the correct callback type */
|
||||
virtual cCallback * CreateNewCallback(void) = 0;
|
||||
|
||||
/// cProcessor uses this method to request a new callback
|
||||
|
||||
/** cProcessor uses this method to request a new callback */
|
||||
cCallback * GetNewCallback(void)
|
||||
{
|
||||
cCallback * Callback = CreateNewCallback();
|
||||
@ -167,11 +167,7 @@ public:
|
||||
}
|
||||
return Callback;
|
||||
}
|
||||
|
||||
|
||||
protected:
|
||||
cCallbacks m_Callbacks;
|
||||
} ;
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -50,10 +50,10 @@ bool cChunkExtract::OnCompressedDataSizePos(int a_CompressedDataSize, int a_Data
|
||||
LOG("Cannot open zchunk file \"%s\" for writing. Chunk [%d, %d] skipped.", ChunkPath.c_str(), mCurChunkX, mCurChunkZ);
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
// Copy data from mAnvilFile to ChunkFile:
|
||||
mAnvilFile.Seek(a_DataOffset);
|
||||
for (int BytesToCopy = a_CompressedDataSize; BytesToCopy > 0; )
|
||||
for (int BytesToCopy = a_CompressedDataSize; BytesToCopy > 0;)
|
||||
{
|
||||
char Buffer[64000];
|
||||
int NumBytes = std::min(BytesToCopy, (int)sizeof(Buffer));
|
||||
@ -101,4 +101,4 @@ void cChunkExtract::OpenAnvilFile(int a_AnvilX, int a_AnvilZ)
|
||||
}
|
||||
mCurAnvilX = a_AnvilX;
|
||||
mCurAnvilZ = a_AnvilZ;
|
||||
}
|
||||
}
|
||||
|
@ -20,7 +20,7 @@ class cChunkExtract :
|
||||
{
|
||||
public:
|
||||
cChunkExtract(const AString & iWorldFolder);
|
||||
|
||||
|
||||
protected:
|
||||
AString mWorldFolder;
|
||||
cFile mAnvilFile;
|
||||
@ -28,10 +28,10 @@ protected:
|
||||
int mCurAnvilZ; // Z-coord of mAnvilFile, -"-
|
||||
int mCurChunkX; // X-coord of the chunk being processed
|
||||
int mCurChunkZ; // Z-coord of the chunk being processed
|
||||
|
||||
/// Opens new anvil file into mAnvilFile, sets mCurAnvilX and mCurAnvilZ
|
||||
|
||||
/** Opens new anvil file into mAnvilFile, sets mCurAnvilX and mCurAnvilZ */
|
||||
void OpenAnvilFile(int a_AnvilX, int a_AnvilZ);
|
||||
|
||||
|
||||
// cCallback overrides:
|
||||
virtual bool OnNewChunk(int a_ChunkX, int a_ChunkZ) override;
|
||||
virtual bool OnHeader(int a_FileOffset, unsigned char a_NumSectors, int a_Timestamp) override { return false; }
|
||||
@ -51,7 +51,7 @@ public:
|
||||
mWorldFolder(iWorldFolder)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
virtual cCallback * CreateNewCallback(void) override
|
||||
{
|
||||
return new cChunkExtract(mWorldFolder);
|
||||
@ -60,7 +60,3 @@ public:
|
||||
protected:
|
||||
AString mWorldFolder;
|
||||
} ;
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -12,35 +12,35 @@
|
||||
#if defined(_MSC_VER)
|
||||
// MSVC produces warning C4481 on the override keyword usage, so disable the warning altogether
|
||||
#pragma warning(disable:4481)
|
||||
|
||||
|
||||
// Disable some warnings that we don't care about:
|
||||
#pragma warning(disable:4100)
|
||||
|
||||
|
||||
#define _CRT_SECURE_NO_WARNINGS
|
||||
|
||||
#define OBSOLETE __declspec(deprecated)
|
||||
|
||||
|
||||
// No alignment needed in MSVC
|
||||
#define ALIGN_8
|
||||
#define ALIGN_16
|
||||
|
||||
|
||||
#define FORMATSTRING(formatIndex, va_argsIndex)
|
||||
|
||||
// MSVC has its own custom version of zu format
|
||||
#define SIZE_T_FMT "%Iu"
|
||||
#define SIZE_T_FMT_PRECISION(x) "%" #x "Iu"
|
||||
#define SIZE_T_FMT_HEX "%Ix"
|
||||
|
||||
|
||||
#define NORETURN __declspec(noreturn)
|
||||
|
||||
#elif defined(__GNUC__)
|
||||
|
||||
// TODO: Can GCC explicitly mark classes as abstract (no instances can be created)?
|
||||
#define abstract
|
||||
|
||||
|
||||
// TODO: Can GCC mark virtual methods as overriding (forcing them to have a virtual function of the same signature in the base class)
|
||||
#define override
|
||||
|
||||
|
||||
#define OBSOLETE __attribute__((deprecated))
|
||||
|
||||
#define ALIGN_8 __attribute__((aligned(8)))
|
||||
@ -54,19 +54,19 @@
|
||||
#define SIZE_T_FMT "%zu"
|
||||
#define SIZE_T_FMT_PRECISION(x) "%" #x "zu"
|
||||
#define SIZE_T_FMT_HEX "%zx"
|
||||
|
||||
|
||||
#define NORETURN __attribute((__noreturn__))
|
||||
|
||||
#else
|
||||
|
||||
#error "You are using an unsupported compiler, you might need to #define some stuff here for your compiler"
|
||||
|
||||
|
||||
/*
|
||||
// Copy and uncomment this into another #elif section based on your compiler identification
|
||||
|
||||
|
||||
// Explicitly mark classes as abstract (no instances can be created)
|
||||
#define abstract
|
||||
|
||||
|
||||
// Mark virtual methods as overriding (forcing them to have a virtual function of the same signature in the base class)
|
||||
#define override
|
||||
|
||||
@ -114,11 +114,11 @@ typedef unsigned short UInt16;
|
||||
#define WIN32_LEAN_AND_MEAN
|
||||
#include <Windows.h>
|
||||
#include <winsock2.h>
|
||||
|
||||
|
||||
// Windows SDK defines min and max macros, messing up with our std::min and std::max usage
|
||||
#undef min
|
||||
#undef max
|
||||
|
||||
|
||||
// Windows SDK defines GetFreeSpace as a constant, probably a Win16 API remnant
|
||||
#ifdef GetFreeSpace
|
||||
#undef GetFreeSpace
|
||||
@ -193,35 +193,35 @@ typedef unsigned short UInt16;
|
||||
|
||||
// Common definitions:
|
||||
|
||||
#define LOG(x,...) printf(x "\n", __VA_ARGS__)
|
||||
#define LOG(x, ...) printf(x "\n", __VA_ARGS__)
|
||||
#define LOGERROR LOG
|
||||
#define LOGWARNING LOG
|
||||
#define LOGINFO LOG
|
||||
#define LOGWARN LOG
|
||||
|
||||
/// Evaluates to the number of elements in an array (compile-time!)
|
||||
/** Evaluates to the number of elements in an array (compile-time!) */
|
||||
#define ARRAYCOUNT(X) (sizeof(X) / sizeof(*(X)))
|
||||
|
||||
/// Allows arithmetic expressions like "32 KiB" (but consider using parenthesis around it, "(32 KiB)" )
|
||||
/** Allows arithmetic expressions like "32 KiB" (but consider using parenthesis around it, "(32 KiB)") */
|
||||
#define KiB * 1024
|
||||
|
||||
/// Allows arithmetic expressions like "32 MiB" (but consider using parenthesis around it, "(32 MiB)" )
|
||||
/** Allows arithmetic expressions like "32 MiB" (but consider using parenthesis around it, "(32 MiB)") */
|
||||
#define MiB * 1024 * 1024
|
||||
|
||||
/// Faster than (int)floorf((float)x / (float)div)
|
||||
#define FAST_FLOOR_DIV( x, div ) ( (x) < 0 ? (((int)x / div) - 1) : ((int)x / div) )
|
||||
/** Faster than (int)floorf((float)x / (float)div) */
|
||||
#define FAST_FLOOR_DIV(x, div) ((x) < 0 ? (((int)x / div) - 1) : ((int)x / div))
|
||||
|
||||
#define TOLUA_TEMPLATE_BIND(...)
|
||||
|
||||
// Own version of assert() that writes failed assertions to the log for review
|
||||
#ifdef _DEBUG
|
||||
#define ASSERT( x ) ( !!(x) || ( LOGERROR("Assertion failed: %s, file %s, line %i", #x, __FILE__, __LINE__ ), assert(0), 0 ) )
|
||||
#define ASSERT(x) (!!(x) || (LOGERROR("Assertion failed: %s, file %s, line %i", #x, __FILE__, __LINE__), assert(0), 0))
|
||||
#else
|
||||
#define ASSERT(x) ((void)0)
|
||||
#endif
|
||||
|
||||
// Pretty much the same as ASSERT() but stays in Release builds
|
||||
#define VERIFY( x ) ( !!(x) || ( LOGERROR("Verification failed: %s, file %s, line %i", #x, __FILE__, __LINE__ ), exit(1), 0 ) )
|
||||
#define VERIFY(x) (!!(x) || (LOGERROR("Verification failed: %s, file %s, line %i", #x, __FILE__, __LINE__), exit(1), 0))
|
||||
|
||||
typedef unsigned char Byte;
|
||||
|
||||
@ -229,11 +229,11 @@ typedef unsigned char Byte;
|
||||
|
||||
|
||||
|
||||
/// A generic interface used mainly in ForEach() functions
|
||||
/** A generic interface used mainly in ForEach() functions */
|
||||
template <typename Type> class cItemCallback
|
||||
{
|
||||
public:
|
||||
/// Called for each item in the internal list; return true to stop the loop, or false to continue enumerating
|
||||
/** Called for each item in the internal list; return true to stop the loop, or false to continue enumerating */
|
||||
virtual bool Item(Type * a_Type) = 0;
|
||||
} ;
|
||||
|
||||
@ -255,8 +255,3 @@ T Clamp(T a_Value, T a_Min, T a_Max)
|
||||
// Common headers (part 2, with macros):
|
||||
#include "../../src/ChunkDef.h"
|
||||
#include "../../src/BlockID.h"
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -55,12 +55,12 @@ bool cHeightBiomeMap::OnNewChunk(int a_ChunkX, int a_ChunkZ)
|
||||
m_CurrentChunkZ = a_ChunkZ;
|
||||
m_CurrentChunkRelX = m_CurrentChunkX - m_CurrentRegionX * 32;
|
||||
m_CurrentChunkRelZ = m_CurrentChunkZ - m_CurrentRegionZ * 32;
|
||||
|
||||
|
||||
ASSERT((m_CurrentChunkRelX >= 0) && (m_CurrentChunkRelX < 32));
|
||||
ASSERT((m_CurrentChunkRelZ >= 0) && (m_CurrentChunkRelZ < 32));
|
||||
|
||||
|
||||
memset(m_BlockTypes, 0, sizeof(m_BlockTypes));
|
||||
|
||||
|
||||
return CALLBACK_CONTINUE;
|
||||
}
|
||||
|
||||
@ -72,7 +72,7 @@ bool cHeightBiomeMap::OnNewChunk(int a_ChunkX, int a_ChunkZ)
|
||||
bool cHeightBiomeMap::OnBiomes(const unsigned char * a_BiomeData)
|
||||
{
|
||||
memcpy(m_ChunkBiomes, a_BiomeData, sizeof(m_ChunkBiomes));
|
||||
|
||||
|
||||
return CALLBACK_CONTINUE;
|
||||
}
|
||||
|
||||
@ -86,7 +86,7 @@ bool cHeightBiomeMap::OnHeightMap(const int * a_HeightMapBE)
|
||||
{
|
||||
m_ChunkHeight[i] = ntohl(a_HeightMapBE[i]);
|
||||
} // for i - m_ChunkHeight
|
||||
|
||||
|
||||
return CALLBACK_CONTINUE;
|
||||
}
|
||||
|
||||
@ -157,12 +157,12 @@ bool cHeightBiomeMap::OnSectionsFinished(void)
|
||||
break; // for y
|
||||
}
|
||||
} // for y
|
||||
|
||||
|
||||
// Set the color based on the biome and height:
|
||||
char Biome = m_ChunkBiomes[16 * z + x];
|
||||
PixelLine[x] = ShadeColor(BiomePalette[Biome], Height);
|
||||
} // for x
|
||||
|
||||
|
||||
// Set the pixelline into the image:
|
||||
SetPixelURow(m_CurrentChunkRelX * 16, m_CurrentChunkRelZ * 16 + z, 16, PixelLine);
|
||||
} // for z
|
||||
@ -173,7 +173,7 @@ bool cHeightBiomeMap::OnSectionsFinished(void)
|
||||
|
||||
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
// cHeightBiomeMapFactory:
|
||||
|
||||
cHeightBiomeMapFactory::~cHeightBiomeMapFactory()
|
||||
@ -203,7 +203,7 @@ cHeightBiomeMapFactory::~cHeightBiomeMapFactory()
|
||||
MaxRegionZ = cb->m_MaxRegionZ;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// If the size is small enough, write an HTML file referencing all the images in a table:
|
||||
if ((MaxRegionX >= MinRegionX) && (MaxRegionZ >= MinRegionZ) && (MaxRegionX - MinRegionX < 100) && (MaxRegionZ - MinRegionZ < 100))
|
||||
{
|
||||
@ -224,7 +224,3 @@ cHeightBiomeMapFactory::~cHeightBiomeMapFactory()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -19,23 +19,26 @@ class cHeightBiomeMap :
|
||||
public cImageComposingCallback
|
||||
{
|
||||
typedef cImageComposingCallback super;
|
||||
|
||||
|
||||
public:
|
||||
// Minima and maxima for the regions processed through this callback
|
||||
int m_MinRegionX, m_MaxRegionX;
|
||||
int m_MinRegionZ, m_MaxRegionZ;
|
||||
|
||||
|
||||
cHeightBiomeMap(void);
|
||||
|
||||
|
||||
protected:
|
||||
int m_CurrentChunkX; // Absolute chunk coords
|
||||
int m_CurrentChunkZ;
|
||||
int m_CurrentChunkRelX; // Chunk offset from the start of the region
|
||||
int m_CurrentChunkRelZ;
|
||||
|
||||
char m_ChunkBiomes[16 * 16]; ///< Biome-map for the current chunk
|
||||
int m_ChunkHeight[16 * 16]; ///< Height-map for the current chunk
|
||||
BLOCKTYPE m_BlockTypes [16 * 16 * 256]; ///< Block data for the current chunk (between OnSection() and OnSectionsFinished() )
|
||||
|
||||
/** Biome-map for the current chunk */
|
||||
char m_ChunkBiomes[16 * 16];
|
||||
/** Height-map for the current chunk */
|
||||
int m_ChunkHeight[16 * 16];
|
||||
/** Block data for the current chunk (between OnSection() and OnSectionsFinished()) */
|
||||
BLOCKTYPE m_BlockTypes [16 * 16 * 256];
|
||||
|
||||
// cCallback overrides:
|
||||
virtual bool OnNewRegion(int a_RegionX, int a_RegionZ) override;
|
||||
@ -57,7 +60,7 @@ protected:
|
||||
const NIBBLETYPE * a_BlockSkyLight
|
||||
) override;
|
||||
virtual bool OnSectionsFinished(void) override;
|
||||
|
||||
|
||||
} ;
|
||||
|
||||
|
||||
@ -69,13 +72,9 @@ class cHeightBiomeMapFactory :
|
||||
{
|
||||
public:
|
||||
virtual ~cHeightBiomeMapFactory();
|
||||
|
||||
|
||||
virtual cCallback * CreateNewCallback(void) override
|
||||
{
|
||||
return new cHeightBiomeMap;
|
||||
}
|
||||
} ;
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -1,7 +1,7 @@
|
||||
|
||||
// HeightMap.cpp
|
||||
|
||||
// Implements the cHeightMap class representing a cCallback descendant that draws a B&W map of heights for the world
|
||||
// Implements the cHeightMap class representing a cCallback descendant that draws a B & W map of heights for the world
|
||||
|
||||
#include "Globals.h"
|
||||
#include "HeightMap.h"
|
||||
@ -253,7 +253,7 @@ bool cHeightMap::IsGround(BLOCKTYPE a_BlockType)
|
||||
|
||||
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
// cHeightMapFactory:
|
||||
|
||||
cHeightMapFactory::~cHeightMapFactory()
|
||||
@ -265,7 +265,3 @@ cHeightMapFactory::~cHeightMapFactory()
|
||||
}
|
||||
// TODO: Join all the files into one giant image file
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -1,7 +1,7 @@
|
||||
|
||||
// HeightMap.h
|
||||
|
||||
// Declares the cHeightMap class representing a cCallback descendant that draws a B&W map of heights for the world
|
||||
// Declares the cHeightMap class representing a cCallback descendant that draws a B & W map of heights for the world
|
||||
|
||||
|
||||
|
||||
@ -20,9 +20,9 @@ class cHeightMap :
|
||||
{
|
||||
public:
|
||||
cHeightMap(void);
|
||||
|
||||
|
||||
void Finish(void);
|
||||
|
||||
|
||||
static bool IsGround(BLOCKTYPE a_BlockType);
|
||||
|
||||
protected:
|
||||
@ -33,9 +33,11 @@ protected:
|
||||
int m_CurrentRegionX;
|
||||
int m_CurrentRegionZ;
|
||||
bool m_IsCurrentRegionValid;
|
||||
int m_Height[16 * 32 * 16 * 32]; ///< Height-map of the entire current region [x + 16 * 32 * z]
|
||||
BLOCKTYPE m_BlockTypes[16 * 16 * 256]; ///< Block data of the currently processed chunk (between OnSection() and OnSectionsFinished() )
|
||||
|
||||
/** Height-map of the entire current region [x + 16 * 32 * z] */
|
||||
int m_Height[16 * 32 * 16 * 32];
|
||||
/** Block data of the currently processed chunk (between OnSection() and OnSectionsFinished()) */
|
||||
BLOCKTYPE m_BlockTypes[16 * 16 * 256];
|
||||
|
||||
// cCallback overrides:
|
||||
virtual bool OnNewChunk(int a_ChunkX, int a_ChunkZ) override;
|
||||
virtual bool OnHeader(int a_FileOffset, unsigned char a_NumSectors, int a_Timestamp) override { return false; }
|
||||
@ -68,14 +70,10 @@ class cHeightMapFactory :
|
||||
{
|
||||
public:
|
||||
virtual ~cHeightMapFactory();
|
||||
|
||||
|
||||
virtual cCallback * CreateNewCallback(void) override
|
||||
{
|
||||
return new cHeightMap;
|
||||
}
|
||||
|
||||
} ;
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -35,11 +35,11 @@ bool cImageComposingCallback::OnNewRegion(int a_RegionX, int a_RegionZ)
|
||||
{
|
||||
ASSERT(m_CurrentRegionX == INVALID_REGION_COORD);
|
||||
ASSERT(m_CurrentRegionZ == INVALID_REGION_COORD); // Has any previous region been finished properly?
|
||||
|
||||
|
||||
m_CurrentRegionX = a_RegionX;
|
||||
m_CurrentRegionZ = a_RegionZ;
|
||||
OnEraseImage();
|
||||
|
||||
|
||||
return CALLBACK_CONTINUE;
|
||||
}
|
||||
|
||||
@ -53,7 +53,7 @@ void cImageComposingCallback::OnRegionFinished(int a_RegionX, int a_RegionZ)
|
||||
ASSERT(m_CurrentRegionZ != INVALID_REGION_COORD); // Has a region been started properly?
|
||||
ASSERT(m_CurrentRegionX == a_RegionX);
|
||||
ASSERT(m_CurrentRegionZ == a_RegionZ); // Is it the same region that has been started?
|
||||
|
||||
|
||||
AString FileName = GetFileName(a_RegionX, a_RegionZ);
|
||||
if (!FileName.empty())
|
||||
{
|
||||
@ -61,7 +61,7 @@ void cImageComposingCallback::OnRegionFinished(int a_RegionX, int a_RegionZ)
|
||||
SaveImage(FileName);
|
||||
OnAfterImageSaved(a_RegionX, a_RegionZ, FileName);
|
||||
}
|
||||
|
||||
|
||||
m_CurrentRegionX = INVALID_REGION_COORD;
|
||||
m_CurrentRegionZ = INVALID_REGION_COORD;
|
||||
}
|
||||
@ -122,7 +122,7 @@ void cImageComposingCallback::SetPixel(int a_RelU, int a_RelV, int a_Color)
|
||||
{
|
||||
ASSERT((a_RelU >= 0) && (a_RelU < IMAGE_WIDTH));
|
||||
ASSERT((a_RelV >= 0) && (a_RelV < IMAGE_HEIGHT));
|
||||
|
||||
|
||||
m_ImageData[a_RelU + IMAGE_WIDTH * a_RelV] = a_Color;
|
||||
}
|
||||
|
||||
@ -137,7 +137,7 @@ int cImageComposingCallback::GetPixel(int a_RelU, int a_RelV)
|
||||
// Outside the image data
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
return m_ImageData[a_RelU + IMAGE_WIDTH * a_RelV];
|
||||
}
|
||||
|
||||
@ -213,7 +213,3 @@ void cImageComposingCallback::SaveImage(const AString & a_FileName)
|
||||
f.Write(BMPHeader, sizeof(BMPHeader));
|
||||
f.Write(m_ImageData, PIXEL_COUNT * 4);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -32,74 +32,70 @@ public:
|
||||
IMAGE_HEIGHT = 32 * 16,
|
||||
PIXEL_COUNT = IMAGE_WIDTH * IMAGE_HEIGHT, ///< Total pixel count of the image data
|
||||
} ;
|
||||
|
||||
|
||||
cImageComposingCallback(const AString & a_FileNamePrefix);
|
||||
virtual ~cImageComposingCallback();
|
||||
|
||||
// cCallback overrides:
|
||||
virtual bool OnNewRegion(int a_RegionX, int a_RegionZ) override;
|
||||
virtual void OnRegionFinished(int a_RegionX, int a_RegionZ) override;
|
||||
|
||||
|
||||
// New introduced overridable functions:
|
||||
|
||||
/// Called when a file is about to be saved, to generate the filename
|
||||
|
||||
/** Called when a file is about to be saved, to generate the filename */
|
||||
virtual AString GetFileName(int a_RegionX, int a_RegionZ);
|
||||
|
||||
/// Called before the file is saved
|
||||
|
||||
/** Called before the file is saved */
|
||||
virtual void OnBeforeImageSaved(int a_RegionX, int a_RegionZ, const AString & a_FileName) {}
|
||||
|
||||
/// Called after the image is saved to a file
|
||||
|
||||
/** Called after the image is saved to a file */
|
||||
virtual void OnAfterImageSaved(int a_RegionX, int a_RegionZ, const AString & a_FileName) {}
|
||||
|
||||
/// Called when a new region is beginning, to erase the image data
|
||||
|
||||
/** Called when a new region is beginning, to erase the image data */
|
||||
virtual void OnEraseImage(void);
|
||||
|
||||
|
||||
// Functions for manipulating the image:
|
||||
|
||||
/// Erases the entire image with the specified color
|
||||
|
||||
/** Erases the entire image with the specified color */
|
||||
void EraseImage(int a_Color);
|
||||
|
||||
/// Erases the specified chunk's portion of the image with the specified color. Note that chunk coords are relative to the current region
|
||||
|
||||
/** Erases the specified chunk's portion of the image with the specified color. Note that chunk coords are relative to the current region */
|
||||
void EraseChunk(int a_Color, int a_RelChunkX, int a_RelChunkZ);
|
||||
|
||||
/// Returns the current region X coord
|
||||
|
||||
/** Returns the current region X coord */
|
||||
int GetCurrentRegionX(void) const { return m_CurrentRegionX; }
|
||||
|
||||
/// Returns the current region Z coord
|
||||
|
||||
/** Returns the current region Z coord */
|
||||
int GetCurrentRegionZ(void) const { return m_CurrentRegionZ; }
|
||||
|
||||
/// Sets the pixel at the specified UV coords to the specified color
|
||||
|
||||
/** Sets the pixel at the specified UV coords to the specified color */
|
||||
void SetPixel(int a_RelU, int a_RelV, int a_Color);
|
||||
|
||||
/// Returns the color of the pixel at the specified UV coords; -1 if outside
|
||||
|
||||
/** Returns the color of the pixel at the specified UV coords; -1 if outside */
|
||||
int GetPixel(int a_RelU, int a_RelV);
|
||||
|
||||
/// Sets a row of pixels. a_Pixels is expected to be a_CountU pixels wide. a_RelUStart + a_CountU is assumed less than image width
|
||||
|
||||
/** Sets a row of pixels. a_Pixels is expected to be a_CountU pixels wide. a_RelUStart + a_CountU is assumed less than image width */
|
||||
void SetPixelURow(int a_RelUStart, int a_RelV, int a_CountU, int * a_Pixels);
|
||||
|
||||
|
||||
/** "Shades" the given color based on the shade amount given
|
||||
Shade amount 0 .. 63 shades the color from black to a_Color.
|
||||
Shade amount 64 .. 127 shades the color from a_Color to white.
|
||||
All other shade amounts have undefined results.
|
||||
*/
|
||||
static int ShadeColor(int a_Color, int a_Shade);
|
||||
|
||||
/// Mixes the two colors in the specified ratio; a_Ratio is between 0 and 256, 0 returning a_Src
|
||||
|
||||
/** Mixes the two colors in the specified ratio; a_Ratio is between 0 and 256, 0 returning a_Src */
|
||||
static int MixColor(int a_Src, int a_Dest, int a_Ratio);
|
||||
|
||||
|
||||
protected:
|
||||
/// Prefix for the filenames, when generated by the default GetFileName() function
|
||||
/** Prefix for the filenames, when generated by the default GetFileName() function */
|
||||
AString m_FileNamePrefix;
|
||||
|
||||
/// Coords of the currently processed region
|
||||
|
||||
/** Coords of the currently processed region */
|
||||
int m_CurrentRegionX, m_CurrentRegionZ;
|
||||
|
||||
/// Raw image data; 1 MiB worth of data, therefore unsuitable for stack allocation. [u + IMAGE_WIDTH * v]
|
||||
|
||||
/** Raw image data; 1 MiB worth of data, therefore unsuitable for stack allocation. [u + IMAGE_WIDTH * v] */
|
||||
int * m_ImageData;
|
||||
|
||||
|
||||
void SaveImage(const AString & a_FileName);
|
||||
} ;
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -20,7 +20,7 @@ const int CHUNK_INFLATE_MAX = 1 MiB;
|
||||
|
||||
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
// cProcessor::cThread:
|
||||
|
||||
cProcessor::cThread::cThread(cCallback & a_Callback, cProcessor & a_ParentProcessor) :
|
||||
@ -48,9 +48,9 @@ void cProcessor::cThread::WaitForStart(void)
|
||||
void cProcessor::cThread::Execute(void)
|
||||
{
|
||||
LOG("Started a new thread: %p, ID %d", this, cIsThread::GetCurrentID());
|
||||
|
||||
|
||||
m_HasStarted.Set();
|
||||
|
||||
|
||||
for (;;)
|
||||
{
|
||||
AString FileName = m_ParentProcessor.GetOneFileName();
|
||||
@ -61,7 +61,7 @@ void cProcessor::cThread::Execute(void)
|
||||
}
|
||||
ProcessFile(FileName);
|
||||
} // for-ever
|
||||
|
||||
|
||||
LOG("Thread %p (ID %d) terminated", this, cIsThread::GetCurrentID());
|
||||
}
|
||||
|
||||
@ -72,7 +72,7 @@ void cProcessor::cThread::Execute(void)
|
||||
void cProcessor::cThread::ProcessFile(const AString & a_FileName)
|
||||
{
|
||||
LOG("Processing file \"%s\"", a_FileName.c_str());
|
||||
|
||||
|
||||
size_t idx = a_FileName.rfind("r.");
|
||||
if (idx == AString::npos)
|
||||
{
|
||||
@ -91,14 +91,14 @@ void cProcessor::cThread::ProcessFile(const AString & a_FileName)
|
||||
// Callback doesn't want the region file processed
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
cFile f;
|
||||
if (!f.Open(a_FileName, cFile::fmRead))
|
||||
{
|
||||
LOG("Cannot open file \"%s\", skipping file.", a_FileName.c_str());
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
AString FileContents;
|
||||
f.ReadRestOfFile(FileContents);
|
||||
if (FileContents.size() < sizeof(8 KiB))
|
||||
@ -106,9 +106,9 @@ void cProcessor::cThread::ProcessFile(const AString & a_FileName)
|
||||
LOG("Cannot read header in file \"%s\", skipping file.", a_FileName.c_str());
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
ProcessFileData(FileContents.data(), FileContents.size(), RegionX * 32, RegionZ * 32);
|
||||
|
||||
|
||||
m_Callback.OnRegionFinished(RegionX, RegionZ);
|
||||
}
|
||||
|
||||
@ -124,16 +124,16 @@ void cProcessor::cThread::ProcessFileData(const char * a_FileData, size_t a_Size
|
||||
{
|
||||
Header[i] = ntohl(HeaderPtr[i]);
|
||||
}
|
||||
|
||||
|
||||
for (int i = 0; i < 1024; i++)
|
||||
{
|
||||
unsigned Location = Header[i];
|
||||
unsigned Timestamp = Header[i + 1024];
|
||||
if (
|
||||
((Location == 0) && (Timestamp == 0)) || // Official docs' "not present"
|
||||
(Location >> 8 < 2) || // Logical - no chunk can start inside the header
|
||||
((Location & 0xff) == 0) || // Logical - no chunk can be zero bytes
|
||||
((Location >> 8) * 4096 > a_Size) // Logical - no chunk can start at beyond the file end
|
||||
((Location == 0) && (Timestamp == 0)) || // Official docs' "not present"
|
||||
(Location >> 8 < 2) || // Logical - no chunk can start inside the header
|
||||
((Location & 0xff) == 0) || // Logical - no chunk can be zero bytes
|
||||
((Location >> 8) * 4096 > a_Size) // Logical - no chunk can start at beyond the file end
|
||||
)
|
||||
{
|
||||
// Chunk not present in the file
|
||||
@ -159,11 +159,11 @@ void cProcessor::cThread::ProcessChunk(const char * a_FileData, int a_ChunkX, in
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
const char * ChunkStart = a_FileData + a_SectorStart * 4096;
|
||||
int ByteSize = ntohl(*(int *)ChunkStart);
|
||||
char CompressionMethod = ChunkStart[4];
|
||||
|
||||
|
||||
if (m_Callback.OnCompressedDataSizePos(ByteSize, a_SectorStart * 4096 + 5, CompressionMethod))
|
||||
{
|
||||
return;
|
||||
@ -195,7 +195,7 @@ void cProcessor::cThread::ProcessCompressedChunkData(int a_ChunkX, int a_ChunkZ,
|
||||
LOG("Decompression failed, skipping chunk [%d, %d]", a_ChunkX, a_ChunkZ);
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
if (m_Callback.OnDecompressedData(Decompressed, strm.total_out))
|
||||
{
|
||||
return;
|
||||
@ -208,7 +208,7 @@ void cProcessor::cThread::ProcessCompressedChunkData(int a_ChunkX, int a_ChunkZ,
|
||||
LOG("NBT Parsing failed, skipping chunk [%d, %d]", a_ChunkX, a_ChunkZ);
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
ProcessParsedChunkData(a_ChunkX, a_ChunkZ, NBT);
|
||||
}
|
||||
|
||||
@ -235,7 +235,7 @@ void cProcessor::cThread::ProcessParsedChunkData(int a_ChunkX, int a_ChunkZ, cPa
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
int LastUpdateTag = a_NBT.FindChildByName(LevelTag, "LastUpdate");
|
||||
if (LastUpdateTag > 0)
|
||||
{
|
||||
@ -244,14 +244,14 @@ void cProcessor::cThread::ProcessParsedChunkData(int a_ChunkX, int a_ChunkZ, cPa
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
int TerrainPopulatedTag = a_NBT.FindChildByName(LevelTag, "TerrainPopulated");
|
||||
bool TerrainPopulated = (TerrainPopulatedTag < 0) ? false : (a_NBT.GetByte(TerrainPopulatedTag) != 0);
|
||||
if (m_Callback.OnTerrainPopulated(TerrainPopulated))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
int BiomesTag = a_NBT.FindChildByName(LevelTag, "Biomes");
|
||||
if (BiomesTag > 0)
|
||||
{
|
||||
@ -260,7 +260,7 @@ void cProcessor::cThread::ProcessParsedChunkData(int a_ChunkX, int a_ChunkZ, cPa
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
int HeightMapTag = a_NBT.FindChildByName(LevelTag, "HeightMap");
|
||||
if (HeightMapTag > 0)
|
||||
{
|
||||
@ -269,22 +269,22 @@ void cProcessor::cThread::ProcessParsedChunkData(int a_ChunkX, int a_ChunkZ, cPa
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if (ProcessChunkSections(a_ChunkX, a_ChunkZ, a_NBT, LevelTag))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
if (ProcessChunkEntities(a_ChunkX, a_ChunkZ, a_NBT, LevelTag))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
if (ProcessChunkTileEntities(a_ChunkX, a_ChunkZ, a_NBT, LevelTag))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
if (ProcessChunkTileTicks(a_ChunkX, a_ChunkZ, a_NBT, LevelTag))
|
||||
{
|
||||
return;
|
||||
@ -302,7 +302,7 @@ bool cProcessor::cThread::ProcessChunkSections(int a_ChunkX, int a_ChunkZ, cPars
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
bool SectionProcessed[16];
|
||||
memset(SectionProcessed, 0, sizeof(SectionProcessed));
|
||||
for (int Tag = a_NBT.GetFirstChild(Sections); Tag > 0; Tag = a_NBT.GetNextSibling(Tag))
|
||||
@ -313,12 +313,12 @@ bool cProcessor::cThread::ProcessChunkSections(int a_ChunkX, int a_ChunkZ, cPars
|
||||
int DataTag = a_NBT.FindChildByName(Tag, "Data");
|
||||
int BlockLightTag = a_NBT.FindChildByName(Tag, "BlockLightTag");
|
||||
int SkyLightTag = a_NBT.FindChildByName(Tag, "SkyLight");
|
||||
|
||||
|
||||
if ((YTag < 0) || (BlocksTag < 0) || (DataTag < 0))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
|
||||
unsigned char SectionY = a_NBT.GetByte(YTag);
|
||||
if (SectionY >= 16)
|
||||
{
|
||||
@ -338,7 +338,7 @@ bool cProcessor::cThread::ProcessChunkSections(int a_ChunkX, int a_ChunkZ, cPars
|
||||
}
|
||||
SectionProcessed[SectionY] = true;
|
||||
} // for Tag - Sections[]
|
||||
|
||||
|
||||
// Call the callback for empty sections:
|
||||
for (unsigned char y = 0; y < 16; y++)
|
||||
{
|
||||
@ -350,12 +350,12 @@ bool cProcessor::cThread::ProcessChunkSections(int a_ChunkX, int a_ChunkZ, cPars
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if (m_Callback.OnSectionsFinished())
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
@ -370,7 +370,7 @@ bool cProcessor::cThread::ProcessChunkEntities(int a_ChunkX, int a_ChunkZ, cPars
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
for (int EntityTag = a_NBT.GetFirstChild(EntitiesTag); EntityTag > 0; EntityTag = a_NBT.GetNextSibling(EntityTag))
|
||||
{
|
||||
int PosTag = a_NBT.FindChildByName(EntityTag, "Pos");
|
||||
@ -433,7 +433,7 @@ bool cProcessor::cThread::ProcessChunkTileEntities(int a_ChunkX, int a_ChunkZ, c
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
for (int TileEntityTag = a_NBT.GetFirstChild(TileEntitiesTag); TileEntityTag > 0; TileEntityTag = a_NBT.GetNextSibling(TileEntityTag))
|
||||
{
|
||||
if (m_Callback.OnTileEntity(
|
||||
@ -461,7 +461,7 @@ bool cProcessor::cThread::ProcessChunkTileTicks(int a_ChunkX, int a_ChunkZ, cPar
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
for (int TileTickTag = a_NBT.GetFirstChild(TileTicksTag); TileTickTag > 0; TileTickTag = a_NBT.GetNextSibling(TileTickTag))
|
||||
{
|
||||
int iTag = a_NBT.FindChildByName(TileTicksTag, "i");
|
||||
@ -491,7 +491,7 @@ bool cProcessor::cThread::ProcessChunkTileTicks(int a_ChunkX, int a_ChunkZ, cPar
|
||||
|
||||
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
// cProcessor:
|
||||
|
||||
cProcessor::cProcessor(void) :
|
||||
@ -514,24 +514,24 @@ cProcessor::~cProcessor()
|
||||
void cProcessor::ProcessWorld(const AString & a_WorldFolder, cCallbackFactory & a_CallbackFactory)
|
||||
{
|
||||
PopulateFileQueue(a_WorldFolder);
|
||||
|
||||
|
||||
if (m_FileQueue.empty())
|
||||
{
|
||||
LOG("No files to process, exitting.");
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
// Start as many threads as there are cores, plus one:
|
||||
// (One more thread can be in the file-read IO block while all other threads crunch the numbers)
|
||||
int NumThreads = GetNumCores() + 1;
|
||||
|
||||
|
||||
/*
|
||||
// Limit the number of threads in DEBUG mode to 1 for easier debugging
|
||||
#ifdef _DEBUG
|
||||
NumThreads = 1;
|
||||
#endif // _DEBUG
|
||||
//*/
|
||||
|
||||
|
||||
// Start all the threads:
|
||||
for (int i = 0; i < NumThreads; i++)
|
||||
{
|
||||
@ -589,7 +589,3 @@ AString cProcessor::GetOneFileName(void)
|
||||
m_FileQueue.pop_back();
|
||||
return res;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -27,20 +27,20 @@ class cProcessor
|
||||
public cIsThread
|
||||
{
|
||||
typedef cIsThread super;
|
||||
|
||||
|
||||
cCallback & m_Callback;
|
||||
cProcessor & m_ParentProcessor;
|
||||
cEvent m_HasStarted;
|
||||
|
||||
|
||||
// cIsThread override:
|
||||
virtual void Execute(void) override;
|
||||
|
||||
|
||||
void ProcessFile(const AString & a_FileName);
|
||||
void ProcessFileData(const char * a_FileData, size_t a_Size, int a_ChunkBaseX, int a_ChunkBaseZ);
|
||||
void ProcessChunk(const char * a_FileData, int a_ChunkX, int a_ChunkZ, unsigned a_SectorStart, unsigned a_SectorSize, unsigned a_TimeStamp);
|
||||
void ProcessCompressedChunkData(int a_ChunkX, int a_ChunkZ, const char * a_CompressedData, int a_CompressedSize);
|
||||
void ProcessParsedChunkData(int a_ChunkX, int a_ChunkZ, cParsedNBT & a_NBT);
|
||||
|
||||
|
||||
// The following processing parts return true if they were interrupted by the callback, causing the processing of current chunk to abort
|
||||
bool ProcessChunkSections(int a_ChunkX, int a_ChunkZ, cParsedNBT & a_NBT, int a_LevelTag);
|
||||
bool ProcessChunkEntities(int a_ChunkX, int a_ChunkZ, cParsedNBT & a_NBT, int a_LevelTag);
|
||||
@ -53,31 +53,27 @@ class cProcessor
|
||||
/** Waits until the thread starts processing the callback code. */
|
||||
void WaitForStart(void);
|
||||
} ;
|
||||
|
||||
|
||||
typedef std::vector<cThread *> cThreads;
|
||||
|
||||
|
||||
public:
|
||||
cProcessor(void);
|
||||
~cProcessor();
|
||||
|
||||
|
||||
void ProcessWorld(const AString & a_WorldFolder, cCallbackFactory & a_CallbackFactory);
|
||||
|
||||
|
||||
protected:
|
||||
bool m_IsShuttingDown; // If true, the threads should stop ASAP
|
||||
|
||||
|
||||
cCriticalSection m_CS;
|
||||
AStringList m_FileQueue;
|
||||
|
||||
|
||||
cThreads m_Threads;
|
||||
|
||||
|
||||
/** Populates m_FileQueue with Anvil files from the specified folder. */
|
||||
void PopulateFileQueue(const AString & a_WorldFolder);
|
||||
|
||||
|
||||
/** Returns one filename from m_FileQueue, and removes the name from the queue. */
|
||||
AString GetOneFileName(void);
|
||||
} ;
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -10,7 +10,7 @@
|
||||
|
||||
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
// cSpringStats::cStats
|
||||
|
||||
cSpringStats::cStats::cStats(void) :
|
||||
@ -41,7 +41,7 @@ void cSpringStats::cStats::Add(const cSpringStats::cStats & a_Other)
|
||||
|
||||
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
// cSpringStats:
|
||||
|
||||
cSpringStats::cSpringStats(void) :
|
||||
@ -99,7 +99,7 @@ bool cSpringStats::OnSectionsFinished(void)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
// Calc the spring stats:
|
||||
for (int y = 1; y < 255; y++)
|
||||
{
|
||||
@ -173,14 +173,14 @@ void cSpringStats::TestSpring(int a_RelX, int a_RelY, int a_RelZ, cSpringStats::
|
||||
}
|
||||
} // switch (BlockType)
|
||||
} // for i - Coords[]
|
||||
|
||||
|
||||
if (!HasFluidNextToIt)
|
||||
{
|
||||
// Surrounded by solids on all sides, this is probably not a spring,
|
||||
// but rather a bedrocked lake or something similar. Dont want.
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
// No source blocks next to the specified block, so it is a spring. Add it to stats:
|
||||
a_Stats[a_RelY][((unsigned char *)m_Biomes)[a_RelX + 16 * a_RelZ]] += 1;
|
||||
}
|
||||
@ -189,7 +189,7 @@ void cSpringStats::TestSpring(int a_RelX, int a_RelY, int a_RelZ, cSpringStats::
|
||||
|
||||
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
// cSpringStatsFactory:
|
||||
|
||||
cSpringStatsFactory::~cSpringStatsFactory()
|
||||
@ -273,7 +273,3 @@ void cSpringStatsFactory::SaveStatistics(const cSpringStats::cStats::SpringStats
|
||||
f.Write(Line.c_str(), Line.size());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -22,31 +22,32 @@ public:
|
||||
class cStats
|
||||
{
|
||||
public:
|
||||
/// Per-height, per-biome frequencies of springs
|
||||
/** Per-height, per-biome frequencies of springs */
|
||||
typedef UInt64 SpringStats[256][256];
|
||||
|
||||
|
||||
SpringStats m_LavaSprings;
|
||||
SpringStats m_WaterSprings;
|
||||
|
||||
UInt64 m_TotalChunks; ///< Total number of chunks that are fully processed through this callback(OnSectionsFinished())
|
||||
|
||||
|
||||
/** Total number of chunks that are fully processed through this callback(OnSectionsFinished()) */
|
||||
UInt64 m_TotalChunks;
|
||||
|
||||
cStats(void);
|
||||
void Add(const cStats & a_Other);
|
||||
} ;
|
||||
|
||||
|
||||
cSpringStats(void);
|
||||
|
||||
|
||||
const cStats & GetStats(void) const { return m_Stats; }
|
||||
|
||||
|
||||
protected:
|
||||
|
||||
BLOCKTYPE m_BlockTypes[16 * 16 * 256];
|
||||
NIBBLETYPE m_BlockMetas[16 * 16 * 256 / 2];
|
||||
char m_Biomes[16 * 16];
|
||||
bool m_AreBiomesValid;
|
||||
|
||||
|
||||
cStats m_Stats;
|
||||
|
||||
|
||||
// cCallback overrides:
|
||||
virtual bool OnNewChunk(int a_ChunkX, int a_ChunkZ) override;
|
||||
virtual bool OnHeader(int a_FileOffset, unsigned char a_NumSectors, int a_Timestamp) override { return false; }
|
||||
@ -67,7 +68,7 @@ protected:
|
||||
) override;
|
||||
virtual bool OnSectionsFinished(void) override;
|
||||
|
||||
/// Tests the specified block, if it appears to be a spring, it is added to a_Stats
|
||||
/** Tests the specified block, if it appears to be a spring, it is added to a_Stats */
|
||||
void TestSpring(int a_RelX, int a_RelY, int a_RelZ, cStats::SpringStats & a_Stats);
|
||||
} ;
|
||||
|
||||
@ -80,23 +81,19 @@ class cSpringStatsFactory :
|
||||
{
|
||||
public:
|
||||
virtual ~cSpringStatsFactory();
|
||||
|
||||
|
||||
virtual cCallback * CreateNewCallback(void) override
|
||||
{
|
||||
return new cSpringStats;
|
||||
}
|
||||
|
||||
cSpringStats::cStats m_CombinedStats;
|
||||
|
||||
|
||||
void JoinResults(void);
|
||||
|
||||
/// Saves total per-height data (summed through biomes) for both spring types to the file
|
||||
|
||||
/** Saves total per-height data (summed through biomes) for both spring types to the file */
|
||||
void SaveTotals(const AString & a_FileName);
|
||||
|
||||
/// Saves complete per-height, per-biome statistics for the springs to the file
|
||||
|
||||