#ifndef CCAMERA_H #define CCAMERA_H #include "CFrustumPlanes.h" #include #include #include #include #include #include #include #include enum ECameraMoveMode { eFreeCamera, eOrbitCamera }; class CCamera { ECameraMoveMode mMode; CVector3f mPosition; CVector3f mDirection; float mAspectRatio; float mYaw; float mPitch; CVector3f mOrbitTarget; float mMoveSpeed; float mLookSpeed; CMatrix4f mCachedViewMatrix; CMatrix4f mCachedProjectionMatrix; CFrustumPlanes mCachedFrustumPlanes; bool mViewOutdated; bool mProjectionOutdated; bool mFrustumPlanesOutdated; public: CCamera(); CCamera(CVector3f Position, CVector3f Target); void Pan(float XAmount, float YAmount); void Rotate(float XAmount, float YAmount); void Zoom(float Amount); void Snap(CVector3f Position); void ProcessKeyInput(EKeyInputs KeyFlags, double DeltaTime); void ProcessMouseInput(EKeyInputs KeyFlags, EMouseInputs MouseFlags, float XMovement, float YMovement); CRay CastRay(CVector2f DeviceCoords); void LoadMatrices(); void LoadRotationOnlyMatrices(); // Getters CVector3f Position() const; CVector3f Direction() const; float Yaw() const; float Pitch() const; float FieldOfView() const; const CMatrix4f& ViewMatrix(); CMatrix4f RotationOnlyViewMatrix(); const CMatrix4f& ProjectionMatrix(); const CFrustumPlanes& FrustumPlanes(); // Setters void SetPosition(CVector3f Position); void SetDirection(CVector3f Direction); void SetYaw(float Yaw); void SetPitch(float Pitch); void SetMoveSpeed(float MoveSpeed); void SetLookSpeed(float LookSpeed); void SetFree(); void SetOrbit(const CVector3f& OrbitTarget); void SetOrbit(const CAABox& OrbitTarget); void SetAspectRatio(float AspectRatio); // Private private: void CalculateDirection(); void CalculateView(); void CalculateProjection(); void CalculateFrustumPlanes(); }; #endif // CCAMERA_H