diff options
| author | Jonathan Bradley <jcb@pikum.xyz> | 2024-01-18 22:37:02 -0500 |
|---|---|---|
| committer | Jonathan Bradley <jcb@pikum.xyz> | 2024-01-18 22:37:02 -0500 |
| commit | 1b48d1382d2d57a822201f34743a51813798b348 (patch) | |
| tree | 612672a4be654b38f3b44580f85e4f0637952512 /src/camera.cpp | |
| parent | 2e680ebd77236f7b62b9ded1b083c86f9e13b1c8 (diff) | |
camera checkpoint - large refactor for attempting to let physics own camera position
Diffstat (limited to 'src/camera.cpp')
| -rw-r--r-- | src/camera.cpp | 77 |
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; + } } } } |
