From 0f4146ac3626c69e0ceb7a68c28af531bf8df4cd Mon Sep 17 00:00:00 2001 From: Zeno Rogue Date: Thu, 21 Mar 2019 03:23:06 +0100 Subject: [PATCH] 3D:: animations; also changed PI/180 to degree, and enabled models in the menu --- menus.cpp | 2 -- screenshot.cpp | 40 ++++++++++++++++++++++++++++++++++------ 2 files changed, 34 insertions(+), 8 deletions(-) diff --git a/menus.cpp b/menus.cpp index 7324af26..b20ac33d 100644 --- a/menus.cpp +++ b/menus.cpp @@ -380,10 +380,8 @@ void showDisplayMode() { dialog::addBoolItem(XLAT("paper model creator"), (false), 'n'); #endif - if(DIM == 2) dialog::addBoolItem(XLAT("models and projections"), pmodel, 'a'); - if(DIM == 2) dialog::addBoolItem(XLAT("animations/history"), anims::any_on(), 'A'); // dialog::addBoolItem(XLAT("expansion"), viewdists, 'x'); diff --git a/screenshot.cpp b/screenshot.cpp index 2c0c9c9d..bfebab2c 100644 --- a/screenshot.cpp +++ b/screenshot.cpp @@ -479,6 +479,7 @@ enum eMovementAnimation { eMovementAnimation ma; ld shift_angle, movement_angle; +ld normal_angle = 90; ld period = 10000; int noframes = 30; ld cycle_length = 2 * M_PI; @@ -595,19 +596,31 @@ void apply() { fullcenter(); View = spin(rand() % 1000) * View; } } - View = spin(movement_angle * M_PI / 180) * ypush(shift_angle * M_PI / 180) * xpush(cycle_length * t / period) * ypush(-shift_angle * M_PI / 180) * - spin(-movement_angle * M_PI / 180) * View; + View = cspin(0, DIM-1, movement_angle * degree) * ypush(shift_angle * degree) * xpush(cycle_length * t / period) * ypush(-shift_angle * degree) * + cspin(0, DIM-1, -movement_angle * degree) * View; moved(); } break; case maRotation: + if(DIM == 3) { + View = spin(-movement_angle * degree) * View; + View = cspin(1, 2, normal_angle * degree) * View; + } View = spin(2 * M_PI * t / period) * View; + if(DIM == 3) { + View = cspin(2, 1, normal_angle * degree) * View; + View = spin(movement_angle * degree) * View; + } break; #if CAP_BT case maParabolic: reflect_view(); - View = spin(movement_angle * M_PI / 180) * ypush(shift_angle * M_PI / 180) * binary::parabolic(parabolic_length * t / period) * ypush(-shift_angle * M_PI / 180) * - spin(-movement_angle * M_PI / 180) * View; + View = ypush(-shift_angle * degree) * spin(-movement_angle * degree) * View; + if(DIM == 2) + View = binary::parabolic(parabolic_length * t / period) * View; + else + View = binary::parabolic3(parabolic_length * t / period, 0) * View; + View = spin(movement_angle * degree) * ypush(shift_angle * degree) * View; moved(); break; #endif @@ -636,9 +649,9 @@ void apply() { #if CAP_RUG if(rug::rugged) { if(rug_rotation1) { - rug::apply_rotation(rotmatrix(rug_angle * M_PI / 180, 1, 2)); + rug::apply_rotation(rotmatrix(rug_angle * degree, 1, 2)); rug::apply_rotation(rotmatrix(rug_rotation1 * 2 * M_PI * t / period, 0, 2)); - rug::apply_rotation(rotmatrix(-rug_angle * M_PI / 180, 1, 2)); + rug::apply_rotation(rotmatrix(-rug_angle * degree, 1, 2)); } if(rug_rotation2) { rug::apply_rotation(rug::currentrot * rotmatrix(rug_rotation2 * 2 * M_PI * t / period, 0, 1) * inverse(rug::currentrot)); @@ -866,6 +879,21 @@ void show() { }); break; } + case maRotation: + if(DIM == 3) { + dialog::addSelItem(XLAT("angle to screen normal"), fts(normal_angle) + "°", 's'); + dialog::add_action([] () { + dialog::editNumber(normal_angle, 0, 360, 15, 0, XLAT("angle to screen normal"), ""); + }); + dialog::addSelItem(XLAT("movement angle"), fts(movement_angle) + "°", 'm'); + dialog::add_action([] () { + dialog::editNumber(movement_angle, 0, 360, 15, 0, XLAT("movement angle"), ""); + }); + dialog::addBreak(100); + } + else + dialog::addBreak(300); + break; default: { dialog::addBreak(300); }