From e0ec3326026eef16dd7f8bd92081dd6ec382467b Mon Sep 17 00:00:00 2001 From: Zeno Rogue Date: Wed, 27 Dec 2017 18:53:00 +0100 Subject: [PATCH] implemented FOV measure, unified old rug::scale with modeldistance --- config.cpp | 6 +++--- hyper.h | 2 +- rug.cpp | 61 ++++++++++++++++++++++++++++++++++-------------------- 3 files changed, 43 insertions(+), 26 deletions(-) diff --git a/config.cpp b/config.cpp index bb427866..095bf945 100644 --- a/config.cpp +++ b/config.cpp @@ -272,7 +272,7 @@ void initConfig() { addsaver(rug::renderonce, "rug-renderonce"); addsaver(rug::rendernogl, "rug-rendernogl"); addsaver(rug::texturesize, "rug-texturesize"); - addsaver(rug::scale, "rug-scale"); + addsaver(rug::model_distance, "rug-model-distance"); addsaverenum(pmodel, "used model"); addsaver(polygonal::SI, "polygon sides"); @@ -456,10 +456,10 @@ void loadOldConfig(FILE *f) { aa = rug::renderonce; bb = rug::rendernogl; cc = nontruncated; dd = chaosmode; int ee = vid.steamscore; - double rs = rug::scale; + double rs = 1/rug::model_distance; err=fscanf(f, "%d%d%d%d%lf%d%d", &aa, &bb, &rug::texturesize, &cc, &rs, &ee, &dd); rug::renderonce = aa; rug::rendernogl = bb; nontruncated = cc; chaosmode = dd; vid.steamscore = ee; - rug::scale = rs; + rug::model_distance = 1/rs; aa=conformal::autobandhistory; double ps = polygonal::STAR, lv = conformal::lvspeed; diff --git a/hyper.h b/hyper.h index e86821e1..927a8ddf 100644 --- a/hyper.h +++ b/hyper.h @@ -732,7 +732,7 @@ namespace rug { extern bool renderonce; extern bool rendernogl; extern int texturesize; - extern ld scale; + extern ld model_distance; #if CAP_RUG void show(); void init(); diff --git a/rug.cpp b/rug.cpp index 7ef0924c..45f03ca7 100644 --- a/rug.cpp +++ b/rug.cpp @@ -38,8 +38,9 @@ bool keep_shape = true; bool good_shape; ld modelscale = 1; +ld model_distance = 2; -ld fov = 45; +ld fov = 90; eGeometry gwhere = gEuclid; @@ -260,6 +261,7 @@ rugpoint *addRugpoint(hyperpoint h, double dist) { // point on an equdistant going through C0 in distance d along the guiding line // hpoint = hpxy(cosh(r) * sinh(r) * (cosh(d) - 1), sinh(d) * cosh(r)); hpoint = xpush(r) * ypush(d) * xpush(-r) * C0; + hpoint[0] = -hpoint[0]; } ld hpdist = hdist0(hpoint); @@ -961,17 +963,19 @@ void drawRugScene() { glEnable(GL_DEPTH_TEST); glDepthFunc(GL_LESS); + ld tanfov = tan(fov * M_PI / 360); + if(rug_perspective) { ld vnear = .001; ld vfar = 1000; - ld sca = vnear / 2 / vid.xres; - xview = -.5; - yview = -.5 * vid.yres / vid.xres; + ld sca = vnear * tanfov / vid.xres; + xview = -tanfov; + yview = -tanfov * vid.yres / vid.xres; glFrustum(-sca * vid.xres, sca * vid.xres, -sca * vid.yres, sca * vid.yres, vnear, vfar); } else { - xview = vid.xres/(vid.scrsize*scale); - yview = vid.yres/(vid.scrsize*scale); + xview = tanfov * model_distance; + yview = tanfov * model_distance * vid.yres / vid.xres; glOrtho(-xview, xview, -yview, yview, -1000, 1000); } @@ -1064,7 +1068,7 @@ void init() { buildRug(); while(good_shape && subdivide_further()) subdivide(); if(rug_perspective) - push_all_points(2, -1); + push_all_points(2, -model_distance); currentrot = Id; } @@ -1081,6 +1085,8 @@ void close() { int lastticks; +ld protractor = 0; + void actDraw() { if(!renderonce) prepareTexture(); physics(); @@ -1093,14 +1099,14 @@ void actDraw() { transmatrix t = Id; if(rug_perspective) { - if(keystate[SDLK_HOME]) qm++, t = t * rotmatrix(alpha, 0, 1); - if(keystate[SDLK_END]) qm++, t = t * rotmatrix(alpha, 1, 0); + if(keystate[SDLK_HOME]) qm++, t = t * rotmatrix(alpha, 0, 1), protractor += alpha; + if(keystate[SDLK_END]) qm++, t = t * rotmatrix(alpha, 1, 0), protractor -= alpha; if(!keystate[SDLK_LSHIFT]) { - if(keystate[SDLK_DOWN]) qm++, t = t * rotmatrix(alpha, 2, 1); - if(keystate[SDLK_UP]) qm++, t = t * rotmatrix(alpha, 1, 2); - if(keystate[SDLK_LEFT]) qm++, t = t * rotmatrix(alpha, 2, 0); - if(keystate[SDLK_RIGHT]) qm++, t = t * rotmatrix(alpha, 0, 2); + if(keystate[SDLK_DOWN]) qm++, t = t * rotmatrix(alpha, 2, 1), protractor += alpha; + if(keystate[SDLK_UP]) qm++, t = t * rotmatrix(alpha, 1, 2), protractor -= alpha; + if(keystate[SDLK_LEFT]) qm++, t = t * rotmatrix(alpha, 2, 0), protractor += alpha; + if(keystate[SDLK_RIGHT]) qm++, t = t * rotmatrix(alpha, 0, 2), protractor -= alpha; } ld push = 0; if(keystate[SDLK_PAGEDOWN]) push -= alpha; @@ -1118,6 +1124,7 @@ void actDraw() { points[i]->flat = t * points[i]->flat; } + model_distance -= push; push_all_points(2, push); push_all_points(0, strafex); push_all_points(1, strafey); @@ -1129,8 +1136,8 @@ void actDraw() { if(keystate[SDLK_UP]) qm++, t = t * rotmatrix(alpha, 2, 1); if(keystate[SDLK_LEFT]) qm++, t = t * rotmatrix(alpha, 0, 2); if(keystate[SDLK_RIGHT]) qm++, t = t * rotmatrix(alpha, 2, 0); - if(keystate[SDLK_PAGEUP]) scale *= exp(alpha); - if(keystate[SDLK_PAGEDOWN]) scale /= exp(alpha); + if(keystate[SDLK_PAGEUP]) model_distance /= exp(alpha); + if(keystate[SDLK_PAGEDOWN]) model_distance *= exp(alpha); if(qm) { currentrot = t * currentrot; @@ -1235,11 +1242,12 @@ void show() { if(rug::rugged) dialog::lastItem().value += " (" + its(qvalid) + ")"; + dialog::addSelItem(XLAT("model distance"), fts(model_distance), 'd'); dialog::addBoolItem(XLAT("projection"), rug_perspective, 'p'); - dialog::lastItem().value = XLAT(rug_perspective ? "perspective" : "orthogonal"); - if(!rug_perspective && !rug::rugged) gwhere = gNormal; + dialog::lastItem().value = XLAT(rug_perspective ? "perspective" : + gwhere == gEuclid ? "orthogonal" : "azimuthal equidistant"); if(!rug::rugged) - dialog::addSelItem(XLAT("native geometry"), ginf[gwhere].name, 'n'); + dialog::addSelItem(XLAT("native geometry"), XLAT(gwhere ? ginf[gwhere].name : "hyperbolic"), 'n'); else dialog::addSelItem(XLAT("radar"), radar_distance == RADAR_INF ? "∞" : fts4(radar_distance), 'r'); if(!rug::rugged) @@ -1247,6 +1255,7 @@ void show() { else dialog::addSelItem(XLAT("model iterations"), its(queueiter), 0); dialog::addSelItem(XLAT("field of view"), fts(fov) + "°", 'f'); + // dialog::addSelItem(XLAT("protractor"), fts(protractor * 180 / M_PI) + "°", 'f'); if(rug::rugged && torus) dialog::addBoolItem(XLAT("keep shape"), keep_shape, 'k'); if(!(keep_shape && good_shape)) { @@ -1291,8 +1300,17 @@ void show() { ); dialog::scaleLog(); } - else if(uni == 'p') + else if(uni == 'p') { rug_perspective = !rug_perspective; + if(rugged) { + if(rug_perspective) + push_all_points(2, -model_distance); + else + push_all_points(2, +model_distance); + } + } + else if(uni == 'd') + dialog::editNumber(model_distance, -10, 10, .1, 1, "model distance", "model distance"); else if(uni == 'e') { dialog::editNumber(err_zero, 1e-9, 1, .1, 1e-3, "error", "error"); dialog::scaleLog(); @@ -1305,9 +1323,8 @@ void show() { "Horizontal field of view." ); } - else if(uni == 'n' && !rug::rugged) { - gwhere = eGeometry((gwhere+1) % 3); - } + else if(uni == 'n' && !rug::rugged) + gwhere = eGeometry((gwhere+1) % 4); #if !ISPANDORA else if(uni == 'g' && !rug::rugged) rendernogl = !rendernogl;