Horizon
Loading...
Searching...
No Matches
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
18namespace horizon {
19class Canvas3D : public Gtk::GLArea, public Canvas3DBase {
20public:
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
92private:
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:15
Definition input_devices_prefs.hpp:6
Definition msd_animator.hpp:5
Definition wall_renderer.hpp:7
Definition msd.hpp:13
Definition spacenav_prefs.hpp:4