X-Git-Url: https://git.dogcows.com/gitweb?p=chaz%2Fyoink;a=blobdiff_plain;f=src%2FMoof%2FCamera.cc;h=d7f1fe2d34c20752aa2667c9e8723c0472ee7ca7;hp=26e24ba358fbfd7494517a66409e75c5150f8b59;hb=c85b710e7ead9bc417805bb893571a7139f1081c;hpb=29e3d45f7bbbf31eadf793c41ff2b3d9c47b7539 diff --git a/src/Moof/Camera.cc b/src/Moof/Camera.cc index 26e24ba..d7f1fe2 100644 --- a/src/Moof/Camera.cc +++ b/src/Moof/Camera.cc @@ -1,166 +1,152 @@ -/******************************************************************************* - - Copyright (c) 2009, Charles McGarvey - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -*******************************************************************************/ - -#include -#include +/*] Copyright (c) 2009-2010, Charles McGarvey [************************** +**] All rights reserved. +* +* vi:ts=4 sw=4 tw=75 +* +* Distributable under the terms and conditions of the 2-clause BSD license; +* see the file COPYING for a complete text of the license. +* +**************************************************************************/ + +#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(); - calculateSecondary(); +void Camera::setProjection(const Matrix4& projection) +{ + mProjection = projection; } +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; } } // namespace Mf -/** vim: set ts=4 sw=4 tw=80: *************************************************/ -