diff options
| author | git perforce import user <a@b> | 2016-10-25 12:29:14 -0600 |
|---|---|---|
| committer | Sheikh Dawood Abdul Ajees <Sheikh Dawood Abdul Ajees> | 2016-10-25 18:56:37 -0500 |
| commit | 3dfe2108cfab31ba3ee5527e217d0d8e99a51162 (patch) | |
| tree | fa6485c169e50d7415a651bf838f5bcd0fd3bfbd /PhysX_3.4/Samples/SampleBase/SampleMain.cpp | |
| download | physx-3.4-3dfe2108cfab31ba3ee5527e217d0d8e99a51162.tar.xz physx-3.4-3dfe2108cfab31ba3ee5527e217d0d8e99a51162.zip | |
Initial commit:
PhysX 3.4.0 Update @ 21294896
APEX 1.4.0 Update @ 21275617
[CL 21300167]
Diffstat (limited to 'PhysX_3.4/Samples/SampleBase/SampleMain.cpp')
| -rw-r--r-- | PhysX_3.4/Samples/SampleBase/SampleMain.cpp | 311 |
1 files changed, 311 insertions, 0 deletions
diff --git a/PhysX_3.4/Samples/SampleBase/SampleMain.cpp b/PhysX_3.4/Samples/SampleBase/SampleMain.cpp new file mode 100644 index 00000000..9e7a2588 --- /dev/null +++ b/PhysX_3.4/Samples/SampleBase/SampleMain.cpp @@ -0,0 +1,311 @@ +// This code contains NVIDIA Confidential Information and is disclosed to you +// under a form of NVIDIA software license agreement provided separately to you. +// +// Notice +// NVIDIA Corporation and its licensors retain all intellectual property and +// proprietary rights in and to this software and related documentation and +// any modifications thereto. Any use, reproduction, disclosure, or +// distribution of this software and related documentation without an express +// license agreement from NVIDIA Corporation is strictly prohibited. +// +// ALL NVIDIA DESIGN SPECIFICATIONS, CODE ARE PROVIDED "AS IS.". NVIDIA MAKES +// NO WARRANTIES, EXPRESSED, IMPLIED, STATUTORY, OR OTHERWISE WITH RESPECT TO +// THE MATERIALS, AND EXPRESSLY DISCLAIMS ALL IMPLIED WARRANTIES OF NONINFRINGEMENT, +// MERCHANTABILITY, AND FITNESS FOR A PARTICULAR PURPOSE. +// +// Information and code furnished is believed to be accurate and reliable. +// However, NVIDIA Corporation assumes no responsibility for the consequences of use of such +// information or for any infringement of patents or other rights of third parties that may +// result from its use. No license is granted by implication or otherwise under any patent +// or patent rights of NVIDIA Corporation. Details are subject to change without notice. +// This code supersedes and replaces all information previously supplied. +// NVIDIA Corporation products are not authorized for use as critical +// components in life support devices or systems without express written approval of +// NVIDIA Corporation. +// +// Copyright (c) 2008-2016 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. +// Copyright (c) 2001-2004 NovodeX AG. All rights reserved. + +#include "foundation/PxAssert.h" +#include "RendererConfig.h" +#include "SampleCommandLine.h" +#include "RendererMemoryMacros.h" +#include "SampleAllocator.h" +#include "PhysXSampleApplication.h" +#include "PxTkFile.h" + +using namespace SampleFramework; + +#if defined(RENDERER_ANDROID) +#include "SamplePlatform.h" + +struct android_app; +static android_app* gState; +#endif + +#if defined(RENDERER_IOS) || defined(RENDERER_PS3) || defined(RENDERER_MACOSX) +// IOS does not easily support instrumenting the event +// loop like other OSs. Therefore for IOS the (input) event loop +// and the game loop stay for it in the same thread. +// +// PS3 reports a warning when a thread is starved. This happens +// when gApp tries to start but then needs to wait until the main loop +// yields. One consequence of this is that the inputs are polled from +// the main loop before they have been initialized. +// +// MACOSX non-deterministically crashed with one thread ran +// SampleRenderer::createGLView (renderer initialization) +// and the other SampleRenderer::emitEvents (processing ESC key event). +// Apparently connecting the glView to the window interfers with +// OSX event processing for some reason. +#define SEPARATE_EVENT_LOOP 0 +#else +#define SEPARATE_EVENT_LOOP 1 +#endif + +static PhysXSampleApplication* gApp = NULL; +static SampleSetup gSettings; +static SampleCommandLine* gSampleCommandLine = NULL; + +void mainInitialize() +{ + PX_ASSERT(gSampleCommandLine); + const SampleCommandLine& cmdline = *gSampleCommandLine; + initSampleAllocator(); + gApp = SAMPLE_NEW(PhysXSampleApplication)(cmdline); + + gApp->customizeSample(gSettings); +#if defined(RENDERER_ANDROID) + /* We need to register event handling callbacks and process events, while window is not yet shown. */ + if(!SamplePlatform::platform()->preOpenWindow(gState)) + { + LOG_INFO("SampleMain", "CMD/Input handlers registration failed. Exiting."); + return; + } + while(!SamplePlatform::platform()->isOpen()) + { + SamplePlatform::platform()->update(); + } +#endif + + if (gApp->isOpen()) + gApp->close(); + + gApp->open(gSettings.mWidth, gSettings.mHeight, gSettings.mName, gSettings.mFullscreen); +#if SEPARATE_EVENT_LOOP + gApp->start(Ps::Thread::getDefaultStackSize()); +#else + if(gApp->isOpen()) gApp->onOpen(); +#endif +} + +void mainTerminate() +{ + DELETESINGLE(gApp); + DELETESINGLE(gSampleCommandLine); + releaseSampleAllocator(); +} + +bool mainContinue() +{ + if (gApp->isOpen() && !gApp->isCloseRequested()) + { + if(gApp->getInputMutex().trylock()) + { + gApp->handleMouseVisualization(); + gApp->doInput(); + gApp->update(); +#if !SEPARATE_EVENT_LOOP + gApp->updateEngine(); +#endif + gApp->getInputMutex().unlock(); + } + Ps::Thread::yield(); +#if defined(RENDERER_ANDROID) + if (SamplePlatform::platform()->isOpen()) + return true; +#else + return true; +#endif + } + +#if SEPARATE_EVENT_LOOP + gApp->signalQuit(); + gApp->waitForQuit(); +#else + if (gApp->isOpen() || gApp->isCloseRequested()) + gApp->close(); +#endif + + return false; +} + +void mainLoop() +{ + while(mainContinue()); +} + + +#if defined(RENDERER_ANDROID) + + extern "C" void android_main(struct android_app* state) + { + gState = state; + const char* argv[] = { "dummy", 0 }; + gSampleCommandLine = new SampleCommandLine(1, argv); + mainInitialize(); + + const char* argFilePath = getSampleMediaFilename("user/androidCmdLine.cfg"); + File* argFp = NULL; + physx::shdfnd::fopen_s(&argFp, argFilePath, "r"); + if (argFp) + { + fclose(argFp); + SampleCommandLine pvdCmdline(1, argv, argFilePath); + gApp->setPvdParams(pvdCmdline); + } + + mainLoop(); + mainTerminate(); + exit(0); + /* Will not return return code, because NDK's native_app_glue declares this function to return nothing. Too bad. */ + } + +#elif defined(RENDERER_IOS) + + #include "ios/IosSamplePlatform.h" + + int main(int argc, const char *const* argv) + { + gSampleCommandLine = new SampleCommandLine((unsigned int)argc, argv); + SampleFramework::createApplication(mainInitialize, mainContinue, mainTerminate); + return 0; + } + +#elif PX_XBOXONE + +namespace SampleFramework +{ + void createApplication(void (*initializeFunc)(), bool (*updateFunc)(), void (*terminateFunc)(), SampleCommandLine*& commandLine); +} + +int main(Platform::Array<Platform::String^>^ args) +{ + SampleFramework::createApplication(mainInitialize, mainContinue, mainTerminate, gSampleCommandLine); + return 0; +} +#elif defined(RENDERER_WINDOWS) + + int main() + { + gSampleCommandLine = new SampleCommandLine(GetCommandLineA()); + mainInitialize(); + mainLoop(); + mainTerminate(); + return 0; + } + +#elif defined(RENDERER_XBOX360) + + int main() + { + const char *argv[32]; + int argc = 0; + volatile LPSTR commandLineString; + commandLineString = GetCommandLine(); // xbox call to get command line argument string + + //skip directly modify the process's share command line string ,in case that it be used in elsewhere + size_t len = strlen(commandLineString); + LPSTR cmdString = (LPSTR)alloca(len+1); + memcpy(cmdString, commandLineString,len); + cmdString[len] = '\0'; + + /* first pull out the application name argv[0] */ + argv[argc] = strtok(cmdString, " "); + + /* pull out the other args */ + while (argv[argc] != NULL) + { + argc++; + argv[argc] = strtok(NULL, " "); + } + gSampleCommandLine = new SampleCommandLine(argc, argv); + mainInitialize(); + mainLoop(); + mainTerminate(); + return 0; + } + +#elif defined(RENDERER_PS3) || defined(RENDERER_PS4) + + int main(int argc, char** argv) + { + gSampleCommandLine = new SampleCommandLine((unsigned int)argc, argv); + mainInitialize(); + mainLoop(); + mainTerminate(); + return 0; + } + +#elif defined(RENDERER_LINUX) + + int main(int argc, const char *const* argv) + { + char* commandString = NULL; + PxU32 commandLen = 0; + const char* specialCommand = "--noXterm"; + const char* xtermCommand = "xterm -e "; + bool foundSpecial = false; + + for(PxU32 i = 0; i < (PxU32)argc; i++) + { + foundSpecial = foundSpecial || (::strncmp(argv[i], specialCommand, ::strlen(specialCommand)) == 0); + commandLen += ::strlen(argv[i]); + } + + // extend command line if not chosen differently + // and start again with terminal as parent + if(!foundSpecial) + { + // increase size by new commands, spaces between commands and string terminator + commandLen += ::strlen(xtermCommand) + ::strlen(specialCommand) + argc + 3; + commandString = (char*)::malloc(commandLen * sizeof(char)); + + ::strcpy(commandString, xtermCommand); + for(PxU32 i = 0; i < (PxU32)argc; i++) + { + ::strcat(commandString, argv[i]); + ::strcat(commandString, " "); + } + ::strcat(commandString, specialCommand); + + int ret = ::system(commandString); + ::free(commandString); + + if(ret < 0) + shdfnd::printFormatted("Failed to run %s! If xterm is missing, try running with this parameter: %s\n", argv[0], specialCommand); + } + else + { + gSampleCommandLine = new SampleCommandLine((unsigned int)(argc), argv); + mainInitialize(); + mainLoop(); + mainTerminate(); + } + + return 0; + } + +#else + + int main(int argc, const char *const* argv) + { + gSampleCommandLine = new SampleCommandLine((unsigned int)argc, argv); + mainInitialize(); + mainLoop(); + mainTerminate(); + return 0; + } + +#endif |