CLYT (.bclyt) is the layout format used on the 3DS. It stands for (Binary) CTR Layout, and is similar to the RLYT format used on the Wii.
Offset
|
Size
|
Type
|
Description
|
0x00 |
0x4 |
String |
Signature (CLYT)
|
0x04 |
0x2 |
UInt16 |
Byte Order Mark
|
0x06 |
0x2 |
UInt16 |
Header Length
|
0x08 |
0x4 |
UInt32 |
Revision
|
0x0C |
0x4 |
UInt32 |
File Size
|
0x10 |
0x2 |
UInt16 |
Nr Sections
|
0x12 |
0x2 |
UInt16 |
Padding
|
lyt1 (Layout 1)
Offset
|
Size
|
Type
|
Description
|
0x00 |
0x4 |
String |
Signature (lyt1)
|
0x04 |
0x4 |
UInt32 |
Section Size
|
0x08 |
0x4 |
UInt32 |
Origin type
Value
|
Meaning
|
0 |
Classic
|
1 |
Normal
|
|
0x0C |
0x8 |
Vector2 |
Canvas Size
|
txl1 (Texture List 1)
Offset
|
Size
|
Type
|
Description
|
0x00 |
0x4 |
String |
Signature (txl1)
|
0x04 |
0x4 |
UInt32 |
Section Size
|
0x08 |
0x4 |
UInt32 |
Nr Textures = N
|
0x0C |
N * 4 |
UInt32[] |
Texture Name Offsets (relative to the start of this array)
|
After this, the null terminated names follow.
fnl1 (Font List 1)
Offset
|
Size
|
Type
|
Description
|
0x00 |
0x4 |
String |
Signature (fnl1)
|
0x04 |
0x4 |
UInt32 |
Section Size
|
0x08 |
0x4 |
UInt32 |
Nr Fonts = N
|
0x0C |
N * 4 |
UInt32[] |
Font Name Offsets (relative to the start of this array)
|
After this, the null terminated names follow.
mat1 (Materials 1)
Offset
|
Size
|
Type
|
Description
|
0x00 |
0x4 |
String |
Signature (mat1)
|
0x04 |
0x4 |
UInt32 |
Section Size
|
0x08 |
0x4 |
UInt32 |
Nr Materials = N
|
0x0C |
N * 4 |
UInt32[] |
Material Entry Offsets (relative to the start of this section)
|
After this, the material entries follow.
Offset
|
Size
|
Type
|
Description
|
0x00 |
0x14 |
String |
Material Name
|
0x14 |
0x4 |
RGBA8 |
Tev Color (Buffer Color?)
|
0x18 |
0x18 |
RGBA8[6] |
Tev Constant Colors
|
0x30 |
0x4 |
UInt32 |
Flags / bitfield
Bit
|
Flag / data
|
0-1 |
Nr texMap
|
2-3 |
Nr texMatrix
|
4-5 |
Nr texCoordGen
|
6-8 |
Nr tevStage
|
9 |
Has alphaCompare
|
10 |
Has blendMode
|
11 |
Use Texture Only
|
|
Texture Map Entry
Offset
|
Size
|
Type
|
Description
|
0x00 |
0x2 |
UInt16 |
Texture Index
|
0x02 |
0x1 |
Byte |
Bitfield
Bit
|
Data
|
0-1 |
Wrap S (Clamp = 0, Repeat = 1, Mirror = 2)
|
2-3 |
Min Filter (0 = Near, 1 = Linear)
|
|
0x03 |
0x1 |
Byte |
Bitfield
Bit
|
Data
|
0-1 |
Wrap T (Clamp = 0, Repeat = 1, Mirror = 2)
|
2-3 |
Mag Filter (0 = Near, 1 = Linear)
|
|
Texture Matrix Entry
Offset
|
Size
|
Type
|
Description
|
0x00 |
0x8 |
Vector2 |
Translation
|
0x08 |
0x4 |
Single |
Rotation
|
0x0C |
0x8 |
Vector2 |
Scale
|
Texture Coordinate Generation Entry
Offset
|
Size
|
Type
|
Description
|
0x00 |
0x1 |
UInt8 |
Type
Value
|
Meaning
|
0 |
2x4 matrix
|
|
0x01 |
0x1 |
UInt8 |
Source (N = Tex N, max 2)
|
0x02 |
0x2 |
UInt8[] |
Padding
|
TODO: tevStage, alphaCompare, blendMode, etc...
pan1(Pane 1)
Defines a Null pane, used mostly to keep panes grouped in hierarchies or to control the children of a given pan1 without having to do so individually.
Offset
|
Size
|
Type
|
Description
|
0x00 |
0x4 |
String |
Signature (pan1)
|
0x04 |
0x4 |
UInt32 |
Section Size
|
0x08 |
0x1 |
UInt8 |
Flags
Bit
|
Flag
|
0 |
Visible
|
1 |
InfluencedAlpha
|
2 |
LocationAdjust
|
|
0x09 |
0x1 |
UInt8 |
Origin (1 = centered, 2 = right, 3 = left, )
|
0x0A |
0x1 |
UInt8 |
Alpha
|
0x0B |
0x1 |
UInt8 |
Padding
|
0x0C |
0x10 |
String |
Pane name
|
0x1C |
0x8 |
String |
Data
|
0x24 |
0xC |
Vector3 |
Translation
|
0x30 |
0xC |
Vector3 |
Rotation
|
0x3C |
0x8 |
Vector2 |
Scale
|
0x44 |
0x8 |
Vector2 |
Size
|
pic1(Picture 1)
pic1 represents a picture that can be displayed in a layout. The first 0x4C bytes are defined the same as pan1 with minor differences.
Offset
|
Size
|
Type
|
Description
|
0x00 |
0x4 |
String |
Signature (pic1)
|
0x04 |
0x4 |
UInt32 |
Section size (including the texture coordinates)
|
Same as pan1 from 0x8 to 0x4c
|
0x4C |
0x4 |
RGBA8 |
Top left vertex color
|
0x50 |
0x4 |
RGBA8 |
Top right vertex color
|
0x54 |
0x4 |
RGBA8 |
Bottom left vertex color
|
0x58 |
0x4 |
RGBA8 |
Bottom right vertex color
|
0x5C |
0x2 |
UInt16 |
Material ID
|
0x5E |
0x2 |
UInt16 |
Nr texture coordinates = N
|
Texture coordinates entry
|
0x60 + (N-1) * 0x20 |
0x8 |
Vector2 |
Top left vertex texture coordinate
|
0x64 + (N-1) * 0x20 |
0x8 |
Vector2 |
Top right vertex texture coordinate
|
0x68 + (N-1) * 0x20 |
0x8 |
Vector2 |
Bottom left vertex texture coordinate
|
0x6C + (N-1) * 0x20 |
0x8 |
Vector2 |
Bottom right vertex texture coordinate
|
txt1 (Text 1)
A textbox used in layouts.
The first 0x4C bytes are defined the same as pan1 with minor differences.
Offset
|
Size
|
Type
|
Description
|
0x00 |
0x4 |
String |
Signature (txt1)
|
0x04 |
0x4 |
UInt32 |
Section size (including the textbox string)
|
Same as pan1 from 0x8 to 0x4c
|
0x4C |
0x2 |
Unknown |
Flags (H Direction?)
|
0x4E |
0x2 |
Unknown |
Flags (V Direction?)
|
0x50 |
0x4 |
UInt32 |
Material ID
|
0x54 |
0x2 |
Unknown |
Flags (Line alignment?)
|
0x56 |
0x2 |
Unknown |
Padding
|
0x58 |
0x4 |
UInt32 |
Offset from signature to beginning of the string
|
0x5C |
0x4 |
RGBA8 |
Font top color
|
0x60 |
0x4 |
RGBA8 |
Font bottom color
|
0x64 |
0x8 |
Vector2 |
Font scale
|
0x6C |
0x4 |
Float |
Horizontal font spacing
|
0x70 |
0x4 |
Float |
Vertical font spacing
|
0x74 |
User defined |
String |
Textbox text (must be multiple of 4), can be usd1
|
wnd1 (Window 1)
A more complex type of image pane, where the user can define the content, the corners and the sides of it, depending on what mode it's set to.
Offset
|
Size
|
Type
|
Description
|
0x00 |
0x4 |
String |
Signature (wnd1)
|
0x04 |
0x4 |
UInt32 |
Section size (including the texture coordinates)
|
Same as pan1 from 0x8 to 0x4c
|
0x4C |
0x4 |
float |
Coordinate 1
|
0x50 |
0x4 |
float |
Coordinate 2
|
0x54 |
0x4 |
float |
Coordinate 3
|
0x58 |
0x4 |
float |
Coordinate 4
|
0x5C |
0x1 |
Byte |
Number of frames (n)
|
0x5D |
0x1 |
Byte |
Flag
|
0x5E |
0x2 |
UInt16 |
Padding
|
0x60 |
0x4 |
UInt32 |
Window content offset (Points to 0x68)
|
0x64 |
0x4 |
UInt32 |
Window frame offsets, offset to offsets of the materials for the frames. (W)
|
0x68 |
0x4 |
RGBA8 |
Content box top left vertex color
|
0x6C |
0x4 |
RGBA8 |
Content box top right vertex color
|
0x70 |
0x4 |
RGBA8 |
Content box bottom left vertex color
|
0x74 |
0x4 |
RGBA8 |
Content box bottom right vertex color
|
0x78 |
0x2 |
UInt16 |
Content box Material ID
|
0x7A |
0x2 |
UInt16 |
Number of Texture coordinates (N)
|
Texture coordinates entry
|
0x7C + (N-1) * 0x20 |
0x8 |
Vector2 |
Top left vertex texture coordinate
|
0x84 + (N-1) * 0x20 |
0x8 |
Vector2 |
Top right vertex texture coordinate
|
0x8C + (N-1) * 0x20 |
0x8 |
Vector2 |
Bottom left vertex texture coordinate
|
0x94 + (N-1) * 0x20 |
0x8 |
Vector2 |
Bottom right vertex texture coordinate
|
Window frames
|
0x(W) |
0x4 * n |
UInt32 |
Offsets to frame materials
|
0x(W) |
0x4 * n |
Window frame |
Offset
|
Size
|
Type
|
Description
|
0x0 |
UInt16 |
0x2 |
Frame Material ID
|
0x2 |
Byte |
0x1 |
Flip Type
|
0x3 |
Byte |
0x1 |
Padding
|
|
Below is a table of possible material flip types. (From Mario Kart Wii Wiki)
Type |
Description
|
0 |
None
|
1 |
Flip (Horizontal)
|
2 |
Flip (Vertical)
|
3 |
Rotate 90 Degrees
|
4 |
Rotate 180 Degrees
|
5 |
Rotate 270 Degrees
|
bnd1 (Bounding 1)
Same data structure as Panes, but used to limit interaction with buttons.
Offset
|
Size
|
Type
|
Description
|
0x00 |
0x4 |
String |
Signature (bnd1)
|
0x04 |
0x4 |
UInt32 |
Section size (including the texture coordinates)
|
Same as pan1 from 0x8 to 0x4c
|
pas1 (Pane Start 1)
Marks the start of a pane hierarchy, with the parent being the previous pane.
Offset
|
Size
|
Type
|
Description
|
0x00 |
0x4 |
String |
Signature (pas1)
|
0x04 |
0x4 |
UInt32 |
Section Size
|
pae1 (Pane End 1)
Marks the end of a pane hierarchy.
Offset
|
Size
|
Type
|
Description
|
0x00 |
0x4 |
String |
Signature (pae1)
|
0x04 |
0x4 |
UInt32 |
Section Size
|
grp1 (Group 1)
Starts a pane group, which can be inside other pane groups.
Offset
|
Size
|
Type
|
Description
|
0x00 |
0x4 |
String |
Signature (grp1)
|
0x04 |
0x4 |
UInt32 |
Section Size
|
0x08 |
0x10 |
String |
Group Name
|
0x18 |
0x4 |
UInt32 |
Nr Pane References (=N)
|
0x1C |
0x10 * N |
String[N] |
Pane References
|
grs1 (Group Start 1)
Starts a group hierarchy.
Offset
|
Size
|
Type
|
Description
|
0x00 |
0x4 |
String |
Signature (grs1)
|
0x04 |
0x4 |
UInt32 |
Section Size
|
gre1 (Group End 1)
Ends a group hierarchy.
Offset
|
Size
|
Type
|
Description
|
0x00 |
0x4 |
String |
Signature (gre1)
|
0x04 |
0x4 |
UInt32 |
Section Size
|
usd1 (User Data 1)
Contains a dictionary with strings as keys and variable values
Offset
|
Size
|
Type
|
Description
|
0x00 |
0x4 |
String |
Signature (usd1)
|
0x04 |
0x4 |
UInt32 |
Section Size
|
0x08 |
0x4 |
UInt32 |
Number of entries (= N)
|
0xC |
0xC * N // Variable |
Entries[] |
Entries
|
User Entries
Where an entry is as follows:
Offset
|
Size
|
Type
|
Description
|
0x0 |
0x4 |
UInt32 |
Key offset (from start of this entry) to null-terminated ascii string that serves as key.
|
0x4 |
0x4 |
UInt32 |
Value offset (from start of this entry).
|
0x8 |
0x2 |
UInt16 |
Number of entries or string length.
|
0xA |
0x2 |
UInt16 |
Value type
Value
|
Type
|
0x0 |
String
|
0x1 |
Int
|
0x2 |
Float
|
|
Tools
- Every File Explorer and Switch Toolbox both have limited support for viewing these.
- Clypo allows exporting these files to yml and importing back to bclyt but it only supports scale, size, translation and rotation of panes.
See also
https://wiki.tockdom.com/wiki/BRLYT_(File_Format)
http://florian.nouwt.com/wiki/index.php/CLYT_%28File_Format%29 (Archived)
https://github.com/Gericom/EveryFileExplorer/tree/master/3DS/NintendoWare/LYT1
https://github.com/KillzXGaming/Switch-Toolbox/tree/master/File_Format_Library/FileFormats/Layout/CTR/Panes