All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
SceneElementRepository.h
1 // Copyright eeGeo Ltd (2012-2014), All Rights Reserved
2 
3 #pragma once
4 
5 #include "Types.h"
6 #include "SceneElement.h"
7 #include "ISceneElementRemover.h"
8 #include "ISceneElementSource.h"
9 #include "ISceneElementFilterCriteria.h"
10 #include "ISceneElementObservable.h"
11 #include "PackedRenderable.h"
12 #include "ISceneElementObserver.h"
13 #include <vector>
14 #include <algorithm>
15 
16 namespace Eegeo
17 {
18  namespace Rendering
19  {
20  namespace Scene
21  {
25  template<class T>
26  class SceneElementRepository : public ISceneElementSource<T>, ISceneElementRemover<T>, ISceneElementObservable<T>, protected Eegeo::NonCopyable
27  {
28  typedef SceneElement<T> TSceneElement;
29  typedef TSceneElement* TSceneElementPtr;
30  typedef std::vector<TSceneElementPtr> TSceneElementPtrVector;
31 
32  private:
33  TSceneElementPtrVector m_sceneElements;
34  typedef ISceneElementObserver<T> TObserver;
35  typedef TObserver* TObserverPtr;
36  typedef std::vector<TObserverPtr> TObserverPtrVec;
37  TObserverPtrVec m_observers;
38 
39  void NotifyObserversOfAdd(TSceneElement& sceneElementAdded) const
40  {
41  for(typename TObserverPtrVec::const_iterator it = m_observers.begin(); it != m_observers.end(); ++it)
42  {
43  (*it)->OnSceneElementAdded(sceneElementAdded);
44  }
45  }
46 
47  void NotifyObserversOfRemove(TSceneElement& sceneElementRemoved) const
48  {
49  for(typename TObserverPtrVec::const_iterator it = m_observers.begin(); it != m_observers.end(); ++it)
50  {
51  (*it)->OnSceneElementRemoved(sceneElementRemoved);
52  }
53  }
54 
55  public:
56  SceneElementRepository()
57  {
58  }
59 
60  ~SceneElementRepository()
61  {
62  m_observers.clear();
63  }
64 
65  void AddObserver(ISceneElementObserver<T>& observerToAdd)
66  {
67  m_observers.push_back(&observerToAdd);
68  }
69 
70  void RemoveObserver(ISceneElementObserver<T>& observerToRemove)
71  {
72  m_observers.erase(std::remove(m_observers.begin(), m_observers.end(), &observerToRemove));
73  }
74 
75  int GetNumOfSceneElements() const
76  {
77  return m_sceneElements.size();
78  }
79 
80  int GetCapacity() const
81  {
82  return m_sceneElements.capacity();
83  }
84 
85  void GetSceneElements(std::vector<SceneElement<T>*>& out_sceneElements) const
86  {
87  out_sceneElements.insert(out_sceneElements.end(), m_sceneElements.begin(), m_sceneElements.end());
88  }
89 
90  void Add(SceneElement<T>& sceneElement)
91  {
92  sceneElement.SetRemover(this);
93  m_sceneElements.push_back(&sceneElement);
94  NotifyObserversOfAdd(sceneElement);
95  }
96 
97  void Remove(SceneElement<T>* pSceneElement)
98  {
99  Eegeo_ASSERT(std::find(m_sceneElements.begin(), m_sceneElements.end(), pSceneElement) != m_sceneElements.end());
100  size_t size = m_sceneElements.size();
101  m_sceneElements.erase(std::remove(m_sceneElements.begin(), m_sceneElements.end(), pSceneElement));
102  Eegeo_ASSERT(m_sceneElements.size() == size - 1);
103  NotifyObserversOfRemove(*pSceneElement);
104  }
105  };
106  }
107  }
108 }