From b4e280c43f8c2fb4b3491226c890040463483bb7 Mon Sep 17 00:00:00 2001 From: Zeno Rogue Date: Sun, 13 Aug 2023 13:38:36 +0200 Subject: [PATCH] modernized animation parameters --- legacy.cpp | 81 +++++++++++++++++++++++++- screenshot.cpp | 154 +++++++++++++++---------------------------------- 2 files changed, 127 insertions(+), 108 deletions(-) diff --git a/legacy.cpp b/legacy.cpp index 9ff1f923..0ff24cb8 100644 --- a/legacy.cpp +++ b/legacy.cpp @@ -362,7 +362,86 @@ int read_legacy_args() { return 0; } -auto ah_legacy = addHook(hooks_args, 0, read_legacy_args); +int read_legacy_args_anim() { + using namespace anims; + using namespace arg; + ld movement_angle, shift_angle, rug_angle; /* TODO link to anims::angle's */ + if(0); + else if(argis("-animperiod")) { + PHASEFROM(2); shift_arg_formula(period); + } + else if(argis("-animcircle")) { + PHASE(3); start_game(); + ma = maCircle; ma_reaction(); + shift_arg_formula(circle_spins); + shift_arg_formula(circle_radius); + shift(); circle_display_color = argcolor(24); + } + else if(argis("-animmove")) { + ma = maTranslation; + shift_arg_formula(cycle_length); + shift_arg_formula(shift_angle); + shift_arg_formula(movement_angle); + } + else if(argis("-animmoverot")) { + ma = maTranslationRotation; + shift_arg_formula(cycle_length); + shift_arg_formula(shift_angle); + shift_arg_formula(movement_angle); + } + else if(argis("-wallopt")) { + wallopt = true; + } + else if(argis("-animpar")) { + ma = maParabolic; + shift_arg_formula(parabolic_length); + shift_arg_formula(shift_angle); + shift_arg_formula(movement_angle); + } + else if(argis("-animclear")) { clearup = true; } + else if(argis("-animrot")) { + ma = maRotation; + if(GDIM == 3) { + shift_arg_formula(movement_angle); + shift_arg_formula(normal_angle); + } + } + else if(argis("-animrotd")) { + start_game(); + ma = maRotation; + shift_arg_formula(rotation_distance); + } + else if(argis("-animrug")) { + shift_arg_formula(rug_rotation1); + shift_arg_formula(rug_angle); + shift_arg_formula(rug_rotation2); + } + else if(argis("-animenv")) { + shift_arg_formula(env_ocean); + shift_arg_formula(env_volcano); + } + else if(argis("-animball")) { + shift(); println(hlog, "-animball removed"); + } + else if(argis("-animj")) { + shift(); println(hlog, "-animj removed"); +/* to recreate: if(joukowsky_anim) { + ld t = ticks / period; + t = t - floor(t); + if(pmodel == mdBand) { + vpconf.model_transition = t * 4 - 1; + } + else { + vpconf.model_transition = t / 1.1; + vpconf.scale = (1 - vpconf.model_transition) / 2.; + } */ +/* skiprope:legacy.cpp pconf.skiprope += skiprope_rotation * t * TAU / period; */ + } + else return 1; + return 0; + } + +auto ah_legacy = addHook(hooks_args, 0, read_legacy_args) + addHook(hooks_args, 0, read_legacy_args_anim); #endif diff --git a/screenshot.cpp b/screenshot.cpp index 189da215..e4e112f0 100644 --- a/screenshot.cpp +++ b/screenshot.cpp @@ -1131,7 +1131,7 @@ enum eMovementAnimation { EX eMovementAnimation ma; -EX ld shift_angle, movement_angle, movement_angle_2; +EX trans23 movement_angle; EX ld normal_angle = 90; EX ld period = 10000; EX int noframes = 30; @@ -1142,15 +1142,22 @@ EX string time_formula = "-"; int lastticks, bak_turncount; -EX ld rug_rotation1, rug_rotation2, rug_forward, ballangle_rotation, env_ocean, env_volcano, rug_movement_angle, rug_shift_angle; +EX ld rug_rotation1, rug_rotation2, rug_forward, env_ocean, env_volcano; EX bool env_shmup; -EX ld rug_angle; +EX transmatrix rug_angle = Id, rug_movement_angle = cspin(0, 1, 90._deg); EX ld rotation_distance; cell *rotation_center; transmatrix rotation_center_View; -color_t circle_display_color = 0x00FF00FF; +EX void ma_reaction() { + println(hlog, "ma_reaction called"); + if(ma == maCircle) start_game(); + rotation_center = centerover; + rotation_center_View = View; + } + +EX color_t circle_display_color = 0x00FF00FF; EX ld circle_radius = acosh(2.); EX ld circle_spins = 1; @@ -1241,14 +1248,14 @@ EX void reflect_view() { } } -bool clearup; +EX 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) + rug_movement_angle * xtangent(t) ); } @@ -1280,7 +1287,7 @@ EX void apply() { } } shift_view( - cspin(0, GDIM-1, movement_angle * degree) * spin(shift_angle * degree) * xtangent(cycle_length * t / period) + movement_angle.get() * xtangent(cycle_length * t / period) ); moved(); if(clearup) { @@ -1291,25 +1298,17 @@ EX void apply() { break; case maRotation: - shift_view(ztangent(-rotation_distance)); - if(GDIM == 3) { - rotate_view(spin(-movement_angle * degree)); - rotate_view(cspin(1, 2, normal_angle * degree)); - rotate_view(spin(-movement_angle_2 * degree)); - } + if(GDIM == 3) shift_view(ztangent(-rotation_distance)); + rotate_view(movement_angle.get()); rotate_view(spin(TAU * t / period)); - if(GDIM == 3) { - rotate_view(spin(movement_angle_2 * degree)); - rotate_view(cspin(2, 1, normal_angle * degree)); - rotate_view(spin(movement_angle * degree)); - } - shift_view(ztangent(rotation_distance)); + rotate_view(rot_inverse(movement_angle.get())); + if(GDIM == 3) shift_view(ztangent(rotation_distance)); moved(); break; case maTranslationRotation: shift_view( - cspin(0, GDIM-1, movement_angle * degree) * spin(shift_angle * degree) * xtangent(cycle_length * t / period) + rot_inverse(movement_angle.get()) * xtangent(cycle_length * t / period) ); moved(); rotate_view(cspin(0, GDIM-1, TAU * t / period)); @@ -1321,12 +1320,12 @@ EX void apply() { #if CAP_BT case maParabolic: reflect_view(); - View = ypush(-shift_angle * degree) * spin(-movement_angle * degree) * View; + View = movement_angle.get() * View; if(GDIM == 2) View = bt::parabolic(parabolic_length * t / period) * View; else View = bt::parabolic3(parabolic_length * t / period, 0) * View; - View = spin(movement_angle * degree) * ypush(shift_angle * degree) * View; + View = rot_inverse(movement_angle.get()) * View; moved(); break; #endif @@ -1356,7 +1355,7 @@ EX void apply() { if(rug::rugged) { if(rug_rotation1) { rug::using_rugview rv; - rotate_view(cspin(1, 2, -rug_angle * degree) * cspin(0, 2, rug_rotation1 * TAU * t / period) * cspin(1, 2, rug_angle * degree)); + rotate_view(inverse(rug_angle) * cspin(0, 2, rug_rotation1 * TAU * t / period) * rug_angle); } if(rug_rotation2) { rug::using_rugview rv; @@ -1515,16 +1514,8 @@ EX ld a, b; 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"), ""); - }); + add_edit(rug_angle); + add_edit(rug_movement_angle); } EX void show() { @@ -1618,14 +1609,7 @@ EX void show() { } else add_edit(parabolic_length); - dialog::addSelItem(XLAT("shift"), fts(shift_angle) + "°", 'C'); - dialog::add_action([] () { - dialog::editNumber(shift_angle, 0, 90, 15, 0, XLAT("shift"), ""); - }); - dialog::addSelItem(XLAT("movement angle"), fts(movement_angle) + "°", 'm'); - dialog::add_action([] () { - dialog::editNumber(movement_angle, 0, 360, 15, 0, XLAT("movement angle"), ""); - }); + add_edit(movement_angle.get()); break; } case maRotation: @@ -1634,10 +1618,7 @@ EX void show() { 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"), ""); - }); + add_edit(movement_angle); dialog::addBreak(100); dialog::addSelItem(XLAT("distance from rotation center"), fts(rotation_distance), 'r'); dialog::add_action([] () { @@ -1667,12 +1648,7 @@ EX void show() { #if CAP_RUG if(rug::rugged) { animator(XLAT("screen-relative rotation"), rug_rotation1, 'r'); - if(rug_rotation1) { - dialog::addSelItem(XLAT("angle"), fts(rug_angle) + "°", 'a'); - dialog::add_action([] () { - dialog::editNumber(rug_angle, 0, 360, 15, 0, "Rug angle", ""); - }); - } + if(rug_rotation1) add_edit(rug_angle); else dialog::addBreak(100); animator(XLAT("model-relative rotation"), rug_rotation2, 'r'); animator(XLAT("automatic move speed"), rug_forward, 'M'); @@ -1766,58 +1742,7 @@ int readArgs() { shift(); videofile = args(); record_video(); } #endif - else if(argis("-animcircle")) { - PHASE(3); start_game(); - ma = maCircle; - rotation_center = centerover; - rotation_center_View = View; - shift_arg_formula(circle_spins); - shift_arg_formula(circle_radius); - shift(); circle_display_color = argcolor(24); - } - else if(argis("-animmove")) { - ma = maTranslation; - shift_arg_formula(cycle_length); - shift_arg_formula(shift_angle); - shift_arg_formula(movement_angle); - } - else if(argis("-animmoverot")) { - ma = maTranslationRotation; - shift_arg_formula(cycle_length); - shift_arg_formula(shift_angle); - shift_arg_formula(movement_angle); - } - else if(argis("-wallopt")) { - wallopt = true; - } - else if(argis("-animpar")) { - ma = maParabolic; - shift_arg_formula(parabolic_length); - shift_arg_formula(shift_angle); - shift_arg_formula(movement_angle); - } - else if(argis("-animclear")) { clearup = true; } - else if(argis("-animrot")) { - ma = maRotation; - if(GDIM == 3) { - shift_arg_formula(movement_angle); - shift_arg_formula(normal_angle); - } - } - else if(argis("-animrotd")) { - start_game(); - ma = maRotation; - shift_arg_formula(rotation_distance); - } - else if(argis("-animrug")) { - shift_arg_formula(rug_rotation1); - shift_arg_formula(rug_angle); - shift_arg_formula(rug_rotation2); - } - else if(argis("-animenv")) { - shift_arg_formula(env_ocean); - shift_arg_formula(env_volcano); - } +#endif else return 1; return 0; } @@ -1834,14 +1759,29 @@ auto animhook = addHook(hooks_frame, 100, display_animation) param_f(anims::cycle_length, "acycle", "animation cycle length"); param_f(anims::parabolic_length, "aparabolic", "animation parabolic length") ->editable(0, 10, 1, "cells to go", "", 'c'); - param_f(anims::rug_angle, "arugangle", "animation rug angle"); + param_matrix(anims::rug_angle, "arugangle", 3) + ->editable("animation rug angle", "", 'a'); param_f(anims::circle_radius, "acradius", "animation circle radius"); param_f(anims::circle_spins, "acspins", "animation circle spins"); - addsaver(anims::rug_movement_angle, "rug forward movement angle", 90); - addsaver(anims::rug_shift_angle, "rug forward shift angle", 0); + param_matrix(anims::rug_movement_angle, "rug forward movement angle", 3) + ->editable("rug forward movement angle", "", 'b'); + param_matrix(anims::movement_angle.v2, "movement_angle", 2)->editable("movement angle", "", 'm'); + param_matrix(anims::movement_angle.v3, "movement_angle_3", 3)->editable("movement angle", "", 'm'); + param_f(rug_rotation1, "rug_rotation1"); + param_f(rug_rotation2, "rug_rotation2"); + param_f(rotation_distance, "rotation_distance"); + param_f(cycle_length, "cycle_length"); + param_f(env_ocean, "env_ocean"); + param_f(env_volcano, "env_volcano"); + param_b(wallopt, "wallopt"); + param_b(clearup, "anim_clearup"); + param_color(circle_display_color, "circle_display_color", true); + param_enum(anims::ma, "ma", "movement_animation", maNone) + -> editable({{"none", ""}, {"translation", ""}, {"rotation", ""}, {"circle", ""}, {"parabolic", ""}, {"translation+rotation", ""}}, "movement animation", 'a') + -> set_reaction(ma_reaction); + param_f(anims::a, "a", 0); param_f(anims::b, "b", 0); - param_f(anims::movement_angle_2, "movement angle 2", 0); #endif });