Horizon
canvas_gl.hpp
1 #pragma once
2 #include "canvas.hpp"
3 #include "drag_selection.hpp"
4 #include "grid.hpp"
5 #include "marker.hpp"
6 #include "triangle.hpp"
7 #include <gtkmm.h>
8 
9 namespace horizon {
10 class CanvasGL : public Canvas, public Gtk::GLArea {
11  friend Grid;
12  friend DragSelection;
13  friend SelectablesRenderer;
14  friend TriangleRenderer;
15  friend MarkerRenderer;
16  friend Markers;
17 
18 public:
19  CanvasGL();
20 
21  enum class SelectionMode { HOVER, NORMAL };
22  SelectionMode selection_mode = SelectionMode::HOVER;
23 
24  enum class SelectionTool { BOX, LASSO, PAINT };
25  SelectionTool selection_tool = SelectionTool::BOX;
26 
27  enum class SelectionQualifier { INCLUDE_ORIGIN, INCLUDE_BOX, TOUCH_BOX, AUTO };
28  SelectionQualifier selection_qualifier = SelectionQualifier::INCLUDE_ORIGIN;
29 
30  enum class HighlightMode { HIGHLIGHT, DIM, SHADOW };
31  void set_highlight_mode(HighlightMode mode);
32  HighlightMode get_highlight_mode() const;
33  void set_highlight_enabled(bool x);
34 
35  std::set<SelectableRef> get_selection();
36  void set_selection(const std::set<SelectableRef> &sel, bool emit = true);
37  void set_cursor_pos(const Coordi &c);
38  void set_cursor_external(bool v);
39  Coordi get_cursor_pos();
40  Coordf get_cursor_pos_win();
41  Target get_current_target();
42  void set_selection_allowed(bool a);
43  std::pair<float, Coordf> get_scale_and_offset();
44  void set_scale_and_offset(float sc, Coordf ofs);
45  Coordi snap_to_grid(const Coordi &c);
46 
47  typedef sigc::signal<void> type_signal_selection_changed;
48  type_signal_selection_changed signal_selection_changed()
49  {
50  return s_signal_selection_changed;
51  }
52 
53  typedef sigc::signal<void, const Coordi &> type_signal_cursor_moved;
54  type_signal_cursor_moved signal_cursor_moved()
55  {
56  return s_signal_cursor_moved;
57  }
58 
59  typedef sigc::signal<void, unsigned int> type_signal_grid_mul_changed;
60  type_signal_grid_mul_changed signal_grid_mul_changed()
61  {
62  return s_signal_grid_mul_changed;
63  }
64  unsigned int get_grid_mul() const
65  {
66  return grid.mul;
67  }
68 
69  typedef sigc::signal<std::string, ObjectType, UUID> type_signal_request_display_name;
70  type_signal_request_display_name signal_request_display_name()
71  {
72  return s_signal_request_display_name;
73  }
74 
75  void center_and_zoom(const Coordi &center);
76  void zoom_to_bbox(const Coordi &a, const Coordi &b);
77 
78  Glib::PropertyProxy<int> property_work_layer()
79  {
80  return p_property_work_layer.get_proxy();
81  }
82  Glib::PropertyProxy<uint64_t> property_grid_spacing()
83  {
84  return p_property_grid_spacing.get_proxy();
85  }
86  Glib::PropertyProxy<float> property_layer_opacity()
87  {
88  return p_property_layer_opacity.get_proxy();
89  }
90  Markers markers;
91  void update_markers() override;
92 
93  std::set<SelectableRef> get_selection_at(const Coordi &c);
94  Coordf screen2canvas(const Coordf &p) const;
95  void update_cursor_pos(double x, double y);
96 
97  void set_background_color(const Color &c);
98  void set_grid_color(const Color &c);
99  void set_grid_style(Grid::Style st);
100  void set_grid_alpha(float a);
101 
102  void set_highlight_dim(float a);
103  void set_highlight_shadow(float a);
104  void set_highlight_lighten(float a);
105 
106  void set_msaa(unsigned int samples);
107 
108  void inhibit_drag_selection();
109 
110  Gdk::ModifierType grid_fine_modifier = Gdk::MOD1_MASK;
111 
112 protected:
113  void push() override;
114  void request_push() override;
115 
116 private:
117  static const int MAT3_XX = 0;
118  static const int MAT3_X0 = 2;
119  static const int MAT3_YY = 4;
120  static const int MAT3_Y0 = 5;
121 
122  float width, height;
123  std::array<float, 9> screenmat;
124  float scale = 1e-5;
125  Coord<float> offset;
126  Coord<float> cursor_pos;
127  Coord<int64_t> cursor_pos_grid;
128  bool cursor_external = false;
129  bool warped = false;
130 
131  GLuint renderbuffer;
132  GLuint stencilrenderbuffer;
133  GLuint fbo;
134  unsigned int num_samples = 4;
135  bool needs_resize = false;
136  enum PushFilter {
137  PF_NONE = 0,
138  PF_TRIANGLES = (1 << 0),
139  PF_CURSOR = (1 << 1),
140  PF_SELECTABLES = (1 << 2),
141  PF_MARKER = (1 << 3),
142  PF_DRAG_SELECTION = (1 << 4),
143  PF_ALL = 0xff
144  };
145  PushFilter push_filter = PF_ALL;
146  void request_push(PushFilter filter);
147 
148  void resize_buffers();
149 
150  Color background_color = Color::new_from_int(0, 24, 64);
151  Grid grid;
152  DragSelection drag_selection;
153  SelectablesRenderer selectables_renderer;
154  TriangleRenderer triangle_renderer;
155 
156  MarkerRenderer marker_renderer;
157 
158  void pan_drag_begin(GdkEventButton *button_event);
159  void pan_drag_end(GdkEventButton *button_event);
160  void pan_drag_move(GdkEventMotion *motion_event);
161  void pan_drag_move(GdkEventScroll *scroll_event);
162  void pan_zoom(GdkEventScroll *scroll_event, bool to_cursor = true);
163  void cursor_move(GdkEvent *motion_event);
164  void hover_prelight_update(GdkEvent *motion_event);
165  bool pan_dragging = false;
166  Coord<float> pan_pointer_pos_orig;
167  Coord<float> pan_offset_orig;
168 
169  bool selection_allowed = true;
170  Glib::Property<int> p_property_work_layer;
171  Glib::Property<uint64_t> p_property_grid_spacing;
172  Glib::Property<float> p_property_layer_opacity;
173 
174  Gtk::Menu *clarify_menu;
175 
176  HighlightMode highlight_mode = HighlightMode::HIGHLIGHT;
177  bool highlight_enabled = false;
178  float highlight_dim = .5;
179  float highlight_shadow = .3;
180  float highlight_lighten = .3;
181 
182  bool drag_selection_inhibited = false;
183 
184 protected:
185  void on_size_allocate(Gtk::Allocation &alloc) override;
186  void on_realize() override;
187  bool on_render(const Glib::RefPtr<Gdk::GLContext> &context) override;
188  bool on_button_press_event(GdkEventButton *button_event) override;
189  bool on_button_release_event(GdkEventButton *button_event) override;
190  bool on_motion_notify_event(GdkEventMotion *motion_event) override;
191  bool on_scroll_event(GdkEventScroll *scroll_event) override;
192  Glib::RefPtr<Gdk::GLContext> on_create_context() override;
193 
194  type_signal_selection_changed s_signal_selection_changed;
195  type_signal_cursor_moved s_signal_cursor_moved;
196  type_signal_grid_mul_changed s_signal_grid_mul_changed;
197  type_signal_request_display_name s_signal_request_display_name;
198 };
199 } // namespace horizon
Definition: target.hpp:6
Definition: grid.hpp:6
Definition: selectables.hpp:85
Definition: canvas_gl.hpp:10
Definition: marker.hpp:35
Definition: canvas.hpp:17
Definition: drag_selection.hpp:8
Definition: marker.hpp:51
Definition: block.cpp:7
Definition: triangle.hpp:91
Definition: common.hpp:205