From 88d6c0d144454bfddfe46c9433acc6cdf4e254b8 Mon Sep 17 00:00:00 2001 From: Zeno Rogue Date: Wed, 29 May 2019 01:59:01 +0200 Subject: [PATCH] 2D3D:: better stars --- 3d-models.cpp | 36 ++++++++++++++++++++++++++++++++++-- graph.cpp | 24 ++++++------------------ hyper.h | 2 ++ 3 files changed, 42 insertions(+), 20 deletions(-) diff --git a/3d-models.cpp b/3d-models.cpp index e8aa593f..a888f1ad 100644 --- a/3d-models.cpp +++ b/3d-models.cpp @@ -642,6 +642,38 @@ void geometry_information::make_ball(hpcshape& sh, ld rad, int lev) { add_texture(sh); } +void geometry_information::hpcsquare(hyperpoint h1, hyperpoint h2, hyperpoint h3, hyperpoint h4) { + last->flags |= POLY_TRIANGLES; + hpcpush(h1); + hpcpush(h2); + hpcpush(h3); + hpcpush(h2); + hpcpush(h3); + hpcpush(h4); + } + +void geometry_information::make_star(hpcshape& sh, ld rad) { + bshape(sh, sh.prio); + rad = sinh(rad); + sh.flags |= POLY_TRIANGLES | POLY_INTENSE; + for(int a=0; a<64; a++) { + ld z0 = (a-32)/32.; + ld z1 = (a-31)/32.; + ld r0 = sqrt(1 - z0*z0) * rad; + ld r1 = sqrt(1 - z1*z1) * rad; + z0 *= rad; + z1 *= rad; + for(int b=0; b<360; b+=15) { + ld b0 = b * degree; + ld b1 = (b+15) * degree; + hpcsquare( + hpxy3(r0 * cos(b0), r0 * sin(b0), z0), hpxy3(r0 * cos(b1), r0 * sin(b1), z0), + hpxy3(r1 * cos(b0), r1 * sin(b0), z1), hpxy3(r1 * cos(b1), r1 * sin(b1), z1) + ); + } + } + } + hyperpoint psmin(hyperpoint H) { hyperpoint res; res[2] = asin_auto(H[2]); @@ -978,8 +1010,8 @@ void geometry_information::make_3d_models() { if(euclid) make_ball(shSun, 0.5, 2); else - make_ball(shSun, 3, 5); - make_ball(shNightStar, 0.75, 2); + make_star(shSun, 3); + make_star(shNightStar, 0.75); if(WDIM == 2) { for(int i=0; i<3; i++) { diff --git a/graph.cpp b/graph.cpp index 7ddac0fd..bbe9ae23 100644 --- a/graph.cpp +++ b/graph.cpp @@ -4633,9 +4633,7 @@ void draw_euclidean_sky() { } queuecurve(0, 0x0044e4FF, PPR::EUCLIDEAN_SKY).flags |= POLY_TRIANGLES; - auto &sun = queuepolyat(T * zpush(cgi.SKY+0.5) * xpush(cgi.SKY+0.5), cgi.shSun, 0xFFFF00FF, PPR::SKY); - sun.tinf = NULL; - sun.flags |= POLY_INTENSE; + queuepolyat(T * zpush(cgi.SKY+0.5) * xpush(cgi.SKY+0.5), cgi.shSun, 0xFFFF00FF, PPR::SKY); } void draw_ceiling(cell *c, const transmatrix& V, int fd, color_t& fcol, color_t& wcol) { @@ -4647,9 +4645,7 @@ void draw_ceiling(cell *c, const transmatrix& V, int fd, color_t& fcol, color_t& case 1: { if(euclid) return; if(fieldpattern::fieldval_uniq(c) % 3 == 0) { - auto &star = queuepolyat(V * zpush(cgi.SKY+0.5), cgi.shNightStar, 0xFFFFFFFF, PPR::SKY); - star.tinf = NULL; - star.flags |= POLY_INTENSE; + queuepolyat(V * zpush(cgi.SKY+0.5), cgi.shNightStar, 0xFFFFFFFF, PPR::SKY); } int sk = get_skybrightness(); if(sk > 0) { @@ -4658,9 +4654,7 @@ void draw_ceiling(cell *c, const transmatrix& V, int fd, color_t& fcol, color_t& } if(c->land == laAsteroids) { if(fieldpattern::fieldval_uniq(c) % 9 < 3) { - auto &downstar = queuepolyat(V * zpush(-0.5-cgi.SKY), cgi.shNightStar, 0xFFFFFFFF, PPR::SKY); - downstar.tinf = NULL; - downstar.flags |= POLY_INTENSE; + queuepolyat(V * zpush(-0.5-cgi.SKY), cgi.shNightStar, 0xFFFFFFFF, PPR::SKY); } sk = get_skybrightness(-1); auto sky = draw_shapevec(c, V * MirrorZ, cgi.shFullFloor.levels[SIDE_SKY], 0x000000FF + 0x100 * (sk/17), PPR::SKY); @@ -4675,9 +4669,7 @@ void draw_ceiling(cell *c, const transmatrix& V, int fd, color_t& fcol, color_t& if(c->land == laWineyard) { col = 0x4040FF; if(emeraldval(c) / 4 == 11) { - auto &sun = queuepolyat(V * zpush(cgi.SKY+0.5), cgi.shSun, 0xFFFF00FF, PPR::SKY); - sun.tinf = NULL; - sun.flags |= POLY_INTENSE; + queuepolyat(V * zpush(cgi.SKY+0.5), cgi.shSun, 0xFFFF00FF, PPR::SKY); } } else { @@ -4728,9 +4720,7 @@ void draw_ceiling(cell *c, const transmatrix& V, int fd, color_t& fcol, color_t& if(euclid) return; if(true) { - auto &star = queuepolyat(V * zpush(cgi.SKY+0.5), cgi.shNightStar, 0xFFFFFFFF, PPR::SKY); - star.tinf = NULL; - star.flags |= POLY_INTENSE; + queuepolyat(V * zpush(cgi.SKY+0.5), cgi.shNightStar, 0xFFFFFFFF, PPR::SKY); } int sk = get_skybrightness(); if(sk > 0) { @@ -4752,9 +4742,7 @@ void draw_ceiling(cell *c, const transmatrix& V, int fd, color_t& fcol, color_t& if(euclid) return; if(true) { - auto &star = queuepolyat(V * zpush(cgi.SKY+0.5), cgi.shNightStar, 0xFFFFFFFF, PPR::SKY); - star.tinf = NULL; - star.flags |= POLY_INTENSE; + queuepolyat(V * zpush(cgi.SKY+0.5), cgi.shNightStar, 0xFFFFFFFF, PPR::SKY); } int sk = get_skybrightness(); if(sk > 0) { diff --git a/hyper.h b/hyper.h index 83fbdf63..757c9006 100644 --- a/hyper.h +++ b/hyper.h @@ -4467,6 +4467,7 @@ hpcshape void prepare_usershapes(); void hpcpush(hyperpoint h); + void hpcsquare(hyperpoint h1, hyperpoint h2, hyperpoint h3, hyperpoint h4); void chasmifyPoly(double fac, double fac2, int k); void shift(hpcshape& sh, double dx, double dy, double dz); void initPolyForGL(); @@ -4522,6 +4523,7 @@ hpcshape void slimetriangle(hyperpoint a, hyperpoint b, hyperpoint c, ld rad, int lev); void balltriangle(hyperpoint a, hyperpoint b, hyperpoint c, ld rad, int lev); void make_ball(hpcshape& sh, ld rad, int lev); + void make_star(hpcshape& sh, ld rad); void adjust_eye(hpcshape& eye, hpcshape head, ld shift_eye, ld shift_head, int q, ld zoom=1); void shift_last_straight(ld z); void queueball(const transmatrix& V, ld rad, color_t col, eItem what);