X-Git-Url: https://git.dogcows.com/gitweb?p=chaz%2Fyoink;a=blobdiff_plain;f=src%2FMoof%2FCamera.cc;h=8f313b7aaf7d83b15ee8a97dc8ec12562c8c40e3;hp=26e24ba358fbfd7494517a66409e75c5150f8b59;hb=3f6e44698c38b74bb622ad81ea9d2daa636981d2;hpb=29e3d45f7bbbf31eadf793c41ff2b3d9c47b7539 diff --git a/src/Moof/Camera.cc b/src/Moof/Camera.cc index 26e24ba..8f313b7 100644 --- a/src/Moof/Camera.cc +++ b/src/Moof/Camera.cc @@ -26,137 +26,141 @@ *******************************************************************************/ -#include -#include +#include "Camera.hh" +#include "OpenGL.hh" namespace Mf { -void Camera::setPosition(const Vector3& point) +void Camera::setPosition(const Vector3& position) { - //position_ = point; - Vector3 coeff[2] = {position_, point}; - pInterp_.init(coeff, 0.1); + mState.position = position; } + void Camera::setRotation(const Quaternion& rotation) { - rotation_ = rotation; - //srcRotation_ = rotation_; - //dstRotation_ = rotation; - //tInterp_ = 0.0; + mState.orientation = rotation; } -void Camera::update(Scalar t, Scalar dt) +void Camera::lookAt(const Vector3& point) { - pInterp_.update(dt); - position_ = pInterp_.getState(0.0); + // FIXME this doesn't work as expected + cml::quaternion_rotation_aim_at(mState.orientation, mState.position, point, + Vector3(0.0, 1.0, 0.0)); +} + - //tInterp_ += dt * 10.0; - //rotation_ = cml::slerp(srcRotation_, dstRotation_, cml::clamp(tInterp_, 0.0, 1.0)); - //rotation_.normalize(); +void Camera::setProjection(const Matrix4& projection) +{ + mProjection = projection; +} - calculateSecondary(); +void Camera::setProjection(Scalar fovy, Scalar aspect, Scalar abutting, + Scalar distant) +{ + cml::matrix_perspective_yfov_RH(mProjection, fovy, aspect, abutting, + distant, cml::z_clip_neg_one); } -void Camera::lookAt(const Vector3& point) +void Camera::uploadToGL(Scalar alpha) const +{ + calculate(alpha); + + glMatrixMode(GL_PROJECTION); + glMultMatrix(mProjection.data()); + + glMatrixMode(GL_MODELVIEW); + glMultMatrix(mModelview.data()); +} + +void Camera::calculate(Scalar alpha) const +{ + State3 state = getState(alpha); + + cml::matrix_rotation_quaternion(mModelview, state.orientation); + + Matrix4 translate; + cml::matrix_translation(translate, state.position); + + mModelview *= translate; + + mFrustum.init(mModelview, mProjection); +} + + +void Camera::update(Scalar t, Scalar dt) { - quaternion_rotation_aim_at(rotation_, position_, point); + RigidBody3::update(t, dt); } -void Camera::adjustFromInput(const Event& event) +void Camera::draw(Scalar alpha) const { + mSphere.draw(alpha); +} + + +void Camera::handleEvent(const Event& event) +{ + const Scalar ds = 50.0; + switch (event.type) { case SDL_KEYDOWN: - if (event.key.keysym.sym == SDLK_RIGHT || - event.key.keysym.sym == SDLK_d) + if (event.key.keysym.sym == SDLK_RIGHT) { - Vector3 vec = position_; - vec[0] -= 50.0; - setPosition(vec); + mState.position[0] -= ds; } - else if (event.key.keysym.sym == SDLK_LEFT || - event.key.keysym.sym == SDLK_a) + else if (event.key.keysym.sym == SDLK_LEFT) { - Vector3 vec = position_; - vec[0] += 50.0; - setPosition(vec); + mState.position[0] += ds; } - else if (event.key.keysym.sym == SDLK_UP || - event.key.keysym.sym == SDLK_w) + else if (event.key.keysym.sym == SDLK_UP) { - Vector3 vec = position_; - vec[1] -= 50.0; - setPosition(vec); + mState.position[1] -= ds; } - else if (event.key.keysym.sym == SDLK_DOWN || - event.key.keysym.sym == SDLK_s) + else if (event.key.keysym.sym == SDLK_DOWN) { - Vector3 vec = position_; - vec[1] += 50.0; - setPosition(vec); + mState.position[1] += ds; } else if (event.key.keysym.sym == SDLK_PAGEUP) { - Vector3 vec = position_; - vec[2] += 50.0; - setPosition(vec); + mState.position[2] += ds; } else if (event.key.keysym.sym == SDLK_PAGEDOWN) { - //position_[2] -= 50.0; - Vector3 vec = position_; - vec[2] -= 50.0; - setPosition(vec); + mState.position[2] -= ds; } break; case SDL_MOUSEMOTION: { - Scalar xrel = cml::rad(Scalar(event.motion.xrel) / 5.0); - Scalar yrel = cml::rad(Scalar(event.motion.yrel) / 5.0); + Scalar xrel = cml::rad(Scalar(event.motion.xrel) / 6.0); + Scalar yrel = cml::rad(Scalar(event.motion.yrel) / 6.0); - Quaternion rotation = rotation_; + Quaternion rotation = mState.orientation; - quaternion_rotate_about_world_x(rotation, yrel); - //rotation_.normalize(); - quaternion_rotate_about_world_y(rotation, xrel); - rotation.normalize(); + cml::quaternion_rotate_about_world_x(rotation, yrel); + //mRotation.normalize(); + cml::quaternion_rotate_about_world_y(rotation, xrel); - setRotation(rotation); - break; + rotation.normalize(); + mState.orientation = rotation; } + break; case SDL_MOUSEBUTTONDOWN: if (event.button.button == SDL_BUTTON_WHEELUP) { - Vector3 vec = position_; - vec[2] += 50.0; - setPosition(vec); + mState.position[2] -= ds; } else if (event.button.button == SDL_BUTTON_WHEELDOWN) { - Vector3 vec = position_; - vec[2] -= 50.0; - setPosition(vec); + mState.position[2] -= ds; } break; } - - calculateSecondary(); -} - -void Camera::calculateSecondary() -{ - matrix_rotation_quaternion(transformation_, rotation_); - - Matrix4 translate; - matrix_translation(translate, position_); - - //transformation_ = translate * transformation_; - transformation_ *= translate; }