summaryrefslogtreecommitdiff
path: root/src/ecs.cpp
diff options
context:
space:
mode:
authorJonathan Bradley <jcb@pikum.xyz>2023-10-20 21:30:40 -0400
committerJonathan Bradley <jcb@pikum.xyz>2023-11-15 13:11:07 -0500
commitb9693565a4ccbf8767ab5fba931f4efa89082c83 (patch)
treee1fcc2abc7ac469168b7cb7bf04cc549507f7dd1 /src/ecs.cpp
parent5ec6a1a0e36a4a035c0adcf2993f2c435c59db27 (diff)
checkpoint - physics is working but messy
Diffstat (limited to 'src/ecs.cpp')
-rw-r--r--src/ecs.cpp62
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() {