/* render/camera.h This file is part of the Osirion project and is distributed under the terms and conditions of the GNU General Public License version 2 */ #ifndef __INCLUDED_RENDER_CAMERA_H__ #define __INCLUDED_RENDER_CAMERA_H__ #include "math/mathlib.h" #include "core/range.h" namespace render { const float WORLDSCALE = 4.0f; const float FARPLANE = core::range::maxdistance; const float FRUSTUMSIZE = 0.5f; const float FRUSTUMFRONT = 1.0f; /// camera functions class Camera { public: /// enum indicating the camera mode enum Mode {Free, Track, Cockpit, Overview}; /// initialize the camera static void init(); /// shutdown the camera static void shutdown(); /// gameworld coordinates of the camera eye static inline const math::Vector3f & eye() { return camera_eye; } /// gameworld coordinates of the camera target static inline const math::Vector3f & target() { return camera_target; } /// gameworld camera axis static inline const math::Axis & axis() { return camera_axis; } /// current camera mode static inline Mode mode() { return camera_mode; } /// reset the current mode static void reset(); /// progress the camera static void frame(float elapsed); /// enable camera frustum projection /** The camera frustum projection is used to draw the world */ static void frustum(); /// enable default frustum projection /** The default frustum projection is used to draw Gui 3D models */ static void frustum_default(float distance, float cx, float cy); /// enable orthographic projection /** The ortographic projetion is used to draw the user interface */ static void ortho(); /// set target zoom static void set_zoom(float zoom); /// set target direction static void set_direction(float direction); /// set target pitch static void set_pitch(float pitch); /// switch to next camera mode static void view_next(); /// wtich to previous camera mode static void view_previous(); /// set specified camera mode static void set_mode(Mode newmode); private: static math::Vector3f camera_eye; static math::Vector3f camera_target; static math::Axis camera_axis; static Mode camera_mode; static Mode camera_previous_mode; // current and target yaw angle in XZ plane, positive is looking left static float direction_current; static float direction_target; static float target_direction; // current and target pitch angle in XY, positive is looking up static float pitch_current; static float pitch_target; static float target_pitch; static float distance; static float camera_zoom; }; } // namespace client #endif // __INCLUDED_RENDER_CAMERA_H__