nuclear@0: #include nuclear@0: #include nuclear@5: #include "opengl.h" nuclear@0: #include "level.h" nuclear@2: #include "datapath.h" nuclear@5: #include "terrain.h" nuclear@2: nuclear@2: using namespace tinyxml2; nuclear@0: nuclear@0: Level::Level() nuclear@0: { nuclear@0: } nuclear@0: nuclear@0: Level::~Level() nuclear@0: { nuclear@0: } nuclear@0: nuclear@0: bool Level::load(const char *fname) nuclear@0: { nuclear@2: push_data_path(); nuclear@2: add_data_path(fname); nuclear@2: nuclear@2: if(xml.LoadFile(fname) != 0) { nuclear@0: fprintf(stderr, "failed to load level: %s\n", fname); nuclear@2: pop_data_path(); nuclear@0: return false; nuclear@0: } nuclear@0: nuclear@1: if(strcmp(xml.RootElement()->Name(), "level") != 0) { nuclear@0: fprintf(stderr, "invalid level file: %s\n", fname); nuclear@2: pop_data_path(); nuclear@0: return false; nuclear@0: } nuclear@2: nuclear@2: XMLNode *node = xml.RootElement()->FirstChild(); nuclear@2: do { nuclear@2: XMLElement *elem = node->ToElement(); nuclear@5: if(!elem) { nuclear@5: fprintf(stderr, "ignoring non-element child of \n"); nuclear@5: continue; nuclear@5: } nuclear@2: nuclear@5: if(strcmp(elem->Name(), "terrain") == 0) { nuclear@5: if(terrain) { nuclear@5: fprintf(stderr, " must only have a single terrain child! ignoring\n"); nuclear@5: continue; nuclear@5: } nuclear@2: nuclear@5: terrain = new Terrain; nuclear@5: if(!terrain->load(elem)) { nuclear@5: fprintf(stderr, "failed to load terrain\n"); nuclear@5: pop_data_path(); nuclear@5: return false; nuclear@2: } nuclear@5: nuclear@5: float val; nuclear@5: if(elem->QueryFloatAttribute("size", &val) == 0) { nuclear@5: printf("terrain size: %f\n", val); nuclear@5: terrain->set_size(val); nuclear@5: } nuclear@5: } else { nuclear@5: fprintf(stderr, "ignoring unexpected child of : %s\n", elem->Name()); nuclear@5: continue; nuclear@2: } nuclear@5: nuclear@2: } while((node = node->NextSibling())); nuclear@2: nuclear@2: pop_data_path(); nuclear@2: return true; nuclear@2: } nuclear@2: nuclear@3: void Level::draw() const nuclear@3: { nuclear@5: terrain->draw(); nuclear@3: }