Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

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

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

made some adjustments mostly to the networkid (classid) in order to have it platform independent

  • Property svn:eol-style set to native
  • Property svn:mergeinfo set to (toggle deleted branches)
    /code/branches/ceguilua/src/network/Synchronisable.h1802-1808
    /code/branches/core3/src/network/Synchronisable.h1572-1739
    /code/branches/gcc43/src/network/Synchronisable.h1580
    /code/branches/gui/src/network/Synchronisable.h1635-1723
    /code/branches/input/src/network/Synchronisable.h1629-1636
    /code/branches/objecthierarchy/src/network/Synchronisable.h1911-2085,​2100,​2110-2169
    /code/branches/pickups/src/network/Synchronisable.h1926-2086
    /code/branches/questsystem/src/network/Synchronisable.h1894-2088
    /code/branches/script_trigger/src/network/Synchronisable.h1295-1953,​1955
    /code/branches/weapon/src/network/Synchronisable.h1925-2094
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 uint32_t OBJECTID_UNKNOWN = static_cast<uint32_t>(-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(uint32_t objectID);
89    static Synchronisable *getSynchronisable(uint32_t objectID);
90    static unsigned int getNumberOfDeletedObject(){ return deletedObjects_.size(); }
91    static uint32_t popDeletedObject(){ uint32_t i = deletedObjects_.front(); deletedObjects_.pop(); return i; }
92
93    inline uint32_t getObjectID(){return objectID;}
94    inline uint32_t 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, int32_t id, uint8_t mode=0x0);
106    uint32_t getSize(int32_t 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(int32_t id);
110    bool doSync(int32_t id, uint8_t mode=0x0);
111
112    uint32_t objectID;
113    uint32_t creatorID;
114    uint32_t 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<uint32_t, Synchronisable *> objectMap_;
122    static std::queue<uint32_t> 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 <> _NetworkExport void Synchronisable::registerVariable( const ColourValue& variable, uint8_t mode, NetworkCallbackBase* cb, bool bidirectional);
151  template <> _NetworkExport void Synchronisable::registerVariable( ColourValue& variable, uint8_t mode, NetworkCallbackBase* cb, bool bidirectional);
152  template <> _NetworkExport void Synchronisable::registerVariable( const Vector2& variable, uint8_t mode, NetworkCallbackBase* cb, bool bidirectional);
153  template <> _NetworkExport void Synchronisable::registerVariable( Vector2& variable, uint8_t mode, NetworkCallbackBase* cb, bool bidirectional);
154  template <> _NetworkExport void Synchronisable::registerVariable( const Vector3& variable, uint8_t mode, NetworkCallbackBase* cb, bool bidirectional);
155  template <> _NetworkExport void Synchronisable::registerVariable( Vector3& variable, uint8_t mode, NetworkCallbackBase* cb, bool bidirectional);
156  template <> _NetworkExport void Synchronisable::registerVariable( const Vector4& variable, uint8_t mode, NetworkCallbackBase* cb, bool bidirectional);
157  template <> _NetworkExport void Synchronisable::registerVariable( Vector4& variable, uint8_t mode, NetworkCallbackBase* cb, bool bidirectional);
158  template <> _NetworkExport void Synchronisable::registerVariable( mbool& variable, uint8_t mode, NetworkCallbackBase* cb, bool bidirectional);
159  template <> _NetworkExport void Synchronisable::registerVariable( const Quaternion& variable, uint8_t mode, NetworkCallbackBase* cb, bool bidirectional);
160  template <> _NetworkExport void Synchronisable::registerVariable( Quaternion& variable, uint8_t mode, NetworkCallbackBase* cb, bool bidirectional);
161//   template <> _NetworkExport void Synchronisable::registerVariable( LODParticle::LOD& variable, uint8_t mode, NetworkCallbackBase* cb, bool bidirectional);
162//   template <> _NetworkExport 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.