Removed unnecessary PhysicsObject attribute posAfterTick and velAfterTick and made integrate to use references.
authorsaiam
Mon, 01 Dec 2008 23:39:37 +0000
changeset 169 71c5b12a2b3f
parent 168 9436b89b0d28
child 170 fe74105c07ea
Removed unnecessary PhysicsObject attribute posAfterTick and velAfterTick and made integrate to use references.
src/proto2/Physics.cc
src/proto2/Physics.hh
--- a/src/proto2/Physics.cc	Mon Dec 01 23:32:17 2008 +0000
+++ b/src/proto2/Physics.cc	Mon Dec 01 23:39:37 2008 +0000
@@ -94,8 +94,6 @@
     
     // Go trough every force in the queue
     Force total;
-    posAfterTick = position;
-    velAfterTick = velocity;
     while (!forceq.empty()) {
         total += forceq.front();
         forceq.pop();
@@ -116,9 +114,9 @@
         //total.x = 0;
     }
 
-    integrate(total, PHYSICS_TICK_MS);
-
-    Vector newPosition = posAfterTick /*+ (velAfterTick * PHYSICS_TICK_MS)/1000*/;
+    Vector newPosition;
+    Vector velAfterTick;
+    integrate(total, PHYSICS_TICK_MS, newPosition, velAfterTick);
     this->velocity = velAfterTick;
 
    
@@ -237,12 +235,14 @@
  * @param force Force vector.
  * @param dt The time the force is applied (<=PHYSICS_TICK_MS)
  */
-void PhysicsObject::integrate(Force force, TimeMS dt) {
+void PhysicsObject::integrate(Force force, TimeMS dt, Vector &posAfterTick, Vector &velAfterTick) {
+    posAfterTick = position;
+    velAfterTick = velocity;
     Derivative tmpd;
-    Derivative k1 = evaluate(force, 0, tmpd);
-    Derivative k2 = evaluate(force, 0.5f*dt, k1);
-    Derivative k3 = evaluate(force, 0.5f*dt, k2);
-    Derivative k4 = evaluate(force, dt, k3);
+    Derivative k1 = evaluate(force, 0, tmpd, posAfterTick, velAfterTick);
+    Derivative k2 = evaluate(force, 0.5f*dt, k1, posAfterTick, velAfterTick);
+    Derivative k3 = evaluate(force, 0.5f*dt, k2, posAfterTick, velAfterTick);
+    Derivative k4 = evaluate(force, dt, k3, posAfterTick, velAfterTick);
     
 
     const Vector dxdt = (k1.dx + (k2.dx + k3.dx) * 2.0f + k4.dx) * 1.0f/6.0f;
@@ -254,7 +254,7 @@
     //Engine::log(DEBUG, "PhysicsObject.integrate") << "velAfterTick: " << velAfterTick;
 }
 
-Derivative PhysicsObject::evaluate(Force force, TimeMS dt, Derivative &d) {
+Derivative PhysicsObject::evaluate(Force force, TimeMS dt, Derivative &d, const Vector &posAfterTick, const Vector &velAfterTick) {
     Vector curPos = posAfterTick + (d.dx*dt)/1000;
     Vector curVel = velAfterTick + (d.dv*dt)/1000;
 
--- a/src/proto2/Physics.hh	Mon Dec 01 23:32:17 2008 +0000
+++ b/src/proto2/Physics.hh	Mon Dec 01 23:39:37 2008 +0000
@@ -150,9 +150,6 @@
     // TODO: Should these operations be moved to PhysicsWorld?
     // Force queue that is emptied on every tick
     std::queue<Force> forceq;
-    // Helper variables for integration
-    Vector posAfterTick;
-    Vector velAfterTick;
 
     /**
      * Handle player movement and apply forces.
@@ -166,7 +163,7 @@
      * @param force Force to integrate
      * @param dt Time intervall
      */
-    void integrate(Force force, TimeMS dt);
+    void integrate(Force force, TimeMS dt, Vector &posAfterTick, Vector &velAfterTick);
 
     /**
      * Evaluate the value of the derivative at given time
@@ -175,7 +172,7 @@
      * @param dt Time
      * @param d Previous derivative
      */
-    Derivative evaluate(Force force, TimeMS dt, Derivative &d);
+    Derivative evaluate(Force force, TimeMS dt, Derivative &d, const Vector &posAfterTick, const Vector &velAfterTick);
 
     /**
      * Return object acceleration with given force.