From d8bf550d37c44d54645afd3982deb76ef0e9bd39 Mon Sep 17 00:00:00 2001 From: Zeno Rogue Date: Wed, 5 Dec 2018 19:57:35 +0100 Subject: [PATCH] surface 3D graphics are now automatically disabled in rug (won't work correctly with quotient rugs anyway) and in pmodels which do not support it --- config.cpp | 12 ++++++++++-- graph.cpp | 8 ++++++++ hyper.h | 3 +++ hypgraph.cpp | 10 +++++++++- rug.cpp | 3 +++ tour.cpp | 13 ++----------- 6 files changed, 35 insertions(+), 14 deletions(-) diff --git a/config.cpp b/config.cpp index 638f0bdc..60351326 100644 --- a/config.cpp +++ b/config.cpp @@ -1294,10 +1294,18 @@ void show3D() { dialog::addSelItem(XLAT("model used"), conformal::get_model_name(pmodel), 'M'); dialog::addBreak(50); - if(!(wmspatial || mmspatial)) + if(rug::rugged) { + dialog::addBoolItem(XLAT("3D monsters/walls on the surface"), rug::spatial_rug, 'S'); + dialog::add_action([] () { rug::spatial_rug = !rug::spatial_rug; }); + } + if(rug::rugged && !rug::spatial_rug) + dialog::addBreak(100); + else if(non_spatial_model()) + dialog::addInfo(XLAT("no 3D effects available in this projection"), 0xC00000); + else if(!spatial_graphics) dialog::addInfo(XLAT("set 3D monsters or walls in basic config first")); else if(invalid != "") - dialog::addInfo(XLAT("error: "+invalid)); + dialog::addInfo(XLAT("error: "+invalid), 0xC00000); else dialog::addInfo(XLAT("parameters set correctly")); dialog::addBreak(50); diff --git a/graph.cpp b/graph.cpp index 8365b5b4..50b9db61 100644 --- a/graph.cpp +++ b/graph.cpp @@ -8,6 +8,7 @@ namespace hr { int inmirrorcount = 0; +bool spatial_graphics; bool wmspatial, wmescher, wmplain, wmblack, wmascii; bool mmspatial, mmhigh, mmmon, mmitem; @@ -5301,6 +5302,13 @@ void drawthemap() { mmmon = vid.monmode >= 2; mmhigh = vid.monmode == 3 || vid.monmode == 5; mmspatial = vid.monmode == 4 || vid.monmode == 5; + + spatial_graphics = wmspatial || mmspatial; + if(rug::rugged && !rug::spatial_rug) spatial_graphics = false; + if(non_spatial_model()) + spatial_graphics = false; + + if(!spatial_graphics) wmspatial = mmspatial = false; DEBB(DF_GRAPH, (debugfile,"draw the map\n")); diff --git a/hyper.h b/hyper.h index a38155c6..a32c5fa4 100644 --- a/hyper.h +++ b/hyper.h @@ -949,6 +949,7 @@ void applymodel(hyperpoint H, hyperpoint& Hscr); void drawCircle(int x, int y, int size, color_t color, color_t fillcolor = 0); void fixcolor(int& col); ld displayspin(cell *c, int d); +bool non_spatial_model(); hyperpoint gethyper(ld x, ld y); void resetview(); void drawthemap(); @@ -1208,6 +1209,7 @@ struct renderbuffer; namespace rug { extern bool rugged; + extern bool spatial_rug; extern bool computed; extern bool renderonce; extern bool rendernogl; @@ -2019,6 +2021,7 @@ bool playerInBoat(int i); extern int lowfar; extern bool wmspatial, wmescher, wmplain, wmblack, wmascii; extern bool mmspatial, mmhigh, mmmon, mmitem; +extern bool spatial_graphics; extern int maxreclevel, reclevel; string explain3D(ld *param); diff --git a/hypgraph.cpp b/hypgraph.cpp index fa7a2914..4e927c7a 100644 --- a/hypgraph.cpp +++ b/hypgraph.cpp @@ -24,6 +24,14 @@ hyperpoint perspective_to_space(hyperpoint h, ld alpha = vid.alpha, eGeometryCla hyperpoint dhp(ld x, ld y, ld z) { return hpxyz(x, y, z); } +bool non_spatial_model() { + if(among(pmodel, mdRotatedHyperboles, mdJoukowsky, mdJoukowskyInverted, mdPolygonal, mdPolynomial)) + return true; + if(pmodel == mdSpiral && euclid) + return true; + return vid.consider_shader_projection && shaderside_projection && pmodel; + } + hyperpoint perspective_to_space(hyperpoint h, ld alpha, eGeometryClass gc) { ld hx = h[0], hy = h[1]; @@ -136,7 +144,7 @@ bool twopoint_do_flips; ld find_zlev(hyperpoint& H) { - if(wmspatial || mmspatial) { + if(spatial_graphics) { ld zlev = zlevel(H); using namespace hyperpoint_vec; if(zlev > 1-1e-6 && zlev < 1+1e-6) return 1; diff --git a/rug.cpp b/rug.cpp index 428c5727..05f6216c 100644 --- a/rug.cpp +++ b/rug.cpp @@ -28,6 +28,7 @@ struct rug_exception { }; bool fast_euclidean = true; bool good_shape; bool subdivide_first = false; +bool spatial_rug = false; bool subdivide_further(); void subdivide(); @@ -1791,6 +1792,8 @@ void show() { } dialog::addSelItem(XLAT("automatic move speed"), fts(ruggo), 'G'); dialog::addSelItem(XLAT("anti-crossing"), fts(anticusp_factor), 'A'); + dialog::addBoolItem(XLAT("3D monsters/walls on the surface"), spatial_rug, 'S'); + dialog::add_action([] () { spatial_rug = !spatial_rug; }); #if CAP_SURFACE if(hyperbolic) { diff --git a/tour.cpp b/tour.cpp index b3ddc84c..9df257d5 100644 --- a/tour.cpp +++ b/tour.cpp @@ -412,19 +412,10 @@ slide default_slides[] = { #endif [] (presmode mode) { #if CAP_RUG - static int wm, mm; - if(mode == 1) { + if(mode == 1) rug::init(); - wm = vid.wallmode; - mm = vid.monmode; - vid.wallmode = 3; - vid.monmode = 2; - } - if(mode == 3) { + if(mode == 3) rug::close(); - vid.wallmode = wm; - vid.monmode = mm; - } slidecommand = "switch renderer"; if(mode == 4) { rug::close();