The game's decal system is responsible for rendering bullet holes, blood splatter, explosion marks, and other flat textures applied over over BSP surfaces (decals cannot appear on objects). Decal tags describe the appearance and lifetime of these effects.

Effect decals

Decals are most commonly created dynamically from effects, such as explosions and bullet impacts. In these cases, it is recommended to give the decal a maximum lifetime to avoid poor framerates.

Environment decals

A scenario can also contain permanent decals placed throughout the environment. These can be placed in Sapien under the game data section.

Decal meshes

Although often created as quads, the game may generate more complex decal meshes to conform to the underlying geometry. Vertices of decal meshes typically stand off from their background with a small margin to avoid Z-fighting, but the distance is not consistent.

Structure and fields

Field Type Comments
flags bitfield
Flag Mask Comments
geometry inherited by next decal in chain 0x1
interpolate color in hsv 0x2
more colors 0x4
no random rotation 0x8
water effect 0x10
sapien snap to axis 0x20
sapien incremental counter 0x40
animation loop 0x80
preserve aspect 0x100
type enum
Option Value Comments
scratch 0x0
splatter 0x1
burn 0x2
painted sign 0x3
layer enum
Option Value Comments
primary 0x0
secondary 0x1
light 0x2
alpha tested 0x3
water 0x4
next decal in chain

TagDependency: decal

radius Bounds
  • Unit: world units
  • Default: 0.125,0.125
Field Type Comments
min float
max float
intensity Bounds
  • Min: 0
  • Max: 1
  • Default: 1,1
Field Type Comments
min float
max float
color lower bounds ColorRGB
  • Default: 1,1,1
Field Type Comments
red float
green float
blue float
color upper bounds ColorRGB?
  • Default: 1,1,1
animation loop frame uint16
animation speed uint16
  • Unit: ticks per frame
  • Default: 1
lifetime Bounds?
  • Unit: seconds
decay time Bounds?
  • Unit: seconds
framebuffer blend function enum
Option Value Comments
alpha blend 0x0
multiply 0x1
double multiply 0x2
add 0x3
subtract 0x4
component min 0x5
component max 0x6
alpha multiply add 0x7
map

TagDependency: bitmap

maximum sprite extent float

Acknowledgements

Thanks to the following individuals for their research or contributions to this topic:

  • Kavawuvi (Invader tag definitions)
  • MosesOfEgypt (Tag structure research)