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