Advertisement
Guest User

Untitled

a guest
Jul 23rd, 2015
39
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 7.63 KB | None | 0 0
  1. #include "PhysicsLogicSystem.h"
  2. #include <PxPhysicsAPI.h>
  3. #include "extensions/PxExtensionsAPI.h"
  4. #include <foundation\PxFoundation.h>
  5. #include <iostream>
  6. #include "OgreLogManager.h"
  7. #include "vehicle/PxVehicleUtil.h"
  8. using namespace Demo;
  9.  
  10. bool                    gIsVehicleInAir = true;
  11.  
  12. PxF32 gSteerVsForwardSpeedData[2 * 8] =
  13. {
  14.     0.0f, 0.75f,
  15.     5.0f, 0.75f,
  16.     30.0f, 0.125f,
  17.     120.0f, 0.1f,
  18.     PX_MAX_F32, PX_MAX_F32,
  19.     PX_MAX_F32, PX_MAX_F32,
  20.     PX_MAX_F32, PX_MAX_F32,
  21.     PX_MAX_F32, PX_MAX_F32
  22. };
  23. PxFixedSizeLookupTable<8> gSteerVsForwardSpeedTable(gSteerVsForwardSpeedData, 4);
  24.  
  25. PxVehicleKeySmoothingData gKeySmoothingData =
  26. {
  27.     {
  28.         6.0f,   //rise rate eANALOG_INPUT_ACCEL
  29.         6.0f,   //rise rate eANALOG_INPUT_BRAKE    
  30.         6.0f,   //rise rate eANALOG_INPUT_HANDBRAKE
  31.         2.5f,   //rise rate eANALOG_INPUT_STEER_LEFT
  32.         2.5f,   //rise rate eANALOG_INPUT_STEER_RIGHT
  33.     },
  34.     {
  35.         10.0f//fall rate eANALOG_INPUT_ACCEL
  36.         10.0f//fall rate eANALOG_INPUT_BRAKE    
  37.         10.0f//fall rate eANALOG_INPUT_HANDBRAKE
  38.         5.0f,   //fall rate eANALOG_INPUT_STEER_LEFT
  39.         5.0f    //fall rate eANALOG_INPUT_STEER_RIGHT
  40.     }
  41. };
  42. bool                    gVehicleOrderComplete = false;
  43. bool                    gMimicKeyInputs = false;
  44. PxBatchQuery*           gBatchQuery = NULL;
  45.  
  46. PhysicsLogicSystem::PhysicsLogicSystem(GameState* state)
  47. : LogicSystem(state),
  48. mPxPhysics(0),
  49. mPxScene(0),
  50. mVehicle(0)
  51. {
  52.     mPxAllocator = new physx::PxDefaultAllocator;
  53.     mPxErrorCallback = new physx::PxDefaultErrorCallback;
  54. }
  55.  
  56. PhysicsLogicSystem::~PhysicsLogicSystem()
  57. {
  58.     delete mPxErrorCallback;
  59.     delete mPxAllocator;
  60. }
  61.  
  62. void PhysicsLogicSystem::initalizePhysicsWorld()
  63. {
  64.     assert(!mPxScene && "Trying to initialize a physics world without destroying the existing one.");
  65.     mPxFoundation = PxCreateFoundation(PX_PHYSICS_VERSION, *mPxAllocator, *mPxErrorCallback);
  66.     PxProfileZoneManager* profileZoneManager = &PxProfileZoneManager::createProfileZoneManager(mPxFoundation);
  67.     mPxPhysics = PxCreatePhysics(PX_PHYSICS_VERSION, *mPxFoundation, PxTolerancesScale(), true);
  68.      
  69.     if (mPxPhysics->getPvdConnectionManager())
  70.     {
  71.         mPxPhysics->getVisualDebugger()->setVisualizeConstraints(true);
  72.         mPxPhysics->getVisualDebugger()->setVisualDebuggerFlag(PxVisualDebuggerFlag::eTRANSMIT_CONTACTS, true);
  73.         mPxPhysics->getVisualDebugger()->setVisualDebuggerFlag(PxVisualDebuggerFlag::eTRANSMIT_SCENEQUERIES, true);
  74.         physx::PxVisualDebuggerConnection* conn = PxVisualDebuggerExt::createConnection(mPxPhysics->getPvdConnectionManager(), "127.0.0.1", 5425, 10);
  75.     }
  76.  
  77.     PxSceneDesc sceneDesc(mPxPhysics->getTolerancesScale());
  78.     sceneDesc.gravity = PxVec3(0.0f, -9.81f, 0.0f);
  79.     mPxDispatcher = PxDefaultCpuDispatcherCreate(2);
  80.     sceneDesc.cpuDispatcher = mPxDispatcher;
  81.     sceneDesc.filterShader = PxDefaultSimulationFilterShader;
  82.     mPxScene = mPxPhysics->createScene(sceneDesc);
  83.    
  84.     mPxCooking = PxCreateCooking(PX_PHYSICS_VERSION, *mPxFoundation, PxCookingParams(PxTolerancesScale()));
  85.  
  86.     mPxMaterial = mPxPhysics->createMaterial(0.5f, 0.5f, 0.6f);
  87.  
  88. }
  89.  
  90. physx::PxVehicleDrive4W* Demo::PhysicsLogicSystem::createPxVehicle4W()
  91. {
  92.     PxInitVehicleSDK(*mPxPhysics);
  93.     PxVehicleSetBasisVectors(PxVec3(0, 1, 0), PxVec3(0, 0, 1));
  94.     PxVehicleSetUpdateMode(PxVehicleUpdateMode::eVELOCITY_CHANGE);
  95.  
  96.     //Create the batched scene queries for the suspension raycasts.
  97.     mVehicleQueryData = VehicleSceneQueryData::allocate(1, PX_MAX_NB_WHEELS, 1, *mPxAllocator);
  98.     gBatchQuery = VehicleSceneQueryData::setUpBatchedSceneQuery(0, *mVehicleQueryData, mPxScene);
  99.  
  100.     //Create the friction table for each combination of tire and surface type.
  101.     mPxFrictionPairs = createFrictionPairs(mPxMaterial);
  102.  
  103.     //Create a plane to drive on.
  104.     PxRigidStatic* ground = createDrivablePlane(mPxMaterial, mPxPhysics);
  105.     mPxScene->addActor(*ground);
  106.  
  107.     //Create a vehicle that will drive on the plane.
  108.     VehicleDesc vehicleDesc = initVehicleDesc();
  109.     mVehicle = createVehicle4W(vehicleDesc, mPxPhysics, mPxCooking);
  110.     PxTransform startTransform(PxVec3(0, (vehicleDesc.chassisDims.y*0.5f + vehicleDesc.wheelRadius + 1.0f), 0), PxQuat(PxIdentity));
  111.     mVehicle->getRigidDynamicActor()->setGlobalPose(startTransform);
  112.     mPxScene->addActor(*mVehicle->getRigidDynamicActor());
  113.  
  114.     //Set the vehicle to rest in first gear.
  115.     //Set the vehicle to use auto-gears.
  116.     mVehicle->setToRestState();
  117.     mVehicle->mDriveDynData.forceGearChange(PxVehicleGearsData::eFIRST);
  118.     mVehicle->mDriveDynData.setUseAutoGears(true);
  119.  
  120.     gVehicleInputData.setDigitalAccel(1.0f);
  121.     return mVehicle;
  122. }
  123. void PhysicsLogicSystem::destroyPhysicsWorld()
  124. {
  125.  
  126. }
  127.  
  128. void PhysicsLogicSystem::update(float timeSinceLast)
  129. {
  130.     BaseSystem::update(timeSinceLast);
  131.     if (mPxScene)
  132.     {
  133.         //Update the control inputs for the vehicle.
  134.         if (mVehicle)
  135.         {
  136.             PxVehicleDrive4WSmoothDigitalRawInputsAndSetAnalogInputs(gKeySmoothingData, gSteerVsForwardSpeedTable, gVehicleInputData, timeSinceLast, gIsVehicleInAir, *mVehicle);
  137.  
  138.             //Raycasts.
  139.             PxVehicleWheels* vehicles[1] = { mVehicle };
  140.             PxRaycastQueryResult* raycastResults = mVehicleQueryData->getRaycastQueryResultBuffer(0);
  141.             const PxU32 raycastResultsSize = mVehicleQueryData->getRaycastQueryResultBufferSize();
  142.             PxVehicleSuspensionRaycasts(gBatchQuery, 1, vehicles, raycastResultsSize, raycastResults);
  143.  
  144.             //Vehicle update.
  145.             const PxVec3 grav = mPxScene->getGravity();
  146.             PxWheelQueryResult wheelQueryResults[PX_MAX_NB_WHEELS];
  147.             PxVehicleWheelQueryResult vehicleQueryResults[1] = { { wheelQueryResults, mVehicle->mWheelsSimData.getNbWheels() } };
  148.             PxVehicleUpdates(timeSinceLast, grav, *mPxFrictionPairs, 1, vehicles, vehicleQueryResults);
  149.             gIsVehicleInAir = mVehicle->getRigidDynamicActor()->isSleeping() ? false : PxVehicleIsInAir(vehicleQueryResults[0]);
  150.         }
  151.  
  152.         mPxScene->simulate(timeSinceLast);//1.0f / 60.0f);
  153.         mPxScene->fetchResults(true);
  154.     }
  155. }
  156.  
  157. void Demo::PhysicsLogicSystem::updateDrive(float step)
  158. {
  159.     mVehicle->getRigidDynamicActor()->wakeUp();
  160. }
  161.  
  162.  
  163. VehicleDesc Demo::PhysicsLogicSystem::initVehicleDesc()
  164. {
  165.     //Set up the chassis mass, dimensions, moment of inertia, and center of mass offset.
  166.     //The moment of inertia is just the moment of inertia of a cuboid but modified for easier steering.
  167.     //Center of mass offset is 0.65m above the base of the chassis and 0.25m towards the front.
  168.     const PxF32 chassisMass = 1500.0f;
  169.     const PxVec3 chassisDims(2.5f, 2.0f, 5.0f);
  170.     const PxVec3 chassisMOI
  171.         ((chassisDims.y*chassisDims.y + chassisDims.z*chassisDims.z)*chassisMass / 12.0f,
  172.         (chassisDims.x*chassisDims.x + chassisDims.z*chassisDims.z)*0.8f*chassisMass / 12.0f,
  173.         (chassisDims.x*chassisDims.x + chassisDims.y*chassisDims.y)*chassisMass / 12.0f);
  174.     const PxVec3 chassisCMOffset(0.0f, -chassisDims.y*0.5f + 0.65f, 0.25f);
  175.  
  176.     //Set up the wheel mass, radius, width, moment of inertia, and number of wheels.
  177.     //Moment of inertia is just the moment of inertia of a cylinder.
  178.     const PxF32 wheelMass = 20.0f;
  179.     const PxF32 wheelRadius = 0.5f;
  180.     const PxF32 wheelWidth = 0.4f;
  181.     const PxF32 wheelMOI = 0.5f*wheelMass*wheelRadius*wheelRadius;
  182.     const PxU32 nbWheels = 4;
  183.  
  184.     VehicleDesc vehicleDesc;
  185.     vehicleDesc.chassisMass = chassisMass;
  186.     vehicleDesc.chassisDims = chassisDims;
  187.     vehicleDesc.chassisMOI = chassisMOI;
  188.     vehicleDesc.chassisCMOffset = chassisCMOffset;
  189.     vehicleDesc.chassisMaterial = mPxMaterial;
  190.     vehicleDesc.wheelMass = wheelMass;
  191.     vehicleDesc.wheelRadius = wheelRadius;
  192.     vehicleDesc.wheelWidth = wheelWidth;
  193.     vehicleDesc.wheelMOI = wheelMOI;
  194.     vehicleDesc.numWheels = nbWheels;
  195.     vehicleDesc.wheelMaterial = mPxMaterial;
  196.     return vehicleDesc;
  197. }
  198.  
  199. void Demo::ErrCallback::reportError(PxErrorCode::Enum code, const char* message, const char* file, int line)
  200. {
  201.     std::stringstream ss;
  202.     ss << file << ":" << line << ":" << message;
  203.     Ogre::LogManager::getSingleton().getDefaultLog()->logMessage(ss.str());
  204. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement