Ground of Aces Modding
Loading...
Searching...
No Matches
Replacing models, icons and ground textures

A mod can give the game's objects a new look without changing what they do: a chair that is still a chair, a tree that still gives wood, a kitchen that still cooks - drawn with your own model, your own textures and your own icon in the build menu. It can also re-paint the ground types the terrain is drawn with.

Two folders in the mod hold the art:

my_mod/
Objects/ models, their textures, build-menu icons and one optional config.json
Biomes/ one PNG per ground type

Art is different from every other kind of mod content in one way: it is imported once, when the game starts. Changing a model, a texture, a thumbnail or a biome PNG takes a restart of the game - neither loading a level nor Refresh or the Enabled switch in the Mods window re-imports it.

Note
For now, restart the game to see any change to the 3D art in Objects/ and Biomes/. A future update adds an option to reload mods from the main menu, which will make the restart unnecessary.
Replacing art never changes the rules of the game. An object keeps its size on the grid, its cost, its health and everything else the data tables say about it; to change those, see Changing game data with a CSV mod.

Objects

Which objects can be re-dressed

A model's file name is the id of the object it replaces. Four kinds of object share the one folder, and their ids never overlap:

Kind Where the ids come from Examples
Objects you place from the build menu the ID column of BuildingComponents.csv Chair, Shelf, WoodenChair
Workbenches the list below FieldKitchen, SawStation
Training objects the list below ShootingSimpleTargetRange
Map objects - trees, rocks, ponds and other harvestables the ID column of MapObjects.csv tree, bush_big, large_rock

Workbenches: FieldKitchen, IndoorKitchen, SawStation, Brickstation, CementMixer, MetalworksWorkbench, CanningStation, ElectronicsWorkbench, TailorStation, EspionageRadio, WaterCooker, HerbDryer, Distillery.

Training objects: BombingAdvancedSimulator, BombingSimpleBench, EnduranceAdvancedBikeExerciser, EnduranceSimpleRack, EngineeringAdvancedEngine, EngineeringSimpleMechanicWorkstation, FlyingAdvancedLinkTrainer, FlyingSimpleWoodenConstruction, NavigationAdvancedNaviTrainer, NavigationSimpleBoard, ShootingAdvancedTurret, ShootingSimpleTargetRange.

Ids are matched without regard to case, so chair.fbx re-dresses the chair too.

The id of every build menu object, workbench and training object a mod can re-dress is listed on Moddable objects.

File names

Every file that belongs to one object follows the pattern <objectId>[.<variant>][.destroyed|.thumbnail] before its extension:

File What it is
Chair.fbx or Chair.glb the chair's model
Chair.destroyed.fbx the model the chair switches to when it is destroyed
Chair.thumbnail.png the chair's icon in the build menu
tree.2.glb variant 2 of the map object tree only
tree.glb every variant of tree that has no file of its own
  • Models may be .glb (binary glTF) or .fbx. When both exist for the same object, the .glb is used and the .fbx is reported in the log as ignored.
  • Variants belong to map objects only, and are counted from 0: tree.0 is the first variant of tree, tree.1 the second.
  • A variant number is written in plain digits without leading zeros: tree.2, never tree.02. This is also why Blender's duplicate names such as Chair.001.fbx are refused - rename the export.
  • A destroyed model is optional. An object the game never shows destroyed has no place for one; its destroyed model is skipped with a warning.
  • Anything else in the folder that is not a model, a PNG or the top-level config.json is reported in the log and ignored.

Subfolders

Objects/ holds every model and every texture of the mod, and you may sort them into subfolders as you like. Subfolder names mean nothing: a file is known by its name alone. Objects/Chair/model.fbx is a model for an object called model, not for the chair - name it Objects/Chair/Chair.fbx instead.

Because the folder is one pool, two files with the same name in different subfolders clash: the game keeps one and reports the other. Symbolic links and junctions are never followed.

There is no TerrainObjects/ folder any more. Map objects are re-dressed from Objects/ like everything else, and a mod whose only content is a TerrainObjects/ folder is not noticed at all.

Building the model

  • Scale and orientation. Build the model at the game's scale, in metres, facing the way the built-in object faces. The model is placed at the built-in object's origin and is not scaled to fit. An FBX is converted to Y-up metres on import and faces the same way as the game's own art exported from Blender.
  • Only the look changes. The object's footprint on the grid, where crew stand to use it and its collision all stay the built-in ones. A model much larger than the original pokes through walls and neighbours.
  • Levels of detail. Name the parts of the model LOD0, LOD1, LOD2, … (any case; LOD1_Trunk and lod2.001 count too) and they become its levels of detail, switched at the same distances as the built-in object's. With fewer levels than the built-in object, the last one is kept up to the distance where the object disappears. A model without LOD names is drawn the same at every distance. Levels only switch on an object that has levels of detail built in. On any other object every LOD part is drawn at once, one on top of the other - give such an object a single level.
  • Effects attached to the built-in object - a workbench's sawdust, the leaves of a tree being felled - keep playing on the new model.
  • Static models only. Animation is not imported from an FBX, and a mod model is never animated or rigged by the game.
  • At most 32 MB per model file. A larger file is skipped with a warning, and the object keeps its built-in look.

What an FBX may contain

The game reads an FBX itself, without the Unity editor, so it understands a narrower part of the format than Blender writes:

  • Meshes and the node hierarchy above them, with their position, rotation and scale. Hidden nodes are left out, and so is a file that contains no mesh at all.
  • Normals as exported; a mesh exported without normals gets smooth normals calculated on import.
  • The first UV map only. Every further UV map is ignored, so put the UVs the textures use on the first.
  • Polygons with more than three corners are split into triangles as a fan from their first corner, which is exact for convex faces only. Triangulate concave faces before exporting, or tick Triangulate Faces in Blender's FBX export.
  • Per material: the base colour, and the textures connected to base colour, normal map (or bump) and emission. Vertex colours, metallic, roughness and every other slot are not read.
  • Images embedded in the FBX are never read - see The texture a model names.

Textures

Textures are PNGs anywhere in Objects/, found by their names. There are three ways to name them, tried in this order - each fills only what the one before leaves empty:

Name the PNG after Example Needs a model
1 the material in your model: <material>_BaseMap_<tile>, <material>_Specular_<tile> BedMetal_Toon-Main_BaseMap_1001.png for a material called BedMetal_Toon-Main yes
2 the texture your model's material uses wood-01.png for a material painted with wood-01 yes
3 a built-in texture of the game (Re-painting an object without a model) BedMetal_Toon-Main_BaseMap_1001.png no

Way 1 is the simplest for a model: no image has to be connected to the material in Blender at all - name the material and the PNGs alike. Ways 1 and 3 belong to the game's material (see Game material or your own - config.json): with "UseGameMaterial": false your model keeps its own material and draws only the texture it names (way 2), without specular maps or UDIM tiles (see UDIM tiles and specular maps).

The texture a model names

A model's materials name the images they use, and the game looks for a PNG of that name anywhere in Objects/. A material that uses an image called wood-01 gets Objects/wood-01.png (or Objects/any/subfolder/wood-01.png). Directories and the extension in the name the model carries are dropped first, so a material painted with C:\art\wood-01.jpg still finds wood-01.png. One PNG can serve any number of models, and is loaded only once.

The two formats differ in what happens when no PNG matches:

.glb .fbx
Texture slots read base colour, metallic-roughness, normal, occlusion, emissive base colour, normal (or bump), emissive
No PNG of that name in Objects/ the image embedded in the glb is used the slot stays untextured, and the log names the texture it looked for
Images outside the file refused - a glb has to be self-contained never read - only the PNGs in Objects/ count

Any PNG in Objects/ whose name does not end in .thumbnail counts as a texture. A texture neither a model nor a built-in object names is simply never loaded.

Re-painting an object without a model

A PNG named like one of the game's own textures replaces that texture, with no model needed: Objects/BedMetal_Toon-Main_BaseMap_1001.png re-paints the metal bed wherever the game draws it. The replacement goes into every material slot that uses the built-in texture - base map, specular map or UDIM tile - on every object that uses it, the destroyed look included. Only the object's own art is re-painted: what every object shares - the construction crate, placement markers, range indicators - keeps the built-in texture, and so do airplanes (see New airplane skins) and the ground (see Biomes - the ground types). The game's texture names follow the pattern <Material>_Toon-Main_BaseMap_<tile> and <Material>_Toon-Main_Specular_<tile>; paint over the built-in image at the same size and UV layout, since the model stays the built-in one. Every object's texture names, and the slot each one sits in, are listed on Built-in texture names.

When two mods ship the same name, the one later in the load order wins.

UDIM tiles and specular maps

A model on the game's material (see Game material or your own - config.json) can spread its UVs over up to three UDIM tiles, the way the game's own art does, with a specular map per tile. For a material called Crate:

Base colour Specular Used for UVs with U in
Crate_BaseMap_1001.png Crate_Specular_1001.png 0 to 1
Crate_BaseMap_1002.png Crate_Specular_1002.png 1 to 2
Crate_BaseMap_1003.png Crate_Specular_1003.png 2 and above
  • Named after the material (way 1) is tried first, for the base colour and for each specular map on its own - a mod may ship only Crate_Specular_1001.png.
  • Named after the texture the model uses (way 2): when no base colour is named after the material, the texture the model names is the first tile, and the other tiles and specular maps are named after it. The tile number follows a _ or a .: crate_1001 and crate.1001 both start a set, and a Blender image saved as a tile set, crate.<UDIM>.png, finds crate.1001.png. The specular map is the same name with _BaseMap replaced by _Specular, so it needs a texture name with _BaseMap in it.
  • UDIM switches on when the 1001 base colour has at least one further tile; a single texture is drawn as before. A missing tile in between draws white.
  • A specular map your mod does not ship leaves the built-in object's own one in place, and so does a base colour: without one, the built-in textures stay (and can be replaced by name, way 3).
  • A base colour named after the material is drawn untinted: the colour the material carries in the model is ignored, since an FBX material without an image still carries Blender's grey default.

Game material or your own - config.json

By default a re-dressed object is drawn with the game's own material for that object, carrying over your model's base colour texture and base colour. That is what makes battle damage, and every other effect the game paints onto an object while it plays, show on your model as well. The normal, metallic-roughness, occlusion and emissive maps of your model are not used on this path; its specular map and UDIM tiles are (see UDIM tiles and specular maps).

To keep the material exactly as you authored it instead, switch it off for that object in Objects/config.json - the only config.json read, directly inside Objects/:

{
"Objects": {
"Chair": { "UseGameMaterial": false },
"tree": { "UseGameMaterial": false }
}
}
  • Keys are object ids as they appear in the file names, matched without regard to case. An entry for tree also covers tree.2, unless tree.2 has an entry of its own.
  • An object with "UseGameMaterial": false keeps its full physically based look, and does not show battle damage.
  • Even with false, a material that has no base colour texture uses the game's material anyway, keeping the colour you gave it. So does a glb material that is not a standard metallic-roughness material - an unlit or a specular-glossiness one.
  • A config.json the game cannot read is reported, and every object falls back to the default.

Thumbnails

<objectId>.thumbnail.png replaces the object's icon in the build menu and everywhere else that icon is shown.

  • At most 512 × 512 pixels. The limit applies to each side on its own, so 512 × 256 is fine. A larger thumbnail is not scaled down: it is skipped with a warning in the log, and the game's own icon stays.
  • A thumbnail is only used next to a model of the same id. It cannot change the icon of an object your mod does not re-dress; a thumbnail alone is reported and ignored.
  • One thumbnail per object. A second file with the same name in another subfolder is ignored.
  • Map objects are not in the build menu, so a thumbnail for one has nowhere to show.

Biomes - the ground types

The terrain is painted with a fixed set of ground types, numbered from 0 - the same numbers as the rows of the Biomes table on Changing game data with a CSV mod (0-23). Biomes/<number>.png re-paints one of them, on every map:

my_mod/
Biomes/
8.png re-paints ground type 8
20.png re-paints ground type 20
  • A mod re-paints existing ground types; it cannot add new ones, because maps store the numbers only.
  • The PNG is resized to the size the game uses for ground textures, so any size within the limits below works.
  • The number is written in plain digits without leading zeros (8.png, not 08.png). A number beyond the game's range is reported in the log together with the valid range.
  • Only files directly inside Biomes/ count. Subfolders, other file types and other names are reported and ignored.
  • How fast people and aircraft move on a ground type, and the other rules attached to it, are in the Biomes table on Changing game data with a CSV mod; this folder changes only how it looks.
  • The re-painted ground is assembled on the graphics card. On a device that cannot copy textures there, biome PNGs are not applied and the log says so.

File limits

Every file in Objects/ and Biomes/ is checked before it is loaded:

File Largest size Largest file
Model (.glb, .fbx) - 32 MB
Texture 4096 × 4096 10 MB
Thumbnail 512 × 512 10 MB
Biome 4096 × 4096 10 MB
  • The file has to be a real PNG - a JPEG renamed to .png is refused.
  • The size limit applies to each side on its own.
  • An image over its limit is never scaled down. It is skipped with a warning in the log, and the game falls back: a skipped thumbnail leaves the game's own icon, a skipped biome PNG the game's own ground texture, and a material whose texture was skipped is drawn without it.

When two mods re-dress the same thing

For every object id and every ground type, the mod applied last wins, following the load order on How mods work. The log says which mod overrode which. Objects are decided as a whole: one mod's model is never combined with another mod's thumbnail for the same object.

Checking what happened

The game logs every file it refused and why - the wrong name pattern, a missing texture, an oversized image - on lines that start with [Mod <your mod id>]. Where to find the log is on How mods work; the detailed lines appear in development builds and in the Unity editor.