diff options
| -rw-r--r-- | src/plugins.hpp | 3 | ||||
| -rw-r--r-- | src/project.cpp | 40 |
2 files changed, 21 insertions, 22 deletions
diff --git a/src/plugins.hpp b/src/plugins.hpp index 64c19f0..a474750 100644 --- a/src/plugins.hpp +++ b/src/plugins.hpp @@ -13,7 +13,8 @@ struct PKEPluginInterface { void (*OnImGuiRender)() = nullptr; }; -using CallbackSignature = char[16]; +constexpr int64_t CallbackSignatureLength = 16; +using CallbackSignature = char[CallbackSignatureLength]; struct PkeCallback { // the 16 char signature(name) of a function CallbackSignature name = {'\0','\0','\0','\0','\0','\0','\0','\0','\0','\0','\0','\0','\0','\0','\0','\0'}; diff --git a/src/project.cpp b/src/project.cpp index e596d75..4abe7ab 100644 --- a/src/project.cpp +++ b/src/project.cpp @@ -68,24 +68,20 @@ void Proj_SerializeEntityType(std::ofstream &stream, const EntityType &et) { snprintf(handleStr, 19, "0x%016lX", et.entityHandle.hash); snprintf(modelAssetKey, AssetKeyLength + 1, "%s", et.modelAssetKey); EntityType e{}; - CompGrBinds *grBinds = ECS_GetGrBinds(et.entityHandle); if (modelAssetKey[0] != '\0') stream << PKE_PROJ_FILE_ENTITY_TYPE_MODEL_ASSET_KEY << modelAssetKey << std::endl; - if (textureAssetKey[0] != '\0') - stream << PKE_PROJ_FILE_ENTITY_TYPE_TEXTURE_ASSET_KEY << textureAssetKey << 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) stream << PKE_PROJ_FILE_ENTITY_TYPE_ENTITY_HANDLE << handleStr << std::endl; - if (grBinds) { - if (grBinds->collisionCallback.name[0] != '\0') { - stream << PKE_PROJ_FILE_ENTITY_TYPE_COLLISION_CALLBACK_SIGNATURE << grBinds->collisionCallback.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') + stream << PKE_PROJ_FILE_ENTITY_TYPE_TEXTURE_ASSET_KEY << textureAssetKey << std::endl; if (etd.startingInstanceCount != e.details[0].startingInstanceCount) stream << PKE_PROJ_FILE_ENTITY_TYPE_STARTING_INSTANCE_COUNT << etd.startingInstanceCount << std::endl; if (etd.bt.startingMass != e.details[0].bt.startingMass) @@ -94,6 +90,11 @@ 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; + } + } stream << PKE_PROJ_FILE_ENTITY_TYPE_DETAILS_END << std::endl; } } @@ -152,9 +153,10 @@ void Proj_ParseProjectSettings(std::ifstream &stream) { */ void Proj_ParseEntityType(std::ifstream &stream) { - CallbackSignature collisionSig; + char collisionSig[CallbackSignatureLength + 1]; collisionSig[0] = '\0'; EntityType et{}; + uint8_t detailCount = 0; while (stream.getline(projReadLine, projReadLineLength)) { if (strcmp(PKE_PROJ_FILE_OBJ_END, projReadLine) == 0) { int64_t existingEntityTypeIndex = EntityType_FindByTypeCode(et.entityTypeCode); @@ -165,7 +167,7 @@ void Proj_ParseEntityType(std::ifstream &stream) { GlobalEntityTypes.Push(et); CompGrBinds *grBinds = ECS_GetGrBinds(et.entityHandle); if (grBinds) { - strncpy(grBinds->collisionCallback.name, collisionSig, 16); + strncpy(grBinds->collisionCallback.name, collisionSig, CallbackSignatureLength); PkePlugin_SetSignatureFunc(&grBinds->collisionCallback); } return; @@ -190,17 +192,11 @@ void Proj_ParseEntityType(std::ifstream &stream) { assert(result == STR2NUM_ERROR::SUCCESS); continue; } - if (strstr(projReadLine, PKE_PROJ_FILE_ENTITY_TYPE_COLLISION_CALLBACK_SIGNATURE)) { - uint64_t prefixLen = strlen(PKE_PROJ_FILE_ENTITY_TYPE_COLLISION_CALLBACK_SIGNATURE); - memcpy(collisionSig, projReadLine + prefixLen, 16); - continue; - } - uint8_t count = 0; if (strstr(projReadLine, PKE_PROJ_FILE_ENTITY_TYPE_DETAILS_BEGIN)) { - EntityTypeDetails &etd = et.details[count]; + EntityTypeDetails &etd = et.details[detailCount]; while (stream.getline(projReadLine, projReadLineLength)) { if (strstr(projReadLine, PKE_PROJ_FILE_ENTITY_TYPE_DETAILS_END)) { - count += 1; + detailCount += 1; break; } if (strstr(projReadLine, PKE_PROJ_FILE_ENTITY_TYPE_TEXTURE_ASSET_KEY)) { @@ -236,6 +232,11 @@ void Proj_ParseEntityType(std::ifstream &stream) { assert(result == STR2NUM_ERROR::SUCCESS); continue; } + if (strstr(projReadLine, PKE_PROJ_FILE_ENTITY_TYPE_COLLISION_CALLBACK_SIGNATURE)) { + uint64_t prefixLen = strlen(PKE_PROJ_FILE_ENTITY_TYPE_COLLISION_CALLBACK_SIGNATURE); + strncpy(collisionSig, projReadLine + prefixLen, CallbackSignatureLength + 1); + continue; + } } continue; } @@ -346,9 +347,6 @@ void PkeProject_Save(const char *filePath) { f << PKE_PROJ_FILE_OBJ_ENTITY_TYPE << std::endl; const auto &et = GlobalEntityTypes[i]; const CompGrBinds *grBinds = ECS_GetGrBinds(et.entityHandle); - if (grBinds == nullptr) { - continue; - } Proj_SerializeEntityType(f, et); f << PKE_PROJ_FILE_OBJ_END << std::endl; } |
