Initialize libbullet git in 2.0_beta.
[platform/upstream/libbullet.git] / Extras / PhysicsEffects / sample / api_physics_effects / 4_motion_type / main.cpp
1 /*\r
2 Physics Effects Copyright(C) 2010 Sony Computer Entertainment Inc.\r
3 All rights reserved.\r
4 \r
5 Physics Effects is open software; you can redistribute it and/or\r
6 modify it under the terms of the BSD License.\r
7 \r
8 Physics Effects is distributed in the hope that it will be useful,\r
9 but WITHOUT ANY WARRANTY; without even the implied warranty of\r
10 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r
11 See the BSD License for more details.\r
12 \r
13 A copy of the BSD License is distributed with\r
14 Physics Effects under the filename: physics_effects_license.txt\r
15 */\r
16 \r
17 #include "../common/common.h"\r
18 #include "../common/ctrl_func.h"\r
19 #include "../common/render_func.h"\r
20 #include "../common/perf_func.h"\r
21 #include "physics_func.h"\r
22 \r
23 #ifdef _WIN32\r
24         #include <gl/gl.h>\r
25         #include <gl/glu.h>\r
26 #endif\r
27 \r
28 // ARA begin insert new code\r
29 #ifdef __ANDROID__\r
30         #include <EGL/egl.h>\r
31         #include <GLES/gl.h>\r
32 #endif\r
33 // ARA end\r
34 \r
35 #define SAMPLE_NAME "api_physics_effects/4_motion_type"\r
36 \r
37 //#define ENABLE_DEBUG_DRAW\r
38 \r
39 #ifdef ENABLE_DEBUG_DRAW\r
40         #define ENABLE_DEBUG_DRAW_CONTACT\r
41         #define ENABLE_DEBUG_DRAW_AABB\r
42         #define ENABLE_DEBUG_DRAW_ISLAND\r
43 #endif\r
44 \r
45 static bool s_isRunning = true;\r
46 \r
47 int sceneId = 0;\r
48 bool simulating = false;\r
49 \r
50 void render(void)\r
51 {\r
52         render_begin();\r
53 \r
54         const PfxVector3 colorWhite(1.0f);\r
55         const PfxVector3 colorGray(0.7f);\r
56 \r
57         for(int i=0;i<physics_get_num_rigidbodies();i++) {\r
58                 const PfxRigidState &state = physics_get_state(i);\r
59                 const PfxCollidable &coll = physics_get_collidable(i);\r
60 \r
61                 PfxVector3 color = state.isAsleep()?colorGray:colorWhite;\r
62 \r
63                 PfxTransform3 rbT(state.getOrientation(), state.getPosition());\r
64 \r
65                 PfxShapeIterator itrShape(coll);\r
66                 for(int j=0;j<coll.getNumShapes();j++,++itrShape) {\r
67                         const PfxShape &shape = *itrShape;\r
68                         PfxTransform3 offsetT = shape.getOffsetTransform();\r
69                         PfxTransform3 worldT = rbT * offsetT;\r
70 \r
71                         switch(shape.getType()) {\r
72                                 case kPfxShapeSphere:\r
73                                 render_sphere(\r
74                                         worldT,\r
75                                         color,\r
76                                         PfxFloatInVec(shape.getSphere().m_radius));\r
77                                 break;\r
78 \r
79                                 case kPfxShapeBox:\r
80                                 render_box(\r
81                                         worldT,\r
82                                         color,\r
83                                         shape.getBox().m_half);\r
84                                 break;\r
85 \r
86                                 case kPfxShapeCapsule:\r
87                                 render_capsule(\r
88                                         worldT,\r
89                                         color,\r
90                                         PfxFloatInVec(shape.getCapsule().m_radius),\r
91                                         PfxFloatInVec(shape.getCapsule().m_halfLen));\r
92                                 break;\r
93 \r
94                                 case kPfxShapeCylinder:\r
95                                 render_cylinder(\r
96                                         worldT,\r
97                                         color,\r
98                                         PfxFloatInVec(shape.getCylinder().m_radius),\r
99                                         PfxFloatInVec(shape.getCylinder().m_halfLen));\r
100                                 break;\r
101 \r
102                                 default:\r
103                                 break;\r
104                         }\r
105                 }\r
106         }\r
107 \r
108         render_debug_begin();\r
109         \r
110         #ifdef ENABLE_DEBUG_DRAW_CONTACT\r
111         for(int i=0;i<physics_get_num_contacts();i++) {\r
112                 const PfxContactManifold &contact = physics_get_contact(i);\r
113                 const PfxRigidState &stateA = physics_get_state(contact.getRigidBodyIdA());\r
114                 const PfxRigidState &stateB = physics_get_state(contact.getRigidBodyIdB());\r
115 \r
116                 for(int j=0;j<contact.getNumContacts();j++) {\r
117                         const PfxContactPoint &cp = contact.getContactPoint(j);\r
118                         PfxVector3 pA = stateA.getPosition()+rotate(stateA.getOrientation(),pfxReadVector3(cp.m_localPointA));\r
119 \r
120                         render_debug_point(pA,PfxVector3(0,0,1));\r
121                 }\r
122         }\r
123         #endif\r
124         \r
125         #ifdef ENABLE_DEBUG_DRAW_AABB\r
126         for(int i=0;i<physics_get_num_rigidbodies();i++) {\r
127                 const PfxRigidState &state = physics_get_state(i);\r
128                 const PfxCollidable &coll = physics_get_collidable(i);\r
129 \r
130                 PfxVector3 center = state.getPosition() + coll.getCenter();\r
131                 PfxVector3 half = absPerElem(PfxMatrix3(state.getOrientation())) * coll.getHalf();\r
132                 \r
133                 render_debug_box(center,half,PfxVector3(1,0,0));\r
134         }\r
135         #endif\r
136 \r
137         #ifdef ENABLE_DEBUG_DRAW_ISLAND\r
138         const PfxIsland *island = physics_get_islands();\r
139         if(island) {\r
140                 for(PfxUInt32 i=0;i<pfxGetNumIslands(island);i++) {\r
141                         PfxIslandUnit *islandUnit = pfxGetFirstUnitInIsland(island,i);\r
142                         PfxVector3 aabbMin(SCE_PFX_FLT_MAX);\r
143                         PfxVector3 aabbMax(-SCE_PFX_FLT_MAX);\r
144                         for(;islandUnit!=NULL;islandUnit=pfxGetNextUnitInIsland(islandUnit)) {\r
145                                 const PfxRigidState &state = physics_get_state(pfxGetUnitId(islandUnit));\r
146                                 const PfxCollidable &coll = physics_get_collidable(pfxGetUnitId(islandUnit));\r
147                                 PfxVector3 center = state.getPosition() + coll.getCenter();\r
148                                 PfxVector3 half = absPerElem(PfxMatrix3(state.getOrientation())) * coll.getHalf();\r
149                                 aabbMin = minPerElem(aabbMin,center-half);\r
150                                 aabbMax = maxPerElem(aabbMax,center+half);\r
151                         }\r
152                         render_debug_box((aabbMax+aabbMin)*0.5f,(aabbMax-aabbMin)*0.5f,PfxVector3(0,1,0));\r
153                 }\r
154         }\r
155         #endif\r
156         \r
157         render_debug_end();\r
158 \r
159         render_end();\r
160 }\r
161 \r
162 int init(void)\r
163 {\r
164         perf_init();\r
165         ctrl_init();\r
166         render_init();\r
167         physics_init();\r
168 \r
169         return 0;\r
170 }\r
171 \r
172 static int shutdown(void)\r
173 {\r
174         ctrl_release();\r
175         render_release();\r
176         physics_release();\r
177         perf_release();\r
178 \r
179         return 0;\r
180 }\r
181 \r
182 void update(void)\r
183 {\r
184         float angX,angY,r;\r
185         render_get_view_angle(angX,angY,r);\r
186 \r
187         ctrl_update();\r
188         \r
189         if(ctrl_button_pressed(BTN_UP)) {\r
190                 angX -= 0.05f;\r
191                 if(angX < -1.4f) angX = -1.4f;\r
192                 if(angX > -0.01f) angX = -0.01f;\r
193         }\r
194 \r
195         if(ctrl_button_pressed(BTN_DOWN)) {\r
196                 angX += 0.05f;\r
197                 if(angX < -1.4f) angX = -1.4f;\r
198                 if(angX > -0.01f) angX = -0.01f;\r
199         }\r
200 \r
201         if(ctrl_button_pressed(BTN_LEFT)) {\r
202                 angY -= 0.05f;\r
203         }\r
204 \r
205         if(ctrl_button_pressed(BTN_RIGHT)) {\r
206                 angY += 0.05f;\r
207         }\r
208 \r
209         if(ctrl_button_pressed(BTN_ZOOM_OUT)) {\r
210                 r *= 1.1f;\r
211                 if(r > 500.0f) r = 500.0f;\r
212         }\r
213 \r
214         if(ctrl_button_pressed(BTN_ZOOM_IN)) {\r
215                 r *= 0.9f;\r
216                 if(r < 1.0f) r = 1.0f;\r
217         }\r
218 \r
219         if(ctrl_button_pressed(BTN_SCENE_RESET) == BTN_STAT_DOWN) {\r
220                 physics_create_scene(sceneId);\r
221         }\r
222 \r
223         if(ctrl_button_pressed(BTN_SCENE_NEXT) == BTN_STAT_DOWN) {\r
224                 physics_create_scene(++sceneId);\r
225         }\r
226 \r
227         if(ctrl_button_pressed(BTN_SIMULATION) == BTN_STAT_DOWN) {\r
228                 simulating = !simulating;\r
229         }\r
230 \r
231         if(ctrl_button_pressed(BTN_STEP) == BTN_STAT_DOWN) {\r
232                 simulating = true;\r
233         }\r
234         else if(ctrl_button_pressed(BTN_STEP) == BTN_STAT_UP || ctrl_button_pressed(BTN_STEP) == BTN_STAT_KEEP) {\r
235                 simulating = false;\r
236         }\r
237 \r
238         render_set_view_angle(angX,angY,r);\r
239 }\r
240 \r
241 #ifndef _WIN32\r
242 \r
243 // ARA begin insert new code\r
244 #ifdef  __ANDROID__\r
245 \r
246 ///////////////////////////////////////////////////////////////////////////////\r
247 // sceneChange\r
248 //\r
249 /// This function is used to change the physics scene on Android devices\r
250 ///////////////////////////////////////////////////////////////////////////////\r
251 void sceneChange()\r
252 {\r
253         physics_create_scene(sceneId++);\r
254 }\r
255 \r
256 #else   // __ANDROID__\r
257 // ARA end\r
258 \r
259 ///////////////////////////////////////////////////////////////////////////////\r
260 // Main\r
261 \r
262 int main(void)\r
263 {\r
264         init();\r
265 \r
266         physics_create_scene(sceneId);\r
267         \r
268         printf("## %s: INIT SUCCEEDED ##\n", SAMPLE_NAME);\r
269 \r
270         while (s_isRunning) {\r
271                 update();\r
272                 if(simulating) physics_simulate();\r
273                 render();\r
274 \r
275                 perf_sync();\r
276         }\r
277 \r
278         shutdown();\r
279 \r
280         printf("## %s: FINISHED ##\n", SAMPLE_NAME);\r
281 \r
282         return 0;\r
283 }\r
284 \r
285 // ARA begin insert new code\r
286 #endif  // __ANDROID__\r
287 // ARA end\r
288 \r
289 #else   // _WIN32\r
290 \r
291 ///////////////////////////////////////////////////////////////////////////////\r
292 // WinMain\r
293 \r
294 extern HDC hDC;\r
295 extern HGLRC hRC;\r
296 HWND hWnd;\r
297 HINSTANCE hInstance;\r
298 \r
299 void releaseWindow()\r
300 {\r
301         if(hRC) {\r
302                 wglMakeCurrent(0,0);\r
303                 wglDeleteContext(hRC);\r
304         }\r
305         \r
306         if(hDC) ReleaseDC(hWnd,hDC);\r
307         if(hWnd) DestroyWindow(hWnd);\r
308         \r
309         UnregisterClass(SAMPLE_NAME,hInstance);\r
310 }\r
311 \r
312 LRESULT CALLBACK WndProc(HWND hWnd,UINT uMsg,WPARAM     wParam,LPARAM lParam)\r
313 {\r
314         switch(uMsg) {\r
315                 case WM_SYSCOMMAND:\r
316                 {\r
317                         switch (wParam) {\r
318                                 case SC_SCREENSAVE:\r
319                                 case SC_MONITORPOWER:\r
320                                 return 0;\r
321                         }\r
322                         break;\r
323                 }\r
324 \r
325                 case WM_CLOSE:\r
326                 PostQuitMessage(0);\r
327                 return 0;\r
328 \r
329                 case WM_SIZE:\r
330                 render_resize(LOWORD(lParam),HIWORD(lParam));\r
331                 return 0;\r
332         }\r
333 \r
334         return DefWindowProc(hWnd,uMsg,wParam,lParam);\r
335 }\r
336 \r
337 bool createWindow(char* title, int width, int height)\r
338 {\r
339         WNDCLASS wc;\r
340         RECT rect;\r
341         rect.left=0;\r
342         rect.right=width;\r
343         rect.top=0;\r
344         rect.bottom=height;\r
345 \r
346         hInstance = GetModuleHandle(NULL);\r
347         wc.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC;\r
348         wc.lpfnWndProc = (WNDPROC) WndProc;\r
349         wc.cbClsExtra = 0;\r
350         wc.cbWndExtra = 0;\r
351         wc.hInstance = hInstance;\r
352         wc.hIcon = LoadIcon(NULL, IDI_WINLOGO);\r
353         wc.hCursor = LoadCursor(NULL, IDC_ARROW);\r
354         wc.hbrBackground = NULL;\r
355         wc.lpszMenuName = NULL;\r
356         wc.lpszClassName = SAMPLE_NAME;\r
357 \r
358         if(!RegisterClass(&wc)) {\r
359                 return false;\r
360         }\r
361 \r
362         AdjustWindowRectEx(&rect, WS_OVERLAPPEDWINDOW, FALSE, WS_EX_APPWINDOW | WS_EX_WINDOWEDGE);\r
363 \r
364         if(!(hWnd=CreateWindowEx(WS_EX_APPWINDOW|WS_EX_WINDOWEDGE,SAMPLE_NAME,title,\r
365                                                         WS_OVERLAPPEDWINDOW|WS_CLIPSIBLINGS|WS_CLIPCHILDREN,\r
366                                                         0,0,rect.right-rect.left,rect.bottom-rect.top,\r
367                                                         NULL,NULL,hInstance,NULL))) {\r
368                 releaseWindow();\r
369                 return false;\r
370         }\r
371 \r
372     static PIXELFORMATDESCRIPTOR pfd = {\r
373                 sizeof(PIXELFORMATDESCRIPTOR),\r
374                 1,\r
375                 PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER,\r
376                 PFD_TYPE_RGBA,\r
377                 32,\r
378                 0, 0,\r
379                 0, 0,\r
380                 0, 0,\r
381                 0, 0,\r
382                 0,\r
383                 0, 0, 0, 0,\r
384                 32,\r
385                 0,\r
386                 0,\r
387                 PFD_MAIN_PLANE,\r
388                 0,\r
389                 0, 0, 0\r
390     };\r
391         \r
392         if(!(hDC=GetDC(hWnd)))\r
393         {\r
394                 releaseWindow();\r
395                 OutputDebugString("");\r
396                 return FALSE;\r
397         }\r
398         \r
399         int pixelformat;\r
400         \r
401     if ( (pixelformat = ChoosePixelFormat(hDC, &pfd)) == 0 ){\r
402                 OutputDebugString("ChoosePixelFormat Failed....");\r
403         return FALSE;\r
404     }\r
405 \r
406     if (SetPixelFormat(hDC, pixelformat, &pfd) == FALSE){\r
407                 OutputDebugString("SetPixelFormat Failed....");\r
408         return FALSE;\r
409     }\r
410 \r
411         if (!(hRC=wglCreateContext(hDC))){\r
412                 OutputDebugString("Creating HGLRC Failed....");\r
413                 return FALSE;\r
414         }\r
415         \r
416         // Set Vsync\r
417         //BOOL (WINAPI *wglSwapIntervalEXT)(int) = NULL;\r
418 \r
419         //if(strstr((char*)glGetString( GL_EXTENSIONS ),"WGL_EXT_swap_control")== 0) {\r
420         //}\r
421         //else {\r
422                 //wglSwapIntervalEXT = (BOOL (WINAPI*)(int))wglGetProcAddress("wglSwapIntervalEXT");\r
423                 //if(wglSwapIntervalEXT) wglSwapIntervalEXT(1);\r
424         //}\r
425         \r
426         wglMakeCurrent(hDC,hRC);\r
427         \r
428         ShowWindow(hWnd,SW_SHOW);\r
429         SetForegroundWindow(hWnd);\r
430         SetFocus(hWnd);\r
431 \r
432         render_resize(width, height);\r
433         \r
434         glClearColor(0.0f,0.0f,0.0f,0.0f);\r
435         glClearDepth(1.0f);\r
436         \r
437         return TRUE;\r
438 }\r
439 \r
440 int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)\r
441 {\r
442         if(!createWindow(SAMPLE_NAME,DISPLAY_WIDTH,DISPLAY_HEIGHT)) {\r
443                 MessageBox(NULL,"Can't create gl window.","ERROR",MB_OK|MB_ICONEXCLAMATION);\r
444                 return 0;\r
445         }\r
446         \r
447         init();\r
448         \r
449         physics_create_scene(sceneId);\r
450         \r
451         SCE_PFX_PRINTF("## %s: INIT SUCCEEDED ##\n", SAMPLE_NAME);\r
452         \r
453         MSG msg;\r
454         while(s_isRunning) {\r
455                 if(PeekMessage(&msg,NULL,0,0,PM_REMOVE)) {\r
456                         if(msg.message==WM_QUIT) {\r
457                                 s_isRunning = false;\r
458                         }\r
459                         else {\r
460                                 TranslateMessage(&msg);\r
461                                 DispatchMessage(&msg);\r
462                         }\r
463                 }\r
464                 else {\r
465                         update();\r
466                         if(simulating) physics_simulate();\r
467                         render();\r
468 \r
469                         perf_sync();\r
470                 }\r
471         }\r
472 \r
473         shutdown();\r
474 \r
475         SCE_PFX_PRINTF("## %s: FINISHED ##\n", SAMPLE_NAME);\r
476 \r
477         releaseWindow();\r
478         return (msg.wParam);\r
479 }\r
480 \r
481 #endif\r