summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJonathan Bradley <jcb@pikum.xyz>2025-03-31 12:02:44 -0400
committerJonathan Bradley <jcb@pikum.xyz>2025-03-31 12:02:44 -0400
commit89614d1dee1049a08e64aead95de6fb28fa7b150 (patch)
tree77e59a92c370154d7b7d859506e570a1fffd66c3 /src
parent119c83096a81c5aef45a0dbef029bd2e49d2e977 (diff)
pke: parse uuid from scene and project files
Diffstat (limited to 'src')
-rw-r--r--src/camera.cpp5
-rw-r--r--src/camera.hpp2
-rw-r--r--src/ecs.cpp9
-rw-r--r--src/ecs.hpp2
-rw-r--r--src/entities.cpp10
-rw-r--r--src/entities.hpp2
-rw-r--r--src/game.cpp12
-rw-r--r--src/project.cpp7
8 files changed, 36 insertions, 13 deletions
diff --git a/src/camera.cpp b/src/camera.cpp
index 21617bf..41e5779 100644
--- a/src/camera.cpp
+++ b/src/camera.cpp
@@ -44,16 +44,17 @@ PkeCamera &PkeCamera_Register_Inner(PkeCamera &cam, CompInstance &inst, const In
return cam;
}
-PkeCamera &PkeCamera_Register(const InstPos &instPos) {
+PkeCamera &PkeCamera_Register(pk_uuid uuid, const InstPos &instPos) {
CameraHandle cameraHandle{Buckets_NewHandle(Camera_BucketContainer)};
CompInstance *inst;
auto &cam = Camera_BucketContainer.buckets[cameraHandle.bucketIndex][cameraHandle.itemIndex];
new (&cam) PkeCamera{};
+ cam.uuid = uuid;
ECS_CreateEntity(&cam, nullptr);
cam.camHandle = cameraHandle;
- inst = ECS_CreateInstance(&cam, nullptr);
+ inst = ECS_CreateInstance(&cam, pk_uuid_zed, nullptr);
return PkeCamera_Register_Inner(cam, *inst, instPos);
}
diff --git a/src/camera.hpp b/src/camera.hpp
index 884f0b8..e50ae54 100644
--- a/src/camera.hpp
+++ b/src/camera.hpp
@@ -43,7 +43,7 @@ extern CompInstance NullCameraInstance;
extern PkeCamera *ActiveCamera;
void PkeCamera_Init();
-PkeCamera &PkeCamera_Register(const InstPos &instPos);
+PkeCamera &PkeCamera_Register(pk_uuid uuid, const InstPos &instPos);
PkeCamera *PkeCamera_Get(CameraHandle handle);
PkeCamera *PkeCamera_Get(EntityHandle handle);
void PkeCamera_TargetInstance(CameraHandle cameraHandle, CompInstance *inst);
diff --git a/src/ecs.cpp b/src/ecs.cpp
index 048669d..4f81ac0 100644
--- a/src/ecs.cpp
+++ b/src/ecs.cpp
@@ -439,7 +439,7 @@ CompGrBinds *ECS_GetGrBinds(pk_handle_bucket_index_T bucketIndex, pk_handle_item
return ecs.bc.grBinds.buckets[bucketIndex];
}
-CompInstance *ECS_CreateInstance(Entity_Base *entity, CompGrBinds *entityTypeGrBinds) {
+CompInstance *ECS_CreateInstance(Entity_Base *entity, pk_uuid uuid, CompGrBinds *entityTypeGrBinds) {
assert(entity != nullptr && entity != CAFE_BABE(Entity_Base));
InstanceHandle instanceHandle{Buckets_NewHandle(ecs.bc.instances)};
@@ -449,9 +449,10 @@ CompInstance *ECS_CreateInstance(Entity_Base *entity, CompGrBinds *entityTypeGrB
new (comp) CompInstance{};
comp->entHandle = entity->handle;
comp->instanceHandle = instanceHandle;
- // TODO this should be passed in - currently generating a new one each time
- // Consider making a Component_Base that has a UUID, and pass in similar to ECS_CreateEntity
- if (comp->uuid == pk_uuid_zed || comp->uuid == pk_uuid_max) comp->uuid = pk_uuid_new_v7();
+ comp->uuid = uuid;
+ if (comp->uuid == pk_uuid_zed || comp->uuid == pk_uuid_max) {
+ comp->uuid = pk_uuid_new_v7();
+ }
if (entityTypeGrBinds != nullptr) {
comp->grBindsHandle = entityTypeGrBinds->grBindsHandle;
diff --git a/src/ecs.hpp b/src/ecs.hpp
index eea7758..e086ab6 100644
--- a/src/ecs.hpp
+++ b/src/ecs.hpp
@@ -27,7 +27,7 @@ void ECS_GetGrBinds(Entity_Base *entity, pk_arr_t<CompGrBinds *> &arr);
uint64_t ECS_GetGrBinds_BucketCount();
CompGrBinds *ECS_GetGrBinds(pk_handle_bucket_index_T bucketIndex, pk_handle_item_index_T &itemCount);
-CompInstance *ECS_CreateInstance(Entity_Base *entity, CompGrBinds *entityTypeGrBinds);
+CompInstance *ECS_CreateInstance(Entity_Base *entity, pk_uuid uuid, CompGrBinds *entityTypeGrBinds);
CompInstance *ECS_GetInstance(InstanceHandle instanceHandle);
void ECS_GetInstances(Entity_Base *entity, pk_arr_t<CompInstance *> &arr);
void ECS_UpdateInstance(CompInstance *instance, const InstPos &instPos, bool overridePhysics = false);
diff --git a/src/entities.cpp b/src/entities.cpp
index 1691986..0ab040c 100644
--- a/src/entities.cpp
+++ b/src/entities.cpp
@@ -31,22 +31,28 @@ void EntityType_Init() {
Buckets_Init(EntityType_BC);
}
-EntityType *EntityType_Create() {
+EntityType *EntityType_Create(pk_uuid uuid) {
EntityTypeHandle entTypeHandle{Buckets_NewHandle(EntityType_BC)};
EntityType &entityType = EntityType_BC.buckets[entTypeHandle.bucketIndex][entTypeHandle.itemIndex];
new (&entityType) EntityType{};
+ entityType.uuid = uuid;
ECS_CreateEntity(&entityType);
return &entityType;
}
Entity_Base *EntityType_CreateGenericInstance(EntityType *et, Entity_Base *levelEnt, CompInstance *srcInstance, InstPos *instPos) {
assert(et != nullptr);
+ pk_uuid uuid = pk_uuid_zed;
Entity_Base *genericEntity = ECS_CreateGenericEntity();
ECS_CreateEntity(genericEntity, levelEnt);
+ if (srcInstance != nullptr) {
+ uuid = srcInstance->uuid;
+ }
+
for (int64_t i = 0; i < et->detailsCount; ++i) {
auto &etd = et->details[i];
- auto *compInst = ECS_CreateInstance(genericEntity, etd.grBinds);
+ auto *compInst = ECS_CreateInstance(genericEntity, uuid, etd.grBinds);
btVector3 scaling{1.f,1.f,1.f};
btTransform posRot{};
diff --git a/src/entities.hpp b/src/entities.hpp
index 78eb6fa..8cecb63 100644
--- a/src/entities.hpp
+++ b/src/entities.hpp
@@ -43,7 +43,7 @@ constexpr EntityTypeHandle EntityTypeHandle_MAX = EntityTypeHandle{ pk_handle_MA
void EntityType_Init();
EntityType *EntityType_FindByTypeCode(const char *typeCode);
EntityType *EntityType_FindByEntityHandle(EntityHandle handle);
-EntityType *EntityType_Create();
+EntityType *EntityType_Create(pk_uuid uuid);
Entity_Base *EntityType_CreateGenericInstance(EntityType *et, Entity_Base *levelEnt, CompInstance *srcInstance = nullptr, InstPos *instPos = nullptr);
void EntityType_Load(EntityType &et);
void EntityType_Tick(double delta);
diff --git a/src/game.cpp b/src/game.cpp
index 630495a..f471d02 100644
--- a/src/game.cpp
+++ b/src/game.cpp
@@ -195,7 +195,7 @@ void DeserializeCamera(pke_scene *scene, std::istream &stream) {
} else {
instPos = loadFileInstanceMappings[instanceIndex].newInstance;
}
- auto &rCam = PkeCamera_Register(instPos);
+ auto &rCam = PkeCamera_Register(cam.uuid, instPos);
rCam.type = cam.type;
rCam.view = cam.view;
rCam.isPrimary = cam.isPrimary;
@@ -209,6 +209,11 @@ void DeserializeCamera(pke_scene *scene, std::istream &stream) {
}
return;
}
+ if (strncmp(readLine, PKE_FILE_CAMERA_UUID, strlen(PKE_FILE_CAMERA_TYPE)) == 0) {
+ uint64_t prefixLen = strlen(PKE_FILE_CAMERA_UUID);
+ (readLine + prefixLen) >> cam.uuid;
+ continue;
+ }
if (strncmp(readLine, PKE_FILE_CAMERA_TYPE, strlen(PKE_FILE_CAMERA_TYPE)) == 0) {
uint64_t prefixLen = strlen(PKE_FILE_CAMERA_TYPE);
PkeCameraType_T handle_t;
@@ -339,6 +344,11 @@ void DeserializeInstance(Entity_Base *parentEntity, std::istream &stream) {
assert(result2 == STR2NUM_ERROR::SUCCESS);
continue;
}
+ if (strstr(readLine, PKE_FILE_INSTANCE_UUID)) {
+ uint64_t prefixLen = strlen(PKE_FILE_INSTANCE_UUID);
+ (readLine + prefixLen) >> comp.uuid ;
+ continue;
+ }
if (strstr(readLine, PKE_FILE_INSTANCE_ENTITY_TYPE_CODE)) {
uint64_t prefixLen = strlen(PKE_FILE_INSTANCE_ENTITY_TYPE_CODE);
strncpy(entTypeCode, readLine + prefixLen, 21);
diff --git a/src/project.cpp b/src/project.cpp
index d371f68..c94451f 100644
--- a/src/project.cpp
+++ b/src/project.cpp
@@ -175,7 +175,7 @@ void Proj_DeserializeEntityType(std::istream &stream) {
// TODO leaks et.EntityTypeCode
continue;
}
- EntityType *etPtr = EntityType_Create();
+ EntityType *etPtr = EntityType_Create(et.uuid);
strncpy(etPtr->modelAssetKey, et.modelAssetKey, AssetKeyLength);
etPtr->entityTypeCode = et.entityTypeCode;
if (createInstanceSig[0] == '\0') {
@@ -224,6 +224,11 @@ void Proj_DeserializeEntityType(std::istream &stream) {
assert(result2 == STR2NUM_ERROR::SUCCESS);
continue;
}
+ if (strstr(projReadLine, PKE_PROJ_FILE_ENTITY_TYPE_UUID)) {
+ uint64_t prefixLen = strlen(PKE_PROJ_FILE_ENTITY_TYPE_UUID);
+ (projReadLine + prefixLen) >> et.uuid;
+ 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);