diff options
| author | Jonathan Bradley <jcb@pikum.xyz> | 2023-10-31 12:46:09 -0400 |
|---|---|---|
| committer | Jonathan Bradley <jcb@pikum.xyz> | 2023-11-15 13:13:25 -0500 |
| commit | f2c808b1235b9d76e4d4753c025f404e7736ca3c (patch) | |
| tree | 34100f4a05d6feb40474c50f1d3539611b0016ba /src/ecs.cpp | |
| parent | 18e65823663af6e2a1472b66486526a23d5e9c30 (diff) | |
use model for collision + refactor physics init and rigidbody creation
Diffstat (limited to 'src/ecs.cpp')
| -rw-r--r-- | src/ecs.cpp | 74 |
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(); |
