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

ported chipmunk demos
author Extrawurst
date Sat, 04 Dec 2010 02:02:29 +0100
parents
children 4604c914f2ab
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.Plink;
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 import std.math;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
11
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
12 static cpSpace *space;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
13
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
14 // Iterate over all of the bodies and reset the ones that have fallen offscreen.
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
15 static void
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
16 eachBody(cpBody *_body, void *unused)
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
17 {
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
18 if(_body.p.y < -260 || cpfabs(_body.p.x) > 340){
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
19 cpFloat x = frand()*640 - 320;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
20 _body.p = cpv(x, 260);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
21 }
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
22 }
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
23
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
24 static void
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
25 update(int ticks)
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
26 {
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
27 int steps = 1;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
28 cpFloat dt = 1.0f/60.0f/cast(cpFloat)steps;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
29
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
30 for(int i=0; i<steps; i++){
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
31 cpSpaceStep(space, dt);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
32 cpSpaceEachBody(space, &eachBody, null);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
33 }
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
34 }
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
35
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
36 enum NUM_VERTS = 5;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
37
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
38 static cpSpace *
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
39 init()
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
40 {
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
41 cpResetShapeIdCounter();
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
42
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
43 space = cpSpaceNew();
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
44 space.iterations = 5;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
45 space.gravity = cpv(0, -100);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
46
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
47 cpSpaceResizeStaticHash(space, 40.0f, 999);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
48 cpSpaceResizeActiveHash(space, 30.0f, 2999);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
49
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
50 cpBody *_body;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
51 cpBody *staticBody = &space.staticBody;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
52 cpShape *shape;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
53
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
54 // Create vertexes for a pentagon shape.
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
55 cpVect verts[NUM_VERTS];
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
56 for(int i=0; i<NUM_VERTS; i++){
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
57 cpFloat angle = -2.0f*PI*i/(cast(cpFloat) NUM_VERTS);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
58 verts[i] = cpv(10.0f*cos(angle), 10.0f*sin(angle));
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
59 }
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
60
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
61 // Vertexes for a triangle shape.
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
62 enum cpVect tris[] = [
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
63 cpv(-15,-15),
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
64 cpv( 0, 10),
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
65 cpv( 15,-15),
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
66 ];
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
67
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
68 int foo;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
69
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
70 // Create the static triangles.
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
71 foreach(i; 0..9){
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
72 foreach(j; 0..6){
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
73 cpFloat stagger = (j%2)*40;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
74 cpVect offset;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
75 offset.x = (i*80) - 320 + stagger;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
76 offset.y = (j*70) - 240;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
77 //BUG: crazy fucking dmd codegen bug when optimizing (2.050)
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
78 foo = i;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
79
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
80 shape = cpSpaceAddShape(space, cpPolyShapeNew(staticBody, 3, tris.ptr, offset));
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
81 shape.e = 1.0f; shape.u = 1.0f;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
82 shape.layers = NOT_GRABABLE_MASK;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
83 }
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
84 }
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
85
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
86 // Add lots of pentagons.
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
87 for(int i=0; i<300; i++){
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
88 _body = cpSpaceAddBody(space, cpBodyNew(1.0f, cpMomentForPoly(1.0f, NUM_VERTS, verts.ptr, cpvzero)));
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
89 cpFloat x = frand()*640 - 320;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
90 _body.p = cpv(x, 350);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
91
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
92 shape = cpSpaceAddShape(space, cpPolyShapeNew(_body, NUM_VERTS, verts.ptr, cpvzero));
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
93 shape.e = 0.0f; shape.u = 0.4f;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
94 }
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
95
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
96 return space;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
97 }
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
98
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
99 static void
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
100 destroy()
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
101 {
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
102 cpSpaceFreeChildren(space);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
103 cpSpaceFree(space);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
104 }
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
105
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
106 chipmunkDemo Plink = {
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
107 "Plink",
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
108 null,
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
109 &init,
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
110 &update,
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
111 &destroy,
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
112 };