Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: code/branches/physics/src/ogreode/OgreOdeMaintainedList.h @ 1933

Last change on this file since 1933 was 1919, checked in by rgrieder, 16 years ago

Added OgreODE to our source repository because already we really need the newest version. And there is no hope to find any packages under linux.
The files included should compile and link with Ogre 1.4/1.6 and ODE 0.9/0.10. I was only able to test Ogre 1.4 and ODE 0.9/.10 under msvc until now.

  • Property svn:eol-style set to native
File size: 3.9 KB
Line 
1/*!
2 * <File comment goes here!!>
3 *
4 * Copyright (c) 2005 by <your name/ organization here>
5 */
6#ifndef _OGREODEMAINTAINEDLIST_H_
7#define _OGREODEMAINTAINEDLIST_H_
8
9#include "OgreOdePreReqs.h"
10
11/*!
12 * \brief
13 * Write brief comment for OgreOde here.
14 *
15 * Write detailed description for OgreOde here.
16 *
17 * \remarks
18 * Write remarks for OgreOde here.
19 *
20 * \see
21 * Separate items with the '|' character.
22 */
23namespace OgreOde
24{
25
26        /** Convenience class to make it easy to step through all MaintainedItem in a MaintainedList.
27        */
28        template <class T>
29        class _OgreOdeExport MaintainedItemIterator
30        {
31
32        public:
33                typedef std::deque<T*> MaintainedItemList;
34                typedef std::map<size_t,T*> MaintainedItemMap;
35
36
37        protected:
38                typename MaintainedItemList::iterator mPos;
39                typename MaintainedItemList::iterator mStart;
40                typename MaintainedItemList::iterator mEnd;
41
42
43        public:
44                /// constructor, only available for MaintainedList::getIterator
45                MaintainedItemIterator(typename MaintainedItemList::iterator start, typename MaintainedItemList::iterator end)
46                {
47                        mStart = mPos = start;
48                        mEnd = end;
49                }
50                // Returns true when at the end of the MaintainedItem list
51                inline bool end(void) const 
52                {
53                        return (mPos == mEnd);
54                }
55                /** Returns a pointer to the next MaintainedItem, and moves the iterator on by 1 element. */
56                inline T* getNext(void)
57                {
58                        return static_cast<T*>(*mPos++);
59                }
60        };
61
62        template <class T>
63        class _OgreOdeExport MaintainedList
64        {
65        public:
66                typedef std::deque<T*>                          MaintainedItemList;
67                typedef std::map<size_t,T*>     MaintainedItemMap;
68
69        public:
70                MaintainedList(){};
71                ~MaintainedList(){};
72
73                void registerItem(T* ptr)       
74                {
75                        assert(ptr->getID());
76                        _map[ptr->getID()] = ptr;
77                        _list.push_back (ptr);
78                }
79
80                T* findItem(size_t id)
81                {
82                        assert (_map.find(id) != _map.end());
83                        return _map[id];
84                }
85
86                void unregisterItem(size_t id)
87                {
88                        assert (_map.find(id) != _map.end());
89                        T* m = _map[id];
90                        _map.erase(id);
91
92                        typename MaintainedItemList::iterator i = std::find(_list.begin (), 
93                                _list.end (), 
94                                m);
95                        if(i != _list.end())
96                        {
97                                assert(*i == m);
98                                _list.erase(i);
99                        }
100                }
101
102                void setDebug(const bool debug)
103                {
104                        typename MaintainedItemList::iterator i = _list.begin();
105                        typename MaintainedItemList::iterator end = _list.end();
106                        for(;i != end;++i)
107                        {
108                                (*i)->setDebug(debug);
109                        }
110        }
111
112        void setDebugContact(const bool debug)
113        {
114            typename MaintainedItemList::iterator i = _list.begin();
115            typename MaintainedItemList::iterator end = _list.end();
116            for(;i != end;++i)
117            {
118                (*i)->setDebugContact(debug);
119            }
120        }
121
122        void updateDebugContact()
123        {
124            std::for_each(_list.begin (), 
125                _list.end (), 
126                std::mem_fun(&T::updateDebugContact));
127        }
128
129
130
131                void synchronise()
132                {
133                        std::for_each(_list.begin (), 
134                                _list.end (), 
135                                std::mem_fun(&T::synchronise));
136                }
137
138                void updateDrawState()
139                {
140                        std::for_each(_list.begin (), 
141                                _list.end (), 
142                                std::mem_fun(&T::updateDrawState));
143                }
144                void updatePreviousState()
145                {
146                        std::for_each(_list.begin (), 
147                                _list.end (), 
148                                std::mem_fun(&T::updatePreviousState));
149                }
150
151                void updateCurrentState()
152                {
153                        std::for_each(_list.begin (), 
154                                _list.end (), 
155                                std::mem_fun(&T::updateCurrentState));
156                }
157
158                void interpolateDrawState(const Ogre::Real alpha)
159                {
160                        typename MaintainedItemList::iterator i = _list.begin();
161                        typename MaintainedItemList::iterator end = _list.end();
162                        for(;i != end;++i)
163                        {
164                                (*i)->interpolateDrawState(alpha);
165                        }
166                }
167
168                void notify(Body* body)
169                {
170                        typename MaintainedItemList::iterator i = _list.begin();
171                        typename MaintainedItemList::iterator end = _list.end();
172                        for(;i != end;++i)
173                        {
174                                (*i)->notify(body);
175                        }
176                }
177
178                MaintainedItemIterator<T> getIterator(void)
179                {
180                        return MaintainedItemIterator<T>(_list.begin(), _list.end());
181                }
182
183        protected:
184
185                MaintainedItemMap  _map;
186                MaintainedItemList _list;
187        };
188
189}
190
191#endif
Note: See TracBrowser for help on using the repository browser.