lazy meshing
[antikythera] / src / machine.cc
index 1a78452..274362a 100644 (file)
@@ -9,6 +9,7 @@ static float delta_angle(float a, float b);
 Machine::Machine()
 {
        meshing = 0;
+       meshing_valid = false;
        visited = 0;
 }
 
@@ -29,6 +30,7 @@ Machine::~Machine()
 void Machine::add_gear(Gear *g)
 {
        gears.push_back(g);
+       meshing_valid = false;
 }
 
 void Machine::add_motor(int gearidx, float speed_hz)
@@ -39,6 +41,11 @@ void Machine::add_motor(int gearidx, float speed_hz)
        motors.push_back(m);
 }
 
+void Machine::invalidate_meshing()
+{
+       meshing_valid = false;
+}
+
 void Machine::calc_meshing()
 {
        int ngears = (int)gears.size();
@@ -142,6 +149,11 @@ void Machine::update(float dt)
 {
        int ngears = (int)gears.size();
 
+       if(!meshing_valid) {
+               calc_meshing();
+               meshing_valid = true;
+       }
+
        memset(visited, 0, ngears * sizeof *visited);
        for(size_t i=0; i<motors.size(); i++) {
                int gidx = motors[i].drive;