1
0
mirror of https://github.com/zenorogue/hyperrogue.git synced 2025-07-06 19:42:50 +00:00

Fixed the bugs with computing fieldpattern not in hyperbolic geometry (memory error + canvas crashes)

This commit is contained in:
Zeno Rogue 2018-05-09 21:32:31 +02:00
parent 03db677d66
commit 39db828a38
5 changed files with 15 additions and 9 deletions

View File

@ -1064,7 +1064,7 @@ void buildBigStuff(cell *c, cell *from) {
else if(c->land == laCrossroads2 && !nonbitrunc) else if(c->land == laCrossroads2 && !nonbitrunc)
buildCrossroads2(c); buildCrossroads2(c);
else if(c->land == laPrairie && c->LHU.fi.walldist == 0) { else if(c->land == laPrairie && c->LHU.fi.walldist == 0 && !euclid) {
for(int bd=0; bd<7; bd++) { for(int bd=0; bd<7; bd++) {
int fval2 = createStep(c->master, bd)->fieldval; int fval2 = createStep(c->master, bd)->fieldval;
int wd = currfp_gmul(fval2, currfp_inverses(c->fval-1)); int wd = currfp_gmul(fval2, currfp_inverses(c->fval-1));

View File

@ -3087,7 +3087,7 @@ namespace windmap {
if(N == 18920) precomp = windcodes18920; if(N == 18920) precomp = windcodes18920;
if(N == 5676) precomp = windcodes5676; if(N == 5676) precomp = windcodes5676;
if(precomp && size(currfp.matrices)) { if(precomp && hyperbolic && size(currfp.matrices)) {
int randval = hrand(size(currfp.matrices)); int randval = hrand(size(currfp.matrices));
for(int i=0; i<N; i++) for(int i=0; i<N; i++)
windcodes[i] = precomp[getid[fieldpattern::fieldval_uniq_rand(samples[i], randval)]-1]; windcodes[i] = precomp[getid[fieldpattern::fieldval_uniq_rand(samples[i], randval)]-1];

View File

@ -697,7 +697,7 @@ void info() {
printf("cases found = %d (%d hard)\n", cases, hard); printf("cases found = %d (%d hard)\n", cases, hard);
} }
fpattern current_quotient_field(0); fpattern current_quotient_field(0), fp_invalid(0);
bool quotient_field_changed; bool quotient_field_changed;
fpattern& getcurrfp() { fpattern& getcurrfp() {
@ -719,6 +719,7 @@ fpattern& getcurrfp() {
static fpattern fp(13); static fpattern fp(13);
return fp; return fp;
} }
if(sphere || euclid) return fp_invalid;
return fp43; return fp43;
} }
@ -729,7 +730,12 @@ vector<fgeomextra> fgeomextras = {
fgeomextra(gOctagon, 1), fgeomextra(gOctagon, 1),
fgeomextra(g45, 0), fgeomextra(g45, 0),
fgeomextra(g46, 3), fgeomextra(g46, 3),
fgeomextra(g47, 0) fgeomextra(g47, 0),
/* fgeomextra(gSphere, 0),
fgeomextra(gSmallSphere, 0), -> does not find the prime
fgeomextra(gEuclid, 0),
fgeomextra(gEuclidSquare, 0),
fgeomextra(gTinySphere, 0) */
}; };
int current_extra = 0; int current_extra = 0;

View File

@ -5728,7 +5728,7 @@ auto graphcm = addHook(clearmemory, 0, [] () {
void resetGeometry() { void resetGeometry() {
precalc(); precalc();
currfp.analyze(); if(hyperbolic) currfp.analyze();
#if CAP_GL #if CAP_GL
resetGL(); resetGL();
#endif #endif

View File

@ -1120,7 +1120,7 @@ namespace patterns {
char whichCanvas = 0; char whichCanvas = 0;
int generateCanvas(cell *c) { int generateCanvas(cell *c) {
if(whichCanvas == 'C' && !torus) { if(whichCanvas == 'C' && hyperbolic) {
using namespace fieldpattern; using namespace fieldpattern;
int z = currfp.getdist(fieldval(c), make_pair(0,false)); int z = currfp.getdist(fieldval(c), make_pair(0,false));
if(z < currfp.circrad) return 0x00C000; if(z < currfp.circrad) return 0x00C000;
@ -1129,12 +1129,12 @@ namespace patterns {
return 0x3000; return 0x3000;
return 0x6000; return 0x6000;
} }
if(whichCanvas == 'D' && !torus) { if(whichCanvas == 'D' && hyperbolic) {
using namespace fieldpattern; using namespace fieldpattern;
int z = currfp.getdist(fieldval(c), make_pair(0,false)); int z = currfp.getdist(fieldval(c), make_pair(0,false));
return 255 * (currfp.maxdist+1-z) / currfp.maxdist; return 255 * (currfp.maxdist+1-z) / currfp.maxdist;
} }
if(whichCanvas == 'N' && !torus) { if(whichCanvas == 'N' && hyperbolic) {
using namespace fieldpattern; using namespace fieldpattern;
int z = currfp.getdist(fieldval(c), make_pair(0,false)); int z = currfp.getdist(fieldval(c), make_pair(0,false));
int z2 = currfp.getdist(fieldval(c), make_pair(currfp.otherpole,false)); int z2 = currfp.getdist(fieldval(c), make_pair(currfp.otherpole,false));
@ -1146,7 +1146,7 @@ namespace patterns {
int cd = celldist(c); int cd = celldist(c);
return gradient(0, canvasback, 0, min(1.8/(1+cd), 1.), 1); return gradient(0, canvasback, 0, min(1.8/(1+cd), 1.), 1);
} }
if(whichCanvas == 'S' && !torus) { if(whichCanvas == 'S' && hyperbolic) {
return 0x3F1F0F * fieldpattern::subval(c).second + 0x000080; return 0x3F1F0F * fieldpattern::subval(c).second + 0x000080;
} }
if(whichCanvas == 'g') if(whichCanvas == 'g')