summaryrefslogtreecommitdiff
path: root/terrain_loader.cpp
diff options
context:
space:
mode:
authorJon Bergli Heier <snakebite@jvnv.net>2011-07-03 15:26:40 +0200
committerJon Bergli Heier <snakebite@jvnv.net>2011-07-03 15:26:40 +0200
commite95b3cb3e1a054a9d6bd766d4904e569ac2b2a68 (patch)
tree2c2c0dea65fa57232c5d9377d4e53bf7001fbe06 /terrain_loader.cpp
parent6e746716d6a5c72fbd42539c6d5d92da8830cb9e (diff)
Added terrain objects.HEADmaster
Diffstat (limited to 'terrain_loader.cpp')
-rw-r--r--terrain_loader.cpp56
1 files changed, 55 insertions, 1 deletions
diff --git a/terrain_loader.cpp b/terrain_loader.cpp
index ef61e1e..5a4aec7 100644
--- a/terrain_loader.cpp
+++ b/terrain_loader.cpp
@@ -11,6 +11,7 @@ TerrainLoader::TerrainLoader(fs::path root) {
TerrainLoader::~TerrainLoader() {
}
+
float *TerrainLoader::get_chunk(int64_t x, int64_t y, unsigned int width, unsigned int height) {
if(has_chunk(x, y))
return load_chunk(x, y, width, height);
@@ -47,8 +48,9 @@ float *TerrainLoader::load_chunk(int64_t x, int64_t y, unsigned int width, unsig
is.read((char*)&h, sizeof(h));
// TODO: should return w and h, fix calling code
- if(w != width || h != height)
+ if(w != width || h != height) {
throw std::runtime_error("width or height doesn't match");
+ }
float *chunk = new float[width*height];
is.read((char*)chunk, width*height*sizeof(float));
@@ -56,3 +58,55 @@ float *TerrainLoader::load_chunk(int64_t x, int64_t y, unsigned int width, unsig
return chunk;
}
+
+std::list<Vector3> TerrainLoader::get_objects(int64_t x, int64_t y) {
+ std::list<Vector3> objects;
+
+ if(has_objects(x, y))
+ objects = load_objects(x, y);
+
+ return objects;
+}
+
+bool TerrainLoader::has_objects(int64_t x, int64_t y) {
+ return fs::exists(root / (boost::format("%d.%d.objs") % x % y).str());
+}
+
+void TerrainLoader::save_objects(std::list<Vector3>& objects, int64_t x, int64_t y) {
+ fs::path p = root / (boost::format("%d.%d.objs") % x % y).str();
+ fs::ofstream os(p, std::ios::out | std::ios::binary);
+
+ uint32_t count = objects.size();
+ os.write((const char*)&count, sizeof(count));
+
+ for(std::list<Vector3>::iterator it = objects.begin(); it != objects.end(); it++) {
+ Vector3& obj = *it;
+ os.write((const char*)&obj.x, sizeof(obj.x));
+ os.write((const char*)&obj.y, sizeof(obj.y));
+ os.write((const char*)&obj.z, sizeof(obj.z));
+ }
+ os.close();
+}
+
+std::list<Vector3> TerrainLoader::load_objects(int64_t x, int64_t y) {
+ fs::path p = root / (boost::format("%d.%d.objs") % x % y).str();
+ fs::ifstream is(p, std::ios::in | std::ios::binary);
+
+ std::list<Vector3> objects;
+
+ uint32_t count;
+ is.read((char*)&count, sizeof(count));
+
+ for(uint32_t i = 0; i < count; i++) {
+ Vector3 obj;
+
+ is.read((char*)&obj.x, sizeof(obj.x));
+ is.read((char*)&obj.y, sizeof(obj.y));
+ is.read((char*)&obj.z, sizeof(obj.z));
+
+ objects.push_back(obj);
+ }
+ is.close();
+
+ return objects;
+}