diff --git a/geometry.cpp b/geometry.cpp index 23eae267..5db944f0 100644 --- a/geometry.cpp +++ b/geometry.cpp @@ -206,6 +206,12 @@ struct geometry_information { /* convert the tangent space in actual coordinates to logical coordinates */ transmatrix actual_to_logical; + /* convert the tangent space in logical coordinates to actual coordinates */ + transmatrix logical_to_actual_units; + + /* convert the tangent space in actual coordinates to logical coordinates */ + transmatrix actual_to_logical_units; + /** size of the Sword (from Orb of the Sword), used in the shmup mode */ ld sword_size; /** scale factor for the graphics of most things*/ @@ -591,15 +597,18 @@ void geometry_information::prepare_lta() { if(b) geom3::light_flip(false); lta = Id; if(embedded_plane) { - if(geom3::euc_in_noniso()) { - lta[0][0] *= geom3::euclid_embed_scale; - lta[1][1] *= geom3::euclid_embed_scale * geom3::euclid_embed_scale_y; - lta = cspin(0, 1, geom3::euclid_embed_rotate * degree) * lta; - } if(geom3::euc_vertical()) lta = cspin90(2, 1) * lta; if(geom3::hyp_in_solnih()) lta = cspin90(0, 1) * cspin90(1, 2) * cspin90(0, 1) * lta; } + logical_to_actual_units = lta; + if(geom3::euc_in_noniso()) { + lta = Id; + lta[0][0] *= geom3::euclid_embed_scale; + lta[1][1] *= geom3::euclid_embed_scale * geom3::euclid_embed_scale_y; + lta = cspin(0, 1, geom3::euclid_embed_rotate * degree) * lta * logical_to_actual_units; + } actual_to_logical = inverse(lta); + actual_to_logical_units = inverse(logical_to_actual_units); if(b) geom3::light_flip(true); } @@ -1142,8 +1151,8 @@ EX namespace geom3 { EX ld euclid_embed_scale_mean() { return euclid_embed_scale * sqrt(euclid_embed_scale_y); } EX void set_euclid_embed_scale(ld x) { euclid_embed_scale = x; euclid_embed_scale_y = 1; euclid_embed_rotate = 0; } - EX bool supports_flat() { return spatial_embedding == seDefault; } - EX bool supports_invert() { return among(spatial_embedding, seDefault, seLowerCurvature, seMuchLowerCurvature, seNil, seSol, seNIH, seSolN); } + EX bool supports_flat() { return among(spatial_embedding, seDefault, seProductH, seProductS); } + EX bool supports_invert() { return among(spatial_embedding, seDefault, seLowerCurvature, seMuchLowerCurvature, seNil, seSol, seNIH, seSolN, seProductH, seProductS); } EX vector ginf_backup; @@ -1382,7 +1391,7 @@ EX void switch_always3() { vid.depth = 0.5; } } - if(spatial_embedding == seDefault && flat_embedding) { + if(supports_flat() && flat_embedding) { vid.eye += vid.depth / 2; vid.depth = 0; } diff --git a/graph.cpp b/graph.cpp index ddd39579..52e6c3f5 100644 --- a/graph.cpp +++ b/graph.cpp @@ -5101,13 +5101,13 @@ EX void make_actual_view() { transmatrix T = actual_view_transform * View; ld z = -tC0(view_inverse(T)) [2]; transmatrix R = actual_view_transform; - R = cgi.logical_to_actual * R; + R = cgi.logical_to_actual_units * R; if(R[1][2] || R[2][2]) R = cspin(1, 2, -atan2(R[1][2], R[2][2])) * R; if(R[0][2] || R[2][2]) R = cspin(0, 2, -atan2(R[0][2], R[2][2])) * R; if(geom3::hyp_in_solnih()) R = Id; - R = cgi.actual_to_logical * R; + R = cgi.actual_to_logical_units * R; current_display->radar_transform = inverse(R) * zpush(-z); } else if(gproduct) { diff --git a/hyperpoint.cpp b/hyperpoint.cpp index 248fceac..796b5262 100644 --- a/hyperpoint.cpp +++ b/hyperpoint.cpp @@ -675,7 +675,7 @@ EX transmatrix spin(ld alpha) { } EX transmatrix unswap_spin(transmatrix T) { - return cgi.actual_to_logical * T * cgi.logical_to_actual; + return cgi.actual_to_logical_units * T * cgi.logical_to_actual_units; } /** rotate by 90 degrees in the XY plane */ diff --git a/hypgraph.cpp b/hypgraph.cpp index b2421276..b13a365f 100644 --- a/hypgraph.cpp +++ b/hypgraph.cpp @@ -2036,11 +2036,11 @@ EX void adjust_eye(transmatrix& T, cell *c, ld sign) { /** achieve top-down perspective */ EX transmatrix default_spin() { - return cspin90(0, 1) * cgi.actual_to_logical; + return cspin90(0, 1) * cgi.actual_to_logical_units; } EX void centerpc(ld aspd) { - + if(subscreens::split([=] () {centerpc(aspd);})) return; if(dual::split([=] () { centerpc(aspd); })) return; @@ -2207,12 +2207,6 @@ void ballgeometry() { queuereset(pmodel, PPR::CIRCLE); } -EX transmatrix logical_to_actual_units() { - transmatrix T = cgi.logical_to_actual; - for(int i=0; i<3; i++) set_column(T, i, get_column(T, i) / hypot_d(3, get_column(T, i))); - return T; - } - EX void resetview() { DEBBI(DF_GRAPH, ("reset view")); // EUCLIDEAN @@ -2245,7 +2239,7 @@ EX void resetview() { if(WDIM == 2) vo = spin(M_PI + vid.fixed_facing_dir * degree) * vo; if(WDIM == 3) vo = cspin90(0, 2) * vo; - vo = inverse(logical_to_actual_units()) * vo; + vo = cgi.actual_to_logical_units * vo; if(embedded_plane) vo = cspin90(1, 2) * vo; if(embedded_plane && vid.wall_height < 0) vo = cspin180(0, 1) * vo;