+ // primary
+
+ Mf::Vector2 position;
+ Mf::Vector2 momentum;
+ Mf::Vector2 force;
+
+ // secondary
+
+ Mf::Vector2 velocity;
+
+ // constant
+
+ Mf::Scalar mass;
+ Mf::Scalar inverseMass;
+
+
+ void getDerivative(Derivative& derivative, Mf::Scalar t) const
+ {
+ //derivative.velocity = Mf::Vector2(0.0, 0.0);
+ //derivative.force = Mf::Vector2(0.0, 0.0);
+ derivative.velocity = velocity;
+ derivative.force = force;
+ }
+
+ void recalculate()
+ {
+ velocity = momentum * inverseMass;
+ }
+
+ void applyDerivative(const Derivative& derivative, Mf::Scalar dt)
+ {
+ position += dt * derivative.velocity;
+ momentum += dt * derivative.force;
+ recalculate();
+ }
+
+ State operator*(Mf::Scalar scalar) const
+ {
+ State state = *this;
+ state.position *= scalar;
+ state.momentum *= scalar;
+ state.recalculate();
+ return state;
+ }
+
+ State operator+(State state) const
+ {
+ State newState = *this;
+ newState.position += state.position;
+ newState.momentum += state.momentum;
+ newState.recalculate();
+ return newState;
+ }