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 (little endian?) |
- Internal to the tag and may be hidden in tools.
- This field's value may change at build time or have precision errors. It should not be used for exact comparisons between tag data.
|
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(16) |
|
Flag | Mask | Comments | does not cast shadow | 0x1 | | transparent self occlusion | 0x2 | Causes the transparent shaders in this object to occlude each other rather than be visible through each other. The scene behind the object is still visible. Warning: enabling this flag while the object uses transparent shaders with extra layers causes Sapien to crash when near the object, though the same object will work ingame. | brighter than it should be | 0x4 | Slightly brightens the object, making it easier to see in the dark for gameplay purposes. Often used for small items like weapons, powerups, and ammunition. | not a pathfinding obstacle | 0x8 | | |
bounding radius |
f32 (world units) |
A radius which encompasses the object, used by the engine for a variety of purposes. If the bounding radius is too small, shadows will be cut off. |
bounding offset |
Point3D (3) |
|
origin offset |
Point3D (3) |
|
acceleration scale |
f32 |
Affects how much objects are moved by explosions. A value of 0 means the object remains fixed (like the multiplayer flag weapon). This value works for items, bipeds, and vehicles (vehicles must also have a physics tag set), but not devices and scenery. See also the instantaneous acceleration field of damage_effect for the source of explosion acceleration. |
scales change colors |
u32 (little endian?) |
- Only set when the tag is compiled into a map cache.
|
model |
Reference? |
|
animation graph |
Reference? : model_animations
|
|
|
pad(40) |
|
collision model |
Reference? : model_collision_geometry
|
|
physics |
Reference? : physics
|
|
modifier shader |
Reference? : shader
|
A modifier shader automatically uses the entire object and its attachments as a geometry source when rendering. It is used for energy shields which need to encompass both the object's own gbxmodel, but also any held weapons in the case of bipeds. |
creation effect |
Reference? : effect
|
|
|
pad(84) |
|
render bounding radius |
f32 (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 |
|
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 | | |
c 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 | | |
d 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 | | |
|
pad(44) |
|
hud text message index |
Index: u16 |
|
forced shader permutation index |
Index: u16 |
|
attachments |
Block? |
|
Field | Type | Comments | type | Reference? (6) | | marker | char[32] | | primary scale | enum | | Option | Value | Comments | none | 0x0 | | a out | 0x1 | | b out | 0x2 | | c out | 0x3 | | d out | 0x4 | | | secondary scale | enum | | Option | Value | Comments | none | 0x0 | | a out | 0x1 | | b out | 0x2 | | c out | 0x3 | | d out | 0x4 | | | change color | enum | | Option | Value | Comments | none | 0x0 | | a | 0x1 | | b | 0x2 | | c | 0x3 | | d | 0x4 | | | | pad(2) | | | pad(16) | | |
widgets |
Block? |
Similar to attachments, but without function-driven properties and a marker location. Some examples include the Warthog antenna and projectile light_volumes. There is a known PC renderer issue where projectile widgets (but not attachments) are improperly offset in mirrored reflections like the floor of the control room. |
Field | Type | Comments | reference | Reference? (5) | | | pad(16) | | |
functions |
Block? |
|
Field | Type | Comments | flags | bitfield(32) | | Flag | Mask | Comments | invert | 0x1 | | additive | 0x2 | | always active | 0x4 | | | period | f32 (seconds) | | 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 | | 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 | | | wobble 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 | | | wobble period | f32 (seconds) | | wobble magnitude | f32 (percent) | | square wave threshold | Fraction: f32 | | step count | u16 | | map to | enum | | Option | Value | Comments | linear | 0x0 | | early | 0x1 | | very early | 0x2 | | late | 0x3 | | very late | 0x4 | | cosine | 0x5 | | | sawtooth count | u16 | | add | 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 | | | scale result 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 | | | bounds mode | enum | | Option | Value | Comments | clip | 0x0 | | clip and normalize | 0x1 | | scale to fit | 0x2 | | | bounds | Fraction: f32 (min & max) | | | pad(4) | | | pad(2) | | turn off with | i16 | | scale by | f32 | | | pad(252) | | inverse bounds | f32 (little endian?) | - Only set when the tag is compiled into a map cache.
| unknown float 2 | f32 (little endian?) | - Only set when the tag is compiled into a map cache.
| inverse step | f32 (little endian?) | - Only set when the tag is compiled into a map cache.
| inverse period | f32 (little endian?) | - Only set when the tag is compiled into a map cache.
| usage | char[32] | | |
change colors |
Block? |
|
Field | Type | Comments | darken 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 | | | scale 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 | | | flags | bitfield(32) | | Flag | Mask | Comments | blend in hsv | 0x1 | | more colors | 0x2 | | | color lower bound | ColorRGB (3) - red:
f32 - green:
f32 - blue:
f32 | | color upper bound | ColorRGB (3) - red:
f32 - green:
f32 - blue:
f32 | | permutations | Block? | | Field | Type | Comments | weight | f32 | | color lower bound | ColorRGB (3) - red:
f32 - green:
f32 - blue:
f32 | | color upper bound | ColorRGB (3) - red:
f32 - green:
f32 - blue:
f32 | | | |
predicted resources |
Block? |
|
PredictedResource |
This information was partially generated using Invader tag definitions.
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.)