summaryrefslogtreecommitdiff
path: root/src/camera.cpp
diff options
context:
space:
mode:
authorJonathan Bradley <jcb@pikum.xyz>2024-01-18 22:37:02 -0500
committerJonathan Bradley <jcb@pikum.xyz>2024-01-18 22:37:02 -0500
commit1b48d1382d2d57a822201f34743a51813798b348 (patch)
tree612672a4be654b38f3b44580f85e4f0637952512 /src/camera.cpp
parent2e680ebd77236f7b62b9ded1b083c86f9e13b1c8 (diff)
camera checkpoint - large refactor for attempting to let physics own camera position
Diffstat (limited to 'src/camera.cpp')
-rw-r--r--src/camera.cpp77
1 files changed, 49 insertions, 28 deletions
diff --git a/src/camera.cpp b/src/camera.cpp
index 984f106..f033824 100644
--- a/src/camera.cpp
+++ b/src/camera.cpp
@@ -10,14 +10,12 @@
PkeCamera NullCamera {
.camHandle = CameraHandle_MAX,
- .pos = glm::vec3(3.f, 3.f, 3.f),
- .rot = glm::quat(1.f, 0.f, 0.f, 0.f),
- .target = glm::vec3(0.f),
.type = PKE_CAMERA_TYPE_ORTHOGONAL,
.view = PKE_CAMERA_VIEW_TARGET,
.stale = PKE_CAMERA_STALE_ALL,
.phys = {
.inst = nullptr,
+ .targetInst = nullptr,
.constraint = nullptr,
},
};
@@ -28,16 +26,7 @@ BucketContainer<PkeCamera, CameraHandle> Camera_BucketContainer{};
btSphereShape CameraShape{1.f};
-PkeCamera &PkeCamera_Register(const InstPos &instPos) {
- CameraHandle cameraHandle{Buckets_NewHandle(Camera_BucketContainer)};
-
- auto &cam = Camera_BucketContainer.buckets[cameraHandle.bucketIndex][cameraHandle.itemIndex];
- new (&cam) PkeCamera{};
-
- ECS_CreateEntity(&cam, nullptr);
- cam.camHandle = cameraHandle;
- cam.phys.inst = ECS_CreateInstance(&cam, nullptr);
-
+PkeCamera &PkeCamera_Register_Inner(PkeCamera &cam, const InstPos &instPos) {
btVector3 gravity(0.f, 0.f, 0.f);
cam.phys.inst->physicsLayer = PhysicsCollision{0};
@@ -63,11 +52,38 @@ PkeCamera &PkeCamera_Register(const InstPos &instPos) {
return cam;
}
+PkeCamera &PkeCamera_Register(const InstPos &instPos) {
+ CameraHandle cameraHandle{Buckets_NewHandle(Camera_BucketContainer)};
+
+ auto &cam = Camera_BucketContainer.buckets[cameraHandle.bucketIndex][cameraHandle.itemIndex];
+ new (&cam) PkeCamera{};
+
+ ECS_CreateEntity(&cam, nullptr);
+ cam.camHandle = cameraHandle;
+ cam.phys.inst = ECS_CreateInstance(&cam, nullptr);
+
+ return PkeCamera_Register_Inner(cam, instPos);
+}
+
PkeCamera *PkeCamera_Get(CameraHandle cameraHandle) {
assert(cameraHandle != CameraHandle_MAX);
return &Camera_BucketContainer.buckets[cameraHandle.bucketIndex][cameraHandle.itemIndex];
}
+PkeCamera *PkeCamera_Get(EntityHandle handle) {
+ assert(handle != EntityHandle_MAX);
+ for (PkeHandleBucketIndex_T b = 0; b <= Camera_BucketContainer.pkeHandle.bucketIndex; ++b) {
+ auto &bkt = Camera_BucketContainer.buckets[b];
+ long itemCount = Camera_BucketContainer.pkeHandle.bucketIndex == b ? Camera_BucketContainer.pkeHandle.itemIndex : Camera_BucketContainer.limits.itemIndex;
+ for (PkeHandleItemIndex_T i = 0; i < itemCount; ++i) {
+ auto &cam = bkt[i];
+ if (cam.handle == handle)
+ return &Camera_BucketContainer.buckets[cam.camHandle.bucketIndex][cam.camHandle.itemIndex];
+ }
+ }
+ return nullptr;
+}
+
void PkeCamera_AttachToInstance(CameraHandle cameraHandle, CompInstance *inst) {
assert(cameraHandle != CameraHandle_MAX);
auto &cam = Camera_BucketContainer.buckets[cameraHandle.bucketIndex][cameraHandle.itemIndex];
@@ -81,10 +97,9 @@ void PkeCamera_AttachToInstance(CameraHandle cameraHandle, CompInstance *inst) {
btTransform trfm;
inst->bt.motionState->getWorldTransform(trfm);
- BulletToGlm(trfm.getOrigin(), cam.target);
trfm.setOrigin(trfm.getOrigin() + cameraOffset);
- BulletToGlm(trfm.getOrigin(), cam.pos);
+ cam.phys.targetInst = inst;
cam.phys.inst->bt.motionState->setWorldTransform(trfm);
cam.phys.inst->bt.rigidBody->setWorldTransform(trfm);
cam.phys.inst->bt.rigidBody->setLinearVelocity(btVector3(0,0,0));
@@ -93,7 +108,7 @@ void PkeCamera_AttachToInstance(CameraHandle cameraHandle, CompInstance *inst) {
assert(cam.phys.constraint == nullptr || cam.phys.constraint == CAFE_BABE(btTypedConstraint));
cam.phys.constraint = Pke_New<btTypedConstraint>(MemBkt_Bullet);
- new (cam.phys.constraint) btPoint2PointConstraint(*cam.phys.inst->bt.rigidBody, *inst->bt.rigidBody, btVector3(0.f, 0.f, 0.f), cameraOffset);
+ new (cam.phys.constraint) btPoint2PointConstraint(*cam.phys.inst->bt.rigidBody, *inst->bt.rigidBody, btVector3(0.f, -1.f, -1.f), cameraOffset);
BtDynamicsWorld->addConstraint(cam.phys.constraint);
cam.view = PKE_CAMERA_VIEW_TARGET;
@@ -122,13 +137,11 @@ void PkeCamera_Destroy(CameraHandle cameraHandle) {
ECS_MarkForRemoval(camPtr);
cam.camHandle = CameraHandle_MAX;
- cam.pos = glm::vec3(0);
- cam.rot = glm::quat{};
- cam.target = glm::vec3(0);
cam.type = PkeCameraType_MAX;
cam.view = PkeCameraView_MAX;
cam.stale = PkeCameraStaleFlags_MAX;
cam.phys.inst = CAFE_BABE(CompInstance);
+ cam.phys.targetInst = CAFE_BABE(CompInstance);
cam.phys.constraint = CAFE_BABE(btTypedConstraint);
}
@@ -147,10 +160,23 @@ PkeCamera *PkeCamera_GetCameras(int64_t bucketIndex, int64_t &count) {
void PkeCamera_Init() {
Buckets_Init(Camera_BucketContainer, MAX_CAMERAS_PER_BUCKET);
+ NullCamera.phys.inst = Pke_New<CompInstance>();
+ InstPos instPos{
+ .scale = btVector3(1.f, 1.f, 1.f),
+ .mass = 1.f,
+ };
+ PkeCamera_Register_Inner(NullCamera, instPos);
}
void PkeCamera_Teardown() {
Buckets_Destroy(Camera_BucketContainer);
+ BtDynamicsWorld->removeRigidBody(NullCamera.phys.inst->bt.rigidBody);
+ Pke_Delete<btDefaultMotionState>(NullCamera.phys.inst->bt.motionState, MemBkt_Bullet);
+ Pke_Delete<btRigidBody>(NullCamera.phys.inst->bt.rigidBody, MemBkt_Bullet);
+ NullCamera.phys.inst->bt.motionState = CAFE_BABE(btDefaultMotionState);
+ NullCamera.phys.inst->bt.rigidBody = CAFE_BABE(btRigidBody);
+ Pke_Delete<CompInstance>(NullCamera.phys.inst);
+ NullCamera.phys.inst = CAFE_BABE(CompInstance);
}
void PkeCamera_Tick(double delta) {
@@ -172,18 +198,13 @@ void PkeCamera_Tick(double delta) {
if (cam.handle == EntityHandle_MAX) {
continue;
}
- btTransform trfm;
- if (cam.phys.constraint != nullptr && cam.phys.constraint != CAFE_BABE(btTypedConstraint)) {
- cam.phys.constraint->getRigidBodyB().getMotionState()->getWorldTransform(trfm);
- BulletToGlm(trfm.getOrigin(), cam.target);
- }
- if (cam.phys.inst != nullptr && cam.phys.inst != CAFE_BABE(CompInstance)) {
- cam.phys.inst->bt.motionState->getWorldTransform(trfm);
- BulletToGlm(trfm.getOrigin(), cam.pos);
- BulletToGlm(trfm.getRotation(), cam.rot);
+ if (cam.phys.inst != nullptr && cam.phys.inst != CAFE_BABE(CompInstance) && cam.phys.inst->isNeedingUpdated == true) {
cam.stale = cam.stale | PKE_CAMERA_STALE_POSROT;
cam.phys.inst->isNeedingUpdated = false;
}
+ if (cam.phys.targetInst != nullptr && cam.phys.targetInst != CAFE_BABE(CompInstance) && cam.phys.targetInst->isNeedingUpdated == true) {
+ cam.stale = cam.stale | PKE_CAMERA_STALE_POSROT;
+ }
}
}
}