- /* 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();
- }
-
- 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;
- }
-}
-
-/* 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));
-}
-
-static void menu_render( m4x4f projection )
-{
- 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_graffiti, 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;
-
- btn->falpha = vg_lerpf( btn->falpha, talpha, vg.frame_delta * 14.0f );
- btn->fsize = vg_lerpf( btn->fsize, tsize, vg.frame_delta * 3.0f );
-
- /* 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;
-
- 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 =
- mdl_submesh_from_id( menu_model, btn->pnode->submesh_start+j );
- mdl_draw_submesh( sm );
- }
- }
-
- /*
- 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 );
- }
- }
- */
-}
-
-static void menu_free(void *_)
-{
- mesh_free( &menu_glmesh );
-}
-
-#endif /* MENU_H */