author | saiam |
Thu, 20 Nov 2008 21:25:09 +0000 | |
changeset 83 | cbba9729e92b |
parent 79 | 295ecb26d8ff |
child 85 | 351cb6b69c04 |
permissions | -rw-r--r-- |
42 | 1 |
#ifndef PHYSICS_HH |
2 |
#define PHYSICS_HH |
|
3 |
||
4 |
#include "Vector.hh" |
|
5 |
||
72 | 6 |
#include <vector> |
83
cbba9729e92b
Integrointia fyssaan, jotain pikkubugausta havaittavissa.
saiam
parents:
79
diff
changeset
|
7 |
#include <queue> |
50
9e1a6506f5a1
some rough-handed code modifications towards a newer, better, working Physics
terom
parents:
48
diff
changeset
|
8 |
#include <ClanLib/core.h> |
9e1a6506f5a1
some rough-handed code modifications towards a newer, better, working Physics
terom
parents:
48
diff
changeset
|
9 |
|
79 | 10 |
typedef uint16_t TimeMS; |
78 | 11 |
|
79 | 12 |
const TimeMS PHYSICS_TICK_MS = 10; |
42 | 13 |
|
72 | 14 |
enum TerrainType {EMPTY, DIRT, ROCK}; |
71 | 15 |
|
50
9e1a6506f5a1
some rough-handed code modifications towards a newer, better, working Physics
terom
parents:
48
diff
changeset
|
16 |
// forward-declare |
9e1a6506f5a1
some rough-handed code modifications towards a newer, better, working Physics
terom
parents:
48
diff
changeset
|
17 |
class PhysicsObject; |
83
cbba9729e92b
Integrointia fyssaan, jotain pikkubugausta havaittavissa.
saiam
parents:
79
diff
changeset
|
18 |
class Force; |
cbba9729e92b
Integrointia fyssaan, jotain pikkubugausta havaittavissa.
saiam
parents:
79
diff
changeset
|
19 |
struct Derivative; |
50
9e1a6506f5a1
some rough-handed code modifications towards a newer, better, working Physics
terom
parents:
48
diff
changeset
|
20 |
|
42 | 21 |
class PhysicsWorld { |
60 | 22 |
friend class PhysicsObject; |
70 | 23 |
|
24 |
private: |
|
25 |
CL_Timer tick_timer; |
|
26 |
||
27 |
protected: |
|
28 |
std::vector<PhysicsObject*> objects; |
|
29 |
Vector gravity; |
|
75 | 30 |
Vector dimensions; //const requested |
70 | 31 |
|
72 | 32 |
std::vector<std::vector<TerrainType> > terrain; |
71 | 33 |
|
70 | 34 |
CL_SlotContainer slots; |
35 |
||
36 |
PhysicsWorld (Vector gravity, Vector dimensions); |
|
37 |
||
38 |
public: |
|
39 |
void addObject (PhysicsObject *object); |
|
50
9e1a6506f5a1
some rough-handed code modifications towards a newer, better, working Physics
terom
parents:
48
diff
changeset
|
40 |
|
70 | 41 |
void tick (void); |
74 | 42 |
void generateTerrain (int seed); |
43 |
bool collided (Vector oldPos, Vector newPos); |
|
77
98dc9008d15f
changed collision detection, remove old if content with new
nireco
parents:
75
diff
changeset
|
44 |
|
98dc9008d15f
changed collision detection, remove old if content with new
nireco
parents:
75
diff
changeset
|
45 |
TerrainType getType(Vector pos) const; |
42 | 46 |
}; |
47 |
||
48 |
class PhysicsObject { |
|
70 | 49 |
protected: |
50 |
PhysicsWorld &world; |
|
83
cbba9729e92b
Integrointia fyssaan, jotain pikkubugausta havaittavissa.
saiam
parents:
79
diff
changeset
|
51 |
|
70 | 52 |
float mass; |
53 |
Vector position; |
|
54 |
Vector velocity; |
|
74 | 55 |
// Whether the object (worms mainly) is in the air |
56 |
// or firmly on the ground. Affects to physics. |
|
57 |
bool inAir; |
|
83
cbba9729e92b
Integrointia fyssaan, jotain pikkubugausta havaittavissa.
saiam
parents:
79
diff
changeset
|
58 |
|
cbba9729e92b
Integrointia fyssaan, jotain pikkubugausta havaittavissa.
saiam
parents:
79
diff
changeset
|
59 |
// Force queue that is emptied on every tick |
cbba9729e92b
Integrointia fyssaan, jotain pikkubugausta havaittavissa.
saiam
parents:
79
diff
changeset
|
60 |
std::queue<Force> forceq; |
cbba9729e92b
Integrointia fyssaan, jotain pikkubugausta havaittavissa.
saiam
parents:
79
diff
changeset
|
61 |
Vector posAfterTick; |
cbba9729e92b
Integrointia fyssaan, jotain pikkubugausta havaittavissa.
saiam
parents:
79
diff
changeset
|
62 |
Vector velAfterTick; |
cbba9729e92b
Integrointia fyssaan, jotain pikkubugausta havaittavissa.
saiam
parents:
79
diff
changeset
|
63 |
|
70 | 64 |
PhysicsObject (PhysicsWorld &world, float mass, Vector position, Vector velocity); |
65 |
||
79 | 66 |
virtual void applyForce (Vector force, TimeMS dt); |
70 | 67 |
void updatePhysics (Vector position, Vector velocity); |
68 |
||
69 |
private: |
|
70 |
void updatePosition (void); |
|
69 | 71 |
|
70 | 72 |
/** |
73 |
* Use RK4 to integrate the effects of force over a time intervall. |
|
74 |
*/ |
|
79 | 75 |
void integrate(Vector force, TimeMS dt); |
83
cbba9729e92b
Integrointia fyssaan, jotain pikkubugausta havaittavissa.
saiam
parents:
79
diff
changeset
|
76 |
Derivative evaluate(Vector force, TimeMS dt, Derivative &d); |
cbba9729e92b
Integrointia fyssaan, jotain pikkubugausta havaittavissa.
saiam
parents:
79
diff
changeset
|
77 |
Vector acceleration(const Vector &force); |
cbba9729e92b
Integrointia fyssaan, jotain pikkubugausta havaittavissa.
saiam
parents:
79
diff
changeset
|
78 |
|
70 | 79 |
public: |
80 |
Vector getPosition (void); |
|
81 |
||
82 |
void tick (void); |
|
42 | 83 |
}; |
84 |
||
83
cbba9729e92b
Integrointia fyssaan, jotain pikkubugausta havaittavissa.
saiam
parents:
79
diff
changeset
|
85 |
class Force { |
cbba9729e92b
Integrointia fyssaan, jotain pikkubugausta havaittavissa.
saiam
parents:
79
diff
changeset
|
86 |
public: |
cbba9729e92b
Integrointia fyssaan, jotain pikkubugausta havaittavissa.
saiam
parents:
79
diff
changeset
|
87 |
Vector force; |
cbba9729e92b
Integrointia fyssaan, jotain pikkubugausta havaittavissa.
saiam
parents:
79
diff
changeset
|
88 |
TimeMS dt; |
cbba9729e92b
Integrointia fyssaan, jotain pikkubugausta havaittavissa.
saiam
parents:
79
diff
changeset
|
89 |
|
cbba9729e92b
Integrointia fyssaan, jotain pikkubugausta havaittavissa.
saiam
parents:
79
diff
changeset
|
90 |
Force() {} |
cbba9729e92b
Integrointia fyssaan, jotain pikkubugausta havaittavissa.
saiam
parents:
79
diff
changeset
|
91 |
Force(Vector force, TimeMS dt) : force(force), dt(dt) {} |
cbba9729e92b
Integrointia fyssaan, jotain pikkubugausta havaittavissa.
saiam
parents:
79
diff
changeset
|
92 |
}; |
cbba9729e92b
Integrointia fyssaan, jotain pikkubugausta havaittavissa.
saiam
parents:
79
diff
changeset
|
93 |
|
cbba9729e92b
Integrointia fyssaan, jotain pikkubugausta havaittavissa.
saiam
parents:
79
diff
changeset
|
94 |
struct Derivative { |
cbba9729e92b
Integrointia fyssaan, jotain pikkubugausta havaittavissa.
saiam
parents:
79
diff
changeset
|
95 |
Vector dx; // Velocity |
cbba9729e92b
Integrointia fyssaan, jotain pikkubugausta havaittavissa.
saiam
parents:
79
diff
changeset
|
96 |
Vector dv; // Acceleration |
cbba9729e92b
Integrointia fyssaan, jotain pikkubugausta havaittavissa.
saiam
parents:
79
diff
changeset
|
97 |
}; |
cbba9729e92b
Integrointia fyssaan, jotain pikkubugausta havaittavissa.
saiam
parents:
79
diff
changeset
|
98 |
|
cbba9729e92b
Integrointia fyssaan, jotain pikkubugausta havaittavissa.
saiam
parents:
79
diff
changeset
|
99 |
|
cbba9729e92b
Integrointia fyssaan, jotain pikkubugausta havaittavissa.
saiam
parents:
79
diff
changeset
|
100 |
|
42 | 101 |
#endif |