render fix, menu
authorhgn <hgodden00@gmail.com>
Sat, 13 May 2023 17:29:26 +0000 (18:29 +0100)
committerhgn <hgodden00@gmail.com>
Sat, 13 May 2023 17:29:26 +0000 (18:29 +0100)
blender_export.py
menu.h
skaterift.c
world_routes.h

index ede1106b484ec22db611381473a47cb9cb501395..cb3b9907ea337adc4e3ff9ee6c1c5901d3e2ae90 100644 (file)
@@ -1176,7 +1176,7 @@ def sr_compile_menus( collection ):
 
       if item.type == 1 or item.type == 2:#{
          item_button = item._anonymous_union.button
-         item_button.string = sr_compile_string( obj_data.string )
+         item_button.pstr = sr_compile_string( obj_data.string )
       #}
       elif item.type == 3:#{
          item_checkmark = item._anonymous_union.checkmark
diff --git a/menu.h b/menu.h
index f15b26b76836a105718893d5affc79ceb27ecf07..d41017dd5074ba32ac3ae579d2f7b2990068df49 100644 (file)
--- a/menu.h
+++ b/menu.h
@@ -8,12 +8,16 @@
 #include "conf.h"
 #include "shaders/model_menu.h"
 
+#define MENU_STACK_SIZE 8
+
 struct {
    int active;
    f32 factive;
    int disable_open;
 
-   u32 page; /* current page index */
+   u32 page, /* current page index */
+       page_stack[ MENU_STACK_SIZE ],
+       page_depth;
    ent_menuitem *loc;
    ent_camera   *cam;
    camera        view;
@@ -59,6 +63,8 @@ static void menu_init(void)
 
 static void menu_open_page( const char *name )
 {
+   vg_info( "Try to open %s\n", name );
+
    u32 hash = vg_strdjb2( name );
    for( u32 i=0; i<mdl_arrcount(&menu.items); i++ ){
       ent_menuitem *item = mdl_arritm( &menu.items, i );
@@ -78,23 +84,29 @@ static void menu_open_page( const char *name )
                menu.cam = mdl_arritm( &menu.cameras, id );
             }
 
+            menu.page_stack[ menu.page_depth ++ ] = menu.page;
             return;
          }
       }
    }
 }
 
+static void menu_back_page(void)
+{
+   if( menu.page_depth == 0 ){
+      menu.active = 0;
+   }
+   else{
+      menu.page = menu.page_stack[ -- menu.page_depth ];
+   }
+}
+
 static void menu_update(void)
 {
    if( button_down( k_srbind_mopen ) ){
-      if( menu.active ){
-         menu.active = 0;
-      }
-      else{
-         if( !menu.disable_open ){
-            menu.active = 1;
-            menu_open_page( "Main Menu" );
-         }
+      if( !menu.active && !menu.disable_open ){
+         menu.active = 1;
+         menu_open_page( "Main Menu" );
       }
    }
 
@@ -104,9 +116,68 @@ static void menu_update(void)
    if( menu.factive > 0.01f ){
       
    }
+
+   if( !menu.active ) return;
+   if( !menu.loc ) return;
+   if( !menu.cam ) return;
+
+   int ml = button_down( k_srbind_mleft ),
+       mr = button_down( k_srbind_mright ),
+       mu = button_down( k_srbind_mup ),
+       md = button_down( k_srbind_mdown ),
+       mh = ml-mr,
+       mv = mu-md,
+       enter = button_down( k_srbind_maccept ),
+       escape = button_down( k_srbind_mback );
+   
+   if( escape ){
+      menu_back_page();
+   }
+   else if( enter ){
+      if     ( menu.loc->type == k_ent_menuitem_type_event_button ){
+
+      }
+      else if( menu.loc->type == k_ent_menuitem_type_page_button ){
+         menu_open_page( mdl_pstr( &menu.model, menu.loc->button.pstr ) );
+      }
+      else if( menu.loc->type == k_ent_menuitem_type_toggle ){
+         
+      }
+   }
+   else if( mh||mv ){
+      v3f opt; 
+      v3_zero( opt );
+      f32 best = 0.707f;
+      ent_menuitem *nextpos = NULL;
+
+      opt[0] += mh;
+      opt[2] += mv;
+      mdl_transform_vector( &menu.cam->transform, opt, opt );
+
+      for( u32 i=0; i<4; i++ ){
+         u32 id = menu.loc->id_links[i];
+         if( !id ) continue;
+         u32 index = mdl_entity_id_id( id );
+
+         ent_menuitem *other = mdl_arritm( &menu.items, index );
+         v3f delta;
+         v3_sub( menu.loc->transform.co, other->transform.co, delta );
+         v3_normalize( delta );
+
+         f32 score = v3_dot( delta, opt );
+         if( score > best ){
+            best = score;
+            nextpos = other;
+         }
+      }
+
+      if( nextpos ){
+         menu.loc = nextpos;
+      }
+   }
 }
 
-VG_STATIC void menu_render_bg(void)
+VG_STATIC void menu_render(void)
 {
    glEnable(GL_BLEND);
    glDisable(GL_DEPTH_TEST);
@@ -116,10 +187,7 @@ VG_STATIC void menu_render_bg(void)
    shader_blitcolour_use();
    shader_blitcolour_uColour( (v4f){ 0.1f, 0.1f, 0.3f, menu.factive*0.5f } );
    render_fsquad();
-}
 
-VG_STATIC void menu_render_fg(void)
-{
    glEnable( GL_DEPTH_TEST );
    glDisable( GL_BLEND );
 
@@ -140,7 +208,6 @@ VG_STATIC void menu_render_fg(void)
    else return;
 
    shader_model_menu_use();
-   shader_model_menu_uColour( (v4f){ 1.0f,1.0f,1.0f,1.0f} );
    shader_model_menu_uTexMain( 1 );
    glActiveTexture( GL_TEXTURE1 );
    glBindTexture( GL_TEXTURE_2D, menu.texture );
@@ -155,6 +222,13 @@ VG_STATIC void menu_render_fg(void)
       if(   item->type == k_ent_menuitem_type_page ) continue;
       if( !(item->groups & (0x1 << menu.page)) ) continue;
 
+      if( item == menu.loc ){
+         shader_model_menu_uColour( (v4f){ 0.1f,0.25f,0.9f,1.0f} );
+      }
+      else{
+         shader_model_menu_uColour( (v4f){ 1.0f,1.0f,1.0f,1.0f} );
+      }
+
       m4x3f mmdl;
       mdl_transform_m4x3( &item->transform, mmdl );
       shader_model_menu_uMdl( mmdl );
index 742bd5905150399a50ecf64a30843647938fa890..acb0a2e7af66df6ada950ee5a0df795c011eaf7b 100644 (file)
@@ -353,7 +353,6 @@ VG_STATIC void render_main_game(void)
 
    render_scene();
 
-   if( menu.active ) menu_render_bg();
    glEnable( GL_DEPTH_TEST );
 
    render_player_transparent();
@@ -361,8 +360,10 @@ VG_STATIC void render_main_game(void)
 
    present_view_with_post_processing();
 
-   if( menu.active ) menu_render_fg();
-
+   if( menu.active ){
+      glClear( GL_DEPTH_BUFFER_BIT );
+      menu_render();
+   }
    /* =========== End Frame =========== */
 }
 
@@ -377,6 +378,7 @@ VG_STATIC void vg_render(void)
 
    glViewport( 0,0, vg.window_x, vg.window_y );
    glDisable( GL_DEPTH_TEST );
+   glDisable( GL_BLEND );
 
    glClearColor( 1.0f, 0.0f, 0.0f, 0.0f );
    glClear( GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT );
index 99edf267254b51a9896c28eb4761e7bf7b704a65..1b46a36e205a969746ca88ba744100a05e69a81b 100644 (file)
@@ -890,7 +890,7 @@ VG_STATIC void render_world_routes( world_instance *world, camera *cam,
                              cam, text->transform );
       }
 
-      shader_model_font_uOffset( (v3f){0.0f,0.0f,0.0f} );
+      shader_model_font_uOffset( (v4f){0.0f,0.0f,0.0f,1.0f} );
 
       for( u32 i=0; i<world_global.text_particle_count; i++ ){
          struct text_particle *particle = &world_global.text_particles[i];