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)),
15 marker_orientation(0),
19 designer.get_layout_3d().get_scene().add(*this);
24 TerrainTool::~TerrainTool()
26 designer.get_layout_3d().get_scene().remove(*this);
29 void TerrainTool::update_marker()
32 GL::MeshBuilder bld(marker);
34 float ts = terrain.get_type().get_tile_size();
37 bld.begin(GL::TRIANGLE_STRIP);
38 bld.vertex(0, ts/2, ts/4);
39 bld.vertex(0, ts/2, -ts/4);
40 bld.vertex(0, 0, ts/4);
41 bld.vertex(0, 0, -ts/4);
42 bld.vertex(ts/2, 0, ts/4);
43 bld.vertex(ts/2, 0, -ts/4);
48 bld.begin(GL::TRIANGLE_STRIP);
49 bld.vertex(-ts/2, 0, ts/4);
50 bld.vertex(-ts/2, 0, -ts/4);
51 bld.vertex((edit_size+0.5)*ts, 0, ts/4);
52 bld.vertex((edit_size+0.5)*ts, 0, -ts/4);
54 bld.begin(GL::TRIANGLE_STRIP);
55 bld.vertex(0, -ts/2, ts/4);
56 bld.vertex(0, -ts/2, -ts/4);
57 bld.vertex(0, (edit_size+0.5)*ts, ts/4);
58 bld.vertex(0, (edit_size+0.5)*ts, -ts/4);
63 void TerrainTool::key_press(unsigned key)
65 bool shift_was_held = shift_held;
67 if(shift_held!=shift_was_held)
71 void TerrainTool::key_release(unsigned key)
73 bool shift_was_held = shift_held;
74 Tool::key_release(key);
75 if(shift_held!=shift_was_held)
79 void TerrainTool::button_press(unsigned btn)
84 drag_start = pointer.y;
88 void TerrainTool::button_release(unsigned btn)
94 void TerrainTool::pointer_motion()
98 float d = (pointer.y-drag_start)*20;
102 float elev = terrain.get_node_elevation(highlight_node);
103 float eg = terrain.get_type().get_elevation_granularity();
105 terrain.set_node_elevation(highlight_node, elev, !shift_held);
106 marker_position = terrain.get_node_position(highlight_node);
108 drag_start = pointer.y;
113 Ray ray = designer.get_view().create_ray(pointer.x, pointer.y);
114 highlight_node = terrain.get_closest_node(ray);
115 marker_position = terrain.get_node_position(highlight_node);
116 marker_orientation = highlight_node.i^(highlight_node.i>>1);
120 void TerrainTool::render(GL::Renderer &renderer, const GL::Tag &tag) const
125 GL::Renderer::Push push(renderer);
127 renderer.matrix_stack() *= GL::Matrix::translation(marker_position);
128 renderer.matrix_stack() *= GL::Matrix::rotation(Angle::from_turns(marker_orientation*0.25), 0, 0, 1);
129 marker.draw(renderer);