2 Physics Effects Copyright(C) 2010 Sony Computer Entertainment Inc.
\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
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
13 A copy of the BSD License is distributed with
\r
14 Physics Effects under the filename: physics_effects_license.txt
\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
28 // ARA begin insert new code
\r
30 #include <EGL/egl.h>
\r
31 #include <GLES/gl.h>
\r
35 #define SAMPLE_NAME "api_physics_effects/4_motion_type"
\r
37 //#define ENABLE_DEBUG_DRAW
\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
45 static bool s_isRunning = true;
\r
48 bool simulating = false;
\r
54 const PfxVector3 colorWhite(1.0f);
\r
55 const PfxVector3 colorGray(0.7f);
\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
61 PfxVector3 color = state.isAsleep()?colorGray:colorWhite;
\r
63 PfxTransform3 rbT(state.getOrientation(), state.getPosition());
\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
71 switch(shape.getType()) {
\r
72 case kPfxShapeSphere:
\r
76 PfxFloatInVec(shape.getSphere().m_radius));
\r
83 shape.getBox().m_half);
\r
86 case kPfxShapeCapsule:
\r
90 PfxFloatInVec(shape.getCapsule().m_radius),
\r
91 PfxFloatInVec(shape.getCapsule().m_halfLen));
\r
94 case kPfxShapeCylinder:
\r
98 PfxFloatInVec(shape.getCylinder().m_radius),
\r
99 PfxFloatInVec(shape.getCylinder().m_halfLen));
\r
108 render_debug_begin();
\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
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
120 render_debug_point(pA,PfxVector3(0,0,1));
\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
130 PfxVector3 center = state.getPosition() + coll.getCenter();
\r
131 PfxVector3 half = absPerElem(PfxMatrix3(state.getOrientation())) * coll.getHalf();
\r
133 render_debug_box(center,half,PfxVector3(1,0,0));
\r
137 #ifdef ENABLE_DEBUG_DRAW_ISLAND
\r
138 const PfxIsland *island = physics_get_islands();
\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
152 render_debug_box((aabbMax+aabbMin)*0.5f,(aabbMax-aabbMin)*0.5f,PfxVector3(0,1,0));
\r
157 render_debug_end();
\r
172 static int shutdown(void)
\r
185 render_get_view_angle(angX,angY,r);
\r
189 if(ctrl_button_pressed(BTN_UP)) {
\r
191 if(angX < -1.4f) angX = -1.4f;
\r
192 if(angX > -0.01f) angX = -0.01f;
\r
195 if(ctrl_button_pressed(BTN_DOWN)) {
\r
197 if(angX < -1.4f) angX = -1.4f;
\r
198 if(angX > -0.01f) angX = -0.01f;
\r
201 if(ctrl_button_pressed(BTN_LEFT)) {
\r
205 if(ctrl_button_pressed(BTN_RIGHT)) {
\r
209 if(ctrl_button_pressed(BTN_ZOOM_OUT)) {
\r
211 if(r > 500.0f) r = 500.0f;
\r
214 if(ctrl_button_pressed(BTN_ZOOM_IN)) {
\r
216 if(r < 1.0f) r = 1.0f;
\r
219 if(ctrl_button_pressed(BTN_SCENE_RESET) == BTN_STAT_DOWN) {
\r
220 physics_create_scene(sceneId);
\r
223 if(ctrl_button_pressed(BTN_SCENE_NEXT) == BTN_STAT_DOWN) {
\r
224 physics_create_scene(++sceneId);
\r
227 if(ctrl_button_pressed(BTN_SIMULATION) == BTN_STAT_DOWN) {
\r
228 simulating = !simulating;
\r
231 if(ctrl_button_pressed(BTN_STEP) == BTN_STAT_DOWN) {
\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
238 render_set_view_angle(angX,angY,r);
\r
243 // ARA begin insert new code
\r
246 ///////////////////////////////////////////////////////////////////////////////
\r
249 /// This function is used to change the physics scene on Android devices
\r
250 ///////////////////////////////////////////////////////////////////////////////
\r
253 physics_create_scene(sceneId++);
\r
256 #else // __ANDROID__
\r
259 ///////////////////////////////////////////////////////////////////////////////
\r
266 physics_create_scene(sceneId);
\r
268 printf("## %s: INIT SUCCEEDED ##\n", SAMPLE_NAME);
\r
270 while (s_isRunning) {
\r
272 if(simulating) physics_simulate();
\r
280 printf("## %s: FINISHED ##\n", SAMPLE_NAME);
\r
285 // ARA begin insert new code
\r
286 #endif // __ANDROID__
\r
291 ///////////////////////////////////////////////////////////////////////////////
\r
297 HINSTANCE hInstance;
\r
299 void releaseWindow()
\r
302 wglMakeCurrent(0,0);
\r
303 wglDeleteContext(hRC);
\r
306 if(hDC) ReleaseDC(hWnd,hDC);
\r
307 if(hWnd) DestroyWindow(hWnd);
\r
309 UnregisterClass(SAMPLE_NAME,hInstance);
\r
312 LRESULT CALLBACK WndProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
\r
315 case WM_SYSCOMMAND:
\r
318 case SC_SCREENSAVE:
\r
319 case SC_MONITORPOWER:
\r
326 PostQuitMessage(0);
\r
330 render_resize(LOWORD(lParam),HIWORD(lParam));
\r
334 return DefWindowProc(hWnd,uMsg,wParam,lParam);
\r
337 bool createWindow(char* title, int width, int height)
\r
344 rect.bottom=height;
\r
346 hInstance = GetModuleHandle(NULL);
\r
347 wc.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC;
\r
348 wc.lpfnWndProc = (WNDPROC) WndProc;
\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
358 if(!RegisterClass(&wc)) {
\r
362 AdjustWindowRectEx(&rect, WS_OVERLAPPEDWINDOW, FALSE, WS_EX_APPWINDOW | WS_EX_WINDOWEDGE);
\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
372 static PIXELFORMATDESCRIPTOR pfd = {
\r
373 sizeof(PIXELFORMATDESCRIPTOR),
\r
375 PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER,
\r
392 if(!(hDC=GetDC(hWnd)))
\r
395 OutputDebugString("");
\r
401 if ( (pixelformat = ChoosePixelFormat(hDC, &pfd)) == 0 ){
\r
402 OutputDebugString("ChoosePixelFormat Failed....");
\r
406 if (SetPixelFormat(hDC, pixelformat, &pfd) == FALSE){
\r
407 OutputDebugString("SetPixelFormat Failed....");
\r
411 if (!(hRC=wglCreateContext(hDC))){
\r
412 OutputDebugString("Creating HGLRC Failed....");
\r
417 //BOOL (WINAPI *wglSwapIntervalEXT)(int) = NULL;
\r
419 //if(strstr((char*)glGetString( GL_EXTENSIONS ),"WGL_EXT_swap_control")== 0) {
\r
422 //wglSwapIntervalEXT = (BOOL (WINAPI*)(int))wglGetProcAddress("wglSwapIntervalEXT");
\r
423 //if(wglSwapIntervalEXT) wglSwapIntervalEXT(1);
\r
426 wglMakeCurrent(hDC,hRC);
\r
428 ShowWindow(hWnd,SW_SHOW);
\r
429 SetForegroundWindow(hWnd);
\r
432 render_resize(width, height);
\r
434 glClearColor(0.0f,0.0f,0.0f,0.0f);
\r
435 glClearDepth(1.0f);
\r
440 int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)
\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
449 physics_create_scene(sceneId);
\r
451 SCE_PFX_PRINTF("## %s: INIT SUCCEEDED ##\n", SAMPLE_NAME);
\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
460 TranslateMessage(&msg);
\r
461 DispatchMessage(&msg);
\r
466 if(simulating) physics_simulate();
\r
475 SCE_PFX_PRINTF("## %s: FINISHED ##\n", SAMPLE_NAME);
\r
478 return (msg.wParam);
\r