Generating Icons for Character Creation

From Baldur's Gate 3 Modding

This guide covers how the Character Creation (CC) icons are generated, and how the booth level for them is set up.

It assumes a working knowledge of the Baldur’s Gate 3 Toolkit and the tools contained within. If you’re completely new to modding for Baldur’s Gate 3, we suggest starting with some of the basics outlined in the Getting Started guides linked on the Main Page or in the sidebar.

Introduction

CC icons provide previews of the appearance choices made available during CC.

We generate icons for:

  • Heads
  • Hair
  • Beards
  • Makeup
  • Tattoos
  • Scars
  • Draconic scales
  • Horns
  • Tails
Icons as they appear in CC (right).

CC icons are generated using mannequins in a booth. A mannequin is a 3D model used specifically for rendering these CC icons, and the booth serves as a virtual photo booth. The mannequins are set up in both Shared and SharedDev in the  SYS_IconGeneration_A level, and are driven by the UUID Object Editor.

General Booth Setup

The booth setup consists of 4 elements and is the same for all icons:

  • A spawn trigger
  • A camera trigger
  • A background
  • Lights

The characters use a custom pose for the purposes of creating the icon: CC_HairStyle_Icon_Still_01.

The booth setup with its triggers, background, and lights.

Setting Up Heads, Hair, Beards, and Tails

For heads, hair, beards, and tails on existing races, you only need run a new CC icon render. If you’re not interested in the backend details, skip ahead to the Rendering Icons section towards the end of this guide.

ⓘ This section assumes that you have already set up your new assets. For a step-by-step walkthrough of how to import and set up new hair or beards, please see Hair and Beards – Part 1: Assets.

The spawn and camera triggers in the SYS_IconGeneration_A level are all linked to a mannequin.

Understanding the Triggers

The triggers use these naming conventions:

  • Spawn trigger: GeneratePortraitTrigger + _%SlotName%
    • GeneratePortraitTrigger: This is what is set up in the mannequin's template (see below).
    • _%SlotName%: e.g. _Head, _Beard
    • Examples:
      • Icon_CC_HalfElves_Female_Head
      • Icon_CC_Dragonborn_Male_Grey_DragonbornTop
  • Camera trigger: Camera_ + GetGeneratePortraitTrigger + _%SlotName%
    • GeneratePortraitTrigger: This is what is set up in the mannequin's template (see below).
    • _%SlotName%: e.g. _Head, _Beard
    • Examples:
      • Camera_Icon_CC_HalfElves_Female_Head
      • Camera_Icon_CC_Dragonborn_Male_Grey_DragonbornTop

The GeneratePortraitTrigger can be found in the Sidebar of the mannequin’s root template in the Root Templates Manager (Portrait Generation Trigger).

Finding the GeneratePortraitTrigger in the root template's sidebar.

Template Setup

To set up which mannequin template or body to render the visuals with, in the UUID Object Editor, navigate to Shared > Character Creation > CharacterCreationIconSettings.

CharacterCreationIconSettings in the UUID Object Editor.

Here, paste the mannequin's UUID into the RootTemplate column.

In SlotNames, select which slots the template should render with.

The Comment column is used to distinguish records.

Setting Up Tattoos, Makeup, Draconic Scales, and Scars

These icons have a different setup. Tattoos can be on either side of the face, so we need multiple cameras.

In these cases, we need to specify which mannequin to use, and also which camera. The triggers and camera are linked to the combination of the two.

Setting up the booth for tattoos, makeup, scales, and scars.

Understanding the Trigger Setup

The triggers to render icons use these naming conventions:

  • Spawn trigger: GeneratePortraitTrigger + _%MaterialType%
    • GeneratePortraitTrigger: This is what is set up in mannequin's template (see below).
    • _%MaterialType%: The MaterialType for existing assets can be found under Shared > Character Creation > CharacterCreationAppearanceMaterials in Column D, e.g. _Tattoo, _Makeup
    • Example:
      • Icon_CC_Human_Male_Grey_Tattoo
  • Camera trigger: %MaleCameraName% + _+ GetGeneratePortraitTrigger + _%MaterialType%
    • %MaleCameraName%: The MaleCameraName and FemaleCameraName for existing assets can be found under Shared > Character Creation > CharacterCreationAppearanceMaterials in Columns H and J.
    • GeneratePortraitTrigger: This is what is set up in mannequin's template (see below).
    • _%MaterialType%: The MaterialType for existing assets can be found under Shared > Character Creation > CharacterCreationAppearanceMaterials in Column D, e.g. _Tattoo, _Makeup
    • Example:
      • Camera_01_Icon_CC_Human_Male_Grey_Tattoo

The GeneratePortraitTrigger can be found in the Sidebar of the mannequin’s root template in the Root Templates Manager (Portrait Generation Trigger).

Finding the GeneratePortraitTrigger in the root template's sidebar.

Template Setup

For these icons, we need to specify which mannequin needs to be used, as well as which camera. Both of these are defined in the CharacterCreationAppearanceMaterials table in the UUID Object Editor.

You can find this file for existing assets in Shared > Character Creation > CharacterCreationAppearanceMaterials.

The CharacterCreationAppearanceMaterials table.

Under the MaleRootTemplate and FemaleRootTemplate columns, fill in the mannequin roots for the male and female mannequins. Under MaleCameraName and FemaleCameraName, specify which camera to use.

Dragonborn Makeup

Dragonborn and non-dragonborn makeup uses the same entries in the UUID Object Editor. However, for dragonborn characters, you will need to fill in the DragonbornMaleRootTemplate and DragonbornFemaleRootTemplate fields in the CharacterCreationAppearanceMaterials table with their two respective mannequin root template UUIDs.

Making sure the setup also works for makeup on male and female dragonborn characters.

Because we’re not specifying a new camera for dragonborn makeup in the UUID Object Editor above, the naming convention for the relevant camera in the icon generation level is a little different.

The camera has DGB_ in front of it. The spawn trigger remains the same.

  • Example camera trigger: DGB_Camera_01_Icon_CC_Dragonborn_Female_Grey_Makeup
  • Example spawn trigger: Icon_CC_Dragonborn_Female_Grey_Makeup
The dragonborn camera trigger, with the "DGB" prefix.
The non-dragonborn camera trigger, without the "DGB" prefix.

Setting Up Dragonborn Attachments

The dragonborn attachments, e.g. their special chins and crests, are unique for each head. This makes it impossible to render all of them on the same mannequin, as some of them will clip with the head.

Template Setup

The root templates for existing assets can be found in the CharacterCreationIconSettings file in the UUID Object Editor under Shared > Character Creation > CharacterCreationIconSettings.

RootTemplate, in Column C, specifies the root template of the mannequin that should be used.

HeadAppearanceUUID, in Column F, specifies the UUID of the head VisualResource used by the root template.

The HeadAppearanceUUID column in CharacterCreationIconSettings.

Let’s take Row 31 of CharacterCreationIconSettings pictured above as an example.

The root template for this entry is 0da40707-4d75-4408-b185-e38f9e5830f0. Using the Root Templates Manager panel, let’s search for that UUID.

Searching for the RootTemplate UUID of Row 31 in the Root Templates Manager.

It returns Dragonborn_Male_Mannequin_Head_D. Right-click on that root template and select Create new from selected. You can delete this root template later; it is just so that you can view the character visuals. In this case, the new copy is named TEMP_Dragonborn_Male_Mannequin_Head_D.

The root template and its new copy ("TEMP" prefix).

Click on the copy of the root template to view it in the Sidebar, then click on the “” button by the Character Visual Resource parameter to open the Character Editor.

Opening the Character Editor from the Sidebar.

The Character Editor looks like this:

The Character Editor.

In the left panel, click the Head tab to see which head asset is being used.

Where to find the Head tab in the left panel of the Character Editor

We can now see that DGB_M_NKD_Head_D_Mannequin is being used. We’ll want to find that head’s UUID – not the mannequin version, but the “real” version. We’ll therefore use the DGB_M_NKD_Head_D portion to search for it.

Click back to the main Editor view and go to the Resource Manager. Select the All folder. Into the filter bar, paste the _Mannequin-less name: DGB_M_NKD_Head_D. Filter out everything but VisualResources.

Finding the head (VisualResource) in the Resource Manager.

In the resulting list, find the VisualResource whose name matches. Right click on this VisualResource, and select Copy GUID to Clipboard. In this case, that’s d454e061-e6ac-1d87-98da-f8da7c8a252d.

Copying the GUID of the head (VisualResource).

Why do we need this original VisualResource’s GUID? This is the resource that’s used to set up the link between the dragonborn head and the dragonborn attachments in the UUID Object Editor.

Let’s go back to the UUID Object Editor and open an existing CharacterCreationAppearanceVisuals table, from SharedDev >Character Creation > CharacterCreationAppearanceVisuals.

Using Ctrl+F to open the local search in the UUID Object Editor, paste the GUID value from earlier, and press Enter to search. It should return a single result, found in Row 1 of the table.  

Finding the result in the UUID Object Editor using the copied GUID.

Now, let’s note the UUID from Column A of that row: 7c538187-8c7f-4557-b850-e41a870c394b

Go back to the CharacterCreationIconSettings file in Shared, and back to Row 31, where we started this investigation. We can see that the UUID matches the contents of Row 31, Column F.

The same UUID in the HeadAppearanceUUID column of the CharacterCreationIconSettings table.

“No Attachment” Icon

The “no attachment” icon needs to be set up individually for each head, and needs an entry in the TextureEntryPart column of CharacterCreationAppearanceVisuals. This is used to tell them apart in code. Otherwise, all 4 entries will have the same name and thus only have 1 icon for the “no attachment” option across all heads.

Making sure the icons show up for when you don't want a dragonborn attachment (a "no attachment" icon).
Differentiating each head for the "no attachment" icons.

The above examples are from SharedDev > Character Creation > CharacterCreationAppearanceVisuals.

How Does All This Work Together?

We cycle through the mannequins (templates) in these tables and through the appearance visuals defined in CharacterCreationSharedVisuals and CharacterCreationAppearanceVisuals.

For each appearance, we check if its slot should be rendered with a template. If an appearance’s body type and race corresponds to a template’s body type and race, it will be rendered. Otherwise, it will be skipped.

Rendering Icons

For new assets on existing races, you only need to make sure that the CharacterCreationAppearanceVisuals are correctly defined. This is covered for Hair and Beards in Hair and Beards – Part 2: Character Creation

ⓘ Warning: Generating CC icons will regenerate all CC icons, and therefore take quite some time.

In the main Editor, go to Project > Render CC Icons.

Rendering the icons in the Editor.

If you have not already loaded the correct level, SYS_IconGeneration_A, you will be asked if you want to load the booth level. Click Yes.

Pop-up warning that appears if you haven't loaded the booth level.

Once the generation process starts, you will see a progress bar in the lower right corner of the game window.

The icon generation process, with the progress bar at the bottom.

Wait until the generation is complete. Once done, the progress bar will disappear.

Troubleshooting

After generating CC icons, all of them turned invisible

A fix for this is in progress. In the meantime, if you encounter this, you can revert by deleting a couple of files from inside your /Data/Public/<YourMod>/ folder:

  • Folder: /Content/[PAK]_Generated_...
  • DDS File: /Assets/Textures/Icons/Generated_..._CCIcons.dds
  • LSX File: /CharacterCreation/Generated_CCIcons.lsx