diff -r 9436b89b0d28 -r 71c5b12a2b3f src/proto2/Physics.cc --- 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;