30 #ifndef _GranOO_LibShape_Volume_hh_
31 #define _GranOO_LibShape_Volume_hh_
38 #include <boost/version.hpp>
40 #if BOOST_VERSION >= 107400
41 #include <boost/serialization/library_version_type.hpp>
44 #include <boost/serialization/serialization.hpp>
45 #include <boost/serialization/set.hpp>
60 #define GRANOO_DECLARE_SHAPE_COLLISION() \
61 bool collide(const Volume&, Collision::Data& c) const; \
62 bool collide(const Sphere&, Collision::Data& c) const; \
63 bool collide(const Box&, Collision::Data& c) const; \
64 bool collide(const Cylinder&, Collision::Data& c) const; \
65 bool collide(const Cone&, Collision::Data& c) const; \
66 bool collide(const ConeTruncated&, Collision::Data& c) const; \
67 bool collide(const Polyhedron&, Collision::Data& c) const;
69 #define GRANOO_IMPLEMENT_SHAPE_COLLISION(CLASS) \
70 bool CLASS::collide(const Volume& v, Collision::Data& c) const \
71 {return v.collide(*this, c);} \
72 bool CLASS::collide(const Sphere& v, Collision::Data& c) const \
73 {return Collision::Dispatcher::run(*this, v, c);} \
74 bool CLASS::collide(const Box& v, Collision::Data& c) const \
75 {return Collision::Dispatcher::run(*this, v, c);} \
76 bool CLASS::collide(const Cylinder& v, Collision::Data& c) const \
77 {return Collision::Dispatcher::run(*this, v, c);} \
78 bool CLASS::collide(const Cone& v, Collision::Data& c) const \
79 {return Collision::Dispatcher::run(*this, v, c);} \
80 bool CLASS::collide(const ConeTruncated& v, Collision::Data& c) const \
81 {return Collision::Dispatcher::run(*this, v, c);} \
82 bool CLASS::collide(const Polyhedron& v, Collision::Data& c) const \
83 {return Collision::Dispatcher::run(*this, v, c);}
85 #define GRANOO_ACCESS_SHAPE_DIM(method, type, variable) \
86 void set_ ## method (const type& val) { \
87 SafeModeAssert(val >= 0., "The value must be positive"); \
88 variable = val; if (is_bounding_shape()==false) update_bounding_shape(); } \
89 GRANOO_ACCESS_GET (method, type, variable)\
90 GRANOO_ACCESS_REF (method, type, variable)
98 class Sphere;
class Box;
class Cylinder;
class Cone;
class ConeTruncated;
class Polyhedron;
133 template<Interference T>
158 template<
typename T,
typename ... Args>
void set_face_ID(
const T&, Args... args);
169 template<
class Archive>
void save(Archive&,
const unsigned int )
const;
170 template<
class Archive>
void load(Archive&,
const unsigned int);
183 template<
typename T,
typename ... Args>
186 const std::string k(key);
187 AssertMsg(
_face.count(k)==0,
"The face " + k +
" was already registered");
195 const std::string k(key);
196 AssertMsg(
_face.count(k)==0,
"The face " + k +
" was already registered");
200 inline const std::set<std::string>&
212 AssertMsg(
_face.count(name)==0,
"The face " + name +
" was already registered");
222 template<
class Archive>
225 ar << boost::serialization::base_object<Shape::Base>(*
this);
229 template<
class Archive>
232 ar >> boost::serialization::base_object<Shape::Base>(*
this);
#define AssertMsg(condition, message)
Definition: Macro.hpp:67
Definition: Tensor.hpp:62
Definition: Vector.hpp:75
virtual std::string info() const
Definition: Base.hpp:184
Definition: ConeTruncated.hpp:47
Definition: Cylinder.hpp:53
Definition: Polyhedron.hpp:54
Definition: Sphere.hpp:50
Definition: Volume.hpp:103
virtual ~Volume()
Definition: Volume.cpp:48
void copy_face_ID(const std::set< std::string > &)
Definition: Volume.hpp:217
virtual bool collide(const Cone &, Collision::Data &) const =0
virtual bool collide_inside(const Geom::Point &p1, double radius, Collision::Data &info) const =0
virtual bool collide(const Polyhedron &, Collision::Data &) const =0
const Box & get_bounding_box() const
Definition: Volume.cpp:56
bool is_volume() const
Definition: Volume.hpp:117
virtual bool collide(const Sphere &, Collision::Data &) const =0
virtual bool collide_outside(const Geom::Point &p1, double radius, Collision::Data &info) const =0
virtual bool collide(const Box &, Collision::Data &) const =0
virtual AABB aabb() const =0
double _bounding_radius
Definition: Volume.hpp:177
virtual Geom::Point farthest_point_along(const Geom::Vector &dir) const =0
std::set< std::string > _face
Definition: Volume.hpp:178
Volume(const Geom::Frame &frame)
Definition: Volume.cpp:40
virtual bool collide(const ConeTruncated &, Collision::Data &) const =0
Volume & operator=(const Volume &)
virtual void update_bounding_box()=0
Box * _bounding_box
Definition: Volume.hpp:174
BOOST_SERIALIZATION_SPLIT_MEMBER()
void add_face_ID(const std::string &)
Definition: Volume.hpp:211
bool _bounding_shape
Definition: Volume.hpp:176
void load(Archive &, const unsigned int)
Definition: Volume.hpp:231
bool is_surface() const
Definition: Volume.hpp:116
void update_bounding_shape()
Definition: Volume.cpp:96
virtual double get_greatest_dimension() const =0
virtual Interference locate(const Geom::Point &, double radius) const =0
void save(Archive &, const unsigned int) const
Definition: Volume.hpp:224
virtual bool collide(const Cylinder &, Collision::Data &) const =0
const std::set< std::string > & get_face_ID() const
Definition: Volume.hpp:201
void set_face_ID(const T &, Args... args)
Definition: Volume.hpp:185
friend class boost::serialization::access
Definition: Volume.hpp:168
bool is_bounding_shape() const
Definition: Volume.hpp:206
virtual bool collide(const Volume &, Collision::Data &) const =0
static std::string class_ID()
Definition: Volume.hpp:105
virtual Interference locate(const Geom::Point &) const =0
const Sphere & get_bounding_sphere() const
Definition: Volume.cpp:67
virtual double get_volume() const =0
virtual void compute_inertia_tensor(double density, Geom::Tensor &) const =0
bool overlap(const Sphere &, Geom::Vector &normal, double &penetration) const
virtual void update_bounding_sphere()=0
Sphere * _bounding_sphere
Definition: Volume.hpp:175
Interference
Definition: Volume.hpp:100
@ OUTSIDE
Definition: Volume.hpp:100
@ INSIDE
Definition: Volume.hpp:100
@ OVERLAP
Definition: Volume.hpp:100
Definition: Common.hpp:198
Definition: StaticAABBTree.hpp:38