src/proto2/Physics.hh
author terom
Thu, 20 Nov 2008 23:45:33 +0000
branchno-netsession
changeset 41 ca80cd67785d
parent 35 e21cfda0edde
permissions -rw-r--r--
merge r64 through r88 from trunk
#ifndef PHYSICS_HH
#define PHYSICS_HH

#include "Vector.hh"

#include <vector>
#include <queue>
#include <ClanLib/core.h>

typedef uint16_t TimeMS;

const TimeMS PHYSICS_TICK_MS = 10;

enum TerrainType {EMPTY, DIRT, ROCK};

// forward-declare
class PhysicsObject;
typedef Vector Force;
struct Derivative;

class PhysicsWorld {
    friend class PhysicsObject;
    
private:
    CL_Timer tick_timer;
    
protected:
    std::vector<PhysicsObject*> objects;
    Vector gravity;
    Vector dimensions;


    std::vector<std::vector<TerrainType> > terrain;

    CL_SlotContainer slots;
    
    PhysicsWorld (Vector gravity, Vector dimensions);


public:
    
    void addObject (PhysicsObject *object);

    void tick (void);
    void generateTerrain (int seed);
    bool collided (Vector oldPos, Vector newPos);

    TerrainType getType(Vector pos) const;
};

class PhysicsObject {
protected:
    PhysicsWorld &world;
    
    float mass;
    Vector position;
    Vector velocity;
    // Whether the object (worms mainly) is in the air 
    // or firmly on the ground. Affects to physics.
    bool inAir;

	// Shape of the object.
	// //TODO
	std::vector<Vector> edges;

    // Force queue that is emptied on every tick
    std::queue<Force> forceq;
    Vector posAfterTick;
    Vector velAfterTick;

    PhysicsObject (PhysicsWorld &world, float mass, Vector position, Vector velocity);
    
    virtual void applyForce (Force force, TimeMS dt);
    void updatePhysics (Vector position, Vector velocity);
    
private:
    void updatePosition (void);

    /**
     * Use RK4 to integrate the effects of force over a time intervall.
     */
    void integrate(Force force, TimeMS dt);
    Derivative evaluate(Force force, TimeMS dt, Derivative &d);
    Vector acceleration(const Force &force);

public:
    Vector getPosition (void);
    
    void tick (void);
};

struct Derivative {
    Vector dx; // Velocity
    Vector dv; // Acceleration
};



#endif