Paintable Materials & Tintable Lights

Making things paintable is not as difficult as it may seem. You can use the existing materials, or create your own implementation.

Existing Materials

Making use of the existing materials used by Satisfactory is the easiest way to make your models paintable. Simply use a paintable material on a mesh in your blueprint and the game will find it and apply the correct parameters from the customizer / light panel. Its important that when importing a mesh you do not import and use new materials. Instead point your meshes at the correct existing materials or your material instances which point to their materials.

New Custom Materials

If the existing materials don’t do what you need and you need a special new feature you can make new materials respond to the painting system. New materials limit the best performance the game can have so consider adding them carefully.

For Primary and Secondary paint colours find the corresponding Material Function (MF_Get-------Color) and use it in your node graph.

For the Light colour you can use MF_HasPower and unfortunately there’s no convenient node for the light colour, but it works identically to the other nodes, reference the list below for the correct values, or look at MM_Factory_Array.

When making new materials it’s important to properly set the usage flags for Satisfactory. The Game uses a lot of instances, and splines, so be sure to check Instanced Static Mesh, and think about on what the material is used.

Making Any Class Paintable

You can implement the ability to paint in any object by implementing the IFGColorInterface. Simply override the given functions with the functionality you need and you’re done. Consider asking about this on the Discord if you need help.

The customizer will now interact with your object, which is done via the reflection system.

Behind The Scenes

The Update 5 Customizer changes provided a new and unified way of setting properties for customization. Every standard material is monitoring what’s know as "Per Instance Custom Data", this is data that’s provided to the instancing system to allow each and every object to receive unique parameters but still render in a fast instanced manner. This means the system is two disconnected parts working in sync. Code will set the parameters, materials and other objects will read them.

Coffee Stain Studios has an intended layout for the parameters found on objects, this is what the customizer is setting on objects and the materials are responding to. Anything marked with a * is not currently set by the customizer, but is guaranteed to exist. Higher indices may simply not be available. Lighting Colour for example is not set by a customizer but is used by some materials. Below is the currently known mapping of these parameters:

  • 0 PrimaryPaint ( R )

  • 1 PrimaryPaint ( G )

  • 2 PrimaryPaint ( B )

  • 3 SecondaryPaint ( R )

  • 4 SecondaryPaint ( G )

  • 5 SecondaryPaint ( B )

  • 6 HasPower

  • 7 Pattern ID ( Floor Markings )

  • 8 Material ID ( Floor Markings )

  • 9 Metallic ( No usages known )

  • 10 Roughness ( No usages known )

  • 11 *Light Colour ( R )

  • 12 *Light Colour ( G )

  • 13 *Light Colour ( B )

  • 14 *Available

  • 15 *Available

  • 16 *Available

  • 17 *Available

  • 18 *Available