+ struct State
+ {
+ // primary
+
+ Mf::Vector2 position;
+ Mf::Vector2 momentum;
+ Mf::Vector2 force;
+
+ // secondary
+
+ Mf::Vector2 velocity;
+
+ // constant
+
+ Mf::Scalar mass;
+ Mf::Scalar inverseMass;
+
+ void recalculate()
+ {
+ velocity = momentum * 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 applyDerivative(const Derivative& derivative, Mf::Scalar dt)
+ {
+ position += dt * derivative.velocity;
+ momentum += dt * derivative.force;
+ recalculate();
+ }
+
+ // these two operator overloads all using the state in generic
+ // interpolator implementations
+
+ State operator*(Mf::Scalar scalar) const
+ {
+ State state = *this;
+ state.position *= scalar;
+ state.momentum *= scalar;
+ state.recalculate();
+ return state;
+ }
+
+ State operator+(const State& state) const
+ {
+ State newState = *this;
+ newState.position += state.position;
+ newState.momentum += state.momentum;
+ newState.recalculate();
+ return newState;
+ }
+ };
+
+ State previous;
+ State current;
+
+ Mf::OctreeNodeP treeNode;
+
+
+private:
+
+ static const Mf::Scalar z = 96.0;
+
+ Mf::Vector2 userForce;
+
+ Mf::Tilemap tilemap_;
+ Mf::Animation animation_;
+
+ void updateContainers();
+
+public:
+
+ static CharacterP alloc(const std::string& name)
+ {
+ return CharacterP(new Character(name));
+ }
+