digraph {
rankdir=LR;
node [shape=plaintext];
subgraph cluster__doom_wad {
label="DoomWad";
graph[style=dotted];
doom_wad__seq [label=<
pos | size | type | id |
0 | 4 | str(ASCII) | magic |
4 | 4 | s4le | num_index_entries |
8 | 4 | s4le | index_offset |
>];
doom_wad__inst__index [label=<
pos | size | type | id |
index_offset | 16 | IndexEntry | index |
repeat num_index_entries times |
>];
subgraph cluster__sectors {
label="DoomWad::Sectors";
graph[style=dotted];
sectors__seq [label=<
pos | size | type | id |
0 | 26 | Sector | entries |
repeat to end of stream |
>];
}
subgraph cluster__vertex {
label="DoomWad::Vertex";
graph[style=dotted];
vertex__seq [label=<
pos | size | type | id |
0 | 2 | s2le | x |
2 | 2 | s2le | y |
>];
}
subgraph cluster__texture12 {
label="DoomWad::Texture12";
graph[style=dotted];
texture12__seq [label=<
pos | size | type | id |
0 | 4 | s4le | num_textures |
4 | 4 | TextureIndex | textures |
repeat num_textures times |
>];
subgraph cluster__texture_index {
label="DoomWad::Texture12::TextureIndex";
graph[style=dotted];
texture_index__seq [label=<
pos | size | type | id |
0 | 4 | s4le | offset |
>];
texture_index__inst__body [label=<
pos | size | type | id |
offset | ... | TextureBody | body |
>];
}
subgraph cluster__texture_body {
label="DoomWad::Texture12::TextureBody";
graph[style=dotted];
texture_body__seq [label=<
pos | size | type | id |
0 | 8 | str(ASCII) | name |
8 | 4 | u4le | masked |
12 | 2 | u2le | width |
14 | 2 | u2le | height |
16 | 4 | u4le | column_directory |
20 | 2 | u2le | num_patches |
22 | 10 | Patch | patches |
repeat num_patches times |
>];
}
subgraph cluster__patch {
label="DoomWad::Texture12::Patch";
graph[style=dotted];
patch__seq [label=<
pos | size | type | id |
0 | 2 | s2le | origin_x |
2 | 2 | s2le | origin_y |
4 | 2 | u2le | patch_id |
6 | 2 | u2le | step_dir |
8 | 2 | u2le | colormap |
>];
}
}
subgraph cluster__linedef {
label="DoomWad::Linedef";
graph[style=dotted];
linedef__seq [label=<
pos | size | type | id |
0 | 2 | u2le | vertex_start_idx |
2 | 2 | u2le | vertex_end_idx |
4 | 2 | u2le | flags |
6 | 2 | u2le | line_type |
8 | 2 | u2le | sector_tag |
10 | 2 | u2le | sidedef_right_idx |
12 | 2 | u2le | sidedef_left_idx |
>];
}
subgraph cluster__pnames {
label="DoomWad::Pnames";
graph[style=dotted];
pnames__seq [label=<
pos | size | type | id |
0 | 4 | u4le | num_patches |
4 | 8 | str(ASCII) | names |
repeat num_patches times |
>];
}
subgraph cluster__thing {
label="DoomWad::Thing";
graph[style=dotted];
thing__seq [label=<
pos | size | type | id |
0 | 2 | s2le | x |
2 | 2 | s2le | y |
4 | 2 | u2le | angle |
6 | 2 | u2le | type |
8 | 2 | u2le | flags |
>];
}
subgraph cluster__sector {
label="DoomWad::Sector";
graph[style=dotted];
sector__seq [label=<
pos | size | type | id |
0 | 2 | s2le | floor_z |
2 | 2 | s2le | ceil_z |
4 | 8 | str(ASCII) | floor_flat |
12 | 8 | str(ASCII) | ceil_flat |
20 | 2 | s2le | light |
22 | 2 | u2le→SpecialSector | special_type |
24 | 2 | u2le | tag |
>];
}
subgraph cluster__vertexes {
label="DoomWad::Vertexes";
graph[style=dotted];
vertexes__seq [label=<
pos | size | type | id |
0 | 4 | Vertex | entries |
repeat to end of stream |
>];
}
subgraph cluster__sidedef {
label="DoomWad::Sidedef";
graph[style=dotted];
sidedef__seq [label=<
pos | size | type | id |
0 | 2 | s2le | offset_x |
2 | 2 | s2le | offset_y |
4 | 8 | str(ASCII) | upper_texture_name |
12 | 8 | str(ASCII) | lower_texture_name |
20 | 8 | str(ASCII) | normal_texture_name |
28 | 2 | s2le | sector_id |
>];
}
subgraph cluster__things {
label="DoomWad::Things";
graph[style=dotted];
things__seq [label=<
pos | size | type | id |
0 | 10 | Thing | entries |
repeat to end of stream |
>];
}
subgraph cluster__linedefs {
label="DoomWad::Linedefs";
graph[style=dotted];
linedefs__seq [label=<
pos | size | type | id |
0 | 14 | Linedef | entries |
repeat to end of stream |
>];
}
subgraph cluster__index_entry {
label="DoomWad::IndexEntry";
graph[style=dotted];
index_entry__seq [label=<
pos | size | type | id |
0 | 4 | s4le | offset |
4 | 4 | s4le | size |
8 | 8 | str(ASCII) | name |
>];
index_entry__inst__contents [label=<
pos | size | type | id |
offset | ... | switch (name) | contents |
>];
index_entry__inst__contents_contents_switch [label=<
case | type |
"SECTORS" | Sectors |
"TEXTURE1" | Texture12 |
"VERTEXES" | Vertexes |
"BLOCKMAP" | Blockmap |
"PNAMES" | Pnames |
"TEXTURE2" | Texture12 |
"THINGS" | Things |
"LINEDEFS" | Linedefs |
"SIDEDEFS" | Sidedefs |
>];
}
subgraph cluster__sidedefs {
label="DoomWad::Sidedefs";
graph[style=dotted];
sidedefs__seq [label=<
pos | size | type | id |
0 | 30 | Sidedef | entries |
repeat to end of stream |
>];
}
subgraph cluster__blockmap {
label="DoomWad::Blockmap";
graph[style=dotted];
blockmap__seq [label=<
pos | size | type | id |
0 | 2 | s2le | origin_x |
2 | 2 | s2le | origin_y |
4 | 2 | s2le | num_cols |
6 | 2 | s2le | num_rows |
8 | 2 | Blocklist | linedefs_in_block |
repeat (num_cols * num_rows) times |
>];
subgraph cluster__blocklist {
label="DoomWad::Blockmap::Blocklist";
graph[style=dotted];
blocklist__seq [label=<
pos | size | type | id |
0 | 2 | u2le | offset |
>];
blocklist__inst__linedefs [label=<
pos | size | type | id |
(offset * 2) | 2 | s2le | linedefs |
repeat until _ == -1 |
>];
}
}
}
doom_wad__seq:index_offset_type -> doom_wad__inst__index:index_pos [color="#404040"];
doom_wad__inst__index:index_type -> index_entry__seq [style=bold];
doom_wad__seq:num_index_entries_type -> doom_wad__inst__index:index__repeat [color="#404040"];
sectors__seq:entries_type -> sector__seq [style=bold];
texture12__seq:textures_type -> texture_index__seq [style=bold];
texture12__seq:num_textures_type -> texture12__seq:textures__repeat [color="#404040"];
texture_index__seq:offset_type -> texture_index__inst__body:body_pos [color="#404040"];
texture_index__inst__body:body_type -> texture_body__seq [style=bold];
texture_body__seq:patches_type -> patch__seq [style=bold];
texture_body__seq:num_patches_type -> texture_body__seq:patches__repeat [color="#404040"];
pnames__seq:num_patches_type -> pnames__seq:names__repeat [color="#404040"];
vertexes__seq:entries_type -> vertex__seq [style=bold];
things__seq:entries_type -> thing__seq [style=bold];
linedefs__seq:entries_type -> linedef__seq [style=bold];
index_entry__seq:offset_type -> index_entry__inst__contents:contents_pos [color="#404040"];
index_entry__inst__contents:contents_type -> index_entry__inst__contents_contents_switch [style=bold];
index_entry__inst__contents_contents_switch:case0 -> sectors__seq [style=bold];
index_entry__inst__contents_contents_switch:case1 -> texture12__seq [style=bold];
index_entry__inst__contents_contents_switch:case2 -> vertexes__seq [style=bold];
index_entry__inst__contents_contents_switch:case3 -> blockmap__seq [style=bold];
index_entry__inst__contents_contents_switch:case4 -> pnames__seq [style=bold];
index_entry__inst__contents_contents_switch:case5 -> texture12__seq [style=bold];
index_entry__inst__contents_contents_switch:case6 -> things__seq [style=bold];
index_entry__inst__contents_contents_switch:case7 -> linedefs__seq [style=bold];
index_entry__inst__contents_contents_switch:case8 -> sidedefs__seq [style=bold];
index_entry__seq:name_type -> index_entry__inst__contents:contents_type [color="#404040"];
sidedefs__seq:entries_type -> sidedef__seq [style=bold];
blockmap__seq:linedefs_in_block_type -> blocklist__seq [style=bold];
blockmap__seq:num_cols_type -> blockmap__seq:linedefs_in_block__repeat [color="#404040"];
blockmap__seq:num_rows_type -> blockmap__seq:linedefs_in_block__repeat [color="#404040"];
blocklist__seq:offset_type -> blocklist__inst__linedefs:linedefs_pos [color="#404040"];
}