Update spawn map to new UI
[carveJwlIkooP6JGAAIwe30JlM.git] / input.h
diff --git a/input.h b/input.h
index c6710f2696809e56b2c05b375cc78eef6b6a09bb..2d4f30ea2c300b4a0b67eea1c9d03ea764de1bc7 100644 (file)
--- a/input.h
+++ b/input.h
@@ -1,22 +1,22 @@
-#ifndef INPUT_H
-#define INPUT_H
-
-#define VG_GAME
-#include "vg/vg.h"
+#pragma once
 #include "vg/vg_platform.h" 
 #include "vg/vg_console.h"
 #include "vg/vg_input.h"
 #include "vg/vg_m.h"
-#include "conf.h"
+#include "font.h"
 
-enum sr_bind{
+enum sr_bind
+{
    k_srbind_jump = 0,
    k_srbind_push,
+   k_srbind_skid,
    k_srbind_trick0,
    k_srbind_trick1,
    k_srbind_trick2,
+   k_srbind_sit,
    k_srbind_use,
    k_srbind_reset,
+   k_srbind_dead_respawn,
    k_srbind_camera,
    k_srbind_mleft, 
    k_srbind_mright, 
@@ -24,29 +24,188 @@ enum sr_bind{
    k_srbind_mdown,
    k_srbind_mback, 
    k_srbind_maccept,
-   k_srbind_max
+   k_srbind_mopen,
+   k_srbind_replay_play,
+   k_srbind_replay_freecam,
+   k_srbind_replay_resume,
+   k_srbind_world_left,
+   k_srbind_world_right,
+   k_srbind_home,
+   k_srbind_lobby,
+   k_srbind_chat,
+   k_srbind_run,
+   
+   k_srbind_miniworld_teleport,
+   k_srbind_miniworld_resume,
+   k_srbind_devbutton,
+   k_srbind_max,
 };
 
-struct {
-   v2f joy_steer,
-       joy_grab,
-       joy_look;
+enum sr_joystick{
+   k_srjoystick_steer = 0,
+   k_srjoystick_grab,
+   k_srjoystick_look,
+   k_srjoystick_max
+};
+
+enum sr_axis{
+   k_sraxis_grab = 0,
+   k_sraxis_mbrowse_h,
+   k_sraxis_mbrowse_v,
+   k_sraxis_replay_h,
+   k_sraxis_skid,
+   k_sraxis_max
+};
+
+
+#define INPUT_BASIC( KB, JS ) \
+   (vg_input_op[]){vg_keyboard, KB, vg_joy_button, JS, vg_end}
+
+static vg_input_op *input_button_list[] = {
+[k_srbind_jump]  = INPUT_BASIC( SDLK_SPACE, SDL_CONTROLLER_BUTTON_A ),
+[k_srbind_push]  = INPUT_BASIC( SDLK_w, SDL_CONTROLLER_BUTTON_B ),
+[k_srbind_trick0] = (vg_input_op[]){
+   vg_mouse, SDL_BUTTON_LEFT,
+   vg_joy_button, SDL_CONTROLLER_BUTTON_A, vg_end
+},
+[k_srbind_trick1] = (vg_input_op[]){
+   vg_mouse, SDL_BUTTON_RIGHT,
+   vg_joy_button, SDL_CONTROLLER_BUTTON_B, vg_end
+},
+[k_srbind_trick2] = (vg_input_op[]){ 
+   vg_mouse, SDL_BUTTON_LEFT, vg_mode_mul, vg_mouse, SDL_BUTTON_RIGHT, 
+   vg_mode_absmax, vg_joy_button, SDL_CONTROLLER_BUTTON_X, vg_end 
+},
+[k_srbind_use]   = INPUT_BASIC( SDLK_e, SDL_CONTROLLER_BUTTON_Y ),
+[k_srbind_reset] = INPUT_BASIC( SDLK_r, SDL_CONTROLLER_BUTTON_DPAD_LEFT ),
+[k_srbind_dead_respawn] =
+   INPUT_BASIC( SDLK_q, SDL_CONTROLLER_BUTTON_DPAD_UP ),
+[k_srbind_camera]= INPUT_BASIC( SDLK_c, SDL_CONTROLLER_BUTTON_DPAD_RIGHT ),
+[k_srbind_mleft] = INPUT_BASIC( SDLK_LEFT, SDL_CONTROLLER_BUTTON_DPAD_LEFT ),
+[k_srbind_mright]= INPUT_BASIC( SDLK_RIGHT, SDL_CONTROLLER_BUTTON_DPAD_RIGHT ),
+[k_srbind_world_left] = 
+                   INPUT_BASIC( SDLK_LEFT, SDL_CONTROLLER_BUTTON_DPAD_LEFT ),
+[k_srbind_world_right] =
+                   INPUT_BASIC( SDLK_RIGHT, SDL_CONTROLLER_BUTTON_DPAD_RIGHT ),
+[k_srbind_home]  = INPUT_BASIC( SDLK_h, SDL_CONTROLLER_BUTTON_Y ),
+[k_srbind_mup]   = INPUT_BASIC( SDLK_UP, SDL_CONTROLLER_BUTTON_DPAD_UP ),
+[k_srbind_mdown] = INPUT_BASIC( SDLK_DOWN, SDL_CONTROLLER_BUTTON_DPAD_DOWN ),
+[k_srbind_mback] = INPUT_BASIC( SDLK_ESCAPE, SDL_CONTROLLER_BUTTON_B ),
+[k_srbind_mopen] = INPUT_BASIC( SDLK_ESCAPE, SDL_CONTROLLER_BUTTON_START ),
+[k_srbind_maccept] = (vg_input_op[]){
+   vg_keyboard, SDLK_e, vg_gui_visible, 0,
+      vg_keyboard, SDLK_RETURN, vg_keyboard, SDLK_RETURN2,
+   vg_gui_visible, 1,
+   vg_joy_button, SDL_CONTROLLER_BUTTON_A, vg_end
+},
+[k_srbind_replay_play]    = INPUT_BASIC( SDLK_g, SDL_CONTROLLER_BUTTON_X ),
+[k_srbind_replay_resume]  = INPUT_BASIC( SDLK_SPACE, SDL_CONTROLLER_BUTTON_A ),
+[k_srbind_replay_freecam] = INPUT_BASIC( SDLK_f, SDL_CONTROLLER_BUTTON_Y ),
+[k_srbind_sit]   = INPUT_BASIC( SDLK_z, SDL_CONTROLLER_BUTTON_B ),
+[k_srbind_lobby] = INPUT_BASIC( SDLK_TAB, SDL_CONTROLLER_BUTTON_DPAD_LEFT ),
+[k_srbind_chat ] = (vg_input_op[]){ vg_keyboard, SDLK_y, vg_end },
+[k_srbind_run ] = (vg_input_op[]){ vg_keyboard, SDLK_LSHIFT, 
+   vg_joy_axis, SDL_CONTROLLER_AXIS_TRIGGERLEFT, vg_end },
+
+[k_srbind_miniworld_resume]  = (vg_input_op[]){
+   vg_keyboard, SDLK_RETURN, vg_gui_visible, 0,
+   vg_keyboard, SDLK_RETURN2,
+   vg_gui_visible, 1,
+   vg_joy_button, SDL_CONTROLLER_BUTTON_X, vg_end
+},
+[k_srbind_miniworld_teleport]= INPUT_BASIC( SDLK_q, 
+                                       SDL_CONTROLLER_BUTTON_LEFTSHOULDER ),
+[k_srbind_skid] = (vg_input_op[]){ vg_keyboard, SDLK_LCTRL, vg_end },
+[k_srbind_devbutton] = (vg_input_op[]){ vg_keyboard, SDLK_3, vg_end },
+[k_srbind_max]=NULL
+};
+
+static vg_input_op *input_axis_list[] = {
+[k_sraxis_grab] = (vg_input_op[]){
+   vg_keyboard, SDLK_LSHIFT, 
+   vg_joy_axis, SDL_CONTROLLER_AXIS_TRIGGERRIGHT, vg_end
+},
+[k_sraxis_mbrowse_h] = (vg_input_op[]){
+   vg_mode_sub, vg_keyboard, SDLK_LEFT,
+   vg_mode_add, vg_keyboard, SDLK_RIGHT,
+   vg_mode_add, vg_joy_axis, SDL_CONTROLLER_AXIS_LEFTX,
+   vg_end
+},
+[k_sraxis_mbrowse_v] = (vg_input_op[]){
+   vg_mode_sub, vg_keyboard, SDLK_DOWN,
+   vg_mode_add, vg_keyboard, SDLK_UP,
+   vg_mode_sub, vg_joy_axis, SDL_CONTROLLER_AXIS_LEFTY,
+   vg_end
+},
+[k_sraxis_replay_h] = (vg_input_op[]){
+   vg_mode_sub, vg_keyboard, SDLK_q,
+   vg_mode_add, vg_keyboard, SDLK_e,
+   vg_mode_sub, vg_joy_axis, SDL_CONTROLLER_AXIS_TRIGGERLEFT,
+   vg_mode_add, vg_joy_axis, SDL_CONTROLLER_AXIS_TRIGGERRIGHT,
+   vg_end
+},
+[k_sraxis_skid] = (vg_input_op[]){
+   vg_mode_sub, vg_joy_button, SDL_CONTROLLER_BUTTON_LEFTSHOULDER,
+   vg_mode_add, vg_joy_button, SDL_CONTROLLER_BUTTON_RIGHTSHOULDER,
+   vg_end
+},
+[k_sraxis_max]=NULL
+};
 
-   float axis_grab;
+static vg_input_op *input_joy_list[] = {
+[k_srjoystick_steer] = (vg_input_op[]){
+   vg_index, 0, vg_mode_sub, vg_keyboard, SDLK_a,
+                vg_mode_add, vg_keyboard, SDLK_d,
+   vg_index, 1, vg_mode_sub, vg_keyboard, SDLK_w,
+                vg_mode_add, vg_keyboard, SDLK_s,
+                vg_mode_absmax, vg_joy_ls,
+   vg_end
+},
+[k_srjoystick_grab] = (vg_input_op[]){
+   vg_joy_rs, vg_end
+},
+[k_srjoystick_look] = (vg_input_op[]){
+   vg_joy_rs, vg_end
+},
+[k_srjoystick_max]=NULL
+};
 
+struct {
+   float axis_states[ k_sraxis_max ][2];
+   v2f joystick_states[ k_srjoystick_max ][2];
    u8 button_states[ k_srbind_max ][2];
-   float repeaters[4];
+
+   enum input_state {
+      k_input_state_enabled,
+      k_input_state_resume,
+      k_input_state_resuming,
+      k_input_state_pause
+   }
+   state;
 }
 static srinput;
 
-static int button_down( enum sr_bind button )
-{
-   if( vg_console.enabled )
+static int input_filter_generic(void){
+   if( srinput.state != k_input_state_enabled || vg_console.enabled )
+      return 1;
+   else 
       return 0;
+}
+
+static int buttons_filter_fixed(void){
+   if( input_filter_generic() ) 
+      return 1;
 
    if( vg.engine_stage == k_engine_stage_update_fixed )
       if( vg.fixed_iterations > 0 )
-         return 0;
+         return 1;
+
+   return 0;
+}
+
+/* Rising edge of button */
+static int button_down( enum sr_bind button ){
+   if( buttons_filter_fixed() ) return 0;
    
    if(  srinput.button_states[ button ][0] && 
        !srinput.button_states[ button ][1] )
@@ -55,14 +214,9 @@ static int button_down( enum sr_bind button )
       return 0;
 }
 
-static int button_up( enum sr_bind button )
-{
-   if( vg_console.enabled )
-      return 0;
-
-   if( vg.engine_stage == k_engine_stage_update_fixed )
-      if( vg.fixed_iterations > 0 )
-         return 0;
+/* Falling edge of button */
+static int button_up( enum sr_bind button ){
+   if( buttons_filter_fixed() ) return 0;
    
    if( !srinput.button_states[ button ][0] && 
         srinput.button_states[ button ][1] )
@@ -71,104 +225,85 @@ static int button_up( enum sr_bind button )
       return 0;
 }
 
-static int button_press( enum sr_bind button )
-{
-   if( vg_console.enabled )
+/* State of button */
+static int button_press( enum sr_bind button ){
+   if( input_filter_generic() )
       return 0;
+   return 
+      srinput.button_states[ button ][0];
+}
 
-   return srinput.button_states[ button ][0];
+static void joystick_state( enum sr_joystick joystick, v2f state ){
+   if( input_filter_generic() )
+      v2_zero( state );
+   else
+      v2_copy( srinput.joystick_states[ joystick ][0], state );
 }
 
-static void setbtn( enum sr_bind button, u8 value )
-{
-   srinput.button_states[button][0] |= value;
+static float axis_state( enum sr_axis axis ){
+   if( input_filter_generic() )
+      return 0.0f;
+   else 
+      return srinput.axis_states[axis][0];
 }
 
-static void skaterift_preupdate_inputs(void)
-{
+static void skaterift_preupdate_inputs(void){
+   if( srinput.state == k_input_state_resuming )
+      srinput.state = k_input_state_enabled;
+
+   if( srinput.state == k_input_state_resume )
+      srinput.state = k_input_state_resuming;
+
    for( u32 i=0; i<k_srbind_max; i++ ){
       srinput.button_states[i][1] = srinput.button_states[i][0];
       srinput.button_states[i][0] = 0;
    }
 
-   u32 mouse = SDL_GetMouseState(NULL,NULL),
-       mouse1= (mouse & SDL_BUTTON(SDL_BUTTON_LEFT))? 1: 0,
-       mouse2= (mouse & SDL_BUTTON(SDL_BUTTON_RIGHT))? 1: 0;
-
-   /* button inputs
-    * ------------------------------------- */
-   setbtn( k_srbind_jump,    vg_getkey(SDLK_SPACE) );
-   setbtn( k_srbind_push,    vg_getkey(SDLK_w) );
-   setbtn( k_srbind_trick0,  mouse1 );
-   setbtn( k_srbind_trick1,  mouse2 );
-   setbtn( k_srbind_trick2,  mouse1 & mouse2 );
-   setbtn( k_srbind_use,     vg_getkey(SDLK_e) );
-   setbtn( k_srbind_reset,   vg_getkey(SDLK_r) );
-   setbtn( k_srbind_camera,  vg_getkey(SDLK_c) );
-   setbtn( k_srbind_mleft,   vg_getkey(SDLK_LEFT) );
-   setbtn( k_srbind_mright,  vg_getkey(SDLK_RIGHT) );
-   setbtn( k_srbind_mup,     vg_getkey(SDLK_UP) );
-   setbtn( k_srbind_mdown,   vg_getkey(SDLK_DOWN) );
-   setbtn( k_srbind_mback,   vg_getkey(SDLK_ESCAPE) );
-   setbtn( k_srbind_maccept, vg_getkey(SDLK_e) );
-   setbtn( k_srbind_maccept, vg_getkey(SDLK_RETURN));
-   setbtn( k_srbind_maccept, vg_getkey(SDLK_RETURN2));
-
-   /* axis
-    * --------------------------------------------*/
-   srinput.axis_grab = vg_getkey( SDLK_LSHIFT );
-
-   v2_zero( srinput.joy_steer );
-   v2_zero( srinput.joy_grab );
-   v2_zero( srinput.joy_look );
-
-   if( vg_getkey( SDLK_d ) ) srinput.joy_steer[0] += 1.0f;
-   if( vg_getkey( SDLK_a ) ) srinput.joy_steer[0] -= 1.0f;
-   if( vg_getkey( SDLK_w ) ) srinput.joy_steer[1] -= 1.0f;
-   if( vg_getkey( SDLK_s ) ) srinput.joy_steer[1] += 1.0f;
-
-   if( vg_input.active_controller_index != -1 ){
-      struct vg_controller *controller = 
-         &vg_input.controllers[vg_input.active_controller_index];
-
-      u32 *buttons = controller->buttons;
-      setbtn( k_srbind_jump,   buttons[ SDL_CONTROLLER_BUTTON_A ] );
-      setbtn( k_srbind_push,   buttons[ SDL_CONTROLLER_BUTTON_B ] );
-      setbtn( k_srbind_trick0, buttons[ SDL_CONTROLLER_BUTTON_A ] );
-      setbtn( k_srbind_trick1, buttons[ SDL_CONTROLLER_BUTTON_B ] );
-      setbtn( k_srbind_trick2, buttons[ SDL_CONTROLLER_BUTTON_X ] );
-      setbtn( k_srbind_use,    buttons[ SDL_CONTROLLER_BUTTON_Y ] );
-      setbtn( k_srbind_reset,  buttons[ SDL_CONTROLLER_BUTTON_LEFTSHOULDER ] );
-      setbtn( k_srbind_camera, buttons[ SDL_CONTROLLER_BUTTON_RIGHTSHOULDER ] );
-      setbtn( k_srbind_mleft,  buttons[ SDL_CONTROLLER_BUTTON_DPAD_LEFT ] );
-      setbtn( k_srbind_mright, buttons[ SDL_CONTROLLER_BUTTON_DPAD_RIGHT ] );
-      setbtn( k_srbind_mup,    buttons[ SDL_CONTROLLER_BUTTON_DPAD_UP ] );
-      setbtn( k_srbind_mdown,  buttons[ SDL_CONTROLLER_BUTTON_DPAD_DOWN ] );
-
-      float *axis = controller->axises;
-      
-      srinput.joy_steer[0] += axis[ SDL_CONTROLLER_AXIS_LEFTX ],
-      srinput.joy_steer[1] += axis[ SDL_CONTROLLER_AXIS_LEFTY ],
-      srinput.joy_look[0]  += axis[ SDL_CONTROLLER_AXIS_RIGHTX ];
-      srinput.joy_look[1]  += axis[ SDL_CONTROLLER_AXIS_RIGHTY ];
-      srinput.joy_grab[0]  += axis[ SDL_CONTROLLER_AXIS_RIGHTX ];
-      srinput.joy_grab[1]  += axis[ SDL_CONTROLLER_AXIS_RIGHTY ];
-      srinput.axis_grab    += vg_maxf( 0.0f, 
-                                    axis[ SDL_CONTROLLER_AXIS_TRIGGERRIGHT ] );
-
-      float lh = axis[ SDL_CONTROLLER_AXIS_LEFTX ],
-            lv = axis[ SDL_CONTROLLER_AXIS_LEFTY ],
-            sensitivity = 0.35f;
-
-      if( lh >  sensitivity ) setbtn( k_srbind_mright, 1 );
-      if( lh < -sensitivity ) setbtn( k_srbind_mleft, 1 );
-      if( lv >  sensitivity ) setbtn( k_srbind_mup, 1 );
-      if( lv < -sensitivity ) setbtn( k_srbind_mdown, 1 );
+   for( u32 i=0; i<k_srjoystick_max; i++ ){
+      v2_copy( srinput.joystick_states[i][0], srinput.joystick_states[i][1] );
+      v2_zero( srinput.joystick_states[i][0] );
    }
 
-   //v2_normalize_clamp( srinput.joy_steer );
-   //v2_normalize_clamp( srinput.joy_grab );
-   srinput.axis_grab = vg_minf( 1.0f, srinput.axis_grab );
-}
+   for( u32 i=0; i<k_sraxis_max; i++ ){
+      srinput.axis_states[i][1] = srinput.axis_states[i][0];
+      srinput.axis_states[i][0] = 0.0f;
+   }
+
+   for( int i=0; i<k_srbind_max; i++ ){
+      vg_input_op *prog = input_button_list[i];
+      if( prog ){
+         vg_exec_input_program( k_vg_input_type_button_u8, prog,
+                                &srinput.button_states[i][0] );
+      }
+   }
+
+   for( int i=0; i<k_sraxis_max; i++ ){
+      vg_input_op *prog = input_axis_list[i];
+      if( prog ){
+         vg_exec_input_program( k_vg_input_type_axis_f32, prog,
+                                &srinput.axis_states[i][0] );
+      }
+   }
+
+   for( int i=0; i<k_srjoystick_max; i++ ){
+      vg_input_op *prog = input_joy_list[i];
+      if( prog ){
+         vg_exec_input_program( k_vg_input_type_joy_v2f, prog,
+                                srinput.joystick_states[i][0] );
+      }
+   }
+
+   f32 x = srinput.axis_states[k_sraxis_mbrowse_h][0],
+       y = srinput.axis_states[k_sraxis_mbrowse_v][0],
+       sensitivity = 0.35f;
+
+   if( fabsf(x) > sensitivity ){
+      if( x > 0.0f ) srinput.button_states[k_srbind_mright][0] = 1;
+      else           srinput.button_states[k_srbind_mleft][0] = 1;
+   }
 
-#endif /* INPUT_H */
+   if( fabsf(y) > sensitivity ){
+      if( y > 0.0f ) srinput.button_states[k_srbind_mup][0] = 1;
+      else           srinput.button_states[k_srbind_mdown][0] = 1;
+   }
+}