+ * instance_cache;
+ u32 instance_cache_count,
+ instance_cache_cap;
+
+ v3f render_gate_pos;
+ int active_route_board;
+}
+world;
+
+/*
+ * API
+ */
+
+static int ray_hit_is_ramp( ray_hit *hit );
+static int ray_hit_is_terrain( ray_hit *hit );
+static void ray_world_get_tri( ray_hit *hit, v3f tri[3] );
+static int ray_world( v3f pos, v3f dir, ray_hit *hit );
+
+/*
+ * Submodules
+ */
+#include "world_routes.h"
+#include "world_sfd.h"
+#include "world_audio.h"
+#include "world_render.h"
+#include "world_water.h"
+#include "world_gen.h"
+
+/*
+ * -----------------------------------------------------------------------------
+ * Events
+ * -----------------------------------------------------------------------------
+ */
+static void world_register(void)
+{
+ shader_terrain_register();
+ shader_sky_register();
+ shader_planeinf_register();
+ shader_gpos_register();
+ shader_fscolour_register();
+ shader_alphatest_register();
+
+ world_routes_register();
+ world_sfd_register();
+ world_water_register();
+}
+
+static void world_free(void)
+{
+ /* TODO.. */
+
+ world_sfd_free();
+}
+
+
+static void world_init(void)
+{
+ mdl_header *mcars = mdl_load( "models/rs_cars.mdl" );
+ mdl_unpack_glmesh( mcars, &world.cars );
+ mdl_node *nholden = mdl_node_from_name( mcars, "holden" );
+ world.car_holden = *mdl_node_submesh( mcars, nholden, 0 );
+ free(mcars);