Eris  1.3.21
Entity.h
1 #ifndef ERIS_ENTITY_H
2 #define ERIS_ENTITY_H
3 
4 #include <Eris/Types.h>
5 
6 #include <Atlas/Objects/ObjectsFwd.h>
7 
8 #include <wfmath/point.h>
9 #include <wfmath/vector.h>
10 #include <wfmath/axisbox.h>
11 #include <wfmath/quaternion.h>
12 #include <wfmath/timestamp.h>
13 
14 #include <sigc++/trackable.h>
15 #include <sigc++/slot.h>
16 #include <sigc++/signal.h>
17 #include <sigc++/connection.h>
18 
19 #include <map>
20 #include <vector>
21 
22 namespace Atlas {
23  namespace Message {
24  class Element;
25  typedef std::map<std::string, Element> MapType;
26  }
27 }
28 
29 namespace Eris {
30 
31 // Forward Declerations
32 class Entity;
33 class TypeInfo;
34 class View;
35 class EntityRouter;
36 class Task;
37 
38 typedef std::vector<Entity*> EntityArray;
39 typedef std::vector<Task*> TaskArray;
40 typedef std::vector<TypeInfoPtr> TypeInfoArray;
41 
57 class Entity : virtual public sigc::trackable
58 {
59 public:
60  typedef std::map<std::string, Atlas::Message::Element> AttrMap;
61 
62  explicit Entity(const std::string& id, TypeInfo* ty);
63  virtual ~Entity();
64 
70  virtual void shutdown();
71 
72 // heirarchy interface
78  unsigned int numContained() const;
79 
85  Entity* getContained(unsigned int index) const;
86 
94  const Atlas::Message::Element& valueOfAttr(const std::string& attr) const;
95 
101  bool hasAttr(const std::string &p) const;
102 
106  typedef sigc::slot<void, const Atlas::Message::Element&> AttrChangedSlot;
107 
115  sigc::connection observe(const std::string& attr, const AttrChangedSlot& aslot);
116 
117 // accessors
122  const std::string& getId() const;
123 
129  const std::string& getName() const;
130 
135  float getStamp() const;
136 
141  TypeInfo* getType() const;
142 
147  Entity* getLocation() const;
148 
153  WFMath::Point<3> getPosition() const;
154 
162  const AttrMap getAttributes() const;
163 
171  const AttrMap& getInstanceAttributes() const;
172 
177  bool isMoving() const;
178 
184  WFMath::Point<3> getPredictedPos() const;
185 
190  WFMath::Vector<3> getPredictedVelocity() const;
191 
193  WFMath::Point<3> getViewPosition() const;
194 
196  WFMath::Quaternion getViewOrientation() const;
197 
199  const WFMath::Vector< 3 > & getVelocity(void) const;
200 
202  const WFMath::Quaternion & getOrientation(void) const;
203 
205  const WFMath::AxisBox< 3 > & getBBox(void) const;
206 
212  bool hasBBox() const;
213 
218  const TaskArray& getTasks() const;
219 
225  TypeInfoArray getUseOperations() const;
226 
227  bool hasChild(const std::string& eid) const;
228 
230  bool isVisible() const;
231 
232 // coordinate transformations
233  template<class C>
234  C toLocationCoords(const C& c) const;
235 
236  template<class C>
237  C fromLocationCoords(const C& c) const;
238 
239  // A vector (e.g., the distance between two points, or
240  // a velocity) gets rotated by a coordinate transformation,
241  // but doesn't get shifted by the change in the position
242  // of the origin, so we handle it separately. We also
243  // need to copy the vector before rotating, because
244  // Vector::rotate() rotates it in place.
245  WFMath::Vector<3> toLocationCoords(const WFMath::Vector<3>& v) const;
246 
247  WFMath::Vector<3> fromLocationCoords(const WFMath::Vector<3>& v) const;
248 
249 // Signals
250  sigc::signal<void, Entity*> ChildAdded;
251  sigc::signal<void, Entity*> ChildRemoved;
252 
254 
258  sigc::signal<void, Entity*> LocationChanged;
259 
262  sigc::signal<void, const StringSet&> Changed;
263 
265  sigc::signal<void> Moved;
266 
269  sigc::signal<void, bool> Moving;
270 
286  sigc::signal< void, const Atlas::Objects::Root & > Say;
287 
292  sigc::signal<void, const std::string&> Emote;
293 
299  sigc::signal<void, const Atlas::Objects::Operation::RootOperation&> Acted;
300 
306  sigc::signal<void, const Atlas::Objects::Root&> Noise;
307 
312  sigc::signal<void, bool> VisibilityChanged;
313 
319  sigc::signal<void> BeingDeleted;
320 
324  sigc::signal<void, Task*> TaskAdded;
328  sigc::signal<void, Task*> TaskRemoved;
329 protected:
333  virtual void init(const Atlas::Objects::Entity::RootEntity &ge, bool fromCreateOp);
334 
338  virtual void onTalk(const Atlas::Objects::Operation::RootOperation& talk);
339 
340  virtual void onAttrChanged(const std::string& attr, const Atlas::Message::Element &v);
341 
342  virtual void onLocationChanged(Entity* oldLoc);
343 
346  virtual void onMoved();
347 
351  virtual void onVisibilityChanged(bool vis);
352 
357  virtual void onAction(const Atlas::Objects::Operation::RootOperation& act);
358 
363  virtual void onSoundAction(const Atlas::Objects::Operation::RootOperation& op);
364 
369  virtual void onImaginary(const Atlas::Objects::Root& act);
370 
376  virtual void setMoving(bool moving);
377 
382  virtual void onChildAdded(Entity* child);
383 
388  virtual void onChildRemoved(Entity* child);
389 
394  virtual void onTaskAdded(Task* task);
395 
396  friend class IGRouter;
397  friend class View;
398  friend class Task;
399 
404  void sight(const Atlas::Objects::Entity::RootEntity& gent);
405 
406 
413  void setFromRoot(const Atlas::Objects::Root& obj, bool allowMotion, bool includeTypeInfoAttributes = false);
414 
417  void setVisible(bool vis);
418 
419  void setAttr(const std::string &p, const Atlas::Message::Element &v);
420 
425  bool nativeAttrChanged(const std::string &p, const Atlas::Message::Element &v);
426 
433  void typeInfo_AttributeChanges(const std::string& attributeName, const Atlas::Message::Element& element);
434 
441  virtual void attrChangedFromTypeInfo(const std::string& attributeName, const Atlas::Message::Element& element);
442 
443 
450  void fillAttributesFromType(Entity::AttrMap& attributes, TypeInfo* typeInfo) const;
451 
452  void beginUpdate();
453  void addToUpdate(const std::string& attr);
454  void endUpdate();
455 
458  void setLocationFromAtlas(const std::string& locId);
459 
463  void setLocation(Entity* newLocation);
464 
467  void setContentsFromAtlas(const StringList& contents);
468 
473  void filterMoveAttrs(Atlas::Message::MapType& attrs) const;
474 
475  typedef std::map<std::string, Entity*> IdEntityMap;
476  void buildEntityDictFromContents(IdEntityMap& dict);
477 
478  void addChild(Entity* e);
479  void removeChild(Entity* e);
480 
481  void addToLocation();
482  void removeFromLocation();
483 
484  void updateTasks(const Atlas::Message::Element& e);
485  void removeTask(Task* t);
486 
489  void updateCalculatedVisibility(bool wasVisible);
490 
492  {
493  public:
494  WFMath::Point<3> position;
495  WFMath::Vector<3> velocity;
496  };
497 
498  void updatePredictedState(const WFMath::TimeStamp& t);
499 
500  void createAlarmExpired();
501 
506  virtual TypeService* getTypeService() const = 0;
507 
512  virtual void removeFromMovementPrediction() = 0;
513 
518  virtual void addToMovementPredition() = 0;
519 
524  virtual Entity* getEntity(const std::string& id) = 0;
525 
526 
527  AttrMap m_attrs;
528 
529  TypeInfo* m_type;
530 
531 // primary state, in native form
532  Entity* m_location;
533  EntityArray m_contents;
534 
535  const std::string m_id;
536  std::string m_name;
537  float m_stamp;
538  std::string m_description;
539  bool m_visible;
540  bool m_limbo;
541 
542  WFMath::AxisBox<3> m_bbox;
543  WFMath::Point<3> m_position;
544  WFMath::Vector<3> m_velocity;
545  WFMath::Quaternion m_orientation;
546  WFMath::Vector<3> m_acc;
547 
548  DynamicState m_predicted;
549 
550 // extra state and state tracking things
555 
560  StringSet m_modifiedAttrs;
561 
562  typedef sigc::signal<void, const Atlas::Message::Element&> AttrChangedSignal;
563 
564  typedef std::map<std::string, AttrChangedSignal> ObserverMap;
565  ObserverMap m_observers;
566 
570  bool m_hasBBox;
571 
572  WFMath::TimeStamp m_lastMoveTime;
573  bool m_moving;
574 
576 
577  TaskArray m_tasks;
578 
579  bool m_initialised;
580 };
581 
582 inline unsigned int Entity::numContained() const {
583  return m_contents.size();
584 }
585 
586 inline Entity* Entity::getContained(unsigned int index) const {
587  return m_contents[index];
588 }
589 
590 inline const std::string& Entity::getId() const
591 {
592  return m_id;
593 }
594 
595 inline const std::string& Entity::getName() const
596 {
597  return m_name;
598 }
599 
600 inline float Entity::getStamp() const
601 {
602  return m_stamp;
603 }
604 
605 inline TypeInfo* Entity::getType() const
606 {
607  return m_type;
608 }
609 
612 {
613  return m_location;
614 }
615 
617 inline WFMath::Point<3> Entity::getPosition() const
618 {
619  return m_position;
620 }
622 inline const WFMath::Vector< 3 > & Entity::getVelocity(void) const
623 {
624  return m_velocity;
625 }
626 
628 inline const WFMath::Quaternion & Entity::getOrientation(void) const
629 {
630  return m_orientation;
631 }
632 
634 inline const WFMath::AxisBox< 3 > & Entity::getBBox(void) const
635 {
636  return m_bbox;
637 }
638 
639 inline bool Entity::hasBBox() const
640 {
641  return m_hasBBox;
642 }
643 
644 inline const TaskArray& Entity::getTasks() const
645 {
646  return m_tasks;
647 }
648 
649 template<class C>
650 inline C Entity::toLocationCoords(const C& c) const
651 {
652  return c.toParentCoords(getPredictedPos(), m_orientation);
653 }
654 
655 template<class C>
656 inline C Entity::fromLocationCoords(const C& c) const
657 {
658  return c.toLocalCoords(getPredictedPos(), m_orientation);
659 }
660 
661 inline WFMath::Vector<3> Entity::toLocationCoords(const WFMath::Vector<3>& v) const
662 {
663  return WFMath::Vector<3>(v).rotate(m_orientation);
664 }
665 
666 inline WFMath::Vector<3> Entity::fromLocationCoords(const WFMath::Vector<3>& v) const
667 {
668  return WFMath::Vector<3>(v).rotate(m_orientation.inverse());
669 }
670 
671 } // of namespace
672 
673 #endif