diff options
| author | Jonathan Bradley <jcb@pikum.xyz> | 2024-01-10 19:24:12 -0500 |
|---|---|---|
| committer | Jonathan Bradley <jcb@pikum.xyz> | 2024-01-10 19:24:12 -0500 |
| commit | f07294ca65143fac8b1b426d1854212403721226 (patch) | |
| tree | 2edeb8f2c9beea1cbb065f69910d53957ebda0ce /src/project.cpp | |
| parent | 294c85f91ac5b2ff9e4ad3d99588ed0d1a72e6b7 (diff) | |
checkpoint - handle breaking ECS changes - compiles
Diffstat (limited to 'src/project.cpp')
| -rw-r--r-- | src/project.cpp | 77 |
1 files changed, 55 insertions, 22 deletions
diff --git a/src/project.cpp b/src/project.cpp index 4abe7ab..0f08859 100644 --- a/src/project.cpp +++ b/src/project.cpp @@ -27,6 +27,7 @@ const char* const PKE_PROJ_FILE_PROJ_SETTINGS_SCENES_END = "PkeSet::Scenes: ]"; const char* const PKE_PROJ_FILE_ENTITY_TYPE_MODEL_ASSET_KEY = "ModelAssetKey: "; const char* const PKE_PROJ_FILE_ENTITY_TYPE_ENTITY_TYPE_CODE = "EntityTypeCode: "; const char* const PKE_PROJ_FILE_ENTITY_TYPE_ENTITY_HANDLE = "EntityHandle: "; +const char* const PKE_PROJ_FILE_ENTITY_TYPE_CREATE_INSTANCE_CALLBACK_SIGNATURE = "InstanceCreateCallbackSignature: "; const char* const PKE_PROJ_FILE_ENTITY_TYPE_COLLISION_CALLBACK_SIGNATURE = "CollisionCallbackSignature: "; const char* const PKE_PROJ_FILE_ENTITY_TYPE_DETAILS_BEGIN = "EntityHandleDetails: {"; const char* const PKE_PROJ_FILE_ENTITY_TYPE_DETAILS_END = "EntityHandleDetails: }"; @@ -65,19 +66,21 @@ void Proj_SerializeEntityType(std::ofstream &stream, const EntityType &et) { NULL_CHAR_ARR(handleStr, 19); NULL_CHAR_ARR(modelAssetKey, AssetKeyLength + 1); NULL_CHAR_ARR(textureAssetKey, AssetKeyLength + 1); - snprintf(handleStr, 19, "0x%016lX", et.entityHandle.hash); + snprintf(handleStr, 19, "0x%016lX", et.handle.hash); snprintf(modelAssetKey, AssetKeyLength + 1, "%s", et.modelAssetKey); EntityType e{}; if (modelAssetKey[0] != '\0') stream << PKE_PROJ_FILE_ENTITY_TYPE_MODEL_ASSET_KEY << modelAssetKey << std::endl; if (et.entityTypeCode != e.entityTypeCode) stream << PKE_PROJ_FILE_ENTITY_TYPE_ENTITY_TYPE_CODE << et.entityTypeCode << std::endl; - if (et.entityHandle != e.entityHandle) + if (et.handle != e.handle) stream << PKE_PROJ_FILE_ENTITY_TYPE_ENTITY_HANDLE << handleStr << std::endl; + if (et.createInstanceCallback.name[0] != '\0') { + stream << PKE_PROJ_FILE_ENTITY_TYPE_CREATE_INSTANCE_CALLBACK_SIGNATURE << et.createInstanceCallback.name << std::endl; + } for (size_t i = 0; i < et.detailsCount; ++i) { const EntityTypeDetails &etd = et.details[i]; snprintf(textureAssetKey, AssetKeyLength + 1, "%s", etd.textureAssetKey); - CompGrBinds *grBinds = ECS_GetGrBinds(etd.entityHandle); stream << PKE_PROJ_FILE_ENTITY_TYPE_DETAILS_BEGIN << std::endl; if (textureAssetKey[0] != '\0') @@ -90,9 +93,9 @@ void Proj_SerializeEntityType(std::ofstream &stream, const EntityType &et) { stream << PKE_PROJ_FILE_ENTITY_TYPE_PHYSICS_STARTING_COLLISION_LAYER << static_cast<PhysicsCollision_T>(etd.bt.startingCollisionLayer) << std::endl; if (etd.bt.startingCollisionMask != e.details[0].bt.startingCollisionMask) stream << PKE_PROJ_FILE_ENTITY_TYPE_PHYSICS_STARTING_COLLISION_MASK << static_cast<PhysicsCollision_T>(etd.bt.startingCollisionMask) << std::endl; - if (grBinds) { - if (grBinds->collisionCallback.name[0] != '\0') { - stream << PKE_PROJ_FILE_ENTITY_TYPE_COLLISION_CALLBACK_SIGNATURE << grBinds->collisionCallback.name << std::endl; + if (etd.grBinds) { + if (etd.grBinds->collisionCallback.name[0] != '\0') { + stream << PKE_PROJ_FILE_ENTITY_TYPE_COLLISION_CALLBACK_SIGNATURE << etd.grBinds->collisionCallback.name << std::endl; } } stream << PKE_PROJ_FILE_ENTITY_TYPE_DETAILS_END << std::endl; @@ -155,21 +158,40 @@ void Proj_ParseProjectSettings(std::ifstream &stream) { void Proj_ParseEntityType(std::ifstream &stream) { char collisionSig[CallbackSignatureLength + 1]; collisionSig[0] = '\0'; + char createInstanceSig[CallbackSignatureLength + 1]; + createInstanceSig[0] = '\0'; EntityType et{}; - uint8_t detailCount = 0; + int64_t detailCount = 0; while (stream.getline(projReadLine, projReadLineLength)) { if (strcmp(PKE_PROJ_FILE_OBJ_END, projReadLine) == 0) { - int64_t existingEntityTypeIndex = EntityType_FindByTypeCode(et.entityTypeCode); - if (existingEntityTypeIndex != -1) { + EntityType *existingPtr = EntityType_FindByTypeCode(et.entityTypeCode); + if (existingPtr != nullptr) { + // TODO leaks et.EntityTypeCode continue; } - et.entityHandle = ECS_CreateEntity(); - GlobalEntityTypes.Push(et); - CompGrBinds *grBinds = ECS_GetGrBinds(et.entityHandle); - if (grBinds) { - strncpy(grBinds->collisionCallback.name, collisionSig, CallbackSignatureLength); - PkePlugin_SetSignatureFunc(&grBinds->collisionCallback); + EntityType *etPtr = EntityType_Create(); + strncpy(etPtr->modelAssetKey, et.modelAssetKey, AssetKeyLength); + etPtr->entityTypeCode = et.entityTypeCode; + if (createInstanceSig[0] == '\0') { + strncpy(etPtr->createInstanceCallback.name, createInstanceSig, CallbackSignatureLength); + PkePlugin_SetSignatureFunc(&etPtr->createInstanceCallback); + } else { + etPtr->createInstanceCallback.name[0] = 'd'; + etPtr->createInstanceCallback.func = reinterpret_cast<void *>(EntityType_CreateGenericInstance); + } + + for (int64_t i = 0; i < detailCount; ++i) { + etPtr->details[i] = et.details[i]; + strncpy(etPtr->details[i].textureAssetKey, et.details[i].textureAssetKey, AssetKeyLength); } + + EntityType_Load(*etPtr); + + for (int64_t i = 0; i < detailCount; ++i) { + strncpy(etPtr->details[i].grBinds->collisionCallback.name, collisionSig, CallbackSignatureLength); + PkePlugin_SetSignatureFunc(&etPtr->details[i].grBinds->collisionCallback); + } + return; } if (strstr(projReadLine, PKE_PROJ_FILE_ENTITY_TYPE_MODEL_ASSET_KEY)) { @@ -188,10 +210,15 @@ void Proj_ParseEntityType(std::ifstream &stream) { } if (strstr(projReadLine, PKE_PROJ_FILE_ENTITY_TYPE_ENTITY_HANDLE)) { uint64_t prefixLen = strlen(PKE_PROJ_FILE_ENTITY_TYPE_ENTITY_HANDLE); - STR2NUM_ERROR result = str2num(et.entityHandle.hash, projReadLine + prefixLen); + STR2NUM_ERROR result = str2num(et.handle.hash, projReadLine + prefixLen); assert(result == STR2NUM_ERROR::SUCCESS); continue; } + if (strstr(projReadLine, PKE_PROJ_FILE_ENTITY_TYPE_CREATE_INSTANCE_CALLBACK_SIGNATURE)) { + uint64_t prefixLen = strlen(PKE_PROJ_FILE_ENTITY_TYPE_CREATE_INSTANCE_CALLBACK_SIGNATURE); + strncpy(createInstanceSig, projReadLine + prefixLen, CallbackSignatureLength + 1); + continue; + } if (strstr(projReadLine, PKE_PROJ_FILE_ENTITY_TYPE_DETAILS_BEGIN)) { EntityTypeDetails &etd = et.details[detailCount]; while (stream.getline(projReadLine, projReadLineLength)) { @@ -343,12 +370,18 @@ void PkeProject_Save(const char *filePath) { } } - for (long i = 0; i < GlobalEntityTypes.Count(); ++i) { - f << PKE_PROJ_FILE_OBJ_ENTITY_TYPE << std::endl; - const auto &et = GlobalEntityTypes[i]; - const CompGrBinds *grBinds = ECS_GetGrBinds(et.entityHandle); - Proj_SerializeEntityType(f, et); - f << PKE_PROJ_FILE_OBJ_END << std::endl; + const auto entBucketCount = EntityType_GetBucketCount(); + for (PkeHandleBucketIndex_T b = 0; b < entBucketCount; ++b) { + PkeHandleItemIndex_T itemCount = 0; + auto *entities = EntityType_GetEntityTypes(b, itemCount); + for (PkeHandleItemIndex_T i = 0; i < itemCount; ++i) { + if (entities[i].modelAssetKey[0] == '\0') { + continue; + } + f << PKE_PROJ_FILE_OBJ_ENTITY_TYPE << std::endl; + Proj_SerializeEntityType(f, entities[i]); + f << PKE_PROJ_FILE_OBJ_END << std::endl; + } } f << PKE_PROJ_FILE_END << std::endl; |
