diff options
| author | Jonathan Bradley <jcb@pikum.xyz> | 2023-12-27 22:04:12 -0500 |
|---|---|---|
| committer | Jonathan Bradley <jcb@pikum.xyz> | 2023-12-27 22:04:12 -0500 |
| commit | 3187a32f7f0253ded7a41c4c21612253e525a8fe (patch) | |
| tree | 76d3f6de872927dcd579feccc3c9d874b95e83df /src/entities.cpp | |
| parent | c9db77a8f789858b9e1ceb60edb5c463b30451ed (diff) | |
assets are global and stored in the project file
Diffstat (limited to 'src/entities.cpp')
| -rw-r--r-- | src/entities.cpp | 53 |
1 files changed, 27 insertions, 26 deletions
diff --git a/src/entities.cpp b/src/entities.cpp index 24cdd29..8d4fdb7 100644 --- a/src/entities.cpp +++ b/src/entities.cpp @@ -7,6 +7,7 @@ #include <BulletCollision/CollisionShapes/btConvexHullShape.h> #include <BulletCollision/CollisionShapes/btConvexPolyhedron.h> +#include <filesystem> #include <vulkan/vulkan_core.h> DynArray<EntityType> GlobalEntityTypes{16}; @@ -71,12 +72,9 @@ void CalculateCombinedMemReqs(uint64_t memReqsCount, VkMemoryRequirements *memRe void EntityType_Load(EntityType &et) { assert(et.startingInstanceCount > 0); - if (et.modelFile != nullptr && et.modelFile != CAFE_BABE(char)) { - - char modelPath[128]; - memset(modelPath, '\0', 128); - snprintf(modelPath, 128, "%s/%s", et.modelsDir, et.modelFile); - AssetHandle assetHandle{AM_Register(modelPath)}; + AssetHandle assetHandle{AM_GetHandle(et.modelAssetKey)}; + AssetHandle textureAssetHandle{AM_GetHandle(et.textureAssetKey)}; + if (assetHandle != AssetHandle_MAX) { const Asset *asset = AM_Get(assetHandle); CompGrBinds &grBinds = ECS_CreateGrBinds(et.entityHandle); @@ -94,19 +92,20 @@ void EntityType_Load(EntityType &et) { cgltf_data *gltfData = nullptr; cgltf_result result = cgltf_parse(&options, asset->ptr, asset->size, &gltfData); assert(result == cgltf_result_success); - result = cgltf_load_buffers(&options, gltfData, modelPath); - assert(result == cgltf_result_success); + // result = cgltf_load_buffers(&options, gltfData, modelPath); + // assert(result == cgltf_result_success); result = cgltf_validate(gltfData); assert(result == cgltf_result_success); - assert(gltfData->images_count < 2); + assert(gltfData->buffers_count == 1); - if (gltfData->images_count == 1) { - char imagePath[128]; - memset(imagePath, '\0', 128); - snprintf(imagePath, 128, "%s/%s", et.modelsDir, gltfData->images[0].uri); + std::filesystem::path gltfPath{asset->basePath}; + gltfPath.replace_filename(gltfData->buffers[0].uri); + AssetHandle modelBinHandle = AM_Register(gltfPath.c_str()); + if (textureAssetHandle != AssetHandle_MAX) { + const Asset *textureAsset = AM_Get(textureAssetHandle); int pixelWidth, pixelHeight, pixelChannels; - auto *pixels = stbi_load(imagePath, &pixelWidth, &pixelHeight, &pixelChannels, STBI_rgb_alpha); + auto *pixels = stbi_load_from_memory(static_cast<stbi_uc *>(textureAsset->ptr), textureAsset->size, &pixelWidth, &pixelHeight, &pixelChannels, STBI_rgb_alpha); assert(pixels != nullptr && "sbti_load failed to load image."); uint32_t imageSizeBytes = pixelWidth * pixelHeight * pixelChannels; @@ -309,7 +308,9 @@ void EntityType_Load(EntityType &et) { vkQueueWaitIdle(graphicsQueue); } - stbi_image_free(pixels); + // TODO double-check this? + // stbi_image_free(pixels); + AM_Release(textureAssetHandle); // descriptor pool & sets @@ -532,6 +533,7 @@ void EntityType_Load(EntityType &et) { runningOffset += sizeIndex; assert(runningOffset == combinedMemReqs.size); + const Asset *modelBinAsset = AM_Get(modelBinHandle); // create transfer items && transfer { @@ -545,19 +547,19 @@ void EntityType_Load(EntityType &et) { char *srcPtr = nullptr; dstPtr = static_cast<char *>(data) + offsetVert; - srcPtr = static_cast<char *>(gltfData->buffers[0].data) + accVert.buffer_view->offset; + srcPtr = static_cast<char *>(modelBinAsset->ptr) + accVert.buffer_view->offset; memcpy(dstPtr, srcPtr, accVert.buffer_view->size); dstPtr = static_cast<char *>(data) + offsetNorm; - srcPtr = static_cast<char *>(gltfData->buffers[0].data) + accNorm.buffer_view->offset; + srcPtr = static_cast<char *>(modelBinAsset->ptr) + accNorm.buffer_view->offset; memcpy(dstPtr, srcPtr, accNorm.buffer_view->size); dstPtr = static_cast<char *>(data) + offsetUV; - srcPtr = static_cast<char *>(gltfData->buffers[0].data) + accUV.buffer_view->offset; + srcPtr = static_cast<char *>(modelBinAsset->ptr) + accUV.buffer_view->offset; memcpy(dstPtr, srcPtr, accUV.buffer_view->size); dstPtr = static_cast<char *>(data) + offsetIndex; - srcPtr = static_cast<char *>(gltfData->buffers[0].data) + accIndex.buffer_view->offset; + srcPtr = static_cast<char *>(modelBinAsset->ptr) + accIndex.buffer_view->offset; memcpy(dstPtr, srcPtr, accIndex.buffer_view->size); VkCommandBufferBeginInfo vkCommandBufferBeginInfo; @@ -627,7 +629,7 @@ void EntityType_Load(EntityType &et) { btConvexHullShape *shape; { shape = Pke_New<btConvexHullShape>(MemBkt_Bullet); - btScalar *vertDataPointer = reinterpret_cast<btScalar *>(accVert.buffer_view->buffer->data); + btScalar *vertDataPointer = reinterpret_cast<btScalar *>(modelBinAsset->ptr); vertDataPointer += accVert.buffer_view->offset; new (shape) btConvexHullShape(vertDataPointer, accVert.count, accVert.stride); shape->optimizeConvexHull(); @@ -636,6 +638,9 @@ void EntityType_Load(EntityType &et) { } assert(shape != nullptr); + modelBinAsset = CAFE_BABE(Asset); + AM_Release(modelBinHandle); + // set up convex hull debug { const btConvexPolyhedron *pol = shape->getConvexPolyhedron(); @@ -846,7 +851,7 @@ void EntityType_Load(EntityType &et) { } // cleanup - cgltf_free(gltfData); + // cgltf_free(gltfData); AM_Release(assetHandle); } } @@ -960,7 +965,7 @@ void EntityType_RolloverInstances(EntityType &et, CompGrBinds &grBinds) { void EntityType_Teardown() { long entityTypeCount = GlobalEntityTypes.Count(); for (long i = 0; i < entityTypeCount; ++i) { - if (GlobalEntityTypes[i].modelFile == nullptr) continue; + if (GlobalEntityTypes[i].modelAssetKey[0] == '\0') continue; auto *et = &GlobalEntityTypes[i]; auto *grBinds = ECS_GetGrBinds(GlobalEntityTypes[i].entityHandle); if (grBinds->vkDescriptorSets != nullptr && et->vkDescriptorPool != VK_NULL_HANDLE) { @@ -1003,10 +1008,6 @@ void EntityType_Teardown() { vkFreeMemory(vkDevice, et->deviceMemoryPhysVert, vkAllocator); if (et->deviceMemoryTexture != VK_NULL_HANDLE) vkFreeMemory(vkDevice, et->deviceMemoryTexture, vkAllocator); - if (et->modelsDir) - Pke_Delete<char>(et->modelsDir, strlen(et->modelsDir)); - if (et->modelFile) - Pke_Delete<char>(et->modelFile, strlen(et->modelFile)); if (et->entityTypeCode) Pke_Delete<char>(et->entityTypeCode, strlen(et->entityTypeCode)); } |
