CollisionGeometry.h

00001 /****************************************************************************
00002  * Copyright 2005 Evan Drumwright
00003  * This library is distributed under the terms of the GNU General Public 
00004  * License (found in COPYING).
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

Generated on Wed Oct 24 14:54:21 2007 for Physsim by  doxygen 1.5.1