summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--editor/editor.cpp37
-rw-r--r--src/array.hpp1
-rw-r--r--src/bucketed-array.hpp2
-rw-r--r--src/ecs.cpp3
-rw-r--r--src/entities.cpp30
-rw-r--r--src/entities.hpp2
-rw-r--r--src/game.cpp8
-rw-r--r--src/level-types.hpp2
-rw-r--r--src/level.cpp7
-rw-r--r--src/level.hpp1
-rw-r--r--src/thread_pool.cpp11
-rw-r--r--src/thread_pool.hpp2
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 */