ed
transform_crawler.cpp
Go to the documentation of this file.
2 
3 #include "ed/world_model.h"
4 #include "ed/entity.h"
5 #include "ed/relation.h"
6 
7 namespace ed
8 {
9 namespace world_model
10 {
11 
12 // ----------------------------------------------------------------------------------------------------
13 
14 TransformCrawler::TransformCrawler(const WorldModel& wm, const UUID& root_id, const Time& time)
15  : wm_(wm), time_(time)
16 {
17  Idx root_idx;
18  if (wm_.findEntityIdx(root_id, root_idx))
19  {
20  const EntityConstPtr& e = wm_.entities()[root_idx];
22  visited_.insert(root_idx);
23  }
24 }
25 
26 // ----------------------------------------------------------------------------------------------------
27 
29 {
30  return wm_.entities()[queue_.front().entity_idx];
31 }
32 
33 // ----------------------------------------------------------------------------------------------------
34 
36 {
37  if (queue_.empty())
38  return false;
39 
40  const ed::EntityConstPtr& e = entity();
41  if (!e)
42  return false;
43 
44  pushChildren(*e, transform());
45 
46  queue_.pop();
47 
48  return true;
49 }
50 
51 // ----------------------------------------------------------------------------------------------------
52 
53 void TransformCrawler::pushChildren(const Entity& e, const geo::Pose3D& transform)
54 {
55  // Push all nodes that point to this node
56  const std::map<Idx, Idx>& transforms_to = e.relationsTo();
57  for(std::map<Idx, Idx>::const_iterator it = transforms_to.begin(); it != transforms_to.end(); ++it)
58  {
59  Idx n2 = it->first;
60  if (visited_.find(n2) == visited_.end())
61  {
62  geo::Pose3D rel_transform;
63  RelationConstPtr r = wm_.relations()[it->second];
64  if (r && r->calculateTransform(time_, rel_transform))
65  queue_.push(Node(n2, transform * rel_transform));
66 
67  visited_.insert(n2);
68  }
69  }
70 
71  // Push all nodes this node points to
72  const std::map<Idx, Idx>& transforms_from = e.relationsFrom();
73  for(std::map<Idx, Idx>::const_iterator it = transforms_from.begin(); it != transforms_from.end(); ++it)
74  {
75  Idx n2 = it->first;
76  if (visited_.find(n2) == visited_.end())
77  {
78  geo::Pose3D rel_transform;
79  RelationConstPtr r = wm_.relations()[it->second];
80  if (r && r->calculateTransform(time_, rel_transform))
81  queue_.push(Node(n2, transform * rel_transform.inverse()));
82 
83  visited_.insert(n2);
84  }
85  }
86 }
87 
88 // ----------------------------------------------------------------------------------------------------
89 
90 } // end namespace ed
91 
92 } // end namespace world_model
93 
transform_crawler.h
ed::WorldModel
Definition: world_model.h:21
entity.h
geo::Transform3T::identity
static Transform3T identity()
std::set::find
T find(T... args)
ed::world_model::TransformCrawler::next
bool next()
Definition: transform_crawler.cpp:35
ed::world_model::TransformCrawler::queue_
std::queue< Node > queue_
Definition: transform_crawler.h:54
ed::world_model::TransformCrawler::entity
const EntityConstPtr & entity() const
Definition: transform_crawler.cpp:28
geo::Transform3T
relation.h
ed::Entity::relationsFrom
const std::map< Idx, Idx > & relationsFrom() const
Definition: entity.h:142
ed::Time
Definition: time.h:9
ed::world_model::TransformCrawler::time_
Time time_
Definition: transform_crawler.h:50
ed::EntityConstPtr
shared_ptr< const Entity > EntityConstPtr
Definition: types.h:37
ed::world_model::TransformCrawler::TransformCrawler
TransformCrawler(const WorldModel &wm, const UUID &start_id, const Time &time)
Definition: transform_crawler.cpp:14
geo::Transform3T::inverse
Transform3T inverse() const
ed::world_model::TransformCrawler::wm_
const WorldModel & wm_
Definition: transform_crawler.h:48
ed::WorldModel::relations
const std::vector< RelationConstPtr > & relations() const
Warning: the return vector may return null-pointers.
Definition: world_model.h:99
ed::world_model::TransformCrawler::transform
const geo::Pose3D & transform() const
Definition: transform_crawler.h:42
ed::Entity
Definition: entity.h:30
ed::world_model::TransformCrawler::visited_
std::set< Idx > visited_
Definition: transform_crawler.h:52
ed::UUID
Definition: uuid.h:10
std::map< Idx, Idx >
ed::Entity::relationsTo
const std::map< Idx, Idx > & relationsTo() const
Definition: entity.h:144
std::map::begin
T begin(T... args)
std::set::insert
T insert(T... args)
ed::WorldModel::entities
const std::vector< EntityConstPtr > & entities() const
Warning: the return vector may return null-pointers.
Definition: world_model.h:96
ed::world_model::TransformCrawler::Node
Definition: transform_crawler.h:26
ed::WorldModel::findEntityIdx
bool findEntityIdx(const UUID &id, Idx &idx) const
Definition: world_model.cpp:444
ed
Definition: convex_hull.h:8
ed::RelationConstPtr
shared_ptr< const Relation > RelationConstPtr
Definition: types.h:73
std::map::end
T end(T... args)
ed::world_model::TransformCrawler::pushChildren
void pushChildren(const Entity &e, const geo::Pose3D &transform)
Definition: transform_crawler.cpp:53
ed::Idx
uint64_t Idx
Definition: types.h:21
world_model.h