mirror of
				https://github.com/zenorogue/hyperrogue.git
				synced 2025-10-31 14:02:59 +00:00 
			
		
		
		
	intra:: non-regular-shaped portals e.g. right-angled triangles
This commit is contained in:
		
							
								
								
									
										48
									
								
								intra.cpp
									
									
									
									
									
								
							
							
						
						
									
										48
									
								
								intra.cpp
									
									
									
									
									
								
							| @@ -54,6 +54,7 @@ hyperpoint portal_data::to_poco(hyperpoint h) const { | |||||||
|       h[3] = 1; |       h[3] = 1; | ||||||
|       } |       } | ||||||
|     else { |     else { | ||||||
|  |       h = T * h; | ||||||
|       h[0] /= h[2]; |       h[0] /= h[2]; | ||||||
|       h[1] /= h[2]; |       h[1] /= h[2]; | ||||||
|       h[2] = dec.first - d; |       h[2] = dec.first - d; | ||||||
| @@ -103,7 +104,7 @@ hyperpoint portal_data::from_poco(hyperpoint h) const { | |||||||
|       } |       } | ||||||
|     h[2] = 1; |     h[2] = 1; | ||||||
|     auto z = product_decompose(h).first; |     auto z = product_decompose(h).first; | ||||||
|     return h * exp(d+xd-z); |     return iT * h * exp(d+xd-z); | ||||||
|     } |     } | ||||||
|   else if(prod && kind == 0) { |   else if(prod && kind == 0) { | ||||||
|     auto h0 = h; |     auto h0 = h; | ||||||
| @@ -130,7 +131,7 @@ hyperpoint portal_data::from_poco(hyperpoint h) const { | |||||||
|  |  | ||||||
| EX portal_data make_portal(cellwalker cw, int spin) { | EX portal_data make_portal(cellwalker cw, int spin) { | ||||||
|   auto& ss = currentmap->get_cellshape(cw.at); |   auto& ss = currentmap->get_cellshape(cw.at); | ||||||
|   auto fac = ss.faces[cw.spin]; |   auto fac = ss.faces_local[cw.spin]; | ||||||
|   portal_data id; |   portal_data id; | ||||||
|   id.scale = 1; |   id.scale = 1; | ||||||
|   auto gg = geometry; |   auto gg = geometry; | ||||||
| @@ -142,6 +143,12 @@ EX portal_data make_portal(cellwalker cw, int spin) { | |||||||
|       fac.pop_back(); |       fac.pop_back(); | ||||||
|       id.scale = log(2)/2; |       id.scale = log(2)/2; | ||||||
|       } |       } | ||||||
|  |     else { | ||||||
|  |       hyperpoint ctr = Hypc; | ||||||
|  |       for(auto p: fac) ctr += product_decompose(p).second; | ||||||
|  |       ctr = normalize_flat(ctr); | ||||||
|  |       id.T = gpushxto0(ctr); | ||||||
|  |       } | ||||||
|     } |     } | ||||||
|   else if(prod) { |   else if(prod) { | ||||||
|     id.kind = 0; |     id.kind = 0; | ||||||
| @@ -161,28 +168,30 @@ EX portal_data make_portal(cellwalker cw, int spin) { | |||||||
|     } |     } | ||||||
|   else if(bt::in()) { |   else if(bt::in()) { | ||||||
|     hyperpoint removed = Hypc; |     hyperpoint removed = Hypc; | ||||||
|     for(int i=0; i<isize(fac); i++) { |  | ||||||
|       int i1 = i+1; if(i1 >= isize(fac)) i1 = 0; |     auto facmod = fac; | ||||||
|       int i2 = i1+1; if(i2 >= isize(fac)) i2 = 0; |     if(hyperbolic) for(auto& h: facmod) h = deparabolic13(h); | ||||||
|       if(hypot_d(3, 2*fac[i1] - fac[i] - fac[i2]) < 1e-3) { |  | ||||||
|  |     for(int i=0; i<isize(facmod); i++) { | ||||||
|  |       int i1 = i+1; if(i1 >= isize(facmod)) i1 = 0; | ||||||
|  |       int i2 = i1+1; if(i2 >= isize(facmod)) i2 = 0; | ||||||
|  |       if(hypot_d(3, 2*facmod[i1] - facmod[i] - facmod[i2]) < 1e-3) { | ||||||
|         removed = fac[i1]; |         removed = fac[i1]; | ||||||
|  |         facmod.erase(facmod.begin()+i1); | ||||||
|         fac.erase(fac.begin()+i1); |         fac.erase(fac.begin()+i1); | ||||||
|         } |         } | ||||||
|       } |       } | ||||||
|     id.kind = 0; |     id.kind = 0; | ||||||
|     id.v0 = Hypc; |     id.v0 = Hypc; | ||||||
|     id.T = Id; |     id.T = Id; | ||||||
|     for(auto& h: fac) h[3] = 1; |  | ||||||
|     auto fac1 = fac; |  | ||||||
|  |  | ||||||
|  |     auto fac1 = fac; | ||||||
|     auto to_coords = [] (hyperpoint& p) { |     auto to_coords = [] (hyperpoint& p) { | ||||||
|       if(hyperbolic) { |       if(hyperbolic) { | ||||||
|         p[0] *= bt::xy_mul(); |         p = deparabolic13(p); | ||||||
|         p[1] *= bt::xy_mul(); |         p = hyperpoint(p[1], p[2], p[0], 1); | ||||||
|         p[2] *= log(2) / 2; |  | ||||||
|         } |         } | ||||||
|       }; |       }; | ||||||
|  |  | ||||||
|     for(auto& p: fac1) |     for(auto& p: fac1) | ||||||
|       to_coords(p); |       to_coords(p); | ||||||
|     to_coords(removed); |     to_coords(removed); | ||||||
| @@ -202,7 +211,7 @@ EX portal_data make_portal(cellwalker cw, int spin) { | |||||||
|     if((id.T * removed)[1] < -1e-2) id.T = cspin(0, 1, 180*degree) * id.T; |     if((id.T * removed)[1] < -1e-2) id.T = cspin(0, 1, 180*degree) * id.T; | ||||||
|     vector<hyperpoint> v; |     vector<hyperpoint> v; | ||||||
|     geometry = gg; |     geometry = gg; | ||||||
|     for(auto f: fac) v.push_back(id.to_poco(final_coords(f))); |     for(auto f: fac) v.push_back(id.to_poco(f)); | ||||||
|     geometry = gCubeTiling; |     geometry = gCubeTiling; | ||||||
|     ld sca = 1; |     ld sca = 1; | ||||||
|     for(int i=0; i<isize(v); i++) |     for(int i=0; i<isize(v); i++) | ||||||
| @@ -212,19 +221,22 @@ EX portal_data make_portal(cellwalker cw, int spin) { | |||||||
|     } |     } | ||||||
|   else { |   else { | ||||||
|     id.kind = 0; |     id.kind = 0; | ||||||
|     id.v0 = Hypc; |     id.v0 = project_on_triangle(fac[0], fac[1], fac[2]); | ||||||
|     for(auto p: fac) id.v0 += p; |  | ||||||
|     id.v0 = normalize(id.v0); |  | ||||||
|     id.T = cpush(2, -hdist0(id.v0)) * cspin(2, 0, 90*degree) * spintox(id.v0); |     id.T = cpush(2, -hdist0(id.v0)) * cspin(2, 0, 90*degree) * spintox(id.v0); | ||||||
|  |     hyperpoint ctr = Hypc; | ||||||
|  |     for(auto p: fac) ctr += id.T*p; | ||||||
|  |     ctr = normalize(ctr); | ||||||
|  |     id.T = gpushxto0(ctr) * id.T; | ||||||
|     } |     } | ||||||
|  |   if(MDIM == 3) for(int i=0; i<4; i++) id.T[3][i] = id.T[i][3] = i==3; | ||||||
|   id.iT = inverse(id.T); |   id.iT = inverse(id.T); | ||||||
|   if(MDIM == 3) for(int i=0; i<4; i++) id.iT[3][i] = id.iT[i][3] = i==3; |   if(MDIM == 3) for(int i=0; i<4; i++) id.iT[3][i] = id.iT[i][3] = i==3; | ||||||
|   int first = spin; |   int first = spin; | ||||||
|   int second = spin + 1; |   int second = spin + 1; | ||||||
|   first = gmod(first, isize(fac)); |   first = gmod(first, isize(fac)); | ||||||
|   second = gmod(second, isize(fac)); |   second = gmod(second, isize(fac)); | ||||||
|   id.co0 = id.to_poco(final_coords(fac[first])); |   id.co0 = id.to_poco(fac[first]); | ||||||
|   id.co1 = id.to_poco(final_coords(fac[second])); |   id.co1 = id.to_poco(fac[second]); | ||||||
|  |  | ||||||
|   if(debug_portal) for(auto p: fac) { |   if(debug_portal) for(auto p: fac) { | ||||||
|     auto p1 = final_coords(p); |     auto p1 = final_coords(p); | ||||||
|   | |||||||
| @@ -1013,10 +1013,11 @@ void raygen::emit_intra_portal(int gid1, int gid2) { | |||||||
|     if(1) { |     if(1) { | ||||||
|       string fn = bt::in() ? "to_poco_h2xr_b" : in_h2xe() ? "to_poco_h2xr_h" : "to_poco_s2xr_s"; |       string fn = bt::in() ? "to_poco_h2xr_b" : in_h2xe() ? "to_poco_h2xr_h" : "to_poco_s2xr_s"; | ||||||
|       fmain += |       fmain += | ||||||
|  |         "    mediump mat4 tkt = " + getM("mid+1") + ";\n" | ||||||
|         "    nposition = position + tangent * xspeed * 1e-3;\n" |         "    nposition = position + tangent * xspeed * 1e-3;\n" | ||||||
|         "    position = "+fn+"(position);\n" |         "    position = "+fn+"(tkt*position);\n" | ||||||
|         "    position.z = 0.;\n" // zpos - uPLevel;\n" |         "    position.z = 0.;\n" // zpos - uPLevel;\n" | ||||||
|         "    nposition = "+fn+"(nposition);\n" |         "    nposition = "+fn+"(tkt*nposition);\n" | ||||||
|         "    nposition.z = zspeed * 1e-3;\n" |         "    nposition.z = zspeed * 1e-3;\n" | ||||||
|         "    if(pconnection.y < .5) { nposition.z = -nposition.z; nposition.x = -nposition.x; position.x = -position.x; }\n"; |         "    if(pconnection.y < .5) { nposition.z = -nposition.z; nposition.x = -nposition.x; position.x = -position.x; }\n"; | ||||||
|       } |       } | ||||||
| @@ -1086,8 +1087,9 @@ void raygen::emit_intra_portal(int gid1, int gid2) { | |||||||
|       "    if(pconnection.w < .5) { position.z = -position.z; nposition.z = -nposition.z; nposition.x = -nposition.x; position.x = -position.x; }\n" |       "    if(pconnection.w < .5) { position.z = -position.z; nposition.z = -nposition.z; nposition.x = -nposition.x; position.x = -position.x; }\n" | ||||||
|       "    zspeed = (nposition.z - position.z) * 1e3;\n" |       "    zspeed = (nposition.z - position.z) * 1e3;\n" | ||||||
|       "    zpos = position.z + (pconnection.w - .5) * 16.;\n" |       "    zpos = position.z + (pconnection.w - .5) * 16.;\n" | ||||||
|       "    position = "+fn+"(position);\n" |       "    mediump mat4 itkt = " + getM("mid+2") + ";\n" | ||||||
|       "    nposition = "+fn+"(nposition);\n" |       "    position = itkt*"+fn+"(position);\n" | ||||||
|  |       "    nposition = itkt*"+fn+"(nposition);\n" | ||||||
|       "    tangent = (nposition - position) * 1e3;\n" |       "    tangent = (nposition - position) * 1e3;\n" | ||||||
|       "    mediump float pnorm = tangent.z * position.z "+sgn+" tangent.x * position.x "+sgn+" tangent.y * position.y;\n" |       "    mediump float pnorm = tangent.z * position.z "+sgn+" tangent.x * position.x "+sgn+" tangent.y * position.y;\n" | ||||||
|       "    tangent -= position * pnorm;\n" |       "    tangent -= position * pnorm;\n" | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Zeno Rogue
					Zeno Rogue