Spot cameras, locators and occluders
Besides spot chunks, splines and lights, the SCP blob holds three small kinds of placed object. All numbers are big-endian, and every matrix is a 64-byte row-major affine matrix with the translation in floats 12 to 14, finite and with the fourth column (0, 0, 0, 1). Proven · all 281 camera, 1 locator and 341 occluder matrices
Spot cameras (type 3)
Section titled “Spot cameras (type 3)”A section holds count records of 48 bytes from its data offset, then count × 2 matrices of 64 bytes; its size is data_offset + count × 176. The disc has 10 sections, one in each level’s base SCP, with 281 records. Proven · all 10 sections
| Offset | Size | Type | Field | Confidence | Notes |
|---|---|---|---|---|---|
| 0x0 | 4 | u32 | id | Observed | the record's own id: 0x3666B710 in most records, 0x1A570D21 and others in two levels |
| 0x4 | 4 | u32 | pool_leftover | Unknown | allocator leftovers; varies |
| 0x8 | 4 | u32 | spot_name | Observed | sdbm of a spot name of the database: BigJumpOne, VertAirTwo, Chlg17_ObjSpot_Cam12_AnyTrick |
| 0xC | 4 | u32 | pool_leftover | Unknown | |
| 0x10 | 4 | u32 | parent | Observed | |
| 0x14 | 4 | f32 | value | Unknown | 53.638 in all 281 records |
| 0x18 | 4 | u32 | flag | Unknown | 1 in all 281 records |
| 0x1C | 4 | u32 | frame_offset | Proven | from the section's start, of a matrix in the array after the records |
| 0x20 | 4 | u32 | second_frame_offset | Proven | likewise |
| 0x24 | 12 | u32[3] | pool_leftover | Unknown |
Both offsets lie in the matrix array in all 281 records. Proven · all 281 records
The section’s loader copies the translations of the two matrices, and the record’s offset 20, into the object whose id the record holds. Observed · static reading of the executable
That the records are cameras (the first matrix the camera’s frame, the second the frame of the point it looks at) is read from the spot names (..._Cam12_...) and from the pair of frames: the second matrix has the linear part diag(−1, 1, 1) in 159 of the 281 records and a rotation in the others. The function that uses them was not traced. Inferred
Locators (type 5)
Section titled “Locators (type 5)”A section holds count records of 16 bytes then count matrices; its size is data_offset + count × 80. The disc has one section, in the echo base SCP, with one record. Proven · all 547 SCPs
| Offset | Size | Type | Field | Confidence | Notes |
|---|---|---|---|---|---|
| 0x0 | 4 | u32 | class | Proven | sdbm of RMLocator |
| 0x4 | 4 | u32 | name | Unknown | sdbm of the locator's name |
| 0x8 | 4 | u32 | kind | Proven | sdbm of Waypoint |
| 0xC | 4 | u32 | matrix_offset | Proven | from the section's start |
The matrix is a scaled rotation whose translation is the origin to within 1e-4. What a waypoint is used for is unknown. Observed
Occluders (type b)
Section titled “Occluders (type b)”A section holds count records of 16 bytes from its data offset. After them come, for each record in order, a 64-byte matrix and an outline of line segments; the matrices and outlines tile the section exactly. The disc has 9 sections in 9 SCPs with 341 records. Proven · all 9 sections
| Offset | Size | Type | Field | Confidence | Notes |
|---|---|---|---|---|---|
| 0x0 | 4 | u32 | name | Observed | sdbm of RMOccluder or RMOccluder<N>, N below 1000, for 276 of the 341; the other 65 hash names that are not known |
| 0x4 | 4 | u32 | matrix_offset | Proven | from the section's start |
| 0x8 | 4 | u32 | outline_offset | Proven | the matrix's offset plus 64 |
| 0xC | 4 | u32 | flags | Observed | the low 16 bits give the outline's shape; the high 16 vary from record to record and are unknown |
The outline is a list of segments, each two vec4 of x, y, z and w = 1. The low half of the flags says how many: 0x0800 is four segments (128 bytes, the outline of a rectangle; 269 records) and 0x1801 is twelve (384 bytes, the edges of a box; 72 records). No other low half occurs. Proven · all 341 records
The outline points are in the matrix’s own space by the stored values (coordinates from −14.7 to 4.8 in a box of one SCP, ±4 in most), but the engine code that applies them was not found. Inferred
The engine has no section handler for the type. The only consumer found is the Lua binding set_occluder_enabled, which names occluders; whether the renderer culls with them is not established. Observed · static reading of the executable
The engine function that uses the spot cameras’ frames, the meaning of the camera value 53.638, the waypoint’s use and the occluder’s high flag half are open.