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;
}