Collision Checker
serialize_polygon.cc
Go to the documentation of this file.
2 #if ENABLE_SERIALIZER
3 
4 #include <Eigen/Dense>
5 #include <istream>
6 
7 #include "collision/serialize/vector2d_export_streams.h" // redefines the stream operators for the module
8 
10 
13 
14 #include <s11n.net/s11n/proxy/std/vector.hpp>
15 #include <s11n.net/s11n/s11nlite.hpp>
16 
17 namespace collision {
18 namespace serialize {
19 ICollisionObjectExport *exportObject(const collision::Polygon &polygon) {
20  return new PolygonExport(polygon);
21 }
22 PolygonExport::PolygonExport(const Polygon &polyg) {
23  m_fields.center_x = polyg.center_x();
24  m_fields.center_y = polyg.center_y();
25 
26  for (auto &obj : polyg.getTriangleMesh()) {
27  // warning: unsafe cast
28  m_triangles.push_back(static_cast<TriangleExport *>(obj->exportThis()));
29  }
30 
31  m_vertices = polyg.getVertices();
32  m_hole_vertices = polyg.getHoleVertices();
33 }
34 
36  for (auto obj : m_triangles) {
37  if (obj) delete obj;
38  }
39 }
40 bool PolygonExport::operator()(s11nlite::node_type &dest) const {
41  typedef s11nlite::node_traits TR;
42  TR::class_name(dest, "PolygonExport");
43  for (auto el : m_triangles) {
44  if (!el) return false;
45  }
46  bool res = true;
47  res = res && s11n::list::serialize_list(dest, "triangles", m_triangles);
48  res = res && s11n::list::serialize_list(dest, "vertices", m_vertices);
49  res =
50  res && s11n::list::serialize_list(dest, "hole_vertices", m_hole_vertices);
51 
52  return res;
53 }
54 bool PolygonExport::operator()(const s11nlite::node_type &src) {
55  typedef s11nlite::node_traits TR;
56  bool res = true;
57  res =
58  res && s11n::list::deserialize_list(src, "triangles", this->m_triangles);
59  res = res && s11n::list::deserialize_list(src, "vertices", this->m_vertices);
60  res = res && s11n::list::deserialize_list(src, "hole_vertices",
61  this->m_hole_vertices);
62  return res;
63 }
64 
65 CollisionObject *PolygonExport::loadObject(void) {
66  // load all triangles without memory leaks
67  // then create the polygon using internal structures
68  // std::vector<Eigen::Vector2d> vertices;
69  // std::vector<std::vector<Eigen::Vector2d> > hole_vertices;
70  std::vector<TriangleConstPtr> mesh_triangles;
71 
72  for (auto obj : m_triangles) {
73  CollisionObject *loaded_obj_ptr = obj->loadObject();
74  if (!loaded_obj_ptr) {
75  return nullptr;
76  }
77  CollisionObjectConstPtr loaded_obj(loaded_obj_ptr);
78  if (loaded_obj->getCollisionObjectClass() != OBJ_CLASS_SHAPE) {
79  return nullptr;
80  }
81  if ((static_cast<const Shape *>(loaded_obj.get()))->type() !=
83  return nullptr;
84  }
85 
86  mesh_triangles.push_back(
87  std::static_pointer_cast<const Triangle>(loaded_obj));
88  }
89 
90  Polygon *polyg =
91  new Polygon(m_vertices, m_hole_vertices, mesh_triangles,
92  Eigen::Vector2d(m_fields.center_x, m_fields.center_y));
93  return polyg;
94 }
95 } // namespace serialize
96 } // namespace collision
97 #endif
virtual bool operator()(s11nlite::node_type &dest) const
std::vector< std::vector< Eigen::Vector2d > > m_hole_vertices
std::shared_ptr< const CollisionObject > CollisionObjectConstPtr
std::vector< ICollisionObjectExport_s11 * > m_triangles
int serialize(const test::BroadphaseFailureCCObj &bf_object, std::ostream &output_stream, const char *format=SERIALIZER_DEFAULT_FORMAT)
std::vector< Eigen::Vector2d > m_vertices
Polygon contains Triangles and Vertices.
Definition: polygon.h:29
CollisionObject * loadObject(void)