mirror of
https://github.com/zenorogue/hyperrogue.git
synced 2024-11-23 21:07:17 +00:00
more precise torus-rug rendering
This commit is contained in:
parent
b5382c5670
commit
f5a8b2a0c2
@ -720,6 +720,66 @@ fpattern& getcurrfp() {
|
|||||||
return fp43;
|
return fp43;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// extra information for field quotient extra configuration
|
||||||
|
|
||||||
|
struct primeinfo {
|
||||||
|
int p;
|
||||||
|
int cells;
|
||||||
|
bool squared;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct fgeomextra {
|
||||||
|
eGeometry base;
|
||||||
|
vector<primeinfo> primes;
|
||||||
|
int current_prime_id;
|
||||||
|
fgeomextra(eGeometry b, int i) : base(b), current_prime_id(i) {}
|
||||||
|
};
|
||||||
|
|
||||||
|
vector<fgeomextra> fgeomextras = {
|
||||||
|
fgeomextra(gNormal, 3),
|
||||||
|
fgeomextra(gOctagon, 1),
|
||||||
|
fgeomextra(g45, 0),
|
||||||
|
fgeomextra(g46, 3),
|
||||||
|
fgeomextra(g47, 0)
|
||||||
|
};
|
||||||
|
|
||||||
|
int current_extra = 0;
|
||||||
|
|
||||||
|
void nextPrime(fgeomextra& ex) {
|
||||||
|
dynamicval<eGeometry> g(geometry, ex.base);
|
||||||
|
int nextprime;
|
||||||
|
if(size(ex.primes))
|
||||||
|
nextprime = ex.primes.back().p + 1;
|
||||||
|
else
|
||||||
|
nextprime = 2;
|
||||||
|
while(true) {
|
||||||
|
fieldpattern::fpattern fp(0);
|
||||||
|
fp.Prime = nextprime;
|
||||||
|
if(fp.solve() == 0) {
|
||||||
|
fp.build();
|
||||||
|
ex.primes.emplace_back(primeinfo{nextprime, size(fp.matrices) / S7, (bool) fp.wsquare});
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
nextprime++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void nextPrimes(fgeomextra& ex) {
|
||||||
|
while(size(ex.primes) < 4)
|
||||||
|
nextPrime(ex);
|
||||||
|
}
|
||||||
|
|
||||||
|
void enableFieldChange() {
|
||||||
|
fgeomextra& gxcur = fgeomextras[current_extra];
|
||||||
|
fieldpattern::quotient_field_changed = true;
|
||||||
|
nextPrimes(gxcur);
|
||||||
|
dynamicval<eGeometry> g(geometry, gQuotient2);
|
||||||
|
ginf[geometry].sides = ginf[gxcur.base].sides;
|
||||||
|
ginf[geometry].vertex = ginf[gxcur.base].vertex;
|
||||||
|
ginf[geometry].distlimit = ginf[gxcur.base].distlimit;
|
||||||
|
fieldpattern::current_quotient_field.init(gxcur.primes[gxcur.current_prime_id].p);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#define currfp fieldpattern::getcurrfp()
|
#define currfp fieldpattern::getcurrfp()
|
||||||
@ -727,3 +787,4 @@ fpattern& getcurrfp() {
|
|||||||
int currfp_gmul(int a, int b) { return currfp.gmul(a,b); }
|
int currfp_gmul(int a, int b) { return currfp.gmul(a,b); }
|
||||||
int currfp_inverses(int i) { return currfp.inverses[i]; }
|
int currfp_inverses(int i) { return currfp.inverses[i]; }
|
||||||
int currfp_distwall(int i) { return currfp.distwall[i]; }
|
int currfp_distwall(int i) { return currfp.distwall[i]; }
|
||||||
|
|
||||||
|
61
geom-exp.cpp
61
geom-exp.cpp
@ -29,67 +29,8 @@ string euchelp =
|
|||||||
|
|
||||||
int ewhichscreen = 2;
|
int ewhichscreen = 2;
|
||||||
|
|
||||||
// extra information for field quotient extra configuration
|
|
||||||
|
|
||||||
struct primeinfo {
|
|
||||||
int p;
|
|
||||||
int cells;
|
|
||||||
bool squared;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct fgeomextra {
|
|
||||||
eGeometry base;
|
|
||||||
vector<primeinfo> primes;
|
|
||||||
int current_prime_id;
|
|
||||||
fgeomextra(eGeometry b, int i) : base(b), current_prime_id(i) {}
|
|
||||||
};
|
|
||||||
|
|
||||||
vector<fgeomextra> fgeomextras = {
|
|
||||||
fgeomextra(gNormal, 3),
|
|
||||||
fgeomextra(gOctagon, 1),
|
|
||||||
fgeomextra(g45, 0),
|
|
||||||
fgeomextra(g46, 3),
|
|
||||||
fgeomextra(g47, 0)
|
|
||||||
};
|
|
||||||
|
|
||||||
int current_extra = 0;
|
|
||||||
|
|
||||||
void nextPrime(fgeomextra& ex) {
|
|
||||||
dynamicval<eGeometry> g(geometry, ex.base);
|
|
||||||
int nextprime;
|
|
||||||
if(size(ex.primes))
|
|
||||||
nextprime = ex.primes.back().p + 1;
|
|
||||||
else
|
|
||||||
nextprime = 2;
|
|
||||||
while(true) {
|
|
||||||
fieldpattern::fpattern fp(0);
|
|
||||||
fp.Prime = nextprime;
|
|
||||||
if(fp.solve() == 0) {
|
|
||||||
fp.build();
|
|
||||||
ex.primes.emplace_back(primeinfo{nextprime, size(fp.matrices) / S7, (bool) fp.wsquare});
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
nextprime++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void nextPrimes(fgeomextra& ex) {
|
|
||||||
while(size(ex.primes) < 4)
|
|
||||||
nextPrime(ex);
|
|
||||||
}
|
|
||||||
|
|
||||||
void enableFieldChange() {
|
|
||||||
fgeomextra& gxcur = fgeomextras[current_extra];
|
|
||||||
fieldpattern::quotient_field_changed = true;
|
|
||||||
nextPrimes(gxcur);
|
|
||||||
dynamicval<eGeometry> g(geometry, gQuotient2);
|
|
||||||
ginf[geometry].sides = ginf[gxcur.base].sides;
|
|
||||||
ginf[geometry].vertex = ginf[gxcur.base].vertex;
|
|
||||||
ginf[geometry].distlimit = ginf[gxcur.base].distlimit;
|
|
||||||
fieldpattern::current_quotient_field.init(gxcur.primes[gxcur.current_prime_id].p);
|
|
||||||
}
|
|
||||||
|
|
||||||
void showQuotientConfig() {
|
void showQuotientConfig() {
|
||||||
|
using namespace fieldpattern;
|
||||||
gamescreen(2);
|
gamescreen(2);
|
||||||
dialog::init(XLAT("advanced configuration"));
|
dialog::init(XLAT("advanced configuration"));
|
||||||
fgeomextra& gxcur = fgeomextras[current_extra];
|
fgeomextra& gxcur = fgeomextras[current_extra];
|
||||||
|
2
hyper.h
2
hyper.h
@ -1243,7 +1243,7 @@ void fullcenter();
|
|||||||
void movecost(cell* from, cell *to);
|
void movecost(cell* from, cell *to);
|
||||||
void checkmove();
|
void checkmove();
|
||||||
|
|
||||||
transmatrix eumove(int x, int y);
|
transmatrix eumove(ld x, ld y);
|
||||||
transmatrix eumovedir(int d);
|
transmatrix eumovedir(int d);
|
||||||
|
|
||||||
int reptilemax();
|
int reptilemax();
|
||||||
|
@ -363,7 +363,7 @@ void drawrec(const heptspin& hs, int lev, hstate s, const transmatrix& V) {
|
|||||||
|
|
||||||
int mindx=-7, mindy=-7, maxdx=7, maxdy=7;
|
int mindx=-7, mindy=-7, maxdx=7, maxdy=7;
|
||||||
|
|
||||||
transmatrix eumove(int x, int y) {
|
transmatrix eumove(ld x, ld y) {
|
||||||
transmatrix Mat = Id;
|
transmatrix Mat = Id;
|
||||||
Mat[2][2] = 1;
|
Mat[2][2] = 1;
|
||||||
Mat[0][2] += (x + y * .5) * eurad;
|
Mat[0][2] += (x + y * .5) * eurad;
|
||||||
|
28
rug.cpp
28
rug.cpp
@ -34,6 +34,7 @@ GLAPI void APIENTRY glDeleteFramebuffers (GLsizei n, const GLuint *framebuffers)
|
|||||||
namespace rug {
|
namespace rug {
|
||||||
|
|
||||||
double rugzoom = .3;
|
double rugzoom = .3;
|
||||||
|
int torus_precision = 2;
|
||||||
|
|
||||||
// hypersian rug datatypes and globals
|
// hypersian rug datatypes and globals
|
||||||
//-------------------------------------
|
//-------------------------------------
|
||||||
@ -204,7 +205,7 @@ void buildTorusRug() {
|
|||||||
transmatrix z2 = inverse(z1);
|
transmatrix z2 = inverse(z1);
|
||||||
printf("h1 = %s\n", display(z2 * hyperpoint {22,1,0}));
|
printf("h1 = %s\n", display(z2 * hyperpoint {22,1,0}));
|
||||||
|
|
||||||
auto addToruspoint = [&] (int x, int y) {
|
auto addToruspoint = [&] (ld x, ld y) {
|
||||||
auto r = addRugpoint(C0, 0);
|
auto r = addRugpoint(C0, 0);
|
||||||
hyperpoint onscreen;
|
hyperpoint onscreen;
|
||||||
applymodel(tC0(eumove(x, y)), onscreen);
|
applymodel(tC0(eumove(x, y)), onscreen);
|
||||||
@ -226,15 +227,21 @@ void buildTorusRug() {
|
|||||||
r->valid = true;
|
r->valid = true;
|
||||||
return r;
|
return r;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
int rugmax = min(torus_precision, 16);
|
||||||
|
ld rmd = rugmax;
|
||||||
|
|
||||||
for(int i=0; i<qty; i++) {
|
for(int i=0; i<qty; i++) {
|
||||||
int x = tps[i].x, y = tps[i].y;
|
int x = tps[i].x, y = tps[i].y;
|
||||||
auto r00 = addToruspoint(x, y);
|
rugpoint *rugarr[32][32];
|
||||||
auto r10 = addToruspoint(x+1, y);
|
for(int yy=0; yy<=rugmax; yy++)
|
||||||
auto r01 = addToruspoint(x, y+1);
|
for(int xx=0; xx<=rugmax; xx++)
|
||||||
auto rn1 = addToruspoint(x-1, y+1);
|
rugarr[yy][xx] = addToruspoint(x+(xx-yy)/rmd, y+yy/rmd);
|
||||||
addTriangle(r00, r10, r01);
|
|
||||||
addTriangle(r00, r01, rn1);
|
for(int yy=0; yy<rugmax; yy++)
|
||||||
|
for(int xx=0; xx<rugmax; xx++)
|
||||||
|
addTriangle(rugarr[yy][xx], rugarr[yy+1][xx], rugarr[yy+1][xx+1]),
|
||||||
|
addTriangle(rugarr[yy][xx], rugarr[yy][xx+1], rugarr[yy+1][xx+1]);
|
||||||
}
|
}
|
||||||
|
|
||||||
double maxz = 0;
|
double maxz = 0;
|
||||||
@ -824,6 +831,11 @@ void show() {
|
|||||||
dialog::addBoolItem(XLAT("render the texture only once"), (renderonce), 'o');
|
dialog::addBoolItem(XLAT("render the texture only once"), (renderonce), 'o');
|
||||||
dialog::addBoolItem(XLAT("render texture without OpenGL"), (rendernogl), 'g');
|
dialog::addBoolItem(XLAT("render texture without OpenGL"), (rendernogl), 'g');
|
||||||
dialog::addSelItem(XLAT("texture size"), its(texturesize)+"x"+its(texturesize), 's');
|
dialog::addSelItem(XLAT("texture size"), its(texturesize)+"x"+its(texturesize), 's');
|
||||||
|
if(torus) {
|
||||||
|
if(torus_precision < 1) torus_precision = 1;
|
||||||
|
if(torus_precision > 16) torus_precision = 16;
|
||||||
|
dialog::addSelItem(XLAT("precision"), its(torus_precision), 'p');
|
||||||
|
}
|
||||||
dialog::display();
|
dialog::display();
|
||||||
keyhandler = [] (int sym, int uni) {
|
keyhandler = [] (int sym, int uni) {
|
||||||
#if ISPANDORA
|
#if ISPANDORA
|
||||||
@ -850,6 +862,8 @@ void show() {
|
|||||||
}
|
}
|
||||||
else if(uni == 'o')
|
else if(uni == 'o')
|
||||||
renderonce = !renderonce;
|
renderonce = !renderonce;
|
||||||
|
else if(uni == 'p' && torus_precision)
|
||||||
|
dialog::editNumber(torus_precision, 0, 16, 1, 2, "precision", "precision");
|
||||||
#if !ISPANDORA
|
#if !ISPANDORA
|
||||||
else if(uni == 'g')
|
else if(uni == 'g')
|
||||||
rendernogl = !rendernogl;
|
rendernogl = !rendernogl;
|
||||||
|
Loading…
Reference in New Issue
Block a user