From 1d4da2ba1f23d28758116812aa0469f0dc21fb91 Mon Sep 17 00:00:00 2001 From: John Tsiombikas Date: Sat, 20 May 2023 16:06:17 +0300 Subject: [PATCH] wall noise and arbitrary render resolution option --- sdr/raydungeon.p.glsl | 136 ++++++++++++++++++++++++++++++++++++++++++++++++- src/level.c | 12 ++--- src/main.c | 2 +- src/options.c | 25 ++++++--- src/options.h | 2 +- src/scr_game.c | 63 +++++++++++++++++++---- src/scr_lvled.c | 2 +- 7 files changed, 216 insertions(+), 26 deletions(-) diff --git a/sdr/raydungeon.p.glsl b/sdr/raydungeon.p.glsl index c10be18..d6d8442 100644 --- a/sdr/raydungeon.p.glsl +++ b/sdr/raydungeon.p.glsl @@ -3,8 +3,8 @@ uniform mat4 matrix; uniform mat3 dirmatrix; #define DIST_THRES 1e-3 -#define MAX_ITER 250 -#define MAX_STEP 1.0 +#define MAX_ITER 128 +#define MAX_STEP 0.5 vec3 raymarch(inout vec3 p, in vec3 dir, out float depth); vec3 shade(in vec3 p, in vec3 dir, in float dist, in float total_dist); @@ -16,6 +16,12 @@ vec3 primray(in vec2 uv, out vec3 org); float boxdist(in vec3 p, in vec3 b); float sphdist(in vec3 p, in vec3 sp, in float srad); +float fbm(vec3 v, int noct); +float snoise(vec3 v); + +float eval_sdf_gen(in vec3 p); + + void main() { vec2 uv = gl_TexCoord[0].st; @@ -82,6 +88,11 @@ vec3 backdrop(in vec3 dir) return vec3(0.1, 0.1, 0.1); } +float eval_sdf(in vec3 p) +{ + return eval_sdf_gen(p) + fbm(p, 4) * 0.05; +} + #define DELTA 1e-4 vec3 eval_grad(in vec3 p, float dist) { @@ -115,3 +126,124 @@ float sphdist(in vec3 p, in vec3 sp, in float srad) { return length(p - sp) - srad; } + +#ifdef TEST_SDF +float eval_sdf_gen(in vec3 p) +{ + return boxdist(p - vec3(14.000000, 0.0, 14.000000), vec3(0.550000, 1.0, 4.550000)); +} +#endif + +float fbm(vec3 v, int noct) +{ + float val = 0.0; + float f = 1.0; + for(int i=0; ixsz && cell->type != CELL_SOLID) { + while(x++ < lvl->xsz && cell->type == CELL_SOLID) { ra.w++; cell++; } @@ -48,7 +48,7 @@ static int grow_rect(struct level *lvl, struct level_cell *orgcell, struct level while(y++ < lvl->ysz) { int rowsz = 0; x = ra.x; - while(x++ < lvl->xsz && cell->type != CELL_SOLID) { + while(x++ < lvl->xsz && cell->type == CELL_SOLID) { rowsz++; cell++; } @@ -60,7 +60,7 @@ static int grow_rect(struct level *lvl, struct level_cell *orgcell, struct level /* then try the same thing, but vertical first */ cell = orgcell + lvl->xsz; y = rb.y + 1; - while(y++ < lvl->ysz && cell->type != CELL_SOLID) { + while(y++ < lvl->ysz && cell->type == CELL_SOLID) { rb.h++; cell += lvl->xsz; } @@ -70,7 +70,7 @@ static int grow_rect(struct level *lvl, struct level_cell *orgcell, struct level int colsz = 0; y = rb.y; cell = lvl->cells + y * lvl->xsz + x; - while(y++ < lvl->ysz && cell->type != CELL_SOLID) { + while(y++ < lvl->ysz && cell->type == CELL_SOLID) { colsz++; cell += lvl->xsz; } @@ -113,7 +113,7 @@ void lvl_gen_rects(struct level *lvl) cell = lvl->cells; for(i=0; iysz; i++) { for(j=0; jxsz; j++) { - if(cell->type != CELL_SOLID && !cell->visited) { + if(cell->type == CELL_SOLID && !cell->visited) { rect.x = j; rect.y = i; rect.w = rect.h = 1; @@ -183,7 +183,7 @@ int save_level(const struct level *lvl, const char *fname) fprintf(fp, "SDRSTART\n"); - fprintf(fp, "float eval_sdf(in vec3 p)\n"); + fprintf(fp, "float eval_sdf_gen(in vec3 p)\n"); fprintf(fp, "{\n"); rect = lvl->rects; for(i=0; ixsz / 2.0f) * lvl->scale; + cam_pan.x = -lvl->sx * lvl->scale; cam_pan.y = 0; - cam_pan.z = -(lvl->ysz / 2.0f) * lvl->scale; + cam_pan.z = -lvl->sy * lvl->scale; glEnable(GL_DEPTH_TEST); if(lvl->sdf_src) { add_shader_footer(GL_FRAGMENT_SHADER, lvl->sdf_src); } else { - add_shader_footer(GL_FRAGMENT_SHADER, "float eval_sdf(in vec3 p) { return 10000.0; }\n"); + add_shader_header(GL_FRAGMENT_SHADER, "#define TEST_SDF\n"); } if(!(sdr = create_program_load("sdr/raydungeon.v.glsl", "sdr/raydungeon.p.glsl"))) { return -1; @@ -84,6 +92,9 @@ static void gdisplay(void) float x, y; struct level_cell *cell; + glBindFramebuffer(GL_FRAMEBUFFER, fbo); + glViewport(0, 0, rbuf_width, rbuf_height); + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); cgm_mtranslation(view_mat, 0, 0, -cam_dist); @@ -113,22 +124,56 @@ static void gdisplay(void) for(j=0; jxsz; j++) { x = (float)j * lvl->scale; if(cell->type) { - glVertex3f(x - 0.48, -1, y - 0.48); - glVertex3f(x + 0.48, -1, y - 0.48); - glVertex3f(x + 0.48, -1, y + 0.48); - glVertex3f(x - 0.48, -1, y + 0.48); + glVertex3f(x - 0.48 * lvl->scale, -1, y - 0.48 * lvl->scale); + glVertex3f(x + 0.48 * lvl->scale, -1, y - 0.48 * lvl->scale); + glVertex3f(x + 0.48 * lvl->scale, -1, y + 0.48 * lvl->scale); + glVertex3f(x - 0.48 * lvl->scale, -1, y + 0.48 * lvl->scale); } cell++; } } glEnd(); + + glViewport(0, 0, win_width, win_height); + glBindFramebuffer(GL_READ_FRAMEBUFFER, fbo); + glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0); + glBlitFramebuffer(0, 0, rbuf_width, rbuf_height, 0, 0, win_width, win_height, + GL_COLOR_BUFFER_BIT, GL_NEAREST); + glBindFramebuffer(GL_FRAMEBUFFER, 0); } static void greshape(int x, int y) { - cgm_mperspective(proj_mat, cgm_deg_to_rad(60), win_aspect, 0.5, 40.0); + cgm_mperspective(proj_mat, cgm_deg_to_rad(60), win_aspect, 0.5, 200.0); glMatrixMode(GL_PROJECTION); glLoadMatrixf(proj_mat); + + rbuf_width = ((int)(x * opt.gfx.render_res) + 3) & 0xfffffc; + rbuf_height = ((int)(y * opt.gfx.render_res) + 3) & 0xfffffc; + printf("render buffer %dx%d\n", rbuf_width, rbuf_height); + + if(!fbo) { + glGenFramebuffers(1, &fbo); + glBindFramebuffer(GL_FRAMEBUFFER, fbo); + + glGenRenderbuffers(1, &rbuf_col); + glBindRenderbuffer(GL_RENDERBUFFER, rbuf_col); + glRenderbufferStorage(GL_RENDERBUFFER, GL_RGB, rbuf_width, rbuf_height); + glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, rbuf_col); + + glGenRenderbuffers(1, &rbuf_zbuf); + glBindRenderbuffer(GL_RENDERBUFFER, rbuf_zbuf); + glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT24, rbuf_width, rbuf_height); + glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, rbuf_zbuf); + + glBindFramebuffer(GL_FRAMEBUFFER, 0); + } else { + glBindRenderbuffer(GL_RENDERBUFFER, rbuf_col); + glRenderbufferStorage(GL_RENDERBUFFER, GL_RGB, rbuf_width, rbuf_height); + + glBindRenderbuffer(GL_RENDERBUFFER, rbuf_zbuf); + glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT24, rbuf_width, rbuf_height); + } } static void gkeyb(int key, int press) diff --git a/src/scr_lvled.c b/src/scr_lvled.c index 3b5eda3..70df9f5 100644 --- a/src/scr_lvled.c +++ b/src/scr_lvled.c @@ -118,7 +118,7 @@ static void reshape(int x, int y) { float proj_mat[16]; - cgm_mperspective(proj_mat, cgm_deg_to_rad(60), win_aspect, 0.5, 40.0); + cgm_mperspective(proj_mat, cgm_deg_to_rad(60), win_aspect, 0.5, 500.0); glMatrixMode(GL_PROJECTION); glLoadMatrixf(proj_mat); } -- 1.7.10.4