diff options
| -rw-r--r-- | editor/editor.cpp | 37 | ||||
| -rw-r--r-- | src/array.hpp | 1 | ||||
| -rw-r--r-- | src/bucketed-array.hpp | 2 | ||||
| -rw-r--r-- | src/ecs.cpp | 3 | ||||
| -rw-r--r-- | src/entities.cpp | 30 | ||||
| -rw-r--r-- | src/entities.hpp | 2 | ||||
| -rw-r--r-- | src/game.cpp | 8 | ||||
| -rw-r--r-- | src/level-types.hpp | 2 | ||||
| -rw-r--r-- | src/level.cpp | 7 | ||||
| -rw-r--r-- | src/level.hpp | 1 | ||||
| -rw-r--r-- | src/thread_pool.cpp | 11 | ||||
| -rw-r--r-- | src/thread_pool.hpp | 2 |
12 files changed, 74 insertions, 32 deletions
diff --git a/editor/editor.cpp b/editor/editor.cpp index 2f7e804..33f1c49 100644 --- a/editor/editor.cpp +++ b/editor/editor.cpp @@ -179,9 +179,6 @@ void PkeEditor_Tick(double delta) { if (selectedEntity && EntitiesToBeRemoved.Has(ECS_GetEntity(selectedEntity->entHandle))) { selectedEntity = nullptr; } - if (hoveredEntity && EntitiesToBeRemoved.Has(ECS_GetEntity(hoveredEntity->entHandle))) { - hoveredEntity = nullptr; - } bool imGuiHovered = ImGui::GetIO().WantCaptureMouse; @@ -218,7 +215,7 @@ void PkeEditor_Tick(double delta) { BtDynamicsWorld->rayTest(rayOrigin, rayDestination, rayResult); if (rayResult.hasHit()) { - hoveredEntity = reinterpret_cast<CompInstance *>(rayResult.m_collisionObject->getUserPointer());; + hoveredEntity = reinterpret_cast<CompInstance *>(rayResult.m_collisionObject->getUserPointer()); } } @@ -281,7 +278,7 @@ void PkeEditor_Tick(double delta) { if (et->createInstanceCallback.func) { reinterpret_cast<void(*)()>(et->createInstanceCallback.func)(); } else { - EntityType_CreateGenericInstance(et, nullptr); + EntityType_CreateGenericInstance(et, nullptr, nullptr); } } @@ -814,13 +811,17 @@ void RecordImGuiModalCreateEntityType() { memcpy(createInstanceSig, PkePlugin_GetSortedSignatures(x)[index], CallbackSignatureLength); } - ImGui::BeginDisabled(); ImGui::InputScalar("Sub-Types", ImGuiDataType_S64, &entityTypeToCreate.detailsCount); ImGui::SameLine(); - if (ImGui::Button("-")) entityTypeToCreate.detailsCount -= 1; + if (ImGui::Button("-")) { + entityTypeToCreate.detailsCount -= 1; + } + entityTypeToCreate.detailsCount = entityTypeToCreate.detailsCount < 1 ? 1 : entityTypeToCreate.detailsCount; ImGui::SameLine(); - if (ImGui::Button("+")) entityTypeToCreate.detailsCount += 1; - ImGui::EndDisabled(); + if (ImGui::Button("+")) { + entityTypeToCreate.detailsCount += 1; + entityTypeToCreate.detailsCount = entityTypeToCreate.detailsCount > EntityTypeDetails_MAX ? EntityTypeDetails_MAX : entityTypeToCreate.detailsCount; + } for (int64_t i = 0; i < entityTypeToCreate.detailsCount; ++i) { auto &etd = entityTypeToCreate.details[i]; @@ -1172,11 +1173,6 @@ void RecordImGuiSceneEditor() { ImGui::Spacing(); if (selectedEntity != nullptr) { - Entity_Base *entity = ECS_GetEntity(selectedEntity->entHandle); - auto *entityType = static_cast<EntityType *>(entity); - if (ImGui::Button("Create Instance")) { - entityInstancesToCreate.Push(entityType); - } static PkeArray<CompGrBinds *> entGrBinds; static PkeArray<CompInstance *> entInstances; bool reset = false; @@ -1193,8 +1189,17 @@ void RecordImGuiSceneEditor() { PkeArray_SoftReset(&entGrBinds); PkeArray_SoftReset(&entInstances); } - ECS_GetGrBinds(ECS_GetEntity(selectedEntity->entHandle), entGrBinds); - ECS_GetInstances(ECS_GetEntity(selectedEntity->entHandle), entInstances); + if (entGrBinds.next == 0) + ECS_GetGrBinds(ECS_GetEntity(selectedEntity->entHandle), entGrBinds); + if (entInstances.next == 0) + ECS_GetInstances(ECS_GetEntity(selectedEntity->entHandle), entInstances); + if (entGrBinds.next > 0) { + if (ImGui::Button("Create Instance")) { + Entity_Base *entity = ECS_GetEntity(selectedEntity->entHandle); + auto *entityType = static_cast<EntityType *>(entity); + entityInstancesToCreate.Push(entityType); + } + } for (int64_t i = 0; i < entGrBinds.next; ++i) { RecordImGui_CompGrBinds(true, entGrBinds.data[i]); } diff --git a/src/array.hpp b/src/array.hpp index 4356e33..f8aa173 100644 --- a/src/array.hpp +++ b/src/array.hpp @@ -60,6 +60,7 @@ inline void PkeArray_Add(PkeArray_Base *arrIn, const D &val, MemBucket *bkt = nu memcpy(arr->data[arr->next++], val, sizeof(D)); } } + template<typename D, typename F = bool(const D&)> inline uint32_t PkeArray_FindFirstIndex(PkeArray_Base *arrIn, F fn) { auto *arr = static_cast<PkeArray<D> *>(arrIn); diff --git a/src/bucketed-array.hpp b/src/bucketed-array.hpp index 5813ca6..b40251c 100644 --- a/src/bucketed-array.hpp +++ b/src/bucketed-array.hpp @@ -43,7 +43,7 @@ inline CT Buckets_NewHandle(BucketContainer<T, CT, BKT_CNT> &bktContainer) { template<typename T, typename CT, PkeHandleBucketIndex_T BKT_CNT> static inline constexpr void Buckets_Destroy(BucketContainer<T, CT, BKT_CNT> &bktContainer) { - for (PkeHandleBucketIndex_T i = 0; i < BKT_CNT; ++i) { + for (PkeHandleBucketIndex_T i = 0; i <= bktContainer.pkeHandle.bucketIndex; ++i) { Pke_Delete<T>(bktContainer.buckets[i], bktContainer.limits.itemIndex); bktContainer.buckets[i] = CAFE_BABE(T); } diff --git a/src/ecs.cpp b/src/ecs.cpp index f499835..c627642 100644 --- a/src/ecs.cpp +++ b/src/ecs.cpp @@ -51,6 +51,7 @@ void ECS_GetEntity_Inner(EntityHandle entHandle, Entity_Base*& ent) { } void ECS_Init() { + Buckets_Init(Entities_GenericsBC, maxBucketItemCount); Buckets_Init(Entities_BucketContainer, maxBucketItemCount); Buckets_Init(Comp_GrBinds_BucketContainer, maxBucketItemCount); Buckets_Init(Comp_Instance_BucketContainer, maxBucketItemCount); @@ -66,7 +67,7 @@ EntityHandle ECS_CreateEntity(Entity_Base *entity, Entity_Base *parentEntity) { assert(entity->handle == EntityHandle_MAX && "Entity already created!"); EntityHandle entityHandle{Buckets_NewHandle(Entities_BucketContainer)}; entity->handle = entityHandle; - entity->parentHandle = parentEntity->handle; + if (parentEntity) entity->parentHandle = parentEntity->handle; Entities_BucketContainer.buckets[entityHandle.bucketIndex][entityHandle.itemIndex] = entity; return entityHandle; } diff --git a/src/entities.cpp b/src/entities.cpp index bd24830..1383ebe 100644 --- a/src/entities.cpp +++ b/src/entities.cpp @@ -38,7 +38,7 @@ EntityType *EntityType_Create() { return &entityType; } -Entity_Base *EntityType_CreateGenericInstance(EntityType *et, CompInstance *srcInstance) { +Entity_Base *EntityType_CreateGenericInstance(EntityType *et, CompInstance *srcInstance, InstPos *instPos) { assert(et != nullptr); Entity_Base *genericEntity = ECS_CreateGenericEntity(); auto *level = PkeLevel_Get(pkeSettings.rt.activeLevel); @@ -48,6 +48,10 @@ Entity_Base *EntityType_CreateGenericInstance(EntityType *et, CompInstance *srcI auto &etd = et->details[i]; auto *compInst = ECS_CreateInstance(genericEntity, etd.grBinds); + btVector3 scaling{1.f,1.f,1.f}; + btTransform posRot{}; + btScalar mass = 1.f; + if (srcInstance != nullptr) { if (srcInstance->collisionCallback.name[0] != '\0') { strncpy(compInst->collisionCallback.name, srcInstance->collisionCallback.name, CallbackSignatureLength); @@ -55,25 +59,34 @@ Entity_Base *EntityType_CreateGenericInstance(EntityType *et, CompInstance *srcI } compInst->physicsLayer = srcInstance->physicsLayer; compInst->physicsMask = srcInstance->physicsMask; + posRot = instPos->posRot; } else { compInst->physicsLayer = etd.bt.startingCollisionLayer; compInst->physicsMask = etd.bt.startingCollisionMask; + posRot.setIdentity(); } + if (instPos != nullptr) { + mass = instPos->mass; + scaling = instPos->scale; + } else { + mass = etd.bt.startingMass; + } + btVector3 localInertia(0, 0, 0); - etd.bt.shape->calculateLocalInertia(etd.bt.startingMass, localInertia); - btTransform posRot{}; - posRot.setIdentity(); + etd.bt.shape->calculateLocalInertia(mass, localInertia); compInst->bt.motionState = Pke_New<btDefaultMotionState>(MemBkt_Bullet); new (compInst->bt.motionState) btDefaultMotionState(posRot); + compInst->bt.rigidBody = Pke_New<btRigidBody>(MemBkt_Bullet); - new (compInst->bt.rigidBody) btRigidBody(etd.bt.startingMass, compInst->bt.motionState, etd.bt.shape, localInertia); + new (compInst->bt.rigidBody) btRigidBody(mass, compInst->bt.motionState, etd.bt.shape, localInertia); + compInst->bt.rigidBody->setLinearVelocity(btVector3(0,0,0)); compInst->bt.rigidBody->setAngularVelocity(btVector3(0,0,0)); - compInst->bt.rigidBody->getCollisionShape()->setLocalScaling(btVector3(1, 1, 1)); + compInst->bt.rigidBody->getCollisionShape()->setLocalScaling(scaling); BtDynamicsWorld->addRigidBody(compInst->bt.rigidBody); compInst->bt.rigidBody->getBroadphaseProxy()->m_collisionFilterGroup = static_cast<PhysicsCollision_T>(compInst->physicsLayer); compInst->bt.rigidBody->getBroadphaseProxy()->m_collisionFilterMask = static_cast<PhysicsCollision_T>(compInst->physicsMask); - compInst->bt.rigidBody->setUserPointer(reinterpret_cast<void *>(compInst->entHandle.hash)); + compInst->bt.rigidBody->setUserPointer(reinterpret_cast<void *>(compInst)); } return genericEntity; } @@ -1034,6 +1047,9 @@ void EntityType_Load(EntityType &et) { assert(gltfData->buffer_views[i].type != cgltf_buffer_view_type_invalid); } + et.detailsCount = gltfData->nodes_count; + assert(et.detailsCount <= EntityTypeDetails_MAX && "Maximum supported number of meshes in gltf is hard-coded, update _MAX if not unreasonable"); + std::filesystem::path gltfPath{asset->basePath}; gltfPath.replace_filename(gltfData->buffers[0].uri); AssetHandle modelBinHandle = AM_Register(gltfPath.c_str(), PKE_ASSET_TYPE_UNSET); diff --git a/src/entities.hpp b/src/entities.hpp index ce680e0..743029d 100644 --- a/src/entities.hpp +++ b/src/entities.hpp @@ -48,7 +48,7 @@ void EntityType_Init(); EntityType *EntityType_FindByTypeCode(const char *typeCode); EntityType *EntityType_FindByEntityHandle(EntityHandle handle); EntityType *EntityType_Create(); -Entity_Base *EntityType_CreateGenericInstance(EntityType *et, CompInstance *srcInstance = nullptr); +Entity_Base *EntityType_CreateGenericInstance(EntityType *et, CompInstance *srcInstance = nullptr, InstPos *instPos = nullptr); void EntityType_Load(EntityType &et); void EntityType_Tick(double delta); void EntityType_Tick_Late(double delta); diff --git a/src/game.cpp b/src/game.cpp index 97bc247..4d556b2 100644 --- a/src/game.cpp +++ b/src/game.cpp @@ -15,6 +15,7 @@ #include "player-input.hpp" #include "plugins.hpp" #include "project.hpp" +#include "thread_pool.hpp" #include "vendor/glm_include.hpp" #include "window.hpp" @@ -252,7 +253,7 @@ void ParseInstance(Entity_Base *parentEntity, std::ifstream &stream) { if (etPtr->createInstanceCallback.func != nullptr) { reinterpret_cast<void(*)()>(etPtr->createInstanceCallback.func)(); } else { - EntityType_CreateGenericInstance(etPtr, &comp); + EntityType_CreateGenericInstance(etPtr, &comp, &instPos); fprintf(stdout ,"[Game::ParseInstance] No callback func to create instance."); } break; @@ -497,14 +498,16 @@ void Game_Main(PKEWindowProperties windowProps, const char *executablePath) { pkeSettings.executablePath = executablePath; fprintf(stdout, "Game_Main Entering\n"); try { + PkeThreads_Init(); AM_Init(); + PkeLevel_Init(); PkeCamera_Init(); Physics_Init(); Game_Init(); ECS_Init(); + CreateWindow(windowProps); EntityType_Init(); PkeProject_Load(pkeSettings.args.projectPath); - CreateWindow(windowProps); PkeInput_Init(); if (pkeSettings.args.pluginPath != nullptr) { PkePlugin_Load(pkeSettings.args.pluginPath); @@ -619,6 +622,7 @@ void Game_Main(PKEWindowProperties windowProps, const char *executablePath) { AM_DebugPrint(); AM_Teardown(); DestroyWindow(); + PkeThreads_Teardown(); Pke_DebugPrint(); fprintf(stdout, "Game_Main Exiting\n"); } diff --git a/src/level-types.hpp b/src/level-types.hpp index 0809572..42c169b 100644 --- a/src/level-types.hpp +++ b/src/level-types.hpp @@ -13,7 +13,7 @@ struct LvlCamArr : public PkeArray<CameraHandle> { }; struct PkeLevel : public Entity_Base { MemBucket *bkt = nullptr; - char name[16] = {}; + char name[16] = {'\0'}; LevelHandle levelHandle = LevelHandle_MAX; LvlCamArr cameras; }; diff --git a/src/level.cpp b/src/level.cpp index d4e4075..3d6b951 100644 --- a/src/level.cpp +++ b/src/level.cpp @@ -18,6 +18,13 @@ PkeLevel *PkeLevel_Get_Inner(LevelHandle handle) { return nullptr; } +void PkeLevel_Init() { + for (long i = 0; i < MAX_LEVEL_COUNT; ++i) { + new (&LEVELS[i]) PkeLevel{}; + PkeArray_HardReset<CameraHandle>(&LEVELS[i].cameras); + } +} + LevelHandle PkeLevel_Create(const char *levelName) { assert(levelCount < MAX_LEVEL_COUNT && "only MAX_LEVEL_COUNT levels can be loaded at once"); levelCount += 1; diff --git a/src/level.hpp b/src/level.hpp index ae454a5..58cdcd3 100644 --- a/src/level.hpp +++ b/src/level.hpp @@ -6,6 +6,7 @@ constexpr long MAX_LEVEL_COUNT = 16; extern PkeLevel LEVELS[]; +void PkeLevel_Init(); LevelHandle PkeLevel_Create(const char *levelName); PkeLevel *PkeLevel_Get(LevelHandle handle); LevelHandle PkeLevel_GetHandle(const char *levelName); diff --git a/src/thread_pool.cpp b/src/thread_pool.cpp index 4a67054..0fc9880 100644 --- a/src/thread_pool.cpp +++ b/src/thread_pool.cpp @@ -124,10 +124,11 @@ void inline PkeThreads_Shutdown_Inner(ThreadPool &tp) { tp.mutex.unlock(); } +void PkeThreads_Init() { + Buckets_Init(ThreadPool_BucketContainer, MAX_THREADS_PER_BUCKET); +} + ThreadPoolHandle PkeThreads_Init(uint8_t threadCount, uint8_t maxQueueCount, MemBucket *bkt) { - if (ThreadPool_BucketContainer.pkeHandle.hash == 0) { - Buckets_Init(ThreadPool_BucketContainer, MAX_THREADS_PER_BUCKET); - } assert(threadCount > 0); ThreadPoolHandle newHandle{Buckets_NewHandle(ThreadPool_BucketContainer)}; @@ -210,3 +211,7 @@ void PkeThreads_Teardown(ThreadPoolHandle handle) { tp->threads = CAFE_BABE(DynArray<std::thread>); tp->bkt = CAFE_BABE(MemBucket); } + +void PkeThreads_Teardown() { + Buckets_Destroy(ThreadPool_BucketContainer); +} diff --git a/src/thread_pool.hpp b/src/thread_pool.hpp index a2c48f7..4eb2fc8 100644 --- a/src/thread_pool.hpp +++ b/src/thread_pool.hpp @@ -11,6 +11,7 @@ struct ThreadPoolHandle : public PkeHandle { }; constexpr ThreadPoolHandle ThreadPoolHandle_MAX = ThreadPoolHandle{}; +void PkeThreads_Init(); ThreadPoolHandle PkeThreads_Init (uint8_t threadCount, uint8_t maxQueueCount, MemBucket *bkt = nullptr); void PkeThreads_Reset (ThreadPoolHandle handle); bool PkeThreads_Enqueue (ThreadPoolHandle handle, std::packaged_task<void()> *job); @@ -18,6 +19,7 @@ int64_t PkeThreads_GetQueueCount (ThreadPoolHandle handle); void PkeThreads_Pause (ThreadPoolHandle handle); void PkeThreads_Resume (ThreadPoolHandle handle); void PkeThreads_Shutdown (ThreadPoolHandle handle); +void PkeThreads_Teardown (); void PkeThreads_Teardown (ThreadPoolHandle handle); #endif /* PKE_THREADING_HPP */ |
