// VehicleWheelQueryResults() is omitted since they represent default behavior in C#.
    // ~VehicleWheelQueryResults() is omitted since it doesn't actually do anything.

    //Allocate wheel results for up to maxNumVehicles with up to maxNumWheelsPerVehicle.
    public static VehicleWheelQueryResults *allocate <TAllocator>(uint maxNumVehicles, uint maxNumWheelsPerVehicle, ref TAllocator allocator)
        where TAllocator : unmanaged, IPxAllocatorCallback
    {
        uint byteSize = (uint)(sizeof(VehicleWheelQueryResults) + sizeof(PxVehicleWheelQueryResult) * maxNumVehicles + sizeof(PxWheelQueryResult) * maxNumWheelsPerVehicle * maxNumVehicles);

        byte *buffer = (byte *)Unsafe.As <TAllocator, PxAllocatorCallback>(ref allocator).allocate(byteSize, null, null, 0); //BIOQUIRK: Awkward generic cast

        VehicleWheelQueryResults *vwqr = (VehicleWheelQueryResults *)(buffer);

        buffer += sizeof(VehicleWheelQueryResults);

        vwqr->mVehicleWheelQueryResults = (PxVehicleWheelQueryResult *)(buffer);
        buffer += sizeof(PxVehicleWheelQueryResult) * maxNumVehicles;

        for (uint i = 0; i < maxNumVehicles; i++)
        {
            PxWheelQueryResult *result = (PxWheelQueryResult *)buffer;
            *result = new PxWheelQueryResult();
            vwqr->mVehicleWheelQueryResults[i].wheelQueryResults   = result;
            vwqr->mVehicleWheelQueryResults[i].nbWheelQueryResults = maxNumWheelsPerVehicle;
            buffer += sizeof(PxWheelQueryResult) * maxNumWheelsPerVehicle;
        }

        return(vwqr);
    }
Example #2
0
    public static void stepPhysics()
    {
        const float timestep = 1.0f / 60.0f;

        //Cycle through the driving modes to demonstrate how to accelerate/reverse/brake/turn etc.
        incrementDrivingMode(timestep);

        //Raycasts.
        PxVehicleNoDrive **vehicles = stackalloc PxVehicleNoDrive *[1] {
            gVehicleNoDrive
        };
        PxBatchQueryResult <PxRaycastHit> *raycastResults = gVehicleSceneQueryData->getRaycastQueryResultBuffer(0);
        uint raycastResultsSize = gVehicleSceneQueryData->getQueryResultBufferSize();

        PxVehicleSuspensionRaycasts(gBatchQuery, 1, vehicles, raycastResultsSize, raycastResults);

        //Vehicle update.
        PxVec3 grav = gScene->getGravity();
        PxWheelQueryResult *       wheelQueryResults   = stackalloc PxWheelQueryResult[PX_MAX_NB_WHEELS];
        PxVehicleWheelQueryResult *vehicleQueryResults = stackalloc PxVehicleWheelQueryResult[1]
        {
            new() { wheelQueryResults = wheelQueryResults, nbWheelQueryResults = gVehicleNoDrive->mWheelsSimData.getNbWheels() }
        };

        PxVehicleUpdates(timestep, grav, *gFrictionPairs, 1, vehicles, vehicleQueryResults);

        //Scene update.
        gScene->simulate(timestep);
        gScene->fetchResults(true);
    }