Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037 #include <moveit/collision_detection/world_diff.h>
00038 #include <boost/bind.hpp>
00039
00040
00041 collision_detection::WorldDiff::~WorldDiff()
00042 {
00043 WorldPtr old_world = world_.lock();
00044 if (old_world)
00045 old_world->removeObserver(observer_handle_);
00046 }
00047
00048 collision_detection::WorldDiff::WorldDiff()
00049 { }
00050
00051 collision_detection::WorldDiff::WorldDiff(const WorldPtr& world) :
00052 world_(world)
00053 {
00054 observer_handle_ = world->addObserver(boost::bind(&WorldDiff::notify, this, _1, _2));
00055 }
00056
00057 collision_detection::WorldDiff::WorldDiff(WorldDiff &other)
00058 {
00059 WorldPtr world = other.world_.lock();
00060 if (world)
00061 {
00062 changes_ = other.changes_;
00063
00064 boost::weak_ptr<World>(world).swap(world_);
00065 observer_handle_ = world->addObserver(boost::bind(&WorldDiff::notify, this, _1, _2));
00066 }
00067 }
00068
00069 void collision_detection::WorldDiff::reset()
00070 {
00071 clearChanges();
00072
00073 WorldPtr old_world = world_.lock();
00074 if (old_world)
00075 old_world->removeObserver(observer_handle_);
00076
00077 world_.reset();
00078 }
00079
00080 void collision_detection::WorldDiff::reset(const WorldPtr& world)
00081 {
00082 clearChanges();
00083
00084 WorldPtr old_world = world_.lock();
00085 if (old_world)
00086 old_world->removeObserver(observer_handle_);
00087
00088 boost::weak_ptr<World>(world).swap(world_);
00089 observer_handle_ = world->addObserver(boost::bind(&WorldDiff::notify, this, _1, _2));
00090 }
00091
00092 void collision_detection::WorldDiff::setWorld(const WorldPtr& world)
00093 {
00094 WorldPtr old_world = world_.lock();
00095 if (old_world)
00096 {
00097 old_world->notifyObserverAllObjects(observer_handle_, World::DESTROY);
00098 old_world->removeObserver(observer_handle_);
00099 }
00100
00101 boost::weak_ptr<World>(world).swap(world_);
00102
00103 observer_handle_ = world->addObserver(boost::bind(&WorldDiff::notify, this, _1, _2));
00104 world->notifyObserverAllObjects(observer_handle_, World::CREATE|World::ADD_SHAPE);
00105 }
00106
00107 void collision_detection::WorldDiff::clearChanges()
00108 {
00109 changes_.clear();
00110 }
00111
00112 void collision_detection::WorldDiff::notify(const World::ObjectConstPtr& obj, World::Action action)
00113 {
00114 World::Action& a = changes_[obj->id_];
00115 if (action == World::DESTROY)
00116 a = World::DESTROY;
00117 else
00118 a = a | action;
00119 }