Line data Source code
1 : #include "ObjectInterpreter.hpp"
2 : #include <boost/filesystem.hpp>
3 : #include <boost/filesystem/fstream.hpp>
4 :
5 : namespace HLR
6 : {
7 : namespace PointCloud
8 : {
9 : namespace
10 : {
11 : std::optional<CGAL::Surface_mesh<CGAL::Simple_cartesian<double>::Point_3>>
12 : get_static_polyhedron();
13 : }
14 :
15 2 : std::vector<Object> ObjectInterpreter::get_current_objects()
16 : {
17 2 : merge_objects();
18 2 : return current_objects;
19 : }
20 :
21 3 : std::vector<Object> ObjectInterpreter::get_changed_objects()
22 : {
23 3 : merge_objects();
24 6 : std::vector<Object> changed_objects;
25 3 : if (!history.empty())
26 : {
27 6 : for (const auto& i : current_objects)
28 : {
29 3 : bool is_new = true;
30 8 : for (const auto& j : history[0])
31 : {
32 5 : if (i.id == j.id)
33 : {
34 0 : is_new = false;
35 0 : if (i != j)
36 : {
37 0 : changed_objects.push_back(i);
38 : }
39 : }
40 : }
41 3 : if (is_new)
42 : {
43 3 : changed_objects.push_back(i);
44 : }
45 : }
46 3 : return changed_objects;
47 : }
48 0 : return current_objects;
49 : }
50 :
51 5 : void ObjectInterpreter::merge_objects()
52 : {
53 2 : static auto polyhedron = get_static_polyhedron().value_or(
54 6 : CGAL::Surface_mesh<CGAL::Simple_cartesian<double>::Point_3>{});
55 :
56 5 : history.push_back(std::move(current_objects));
57 :
58 10 : Object object;
59 5 : object.id = 0;
60 5 : object.polyhedron = polyhedron;
61 5 : object.speed = std::nullopt;
62 5 : object.is_cup = false;
63 5 : object.is_deleted = false;
64 5 : current_objects.push_back(object);
65 5 : }
66 : namespace
67 : {
68 : std::optional<CGAL::Surface_mesh<CGAL::Simple_cartesian<double>::Point_3>>
69 1 : get_static_polyhedron() try
70 : {
71 1 : boost::system::error_code ec;
72 2 : auto path = boost::filesystem::read_symlink("/proc/self/exe", ec);
73 :
74 1 : if (!ec)
75 : {
76 1 : path.remove_filename();
77 1 : path /= "poly.off";
78 : }
79 : else
80 : {
81 0 : path = "poly.off";
82 : }
83 :
84 2 : boost::filesystem::ifstream poly_stream{path};
85 :
86 2 : CGAL::Surface_mesh<CGAL::Simple_cartesian<double>::Point_3> polyhedron;
87 1 : poly_stream >> polyhedron;
88 :
89 1 : return polyhedron;
90 : }
91 0 : catch (...)
92 : {
93 0 : return std::nullopt;
94 : }
95 : } // namespace
96 :
97 : } // namespace PointCloud
98 3 : } // namespace HLR
|