annotate trunk/tests/ChipmunkDemos/samples/Query.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.Query;
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 import gameApp;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
10
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
11 import std.math;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
12
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
13 //extern cpVect mousePos;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
14
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
15 static cpSpace *space;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
16
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
17 static cpShape *querySeg = null;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
18
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
19
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
20 static void
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
21 update(int ticks)
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
22 {
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
23 //messageString[0] = '\0';
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
24
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
25 cpVect start = cpvzero;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
26 cpVect end = /*cpv(0, 85);//*/mousePos;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
27 cpVect lineEnd = end;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
28
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
29 //{
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
30 // char infoString[1024];
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
31 // sprintf(infoString, "Query: Dist(%f) Point%s, ", cpvdist(start, end), cpvstr(end));
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
32 // strcat(messageString, infoString);
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 cpSegmentQueryInfo info = {};
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
36 if(cpSpaceSegmentQueryFirst(space, start, end, CP_ALL_LAYERS, CP_NO_GROUP, &info)){
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
37 cpVect point = cpSegmentQueryHitPoint(start, end, info);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
38 lineEnd = cpvadd(point, cpvzero);//cpvmult(info.n, 4.0f));
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
39
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
40 //char infoString[1024];
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
41 //sprintf(infoString, "Segment Query: Dist(%f) Normal%s", cpSegmentQueryHitDist(start, end, info), cpvstr(info.n));
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
42 //strcat(messageString, infoString);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
43 } else {
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
44 //strcat(messageString, "Segment Query (None)");
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
45 }
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
46
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
47 cpSegmentShapeSetEndpoints(querySeg, start, lineEnd);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
48 cpShapeCacheBB(querySeg); // force it to update it's collision detection data so it will draw
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
49
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
50 // normal other stuff.
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
51 int steps = 1;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
52 cpFloat dt = 1.0f/60.0f/cast(cpFloat)steps;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
53
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
54 for(int i=0; i<steps; i++){
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
55 cpSpaceStep(space, dt);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
56 }
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
57 }
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
58
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
59 static cpSpace *
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
60 init()
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
61 {
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
62 cpResetShapeIdCounter();
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
63
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
64 space = cpSpaceNew();
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
65 space.elasticIterations = 0;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
66 space.iterations = 5;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
67
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
68 cpSpaceResizeStaticHash(space, 40.0f, 999);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
69 cpSpaceResizeActiveHash(space, 30.0f, 2999);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
70
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
71 cpBody *staticBody = &space.staticBody;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
72 cpShape *shape;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
73
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
74 // add a non-collidable segment as a quick and dirty way to draw the query line
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
75 shape = cpSpaceAddShape(space, cpSegmentShapeNew(staticBody, cpvzero, cpv(100.0f, 0.0f), 4.0f));
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
76 shape.layers = 0;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
77 querySeg = shape;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
78
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
79 { // add a fat segment
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
80 cpFloat mass = 1.0f;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
81 cpFloat length = 100.0f;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
82 cpVect a = cpv(-length/2.0f, 0.0f), b = cpv(length/2.0f, 0.0f);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
83
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
84 cpBody *_body = cpSpaceAddBody(space, cpBodyNew(mass, cpMomentForSegment(mass, a, b)));
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
85 _body.p = cpv(0.0f, 100.0f);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
86
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
87 cpSpaceAddShape(space, cpSegmentShapeNew(_body, a, b, 20.0f));
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
88 }
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
89
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
90 { // add a static segment
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
91 cpSpaceAddShape(space, cpSegmentShapeNew(staticBody, cpv(0, 300), cpv(300, 0), 0.0f));
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
92 }
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
93
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
94 { // add a pentagon
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
95 cpFloat mass = 1.0f;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
96 const int NUM_VERTS = 5;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
97
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
98 cpVect verts[NUM_VERTS];
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
99 for(int i=0; i<NUM_VERTS; i++){
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
100 cpFloat angle = -2*PI*i/(cast(cpFloat) NUM_VERTS);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
101 verts[i] = cpv(30*cos(angle), 30*sin(angle));
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
102 }
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
103
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
104 cpBody *_body = cpSpaceAddBody(space, cpBodyNew(mass, cpMomentForPoly(mass, NUM_VERTS, verts.ptr, cpvzero)));
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
105 _body.p = cpv(50.0f, 50.0f);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
106
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
107 cpSpaceAddShape(space, cpPolyShapeNew(_body, NUM_VERTS, verts.ptr, cpvzero));
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
108 }
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
109
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
110 { // add a circle
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
111 cpFloat mass = 1.0f;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
112 cpFloat r = 20.0f;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
113
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
114 cpBody *_body = cpSpaceAddBody(space, cpBodyNew(mass, cpMomentForCircle(mass, 0.0f, r, cpvzero)));
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
115 _body.p = cpv(100.0f, 100.0f);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
116
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
117 cpSpaceAddShape(space, cpCircleShapeNew(_body, r, cpvzero));
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
118 }
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
119
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
120 return space;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
121 }
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
122
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
123 static void
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
124 destroy()
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
125 {
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
126 cpSpaceFreeChildren(space);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
127 cpSpaceFree(space);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
128 }
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
129
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
130 chipmunkDemo Query = {
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
131 "Segment Query",
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
132 null,
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
133 &init,
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
134 &update,
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
135 &destroy,
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
136 };