object (abstract tag)

Objects are a high-level abstract tag, meaning they serve as a base for many other tag types but cannot be directly created themselves. Generally, they are "things" with a position in the world but are distinct from the "level" itself. Some examples include elevators, trees, warthogs, and the player.

Some capabilities available to objects (though not used by every subtype) are:

Shadows

For most dynamic objects, Halo uses shadow mapping with their render model, unless the object's "does not cast shadow" flag is true. However, with scenery, shadows are baked into the lightmap using the object's collision geometry instead, regardless of the "does not cast shadow" flag.

Structure and fields

Field Type Comments
object type enum
  • Volatile
  • Hidden
Option Value Comments
biped 0x0
vehicle 0x1
weapon 0x2
equipment 0x3
garbage 0x4
projectile 0x5
scenery 0x6
device machine 0x7
device control 0x8
device light fixture 0x9
placeholder 0xA
sound scenery 0xB
flags bitfield
Flag Mask Comments
does not cast shadow 0x1
transparent self occlusion 0x2
brighter than it should be 0x4
not a pathfinding obstacle 0x8
bounding radius float
  • Unit: world units

The bounding radius sets the approximate maximum size of the object and is used for a variety of optimizations by the game:

  • Culling objects for rendering which are not partially on screen.
  • Setting the shadow map size for dynamic object shadows.
  • Selecting an appropriate LOD.

The radius should contain this object completely, but not be too large. Setting it too high will cause the object to draw unccessarily when off-screen, but setting it too low will cause the object to have clipped shadows and pop in and out of visibility at the edges of the screen.

This can be visualized in Sapien using debug_objects_bounding_spheres.

bounding offset Point3D
Field Type Comments
x float
y float
z float
origin offset Point3D?
acceleration scale float
  • Min: 0
scales change colors uint32
  • Cache only
model
TagDependency
animation graph

TagDependency: model_animations

collision model

TagDependency: model_collision_geometry

physics

TagDependency: physics

modifier shader

TagDependency: shader

creation effect

TagDependency: effect

render bounding radius float
  • Unit: world units
a in enum
Option Value Comments
none 0x0
body vitality 0x1
shield vitality 0x2
recent body damage 0x3
recent shield damage 0x4
random constant 0x5
umbrella shield vitality 0x6
shield stun 0x7
recent umbrella shield vitality 0x8
umbrella shield stun 0x9
region 0xA
region 1 0xB
region 2 0xC
region 3 0xD
region 4 0xE
region 5 0xF
region 6 0x10
region 7 0x11
alive 0x12
compass 0x13
b in enum?
c in enum?
d in enum?
hud text message index uint16
forced shader permutation index uint16
attachments Block
  • HEK max count: 8
Field Type Comments
type
TagDependency (6)
marker TagString
Field Type Comments
buffer char[32]

Null-terminated string in 32-char buffer.

primary scale enum
Option Value Comments
none 0x0
a out 0x1
b out 0x2
c out 0x3
d out 0x4
secondary scale enum?
change color enum
Option Value Comments
none 0x0
a 0x1
b 0x2
c 0x3
d 0x4
widgets Block
  • HEK max count: 4
Field Type Comments
reference
TagDependency (5)
functions Block
  • HEK max count: 4
  • Max: 4
  • Processed during compile
Field Type Comments
flags bitfield
Flag Mask Comments
invert 0x1
additive 0x2
always active 0x4
period float
  • Unit: seconds
  • Default: 1
scale period by enum
Option Value Comments
none 0x0
a in 0x1
b in 0x2
c in 0x3
d in 0x4
a out 0x5
b out 0x6
c out 0x7
d out 0x8
function enum
Option Value Comments
one 0x0
zero 0x1
cosine 0x2
cosine variable period 0x3
diagonal wave 0x4
diagonal wave variable period 0x5
slide 0x6
slide variable period 0x7
noise 0x8
jitter 0x9
wander 0xA
spark 0xB
scale function by enum?
wobble function enum?
wobble period float
  • Unit: seconds
wobble magnitude float
  • Unit: percent
square wave threshold float
step count uint16
map to enum
Option Value Comments
linear 0x0
early 0x1
very early 0x2
late 0x3
very late 0x4
cosine 0x5
sawtooth count uint16
add enum?
scale result by enum?
bounds mode enum
Option Value Comments
clip 0x0
clip and normalize 0x1
scale to fit 0x2
bounds Bounds
  • Default: 0,1
Field Type Comments
min float
max float
turn off with int16
scale by float
inverse bounds float
  • Cache only
inverse sawtooth float
  • Cache only
inverse step float
  • Cache only
inverse period float
  • Cache only
usage TagString?
change colors Block
  • HEK max count: 4
  • Max: 4
  • Processed during compile
Field Type Comments
darken by enum?
scale by enum?
flags bitfield
Flag Mask Comments
blend in hsv 0x1
more colors 0x2
color lower bound ColorRGB
Field Type Comments
red float
green float
blue float
color upper bound ColorRGB?
permutations Block
  • HEK max count: 8
Field Type Comments
weight float
  • Default: 1
color lower bound ColorRGB?
color upper bound ColorRGB?
predicted resources Block
  • HEK max count: 1024
  • Cache only
Field Type Comments
type enum
Option Value Comments
bitmap 0x0
sound 0x1
resource index uint16
tag uint32

Acknowledgements

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

  • Jakey (Explaining modifier shaders.)
  • Kavawuvi (Invader tag definitions)
  • MosesOfEgypt (Tag structure research)
  • Satania (Explaining acceleration scale.)