Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

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:

MeshVerticesTriangles
Shield68100
Logo16941606
Outer shield3432

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:

OffsetSizeTypeNameDescription
012[f32; 3]positionObject-space position
1212[f32; 3]normalObject-space normal
248[f32; 2]texture coordinatesGlide S/T coordinates

A face occupies 20 bytes:

OffsetSizeTypeNameDescription
012[u32; 3]verticesIndices into this mesh’s vertex array
124u32materialMaterial ID, 0 through 4
164u32edgesThree 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.

TextureDimensionsGlide formatInterpretation
Logo color64×641YIQ8 with an NCC color table
Highlight32×323Intensity8
Shadow64×323Intensity8

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.

External References