From b9e01bc1ef6f841d60e98ef5f6049bb6ffb9d6c6 Mon Sep 17 00:00:00 2001 From: Lephenixnoir Date: Sat, 20 Aug 2022 17:55:41 +0200 Subject: [PATCH] render: infinite full cylinder (30 FPS) --- src/level.cpp | 6 ++-- src/level.h | 6 ++-- src/main.cpp | 80 ++++++++++++++++++++++++++++++++------------------- src/render.h | 2 ++ 4 files changed, 58 insertions(+), 36 deletions(-) diff --git a/src/level.cpp b/src/level.cpp index 3c4f4f7..e762e73 100644 --- a/src/level.cpp +++ b/src/level.cpp @@ -21,7 +21,7 @@ level_t level_create(int level) void level_update(level_t *level) { - while (level->section_buffer.size() < 5) { + while (level->section_buffer.size() < LEVEL_BUFFER_LENGTH) { level->gen->generate(level); } } @@ -41,11 +41,11 @@ void level_display(level_t *level) dsize("@", NULL, &w, &h); sx = (DWIDTH - (PLATFORM_COUNT * w)) / 2; - sy = (DHEIGHT - (5 * h)) / 2; + sy = (DHEIGHT - (LEVEL_BUFFER_LENGTH * h)) / 2; drect_border( sx, sy, - sx + (PLATFORM_COUNT * w), sy + (5 * h), + sx + (PLATFORM_COUNT * w), sy + (LEVEL_BUFFER_LENGTH * h), C_NONE, 2, C_BLACK ); diff --git a/src/level.h b/src/level.h index 095d261..bd88afe 100644 --- a/src/level.h +++ b/src/level.h @@ -4,9 +4,9 @@ #include #include -#ifndef PLATFORM_COUNT -# define PLATFORM_COUNT 10 -#endif +#define PLATFORM_COUNT 10 + +#define LEVEL_BUFFER_LENGTH 12 typedef enum { PLATFORM_EMPTY, diff --git a/src/main.cpp b/src/main.cpp index c55dbb4..1e1c9e4 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -21,57 +21,65 @@ int main(void) level_t level = level_create(1); -/* int volatile need_frame = 1; + int volatile need_frame = 1; int timer = timer_configure(TIMER_ANY, 33000, GINT_CALL_SET(&need_frame)); timer_start(timer); - float t = 0.0; */ + + 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) { -/* float dt = 1.0 / 30; - t += dt; */ + num dt = 1.0 / 30; + t += dt; level_update(&level); - // TODO: display + //--- + // Rendering + //--- + azrp_perf_clear(); azrp_clear(C_WHITE); -// dclear(C_WHITE); struct camera camera; camera.pos = vec3(0, RENDER_CAMERA_DEPTH, 0); vec2 screen_size(DWIDTH, DHEIGHT); - for(int i = 0; i < PLATFORM_COUNT; i++) { - int gray = i * 31 / PLATFORM_COUNT; - int color = C_RGB(gray, gray, gray); + for(int depth = RENDER_SECTION_DISTANCE - 1; depth >= 0; depth--) { + num z = depth * RENDER_SECTION_LENGTH - level_z; - struct prect p = render_platform_position(i, num(3.0)); - 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); + for(int i = 0; i < PLATFORM_COUNT; i++) { + int gray = ((i + depth + sections_passed) % PLATFORM_COUNT) + * 31 / PLATFORM_COUNT; + int color = C_RGB(gray, gray, gray); -/* dprint(4, i*14+4, C_BLACK, - "%d (%d): nl=%d/%d nr=%d/%d z=%d|%d", - i, gray, - (int)p.nl.x, (int)p.nl.y, - (int)p.nr.x, (int)p.nr.y, - (int)p.nl.z, (int)p.fl.z); - extern float get_near_plane(void); - dprint(4, 180, C_BLACK, "FOV=%g", get_near_plane()); */ + struct prect p = render_platform_position(i, z); + /* Near plane clipping */ + if(p.fl.z <= num(0.1) || p.fr.z <= num(0.1)) continue; + if(p.nl.z <= num(0.1)) p.nl.z = num(0.1); + if(p.nr.z <= num(0.1)) p.nr.z = num(0.1); + + 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); + } } azrp_update(); -// dupdate(); drect(0, DHEIGHT-20, DWIDTH-1, DHEIGHT-1, C_WHITE); - dprint(1, 210, C_BLACK, "cmdgen:%03dus sort:%03dus render:%4d+%4dus", - prof_time(azrp_perf_cmdgen), - prof_time(azrp_perf_sort), + dprint(1, 210, C_BLACK, "render:%4d+%4dus level_z=%f", prof_time(azrp_perf_render) - prof_time(azrp_perf_r61524), - prof_time(azrp_perf_r61524)); + prof_time(azrp_perf_r61524), + (float)level_z); r61524_display(gint_vram, DHEIGHT-20, 20, R61524_DMA_WAIT); -// level_display(&level); + //--- + // Input + //--- key_event_t ev; while((ev = pollevent()).type != KEYEV_NONE) { @@ -80,8 +88,6 @@ int main(void) if(ev.key == KEY_EXIT || ev.key == KEY_MENU) game_run = false; - if(ev.key == KEY_EXE) - level_advance(&level); if(ev.key == KEY_F1) level = level_create(1); if(ev.key == KEY_F2) @@ -89,8 +95,22 @@ int main(void) if(ev.key == KEY_F3) level = level_create(3); } + + 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++; + } } -// timer_stop(timer); + timer_stop(timer); return 0; } diff --git a/src/render.h b/src/render.h index 75102b6..4ba9083 100644 --- a/src/render.h +++ b/src/render.h @@ -13,6 +13,8 @@ using namespace libnum; #define RENDER_CAMERA_DEPTH (RENDER_RADIUS / 2) /* Section lengths, in world units */ #define RENDER_SECTION_LENGTH num(4.0) +/* Number of sections visible in advance */ +#define RENDER_SECTION_DISTANCE 5 struct prect { vec3 nl, nr; /* Near left and near right points */