summaryrefslogtreecommitdiff
path: root/src/project.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/project.cpp')
-rw-r--r--src/project.cpp95
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];