From bab6eff9da1927a4fc1e22d97e56199c1b677670 Mon Sep 17 00:00:00 2001 From: Stijn Buys Date: Fri, 14 Aug 2009 11:37:10 +0000 Subject: model API cleanup, render WORLDSCALE --- src/render/camera.cc | 64 +++++++++++++++++----------------------------------- 1 file changed, 21 insertions(+), 43 deletions(-) (limited to 'src/render/camera.cc') diff --git a/src/render/camera.cc b/src/render/camera.cc index 092cc26..ba82ea6 100644 --- a/src/render/camera.cc +++ b/src/render/camera.cc @@ -28,9 +28,6 @@ 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; -float Camera::camera_frustum_front = 1.0f; - math::Vector3f Camera::camera_eye; math::Vector3f Camera::camera_target; math::Axis Camera::camera_axis; @@ -52,9 +49,6 @@ float Camera::camera_zoom; void Camera::init() { - camera_frustum_size = 0.5f; - camera_frustum_front = 1.0f; - direction_current = 0; direction_target = 0; @@ -92,9 +86,6 @@ void Camera::set_mode(Mode newmode) { target_pitch = 0.0f; distance = 0.4f; - camera_frustum_size = 0.5f; - camera_frustum_front = 1.0f; - camera_axis.clear(); if (camera_mode != Overview) @@ -296,15 +287,17 @@ 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(); + camera_target -= camera_axis.forward() * math::max(FRUSTUMFRONT / WORLDSCALE, core::localcontrol()->model()->maxbbox().x); + camera_target += camera_axis.up() * math::max(FRUSTUMFRONT / WORLDSCALE, core::localcontrol()->model()->maxbbox().z); + } 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()); } -*/ - float f = ( camera_frustum_size/State::aspect() ); - camera_target += camera_axis.up() * math::max(f, core::localcontrol()->radius()); - distance = math::max(f, core::localcontrol()->radius()) + camera_zoom * 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); @@ -321,33 +314,24 @@ void Camera::frame(float seconds) d = degrees180f(pitch_current - pitch_target); pitch_current = degrees360f(pitch_current - d * seconds); camera_axis.change_pitch(pitch_current); - /* - // 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(); + + distance = math::max (FRUSTUMFRONT / WORLDSCALE, FRUSTUMFRONT / WORLDSCALE + camera_zoom * core::localcontrol()->radius()) + 0.001f; + } else if (mode() == Cockpit) { camera_axis.assign(target_axis); if (core::localcontrol()->model()) { - camera_target += (core::localcontrol()->model()->maxbbox().x+0.05) * + camera_target += (core::localcontrol()->model()->maxbbox().x) * core::localcontrol()->axis().forward(); } else { - camera_target += (core::localcontrol()->radius() + 0.05) * + camera_target += (core::localcontrol()->radius()) * core::localcontrol()->axis().forward(); } - distance = 0.0f; + distance = (FRUSTUMFRONT / WORLDSCALE) - 0.001f; } } - distance += camera_frustum_front; - // calculate eye position camera_eye = camera_target - (distance * camera_axis.forward()); } @@ -358,7 +342,7 @@ void Camera::frustum() gl::matrixmode(GL_PROJECTION); gl::loadidentity(); - gl::frustum(-camera_frustum_size, camera_frustum_size, -camera_frustum_size/State::aspect(), camera_frustum_size/State::aspect(), camera_frustum_front, 1023.0f); + gl::frustum(-FRUSTUMSIZE, FRUSTUMSIZE, -FRUSTUMSIZE/State::aspect(), FRUSTUMSIZE/State::aspect(), FRUSTUMFRONT, core::range::maxdistance * WORLDSCALE); gl::matrixmode(GL_MODELVIEW); gl::loadidentity(); @@ -371,7 +355,10 @@ void Camera::frustum() matrix.assign(camera_axis); gl::multmatrix(matrix.transpose()); + gl::scale(4.0f, 4.0f, 4.0f); + gl::translate(-1.0f * camera_eye); + } void Camera::frustum_default(float distance, float cx, float cy) @@ -380,10 +367,11 @@ void Camera::frustum_default(float distance, float cx, float cy) gl::matrixmode(GL_PROJECTION); gl::loadidentity(); + // move eye to (cx, cy) // note: the factor 2.0f probably has to be 1.0f/frustum_size gl::translate(2.0f*(-State::width() * 0.5f + cx)/State::width() , 2.0f*(State::height() * 0.5f - cy)/State::height(), 0.0f); - gl::frustum(-camera_frustum_size, camera_frustum_size, -camera_frustum_size/State::aspect(), camera_frustum_size/State::aspect(), camera_frustum_front, 1023.0f); + gl::frustum(-FRUSTUMSIZE, FRUSTUMSIZE, -FRUSTUMSIZE/State::aspect(), FRUSTUMSIZE/State::aspect(), FRUSTUMFRONT, 1023.0f); gl::matrixmode(GL_MODELVIEW); gl::loadidentity(); @@ -426,14 +414,4 @@ void Camera::reset() set_mode(camera_mode); } -float Camera::frustum_front() -{ - return camera_frustum_front; -} - -float Camera::frustum_size() -{ - return camera_frustum_size; -} - } -- cgit v1.2.3