PageRenderTime 72ms CodeModel.GetById 45ms RepoModel.GetById 0ms app.codeStats 0ms

/Core/Dependencies/PhysX-3.2.1_PC_SDK_Core/Samples/SampleCCTSharedCode/SampleCCTCameraController.cpp

https://bitbucket.org/barakianc/nvidia-physx-and-apex-in-gge
C++ | 427 lines | 320 code | 46 blank | 61 comment | 44 complexity | c66a3ecfd4401e4a045abff2fc4ab7bb MD5 | raw file
  1. // This code contains NVIDIA Confidential Information and is disclosed to you
  2. // under a form of NVIDIA software license agreement provided separately to you.
  3. //
  4. // Notice
  5. // NVIDIA Corporation and its licensors retain all intellectual property and
  6. // proprietary rights in and to this software and related documentation and
  7. // any modifications thereto. Any use, reproduction, disclosure, or
  8. // distribution of this software and related documentation without an express
  9. // license agreement from NVIDIA Corporation is strictly prohibited.
  10. //
  11. // ALL NVIDIA DESIGN SPECIFICATIONS, CODE ARE PROVIDED "AS IS.". NVIDIA MAKES
  12. // NO WARRANTIES, EXPRESSED, IMPLIED, STATUTORY, OR OTHERWISE WITH RESPECT TO
  13. // THE MATERIALS, AND EXPRESSLY DISCLAIMS ALL IMPLIED WARRANTIES OF NONINFRINGEMENT,
  14. // MERCHANTABILITY, AND FITNESS FOR A PARTICULAR PURPOSE.
  15. //
  16. // Information and code furnished is believed to be accurate and reliable.
  17. // However, NVIDIA Corporation assumes no responsibility for the consequences of use of such
  18. // information or for any infringement of patents or other rights of third parties that may
  19. // result from its use. No license is granted by implication or otherwise under any patent
  20. // or patent rights of NVIDIA Corporation. Details are subject to change without notice.
  21. // This code supersedes and replaces all information previously supplied.
  22. // NVIDIA Corporation products are not authorized for use as critical
  23. // components in life support devices or systems without express written approval of
  24. // NVIDIA Corporation.
  25. //
  26. // Copyright (c) 2008-2012 NVIDIA Corporation. All rights reserved.
  27. // Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved.
  28. // Copyright (c) 2001-2004 NovodeX AG. All rights reserved.
  29. #include "PhysXSample.h"
  30. #include "SampleCCTCameraController.h"
  31. #include "SampleCCTActor.h"
  32. #include "SampleCCTJump.h"
  33. #include "SampleConsole.h"
  34. #include <SampleFrameworkInputEventIds.h>
  35. #include <SamplePlatform.h>
  36. #include <SampleUserInput.h>
  37. #include <SampleUserInputIds.h>
  38. #include <SampleUserInputDefines.h>
  39. using namespace SampleRenderer;
  40. using namespace SampleFramework;
  41. // PT: TODO: move this inside the CCT?
  42. static const bool gTransferPlatformMomentum = true;
  43. static bool gDumpCCTState = false;
  44. static bool gDumpCCTStats = false;
  45. static bool canJump(ControlledActor* actor)
  46. {
  47. PxControllerState cctState;
  48. actor->getController()->getState(cctState);
  49. return (cctState.collisionFlags & PxControllerFlag::eCOLLISION_DOWN)!=0;
  50. }
  51. static void gConsole_DumpCCTState(Console* console, const char* text, void* userData)
  52. {
  53. gDumpCCTState = !gDumpCCTState;
  54. }
  55. static void gConsole_DumpCCTStats(Console* console, const char* text, void* userData)
  56. {
  57. gDumpCCTStats = !gDumpCCTStats;
  58. }
  59. SampleCCTCameraController::SampleCCTCameraController(PhysXSample& base) :
  60. mBase (base),
  61. mObstacleContext (NULL),
  62. mFilterData (NULL),
  63. mFilterCallback (NULL),
  64. mControlledIndex (0),
  65. mNbCCTs (0),
  66. mCCTs (NULL),
  67. mTargetYaw (0.0f-PxPi/2),
  68. mTargetPitch (0.0f),
  69. mPitchMin (-PxHalfPi),
  70. mPitchMax (PxHalfPi),
  71. mGamepadPitchInc (0.0f),
  72. mGamepadYawInc (0.0f),
  73. mGamepadForwardInc (0.0f),
  74. mGamepadLateralInc (0.0f),
  75. mSensibility (0.001f),
  76. mFwd (false),
  77. mBwd (false),
  78. mLeft (false),
  79. mRight (false),
  80. mKeyShiftDown (false),
  81. mRunningSpeed (10.0f),
  82. mWalkingSpeed (2.5f),
  83. mJumpForce (30.0f),
  84. mGravity (-9.81f),
  85. mLinkCameraToPhysics(false)
  86. {
  87. Console* console = base.getConsole();
  88. if(console)
  89. {
  90. console->addCmd("DumpCCTState", gConsole_DumpCCTState);
  91. console->addCmd("DumpCCTStats", gConsole_DumpCCTStats);
  92. }
  93. }
  94. void SampleCCTCameraController::setControlled(ControlledActor** controlled, PxU32 controlledIndex, PxU32 nbCCTs)
  95. {
  96. mControlledIndex = controlledIndex;
  97. mNbCCTs = nbCCTs;
  98. mCCTs = controlled;
  99. }
  100. void SampleCCTCameraController::startJump()
  101. {
  102. ControlledActor* actor = getControlledActor();
  103. if(canJump(actor))
  104. actor->jump(mJumpForce);
  105. }
  106. void SampleCCTCameraController::collectInputEvents(std::vector<const SampleFramework::InputEvent*>& inputEvents)
  107. {
  108. //digital keyboard events
  109. DIGITAL_INPUT_EVENT_DEF(CAMERA_MOVE_FORWARD, SCAN_CODE_FORWARD, XKEY_W, PS3KEY_W, AKEY_UNKNOWN, SCAN_CODE_FORWARD, PSP2KEY_UNKNOWN, IKEY_UNKNOWN, SCAN_CODE_FORWARD);
  110. DIGITAL_INPUT_EVENT_DEF(CAMERA_MOVE_BACKWARD, SCAN_CODE_BACKWARD, XKEY_S, PS3KEY_S, AKEY_UNKNOWN, SCAN_CODE_BACKWARD, PSP2KEY_UNKNOWN, IKEY_UNKNOWN, SCAN_CODE_BACKWARD);
  111. DIGITAL_INPUT_EVENT_DEF(CAMERA_MOVE_LEFT, SCAN_CODE_LEFT, XKEY_A, PS3KEY_A, AKEY_UNKNOWN, SCAN_CODE_LEFT, PSP2KEY_UNKNOWN, IKEY_UNKNOWN, SCAN_CODE_LEFT);
  112. DIGITAL_INPUT_EVENT_DEF(CAMERA_MOVE_RIGHT, SCAN_CODE_RIGHT, XKEY_D, PS3KEY_D, AKEY_UNKNOWN, SCAN_CODE_RIGHT, PSP2KEY_UNKNOWN, IKEY_UNKNOWN, SCAN_CODE_RIGHT);
  113. DIGITAL_INPUT_EVENT_DEF(CAMERA_SHIFT_SPEED, SCAN_CODE_LEFT_SHIFT, XKEY_SHIFT, PS3KEY_SHIFT, AKEY_UNKNOWN, OSXKEY_SHIFT, PSP2KEY_UNKNOWN, IKEY_UNKNOWN, LINUXKEY_SHIFT);
  114. DIGITAL_INPUT_EVENT_DEF(CAMERA_JUMP, SCAN_CODE_SPACE, XKEY_SPACE, PS3KEY_SPACE, AKEY_UNKNOWN, OSXKEY_SPACE, PSP2KEY_UNKNOWN, IKEY_UNKNOWN, LINUXKEY_SPACE);
  115. DIGITAL_INPUT_EVENT_DEF(CAMERA_CROUCH, SCAN_CODE_DOWN, XKEY_C, PS3KEY_C, AKEY_UNKNOWN, SCAN_CODE_DOWN, PSP2KEY_UNKNOWN, IKEY_UNKNOWN, SCAN_CODE_DOWN);
  116. DIGITAL_INPUT_EVENT_DEF(CAMERA_CONTROLLER_INCREASE, WKEY_ADD, XKEY_ADD, PS3KEY_ADD, AKEY_UNKNOWN, OSXKEY_ADD, PSP2KEY_UNKNOWN, IKEY_UNKNOWN, LINUXKEY_ADD);
  117. DIGITAL_INPUT_EVENT_DEF(CAMERA_CONTROLLER_DECREASE, WKEY_SUBTRACT, XKEY_SUBTRACT, PS3KEY_SUBTRACT, AKEY_UNKNOWN, OSXKEY_SUBTRACT, PSP2KEY_UNKNOWN, IKEY_UNKNOWN, LINUXKEY_SUBTRACT);
  118. //digital gamepad events
  119. DIGITAL_INPUT_EVENT_DEF(CAMERA_JUMP, GAMEPAD_SOUTH, GAMEPAD_SOUTH, GAMEPAD_SOUTH, AKEY_UNKNOWN, GAMEPAD_SOUTH, GAMEPAD_SOUTH, IKEY_UNKNOWN, LINUXKEY_UNKNOWN);
  120. DIGITAL_INPUT_EVENT_DEF(CAMERA_CROUCH, GAMEPAD_LEFT_STICK, GAMEPAD_LEFT_STICK, GAMEPAD_LEFT_STICK, AKEY_UNKNOWN, GAMEPAD_LEFT_STICK, GAMEPAD_WEST, IKEY_UNKNOWN, LINUXKEY_UNKNOWN);
  121. DIGITAL_INPUT_EVENT_DEF(CAMERA_CONTROLLER_INCREASE, GAMEPAD_RIGHT_SHOULDER_TOP, GAMEPAD_RIGHT_SHOULDER_TOP, GAMEPAD_RIGHT_SHOULDER_TOP, AKEY_UNKNOWN, GAMEPAD_RIGHT_SHOULDER_TOP, PSP2KEY_UNKNOWN, IKEY_UNKNOWN, LINUXKEY_UNKNOWN);
  122. DIGITAL_INPUT_EVENT_DEF(CAMERA_CONTROLLER_DECREASE, GAMEPAD_LEFT_SHOULDER_TOP, GAMEPAD_LEFT_SHOULDER_TOP, GAMEPAD_LEFT_SHOULDER_TOP, AKEY_UNKNOWN, GAMEPAD_LEFT_SHOULDER_TOP, PSP2KEY_UNKNOWN, IKEY_UNKNOWN, LINUXKEY_UNKNOWN);
  123. //analog gamepad events
  124. ANALOG_INPUT_EVENT_DEF(CAMERA_GAMEPAD_ROTATE_LEFT_RIGHT, GAMEPAD_ROTATE_SENSITIVITY, GAMEPAD_RIGHT_STICK_X, GAMEPAD_RIGHT_STICK_X, GAMEPAD_RIGHT_STICK_X, GAMEPAD_RIGHT_STICK_X, GAMEPAD_RIGHT_STICK_X, GAMEPAD_RIGHT_STICK_X, GAMEPAD_RIGHT_STICK_X, LINUXKEY_UNKNOWN);
  125. ANALOG_INPUT_EVENT_DEF(CAMERA_GAMEPAD_ROTATE_UP_DOWN, GAMEPAD_ROTATE_SENSITIVITY, GAMEPAD_RIGHT_STICK_Y, GAMEPAD_RIGHT_STICK_Y, GAMEPAD_RIGHT_STICK_Y, GAMEPAD_RIGHT_STICK_Y, GAMEPAD_RIGHT_STICK_Y, GAMEPAD_RIGHT_STICK_Y, GAMEPAD_RIGHT_STICK_Y, LINUXKEY_UNKNOWN);
  126. ANALOG_INPUT_EVENT_DEF(CAMERA_GAMEPAD_MOVE_LEFT_RIGHT, GAMEPAD_DEFAULT_SENSITIVITY, GAMEPAD_LEFT_STICK_X, GAMEPAD_LEFT_STICK_X, GAMEPAD_LEFT_STICK_X, GAMEPAD_LEFT_STICK_X, GAMEPAD_LEFT_STICK_X, GAMEPAD_LEFT_STICK_X, GAMEPAD_LEFT_STICK_X, LINUXKEY_UNKNOWN);
  127. ANALOG_INPUT_EVENT_DEF(CAMERA_GAMEPAD_MOVE_FORWARD_BACK, GAMEPAD_DEFAULT_SENSITIVITY, GAMEPAD_LEFT_STICK_Y, GAMEPAD_LEFT_STICK_Y, GAMEPAD_LEFT_STICK_Y, GAMEPAD_LEFT_STICK_Y, GAMEPAD_LEFT_STICK_Y, GAMEPAD_LEFT_STICK_Y, GAMEPAD_LEFT_STICK_Y, LINUXKEY_UNKNOWN);
  128. //touch events (these are defined in the samples, since overwriting is currently not well possible)
  129. }
  130. void SampleCCTCameraController::onDigitalInputEvent(const SampleFramework::InputEvent& ie, bool val)
  131. {
  132. switch (ie.m_Id)
  133. {
  134. case CAMERA_MOVE_FORWARD:
  135. {
  136. mFwd = val;
  137. }
  138. break;
  139. case CAMERA_MOVE_BACKWARD:
  140. {
  141. mBwd = val;
  142. }
  143. break;
  144. case CAMERA_MOVE_LEFT:
  145. {
  146. mLeft = val;
  147. }
  148. break;
  149. case CAMERA_MOVE_RIGHT:
  150. {
  151. mRight = val;
  152. }
  153. break;
  154. case CAMERA_SHIFT_SPEED:
  155. {
  156. mKeyShiftDown = val;
  157. }
  158. break;
  159. case CAMERA_JUMP:
  160. {
  161. if(val)
  162. startJump();
  163. }
  164. break;
  165. case CAMERA_CROUCH:
  166. {
  167. if(val)
  168. {
  169. getControlledActor()->resizeCrouching();
  170. }
  171. else
  172. {
  173. getControlledActor()->mDoStandup = true;
  174. }
  175. }
  176. break;
  177. case CAMERA_CONTROLLER_INCREASE:
  178. {
  179. if(val)
  180. {
  181. if(mControlledIndex<mNbCCTs-1)
  182. mControlledIndex++;
  183. }
  184. }
  185. break;
  186. case CAMERA_CONTROLLER_DECREASE:
  187. {
  188. if(val)
  189. {
  190. if(mControlledIndex)
  191. mControlledIndex--;
  192. }
  193. }
  194. break;
  195. }
  196. }
  197. static PX_FORCE_INLINE PxReal remapAxisValue(PxReal absolutePosition)
  198. {
  199. return absolutePosition * absolutePosition * absolutePosition * 5.0f;
  200. }
  201. void SampleCCTCameraController::onAnalogInputEvent(const SampleFramework::InputEvent& ie, float val)
  202. {
  203. if(ie.m_Id == CAMERA_GAMEPAD_ROTATE_LEFT_RIGHT)
  204. {
  205. mGamepadYawInc = - remapAxisValue(val);
  206. }
  207. else if(ie.m_Id == CAMERA_GAMEPAD_ROTATE_UP_DOWN)
  208. {
  209. // PT: ideally we'd need an option to "invert Y axis" here
  210. // mGamepadPitchInc = - remapAxisValue(val);
  211. mGamepadPitchInc = remapAxisValue(val);
  212. }
  213. else if(ie.m_Id == CAMERA_GAMEPAD_MOVE_LEFT_RIGHT)
  214. {
  215. mGamepadLateralInc = val;
  216. }
  217. else if(ie.m_Id == CAMERA_GAMEPAD_MOVE_FORWARD_BACK)
  218. {
  219. mGamepadForwardInc = val;
  220. }
  221. }
  222. void SampleCCTCameraController::onPointerInputEvent(const SampleFramework::InputEvent &ie, physx::PxU32, physx::PxU32, physx::PxReal dx, physx::PxReal dy, bool val)
  223. {
  224. if (ie.m_Id == CAMERA_MOUSE_LOOK)
  225. {
  226. mTargetYaw -= dx * mSensibility;
  227. mTargetPitch += dy * mSensibility;
  228. }
  229. }
  230. void SampleCCTCameraController::setView(PxReal pitch, PxReal yaw)
  231. {
  232. mTargetPitch = pitch;
  233. mTargetYaw = yaw;
  234. }
  235. void SampleCCTCameraController::update(Camera& camera, PxReal dtime)
  236. {
  237. // printf("SampleCCTCameraController::update\n");
  238. if(!mCCTs)
  239. return;
  240. // Update CCT
  241. // bool doUpdate = false;
  242. if(!mBase.isPaused())
  243. {
  244. /* PxScene& scene = mBase.getActiveScene();
  245. static PxU32 timestamp = 0;
  246. PxU32 t = scene.getTimestamp();
  247. const PxU32 dt = t - timestamp;
  248. doUpdate = t!=timestamp;
  249. printf("doUpdate: %d\n", doUpdate);
  250. timestamp = t;
  251. if(doUpdate)
  252. dtime = float(dt) * 1.0f/60.0f;
  253. if(doUpdate)*/
  254. {
  255. const PxControllerFilters filters(0, mFilterData, mFilterCallback);
  256. for(PxU32 i=0;i<mNbCCTs;i++)
  257. {
  258. PxVec3 disp;
  259. const PxF32 heightDelta = mCCTs[i]->mJump.getHeight(dtime);
  260. float dy;
  261. if(heightDelta!=0.0f)
  262. dy = heightDelta;
  263. else
  264. dy = mGravity * dtime;
  265. // printf("%f\n", dy);
  266. if(i==mControlledIndex)
  267. {
  268. PxVec3 targetKeyDisplacement(0);
  269. PxVec3 targetPadDisplacement(0);
  270. PxVec3 forward = camera.getViewDir();
  271. forward.y = 0;
  272. forward.normalize();
  273. PxVec3 up = PxVec3(0,1,0);
  274. PxVec3 right = forward.cross(up);
  275. // if(canJump(mCCTs[i])) // PT: prevent displacement in mid-air
  276. {
  277. if(mFwd) targetKeyDisplacement += forward;
  278. if(mBwd) targetKeyDisplacement -= forward;
  279. if(mRight) targetKeyDisplacement += right;
  280. if(mLeft) targetKeyDisplacement -= right;
  281. targetKeyDisplacement *= mKeyShiftDown ? mRunningSpeed : mWalkingSpeed;
  282. targetKeyDisplacement *= dtime;
  283. targetPadDisplacement += forward * mGamepadForwardInc * mRunningSpeed;
  284. targetPadDisplacement += right * mGamepadLateralInc * mRunningSpeed;
  285. targetPadDisplacement *= dtime;
  286. }
  287. disp = targetKeyDisplacement + targetPadDisplacement;
  288. disp.y = dy;
  289. }
  290. else
  291. {
  292. disp = PxVec3(0, dy, 0);
  293. }
  294. if(gTransferPlatformMomentum)
  295. {
  296. // printf("%d\n", mCCTs[i]->mTransferMomentum);
  297. if(mCCTs[i]->mTransferMomentum)
  298. {
  299. PxVec3 dd = mCCTs[i]->mDelta * dtime;
  300. // printf("dd: %f %f %f (%f)\n", dd.x, dd.y, dd.z, dtime);
  301. disp.x += dd.x;
  302. disp.z += dd.z;
  303. }
  304. }
  305. const PxU32 flags = mCCTs[i]->mController->move(disp, 0.001f, dtime, filters, mObstacleContext);
  306. if(flags & PxControllerFlag::eCOLLISION_DOWN)
  307. {
  308. // printf("Stop jump\n");
  309. mCCTs[i]->mJump.stopJump();
  310. }
  311. // printf("%d\n", flags & PxControllerFlag::eCOLLISION_DOWN);
  312. if(gTransferPlatformMomentum)
  313. {
  314. if(!flags)
  315. {
  316. mCCTs[i]->mTransferMomentum = true;
  317. }
  318. else
  319. {
  320. // ### optimize this
  321. mCCTs[i]->mTransferMomentum = false;
  322. PxControllerState cctState;
  323. mCCTs[i]->mController->getState(cctState);
  324. mCCTs[i]->mDelta = cctState.deltaXP;
  325. // printf("delta out: %f %f %f\n", cctState.deltaXP.x, cctState.deltaXP.y, cctState.deltaXP.z);
  326. }
  327. }
  328. if(gDumpCCTState && i==mControlledIndex)
  329. {
  330. PxControllerState cctState;
  331. mCCTs[i]->mController->getState(cctState);
  332. printf("\nCCT state:\n");
  333. printf("delta: %.02f | %.02f | %.02f\n", cctState.deltaXP.x, cctState.deltaXP.y, cctState.deltaXP.z);
  334. printf("touchedShape: %p\n", cctState.touchedShape);
  335. printf("touchedObstacle: %p\n", cctState.touchedObstacle);
  336. printf("standOnAnotherCCT: %d\n", cctState.standOnAnotherCCT);
  337. printf("standOnObstacle: %d\n", cctState.standOnObstacle);
  338. printf("isMovingUp: %d\n", cctState.isMovingUp);
  339. printf("collisionFlags: %d\n", cctState.collisionFlags);
  340. }
  341. if(gDumpCCTStats && i==mControlledIndex)
  342. {
  343. PxControllerStats cctStats;
  344. mCCTs[i]->mController->getStats(cctStats);
  345. printf("nbIterations: %d\n", cctStats.nbIterations);
  346. printf("nbFullUpdates: %d\n", cctStats.nbFullUpdates);
  347. printf("nbPartialUpdates: %d\n", cctStats.nbPartialUpdates);
  348. }
  349. }
  350. }
  351. }
  352. // Update camera
  353. PxController* cct = mCCTs[mControlledIndex]->mController;
  354. if(cct/* && doUpdate*/)
  355. {
  356. mTargetYaw += mGamepadYawInc * dtime;
  357. mTargetPitch += mGamepadPitchInc * dtime;
  358. // Clamp pitch
  359. if(mTargetPitch<mPitchMin) mTargetPitch = mPitchMin;
  360. if(mTargetPitch>mPitchMax) mTargetPitch = mPitchMax;
  361. camera.setRot(PxVec3(-mTargetPitch,-mTargetYaw,0));
  362. //printf("Pitch: %f\n", mTargetPitch);
  363. PxExtendedVec3 camTarget;
  364. if(!mLinkCameraToPhysics)
  365. {
  366. camTarget = cct->getFootPosition();
  367. }
  368. else
  369. {
  370. const PxVec3 delta = cct->getPosition() - cct->getFootPosition();
  371. const PxVec3 physicsPos = cct->getActor()->getGlobalPose().p - delta;
  372. camTarget = PxExtendedVec3(physicsPos.x, physicsPos.y, physicsPos.z);
  373. }
  374. const float height = 1.0f;
  375. camTarget += PxVec3(0, height, 0);
  376. const PxVec3 target = toVec3(camTarget) - camera.getViewDir()*5.0f;
  377. //const PxVec3 target2 = target;
  378. //printf("target: %f | %f | %f\n", target.x, target.y, target.z);
  379. camera.setPos(target);
  380. }
  381. }