2 #include <msp/gl/meshbuilder.h>
3 #include <msp/input/keys.h>
5 #include "terraintool.h"
11 TerrainTool::TerrainTool(Designer &d, Input::Keyboard &k, Input::Mouse &m, Terrain &t):
14 marker((GL::VERTEX3, GL::COLOR4_UBYTE)),
18 designer.get_layout_3d().get_scene().add(*this);
20 float ts = terrain.get_type().get_tile_size();
21 GL::MeshBuilder bld(marker);
22 bld.begin(GL::TRIANGLE_STRIP);
23 bld.vertex(-ts/2, 0, -ts/4);
24 bld.vertex(ts/2, 0, -ts/4);
25 bld.vertex(-ts/2, 0, ts/4);
26 bld.vertex(ts/2, 0, ts/4);
28 bld.begin(GL::TRIANGLE_STRIP);
29 bld.vertex(0, -ts/2, -ts/4);
30 bld.vertex(0, ts/2, -ts/4);
31 bld.vertex(0, -ts/2, ts/4);
32 bld.vertex(0, ts/2, ts/4);
36 TerrainTool::~TerrainTool()
38 designer.get_layout_3d().get_scene().remove(*this);
41 void TerrainTool::button_press(unsigned btn)
46 drag_start = pointer.y;
50 void TerrainTool::button_release(unsigned btn)
56 void TerrainTool::pointer_motion()
60 float d = (pointer.y-drag_start)*20;
64 float elev = terrain.get_node_elevation(highlight_node);
65 float eg = terrain.get_type().get_elevation_granularity();
67 terrain.set_node_elevation(highlight_node, elev, true);
68 marker_position = terrain.get_node_position(highlight_node);
70 drag_start = pointer.y;
75 Ray ray = designer.get_view().create_ray(pointer.x, pointer.y);
76 highlight_node = terrain.get_closest_node(ray);
77 marker_position = terrain.get_node_position(highlight_node);
81 void TerrainTool::render(GL::Renderer &renderer, const GL::Tag &tag) const
86 GL::Renderer::Push push(renderer);
88 renderer.matrix_stack() *= GL::Matrix::translation(marker_position);
89 marker.draw(renderer);