diff options
Diffstat (limited to 'src/project.cpp')
| -rw-r--r-- | src/project.cpp | 95 |
1 files changed, 73 insertions, 22 deletions
diff --git a/src/project.cpp b/src/project.cpp index 08c7c2a..143f5ab 100644 --- a/src/project.cpp +++ b/src/project.cpp @@ -17,14 +17,15 @@ const char* const PKE_PROJ_FILE_VERSION = ":0:"; const char* const PKE_PROJ_FILE_OBJ_END = ""; const char* const PKE_PROJ_FILE_OBJ_PROJECT_SETTINGS = "ProjectSettings:"; const char* const PKE_PROJ_FILE_OBJ_ENTITY_TYPE = "EntityType:"; +const char* const PKE_PROJ_FILE_OBJ_ASSET = "Asset:"; const char* const PKE_PROJ_FILE_PROJ_SETTINGS_DEFAULT_SCENE_NAME = "PkeSet::DefaultSceneName: "; const char* const PKE_PROJ_FILE_PROJ_SETTINGS_SCENE_COUNT = "PkeSet::SceneCount: "; const char* const PKE_PROJ_FILE_PROJ_SETTINGS_SCENES_BEGIN = "PkeSet::Scenes: ["; const char* const PKE_PROJ_FILE_PROJ_SETTINGS_SCENES_END = "PkeSet::Scenes: ]"; -const char* const PKE_PROJ_FILE_ENTITY_TYPE_MODELS_DIR = "ModelsDir: "; -const char* const PKE_PROJ_FILE_ENTITY_TYPE_MODEL_FILE = "ModelFile: "; +const char* const PKE_PROJ_FILE_ENTITY_TYPE_MODEL_ASSET_KEY = "ModelAssetKey: "; +const char* const PKE_PROJ_FILE_ENTITY_TYPE_TEXTURE_ASSET_KEY = "TextureAssetKey: "; 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_COLLISION_CALLBACK_SIGNATURE = "CollisionCallbackSignature: "; @@ -37,6 +38,9 @@ const char* const PKE_PROJ_FILE_ENTITY_TYPE_PHYSICS_STARTING_MASS = "BT::Startin const char* const PKE_PROJ_FILE_ENTITY_TYPE_PHYSICS_STARTING_COLLISION_LAYER = "BT::StartingCollisionLayer: "; const char* const PKE_PROJ_FILE_ENTITY_TYPE_PHYSICS_STARTING_COLLISION_MASK = "BT::StartingCollisionMask: "; +const char* const PKE_PROJ_FILE_ASSET_KEY = "Asset::Key: "; +const char* const PKE_PROJ_FILE_ASSET_BASE_PATH = "Asset::BasePath: "; + /* void Proj_SerializeProjectSettings(std::ofstream &stream) { PkeProjectSettings ps{}; @@ -59,14 +63,18 @@ void Proj_SerializeProjectSettings(std::ofstream &stream) { */ void Proj_SerializeEntityType(std::ofstream &stream, const EntityType &et) { - char handleStr[19] = { '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0' }; + 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(modelAssetKey, AssetKeyLength + 1, "%s", et.modelAssetKey); + snprintf(textureAssetKey, AssetKeyLength + 1, "%s", et.textureAssetKey); EntityType e{}; CompGrBinds *grBinds = ECS_GetGrBinds(et.entityHandle); - if (et.modelsDir != e.modelsDir) - stream << PKE_PROJ_FILE_ENTITY_TYPE_MODELS_DIR << et.modelsDir << std::endl; - if (et.modelFile != e.modelFile) - stream << PKE_PROJ_FILE_ENTITY_TYPE_MODEL_FILE << et.modelFile << std::endl; + 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) @@ -94,6 +102,18 @@ void Proj_SerializeEntityType(std::ofstream &stream, const EntityType &et) { stream << PKE_PROJ_FILE_ENTITY_TYPE_PHYSICS_STARTING_COLLISION_MASK << static_cast<PhysicsCollision_T>(et.bt.startingCollisionMask) << std::endl; } +void Proj_SerializeAsset(std::ofstream &stream, const Asset &asset) { + NULL_CHAR_ARR(keyStr, AssetKeyLength + 1); + snprintf(keyStr, AssetKeyLength + 1, "%s", asset.key); + Asset a{}; + if (keyStr[0] != '\0') { + stream << PKE_PROJ_FILE_ASSET_KEY << keyStr << std::endl; + } + if (asset.basePath != nullptr) { + stream << PKE_PROJ_FILE_ASSET_BASE_PATH << asset.basePath << std::endl; + } +} + /* void Proj_ParseProjectSettings(std::ifstream &stream) { while (stream.getline(projReadLine, projReadLineLength)) { @@ -143,7 +163,6 @@ void Proj_ParseEntityType(std::ifstream &stream) { continue; } et.entityHandle = ECS_CreateEntity(); - EntityType_Load(et); GlobalEntityTypes.Push(et); CompGrBinds *grBinds = ECS_GetGrBinds(et.entityHandle); if (grBinds) { @@ -152,22 +171,14 @@ void Proj_ParseEntityType(std::ifstream &stream) { } return; } - if (strstr(projReadLine, PKE_PROJ_FILE_ENTITY_TYPE_MODELS_DIR)) { - uint64_t prefixLen = strlen(PKE_PROJ_FILE_ENTITY_TYPE_MODELS_DIR); - uint64_t len = strlen(projReadLine + prefixLen) + 1; - char *val = Pke_New<char>(len); - memset(reinterpret_cast<void *>(val), '\0', len); - memcpy(val, projReadLine + prefixLen, len); - et.modelsDir = val; + if (strstr(projReadLine, PKE_PROJ_FILE_ENTITY_TYPE_MODEL_ASSET_KEY)) { + uint64_t prefixLen = strlen(PKE_PROJ_FILE_ENTITY_TYPE_MODEL_ASSET_KEY); + strncpy(et.modelAssetKey, projReadLine + prefixLen, AssetKeyLength); continue; } - if (strstr(projReadLine, PKE_PROJ_FILE_ENTITY_TYPE_MODEL_FILE)) { - uint64_t prefixLen = strlen(PKE_PROJ_FILE_ENTITY_TYPE_MODEL_FILE); - uint64_t len = strlen(projReadLine + prefixLen) + 1; - char *val = Pke_New<char>(len); - memset(reinterpret_cast<void *>(val), '\0', len); - memcpy(val, projReadLine + prefixLen, len); - et.modelFile = val; + if (strstr(projReadLine, PKE_PROJ_FILE_ENTITY_TYPE_TEXTURE_ASSET_KEY)) { + uint64_t prefixLen = strlen(PKE_PROJ_FILE_ENTITY_TYPE_TEXTURE_ASSET_KEY); + strncpy(et.textureAssetKey, projReadLine + prefixLen, AssetKeyLength); continue; } if (strstr(projReadLine, PKE_PROJ_FILE_ENTITY_TYPE_ENTITY_TYPE_CODE)) { @@ -245,6 +256,31 @@ void Proj_ParseEntityType(std::ifstream &stream) { } } +void Proj_ParseAssset(std::ifstream &stream) { + char keyStr[AssetKeyLength + 1]; + keyStr[AssetKeyLength] = '\0'; + char basePath[256]; + basePath[0] = '\0'; + basePath[255] = '\0'; + while (stream.getline(projReadLine, projReadLineLength)) { + if (strcmp(projReadLine, PKE_PROJ_FILE_OBJ_END) == 0) { + AM_Register(keyStr, basePath); + return; + } + if (strstr(projReadLine, PKE_PROJ_FILE_ASSET_KEY) != nullptr) { + uint64_t prefixLen = strlen(PKE_PROJ_FILE_ASSET_KEY); + strncpy(keyStr, projReadLine + prefixLen, AssetKeyLength); + continue; + } + if (strstr(projReadLine, PKE_PROJ_FILE_ASSET_BASE_PATH) != nullptr) { + uint64_t prefixLen = strlen(PKE_PROJ_FILE_ASSET_BASE_PATH); + uint64_t strLen = strlen(projReadLine) - prefixLen; + strncpy(basePath, projReadLine + prefixLen, strLen + 1); + continue; + } + } +} + void PkeProject_Load(const char *filePath) { const char *safeFilePath = filePath == nullptr ? PKE_PROJ_DEFAULT_FILENAME : filePath; std::ifstream f(safeFilePath); @@ -261,6 +297,10 @@ void PkeProject_Load(const char *filePath) { continue; } */ + if (strcmp(PKE_PROJ_FILE_OBJ_ASSET, projReadLine) == 0) { + Proj_ParseAssset(f); + continue; + } if (strcmp(PKE_PROJ_FILE_OBJ_ENTITY_TYPE, projReadLine) == 0) { Proj_ParseEntityType(f); continue; @@ -288,6 +328,17 @@ void PkeProject_Save(const char *filePath) { f << PKE_PROJ_FILE_OBJ_END << std::endl; */ + auto assetB = AM_GetBucketCount(); + for (long b = 0; b < assetB; ++b) { + uint64_t assetI = 0; + auto *assets = AM_GetAssets(b, assetI); + for (long i = 0; i < assetI; ++i) { + f << PKE_PROJ_FILE_OBJ_ASSET << std::endl; + Proj_SerializeAsset(f, assets[i]); + f << PKE_PROJ_FILE_OBJ_END << std::endl; + } + } + for (long i = 0; i < GlobalEntityTypes.Count(); ++i) { f << PKE_PROJ_FILE_OBJ_ENTITY_TYPE << std::endl; const auto &et = GlobalEntityTypes[i]; |
