Horizon
canvas_mesh.hpp
1 #pragma once
2 #include "canvas/canvas_patch.hpp"
3 #include "common/common.hpp"
4 #include "clipper/clipper.hpp"
5 #include <atomic>
6 
7 namespace horizon {
8 class CanvasMesh {
9 public:
10  void update(const class Board &brd);
11  void update_only(const class Board &brd);
12  void prepare_only(std::function<void()> cb = nullptr);
13 
14  class Layer3D {
15  public:
16  class Vertex {
17  public:
18  Vertex(float ix, float iy) : x(ix), y(iy)
19  {
20  }
21 
22  float x, y;
23  };
24  std::vector<Vertex> tris;
25  std::vector<Vertex> walls;
26  void move_from(Layer3D &&other);
27  void copy_sizes_from(const Layer3D &other);
28 
29  float offset = 0;
30  float thickness = 0.035;
31  float alpha = 1;
32  float explode_mul = 0;
33  std::atomic_bool done = false;
34  };
35 
36  std::map<int, Layer3D> &get_layers()
37  {
38  return layers;
39  }
40  const std::map<int, Layer3D> &get_layers() const
41  {
42  return layers;
43  }
44  std::pair<Coordi, Coordi> get_bbox() const;
45  CanvasMesh();
46  void cancel_prepare()
47  {
48  cancel = true;
49  }
50 
51 private:
52  CanvasPatch ca;
53  std::map<int, Layer3D> layers;
54  std::atomic_bool cancel = false;
55 
56  void prepare(const class Board &brd);
57  void prepare_work(std::function<void()> cb);
58  void polynode_to_tris(const ClipperLib::PolyNode *node, int layer);
59  std::vector<int> layers_to_prepare;
60 
61  void prepare_worker(std::atomic_size_t &layer_counter, std::function<void()> cb);
62  void prepare_layer(int layer);
63  void prepare_soldermask(int layer);
64  void prepare_silkscreen(int layer, int soldermask_layer);
65  void add_path(int layer, const ClipperLib::Path &path);
66 };
67 } // namespace horizon
Definition: clipper.hpp:137
Definition: board.hpp:47
Definition: canvas_mesh.hpp:16
Definition: canvas_mesh.hpp:14
Definition: canvas_mesh.hpp:8