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)12 autorotator::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)39 void 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)50 void autorotator::chgdeg (float d) {
51   setdeg (deg + d);
52 }
53 
chgtps(float t)54 void autorotator::chgtps (float t) {
55   settps (tps + t);
56   setdeg (deg);
57 }
58 
calc(double dt)59 void 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)74 std::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)85 std::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