Skip to content

UI Image Set XML

The interface does not use one file per icon. It uses a few big textures and cuts boxes out of them. xml/uiimageset.xml lists the textures (image sets) and the named boxes (images) on each. Every window, button and icon in the client refers to a box by name.

This page follows the client loader (ioUIImageSetManager in io3DEngine) and the web tools. Anything marked not confirmed yet was not verified.

ioSP2GUIManager::InitManager loads two files when the GUI starts, in this order:

  1. XML/UIImageSet.xml (the image sets, this page)
  2. XML/DefaultUIFrame.xml (frame templates that windows use)

The file is read through the pack lookup, so it comes from rs.iop first (see IOP Pack Format). Names in the pack are not case-sensitive, so uiimageset.xml and UIImageSet.xml are the same file.

<?xml version="1.0" encoding="euc-kr" ?>
<ImagesetLayout>
<Imageset Name="BaseImage001" File="ui_base001.dds">
<Image Name="strip_black" X="0" Y="0" Width="64" Height="32" />
<Image Name="icon_a" X="64" Y="0" Width="32" Height="32" OffsetX="2" OffsetY="1" />
</Imageset>
</ImagesetLayout>

The example values are made up to show the shape. The file is ASCII text with the euc-kr declaration. Keep names to plain ASCII.

Attribute Required Meaning
Name yes Name of the set, used in set#image names
File yes Texture file name, a bare name such as ui_base001.dds. The client looks it up as a texture (normally in resource/texture)
Erase no When the texture may be freed: Automatic (default), Manual or NoErase. Any other text is read as Automatic
NowLoad no true loads the texture right at start. Otherwise it loads the first time an image of the set is drawn

A set is skipped if Name or File is empty. If two sets share a name, the client logs “Set Already Exist”, keeps the first set (and its texture) and adds the images of the second block to it. An image with a name that the set already has is ignored: the client logs “Image Already Define” and keeps the first box (ioUIImageSet::DefineImage, same in all three sources). To change a box, edit it; a second copy further down has no effect.

Attribute Required Meaning
Name yes Name of the box inside the set
X, Y yes Top left corner on the texture, in pixels
Width, Height yes Size of the box in pixels
OffsetX, OffsetY no Shift applied when the image is drawn. Missing means 0; the client writes these only when not 0

The loader does not check the box against the texture size. A box outside the picture draws garbage or nothing.

A window or code asks for an image by its full name, set#image, for example BaseImage001#strip_black. The client splits it at the #:

  • two parts: set name and image name (CreateImageByFullName)
  • anything else: the whole text is taken as a texture file name and a single-image set is made on the fly. The client logs “Not Vaild” for this case

Window XML files can also give the set and the image as separate attributes (Imageset="..." Image="..."). See Window XML.

Because the name is the only link, renaming or deleting a box breaks every window and code line that uses it. Add new boxes instead of changing old names.

ioUIImageSetManager.cpp is identical in the 2014, 2019 and 2021 sources, and all three load XML/UIImageSet.xml the same way. The content differs by client: each has its own sets and boxes. The 2014 test client has 503 sets and 14 780 images (counted with the web tools).

Tool Use
UI Image Sets Shows the boxes on the texture. Add, move, resize, duplicate, delete. Lines you did not touch are written back byte for byte, including the file’s mixed line breaks
UI Windows Reads the file to draw the images of a window
Textures Opens the .dds files the sets point at
IOP Manager Puts the edited XML into a pack
  • Whether the client also reads sets from other XML files besides XML/UIImageSet.xml in the 2021 build.
  • How big a texture may be before an older graphics card refuses it.