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 
13 namespace horizon {
14 class Canvas3D : public Gtk::GLArea, public Canvas3DBase {
15 public:
16  friend class CoverRenderer;
17  friend class WallRenderer;
18  friend class FaceRenderer;
19  friend class BackgroundRenderer;
20  Canvas3D();
21 
22  float far;
23  float near;
24 
25  bool smooth_zoom = false;
26 
27  void request_push();
28  void update(const class Board &brd);
29  void update_packages();
30  void set_highlights(const std::set<UUID> &pkgs);
31 
32  void inc_cam_azimuth(float v);
33  void set_appearance(const Appearance &a);
34 
35  void set_msaa(unsigned int samples);
36 
37  void load_models_async(class Pool *pool);
38 
39  void view_all();
40 
41  typedef sigc::signal<void, bool> type_signal_models_loading;
42  type_signal_models_loading signal_models_loading()
43  {
44  return s_signal_models_loading;
45  }
46 
47  int _animate_step(GdkFrameClock *frame_clock);
48 
49 private:
50  bool needs_push = false;
51  bool needs_view_all = false;
52  int a_get_scale_factor() const override;
53 
54  void on_size_allocate(Gtk::Allocation &alloc) override;
55  void on_realize() override;
56  bool on_render(const Glib::RefPtr<Gdk::GLContext> &context) override;
57  bool on_button_press_event(GdkEventButton *button_event) override;
58  bool on_motion_notify_event(GdkEventMotion *motion_event) override;
59  bool on_button_release_event(GdkEventButton *button_event) override;
60  bool on_scroll_event(GdkEventScroll *scroll_event) override;
61 
62  Glib::RefPtr<Gtk::GestureDrag> gesture_drag;
63  glm::vec2 gesture_drag_center_orig;
64  glm::vec2 get_center_shift(const glm::vec2 &shift) const;
65  void drag_gesture_begin_cb(GdkEventSequence *seq);
66  void drag_gesture_update_cb(GdkEventSequence *seq);
67 
68  Glib::RefPtr<Gtk::GestureZoom> gesture_zoom;
69  float gesture_zoom_cam_dist_orig = 1;
70  void zoom_gesture_begin_cb(GdkEventSequence *seq);
71  void zoom_gesture_update_cb(GdkEventSequence *seq);
72 
73  Glib::RefPtr<Gtk::GestureRotate> gesture_rotate;
74  float gesture_rotate_cam_azimuth_orig = 0;
75  float gesture_rotate_cam_elevation_orig = 0;
76  glm::vec2 gesture_rotate_pos_orig;
77  void rotate_gesture_begin_cb(GdkEventSequence *seq);
78  void rotate_gesture_update_cb(GdkEventSequence *seq);
79  void fix_cam_elevation();
80 
81  glm::vec2 pointer_pos_orig;
82  float cam_azimuth_orig;
83  float cam_elevation_orig;
84 
85  glm::vec2 center_orig;
86 
87  enum class PanMode { NONE, MOVE, ROTATE };
88  PanMode pan_mode = PanMode::NONE;
89 
90  MSDAnimator zoom_animator;
91  float zoom_animation_cam_dist_orig = 1;
92 
93  bool needs_resize = false;
94 
95 
96  void prepare();
97 
98  void load_models_thread(std::map<std::string, std::string> model_filenames);
99 
100 
101  Glib::Dispatcher models_loading_dispatcher;
102 
103  type_signal_models_loading s_signal_models_loading;
104 };
105 } // namespace horizon
horizon::Canvas3D
Definition: canvas3d.hpp:14
horizon::MSDAnimator
Definition: msd_animator.hpp:5
horizon::Board
Definition: board.hpp:43
horizon::CoverRenderer
Definition: cover.hpp:6
horizon::FaceRenderer
Definition: face.hpp:6
horizon::BackgroundRenderer
Definition: background.hpp:5
horizon::Appearance
Definition: appearance.hpp:7
horizon::WallRenderer
Definition: wall.hpp:6
horizon::Canvas3DBase
Definition: canvas3d_base.hpp:15
horizon::Pool
Stores objects (Unit, Entity, Symbol, Part, etc.) from the pool.
Definition: pool.hpp:21