Horizon
canvas3d.hpp
1 #pragma once
2 #include "canvas_mesh.hpp"
3 #include "canvas/appearance.hpp"
4 #include "clipper/clipper.hpp"
5 #include "common/common.hpp"
6 #include "util/msd_animator.hpp"
7 #include <epoxy/gl.h>
8 #include <glm/glm.hpp>
9 #include <gtkmm.h>
10 #include <unordered_map>
11 #include "canvas3d_base.hpp"
12 #include "spacenav_prefs.hpp"
13 #include "canvas/input_devices_prefs.hpp"
14 #include "util/scroll_direction.hpp"
15 #include <atomic>
16 #include <thread>
17 
18 namespace horizon {
19 class Canvas3D : public Gtk::GLArea, public Canvas3DBase {
20 public:
21  friend class CoverRenderer;
22  friend class WallRenderer;
23  friend class FaceRenderer;
24  friend class BackgroundRenderer;
25  Canvas3D();
26 
27  float far;
28  float near;
29 
30  bool smooth_zoom = false;
31  bool touchpad_pan = false;
32  SpacenavPrefs spacenav_prefs;
33 
34  void request_push();
35  void update(const class Board &brd);
36  void update_packages();
37  void set_highlights(const std::set<UUID> &pkgs);
38 
39  void animate_to_azimuth_elevation_abs(float az, float el);
40  void animate_to_azimuth_elevation_rel(float az, float el);
41  void animate_zoom_step(int inc);
42  void animate_center_rel(const glm::vec2 &d);
43  void set_appearance(const Appearance &a);
44 
45  void set_msaa(unsigned int samples);
46 
47  void load_models_async(class IPool &pool);
48 
49  void view_all();
50 
51  void set_msd_params(const MSD::Params &params);
52 
53  glm::vec2 get_center_shift(const glm::vec2 &shift) const;
54 
55  typedef sigc::signal<void, unsigned int, unsigned int> type_signal_models_loading;
56  type_signal_models_loading signal_models_loading()
57  {
58  return s_signal_models_loading;
59  }
60  type_signal_models_loading signal_layers_loading()
61  {
62  return s_signal_layers_loading;
63  }
64 
65  typedef sigc::signal<void, UUID> type_signal_package_select;
66  type_signal_package_select signal_package_select()
67  {
68  return s_signal_package_select;
69  }
70 
71  typedef sigc::signal<void, glm::dvec3> type_signal_point_select;
72  type_signal_point_select signal_point_select()
73  {
74  return s_signal_point_select;
75  }
76 
77  typedef sigc::signal<void, unsigned int> type_signal_spacenav_button_press;
78  type_signal_spacenav_button_press signal_spacenav_button_press()
79  {
80  return s_signal_spacenav_button_press;
81  }
82 
83  bool get_spacenav_available() const
84  {
85  return have_spnav;
86  }
87 
88  InputDevicesPrefs input_devices_prefs;
89 
90  ~Canvas3D();
91 
92 private:
93  bool needs_push = false;
94  bool needs_view_all = false;
95  int a_get_scale_factor() const override;
96  void redraw() override;
97 
98  void on_size_allocate(Gtk::Allocation &alloc) override;
99  void on_realize() override;
100  bool on_render(const Glib::RefPtr<Gdk::GLContext> &context) override;
101  bool on_button_press_event(GdkEventButton *button_event) override;
102  bool on_motion_notify_event(GdkEventMotion *motion_event) override;
103  bool on_button_release_event(GdkEventButton *button_event) override;
104  bool on_scroll_event(GdkEventScroll *scroll_event) override;
105 
106  void pan_zoom(GdkEventScroll *scroll_event, ScrollDirection direction);
107  void pan_drag_move(GdkEventScroll *scroll_event, ScrollDirection direction);
108  void pan_rotate(GdkEventScroll *scroll_event, ScrollDirection direction);
109 
110  Glib::RefPtr<Gtk::GestureDrag> gesture_drag;
111  glm::vec2 gesture_drag_center_orig;
112  void drag_gesture_begin_cb(GdkEventSequence *seq);
113  void drag_gesture_update_cb(GdkEventSequence *seq);
114 
115  Glib::RefPtr<Gtk::GestureZoom> gesture_zoom;
116  float gesture_zoom_cam_dist_orig = 1;
117  void zoom_gesture_begin_cb(GdkEventSequence *seq);
118  void zoom_gesture_update_cb(GdkEventSequence *seq);
119 
120  Glib::RefPtr<Gtk::GestureRotate> gesture_rotate;
121  float gesture_rotate_cam_azimuth_orig = 0;
122  float gesture_rotate_cam_elevation_orig = 0;
123  glm::vec2 gesture_rotate_pos_orig;
124  void rotate_gesture_begin_cb(GdkEventSequence *seq);
125  void rotate_gesture_update_cb(GdkEventSequence *seq);
126 
127  glm::vec2 pointer_pos_orig;
128  float cam_azimuth_orig;
129  float cam_elevation_orig;
130 
131  glm::vec2 center_orig;
132 
133  enum class PanMode { NONE, MOVE, ROTATE };
134  PanMode pan_mode = PanMode::NONE;
135 
136 
137  bool needs_resize = false;
138 
139  MSDAnimator azimuth_animator;
140  MSDAnimator elevation_animator;
141  MSDAnimator zoom_animator;
142  MSDAnimator cx_animator;
143  MSDAnimator cy_animator;
144 
145  std::vector<MSDAnimator *> animators;
146  int animate_step(GdkFrameClock *frame_clock);
147  static int anim_tick_cb(GtkWidget *cwidget, GdkFrameClock *frame_clock, gpointer user_data);
148  void start_anim();
149 
150  void prepare();
151 
152  void load_models_thread(std::map<std::string, std::string> model_filenames);
153 
154 
155  Glib::Dispatcher models_loading_dispatcher;
156 
157  type_signal_models_loading s_signal_models_loading;
158  type_signal_models_loading s_signal_layers_loading;
159  unsigned int n_models_loading = 0;
160  std::atomic<unsigned int> i_model_loading;
161 
162  std::thread model_load_thread;
163  std::atomic<bool> stop_model_load_thread;
164 
165  type_signal_package_select s_signal_package_select;
166  type_signal_point_select s_signal_point_select;
167  int pick_x, pick_y;
168 
169  std::map<int, CanvasMesh::Layer3D> layers_local;
170  std::set<int> layers_to_be_moved;
171  const std::map<int, CanvasMesh::Layer3D> &get_layers() const override;
172 
173  Glib::Dispatcher prepare_dispatcher;
174  std::thread prepare_thread;
175  void prepare_thread_worker();
176 
177  bool have_spnav = false;
178  void handle_spnav();
179  sigc::connection spnav_connection;
180 
181  type_signal_spacenav_button_press s_signal_spacenav_button_press;
182 };
183 } // namespace horizon
Definition: appearance.hpp:7
Definition: background_renderer.hpp:5
Definition: board.hpp:47
Definition: canvas3d_base.hpp:20
Definition: canvas3d.hpp:19
Definition: cover_renderer.hpp:7
Definition: face_renderer.hpp:6
Definition: ipool.hpp:14
Definition: input_devices_prefs.hpp:6
Definition: msd_animator.hpp:5
Definition: wall_renderer.hpp:7
std::integral_constant< decltype(T::type::value+1), T::type::value+1 > inc
An integral constant wrapper around the result of incrementing the wrapped integer T::type::value.
Definition: meta.hpp:185
Definition: msd.hpp:13
Definition: spacenav_prefs.hpp:4