summaryrefslogtreecommitdiffhomepage
path: root/src/models.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/models.c')
-rw-r--r--src/models.c110
1 files changed, 110 insertions, 0 deletions
diff --git a/src/models.c b/src/models.c
index b233cf2a..168ac2c3 100644
--- a/src/models.c
+++ b/src/models.c
@@ -8,6 +8,8 @@
* #define SUPPORT_FILEFORMAT_MTL
* #define SUPPORT_FILEFORMAT_IQM
* #define SUPPORT_FILEFORMAT_GLTF
+* #define SUPPORT_FILEFORMAT_VOX
+*
* Selected desired fileformats to be supported for model data loading.
*
* #define SUPPORT_MESH_GENERATION
@@ -71,6 +73,11 @@
#include "external/stb_image.h" // glTF texture images loading
#endif
+#if defined(SUPPORT_FILEFORMAT_VOX)
+ #define VOX_LOADER_IMPLEMENTATION
+ #include "external/vox_loader.h" // vox file format loading
+#endif
+
#if defined(SUPPORT_MESH_GENERATION)
#define PAR_MALLOC(T, N) ((T*)RL_MALLOC(N*sizeof(T)))
#define PAR_CALLOC(T, N) ((T*)RL_CALLOC(N*sizeof(T), 1))
@@ -131,6 +138,9 @@ static void GetGLTFPrimitiveCount(cgltf_node *node, int *outCount);
static bool ReadGLTFValue(cgltf_accessor *acc, unsigned int index, void *variable);
static void *ReadGLTFValuesAs(cgltf_accessor *acc, cgltf_component_type type, bool adjustOnDownCasting);
#endif
+#if defined(SUPPORT_FILEFORMAT_VOX)
+static Model LoadVOX(const char* filename); //Load VOX mesh data
+#endif
//----------------------------------------------------------------------------------
// Module Functions Definition
@@ -718,6 +728,9 @@ Model LoadModel(const char *fileName)
#if defined(SUPPORT_FILEFORMAT_GLTF)
if (IsFileExtension(fileName, ".gltf;.glb")) model = LoadGLTF(fileName);
#endif
+#if defined(SUPPORT_FILEFORMAT_VOX)
+ if (IsFileExtension(fileName, ".vox")) model = LoadVOX(fileName);
+#endif
// Make sure model transform is set to identity matrix!
model.transform = MatrixIdentity();
@@ -5469,3 +5482,100 @@ static void GetGLTFPrimitiveCount(cgltf_node *node, int *outCount)
}
#endif
+
+#if defined(SUPPORT_FILEFORMAT_VOX)
+// Load OBJ mesh data
+static Model LoadVOX(const char* fileName)
+{
+ Model model = { 0 };
+ int nbvertices = 0;
+ int meshescount = 0;
+
+ //////////////////////////////////
+ // Load MagicaVoxel fileformat
+
+ VoxArray3D voxarray;
+ int ret = Vox_LoadFileName(fileName, &voxarray);
+
+ if (ret != VOX_SUCCESS)
+ {
+ TRACELOG(LOG_WARNING, "MODEL: [%s] Failed to load VOX data", fileName);
+ return model;
+ }
+ else
+ {
+ // Compute meshes count
+ nbvertices = voxarray.vertices.used;
+ meshescount = 1 + (nbvertices / 65536);
+
+ TRACELOG(LOG_INFO, "MODEL: [%s] VOX data loaded successfully : %i vertices/%i meshes", fileName, nbvertices, meshescount);
+ }
+
+ //////////////////////////////////
+ // Build model
+
+ // Build Models from meshes
+ model.transform = MatrixIdentity();
+
+ model.meshCount = meshescount;
+ model.meshes = (Mesh*)MemAlloc(model.meshCount * sizeof(Mesh));
+
+ model.meshMaterial = (int*)MemAlloc(model.meshCount * sizeof(int));
+
+ model.materialCount = 1;
+ model.materials = (Material*)MemAlloc(model.materialCount * sizeof(Material));
+ model.materials[0] = LoadMaterialDefault();
+
+
+ // Init model's meshes
+ int verticesRemain = voxarray.vertices.used;
+ int verticesMax = 65532; //5461 voxels x 12 vertices per voxel -> 65532 (must be inf 65536)
+
+ Vector3* pvertices = voxarray.vertices.array; //6*4=12 vertices per voxel
+ Color* pcolors = voxarray.colors.array;
+ unsigned short* pindices = voxarray.indices.array; //5461 * 6 * 6 -> 196596 indices max per mesh
+
+ int size;
+
+ for (int idxMesh = 0; idxMesh < meshescount; idxMesh++)
+ {
+ Mesh* pmesh = &model.meshes[idxMesh];
+ memset(pmesh, 0, sizeof(Mesh));
+
+ // Copy Vertices
+ pmesh->vertexCount = (int)fmin(verticesMax, verticesRemain);
+
+ size = pmesh->vertexCount * sizeof(float) * 3;
+ pmesh->vertices = MemAlloc(size);
+ memcpy(pmesh->vertices, pvertices, size);
+
+ //Copy Indices TODO compute globals indices array
+ size = voxarray.indices.used * sizeof(unsigned short);
+ pmesh->indices = MemAlloc(size);
+ memcpy(pmesh->indices, pindices, size);
+
+ pmesh->triangleCount = (pmesh->vertexCount / 4) * 2;
+
+ // Copy Colors
+ size = pmesh->vertexCount * sizeof(Color);
+ pmesh->colors = MemAlloc(size);
+ memcpy(pmesh->colors, pcolors, size);
+
+ // First material index
+ model.meshMaterial[idxMesh] = 0;
+
+ // Build GPU mesh
+ UploadMesh(pmesh, false);
+
+ //Next
+ verticesRemain -= verticesMax;
+ pvertices += verticesMax;
+ pcolors += verticesMax;
+ }
+
+ //Free arrays
+ Vox_FreeArrays(&voxarray);
+
+ return model;
+}
+#endif \ No newline at end of file