imgui stuff
[carveJwlIkooP6JGAAIwe30JlM.git] / skaterift.c
1 /*
2 * =============================================================================
3 *
4 * Copyright . . . -----, ,----- ,---. .---.
5 * 2021-2023 |\ /| | / | | | | /|
6 * | \ / | +-- / +----- +---' | / |
7 * | \ / | | / | | \ | / |
8 * | \/ | | / | | \ | / |
9 * ' ' '--' [] '----- '----- ' ' '---' SOFTWARE
10 *
11 * =============================================================================
12 */
13
14 #include "skaterift_imgui_dev.c"
15
16 #if 0
17
18 #define SR_NETWORKED
19 #define VG_DEVWINDOW
20 #include "common.h"
21 #include "conf.h"
22 #include "steam.h"
23 #include "render.h"
24 #include "audio.h"
25 #include "world.h"
26 #include "font.h"
27 #include "player.h"
28
29 #include "entity.c"
30
31 VG_STATIC struct player_avatar localplayer_avatar;
32 VG_STATIC struct player_model localplayer_models[3];
33 VG_STATIC int skaterift_status = 0;
34
35 #include "network.h"
36 #include "menu.h"
37 #include "vehicle.h"
38
39 #define DEV_AARON
40 #ifdef DEV_AARON
41 static rb_object aaron={
42 .type=k_rb_shape_box,
43 .rb.bbx = {{ -2.0f, -1.0f, -1.0f }, { 2.0f, 1.0f, 1.0f }}
44 };
45 #endif
46
47 int main( int argc, char *argv[] )
48 {
49 vg_mem.use_libc_malloc = 0;
50 vg_set_mem_quota( 160*1024*1024 );
51 vg_enter( argc, argv, "Voyager Game Engine" );
52 return 0;
53 }
54
55 VG_STATIC void highscores_save_at_exit(void)
56 {
57 highscores_serialize_all();
58 }
59
60 VG_STATIC void vg_launch_opt(void)
61 {
62 }
63
64 VG_STATIC void vg_preload(void)
65 {
66 g_conf_init();
67
68 vg_info(" Copyright . . . -----, ,----- ,---. .---. \n" );
69 vg_info(" 2021-2023 |\\ /| | / | | | | /| \n" );
70 vg_info(" | \\ / | +-- / +----- +---' | / | \n" );
71 vg_info(" | \\ / | | / | | \\ | / | \n" );
72 vg_info(" | \\/ | | / | | \\ | / | \n" );
73 vg_info(" ' ' '--' [] '----- '----- ' ' '---' "
74 "SOFTWARE\n" );
75
76 highscores_init( 2000, 50 );
77 if( !highscores_read() )
78 highscores_create_db();
79
80 vg_loader_step( NULL, highscores_save_at_exit );
81
82 steam_init();
83 vg_loader_step( NULL, steam_end );
84 vg_loader_step( network_init, network_end );
85
86 #ifdef DEV_AARON
87 q_identity( aaron.rb.q );
88 v3_zero( aaron.rb.w );
89 v3_zero( aaron.rb.co );
90 v3_zero( aaron.rb.v );
91 rb_init_object( &aaron );
92 #endif
93 }
94
95 VG_STATIC void load_playermodels(void)
96 {
97 player_model_load( &localplayer_models[0], "models/ch_new.mdl" );
98 player_model_load( &localplayer_models[1], "models/ch_outlaw.mdl" );
99 player_model_load( &localplayer_models[2], "models/ch_jordan.mdl" );
100
101 /* load default board */
102 #if 0
103 player_board_load( &localplayer_boards[0],
104 "models/boards/skaterift_fish.mdl" );
105 #endif
106
107 /* FIXME: hack */
108 shader_model_character_view_register();
109 shader_model_board_view_register();
110 shader_model_entity_register();
111 }
112
113 void temp_update_playermodel(void){
114 player__use_model( &localplayer, &localplayer_models[cl_playermdl_id] );
115 }
116
117 VG_STATIC void async_skaterift_complete( void *payload, u32 size )
118 {
119 skaterift_status = 1;
120
121 localplayer.viewable_world = get_active_world();
122 localplayer_cmd_respawn( 1, (const char *[]){ "start" } );
123 }
124
125 VG_STATIC void vg_load(void)
126 {
127 vg_loader_step( render_init, NULL );
128 vg_loader_step( menu_init, NULL );
129 vg_loader_step( world_init, NULL );
130 vg_loader_step( vehicle_init, NULL );
131 vg_loader_step( font3d_init, NULL );
132
133 font3d_load( &world_global.font, "models/rs_font.mdl", vg_mem.rtmemory );
134
135 vg_loader_step( player_init, NULL );
136 vg_loader_step( player_ragdoll_init, NULL );
137 vg_loader_step( skateshop_init, NULL );
138
139 /* ----------------- */
140 vg_loader_step( load_playermodels, NULL );
141
142 /* player setup */
143 player__create( &localplayer );
144 player_avatar_load( &localplayer_avatar, "models/ch_new.mdl" );
145 player__use_avatar( &localplayer, &localplayer_avatar );
146 player__use_model( &localplayer, &localplayer_models[cl_playermdl_id] );
147 //localplayer.board = &localplayer_boards[0];
148 player__bind( &localplayer );
149
150 /* --------------------- */
151
152 vg_bake_shaders();
153 vg_loader_step( audio_init, audio_free );
154
155 /* 'systems' are completely loaded now */
156
157 /* load home world */
158
159 #if 1
160 world_load( 0, "maps/mp_spawn.mdl" );
161 #else
162 world_load( 0, "maps/mp_mtzero.mdl" );
163 #endif
164
165 #if 0
166 world_load( &world_global.worlds[1], "maps/mp_gridmap.mdl" );
167 world_link_nonlocal_gates( 0, 1 );
168 world_load( &world_global.worlds[2], "maps/mp_mtzero.mdl" );
169 world_link_nonlocal_gates( 0, 2 );
170 #endif
171
172 vg_console_load_autos();
173
174 vg_async_call( async_skaterift_complete, NULL, 0 );
175 }
176
177 VG_STATIC void draw_origin_axis(void)
178 {
179 vg_line( (v3f){ 0.0f, 0.0f, 0.0f }, (v3f){ 1.0f, 0.0f, 0.0f }, 0xffff0000 );
180 vg_line( (v3f){ 0.0f, 0.0f, 0.0f }, (v3f){ 0.0f, 1.0f, 0.0f }, 0xff00ff00 );
181 vg_line( (v3f){ 0.0f, 0.0f, 0.0f }, (v3f){ 0.0f, 0.0f, 1.0f }, 0xff0000ff );
182 }
183
184 VG_STATIC void vg_update(void)
185 {
186 steam_update();
187
188 skaterift_preupdate_inputs();
189
190 if( skaterift_status == 1 ){
191 draw_origin_axis();
192 network_update();
193
194 player__pre_update( &localplayer );
195 global_skateshop_preupdate();
196
197 world_update( get_active_world(), localplayer.rb.co );
198 audio_ambient_sprites_update( get_active_world(), localplayer.rb.co );
199 //gui_helper_action( localplayer.input_use, "\x7f Hello \x1f""A \x1e\x84" );
200 }
201 }
202
203 VG_STATIC void vg_update_fixed(void)
204 {
205 if( skaterift_status == 1 ){
206 world_routes_fixedupdate( get_active_world() );
207
208 player__update( &localplayer );
209 vehicle_update_fixed();
210
211 #ifdef DEV_AARON
212 world_instance *world = get_active_world();
213 rb_solver_reset();
214 rb_ct *buf = rb_global_buffer();
215
216 int l = rb_box__scene( aaron.rb.to_world, aaron.rb.bbx,
217 NULL, &world->rb_geo.inf.scene, buf );
218 for( int j=0; j<l; j++ ){
219 buf[j].rba = &aaron.rb;
220 buf[j].rbb = &world->rb_geo.rb;
221 }
222 rb_contact_count += l;
223 rb_presolve_contacts( rb_contact_buffer, rb_contact_count );
224
225 for( int j=0; j<8; j++ ){
226 rb_solve_contacts( rb_contact_buffer, rb_contact_count );
227 }
228
229 rb_iter( &aaron.rb );
230 rb_update_transform( &aaron.rb );
231 #endif
232
233 }
234 }
235
236 VG_STATIC void vg_update_post(void)
237 {
238 if( skaterift_status == 1 ){
239 player__post_update( &localplayer );
240
241 float dist;
242 int sample_index;
243 world_audio_sample_distances( localplayer.rb.co, &sample_index, &dist );
244
245 audio_lock();
246 vg_dsp.echo_distances[sample_index] = dist;
247
248 v3f ears = { 1.0f,0.0f,0.0f };
249 m3x3_mulv( main_camera.transform, ears, ears );
250 v3_copy( ears, vg_audio.external_listener_ears );
251 v3_copy( main_camera.transform[3], vg_audio.external_listener_pos );
252
253 if( localplayer.gate_waiting ){
254 m4x3_mulv( localplayer.gate_waiting->transport,
255 vg_audio.external_listener_pos,
256 vg_audio.external_listener_pos );
257 }
258
259 v3_copy( localplayer.rb.v, vg_audio.external_lister_velocity );
260 audio_unlock();
261
262 menu_update();
263 vehicle_update_post();
264
265 #ifdef DEV_AARON
266 SDL_Scancode sc = SDL_GetScancodeFromKey( SDLK_q );
267 if( vg_input.sdl_keys[sc] ){
268 m4x3_mulv( main_camera.transform, (v3f){0.0f,0.0f,-3.0f},
269 aaron.rb.co );
270
271 v3_zero( aaron.rb.v );
272 v3_zero( aaron.rb.w );
273 rb_update_transform( &aaron.rb );
274 }
275
276 rb_object_debug( &aaron, VG__PINK );
277 #endif
278 }
279 }
280
281 VG_STATIC void vg_framebuffer_resize( int w, int h )
282 {
283 render_fb_resize();
284 }
285
286 VG_STATIC void present_view_with_post_processing(void)
287 {
288 glBindFramebuffer( GL_FRAMEBUFFER, 0 );
289 glViewport( 0,0, vg.window_x, vg.window_y );
290
291 glEnable(GL_BLEND);
292 glDisable(GL_DEPTH_TEST);
293 glBlendFunc(GL_ONE_MINUS_DST_ALPHA, GL_DST_ALPHA);
294 glBlendEquation(GL_FUNC_ADD);
295
296 v2f inverse;
297 render_fb_inverse_ratio( gpipeline.fb_main, inverse );
298
299 if( cl_blur ){
300 shader_blitblur_use();
301 shader_blitblur_uTexMain( 0 );
302 shader_blitblur_uTexMotion( 1 );
303 shader_blitblur_uBlurStrength( cl_blur_strength /
304 (vg.time_frame_delta*60.0) );
305 shader_blitblur_uInverseRatio( inverse );
306
307 v2f menu_blurring;
308 v2_muls( (v2f){ 0.04f, 0.001f }, menu_opacity, menu_blurring );
309 shader_blitblur_uOverrideDir( menu_blurring );
310
311 render_fb_bind_texture( gpipeline.fb_main, 0, 0 );
312 render_fb_bind_texture( gpipeline.fb_main, 1, 1 );
313 }
314 else{
315 shader_blit_use();
316 shader_blit_uTexMain( 0 );
317 shader_blit_uInverseRatio( inverse );
318 render_fb_bind_texture( gpipeline.fb_main, 0, 0 );
319 }
320
321 render_fsquad();
322 }
323
324 VG_STATIC void render_player_transparent(void)
325 {
326 static camera small_cam; /* DOES NOT NEED TO BE STATIC BUT MINGW
327 SAIS OTHERWISE */
328
329 m4x3_copy( main_camera.transform, small_cam.transform );
330
331 small_cam.fov = main_camera.fov;
332 small_cam.nearz = 0.05f;
333 small_cam.farz = 60.0f;
334
335 camera_update_view( &small_cam );
336 camera_update_projection( &small_cam );
337 camera_finalize( &small_cam );
338
339 /* Draw player to window buffer and blend background ontop */
340 glBindFramebuffer( GL_FRAMEBUFFER, 0 );
341 glViewport( 0,0, vg.window_x, vg.window_y );
342 player__render( &small_cam, &localplayer );
343 }
344
345 VG_STATIC void render_scene(void)
346 {
347 render_fb_bind( gpipeline.fb_main, 1 );
348 glClearColor( 0.0f, 0.0f, 0.0f, 1.0f );
349 glClear( GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT|GL_STENCIL_BUFFER_BIT );
350
351 /* Draw world */
352 glEnable( GL_DEPTH_TEST );
353
354 world_instance *view_world = localplayer.viewable_world;
355
356 if( view_world == NULL ){
357 glClearColor( 0.25f, 0.25f, 0.0f, 1.0f );
358 glClear( GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT|GL_STENCIL_BUFFER_BIT );
359 return;
360 }
361
362 world_prerender( view_world );
363 render_world( view_world, &main_camera, 0 );
364
365 render_water_texture( view_world, &main_camera, 0 );
366 render_fb_bind( gpipeline.fb_main, 1 );
367 render_water_surface( view_world, &main_camera );
368 }
369
370 VG_STATIC void render_scene_gate_subview(void)
371 {
372 render_fb_bind( gpipeline.fb_main, 1 );
373 world_instance *view_world = localplayer.viewable_world;
374
375 int depth = 1;
376 if( localplayer.gate_waiting ) depth = 0;
377 render_world_gates( view_world, &main_camera, depth );
378 }
379
380 VG_STATIC void render_main_game(void)
381 {
382 #if 0
383 static float fov = 60.0f;
384 float fov_target = vg_lerpf( 90.0f, 110.0f, cl_fov );
385
386 if( player.controller == k_player_controller_skate )
387 fov_target = vg_lerpf( 97.0f, 135.0f, cl_fov );
388
389 if( cl_menu )
390 fov_target = menu_fov_target;
391 fov = vg_lerpf( fov, fov_target, vg.frame_delta * 2.0f );
392 fov = freecam? 60.0f: fov;
393
394 main_camera.fov = fov;
395 #endif
396
397 player__pre_render( &localplayer );
398
399 v3_lerp( localplayer.cam.pos, menu_camera_pos, menu_opacity,
400 main_camera.pos );
401 main_camera.angles[0] =
402 vg_alerpf( localplayer.cam.angles[0], menu_camera_angles[0],
403 menu_opacity );
404 main_camera.angles[1] =
405 vg_lerpf ( localplayer.cam.angles[1], menu_camera_angles[1],
406 menu_opacity );
407
408 main_camera.fov = vg_lerpf( localplayer.cam.fov, menu_smooth_fov,
409 menu_opacity );
410
411 main_camera.fov = vg_lerpf( main_camera.fov, 90.0f,
412 global_skateshop.factive );
413 main_camera.nearz = 0.1f;
414 main_camera.farz = 2100.0f;
415
416 camera_update_transform( &main_camera );
417
418 if( localplayer.gate_waiting ){
419 m3x3_mul( localplayer.basis_gate, main_camera.transform,
420 main_camera.transform );
421 }
422 else{
423 m3x3_mul( localplayer.basis, main_camera.transform,
424 main_camera.transform );
425 }
426
427 camera_update_view( &main_camera );
428 camera_update_projection( &main_camera );
429 camera_finalize( &main_camera );
430
431 /* ========== Begin Frame ========== */
432
433 render_scene();
434
435 if( cl_menu ) {
436 //glClear( GL_DEPTH_BUFFER_BIT );
437 menu_render_bg();
438 glEnable( GL_DEPTH_TEST );
439 }
440
441 render_player_transparent();
442 render_scene_gate_subview();
443
444 present_view_with_post_processing();
445
446 if( cl_menu )
447 menu_render_fg( &main_camera );
448
449 /* =========== End Frame =========== */
450 }
451
452 VG_STATIC void vg_render(void)
453 {
454 if( skaterift_status == 0 ){
455 _vg_loader_render();
456 return;
457 }
458
459 glBindFramebuffer( GL_FRAMEBUFFER, 0 );
460
461 glViewport( 0,0, vg.window_x, vg.window_y );
462 glDisable( GL_DEPTH_TEST );
463
464 glClearColor( 1.0f, 0.0f, 0.0f, 0.0f );
465 glClear( GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT );
466
467 render_main_game();
468
469 m4x4_copy( main_camera.mtx.pv, vg.pv );
470
471 /* Other shite */
472 glDisable(GL_BLEND);
473 glDisable(GL_DEPTH_TEST);
474 vg_lines_drawall();
475 glViewport( 0,0, vg.window_x, vg.window_y );
476 gui_draw();
477 }
478
479 VG_STATIC void vg_ui(void)
480 {
481 if( skaterift_status == 0 ){
482 return;
483 }
484
485 #if 0
486 player__im_gui( &localplayer );
487 #endif
488 world_instance *world = get_active_world();
489 menu_crap_ui();
490
491 render_view_framebuffer_ui();
492 }
493
494 #endif