stratgame

annotate level/src/level.cc @ 5:2e38715de41b

terrain
author John Tsiombikas <nuclear@member.fsf.org>
date Sun, 27 May 2012 07:00:48 +0300
parents 8d95187cb3ee
children
rev   line source
nuclear@0 1 #include <stdio.h>
nuclear@0 2 #include <string.h>
nuclear@5 3 #include "opengl.h"
nuclear@0 4 #include "level.h"
nuclear@2 5 #include "datapath.h"
nuclear@5 6 #include "terrain.h"
nuclear@2 7
nuclear@2 8 using namespace tinyxml2;
nuclear@0 9
nuclear@0 10 Level::Level()
nuclear@0 11 {
nuclear@0 12 }
nuclear@0 13
nuclear@0 14 Level::~Level()
nuclear@0 15 {
nuclear@0 16 }
nuclear@0 17
nuclear@0 18 bool Level::load(const char *fname)
nuclear@0 19 {
nuclear@2 20 push_data_path();
nuclear@2 21 add_data_path(fname);
nuclear@2 22
nuclear@2 23 if(xml.LoadFile(fname) != 0) {
nuclear@0 24 fprintf(stderr, "failed to load level: %s\n", fname);
nuclear@2 25 pop_data_path();
nuclear@0 26 return false;
nuclear@0 27 }
nuclear@0 28
nuclear@1 29 if(strcmp(xml.RootElement()->Name(), "level") != 0) {
nuclear@0 30 fprintf(stderr, "invalid level file: %s\n", fname);
nuclear@2 31 pop_data_path();
nuclear@0 32 return false;
nuclear@0 33 }
nuclear@2 34
nuclear@2 35 XMLNode *node = xml.RootElement()->FirstChild();
nuclear@2 36 do {
nuclear@2 37 XMLElement *elem = node->ToElement();
nuclear@5 38 if(!elem) {
nuclear@5 39 fprintf(stderr, "ignoring non-element child of <level>\n");
nuclear@5 40 continue;
nuclear@5 41 }
nuclear@2 42
nuclear@5 43 if(strcmp(elem->Name(), "terrain") == 0) {
nuclear@5 44 if(terrain) {
nuclear@5 45 fprintf(stderr, "<level> must only have a single terrain child! ignoring\n");
nuclear@5 46 continue;
nuclear@5 47 }
nuclear@2 48
nuclear@5 49 terrain = new Terrain;
nuclear@5 50 if(!terrain->load(elem)) {
nuclear@5 51 fprintf(stderr, "failed to load terrain\n");
nuclear@5 52 pop_data_path();
nuclear@5 53 return false;
nuclear@2 54 }
nuclear@5 55
nuclear@5 56 float val;
nuclear@5 57 if(elem->QueryFloatAttribute("size", &val) == 0) {
nuclear@5 58 printf("terrain size: %f\n", val);
nuclear@5 59 terrain->set_size(val);
nuclear@5 60 }
nuclear@5 61 } else {
nuclear@5 62 fprintf(stderr, "ignoring unexpected child of <level>: %s\n", elem->Name());
nuclear@5 63 continue;
nuclear@2 64 }
nuclear@5 65
nuclear@2 66 } while((node = node->NextSibling()));
nuclear@2 67
nuclear@2 68 pop_data_path();
nuclear@2 69 return true;
nuclear@2 70 }
nuclear@2 71
nuclear@3 72 void Level::draw() const
nuclear@3 73 {
nuclear@5 74 terrain->draw();
nuclear@3 75 }