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 <atomic>
13 #include <thread>
14 
15 namespace horizon {
16 class Canvas3D : public Gtk::GLArea, public Canvas3DBase {
17 public:
18  friend class CoverRenderer;
19  friend class WallRenderer;
20  friend class FaceRenderer;
21  friend class BackgroundRenderer;
22  Canvas3D();
23 
24  float far;
25  float near;
26 
27  bool smooth_zoom = false;
28 
29  void request_push();
30  void update(const class Board &brd);
31  void update_packages();
32  void set_highlights(const std::set<UUID> &pkgs);
33 
34  void inc_cam_azimuth(float v);
35  void set_appearance(const Appearance &a);
36 
37  void set_msaa(unsigned int samples);
38 
39  void load_models_async(class IPool &pool);
40 
41  void view_all();
42 
43  glm::vec2 get_center_shift(const glm::vec2 &shift) const;
44 
45  typedef sigc::signal<void, unsigned int, unsigned int> type_signal_models_loading;
46  type_signal_models_loading signal_models_loading()
47  {
48  return s_signal_models_loading;
49  }
50 
51  typedef sigc::signal<void, UUID> type_signal_package_select;
52  type_signal_package_select signal_package_select()
53  {
54  return s_signal_package_select;
55  }
56 
57  typedef sigc::signal<void, glm::dvec3> type_signal_point_select;
58  type_signal_point_select signal_point_select()
59  {
60  return s_signal_point_select;
61  }
62 
63  ~Canvas3D();
64 
65 private:
66  bool needs_push = false;
67  bool needs_view_all = false;
68  int a_get_scale_factor() const override;
69  void redraw() override;
70 
71  void on_size_allocate(Gtk::Allocation &alloc) override;
72  void on_realize() override;
73  bool on_render(const Glib::RefPtr<Gdk::GLContext> &context) override;
74  bool on_button_press_event(GdkEventButton *button_event) override;
75  bool on_motion_notify_event(GdkEventMotion *motion_event) override;
76  bool on_button_release_event(GdkEventButton *button_event) override;
77  bool on_scroll_event(GdkEventScroll *scroll_event) override;
78 
79  Glib::RefPtr<Gtk::GestureDrag> gesture_drag;
80  glm::vec2 gesture_drag_center_orig;
81  void drag_gesture_begin_cb(GdkEventSequence *seq);
82  void drag_gesture_update_cb(GdkEventSequence *seq);
83 
84  Glib::RefPtr<Gtk::GestureZoom> gesture_zoom;
85  float gesture_zoom_cam_dist_orig = 1;
86  void zoom_gesture_begin_cb(GdkEventSequence *seq);
87  void zoom_gesture_update_cb(GdkEventSequence *seq);
88 
89  Glib::RefPtr<Gtk::GestureRotate> gesture_rotate;
90  float gesture_rotate_cam_azimuth_orig = 0;
91  float gesture_rotate_cam_elevation_orig = 0;
92  glm::vec2 gesture_rotate_pos_orig;
93  void rotate_gesture_begin_cb(GdkEventSequence *seq);
94  void rotate_gesture_update_cb(GdkEventSequence *seq);
95 
96  glm::vec2 pointer_pos_orig;
97  float cam_azimuth_orig;
98  float cam_elevation_orig;
99 
100  glm::vec2 center_orig;
101 
102  enum class PanMode { NONE, MOVE, ROTATE };
103  PanMode pan_mode = PanMode::NONE;
104 
105  MSDAnimator zoom_animator;
106  float zoom_animation_cam_dist_orig = 1;
107 
108  static int zoom_tick_cb(GtkWidget *cwidget, GdkFrameClock *frame_clock, gpointer user_data);
109  int zoom_animate_step(GdkFrameClock *frame_clock);
110 
111  bool needs_resize = false;
112 
113 
114  void prepare();
115 
116  void load_models_thread(std::map<std::string, std::string> model_filenames);
117 
118 
119  Glib::Dispatcher models_loading_dispatcher;
120 
121  type_signal_models_loading s_signal_models_loading;
122  unsigned int n_models_loading = 0;
123  std::atomic<unsigned int> i_model_loading;
124 
125  std::thread model_load_thread;
126  std::atomic<bool> stop_model_load_thread;
127 
128  type_signal_package_select s_signal_package_select;
129  type_signal_point_select s_signal_point_select;
130  int pick_x, pick_y;
131 };
132 } // namespace horizon
Definition: appearance.hpp:7
Definition: background_renderer.hpp:5
Definition: board.hpp:43
Definition: canvas3d_base.hpp:20
Definition: canvas3d.hpp:16
Definition: cover_renderer.hpp:7
Definition: face_renderer.hpp:6
Definition: ipool.hpp:14
Definition: msd_animator.hpp:5
Definition: wall_renderer.hpp:7