Brian Koponen

Programming and Tech Tips

Best DiRT 3 Wheel Settings for Thrustmaster TMX / T150

DiRT 3, while sadly no longer available for purchase on Steam, is a great game that plays very well with a wheel. Unfortunately, because of its age, it doesn't natively support newer wheels like the Thrustmaster TMX or T150. While you can bind the steering, pedals and buttons to actions using the in-game options, you won't be able to control the menus without native support.

Luckily, you can add native support for these wheels by editing a few text files. This lets you control all the menus directly from the wheel and, most importantly, doesn't stop the game from saving progress (as is often the case when you start editing game files). Once you do this and set the proper values for the control settings, you will never know the wheel was unsupported.


Device Action Map Files

Every supported input device has a file that defines it and its button bindings. In order to add support for new wheels, we need to make a new action map file for the device.

For the Thrustmaster TMX:

In your Steam Library steamapps\common\DiRT 3 Complete Edition\actionmap folder, create a text file named tm_tmx.xml.

Paste in the following text:

<!-- Action map for a default Direct Input device -->
<!-- Defaults:          deadZone: 0.2f          saturation: 0.8f          threshold: 0.5f -->
<ActionMap actionMapName="tm_tmx" deviceName="Thrustmaster TMX Racing Wheel" priority="16">

  <!-- In Game Actions -->
  <Action actionName="Accelerate">
    <Axis axisName="di_z_axis_rotation">
      <CalibratorSimple type="uniDirectionalNegative" deadZone="0.0" saturation="1.0" />
    </Axis>
  </Action>
  <Action actionName="Brake">
    <Axis axisName="di_y_axis">
      <CalibratorSimple type="uniDirectionalNegative" deadZone="0.0" saturation="1.0" />
    </Axis>
  </Action>
  <Action actionName="Handbrake">
    <Axis axisName="di_button_4">
      <CalibratorSimple type="uniDirectionalPositive" />
    </Axis>
  </Action>
  <Action actionName="Steer Left">
    <Axis axisName="di_x_axis">
      <CalibratorSimple type="biDirectionalLower" deadZone="0.0" saturation="1.0" />
    </Axis>
  </Action>
  <Action actionName="Steer Right">
    <Axis axisName="di_x_axis">
      <CalibratorSimple type="biDirectionalUpper" deadZone="0.0" saturation="1.0" />
    </Axis>
  </Action>
  <Action actionName="Change View">
    <Axis axisName="di_button_3">
      <CalibratorSimple type="uniDirectionalPositive" />
    </Axis>
  </Action>
  <Action actionName="Gear Up">
    <Axis axisName="di_button_1">
      <CalibratorSimple type="uniDirectionalPositive" />
    </Axis>
  </Action>
  <Action actionName="Gear Down">
    <Axis axisName="di_button_0">
      <CalibratorSimple type="uniDirectionalPositive" />
    </Axis>
  </Action>
  <Action actionName="Look Left">
    <Axis axisName="di_dpad_0_left">
        <CalibratorSimple type="uniDirectionalPositive" />
    </Axis>
  </Action>
  <Action actionName="Look Right">
    <Axis axisName="di_dpad_0_right">
      <CalibratorSimple type="uniDirectionalPositive" />
    </Axis>
  </Action>
  <Action actionName="Look Up">
    <Axis axisName="di_dpad_0_up">
      <CalibratorSimple type="uniDirectionalPositive" />
    </Axis>
  </Action>
  <Action actionName="Look Down">
    <Axis axisName="di_dpad_0_down">
      <CalibratorSimple type="uniDirectionalPositive" />
    </Axis>
  </Action>
  <Action actionName="Look Back">
    <Axis axisName="">
      <CalibratorSimple type="uniDirectionalPositive" />
    </Axis>
  </Action>
  <Action actionName="Pause">
    <Axis axisName="di_button_7">
      <CalibratorSimple type="uniDirectionalPositive" />
    </Axis>
  </Action>
  <Action actionName="Instant Replay">
    <Axis axisName="di_button_2">
      <CalibratorSimple type="uniDirectionalPositive" />
    </Axis>
  </Action>
  <Action actionName="Horn">
    <Axis axisName="di_button_11">
      <CalibratorSimple type="uniDirectionalPositive" />
    </Axis>
  </Action>

  <!-- Menu Actions -->
  <Action actionName="Menu Left">
    <Axis axisName="di_dpad_0_left">
      <CalibratorSimple type="uniDirectionalPositive" />
    </Axis>
  </Action>
  <Action actionName="Menu Right">
    <Axis axisName="di_dpad_0_right">
      <CalibratorSimple type="uniDirectionalPositive" />
    </Axis>
  </Action>
  <Action actionName="Menu Up">
    <Axis axisName="di_dpad_0_up">
      <CalibratorSimple type="uniDirectionalPositive" />
    </Axis>
  </Action>
  <Action actionName="Menu Down">
    <Axis axisName="di_dpad_0_down">
      <CalibratorSimple type="uniDirectionalPositive" />
    </Axis>
  </Action>
  <Action actionName="Menu Select">
    <Axis axisName="di_button_4">
      <CalibratorSimple type="uniDirectionalPositive" />
    </Axis>
  </Action>
  <Action actionName="Menu Back">
    <Axis axisName="di_button_8">
      <CalibratorSimple type="uniDirectionalPositive" />
    </Axis>
  </Action>
  <Action actionName="Menu Button3">
    <Axis axisName="di_button_2">
      <CalibratorSimple type="uniDirectionalPositive" />
    </Axis>
  </Action>
  <Action actionName="Menu Button4">
    <Axis axisName="di_button_9">
      <CalibratorSimple type="uniDirectionalPositive" />
    </Axis>
  </Action>
  <Action actionName="Menu Start Button">
    <Axis axisName="di_button_7">
      <CalibratorSimple type="uniDirectionalPositive" />
    </Axis>
  </Action>

  <!-- Replay Actions -->
  <Action actionName="Replay Rewind">
    <Axis axisName="di_x_axis">
      <CalibratorSimple type="biDirectionalLower" deadZone="0.0" saturation="1.0" />
    </Axis>
    <Axis axisName="di_y_axis">
      <CalibratorSimple type="uniDirectionalNegative" deadZone="0.0" saturation="1.0" />
    </Axis>
  </Action>
  <Action actionName="Replay Fast Forward">
    <Axis axisName="di_x_axis">
      <CalibratorSimple type="biDirectionalUpper" deadZone="0.0" saturation="1.0" />
    </Axis>
    <Axis axisName="di_z_axis_rotation">
      <CalibratorSimple type="uniDirectionalNegative" deadZone="0.0" saturation="1.0" />
    </Axis>
  </Action>
  <Action actionName="Replay Pause">
    <Axis axisName="di_button_3">
      <CalibratorSimple type="uniDirectionalPositive" />
    </Axis>
  </Action>
  <Action actionName="Replay Next Camera">
    <Axis axisName="di_button_1">
      <CalibratorSimple type="uniDirectionalPositive" />
    </Axis>
  </Action>
  <Action actionName="Replay Prev Camera">
    <Axis axisName="di_button_0">
      <CalibratorSimple type="uniDirectionalPositive" />
    </Axis>
  </Action>
  <Action actionName="Replay Jump In">
    <Axis axisName="di_button_4">
      <CalibratorSimple type="uniDirectionalPositive" />
    </Axis>
  </Action>
  <Action actionName="Replay Exit">
    <Axis axisName="di_button_8">
      <CalibratorSimple type="uniDirectionalPositive" />
    </Axis>
  </Action>
  <Action actionName="Replay UI On Off">
    <Axis axisName="di_button_10">
      <CalibratorSimple type="uniDirectionalPositive" />
    </Axis>
  </Action>
  <Action actionName="Replay Youtube">
    <Axis axisName="di_button_6">
      <CalibratorSimple type="uniDirectionalPositive" />
    </Axis>
  </Action>
  <Action actionName="Youtube Drag Left">
    <Axis axisName="di_button_4">
      <CalibratorSimple type="uniDirectionalPositive" />
    </Axis>
  </Action>
  <Action actionName="Youtube Drag Right">
    <Axis axisName="di_button_5">
      <CalibratorSimple type="uniDirectionalPositive" />
    </Axis>
  </Action>
  <Action actionName="Youtube Speed Up">
    <Axis axisName="di_dpad_0_up">
      <CalibratorSimple type="uniDirectionalPositive" />
    </Axis>
  </Action>
  <Action actionName="Youtube Speed Down">
    <Axis axisName="di_dpad_0_down">
      <CalibratorSimple type="uniDirectionalPositive" />
    </Axis>
  </Action>
  <Action actionName="Youtube Upload">
    <Axis axisName="di_button_0">
      <CalibratorSimple type="uniDirectionalPositive" />
    </Axis>
  </Action>
  <Action actionName="Youtube Exit">
    <Axis axisName="di_button_3">
      <CalibratorSimple type="uniDirectionalPositive" />
    </Axis>
    <Axis axisName="di_button_2">
      <CalibratorSimple type="uniDirectionalPositive" />
    </Axis>
  </Action>

  <!-- Spectator actions -->
  <Action actionName="Spectator Next Camera">
    <Axis axisName="di_button_5">
      <CalibratorSimple type="uniDirectionalPositive" />
    </Axis>
  </Action>
  <Action actionName="Spectator Previous Camera">
    <Axis axisName="di_button_4">
      <CalibratorSimple type="uniDirectionalPositive" />
    </Axis>
  </Action>
  <Action actionName="Spectator UI On Off">
    <Axis axisName="di_button_8">
      <CalibratorSimple type="uniDirectionalPositive" />
    </Axis>
  </Action>
  <Action actionName="Spectator List On Off">
    <Axis axisName="di_button_0">
      <CalibratorSimple type="uniDirectionalPositive" />
    </Axis>
  </Action>
  <Action actionName="Cycle Forward On Board Cameras">
    <Axis axisName="di_button_5">
      <CalibratorSimple type="uniDirectionalPositive" />
    </Axis>
  </Action>
  <Action actionName="Activate Replay System">
    <Axis axisName="di_button_4">
      <CalibratorSimple type="uniDirectionalPositive" />
    </Axis>
  </Action>

  <!-- Dev Actions (should be added in code) -->
  <Action actionName="Temp Left Shoulder">
    <Axis axisName="di_button_4">
      <CalibratorSimple type="uniDirectionalPositive" />
    </Axis>
  </Action>
  <Action actionName="Temp Right Shoulder">
    <Axis axisName="di_button_5">
      <CalibratorSimple type="uniDirectionalPositive" />
    </Axis>
  </Action>

</ActionMap>

For the Thrustmaster T150:

In your Steam Library steamapps\common\DiRT 3 Complete Edition\actionmap folder, create a text file named tm_t150.xml.

Paste in the following text:

<!-- Action map for a default Direct Input device -->
<!-- Defaults:          deadZone: 0.2f          saturation: 0.8f          threshold: 0.5f -->
<ActionMap actionMapName="tm_150" deviceName="Thrustmaster T150 Racing Wheel" priority="12">

  <!-- In Game Actions -->
  <Action actionName="Accelerate">
    <Axis axisName="di_z_axis_rotation">
      <CalibratorSimple type="uniDirectionalNegative" deadZone="0.0" saturation="1.0" />
    </Axis>
  </Action>
  <Action actionName="Brake">
    <Axis axisName="di_y_axis">
      <CalibratorSimple type="uniDirectionalNegative" deadZone="0.0" saturation="1.0" />
    </Axis>
  </Action>
  <Action actionName="Clutch">
    <Axis axisName="di_slider_0">
      <CalibratorSimple type="uniDirectionalNegative" deadZone="0.2" saturation="0.8" />
    </Axis>
  </Action>
  <Action actionName="Handbrake">
    <Axis axisName="di_button_4">
      <CalibratorSimple type="uniDirectionalPositive" />
    </Axis>
  </Action>
  <Action actionName="Steer Left">
    <Axis axisName="di_x_axis">
      <CalibratorSimple type="biDirectionalLower" deadZone="0.0" saturation="1.0" />
    </Axis>
  </Action>
  <Action actionName="Steer Right">
    <Axis axisName="di_x_axis">
      <CalibratorSimple type="biDirectionalUpper" deadZone="0.0" saturation="1.0" />
    </Axis>
  </Action>
  <Action actionName="Change View">
    <Axis axisName="di_button_3">
      <CalibratorSimple type="uniDirectionalPositive" />
    </Axis>
  </Action>
  <Action actionName="Gear Up">
    <Axis axisName="di_button_1">
      <CalibratorSimple type="uniDirectionalPositive" />
    </Axis>
  </Action>
  <Action actionName="Gear Down">
    <Axis axisName="di_button_0">
      <CalibratorSimple type="uniDirectionalPositive" />
    </Axis>
  </Action>
  <Action actionName="Look Left">
    <Axis axisName="di_dpad_0_left">
      <CalibratorSimple type="uniDirectionalPositive" />
    </Axis>
  </Action>
  <Action actionName="Look Right">
    <Axis axisName="di_dpad_0_right">
      <CalibratorSimple type="uniDirectionalPositive" />
    </Axis>
  </Action>
  <Action actionName="Look Up">
    <Axis axisName="di_dpad_0_up">
      <CalibratorSimple type="uniDirectionalPositive" />
    </Axis>
  </Action>
  <Action actionName="Look Down">
    <Axis axisName="di_dpad_0_down">
      <CalibratorSimple type="uniDirectionalPositive" />
    </Axis>
  </Action>
  <Action actionName="Look Back">
    <Axis axisName="di_button_2">
      <CalibratorSimple type="uniDirectionalPositive" />
    </Axis>
  </Action>
  <Action actionName="Pause">
    <Axis axisName="di_button_7">
      <CalibratorSimple type="uniDirectionalPositive" />
    </Axis>
  </Action>
  <Action actionName="Instant Replay">
    <Axis axisName="di_button_6">
      <CalibratorSimple type="uniDirectionalPositive" />
    </Axis>
  </Action>
  <Action actionName="Horn">
    <Axis axisName="di_button_5">
      <CalibratorSimple type="uniDirectionalPositive" />
    </Axis>
  </Action>

  <!-- Menu Actions -->
  <Action actionName="Menu Left">
    <Axis axisName="di_dpad_0_left">
      <CalibratorSimple type="uniDirectionalPositive" />
    </Axis>
  </Action>
  <Action actionName="Menu Right">
    <Axis axisName="di_dpad_0_right">
      <CalibratorSimple type="uniDirectionalPositive" />
    </Axis>
  </Action>
  <Action actionName="Menu Up">
    <Axis axisName="di_dpad_0_up">
      <CalibratorSimple type="uniDirectionalPositive" />
    </Axis>
  </Action>
  <Action actionName="Menu Down">
    <Axis axisName="di_dpad_0_down">
      <CalibratorSimple type="uniDirectionalPositive" />
    </Axis>
  </Action>
  <Action actionName="Menu Select">
    <Axis axisName="di_button_5">
      <CalibratorSimple type="uniDirectionalPositive" />
    </Axis>
  </Action>
  <Action actionName="Menu Back">
    <Axis axisName="di_button_4">
      <CalibratorSimple type="uniDirectionalPositive" />
    </Axis>
  </Action>
  <Action actionName="Menu Button3">
    <Axis axisName="di_button_3">
      <CalibratorSimple type="uniDirectionalPositive" />
    </Axis>
  </Action>
  <Action actionName="Menu Button4">
    <Axis axisName="di_button_2">
      <CalibratorSimple type="uniDirectionalPositive" />
    </Axis>
  </Action>
 <Action actionName="Fe View Tweak In">
    <Axis axisName="di_button_1">
      <CalibratorSimple type="uniDirectionalPositive" />
    </Axis>
  </Action>
  <Action actionName="Fe View Tweak Out">
    <Axis axisName="di_button_0">
      <CalibratorSimple type="uniDirectionalPositive" />
    </Axis>
  </Action>

  <!-- Replay Actions -->
  <Action actionName="Replay Rewind">
    <Axis axisName="di_x_axis">
      <CalibratorSimple type="biDirectionalLower" deadZone="0.0" saturation="1.0" />
    </Axis>
    <Axis axisName="di_y_axis">
      <CalibratorSimple type="uniDirectionalNegative" deadZone="0.0" saturation="1.0" />
    </Axis>
  </Action>
  <Action actionName="Replay Fast Forward">
    <Axis axisName="di_x_axis">
      <CalibratorSimple type="biDirectionalUpper" deadZone="0.0" saturation="1.0" />
    </Axis>
    <Axis axisName="di_z_axis_rotation">
      <CalibratorSimple type="uniDirectionalNegative" deadZone="0.0" saturation="1.0" />
    </Axis>
  </Action>
  <Action actionName="Replay Pause">
    <Axis axisName="di_button_5">
      <CalibratorSimple type="uniDirectionalPositive" />
    </Axis>
  </Action>
  <Action actionName="Replay Next Camera">
    <Axis axisName="di_button_1">
      <CalibratorSimple type="uniDirectionalPositive" />
    </Axis>
  </Action>
  <Action actionName="Replay Prev Camera">
    <Axis axisName="di_button_0">
      <CalibratorSimple type="uniDirectionalPositive" />
    </Axis>
  </Action>
  <Action actionName="Replay Jump In">
    <Axis axisName="di_button_3">
      <CalibratorSimple type="uniDirectionalPositive" />
    </Axis>
  </Action>
  <Action actionName="Replay Exit">
    <Axis axisName="di_button_4">
      <CalibratorSimple type="uniDirectionalPositive" />
    </Axis>
  </Action>
  <Action actionName="Replay UI On Off">
    <Axis axisName="di_button_6">
      <CalibratorSimple type="uniDirectionalPositive" />
    </Axis>
  </Action>
  <Action actionName="Replay Youtube">
    <Axis axisName="di_button_2">
      <CalibratorSimple type="uniDirectionalPositive" />
    </Axis>
  </Action>
  <Action actionName="Youtube Drag Left">
    <Axis axisName="di_button_0">
      <CalibratorSimple type="uniDirectionalPositive" />
    </Axis>
  </Action>
  <Action actionName="Youtube Drag Right">
    <Axis axisName="di_button_1">
      <CalibratorSimple type="uniDirectionalPositive" />
    </Axis>
  </Action>
  <Action actionName="Youtube Speed Up">
    <Axis axisName="di_dpad_0_up">
      <CalibratorSimple type="uniDirectionalPositive" />
    </Axis>
  </Action>
  <Action actionName="Youtube Speed Down">
    <Axis axisName="di_dpad_0_down">
      <CalibratorSimple type="uniDirectionalPositive" />
    </Axis>
  </Action>
  <Action actionName="Youtube Upload">
    <Axis axisName="di_button_3">
      <CalibratorSimple type="uniDirectionalPositive" />
    </Axis>
  </Action>
  <Action actionName="Youtube Exit">
    <Axis axisName="di_button_4">
      <CalibratorSimple type="uniDirectionalPositive" />
    </Axis>
  </Action>

      <!-- Spectator Actions -->
  <Action actionName="Spectator Next Camera">
    <Axis axisName="di_button_1">
      <CalibratorSimple type="uniDirectionalPositive" />
    </Axis>
  </Action>
  <Action actionName="Spectator Previous Camera">
    <Axis axisName="di_button_0">
      <CalibratorSimple type="uniDirectionalPositive" />
    </Axis>
  </Action>
  <Action actionName="Spectator UI On Off">
    <Axis axisName="di_button_6">
      <CalibratorSimple type="uniDirectionalPositive" />
    </Axis>
  </Action>
  <Action actionName="Spectator List On Off">
    <Axis axisName="di_button_3">
      <CalibratorSimple type="uniDirectionalPositive" />
    </Axis>
  </Action>
	<Action actionName="Cycle Forward On Board Cameras">
    <Axis axisName="di_button_1">
      <CalibratorSimple type="uniDirectionalPositive" />
    </Axis>
	</Action>
	<Action actionName="Activate Replay System">
    <Axis axisName="di_button_0">
      <CalibratorSimple type="uniDirectionalPositive" />
    </Axis>
	</Action>

  <!-- Dev Actions (should be added in code) -->
  <Action actionName="Temp Left Shoulder">
    <Axis axisName="di_button_2">
      <CalibratorSimple type="uniDirectionalPositive" />
    </Axis>
  </Action>
  <Action actionName="Temp Right Shoulder">
    <Axis axisName="di_button_3">
      <CalibratorSimple type="uniDirectionalPositive" />
    </Axis>
  </Action>

</ActionMap>

Just adding the file isn't quite enough. We need to tell the game to use this new file.

Edit the file actionMapPaths.xml in the same folder. Add a line near the bottom of the file with either tm_tmx.xml or tm_t150.xml, depending on which wheel you have:

  <xmlreader processor="ActionMap2" filename="actionmap/tm_tmx.xml" map="UPDATE" pool="UPDATE_TEMPORARY" />
</dataset>

Finally, improve the force feedback by editing this file: steamapps\common\DiRT 3 Complete Edition\forcefeedback\devicesetup.xml

Add the line that matches your wheel:

  <FFBDevice name="Thrustmaster TMX Racing Wheel" scaleForce="1.0" scaleFriction="1.0" baseFriction="0.0" maxFriction="100.0" scaleEffects="1.0" delay="0.0"/>
  <FFBDevice name="Thrustmaster T150 Racing Wheel" scaleForce="1.0" scaleFriction="1.0" baseFriction="0.0" maxFriction="100.0" scaleEffects="1.0" delay="0.0"/>
</FFBDevices>


Settings

The game is now capable of using the wheel, but you need to apply some in-game settings to get a good experience.

In the Thrustmaster Control Panel:

Set the rotation to its maximum.

Under Gain Settings:

Setting Value
Overall Strength of all forces 100%
Constant 100%
Periodic 100%
Spring 100%
Damper 0%
Auto-Center by the game

The Damper applies a constant dampening effect (on top of any in-game settings), making the wheel feel heavy. On lower-end wheels, there is plenty of natural dampening in the wheel mechanism itself. (Dampening is used on higher-end wheels to solve oscillation problems.)

The Spring force constantly pulls the wheel back to the center, but, unlike the Damper, it is completely controlled by the game, just like the Constant and Periodic forces. Most games don't use the Spring force at all (their native physics simulations do this already), so it actually doesn't matter what the value is set to in the Control Panel.

I leave the Spring force on in the Control Panel, making the in-game settings the only factor controlling the force feedback. This makes the settings consistent across all games and prevents confusion in the few games that use it about why a FFB setting seems to have no effect.


In DiRT 3 Settings:

In Options > Controls:

Choose the preset for either the Thrustmaster TMX or T150. Until you do this, the game may not navigate the menus using the wheel.


In Options > Controls > Advanced Wheel Settings:

Setting Value
Steering Deadzone 0%
Steering Saturation 60% (TMX) 50% (T150)
Steering Linearity 0

The Steering Saturation controls the steering rotation angle. Setting it to these values, depending on which wheel you have, will create a 540° steering angle, which is what most rally cars use.


In Options > Vibration & Feedback:

Setting Value
Vibration & Feedback On
Vibration Strength 30%
Wheel Strength 50%
Wheel Weight 10%


Conclusion

While DiRT 3 certainly isn't a full simulator-style game like Dirt Rally, it is still tremendous fun and feels really nice with a properly set up wheel.

Let me know if you have any comments or questions.

Question or Comment?