1
0
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:
Zeno Rogue 2020-08-23 00:10:59 +02:00
parent e87da576e4
commit b5924ccc5c
3 changed files with 116 additions and 43 deletions

View File

@ -1554,8 +1554,15 @@ EX void optimizeview() {
if(subscreens::split(optimizeview)) return; if(subscreens::split(optimizeview)) return;
if(dual::split(optimizeview)) return; if(dual::split(optimizeview)) return;
cell *c = centerover;
transmatrix iView = inverse(View); transmatrix iView = inverse(View);
virtualRebase(centerover, iView); 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); View = inverse(iView);
fixmatrix(View); fixmatrix(View);
@ -1594,6 +1601,7 @@ EX void resetview() {
DEBBI(DF_GRAPH, ("reset view")); DEBBI(DF_GRAPH, ("reset view"));
// EUCLIDEAN // EUCLIDEAN
NLP = Id; NLP = Id;
stretch::mstretch_matrix = Id;
auto lView = View; auto lView = View;
if(cwt.at) { if(cwt.at) {
centerover = cwt.at; centerover = cwt.at;

View File

@ -2192,6 +2192,7 @@ EX namespace rots {
dynamicval<cell*> m5(centerover, co); dynamicval<cell*> m5(centerover, co);
dynamicval<transmatrix> m2(View, inprod ? pView : ypush(0) * qtm(h)); dynamicval<transmatrix> m2(View, inprod ? pView : ypush(0) * qtm(h));
if(PURE) View = View * pispin; if(PURE) View = View * pispin;
View = inverse(stretch::mstretch_matrix) * spin(2*d) * View;
dynamicval<shiftmatrix> m3(playerV, shiftless(Id)); dynamicval<shiftmatrix> m3(playerV, shiftless(Id));
dynamicval<transmatrix> m4(actual_view_transform, Id); dynamicval<transmatrix> m4(actual_view_transform, Id);
dynamicval<shiftmatrix> m6(cwtV, shiftless(Id)); dynamicval<shiftmatrix> m6(cwtV, shiftless(Id));
@ -2289,6 +2290,8 @@ EX namespace stretch {
EX transmatrix m_itoa, m_atoi, m_pd; EX transmatrix m_itoa, m_atoi, m_pd;
EX ld ms_christoffel[3][3][3]; EX ld ms_christoffel[3][3][3];
EX transmatrix mstretch_matrix;
EX void enable_mstretch() { EX void enable_mstretch() {
mstretch = true; mstretch = true;
@ -2327,35 +2330,64 @@ EX namespace stretch {
ld den = (-4*A00*A11*A22 + A00*B12 + B01*A22 - A01*A02*A12 + B02*A11); 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 ][ 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 ][ 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;
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 ][ 0 ] = (A02*(4*A11*A22 - B12)/2 + A12*(2*A01*A22 - A02*A12)/2 - (A00 - A11)*(A01*A12 - 2*A02*A11))/den ; c[ 0 ][ 1 ][ 1 ] = -(A01*(A01*A12 - 2*A02*A11) + A12*(4*A11*A22 - 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 ][ 1 ][ 2 ] = (B01*A22 - B02*A11 + 4*B11*A22 - A11*B12 - 4*A11*B22 + B12*A22)/(4*A00*A11*A22 - A00*B12 - B01*A22 + A01*A02*A12 - B02*A11) ; 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 ][ 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 ][ 1 ] = (B01*A22 - B02*A11 + 4*B11*A22 - A11*B12 - 4*A11*B22 + B12*A22)/(4*A00*A11*A22 - A00*B12 - B01*A22 + A01*A02*A12 - B02*A11) ; c[ 0 ][ 2 ][ 2 ] = -(A02*(2*A01*A22 - A02*A12) + A12*(4*A11*A22 - B12))/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 ][ 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 ][ 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 ][ 0 ][ 2 ] = (-4*B00*A22 + A00*B02 + A00*B12 + 4*A00*B22 - B01*A22 - B02*A22)/(4*A00*A11*A22 - A00*B12 - B01*A22 + A01*A02*A12 - B02*A11) ; 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 ][ 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 ][ 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 ][ 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 ][ 0 ] = (-4*B00*A22 + A00*B02 + A00*B12 + 4*A00*B22 - B01*A22 - B02*A22)/(4*A00*A11*A22 - A00*B12 - B01*A22 + A01*A02*A12 - B02*A11) ; 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 ][ 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[ 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 ][ 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 ][ 1 ] = (4*B00*A11 - A00*B01 - 4*A00*B11 - A00*B12 + B01*A11 + B02*A11)/(4*A00*A11*A22 - A00*B12 - B01*A22 + A01*A02*A12 - B02*A11) ; 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 ][ 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 ][ 0 ] = (4*B00*A11 - A00*B01 - 4*A00*B11 - A00*B12 + B01*A11 + B02*A11)/(4*A00*A11*A22 - A00*B12 - B01*A22 + A01*A02*A12 - B02*A11) ; c[ 2 ][ 1 ][ 1 ] = -(A01*(4*A00*A11 - B01) + A12*(A01*A12 - 2*A02*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 ][ 1 ][ 2 ] = (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 ][ 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 ][ 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 ][ 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;
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 ;
c[ 0 ][ 1 ][ 0 ] = (A02*(4*A11*A22 - B12)/2 + A12*(2*A01*A22 - A02*A12)/2 - (A00 - A11)*(A01*A12 - 2*A02*A11))/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)/(4*A00*A11*A22 - A00*B12 - B01*A22 + A01*A02*A12 - B02*A11) ;
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)/(4*A00*A11*A22 - A00*B12 - B01*A22 + A01*A02*A12 - B02*A11) ;
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)/(4*A00*A11*A22 - A00*B12 - B01*A22 + A01*A02*A12 - B02*A11) ;
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)/(4*A00*A11*A22 - A00*B12 - B01*A22 + A01*A02*A12 - B02*A11) ;
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)/(4*A00*A11*A22 - A00*B12 - B01*A22 + A01*A02*A12 - B02*A11) ;
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)/(4*A00*A11*A22 - A00*B12 - B01*A22 + A01*A02*A12 - B02*A11) ;
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)/(4*A00*A11*A22 - A00*B12 - B01*A22 + A01*A02*A12 - B02*A11) ;
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 i=0; i<3; i++)
for(int j=0; j<3; j++) for(int j=0; j<3; j++)
@ -2642,13 +2674,16 @@ EX namespace nisot {
h[3] = 0; h[3] = 0;
if(stretch::in() && stretch::mstretch)
Pos = stretch::mstretch_matrix * Pos;
auto tPos = transpose(Pos); auto tPos = transpose(Pos);
h = Pos * h; h = Pos * h;
int steps = rk_steps; int steps = rk_steps;
h /= steps; h /= steps;
auto& at = tPos[3]; auto& at = tPos[3];
auto& vel = h; auto& vel = h;
@ -2715,8 +2750,13 @@ EX namespace nisot {
vel = stretch::actual_to_isometric(at, vel); vel = stretch::actual_to_isometric(at, vel);
for(int i=0; i<3; i++) tPos[i] = stretch::actual_to_isometric(at, tPos[i]); for(int i=0; i<3; i++) tPos[i] = stretch::actual_to_isometric(at, tPos[i]);
} }
Pos = transpose(tPos);
return transpose(tPos); if(stretch::in() && stretch::mstretch)
Pos = inverse(stretch::mstretch_matrix) * Pos;
return Pos;
} }
EX void fixmatrix(transmatrix& T) { EX void fixmatrix(transmatrix& T) {

View File

@ -109,6 +109,7 @@ struct raycaster : glhr::GLprogram {
GLint uPosX, uPosY; GLint uPosX, uPosY;
GLint uWallOffset, uSides; GLint uWallOffset, uSides;
GLint uITOA, uATOI; GLint uITOA, uATOI;
GLint uToOrig, uFromOrig;
raycaster(string vsh, string fsh); raycaster(string vsh, string fsh);
}; };
@ -155,6 +156,8 @@ raycaster::raycaster(string vsh, string fsh) : GLprogram(vsh, fsh) {
uITOA = glGetUniformLocation(_program, "uITOA"); uITOA = glGetUniformLocation(_program, "uITOA");
uATOI = glGetUniformLocation(_program, "uATOI"); uATOI = glGetUniformLocation(_program, "uATOI");
uToOrig = glGetUniformLocation(_program, "uToOrig");
uFromOrig = glGetUniformLocation(_program, "uFromOrig");
} }
shared_ptr<raycaster> our_raycaster; shared_ptr<raycaster> our_raycaster;
@ -391,20 +394,31 @@ void enable_raycaster() {
" mediump vec4 tangent = vw * at0;\n"; " mediump vec4 tangent = vw * at0;\n";
if(stretch::in()) { if(stretch::in()) {
fmain +=
"tangent = s_itranslate(position) * tangent;\n";
if(stretch::mstretch) { if(stretch::mstretch) {
fsh += "mediump uniform mat4 uITOA;\n"; fsh += "mediump uniform mat4 uITOA;\n";
fsh += "mediump uniform mat4 uATOI;\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 += fmain +=
"tangent = uITOA * tangent;\n"; "tangent = uITOA * tangent;\n";
fmain +=
"tangent = fromOrig * s_translate(toOrig * position) * tangent;\n";
} }
else else {
fmain +=
"tangent = s_itranslate(position) * tangent;\n";
fmain += fmain +=
"tangent[2] /= " + to_glsl(stretch::not_squared()) + ";\n"; "tangent[2] /= " + to_glsl(stretch::not_squared()) + ";\n";
fmain += fmain +=
"tangent = s_translate(position) * tangent;\n"; "tangent = s_translate(position) * tangent;\n";
; }
} }
if(bi) fmain += " walloffset = uWallOffset; sides = uSides;\n"; if(bi) fmain += " walloffset = uWallOffset; sides = uSides;\n";
@ -605,9 +619,9 @@ void enable_raycaster() {
"}\n"; "}\n";
if(stretch::mstretch) { if(stretch::mstretch) {
fsh += "mediump vec4 christoffel(mediump vec4 pos, mediump vec4 vel, mediump vec4 tra) {\n" fsh += "mediump vec4 christoffel(mediump vec4 pos, mediump vec4 vel, mediump vec4 tra) {\n"
"vel = s_itranslate(pos) * vel;\n" "vel = s_itranslate(toOrig * pos) * toOrig * vel;\n"
"tra = s_itranslate(pos) * tra;\n" "tra = s_itranslate(toOrig * pos) * toOrig * tra;\n"
"return s_translate(pos) * vec4(\n"; "return fromOrig * s_translate(toOrig * pos) * vec4(\n";
for(int i=0; i<3; i++) { for(int i=0; i<3; i++) {
auto &c = stretch::ms_christoffel; auto &c = stretch::ms_christoffel;
@ -926,7 +940,7 @@ void enable_raycaster() {
if((stretch::in() || sl2) && use_christoffel) { if((stretch::in() || sl2) && use_christoffel) {
fmain += fmain +=
"tangent = s_itranslate(position) * tangent;\n" "tangent = s_itranslate(toOrig * position) * toOrig * tangent;\n"
"tangent[3] = 0.;\n"; "tangent[3] = 0.;\n";
if(stretch::mstretch) if(stretch::mstretch)
fmain += fmain +=
@ -937,7 +951,7 @@ void enable_raycaster() {
+ to_glsl(stretch::squared()) + " * tangent.z * tangent.z;\n"; + to_glsl(stretch::squared()) + " * tangent.z * tangent.z;\n";
fmain += fmain +=
"tangent /= sqrt(nvelsquared);\n" "tangent /= sqrt(nvelsquared);\n"
"tangent = s_translate(position) * tangent;\n"; "tangent = fromOrig * s_translate(toOrig * position) * tangent;\n";
} }
} }
else fmain += else fmain +=
@ -1131,7 +1145,13 @@ void enable_raycaster() {
" int mid = int(connection.z * 1024.);\n" " int mid = int(connection.z * 1024.);\n"
" mediump mat4 m = " GET("uM", "mid") " * " GET("uM", "walloffset+which") ";\n" " mediump mat4 m = " GET("uM", "mid") " * " GET("uM", "walloffset+which") ";\n"
" position = m * position;\n" " position = m * position;\n"
" tangent = m * tangent;\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) { if(bi) {
fmain += fmain +=
@ -1328,6 +1348,11 @@ EX void cast() {
glUniformMatrix4fv(o->uITOA, 1, 0, glhr::tmtogl_transpose3(stretch::m_itoa).as_array()); glUniformMatrix4fv(o->uITOA, 1, 0, glhr::tmtogl_transpose3(stretch::m_itoa).as_array());
glUniformMatrix4fv(o->uATOI, 1, 0, glhr::tmtogl_transpose3(stretch::m_atoi).as_array()); 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) { if(o->uWallOffset != -1) {
glUniform1i(o->uWallOffset, wall_offset(cs)); glUniform1i(o->uWallOffset, wall_offset(cs));