21 #define GUI_HELPER_TEXT_LENGTH 32
26 char text
[GUI_HELPER_TEXT_LENGTH
];
32 int active_positional_helper
;
53 mdl_context model_icons
;
57 mdl_submesh
*icons
[ k_gui_icon_count
];
59 static gui
= {.cur_icon_colour
= {1.0f
,1.0f
,1.0f
,1.0f
},.colour_changed
=1};
61 static void gui_helper_clear(void){
63 gui
.active_positional_helper
= 0;
66 static struct gui_helper
*gui_new_helper( vg_input_op
*bind
, vg_str
*out_text
){
67 if( gui
.helper_count
>= vg_list_size(gui
.helpers
) ){
68 vg_error( "Too many helpers\n" );
72 struct gui_helper
*helper
= &gui
.helpers
[ gui
.helper_count
++ ];
74 helper
->binding
= bind
;
75 vg_strnull( out_text
, helper
->text
, sizeof(helper
->text
) );
79 static void gui_draw(void){
80 if( gui
.active_positional_helper
&&
81 (v3_dist2(localplayer
.rb
.co
,gui
.trick_co
) > 2.0f
) )
93 m4x4_zero( ortho
.mtx
.p
);
94 ortho
.mtx
.p
[0][0] = 2.0f
* rl
;
95 ortho
.mtx
.p
[1][1] = 2.0f
* tb
;
96 ortho
.mtx
.p
[3][0] = (fr
+ fl
) * -rl
;
97 ortho
.mtx
.p
[3][1] = (ft
+ fb
) * -tb
;
98 ortho
.mtx
.p
[3][3] = 1.0f
;
99 m4x3_identity( ortho
.transform
);
100 camera_update_view( &ortho
);
101 m4x4_mul( ortho
.mtx
.p
, ortho
.mtx
.v
, ortho
.mtx
.pv
); /* HACK */
102 camera_finalize( &ortho
);
106 font3d_bind( &gui
.font
, k_font_shader_default
, 0, NULL
, &ortho
);
107 mesh_bind( &gui
.icons_mesh
);
110 m4x3_identity( mmdl
);
111 shader_model_font_uMdl( mmdl
);
113 glActiveTexture( GL_TEXTURE0
);
114 glBindTexture( GL_TEXTURE_2D
, gui
.icons_texture
);
115 shader_model_font_uTexMain( 0 );
117 for( u32 i
=0; i
<gui
.icon_draw_count
; i
++ ){
118 struct icon_call
*call
= &gui
.icon_draw_buffer
[i
];
120 if( call
->colour_changed
)
121 shader_model_font_uColour( call
->colour
);
123 shader_model_font_uOffset( call
->location
);
125 mdl_submesh
*sm
= gui
.icons
[ call
->icon
];
127 mdl_draw_submesh( sm
);
130 gui
.icon_draw_count
= 0;
134 gui
.factive
= vg_lerpf( gui
.factive
, gui
.helper_count
?1.0f
:0.0f
,
135 vg
.time_frame_delta
*2.0f
);
137 if( gui
.factive
> 0.01f
){
138 /* draw bottom bar */
140 glDisable(GL_DEPTH_TEST
);
141 glBlendFunc( GL_SRC_ALPHA
, GL_ONE_MINUS_SRC_ALPHA
);
142 glBlendEquation(GL_FUNC_ADD
);
144 shader_blitcolour_use();
145 shader_blitcolour_uColour( (v4f
){ 0.0f
, 0.0f
, 0.0f
, gui
.factive
*0.8f
} );
149 f64 loc_t
= (vg
.time_real
- gui
.location_time
) / 5.0;
150 if( (loc_t
< 1.0) && (gui
.location_time
!= 0.0) ){
151 /* yep this code is a mess, i dont care anymore */
153 glDisable(GL_DEPTH_TEST
);
154 glBlendFunc( GL_SRC_ALPHA
, GL_ONE_MINUS_SRC_ALPHA
);
155 glBlendEquation(GL_FUNC_ADD
);
157 f32 t
= 1.0f
-vg_minf(1.0f
,vg_minf(loc_t
*20.0f
,2.0f
-loc_t
*2.0f
)),
158 o
= 1.0f
-t
*t
*(2.0f
-t
);
160 shader_blitcolour_use();
161 shader_blitcolour_uColour( (v4f
){ 0.0f
, 0.0f
, 0.0f
, o
*0.5f
} );
165 scale
= dy
*0x1p
-4f
*0.5f
;
167 m3x3_identity( mmdl
);
168 m3x3_scale( mmdl
, (v3f
){scale
,scale
,scale
} );
171 f32 pad
= dy
*0x1p
-4f
*0.125f
;
172 f32 w
= font3d_string_width( 2, gui
.location
);
174 mmdl
[3][0] = fr
*0.5f
- w
*scale
*0.5f
;
175 mmdl
[3][1] = 0.3f
*ft
+pad
*2.0f
;
177 font3d_bind( &gui
.font
, k_font_shader_default
, 0, NULL
, &ortho
);
178 shader_model_font_uColour( (v4f
){1.2f
,1.2f
,1.2f
,o
} );
179 font3d_simple_draw( 2, gui
.location
, &ortho
, mmdl
);
182 font3d_bind( &gui
.font
, k_font_shader_default
, 0, NULL
, &ortho
);
185 scale
= dy
*0x1p
-4f
*0.75f
;
187 m3x3_identity( mmdl
);
188 m3x3_scale( mmdl
, (v3f
){scale
,scale
,scale
} );
191 float pad
= dy
*0x1p
-4f
*0.125f
;
192 mmdl
[3][0] = pad
*2.0f
;
195 for( u32 i
=0; i
<gui
.helper_count
; i
++ ){
196 struct gui_helper
*helper
= &gui
.helpers
[i
];
200 vg_strnull( &str
, buf
, sizeof(buf
) );
201 vg_input_string( &str
, helper
->binding
, 1 );
203 font3d_setcolour( (v4f
){1.0f
,1.0f
,1.0f
, helper
->greyed
? 0.5f
: 1.0f
} );
204 font3d_simple_draw( 2, buf
, &ortho
, mmdl
);
206 const char *make_smaller
= "\x02\xaf\x03 ";
207 font3d_draw( make_smaller
);
208 font3d_draw( helper
->text
);
210 float w
= gui_font3d
.offset
[0]+1.0f
;
211 mmdl
[3][0] += w
*scale
;
215 static int gui_location_print_ccmd( int argc
, const char *argv
[] ){
219 vg_strnull( &str
, new_loc
, 64 );
220 for( int i
=0; i
<argc
; i
++ ){
221 vg_strcat( &str
, argv
[i
] );
222 vg_strcat( &str
, " " );
224 if( !strcmp(gui
.location
,new_loc
) ) return 0;
225 vg_strncpy( new_loc
, gui
.location
, 64, k_strncpy_always_add_null
);
226 gui
.location_time
= vg
.time_real
;
231 static int gui_showtrick_ccmd( int argc
, const char *argv
[] ){
236 if( !strcmp( argv
[0], "pump" ) ){
237 if( gui_new_helper( input_axis_list
[k_sraxis_grab
], &text
) )
238 vg_strcat( &text
, "Pump" );
240 else if( !strcmp( argv
[0], "flip" ) ){
241 if( gui_new_helper( input_joy_list
[k_srjoystick_steer
], &text
) )
242 vg_strcat( &text
, "Flip" );
244 else if( !strcmp( argv
[0], "ollie" ) ){
245 if( gui_new_helper( input_button_list
[k_srbind_jump
], &text
) )
246 vg_strcat( &text
, "Ollie" );
248 else if( !strcmp( argv
[0], "trick" ) ){
249 if( gui_new_helper( input_button_list
[k_srbind_trick0
], &text
) )
250 vg_strcat( &text
, "Shuvit" );
251 if( gui_new_helper( input_button_list
[k_srbind_trick1
], &text
) )
252 vg_strcat( &text
, "Kickflip" );
253 if( gui_new_helper( input_button_list
[k_srbind_trick2
], &text
) )
254 vg_strcat( &text
, "Tre-Flip" );
256 else if( !strcmp( argv
[0], "misc" ) ){
257 if( gui_new_helper( input_button_list
[k_srbind_camera
], &text
) )
258 vg_strcat( &text
, "Camera" );
259 if( gui_new_helper( input_button_list
[k_srbind_use
], &text
) )
260 vg_strcat( &text
, "Skate/Walk" );
264 v3_copy( localplayer
.rb
.co
, gui
.trick_co
);
265 gui
.active_positional_helper
= 1;
271 static void gui_draw_icon( enum gui_icon icon
, v2f co
, f32 size
){
272 if( gui
.icon_draw_count
== vg_list_size(gui
.icon_draw_buffer
) )
275 struct icon_call
*call
= &gui
.icon_draw_buffer
[ gui
.icon_draw_count
++ ];
278 call
->location
[0] = co
[0] * (f32
)vg
.window_x
;
279 call
->location
[1] = co
[1] * (f32
)vg
.window_y
;
280 call
->location
[2] = 0.0f
;
281 call
->location
[3] = size
* (f32
)vg
.window_x
;
283 v4_copy( gui
.cur_icon_colour
, call
->colour
);
284 call
->colour_changed
= gui
.colour_changed
;
285 gui
.colour_changed
= 0;
288 static void gui_icon_setcolour( v4f colour
){
289 gui
.colour_changed
= 1;
290 v4_copy( colour
, gui
.cur_icon_colour
);
293 static mdl_submesh
*gui_find_icon( const char *name
){
294 mdl_mesh
*mesh
= mdl_find_mesh( &gui
.model_icons
, name
);
296 if( mesh
->submesh_count
){
297 return mdl_arritm( &gui
.model_icons
.submeshs
, mesh
->submesh_start
);
304 static void gui_init(void){
305 font3d_load( &gui
.font
, "models/rs_font.mdl", vg_mem
.rtmemory
);
306 vg_console_reg_cmd( "gui_location", gui_location_print_ccmd
, NULL
);
307 vg_console_reg_cmd( "showtrick", gui_showtrick_ccmd
, NULL
);
310 void *alloc
= vg_mem
.rtmemory
;
311 mdl_open( &gui
.model_icons
, "models/rs_icons.mdl", alloc
);
312 mdl_load_metadata_block( &gui
.model_icons
, alloc
);
314 gui
.icons
[ k_gui_icon_tick
] = gui_find_icon( "icon_tick" );
315 gui
.icons
[ k_gui_icon_exclaim
] = gui_find_icon( "icon_exclaim" );
316 gui
.icons
[ k_gui_icon_board
] = gui_find_icon( "icon_board" );
317 gui
.icons
[ k_gui_icon_world
] = gui_find_icon( "icon_world" );
318 gui
.icons
[ k_gui_icon_rift
] = gui_find_icon( "icon_rift" );
319 gui
.icons
[ k_gui_icon_rift_run
] = gui_find_icon( "icon_rift_run" );
320 gui
.icons
[ k_gui_icon_friend
] = gui_find_icon( "icon_friend" );
321 gui
.icons
[ k_gui_icon_player
] = gui_find_icon( "icon_player" );
323 vg_linear_clear( vg_mem
.scratch
);
324 if( !mdl_arrcount( &gui
.model_icons
.textures
) )
325 vg_fatal_error( "No texture in menu file" );
326 mdl_texture
*tex0
= mdl_arritm( &gui
.model_icons
.textures
, 0 );
327 void *data
= vg_linear_alloc( vg_mem
.scratch
, tex0
->file
.pack_size
);
328 mdl_fread_pack_file( &gui
.model_icons
, &tex0
->file
, data
);
329 vg_tex2d_load_qoi_async( data
, tex0
->file
.pack_size
,
330 VG_TEX2D_LINEAR
|VG_TEX2D_CLAMP
,
331 &gui
.icons_texture
);
333 mdl_async_load_glmesh( &gui
.model_icons
, &gui
.icons_mesh
);
334 mdl_close( &gui
.model_icons
);