Removed unnecessary PhysicsObject attribute posAfterTick and velAfterTick and made integrate to use references.
--- 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.