stratgame

annotate level/src/level.cc @ 3:8d95187cb3ee

foo
author John Tsiombikas <nuclear@member.fsf.org>
date Wed, 23 May 2012 17:10:46 +0300
parents 369b51c9e4a8
children 2e38715de41b
rev   line source
nuclear@0 1 #include <stdio.h>
nuclear@0 2 #include <string.h>
nuclear@0 3 #include "level.h"
nuclear@2 4 #include "datapath.h"
nuclear@3 5 #include "opengl.h"
nuclear@2 6
nuclear@2 7 using namespace tinyxml2;
nuclear@0 8
nuclear@0 9 Level::Level()
nuclear@0 10 {
nuclear@0 11 }
nuclear@0 12
nuclear@0 13 Level::~Level()
nuclear@0 14 {
nuclear@0 15 }
nuclear@0 16
nuclear@0 17 bool Level::load(const char *fname)
nuclear@0 18 {
nuclear@2 19 push_data_path();
nuclear@2 20 add_data_path(fname);
nuclear@2 21
nuclear@2 22 if(xml.LoadFile(fname) != 0) {
nuclear@0 23 fprintf(stderr, "failed to load level: %s\n", fname);
nuclear@2 24 pop_data_path();
nuclear@0 25 return false;
nuclear@0 26 }
nuclear@0 27
nuclear@1 28 if(strcmp(xml.RootElement()->Name(), "level") != 0) {
nuclear@0 29 fprintf(stderr, "invalid level file: %s\n", fname);
nuclear@2 30 pop_data_path();
nuclear@0 31 return false;
nuclear@0 32 }
nuclear@2 33
nuclear@2 34 XMLNode *node = xml.RootElement()->FirstChild();
nuclear@2 35 do {
nuclear@2 36 XMLElement *elem = node->ToElement();
nuclear@2 37 if(elem) {
nuclear@2 38 if(strcmp(elem->Name(), "map") == 0) {
nuclear@2 39 LevelMap map;
nuclear@2 40
nuclear@2 41 if(!map.load(elem)) {
nuclear@2 42 pop_data_path();
nuclear@2 43 return false;
nuclear@2 44 }
nuclear@2 45 levelmaps[map.get_name()] = std::move(map);
nuclear@2 46
nuclear@2 47 } else {
nuclear@2 48 fprintf(stderr, "ignoring unrecognized element: %s\n", elem->Name());
nuclear@2 49 }
nuclear@2 50 }
nuclear@2 51 } while((node = node->NextSibling()));
nuclear@2 52
nuclear@2 53 pop_data_path();
nuclear@2 54 return true;
nuclear@2 55 }
nuclear@2 56
nuclear@3 57 void Level::draw() const
nuclear@3 58 {
nuclear@3 59 auto iter = levelmaps.find("height");
nuclear@3 60 if(iter == levelmaps.end()) {
nuclear@3 61 return;
nuclear@3 62 }
nuclear@3 63
nuclear@3 64 img_pixmap *hmap = (img_pixmap*)iter->second.get_pixmap();
nuclear@3 65
nuclear@3 66 glBegin(GL_POINTS);
nuclear@3 67 for(int i=0; i<hmap->height; i++) {
nuclear@3 68 for(int j=0; j<hmap->width; j++) {
nuclear@3 69 int height;
nuclear@3 70 img_getpixel1i(hmap, j, i, &height);
nuclear@3 71
nuclear@3 72 float x = (float)j / (float)hmap->width - 0.5;
nuclear@3 73 float y = height / 255.0;
nuclear@3 74 float z = (float)i / (float)hmap->height - 0.5;
nuclear@3 75
nuclear@3 76 glColor3f(y, 0.0, 1.0 - y);
nuclear@3 77 glVertex3f(x, y, z);
nuclear@3 78 }
nuclear@3 79 }
nuclear@3 80 glEnd();
nuclear@3 81 }
nuclear@3 82
nuclear@2 83
nuclear@2 84 LevelMap::LevelMap()
nuclear@2 85 {
nuclear@2 86 init();
nuclear@2 87 }
nuclear@2 88
nuclear@2 89 void LevelMap::init()
nuclear@2 90 {
nuclear@2 91 scale = 1.0f;
nuclear@2 92 img_init(&img);
nuclear@2 93 name = 0;
nuclear@2 94 }
nuclear@2 95
nuclear@2 96 LevelMap::~LevelMap()
nuclear@2 97 {
nuclear@2 98 destroy();
nuclear@2 99 }
nuclear@2 100
nuclear@2 101 void LevelMap::destroy()
nuclear@2 102 {
nuclear@2 103 if(img.pixels) {
nuclear@2 104 img_destroy(&img);
nuclear@2 105 }
nuclear@2 106 delete [] name;
nuclear@2 107 }
nuclear@2 108
nuclear@2 109 // copy
nuclear@2 110 LevelMap::LevelMap(const LevelMap &map)
nuclear@2 111 {
nuclear@2 112 init();
nuclear@2 113 *this = map;
nuclear@2 114 }
nuclear@2 115
nuclear@2 116 LevelMap &LevelMap::operator =(const LevelMap &map)
nuclear@2 117 {
nuclear@2 118 if(this != &map) {
nuclear@2 119 destroy();
nuclear@2 120
nuclear@2 121 scale = map.scale;
nuclear@2 122 img_init(&img);
nuclear@2 123 img_copy(&img, (img_pixmap*)&map.img);
nuclear@2 124
nuclear@2 125 name = new char[strlen(map.name) + 1];
nuclear@2 126 strcpy(name, map.name);
nuclear@2 127 }
nuclear@2 128 return *this;
nuclear@2 129 }
nuclear@2 130
nuclear@2 131 // move semantics
nuclear@2 132 LevelMap::LevelMap(LevelMap &&map)
nuclear@2 133 {
nuclear@2 134 init();
nuclear@2 135 *this = std::move(map);
nuclear@2 136 }
nuclear@2 137
nuclear@2 138 LevelMap &LevelMap::operator =(LevelMap &&map)
nuclear@2 139 {
nuclear@2 140 if(this != &map) {
nuclear@2 141 destroy();
nuclear@2 142
nuclear@2 143 scale = map.scale;
nuclear@2 144
nuclear@2 145 img = map.img;
nuclear@2 146 map.img.pixels = 0;
nuclear@2 147 map.img.name = 0;
nuclear@2 148
nuclear@2 149 name = map.name;
nuclear@2 150 map.name = 0;
nuclear@2 151 }
nuclear@2 152
nuclear@2 153 return *this;
nuclear@2 154 }
nuclear@2 155
nuclear@2 156 bool LevelMap::load(XMLElement *xelem)
nuclear@2 157 {
nuclear@2 158 char fname[PATH_MAX];
nuclear@2 159
nuclear@2 160 const char *attr = xelem->Attribute("type");
nuclear@2 161 if(!attr) {
nuclear@2 162 fprintf(stderr, "map element without a type attribute\n");
nuclear@2 163 return false;
nuclear@2 164 }
nuclear@2 165 name = new char[strlen(attr) + 1];
nuclear@2 166 strcpy(name, attr);
nuclear@2 167
nuclear@2 168 attr = xelem->Attribute("file");
nuclear@2 169 if(!attr) {
nuclear@2 170 fprintf(stderr, "map element without a file attribute\n");
nuclear@2 171 return false;
nuclear@2 172 }
nuclear@2 173 if(!find_file(attr, fname)) {
nuclear@2 174 fprintf(stderr, "failed to locate image: %s\n", attr);
nuclear@2 175 return false;
nuclear@2 176 }
nuclear@2 177
nuclear@2 178 if(img_load(&img, fname) == -1) {
nuclear@2 179 fprintf(stderr, "failed to load image: %s\n", fname);
nuclear@2 180 return false;
nuclear@2 181 }
nuclear@2 182
nuclear@2 183 float val;
nuclear@2 184 if(xelem->QueryFloatAttribute("scale", &val) == 0) {
nuclear@2 185 scale = val;
nuclear@2 186 }
nuclear@1 187 return true;
nuclear@0 188 }
nuclear@2 189
nuclear@2 190 float LevelMap::get_scale() const
nuclear@2 191 {
nuclear@2 192 return scale;
nuclear@2 193 }
nuclear@2 194
nuclear@2 195 const img_pixmap *LevelMap::get_pixmap() const
nuclear@2 196 {
nuclear@2 197 return &img;
nuclear@2 198 }
nuclear@2 199
nuclear@2 200 const char *LevelMap::get_name() const
nuclear@2 201 {
nuclear@2 202 return name;
nuclear@2 203 }