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 #include "rve_render_client/scene.h"
00031 #include "rve_render_client/single_scene_object.h"
00032 #include "rve_render_client/scene_object_collection.h"
00033 #include <rve_render_client/client_context.h>
00034 #include <rve_common/uuid.h>
00035
00036 #include <rve_interfaces/Scene.h>
00037
00038 #include <ros/assert.h>
00039
00040 #include <boost/unordered_set.hpp>
00041 #include <boost/bind.hpp>
00042
00043 #include <algorithm>
00044
00045 using namespace rve_common;
00046
00047 namespace rve_render_client
00048 {
00049
00050 struct Scene::Impl
00051 {
00052 Impl(Scene* parent);
00053
00054 void addObject(SceneObject* obj);
00055 void removeObject(SceneObject* obj);
00056
00057 void create(ClientContext* context);
00058 void destroy(ClientContext* context);
00059
00060 const rve_common::UUID& getID() { return id_; }
00061 void getDependencies(V_UUID& deps);
00062
00063 rve_interfaces::SceneProxy* getProxy(ClientContext* context);
00064
00065 Scene* parent_;
00066 rve_common::UUID id_;
00067
00068 typedef boost::unordered_set<SceneObject*> S_SceneObject;
00069 S_SceneObject objects_;
00070
00071 typedef boost::unordered_set<ClientContext*> S_ClientContext;
00072 S_ClientContext contexts_;
00073 };
00074
00075 Scene::Impl::Impl(Scene* parent)
00076 : parent_(parent)
00077 , id_(rve_common::UUID::generate())
00078 {}
00079
00080 void Scene::Impl::addObject(SceneObject* obj)
00081 {
00082 bool inserted = objects_.insert(obj).second;
00083 ROS_ASSERT(inserted);
00084
00085
00086 std::for_each(contexts_.begin(), contexts_.end(), boost::bind(&SceneObject::create, obj, parent_, _1));
00087 }
00088
00089 void Scene::Impl::removeObject(SceneObject* obj)
00090 {
00091
00092 std::for_each(contexts_.begin(), contexts_.end(), boost::bind(&SceneObject::destroy, obj, parent_, _1));
00093
00094 objects_.erase(obj);
00095 }
00096
00097 void Scene::Impl::create(ClientContext* context)
00098 {
00099 bool inserted = contexts_.insert(context).second;
00100 ROS_ASSERT(inserted);
00101
00102 rve_interfaces::SceneProxy* proxy = getProxy(context);
00103 proxy->create(getID());
00104
00105
00106 std::for_each(objects_.begin(), objects_.end(), boost::bind(&SceneObject::create, _1, parent_, context));
00107 }
00108
00109 void Scene::Impl::destroy(ClientContext* context)
00110 {
00111 contexts_.erase(context);
00112
00113
00114 std::for_each(objects_.begin(), objects_.end(), boost::bind(&SceneObject::destroy, _1, parent_, context));
00115
00116 rve_interfaces::SceneProxy* proxy = getProxy(context);
00117 proxy->destroy(getID());
00118 }
00119
00120 rve_interfaces::SceneProxy* Scene::Impl::getProxy(ClientContext* context)
00121 {
00122
00123 InterfaceHandle handle = context->lookupInterface("scene");
00124 return context->getInterface<rve_interfaces::SceneProxy>(handle);
00125 }
00126
00127 void Scene::Impl::getDependencies(V_UUID& deps)
00128 {
00129 std::for_each(objects_.begin(), objects_.end(), boost::bind(&SceneObject::getContextDependencies, _1, deps));
00130 }
00131
00135
00136 Scene::Scene()
00137 : impl_(new Impl(this))
00138 {
00139 }
00140
00141 Scene::~Scene()
00142 {
00143 }
00144
00145 void Scene::addObject(SceneObject* obj)
00146 {
00147 impl_->addObject(obj);
00148 }
00149
00150 void Scene::removeObject(SceneObject* obj)
00151 {
00152 impl_->removeObject(obj);
00153 }
00154
00155 void Scene::create(ClientContext* context)
00156 {
00157 impl_->create(context);
00158 }
00159
00160 void Scene::destroy(ClientContext* context)
00161 {
00162 impl_->destroy(context);
00163 }
00164
00165 const rve_common::UUID& Scene::getID()
00166 {
00167 return impl_->getID();
00168 }
00169
00170 void Scene::getDependencies(V_UUID& deps)
00171 {
00172 impl_->getDependencies(deps);
00173 }
00174
00178
00179 void destroyScene(Scene* scene)
00180 {
00181 while (!scene->impl_->contexts_.empty())
00182 {
00183 ClientContext* context = *scene->impl_->contexts_.begin();
00184 context->removeObject(scene);
00185 }
00186
00187 delete scene;
00188 }
00189
00190 ScenePtr createScene(const ClientContextPtr& context)
00191 {
00192 ScenePtr scene(new Scene, destroyScene);
00193 context->addObject(scene.get());
00194 return scene;
00195 }
00196
00197 }