#include "level.h" #include "generator.h" #include "render.h" #include #include #include #include #include #include #include #define RGB24(hex) \ (((hex & 0xf80000) >> 8) | \ ((hex & 0x00fc00) >> 5) | \ ((hex & 0x0000f8) >> 3)) constexpr int bg = RGB24(0x49759f); int main(void) { __printf_enable_fp(); prof_init(); azrp_config_scale(1); azrp_shader_clear_configure(); // azrp_shader_image_rgb16_configure(); // azrp_shader_image_p8_configure(); // azrp_shader_image_p4_configure(); azrp_shader_triangle_configure(); render_init(); level_t level = level_create(1); int volatile need_frame = 1; int last_frame_us = 0; int timer = timer_configure(TIMER_ANY, 33000, GINT_CALL_SET(&need_frame)); timer_start(timer); num t = 0.0; num player_z = 0.0; num level_z = 0.0; num player_speed = 5.0; int sections_passed = 0; bool game_run = true; while(game_run) { while(!need_frame) sleep(); need_frame = 0; num dt = 1.0 / 30; t += dt; prof_t perf_frame = prof_make(); prof_enter_norec(perf_frame); level_update(&level); //--- // Rendering //--- azrp_perf_clear(); azrp_clear(bg); struct camera camera; camera.pos = vec3(0, RENDER_CAMERA_DEPTH, 0); vec2 screen_size(DWIDTH, DHEIGHT); prof_t perf_comp = prof_make(); prof_enter_norec(perf_comp); for(int depth = RENDER_SECTION_DISTANCE - 1; depth >= 0; depth--) { num z = depth * RENDER_SECTION_LENGTH - level_z; struct section *s = &level.section_buffer[depth]; for(int i = 0; i < PLATFORM_COUNT; i++) { /* Set this to get the full tunnel test */ constexpr bool full_tunnel = false; int color = C_WHITE; if(full_tunnel) { int gray = ((i + depth + sections_passed) % PLATFORM_COUNT) * 31 / PLATFORM_COUNT; color = C_RGB(gray, gray, gray); } else { if(s->platforms[i].type != PLATFORM_WHITE) continue; } struct prect p = render_platform_position(i, z); /* Near plane clipping */ if(p.fl.z <= num(0.2)) continue; if(p.nl.z <= num(0.2)) p.nl.z = num(0.2); if(p.nr.z <= num(0.2)) p.nr.z = num(0.2); camera_project_prect(&camera, &p, screen_size); render_triangle(&p.nl, &p.fr, &p.fl, color); render_triangle(&p.fr, &p.nl, &p.nr, color); } } prof_leave_norec(perf_comp); azrp_update(); static bool show_footer = false; if(show_footer) { drect(0, DHEIGHT-20, DWIDTH-1, DHEIGHT-1, C_WHITE); dprint(4, 209, C_BLACK, "render:%4d+%4dus comp:%4dus FPS:%02d", prof_time(azrp_perf_render) - prof_time(azrp_perf_r61524), prof_time(azrp_perf_r61524), prof_time(perf_comp), last_frame_us ? 1000000 / last_frame_us : 0); r61524_display(gint_vram, DHEIGHT-20, 20, R61524_DMA_WAIT); } show_footer = !show_footer; //--- // Input //--- key_event_t ev; while((ev = pollevent()).type != KEYEV_NONE) { if(ev.type == KEYEV_UP) continue; if(ev.key == KEY_EXIT || ev.key == KEY_MENU) game_run = false; if(ev.key == KEY_F1) { level = level_create(1); level_update(&level); } if(ev.key == KEY_F2) { level = level_create(2); level_update(&level); } if(ev.key == KEY_F3) { level = level_create(3); level_update(&level); } } if(!game_run) break; //--- // Simulation //--- player_z += player_speed * dt; level_z += player_speed * dt; while(level_z > num(RENDER_SECTION_LENGTH)) { level_advance(&level); level_z -= RENDER_SECTION_LENGTH; sections_passed++; } //--- prof_leave_norec(perf_frame); last_frame_us = prof_time(perf_frame); } timer_stop(timer); return 0; }