SPR

From Valve Developer Community
Jump to: navigation, search

Stub

This article or section is a stub. You can help by adding to it.

Half-Life SDK

.SPR is a file format used to store 2D sprites in GoldSrc GoldSrc. It is a modified version of the SPR format used by Quake Quake, adding a dedicated color palette and additional translucency formats (Quake SPRs only support alphatest transparency).

Limitations

Warning.pngWarning:All frames in a multi-frame sprite share the same palette.
Icon-Bug.pngBug:Oriented sprites are finicky; see The303's tutorials for more information.  [todo tested in?]
Icon-Bug.pngBug: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.
};

External links