+void TerrainTool::update_marker()
+{
+ marker.clear();
+ GL::MeshBuilder bld(marker);
+
+ float ts = terrain.get_type().get_tile_size();
+ bld.matrix() *= GL::Matrix::translation(edit_size/2*-ts, edit_size/2*-ts, 0);
+ if(shift_held)
+ {
+ bld.begin(GL::TRIANGLE_STRIP);
+ if(edit_size==0)
+ {
+ bld.vertex(0, ts/2, ts/4);
+ bld.vertex(0, ts/2, -ts/4);
+ bld.vertex(0, 0, ts/4);
+ bld.vertex(0, 0, -ts/4);
+ bld.vertex(ts/2, 0, ts/4);
+ bld.vertex(ts/2, 0, -ts/4);
+ }
+ else
+ {
+ bld.vertex(0, 0, ts/4);
+ bld.vertex(0, 0, -ts/4);
+ bld.vertex(edit_size*ts, 0, ts/4);
+ bld.vertex(edit_size*ts, 0, -ts/4);
+ bld.vertex(edit_size*ts, edit_size*ts, ts/4);
+ bld.vertex(edit_size*ts, edit_size*ts, -ts/4);
+ bld.vertex(0, edit_size*ts, ts/4);
+ bld.vertex(0, edit_size*ts, -ts/4);
+ bld.element(0);
+ bld.element(1);
+ }
+ bld.end();
+ }
+ else
+ {
+ bld.begin(GL::TRIANGLE_STRIP);
+ bld.vertex(-ts/2, 0, ts/4);
+ bld.vertex(-ts/2, 0, -ts/4);
+ bld.vertex((edit_size+0.5)*ts, 0, ts/4);
+ bld.vertex((edit_size+0.5)*ts, 0, -ts/4);
+ bld.end();
+ bld.begin(GL::TRIANGLE_STRIP);
+ bld.vertex(0, -ts/2, ts/4);
+ bld.vertex(0, -ts/2, -ts/4);
+ bld.vertex(0, (edit_size+0.5)*ts, ts/4);
+ bld.vertex(0, (edit_size+0.5)*ts, -ts/4);
+ bld.end();
+ if(edit_size>0)
+ {
+ bld.begin(GL::TRIANGLE_STRIP);
+ bld.vertex(-ts/2, edit_size*ts, ts/4);
+ bld.vertex(-ts/2, edit_size*ts, -ts/4);
+ bld.vertex((edit_size+0.5)*ts, edit_size*ts, ts/4);
+ bld.vertex((edit_size+0.5)*ts, edit_size*ts, -ts/4);
+ bld.end();
+ bld.begin(GL::TRIANGLE_STRIP);
+ bld.vertex(edit_size*ts, -ts/2, ts/4);
+ bld.vertex(edit_size*ts, -ts/2, -ts/4);
+ bld.vertex(edit_size*ts, (edit_size+0.5)*ts, ts/4);
+ bld.vertex(edit_size*ts, (edit_size+0.5)*ts, -ts/4);
+ bld.end();
+ }
+ }
+}
+
+void TerrainTool::key_press(unsigned key)
+{
+ if(key==Input::KEY_PLUS)
+ {
+ ++edit_size;
+ update_marker();
+ }
+ else if(key==Input::KEY_MINUS)
+ {
+ if(edit_size>0)
+ {
+ --edit_size;
+ update_marker();
+ }
+ }
+ else
+ {
+ bool shift_was_held = shift_held;
+ Tool::key_press(key);
+ if(shift_held!=shift_was_held)
+ update_marker();
+ }
+}
+
+void TerrainTool::key_release(unsigned key)
+{
+ bool shift_was_held = shift_held;
+ Tool::key_release(key);
+ if(shift_held!=shift_was_held)
+ update_marker();
+}
+