annotate trunk/tests/ChipmunkDemos/samples/Planet.d @ 16:af2f61a96318

ported chipmunk demos
author Extrawurst
date Sat, 04 Dec 2010 02:02:29 +0100
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
16
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
1
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
2 // written in the D programming language
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
3
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
4 module samples.Planet;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
5
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
6 import chipmunkd.chipmunk;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
7
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
8 import samples.ChipmunkDemo;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
9
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
10 static cpSpace *space;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
11 static cpBody *planetBody;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
12
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
13 static cpFloat gravityStrength = 5.0e6f;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
14
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
15 static void
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
16 update(int ticks)
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
17 {
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
18 int steps = 1;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
19 cpFloat dt = 1.0f/60.0f/cast(cpFloat)steps;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
20
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
21 for(int i=0; i<steps; i++){
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
22 cpSpaceStep(space, dt);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
23
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
24 // Update the static body spin so that it looks like it's rotating.
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
25 cpBodyUpdatePosition(planetBody, dt);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
26 }
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
27 }
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
28
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
29 static void
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
30 planetGravityVelocityFunc(cpBody *_body, cpVect gravity, cpFloat damping, cpFloat dt)
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
31 {
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
32 // Gravitational acceleration is proportional to the inverse square of
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
33 // distance, and directed toward the origin. The central planet is assumed
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
34 // to be massive enough that it affects the satellites but not vice versa.
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
35 cpVect p = _body.p;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
36 cpFloat sqdist = cpvlengthsq(p);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
37 cpVect g = cpvmult(p, -gravityStrength / (sqdist * cpfsqrt(sqdist)));
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
38
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
39 cpBodyUpdateVelocity(_body, g, damping, dt);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
40 }
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
41
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
42 static cpVect
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
43 rand_pos(cpFloat radius)
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
44 {
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
45 cpVect v;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
46 do {
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
47 v = cpv(frand()*(640 - 2*radius) - (320 - radius), frand()*(480 - 2*radius) - (240 - radius));
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
48 } while(cpvlength(v) < 85.0f);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
49
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
50 return v;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
51 }
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
52
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
53 static void
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
54 add_box()
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
55 {
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
56 const cpFloat size = 10.0f;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
57 const cpFloat mass = 1.0f;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
58
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
59 cpVect verts[] = [
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
60 cpv(-size,-size),
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
61 cpv(-size, size),
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
62 cpv( size, size),
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
63 cpv( size,-size),
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
64 ];
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
65
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
66 cpFloat radius = cpvlength(cpv(size, size));
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
67
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
68 cpBody *_body = cpSpaceAddBody(space, cpBodyNew(mass, cpMomentForPoly(mass, 4, verts.ptr, cpvzero)));
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
69 _body.velocity_func = &planetGravityVelocityFunc;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
70 _body.p = rand_pos(radius);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
71
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
72 // Set the box's velocity to put it into a circular orbit from its
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
73 // starting position.
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
74 cpFloat r = cpvlength(_body.p);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
75 cpFloat v = cpfsqrt(gravityStrength / r) / r;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
76 _body.v = cpvmult(cpvperp(_body.p), v);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
77
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
78 // Set the box's angular velocity to match its orbital period and
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
79 // align its initial angle with its position.
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
80 _body.w = v;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
81 cpBodySetAngle(_body, cpfatan2(_body.p.y, _body.p.x));
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
82
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
83 cpShape *shape = cpSpaceAddShape(space, cpPolyShapeNew(_body, 4, verts.ptr, cpvzero));
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
84 shape.e = 0.0f; shape.u = 0.7f;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
85 }
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
86
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
87 static cpSpace *
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
88 init()
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
89 {
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
90 planetBody = cpBodyNew(INFINITY, INFINITY);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
91 planetBody.w = 0.2f;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
92
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
93 cpResetShapeIdCounter();
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
94
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
95 space = cpSpaceNew();
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
96 cpSpaceResizeActiveHash(space, 30.0f, 10000);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
97 space.iterations = 20;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
98
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
99 for(int i=0; i<30; i++)
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
100 add_box();
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
101
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
102 cpShape *shape = cpSpaceAddShape(space, cpCircleShapeNew(planetBody, 70.0f, cpvzero));
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
103 shape.e = 1.0f; shape.u = 1.0f;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
104 shape.layers = NOT_GRABABLE_MASK;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
105
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
106 return space;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
107 }
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
108
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
109 static void
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
110 destroy()
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
111 {
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
112 cpBodyFree(planetBody);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
113 cpSpaceFreeChildren(space);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
114 cpSpaceFree(space);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
115 }
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
116
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
117 chipmunkDemo Planet = {
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
118 "Planet",
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
119 null,
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
120 &init,
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
121 &update,
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
122 &destroy,
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
123 };