hurray the parser works
authorJohn Tsiombikas <nuclear@mutantstargoat.com>
Tue, 11 Oct 2016 13:04:59 +0000 (16:04 +0300)
committerJohn Tsiombikas <nuclear@mutantstargoat.com>
Tue, 11 Oct 2016 13:04:59 +0000 (16:04 +0300)
src/main.cc
src/mparser.cc

index 2aec0a0..6a296b9 100644 (file)
@@ -127,7 +127,7 @@ static bool init()
        subgear->color = Vec3(0.8, 0.7, 0.5);
        */
 
-       machine->add_motor(0, 1.0);
+       //machine->add_motor(0, 1.0);
 
        // shadows
        init_shadow(2048);
index 91b1b80..3bfe8ce 100644 (file)
@@ -37,7 +37,7 @@ struct ParserState {
        std::map<std::string, FuncDesc> func;
 
        std::map<std::string, Gear*> gears;
-       std::stack<Gear*> cur_gear;
+       std::vector<Gear*> cur_gear;
        Motor *cur_motor;
 };
 
@@ -73,6 +73,7 @@ static int get_func_arity(ParserState *ps, const char *name);
 static Gear *begin_gear(ParserState *ps);
 static bool end_gear(ParserState *ps);
 static Gear *this_gear(ParserState *ps);
+static Gear *find_gear(ParserState *ps, const char *name);
 static void update_gear_vars(ParserState *ps, Gear *gear);
 static bool set_gear_var(Gear *gear, const char *name, const Value &val);
 
@@ -325,7 +326,7 @@ static bool vector(ParserState *ps)
                        expected(ps, "numbers as vector elements");
                        return false;
                }
-               vec.v[i] = tmp.v[0];
+               vec.v[nelem - i - 1] = tmp.v[0];
                ps->val.pop();
        }
 
@@ -581,7 +582,7 @@ static void print_value(const Value &val, FILE *fp)
 static Gear *begin_gear(ParserState *ps)
 {
        Gear *res = new Gear;
-       ps->cur_gear.push(res);
+       ps->cur_gear.push_back(res);
        return res;
 }
 
@@ -591,8 +592,8 @@ static bool end_gear(ParserState *ps)
                errmsg(ps, "parser error: unbalanced end_gear");
                return false;
        }
-       Gear *gear = ps->cur_gear.top();
-       ps->cur_gear.pop();
+       Gear *gear = ps->cur_gear.back();
+       ps->cur_gear.pop_back();
 
        printf("DBG: end_gear: %s\n", gear->name.c_str());
 
@@ -606,14 +607,28 @@ static bool end_gear(ParserState *ps)
        ps->mcn->add_gear(gear);
 
        if(!ps->cur_gear.empty()) {
-               ps->cur_gear.top()->attach(gear);
+               ps->cur_gear.back()->attach(gear);
        }
        return true;
 }
 
 static Gear *this_gear(ParserState *ps)
 {
-       return ps->cur_gear.empty() ? 0 : ps->cur_gear.top();
+       return ps->cur_gear.empty() ? 0 : ps->cur_gear.back();
+}
+
+static Gear *find_gear(ParserState *ps, const char *name)
+{
+       // search progressively wider lexical scopes
+       std::vector<Gear*>::const_reverse_iterator it = ps->cur_gear.rbegin();
+       while(it != ps->cur_gear.rend()) {
+               Gear *g = *it++;
+               if(g->name == std::string(name)) {
+                       return g;
+               }
+       }
+
+       return ps->gears[name];
 }
 
 static void update_gear_vars(ParserState *ps, Gear *gear)
@@ -652,6 +667,7 @@ static bool set_gear_var(Gear *gear, const char *name, const Value &val)
                ASSERT_TYPE(val, VAL_VEC);
                gear->axis = VVEC3(val);
                gear->pdist = val.v[3];
+               printf("setting plane eqn: %f %f %f  %f\n", val.v[0], val.v[1], val.v[2], val.v[3]);
 
        } else if(strcmp(name, "thickness") == 0) {
                ASSERT_TYPE(val, VAL_NUM);
@@ -784,13 +800,14 @@ static bool func_coaxial(ParserState *ps)
                return false;
        }
 
-       Gear *gother = ps->gears[val_gear_name.s];
+       Gear *gother = find_gear(ps, val_gear_name.s.c_str());
        if(!gother) {
                errmsg(ps, "coaxial: gear \"%s\" not found", val_gear_name.s.c_str());
                return false;
        }
 
-       Vec3 pos = gother->pos + gother->axis * val_dist.v[0];
+       float avg_thickness = (gthis->thickness + gother->thickness) * 0.5;
+       Vec3 pos = gother->pos + gother->axis * val_dist.v[0] * avg_thickness;
 
        Value res;
        res.type = VAL_VEC;