Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: code/branches/network64/src/network/synchronisable/Synchronisable.h @ 2245

Last change on this file since 2245 was 2245, checked in by scheusso, 15 years ago

most coding is done, still testing now
types should get transfered in platform independent formats now

File size: 7.0 KB
Line 
1/*
2 *   ORXONOX - the hottest 3D action shooter ever to exist
3 *                    > www.orxonox.net <
4 *
5 *
6 *   License notice:
7 *
8 *   This program is free software; you can redistribute it and/or
9 *   modify it under the terms of the GNU General Public License
10 *   as published by the Free Software Foundation; either version 2
11 *   of the License, or (at your option) any later version.
12 *
13 *   This program is distributed in the hope that it will be useful,
14 *   but WITHOUT ANY WARRANTY; without even the implied warranty of
15 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16 *   GNU General Public License for more details.
17 *
18 *   You should have received a copy of the GNU General Public License
19 *   along with this program; if not, write to the Free Software
20 *   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
21 *
22 *   Author:
23 *      Oliver Scheuss, (C) 2007
24 *   Co-authors:
25 *      ...
26 *
27 */
28
29#ifndef _Synchronisable_H__
30#define _Synchronisable_H__
31
32#include "network/NetworkPrereqs.h"
33
34#include <list>
35#include <map>
36#include <queue>
37#include <cassert>
38#include "util/Math.h"
39#include "util/mbool.h"
40#include "core/OrxonoxClass.h"
41// TODO: this has to be removed
42// #include <OgreLight.h>
43// #include "OrxonoxPrereqs.h"
44// ============================
45#include "NetworkCallback.h"
46#include "SynchronisableVariable.h"
47
48/*#define REGISTERDATA(varname, ...) \
49    registerVariable((void*)&varname, sizeof(varname), DATA, __VA_ARGS__)
50#define REGISTERSTRING(stringname, ...) \
51    registerVariable(&stringname, stringname.length()+1, STRING, __VA_ARGS__)*/
52
53namespace orxonox
54{
55  static const unsigned int OBJECTID_UNKNOWN = (unsigned int)-1;
56
57  namespace objectDirection{
58    enum objectdirection{
59      toclient=0x1,
60      toserver=0x2,
61      bidirectional=0x3
62    };
63  }
64
65  struct _NetworkExport synchronisableHeader{
66    uint32_t size:31;
67    bool dataAvailable:1;
68    uint32_t objectID;
69    uint32_t creatorID;
70    uint32_t classID;
71  };
72
73
74  /**
75  * This class is the base class of all the Objects in the universe that need to be synchronised over the network
76   * Every class, that inherits from this class has to link the DATA THAT NEEDS TO BE SYNCHRONISED into the linked list.
77  * @author Oliver Scheuss
78  */
79  class _NetworkExport Synchronisable : virtual public OrxonoxClass{
80  public:
81    friend class packet::Gamestate;
82//     friend class Server;
83    virtual ~Synchronisable();
84
85    static void setClient(bool b);
86
87    static Synchronisable *fabricate(uint8_t*& mem, uint8_t mode=0x0);
88    static bool deleteObject(unsigned int objectID);
89    static Synchronisable *getSynchronisable(unsigned int objectID);
90    static unsigned int getNumberOfDeletedObject(){ return deletedObjects_.size(); }
91    static unsigned int popDeletedObject(){ unsigned int i = deletedObjects_.front(); deletedObjects_.pop(); return i; }
92
93    inline unsigned int getObjectID(){return objectID;}
94    inline unsigned int getClassID(){return classID;}
95  protected:
96    Synchronisable(BaseObject* creator);
97//     void registerVariable(void *var, int size, variableType t, uint8_t mode=0x1, NetworkCallbackBase *cb=0);
98    template <class T> void registerVariable(T& variable, uint8_t mode=0x1, NetworkCallbackBase *cb=0, bool bidirectional=false);
99    template <class T> void unregisterVariable(T& var);
100    void setObjectMode(uint8_t mode);
101    void setObjectFrequency(unsigned int freq){ objectFrequency_ = freq; }
102
103
104  private:
105    bool getData(uint8_t*& men, unsigned int id, uint8_t mode=0x0);
106    uint32_t getSize(unsigned int id, uint8_t mode=0x0);
107    bool updateData(uint8_t*& mem, uint8_t mode=0x0, bool forceCallback=false);
108    bool isMyData(uint8_t* mem);
109    bool doSelection(unsigned int id);
110    bool doSync(unsigned int id, uint8_t mode=0x0);
111
112    unsigned int objectID;
113    unsigned int creatorID;
114    unsigned int classID;
115
116    std::list<SynchronisableVariableBase*> syncList;
117    static uint8_t state_; // detemines wheter we are server (default) or client
118    bool backsync_; // if true the variables with mode > 1 will be synchronised to server (client -> server)
119    unsigned int objectFrequency_;
120    int objectMode_;
121    static std::map<unsigned int, Synchronisable *> objectMap_;
122    static std::queue<unsigned int> deletedObjects_;
123  };
124 
125  template <class T> void Synchronisable::registerVariable(T& variable, uint8_t mode, NetworkCallbackBase *cb, bool bidirectional)
126  {
127    if (bidirectional)
128      syncList.push_back(new SynchronisableVariableBidirectional<const T>(variable, mode, cb));
129    else
130      syncList.push_back(new SynchronisableVariable<const T>(variable, mode, cb));
131  }
132
133  template <class T> void Synchronisable::unregisterVariable(T& var){
134    std::list<SynchronisableVariableBase*>::iterator it = syncList.begin();
135    while(it!=syncList.end()){
136      if( ((*it)->getReference()) == &var ){
137        delete (*it);
138        syncList.erase(it);
139        return;
140      }
141      else
142        it++;
143    }
144    bool unregistered_nonexistent_variable = false;
145    assert(unregistered_nonexistent_variable); //if we reach this point something went wrong:
146    // the variable has not been registered before
147  }
148 
149  // ================= Specialisation declarations
150  template <> void Synchronisable::registerVariable( const ColourValue& variable, uint8_t mode, NetworkCallbackBase* cb, bool bidirectional);template <> void Synchronisable::registerVariable( const ColourValue& variable, uint8_t mode, NetworkCallbackBase* cb, bool bidirectional);
151  template <> void Synchronisable::registerVariable( ColourValue& variable, uint8_t mode, NetworkCallbackBase* cb, bool bidirectional);
152  template <> void Synchronisable::registerVariable( const Vector2& variable, uint8_t mode, NetworkCallbackBase* cb, bool bidirectional);
153  template <> void Synchronisable::registerVariable( Vector2& variable, uint8_t mode, NetworkCallbackBase* cb, bool bidirectional);
154  template <> void Synchronisable::registerVariable( const Vector3& variable, uint8_t mode, NetworkCallbackBase* cb, bool bidirectional);
155  template <> void Synchronisable::registerVariable( Vector3& variable, uint8_t mode, NetworkCallbackBase* cb, bool bidirectional);
156  template <> void Synchronisable::registerVariable( const Vector4& variable, uint8_t mode, NetworkCallbackBase* cb, bool bidirectional);
157  template <> void Synchronisable::registerVariable( Vector4& variable, uint8_t mode, NetworkCallbackBase* cb, bool bidirectional);
158  template <> void Synchronisable::registerVariable( mbool& variable, uint8_t mode, NetworkCallbackBase* cb, bool bidirectional);
159  template <> void Synchronisable::registerVariable( const Quaternion& variable, uint8_t mode, NetworkCallbackBase* cb, bool bidirectional);
160  template <> void Synchronisable::registerVariable( Quaternion& variable, uint8_t mode, NetworkCallbackBase* cb, bool bidirectional);
161//   template <> void Synchronisable::registerVariable( LODParticle::LOD& variable, uint8_t mode, NetworkCallbackBase* cb, bool bidirectional);
162//   template <> void Synchronisable::registerVariable( Ogre::Light::LightTypes& variable, uint8_t mode, NetworkCallbackBase* cb, bool bidirectional);
163}
164
165#endif /* _Synchronisable_H__ */
Note: See TracBrowser for help on using the repository browser.