summaryrefslogtreecommitdiff
path: root/src/entities.cpp
diff options
context:
space:
mode:
authorJonathan Bradley <jcb@pikum.xyz>2023-12-27 22:04:12 -0500
committerJonathan Bradley <jcb@pikum.xyz>2023-12-27 22:04:12 -0500
commit3187a32f7f0253ded7a41c4c21612253e525a8fe (patch)
tree76d3f6de872927dcd579feccc3c9d874b95e83df /src/entities.cpp
parentc9db77a8f789858b9e1ceb60edb5c463b30451ed (diff)
assets are global and stored in the project file
Diffstat (limited to 'src/entities.cpp')
-rw-r--r--src/entities.cpp53
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));
}