lazy meshing
authorJohn Tsiombikas <nuclear@mutantstargoat.com>
Sat, 17 Sep 2016 03:45:31 +0000 (06:45 +0300)
committerJohn Tsiombikas <nuclear@mutantstargoat.com>
Sat, 17 Sep 2016 03:45:31 +0000 (06:45 +0300)
src/machine.cc
src/machine.h
src/main.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;
index f222cd7..5513e02 100644 (file)
@@ -13,6 +13,7 @@ class Machine {
 private:
        std::vector<Gear*> gears;
        bool **meshing;
+       bool meshing_valid;
        bool *visited;  /* used for update_gear */
 
        std::vector<Motor> motors;
@@ -26,6 +27,7 @@ public:
        void add_gear(Gear *g); /* takes ownership */
        void add_motor(int gearidx, float speed_hz);
 
+       void invalidate_meshing();
        void calc_meshing();
 
        void update(float dt);
index 7efc114..6fc85ba 100644 (file)
@@ -88,7 +88,6 @@ bool init()
        machine->add_gear(gear3);
 
        machine->add_motor(0, 1.0);
-       machine->calc_meshing();
 
        start_time = glutGet(GLUT_ELAPSED_TIME);
        return true;