+ k_logic_type_relay = 1,
+ k_logic_type_chance = 2,
+ k_logic_type_achievement = 3
+};
+
+enum geo_type
+{
+ k_geo_type_solid = 0,
+ k_geo_type_nonsolid = 1,
+ k_geo_type_water = 2
+};
+
+struct world_instance
+{
+ /* This is a small flag we use to changelevel.
+ * It will not be cleared until all sounds stop playing
+ */
+
+ /* Fixed items
+ * -------------------------------------------------------
+ */
+
+ char world_name[ 64 ];
+
+ struct
+ {
+ boxf depthbounds;
+ int depth_computed;
+
+ float height;
+ int enabled;
+ v4f plane;
+ }
+ water;
+
+ /* STD140 */
+ struct ub_world_lighting
+ {
+ /* v3f (padded) */
+ v4f g_light_colours[3],
+ g_light_directions[3],
+ g_ambient_colour;
+
+ v4f g_water_plane,
+ g_depth_bounds;
+
+ float g_water_fog;
+ int g_light_count;
+ int g_light_preview;
+ int g_shadow_samples;
+
+ v4f g_point_light_positions[32];
+ v4f g_point_light_colours[32];
+ }
+ ub_lighting;
+ GLuint ubo_lighting;
+ int ubo_bind_point;
+
+ struct framebuffer heightmap;
+
+ /*
+ * Dynamically allocated when world_load is called.
+ *
+ * the following arrays index somewhere into this linear
+ * allocator
+ *
+ * (world_gen.h)
+ * --------------------------------------------------------------------------
+ */
+ /*
+ * Main world .mdl
+ */
+ mdl_context *meta;
+
+ /*
+ * Materials / textures
+ */
+
+ GLuint *textures;
+ u32 texture_count;
+
+ struct world_material
+ {
+ mdl_material info;
+ mdl_submesh sm_geo,
+ sm_no_collide;
+ }
+ * materials;
+ u32 material_count;
+
+ /*
+ * Named safe places to respawn
+ */
+ struct respawn_point
+ {
+ v3f co;
+ v4f q;
+ const char *name;
+ }
+ * spawns;
+ u32 spawn_count;
+
+ /*
+ * Audio player entities
+ */
+ struct world_audio_thing
+ {
+ v3f pos;
+ float volume;
+ u32 flags;
+
+ audio_player player;
+ audio_clip temp_embedded_clip;
+ }
+ * audio_things;
+ u32 audio_things_count;
+
+ /*
+ * Relays
+ */
+ struct logic_relay
+ {
+ v3f pos;
+
+ struct relay_target
+ {
+ u32 sub_id;
+ enum classtype classtype;
+ }
+ targets[4];
+ u32 target_count;
+ }
+ * logic_relays;
+ u32 relay_count;
+
+ /*
+ * Box trigger entities
+ */
+ struct trigger_zone
+ {
+ m4x3f transform, inv_transform;
+
+ struct relay_target target;
+ }
+ * triggers;
+ u32 trigger_count;