5 #include "vg/vg_imgui.h"
7 #define GUI_COL_DARK ui_opacity( 0x00000000, 0.7f )
8 #define GUI_COL_NORM ui_opacity( 0x00101010, 0.7f )
9 #define GUI_COL_ACTIVE ui_opacity( 0x00444444, 0.7f )
10 #define GUI_COL_CLICK ui_opacity( 0x00858585, 0.7f )
11 #define GUI_COL_HI ui_opacity( 0x00ffffff, 0.8f )
17 k_gui_icon_exclaim_2d
,
22 k_gui_icon_rift_run_2d
,
25 k_gui_icon_rift_run_gold
,
26 k_gui_icon_rift_run_silver
,
29 k_gui_icon_spawn_select
,
34 #define GUI_HELPER_TEXT_LENGTH 32
39 char text
[GUI_HELPER_TEXT_LENGTH
];
45 int active_positional_helper
;
66 mdl_context model_icons
;
70 mdl_submesh
*icons
[ k_gui_icon_count
];
72 static gui
= {.cur_icon_colour
= {1.0f
,1.0f
,1.0f
,1.0f
},.colour_changed
=1};
74 static void gui_helper_clear(void){
76 gui
.active_positional_helper
= 0;
79 static struct gui_helper
*gui_new_helper( vg_input_op
*bind
, vg_str
*out_text
){
80 if( gui
.helper_count
>= vg_list_size(gui
.helpers
) ){
81 vg_error( "Too many helpers\n" );
85 struct gui_helper
*helper
= &gui
.helpers
[ gui
.helper_count
++ ];
87 helper
->binding
= bind
;
88 vg_strnull( out_text
, helper
->text
, sizeof(helper
->text
) );
92 static void gui_render_icons(void)
103 m4x4_zero( ortho
.mtx
.p
);
104 ortho
.mtx
.p
[0][0] = 2.0f
* rl
;
105 ortho
.mtx
.p
[1][1] = 2.0f
* tb
;
106 ortho
.mtx
.p
[3][0] = (fr
+ fl
) * -rl
;
107 ortho
.mtx
.p
[3][1] = (ft
+ fb
) * -tb
;
108 ortho
.mtx
.p
[3][3] = 1.0f
;
109 m4x3_identity( ortho
.transform
);
110 vg_camera_update_view( &ortho
);
111 m4x4_mul( ortho
.mtx
.p
, ortho
.mtx
.v
, ortho
.mtx
.pv
); /* HACK */
112 vg_camera_finalize( &ortho
);
115 font3d_bind( &gui
.font
, k_font_shader_default
, 0, NULL
, &ortho
);
116 mesh_bind( &gui
.icons_mesh
);
119 m4x3_identity( mmdl
);
120 shader_model_font_uMdl( mmdl
);
122 glActiveTexture( GL_TEXTURE0
);
123 glBindTexture( GL_TEXTURE_2D
, gui
.icons_texture
);
124 shader_model_font_uTexMain( 0 );
126 for( u32 i
=0; i
<gui
.icon_draw_count
; i
++ ){
127 struct icon_call
*call
= &gui
.icon_draw_buffer
[i
];
129 if( call
->colour_changed
)
130 shader_model_font_uColour( call
->colour
);
132 shader_model_font_uOffset( call
->location
);
134 mdl_submesh
*sm
= gui
.icons
[ call
->icon
];
136 mdl_draw_submesh( sm
);
139 gui
.icon_draw_count
= 0;
142 static void gui_draw(void)
144 if( gui
.active_positional_helper
&&
145 (v3_dist2(localplayer
.rb
.co
,gui
.trick_co
) > 2.0f
) )
149 * ----------------------------------------------------------------- */
151 gui
.factive
= vg_lerpf( gui
.factive
, gui
.helper_count
?1.0f
:0.0f
,
152 vg
.time_frame_delta
*2.0f
);
154 ui_font_face( &vgf_default_title
);
155 ui_px height
= vg_ui
.font
->ch
+ 16;
156 ui_rect lwr
= { 0, vg
.window_y
- height
, vg
.window_x
, height
};
159 for( u32 i
=0; i
<gui
.helper_count
; i
++ )
161 struct gui_helper
*helper
= &gui
.helpers
[i
];
165 vg_strnull( &str
, buf
, sizeof(buf
) );
166 vg_input_string( &str
, helper
->binding
, 1 );
168 ui_rect box
= { x
, lwr
[1], 1000, lwr
[3] };
174 fg
= ui_colour(k_ui_fg
+2);
178 struct ui_vert
*bg
= ui_fill( box
, ui_opacity( GUI_COL_DARK
, opacity
) );
182 w
= ui_text( box
, buf
, 1, k_ui_align_middle_left
, fg
);
184 bg
[1].co
[0] = x
+ w
+ 32;
185 bg
[2].co
[0] = x
+ w
+ 32;
189 bg
= ui_fill( box
, ui_opacity( GUI_COL_NORM
, opacity
*0.7f
) );
191 w
= ui_text( box
, helper
->text
, 1, k_ui_align_middle_left
, fg
);
193 bg
[1].co
[0] = box
[0] + w
+ 16;
194 bg
[2].co
[0] = box
[0] + w
+ 16;
198 vg_ui
.frosting
= gui
.factive
*0.015f
;
199 ui_flush( k_ui_shader_colour
, vg
.window_x
, vg
.window_y
);
200 vg_ui
.frosting
= 0.0f
;
203 f64 loc_t
= (vg
.time_real
- gui
.location_time
) / 5.0;
204 if( (loc_t
< 1.0) && (gui
.location_time
!= 0.0) )
206 f32 t
= 1.0f
-vg_minf(1.0f
,vg_minf(loc_t
*20.0f
,2.0f
-loc_t
*2.0f
)),
207 o
= 1.0f
-t
*t
*(2.0f
-t
);
209 ui_rect box
= { 0, (vg
.window_y
*2)/3 - height
/2, vg
.window_x
, height
};
210 ui_fill( box
, ui_opacity( GUI_COL_NORM
, 0.5f
) );
211 ui_text( box
, gui
.location
, 1, k_ui_align_middle_center
, 0 );
214 ui_flush( k_ui_shader_colour
, vg
.window_x
, vg
.window_y
);
217 vg_ui
.colour
[3] = 1.0f
;
218 ui_font_face( &vgf_default_small
);
221 static int gui_location_print_ccmd( int argc
, const char *argv
[] )
226 vg_strnull( &str
, new_loc
, 64 );
227 for( int i
=0; i
<argc
; i
++ ){
228 vg_strcat( &str
, argv
[i
] );
229 vg_strcat( &str
, " " );
231 if( !strcmp(gui
.location
,new_loc
) ) return 0;
232 vg_strncpy( new_loc
, gui
.location
, 64, k_strncpy_always_add_null
);
233 gui
.location_time
= vg
.time_real
;
238 static int gui_showtrick_ccmd( int argc
, const char *argv
[] ){
243 if( !strcmp( argv
[0], "pump" ) ){
244 if( gui_new_helper( input_axis_list
[k_sraxis_grab
], &text
) )
245 vg_strcat( &text
, "Pump" );
247 else if( !strcmp( argv
[0], "flip" ) ){
248 if( gui_new_helper( input_joy_list
[k_srjoystick_steer
], &text
) )
249 vg_strcat( &text
, "Flip" );
251 else if( !strcmp( argv
[0], "ollie" ) ){
252 if( gui_new_helper( input_button_list
[k_srbind_jump
], &text
) )
253 vg_strcat( &text
, "Ollie" );
255 else if( !strcmp( argv
[0], "trick" ) ){
256 if( gui_new_helper( input_button_list
[k_srbind_trick0
], &text
) )
257 vg_strcat( &text
, "Shuvit" );
258 if( gui_new_helper( input_button_list
[k_srbind_trick1
], &text
) )
259 vg_strcat( &text
, "Kickflip" );
260 if( gui_new_helper( input_button_list
[k_srbind_trick2
], &text
) )
261 vg_strcat( &text
, "Tre-Flip" );
263 else if( !strcmp( argv
[0], "misc" ) ){
264 if( gui_new_helper( input_button_list
[k_srbind_camera
], &text
) )
265 vg_strcat( &text
, "Camera" );
266 if( gui_new_helper( input_button_list
[k_srbind_use
], &text
) )
267 vg_strcat( &text
, "Skate/Walk" );
271 v3_copy( localplayer
.rb
.co
, gui
.trick_co
);
272 gui
.active_positional_helper
= 1;
278 static void gui_draw_icon( enum gui_icon icon
, v2f co
, f32 size
){
279 if( gui
.icon_draw_count
== vg_list_size(gui
.icon_draw_buffer
) )
282 struct icon_call
*call
= &gui
.icon_draw_buffer
[ gui
.icon_draw_count
++ ];
285 call
->location
[0] = co
[0] * (f32
)vg
.window_x
;
286 call
->location
[1] = co
[1] * (f32
)vg
.window_y
;
287 call
->location
[2] = 0.0f
;
288 call
->location
[3] = size
* (f32
)vg
.window_x
;
290 v4_copy( gui
.cur_icon_colour
, call
->colour
);
291 call
->colour_changed
= gui
.colour_changed
;
292 gui
.colour_changed
= 0;
295 static void gui_icon_setcolour( v4f colour
){
296 gui
.colour_changed
= 1;
297 v4_copy( colour
, gui
.cur_icon_colour
);
300 static mdl_submesh
*gui_find_icon( const char *name
){
301 mdl_mesh
*mesh
= mdl_find_mesh( &gui
.model_icons
, name
);
303 if( mesh
->submesh_count
){
304 return mdl_arritm( &gui
.model_icons
.submeshs
, mesh
->submesh_start
);
311 static void gui_init(void){
312 font3d_load( &gui
.font
, "models/rs_font.mdl", vg_mem
.rtmemory
);
313 vg_console_reg_cmd( "gui_location", gui_location_print_ccmd
, NULL
);
314 vg_console_reg_cmd( "showtrick", gui_showtrick_ccmd
, NULL
);
317 void *alloc
= vg_mem
.rtmemory
;
318 mdl_open( &gui
.model_icons
, "models/rs_icons.mdl", alloc
);
319 mdl_load_metadata_block( &gui
.model_icons
, alloc
);
321 gui
.icons
[ k_gui_icon_tick
] = gui_find_icon( "icon_tick" );
322 gui
.icons
[ k_gui_icon_tick_2d
] = gui_find_icon( "icon_tick2d" );
323 gui
.icons
[ k_gui_icon_exclaim
] = gui_find_icon( "icon_exclaim" );
324 gui
.icons
[ k_gui_icon_exclaim_2d
] = gui_find_icon( "icon_exclaim2d" );
325 gui
.icons
[ k_gui_icon_board
] = gui_find_icon( "icon_board" );
326 gui
.icons
[ k_gui_icon_world
] = gui_find_icon( "icon_world" );
327 gui
.icons
[ k_gui_icon_rift
] = gui_find_icon( "icon_rift" );
328 gui
.icons
[ k_gui_icon_rift_run
] = gui_find_icon( "icon_rift_run" );
329 gui
.icons
[ k_gui_icon_rift_run_2d
] = gui_find_icon( "icon_rift_run2d" );
330 gui
.icons
[ k_gui_icon_friend
] = gui_find_icon( "icon_friend" );
331 gui
.icons
[ k_gui_icon_player
] = gui_find_icon( "icon_player" );
332 gui
.icons
[ k_gui_icon_glider
] = gui_find_icon( "icon_glider" );
333 gui
.icons
[ k_gui_icon_spawn
] = gui_find_icon( "icon_spawn" );
334 gui
.icons
[ k_gui_icon_spawn_select
] = gui_find_icon( "icon_spawn_select" );
335 gui
.icons
[ k_gui_icon_rift_run_gold
] =
336 gui_find_icon("icon_rift_run_medal_gold");
337 gui
.icons
[ k_gui_icon_rift_run_silver
]=
338 gui_find_icon("icon_rift_run_medal_silver");
340 vg_linear_clear( vg_mem
.scratch
);
341 if( !mdl_arrcount( &gui
.model_icons
.textures
) )
342 vg_fatal_error( "No texture in menu file" );
343 mdl_texture
*tex0
= mdl_arritm( &gui
.model_icons
.textures
, 0 );
344 void *data
= vg_linear_alloc( vg_mem
.scratch
, tex0
->file
.pack_size
);
345 mdl_fread_pack_file( &gui
.model_icons
, &tex0
->file
, data
);
346 vg_tex2d_load_qoi_async( data
, tex0
->file
.pack_size
,
347 VG_TEX2D_LINEAR
|VG_TEX2D_CLAMP
,
348 &gui
.icons_texture
);
350 mdl_async_load_glmesh( &gui
.model_icons
, &gui
.icons_mesh
, NULL
);
351 mdl_close( &gui
.model_icons
);