summaryrefslogtreecommitdiff
path: root/src/camera.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/camera.cpp')
-rw-r--r--src/camera.cpp33
1 files changed, 19 insertions, 14 deletions
diff --git a/src/camera.cpp b/src/camera.cpp
index ef00b6e..134e9f7 100644
--- a/src/camera.cpp
+++ b/src/camera.cpp
@@ -12,7 +12,10 @@ PkeCamera NullCamera {};
CompInstance NullCameraInstance{};
PkeCamera *ActiveCamera = &NullCamera;
-pk_bkt_arr_t<PkeCamera> bktc_cameras{};
+struct pke_camera_master {
+ pk_membucket *bkt;
+ pk_bkt_arr_t<PkeCamera> bktc_cameras{};
+} cam_mstr;
btSphereShape CameraShape{1.f};
@@ -45,10 +48,10 @@ PkeCamera &PkeCamera_Register_Inner(PkeCamera &cam, CompInstance &inst, const In
}
PkeCamera &PkeCamera_Register(pk_uuid uuid, const InstPos &instPos) {
- CameraHandle cameraHandle{pk_bkt_arr_new_handle(&bktc_cameras)};
+ CameraHandle cameraHandle{pk_bkt_arr_new_handle(&cam_mstr.bktc_cameras)};
CompInstance *inst;
- auto &cam = bktc_cameras[cameraHandle];
+ auto &cam = cam_mstr.bktc_cameras[cameraHandle];
new (&cam) PkeCamera{};
cam.uuid = uuid;
@@ -61,7 +64,7 @@ PkeCamera &PkeCamera_Register(pk_uuid uuid, const InstPos &instPos) {
PkeCamera *PkeCamera_Get(CameraHandle cameraHandle) {
assert(cameraHandle != CameraHandle_MAX);
- return &bktc_cameras[cameraHandle];
+ return &cam_mstr.bktc_cameras[cameraHandle];
}
PkeCamera *PkeCamera_Get(EntityHandle handle) {
@@ -72,16 +75,16 @@ PkeCamera *PkeCamera_Get(EntityHandle handle) {
(void)user_obj_data;
return arr_obj_data->handle == handle;
};
- pk_bkt_arr_handle cam_handle = pk_bkt_arr_find_first_handle(&bktc_cameras, &CamFindFn::invoke, &cam_find_cb, NULL);
+ pk_bkt_arr_handle cam_handle = pk_bkt_arr_find_first_handle(&cam_mstr.bktc_cameras, &CamFindFn::invoke, &cam_find_cb, NULL);
if (cam_handle == CameraHandle_MAX) {
return nullptr;
}
- return &bktc_cameras[cam_handle];
+ return &cam_mstr.bktc_cameras[cam_handle];
}
void PkeCamera_TargetInstance(CameraHandle cameraHandle, CompInstance *inst) {
assert(cameraHandle != CameraHandle_MAX);
- auto &cam = bktc_cameras[cameraHandle];
+ auto &cam = cam_mstr.bktc_cameras[cameraHandle];
CompInstance *selfInstance = ECS_GetInstance(cam.phys.instHandle);
if (cam.phys.constraint != nullptr && cam.phys.constraint != CAFE_BABE(btTypedConstraint)) {
@@ -131,7 +134,7 @@ void PkeCamera_TargetInstance(CameraHandle cameraHandle, CompInstance *inst) {
void PkeCamera_UntargetInstance(CameraHandle cameraHandle) {
assert(cameraHandle != CameraHandle_MAX);
- auto &cam = bktc_cameras[cameraHandle];
+ auto &cam = cam_mstr.bktc_cameras[cameraHandle];
BtDynamicsWorld->removeConstraint(cam.phys.constraint);
pk_delete<btTypedConstraint>(cam.phys.constraint, MemBkt_Bullet);
cam.phys.constraint = CAFE_BABE(btTypedConstraint);
@@ -150,12 +153,12 @@ void PkeCamera_SetPrimary(CameraHandle cameraHandle) {
// Instead, should be a per-viewport or per-world check?
cam.isPrimary = (cam.camHandle == handle);
};
- pk_bkt_arr_iterate(&bktc_cameras, check_stale, &cameraHandle);
+ pk_bkt_arr_iterate(&cam_mstr.bktc_cameras, check_stale, &cameraHandle);
}
void PkeCamera_Destroy(CameraHandle cameraHandle) {
assert(cameraHandle != CameraHandle_MAX);
- auto *camPtr = &bktc_cameras[cameraHandle];
+ auto *camPtr = &cam_mstr.bktc_cameras[cameraHandle];
auto &cam = *camPtr;
if (cam.phys.constraint != nullptr && cam.phys.constraint != CAFE_BABE(btTypedConstraint)) {
@@ -175,11 +178,12 @@ void PkeCamera_Destroy(CameraHandle cameraHandle) {
}
pk_bkt_arr &PkeCamera_GetPkBktArr() {
- return bktc_cameras;
+ return cam_mstr.bktc_cameras;
}
void PkeCamera_Init() {
- new (&bktc_cameras) pk_bkt_arr_t<PkeCamera>{ pk_bkt_arr_handle_MAX_constexpr };
+ cam_mstr.bkt = pk_mem_bucket_create("pk_bkt_arr cam", 1024 * 1024, PK_MEMBUCKET_FLAG_NONE);
+ new (&cam_mstr.bktc_cameras) pk_bkt_arr_t<PkeCamera>{ pk_bkt_arr_handle_MAX_constexpr, cam_mstr.bkt, cam_mstr.bkt };
NullCamera.type = PKE_CAMERA_TYPE_ORTHOGONAL;
NullCamera.view = PKE_CAMERA_VIEW_TARGET;
NullCamera.stale = PKE_CAMERA_STALE_ALL;
@@ -197,7 +201,8 @@ void PkeCamera_Teardown() {
pk_delete<btRigidBody>(NullCameraInstance.bt.rigidBody, MemBkt_Bullet);
NullCameraInstance.bt.motionState = CAFE_BABE(btDefaultMotionState);
NullCameraInstance.bt.rigidBody = CAFE_BABE(btRigidBody);
- bktc_cameras.~pk_bkt_arr_t<PkeCamera>();
+ cam_mstr.bktc_cameras.~pk_bkt_arr_t<PkeCamera>();
+ pk_mem_bucket_destroy(cam_mstr.bkt);
}
void PkeCamera_Tick(double delta) {
@@ -231,6 +236,6 @@ void PkeCamera_Tick(double delta) {
}
cam.stale = cam.stale | PKE_CAMERA_STALE_POSROT;
};
- pk_bkt_arr_iterate(&bktc_cameras, check_stale, NULL);
+ pk_bkt_arr_iterate(&cam_mstr.bktc_cameras, check_stale, NULL);
}