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

ported chipmunk demos
author Extrawurst
date Sat, 04 Dec 2010 02:02:29 +0100
parents
children f2287962b4b7
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 + Authors: Stephan Dilly, www.extrawurst.org
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
3 +/
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
4
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
5 module gameApp;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
6
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
7 import framework;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
8
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
9 import drawSpace;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
10
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
11 import chipmunkd.chipmunk;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
12
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
13 import samples.LogoSmash;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
14 import samples.Simple;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
15 import samples.PyramidStack;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
16 import samples.ChipmunkDemo;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
17 import samples.Plink;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
18 import samples.Tumble;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
19 import samples.PyramidTopple;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
20 import samples.Planet;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
21 import samples.Query;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
22 import samples.OneWay;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
23 import samples.Sensors;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
24 import samples.Bounce;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
25 import samples.Springies;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
26 import samples.Joints;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
27 import samples.MagnetsElectric;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
28 import samples.Player;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
29 import samples.Tank;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
30 import samples.Pump;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
31 import samples.TheoJansen;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
32 import samples.UnsafeOps;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
33
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
34 import derelict.opengl.gl;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
35 import derelict.opengl.glu;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
36 import derelict.sdl.sdl;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
37
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
38 import std.stdio;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
39 import core.thread:Sleep;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
40
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
41 extern(System) ulong GetTickCount();
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
42
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
43 version = TIME_TRIAL;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
44
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
45 cpVect mousePos;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
46 cpVect arrowDirection;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
47
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
48 ///
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
49 final class GameApp {
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
50
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
51 private:
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
52
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
53 chipmunkDemo*[] demos;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
54 chipmunkDemo* currentDemo;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
55 cpSpace* space;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
56 int ticks;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
57 cpBody* mouseBody;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
58 cpConstraint* mouseJoint;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
59 cpVect mousePos_last;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
60
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
61 bool key_up = false;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
62 bool key_down = false;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
63 bool key_left = false;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
64 bool key_right = false;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
65
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
66 bool m_running = true;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
67
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
68 drawSpaceOptions options = {
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
69 0, // drawHash
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
70 0, // drawBB
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
71 1, // drawShapes
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
72 4.0f, // collisionPointSize
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
73 0.0f, // bodyPointSize
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
74 1.5f, // lineThickness
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
75 };
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
76
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
77 enum width = 1024;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
78 enum height = 780;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
79
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
80 version(TIME_TRIAL)
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
81 {
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
82 void time_trial(int index, int count)
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
83 {
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
84 currentDemo = demos[index];
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
85 space = currentDemo.initFunc();
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
86
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
87 auto start = .GetTickCount();
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
88
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
89 foreach(i; 0..count)
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
90 currentDemo.updateFunc(i);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
91
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
92 auto end = .GetTickCount();
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
93 auto duration = (end - start);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
94
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
95 currentDemo.destroyFunc();
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
96 currentDemo = null;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
97
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
98 writefln("Time(%s) = %s", cast(char)(index + 'a'), duration);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
99 }
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
100 }
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 public void boot() {
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
104
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
105 demos = [
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
106 &LogoSmash,
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
107 &Simple,
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
108 &PyramidStack,
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
109 &Plink,
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
110 &Tumble,
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
111 &PyramidTopple,
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
112 &Bounce,
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
113 &Planet,
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
114 &Springies,
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
115 &Pump,
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
116 &TheoJansen,
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
117 &MagnetsElectric,
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
118 &UnsafeOps,
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
119 &Query,
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
120 &OneWay,
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
121 &Player,
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
122 &Sensors,
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
123 &Joints,
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
124 &Tank,
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
125 ];
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
126
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
127 cpInitChipmunk();
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
128
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
129 cp_collision_slop = 0.2f;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
130
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
131 version(TIME_TRIAL)
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
132 {
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
133 Sleep(1);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
134 foreach(i; 0..demos.length)
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
135 {
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
136 //if(i == 'l' - 'a') continue;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
137 time_trial(i, 1000);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
138 }
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
139
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
140 m_running = false;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
141
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
142 return;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
143 }//TIME_TRIAL
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
144
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
145 //setup framework
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
146 framework.startup("chipmunk'd by Stephan Dilly",width,height);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
147
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
148 reshape(width,height);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
149
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
150 glEnableClientState(GL_VERTEX_ARRAY);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
151
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
152 runDemo(demos[0]);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
153
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
154 mouseBody = cpBodyNew(INFINITY, INFINITY);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
155 }
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 void runDemo(chipmunkDemo *demo)
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
159 {
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
160 if(currentDemo)
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
161 currentDemo.destroyFunc();
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
162
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
163 currentDemo = demo;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
164 ticks = 0;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
165 mouseJoint = null;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
166
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
167 //maxArbiters = 0;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
168 //maxPoints = 0;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
169 //maxConstraints = 0;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
170 space = currentDemo.initFunc();
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
171 }
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
172
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
173 ///
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
174 void reshape(int width, int height)
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
175 {
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
176 glViewport(0, 0, width, height);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
177
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
178 double rx = width / 2.0;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
179 double ry = height / 2.0;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
180
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
181 glMatrixMode(GL_PROJECTION);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
182 glLoadIdentity();
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
183 glOrtho(-rx, rx, -ry, ry, -1.0, 1.0);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
184 glTranslated(0.5, 0.5, 0.0);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
185 }
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
186
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
187 ///
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
188 public bool update() {
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
189
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
190 if(!m_running) return m_running;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
191
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
192 if(!framework.processEvents(&keyEvent,&mouseMove,&mouseButtonEvent))
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
193 return false;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
194
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
195 cpVect newPoint = cpvlerp(mousePos_last, mousePos, 0.25f);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
196 mouseBody.p = newPoint;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
197 mouseBody.v = cpvmult(cpvsub(newPoint, mousePos_last), 60.0f);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
198 mousePos_last = newPoint;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
199
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
200 currentDemo.updateFunc(ticks++);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
201
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
202 // render
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
203
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
204 glClearColor(1,1,1,1);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
205
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
206 glClear(GL_COLOR_BUFFER_BIT);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
207
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
208 DrawSpace(space,currentDemo.drawOptions ? currentDemo.drawOptions : &options);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
209
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
210 SDL_GL_SwapBuffers();
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
211
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
212 return m_running;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
213 }
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
214
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
215 ///
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
216 public void shutdown() {
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
217
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
218 version(TIME_TRIAL){}else
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
219 {
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
220 currentDemo.destroyFunc();
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
221
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
222 framework.shutdown();
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 cpVect mouseToSpace(int x, int y)
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
227 {
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
228 GLdouble model[16];
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
229 glGetDoublev(GL_MODELVIEW_MATRIX, model.ptr);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
230
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
231 GLdouble proj[16];
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
232 glGetDoublev(GL_PROJECTION_MATRIX, proj.ptr);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
233
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
234 GLint view[4];
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
235 glGetIntegerv(GL_VIEWPORT, view.ptr);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
236
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
237 GLdouble mx, my, mz;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
238 gluUnProject(x, height - y, 0.0f, model.ptr, proj.ptr, view.ptr, &mx, &my, &mz);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
239
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
240 return cpv(mx, my);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
241 }
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 private void mouseMove(int x,int y)
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
245 {
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
246 mousePos = mouseToSpace(x,y);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
247 }
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
248
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
249 ///
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
250 private void mouseButtonEvent(int x,int y,bool _down)
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
251 {
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
252 if(_down){
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
253 cpVect point = mouseToSpace(x,y);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
254
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
255 cpShape *shape = cpSpacePointQueryFirst(space, point, GRABABLE_MASK_BIT, CP_NO_GROUP);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
256 if(shape){
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
257 cpBody *_body = shape._body;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
258 mouseJoint = cpPivotJointNew2(mouseBody, _body, cpvzero, cpBodyWorld2Local(_body, point));
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
259 mouseJoint.maxForce = 50000.0f;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
260 mouseJoint.biasCoef = 0.15f;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
261 cpSpaceAddConstraint(space, mouseJoint);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
262 }
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
263 } else if(mouseJoint){
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
264 cpSpaceRemoveConstraint(space, mouseJoint);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
265 cpConstraintFree(mouseJoint);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
266 mouseJoint = null;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
267 }
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
268 }
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
269
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
270 ///
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
271 private void set_arrowDirection()
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
272 {
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
273 int x = 0, y = 0;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
274
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
275 if(key_up) y += 1;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
276 if(key_down) y -= 1;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
277 if(key_right) x += 1;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
278 if(key_left) x -= 1;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
279
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
280 arrowDirection = cpv(x, y);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
281 }
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
282
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
283 ///
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
284 private void keyEvent(int _key,bool _down)
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
285 {
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
286 int key = _key;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
287
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
288 if(_down)
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
289 {
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
290 int index = key - 'a';
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
291
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
292 if(0 <= index && index < demos.length){
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
293 runDemo(demos[index]);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
294 } else if(key == '\r'){
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
295 runDemo(currentDemo);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
296 } else if(key == 47){
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
297 options.drawHash = !options.drawHash;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
298 } else if(key == 92){
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
299 options.drawBBs = !options.drawBBs;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
300 } else if(key == 93){
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
301 glEnable(GL_LINE_SMOOTH);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
302 glEnable(GL_POINT_SMOOTH);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
303 glEnable(GL_BLEND);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
304 glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
305 glHint(GL_LINE_SMOOTH_HINT, GL_DONT_CARE);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
306 glHint(GL_POINT_SMOOTH_HINT, GL_DONT_CARE);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
307 }
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
308 else
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
309 {
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
310 if(key == SDLK_UP) key_up = true;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
311 else if(key == SDLK_DOWN) key_down = true;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
312 else if(key == SDLK_LEFT) key_left = true;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
313 else if(key == SDLK_RIGHT) key_right = true;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
314
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
315 set_arrowDirection();
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
316 }
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
317 }
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
318 else
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
319 {
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
320 if(key == SDLK_UP) key_up = false;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
321 else if(key == SDLK_DOWN) key_down = false;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
322 else if(key == SDLK_LEFT) key_left = false;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
323 else if(key == SDLK_RIGHT) key_right = false;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
324
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
325 set_arrowDirection();
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
326 }
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
327 }
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
328 }
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
329