summaryrefslogtreecommitdiff
path: root/src/ecs.cpp
diff options
context:
space:
mode:
authorJonathan Bradley <jcb@pikum.xyz>2023-10-31 12:46:09 -0400
committerJonathan Bradley <jcb@pikum.xyz>2023-11-15 13:13:25 -0500
commitf2c808b1235b9d76e4d4753c025f404e7736ca3c (patch)
tree34100f4a05d6feb40474c50f1d3539611b0016ba /src/ecs.cpp
parent18e65823663af6e2a1472b66486526a23d5e9c30 (diff)
use model for collision + refactor physics init and rigidbody creation
Diffstat (limited to 'src/ecs.cpp')
-rw-r--r--src/ecs.cpp74
1 files changed, 19 insertions, 55 deletions
diff --git a/src/ecs.cpp b/src/ecs.cpp
index b5b0ce4..654bc71 100644
--- a/src/ecs.cpp
+++ b/src/ecs.cpp
@@ -4,10 +4,12 @@
#include "game-settings.hpp"
#include "math-helpers.hpp"
#include "memory.hpp"
+#include "physics.hpp"
#include "vendor/glm_include.hpp"
#include "window.hpp"
#include <btBulletDynamicsCommon.h>
+#include <BulletCollision/CollisionShapes/btConvexHullShape.h>
#include <glm/gtc/type_ptr.hpp>
TypeSafeInt_B(EntityHandle);
@@ -34,13 +36,6 @@ BucketContainer<EntityBucket, EntityHandle_T> Entities_BucketContainer{};
BucketContainer<GrBindsBucket, GrBindsHandle_T> Comp_GrBinds_BucketContainer{};
BucketContainer<InstanceBucket, InstanceHandle_T> Comp_Instance_BucketContainer{};
-MemBucket *bulletBucket = nullptr;
-btDefaultCollisionConfiguration *btConfiguration = nullptr;
-btCollisionDispatcher *btDispatcher = nullptr;
-btBroadphaseInterface *btBroadphase = nullptr;
-btConstraintSolver *btSolver = nullptr;
-btDiscreteDynamicsWorld *btDynamicsWorld = nullptr;
-
void ECS_GetEntity_Inner(EntityHandle entHandle, Entity*& ent) {
EntityHandle_T entHandle_t{static_cast<EntityHandle_T>(entHandle)};
assert(entHandle_t != EntityHandle_T_MAX && "Unknown entity handle");
@@ -53,19 +48,6 @@ void ECS_Init() {
Buckets_Init(Entities_BucketContainer);
Buckets_Init(Comp_GrBinds_BucketContainer);
Buckets_Init(Comp_Instance_BucketContainer);
- // bullet
- {
- bulletBucket = Pke_BeginTransientBucket();
- btConfiguration = Pke_New<btDefaultCollisionConfiguration>(bulletBucket);
- btDispatcher = Pke_New<btCollisionDispatcher>(bulletBucket);
- new (btDispatcher) btCollisionDispatcher(btConfiguration);
- btBroadphase = Pke_New<btDbvtBroadphase>(bulletBucket);
- btSolver = Pke_New<btSequentialImpulseConstraintSolver>(bulletBucket);
- btDynamicsWorld = Pke_New<btDiscreteDynamicsWorld>(bulletBucket);
- new (btDynamicsWorld) btDiscreteDynamicsWorld(btDispatcher, btBroadphase, btSolver, btConfiguration);
- auto grav = btDynamicsWorld->getGravity();
- btDynamicsWorld->setGravity(btVector3(grav.getX(), grav.getZ(), grav.getY()));
- }
}
uint64_t ECS_GetEntities_BucketCount() {
@@ -182,20 +164,18 @@ void ECS_Tick_Early(double delta) {
}
void ECS_Tick(double delta) {
- if (btDynamicsWorld && pkeSettings.isSimulationPaused == false) {
- auto physicsTickCount = btDynamicsWorld->stepSimulation(delta, 0);
- if (physicsTickCount != 0) {
- for (long b = 0; b <= Comp_Instance_BucketContainer.bucketCounter; ++b) {
- auto &bkt = Comp_Instance_BucketContainer.buckets[b];
- long count = Comp_Instance_BucketContainer.bucketCounter == b ? Comp_Instance_BucketContainer.itemCounter >> 32 : maxBucketItemCount;
- for (uint32_t i = 0; i < count; ++i) {
- auto &inst = bkt.instances[i];
- auto activationState = inst.bt.rigidBody->getActivationState();
- if (activationState == ISLAND_SLEEPING || activationState == DISABLE_SIMULATION || activationState == WANTS_DEACTIVATION) {
- continue;
- }
- inst.isNeedingUpdated = true;
+ int32_t physicsTickCount = Physics_Tick(delta);
+ if (physicsTickCount != 0) {
+ for (long b = 0; b <= Comp_Instance_BucketContainer.bucketCounter; ++b) {
+ auto &bkt = Comp_Instance_BucketContainer.buckets[b];
+ long count = Comp_Instance_BucketContainer.bucketCounter == b ? Comp_Instance_BucketContainer.itemCounter >> 32 : maxBucketItemCount;
+ for (uint32_t i = 0; i < count; ++i) {
+ auto &inst = bkt.instances[i];
+ auto activationState = inst.bt.rigidBody->getActivationState();
+ if (activationState == ISLAND_SLEEPING || activationState == DISABLE_SIMULATION || activationState == WANTS_DEACTIVATION) {
+ continue;
}
+ inst.isNeedingUpdated = true;
}
}
}
@@ -258,13 +238,13 @@ void ECS_Tick_Late(double delta) {
}
btTransform btMatrix_posRot;
- inst.bt.defaultMotionState.getWorldTransform(btMatrix_posRot);
+ inst.bt.motionState->getWorldTransform(btMatrix_posRot);
float openglMatrix[16];
btMatrix_posRot.getOpenGLMatrix(openglMatrix);
glm::mat4 glmMat_posRot = glm::make_mat4(openglMatrix);
glm::vec3 scale;
- BulletToGlm(inst.bt.collisionShape->getLocalScaling(), scale);
+ BulletToGlm(inst.bt.rigidBody->getCollisionShape()->getLocalScaling(), scale);
chunk->mats.Push(glm::scale(glmMat_posRot, scale));
bfrUpdate->runningSize += sizeof(glm::mat4);
@@ -365,7 +345,7 @@ CompGrBinds *ECS_GetGrBinds(uint64_t bucketIndex, uint64_t &itemCount) {
return Comp_GrBinds_BucketContainer.buckets[bucketIndex].compGrBinds;
}
-CompInstance &ECS_CreateInstance(EntityHandle entHandle, EntityHandle entityTypeEntityHandle, const InstPos &instPos) {
+CompInstance &ECS_CreateInstance(EntityHandle entHandle, EntityHandle entityTypeEntityHandle) {
assert(entHandle != EntityHandle_MAX);
assert(entityTypeEntityHandle != EntityHandle_MAX);
@@ -401,20 +381,6 @@ CompInstance &ECS_CreateInstance(EntityHandle entHandle, EntityHandle entityType
EntitiesWithExcessInstances.Push(grBinds->entHandle);
}
- if (btDynamicsWorld) {
- comp->bt.localInertia = btVector3(0, 0, 0);
- comp->bt.collisionShape = Pke_New<btBoxShape>(bulletBucket);
- new (comp->bt.collisionShape) btBoxShape(instPos.scale);
- comp->bt.collisionShape->calculateLocalInertia(btScalar(1.f), comp->bt.localInertia);
- comp->bt.defaultMotionState = btDefaultMotionState(instPos.posRot);
- comp->bt.rigidBody = Pke_New<btRigidBody>(bulletBucket);
- new (comp->bt.rigidBody) btRigidBody(btScalar(1.f), &comp->bt.defaultMotionState, comp->bt.collisionShape, comp->bt.localInertia);
- comp->bt.rigidBody->setLinearVelocity(btVector3(0,0,0));
- comp->bt.rigidBody->setAngularVelocity(btVector3(0,0,0));
- btDynamicsWorld->addRigidBody(comp->bt.rigidBody);
- comp->bt.rigidBody->setUserPointer(reinterpret_cast<void *>(comp->entHandle));
- }
-
return *comp;
}
@@ -445,14 +411,13 @@ void ECS_UpdateInstance(EntityHandle entHandle, const InstPos &instPos, bool ove
auto i = Buckets_GetItemIndex(instanceHandle_t);
auto *inst = &Comp_Instance_BucketContainer.buckets[b].instances[i];
- if (btDynamicsWorld && overridePhysics) {
+ if (BtDynamicsWorld && overridePhysics) {
inst->bt.rigidBody->setWorldTransform(instPos.posRot);
- inst->bt.collisionShape->setLocalScaling(instPos.scale);
+ inst->bt.rigidBody->getCollisionShape()->setLocalScaling(instPos.scale);
inst->bt.rigidBody->setLinearVelocity(btVector3(0,0,0));
inst->bt.rigidBody->setAngularVelocity(btVector3(0,0,0));
- btDynamicsWorld->getPairCache()->cleanProxyFromPairs(inst->bt.rigidBody->getBroadphaseProxy(), btDynamicsWorld->getDispatcher());
+ BtDynamicsWorld->getPairCache()->cleanProxyFromPairs(inst->bt.rigidBody->getBroadphaseProxy(), BtDynamicsWorld->getDispatcher());
inst->bt.rigidBody->activate();
-
inst->isNeedingUpdated = true;
}
}
@@ -471,7 +436,6 @@ CompInstance *ECS_GetInstances(uint64_t bucketIndex, uint64_t &itemCount) {
}
void ECS_Teardown() {
- Pke_EndTransientBucket(bulletBucket);
EntitiesWithExcessInstances.~DynArray();
entitiesYetToBeRemoved.~DynArray();
EntitiesToBeRemoved.~DynArray();