summaryrefslogtreecommitdiff
path: root/src/project.cpp
diff options
context:
space:
mode:
authorJonathan Bradley <jcb@pikum.xyz>2024-01-10 19:24:12 -0500
committerJonathan Bradley <jcb@pikum.xyz>2024-01-10 19:24:12 -0500
commitf07294ca65143fac8b1b426d1854212403721226 (patch)
tree2edeb8f2c9beea1cbb065f69910d53957ebda0ce /src/project.cpp
parent294c85f91ac5b2ff9e4ad3d99588ed0d1a72e6b7 (diff)
checkpoint - handle breaking ECS changes - compiles
Diffstat (limited to 'src/project.cpp')
-rw-r--r--src/project.cpp77
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;