void FPhysXVehicleManager::UpdateTireFrictionTableInternal() { const PxU32 MAX_NUM_MATERIALS = 128; // There are tire types and then there are drivable surface types. // PhysX supports physical materials that share a drivable surface type, // but we just create a drivable surface type for every type of physical material PxMaterial* AllPhysicsMaterials[MAX_NUM_MATERIALS]; PxVehicleDrivableSurfaceType DrivableSurfaceTypes[MAX_NUM_MATERIALS]; // Gather all the physical materials GPhysXSDK->getMaterials(AllPhysicsMaterials, MAX_NUM_MATERIALS); uint32 NumMaterials = GPhysXSDK->getNbMaterials(); uint32 NumTireTypes = UTireType::AllTireTypes.Num(); for ( uint32 m = 0; m < NumMaterials; ++m ) { // Set up the drivable surface type that will be used for the new material. DrivableSurfaceTypes[m].mType = m; } // Release the previous SurfaceTirePairs, if any if ( SurfaceTirePairs ) { SurfaceTirePairs->release(); SurfaceTirePairs = NULL; } // Set up the friction values arising from combinations of tire type and surface type. SurfaceTirePairs = PxVehicleDrivableSurfaceToTireFrictionPairs::allocate( NumTireTypes, NumMaterials ); SurfaceTirePairs->setup( NumTireTypes, NumMaterials, (const PxMaterial**)AllPhysicsMaterials, DrivableSurfaceTypes ); for ( uint32 m = 0; m < NumMaterials; ++m ) { UPhysicalMaterial* PhysMat = FPhysxUserData::Get<UPhysicalMaterial>(AllPhysicsMaterials[m]->userData); for ( uint32 t = 0; t < NumTireTypes; ++t ) { TWeakObjectPtr<UTireType> TireType = UTireType::AllTireTypes[t]; float TireFrictionScale = 1.0f; if ( PhysMat != NULL ) { TireFrictionScale *= PhysMat->GetTireFrictionScale( TireType ); } else if ( TireType != NULL ) { TireFrictionScale *= TireType->GetFrictionScale(); } SurfaceTirePairs->setTypePairFriction( m, t, TireFrictionScale ); } } }
float UPhysicalMaterial::GetTireFrictionScale( TWeakObjectPtr<UTireType> TireType ) { float Scale = (TireType != NULL) ? TireType->GetFrictionScale() : 1.0f; Scale *= TireFrictionScale; for ( int32 i = TireFrictionScales.Num() - 1; i >= 0; --i ) { if ( TireFrictionScales[i].TireType == TireType.Get() ) { Scale *= TireFrictionScales[i].FrictionScale; break; } } return Scale; }