SPR
.SPR
is a file format used to store 2D sprites in GoldSrc. It is a modified version of the SPR format used by Quake, adding a dedicated color palette and additional translucency formats (Quake SPRs only support alphatest transparency).
Contents
Limitations
Warning:All frames in a multi-frame sprite share the same palette.
Bug:Oriented sprites are finicky; see The303's tutorials for more information. [todo tested in?]
Bug:Sprites being displayed via env_glow cannot be oriented in the map editor. If rotation is necessary, use env_sprite instead. [todo tested in?]
Image format types
Format | Explanation |
---|---|
Normal | Opaque image with no transparency |
Additive | Same as Normal; Additive translucency can be achieved for any image format by changing the sprite's rendermode (either in a sprite entity, or via code) |
IndexAlpha | Single-color with 8-bit translucency |
AlphaTest | Binary alpha-tested transparency; pixels using the last color in the palette will be transparent |
Orientation types
Orientation | Explaination |
---|---|
Parallel | Rotates to always face the camera |
Parallel Upright | Like parallel, but doesn't rotate around Z axis |
Oriented | Rotated in map editor to face a specific direction |
Parallel Oriented | Combination of parallel and oriented. |
Facing Upright | Like parallel upright, but rotated based on player origin, rather than camera. |
Technical
Header
struct sprite
{
int id; // format ID, "IDSP" (0x49 0x44 0x53 0x50)
int version; // Format version number. HL1 SPRs are version 2 (0x02,0x00,0x00,0x00)
int spriteType; // Orientation method
int textFormat; // Translucency/Transparency method
float boundingRadius;
int maxWidth;
int maxHeight;
int frameNum; // number of frames the sprite contains
float beamLength;
int synchType;
short paletteColorCount; // number of colors in the palette; should be 256
};
Palette
After the header, comes a list of palette colors of "paletteColorCount" size, each one 3 bytes - Red, Green, Blue.
Frames
After that come the sprite frames. (frameNum from the header)
struct sprite_frame_header
{
int group;
int originX; // not sure about this one, it always huge for sprites in HL1
int originY;
int width;
int height;
// Right after this, the paletted image data comes, each byte is a pixel.
// The image size is given in the frame header, so the entire data for 1 frame is width*height bytes.
};