Euphoria
dump.h
Go to the documentation of this file.
1 #pragma once
2 
3 
4 
5 #include <optional>
6 #include <memory>
7 #include <fstream>
8 
9 #include "base/vec2.h"
10 #include "base/vec3.h"
11 #include "base/rgb.h"
12 #include "base/colors.h"
13 
14 namespace eu
15 {
16  struct Plane;
17  struct Ray3f;
18 }
19 
20 namespace eu::core::dump2d
21 {
22  namespace strokes
23  {
24  std::vector<int> create_dash(int size);
25  }
26 
27  struct Poly
28  {
30  std::optional<Rgbi> fill_color;
31  bool is_closed = false;
32  float stroke_width = 1.0f;
33 
34  std::vector<int> stroke;
35  std::vector<vec2f> points;
36 
37  Poly& set_stroke(const std::vector<int>& new_stroke);
38 
39  Poly& close();
40  Poly& fill(const Rgbi& fill_color);
41  };
42 
43  struct Text
44  {
46  std::string label;
48 
49  Text(const vec2f& p, const std::string& t, const Rgbi& c = NamedColor::black);
50  };
51 
52  struct Circle
53  {
55  float radius;
56  std::optional<Rgbi> line_color;
57  std::optional<Rgbi> fill_color;
58 
59  Circle(const vec2f& p, float r, std::optional<Rgbi> fill = std::nullopt);
60 
61  Circle& set_line_color(const Rgbi& lc);
62  };
63 
64  struct Group;
65 
66  // todo(Gustav): replace with std::variant
67  struct Item
68  {
69  std::shared_ptr<dump2d::Poly> poly;
70  std::shared_ptr<dump2d::Text> text;
71  std::shared_ptr<dump2d::Group> group;
72  std::shared_ptr<dump2d::Circle> circle;
73 
74  explicit Item(const dump2d::Poly& p);
75  explicit Item(const dump2d::Text& p);
76  explicit Item(const dump2d::Group& g);
77  explicit Item(const dump2d::Circle& c);
78  };
79 
80  const Poly* as_poly(const Item* item);
81  const Text* as_text(const Item* item);
82  const Group* as_group(const Item* item);
83  const Circle* as_circle(const Item* item);
84 
85  template<typename TBase>
86  struct AddWrapper
87  {
88  template<typename TItem>
89  TBase& operator<<(const TItem& sub_item)
90  {
91  return static_cast<TBase*>(this)->add(Item{sub_item});
92  }
93  };
94 
95  struct Group : public AddWrapper<Group>
96  {
97  std::vector<Item> items;
98 
99  Group& add(const Item& item);
100  };
101 
102  struct Dumper : AddWrapper<Dumper>
103  {
105  std::vector<Item> items;
106  bool add_axis_when_writing = false;
107  int point_size = -1;
108  bool point_text = false;
109  float grid_x =-1;
110  float grid_y =-1;
111 
112  Dumper& add_axis();
113  Dumper& add_grid(float xy);
114  Dumper& enable_points_rendering(int size=3);
115  Dumper& add(const Item& item);
116 
117  void write(const std::string& path, int width=1280, int height=1024, int space = 6) const;
118 
120  [[nodiscard]] std::pair<vec2f, vec2f> calc_size_and_offset() const;
121  };
122 }
123 
125 {
126  struct Dumper
127  {
128  std::ofstream file;
129 
130  explicit Dumper(const std::string& path);
132 
133  Dumper(const Dumper&) = delete;
134  Dumper(Dumper&&) = delete;
135  void operator=(const Dumper&) = delete;
136  void operator=(Dumper&&) = delete;
137 
138  void add_sphere(const vec3f& p, float radius, const Rgbi& color);
139  auto add_lines(const std::vector<vec3f>& lines, const Rgbi& color) -> void;
140  void add_plane(const Plane& plane, const Rgbi& color);
141  void add_arrow(const Ray3f& ray, const Rgbi& color);
142 
143  void add_axis();
144  void add_grid();
145  };
146 }
std::vector< int > create_dash(int size)
Definition: dump.cc:28
const Text * as_text(const Item *item)
Definition: dump.cc:70
const Poly * as_poly(const Item *item)
Definition: dump.cc:69
const Group * as_group(const Item *item)
Definition: dump.cc:71
const Circle * as_circle(const Item *item)
Definition: dump.cc:72
Definition: assert.h:90
Definition: plane.h:8
Definition: ray.h:37
Definition: rgb.h:26
TBase & operator<<(const TItem &sub_item)
Definition: dump.h:89
std::optional< Rgbi > line_color
Definition: dump.h:56
Circle(const vec2f &p, float r, std::optional< Rgbi > fill=std::nullopt)
Definition: dump.cc:61
Circle & set_line_color(const Rgbi &lc)
Definition: dump.cc:56
std::optional< Rgbi > fill_color
Definition: dump.h:57
Dumper & add(const Item &item)
Definition: dump.cc:275
std::vector< Item > items
Definition: dump.h:105
void write(const std::string &path, int width=1280, int height=1024, int space=6) const
Definition: dump.cc:300
bool add_axis_when_writing
Definition: dump.h:106
Dumper & add_grid(float xy)
Definition: dump.cc:262
Dumper & add_axis()
Definition: dump.cc:256
std::pair< vec2f, vec2f > calc_size_and_offset() const
calculate total area size and offset so that x+offset will never be lower than 0
Definition: dump.cc:282
Dumper & enable_points_rendering(int size=3)
Definition: dump.cc:269
Group & add(const Item &item)
Definition: dump.cc:74
std::vector< Item > items
Definition: dump.h:97
std::shared_ptr< dump2d::Poly > poly
Definition: dump.h:69
std::shared_ptr< dump2d::Group > group
Definition: dump.h:71
std::shared_ptr< dump2d::Text > text
Definition: dump.h:70
Item(const dump2d::Poly &p)
Definition: dump.cc:64
std::shared_ptr< dump2d::Circle > circle
Definition: dump.h:72
Poly & close()
Definition: dump.cc:46
std::optional< Rgbi > fill_color
Definition: dump.h:30
std::vector< vec2f > points
Definition: dump.h:35
Poly & fill(const Rgbi &fill_color)
Definition: dump.cc:40
Poly & set_stroke(const std::vector< int > &new_stroke)
Definition: dump.cc:34
std::vector< int > stroke
Definition: dump.h:34
float stroke_width
Definition: dump.h:32
std::string label
Definition: dump.h:46
Text(const vec2f &p, const std::string &t, const Rgbi &c=NamedColor::black)
Definition: dump.cc:52
void operator=(Dumper &&)=delete
std::ofstream file
Definition: dump.h:128
Dumper(Dumper &&)=delete
void add_arrow(const Ray3f &ray, const Rgbi &color)
void operator=(const Dumper &)=delete
void add_plane(const Plane &plane, const Rgbi &color)
Dumper(const Dumper &)=delete
auto add_lines(const std::vector< vec3f > &lines, const Rgbi &color) -> void
Dumper(const std::string &path)
void add_sphere(const vec3f &p, float radius, const Rgbi &color)
Definition: vec2.h:33
Definition: vec3.h:48