1 /* 2 * autorotator.cc 3 * DIN Is Noise is copyright (c) 2006-2021 Jagannathan Sampath 4 * DIN Is Noise is released under GNU Public License 2.0 5 * For more information, please visit https://dinisnoise.org/ 6 */ 7 8 #include "defvelaccel.h" 9 #include "autorotator.h" 10 #include "chrono.h" 11 autorotator(defvelaccel & d)12autorotator::autorotator (defvelaccel& d) : dva (d), autoflip(d) { 13 14 yes = d.autos.rot.yes; 15 16 int i = 0; 17 if (d.autos.rot.dir == RANDOM) i = get_rand_bit (); else i = d.autos.rot.dir; 18 static const int dirs [] = {-1, 1}; 19 dir = dirs[i]; 20 21 if (d.autos.rot.mov == RANDOM) 22 mov = get_rand_bit (); 23 else 24 mov = d.autos.rot.mov; 25 26 if (mov == SMOOTH) { 27 set_rpm (d.autos.rot.rpm()); 28 deg = 6.0f; 29 tps = 1.0f; 30 } 31 else { 32 setdeg (d.autos.rot.dps()); 33 settps (d.autos.rot.tps()); 34 tik.start (); 35 rpm = 0.0f; 36 } 37 } 38 set_rpm(float r)39void autorotator::set_rpm (float r) { 40 if (r > 0) { 41 rpm = r; 42 extern const float TWO_PI; 43 angle.persec = TWO_PI * r / 60.0f; 44 } else { 45 rpm = 0; 46 angle.persec = 0.0f; 47 } 48 } 49 chgdeg(float d)50void autorotator::chgdeg (float d) { 51 setdeg (deg + d); 52 } 53 chgtps(float t)54void autorotator::chgtps (float t) { 55 settps (tps + t); 56 setdeg (deg); 57 } 58 calc(double dt)59void autorotator::calc (double dt) { 60 if (mov == SMOOTH) 61 angle.theta = dt * angle.persec; 62 else { 63 extern ui_clock ui_clk; 64 if (tik (ui_clk())) { 65 angle.theta = tik.edget * angle.persec; 66 } else angle.theta = 0.0f; 67 } 68 69 if (autoflip.yes) autoflip.calc (angle.theta, dir, dva); 70 angle.theta *= dir; 71 72 } 73 operator >>(std::istream & file,autorotator & ar)74std::istream& operator>> (std::istream& file, autorotator& ar) { 75 file >> ar.yes >> ar.dir >> ar.rpm >> ar.mov >> ar.deg >> ar.tps >> ar.autoflip; 76 if (ar.mov == autorotator::SMOOTH) 77 ar.set_rpm (ar.rpm); 78 else { 79 ar.setdeg (ar.deg); 80 ar.settps (ar.tps); 81 } 82 return file; 83 } 84 operator <<(std::ostream & file,autorotator & ar)85std::ostream& operator<< (std::ostream& file, autorotator& ar) { 86 extern const char spc; 87 file << ar.yes << spc << ar.dir << spc << ar.rpm << spc << ar.mov << spc << ar.deg << spc << ar.tps << spc << ar.autoflip; 88 return file; 89 } 90