2 #include "background.hpp"
3 #include "canvas/canvas_patch.hpp"
4 #include "canvas/appearance.hpp"
5 #include "clipper/clipper.hpp"
6 #include "common/common.hpp"
7 #include "util/msd_animator.hpp"
12 #include <glm/glm.hpp>
14 #include <unordered_map>
25 float cam_azimuth = 90;
26 float cam_elevation = 45;
27 float cam_distance = 20;
34 Color solder_mask_color = {0, .5, 0};
35 Color substrate_color = {.2, .15, 0};
36 bool show_solder_mask =
true;
37 bool show_silkscreen =
true;
38 bool show_substrate =
true;
39 bool show_models =
true;
40 bool show_solder_paste =
true;
41 bool use_layer_colors =
false;
42 bool smooth_zoom =
false;
43 float highlight_intensity = .5;
45 Color background_top_color;
46 Color background_bottom_color;
48 void request_push()
override;
49 void update2(
const class Board &brd);
51 void update_packages();
52 void set_highlights(
const std::set<UUID> &pkgs);
53 enum class Projection { PERSP, ORTHO };
54 Projection projection = Projection::PERSP;
55 void inc_cam_azimuth(
float v);
58 void set_msaa(
unsigned int samples);
60 void load_models_async(
class Pool *pool);
64 void clear_3d_models();
66 typedef sigc::signal<void, bool> type_signal_models_loading;
67 type_signal_models_loading signal_models_loading()
69 return s_signal_models_loading;
76 Vertex(
float ix,
float iy) : x(ix), y(iy)
82 std::vector<Vertex> tris;
83 std::vector<Vertex> walls;
85 float thickness = 0.035;
87 float explode_mul = 0;
93 : x(ix), y(iy), z(iz), r(ir), g(ig), b(ib), _pad(0)
104 } __attribute__((packed));
108 ModelTransform(
float ix,
float iy,
float a,
bool flip,
bool highlight)
109 : x(ix), y(iy), angle(a), flags(flip | (highlight << 1))
123 } __attribute__((packed));
125 int _animate_step(GdkFrameClock *frame_clock);
130 void push()
override;
131 bool needs_push =
false;
132 bool needs_view_all =
false;
141 void on_size_allocate(Gtk::Allocation &alloc)
override;
142 void on_realize()
override;
143 bool on_render(
const Glib::RefPtr<Gdk::GLContext> &context)
override;
144 bool on_button_press_event(GdkEventButton *button_event)
override;
145 bool on_motion_notify_event(GdkEventMotion *motion_event)
override;
146 bool on_button_release_event(GdkEventButton *button_event)
override;
147 bool on_scroll_event(GdkEventScroll *scroll_event)
override;
149 glm::vec2 pointer_pos_orig;
150 float cam_azimuth_orig;
151 float cam_elevation_orig;
154 glm::vec2 center_orig;
155 glm::vec3 cam_normal;
157 std::pair<glm::vec3, glm::vec3> bbox;
158 float package_height_max = 0;
160 enum class PanMode { NONE, MOVE, ROTATE };
161 PanMode pan_mode = PanMode::NONE;
167 float zoom_animation_cam_dist_orig = 1;
171 GLuint depthrenderbuffer;
172 unsigned int num_samples = 1;
173 bool needs_resize =
false;
175 void resize_buffers();
179 void prepare_layer(
int layer);
180 void prepare_soldermask(
int layer);
181 void prepare_packages();
182 float get_layer_offset(
int layer);
183 const class Board *brd =
nullptr;
184 void add_path(
int layer,
const ClipperLib::Path &path);
185 bool layer_is_visible(
int layer)
const;
186 Color get_layer_color(
int layer)
const;
187 float get_layer_thickness(
int layer)
const;
189 void load_3d_model(
const std::string &filename,
const std::string &filename_abs);
190 void load_models_thread(std::map<std::string, std::string> model_filenames);
192 std::set<UUID> packages_highlight;
194 std::unordered_map<int, Layer3D> layers;
196 std::mutex models_loading_mutex;
197 std::vector<FaceVertex> face_vertex_buffer;
198 std::vector<unsigned int> face_index_buffer;
199 std::map<std::string, std::pair<size_t, size_t>> models;
201 Glib::Dispatcher models_loading_dispatcher;
203 std::vector<ModelTransform> package_transforms;
206 std::map<std::string, std::pair<size_t, size_t>>
207 package_transform_idxs;
210 type_signal_models_loading s_signal_models_loading;