mirror of
				https://github.com/zenorogue/hyperrogue.git
				synced 2025-10-30 05:23:00 +00:00 
			
		
		
		
	autoheader used for nisot
This commit is contained in:
		
							
								
								
									
										27
									
								
								hyper.h
									
									
									
									
									
								
							
							
						
						
									
										27
									
								
								hyper.h
									
									
									
									
									
								
							| @@ -5616,33 +5616,6 @@ namespace kite { | ||||
|   } | ||||
| #endif | ||||
|  | ||||
| /* nonisotropic */ | ||||
| namespace nisot { | ||||
|   extern transmatrix local_perspective; | ||||
|   inline bool local_perspective_used() { return nonisotropic; } | ||||
|   hrmap *new_map(); | ||||
|   transmatrix translate(const hyperpoint h); | ||||
|   bool in_table_range(hyperpoint h); | ||||
|    | ||||
|   enum iePrecision { iLazy, iTable }; | ||||
|  | ||||
|   transmatrix parallel_transport(const transmatrix Position, const transmatrix T); | ||||
|   transmatrix transport_view(const transmatrix T, const transmatrix V); | ||||
|   transmatrix spin_towards(const transmatrix Position, const hyperpoint goal); | ||||
|   hyperpoint inverse_exp(const hyperpoint h, iePrecision p); | ||||
|   } | ||||
|  | ||||
| namespace solv {   | ||||
|   extern string solshader; | ||||
|   } | ||||
|  | ||||
|  | ||||
| namespace nilv { | ||||
|   extern string nilshader; | ||||
|   static const int nilv_S7 = 8; | ||||
|   extern array<vector<hyperpoint>, nilv_S7> facevertices; | ||||
|   } | ||||
|  | ||||
| bool in_perspective(); | ||||
|  | ||||
| extern int noclipped; | ||||
|   | ||||
							
								
								
									
										14
									
								
								makeh.cpp
									
									
									
									
									
								
							
							
						
						
									
										14
									
								
								makeh.cpp
									
									
									
									
									
								
							| @@ -27,11 +27,21 @@ void gen(string s) { | ||||
|   ifstream in(s); | ||||
|   while(getline(in, s)) { | ||||
|     while(s != "" && s[0] == ' ') s = s.substr(1); | ||||
|     while(s.back() == 10 || s.back() == 13) s = s.substr(0, s.size() - 1); | ||||
|     if(s.substr(0, 7) == "#if EX ") { | ||||
|       cout << ind() << s << "\n"; | ||||
|       do_endif = true; | ||||
|       } | ||||
|     if(s.substr(0, 3) == "EX ") { | ||||
|     if(s.substr(0, 4) == "//EX") { | ||||
|       auto t = s.substr(4); | ||||
|       while(t != "" && t[0] == ' ') t = t.substr(1); | ||||
|       cout << ind() << t << "\n"; | ||||
|       } | ||||
|     if(s.substr(0, 4) == "EX }") { | ||||
|       cout << ind() << "}\n"; | ||||
|       indent -= 2; | ||||
|       } | ||||
|     else if(s.substr(0, 3) == "EX ") { | ||||
|       string t = s.substr(3); | ||||
|       if(t.substr(0, 10) == "namespace ") { | ||||
|         mark_file(); | ||||
| @@ -40,7 +50,7 @@ void gen(string s) { | ||||
|         } | ||||
|       else { | ||||
|         for(int i=0;; i++) { | ||||
|           if(i == int(t.size())) { cerr << "Error: unrecognizable EX\n"; } | ||||
|           if(i == int(t.size())) { cerr << "Error: unrecognizable EX: " << s << "\n"; } | ||||
|           else if(t[i] == '{') { | ||||
|             while(i && t[i-1] == ' ') i--; | ||||
|             cout << ind() << t.substr(0, i) << ";\n"; | ||||
|   | ||||
| @@ -5,14 +5,15 @@ | ||||
|  | ||||
| namespace hr { | ||||
|  | ||||
| namespace nisot { | ||||
| EX namespace nisot { | ||||
|   typedef array<float, 3> ptlow; | ||||
|  | ||||
|   transmatrix local_perspective; | ||||
|   EX transmatrix local_perspective; | ||||
|   //EX inline bool local_perspective_used() { return nonisotropic; } | ||||
|    | ||||
|   bool geodesic_movement = true; | ||||
|   EX bool geodesic_movement = true; | ||||
|  | ||||
|   transmatrix translate(hyperpoint h) { | ||||
|   EX transmatrix translate(hyperpoint h) { | ||||
|     transmatrix T = Id; | ||||
|     for(int i=0; i<GDIM; i++) T[i][GDIM] = h[i]; | ||||
|     if(sol) { | ||||
| @@ -24,9 +25,9 @@ namespace nisot { | ||||
|     return T; | ||||
|     } | ||||
|  | ||||
|   } | ||||
|   EX } | ||||
|  | ||||
| namespace solv { | ||||
| EX namespace solv { | ||||
|    | ||||
|   int PRECX, PRECY, PRECZ; | ||||
|    | ||||
| @@ -34,9 +35,9 @@ namespace solv { | ||||
|    | ||||
|   bool table_loaded; | ||||
|    | ||||
|   string solfname = "solv-geodesics.dat"; | ||||
|   EX string solfname = "solv-geodesics.dat"; | ||||
|    | ||||
|   void load_table() { | ||||
|   EX void load_table() { | ||||
|     if(table_loaded) return; | ||||
|     FILE *f = fopen(solfname.c_str(), "rb"); | ||||
|     // if(!f) f = fopen("/usr/lib/soltable.dat", "rb"); | ||||
| @@ -257,27 +258,27 @@ namespace solv { | ||||
|  | ||||
|     }; | ||||
|  | ||||
|   pair<heptagon*,heptagon*> getcoord(heptagon *h) { | ||||
|   EX pair<heptagon*,heptagon*> getcoord(heptagon *h) { | ||||
|     return ((hrmap_sol*)currentmap)->coords[h]; | ||||
|     } | ||||
|  | ||||
|   heptagon *get_at(heptagon *h1, heptagon *h2, bool gen) { | ||||
|   EX heptagon *get_at(heptagon *h1, heptagon *h2, bool gen) { | ||||
|     auto m = ((hrmap_sol*)currentmap); | ||||
|     if(!gen && !m->at.count(make_pair(h1, h2))) return nullptr; | ||||
|     return m->get_at(h1, h2); | ||||
|     } | ||||
|    | ||||
|   ld solrange_xy = 15; | ||||
|   ld solrange_z = 4; | ||||
|   EX ld solrange_xy = 15; | ||||
|   EX ld solrange_z = 4; | ||||
|    | ||||
|   ld glitch_xy = 2, glitch_z = 0.6; | ||||
|   EX ld glitch_xy = 2, glitch_z = 0.6; | ||||
|  | ||||
|   bool in_table_range(hyperpoint h) { | ||||
|   EX bool in_table_range(hyperpoint h) { | ||||
|     if(abs(h[0]) > glitch_xy && abs(h[1]) > glitch_xy && abs(h[2]) < glitch_z) return false; | ||||
|     return abs(h[0]) < solrange_xy && abs(h[1]) < solrange_xy && abs(h[2]) < solrange_z; | ||||
|     } | ||||
|  | ||||
|   int approx_distance(heptagon *h1, heptagon *h2) { | ||||
|   EX int approx_distance(heptagon *h1, heptagon *h2) { | ||||
|     auto m = (hrmap_sol*) currentmap; | ||||
|     dynamicval<eGeometry> g(geometry, gBinary4);  | ||||
|     dynamicval<hrmap*> cm(currentmap, m->binary_map); | ||||
| @@ -286,7 +287,7 @@ namespace solv { | ||||
|     return d1 + d2 - abs(h1->distance - h2->distance); | ||||
|     } | ||||
|    | ||||
|   string solshader =  | ||||
|   EX string solshader =  | ||||
|     "uniform mediump sampler3D tInvExpTable;"     | ||||
|     "uniform mediump float PRECX, PRECY, PRECZ;" | ||||
|  | ||||
| @@ -322,9 +323,9 @@ namespace solv { | ||||
|      | ||||
|     "return res;" | ||||
|     "}"; | ||||
|   } | ||||
| EX } | ||||
|  | ||||
| namespace nilv { | ||||
| EX namespace nilv { | ||||
|  | ||||
|   hyperpoint christoffel(const hyperpoint Position, const hyperpoint Velocity, const hyperpoint Transported) { | ||||
|     ld x = Position[0]; | ||||
| @@ -335,7 +336,7 @@ namespace nilv { | ||||
|       ); | ||||
|     } | ||||
|  | ||||
|   hyperpoint formula_exp(hyperpoint v) { | ||||
|   EX hyperpoint formula_exp(hyperpoint v) { | ||||
|     // copying Modelling Nil-geometry in Euclidean Space with Software Presentation | ||||
|     // v[0] = c cos alpha | ||||
|     // v[1] = c sin alpha | ||||
| @@ -356,7 +357,7 @@ namespace nilv { | ||||
|       ); | ||||
|     } | ||||
|    | ||||
|   hyperpoint get_inverse_exp(hyperpoint h, int iterations) { | ||||
|   EX hyperpoint get_inverse_exp(hyperpoint h, int iterations) { | ||||
|     ld wmin, wmax; | ||||
|      | ||||
|     ld side = h[2] - h[0] * h[1] / 2; | ||||
| @@ -394,7 +395,7 @@ namespace nilv { | ||||
|       } | ||||
|     } | ||||
|    | ||||
|   string nilshader =  | ||||
|   EX string nilshader =  | ||||
|     "vec4 inverse_exp(vec4 h) {" | ||||
|       "float wmin, wmax;" | ||||
|       "float side = h[2] - h[0] * h[1] / 2.;" | ||||
| @@ -442,9 +443,11 @@ namespace nilv { | ||||
|  | ||||
|   hyperpoint mvec_to_point(mvec m) { return hpxy3(m[0], m[1], m[2]); } | ||||
|    | ||||
|   //EX static const int nilv_S7 = 8; | ||||
|  | ||||
|   array<mvec, nilv_S7> movevectors = {{ mvec(-1,0,0), mvec(-1,0,1), mvec(0,-1,0), mvec(0,0,-1), mvec(1,0,0), mvec(1,0,-1), mvec(0,1,0), mvec(0,0,1) }}; | ||||
|  | ||||
|   array<vector<hyperpoint>, nilv_S7> facevertices = {{ | ||||
|   EX array<vector<hyperpoint>, nilv_S7> facevertices = {{ | ||||
|     { point31(-0.5,-0.5,-0.25), point31(-0.5,-0.5,0.75), point31(-0.5,0.5,-0.25), }, | ||||
|     { point31(-0.5,-0.5,0.75), point31(-0.5,0.5,0.75), point31(-0.5,0.5,-0.25), }, | ||||
|     { point31(-0.5,-0.5,-0.25), point31(-0.5,-0.5,0.75), point31(0.5,-0.5,0.25), point31(0.5,-0.5,-0.75), }, | ||||
| @@ -523,33 +526,35 @@ namespace nilv { | ||||
|  | ||||
|     }; | ||||
|  | ||||
|   hyperpoint on_geodesic(hyperpoint s0, hyperpoint s1, ld x) { | ||||
|   EX hyperpoint on_geodesic(hyperpoint s0, hyperpoint s1, ld x) { | ||||
|     hyperpoint local = inverse(nisot::translate(s0)) * s1; | ||||
|     hyperpoint h = get_inverse_exp(local, 100); | ||||
|     return nisot::translate(s0) * formula_exp(h * x); | ||||
|     } | ||||
|   } | ||||
| EX } | ||||
|  | ||||
| namespace nisot { | ||||
| EX namespace nisot { | ||||
|  | ||||
|   hyperpoint christoffel(const hyperpoint at, const hyperpoint velocity, const hyperpoint transported) { | ||||
|   EX hyperpoint christoffel(const hyperpoint at, const hyperpoint velocity, const hyperpoint transported) { | ||||
|     if(sol) return solv::christoffel(at, velocity, transported); | ||||
|     else if(nil) return nilv::christoffel(at, velocity, transported); | ||||
|     else return point3(0, 0, 0); | ||||
|     } | ||||
|  | ||||
|   bool in_table_range(hyperpoint h) { | ||||
|   EX bool in_table_range(hyperpoint h) { | ||||
|     if(sol) return solv::in_table_range(h); | ||||
|     return true; | ||||
|     } | ||||
|    | ||||
|   hyperpoint inverse_exp(const hyperpoint h, iePrecision p) { | ||||
|   //EX enum iePrecision { iLazy, iTable }; | ||||
|    | ||||
|   EX hyperpoint inverse_exp(const hyperpoint h, iePrecision p) { | ||||
|     if(sol) return solv::get_inverse_exp(h, p == iLazy); | ||||
|     if(nil) return nilv::get_inverse_exp(h, p == iLazy ? 5 : 20); | ||||
|     return point3(h[0], h[1], h[2]); | ||||
|     } | ||||
|  | ||||
|   void geodesic_step(hyperpoint& at, hyperpoint& velocity) { | ||||
|   EX void geodesic_step(hyperpoint& at, hyperpoint& velocity) { | ||||
|     auto acc = christoffel(at, velocity, velocity); | ||||
|      | ||||
|     auto at2 = at + velocity / 2; | ||||
| @@ -562,7 +567,7 @@ namespace nisot { | ||||
|     velocity = velocity + acc; | ||||
|     } | ||||
|    | ||||
|   hyperpoint direct_exp(hyperpoint v, int steps) { | ||||
|   EX hyperpoint direct_exp(hyperpoint v, int steps) { | ||||
|     hyperpoint at = point31(0, 0, 0); | ||||
|     v /= steps; | ||||
|     v[3] = 0; | ||||
| @@ -570,7 +575,7 @@ namespace nisot { | ||||
|     return at; | ||||
|     } | ||||
|  | ||||
|   transmatrix transpose(transmatrix T) { | ||||
|   EX transmatrix transpose(transmatrix T) { | ||||
|     transmatrix result; | ||||
|     for(int i=0; i<MDIM; i++) | ||||
|       for(int j=0; j<MDIM; j++) | ||||
| @@ -578,7 +583,7 @@ namespace nisot { | ||||
|     return result; | ||||
|     } | ||||
|    | ||||
|   transmatrix parallel_transport_bare(transmatrix Pos, transmatrix T) { | ||||
|   EX transmatrix parallel_transport_bare(transmatrix Pos, transmatrix T) { | ||||
|    | ||||
|     hyperpoint h = tC0(T); | ||||
|     h[3] = 0; | ||||
| @@ -599,7 +604,7 @@ namespace nisot { | ||||
|     return transpose(tPos); | ||||
|     } | ||||
|  | ||||
|   void fixmatrix(transmatrix& T) { | ||||
|   EX void fixmatrix(transmatrix& T) { | ||||
|     transmatrix push = eupush( tC0(T) ); | ||||
|     transmatrix push_back = inverse(push); | ||||
|     transmatrix gtl = push_back * T; | ||||
| @@ -607,14 +612,14 @@ namespace nisot { | ||||
|     T = push * gtl; | ||||
|     } | ||||
|    | ||||
|   transmatrix parallel_transport(const transmatrix Position, const transmatrix T) { | ||||
|   EX transmatrix parallel_transport(const transmatrix Position, const transmatrix T) { | ||||
|     auto P = Position; | ||||
|     nisot::fixmatrix(P);   | ||||
|     if(!geodesic_movement) return inverse(eupush(Position * inverse(T) * inverse(Position) * C0)) * Position; | ||||
|     return parallel_transport_bare(P, T); | ||||
|     } | ||||
|    | ||||
|   transmatrix transport_view(const transmatrix T, const transmatrix V) { | ||||
|   EX transmatrix transport_view(const transmatrix T, const transmatrix V) { | ||||
|     if(!geodesic_movement) { | ||||
|       transmatrix IV = inverse(V); | ||||
|       nisot::fixmatrix(IV); | ||||
| @@ -624,7 +629,7 @@ namespace nisot { | ||||
|     return inverse(parallel_transport(inverse(V), inverse(T))); | ||||
|     } | ||||
|  | ||||
|   transmatrix spin_towards(const transmatrix Position, const hyperpoint goal) { | ||||
|   EX transmatrix spin_towards(const transmatrix Position, const hyperpoint goal) { | ||||
|  | ||||
|     hyperpoint at = tC0(Position); | ||||
|     transmatrix push_back = inverse(translate(at)); | ||||
| @@ -636,7 +641,7 @@ namespace nisot { | ||||
|     return rspintox(inverse(back_Position) * back_goal); | ||||
|     } | ||||
|    | ||||
|   hrmap *new_map() {  | ||||
|   EX hrmap *new_map() {  | ||||
|     if(sol) return new solv::hrmap_sol;  | ||||
|     if(nil) return new nilv::hrmap_nil; | ||||
|     return NULL; | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Zeno Rogue
					Zeno Rogue