mirror of
				https://github.com/zenorogue/hyperrogue.git
				synced 2025-10-31 05:52:59 +00:00 
			
		
		
		
	more precise torus-rug rendering
This commit is contained in:
		| @@ -720,6 +720,66 @@ fpattern& getcurrfp() { | ||||
|   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() | ||||
| @@ -727,3 +787,4 @@ fpattern& getcurrfp() { | ||||
| int currfp_gmul(int a, int b) { return currfp.gmul(a,b); } | ||||
| int currfp_inverses(int i) { return currfp.inverses[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; | ||||
|  | ||||
| // 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() { | ||||
|   using namespace fieldpattern; | ||||
|   gamescreen(2); | ||||
|   dialog::init(XLAT("advanced configuration")); | ||||
|   fgeomextra& gxcur = fgeomextras[current_extra]; | ||||
|   | ||||
							
								
								
									
										2
									
								
								hyper.h
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								hyper.h
									
									
									
									
									
								
							| @@ -1243,7 +1243,7 @@ void fullcenter(); | ||||
| void movecost(cell* from, cell *to); | ||||
| void checkmove(); | ||||
|  | ||||
| transmatrix eumove(int x, int y); | ||||
| transmatrix eumove(ld x, ld y); | ||||
| transmatrix eumovedir(int d); | ||||
|  | ||||
| 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; | ||||
|    | ||||
| transmatrix eumove(int x, int y) { | ||||
| transmatrix eumove(ld x, ld y) { | ||||
|   transmatrix Mat = Id; | ||||
|   Mat[2][2] = 1; | ||||
|   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 { | ||||
|  | ||||
| double rugzoom = .3; | ||||
| int torus_precision = 2; | ||||
|  | ||||
| // hypersian rug datatypes and globals | ||||
| //------------------------------------- | ||||
| @@ -204,7 +205,7 @@ void buildTorusRug() { | ||||
|   transmatrix z2 = inverse(z1); | ||||
|   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); | ||||
|     hyperpoint onscreen; | ||||
|     applymodel(tC0(eumove(x, y)), onscreen); | ||||
| @@ -227,14 +228,20 @@ void buildTorusRug() { | ||||
|     return r; | ||||
|     }; | ||||
|    | ||||
|   int rugmax = min(torus_precision, 16); | ||||
|   ld rmd = rugmax; | ||||
|      | ||||
|   for(int i=0; i<qty; i++) { | ||||
|     int x = tps[i].x, y = tps[i].y; | ||||
|     auto r00 = addToruspoint(x, y); | ||||
|     auto r10 = addToruspoint(x+1, y); | ||||
|     auto r01 = addToruspoint(x, y+1); | ||||
|     auto rn1 = addToruspoint(x-1, y+1); | ||||
|     addTriangle(r00, r10, r01); | ||||
|     addTriangle(r00, r01, rn1); | ||||
|     rugpoint *rugarr[32][32]; | ||||
|     for(int yy=0; yy<=rugmax; yy++) | ||||
|     for(int xx=0; xx<=rugmax; xx++) | ||||
|       rugarr[yy][xx] = addToruspoint(x+(xx-yy)/rmd, y+yy/rmd); | ||||
|      | ||||
|     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; | ||||
| @@ -824,6 +831,11 @@ void show() { | ||||
|   dialog::addBoolItem(XLAT("render the texture only once"), (renderonce), 'o'); | ||||
|   dialog::addBoolItem(XLAT("render texture without OpenGL"), (rendernogl), 'g');   | ||||
|   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(); | ||||
|   keyhandler = [] (int sym, int uni) { | ||||
|   #if ISPANDORA | ||||
| @@ -850,6 +862,8 @@ void show() { | ||||
|       } | ||||
|     else if(uni == 'o') | ||||
|       renderonce = !renderonce; | ||||
|     else if(uni == 'p' && torus_precision) | ||||
|       dialog::editNumber(torus_precision, 0, 16, 1, 2, "precision", "precision"); | ||||
|   #if !ISPANDORA | ||||
|     else if(uni == 'g') | ||||
|       rendernogl = !rendernogl; | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Zeno Rogue
					Zeno Rogue