mirror of
https://github.com/zenorogue/hyperrogue.git
synced 2025-10-26 11:27:39 +00:00
intra:: Solv portalsP
This commit is contained in:
34
intra.cpp
34
intra.cpp
@@ -63,8 +63,13 @@ hyperpoint portal_data::to_poco(hyperpoint h) const {
|
|||||||
h[3] = 1;
|
h[3] = 1;
|
||||||
return h;
|
return h;
|
||||||
}
|
}
|
||||||
else if(hyperbolic && bt::in())
|
else if(hyperbolic && bt::in()) {
|
||||||
return T * bt::minkowski_to_bt(h);
|
h = T * bt::minkowski_to_bt(h);
|
||||||
|
for(int i: {0,1,2}) h[i] *= (log(2)/2);
|
||||||
|
return h;
|
||||||
|
}
|
||||||
|
else if(sol)
|
||||||
|
return T * h;
|
||||||
else {
|
else {
|
||||||
h = T * h;
|
h = T * h;
|
||||||
h /= h[3];
|
h /= h[3];
|
||||||
@@ -88,8 +93,12 @@ hyperpoint portal_data::from_poco(hyperpoint h) const {
|
|||||||
h[3] = 1;
|
h[3] = 1;
|
||||||
return iT * h * exp(h0[1]);
|
return iT * h * exp(h0[1]);
|
||||||
}
|
}
|
||||||
else if(hyperbolic && bt::in())
|
else if(hyperbolic && bt::in()) {
|
||||||
|
for(int i: {0,1,2}) h[i] *= (2/log(2));
|
||||||
return bt::bt_to_minkowski(iT * h);
|
return bt::bt_to_minkowski(iT * h);
|
||||||
|
}
|
||||||
|
else if(sol)
|
||||||
|
return iT * h;
|
||||||
else {
|
else {
|
||||||
h[3] = 1;
|
h[3] = 1;
|
||||||
return normalize(iT * h);
|
return normalize(iT * h);
|
||||||
@@ -101,6 +110,7 @@ EX portal_data make_portal(cellwalker cw, int spin) {
|
|||||||
auto fac = ss.faces[cw.spin];
|
auto fac = ss.faces[cw.spin];
|
||||||
portal_data id;
|
portal_data id;
|
||||||
id.scale = 1;
|
id.scale = 1;
|
||||||
|
auto gg = geometry;
|
||||||
if(prod && cw.spin == cw.at->type - 1) {
|
if(prod && cw.spin == cw.at->type - 1) {
|
||||||
id.kind = 1;
|
id.kind = 1;
|
||||||
id.d = product_decompose(fac[0]).first;
|
id.d = product_decompose(fac[0]).first;
|
||||||
@@ -125,8 +135,13 @@ EX portal_data make_portal(cellwalker cw, int spin) {
|
|||||||
println(hlog, kz(h), " -> ", kz(spintox(id.v0)*h), " -> ", kz(cpush(0, -hdist0(id.v0))) * kz(spintox(id.v0) * h), " -> ", kz(id.to_poco(h)));
|
println(hlog, kz(h), " -> ", kz(spintox(id.v0)*h), " -> ", kz(cpush(0, -hdist0(id.v0))) * kz(spintox(id.v0) * h), " -> ", kz(id.to_poco(h)));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if(hyperbolic && bt::in()) {
|
else if(bt::in()) {
|
||||||
if(isize(fac) == 5) fac.erase(fac.begin() + 1);
|
for(int i=0; i<isize(fac); i++) {
|
||||||
|
int i1 = i+1; if(i1 >= isize(fac)) i1 = 0;
|
||||||
|
int i2 = i1+1; if(i2 >= isize(fac)) i2 = 0;
|
||||||
|
if(hypot_d(3, 2*fac[i1] - fac[i] - fac[i2]) < 1e-3)
|
||||||
|
fac.erase(fac.begin()+i1);
|
||||||
|
}
|
||||||
id.kind = 0;
|
id.kind = 0;
|
||||||
id.v0 = Hypc;
|
id.v0 = Hypc;
|
||||||
id.T = Id;
|
id.T = Id;
|
||||||
@@ -142,6 +157,15 @@ EX portal_data make_portal(cellwalker cw, int spin) {
|
|||||||
id.T = cspin(2, 1, 90*degree) * id.T;
|
id.T = cspin(2, 1, 90*degree) * id.T;
|
||||||
}
|
}
|
||||||
if((id.T * C03)[2] > 0) id.T = cspin(2, 0, 180*degree) * id.T;
|
if((id.T * C03)[2] > 0) id.T = cspin(2, 0, 180*degree) * id.T;
|
||||||
|
vector<hyperpoint> v;
|
||||||
|
geometry = gg;
|
||||||
|
for(auto f: fac) v.push_back(id.to_poco(final_coords(f)));
|
||||||
|
geometry = gCubeTiling;
|
||||||
|
ld sca = 1;
|
||||||
|
for(int i=0; i<isize(v); i++)
|
||||||
|
sca *= sqhypot_d(3, v[i] - v[(1+i) % isize(v)]);
|
||||||
|
sca = pow(sca, .5 / isize(v));
|
||||||
|
id.scale = sca / 2;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
id.kind = 0;
|
id.kind = 0;
|
||||||
|
|||||||
@@ -1012,7 +1012,16 @@ void raygen::emit_intra_portal(int gid1, int gid2) {
|
|||||||
" mediump vec4 nposition = position + tangent * 1e-3;\n"
|
" mediump vec4 nposition = position + tangent * 1e-3;\n"
|
||||||
" mediump mat4 tkt = " + getM("mid+1") + ";\n"
|
" mediump mat4 tkt = " + getM("mid+1") + ";\n"
|
||||||
" position = tkt * minkowski_to_bt(position);\n"
|
" position = tkt * minkowski_to_bt(position);\n"
|
||||||
" nposition = tkt * minkowski_to_bt(nposition);\n";
|
" nposition = tkt * minkowski_to_bt(nposition);\n"
|
||||||
|
" position.xyz *= " + glhr::to_glsl(log(2)/2) + ";\n"
|
||||||
|
" nposition.xyz *= " + glhr::to_glsl(log(2)/2) + ";\n";
|
||||||
|
}
|
||||||
|
else if(sol) {
|
||||||
|
fmain +=
|
||||||
|
" mediump vec4 nposition = position + tangent * 1e-3;\n"
|
||||||
|
" mediump mat4 tkt = " + getM("mid+1") + ";\n"
|
||||||
|
" position = tkt * position;\n"
|
||||||
|
" nposition = tkt * nposition;\n";
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
fmain +=
|
fmain +=
|
||||||
@@ -1076,6 +1085,15 @@ void raygen::emit_intra_portal(int gid1, int gid2) {
|
|||||||
}
|
}
|
||||||
fmain += "}\n";
|
fmain += "}\n";
|
||||||
}
|
}
|
||||||
|
else if(sol) {
|
||||||
|
fmain +=
|
||||||
|
" mediump mat4 itkt = " + getM("mid+2") + ";\n";
|
||||||
|
fmain +=
|
||||||
|
" position = itkt * position;\n"
|
||||||
|
" nposition = itkt * nposition;\n"
|
||||||
|
" tangent = (nposition - position) * 1e3;\n"
|
||||||
|
" float next = maxstep;\n";
|
||||||
|
}
|
||||||
else {
|
else {
|
||||||
fmain +=
|
fmain +=
|
||||||
" mediump mat4 itkt = " + getM("mid+2") + ";\n";
|
" mediump mat4 itkt = " + getM("mid+2") + ";\n";
|
||||||
@@ -1084,6 +1102,8 @@ void raygen::emit_intra_portal(int gid1, int gid2) {
|
|||||||
string sgn = hyperbolic ? "-" : "+";
|
string sgn = hyperbolic ? "-" : "+";
|
||||||
if(hyperbolic && bt::in()) {
|
if(hyperbolic && bt::in()) {
|
||||||
fmain +=
|
fmain +=
|
||||||
|
" position.xyz *= " + glhr::to_glsl(2/log(2)) + ";\n"
|
||||||
|
" nposition.xyz *= " + glhr::to_glsl(2/log(2)) + ";\n"
|
||||||
" position = bt_to_minkowski(itkt * position);\n"
|
" position = bt_to_minkowski(itkt * position);\n"
|
||||||
" nposition = bt_to_minkowski(itkt * nposition);\n";
|
" nposition = bt_to_minkowski(itkt * nposition);\n";
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user