render: infinite full cylinder (30 FPS)

This commit is contained in:
Lephenixnoir 2022-08-20 17:55:41 +02:00
parent 96da3421d7
commit b9e01bc1ef
Signed by: Lephenixnoir
GPG Key ID: 1BBA026E13FC0495
4 changed files with 58 additions and 36 deletions

View File

@ -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
);

View File

@ -4,9 +4,9 @@
#include <vector>
#include <memory>
#ifndef PLATFORM_COUNT
# define PLATFORM_COUNT 10
#endif
#define PLATFORM_COUNT 10
#define LEVEL_BUFFER_LENGTH 12
typedef enum {
PLATFORM_EMPTY,

View File

@ -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;
}

View File

@ -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 */