00001
00002
00003
00004
00005
00006
00007 #ifndef _COLLISION_GEOMETRY_H
00008 #define _COLLISION_GEOMETRY_H
00009
00010 #include <list>
00011 #include <vector>
00012 #include <map>
00013 #include <boost/shared_ptr.hpp>
00014 #include <boost/weak_ptr.hpp>
00015 #include <Physsim/Constants.h>
00016 #include <Physsim/Base.h>
00017 #include <Physsim/Triangle.h>
00018 #include <Physsim/Matrix4.h>
00019 #include <Physsim/Primitive.h>
00020
00021 namespace Physsim {
00022
00023 class RigidBody;
00024
00026
00032 class CollisionGeometry : public Base
00033 {
00034 public:
00035 CollisionGeometry();
00036 CollisionGeometryPtr get_child(unsigned i) const;
00037 virtual void clone(BasePtr& cloned, bimap<BasePtr, BasePtr>* obj_map = NULL) const;
00038 virtual void load_state(BaseConstPtr object, bimap<BasePtr, BasePtr>* correspondence = NULL);
00039 virtual void save_state(BasePtr object, bimap<BasePtr, BasePtr>* correspondence = NULL) const;
00040 bool is_struct_identical(BaseConstPtr object) const;
00041 void set_transform(const Matrix4& transform, bool rel_transform_accounted);
00042 void write_vrml(const std::string& filename) const;
00043 void set_geometry(PrimitiveConstPtr primitive);
00044 void set_rel_transform(const Matrix4& transform);
00045 std::list<CollisionGeometryPtr> get_sub_geometries() const;
00046 virtual void save_to_xml(XMLTreePtr node, std::list<BaseConstPtr>& shared_objects) const;
00047 virtual void load_from_xml(XMLTreeConstPtr node, std::map<std::string, BasePtr>& id_map);
00048 void set_max_tri_area(Real area);
00049
00051 Real get_max_tri_area() const { return _max_tri_area; }
00052
00054
00058 TriangleArrayConstPtr get_mesh() const { return _geometry->get_tris(); }
00059
00061 boost::weak_ptr<CollisionGeometry> get_parent() const { return _parent; }
00062
00064 void set_parent(boost::weak_ptr<CollisionGeometry> parent) { _parent = parent; }
00065
00067 unsigned num_children() const { return _children.size(); }
00068
00070 const std::vector<CollisionGeometryPtr>& get_children() const { return _children; }
00071
00073 CollisionGeometryPtr get_child(unsigned i) { return _children[i]; }
00074
00076 void add_child(CollisionGeometryPtr child);
00077
00079 const Matrix4& get_transform() const { return _transform; }
00080
00082 const Matrix4& get_rel_transform() const { return _rel_transform; }
00083
00085 void* get_collision_data() const { return _collisiondata; }
00086
00088 void set_collision_data(void* data) { _collisiondata = data; }
00089
00091 boost::weak_ptr<RigidBody> get_rigid_body() const { return _rigid_body; }
00092
00094 void set_rigid_body(boost::weak_ptr<RigidBody> r) { _rigid_body = r; }
00095
00097 bool is_convex() const { return _convex; }
00098
00100 PrimitiveConstPtr get_geometry() const { return _geometry; }
00101
00102 protected:
00104 Matrix4 _transform;
00105
00107 Matrix4 _rel_transform;
00108
00109 private:
00110 bool _rel_transform_identity;
00111 bool _convex;
00112 boost::weak_ptr<RigidBody> _rigid_body;
00113 boost::weak_ptr<CollisionGeometry> _parent;
00114 std::vector<CollisionGeometryPtr> _children;
00115 void* _collisiondata;
00116 PrimitiveConstPtr _geometry;
00117 Real _max_tri_area;
00118 };
00119 }
00120
00121 #endif