1 // PCL
2 #include <pcl/outofcore/visualization/object.h>
3 #include <pcl/outofcore/visualization/scene.h>
4 
5 // Operators
6 // -----------------------------------------------------------------------------
Object(std::string name)7 Object::Object (std::string name)
8 {
9   name_ = name;
10 
11   actors_ = vtkSmartPointer<vtkActorCollection>::New ();
12 }
13 
14 // Accessors
15 // -----------------------------------------------------------------------------
16 std::string
getName() const17 Object::getName () const
18 {
19   return name_;
20 }
21 
22 void
setName(std::string name)23 Object::setName (std::string name)
24 {
25   name_ = name;
26 }
27 
28 vtkSmartPointer<vtkActorCollection>
getActors()29 Object::getActors ()
30 {
31   return actors_;
32 }
33 
34 void
render(vtkRenderer * renderer)35 Object::render (vtkRenderer* renderer)
36 {
37   std::lock_guard<std::mutex> lock (actors_mutex_);
38   // Iterate over the objects actors
39   actors_->InitTraversal ();
40   for (vtkIdType i = 0; i < actors_->GetNumberOfItems (); i++)
41   {
42     vtkActor* actor = actors_->GetNextActor ();
43 
44     // If the actor hasn't been added to the renderer add it
45     std::set<vtkRenderer*>::iterator renderer_it;
46     renderer_it = associated_renderers_[actor].find (renderer);
47     if (renderer_it == associated_renderers_[actor].end ())
48     {
49       associated_renderers_[actor].insert (renderer);
50       renderer->AddActor (actor);
51     }
52   }
53 }
54 
55 bool
hasActor(vtkActor * actor)56 Object::hasActor (vtkActor *actor)
57 {
58   std::lock_guard<std::mutex> lock (actors_mutex_);
59 
60   return actors_->IsItemPresent (actor);
61 }
62 
63 void
addActor(vtkActor * actor)64 Object::addActor (vtkActor *actor)
65 {
66 //  Scene::instance ()->lock ();
67   std::lock_guard<std::mutex> lock (actors_mutex_);
68 
69   if (!actors_->IsItemPresent (actor))
70     actors_->AddItem (actor);
71 
72   // If the actor doesn't exist in the associated_renderers_ map add it
73   std::map<vtkActor*, std::set<vtkRenderer*> >::iterator actor_it;
74   actor_it = associated_renderers_.find (actor);
75   if (actor_it == associated_renderers_.end ())
76   {
77     associated_renderers_[actor] = std::set<vtkRenderer*> ();
78   }
79 //  Scene::instance ()->unlock ();
80 
81 //  Scene *scene = Scene::instance();
82 //  std::vector<Viewport*> viewports = scene->getViewports();
83 //  for(int i=0; i < viewports.size(); i++)
84 //  {
85 //
86 //    vtkRenderer *renderer = viewports[i]->getRenderer();
87 //    // If the actor hasn't been added to the renderer add it
88 //    std::set<vtkRenderer*>::iterator renderer_it;
89 //    renderer_it = associated_renderers_[actor].find(renderer);
90 //    if (renderer_it == associated_renderers_[actor].end())
91 //    {
92 //      associated_renderers_[actor].insert(renderer);
93 //      renderer->AddActor(actor);
94 //    }
95 //  }
96 }
97 
98 void
removeActor(vtkActor * actor)99 Object::removeActor (vtkActor *actor)
100 {
101 //  Scene::instance ()->lock ();
102   //std::cout << "Removing Actor" << std::endl;
103   std::lock_guard<std::mutex> lock (actors_mutex_);
104   actors_->RemoveItem (actor);
105 
106   std::map<vtkActor*, std::set<vtkRenderer*> >::iterator actor_it;
107   actor_it = associated_renderers_.find (actor);
108 
109   if (actor_it != associated_renderers_.end ())
110   {
111     for (auto renderer_it = associated_renderers_[actor].cbegin (); renderer_it != associated_renderers_[actor].cend ();
112         ++renderer_it)
113     {
114       (*renderer_it)->RemoveActor (actor);
115     }
116     associated_renderers_.erase (actor);
117   }
118   //std::cout << "Removing Actor - DONE" << std::endl;
119 //  Scene::instance ()->unlock ();
120 }
121