annotate trunk/tests/ChipmunkDemos/drawSpace.d @ 16:af2f61a96318

ported chipmunk demos
author Extrawurst
date Sat, 04 Dec 2010 02:02:29 +0100
parents
children f897d96cc7c9
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
16
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
1 /* Copyright (c) 2007 Scott Lembcke
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
2 *
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
3 * Permission is hereby granted, free of charge, to any person obtaining a copy
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
4 * of this software and associated documentation files (the "Software"), to deal
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
5 * in the Software without restriction, including without limitation the rights
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
6 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
7 * copies of the Software, and to permit persons to whom the Software is
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
8 * furnished to do so, subject to the following conditions:
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
9 *
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
10 * The above copyright notice and this permission notice shall be included in
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
11 * all copies or substantial portions of the Software.
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
12 *
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
13 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
14 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
15 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
16 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
17 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
18 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
19 * SOFTWARE.
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
20 */
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
21 module drawSpace;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
22
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
23 import derelict.opengl.gl;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
24
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
25 import chipmunkd.chipmunk;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
26
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
27 import std.math:PI;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
28 import std.stdio;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
29
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
30 struct drawSpaceOptions {
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
31 int drawHash;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
32 int drawBBs;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
33 int drawShapes;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
34 float collisionPointSize;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
35 float bodyPointSize;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
36 float lineThickness;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
37 }
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
38
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
39 /*
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
40 IMPORTANT - READ ME!
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
41
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
42 This file sets up a simple interface that the individual demos can use to get
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
43 a Chipmunk space running and draw what's in it. In order to keep the Chipmunk
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
44 examples clean and simple, they contain no graphics code. All drawing is done
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
45 by accessing the Chipmunk structures at a very low level. It is NOT
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
46 recommended to write a game or application this way as it does not scale
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
47 beyond simple shape drawing and is very dependent on implementation details
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
48 about Chipmunk which may change with little to no warning.
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
49 */
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
50
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
51 enum float[3] LINE_COLOR = [0,0,0];
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
52 enum float[3] COLLISION_COLOR = [1,0,0];
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
53 enum float[3] BODY_COLOR = [0,0,1];
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
54
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
55 static void
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
56 glColor_from_pointer(void *ptr)
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
57 {
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
58 ulong val = cast(long)ptr;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
59
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
60 // hash the pointer up nicely
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
61 val = (val+0x7ed55d16) + (val<<12);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
62 val = (val^0xc761c23c) ^ (val>>19);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
63 val = (val+0x165667b1) + (val<<5);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
64 val = (val+0xd3a2646c) ^ (val<<9);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
65 val = (val+0xfd7046c5) + (val<<3);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
66 val = (val^0xb55a4f09) ^ (val>>16);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
67
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
68 // GLfloat v = (GLfloat)val/(GLfloat)ULONG_MAX;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
69 // v = 0.95f - v*0.15f;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
70 //
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
71 // glColor3f(v, v, v);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
72
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
73 GLubyte r = (val>>0) & 0xFF;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
74 GLubyte g = (val>>8) & 0xFF;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
75 GLubyte b = (val>>16) & 0xFF;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
76
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
77 GLubyte max = r>g ? (r>b ? r : b) : (g>b ? g : b);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
78
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
79 const int mult = 127;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
80 const int add = 63;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
81 r = cast(ubyte)((r*mult)/max + add);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
82 g = cast(ubyte)((g*mult)/max + add);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
83 b = cast(ubyte)((b*mult)/max + add);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
84
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
85 glColor3ub(r, g, b);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
86 }
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
87
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
88 static void
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
89 glColor_for_shape(cpShape *shape, cpSpace *space)
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
90 {
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
91 cpBody *_body = shape._body;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
92 if(_body){
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
93 if(_body.node.next){
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
94 GLfloat v = 0.25f;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
95 glColor3f(v,v,v);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
96 return;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
97 } else if(_body.node.idleTime > space.sleepTimeThreshold) {
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
98 GLfloat v = 0.9f;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
99 glColor3f(v,v,v);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
100 return;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
101 }
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 glColor_from_pointer(shape);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
105 }
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
106
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
107 enum GLfloat[] circleVAR = [
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
108 0.0000f, 1.0000f,
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
109 0.2588f, 0.9659f,
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
110 0.5000f, 0.8660f,
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
111 0.7071f, 0.7071f,
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
112 0.8660f, 0.5000f,
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
113 0.9659f, 0.2588f,
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
114 1.0000f, 0.0000f,
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
115 0.9659f, -0.2588f,
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
116 0.8660f, -0.5000f,
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
117 0.7071f, -0.7071f,
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
118 0.5000f, -0.8660f,
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
119 0.2588f, -0.9659f,
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
120 0.0000f, -1.0000f,
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
121 -0.2588f, -0.9659f,
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
122 -0.5000f, -0.8660f,
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
123 -0.7071f, -0.7071f,
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
124 -0.8660f, -0.5000f,
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
125 -0.9659f, -0.2588f,
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
126 -1.0000f, -0.0000f,
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
127 -0.9659f, 0.2588f,
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
128 -0.8660f, 0.5000f,
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
129 -0.7071f, 0.7071f,
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
130 -0.5000f, 0.8660f,
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
131 -0.2588f, 0.9659f,
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
132 0.0000f, 1.0000f,
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
133 0.0f, 0.0f, // For an extra line to see the rotation.
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
134 ];
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
135 enum int circleVAR_count = circleVAR.length / 2;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
136
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
137 static void
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
138 drawCircleShape(cpBody *_body, cpCircleShape *circle, cpSpace *space)
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
139 {
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
140 glVertexPointer(2, GL_FLOAT, 0, circleVAR.ptr);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
141
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
142 glPushMatrix(); {
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
143 cpVect center = circle.tc;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
144 glTranslatef(center.x, center.y, 0.0f);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
145 glRotatef(_body.a*180.0f/PI, 0.0f, 0.0f, 1.0f);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
146 glScalef(circle.r, circle.r, 1.0f);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
147
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
148 if(!circle.shape.sensor){
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
149 glColor_for_shape(cast(cpShape *)circle, space);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
150 glDrawArrays(GL_TRIANGLE_FAN, 0, circleVAR_count - 1);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
151 }
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
152
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
153 glColor3fv(LINE_COLOR.ptr);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
154 glDrawArrays(GL_LINE_STRIP, 0, circleVAR_count);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
155 } glPopMatrix();
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
156 }
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
157
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
158 enum GLfloat[] pillVAR = [
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
159 0.0000f, 1.0000f, 1.0f,
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
160 0.2588f, 0.9659f, 1.0f,
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
161 0.5000f, 0.8660f, 1.0f,
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
162 0.7071f, 0.7071f, 1.0f,
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
163 0.8660f, 0.5000f, 1.0f,
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
164 0.9659f, 0.2588f, 1.0f,
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
165 1.0000f, 0.0000f, 1.0f,
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
166 0.9659f, -0.2588f, 1.0f,
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
167 0.8660f, -0.5000f, 1.0f,
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
168 0.7071f, -0.7071f, 1.0f,
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
169 0.5000f, -0.8660f, 1.0f,
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
170 0.2588f, -0.9659f, 1.0f,
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
171 0.0000f, -1.0000f, 1.0f,
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
172
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
173 0.0000f, -1.0000f, 0.0f,
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
174 -0.2588f, -0.9659f, 0.0f,
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
175 -0.5000f, -0.8660f, 0.0f,
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
176 -0.7071f, -0.7071f, 0.0f,
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
177 -0.8660f, -0.5000f, 0.0f,
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
178 -0.9659f, -0.2588f, 0.0f,
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
179 -1.0000f, -0.0000f, 0.0f,
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
180 -0.9659f, 0.2588f, 0.0f,
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
181 -0.8660f, 0.5000f, 0.0f,
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
182 -0.7071f, 0.7071f, 0.0f,
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
183 -0.5000f, 0.8660f, 0.0f,
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
184 -0.2588f, 0.9659f, 0.0f,
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
185 0.0000f, 1.0000f, 0.0f,
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
186 ];
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
187 enum int pillVAR_count = pillVAR.length/3;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
188
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
189 static void
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
190 drawSegmentShape(cpBody *_body, cpSegmentShape *seg, cpSpace *space)
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
191 {
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
192 cpVect a = seg.ta;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
193 cpVect b = seg.tb;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
194
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
195 if(seg.r){
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
196 glVertexPointer(3, GL_FLOAT, 0, pillVAR.ptr);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
197 glPushMatrix(); {
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
198 cpVect d = cpvsub(b, a);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
199 cpVect r = cpvmult(d, seg.r/cpvlength(d));
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
200
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
201 GLfloat matrix[] = [
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
202 r.x, r.y, 0.0f, 0.0f,
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
203 -r.y, r.x, 0.0f, 0.0f,
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
204 d.x, d.y, 0.0f, 0.0f,
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
205 a.x, a.y, 0.0f, 1.0f,
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
206 ];
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
207 glMultMatrixf(matrix.ptr);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
208
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
209 if(!seg.shape.sensor){
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
210 glColor_for_shape(cast(cpShape *)seg, space);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
211 glDrawArrays(GL_TRIANGLE_FAN, 0, pillVAR_count);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
212 }
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
213
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
214 glColor3fv(LINE_COLOR.ptr);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
215 glDrawArrays(GL_LINE_LOOP, 0, pillVAR_count);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
216 } glPopMatrix();
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
217 } else {
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
218 glColor3fv(LINE_COLOR.ptr);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
219 glBegin(GL_LINES); {
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
220 glVertex2f(a.x, a.y);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
221 glVertex2f(b.x, b.y);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
222 } glEnd();
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
223 }
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
224 }
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
225
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
226 static void
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
227 drawPolyShape(cpBody *_body, cpPolyShape *poly, cpSpace *space)
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
228 {
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
229 int count = poly.numVerts;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
230 version(CP_USE_DOUBLES)
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
231 {
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
232 glVertexPointer(2, GL_DOUBLE, 0, poly.tVerts);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
233 }
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
234 else
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
235 {
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
236 glVertexPointer(2, GL_FLOAT, 0, poly.tVerts);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
237 }
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
238
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
239 if(!poly.shape.sensor){
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
240 glColor_for_shape(cast(cpShape *)poly, space);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
241 glDrawArrays(GL_TRIANGLE_FAN, 0, count);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
242 }
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
243
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
244 glColor3fv(LINE_COLOR.ptr);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
245 glDrawArrays(GL_LINE_LOOP, 0, count);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
246 }
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
247
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
248 static void
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
249 drawObject(cpShape *shape, cpSpace *space)
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
250 {
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
251 cpBody *_body = shape._body;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
252
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
253 switch(shape.klass.type){
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
254 case cpShapeType.CP_CIRCLE_SHAPE:
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
255 drawCircleShape(_body, cast(cpCircleShape *)shape, space);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
256 break;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
257 case cpShapeType.CP_SEGMENT_SHAPE:
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
258 drawSegmentShape(_body, cast(cpSegmentShape *)shape, space);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
259 break;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
260 case cpShapeType.CP_POLY_SHAPE:
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
261 drawPolyShape(_body, cast(cpPolyShape *)shape, space);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
262 break;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
263 default:
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
264 writefln("Bad enumeration in drawObject().");
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
265 }
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
266 }
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
267
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
268 enum GLfloat[] springVAR = [
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
269 0.00f, 0.0f,
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
270 0.20f, 0.0f,
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
271 0.25f, 3.0f,
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
272 0.30f,-6.0f,
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
273 0.35f, 6.0f,
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
274 0.40f,-6.0f,
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
275 0.45f, 6.0f,
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
276 0.50f,-6.0f,
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
277 0.55f, 6.0f,
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
278 0.60f,-6.0f,
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
279 0.65f, 6.0f,
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
280 0.70f,-3.0f,
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
281 0.75f, 6.0f,
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
282 0.80f, 0.0f,
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
283 1.00f, 0.0f,
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
284 ];
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
285 enum int springVAR_count = springVAR.length / 2;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
286
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
287 static void
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
288 drawSpring(cpDampedSpring *spring, cpBody *body_a, cpBody *body_b)
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
289 {
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
290 cpVect a = cpvadd(body_a.p, cpvrotate(spring.anchr1, body_a.rot));
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
291 cpVect b = cpvadd(body_b.p, cpvrotate(spring.anchr2, body_b.rot));
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
292
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
293 glPointSize(5.0f);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
294 glBegin(GL_POINTS); {
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
295 glVertex2f(a.x, a.y);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
296 glVertex2f(b.x, b.y);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
297 } glEnd();
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
298
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
299 cpVect delta = cpvsub(b, a);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
300
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
301 glVertexPointer(2, GL_FLOAT, 0, springVAR.ptr);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
302 glPushMatrix(); {
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
303 GLfloat x = a.x;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
304 GLfloat y = a.y;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
305 GLfloat cos = delta.x;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
306 GLfloat sin = delta.y;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
307 GLfloat s = 1.0f/cpvlength(delta);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
308
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
309 GLfloat matrix[] = [
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
310 cos, sin, 0.0f, 0.0f,
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
311 -sin*s, cos*s, 0.0f, 0.0f,
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
312 0.0f, 0.0f, 1.0f, 0.0f,
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
313 x, y, 0.0f, 1.0f,
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
314 ];
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
315
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
316 glMultMatrixf(matrix.ptr);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
317 glDrawArrays(GL_LINE_STRIP, 0, springVAR_count);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
318 } glPopMatrix();
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
319 }
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
320
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
321 static void
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
322 drawConstraint(cpConstraint *constraint)
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
323 {
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
324 cpBody *body_a = constraint.a;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
325 cpBody *body_b = constraint.b;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
326
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
327 const cpConstraintClass *klass = constraint.klass;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
328 if(klass == cpPinJointGetClass()){
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
329 cpPinJoint *joint = cast(cpPinJoint *)constraint;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
330
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
331 cpVect a = cpvadd(body_a.p, cpvrotate(joint.anchr1, body_a.rot));
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
332 cpVect b = cpvadd(body_b.p, cpvrotate(joint.anchr2, body_b.rot));
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
333
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
334 glPointSize(5.0f);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
335 glBegin(GL_POINTS); {
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
336 glVertex2f(a.x, a.y);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
337 glVertex2f(b.x, b.y);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
338 } glEnd();
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
339
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
340 glBegin(GL_LINES); {
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
341 glVertex2f(a.x, a.y);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
342 glVertex2f(b.x, b.y);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
343 } glEnd();
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
344 } else if(klass == cpSlideJointGetClass()){
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
345 cpSlideJoint *joint = cast(cpSlideJoint *)constraint;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
346
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
347 cpVect a = cpvadd(body_a.p, cpvrotate(joint.anchr1, body_a.rot));
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
348 cpVect b = cpvadd(body_b.p, cpvrotate(joint.anchr2, body_b.rot));
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
349
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
350 glPointSize(5.0f);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
351 glBegin(GL_POINTS); {
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
352 glVertex2f(a.x, a.y);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
353 glVertex2f(b.x, b.y);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
354 } glEnd();
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
355
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
356 glBegin(GL_LINES); {
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
357 glVertex2f(a.x, a.y);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
358 glVertex2f(b.x, b.y);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
359 } glEnd();
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
360 } else if(klass == cpPivotJointGetClass()){
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
361 cpPivotJoint *joint = cast(cpPivotJoint *)constraint;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
362
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
363 cpVect a = cpvadd(body_a.p, cpvrotate(joint.anchr1, body_a.rot));
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
364 cpVect b = cpvadd(body_b.p, cpvrotate(joint.anchr2, body_b.rot));
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
365
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
366 glPointSize(10.0f);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
367 glBegin(GL_POINTS); {
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
368 glVertex2f(a.x, a.y);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
369 glVertex2f(b.x, b.y);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
370 } glEnd();
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
371 } else if(klass == cpGrooveJointGetClass()){
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
372 cpGrooveJoint *joint = cast(cpGrooveJoint *)constraint;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
373
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
374 cpVect a = cpvadd(body_a.p, cpvrotate(joint.grv_a, body_a.rot));
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
375 cpVect b = cpvadd(body_a.p, cpvrotate(joint.grv_b, body_a.rot));
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
376 cpVect c = cpvadd(body_b.p, cpvrotate(joint.anchr2, body_b.rot));
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
377
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
378 glPointSize(5.0f);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
379 glBegin(GL_POINTS); {
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
380 glVertex2f(c.x, c.y);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
381 } glEnd();
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
382
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
383 glBegin(GL_LINES); {
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
384 glVertex2f(a.x, a.y);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
385 glVertex2f(b.x, b.y);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
386 } glEnd();
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
387 } else if(klass == cpDampedSpringGetClass()){
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
388 drawSpring(cast(cpDampedSpring *)constraint, body_a, body_b);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
389 } else {
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
390 // printf("Cannot draw constraint\n");
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
391 }
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
392 }
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
393
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
394 static void
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
395 drawBB(cpShape *shape, void *unused)
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
396 {
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
397 glBegin(GL_LINE_LOOP); {
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
398 glVertex2f(shape.bb.l, shape.bb.b);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
399 glVertex2f(shape.bb.l, shape.bb.t);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
400 glVertex2f(shape.bb.r, shape.bb.t);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
401 glVertex2f(shape.bb.r, shape.bb.b);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
402 } glEnd();
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
403 }
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
404
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
405 // copied from cpSpaceHash.c
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
406 static cpHashValue
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
407 hash_func(cpHashValue x, cpHashValue y, cpHashValue n)
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
408 {
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
409 return cast(cpHashValue)((x*1640531513uL ^ y*2654435789uL) % n);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
410 }
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
411
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
412 static void
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
413 drawSpatialHash(cpSpaceHash *hash)
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
414 {
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
415 cpBB bb = cpBBNew(-320, -240, 320, 240);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
416
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
417 cpFloat dim = hash.celldim;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
418 int n = hash.numcells;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
419
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
420 int l = cast(int)floorf(bb.l/dim);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
421 int r = cast(int)floorf(bb.r/dim);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
422 int b = cast(int)floorf(bb.b/dim);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
423 int t = cast(int)floorf(bb.t/dim);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
424
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
425 for(int i=l; i<=r; i++){
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
426 for(int j=b; j<=t; j++){
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
427 int cell_count = 0;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
428
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
429 int index = hash_func(i,j,n);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
430 for(cpSpaceHashBin *bin = hash.table[index]; bin; bin = bin.next)
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
431 cell_count++;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
432
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
433 GLfloat v = 1.0f - cast(GLfloat)cell_count/10.0f;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
434 glColor3f(v,v,v);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
435 glRectf(i*dim, j*dim, (i + 1)*dim, (j + 1)*dim);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
436 }
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
437 }
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
438 }
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
439
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
440 void
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
441 DrawSpace(cpSpace *space, const drawSpaceOptions *options)
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
442 {
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
443 if(options.drawHash){
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
444 glColorMask(GL_FALSE, GL_TRUE, GL_FALSE, GL_TRUE);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
445 drawSpatialHash(space.activeShapes);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
446 glColorMask(GL_TRUE, GL_FALSE, GL_FALSE, GL_FALSE);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
447 drawSpatialHash(space.staticShapes);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
448 glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
449 }
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
450
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
451 glLineWidth(options.lineThickness);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
452 if(options.drawShapes){
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
453 cpSpaceHashEach(space.activeShapes, cast(cpSpaceHashIterator)&drawObject, space);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
454 cpSpaceHashEach(space.staticShapes, cast(cpSpaceHashIterator)&drawObject, space);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
455 }
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
456
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
457 glLineWidth(1.0f);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
458 if(options.drawBBs){
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
459 glColor3f(0.3f, 0.5f, 0.3f);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
460 cpSpaceHashEach(space.activeShapes, cast(cpSpaceHashIterator)&drawBB, null);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
461 cpSpaceHashEach(space.staticShapes, cast(cpSpaceHashIterator)&drawBB, null);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
462 }
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
463
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
464 cpArray *constraints = space.constraints;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
465
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
466 glColor3f(0.5f, 1.0f, 0.5f);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
467 for(int i=0, count = constraints.num; i<count; i++){
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
468 drawConstraint(cast(cpConstraint *)constraints.arr[i]);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
469 }
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
470
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
471 if(options.bodyPointSize){
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
472 glPointSize(options.bodyPointSize);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
473
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
474 glBegin(GL_POINTS); {
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
475 glColor3fv(LINE_COLOR.ptr);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
476 cpArray *bodies = space.bodies;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
477 for(int i=0, count = bodies.num; i<count; i++){
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
478 cpBody *_body = cast(cpBody *)bodies.arr[i];
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
479 glVertex2f(_body.p.x, _body.p.y);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
480 }
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
481
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
482 // glColor3f(0.5f, 0.5f, 0.5f);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
483 // cpArray *components = space.components;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
484 // for(int i=0; i<components.num; i++){
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
485 // cpBody *root = components.arr[i];
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
486 // cpBody *body = root, *next;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
487 // do {
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
488 // next = body.node.next;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
489 // glVertex2f(body.p.x, body.p.y);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
490 // } while((body = next) != root);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
491 // }
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
492 } glEnd();
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
493 }
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
494
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
495 if(options.collisionPointSize){
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
496 glPointSize(options.collisionPointSize);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
497 glBegin(GL_POINTS); {
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
498 cpArray *arbiters = space.arbiters;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
499 for(int i=0; i<arbiters.num; i++){
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
500 cpArbiter *arb = cast(cpArbiter*)arbiters.arr[i];
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
501
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
502 glColor3fv(COLLISION_COLOR.ptr);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
503 foreach(j; 0..arb.numContacts){
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
504 cpVect v = arb.contacts[j].p;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
505 glVertex2f(v.x, v.y);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
506 }
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
507 }
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
508 } glEnd();
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
509 }
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
510 }