#ifndef PKE_CAMERA_HPP #define PKE_CAMERA_HPP #include "pk.h" #include "components.hpp" #include TypeSafeInt_constexpr(PkeCameraType, uint8_t, 0xFF); TypeSafeInt_constexpr(PkeCameraView, uint8_t, 0xFF); TypeSafeInt_constexpr(PkeCameraStaleFlags, uint8_t, 0xFF); struct CameraHandle : public pk_bkt_arr_handle {}; constexpr CameraHandle CameraHandle_MAX = CameraHandle{ PK_BKT_ARR_HANDLE_B_MAX, PK_BKT_ARR_HANDLE_I_MAX }; constexpr PkeCameraType PKE_CAMERA_TYPE_PERSPECTIVE = PkeCameraType{1 << 0}; constexpr PkeCameraType PKE_CAMERA_TYPE_ORTHOGONAL = PkeCameraType{1 << 1}; constexpr PkeCameraView PKE_CAMERA_VIEW_TARGET = PkeCameraView{1 << 0}; constexpr PkeCameraView PKE_CAMERA_VIEW_FREE = PkeCameraView{1 << 1}; constexpr PkeCameraStaleFlags PKE_CAMERA_STALE_POS = PkeCameraStaleFlags{1 << 0}; constexpr PkeCameraStaleFlags PKE_CAMERA_STALE_ROT = PkeCameraStaleFlags{1 << 1}; constexpr PkeCameraStaleFlags PKE_CAMERA_STALE_POSROT = PkeCameraStaleFlags{1 << 0 | 1 << 1}; constexpr PkeCameraStaleFlags PKE_CAMERA_STALE_PERSPECTIVE = PkeCameraStaleFlags{1 << 2}; constexpr PkeCameraStaleFlags PKE_CAMERA_STALE_ALL = PkeCameraStaleFlags{0xFF}; struct PkeCamera : public Entity_Base { CameraHandle camHandle = CameraHandle_MAX; PkeCameraType type = PkeCameraType_MAX; PkeCameraView view = PkeCameraView_MAX; PkeCameraStaleFlags stale = PkeCameraStaleFlags_MAX; struct Phys { InstanceHandle instHandle = InstanceHandle_MAX; InstanceHandle target_inst_handle = InstanceHandle_MAX; pk_uuid target_inst_uuid = pk_uuid_zed; btTypedConstraint *constraint = nullptr; } phys; bool isPrimary = false; }; extern PkeCamera NullCamera; extern CompInstance NullCameraInstance; extern PkeCamera *ActiveCamera; void PkeCamera_Init(); PkeCamera &PkeCamera_Register(pk_uuid uuid, const InstPos &instPos); PkeCamera *PkeCamera_Get(CameraHandle handle); PkeCamera *PkeCamera_Get(EntityHandle handle); void PkeCamera_TargetInstance(CameraHandle cameraHandle, CompInstance *inst); void PkeCamera_UntargetInstance(CameraHandle cameraHandle); pk_bkt_arr &PkeCamera_GetPkBktArr(); void PkeCamera_SetPrimary(CameraHandle handle); void PkeCamera_Teardown(); void PkeCamera_Tick(double delta); void PkeCamera_Unregister(uint64_t id); #endif /* PKE_CAMERA_HPP */