Glide splash tables
The GOG Glide overlay contains authored geometry, animation transforms, and textures for the animated 3dfx splash.
rgpre::import::glide_splash::parse_glide_splash extracts data from the player’s
DOSBOX/glide2x_emu.ovl. It does not execute the overlay. This library API
supports the GOG LE table layout; other overlay versions and the
Windows 3DfxSpl2.dll animation resource use different layouts. The latter
is supported by parse_windows_glide_splash.
Overall Structure
[DOS header and LE executable header]
[LE object table and page map]
[Initialized writable object]
[Mesh pointers and vertex counts]
[Face pointers and triangle counts]
[Authored frame count and transforms]
[Vertex and face arrays]
[Texture descriptors, color tables, and mip chains]
Writable LE objects are reconstructed from their page maps. Table pointers are relative to their data object.
Mesh tables
There are three meshes, in shield, logo, outer-shield order:
| Mesh | Vertices | Triangles |
|---|---|---|
| Shield | 68 | 100 |
| Logo | 1694 | 1606 |
| Outer shield | 34 | 32 |
The table contains three vertex pointers, three vertex counts, three face pointers, three face counts, then the frame count. All scalar values are little-endian 32-bit words. There are 75 authored frames; each contains three column-major 4×4 float matrices in mesh order.
A vertex occupies 32 bytes:
| Offset | Size | Type | Name | Description |
|---|---|---|---|---|
| 0 | 12 | [f32; 3] | position | Object-space position |
| 12 | 12 | [f32; 3] | normal | Object-space normal |
| 24 | 8 | [f32; 2] | texture coordinates | Glide S/T coordinates |
A face occupies 20 bytes:
| Offset | Size | Type | Name | Description |
|---|---|---|---|---|
| 0 | 12 | [u32; 3] | vertices | Indices into this mesh’s vertex array |
| 12 | 4 | u32 | material | Material ID, 0 through 4 |
| 16 | 4 | u32 | edges | Three bits selecting antialiased triangle edges |
Textures
The three texture blocks begin with width, height, small LOD, large LOD, aspect
ratio, and Glide texture format, as six u32 values. A 1028-byte color-table
union follows, then the mip-chain byte length and pixel data. The largest mip
is first. The current API returns that mip as RGBA, without embedding assets
in the library.
| Texture | Dimensions | Glide format | Interpretation |
|---|---|---|---|
| Logo color | 64×64 | 1 | YIQ8 with an NCC color table |
| Highlight | 32×32 | 3 | Intensity8 |
| Shadow | 64×32 | 3 | Intensity8 |
Intensity8 produces (intensity, intensity, intensity, 255). It is opaque
grayscale, not an alpha mask.
YIQ8 uses the first 64 bytes of the color-table union: 16 unsigned luma bytes,
then four signed three-channel I vectors and four signed three-channel Q
vectors, each component stored in a u16 slot as a signed nine-bit value.
Sign extension uses bit 8: values 256 through 511 represent -256 through -1.
For pixel p, RGB is the clamped sum of
Y[p >> 4] + I[(p >> 2) & 3] + Q[p & 3]; alpha is 255.
See startup rendering for transforms, materials, and screen sequence.