/*] 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 #include "Character.hh" #include "Log.hh" class SpringForce { public: explicit SpringForce(Mf::Vector2 x) : location(x) {} const Mf::Vector2& operator () (const Mf::LinearState<2>& state) { Mf::Vector2 x = state.position - location; Mf::Scalar mag = x.length(); Mf::Scalar d = 0.0; // spring: //mState.force += -15.0 * x - 1.5 * mState.velocity; force = SCALAR(-10.0) * (mag - d) * (x / mag);// - SCALAR(2.0) * state.velocity; return force; } private: Mf::Vector2 force; Mf::Vector2 location; }; class ResistanceForce { public: explicit ResistanceForce(Mf::Scalar scale = 1.0) : k(scale) {} const Mf::Vector2& operator () (const Mf::LinearState<2>& state) { force = -k * state.velocity; return force; } private: Mf::Vector2 force; Mf::Scalar k; }; Character::Character(const std::string& name) : tilemap(name), animation(name) { mState.init(); mState.mass = 1.0; mState.inverseMass = 1.0 / mState.mass; // forces mState.force = Mf::Vector2(0.0, 0.0); //mState.forces.push_back(SpringForce(Mf::Vector2(5.0, 4.0))); //mState.forces.push_back(ResistanceForce(2.0)); //mState.forces.push_back(Mf::LinearState<2>::GravityForce(-9.8)); // starting position mState.position = Mf::Vector2(5.0, 5.0); mState.momentum = Mf::Vector2(0.0, 0.0); mState.recalculate(); mPrevState = mState; } void Character::update(Mf::Scalar t, Mf::Scalar dt) { Mf::RigidBody2::update(t, dt); // update physics animation.update(t, dt); Mf::Vector3 center(mState.position[0], mState.position[1], 0.0); Mf::Vector3 a(mState.position[0] - 0.5, mState.position[1] - 0.5, 0.0); Mf::Vector3 b(mState.position[0] + 0.5, mState.position[1] + 0.5, 0.0); mAabb.init(a, b); mSphere.init(center, a); } void Character::draw(Mf::Scalar alpha) const { Mf::State2 state = getState(alpha); Mf::Vector2 position = state.position; //glColor3f(1.0f, 1.0f, 1.0f); tilemap.bind(); Mf::Texture::TileIndex frame = animation.getFrame(); Mf::Texture::Orientation orientation = Mf::Texture::NORMAL; if (mState.velocity[0] < 0.0) orientation = Mf::Texture::REVERSE; Mf::Scalar coords[8]; tilemap.getTileCoords(frame, coords, orientation); Mf::Scalar s = 0.5; glBegin(GL_TRIANGLE_FAN); glTexCoord(coords[0], coords[1]); glVertex(position[0]-s, position[1]-s); glTexCoord(coords[2], coords[3]); glVertex(position[0]+s, position[1]-s); glTexCoord(coords[4], coords[5]); glVertex(position[0]+s, position[1]+s); glTexCoord(coords[6], coords[7]); glVertex(position[0]-s, position[1]+s); glEnd(); } /*int Character::getOctant(const Mf::Aabb<3>& aabb) const { int octantNum = -1; Mf::Plane::Halfspace halfspace; Mf::Plane xy = aabb.getPlaneXY(); halfspace = xy.intersects(mSphere); if (halfspace == Mf::Plane::INTERSECT) { halfspace = xy.intersects(mAabb); } if (halfspace == Mf::Plane::POSITIVE) { Mf::Plane xz = aabb.getPlaneXZ(); halfspace = xz.intersects(mSphere); if (halfspace == Mf::Plane::INTERSECT) { halfspace = xz.intersects(mAabb); } if (halfspace == Mf::Plane::POSITIVE) { Mf::Plane yz = aabb.getPlaneYZ(); halfspace = yz.intersects(mSphere); if (halfspace == Mf::Plane::INTERSECT) { halfspace = yz.intersects(mAabb); } if (halfspace == Mf::Plane::POSITIVE) { octantNum = 2; } else if (halfspace == Mf::Plane::NEGATIVE) { octantNum = 3; } } else if (halfspace == Mf::Plane::NEGATIVE) { Mf::Plane yz = aabb.getPlaneYZ(); halfspace = yz.intersects(mSphere); if (halfspace == Mf::Plane::INTERSECT) { halfspace = yz.intersects(mAabb); } if (halfspace == Mf::Plane::POSITIVE) { octantNum = 1; } else if (halfspace == Mf::Plane::NEGATIVE) { octantNum = 0; } } } else if (halfspace == Mf::Plane::NEGATIVE) { Mf::Plane xz = aabb.getPlaneXZ(); halfspace = xz.intersects(mSphere); if (halfspace == Mf::Plane::INTERSECT) { halfspace = xz.intersects(mAabb); } if (halfspace == Mf::Plane::POSITIVE) { Mf::Plane yz = aabb.getPlaneYZ(); halfspace = yz.intersects(mSphere); if (halfspace == Mf::Plane::INTERSECT) { halfspace = yz.intersects(mAabb); } if (halfspace == Mf::Plane::POSITIVE) { octantNum = 6; } else if (halfspace == Mf::Plane::NEGATIVE) { octantNum = 7; } } else if (halfspace == Mf::Plane::NEGATIVE) { Mf::Plane yz = aabb.getPlaneYZ(); halfspace = yz.intersects(mSphere); if (halfspace == Mf::Plane::INTERSECT) { halfspace = yz.intersects(mAabb); } if (halfspace == Mf::Plane::POSITIVE) { octantNum = 5; } else if (halfspace == Mf::Plane::NEGATIVE) { octantNum = 4; } } } return octantNum; } */ void Character::addImpulse(Mf::Vector2 impulse) { mState.momentum += impulse; } void Character::addForce(Mf::Vector2 force) { mState.force += force; } void Character::setPosition(Mf::Vector2 position) { mState.position = position; }