+ /* gameplay */
+ struct respawn_point
+ {
+ v3f co;
+ v4f q;
+ char name[32];
+ }
+ spawns[32];
+ u32 spawn_count;
+
+ struct subworld_routes
+ {
+ struct route_node
+ {
+ v3f co, right, up, h;
+ u32 next[2];
+
+ u32 special_type, special_id, current_refs, ref_count;
+ u32 route_ids[4]; /* Gates can be linked into up to four routes */
+ }
+ *nodes;
+
+ u32 node_count,
+ node_cap;
+
+ struct route
+ {
+ u32 track_id;
+ v4f colour;
+
+ u32 start;
+ mdl_submesh sm;
+
+ int active;
+ float factive;
+
+ double best_lap, latest_pass; /* Session */
+
+ struct
+ {
+ GLuint vao, vbo, ebo;
+
+ u32 indices_head;
+ u32 vertex_head;
+
+ float last_notch;
+
+ struct route_ui_segment
+ {
+ float length;
+ u32 vertex_start, vertex_count,
+ index_start, index_count, notches;
+ }
+ segments[k_max_ui_segments];
+
+ u32 segment_start, segment_count, fade_start, fade_count;
+ double fade_timer_start;
+ float xpos;
+ }
+ ui;
+
+ m4x3f scoreboard_transform;
+ }
+ *routes;
+
+ double last_interaction;
+
+ u32 route_count,
+ route_cap;
+
+ struct route_gate
+ {
+ teleport_gate gate;
+
+ u32 node_id;
+
+ struct route_timing
+ {
+ u32 version; /* Incremented on every teleport */
+ double time;
+ }
+ timing;
+ }
+ *gates;
+
+ struct route_collector
+ {
+ struct route_timing timing;
+ }
+ *collectors;
+
+ u32 gate_count,
+ gate_cap,
+ collector_count,
+ collector_cap;
+
+ u32 active_gate,
+ current_run_version;
+
+ scene scene_lines;
+ }
+ routes;
+
+ struct subworld_sfd
+ {
+ scene mesh;
+ mdl_submesh *sm_module, *sm_card;
+ glmesh temp;
+
+ struct sfd_instance
+ {
+ float *buffer;
+
+ u32 w,h;
+ }
+ tester;
+ }
+ sfd;
+
+ /* Paths */
+ traffic_node traffic[128];
+ u32 traffic_count;
+
+#if 0
+ traffic_driver van_man[6];
+#endif
+
+ /* Physics */
+
+ /* Rendering & geometry */