Boe6's vehicles: Textures & Materials

By default, cars use the multilayered shader. You can find guides about editing multilayered material linked at the top of the documenation page.

.mlmask , .mlmaskset & .masklist

To fix the odd textures that appear after importing your custom models, we have to edit the .mlmask layers.

Find the .mlmask corresponding file by opening a .mesh in wkit to edit. Go to the path:

  • RDTDataViewModel > localMaterialBuffer > materials > 0 (...maskset) > values > 0 > value

Add the .mlmask to the project.

Rename and move the .mlmask file into your project filepath. Example:

boe6\mini_cooper\meshes\textures\boe6_mini_cooper_exterior_maskset.mlmask”

Export the .mlmask file. It should result in a .masklist file and a folder with .png files inside:

Notice the first white image, and the remaining black images with white cutouts.

These textures don’t map onto the new vehicle’s mesh correctly. These can be edited to add more detail to your model.

As a temporary solution, we can edit the first image to be pure white, and the rest to be pure black. Example:

Import the .masklist file

Update your .mesh file with the new .mlmask name/path file:

  • RDTDataViewModel > localMaterialBuffer > materials > 0 (...maskset) > values > 0 > value

Your vehicle should now be much smoother.

Note that you will need every .mesh file to have a corrected .mlmask path.

.mlsetup & MLsetupBuilder

To change paint color, we need to edit the .mlsetup file.

You will need the MLsetupBuilder plugin for editing these files. Install it in wkit:

  • HOME button (top left) > Plugins (left list) > MLsetupBuilder, right side, install.

  • Once installed, hit open. It will open a folder with a “MlsetupBuilder.exe” executable. Run it to open the program.

The .mlsetup file we need is linked in the .mesh file, similar to the .mlmask:

  • RDTDataViewModel > localMaterialBuffer > materials > 0 / masksset > values > MultilayerSetup > Value

Add this .mlsetup file to the project. Rename and move it. Example:

boe6\mini_cooper\meshes\textures\boe6_mini_cooper_exterior.mlsetup

Convert the .mlsetup file into .json by right clicking:

Open MlsetupBuilder.

Import the .mlsetup.json file by hitting the arrow in the top left:

You can also right-click on the .mlsetup.json file and choose "Open in MlSetupbuilder". The file will be automatically loaded when it opens.

Once you open the file, a window will appear on the left with a list of materials. These are the texture layers of your mesh.

Note that layers 0,1,2,etc are linked the .mlmask layers.

At the top is a large orange button titled “Import the Multilayer Setup >>”. Click it to load the .mlsetup file into the editor. It should populate the Layers list:

Now, assuming you created a .mlmask file similar to our previous steps, with all but 1 black image (see below), we know only the first layer, Layer 0, is the only one that will currently render on our .mesh

Since Layer 0 is the visible layer, select it and it will load in the Material view:

This is where we edit the layer. If you only want to change the color to a common one, choose one from the lower color palette. Here I have chosen blue:

You can also change to another material texture here by clicking the preview ball:

This can be used to create different paint finishes, cloth texture, etc.

Once you have finished editing a layer, you can save it by clicking “Apply edits” at the top of the Layers panel:

Then you can select another layer and edit the next one if needed. If you select a new layer without applying the edits, the changes will be lost.

Once finished, you can Export to save it to your file explorer, and then load it in wkit by right clicking the .json and selecting “convert from JSON”. Example:

Save and Test in game

Working color:

Custom RGB value colors can be set with a custom .mltemplate file. Here we will only set RGB values, but this file can control other material settings/textures as well.

Find the material you want to have a custom RGB value for in MlsetupBuilder, and click on the material name to show it’s file path. Example:

Add that file to the project, rename, and move it. Once it’s in place, you can copy it’s relative path and paste it into MlsetupBuilder for that layer:

Open the .mltemplate file in wkit and navigate to the colorScale array:

  • RDTDataViewModel > overrides > colorScale

This array contains all colors in the material. Open one of the Multilayers and it’s “v” values, which control the RGB values:

First, you can verify the color in . Copy the “n” value here, and paste it into MlsetupBuilder in the Color filter:

Select the color, and it’s rgb values should match the values in the “vcolorScale in the .mltemplate:

Edit the 0,1,2 (R,G,B) values to the color values needed and save. Make sure to save the .mlsetup as well with the layer set to the same color code as before.(“n” value, [00cf56_69039f])

Save and test.

Multiple materials

To have multiple materials in a single .mesh file, the .glb export requires separate submeshes all selected in blender. Separate your blender .mesh into parts, and group them based on material.

First separate/split your meshes into small components, and then join them into groups:

For example, mine are grouped by body paint, silver trim, reflective black, matte black, and grey fabric. Take note, the order in your blender selection will be the order each submesh is called by the .mesh file settings. This order is important.

With all the objects selected in blender, export it to .glb and import it as you normally would.

You can save and test. If it worked properly, only the first object included in the blender export will render properly at the moment.

Example of a finished body mesh in blender:

Currently the other submeshes will not render properly. This is due to submesh materials being controlled by the chunkMaterials in your appearance settings (.app file).

To correct this, start by duplicating an item in the chunkMaterials list. Path:

  • .mesh > RDTDataViewModel > appearances > 0 > chunkMaterials

Make sure to edit the name to a unique name, as we are creating new materialEntries. Repeat as needed. In my case I needed 6 extra layers:

Next, navigate to RDTDataViewModel > materialEntries

This list controls the names and index of each item in the localMaterialBuffer, which we’ll edit soon. You’ll want to duplicate an item with similar qualities. If you are adding a plastic material, duplicate another plastic or solid material in the list. If you are adding glass, duplicate from a vehicle_lights material, then edit as needed. Duplicate one for each new material.

Make sure to update the index values of each item in the materialEntries array. They must all be the same as their index in their current array. 4 to 4, and so on:

ALL items in the list update the index of both new items, and old ones that moved down the list

Next we’ll update the materialBuffer with new .mlsetup and .mlmask files. Keep in mind the .mlmask files can be edited to match the model to a texture. However we’ll be working around that by using the same method used previously, to have a .mlmask file with one additional white layer.

Note the 0 layer will always be white.

Example:

Notice how I have a .mlmask file dedicated to the 4th layer, so all other layers are muted. I have 20 (0 through 19) unique .mlmask files, each selecting a different layer from a .mlsetup file.

Speaking of .mlsetup, I have created a .mlsetup file with MlsetupBuilder. Layers 0 through 7 are used for the new materials:

Now to finish the materials setup, open the following .mesh path:

  • .mesh > RDTDataViewModel > localMaterialBuffer > materials

This array contains every CMaterialInstance for the .mesh file. This array has it’s items named via the materialEntries list we just edited. Since we added items to that list, those names now show in this localMaterialBuffer > materials list. However the data in each item is still it’s original.

For example, in this picture, the array hasn’t been updated yet, however the names are updated. This means the index 1 item, …”masksset_texture” has the properties of “reflector”, which would normally be the 2nd item.

To fix this, duplicate the appropriate items, similar to before, once for each new material. Once done, the previous index 1 item will now be higher, but matched correctly. In my files, I duplicated “ml_v_sport2_porsche_911turbo_exterior_masksset” 6 times, and they each pasted directly below the 1st.

You can tell if the materials are correct by opening them, and looking into the “values” array. Each will have similar keyValuePairs related to the material type. Glass mentions GlassSpecular, normal paint has many map layers, stickers dont have much, etc:

For each new material layer, update the paths:

  • CMaterialInstance > values > MultilayerMask > value

  • CMaterialInstance > values > MultilayerSetup > value

For mlsetup, I use the previously mentioned file, with layers setup for individual materials.

For the mlmask, use the “masksset_00” for the layer you want to enable.

Submeshes should now load in order with matched materials.

Fix broken UVs

Editing UV maps may be necessary for some meshes if they do not display correctly, or for custom editing. Broken & Fixed UV map example:

To edit UV maps in blender, select your object to modify and enter the UV Editing workspace:

The current UV map should display on the left:

In the right window in Edit Mode, select all vertices (“a” key in blender), and hit “U” for the UV mapping dialog. Select “Smart UV Project”, and hit OK:

This should update the UV mapping to an even spread map:

Save and test. Your meshes should have even material mapping now.

Some objects are better with different UV projection options. For example, a tire can be cleanly mapped by using the orthographic view and selecting Sphere Projection. Try some of these options to see what fits best for your use case.

Last updated