public static void PX_RELEASE(ref PxVehicleDrivableSurfaceToTireFrictionPairs *x)
 {
     if (x != null)
     {
         x->release();
         x = null;
     }
 }
Beispiel #2
0
    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);
    }
Beispiel #3
0
    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();
    }