Project::OSiRiON - Git repositories
Project::OSiRiON
News . About . Screenshots . Downloads . Forum . Wiki . Tracker . Git
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'src/render/camera.cc')
-rw-r--r--src/render/camera.cc64
1 files changed, 21 insertions, 43 deletions
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;
-}
-
}