X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fdesigner%2Fterraintool.cpp;h=4e339bc7de9b33abac4dea956ac624c1b5b5bec4;hb=b3f8467442aac111e9a316db0dda67d37ae240b8;hp=46076ec03c0679573161853c1485145a2aa4fce5;hpb=2220ba2f11705ea9a4e480603d43ab7ed4cf5a89;p=r2c2.git diff --git a/source/designer/terraintool.cpp b/source/designer/terraintool.cpp index 46076ec..4e339bc 100644 --- a/source/designer/terraintool.cpp +++ b/source/designer/terraintool.cpp @@ -12,25 +12,14 @@ TerrainTool::TerrainTool(Designer &d, Input::Keyboard &k, Input::Mouse &m, Terra Tool(d, k, m), terrain(t), marker((GL::VERTEX3, GL::COLOR4_UBYTE)), + edit_size(0), + marker_orientation(0), dragging(false), drag_start(0) { designer.get_layout_3d().get_scene().add(*this); - float ts = terrain.get_type().get_tile_size(); - GL::MeshBuilder bld(marker); - bld.begin(GL::TRIANGLE_STRIP); - bld.vertex(-ts/2, 0, -ts/4); - bld.vertex(ts/2, 0, -ts/4); - bld.vertex(-ts/2, 0, ts/4); - bld.vertex(ts/2, 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, -ts/2, ts/4); - bld.vertex(0, ts/2, ts/4); - bld.end(); + update_marker(); } TerrainTool::~TerrainTool() @@ -38,6 +27,104 @@ TerrainTool::~TerrainTool() designer.get_layout_3d().get_scene().remove(*this); } +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(); +} + void TerrainTool::button_press(unsigned btn) { if(btn==1) @@ -64,9 +151,30 @@ void TerrainTool::pointer_motion() float elev = terrain.get_node_elevation(highlight_node); float eg = terrain.get_type().get_elevation_granularity(); elev += eg*d; - terrain.set_node_elevation(highlight_node, elev, true); - marker_position = terrain.get_node_position(highlight_node); + if(edit_size==0) + terrain.set_node_elevation(highlight_node, elev, !shift_held); + else + { + unsigned bx = highlight_node.x-edit_size/2; + unsigned by = highlight_node.y-edit_size/2; + if(edit_size%2==0) + { + bx += highlight_node.i%2; + by += highlight_node.i/2; + } + // TODO make it possible to adjust the area without flattening it + for(unsigned y=0; y>1); } } @@ -86,5 +195,6 @@ void TerrainTool::render(GL::Renderer &renderer, const GL::Tag &tag) const GL::Renderer::Push push(renderer); renderer.matrix_stack() *= GL::Matrix::translation(marker_position); + renderer.matrix_stack() *= GL::Matrix::rotation(Angle::from_turns(marker_orientation*0.25), 0, 0, 1); marker.draw(renderer); }