zoom_or_fov takes panini limits into account

This commit is contained in:
Zeno Rogue 2020-11-08 12:43:07 +01:00
parent d7351d169a
commit 56164ab172
5 changed files with 48 additions and 22 deletions

View File

@ -558,6 +558,12 @@ EX void initConfig() {
addsaver(anims::rug_angle, "animation rug angle"); addsaver(anims::rug_angle, "animation rug angle");
addsaver(anims::circle_radius, "animation circle radius"); addsaver(anims::circle_radius, "animation circle radius");
addsaver(anims::circle_spins, "animation circle spins"); 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 #endif
#if CAP_CRYSTAL #if CAP_CRYSTAL

View File

@ -306,9 +306,11 @@ transmatrix zforward_push(ld z) {
EX void zoom_or_fov(ld t) { EX void zoom_or_fov(ld t) {
if(in_perspective_v()) { if(in_perspective_v()) {
vid.fov *= 180 / max_fov_angle();
auto tanfov = tan(vid.fov * degree / 2); auto tanfov = tan(vid.fov * degree / 2);
tanfov *= t; tanfov *= t;
vid.fov = atan(tanfov) * 2 / degree; vid.fov = atan(tanfov) * 2 / degree;
vid.fov *= max_fov_angle() / 180;
} }
else else
vpconf.scale *= t; vpconf.scale *= t;

View File

@ -350,9 +350,9 @@ EX void mobile_draw(MOBPAR_FORMAL) {
} }
} }
#if CAP_RUG #if CAP_RUG && CAP_ANIMATIONS
if(andmode == 1 && normal_reaction && rug::rugged && clicked) if(andmode == 1 && normal_reaction && rug::rugged && clicked && rug::move_on_touch)
rug::finger_on(2, (ticks - lticks_rug) / 2500.); anims::animate_rug_movement(rug::move_on_touch * (ticks - lticks_rug) / 2500.);
#endif #endif
lticks_rug = ticks; lticks_rug = ticks;

18
rug.cpp
View File

@ -123,7 +123,6 @@ EX int renderlate = 0;
EX bool rendernogl = false; EX bool rendernogl = false;
EX int texturesize = 1024; EX int texturesize = 1024;
EX ld scale = 1; EX ld scale = 1;
EX ld ruggo = 0;
EX ld anticusp_factor = 1; EX ld anticusp_factor = 1;
EX ld anticusp_dist; EX ld anticusp_dist;
@ -1272,7 +1271,7 @@ EX void finger_on(int coord, ld val) {
transmatrix last_orientation; transmatrix last_orientation;
EX ld ruggospeed = 1; EX ld move_on_touch = 1;
EX void actDraw() { EX void actDraw() {
try { try {
@ -1291,8 +1290,6 @@ EX void actDraw() {
double alpha = (ticks - lastticks) / 1000.0; double alpha = (ticks - lastticks) / 1000.0;
lastticks = ticks; lastticks = ticks;
// if(ruggo) move_forward(ruggo * alpha);
#if CAP_HOLDKEYS #if CAP_HOLDKEYS
Uint8 *keystate = SDL_GetKeyState(NULL); Uint8 *keystate = SDL_GetKeyState(NULL);
if(keystate[SDLK_LALT]) alpha /= 10; if(keystate[SDLK_LALT]) alpha /= 10;
@ -1496,7 +1493,9 @@ EX void show() {
if(rug::rugged) if(rug::rugged)
dialog::lastItem().value += " (" + fts(err_zero_current) + ")"; 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::addSelItem(XLAT("anti-crossing"), fts(anticusp_factor), 'A');
dialog::addBoolItem(XLAT("3D monsters/walls on the surface"), spatial_rug, 'S'); dialog::addBoolItem(XLAT("3D monsters/walls on the surface"), spatial_rug, 'S');
dialog::add_action([] () { spatial_rug = !spatial_rug; }); dialog::add_action([] () { spatial_rug = !spatial_rug; });
@ -1539,9 +1538,8 @@ EX void show() {
else if(uni == 'o') else if(uni == 'o')
renderonce = !renderonce; renderonce = !renderonce;
else if(uni == 'G') { else if(uni == 'G') {
dialog::editNumber(ruggo, -1, 1, .1, 0, XLAT("automatic move speed"), dialog::editNumber(move_on_touch, -1, 1, .1, 0, XLAT("move on touch"), "");
XLAT("Move automatically without pressing any keys.") dialog::extra_options = anims::rug_angle_options;
);
} }
else if(uni == 'A') { else if(uni == 'A') {
dialog::editNumber(anticusp_factor, 0, 1.5, .1, 0, XLAT("anti-crossing"), dialog::editNumber(anticusp_factor, 0, 1.5, .1, 0, XLAT("anti-crossing"),
@ -1787,10 +1785,6 @@ int rugArgs() {
shift_arg_formula(lwidth); shift_arg_formula(lwidth);
} }
else if(argis("-rugauto")) {
shift_arg_formula(ruggo);
}
else if(argis("-rugorth")) { else if(argis("-rugorth")) {
rconf.model = mdEquidistant; rconf.model = mdEquidistant;
} }

View File

@ -1085,7 +1085,7 @@ EX ld skiprope_rotation;
int lastticks, bak_turncount; 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 bool env_shmup;
EX ld rug_angle; EX ld rug_angle;
@ -1180,6 +1180,13 @@ bool clearup;
EX purehookset hooks_anim; 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() { EX void apply() {
int t = ticks - lastticks; int t = ticks - lastticks;
lastticks = ticks; lastticks = ticks;
@ -1283,6 +1290,8 @@ EX void apply() {
if(rug_rotation2) { if(rug_rotation2) {
rug::rugView = rug::rugView * cspin(0, 1, rug_rotation2 * 2 * M_PI * t / period); 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 #endif
pconf.skiprope += skiprope_rotation * t * 2 * M_PI / period; pconf.skiprope += skiprope_rotation * t * 2 * M_PI / period;
@ -1451,6 +1460,19 @@ void list_animated_parameters() {
ld animation_period; 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() { EX void show() {
cmode = sm::SIDE; needs_highqual = false; cmode = sm::SIDE; needs_highqual = false;
animation_lcm = 1; animation_lcm = 1;
@ -1609,14 +1631,16 @@ EX void show() {
} }
else dialog::addBreak(100); else dialog::addBreak(100);
animator(XLAT("model-relative rotation"), rug_rotation2, 'r'); 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::add_action([] () {
dialog::editNumber(rug::ruggo, 0, 10, 1, 1, XLAT("automatic move speed"), XLAT("Move automatically without pressing any keys.")); dialog::editNumber(rug_forward, 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::extra_options = [] () { if(among(rug::gwhere, gSphere, gElliptic)) {
dialog::addItem(XLAT("synchronize"), 'S'); 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 #endif