mirror of
https://github.com/zenorogue/hyperrogue.git
synced 2025-02-02 12:19:18 +00:00
mstretch now works in rot spaces including SL2
This commit is contained in:
parent
e87da576e4
commit
b5924ccc5c
@ -1554,8 +1554,15 @@ EX void optimizeview() {
|
||||
if(subscreens::split(optimizeview)) return;
|
||||
if(dual::split(optimizeview)) return;
|
||||
|
||||
cell *c = centerover;
|
||||
transmatrix iView = inverse(View);
|
||||
virtualRebase(centerover, iView);
|
||||
if(c != centerover && (sphere || sl3)) {
|
||||
transmatrix T = currentmap->relative_matrix(centerover, c, C0);
|
||||
T = stretch::itranslate(tC0(T)) * T;
|
||||
stretch::mstretch_matrix = T * stretch::mstretch_matrix;
|
||||
}
|
||||
|
||||
View = inverse(iView);
|
||||
fixmatrix(View);
|
||||
|
||||
@ -1594,6 +1601,7 @@ EX void resetview() {
|
||||
DEBBI(DF_GRAPH, ("reset view"));
|
||||
// EUCLIDEAN
|
||||
NLP = Id;
|
||||
stretch::mstretch_matrix = Id;
|
||||
auto lView = View;
|
||||
if(cwt.at) {
|
||||
centerover = cwt.at;
|
||||
|
@ -2192,6 +2192,7 @@ EX namespace rots {
|
||||
dynamicval<cell*> m5(centerover, co);
|
||||
dynamicval<transmatrix> m2(View, inprod ? pView : ypush(0) * qtm(h));
|
||||
if(PURE) View = View * pispin;
|
||||
View = inverse(stretch::mstretch_matrix) * spin(2*d) * View;
|
||||
dynamicval<shiftmatrix> m3(playerV, shiftless(Id));
|
||||
dynamicval<transmatrix> m4(actual_view_transform, Id);
|
||||
dynamicval<shiftmatrix> m6(cwtV, shiftless(Id));
|
||||
@ -2289,6 +2290,8 @@ EX namespace stretch {
|
||||
EX transmatrix m_itoa, m_atoi, m_pd;
|
||||
EX ld ms_christoffel[3][3][3];
|
||||
|
||||
EX transmatrix mstretch_matrix;
|
||||
|
||||
EX void enable_mstretch() {
|
||||
mstretch = true;
|
||||
|
||||
@ -2327,8 +2330,36 @@ EX namespace stretch {
|
||||
|
||||
ld den = (-4*A00*A11*A22 + A00*B12 + B01*A22 - A01*A02*A12 + B02*A11);
|
||||
|
||||
/* to do: these formulas are not correct for SL; also the engine currently depends on rotational symmetry, which may not hold */
|
||||
|
||||
if(sl2) {
|
||||
c[ 0 ][ 0 ][ 0 ] = (A01*(A01*A12 - 2*A02*A11) - A02*(2*A01*A22 - A02*A12))/den;
|
||||
c[ 0 ][ 0 ][ 1 ] = (A00*A01*A12 - 2*A00*A02*A11 - A01*A11*A12 + A01*A12*A22 + 2*A02*B11 + 2*A02*A11*A22 - A02*B12)/-den ;
|
||||
c[ 0 ][ 0 ][ 2 ] = (-A01*(4*A11*A22 - B12)/2 + A12*(A01*A12 - 2*A02*A11)/2 - (A00 + A22)*(2*A01*A22 - A02*A12))/den;
|
||||
c[ 0 ][ 1 ][ 0 ] = (A00*A01*A12 - 2*A00*A02*A11 - A01*A11*A12 + A01*A12*A22 + 2*A02*B11 + 2*A02*A11*A22 - A02*B12)/-den ;
|
||||
c[ 0 ][ 1 ][ 1 ] = -(A01*(A01*A12 - 2*A02*A11) + A12*(4*A11*A22 - B12))/den;
|
||||
c[ 0 ][ 1 ][ 2 ] = (B01*A22 - B02*A11 + 4*B11*A22 - A11*B12 + 4*A11*B22 - B12*A22)/-den ;
|
||||
c[ 0 ][ 2 ][ 0 ] = (-A01*(4*A11*A22 - B12)/2 + A12*(A01*A12 - 2*A02*A11)/2 - (A00 + A22)*(2*A01*A22 - A02*A12))/den;
|
||||
c[ 0 ][ 2 ][ 1 ] = (B01*A22 - B02*A11 + 4*B11*A22 - A11*B12 + 4*A11*B22 - B12*A22)/-den ;
|
||||
c[ 0 ][ 2 ][ 2 ] = -(A02*(2*A01*A22 - A02*A12) + A12*(4*A11*A22 - B12))/den;
|
||||
c[ 1 ][ 0 ][ 0 ] = (-A01*(2*A00*A12 - A01*A02) + A02*(4*A00*A22 - B02))/den;
|
||||
c[ 1 ][ 0 ][ 1 ] = (A02*(2*A01*A22 - A02*A12)/2 + A12*(4*A00*A22 - B02)/2 + (A00 - A11)*(2*A00*A12 - A01*A02))/den;
|
||||
c[ 1 ][ 0 ][ 2 ] = (-4*B00*A22 + A00*B02 + A00*B12 - 4*A00*B22 - B01*A22 + B02*A22)/-den ;
|
||||
c[ 1 ][ 1 ][ 0 ] = (A02*(2*A01*A22 - A02*A12)/2 + A12*(4*A00*A22 - B02)/2 + (A00 - A11)*(2*A00*A12 - A01*A02))/den;
|
||||
c[ 1 ][ 1 ][ 1 ] = (A01*(2*A00*A12 - A01*A02) + A12*(2*A01*A22 - A02*A12))/den;
|
||||
c[ 1 ][ 1 ][ 2 ] = (A01*(4*A00*A22 - B02)/2 + A02*(2*A00*A12 - A01*A02)/2 + (A11 + A22)*(2*A01*A22 - A02*A12))/den;
|
||||
c[ 1 ][ 2 ][ 0 ] = (-4*B00*A22 + A00*B02 + A00*B12 - 4*A00*B22 - B01*A22 + B02*A22)/-den ;
|
||||
c[ 1 ][ 2 ][ 1 ] = (A01*(4*A00*A22 - B02)/2 + A02*(2*A00*A12 - A01*A02)/2 + (A11 + A22)*(2*A01*A22 - A02*A12))/den;
|
||||
c[ 1 ][ 2 ][ 2 ] = (A02*(4*A00*A22 - B02) + A12*(2*A01*A22 - A02*A12))/den;
|
||||
c[ 2 ][ 0 ][ 0 ] = (A01*(4*A00*A11 - B01) - A02*(2*A00*A12 - A01*A02))/den;
|
||||
c[ 2 ][ 0 ][ 1 ] = (4*B00*A11 - A00*B01 - 4*A00*B11 + A00*B12 + B01*A11 - B02*A11)/-den ;
|
||||
c[ 2 ][ 0 ][ 2 ] = (-A01*(A01*A12 - 2*A02*A11)/2 + A12*(4*A00*A11 - B01)/2 - (A00 + A22)*(2*A00*A12 - A01*A02))/den;
|
||||
c[ 2 ][ 1 ][ 0 ] = (4*B00*A11 - A00*B01 - 4*A00*B11 + A00*B12 + B01*A11 - B02*A11)/-den ;
|
||||
c[ 2 ][ 1 ][ 1 ] = -(A01*(4*A00*A11 - B01) + A12*(A01*A12 - 2*A02*A11))/den;
|
||||
c[ 2 ][ 1 ][ 2 ] = (A00*A01*A12 + 2*A00*A02*A11 - B01*A02 + A01*A11*A12 + A01*A12*A22 - 2*A02*B11 - 2*A02*A11*A22)/-den ;
|
||||
c[ 2 ][ 2 ][ 0 ] = (-A01*(A01*A12 - 2*A02*A11)/2 + A12*(4*A00*A11 - B01)/2 - (A00 + A22)*(2*A00*A12 - A01*A02))/den;
|
||||
c[ 2 ][ 2 ][ 1 ] = (A00*A01*A12 + 2*A00*A02*A11 - B01*A02 + A01*A11*A12 + A01*A12*A22 - 2*A02*B11 - 2*A02*A11*A22)/-den ;
|
||||
c[ 2 ][ 2 ][ 2 ] = -(A02*(2*A00*A12 - A01*A02) + A12*(A01*A12 - 2*A02*A11))/den;
|
||||
}
|
||||
else {
|
||||
c[ 0 ][ 0 ][ 0 ] = (A01*(A01*A12 - 2*A02*A11) + A02*(2*A01*A22 - A02*A12))/den ;
|
||||
c[ 0 ][ 0 ][ 1 ] = (A02*(4*A11*A22 - B12)/2 + A12*(2*A01*A22 - A02*A12)/2 - (A00 - A11)*(A01*A12 - 2*A02*A11))/den ;
|
||||
c[ 0 ][ 0 ][ 2 ] = (-A01*(4*A11*A22 - B12)/2 + A12*(A01*A12 - 2*A02*A11)/2 - (A00 - A22)*(2*A01*A22 - A02*A12))/den ;
|
||||
@ -2356,6 +2387,7 @@ EX namespace stretch {
|
||||
c[ 2 ][ 2 ][ 0 ] = (-A01*(A01*A12 - 2*A02*A11)/2 + A12*(4*A00*A11 - B01)/2 - (A00 - A22)*(2*A00*A12 - A01*A02))/den ;
|
||||
c[ 2 ][ 2 ][ 1 ] = (A00*A01*A12 + 2*A00*A02*A11 - B01*A02 + A01*A11*A12 - A01*A12*A22 - 2*A02*B11 + 2*A02*A11*A22)/(4*A00*A11*A22 - A00*B12 - B01*A22 + A01*A02*A12 - B02*A11) ;
|
||||
c[ 2 ][ 2 ][ 2 ] = -(A02*(2*A00*A12 - A01*A02) + A12*(A01*A12 - 2*A02*A11))/den ;
|
||||
}
|
||||
|
||||
for(int i=0; i<3; i++)
|
||||
for(int j=0; j<3; j++)
|
||||
@ -2642,6 +2674,9 @@ EX namespace nisot {
|
||||
|
||||
h[3] = 0;
|
||||
|
||||
if(stretch::in() && stretch::mstretch)
|
||||
Pos = stretch::mstretch_matrix * Pos;
|
||||
|
||||
auto tPos = transpose(Pos);
|
||||
|
||||
h = Pos * h;
|
||||
@ -2716,7 +2751,12 @@ EX namespace nisot {
|
||||
for(int i=0; i<3; i++) tPos[i] = stretch::actual_to_isometric(at, tPos[i]);
|
||||
}
|
||||
|
||||
return transpose(tPos);
|
||||
Pos = transpose(tPos);
|
||||
|
||||
if(stretch::in() && stretch::mstretch)
|
||||
Pos = inverse(stretch::mstretch_matrix) * Pos;
|
||||
|
||||
return Pos;
|
||||
}
|
||||
|
||||
EX void fixmatrix(transmatrix& T) {
|
||||
|
@ -109,6 +109,7 @@ struct raycaster : glhr::GLprogram {
|
||||
GLint uPosX, uPosY;
|
||||
GLint uWallOffset, uSides;
|
||||
GLint uITOA, uATOI;
|
||||
GLint uToOrig, uFromOrig;
|
||||
|
||||
raycaster(string vsh, string fsh);
|
||||
};
|
||||
@ -155,6 +156,8 @@ raycaster::raycaster(string vsh, string fsh) : GLprogram(vsh, fsh) {
|
||||
|
||||
uITOA = glGetUniformLocation(_program, "uITOA");
|
||||
uATOI = glGetUniformLocation(_program, "uATOI");
|
||||
uToOrig = glGetUniformLocation(_program, "uToOrig");
|
||||
uFromOrig = glGetUniformLocation(_program, "uFromOrig");
|
||||
}
|
||||
|
||||
shared_ptr<raycaster> our_raycaster;
|
||||
@ -391,20 +394,31 @@ void enable_raycaster() {
|
||||
" mediump vec4 tangent = vw * at0;\n";
|
||||
|
||||
if(stretch::in()) {
|
||||
fmain +=
|
||||
"tangent = s_itranslate(position) * tangent;\n";
|
||||
if(stretch::mstretch) {
|
||||
fsh += "mediump uniform mat4 uITOA;\n";
|
||||
fsh += "mediump uniform mat4 uATOI;\n";
|
||||
fsh += "mediump uniform mat4 uToOrig;\n";
|
||||
fsh += "mediump uniform mat4 uFromOrig;\n";
|
||||
fsh += "mediump mat4 toOrig;\n";
|
||||
fsh += "mediump mat4 fromOrig;\n";
|
||||
fmain +=
|
||||
"toOrig = uToOrig;\n"
|
||||
"fromOrig = uFromOrig;\n";
|
||||
fmain +=
|
||||
"tangent = s_itranslate(toOrig * position) * toOrig * tangent;\n";
|
||||
fmain +=
|
||||
"tangent = uITOA * tangent;\n";
|
||||
fmain +=
|
||||
"tangent = fromOrig * s_translate(toOrig * position) * tangent;\n";
|
||||
}
|
||||
else
|
||||
else {
|
||||
fmain +=
|
||||
"tangent = s_itranslate(position) * tangent;\n";
|
||||
fmain +=
|
||||
"tangent[2] /= " + to_glsl(stretch::not_squared()) + ";\n";
|
||||
fmain +=
|
||||
"tangent = s_translate(position) * tangent;\n";
|
||||
;
|
||||
}
|
||||
}
|
||||
|
||||
if(bi) fmain += " walloffset = uWallOffset; sides = uSides;\n";
|
||||
@ -605,9 +619,9 @@ void enable_raycaster() {
|
||||
"}\n";
|
||||
if(stretch::mstretch) {
|
||||
fsh += "mediump vec4 christoffel(mediump vec4 pos, mediump vec4 vel, mediump vec4 tra) {\n"
|
||||
"vel = s_itranslate(pos) * vel;\n"
|
||||
"tra = s_itranslate(pos) * tra;\n"
|
||||
"return s_translate(pos) * vec4(\n";
|
||||
"vel = s_itranslate(toOrig * pos) * toOrig * vel;\n"
|
||||
"tra = s_itranslate(toOrig * pos) * toOrig * tra;\n"
|
||||
"return fromOrig * s_translate(toOrig * pos) * vec4(\n";
|
||||
|
||||
for(int i=0; i<3; i++) {
|
||||
auto &c = stretch::ms_christoffel;
|
||||
@ -926,7 +940,7 @@ void enable_raycaster() {
|
||||
|
||||
if((stretch::in() || sl2) && use_christoffel) {
|
||||
fmain +=
|
||||
"tangent = s_itranslate(position) * tangent;\n"
|
||||
"tangent = s_itranslate(toOrig * position) * toOrig * tangent;\n"
|
||||
"tangent[3] = 0.;\n";
|
||||
if(stretch::mstretch)
|
||||
fmain +=
|
||||
@ -937,7 +951,7 @@ void enable_raycaster() {
|
||||
+ to_glsl(stretch::squared()) + " * tangent.z * tangent.z;\n";
|
||||
fmain +=
|
||||
"tangent /= sqrt(nvelsquared);\n"
|
||||
"tangent = s_translate(position) * tangent;\n";
|
||||
"tangent = fromOrig * s_translate(toOrig * position) * tangent;\n";
|
||||
}
|
||||
}
|
||||
else fmain +=
|
||||
@ -1133,6 +1147,12 @@ void enable_raycaster() {
|
||||
" position = m * position;\n"
|
||||
" tangent = m * tangent;\n";
|
||||
|
||||
if(stretch::mstretch) fmain +=
|
||||
" m = s_itranslate(m*vec4(0,0,0,1)) * m;"
|
||||
" fromOrig = m * fromOrig;\n"
|
||||
" m[0][1] = -m[0][1]; m[1][0] = -m[1][0];\n" // inverse
|
||||
" toOrig = toOrig * m;\n";
|
||||
|
||||
if(bi) {
|
||||
fmain +=
|
||||
"walloffset = int(connection.w * 256.);\n"
|
||||
@ -1329,6 +1349,11 @@ EX void cast() {
|
||||
glUniformMatrix4fv(o->uATOI, 1, 0, glhr::tmtogl_transpose3(stretch::m_atoi).as_array());
|
||||
}
|
||||
|
||||
if(o->uToOrig != -1) {
|
||||
glUniformMatrix4fv(o->uToOrig, 1, 0, glhr::tmtogl_transpose3(msm).as_array());
|
||||
glUniformMatrix4fv(o->uFromOrig, 1, 0, glhr::tmtogl_transpose3(inverse(msm)).as_array());
|
||||
}
|
||||
|
||||
if(o->uWallOffset != -1) {
|
||||
glUniform1i(o->uWallOffset, wall_offset(cs));
|
||||
glUniform1i(o->uSides, cs->type + (WDIM == 2 ? 2 : 0));
|
||||
|
Loading…
Reference in New Issue
Block a user