From 56164ab172c2f5a816035e7ea58e61e90383d103 Mon Sep 17 00:00:00 2001 From: Zeno Rogue Date: Sun, 8 Nov 2020 12:43:07 +0100 Subject: [PATCH] zoom_or_fov takes panini limits into account --- config.cpp | 6 ++++++ control.cpp | 2 ++ mobile.cpp | 6 +++--- rug.cpp | 18 ++++++------------ screenshot.cpp | 38 +++++++++++++++++++++++++++++++------- 5 files changed, 48 insertions(+), 22 deletions(-) diff --git a/config.cpp b/config.cpp index 40275fa9..48fcff9f 100644 --- a/config.cpp +++ b/config.cpp @@ -558,6 +558,12 @@ EX void initConfig() { addsaver(anims::rug_angle, "animation rug angle"); addsaver(anims::circle_radius, "animation circle radius"); addsaver(anims::circle_spins, "animation circle spins"); + addsaver(anims::rug_movement_angle, "rug forward movement angle", 90); + addsaver(anims::rug_shift_angle, "rug forward shift angle", 0); + #endif + + #if CAP_RUG + addsaver(rug::move_on_touch, "rug move on touch"); #endif #if CAP_CRYSTAL diff --git a/control.cpp b/control.cpp index c8248a5c..c0079074 100644 --- a/control.cpp +++ b/control.cpp @@ -306,9 +306,11 @@ transmatrix zforward_push(ld z) { EX void zoom_or_fov(ld t) { if(in_perspective_v()) { + vid.fov *= 180 / max_fov_angle(); auto tanfov = tan(vid.fov * degree / 2); tanfov *= t; vid.fov = atan(tanfov) * 2 / degree; + vid.fov *= max_fov_angle() / 180; } else vpconf.scale *= t; diff --git a/mobile.cpp b/mobile.cpp index 558402a5..7c623dbc 100644 --- a/mobile.cpp +++ b/mobile.cpp @@ -350,9 +350,9 @@ EX void mobile_draw(MOBPAR_FORMAL) { } } -#if CAP_RUG - if(andmode == 1 && normal_reaction && rug::rugged && clicked) - rug::finger_on(2, (ticks - lticks_rug) / 2500.); +#if CAP_RUG && CAP_ANIMATIONS + if(andmode == 1 && normal_reaction && rug::rugged && clicked && rug::move_on_touch) + anims::animate_rug_movement(rug::move_on_touch * (ticks - lticks_rug) / 2500.); #endif lticks_rug = ticks; diff --git a/rug.cpp b/rug.cpp index 33b1ad6b..1f6135cf 100644 --- a/rug.cpp +++ b/rug.cpp @@ -123,7 +123,6 @@ EX int renderlate = 0; EX bool rendernogl = false; EX int texturesize = 1024; EX ld scale = 1; -EX ld ruggo = 0; EX ld anticusp_factor = 1; EX ld anticusp_dist; @@ -1272,7 +1271,7 @@ EX void finger_on(int coord, ld val) { transmatrix last_orientation; -EX ld ruggospeed = 1; +EX ld move_on_touch = 1; EX void actDraw() { try { @@ -1291,8 +1290,6 @@ EX void actDraw() { double alpha = (ticks - lastticks) / 1000.0; lastticks = ticks; - // if(ruggo) move_forward(ruggo * alpha); - #if CAP_HOLDKEYS Uint8 *keystate = SDL_GetKeyState(NULL); if(keystate[SDLK_LALT]) alpha /= 10; @@ -1496,7 +1493,9 @@ EX void show() { if(rug::rugged) dialog::lastItem().value += " (" + fts(err_zero_current) + ")"; } - dialog::addSelItem(XLAT("automatic move speed"), fts(ruggo), 'G'); + #if ISMOBILE + dialog::addSelItem(XLAT("move on touch"), fts(move_on_touch), 'G'); + #endif 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; }); @@ -1539,9 +1538,8 @@ EX void show() { else if(uni == 'o') renderonce = !renderonce; else if(uni == 'G') { - dialog::editNumber(ruggo, -1, 1, .1, 0, XLAT("automatic move speed"), - XLAT("Move automatically without pressing any keys.") - ); + dialog::editNumber(move_on_touch, -1, 1, .1, 0, XLAT("move on touch"), ""); + dialog::extra_options = anims::rug_angle_options; } else if(uni == 'A') { dialog::editNumber(anticusp_factor, 0, 1.5, .1, 0, XLAT("anti-crossing"), @@ -1787,10 +1785,6 @@ int rugArgs() { shift_arg_formula(lwidth); } - else if(argis("-rugauto")) { - shift_arg_formula(ruggo); - } - else if(argis("-rugorth")) { rconf.model = mdEquidistant; } diff --git a/screenshot.cpp b/screenshot.cpp index d6b4a331..cc2a3fce 100644 --- a/screenshot.cpp +++ b/screenshot.cpp @@ -1085,7 +1085,7 @@ EX ld skiprope_rotation; int lastticks, bak_turncount; -EX ld rug_rotation1, rug_rotation2, ballangle_rotation, env_ocean, env_volcano; +EX ld rug_rotation1, rug_rotation2, rug_forward, ballangle_rotation, env_ocean, env_volcano, rug_movement_angle, rug_shift_angle; EX bool env_shmup; EX ld rug_angle; @@ -1180,6 +1180,13 @@ bool clearup; EX purehookset hooks_anim; +EX void animate_rug_movement(ld t) { + rug::using_rugview urv; + shift_view( + cspin(0, GDIM-1, rug_movement_angle * degree) * spin(rug_shift_angle * degree) * xtangent(t) + ); + } + EX void apply() { int t = ticks - lastticks; lastticks = ticks; @@ -1283,6 +1290,8 @@ EX void apply() { if(rug_rotation2) { rug::rugView = rug::rugView * cspin(0, 1, rug_rotation2 * 2 * M_PI * t / period); } + if(rug_forward) + animate_rug_movement(rug_forward * t / period); } #endif pconf.skiprope += skiprope_rotation * t * 2 * M_PI / period; @@ -1451,6 +1460,19 @@ void list_animated_parameters() { ld animation_period; +EX void rug_angle_options() { + dialog::addSelItem(XLAT("shift"), fts(rug_shift_angle) + "°", 'C'); + dialog::add_action([] () { + popScreen(); + dialog::editNumber(rug_shift_angle, 0, 90, 15, 0, XLAT("shift"), ""); + }); + dialog::addSelItem(XLAT("movement angle"), fts(rug_movement_angle) + "°", 'M'); + dialog::add_action([] () { + popScreen(); + dialog::editNumber(rug_movement_angle, 0, 360, 15, 0, XLAT("movement angle"), ""); + }); + } + EX void show() { cmode = sm::SIDE; needs_highqual = false; animation_lcm = 1; @@ -1609,14 +1631,16 @@ EX void show() { } else dialog::addBreak(100); animator(XLAT("model-relative rotation"), rug_rotation2, 'r'); - animator(XLAT("automatic move speed"), rug::ruggo, 'M'); + animator(XLAT("automatic move speed"), rug_forward, 'M'); dialog::add_action([] () { - dialog::editNumber(rug::ruggo, 0, 10, 1, 1, XLAT("automatic move speed"), XLAT("Move automatically without pressing any keys.")); - if(among(rug::gwhere, gSphere, gElliptic)) - dialog::extra_options = [] () { + dialog::editNumber(rug_forward, 0, 10, 1, 1, XLAT("automatic move speed"), XLAT("Move automatically without pressing any keys.")); + dialog::extra_options = [] () { + if(among(rug::gwhere, gSphere, gElliptic)) { dialog::addItem(XLAT("synchronize"), 'S'); - dialog::add_action([] () { rug::ruggo = 2 * M_PI * 1000 / period; popScreen(); }); - }; + dialog::add_action([] () { rug_forward = 2 * M_PI; popScreen(); }); + } + rug_angle_options(); + }; }); } #endif