#ifndef PKE_CAMERA_HPP #define PKE_CAMERA_HPP #include "components.hpp" #include "macros.hpp" #include "vendor/glm_include.hpp" #include "memory-type-defs.hpp" #include TypeSafeInt_Const_Expr(PkeCameraType, uint8_t, 0xFF); TypeSafeInt_Const_Expr(PkeCameraView, uint8_t, 0xFF); TypeSafeInt_Const_Expr(PkeCameraStaleFlags, uint8_t, 0xFF); struct CameraHandle : public PkeHandle {}; constexpr CameraHandle CameraHandle_MAX = CameraHandle{}; 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 { CompInstance *inst = nullptr; CompInstance *targetInst = nullptr; btTypedConstraint *constraint = nullptr; } phys; bool isPrimary = false; }; extern PkeCamera NullCamera; extern PkeCamera *ActiveCamera; void PkeCamera_Init(); PkeCamera &PkeCamera_Register(const InstPos &instPos); PkeCamera *PkeCamera_Get(CameraHandle handle); PkeCamera *PkeCamera_Get(EntityHandle handle); void PkeCamera_AttachToInstance(CameraHandle cameraHandle, CompInstance *inst); void PkeCamera_DetachFromInstance(CameraHandle cameraHandle, CompInstance *inst); int64_t PkeCamera_GetBucketCount(); PkeCamera *PkeCamera_GetCameras(int64_t bucketIndex, int64_t &count); void PkeCamera_SetPrimary(CameraHandle handle); void PkeCamera_Destroy(CameraHandle handle); void PkeCamera_Teardown(); void PkeCamera_Tick(double delta); void PkeCamera_Unregister(uint64_t id); #endif /* PKE_CAMERA_HPP */