#ifndef PKE_CAMERA_HPP #define PKE_CAMERA_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(PkeCameraOrientation, uint8_t, 0xFF); TypeSafeInt_Const_Expr(PkeCameraStaleFlags, uint8_t, 0xFF); struct CameraHandle : public PkeHandle {}; constexpr CameraHandle CameraHandle_MAX = CameraHandle{}; const PkeCameraType PKE_CAMERA_TYPE_PERSPECTIVE = PkeCameraType{1 << 0}; const PkeCameraType PKE_CAMERA_TYPE_ORTHOGONAL = PkeCameraType{1 << 1}; const PkeCameraOrientation PKE_CAMERA_ORIENTATION_TARGET = PkeCameraOrientation{1 << 0}; const PkeCameraOrientation PKE_CAMERA_ORIENTATION_FREE = PkeCameraOrientation{1 << 1}; const PkeCameraStaleFlags PKE_CAMERA_STALE_POS = PkeCameraStaleFlags{1 << 0}; const PkeCameraStaleFlags PKE_CAMERA_STALE_ROT = PkeCameraStaleFlags{1 << 1}; const PkeCameraStaleFlags PKE_CAMERA_STALE_ORIENTATION = PkeCameraStaleFlags{1 << 2}; const PkeCameraStaleFlags PKE_CAMERA_STALE_ALL = PkeCameraStaleFlags{0xFF}; struct PkeCamera { CameraHandle handle = CameraHandle_MAX; glm::vec3 pos = glm::vec3(0); glm::quat rot = glm::quat{}; glm::vec3 target = glm::vec3(0); PkeCameraType type = PkeCameraType_MAX; PkeCameraOrientation orientation = PkeCameraOrientation_MAX; PkeCameraStaleFlags stale = PkeCameraStaleFlags_MAX; bool isPrimary = false; }; extern PkeCamera NullCamera; extern PkeCamera *ActiveCamera; void PkeCamera_Init(); PkeCamera &PkeCamera_Register(); PkeCamera *PkeCamera_Get(CameraHandle handle); int64_t PkeCamera_GetBucketCount(); PkeCamera *PkeCamera_GetCameras(int64_t bucketIndex, int64_t &count); void PkeCamera_Destroy(CameraHandle handle); void PkeCamera_Teardown(); void PkeCamera_Unregister(uint64_t id); #endif /* PKE_CAMERA_HPP */