Scene Parsing


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;
  }
}


Scene Files, scene.tgz


Copyright © 1997 Luiz Velho