Project Wingman - Simple Texture Replacement Guide

https://superostrich.xyz/pw.html#guides


Table of Contents

Required Tools

Extracting Textures

Project Wingman File Paths

Working with .ubulk files

Importing and Exporting DDS

GIMP

Photoshop

ORM Overview

Packing your mod into a .pak file

Troubleshooting

Acknowledgements

Required Tools

Python 3 - required to run python scripts

Important! During installation you must check  ‘Add Python 3.x to PATH

UE Viewer - unreal engine resource viewer for viewing and extracting textures & models

u4Pak.py - python script for re-packing game assets

Header7.py - python script for easily adding and removing headers from textures

DDS Import/Export Plugins for your preferred image editor

Photoshop

https://developer.nvidia.com/gameworksdownload#?dn=texture-tools-for-adobe-photoshop-8-55

GIMP

https://code.google.com/archive/p/gimp-dds/downloads

Extracting Textures

  1. Open Umodel.exe
  2. Browse or type your Project Wingman install path, then into ..\Project Wingman\ProjectWingman\Content\Paks

  1. Leave all options on the defaults, press OK
  2. Browse to \Game\Assets\Objects\Aircraft
  3. Right click on the folder for the aircraft you wish to extract, and ‘Save folder packages

  1. The directory containing umodel.exe should now have a umodel_saved folder with the package contents extracted;

Project Wingman File Paths

In this example we have now extracted all of the FA16 textures from Project Wingman. The .ubulk files are your textures.  

The folder structure & filenames for aircraft in Project Wingman aren’t completely uniform but usually the textures folder contains the ORM, Emissive, and Normal Maps, while the skins subfolder usually contains the diffuse textures for each skin slot.

Example:

textures\F-16CSubstance_Aircraft_Normal.ubulk

Normal Map

textures\F-16CSubstance_Aircraft_OcclusionRoughnessMetallic.ubulk

ORM texture

textures\Skin\F16_01.ubulk

Skin 1 diffuse texture

textures\Skin\F16_02.ubulk

Skin 2 diffuse texture

textures\Skin\F16_03.ubulk

Skin 3 diffuse texture

textures\Skin\F16_04.ubulk

Skin 4 diffuse texture

Pay attention to these paths, it will be critical when packing your mod!  If you mod doesn’t work, 9 times out of 10 it’s because the path or filename is incorrect.

Working with .ubulk files

Ubulk files are DDS textures without headers.  Aircraft will have two textures, continuing with our FC16 Skin 1 example;

F16_01.ubulk = diffuse texture, this is the paintjob and surface details of the aircraft

F-16CSubstance_Aircraft_OcclusionRoughnessMetallic.ubulk   = Occlusion, Roughess, Metallic; this controls how light interacts with the diffuse texture.

In order to edit these textures, you will need to add a DDS header as follows.

  1. Drag and drop your .ubulk file onto header7.py 

  1. Select the appropriate header to add to the .ubulk file, and a new .DDS file will be created.
  1. Most of the Diffue and ORM textures are DXT1 4K, it your texture appears corrupted, try DXT5 4K 
  1. IMPORTANT you must export your texture in the same format as the original
  1. Open the DDS file(s) in your favorite editor, and ensure it looks correct.

Diffuse Texture

ORM Texture (without alpha channel)

  1. You now have texture file(s) that can be edited.  

Importing and Exporting DDS

GIMP

  1. When importing a DDS file into GIMP, uncheck ‘load mipmaps’.

  1. The GIMP DDS export plugin will only export the active layer or layer group.  Best practice is to keep your visible layers in a master group.
  2. When exporting to DDS from gimp, choose the appropriate compression method, and enable mipmap generation.

Photoshop

  1. When opening a DDS file into Photoshop, ensure load MIP maps is unchecked

  1. When saving a DDS file from Photoshop, choose the appropriate Compression method, and ensure mipmap generation is enabled.

  1. Open the Image Options dialog, and choose highest under compression quality

ORM Overview

In ORM textures, each RGB channel controls a different property. The values of each property can be referenced in the table below.  

Channel

Effect

White

Black

Red

Occlusion

Less Occlusion

More Occlusion

Green

Roughness

Rough

Smooth

Blue

Metallic

Metallic

Non-metallic

Note: All skin slots on a particular aircraft share the same ORM file.

Packing your mod into a .pak file

Once you have finished editing your texture, and have saved it as a DDS file, you’re ready to package it for use in game!

  1. Drag and drop your edited DDS file onto header7.py ; this will remove the DDS header and spit out a new .ubulk file.
  2. Create a folder for packing, and place the following items inside;
  • pack-pw.bat  (download here)
  • u4pak.py
  • A new folder named ProjectWingman
  • The contents of your packing folder should look like this;

  1. Inside ..\ProjectWingman\ you must recreate the original folder structure, with the ubulk file(s) you created in step 1.

Continuing with our FC16 Skin 1 example;

New Path :

Your_Packing_Folder\ProjectWingman\Content\Assets\Objects\Aircraft\F16C\Textures\Skin\F16_01.ubulk

  1. Run pack-pw.bat, it will spit out a file named rename-me_P.pak

Important!  Keep the “ _P.pak” at the end of the filename

  1. If you followed these steps, you should now have a mod file ready to be installed!

Installing your Mod in Project Wingman

To install your new mod into the game simply give your .pak file a meaningful name (or not) and copy it into

..\steamapps\common\Project Wingman\ProjectWingman\Content\Paks\~mods 

Troubleshooting

I packed my texture and it won’t load in game

  • Triple check the name & path of your .ubulk texture before packing
  • Make sure you pak files ends in  _P.pak

I packed my texture and now that skin slot looks blurry and/or my game crashes

  • Check if the original texture is DXT5.  If so you must save your texture for that skin slot in DXT5 format or it will not work.

Header7 and or u4pak doesn’t work

  • Ensure Python is correctly added to your windows PATH; https://www.makeuseof.com/python-windows-path/

Acknowledgements

This guide draws heavily upon this AC7 guide made by @dapperdapperdan 


@superostrich

https://superostrich.xyz