public static void PX_RELEASE(ref PxVehicleDrivableSurfaceToTireFrictionPairs *x) { if (x != null) { x->release(); x = null; } }
public static PxVehicleDrivableSurfaceToTireFrictionPairs *createFrictionPairs(PxMaterial *defaultMaterial) { PxVehicleDrivableSurfaceType *surfaceTypes = stackalloc PxVehicleDrivableSurfaceType[1]; surfaceTypes[0].mType = SURFACE_TYPE_TARMAC; PxMaterial **surfaceMaterials = stackalloc PxMaterial *[1]; surfaceMaterials[0] = defaultMaterial; PxVehicleDrivableSurfaceToTireFrictionPairs *surfaceTirePairs = PxVehicleDrivableSurfaceToTireFrictionPairs.allocate(MAX_NUM_TIRE_TYPES, MAX_NUM_SURFACE_TYPES); surfaceTirePairs->setup(MAX_NUM_TIRE_TYPES, MAX_NUM_SURFACE_TYPES, surfaceMaterials, surfaceTypes); for (uint i = 0; i < MAX_NUM_SURFACE_TYPES; i++) { for (uint j = 0; j < MAX_NUM_TIRE_TYPES; j++) { surfaceTirePairs->setTypePairFriction(i, j, gTireFrictionMultipliers[i, j]); } } return(surfaceTirePairs); }
public static void initPhysics() { gFoundation = PxCreateFoundation(PX_PHYSICS_VERSION, ref gAllocator.Value, ref gErrorCallback.Value); gPvd = PxCreatePvd(ref *gFoundation); PxPvdTransport *transport = PxDefaultPvdSocketTransportCreate(PVD_HOST, 5425, 10); gPvd->connect(ref *transport, PxPvdInstrumentationFlags.eALL); gPhysics = PxCreatePhysics(PX_PHYSICS_VERSION, ref *gFoundation, new PxTolerancesScale(), true, gPvd); PxSceneDesc sceneDesc = new(*gPhysics->getTolerancesScale()); sceneDesc.gravity = new PxVec3(0.0f, -9.81f, 0.0f); uint numWorkers = 1; gDispatcher = PxDefaultCpuDispatcherCreate(numWorkers); sceneDesc.cpuDispatcher = (PxCpuDispatcher *)gDispatcher; //BIOQUIRK: Base cast sceneDesc.filterShader = &VehicleFilterShader; gScene = gPhysics->createScene(sceneDesc); PxPvdSceneClient *pvdClient = gScene->getScenePvdClient(); if (pvdClient != null) { pvdClient->setScenePvdFlag(PxPvdSceneFlags.eTRANSMIT_CONSTRAINTS, true); pvdClient->setScenePvdFlag(PxPvdSceneFlags.eTRANSMIT_CONTACTS, true); pvdClient->setScenePvdFlag(PxPvdSceneFlags.eTRANSMIT_SCENEQUERIES, true); } gMaterial = gPhysics->createMaterial(0.5f, 0.5f, 0.6f); gCooking = PxCreateCooking(PX_PHYSICS_VERSION, ref *gFoundation, new PxCookingParams(new PxTolerancesScale())); ///////////////////////////////////////////// PxInitVehicleSDK(ref *gPhysics); PxVehicleSetBasisVectors(new PxVec3(0, 1, 0), new PxVec3(0, 0, 1)); PxVehicleSetUpdateMode(PxVehicleUpdateMode.eVELOCITY_CHANGE); //Create the batched scene queries for the suspension raycasts. gVehicleSceneQueryData = VehicleSceneQueryData.allocate(1, PX_MAX_NB_WHEELS, 1, 1, &WheelSceneQueryPreFilterBlocking, null, ref gAllocator.Value); gBatchQuery = VehicleSceneQueryData.setUpBatchedSceneQuery(0, *gVehicleSceneQueryData, gScene); //Create the friction table for each combination of tire and surface type. gFrictionPairs = createFrictionPairs(gMaterial); //Create a plane to drive on. PxFilterData groundPlaneSimFilterData = new((uint)COLLISION_FLAG_GROUND, (uint)COLLISION_FLAG_GROUND_AGAINST, 0, 0); gGroundPlane = createDrivablePlane(groundPlaneSimFilterData, gMaterial, gPhysics); gScene->addActor(ref *gGroundPlane); //Create a vehicle that will drive on the plane. VehicleDesc vehicleDesc = initVehicleDesc(); gVehicleNoDrive = createVehicleNoDrive(vehicleDesc, gPhysics, gCooking); PxTransform startTransform = new(new PxVec3(0, (vehicleDesc.chassisDims.y * 0.5f + vehicleDesc.wheelRadius + 1.0f), 0), new PxQuat(PxIdentity)); gVehicleNoDrive->getRigidDynamicActor()->setGlobalPose(startTransform); gScene->addActor(ref *gVehicleNoDrive->getRigidDynamicActor()); //Set the vehicle to rest in first gear. //Set the vehicle to use auto-gears. gVehicleNoDrive->setToRestState(); gVehicleModeTimer = 0.0f; gVehicleOrderProgress = 0; startBrakeMode(); }