From affa3d2a6761c4040434e11726695ad6e53a4cab Mon Sep 17 00:00:00 2001 From: Stijn Buys Date: Sat, 4 Dec 2010 00:17:15 +0000 Subject: Correct camera axis and clear depth buffer when rendering ui models. --- src/render/camera.cc | 66 ++++++++++++++++++++++++++++------------------------ 1 file changed, 35 insertions(+), 31 deletions(-) (limited to 'src/render/camera.cc') diff --git a/src/render/camera.cc b/src/render/camera.cc index 851ad81..876fa42 100644 --- a/src/render/camera.cc +++ b/src/render/camera.cc @@ -31,6 +31,7 @@ const float pitch_overview = -5.0f; math::Vector3f Camera::camera_eye; math::Vector3f Camera::camera_target; math::Axis Camera::camera_axis; +math::Axis Camera::camera_scene_axis; Camera::Mode Camera::camera_mode; Camera::Mode Camera::camera_previous_mode; @@ -66,6 +67,7 @@ void Camera::init() set_mode(Track); camera_axis.clear(); + camera_scene_axis.clear(); camera_eye.clear(); camera_target.clear(); @@ -87,7 +89,7 @@ void Camera::set_mode(Mode newmode) target_pitch = 0.0f; distance = 0.4f; - camera_axis.clear(); + camera_scene_axis.clear(); if (camera_mode != Overview) camera_previous_mode = camera_mode; @@ -97,7 +99,7 @@ void Camera::set_mode(Mode newmode) // switch camera to Track mode camera_mode = Track; if (core::localcontrol()) { - camera_axis.assign(core::localcontrol()->axis()); + camera_scene_axis.assign(core::localcontrol()->axis()); } break; @@ -170,21 +172,21 @@ void Camera::view_previous() // 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 Free: // 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 Track: // 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: @@ -223,14 +225,14 @@ void Camera::frame(float seconds) if (core::localplayer()->view()) { // player view entity - camera_axis.assign(core::localplayer()->view()->axis()); + camera_scene_axis.assign(core::localplayer()->view()->axis()); if (core::localplayer()->view() == core::localcontrol()) { - camera_axis.change_pitch(pitch_free); + camera_scene_axis.change_pitch(pitch_free); camera_target.assign(core::localplayer()->view()->location()); distance = math::max(core::localplayer()->view()->radius(), 1.0f) * 2.0f; } else { distance = math::max(core::localplayer()->view()->radius(), 1.0f) * 3.0f; - camera_axis.change_direction(180.0f); + camera_scene_axis.change_direction(180.0f); camera_target.assign(core::localplayer()->view()->location() - core::localplayer()->view()->axis().left()*(math::max(core::localplayer()->view()->radius(), 1.0f)*0.5f)); } @@ -238,16 +240,16 @@ void Camera::frame(float seconds) } else if (core::localplayer()->zone()->default_view()) { // default zone view entity camera_target.assign(core::localplayer()->zone()->default_view()->location()); - camera_axis.assign(core::localplayer()->zone()->default_view()->axis()); - camera_axis.change_direction(180.0f); + camera_scene_axis.assign(core::localplayer()->zone()->default_view()->axis()); + camera_scene_axis.change_direction(180.0f); distance = math::max(core::localplayer()->zone()->default_view()->radius(), 1.0f) * 2.0f; */ } else { // default location (0,0,0) camera_target.clear(); - camera_axis.clear(); + camera_scene_axis.clear(); pitch_current = pitch_overview; - camera_axis.change_pitch(pitch_current); + camera_scene_axis.change_pitch(pitch_current); distance = 8.0f; } } else { @@ -262,48 +264,48 @@ void Camera::frame(float seconds) float angle; // angle in radians math::Vector3f n; // normal of a plane - n.assign(math::crossproduct(camera_axis.forward(), target_axis.forward())); + n.assign(math::crossproduct(camera_scene_axis.forward(), target_axis.forward())); if (!(n.length() < MIN_DELTA)) { n.normalize(); - cosangle = math::dotproduct(camera_axis.forward(), target_axis.forward()); + cosangle = math::dotproduct(camera_scene_axis.forward(), target_axis.forward()); angle = acos(cosangle) * seconds; // * 180.0f / M_PI; if (angle > MIN_DELTA) - camera_axis.rotate(n, -angle); + camera_scene_axis.rotate(n, -angle); } - n.assign(math::crossproduct(camera_axis.left(), target_axis.left())); + n.assign(math::crossproduct(camera_scene_axis.left(), target_axis.left())); if (!(n.length() < MIN_DELTA)) { n.normalize(); - cosangle = math::dotproduct(camera_axis.left(), target_axis.left()); + cosangle = math::dotproduct(camera_scene_axis.left(), target_axis.left()); angle = acos(cosangle) * seconds; // * 180.0f / M_PI; if (angle > MIN_DELTA) - camera_axis.rotate(n, -angle); + camera_scene_axis.rotate(n, -angle); } - n.assign(math::crossproduct(camera_axis.up(), target_axis.up())); + n.assign(math::crossproduct(camera_scene_axis.up(), target_axis.up())); if (!(n.length() < MIN_DELTA)) { n.normalize(); - cosangle = math::dotproduct(camera_axis.up(), target_axis.up()); + cosangle = math::dotproduct(camera_scene_axis.up(), target_axis.up()); angle = acos(cosangle) * seconds; // * 180.0f / M_PI; if (angle > MIN_DELTA) - camera_axis.rotate(n, -angle); + camera_scene_axis.rotate(n, -angle); } if (core::localcontrol()->model() && core::localcontrol()->model()->radius()) { const float modelscale = core::localcontrol()->radius() / core::localcontrol()->model()->radius(); - camera_target -= camera_axis.forward() * math::max(FRUSTUMFRONT / WORLDSCALE, core::localcontrol()->model()->box().max().x() * modelscale); - camera_target += camera_axis.up() * math::max(FRUSTUMFRONT / WORLDSCALE, core::localcontrol()->model()->box().max().z() * modelscale); + camera_target -= camera_scene_axis.forward() * math::max(FRUSTUMFRONT / WORLDSCALE, core::localcontrol()->model()->box().max().x() * modelscale); + camera_target += camera_scene_axis.up() * math::max(FRUSTUMFRONT / WORLDSCALE, core::localcontrol()->model()->box().max().z() * modelscale); } else { - camera_target -= camera_axis.forward() * math::max(FRUSTUMFRONT / WORLDSCALE, FRUSTUMFRONT / WORLDSCALE + core::localcontrol()->radius()); - camera_target += camera_axis.up() * math::max(FRUSTUMFRONT / WORLDSCALE, FRUSTUMFRONT / WORLDSCALE + core::localcontrol()->radius()); + camera_target -= camera_scene_axis.forward() * math::max(FRUSTUMFRONT / WORLDSCALE, FRUSTUMFRONT / WORLDSCALE + core::localcontrol()->radius()); + camera_target += camera_scene_axis.up() * math::max(FRUSTUMFRONT / WORLDSCALE, FRUSTUMFRONT / WORLDSCALE + core::localcontrol()->radius()); } distance = math::max(FRUSTUMFRONT / WORLDSCALE, FRUSTUMFRONT / WORLDSCALE + camera_zoom * core::localcontrol()->radius()) + 0.001f; } else if (mode() == Free) { - camera_axis.assign(target_axis); + camera_scene_axis.assign(target_axis); direction_target = direction_current - 90 * target_direction; pitch_target = pitch_current - 90 * target_pitch; @@ -311,18 +313,18 @@ void Camera::frame(float seconds) // adjust direction d = degrees180f(direction_current - direction_target); direction_current = degrees360f(direction_current - d * seconds); - camera_axis.change_direction(direction_current); + camera_scene_axis.change_direction(direction_current); // adjust pitch d = degrees180f(pitch_current - pitch_target); pitch_current = degrees360f(pitch_current - d * seconds); - camera_axis.change_pitch(pitch_current); + camera_scene_axis.change_pitch(pitch_current); distance = math::max(FRUSTUMFRONT / WORLDSCALE, FRUSTUMFRONT / WORLDSCALE + camera_zoom * core::localcontrol()->radius()) + 0.001f; } else if (mode() == Cockpit) { - camera_axis.assign(target_axis); + camera_scene_axis.assign(target_axis); if (core::localcontrol()->model()) { const float modelscale = core::localcontrol()->radius() / core::localcontrol()->model()->radius(); @@ -337,7 +339,8 @@ void Camera::frame(float seconds) } // calculate eye position - camera_eye = camera_target - (distance * camera_axis.forward()); + camera_eye = camera_target - (distance * camera_scene_axis.forward()); + camera_axis.assign(camera_scene_axis); } void Camera::frustum() @@ -356,7 +359,7 @@ void Camera::frustum() // apply the transpose of the axis transformation (the axis is orhtonormal) math::Matrix4f matrix; - matrix.assign(camera_axis); + matrix.assign(camera_scene_axis); gl::multmatrix(matrix.transpose()); gl::scale(4.0f, 4.0f, 4.0f); @@ -386,6 +389,7 @@ void Camera::frustum_default(float distance, float cx, float cy) gl::translate(distance + 1.0f, 0.0f, 0.0f); camera_eye.assign(-distance - 1.0f, 0.0f, 0.0f); + camera_axis.clear(); } void Camera::ortho() -- cgit v1.2.3