From 37c0f3b6a793495c95f6cf08c2c45d3030b539c4 Mon Sep 17 00:00:00 2001 From: Stijn Buys Date: Sun, 30 Nov 2008 15:43:27 +0000 Subject: improved camera handling and dust rendering --- src/render/camera.cc | 45 +++++++++++++++++++++++++++++---------------- 1 file changed, 29 insertions(+), 16 deletions(-) (limited to 'src/render/camera.cc') diff --git a/src/render/camera.cc b/src/render/camera.cc index f97ea96..d9821a3 100644 --- a/src/render/camera.cc +++ b/src/render/camera.cc @@ -4,6 +4,8 @@ the terms and conditions of the GNU General Public License version 2 */ +#include + #include "core/core.h" #include "math/mathlib.h" #include "math/matrix4f.h" @@ -19,8 +21,10 @@ namespace render { const float MIN_DELTA = 10e-10; +const float COS_PI_4 = sqrt(2.0f) * 0.5f; -const float pitch_track = -15.0f; +const float pitch_free = -30.0f; +const float pitch_track = -5.0f; const float pitch_overview = -5.0f; float Camera::camera_frustum_size = 0.5f; @@ -107,7 +111,7 @@ void Camera::set_mode(Mode newmode) { case Free: // switch camera to Free mode camera_mode = Free; - pitch_target = 2.0 * pitch_track; + pitch_target = pitch_free; pitch_current = pitch_target; break; @@ -138,21 +142,21 @@ void Camera::view_next() // switch camera to Track mode set_mode(Track); //con_print << "view: track" << std::endl; - //core::application()->notify_message(core::Message::Info, std::string("view: track")); + core::application()->notify_message(core::Message::Info, std::string("view: track")); break; case Track: // switch camera to Cockpit mode set_mode(Cockpit); //con_print << "view: cockpit" << std::endl; - //core::application()->notify_message(core::Message::Info, std::string("view: cockpit")); + core::application()->notify_message(core::Message::Info, std::string("view: cockpit")); break; case Cockpit: // switch camera to Free mode set_mode(Free); //con_print << "view: free" << std::endl; - //core::application()->notify_message(core::Message::Info, std::string("view: free")); + core::application()->notify_message(core::Message::Info, std::string("view: free")); break; default: @@ -173,21 +177,21 @@ void Camera::view_previous() // switch camera to Track mode set_mode(Track); //con_print << "view: track" << std::endl; - //core::application()->notify_message(std::string("view: track")); + core::application()->notify_message(core::Message::Info, std::string("view: track")); break; case Free: // switch camera to Cockpit mode set_mode(Cockpit); //con_print << "view: cockpit" << std::endl; - //core::application()->notify_message(std::string("view: cockpit")); + core::application()->notify_message(core::Message::Info, std::string("view: cockpit")); break; case Track: // switch camera to Free mode set_mode(Free); //con_print << "view: free" << std::endl; - //core::application()->notify_message(std::string("view: free")); + core::application()->notify_message(core::Message::Info, std::string("view: free")); break; default: @@ -254,8 +258,6 @@ void Camera::frame(float seconds) if (mode() == Track) { - distance *= camera_zoom; - float cosangle; // cosine of an angle float angle; // angle in radians math::Vector3f n; // normal of a plane @@ -286,15 +288,19 @@ void Camera::frame(float seconds) if (angle > MIN_DELTA) camera_axis.rotate(n, -angle); } - +/* if (core::localcontrol()->model()) { camera_target -= (core::localcontrol()->model()->maxbbox().x + core::localcontrol()->model()->radius() + 0.1f) * 0.5f * camera_axis.forward(); camera_target += (core::localcontrol()->model()->maxbbox().z + core::localcontrol()->model()->radius() + 0.1f) * 0.5f * camera_axis.up(); } - +*/ + float f = ( camera_frustum_size/State::aspect() ); + camera_target += target_axis.up() * math::max(f, core::localcontrol()->radius()); + distance = math::max(f, core::localcontrol()->radius()) + camera_zoom * core::localcontrol()->radius(); } else if (mode() == Free) { - camera_axis.assign(target_axis); + camera_axis.assign(target_axis); + direction_target = direction_current - 90 * target_direction; pitch_target = pitch_current - 90 * target_pitch; @@ -307,9 +313,16 @@ void Camera::frame(float seconds) d = degrees180f(pitch_current - pitch_target); pitch_current = degrees360f(pitch_current - d * seconds); camera_axis.change_pitch(pitch_current); - - distance = 1.5f * core::localcontrol()->radius() * camera_zoom; - + /* + // set distance and location + distance = camera_zoom * core::localcontrol()->radius(); + //distance += (2.0f*core::localcontrol()->radius()) / ( camera_frustum_size/State::aspect() ); + + camera_target -= COS_PI_4 * (core::localcontrol()->model() ? core::localcontrol()->model()->maxbbox().x : core::localcontrol()->radius()) * camera_axis.forward(); + camera_target += COS_PI_4 * (core::localcontrol()->model() ? core::localcontrol()->model()->maxbbox().z : core::localcontrol()->radius()) * camera_axis.up(); camera_target += camera_frustum_size/State::aspect() * target_axis.up(); + */ + float f = ( camera_frustum_size/State::aspect() ); + distance = f + camera_zoom * core::localcontrol()->radius(); } else if (mode() == Cockpit) { camera_axis.assign(target_axis); -- cgit v1.2.3