Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

Changeset 6275 in orxonox.OLD


Ignore:
Timestamp:
Dec 24, 2005, 2:15:49 PM (18 years ago)
Author:
rennerc
Message:

synchronizeable: added macros to help write/read data

Location:
branches/network/src
Files:
9 edited

Legend:

Unmodified
Added
Removed
  • branches/network/src/lib/lang/base_object.cc

    r6257 r6275  
    7575  this->classID |= (long)classID;
    7676  this->className = className;
    77   this->realClassID = classID;
    7877
    7978  ClassList::addToClassList(this, classID, className);
  • branches/network/src/lib/lang/base_object.h

    r6257 r6275  
    3434  /** @returns the classID of the corresponding Object */
    3535  inline int getClassID() const { return this->classID; };
    36   inline int getRealClassID() const { return this->realClassID; };
     36  inline ClassID getLeafID() { return (ClassID)(this->classID & CL_MASK_LOWLEVEL_CLASS); }
    3737
    3838  bool isA (ClassID classID) const;
     
    5050    const char*        className;        //!< the name of the class
    5151    long               classID;          //!< this is the id from the class_id.h enumeration
    52     long               realClassID;      //!< classID which can be used with factory
    5352    char*              objectName;       //!< The name of this object
    5453};
  • branches/network/src/lib/network/converter.cc

    r6273 r6275  
    444444  {
    445445    PRINTF(1)("There is not enough space in string (%d) to store %d bytes\n", maxLength, length+1 );
     446    strncpy(s,"",maxLength);
    446447    return -1;
    447448  }
  • branches/network/src/lib/network/data_stream.h

    r5822 r6275  
    1313#include "netdefs.h"
    1414
    15 #define DATA_STREAM_BUFFER_SIZE 1024
     15#define DATA_STREAM_BUFFER_SIZE 10240
    1616
    1717class DataStream : public BaseObject
  • branches/network/src/lib/network/network_game_manager.cc

    r6273 r6275  
    236236    }
    237237
     238
    238239    if ( b->isA(CL_SYNCHRONIZEABLE) )
    239240    {
     
    372373  while ( it != e )
    373374  {
    374     if ( (*it)->getRealClassID() != CL_NETWORK_GAME_MANAGER && (*it)->getRealClassID() != CL_HANDSHAKE )
    375     {
    376 
    377       if ( !writeToClientBuffer( outBuffer[userID], (*it)->getRealClassID() ) )
     375    if ( (*it)->getLeafID() != CL_NETWORK_GAME_MANAGER && (*it)->getLeafID() != CL_HANDSHAKE )
     376    {
     377
     378      if ( !writeToClientBuffer( outBuffer[userID], (int)((*it)->getLeafID()) ) )
    378379        return;
    379380
     
    425426    PRINTF(1)("Could not fabricate Object with classID %x\n", classID);
    426427    return;
    427   }
    428   else
    429   {
    430     //PRINTF(0)("Fabricated entity: %s\n", b->getClassName());
    431428  }
    432429
     
    439436    if ( !isServer() )
    440437      s->setIsOutOfSync( true );
     438    PRINTF(0)("Fabricated %s with id %d\n", s->getClassName(), s->getUniqueID());
    441439  }
    442440  else
  • branches/network/src/lib/network/synchronizeable.h

    r6273 r6275  
    2121#define STATE_REQUESTEDSYNC 4
    2222
     23
    2324//macros to help writing data in byte buffer
    24 #define SYNCHELP_WRITE_BEGIN() {  int __synchelp_write_i = 0; \
    25                                   bool __synchelp_write_err = false; \
    26                                   int __synchelp_write_n; }
     25/*
     26 * Important: these macros must be used in
     27 *     SYNCHELP_READ_*:  virtual void      writeBytes(const byte* data, int length, int sender);
     28 *     SYNCHELP_WRITE_*: virtual int       readBytes(byte* data, int maxLength, int * reciever);
     29 * with the same argument names!
     30 *
     31 *
     32 * Example 1:
     33 *  SYNCHELP_READ_BEGIN();
     34 *  SYNCHELP_READ_FLOAT(size);
     35 *  SYNCHELP_READ_STRING( textureName, 1024 ); //1024 is the length of textureName
     36 *
     37 * Example 2:
     38 *  SYNCHELP_WRITE_BEGIN();
     39 *  SYNCHELP_WRITE_FLOAT(this->size);
     40 *  SYNCHELP_WRITE_STRING(this->textureName);
     41 *  return SYNCHELP_WRITE_N;
     42 *
     43 */
     44#define SYNCHELP_WRITE_BEGIN()    int __synchelp_write_i = 0; \
     45                                  int __synchelp_write_n
    2746#define SYNCHELP_WRITE_RESET() { __synchelp_write_i = 0; __synchelp_write_err = false; }
    28 #define SYNCHELP_WRITE_INT(i) { __synchelp_write_n =  }
    29 #define SYNCHELP_WIRTE_FLOAT()
    30 #define SYNCHELP_WRITE_BYTE()
    31 #define SYNCHELP_WRITE_STRING()
     47#define SYNCHELP_WRITE_INT(i) { __synchelp_write_n = \
     48                                Converter::intToByteArray( i, data+__synchelp_write_i, maxLength-__synchelp_write_i ); \
     49                                if ( __synchelp_write_n <= 0) \
     50{ \
     51                                  PRINTF(1)("Buffer is too small to store a int\n"); \
     52                                  return 0; \
     53} \
     54                                __synchelp_write_i += __synchelp_write_n; \
     55}
     56#define SYNCHELP_WRITE_FLOAT(f) { __synchelp_write_n = \
     57                                Converter::floatToByteArray( f, data+__synchelp_write_i, maxLength-__synchelp_write_i ); \
     58                                if ( __synchelp_write_n <= 0) \
     59{ \
     60                                  PRINTF(1)("Buffer is too small to store a float\n"); \
     61                                  return 0; \
     62} \
     63                                __synchelp_write_i += __synchelp_write_n; \
     64}
     65#define SYNCHELP_WRITE_BYTE(b) { \
     66                                if (maxLength - __synchelp_write_i < 1) \
     67{ \
     68                                  PRINTF(1)("Buffer is too small to store string\n"); \
     69                                  return 0; \
     70} \
     71                                data[__synchelp_write_i] = b; \
     72                                __synchelp_write_i++; \
     73}
     74#define SYNCHELP_WRITE_STRING(s) { __synchelp_write_n = \
     75                                Converter::stringToByteArray( s, data+__synchelp_write_i, strlen(s), maxLength-__synchelp_write_i ); \
     76                                if ( __synchelp_write_n <= 0) \
     77{ \
     78                                  PRINTF(1)("Buffer is too small to store string\n"); \
     79                                  return 0; \
     80} \
     81                                __synchelp_write_i += __synchelp_write_n; \
     82}
     83#define SYNCHELP_WRITE_N __synchelp_write_i
     84
     85
     86#define SYNCHELP_READ_BEGIN()     int __synchelp_read_i = 0; \
     87                                  int __synchelp_read_n
     88
     89#define SYNCHELP_READ_INT(i)       { \
     90                                    if ( length-__synchelp_read_i < INTSIZE ) \
     91{ \
     92                                      PRINTF(1)("There is not enough data to read an int\n");  \
     93                                      return; \
     94} \
     95                                    __synchelp_read_i += Converter::byteArrayToInt( data+__synchelp_read_i, &i );  \
     96}
     97#define SYNCHELP_READ_FLOAT(f)    { \
     98                                    if ( length-__synchelp_read_i < FLOATSIZE ) \
     99{ \
     100                                      PRINTF(1)("There is not enough data to read a flaot\n");  \
     101                                      return; \
     102} \
     103                                    __synchelp_read_i += Converter::byteArrayToFloat( data+__synchelp_read_i, &f );  \
     104}
     105#define SYNCHELP_READ_STRING(s,l)    { \
     106                                    __synchelp_read_n = Converter::byteArrayToString( data+__synchelp_read_i, s, l );  \
     107                                    if ( __synchelp_read_n <0 )  \
     108{ \
     109                                      PRINTF(1)("There is not enough data to read string\n");  \
     110                                      return; \
     111} \
     112}
     113#define SYNCHELP_READ_BYTE(b)      { \
     114                                    if ( length-__synchelp_read_i < 1 ) \
     115{ \
     116                                      PRINTF(1)("There is not enough data to read a byte\n");  \
     117                                      return; \
     118} \
     119                                    b = data[__synchelp_read_i]; \
     120                                    __synchelp_read_i ++;  \
     121}
    32122
    33123class NetworkStream;
  • branches/network/src/world_entities/skybox.cc

    r6273 r6275  
    218218  setIsOutOfSync( false );
    219219
    220   int flsize = Converter::byteArrayToFloat( data, &size );
    221   Converter::byteArrayToString( data+flsize, textureName, length-flsize );
    222 
    223   PRINT(0)("GOT DATA: size=%f texture=%s\n", size, textureName);
     220  /*int flsize = Converter::byteArrayToFloat( data, &size );
     221  Converter::byteArrayToString( data+flsize, textureName, length-flsize );*/
     222
     223  SYNCHELP_READ_BEGIN();
     224  SYNCHELP_READ_FLOAT(size);
     225  SYNCHELP_READ_STRING( textureName, 1024 );
     226
     227  //PRINT(0)("GOT DATA: size=%f texture=%s\n", size, textureName);
    224228
    225229  this->setSize( size );
     
    228232}
    229233
     234
     235
    230236int SkyBox::readBytes( byte * data, int maxLength, int * reciever )
    231237{
    232238  if ( isOutOfSync() && !requestedSync() && this->getHostID()!=this->getOwner() )
    233239  {
    234     PRINTF(0)("Requesting sync! %d\n", this->getUniqueID());
     240    //PRINTF(0)("Requesting sync! %d\n", this->getUniqueID());
    235241    (NetworkGameManager::getInstance())->sync( this->getUniqueID(), this->getOwner() );
    236242    setRequestedSync( true );
     
    240246  if ( rec > 0 )
    241247  {
    242     PRINTF(0)("Serving client %d which requested sync %d size=%f texture=%s\n", rec, this->getUniqueID(), this->size, this->textureName);
     248    //PRINTF(0)("Serving client %d which requested sync %d size=%f texture=%s\n", rec, this->getUniqueID(), this->size, this->textureName);
    243249    *reciever = rec;
    244250
    245     int flsize = Converter::floatToByteArray( this->size, data, maxLength );
    246 
    247     if ( flsize <= 0 )
    248     {
    249       PRINTF(1)("Byte array is too small (%d) to store float\n", maxLength );
    250       return 0;
    251     }
    252 
    253     if ( strlen(textureName)+INTSIZE+flsize > maxLength )
    254     {
    255       PRINTF(1)("Byte array is too small (%d) to store data\n", maxLength );
    256       return 0;
    257     }
    258 
    259     return flsize + Converter::stringToByteArray( textureName, data+flsize, strlen(textureName), maxLength-flsize );
    260 
     251    SYNCHELP_WRITE_BEGIN();
     252    SYNCHELP_WRITE_FLOAT(this->size);
     253    SYNCHELP_WRITE_STRING(this->textureName);
     254
     255    return SYNCHELP_WRITE_N;
    261256  }
    262257
  • branches/network/src/world_entities/terrain.cc

    r6142 r6275  
    2424#include "resource_manager.h"
    2525#include "model.h"
     26#include "network_game_manager.h"
     27
    2628
    2729#include "glincl.h"
     
    5759    {
    5860      this->loadModel(fileName);
     61      strncpy( terrainFile, fileName, 1024 );
    5962    }
    6063  else
     
    98101  this->ssp = NULL;
    99102  this->vegetation = NULL;
     103  strncpy( this->vegetationFile, "", 1024 );
     104  strncpy( this->terrainFile, "", 1024 );
    100105}
    101106
     
    111116void Terrain::loadVegetation(const char* vegetationFile)
    112117{
     118  PRINTF(0)("loadVegetation: %s\n", vegetationFile);
    113119  if (this->vegetation)
    114120    ResourceManager::getInstance()->unload(this->vegetation, RP_LEVEL);
     
    116122  {
    117123    PRINTF(4)("fetching %s\n", vegetationFile);
    118       this->vegetation = (Model*)ResourceManager::getInstance()->load(vegetationFile, OBJ, RP_CAMPAIGN);
     124    this->vegetation = (Model*)ResourceManager::getInstance()->load(vegetationFile, OBJ, RP_CAMPAIGN);
     125    strncpy( this->vegetationFile, vegetationFile, 1024);
    119126  }
    120127  else
     
    315322    }
    316323}
     324
     325void Terrain::writeBytes( const byte * data, int length, int sender )
     326{
     327  setRequestedSync( false );
     328  setIsOutOfSync( false );
     329
     330  int n = Converter::byteArrayToString( data, vegetationFile, length );
     331  Converter::byteArrayToString( data+n, terrainFile, length-n );
     332
     333  //PRINT(0)("GOT DATA: size=%f texture=%s\n", size, textureName);
     334
     335  if ( strcmp(vegetationFile, "") )
     336    this->loadVegetation( vegetationFile );
     337  if ( strcmp(terrainFile, "") )
     338    this->loadModel( terrainFile );
     339
     340}
     341
     342int Terrain::readBytes( byte * data, int maxLength, int * reciever )
     343{
     344  if ( isOutOfSync() && !requestedSync() && this->getHostID()!=this->getOwner() )
     345  {
     346    //PRINTF(0)("Requesting sync! %d\n", this->getUniqueID());
     347    (NetworkGameManager::getInstance())->sync( this->getUniqueID(), this->getOwner() );
     348    setRequestedSync( true );
     349  }
     350
     351  int rec = this->getRequestSync();
     352  if ( rec > 0 )
     353  {
     354    //PRINTF(0)("Serving client %d which requested sync %d size=%f texture=%s\n", rec, this->getUniqueID(), this->size, this->textureName);
     355    *reciever = rec;
     356
     357    if ( strlen(vegetationFile)+INTSIZE > maxLength )
     358    {
     359      PRINTF(1)("Byte array is too small (%d) to store data\n", maxLength );
     360      return 0;
     361    }
     362
     363    int n = Converter::stringToByteArray( vegetationFile, data, strlen(vegetationFile), maxLength );
     364
     365    return n + Converter::stringToByteArray( terrainFile, data+n, strlen(terrainFile), maxLength-n );
     366
     367  }
     368
     369  *reciever = 0;
     370  return 0;
     371}
     372
     373void Terrain::writeDebug( ) const
     374{
     375}
     376
     377void Terrain::readDebug( ) const
     378{
     379}
  • branches/network/src/world_entities/terrain.h

    r5500 r6275  
    3030  virtual ~Terrain();
    3131
     32  virtual void      writeBytes(const byte* data, int length, int sender);
     33  virtual int       readBytes(byte* data, int maxLength, int * reciever);
     34  virtual void      writeDebug() const;
     35  virtual void      readDebug() const;
     36
    3237  void init();
    3338  void loadParams(const TiXmlElement* root);
     
    4449   Model*              vegetation;
    4550   int                 objectList;
     51   char                vegetationFile[1024];
     52   char                terrainFile[1024];
    4653};
    4754
Note: See TracChangeset for help on using the changeset viewer.