00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 #include <assert.h>
00009 
00010 
00011 #include <OgreVector3.h>
00012 #include <OgreQuaternion.h>
00013 
00014 #include <physics.h>
00015 #include <ent.h>
00016 #include <utils.h>
00017 #include "DEBUG.h"
00018 
00019 void FastEcslent::Physics2D2::init(){
00020         entity->desiredSpeed = entity->speed;
00021         entity->desiredHeading = entity->heading;
00022 
00023 }
00024 
00025 
00026 
00027 
00028 
00029 void FastEcslent::Physics2D2::doHelmsman(double dtime){
00030 
00031         if (kInvalidFloat == entity->desiredSpeed || kInvalidFloat == entity->desiredHeading)
00032                 return;
00033 
00034         DEBUG(std::cout << "Speed: " << entity->vel.length() << ", Heading: " << -atan2(entity->vel.z, entity->vel.x ) << std::endl;)
00035         
00036 
00037 
00038 
00039         if (entity->speed < entity->desiredSpeed) {
00040                 entity->speed += (entity->maxAcceleration * dtime);
00041         } else if (entity->speed > entity->desiredSpeed) {
00042                 entity->speed -= (entity->maxAcceleration * dtime);
00043         }
00044 
00045         Ogre::Quaternion desiredRot(Ogre::Radian(entity->desiredHeading), Ogre::Vector3::UNIT_Y);
00046 
00047         
00048         entity->rot = Ogre::Quaternion::Slerp(entity->maxRotationalSpeed * dtime, entity->rot, desiredRot, true);
00049         entity->heading = entity->rot.getYaw().valueRadians();
00050         entity->yaw     = entity->heading;
00051 
00052         entity->speed = clamp(entity->speed, entity->minSpeed, entity->maxSpeed);
00053 
00054         entity->vel = Ogre::Vector3(cos(-entity->heading) * entity->speed, 0.0f, sin(-entity->heading) * entity->speed);
00055         
00056         entity->pos = entity->pos + (entity->vel * dtime);
00057 
00058         DEBUG(std::cout << "Speed: " << entity->speed << ", Heading: " << entity->heading << std::endl <<std::endl;)
00059 
00060 }
00061 
00062 
00063 void FastEcslent::Physics2D2::tick(double dtime){
00064         doHelmsman(dtime);
00065 }