mirror of
https://github.com/zenorogue/hyperrogue.git
synced 2024-11-28 06:39:55 +00:00
in spherical equi-models, use the correct circle as the boundary, instead of the whole screen
This commit is contained in:
parent
6efc503818
commit
68f4eb537a
31
polygons.cpp
31
polygons.cpp
@ -179,7 +179,7 @@ void add1(const hyperpoint& H) {
|
|||||||
for(int i=0; i<3; i++) glcoords[qglcoords][i] = H[i];
|
for(int i=0; i<3; i++) glcoords[qglcoords][i] = H[i];
|
||||||
}
|
}
|
||||||
|
|
||||||
int spherespecial;
|
int spherespecial, spherephase;
|
||||||
|
|
||||||
void addpoint(const hyperpoint& H) {
|
void addpoint(const hyperpoint& H) {
|
||||||
if(qglcoords >= POLYMAX) return;
|
if(qglcoords >= POLYMAX) return;
|
||||||
@ -475,6 +475,13 @@ void fixMercator() {
|
|||||||
void drawpolyline(polytodraw& p) {
|
void drawpolyline(polytodraw& p) {
|
||||||
auto pp = p.u.poly;
|
auto pp = p.u.poly;
|
||||||
|
|
||||||
|
if(spherespecial && p.prio == PPR_MOBILE_ARROW) {
|
||||||
|
if(spherephase == 0) return;
|
||||||
|
dynamicval<int> ss(spherespecial, 0);
|
||||||
|
drawpolyline(p);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
#if CAP_GL
|
#if CAP_GL
|
||||||
if(vid.usingGL && pmodel == mdDisk && !spherespecial) {
|
if(vid.usingGL && pmodel == mdDisk && !spherespecial) {
|
||||||
const int pq = pp.cnt;
|
const int pq = pp.cnt;
|
||||||
@ -530,7 +537,7 @@ void drawpolyline(polytodraw& p) {
|
|||||||
}
|
}
|
||||||
else poly_flags &=~ POLY_INVERSE;
|
else poly_flags &=~ POLY_INVERSE;
|
||||||
|
|
||||||
if(sphere && vid.alphax > 1) {
|
if(sphereflipped()) {
|
||||||
if(!hiliteclick && !(poly_flags & POLY_INFRONT)) return;
|
if(!hiliteclick && !(poly_flags & POLY_INFRONT)) return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -544,6 +551,18 @@ void drawpolyline(polytodraw& p) {
|
|||||||
lastl = l;
|
lastl = l;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if((pmodel == mdEquidistant || pmodel == mdEquiarea) && (poly_flags & POLY_INVERSE)) {
|
||||||
|
ld h = atan2(glcoords[0][0], glcoords[0][1]);
|
||||||
|
for(int i=0; i<=360; i++) {
|
||||||
|
ld a = i * M_PI / 180 + h;
|
||||||
|
glcoords[qglcoords][0] = vid.radius * sin(a);
|
||||||
|
glcoords[qglcoords][1] = vid.radius * cos(a);
|
||||||
|
glcoords[qglcoords][2] = vid.scrdist;
|
||||||
|
qglcoords++;
|
||||||
|
}
|
||||||
|
poly_flags ^= POLY_INVERSE;
|
||||||
|
}
|
||||||
|
|
||||||
#if CAP_GL
|
#if CAP_GL
|
||||||
if(vid.usingGL) {
|
if(vid.usingGL) {
|
||||||
// if(pmodel == 0) for(int i=0; i<qglcoords; i++) glcoords[i][2] = vid.scrdist;
|
// if(pmodel == 0) for(int i=0; i<qglcoords; i++) glcoords[i][2] = vid.scrdist;
|
||||||
@ -572,11 +591,13 @@ void drawpolyline(polytodraw& p) {
|
|||||||
|
|
||||||
if(poly_flags & POLY_INVERSE) {
|
if(poly_flags & POLY_INVERSE) {
|
||||||
int i = polyi;
|
int i = polyi;
|
||||||
|
if(true) {
|
||||||
polyx[i] = 0; polyy[i] = 0; i++;
|
polyx[i] = 0; polyy[i] = 0; i++;
|
||||||
polyx[i] = vid.xres; polyy[i] = 0; i++;
|
polyx[i] = vid.xres; polyy[i] = 0; i++;
|
||||||
polyx[i] = vid.xres; polyy[i] = vid.yres; i++;
|
polyx[i] = vid.xres; polyy[i] = vid.yres; i++;
|
||||||
polyx[i] = 0; polyy[i] = vid.yres; i++;
|
polyx[i] = 0; polyy[i] = vid.yres; i++;
|
||||||
polyx[i] = 0; polyy[i] = 0; i++;
|
polyx[i] = 0; polyy[i] = 0; i++;
|
||||||
|
}
|
||||||
filledPolygonColorI(s, polyx, polyy, polyi+5, p.col);
|
filledPolygonColorI(s, polyx, polyy, polyi+5, p.col);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@ -714,7 +735,7 @@ void quickqueue() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
ld xintval(const hyperpoint& h) {
|
ld xintval(const hyperpoint& h) {
|
||||||
if(sphere && vid.alpha > 1) return -h[2];
|
if(sphereflipped()) return -h[2];
|
||||||
return -intval(h, C0);
|
return -intval(h, C0);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -785,9 +806,10 @@ void drawqueue() {
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
spherespecial = 0;
|
spherespecial = 0;
|
||||||
|
spherephase = 0;
|
||||||
// on the sphere, parts on the back are drawn first
|
// on the sphere, parts on the back are drawn first
|
||||||
if(sphere && pmodel == 0) {
|
if(sphere && pmodel == 0) {
|
||||||
spherespecial = vid.alphax > 1 ? 1 : -1;
|
spherespecial = sphereflipped() ? 1 : -1;
|
||||||
#ifndef STLSORT
|
#ifndef STLSORT
|
||||||
for(int p: {PPR_REDWALLs, PPR_REDWALLs2, PPR_REDWALLs3, PPR_WALL3s,
|
for(int p: {PPR_REDWALLs, PPR_REDWALLs2, PPR_REDWALLs3, PPR_WALL3s,
|
||||||
PPR_LAKEWALL, PPR_INLAKEWALL, PPR_BELOWBOTTOM})
|
PPR_LAKEWALL, PPR_INLAKEWALL, PPR_BELOWBOTTOM})
|
||||||
@ -812,6 +834,7 @@ void drawqueue() {
|
|||||||
reverse(&ptds2[qp0[p]], &ptds2[qp[p]]);
|
reverse(&ptds2[qp0[p]], &ptds2[qp[p]]);
|
||||||
#endif
|
#endif
|
||||||
spherespecial *= -1;
|
spherespecial *= -1;
|
||||||
|
spherephase = 1;
|
||||||
}
|
}
|
||||||
for(int i=0; i<siz; i++) {
|
for(int i=0; i<siz; i++) {
|
||||||
#ifdef STLSORT
|
#ifdef STLSORT
|
||||||
|
Loading…
Reference in New Issue
Block a user