Eris 1.3.19
View.h
00001 #ifndef ERIS_VIEW_H
00002 #define ERIS_VIEW_H
00003 
00004 // WF
00005 #include <Eris/Factory.h>
00006 #include <Atlas/Objects/ObjectsFwd.h>
00007 #include <wfmath/timestamp.h>
00008 
00009 // sigc++
00010 #include <sigc++/trackable.h>
00011 #include <sigc++/signal.h>
00012 #include <sigc++/slot.h>
00013 #include <sigc++/connection.h>
00014 
00015 // std
00016 #include <deque>
00017 #include <map>
00018 #include <set>
00019 
00020 namespace Eris
00021 {
00022 
00023 class Avatar;
00024 class ViewEntity;
00025 class Entity;
00026 class Connection;
00027 class Task;
00028 
00033 class View : public sigc::trackable
00034 {
00035 public:
00036     View(Avatar* av);
00037     ~View();
00038 
00043     Entity* getEntity(const std::string& eid) const;
00044 
00045     Avatar* getAvatar() const
00046     {
00047         return m_owner;
00048     }
00049 
00052     Entity* getTopLevel() const
00053     {
00054         return m_topLevel;
00055     }
00056     
00062     void update();
00063 
00067     void registerFactory(Factory*);
00068 
00069     typedef sigc::slot<void, Entity*> EntitySightSlot;
00070 
00075     sigc::connection notifyWhenEntitySeen(const std::string& eid, const EntitySightSlot& slot);
00076 
00079     sigc::signal<void, Entity*> EntitySeen;
00080 
00082     sigc::signal<void, Entity*> EntityCreated;
00083     
00085     sigc::signal<void, Entity*> EntityDeleted;
00086     
00087     sigc::signal<void, Entity*> Appearance;
00088     sigc::signal<void, Entity*> Disappearance;
00089 
00091     sigc::signal<void> TopLevelEntityChanged;
00092 
00093     void dumpLookQueue();
00094 
00099     unsigned int lookQueueSize() const
00100     {
00101         return m_lookQueue.size();
00102     }
00103 protected:
00104     // the router passes various relevant things to us directly
00105     friend class IGRouter;
00106     friend class ViewEntity;
00107     friend class Avatar;
00108     friend class Task;
00109     
00110     void appear(const std::string& eid, float stamp);
00111     void disappear(const std::string& eid);
00112     void sight(const Atlas::Objects::Entity::RootEntity& ge);
00113     void create(const Atlas::Objects::Entity::RootEntity& ge);
00114     void deleteEntity(const std::string& eid);
00115     void unseen(const std::string& eid);
00116     
00117     void setEntityVisible(Entity* ent, bool vis);
00118 
00120     bool isPending(const std::string& eid) const;
00121 
00122     void addToPrediction(Entity* ent);
00123     void removeFromPrediction(Entity* ent);
00124     
00128     void entityDeleted(Entity* ent);
00129 
00136     void taskRateChanged(Task*);
00137 private:
00138     Entity* initialSight(const Atlas::Objects::Entity::RootEntity& ge);
00139 
00140     Connection* getConnection() const;
00141     void getEntityFromServer(const std::string& eid);
00142 
00144     void setTopLevelEntity(Entity* newTopLevel);
00145 
00146     Entity* createEntity(const Atlas::Objects::Entity::RootEntity&);
00147 
00153     void sendLookAt(const std::string& eid);
00154     
00159     void issueQueuedLook();
00160 
00161     void eraseFromLookQueue(const std::string& eid);
00162 
00163     typedef std::map<std::string, Entity*> IdEntityMap;
00164 
00165     Avatar* m_owner;
00166     IdEntityMap m_contents;
00167     Entity* m_topLevel; 
00168     WFMath::TimeStamp m_lastUpdateTime;
00169     
00170     sigc::signal<void, Entity*> InitialSightEntity;
00171 
00175     typedef enum
00176     {
00177         SACTION_INVALID,
00178         SACTION_APPEAR,
00179         SACTION_HIDE,
00180         SACTION_DISCARD,
00181         SACTION_QUEUED
00182     } SightAction;
00183 
00184     typedef std::map<std::string, SightAction> PendingSightMap;
00185     PendingSightMap m_pending;
00186     
00194     std::deque<std::string> m_lookQueue;
00195           
00196     unsigned int m_maxPendingCount;
00197           
00198     typedef sigc::signal<void, Entity*> EntitySightSignal;
00199         
00200     typedef std::map<std::string, EntitySightSignal> NotifySightMap;
00201     NotifySightMap m_notifySights;
00202     
00203     typedef std::set<Entity*> EntitySet;
00204     
00207     EntitySet m_moving;
00208     
00209     class FactoryOrdering
00210     {
00211     public:
00212         bool operator()(Factory* a, Factory* b) const
00213         {   // higher priority factories are placed nearer the start
00214             return a->priority() > b->priority();
00215         }
00216     };
00217     
00218     typedef std::multiset<Factory*, FactoryOrdering> FactoryStore;
00219     FactoryStore m_factories;
00220     
00221     std::set<Task*> m_progressingTasks;
00222 };
00223 
00224 } // of namespace Eris
00225 
00226 #endif // of ERIS_VIEW_H