From eed8df59824e6f1a09806faad6c485c5b5c638bc Mon Sep 17 00:00:00 2001 From: Zeno Rogue Date: Sat, 1 Jun 2019 17:01:04 +0200 Subject: [PATCH] better sky, sky color variation --- graph.cpp | 158 +++++++++++++++++++++++++++++++++++++++--------------- hyper.h | 18 +++++++ 2 files changed, 132 insertions(+), 44 deletions(-) diff --git a/graph.cpp b/graph.cpp index ab98007a..9bd7de00 100644 --- a/graph.cpp +++ b/graph.cpp @@ -4591,7 +4591,6 @@ int ceiling_category(cell *c) { case laHauntedWall: case laHauntedBorder: case laWhirlwind: - case laDragon: case laBurial: case laHalloween: case laReptile: @@ -4622,17 +4621,18 @@ int ceiling_category(cell *c) { case laEndorian: case laTortoise: case laPrairie: + case laDragon: case laSnakeNest: case laDocks: case laKraken: case laBrownian: + case laHell: return 2; case laBarrier: case laCaves: case laMirror: case laMirrorOld: - case laHell: case laCocytus: case laEmerald: case laDeadCaves: @@ -4677,13 +4677,79 @@ int get_skybrightness(int mul = 1) { return int(s * 255); } -void draw_euclidean_sky() { - if(!euclid) return; - if(WDIM == 3 || GDIM == 2) return; - transmatrix T = ggmatrix(currentmap->gamestart()); - T = gpushxto0(tC0(T)) * T; - queuepoly(T, cgi.shEuclideanSky, 0x0044e4FF); - queuepolyat(T * zpush(cgi.SKY+0.5) * xpush(cgi.SKY+0.5), cgi.shSun, 0xFFFF00FF, PPR::SKY); +dqi_sky *sky ; + +void prepare_sky() { + sky = NULL; + if(euclid) { + if(WDIM == 3 || GDIM == 2) return; + transmatrix T = ggmatrix(currentmap->gamestart()); + T = gpushxto0(tC0(T)) * T; + queuepoly(T, cgi.shEuclideanSky, 0x0044e4FF); + queuepolyat(T * zpush(cgi.SKY+0.5) * xpush(cgi.SKY+0.5), cgi.shSun, 0xFFFF00FF, PPR::SKY); + } + else { + sky = &queuea (PPR::SKY); + } + } + +void dqi_sky::draw() { + + vector skyvertices; + + int sk = get_skybrightness(); + + unordered_map colors; + #ifdef USE_UNORDERED_MAP + colors.reserve(isize(sky)); + #endif + for(sky_item& si: sky) colors[si.c] = darkena(gradient(0, si.color, 0, sk, 255), 0, 0xFF); + + hyperpoint skypoint = cpush0(2, cgi.SKY); + + vector this_poly; + + for(sky_item& si: sky) { + auto c = si.c; + for(int i=0; itype; i++) { + + if(1) { + cellwalker cw0(c, i); + cellwalker cw = cw0; + do { + cw += wstep; cw++; + if(cw.at < c || !colors.count(si.c)) goto next; + } + while(cw != cw0); + + this_poly.clear(); + + transmatrix T1 = si.T; + do { + this_poly.emplace_back(T1 * skypoint, colors[cw.at]); + T1 = T1 * cellrelmatrix(cw.at, cw.spin); + cw += wstep; cw++; + } + while(cw != cw0); + + int k = isize(this_poly); + for(int j=2; jset_all(0); + glhr::switch_mode(glhr::gmVarColored, glhr::new_shader_projection); + for(auto& v: skyvertices) for(int i=0; i<3; i++) v.color[i] *= 2; + glhr::prepare(skyvertices); + glhr::set_fogbase(1.0 + 5 / sightranges[geometry]); + glDrawArrays(GL_TRIANGLES, 0, isize(skyvertices)); } void draw_ceiling(cell *c, const transmatrix& V, int fd, color_t& fcol, color_t& wcol) { @@ -4697,16 +4763,12 @@ void draw_ceiling(cell *c, const transmatrix& V, int fd, color_t& fcol, color_t& if(fieldpattern::fieldval_uniq(c) % 3 == 0) { queuepolyat(V * zpush(cgi.SKY+0.5), cgi.shNightStar, 0xFFFFFFFF, PPR::SKY); } - int sk = get_skybrightness(); - if(sk > 0) { - auto sky = draw_shapevec(c, V, cgi.shFullFloor.levels[SIDE_SKY], 0x000000FF + 0x100 * (sk/17), PPR::SKY); - if(sky) sky->tinf = NULL, sky->flags |= POLY_INTENSE; - } + sky->sky.emplace_back(sky_item{c, V, 0x00000F}); if(c->land == laAsteroids) { if(fieldpattern::fieldval_uniq(c) % 9 < 3) { queuepolyat(V * zpush(-0.5-cgi.SKY), cgi.shNightStar, 0xFFFFFFFF, PPR::SKY); } - sk = get_skybrightness(-1); + int sk = get_skybrightness(-1); auto sky = draw_shapevec(c, V * MirrorZ, cgi.shFullFloor.levels[SIDE_SKY], 0x000000FF + 0x100 * (sk/17), PPR::SKY); if(sky) sky->tinf = NULL, sky->flags |= POLY_INTENSE; } @@ -4716,26 +4778,39 @@ void draw_ceiling(cell *c, const transmatrix& V, int fd, color_t& fcol, color_t& case 2: { if(euclid) return; color_t col; - if(c->land == laWineyard) { - col = 0x4040FF; - if(emeraldval(c) / 4 == 11) { - queuepolyat(V * zpush(cgi.SKY+0.5), cgi.shSun, 0xFFFF00FF, PPR::SKY); + + switch(c->land) { + case laWineyard: + col = 0x4040FF; + if(emeraldval(c) / 4 == 11) { + queuepolyat(V * zpush(cgi.SKY+0.5), cgi.shSun, 0xFFFF00FF, PPR::SKY); + } + break; + + case laDesert: + case laRedRock: + col = 0x4040FF; + break; + + case laAlchemist: + col = fcol; + break; + + case laDragon: + col = c->wall == waChasm ? 0xFFFFFF : 0x4040FF; + break; + + default: { + int cd = (euclid || stdhyperbolic) ? getCdata(c, 1) : 0; + int z = (cd * 5) & 127; + if(z >= 64) z = 127 - z; + if(c->land == laHell) + col = z < 32 ? gradient(0x400000, 0xFF0000, 0, z, 32) : gradient(0xFF0000, 0xFFFF00, 32, z, 63); + else + col = gradient(0x4040FF, 0xFFFFFF, 0, z, 63); } } - else { - int cd = (euclid || stdhyperbolic) ? getCdata(c, 1) : 0; - int z = cd & 127; - if(z >= 64) z = 127 - z; - col = gradient(0x4040FF, 0xFFFFFF, 0, z, 63); - } - int sk = get_skybrightness(); - if(sk > 0) { - col = gradient(0, col, 0, sk, 255); - col = darkena(col, 0, 255); - auto sky = draw_shapevec(c, V, cgi.shFullFloor.levels[SIDE_SKY], col, PPR::SKY); - if(sky) sky->tinf = NULL; - } - + sky->sky.emplace_back(c, V, col); return; } @@ -4747,6 +4822,7 @@ void draw_ceiling(cell *c, const transmatrix& V, int fd, color_t& fcol, color_t& color_t wcol2 = gradient(0, wcol, 0, .8, 1); placeSidewall(c, i, SIDE_SKY, V, darkena(wcol2, fd, 0xFF)); } + sky->sky.emplace_back(c, V, 0); return; } @@ -4772,11 +4848,7 @@ void draw_ceiling(cell *c, const transmatrix& V, int fd, color_t& fcol, color_t& if(true) { queuepolyat(V * zpush(cgi.SKY+0.5), cgi.shNightStar, 0xFFFFFFFF, PPR::SKY); } - int sk = get_skybrightness(); - if(sk > 0) { - auto sky = draw_shapevec(c, V, cgi.shFullFloor.levels[SIDE_SKY], 0x000000FF + 0x100 * (sk/17), PPR::SKY); - if(sky) sky->tinf = NULL, sky->flags |= POLY_INTENSE; - } + sky->sky.emplace_back(c, V, 0x00000F); break; } @@ -4794,11 +4866,7 @@ void draw_ceiling(cell *c, const transmatrix& V, int fd, color_t& fcol, color_t& if(true) { queuepolyat(V * zpush(cgi.SKY+0.5), cgi.shNightStar, 0xFFFFFFFF, PPR::SKY); } - int sk = get_skybrightness(); - if(sk > 0) { - auto sky = draw_shapevec(c, V, cgi.shFullFloor.levels[SIDE_SKY], 0x000000FF + 0x100 * (sk/17), PPR::SKY); - if(sky) sky->tinf = NULL, sky->flags |= POLY_INTENSE; - } + sky->sky.emplace_back(c, V, 0x00000F); } } } @@ -7247,7 +7315,9 @@ void drawfullmap() { draw_boundary(1); draw_model_elements(); - draw_euclidean_sky(); + #if MAXMDIM >= 4 + prepare_sky(); + #endif #endif /* if(vid.wallmode < 2 && !euclid && !patterns::whichShape) { diff --git a/hyper.h b/hyper.h index e856e960..daf58dd4 100644 --- a/hyper.h +++ b/hyper.h @@ -2983,6 +2983,19 @@ struct dqi_action : drawqueueitem { void draw() { action(); } virtual color_t outline_group() { return 2; } }; + +struct sky_item { + cell *c; + transmatrix T; + color_t color; + sky_item(cell *_c, const transmatrix _T, color_t _color) : c(_c), T(_T), color(_color) {} + }; + +struct dqi_sky : drawqueueitem { + vector sky; + void draw(); + virtual color_t outline_group() { return 3; } + }; extern int emeraldtable[100][7]; @@ -4006,6 +4019,11 @@ namespace glhr { color[2] = b; color[3] = 1; } + colored_vertex(hyperpoint h, color_t col) { + coords = pointtogl(h); + for(int i=0; i<4; i++) + color[i] = part(col, 3-i) / 255.0; + } }; struct textured_vertex {