update helpers/location to 'frosted' ui
[carveJwlIkooP6JGAAIwe30JlM.git] / world.h
diff --git a/world.h b/world.h
index 49c030ea37260f7945311ee69e4a9db447882f9d..efa5f9d0e8b54b8e308a7e8a095c2e364bdd9d73 100644 (file)
--- a/world.h
+++ b/world.h
@@ -1,11 +1,12 @@
 /*
- * Copyright (C) 2021-2023 Mt.ZERO Software, Harry Godden - All Rights Reserved
+ * Copyright (C) 2021-2024 Mt.ZERO Software, Harry Godden - All Rights Reserved
  */
 
-#ifndef WORLD_H
-#define WORLD_H
-
+#pragma once
 #include "render.h"
+#include "network_msg.h"
+#include "addon.h"
+#include "scene.h"
 
 /* types
  */
@@ -16,14 +17,29 @@ enum world_geo_type{
    k_world_geo_type_water = 2
 };
 
+enum world_purpose{
+   k_world_purpose_invalid = -1,
+   k_world_purpose_hub = 0,
+   k_world_purpose_client = 1,
+   k_world_max
+};
+
+struct leaderboard_cache {
+   enum request_status status;
+   f64 cache_time;
+   u8 *data;
+   u32 data_len;
+};
+
 typedef struct world_instance world_instance;
 
+void skaterift_world_get_save_path( enum world_purpose which, char buf[128] );
+
 /* submodule headers */
 #include "world_entity.h"
 #include "world_gate.h"
 #include "world_gen.h"
 #include "world_info.h"
-#include "world_load.h"
 #include "world_physics.h"
 #include "world_render.h"
 #include "world_sfd.h"
@@ -31,20 +47,26 @@ typedef struct world_instance world_instance;
 #include "world_water.h"
 #include "world_audio.h"
 #include "world_routes.h"
+#include "world_routes_ui.h"
 
 /* console variables */
 
 static f32   k_day_length            = 30.0f; /* minutes */
 static i32   k_debug_light_indices   = 0,
              k_debug_light_complexity= 0,
-             k_light_preview         = 0;
+             k_light_preview         = 0,
+             k_light_editor          = 0;
 
+#define WORLD_SURFACE_HAS_TRAFFIC 0x1
+#define WORLD_SURFACE_HAS_PROPS   0x2
 
 struct world_instance {
    /* Fixed items
     * -------------------------------------------------------
     */
 
+   v4f player_co;
+
    void *heap;
    enum world_status{
       k_world_status_unloaded = 0,
@@ -65,6 +87,7 @@ struct world_instance {
    water;
 
    f64 time;
+   f32 tar_min, tar_max;
 
    /* STD140 */
    struct ub_world_lighting{
@@ -133,6 +156,8 @@ struct world_instance {
       mdl_material info;
       mdl_submesh sm_geo,
                   sm_no_collide;
+      u32 flags;
+      u32 alpha_tex;
    }
    * surfaces;
    u32 surface_count;
@@ -156,7 +181,20 @@ struct world_instance {
                  ent_camera,
                  ent_swspreview,
                  ent_ccmd,
-                 ent_challenge;
+                 ent_objective,
+                 ent_challenge,
+                 ent_relay,
+                 ent_cubemap,
+                 ent_miniworld,
+                 ent_prop,
+                 ent_region,
+                 ent_glider,
+                 ent_npc;
+
+   enum skybox {
+      k_skybox_default,
+      k_skybox_space
+   } skybox;
 
    ent_gate *rendering_gate;
 
@@ -177,13 +215,14 @@ struct world_instance {
    /* graphics */
    glmesh mesh_route_lines;
    glmesh mesh_geo, 
-          mesh_no_collide,
-          mesh_water;
+          mesh_no_collide;
+   u32 cubemap_cooldown, cubemap_side;
 
-   rb_object rb_geo;
+   /* leaderboards */
+   struct leaderboard_cache *leaderboard_cache;
 
-   ent_challenge *challenge_target;
-   f32 challenge_timer;
+   /* ui */
+   struct route_ui *routes_ui;
 };
 
 struct world_static {
@@ -199,12 +238,37 @@ struct world_static {
    u32 active_trigger_volumes[8];
    u32 active_trigger_volume_count;
 
-   world_instance worlds[4];
-   i32            active_world;
+   addon_reg *instance_addons[ k_world_max ];
+   world_instance instances[ k_world_max ];
+
+   enum world_purpose active_instance;
+   u32            focused_entity; /* like skateshop, challenge.. */
+   f32            focus_strength;
+   vg_camera      focus_cam;
+
+   /* challenges */
+   ent_objective *challenge_target;
+   f32 challenge_timer;
+
+   enum world_loader_state{
+      k_world_loader_none,
+      k_world_loader_preload,
+      k_world_loader_load
+   }
+   load_state;
+
+   bool clear_async_op_when_done;
 }
-static world_static;
+extern world_static;
 
-static void world_init(void);
-static world_instance *world_current_instance(void);
+struct world_load_args 
+{
+   enum world_purpose purpose;
+   addon_reg *reg;
+};
 
-#endif /* WORLD_H */
+void world_init(void);
+world_instance *world_current_instance(void);
+void world_switch_instance( u32 index );
+void skaterift_world_load_thread( void *_args );
+void world_update( world_instance *world, v3f pos );