void read_scene(void) { sdl_init(); if (lang_parse() == 0) lang_eval(); else exit(1); } void sdl_init(void) { lang_define("scene", scene_parse); lang_define("view", view_parse); lang_define("dist_light", distlight_parse); lang_define("matte", matte_parse); lang_define("metal", metal_parse); lang_define("plastic", plastic_parse); #ifdef CSG lang_define("csgobj", obj_parse); lang_define("csg_union", csg_union_parse); lang_define("csg_inter", csg_inter_parse); lang_define("csg_diff", csg_diff_parse); lang_define("csg_prim", csg_prim_parse); lang_define("sphere", sphere_parse); #endif #ifdef POLY lang_define("polyobj", obj_parse); lang_define("trilist", trilist_parse); #endif #ifdef PPRIM lang_define("primobj", obj_parse); lang_define("sphere", sphere_parse); #endif } Val scene_parse(int c, Pval *pl) { Val v; if (c == T_EXEC) { Pval *p = pl; while (p != NULL) { if (p->name && strcmp(p->name, "object") == 0 && p->val.type == OBJ_TYPE) { LIST_INSERT(objs, p->val.u.v, OBJECT); } else if (p->name && strcmp(p->name, "light") == 0 && p->val.type == LIGHT) { LIST_INSERT(lights, p->val.u.v, Light); } else if (p->name && strcmp(p->name, "camera") == 0 && p->val.type == CAMERA) { view = p->val.u.v; } else fprintf(stderr, "error: %s unknown command\n", p->name); p = p->next; } return v; } else if (c == T_PREP) { return v; } } Val obj_parse(int c, Pval *pl) { Val v; OBJECT *o = NEWSTRUCT(OBJECT); if (c == T_EXEC) { Pval *p; for (p = pl; p !=NULL; p = p->next) { if (p->name && strcmp(p->name, "material")==0 && p->val.type == MATERIAL) o->mat = p->val.u.v; else if (p->name && strcmp(p->name, "shape")==0 && p->val.type == OBJ_VAL) o->shp = p->val.u.v; else fprintf(stderr, "obj: %s syntax error\n", p->name); } if (o->mat == NULL) o->mat = mat_default(); v.type = OBJ_TYPE; v.u.v = o; return v; } }