]> git.tdb.fi Git - r2c2.git/blobdiff - source/libr2c2/terrain.cpp
Save terrain position and rotation
[r2c2.git] / source / libr2c2 / terrain.cpp
index d4f3e416a84357efd1107d82d3c2c1b9fe91e573..7b8f9f5778c3d0fe84f73f5c9cac2bd04d2029b2 100644 (file)
@@ -97,7 +97,7 @@ void Terrain::set_node_elevation(const NodeCoordinates &c, float elev, bool join
                                Tile &tile = tiles[x+y*width];
                                if(tile.nodes[i].elevation==ref)
                                {
-                                       tile.nodes[i].elevation = elev;
+                                       tile.set_node_elevation(i, elev);
                                        signal_tile_changed.emit(x, y);
                                }
                        }
@@ -105,7 +105,7 @@ void Terrain::set_node_elevation(const NodeCoordinates &c, float elev, bool join
        }
        else
        {
-               tiles[c.x+c.y*width].nodes[c.i].elevation = elev;
+               tiles[c.x+c.y*width].set_node_elevation(c.i, elev);
                signal_tile_changed.emit(c.x, c.y);
        }
 }
@@ -144,7 +144,7 @@ Terrain::NodeCoordinates Terrain::get_closest_node(const Ray &ray) const
                        for(unsigned i=0; i<4; ++i)
                        {
                                NodeCoordinates c(x, y, i);
-                               Vector node_pos((x+i%2)*ts, (y+i/2)*ts, get_node_elevation(c));
+                               Vector node_pos((x+0.25+(i%2)*0.5)*ts, (y+0.25+(i/2)*0.5)*ts, get_node_elevation(c));
                                Vector v = node_pos-local_ray.get_start();
                                float dist = (v-local_ray.get_direction()*dot(local_ray.get_direction(), v)).norm();
                                if(closest_dist<0 || dist<closest_dist)
@@ -159,6 +159,8 @@ Terrain::NodeCoordinates Terrain::get_closest_node(const Ray &ray) const
 
 void Terrain::save(list<DataFile::Statement> &st) const
 {
+       st.push_back((DataFile::Statement("position"), position.x, position.y, position.z));
+       st.push_back((DataFile::Statement("rotation"), rotation.radians()));
        st.push_back((DataFile::Statement("size"), width, height));
        for(vector<Tile>::const_iterator i=tiles.begin(); i!=tiles.end(); ++i)
        {
@@ -186,6 +188,17 @@ Terrain::Tile::Tile():
        secondary_axis(false)
 { }
 
+void Terrain::Tile::set_node_elevation(unsigned i, float e)
+{
+       nodes[i].elevation = e;
+       update_axis();
+}
+
+void Terrain::Tile::update_axis()
+{
+       secondary_axis = (abs(nodes[1].elevation-nodes[2].elevation) < abs(nodes[0].elevation-nodes[3].elevation));
+}
+
 void Terrain::Tile::save(list<DataFile::Statement> &st) const
 {
        bool flat = true;
@@ -256,6 +269,7 @@ void Terrain::Loader::tile()
        Tile &t = obj.tiles[next_tile];
        Tile::Loader ldr(obj, t);
        load_sub_with(ldr);
+       t.update_axis();
        unsigned x = next_tile%obj.width;
        unsigned y = next_tile/obj.width;
        ++next_tile;