|
@@ -41,116 +41,116 @@ revision history:
|
|
|
1.01 (2021-09-07) Support custom memory allocators
|
|
|
Removed Raylib dependencies
|
|
|
Changed Vox_LoadFileName to Vox_LoadFromMemory
|
|
|
+ 1.02 (2021-09-10) @raysan5: Reviewed some formating
|
|
|
|
|
|
*/
|
|
|
|
|
|
-
|
|
|
#ifndef VOX_LOADER_H
|
|
|
#define VOX_LOADER_H
|
|
|
|
|
|
-
|
|
|
#include <string.h>
|
|
|
+#include <stdlib.h>
|
|
|
|
|
|
-
|
|
|
-#ifdef __cplusplus
|
|
|
-extern "C" {
|
|
|
+// Allow custom memory allocators
|
|
|
+#ifndef VOX_MALLOC
|
|
|
+ #define VOX_MALLOC RL_MALLOC
|
|
|
+#endif
|
|
|
+#ifndef VOX_CALLOC
|
|
|
+ #define VOX_CALLOC RL_CALLOC
|
|
|
+#endif
|
|
|
+#ifndef VOX_REALLOC
|
|
|
+ #define VOX_REALLOC RL_REALLOC
|
|
|
+#endif
|
|
|
+#ifndef VOX_FREE
|
|
|
+ #define VOX_FREE RL_FREE
|
|
|
#endif
|
|
|
|
|
|
- #define VOX_SUCCESS (0)
|
|
|
- #define VOX_ERROR_FILE_NOT_FOUND (-1)
|
|
|
- #define VOX_ERROR_INVALID_FORMAT (-2)
|
|
|
- #define VOX_ERROR_FILE_VERSION_TOO_OLD (-3)
|
|
|
-
|
|
|
- // VoxColor, 4 components, R8G8B8A8 (32bit)
|
|
|
- typedef struct {
|
|
|
- unsigned char r, g, b, a;
|
|
|
- } VoxColor;
|
|
|
-
|
|
|
- // VoxVector3, 3 components
|
|
|
- typedef struct {
|
|
|
- float x, y, z;
|
|
|
- } VoxVector3;
|
|
|
-
|
|
|
-
|
|
|
- typedef struct
|
|
|
- {
|
|
|
- int* array;
|
|
|
- int used, size;
|
|
|
- } ArrayInt;
|
|
|
-
|
|
|
- typedef struct
|
|
|
- {
|
|
|
- VoxVector3* array;
|
|
|
- int used, size;
|
|
|
- } ArrayVector3;
|
|
|
-
|
|
|
- typedef struct
|
|
|
- {
|
|
|
- VoxColor* array;
|
|
|
- int used, size;
|
|
|
- } ArrayColor;
|
|
|
-
|
|
|
- typedef struct
|
|
|
- {
|
|
|
- unsigned short* array;
|
|
|
- int used, size;
|
|
|
- } ArrayUShort;
|
|
|
-
|
|
|
-
|
|
|
- // A chunk that contain voxels
|
|
|
- typedef struct
|
|
|
- {
|
|
|
- unsigned char* m_array; //If Sparse != null
|
|
|
- int arraySize; //Size for m_array in bytes (DEBUG ONLY)
|
|
|
- } CubeChunk3D;
|
|
|
-
|
|
|
- // Array for voxels
|
|
|
- // Array is divised into chunks of CHUNKSIZE*CHUNKSIZE*CHUNKSIZE voxels size
|
|
|
- typedef struct
|
|
|
- {
|
|
|
- //Array size in voxels
|
|
|
- int sizeX;
|
|
|
- int sizeY;
|
|
|
- int sizeZ;
|
|
|
-
|
|
|
- //Chunks size into array (array is divised into chunks)
|
|
|
- int chunksSizeX;
|
|
|
- int chunksSizeY;
|
|
|
- int chunksSizeZ;
|
|
|
-
|
|
|
- //Chunks array
|
|
|
- CubeChunk3D* m_arrayChunks;
|
|
|
- int arrayChunksSize; //Size for m_arrayChunks in bytes (DEBUG ONLY)
|
|
|
-
|
|
|
- int ChunkFlattenOffset;
|
|
|
- int chunksAllocated;
|
|
|
- int chunksTotal;
|
|
|
-
|
|
|
- //Arrays for mesh build
|
|
|
- ArrayVector3 vertices;
|
|
|
- ArrayUShort indices;
|
|
|
- ArrayColor colors;
|
|
|
-
|
|
|
- //Palette for voxels
|
|
|
- VoxColor palette[256];
|
|
|
-
|
|
|
- } VoxArray3D;
|
|
|
-
|
|
|
-
|
|
|
- // Functions
|
|
|
- extern int Vox_LoadFromMemory(const unsigned char* pvoxData, unsigned int voxDataSize, VoxArray3D* pvoxarray);
|
|
|
- extern void Vox_FreeArrays(VoxArray3D* voxarray);
|
|
|
+#define VOX_SUCCESS (0)
|
|
|
+#define VOX_ERROR_FILE_NOT_FOUND (-1)
|
|
|
+#define VOX_ERROR_INVALID_FORMAT (-2)
|
|
|
+#define VOX_ERROR_FILE_VERSION_TOO_OLD (-3)
|
|
|
+
|
|
|
+// VoxColor, 4 components, R8G8B8A8 (32bit)
|
|
|
+typedef struct {
|
|
|
+ unsigned char r, g, b, a;
|
|
|
+} VoxColor;
|
|
|
+
|
|
|
+// VoxVector3, 3 components
|
|
|
+typedef struct {
|
|
|
+ float x, y, z;
|
|
|
+} VoxVector3;
|
|
|
+
|
|
|
+typedef struct {
|
|
|
+ int* array;
|
|
|
+ int used, size;
|
|
|
+} ArrayInt;
|
|
|
+
|
|
|
+typedef struct {
|
|
|
+ VoxVector3* array;
|
|
|
+ int used, size;
|
|
|
+} ArrayVector3;
|
|
|
+
|
|
|
+typedef struct {
|
|
|
+ VoxColor* array;
|
|
|
+ int used, size;
|
|
|
+} ArrayColor;
|
|
|
+
|
|
|
+typedef struct {
|
|
|
+ unsigned short* array;
|
|
|
+ int used, size;
|
|
|
+} ArrayUShort;
|
|
|
+
|
|
|
+// A chunk that contain voxels
|
|
|
+typedef struct {
|
|
|
+ unsigned char* m_array; //If Sparse != null
|
|
|
+ int arraySize; //Size for m_array in bytes (DEBUG ONLY)
|
|
|
+} CubeChunk3D;
|
|
|
+
|
|
|
+// Array for voxels
|
|
|
+// Array is divised into chunks of CHUNKSIZE*CHUNKSIZE*CHUNKSIZE voxels size
|
|
|
+typedef struct {
|
|
|
+ // Array size in voxels
|
|
|
+ int sizeX;
|
|
|
+ int sizeY;
|
|
|
+ int sizeZ;
|
|
|
+
|
|
|
+ // Chunks size into array (array is divised into chunks)
|
|
|
+ int chunksSizeX;
|
|
|
+ int chunksSizeY;
|
|
|
+ int chunksSizeZ;
|
|
|
+
|
|
|
+ // Chunks array
|
|
|
+ CubeChunk3D* m_arrayChunks;
|
|
|
+ int arrayChunksSize; // Size for m_arrayChunks in bytes (DEBUG ONLY)
|
|
|
+
|
|
|
+ int ChunkFlattenOffset;
|
|
|
+ int chunksAllocated;
|
|
|
+ int chunksTotal;
|
|
|
+
|
|
|
+ // Arrays for mesh build
|
|
|
+ ArrayVector3 vertices;
|
|
|
+ ArrayUShort indices;
|
|
|
+ ArrayColor colors;
|
|
|
+
|
|
|
+ //Palette for voxels
|
|
|
+ VoxColor palette[256];
|
|
|
+
|
|
|
+} VoxArray3D;
|
|
|
+
|
|
|
+#if defined(__cplusplus)
|
|
|
+extern "C" { // Prevents name mangling of functions
|
|
|
+#endif
|
|
|
|
|
|
+// Functions
|
|
|
+int Vox_LoadFromMemory(const unsigned char* pvoxData, unsigned int voxDataSize, VoxArray3D* pvoxarray);
|
|
|
+void Vox_FreeArrays(VoxArray3D* voxarray);
|
|
|
|
|
|
#ifdef __cplusplus
|
|
|
}
|
|
|
#endif
|
|
|
|
|
|
-
|
|
|
-
|
|
|
-//// end header file /////////////////////////////////////////////////////
|
|
|
#endif // VOX_LOADER_H
|
|
|
-
|
|
|
+//// end header file /////////////////////////////////////////////////////
|
|
|
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////////////////////
|
|
@@ -161,30 +161,29 @@ extern "C" {
|
|
|
|
|
|
#ifdef VOX_LOADER_IMPLEMENTATION
|
|
|
|
|
|
-
|
|
|
-
|
|
|
/////////////////////////////////////////////////////////////////////////////////////////////
|
|
|
// ArrayInt helper
|
|
|
/////////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
-void initArrayInt(ArrayInt* a, int initialSize)
|
|
|
+static void initArrayInt(ArrayInt* a, int initialSize)
|
|
|
{
|
|
|
a->array = VOX_MALLOC(initialSize * sizeof(int));
|
|
|
a->used = 0;
|
|
|
a->size = initialSize;
|
|
|
}
|
|
|
|
|
|
-void insertArrayInt(ArrayInt* a, int element)
|
|
|
+static void insertArrayInt(ArrayInt* a, int element)
|
|
|
{
|
|
|
if (a->used == a->size)
|
|
|
{
|
|
|
a->size *= 2;
|
|
|
a->array = VOX_REALLOC(a->array, a->size * sizeof(int));
|
|
|
}
|
|
|
+
|
|
|
a->array[a->used++] = element;
|
|
|
}
|
|
|
|
|
|
-void freeArrayInt(ArrayInt* a)
|
|
|
+static void freeArrayInt(ArrayInt* a)
|
|
|
{
|
|
|
VOX_FREE(a->array);
|
|
|
a->array = NULL;
|
|
@@ -195,14 +194,14 @@ void freeArrayInt(ArrayInt* a)
|
|
|
// ArrayUShort helper
|
|
|
/////////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
-void initArrayUShort(ArrayUShort* a, int initialSize)
|
|
|
+static void initArrayUShort(ArrayUShort* a, int initialSize)
|
|
|
{
|
|
|
a->array = VOX_MALLOC(initialSize * sizeof(unsigned short));
|
|
|
a->used = 0;
|
|
|
a->size = initialSize;
|
|
|
}
|
|
|
|
|
|
-void insertArrayUShort(ArrayUShort* a, unsigned short element)
|
|
|
+static void insertArrayUShort(ArrayUShort* a, unsigned short element)
|
|
|
{
|
|
|
if (a->used == a->size)
|
|
|
{
|
|
@@ -212,7 +211,7 @@ void insertArrayUShort(ArrayUShort* a, unsigned short element)
|
|
|
a->array[a->used++] = element;
|
|
|
}
|
|
|
|
|
|
-void freeArrayUShort(ArrayUShort* a)
|
|
|
+static void freeArrayUShort(ArrayUShort* a)
|
|
|
{
|
|
|
VOX_FREE(a->array);
|
|
|
a->array = NULL;
|
|
@@ -224,14 +223,14 @@ void freeArrayUShort(ArrayUShort* a)
|
|
|
// ArrayVector3 helper
|
|
|
/////////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
-void initArrayVector3(ArrayVector3* a, int initialSize)
|
|
|
+static void initArrayVector3(ArrayVector3* a, int initialSize)
|
|
|
{
|
|
|
a->array = VOX_MALLOC(initialSize * sizeof(VoxVector3));
|
|
|
a->used = 0;
|
|
|
a->size = initialSize;
|
|
|
}
|
|
|
|
|
|
-void insertArrayVector3(ArrayVector3* a, VoxVector3 element)
|
|
|
+static void insertArrayVector3(ArrayVector3* a, VoxVector3 element)
|
|
|
{
|
|
|
if (a->used == a->size)
|
|
|
{
|
|
@@ -241,7 +240,7 @@ void insertArrayVector3(ArrayVector3* a, VoxVector3 element)
|
|
|
a->array[a->used++] = element;
|
|
|
}
|
|
|
|
|
|
-void freeArrayVector3(ArrayVector3* a)
|
|
|
+static void freeArrayVector3(ArrayVector3* a)
|
|
|
{
|
|
|
VOX_FREE(a->array);
|
|
|
a->array = NULL;
|
|
@@ -252,14 +251,14 @@ void freeArrayVector3(ArrayVector3* a)
|
|
|
// ArrayColor helper
|
|
|
/////////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
-void initArrayColor(ArrayColor* a, int initialSize)
|
|
|
+static void initArrayColor(ArrayColor* a, int initialSize)
|
|
|
{
|
|
|
a->array = VOX_MALLOC(initialSize * sizeof(VoxColor));
|
|
|
a->used = 0;
|
|
|
a->size = initialSize;
|
|
|
}
|
|
|
|
|
|
-void insertArrayColor(ArrayColor* a, VoxColor element)
|
|
|
+static void insertArrayColor(ArrayColor* a, VoxColor element)
|
|
|
{
|
|
|
if (a->used == a->size)
|
|
|
{
|
|
@@ -269,7 +268,7 @@ void insertArrayColor(ArrayColor* a, VoxColor element)
|
|
|
a->array[a->used++] = element;
|
|
|
}
|
|
|
|
|
|
-void freeArrayColor(ArrayColor* a)
|
|
|
+static void freeArrayColor(ArrayColor* a)
|
|
|
{
|
|
|
VOX_FREE(a->array);
|
|
|
a->array = NULL;
|
|
@@ -281,9 +280,9 @@ void freeArrayColor(ArrayColor* a)
|
|
|
// Vox Loader
|
|
|
/////////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
-#define CHUNKSIZE 16 // chunk size (CHUNKSIZE*CHUNKSIZE*CHUNKSIZE) in voxels
|
|
|
-#define CHUNKSIZE_OPSHIFT 4 // 1<<4=16 -> Warning depend of CHUNKSIZE
|
|
|
-#define CHUNK_FLATTENOFFSET_OPSHIFT 8 //Warning depend of CHUNKSIZE
|
|
|
+#define CHUNKSIZE 16 // chunk size (CHUNKSIZE*CHUNKSIZE*CHUNKSIZE) in voxels
|
|
|
+#define CHUNKSIZE_OPSHIFT 4 // 1<<4=16 -> Warning depend of CHUNKSIZE
|
|
|
+#define CHUNK_FLATTENOFFSET_OPSHIFT 8 // Warning depend of CHUNKSIZE
|
|
|
|
|
|
//
|
|
|
// used right handed system and CCW face
|
|
@@ -311,8 +310,8 @@ const int fv[6][4] = {
|
|
|
{0, 4, 5, 1 }, //-y
|
|
|
{6, 2, 3, 7 }, //+y
|
|
|
{1, 3, 2, 0 }, //-Z
|
|
|
- {4, 6, 7, 5 } };//+Z
|
|
|
-
|
|
|
+ {4, 6, 7, 5 } //+Z
|
|
|
+};
|
|
|
|
|
|
const VoxVector3 SolidVertex[] = {
|
|
|
{0, 0, 0}, //0
|
|
@@ -322,14 +321,11 @@ const VoxVector3 SolidVertex[] = {
|
|
|
{0, 0, 1}, //4
|
|
|
{1, 0, 1}, //5
|
|
|
{0, 1, 1}, //6
|
|
|
- {1, 1, 1} }; //7
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
+ {1, 1, 1} //7
|
|
|
+ };
|
|
|
|
|
|
// Allocated VoxArray3D size
|
|
|
-void Vox_AllocArray(VoxArray3D* pvoxarray, int _sx, int _sy, int _sz)
|
|
|
+static void Vox_AllocArray(VoxArray3D* pvoxarray, int _sx, int _sy, int _sz)
|
|
|
{
|
|
|
int sx = _sx + ((CHUNKSIZE - (_sx % CHUNKSIZE)) % CHUNKSIZE);
|
|
|
int sy = _sy + ((CHUNKSIZE - (_sy % CHUNKSIZE)) % CHUNKSIZE);
|
|
@@ -350,13 +346,12 @@ void Vox_AllocArray(VoxArray3D* pvoxarray, int _sx, int _sy, int _sz)
|
|
|
|
|
|
pvoxarray->ChunkFlattenOffset = (chy * chz); //m_arrayChunks[(x * (sy*sz)) + (z * sy) + y]
|
|
|
|
|
|
- //Alloc chunks array
|
|
|
+ // Alloc chunks array
|
|
|
int size = sizeof(CubeChunk3D) * chx * chy * chz;
|
|
|
pvoxarray->m_arrayChunks = VOX_MALLOC(size);
|
|
|
pvoxarray->arrayChunksSize = size;
|
|
|
|
|
|
-
|
|
|
- //Init chunks array
|
|
|
+ // Init chunks array
|
|
|
size = chx * chy * chz;
|
|
|
pvoxarray->chunksTotal = size;
|
|
|
pvoxarray->chunksAllocated = 0;
|
|
@@ -369,9 +364,9 @@ void Vox_AllocArray(VoxArray3D* pvoxarray, int _sx, int _sy, int _sz)
|
|
|
}
|
|
|
|
|
|
// Set voxel ID from its position into VoxArray3D
|
|
|
-void Vox_SetVoxel(VoxArray3D* pvoxarray, int x, int y, int z, unsigned char id)
|
|
|
+static void Vox_SetVoxel(VoxArray3D* pvoxarray, int x, int y, int z, unsigned char id)
|
|
|
{
|
|
|
- //Get chunk from array pos
|
|
|
+ // Get chunk from array pos
|
|
|
int chX = x >> CHUNKSIZE_OPSHIFT; //x / CHUNKSIZE;
|
|
|
int chY = y >> CHUNKSIZE_OPSHIFT; //y / CHUNKSIZE;
|
|
|
int chZ = z >> CHUNKSIZE_OPSHIFT; //z / CHUNKSIZE;
|
|
@@ -384,7 +379,7 @@ void Vox_SetVoxel(VoxArray3D* pvoxarray, int x, int y, int z, unsigned char id)
|
|
|
|
|
|
CubeChunk3D* chunk = &pvoxarray->m_arrayChunks[offset];
|
|
|
|
|
|
- //Set Chunk
|
|
|
+ // Set Chunk
|
|
|
chX = x - (chX << CHUNKSIZE_OPSHIFT); //x - (bx * CHUNKSIZE);
|
|
|
chY = y - (chY << CHUNKSIZE_OPSHIFT); //y - (by * CHUNKSIZE);
|
|
|
chZ = z - (chZ << CHUNKSIZE_OPSHIFT); //z - (bz * CHUNKSIZE);
|
|
@@ -407,20 +402,16 @@ void Vox_SetVoxel(VoxArray3D* pvoxarray, int x, int y, int z, unsigned char id)
|
|
|
//}
|
|
|
|
|
|
chunk->m_array[offset] = id;
|
|
|
-
|
|
|
}
|
|
|
|
|
|
// Get voxel ID from its position into VoxArray3D
|
|
|
-unsigned char Vox_GetVoxel(VoxArray3D* pvoxarray, int x, int y, int z)
|
|
|
+static unsigned char Vox_GetVoxel(VoxArray3D* pvoxarray, int x, int y, int z)
|
|
|
{
|
|
|
- if (x < 0 || y < 0 || z < 0)
|
|
|
- return 0;
|
|
|
+ if (x < 0 || y < 0 || z < 0) return 0;
|
|
|
|
|
|
- if (x >= pvoxarray->sizeX || y >= pvoxarray->sizeY || z >= pvoxarray->sizeZ)
|
|
|
- return 0;
|
|
|
+ if (x >= pvoxarray->sizeX || y >= pvoxarray->sizeY || z >= pvoxarray->sizeZ) return 0;
|
|
|
|
|
|
-
|
|
|
- //Get chunk from array pos
|
|
|
+ // Get chunk from array pos
|
|
|
int chX = x >> CHUNKSIZE_OPSHIFT; //x / CHUNKSIZE;
|
|
|
int chY = y >> CHUNKSIZE_OPSHIFT; //y / CHUNKSIZE;
|
|
|
int chZ = z >> CHUNKSIZE_OPSHIFT; //z / CHUNKSIZE;
|
|
@@ -433,7 +424,7 @@ unsigned char Vox_GetVoxel(VoxArray3D* pvoxarray, int x, int y, int z)
|
|
|
|
|
|
CubeChunk3D* chunk = &pvoxarray->m_arrayChunks[offset];
|
|
|
|
|
|
- //Set Chunk
|
|
|
+ // Set Chunk
|
|
|
chX = x - (chX << CHUNKSIZE_OPSHIFT); //x - (bx * CHUNKSIZE);
|
|
|
chY = y - (chY << CHUNKSIZE_OPSHIFT); //y - (by * CHUNKSIZE);
|
|
|
chZ = z - (chZ << CHUNKSIZE_OPSHIFT); //z - (bz * CHUNKSIZE);
|
|
@@ -454,7 +445,7 @@ unsigned char Vox_GetVoxel(VoxArray3D* pvoxarray, int x, int y, int z)
|
|
|
}
|
|
|
|
|
|
// Calc visibles faces from a voxel position
|
|
|
-unsigned char Vox_CalcFacesVisible(VoxArray3D* pvoxArray, int cx, int cy, int cz)
|
|
|
+static unsigned char Vox_CalcFacesVisible(VoxArray3D* pvoxArray, int cx, int cy, int cz)
|
|
|
{
|
|
|
unsigned char idXm1 = Vox_GetVoxel(pvoxArray, cx - 1, cy, cz);
|
|
|
unsigned char idXp1 = Vox_GetVoxel(pvoxArray, cx + 1, cy, cz);
|
|
@@ -468,51 +459,45 @@ unsigned char Vox_CalcFacesVisible(VoxArray3D* pvoxArray, int cx, int cy, int cz
|
|
|
unsigned char byVFMask = 0;
|
|
|
|
|
|
//#-x
|
|
|
- if (idXm1 == 0)
|
|
|
- byVFMask |= (1 << 0);
|
|
|
+ if (idXm1 == 0) byVFMask |= (1 << 0);
|
|
|
|
|
|
//#+x
|
|
|
- if (idXp1 == 0)
|
|
|
- byVFMask |= (1 << 1);
|
|
|
+ if (idXp1 == 0) byVFMask |= (1 << 1);
|
|
|
|
|
|
//#-y
|
|
|
- if (idYm1 == 0)
|
|
|
- byVFMask |= (1 << 2);
|
|
|
+ if (idYm1 == 0) byVFMask |= (1 << 2);
|
|
|
|
|
|
//#+y
|
|
|
- if (idYp1 == 0)
|
|
|
- byVFMask |= (1 << 3);
|
|
|
+ if (idYp1 == 0) byVFMask |= (1 << 3);
|
|
|
|
|
|
//#-z
|
|
|
- if (idZm1 == 0)
|
|
|
- byVFMask |= (1 << 4);
|
|
|
+ if (idZm1 == 0) byVFMask |= (1 << 4);
|
|
|
|
|
|
//#+z
|
|
|
- if (idZp1 == 0)
|
|
|
- byVFMask |= (1 << 5);
|
|
|
+ if (idZp1 == 0) byVFMask |= (1 << 5);
|
|
|
|
|
|
return byVFMask;
|
|
|
}
|
|
|
|
|
|
// Get a vertex position from a voxel's corner
|
|
|
-VoxVector3 Vox_GetVertexPosition(int _wcx, int _wcy, int _wcz, int _nNumVertex)
|
|
|
+static VoxVector3 Vox_GetVertexPosition(int _wcx, int _wcy, int _wcz, int _nNumVertex)
|
|
|
{
|
|
|
float scale = 0.25;
|
|
|
+
|
|
|
VoxVector3 vtx = SolidVertex[_nNumVertex];
|
|
|
vtx.x = (vtx.x + _wcx) * scale;
|
|
|
vtx.y = (vtx.y + _wcy) * scale;
|
|
|
vtx.z = (vtx.z + _wcz) * scale;
|
|
|
+
|
|
|
return vtx;
|
|
|
}
|
|
|
|
|
|
// Build a voxel vertices/colors/indices
|
|
|
-void Vox_Build_Voxel(VoxArray3D* pvoxArray, int x, int y, int z, int matID)
|
|
|
+static void Vox_Build_Voxel(VoxArray3D* pvoxArray, int x, int y, int z, int matID)
|
|
|
{
|
|
|
-
|
|
|
unsigned char byVFMask = Vox_CalcFacesVisible(pvoxArray, x, y, z);
|
|
|
|
|
|
- if (byVFMask == 0)
|
|
|
- return;
|
|
|
+ if (byVFMask == 0) return;
|
|
|
|
|
|
int i, j;
|
|
|
VoxVector3 vertComputed[8];
|
|
@@ -520,7 +505,6 @@ void Vox_Build_Voxel(VoxArray3D* pvoxArray, int x, int y, int z, int matID)
|
|
|
memset(vertComputed, 0, sizeof(vertComputed));
|
|
|
memset(bVertexComputed, 0, sizeof(bVertexComputed));
|
|
|
|
|
|
-
|
|
|
//For each Cube's faces
|
|
|
for (i = 0; i < 6; i++) // 6 faces
|
|
|
{
|
|
@@ -572,17 +556,12 @@ void Vox_Build_Voxel(VoxArray3D* pvoxArray, int x, int y, int z, int matID)
|
|
|
insertArrayUShort(&pvoxArray->indices, idx + 0);
|
|
|
insertArrayUShort(&pvoxArray->indices, idx + 3);
|
|
|
insertArrayUShort(&pvoxArray->indices, idx + 2);
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
}
|
|
|
-
|
|
|
}
|
|
|
|
|
|
// MagicaVoxel *.vox file format Loader
|
|
|
int Vox_LoadFromMemory(const unsigned char* pvoxData, unsigned int voxDataSize, VoxArray3D* pvoxarray)
|
|
|
{
|
|
|
-
|
|
|
//////////////////////////////////////////////////
|
|
|
//Read VOX file
|
|
|
//4 bytes: magic number ('V' 'O' 'X' 'space' )
|
|
@@ -702,18 +681,10 @@ int Vox_LoadFromMemory(const unsigned char* pvoxData, unsigned int voxDataSize,
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-
|
|
|
- //TraceLog(LOG_INFO, TextFormat("Vox Size : %dx%dx%d", sizeX, sizeY, sizeZ));
|
|
|
-
|
|
|
- //TraceLog(LOG_INFO, TextFormat("Vox Chunks Count : %d/%d", pvoxArray->chunksAllocated, pvoxArray->chunksTotal));
|
|
|
-
|
|
|
-
|
|
|
//////////////////////////////////////////////////////////
|
|
|
// Building Mesh
|
|
|
// TODO compute globals indices array
|
|
|
|
|
|
- //TraceLog(LOG_INFO, TextFormat("Building VOX Mesh : %s", pszfileName));
|
|
|
-
|
|
|
// Init Arrays
|
|
|
initArrayVector3(&pvoxarray->vertices, 3 * 1024);
|
|
|
initArrayUShort(&pvoxarray->indices, 3 * 1024);
|
|
@@ -735,14 +706,12 @@ int Vox_LoadFromMemory(const unsigned char* pvoxData, unsigned int voxDataSize,
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-
|
|
|
-
|
|
|
return VOX_SUCCESS;
|
|
|
}
|
|
|
|
|
|
void Vox_FreeArrays(VoxArray3D* voxarray)
|
|
|
{
|
|
|
- //Free chunks
|
|
|
+ // Free chunks
|
|
|
if (voxarray->m_arrayChunks != 0)
|
|
|
{
|
|
|
for (int i = 0; i < voxarray->chunksTotal; i++)
|
|
@@ -766,7 +735,7 @@ void Vox_FreeArrays(VoxArray3D* voxarray)
|
|
|
voxarray->sizeX = voxarray->sizeY = voxarray->sizeZ = 0;
|
|
|
}
|
|
|
|
|
|
- //Free arrays
|
|
|
+ // Free arrays
|
|
|
freeArrayVector3(&voxarray->vertices);
|
|
|
freeArrayUShort(&voxarray->indices);
|
|
|
freeArrayColor(&voxarray->colors);
|