did I fix the meshing now?
authorJohn Tsiombikas <nuclear@mutantstargoat.com>
Sat, 17 Sep 2016 21:52:06 +0000 (00:52 +0300)
committerJohn Tsiombikas <nuclear@mutantstargoat.com>
Sat, 17 Sep 2016 21:52:06 +0000 (00:52 +0300)
src/gear.cc
src/gear.h
src/machine.cc

index 10e8bc8..f6872cf 100644 (file)
@@ -24,6 +24,17 @@ Gear::~Gear()
        delete mesh;
 }
 
+void Gear::set_angular_offset(float offs)
+{
+       init_angle = offs;
+       xform_valid = false;
+}
+
+float Gear::get_angular_offset() const
+{
+       return init_angle;
+}
+
 void Gear::set_teeth(int nt, float tooth_pitch)
 {
        float circ = tooth_pitch * nt;
index 45a3d13..e8796e9 100644 (file)
@@ -71,6 +71,9 @@ public:
        Gear();
        ~Gear();
 
+       void set_angular_offset(float offs);
+       float get_angular_offset() const;
+
        // sets the supplied number of teeth, and calculates the radius
        // of the gear, to achieve the required tooth pitch
        void set_teeth(int nt, float tooth_pitch);
index 81aa6f6..d6bb338 100644 (file)
@@ -105,11 +105,14 @@ void Machine::calc_meshing()
        // fix the initial angles so that teeth mesh as best as possible
        // should work in one pass as long as the gear train is not impossible
        for(int i=0; i<ngears; i++) {
-               gears[i]->init_angle = 0;
+               float rnd = gears[i]->angle + gears[i]->get_angular_pitch() / 2.0;
+               float snap = rnd - fmod(rnd, gears[i]->get_angular_pitch());
+               gears[i]->set_angle(snap);
+               gears[i]->set_angular_offset(0);
        }
 
        for(int i=0; i<ngears; i++) {
-               for(int j=1; j<ngears; j++) {
+               for(int j=i; j<ngears; j++) {
                        if(meshing[i][j]) {
                                assert(i != j);
 
@@ -122,16 +125,11 @@ void Machine::calc_meshing()
                                float delta = frac_j - frac_i;
 
                                float correction = 0.5 - delta;
-                               gears[j]->init_angle += correction * gears[j]->get_angular_pitch();
+                               float prev_offs = gears[j]->get_angular_offset();
+                               gears[j]->set_angular_offset(prev_offs + correction * gears[j]->get_angular_pitch());
                        }
                }
        }
-
-       /*
-       for(int i=0; i<ngears; i++) {
-               printf("init %d: %f\n", i, gears[i]->init_angle);
-       }
-       */
 }
 
 void Machine::update_gear(int idx, float angle)