diff options
| author | Jonathan Bradley <jcb@pikum.xyz> | 2023-10-20 21:30:40 -0400 |
|---|---|---|
| committer | Jonathan Bradley <jcb@pikum.xyz> | 2023-11-15 13:11:07 -0500 |
| commit | b9693565a4ccbf8767ab5fba931f4efa89082c83 (patch) | |
| tree | e1fcc2abc7ac469168b7cb7bf04cc549507f7dd1 /src/ecs.cpp | |
| parent | 5ec6a1a0e36a4a035c0adcf2993f2c435c59db27 (diff) | |
checkpoint - physics is working but messy
Diffstat (limited to 'src/ecs.cpp')
| -rw-r--r-- | src/ecs.cpp | 62 |
1 files changed, 61 insertions, 1 deletions
diff --git a/src/ecs.cpp b/src/ecs.cpp index 3c5cbdb..831adfb 100644 --- a/src/ecs.cpp +++ b/src/ecs.cpp @@ -1,12 +1,18 @@ #include "ecs.hpp" +#include "game-settings.hpp" #include "memory.hpp" #include "vendor/glm_include.hpp" #include "window.hpp" #include <btBulletDynamicsCommon.h> +#define GLM_TO_BULLET_VEC_3(vec) btVector3(vec.x, vec.y, vec.z) +#define GLM_TO_BULLET_QUAT(quat) btQuaternion(quat.x, quat.y, quat.z, quat.w) +#define BULLET_TO_GLM_VEC_3(vec) glm::vec3(vec.getX(), vec.getY(), vec.getZ()) +#define BULLET_TO_GLM_QUAT(qt) glm::quat(qt.getW(), qt.getX(), qt.getY(), qt.getZ()) + TypeSafeInt_B(EntityHandle); const uint64_t maxBucketItemCount = 256; @@ -178,6 +184,29 @@ void ECS_Tick_Early(double delta) { entitiesMarkedForRemoval.Resize(0); } +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]; + btTransform trans; + inst.bt.defaultMotionState.getWorldTransform(trans); + + InstPos instPos = inst.instPos; + instPos.pos = BULLET_TO_GLM_VEC_3(trans.getOrigin()); + instPos.rot = BULLET_TO_GLM_QUAT(trans.getRotation()); + // TODO add an _INNER since we have a reference to the object that this looks up + ECS_UpdateInstance(inst.entHandle, instPos, false); + } + } + } + } +} + struct InstanceBufferCopyChunk { uint64_t startingIndex; uint64_t endingIndex; @@ -374,6 +403,22 @@ CompInstance &ECS_CreateInstance(EntityHandle entHandle, EntityHandle entityType if (grBinds->instanceCounter > grBinds->instanceBufferMaxCount) { 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(GLM_TO_BULLET_VEC_3(comp->instPos.scale)); + comp->bt.collisionShape->calculateLocalInertia(btScalar(1.f), comp->bt.localInertia); + btTransform transform; + transform.setIdentity(); + transform.setOrigin(GLM_TO_BULLET_VEC_3(comp->instPos.pos)); + comp->bt.defaultMotionState = btDefaultMotionState(transform); + comp->bt.rigidBody = Pke_New<btRigidBody>(bulletBucket); + new (comp->bt.rigidBody) btRigidBody(btScalar(1.f), &comp->bt.defaultMotionState, comp->bt.collisionShape, comp->bt.localInertia); + btDynamicsWorld->addRigidBody(comp->bt.rigidBody); + comp->bt.rigidBody->setUserPointer(reinterpret_cast<void *>(comp->entHandle)); + } + return *comp; } @@ -392,7 +437,7 @@ CompInstance *ECS_GetInstance(EntityHandle entHandle) { return inst; } -void ECS_UpdateInstance(EntityHandle entHandle, const InstPos &instPos) { +void ECS_UpdateInstance(EntityHandle entHandle, const InstPos &instPos, bool overridePhysics) { Entity *ent = nullptr; ECS_GetEntity_Inner(entHandle, ent); @@ -404,10 +449,25 @@ void ECS_UpdateInstance(EntityHandle entHandle, const InstPos &instPos) { auto i = Buckets_GetItemIndex(instanceHandle_t); auto *inst = &Comp_Instance_BucketContainer.buckets[b].instances[i]; + if (overridePhysics == false + && instPos.pos == inst->instPos.pos + && instPos.rot == inst->instPos.rot + && instPos.scale == inst->instPos.scale) { + return; + } + inst->instPos.pos = instPos.pos; inst->instPos.rot = instPos.rot; inst->instPos.scale = instPos.scale; inst->isNeedingUpdated = true; + + if (overridePhysics == true && btDynamicsWorld) { + btTransform transform; + transform.setIdentity(); + transform.setOrigin(GLM_TO_BULLET_VEC_3(inst->instPos.pos)); + transform.setRotation(GLM_TO_BULLET_QUAT(inst->instPos.rot)); + inst->bt.rigidBody->setWorldTransform(transform); + } } uint64_t ECS_GetInstances_BucketCount() { |
