diff --git a/CMakeLists.txt b/CMakeLists.txt index 0b05d91a..ac8822e2 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -17,6 +17,7 @@ option(LOVR_ENABLE_ENET "Bundle with lua-enet" ON) option(LOVR_ENABLE_JSON "Bundle with lua-cjson" ON) option(LOVR_USE_LUAJIT "Use LuaJIT instead of Lua" ON) +option(LOVR_USE_ASSIMP "Enable model loading with Assimp" ON) option(LOVR_USE_OPENVR "Enable the OpenVR backend for the headset module" ON) option(LOVR_USE_WEBVR "Enable the WebVR backend for the headset module" OFF) option(LOVR_USE_OCULUS "Enable the LibOVR backend for the headset module (be sure to also set LOVR_OCULUS_PATH to point to the Oculus SDK)" OFF) @@ -90,7 +91,7 @@ if(LOVR_ENABLE_FILESYSTEM) endif() # Assimp -if(LOVR_ENABLE_DATA) +if(LOVR_ENABLE_DATA AND LOVR_USE_ASSIMP) if(LOVR_SYSTEM_ASSIMP) pkg_search_module(ASSIMP REQUIRED assimp) include_directories(${ASSIMP_INCLUDE_DIRS}) @@ -365,6 +366,10 @@ if(LOVR_ENABLE_DATA) src/lib/stb/stb_truetype.c src/lib/stb/stb_vorbis.c ) + + if (LOVR_USE_ASSIMP) + add_definitions(-DLOVR_USE_ASSIMP) + endif() endif() if(LOVR_ENABLE_EVENT) diff --git a/src/data/modelData.c b/src/data/modelData.c index 8027468c..5ff77bc1 100644 --- a/src/data/modelData.c +++ b/src/data/modelData.c @@ -9,6 +9,8 @@ #include #include #include + +#ifdef LOVR_USE_ASSIMP #include #include #include @@ -93,6 +95,35 @@ static void assimpNodeTraversal(ModelData* modelData, struct aiNode* assimpNode, } } +static void aabbIterator(ModelData* modelData, ModelNode* node, float aabb[6]) { + for (int i = 0; i < node->primitives.length; i++) { + ModelPrimitive* primitive = &modelData->primitives[node->primitives.data[i]]; + for (int j = 0; j < primitive->drawCount; j++) { + uint32_t index; + if (modelData->indexSize == sizeof(uint16_t)) { + index = modelData->indices.shorts[primitive->drawStart + j]; + } else { + index = modelData->indices.ints[primitive->drawStart + j]; + } + float vertex[3]; + VertexPointer vertices = { .raw = modelData->vertexData->blob.data }; + vec3_init(vertex, (float*) (vertices.bytes + index * modelData->vertexData->format.stride)); + mat4_transform(node->globalTransform, &vertex[0], &vertex[1], &vertex[2]); + aabb[0] = MIN(aabb[0], vertex[0]); + aabb[1] = MAX(aabb[1], vertex[0]); + aabb[2] = MIN(aabb[2], vertex[1]); + aabb[3] = MAX(aabb[3], vertex[1]); + aabb[4] = MIN(aabb[4], vertex[2]); + aabb[5] = MAX(aabb[5], vertex[2]); + } + } + + for (int i = 0; i < node->children.length; i++) { + ModelNode* child = &modelData->nodes[node->children.data[i]]; + aabbIterator(modelData, child, aabb); + } +} + static float readMaterialScalar(struct aiMaterial* assimpMaterial, const char* key, unsigned int type, unsigned int index) { float scalar; if (aiGetMaterialFloatArray(assimpMaterial, key, type, index, &scalar, NULL) == aiReturn_SUCCESS) { @@ -517,6 +548,12 @@ ModelData* lovrModelDataCreate(Blob* blob) { aiReleaseImport(scene); return modelData; } +#else +static void aabbIterator(ModelData* modelData, ModelNode* node, float aabb[6]) {} +ModelData* lovrModelDataCreate(Blob* blob) { + return NULL; +} +#endif ModelData* lovrModelDataCreateEmpty() { return lovrAlloc(ModelData, lovrModelDataDestroy); @@ -570,35 +607,6 @@ void lovrModelDataDestroy(void* ref) { free(modelData); } -static void aabbIterator(ModelData* modelData, ModelNode* node, float aabb[6]) { - for (int i = 0; i < node->primitives.length; i++) { - ModelPrimitive* primitive = &modelData->primitives[node->primitives.data[i]]; - for (int j = 0; j < primitive->drawCount; j++) { - uint32_t index; - if (modelData->indexSize == sizeof(uint16_t)) { - index = modelData->indices.shorts[primitive->drawStart + j]; - } else { - index = modelData->indices.ints[primitive->drawStart + j]; - } - float vertex[3]; - VertexPointer vertices = { .raw = modelData->vertexData->blob.data }; - vec3_init(vertex, (float*) (vertices.bytes + index * modelData->vertexData->format.stride)); - mat4_transform(node->globalTransform, &vertex[0], &vertex[1], &vertex[2]); - aabb[0] = MIN(aabb[0], vertex[0]); - aabb[1] = MAX(aabb[1], vertex[0]); - aabb[2] = MIN(aabb[2], vertex[1]); - aabb[3] = MAX(aabb[3], vertex[1]); - aabb[4] = MIN(aabb[4], vertex[2]); - aabb[5] = MAX(aabb[5], vertex[2]); - } - } - - for (int i = 0; i < node->children.length; i++) { - ModelNode* child = &modelData->nodes[node->children.data[i]]; - aabbIterator(modelData, child, aabb); - } -} - void lovrModelDataGetAABB(ModelData* modelData, float aabb[6]) { aabb[0] = FLT_MAX; aabb[1] = -FLT_MAX;