Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: code/branches/FICN/src/network/Synchronisable.cc @ 592

Last change on this file since 592 was 592, checked in by nicolasc, 16 years ago

added engineglow particle effect - based of treibwerk
other various changes

File size: 5.5 KB
RevLine 
[230]1//
2// C++ Implementation: synchronisable
3//
[285]4// Description:
[230]5//
6//
[247]7// Author:  Dumeni, Oliver Scheuss, (C) 2007
[230]8//
9// Copyright: See COPYING file that comes with this distribution
10//
[238]11
[285]12#include "Synchronisable.h"
[531]13#include "orxonox/core/CoreIncludes.h"
[230]14
[531]15
[230]16namespace network {
17
[247]18/**
19 * Constructor:
20 * calls registarAllVariables, that has to be implemented by the inheriting classID
21 */
[230]22Synchronisable::Synchronisable()
23{
[531]24  RegisterRootObject(Synchronisable);
[401]25  static int idCounter=0;
[247]26  datasize=0;
[401]27  objectID=idCounter++;
[565]28//   registerAllVariables();
[230]29}
30
31
32Synchronisable::~Synchronisable()
33{
[285]34
[230]35}
36
[247]37/**
38 * This function is used to register a variable to be synchronized
39 * also counts the total datasize needed to save the variables
40 * @param var pointer to the variable
41 * @param size size of the datatype the variable consists of
42 */
[565]43void Synchronisable::registerVar(const void *var, int size, variableType t){
[247]44  // create temporary synch.Var struct
[565]45  synchronisableVariable temp={size, var, t};
[247]46  // increase datasize
47  datasize+=sizeof(int)+size;
48  // push temp to syncList (at the bottom)
[237]49  syncList.push_back(temp);
50}
[247]51
52/**
53 * note: only use this function for debug use, because it's inefficient (in order to produce a gamestate, you have to copy the whole data again to another memory location after this process)
54 * This function takes all SynchronisableVariables out of the Synchronisable and saves it into a syncData struct
55 * structure of the bitstream:
56 * (var1_size,var1,var2_size,var2,...)
57 * varx_size: size = sizeof(int)
58 * varx: size = varx_size
59 * @return data containing all variables and their sizes
60 */
[571]61// syncData Synchronisable::getData(){
62//   std::list<synchronisableVariable>::iterator i;
63//   int totalsize=0;
64//   //figure out size of data to be allocated
65//   for(i=syncList.begin(); i!=syncList.end(); i++){
66//     // increase size (size of variable and size of size of variable ;)
67//     if(i->type == STRING)
68//       totalsize+=sizeof(int)+((std::string *)i->var)->length()+1;
69//     else
70//       totalsize+=sizeof(int)+i->size;
71//   }
72//   syncData retVal;
73//   retVal.objectID=this->objectID;
74//   retVal.classID=this->classID;
75//   retVal.length=totalsize;
76//   // allocate memory
77//   retVal.data = (unsigned char *)malloc(totalsize);
78//   // copy to location
79//   //CHANGED: REMOVED DECLARATION int n=0 FROM LOOP
80//   int n=0;
81//   for(i=syncList.begin(); n<totalsize && i!=syncList.end(); i++){
82//     std::memcpy(retVal.data+n, (const void*)(i->size), sizeof(int));
83//     n+=sizeof(int);
84//     switch(i->type){
85//     case STRING:
86//       std::memcpy(retVal.data+n, (const void *)(((std::string *)i->var)->c_str()), ((std::string *)i->var)->length()+1);
87//       n+=((std::string *)i->var)->length()+1;
88//       break;
89//     case DATA:
90//       std::memcpy(retVal.data+n, ((const void*)i->var), i->size);
91//       n+=i->size;
92//       break;
93//     }
94//   }
95//   return retVal;
96// }
[247]97/**
98 * This function takes all SynchronisableVariables out of the Synchronisable and saves it into a syncData struct
99 * Difference to the above function:
100 * takes a pointer to already allocated memory (must have at least getSize bytes length)
101 * structure of the bitstream:
102 * (var1_size,var1,var2_size,var2,...)
103 * varx_size: size = sizeof(int)
104 * varx: size = varx_size
105 * @return data containing all variables and their sizes
106 */
107syncData Synchronisable::getData(unsigned char *mem){
108  std::list<synchronisableVariable>::iterator i;
109  syncData retVal;
110  retVal.objectID=this->objectID;
111  retVal.classID=this->classID;
112  retVal.length=datasize;
113  retVal.data=mem;
114  // copy to location
115  int n=0;
[571]116  for(i=syncList.begin(); n<datasize && i!=syncList.end(); ++i){
[573]117    COUT(2) << "size of variable: " << i->size << std::endl;
[592]118    COUT(2) << "size of variable: " << i->size << std::endl;
[569]119    //COUT(2) << "size of variable: " << i->size << std::endl;
[571]120    //(std::memcpy(retVal.data+n, (const void*)(&(i->size)), sizeof(int));
121    *((int *)(retVal.data+n)) = i->size;
[247]122    n+=sizeof(int);
[565]123    switch(i->type){
124      case DATA:
125        std::memcpy(retVal.data+n, (const void*)(i->var), i->size);
126        n+=i->size;
127        break;
128      case STRING:
[571]129        std::memcpy( retVal.data+n, (const void*)( ( (std::string *) i->var)->c_str()), ( (std::string *)i->var )->length()+1);
[565]130        n+=((std::string *) i->var)->length()+1;
131        break;
132    }
[247]133  }
134  return retVal;
135}
136
137/**
138 * This function takes a syncData struct and takes it to update the variables
139 * @param vars data of the variables
140 * @return true/false
141 */
[237]142bool Synchronisable::updateData(syncData vars){
143  unsigned char *data=vars.data;
144  std::list<synchronisableVariable>::iterator i;
145  for(i=syncList.begin(); i!=syncList.end(); i++){
[565]146    if((int)*data==i->size || i->type==STRING){
147      switch(i->type){
148      case DATA:
149        data+=sizeof(int);
150        memcpy((void*)i->var, data, i->size);
151        data+=i->size;
152        break;
153      case STRING:
154        i->size = (int)*data;
155        data+=sizeof(int);
156        *((std::string *)i->var) = std::string((const char*)data);
157        data += i->size;
158        break;
159      }
[237]160    } else
161      return false; //there was some problem with registerVar
162  }
[405]163  return true;
[237]164}
[230]165
[247]166/**
167 * This function returns the total amount of bytes needed by getData to save the whole content of the variables
168 * @return amount of bytes
169 */
170int Synchronisable::getSize(){
[565]171  int tsize=0;
172  std::list<synchronisableVariable>::iterator i;
173  for(i=syncList.begin(); i!=syncList.end(); i++){
174    switch(i->type){
175    case DATA:
176      tsize+=i->size;
177      break;
178    case STRING:
179      tsize+=((std::string *)i->var)->length()+1;
180      break;
181    }
182  }
183  return tsize;
[230]184}
[247]185
186}
Note: See TracBrowser for help on using the repository browser.