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);
}
}
}
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);
}
}
Terrain::NodeCoordinates Terrain::get_closest_node(const Ray &ray) const
{
+ Transform reverse_trans = Transform::rotation(rotation, Vector(0, 0, -1))*
+ Transform::translation(-position);
+ Ray local_ray = reverse_trans.transform(ray);
+
+ float ts = type.get_tile_size();
NodeCoordinates coords;
float closest_dist = -1;
for(unsigned y=0; y<height; ++y)
for(unsigned i=0; i<4; ++i)
{
NodeCoordinates c(x, y, i);
- /* XXX This is not very efficient. Should transform the ray to
- local coordinate system. */
- Vector node_pos = get_node_position(c);
- Vector v = node_pos-ray.get_start();
- float dist = (v-ray.get_direction()*dot(ray.get_direction(), v)).norm();
+ 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)
{
coords = c;
closest_dist = dist;
}
}
+
return coords;
}
secondary_axis(false)
{ }
+void Terrain::Tile::set_node_elevation(unsigned i, float e)
+{
+ nodes[i].elevation = e;
+ secondary_axis = ((nodes[1].elevation+nodes[2].elevation) < (nodes[0].elevation+nodes[3].elevation));
+}
+
void Terrain::Tile::save(list<DataFile::Statement> &st) const
{
bool flat = true;