render: infinite full cylinder (30 FPS)
This commit is contained in:
parent
96da3421d7
commit
b9e01bc1ef
|
@ -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
|
||||
);
|
||||
|
||||
|
|
|
@ -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,
|
||||
|
|
80
src/main.cpp
80
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;
|
||||
}
|
||||
|
|
|
@ -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 */
|
||||
|
|
Loading…
Reference in New Issue