diff options
| -rw-r--r-- | editor/editor.cpp | 4 | ||||
| -rw-r--r-- | src/camera.cpp | 5 | ||||
| -rw-r--r-- | src/camera.hpp | 2 | ||||
| -rw-r--r-- | src/ecs.cpp | 9 | ||||
| -rw-r--r-- | src/ecs.hpp | 2 | ||||
| -rw-r--r-- | src/entities.cpp | 10 | ||||
| -rw-r--r-- | src/entities.hpp | 2 | ||||
| -rw-r--r-- | src/game.cpp | 12 | ||||
| -rw-r--r-- | src/project.cpp | 7 |
9 files changed, 38 insertions, 15 deletions
diff --git a/editor/editor.cpp b/editor/editor.cpp index 159a828..af05781 100644 --- a/editor/editor.cpp +++ b/editor/editor.cpp @@ -287,7 +287,7 @@ void PkeEditor_Tick(double delta) { EntityType *existingEntity = EntityType_FindByTypeCode(entityTypeToCreate.entityTypeCode.val); if (existingEntity == nullptr) { - EntityType *newEntType = EntityType_Create(); + EntityType *newEntType = EntityType_Create(pk_uuid_zed); strncpy(newEntType->modelAssetKey, entityTypeToCreate.modelAssetKey, AssetKeyLength); newEntType->entityTypeCode = entityTypeToCreate.entityTypeCode; if (entityTypeToCreate.createInstanceCallback.name[0] != '\0') { @@ -1111,7 +1111,7 @@ void RecordImGuiCameras() { instPos.mass = 1.f; activeInst->bt.motionState->getWorldTransform(instPos.posRot); instPos.scale = activeInst->bt.rigidBody->getCollisionShape()->getLocalScaling(); - auto &cam = PkeCamera_Register(instPos); + auto &cam = PkeCamera_Register(pk_uuid_zed, instPos); cam.phys.targetInstHandle = ActiveCamera->phys.targetInstHandle; cam.type = ActiveCamera->type; cam.view = ActiveCamera->view; 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); |
