Update spawn map to new UI
[carveJwlIkooP6JGAAIwe30JlM.git] / menu.h
diff --git a/menu.h b/menu.h
index b407f4a6477d50147ce9ddee2b73b74c6055b751..8e658dcabc73847ac767e57c0c1857251fa7e544 100644 (file)
--- a/menu.h
+++ b/menu.h
-#ifndef MENU_H
-#define MENU_H
+#pragma once
 
-#include "common.h"
-#include "model.h"
-#include "world_render.h"
-#include "player.h"
+#define MENU_STACK_SIZE 8
 
-#include "shaders/menu.h"
+#include "vg/vg_engine.h"
+#include "entity.h"
 
-VG_STATIC mdl_context menu_model;
-VG_STATIC glmesh      menu_glmesh;
-VG_STATIC m4x3f       menu_mdl_mtx;
-VG_STATIC float       menu_opacity = 0.0f;
-VG_STATIC float       menu_input_cooldown = 0.0f;
-VG_STATIC float       menu_fov_target = 97.0f;
-VG_STATIC v2f         menu_extra_angles;
-
-VG_STATIC int         menu_loc = 0xb,
-                      menu_loc_last = 1;
-VG_STATIC u32         menu_page     = 0;
-
-VG_STATIC int         cl_menu         = 0,
-                      cl_menu_go_away = 0;
-
-VG_STATIC const char *playermodels[] = { "ch_new", "ch_jordan", "ch_outlaw" };
-
-vg_tex2d tex_menu = { .path = "textures/menu.qoi",.flags = VG_TEXTURE_NEAREST };
-
-VG_STATIC void menu_btn_paused( int event );
-VG_STATIC void menu_btn_quit( int event );
-VG_STATIC void menu_btn_skater( int event );
-VG_STATIC void menu_btn_map( int event );
-VG_STATIC void menu_btn_map_a( int event );
-VG_STATIC void menu_btn_map_b( int event );
-VG_STATIC void menu_btn_map_c( int event );
-VG_STATIC void menu_btn_fuckoff( int event );
-VG_STATIC void menu_btn_reset( int event );
-
-struct menu_button
+enum menu_page
 {
-   const char *name;
-   u32 areas;
-
-   void (*fn_press)(int event);
-   int links[4];
-   mdl_node *pnode;
-
-   float falpha, fsize;
-}
-VG_STATIC menu_buttons[] = 
-{
-/*0*/{"text_paused",     1, menu_btn_paused },
-/*1*/{"text_quit",       9, menu_btn_quit,    {3,-1,4,0xb}},
-/*2*/{"text_skater",     3, menu_btn_skater,  {3,0xb,4,-1}},
-/*3*/{"text_map",        5, NULL, {-1,-1,2,-1}},
-/*4*/{"text_about_game", 1, NULL, {2,-1,-1,-1}},
-/*5*/{"skater_left",     2, NULL, {-1,-1,-1,-1}},
-/*6*/{"skater_right",    2, NULL, {-1,-1,-1,-1}},
-/*7*/{"g_map",           5, NULL },
-/*8*/{"g_controls",      1, NULL },
-/*9*/{"text_quitty",     8, NULL },
-/*a*/{"text_yes",        8, menu_btn_fuckoff,{-1,-1,-1,-1} },
-/*b*/{"text_reset",      1, menu_btn_reset,{3,1,4,2} },
+   k_menu_page_any,
+   k_menu_page_starter,
+   k_menu_page_premium,
+   k_menu_page_main
 };
 
-VG_STATIC void menu_btn_map_a( int event ){}
-VG_STATIC void menu_btn_map_b( int event ){}
-VG_STATIC void menu_btn_map_c( int event ){}
-
-VG_STATIC void menu_btn_paused( int event )
-{
-
-}
-
-VG_STATIC void menu_btn_reset( int event )
-{
-   reset_player(0,NULL);
-   world_routes_clear();
-
-   cl_menu_go_away = 1;
-   menu_page = 0;
-}
-
-VG_STATIC void menu_btn_fuckoff( int event )
-{
-   glfwSetWindowShouldClose( vg.window, 1 );
-}
-
-VG_STATIC void menu_btn_quit( int event )
-{
-   menu_page = 0x8;
-   menu_loc = 0xa;
-}
-
-VG_STATIC void menu_btn_map( int event )
-{
-   menu_page = 0x4;
-   menu_loc = 7;
-}
-
-VG_STATIC void menu_btn_skater( int event )
-{
-   menu_page = 0x2;
-}
-
-VG_STATIC void menu_init(void)
-{
-   vg_linear_clear( vg_mem.scratch );
-
-   mdl_open( &menu_model, "models/rs_menu.mdl" );
-   mdl_load_metadata( &menu_model, vg_mem.rtmemory );
-   mdl_load_mesh_data( &menu_model, vg_mem.scratch );
-   mdl_close( &menu_model );
-
-   vg_acquire_thread_sync();
-   {
-      mdl_unpack_glmesh( &menu_model, &menu_glmesh );
-      vg_tex2d_init( (vg_tex2d *[]){ &tex_menu }, 1 );
-   }
-   vg_release_thread_sync();
-
-   for( int i=0; i<vg_list_size(menu_buttons); i++ )
-   {
-      struct menu_button *btn = &menu_buttons[i];
-      btn->pnode = mdl_node_from_name( &menu_model, btn->name );
-
-      if( !btn->pnode )
-         vg_fatal_exit_loop( "Menu programming error" );
-   }
-
-   shader_menu_register();
-}
-
-VG_STATIC void menu_run_directional(void)
-{
-   struct menu_button *btn = &menu_buttons[ menu_loc ];
-
-   if( vg_get_button_down( "jump" ) )
-   {
-      if( btn->fn_press )
-      {
-         audio_lock();
-         audio_play_oneshot( &audio_ui[0], 1.0f );
-         audio_unlock();
-
-         btn->fn_press( 1 );
-         return;
-      }
-   }
-
-   if( menu_input_cooldown <= 0.0f )
-   {
-      v2f dir = { vg_get_axis( "lookh" ), vg_get_axis( "lookv" ) };
-
-      if( v2_length2( dir ) > 0.8f*0.8f )
-      {
-         int idir = 0;
-
-         if( fabsf(dir[0]) > fabsf(dir[1]) )
-         {
-            if( dir[0] > 0.0f ) idir = 2;
-            else idir = 0;
-         }
-         else
-         {
-            if( dir[1] > 0.0f ) idir = 3;
-            else idir = 1;
-         }
-
-         int link = btn->links[idir];
-
-         if( link != -1 )
-         {
-            menu_loc_last = menu_loc;
-            menu_loc = link;
-            menu_input_cooldown = 0.25f;
-         }
-      }
-   }
-}
-
-VG_STATIC int menu_page_should_backout(void)
-{
-   return vg_get_button_down( "break" );
-}
-
-VG_STATIC void menu_close(void)
-{
-   cl_menu_go_away = 1;
-   menu_page = 0;
-}
-
-VG_STATIC void menu_page_main(void)
-{
-   if( menu_page_should_backout() )
-   {
-      menu_close();
-      return;
-   }
-
-   menu_fov_target = 112.0f;
-   menu_run_directional();
-}
-
-VG_STATIC void menu_page_map(void)
+struct global_menu
 {
-   if( menu_page_should_backout() )
-   {
-      menu_page = 1;
-      menu_loc = 3;
-   }
+   int disable_open;
+   i32 skip_starter;
+   enum menu_page page;
 
-   menu_fov_target = 80.0f;
-   menu_run_directional();
-}
+   i32 main_index;
 
-VG_STATIC void menu_page_quit(void)
-{
-   if( menu_page_should_backout() )
+   enum menu_input_mode
    {
-      menu_page = 1;
-      menu_loc = 1;
+      k_menu_input_mode_keys,
+      k_menu_input_mode_mouse
    }
+   input_mode;
+   f32 mouse_dist;  /* used for waking up mouse */
 
-   menu_fov_target = 90.0f;
-   menu_run_directional();
-}
-
-VG_STATIC void menu_page_skater(void)
-{
-   float h = vg_get_axis( "lookh" );
-   menu_fov_target = 97.0f;
-
-   if( menu_page_should_backout() )
-   {
-      menu_page = 1;
-      menu_loc = 2;
-      return;
-   }
-
-   if( (fabsf(h) > 0.7f) && (menu_input_cooldown <= 0.0f) )
-   {
-      audio_lock();
-      audio_play_oneshot( &audio_rewind[4], 1.0f );
-      audio_unlock();
-
-      if( h < 0.0f )
-      {
-         cl_playermdl_id --;
-         if( cl_playermdl_id < 0 )
-            cl_playermdl_id = 2;
-
-         menu_buttons[5].fsize = 0.4f;
-         menu_buttons[5].falpha = 1.0f;
-
-         menu_input_cooldown = 0.25f;
-      }
-      else
-      {
-         cl_playermdl_id ++;
-         if( cl_playermdl_id > 2 )
-            cl_playermdl_id = 0;
-         
-         menu_buttons[6].fsize = 0.4f;
-         menu_buttons[6].falpha = 1.0f;
-
-         menu_input_cooldown = 0.25f;
-      }
-   }
+   f32 repeater;
 }
+extern menu;
 
-VG_STATIC void menu_update(void)
-{
-   if( vg_get_button_down( "menu" ) )
-   {
-      if( cl_menu )
-      {
-         cl_menu_go_away = 1;
-         menu_page = 0;
-      }
-      else
-      {
-         cl_menu = 1;
-         menu_page = 1;
-      }
-   }
-
-   if( menu_page == 1 )
-      menu_page_main();
-   else if( menu_page == 2 )
-      menu_page_skater();
-   else if( menu_page == 4 )
-      menu_page_map();
-   else if( menu_page == 8 )
-      menu_page_quit();
-
-   struct menu_button *btn = &menu_buttons[ menu_loc ];
-
-   v3f pos;
-   v2f angles;
-
-   /* Base */
-   {
-      v3f lookdir;
-      v3f *mtx = player.mdl.sk.final_mtx[player.mdl.id_head];
-      m3x3_mulv( mtx, (v3f){-1.0f,0.0f,0.0f}, lookdir );
-
-      lookdir[1] = 0.0f;
-      v3_normalize( lookdir );
-
-      v3f center_rough;
-
-      if( player.is_dead )
-      {
-         v3_copy(player.mdl.ragdoll[ player.mdl.id_hip-1 ].rb.co, center_rough);
-      }
-      else
-      {
-         v3_add( player.camera_pos, player.visual_transform[3], center_rough );
-         v3_muls( center_rough, 0.5f, center_rough );
-      }
-
-      v3_muladds( center_rough, lookdir, 1.5f, pos );
-      v3_add( (v3f){ 0.0f,0.8f,0.0f}, pos, pos );
-
-      angles[1] = 0.0f;
-      angles[0] = -atan2f( lookdir[0], lookdir[2] );
-
-      /* setup model matrix */
-      v4f qmenu_mdl;
-      q_axis_angle( qmenu_mdl, (v3f){0.0f,1.0f,0.0f}, -angles[0] );
-
-      q_m3x3( qmenu_mdl, menu_mdl_mtx );
-      v3_copy( center_rough, menu_mdl_mtx[3] );
-   }
-
-   /* Extra */
-   {
-      v3f delta;
-      v3_sub( btn->pnode->co, (v3f){ 0.0f,1.5f,-1.5f }, delta );
-      v3_normalize( delta );
-
-      float y = atan2f( delta[0], delta[2] ),
-            p = -sinf(delta[1]),
-            dt = vg.frame_delta;
-
-      menu_extra_angles[0] = vg_lerpf( menu_extra_angles[0], y, dt );
-      menu_extra_angles[1] = vg_lerpf( menu_extra_angles[1], p, dt );
-
-      v2_muladds( angles, menu_extra_angles, 0.8f, angles );
-      angles[0] = fmodf( angles[0], VG_TAUf );
-   }
-   
-   /* Update camera */
-   {
-      camera_angles[0] = vg_alerpf( camera_angles[0], angles[0], menu_opacity );
-      camera_angles[1] = vg_lerpf ( camera_angles[1], angles[1], menu_opacity );
-      v3_lerp( camera_pos, pos, menu_opacity, camera_pos );
-      camera_update();
-   }
+void menu_init(void);
+void menu_at_begin(void);
+void menu_gui(void);
+void menu_open( enum menu_page page );
+bool menu_viewing_map(void);
 
-   float dt = vg.frame_delta * 6.0f;
-   menu_opacity = vg_lerpf( menu_opacity, cl_menu&&!cl_menu_go_away, dt );
-
-   if( menu_opacity <= 0.01f )
-   {
-      cl_menu = 0;
-      cl_menu_go_away = 0;
-   }
-
-   vg.time_rate = 1.0-(double)menu_opacity;
-
-   if( cl_menu )
-   {
-      menu_input_cooldown -= vg.frame_delta;
-   }
-}
+#if 0
+#define MENU_STACK_SIZE 8
 
-/* https://iquilezles.org/articles/functions/ */
-float expSustainedImpulse( float x, float f, float k )
-{
-    float s = fmaxf(x-f,0.0f);
-    return fminf( x*x/(f*f), 1.0f+(2.0f/f)*s*expf(-k*s));
-}
+#include "vg/vg_engine.h"
+#include "entity.h"
 
-VG_STATIC void menu_render( m4x4f projection )
+struct global_menu
 {
-   glEnable(GL_BLEND);
-   glDisable(GL_DEPTH_TEST);
-   glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA );
-   glBlendEquation(GL_FUNC_ADD);
-
-   shader_fscolour_use();
-   shader_fscolour_uColour( (v4f){ 0.1f, 0.1f, 0.3f, menu_opacity*0.5f } );
-   render_fsquad();
-
-   glEnable( GL_DEPTH_TEST );
-   glDisable( GL_BLEND );
-
-   m4x3f mtx;
-   
-   shader_menu_use();
-   shader_menu_uColour( (v4f){ 1.0f,1.0f,1.0f,1.0f} );
-   shader_menu_uTexMain( 1 );
-   vg_tex2d_bind( &tex_menu, 1 );
-
-   shader_menu_uPv( projection );
-   mesh_bind( &menu_glmesh );
-
-   for( int i=0; i<vg_list_size(menu_buttons); i++ )
-   {
-      struct menu_button *btn = &menu_buttons[i];
-      float talpha = i==menu_loc? 1.0f: 0.0f,
-            tsize0 = btn->areas & menu_page? 1.0f: 0.0f,
-            tsize1 = i==menu_loc? 0.07f: 0.0f,
-            tsize  = tsize0+tsize1;
+   int credits_open;
+   int disable_open;
+   i32 skip_starter;
 
-      btn->falpha = vg_lerpf( btn->falpha, talpha, vg.frame_delta * 14.0f );
-      btn->fsize  = vg_lerpf( btn->fsize,  tsize,  vg.frame_delta * 3.0f  );
+   u32 page, /* current page index */
+       page_depth,
+       controls_page_id;
 
-      /* Colour */
-      v4f vselected = {0.95f*1.3f,0.45f*1.3f,0.095f*1.3f, 1.0f},
-          vnormal   = {1.0f,1.0f,1.0f, 1.0f},
-          vcurrent;
+   ent_menuitem *ctr_kbm,
+                *ctr_deck,
+                *ctr_ps,
+                *ctr_steam,
+                *ctr_xbox;
+   f32 slider_offset;
 
-      v4_lerp( vnormal, vselected, btn->falpha, vcurrent );
-      shader_menu_uColour( vcurrent );
-
-      /* Create matrix */
-      m4x3f mtx_size;
-      mdl_node_transform( btn->pnode, mtx );
-      m4x3_mul( menu_mdl_mtx, mtx, mtx );
-      m4x3_identity( mtx_size );
-      m4x3_scale( mtx_size, expSustainedImpulse( btn->fsize, 0.5f, 8.7f) );
-      m4x3_mul( mtx, mtx_size, mtx );
-      shader_menu_uMdl( mtx );
-
-      for( int j=0; j<btn->pnode->submesh_count; j++ )
-      {
-         mdl_submesh *sm = 
-            &menu_model.submesh_buffer[ btn->pnode->submesh_start+j ];
-         mdl_draw_submesh( sm );
-      }
+   struct page_stack_frame {
+      u32 page;
+      ent_menuitem *loc;
+      ent_camera *cam;
    }
+   page_stack[ MENU_STACK_SIZE ];
    
-   /*
-   for( int i=0; i<menu_model->node_count; i++ )
-   {
-      mdl_node *pnode = mdl_node_from_id( menu_model, i );
-      
-      for( int j=0; j<pnode->submesh_count; j++ )
-      {
-         mdl_submesh *sm = 
-            mdl_submesh_from_id( menu_model, pnode->submesh_start+j );
-
-         mdl_node_transform( pnode, mtx );
-         m4x3_mul( menu_mdl_mtx, mtx, mtx );
-         shader_menu_uMdl( mtx );
-
-         mdl_draw_submesh( sm );
-      }
-   }
-   */
-}
-
-#endif /* MENU_H */
+   ent_menuitem *loc;
+   ent_camera   *cam;
+   vg_camera     view;
+
+   mdl_context model;
+   GLuint *textures;
+   glmesh mesh;
+
+   mdl_array_ptr items, markers, cameras;
+}
+extern menu;
+void menu_close(void);
+void menu_open_page( const char *name, 
+                     enum ent_menuitem_stack_behaviour stackmode );
+void menu_link(void);
+void menu_render(void);
+#endif