summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJonathan Bradley <jcb@pikum.xyz>2024-01-05 08:59:39 -0500
committerJonathan Bradley <jcb@pikum.xyz>2024-01-05 08:59:39 -0500
commit3aa95ba29a779d695c2a16905c651be768231212 (patch)
treea313a17f993e16c2e8bbfa8aab8e84733b0a8844
parentdcd4af5fa684a7e7ad2a49fa72450d3115dc0d80 (diff)
entity types save and load appropriately again
-rw-r--r--src/plugins.hpp3
-rw-r--r--src/project.cpp40
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;
}