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
35
e21cfda0edde Merge from at r31:36
terom
parents:
diff changeset
     1
#ifndef PHYSICS_HH
e21cfda0edde Merge from at r31:36
terom
parents:
diff changeset
     2
#define PHYSICS_HH
e21cfda0edde Merge from at r31:36
terom
parents:
diff changeset
     3
e21cfda0edde Merge from at r31:36
terom
parents:
diff changeset
     4
#include "Vector.hh"
e21cfda0edde Merge from at r31:36
terom
parents:
diff changeset
     5
41
ca80cd67785d merge r64 through r88 from trunk
terom
parents: 35
diff changeset
     6
#include <vector>
ca80cd67785d merge r64 through r88 from trunk
terom
parents: 35
diff changeset
     7
#include <queue>
35
e21cfda0edde Merge from at r31:36
terom
parents:
diff changeset
     8
#include <ClanLib/core.h>
e21cfda0edde Merge from at r31:36
terom
parents:
diff changeset
     9
41
ca80cd67785d merge r64 through r88 from trunk
terom
parents: 35
diff changeset
    10
typedef uint16_t TimeMS;
ca80cd67785d merge r64 through r88 from trunk
terom
parents: 35
diff changeset
    11
ca80cd67785d merge r64 through r88 from trunk
terom
parents: 35
diff changeset
    12
const TimeMS PHYSICS_TICK_MS = 10;
ca80cd67785d merge r64 through r88 from trunk
terom
parents: 35
diff changeset
    13
ca80cd67785d merge r64 through r88 from trunk
terom
parents: 35
diff changeset
    14
enum TerrainType {EMPTY, DIRT, ROCK};
35
e21cfda0edde Merge from at r31:36
terom
parents:
diff changeset
    15
e21cfda0edde Merge from at r31:36
terom
parents:
diff changeset
    16
// forward-declare
e21cfda0edde Merge from at r31:36
terom
parents:
diff changeset
    17
class PhysicsObject;
41
ca80cd67785d merge r64 through r88 from trunk
terom
parents: 35
diff changeset
    18
typedef Vector Force;
ca80cd67785d merge r64 through r88 from trunk
terom
parents: 35
diff changeset
    19
struct Derivative;
35
e21cfda0edde Merge from at r31:36
terom
parents:
diff changeset
    20
e21cfda0edde Merge from at r31:36
terom
parents:
diff changeset
    21
class PhysicsWorld {
e21cfda0edde Merge from at r31:36
terom
parents:
diff changeset
    22
    friend class PhysicsObject;
41
ca80cd67785d merge r64 through r88 from trunk
terom
parents: 35
diff changeset
    23
    
ca80cd67785d merge r64 through r88 from trunk
terom
parents: 35
diff changeset
    24
private:
ca80cd67785d merge r64 through r88 from trunk
terom
parents: 35
diff changeset
    25
    CL_Timer tick_timer;
ca80cd67785d merge r64 through r88 from trunk
terom
parents: 35
diff changeset
    26
    
ca80cd67785d merge r64 through r88 from trunk
terom
parents: 35
diff changeset
    27
protected:
ca80cd67785d merge r64 through r88 from trunk
terom
parents: 35
diff changeset
    28
    std::vector<PhysicsObject*> objects;
ca80cd67785d merge r64 through r88 from trunk
terom
parents: 35
diff changeset
    29
    Vector gravity;
ca80cd67785d merge r64 through r88 from trunk
terom
parents: 35
diff changeset
    30
    Vector dimensions;
35
e21cfda0edde Merge from at r31:36
terom
parents:
diff changeset
    31
e21cfda0edde Merge from at r31:36
terom
parents:
diff changeset
    32
41
ca80cd67785d merge r64 through r88 from trunk
terom
parents: 35
diff changeset
    33
    std::vector<std::vector<TerrainType> > terrain;
35
e21cfda0edde Merge from at r31:36
terom
parents:
diff changeset
    34
41
ca80cd67785d merge r64 through r88 from trunk
terom
parents: 35
diff changeset
    35
    CL_SlotContainer slots;
ca80cd67785d merge r64 through r88 from trunk
terom
parents: 35
diff changeset
    36
    
ca80cd67785d merge r64 through r88 from trunk
terom
parents: 35
diff changeset
    37
    PhysicsWorld (Vector gravity, Vector dimensions);
35
e21cfda0edde Merge from at r31:36
terom
parents:
diff changeset
    38
41
ca80cd67785d merge r64 through r88 from trunk
terom
parents: 35
diff changeset
    39
ca80cd67785d merge r64 through r88 from trunk
terom
parents: 35
diff changeset
    40
public:
ca80cd67785d merge r64 through r88 from trunk
terom
parents: 35
diff changeset
    41
    
ca80cd67785d merge r64 through r88 from trunk
terom
parents: 35
diff changeset
    42
    void addObject (PhysicsObject *object);
ca80cd67785d merge r64 through r88 from trunk
terom
parents: 35
diff changeset
    43
ca80cd67785d merge r64 through r88 from trunk
terom
parents: 35
diff changeset
    44
    void tick (void);
ca80cd67785d merge r64 through r88 from trunk
terom
parents: 35
diff changeset
    45
    void generateTerrain (int seed);
ca80cd67785d merge r64 through r88 from trunk
terom
parents: 35
diff changeset
    46
    bool collided (Vector oldPos, Vector newPos);
ca80cd67785d merge r64 through r88 from trunk
terom
parents: 35
diff changeset
    47
ca80cd67785d merge r64 through r88 from trunk
terom
parents: 35
diff changeset
    48
    TerrainType getType(Vector pos) const;
35
e21cfda0edde Merge from at r31:36
terom
parents:
diff changeset
    49
};
e21cfda0edde Merge from at r31:36
terom
parents:
diff changeset
    50
e21cfda0edde Merge from at r31:36
terom
parents:
diff changeset
    51
class PhysicsObject {
41
ca80cd67785d merge r64 through r88 from trunk
terom
parents: 35
diff changeset
    52
protected:
ca80cd67785d merge r64 through r88 from trunk
terom
parents: 35
diff changeset
    53
    PhysicsWorld &world;
35
e21cfda0edde Merge from at r31:36
terom
parents:
diff changeset
    54
    
41
ca80cd67785d merge r64 through r88 from trunk
terom
parents: 35
diff changeset
    55
    float mass;
ca80cd67785d merge r64 through r88 from trunk
terom
parents: 35
diff changeset
    56
    Vector position;
ca80cd67785d merge r64 through r88 from trunk
terom
parents: 35
diff changeset
    57
    Vector velocity;
ca80cd67785d merge r64 through r88 from trunk
terom
parents: 35
diff changeset
    58
    // Whether the object (worms mainly) is in the air 
ca80cd67785d merge r64 through r88 from trunk
terom
parents: 35
diff changeset
    59
    // or firmly on the ground. Affects to physics.
ca80cd67785d merge r64 through r88 from trunk
terom
parents: 35
diff changeset
    60
    bool inAir;
35
e21cfda0edde Merge from at r31:36
terom
parents:
diff changeset
    61
41
ca80cd67785d merge r64 through r88 from trunk
terom
parents: 35
diff changeset
    62
	// Shape of the object.
ca80cd67785d merge r64 through r88 from trunk
terom
parents: 35
diff changeset
    63
	// //TODO
ca80cd67785d merge r64 through r88 from trunk
terom
parents: 35
diff changeset
    64
	std::vector<Vector> edges;
ca80cd67785d merge r64 through r88 from trunk
terom
parents: 35
diff changeset
    65
ca80cd67785d merge r64 through r88 from trunk
terom
parents: 35
diff changeset
    66
    // Force queue that is emptied on every tick
ca80cd67785d merge r64 through r88 from trunk
terom
parents: 35
diff changeset
    67
    std::queue<Force> forceq;
ca80cd67785d merge r64 through r88 from trunk
terom
parents: 35
diff changeset
    68
    Vector posAfterTick;
ca80cd67785d merge r64 through r88 from trunk
terom
parents: 35
diff changeset
    69
    Vector velAfterTick;
ca80cd67785d merge r64 through r88 from trunk
terom
parents: 35
diff changeset
    70
ca80cd67785d merge r64 through r88 from trunk
terom
parents: 35
diff changeset
    71
    PhysicsObject (PhysicsWorld &world, float mass, Vector position, Vector velocity);
35
e21cfda0edde Merge from at r31:36
terom
parents:
diff changeset
    72
    
41
ca80cd67785d merge r64 through r88 from trunk
terom
parents: 35
diff changeset
    73
    virtual void applyForce (Force force, TimeMS dt);
ca80cd67785d merge r64 through r88 from trunk
terom
parents: 35
diff changeset
    74
    void updatePhysics (Vector position, Vector velocity);
ca80cd67785d merge r64 through r88 from trunk
terom
parents: 35
diff changeset
    75
    
ca80cd67785d merge r64 through r88 from trunk
terom
parents: 35
diff changeset
    76
private:
ca80cd67785d merge r64 through r88 from trunk
terom
parents: 35
diff changeset
    77
    void updatePosition (void);
35
e21cfda0edde Merge from at r31:36
terom
parents:
diff changeset
    78
41
ca80cd67785d merge r64 through r88 from trunk
terom
parents: 35
diff changeset
    79
    /**
ca80cd67785d merge r64 through r88 from trunk
terom
parents: 35
diff changeset
    80
     * Use RK4 to integrate the effects of force over a time intervall.
ca80cd67785d merge r64 through r88 from trunk
terom
parents: 35
diff changeset
    81
     */
ca80cd67785d merge r64 through r88 from trunk
terom
parents: 35
diff changeset
    82
    void integrate(Force force, TimeMS dt);
ca80cd67785d merge r64 through r88 from trunk
terom
parents: 35
diff changeset
    83
    Derivative evaluate(Force force, TimeMS dt, Derivative &d);
ca80cd67785d merge r64 through r88 from trunk
terom
parents: 35
diff changeset
    84
    Vector acceleration(const Force &force);
35
e21cfda0edde Merge from at r31:36
terom
parents:
diff changeset
    85
41
ca80cd67785d merge r64 through r88 from trunk
terom
parents: 35
diff changeset
    86
public:
ca80cd67785d merge r64 through r88 from trunk
terom
parents: 35
diff changeset
    87
    Vector getPosition (void);
ca80cd67785d merge r64 through r88 from trunk
terom
parents: 35
diff changeset
    88
    
ca80cd67785d merge r64 through r88 from trunk
terom
parents: 35
diff changeset
    89
    void tick (void);
35
e21cfda0edde Merge from at r31:36
terom
parents:
diff changeset
    90
};
e21cfda0edde Merge from at r31:36
terom
parents:
diff changeset
    91
41
ca80cd67785d merge r64 through r88 from trunk
terom
parents: 35
diff changeset
    92
struct Derivative {
ca80cd67785d merge r64 through r88 from trunk
terom
parents: 35
diff changeset
    93
    Vector dx; // Velocity
ca80cd67785d merge r64 through r88 from trunk
terom
parents: 35
diff changeset
    94
    Vector dv; // Acceleration
ca80cd67785d merge r64 through r88 from trunk
terom
parents: 35
diff changeset
    95
};
ca80cd67785d merge r64 through r88 from trunk
terom
parents: 35
diff changeset
    96
ca80cd67785d merge r64 through r88 from trunk
terom
parents: 35
diff changeset
    97
ca80cd67785d merge r64 through r88 from trunk
terom
parents: 35
diff changeset
    98
35
e21cfda0edde Merge from at r31:36
terom
parents:
diff changeset
    99
#endif