From d32232d9cbd6a9a4693d424a9a8d46a42dfb4945 Mon Sep 17 00:00:00 2001 From: Zeno Rogue Date: Thu, 21 Dec 2017 17:07:21 +0100 Subject: [PATCH] fixed Mercator with textures and NANs --- polygons.cpp | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/polygons.cpp b/polygons.cpp index 163c08fc..d9cd396b 100644 --- a/polygons.cpp +++ b/polygons.cpp @@ -439,8 +439,8 @@ double linewidthat(const hyperpoint& h, double minwidth) { int mercator_coord; int mercator_loop_min = 0, mercator_loop_max = 0; -void fixMercator() { - +void fixMercator(bool tinf) { + ld period = 4 * vid.radius; ld hperiod = period / 2; @@ -469,10 +469,15 @@ void fixMercator() { maxcoord = max(maxcoord, glcoords[i][mercator_coord]); } + if(abs(mincoord) > 50000 || abs(maxcoord) > 50000 || isnan(mincoord) || isnan(maxcoord)) { + mercator_loop_max--; + return; + } + ld last = first; while(last < next - hperiod) last += period; while(last > next + hperiod) last -= period; - + if(first == last) { while(mincoord > cmin) mercator_loop_min--, mincoord -= period; @@ -480,6 +485,10 @@ void fixMercator() { mercator_loop_max++, maxcoord += period; } else { + if(tinf) { + // this cannot work in Mercator + mercator_loop_max--; return; + } if(last < first) { reverse(glcoords, glcoords+qglcoords); swap(first, last); @@ -572,7 +581,7 @@ void drawpolyline(polytodraw& p) { mercator_loop_min = mercator_loop_max = 0; if(sphere && pmodel == mdBand) - fixMercator(); + fixMercator(pp.tinf); int poly_limit = max(vid.xres, vid.yres) * 2; @@ -609,7 +618,6 @@ void drawpolyline(polytodraw& p) { for(int l=mercator_loop_min; l <= mercator_loop_max; l++) { if(l || lastl) { - if(pp.tinf) return; for(int i=0; i