SPR
(Redirected from Spr)
Jump to navigation
Jump to search
.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).
SPR files are technically considered models by the game code and engine. As such, any entity which displays a sprite can be made to display a MDL or external BSP by simply changing the file path.
Limitations



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.
};