![]() |
Beaming Scene Service
2.0
RakNet wrapper for managing data communications between multiple Beaming clients
|
00001 // Uses ReplicaManager 3: A system to automatically create, destroy, and serialize objects 00002 00003 #include "StringTable.h" 00004 #include "RakPeerInterface.h" 00005 #include "RakNetworkFactory.h" 00006 #include <stdio.h> 00007 #include "Kbhit.h" 00008 #include <string.h> 00009 #include "BitStream.h" 00010 #include "MessageIdentifiers.h" 00011 #include "ReplicaManager3.h" 00012 #include "NetworkIDManager.h" 00013 #include "RakSleep.h" 00014 #include "FormatString.h" 00015 #include "RakString.h" 00016 #include "GetTime.h" 00017 #include "SocketLayer.h" 00018 #include "Getche.h" 00019 #include <vector> 00020 #include "PacketFileLogger.h" 00021 #include "utilMath.h" 00022 #include <iostream> 00023 #include <string> 00024 #include <map> 00025 #include <math.h> 00026 #if defined(__WIN32__) || defined(WIN32) 00027 #include <windows.h> 00028 #else 00029 #include <cstdio> 00030 #endif 00031 00032 //#define LOG_ENABLED 00033 00034 enum 00035 { 00036 CLIENT, 00037 SERVER 00038 } topology; 00039 00040 // ReplicaManager3 is in the namespace RakNet 00041 using namespace RakNet; 00042 00043 class BeamingUser; 00044 class BeamingAvatarJointReplica; 00045 class BeamingEmotionReplica; 00046 class BeamingFacialReplica; 00047 class BeamingTactileReplica; 00048 class BeamingRobotReplica; 00049 class BeamingRoom; 00050 class BeamingVideoReplica; 00051 class BeamingObjectReplica; 00052 class BeamingAudioReplica; 00053 class BeamingPointCloudReplica; 00054 class BeamingGenericReplica; 00055 00056 std::map<RakNetGUID, std::vector<std::string> > new_clients; //for client checkstatus() function - deprecated 00057 //NOTE: Perhaps using different maps may not be the most efficient approach, 00058 //however, using one map for all replicas will require typecasting which can cause type errors or affect performance 00059 std::map<RakNetGUID, std::vector<BeamingAvatarJointReplica*> > avatar_joint_replicas; //lookup by guid, to get pointers for avatar joint replicas 00060 std::map<RakNetGUID, std::vector<BeamingEmotionReplica*> > emotion_replicas; //lookup by guid, to get pointers for emotion replicas 00061 std::map<RakNetGUID, std::vector<BeamingFacialReplica*> > facial_replicas; //lookup by guid, to get pointers for facial replicas 00062 std::map<RakNetGUID, std::vector<BeamingTactileReplica*> > tactile_replicas; //lookup by guid, to get pointers for tactile replicas 00063 std::map<RakNetGUID, std::vector<BeamingRobotReplica*> > robot_replicas; //lookup by guid, to get pointers for robot replicas 00064 std::map<RakNetGUID, std::vector<BeamingVideoReplica*> > video_replicas; //lookup by guid, to get pointers for video replicas 00065 std::map<RakNetGUID, std::vector<BeamingObjectReplica*> > object_replicas; //lookup by guid, to get pointers for object replicas 00066 std::map<RakNetGUID, std::vector<BeamingAudioReplica*> > audio_replicas; //lookup by guid, to get pointers for audio replicas 00067 std::map<RakNetGUID, std::vector<BeamingPointCloudReplica*> > point_cloud_replicas; //lookup by guid, to get pointers for point cloud replicas 00068 std::map<RakNetGUID, std::vector<BeamingGenericReplica*> > generic_replicas; //lookup by guid, to get pointers for generic replicas 00069 struct node_info { 00070 std::string name; 00071 std::string type; 00072 char *peername; 00073 char *peertype; 00074 char *peercfg; 00075 char *ipport; 00076 }; 00077 std::map<std::string, std::vector<node_info*> > nodes_map; //lookup by guid, to get node_info 00078 PacketFileLogger logfileHandler; 00079 bool logging=false; 00080 00081 00083 class BeamingUser : public Replica3 00084 { 00085 public: 00086 void PrintOutput(RakNet::BitStream *bs) 00087 { 00088 if (bs->GetNumberOfBitsUsed()==0) 00089 return; 00090 RakNet::RakString rakString; 00091 bs->Read(rakString); 00092 printf("Receive: %s\n", rakString.C_String()); 00093 } 00094 virtual void SerializeConstruction(RakNet::BitStream *constructionBitstream, RakNet::Connection_RM3 *destinationConnection) { 00095 constructionBitstream->Write(clientname); 00096 constructionBitstream->Write(clientType); 00097 constructionBitstream->Write(clientConfig); 00098 constructionBitstream->Write(ip_port); 00099 strcpy(username,""); 00100 #if defined(__WIN32__) || defined(WIN32) 00101 DWORD size; 00102 (GetUserNameA( username, &size )); 00103 #else 00104 FILE *name; 00105 name = popen("whoami", "r"); 00106 fgets(username, sizeof(username), name); 00107 pclose(name); 00108 #endif 00109 constructionBitstream->Write(username); 00110 } 00111 virtual bool DeserializeConstruction(RakNet::BitStream *constructionBitstream, RakNet::Connection_RM3 *sourceConnection) { 00112 constructionBitstream->Read(clientname); 00113 constructionBitstream->Read(clientType); 00114 constructionBitstream->Read(clientConfig); 00115 constructionBitstream->Read(ip_port); 00116 constructionBitstream->Read(username); 00117 if (topology == SERVER) 00118 { 00119 printf("Connection from user: %s, ip: %s\n",username,sourceConnection->GetSystemAddress().ToString()); 00120 sprintf(ip_port,"%s",sourceConnection->GetSystemAddress().ToString()); 00121 00122 } else { 00123 printf("Connection from user: %s\n",username); } 00124 new_clients[this->GetCreatingSystemGUID()].push_back(clientname); 00125 new_clients[this->GetCreatingSystemGUID()].push_back(clientType); 00126 new_clients[this->GetCreatingSystemGUID()].push_back(clientConfig); 00127 return true; 00128 } 00129 virtual void SerializeDestruction(RakNet::BitStream *destructionBitstream, RakNet::Connection_RM3 *destinationConnection) { } 00130 virtual bool DeserializeDestruction(RakNet::BitStream *destructionBitstream, RakNet::Connection_RM3 *sourceConnection) { return true; } 00131 virtual void DeallocReplica(RakNet::Connection_RM3 *sourceConnection) { delete this; } 00132 virtual RM3SerializationResult Serialize(SerializeParameters *serializeParameters) { 00133 return RM3SR_BROADCAST_IDENTICALLY; 00134 } 00135 virtual void Deserialize(RakNet::DeserializeParameters *deserializeParameters) { } 00136 virtual void SerializeConstructionRequestAccepted(RakNet::BitStream *serializationBitstream, RakNet::Connection_RM3 *requestingConnection) { } 00137 virtual void DeserializeConstructionRequestAccepted(RakNet::BitStream *serializationBitstream, RakNet::Connection_RM3 *acceptingConnection) { } 00138 virtual void SerializeConstructionRequestRejected(RakNet::BitStream *serializationBitstream, RakNet::Connection_RM3 *requestingConnection) { } 00139 virtual void DeserializeConstructionRequestRejected(RakNet::BitStream *serializationBitstream, RakNet::Connection_RM3 *rejectingConnection) { } 00140 virtual RM3ConstructionState QueryConstruction(RakNet::Connection_RM3 *destinationConnection, ReplicaManager3 *replicaManager3) { 00141 return QueryConstruction_ClientConstruction(destinationConnection); 00142 } 00143 virtual bool QueryRemoteConstruction(RakNet::Connection_RM3 *sourceConnection) { 00144 return QueryRemoteConstruction_ClientConstruction(sourceConnection); 00145 } 00146 00147 virtual RM3QuerySerializationResult QuerySerialization(RakNet::Connection_RM3 *destinationConnection) { 00148 return QuerySerialization_ClientSerializable(destinationConnection); 00149 } 00150 virtual RM3ActionOnPopConnection QueryActionOnPopConnection(RakNet::Connection_RM3 *droppedConnection) const { 00151 if (topology==SERVER) 00152 return QueryActionOnPopConnection_Server(droppedConnection); 00153 else 00154 return QueryActionOnPopConnection_Client(droppedConnection); 00155 } 00156 00157 char clientname[128]; 00158 char clientConfig[128]; 00159 char clientType[128]; 00160 char username[128]; 00161 char logstr[1024]; 00162 char localtime[128]; 00163 char ip_port[128]; 00164 00165 BeamingUser() { } 00166 00167 virtual ~BeamingUser() { 00168 if (topology==SERVER) 00169 BroadcastDestruction(); 00170 } 00171 }; 00172 00173 00175 class BeamingAvatarJointReplica : public BeamingUser 00176 { 00177 virtual RakNet::RakString GetName(void) const {return RakNet::RakString("AVATAR");} 00178 virtual void WriteAllocationID(RakNet::BitStream *allocationIdBitstream) const { 00179 allocationIdBitstream->Write(GetName()); 00180 } 00181 virtual void SerializeConstruction(RakNet::BitStream *constructionBitstream, RakNet::Connection_RM3 *destinationConnection) { 00182 BeamingUser::SerializeConstruction(constructionBitstream, destinationConnection); 00183 constructionBitstream->Write(GetName() + RakNet::RakString(avatarjoint_id) + RakNet::RakString(" created for guid ") + RakNet::RakString(this->GetCreatingSystemGUID().ToString())); 00184 constructionBitstream->Write(avatarjoint_id); 00185 constructionBitstream->Write(parentbone); 00186 } 00187 virtual bool DeserializeConstruction(RakNet::BitStream *constructionBitstream, RakNet::Connection_RM3 *sourceConnection) { 00188 if (!BeamingUser::DeserializeConstruction(constructionBitstream, sourceConnection)) 00189 return false; 00190 RakNetTimeMS time = RakNet::GetTime(); 00191 PrintOutput(constructionBitstream); 00192 constructionBitstream->Read(avatarjoint_id); 00193 constructionBitstream->Read(parentbone); 00194 printf("Client: %s, Type: %s, Config: %s, Node: %s\n",clientname,clientType,clientConfig,avatarjoint_id); 00195 if (topology == CLIENT) 00196 { 00197 avatar_joint_replicas[this->GetCreatingSystemGUID()].push_back(this); //create within map on new client connection 00198 thisnode = new node_info; 00199 thisnode->name=avatarjoint_id; 00200 thisnode->type=GetName().C_String(); 00201 thisnode->peername = clientname; 00202 thisnode->peertype = clientType; 00203 thisnode->peercfg = clientConfig; 00204 thisnode->ipport = ip_port; 00205 nodes_map[this->GetCreatingSystemGUID().ToString()].push_back(thisnode); 00206 } 00207 if ((topology==SERVER)&&(logging==true)) 00208 { 00209 //printf("%"PRINTF_64_BIT_MODIFIER"u: %s client created; rem %i\n",(unsigned long long)time,sourceConnection->GetRakNetGUID().ToString(),avatar_joint_replicas.size()); 00210 logfileHandler.GetLocalTime(localtime); 00211 sprintf(logstr,"C;%"PRINTF_64_BIT_MODIFIER"u;%s;%s;0;%i",(unsigned long long)time,localtime,sourceConnection->GetRakNetGUID().ToString(),avatar_joint_replicas.size()); 00212 logfileHandler.WriteLog(logstr); 00213 } 00214 return true; 00215 } 00216 virtual void SerializeDestruction(RakNet::BitStream *destructionBitstream, RakNet::Connection_RM3 *destinationConnection) { 00217 BeamingUser::SerializeDestruction(destructionBitstream, destinationConnection); 00218 destructionBitstream->Write(GetName() + RakNet::RakString(avatarjoint_id) + RakNet::RakString(" removed for guid ") + RakNet::RakString(this->GetCreatingSystemGUID().ToString())); 00219 } 00220 virtual bool DeserializeDestruction(RakNet::BitStream *destructionBitstream, RakNet::Connection_RM3 *sourceConnection) { 00221 if (!BeamingUser::DeserializeDestruction(destructionBitstream, sourceConnection)) 00222 return false; 00223 RakNetTimeMS time = RakNet::GetTime(); 00224 PrintOutput(destructionBitstream); 00225 if (topology == CLIENT) 00226 { 00227 //remove avatar joints from avatar_joint_replicas 00228 for ( std::vector<BeamingAvatarJointReplica*>::iterator cIter = avatar_joint_replicas[this->GetCreatingSystemGUID()].begin(); cIter!=avatar_joint_replicas[this->GetCreatingSystemGUID()].end(); cIter++ ) { 00229 if (( strcmp((*cIter)->avatarjoint_id,avatarjoint_id) == 0 ) && ( strcmp((*cIter)->clientname,clientname) == 0 )) { 00230 avatar_joint_replicas[this->GetCreatingSystemGUID()].erase(cIter); 00231 break; 00232 } 00233 } 00234 //remove avatar joints from nodes_map 00235 for ( std::vector<node_info*>::iterator cIter = nodes_map[this->GetCreatingSystemGUID().ToString()].begin(); cIter!=nodes_map[this->GetCreatingSystemGUID().ToString()].end(); cIter++ ) { 00236 if (( strcmp((*cIter)->name.c_str(),avatarjoint_id) == 0 ) && ( strcmp((*cIter)->peername,clientname) == 0 )) { 00237 nodes_map[this->GetCreatingSystemGUID().ToString()].erase(cIter); 00238 break; 00239 } 00240 } 00241 if (nodes_map[this->GetCreatingSystemGUID().ToString()].empty()) 00242 { nodes_map.erase(this->GetCreatingSystemGUID().ToString()); } 00243 } 00244 new_clients.erase(this->GetCreatingSystemGUID()); //deprecated 00245 if ((topology==SERVER)&&(logging==true)) 00246 { 00247 //printf("%"PRINTF_64_BIT_MODIFIER"u: %s client deleted; rem %i\n",(unsigned long long)time,sourceConnection->GetRakNetGUID().ToString(),avatar_joint_replicas.size()); 00248 logfileHandler.GetLocalTime(localtime); 00249 sprintf(logstr,"D;%"PRINTF_64_BIT_MODIFIER"u;%s;%s;0;%i",(unsigned long long)time,localtime,sourceConnection->GetRakNetGUID().ToString(),avatar_joint_replicas.size()); 00250 logfileHandler.WriteLog(logstr); 00251 } 00252 return true; 00253 } 00254 virtual void DeallocReplica(RakNet::Connection_RM3 *sourceConnection) { 00255 delete this; 00256 } 00257 virtual RM3SerializationResult Serialize(SerializeParameters *serializeParameters) { 00258 BeamingUser::Serialize(serializeParameters); 00259 RakNetTimeMS time = RakNet::GetTime(); 00260 serializeParameters->outputBitstream[0].WriteAlignedBytes((const unsigned char*)&fname,sizeof(fname)); 00261 serializeParameters->outputBitstream[0].WriteAlignedBytes((const unsigned char*)&lname,sizeof(lname)); 00262 serializeParameters->outputBitstream[0].WriteAlignedBytes((const unsigned char*)&position,sizeof(position)); 00263 serializeParameters->outputBitstream[0].WriteAlignedBytes((const unsigned char*)&orientation,sizeof(orientation)); 00264 return RM3SR_BROADCAST_IDENTICALLY; 00265 } 00266 virtual void Deserialize(RakNet::DeserializeParameters *deserializeParameters) { 00267 BeamingUser::Deserialize(deserializeParameters); 00268 RakNetTimeMS time = RakNet::GetTime(); 00269 deserializeParameters->serializationBitstream[0].ReadAlignedBytes((unsigned char*)&fname,sizeof(fname)); 00270 deserializeParameters->serializationBitstream[0].ReadAlignedBytes((unsigned char*)&lname,sizeof(lname)); 00271 deserializeParameters->serializationBitstream[0].ReadAlignedBytes((unsigned char*)&position,sizeof(position)); 00272 deserializeParameters->serializationBitstream[0].ReadAlignedBytes((unsigned char*)&orientation,sizeof(orientation)); 00273 //printf("%"PRINTF_64_BIT_MODIFIER"u: %s %s %s %s %s - %.3f %.3f %.3f %.3f %.3f %.3f %.3f\n",(unsigned long long)time,clientname,this->GetCreatingSystemGUID().ToString(),clientType,clientConfig,avatarjoint_id,position.x,position.y,position.z,orientation.x,orientation.y,orientation.z,orientation.w); 00274 if ((topology==SERVER)&&(logging==true))//logging on server 00275 { 00276 logfileHandler.GetLocalTime(localtime); 00277 sprintf(logstr,"M;%"PRINTF_64_BIT_MODIFIER"u;%s;%s;%s;%s;%s;%s;%.3f;%.3f;%.3f;%.3f;%.3f;%.3f;%.3f",(unsigned long long)time,localtime,clientname,this->GetCreatingSystemGUID().ToString(),clientType,clientConfig,avatarjoint_id,position.x,position.y,position.z,orientation.x,orientation.y,orientation.z,orientation.w); 00278 logfileHandler.WriteLog(logstr); //writes additional lines 00279 } 00280 } 00281 virtual void SerializeConstructionRequestAccepted(RakNet::BitStream *serializationBitstream, RakNet::Connection_RM3 *requestingConnection) { 00282 serializationBitstream->Write(GetName() + RakNet::RakString(avatarjoint_id) + RakNet::RakString(" created on server")); 00283 } 00284 virtual void DeserializeConstructionRequestAccepted(RakNet::BitStream *serializationBitstream, RakNet::Connection_RM3 *acceptingConnection) { 00285 PrintOutput(serializationBitstream); 00286 } 00287 virtual void SerializeConstructionRequestRejected(RakNet::BitStream *serializationBitstream, RakNet::Connection_RM3 *requestingConnection) { 00288 serializationBitstream->Write(GetName() + RakNet::RakString(avatarjoint_id) + RakNet::RakString(" not created on server")); 00289 } 00290 virtual void DeserializeConstructionRequestRejected(RakNet::BitStream *serializationBitstream, RakNet::Connection_RM3 *rejectingConnection) { 00291 PrintOutput(serializationBitstream); 00292 } 00293 00294 public: 00295 char avatarjoint_id[128]; 00296 CVec3 position; 00297 CQuat orientation; 00298 node_info *thisnode; 00299 RakNet::RakString parentbone; 00300 char fname[128]; 00301 char lname[128]; 00302 00303 BeamingAvatarJointReplica() { } 00304 00305 virtual ~BeamingAvatarJointReplica() { } 00306 }; 00307 00308 00310 class BeamingFacialReplica : public BeamingUser 00311 { 00312 virtual RakNet::RakString GetName(void) const {return RakNet::RakString("FACIAL");} 00313 virtual void WriteAllocationID(RakNet::BitStream *allocationIdBitstream) const { 00314 allocationIdBitstream->Write(GetName()); 00315 } 00316 virtual void SerializeConstruction(RakNet::BitStream *constructionBitstream, RakNet::Connection_RM3 *destinationConnection) { 00317 BeamingUser::SerializeConstruction(constructionBitstream, destinationConnection); 00318 constructionBitstream->Write(GetName() + RakNet::RakString(facial_id) + RakNet::RakString(" created for guid ") + RakNet::RakString(this->GetCreatingSystemGUID().ToString())); 00319 constructionBitstream->Write(facial_id); 00320 } 00321 virtual bool DeserializeConstruction(RakNet::BitStream *constructionBitstream, RakNet::Connection_RM3 *sourceConnection) { 00322 if (!BeamingUser::DeserializeConstruction(constructionBitstream, sourceConnection)) 00323 return false; 00324 RakNetTimeMS time = RakNet::GetTime(); 00325 PrintOutput(constructionBitstream); 00326 constructionBitstream->Read(facial_id); 00327 printf("Client: %s, Type: %s, Config: %s, Node: %s\n",clientname,clientType,clientConfig,facial_id); 00328 if (topology == CLIENT) 00329 { 00330 facial_replicas[this->GetCreatingSystemGUID()].push_back(this); //create within map on new client connection 00331 thisnode = new node_info; 00332 thisnode->name=facial_id; 00333 thisnode->type=GetName().C_String(); 00334 thisnode->peername = clientname; 00335 thisnode->peertype = clientType; 00336 thisnode->peercfg = clientConfig; 00337 thisnode->ipport = ip_port; 00338 nodes_map[this->GetCreatingSystemGUID().ToString()].push_back(thisnode); 00339 } 00340 if ((topology==SERVER)&&(logging==true)) 00341 { 00342 //printf("%"PRINTF_64_BIT_MODIFIER"u: %s client created; rem %i\n",(unsigned long long)time,sourceConnection->GetRakNetGUID().ToString(),facial_replicas.size()); 00343 logfileHandler.GetLocalTime(localtime); 00344 sprintf(logstr,"C;%"PRINTF_64_BIT_MODIFIER"u;%s;%s;0;%i",(unsigned long long)time,localtime,sourceConnection->GetRakNetGUID().ToString(),facial_replicas.size()); 00345 logfileHandler.WriteLog(logstr); 00346 } 00347 return true; 00348 } 00349 virtual void SerializeDestruction(RakNet::BitStream *destructionBitstream, RakNet::Connection_RM3 *destinationConnection) { 00350 BeamingUser::SerializeDestruction(destructionBitstream, destinationConnection); 00351 destructionBitstream->Write(GetName() + RakNet::RakString(facial_id) + RakNet::RakString(" removed for guid ") + RakNet::RakString(this->GetCreatingSystemGUID().ToString())); 00352 } 00353 virtual bool DeserializeDestruction(RakNet::BitStream *destructionBitstream, RakNet::Connection_RM3 *sourceConnection) { 00354 if (!BeamingUser::DeserializeDestruction(destructionBitstream, sourceConnection)) 00355 return false; 00356 RakNetTimeMS time = RakNet::GetTime(); 00357 PrintOutput(destructionBitstream); 00358 if (topology == CLIENT) 00359 { 00360 facial_replicas.erase(this->GetCreatingSystemGUID()); //erase from map on client disconnection 00361 nodes_map.erase(this->GetCreatingSystemGUID().ToString()); 00362 } 00363 new_clients.erase(this->GetCreatingSystemGUID()); //deprecated 00364 if ((topology==SERVER)&&(logging==true)) 00365 { 00366 //printf("%"PRINTF_64_BIT_MODIFIER"u: %s client deleted; rem %i\n",(unsigned long long)time,sourceConnection->GetRakNetGUID().ToString(),facial_replicas.size()); 00367 logfileHandler.GetLocalTime(localtime); 00368 sprintf(logstr,"D;%"PRINTF_64_BIT_MODIFIER"u;%s;%s;0;%i",(unsigned long long)time,localtime,sourceConnection->GetRakNetGUID().ToString(),facial_replicas.size()); 00369 logfileHandler.WriteLog(logstr); 00370 } 00371 return true; 00372 } 00373 virtual void DeallocReplica(RakNet::Connection_RM3 *sourceConnection) { 00374 delete this; 00375 } 00376 virtual RM3SerializationResult Serialize(SerializeParameters *serializeParameters) { 00377 BeamingUser::Serialize(serializeParameters); 00378 RakNetTimeMS time = RakNet::GetTime(); 00379 serializeParameters->outputBitstream[0].WriteAlignedBytes((const unsigned char*)&blink,sizeof(blink)); 00380 serializeParameters->outputBitstream[0].WriteAlignedBytes((const unsigned char*)&smile,sizeof(smile)); 00381 serializeParameters->outputBitstream[0].WriteAlignedBytes((const unsigned char*)&frown,sizeof(frown)); 00382 serializeParameters->outputBitstream[0].WriteAlignedBytes((const unsigned char*)&o,sizeof(o)); 00383 serializeParameters->outputBitstream[0].WriteAlignedBytes((const unsigned char*)&e,sizeof(e)); 00384 serializeParameters->outputBitstream[0].WriteAlignedBytes((const unsigned char*)&p,sizeof(p)); 00385 return RM3SR_BROADCAST_IDENTICALLY; 00386 } 00387 virtual void Deserialize(RakNet::DeserializeParameters *deserializeParameters) { 00388 BeamingUser::Deserialize(deserializeParameters); 00389 RakNetTimeMS time = RakNet::GetTime(); 00390 deserializeParameters->serializationBitstream[0].ReadAlignedBytes((unsigned char*)&blink,sizeof(blink)); 00391 deserializeParameters->serializationBitstream[0].ReadAlignedBytes((unsigned char*)&smile,sizeof(smile)); 00392 deserializeParameters->serializationBitstream[0].ReadAlignedBytes((unsigned char*)&frown,sizeof(frown)); 00393 deserializeParameters->serializationBitstream[0].ReadAlignedBytes((unsigned char*)&o,sizeof(o)); 00394 deserializeParameters->serializationBitstream[0].ReadAlignedBytes((unsigned char*)&e,sizeof(e)); 00395 deserializeParameters->serializationBitstream[0].ReadAlignedBytes((unsigned char*)&p,sizeof(p)); 00396 //printf("%"PRINTF_64_BIT_MODIFIER"u: %s %s %s %s %s - %d %.3f %.3f %.3f %.3f %.3f\n",(unsigned long long)time,clientname,this->GetCreatingSystemGUID().ToString(),clientType,clientConfig,facial_id,blink,smile,frown,o,e,p); 00397 if ((topology==SERVER)&&(logging==true))//logging on server 00398 { 00399 logfileHandler.GetLocalTime(localtime); 00400 sprintf(logstr,"M;%"PRINTF_64_BIT_MODIFIER"u;%s;%s;%s;%s;%s;%s;%d;%.3f;%.3f;%.3f;%.3f;%.3f",(unsigned long long)time,localtime,clientname,this->GetCreatingSystemGUID().ToString(),clientType,clientConfig,facial_id,blink,smile,frown,o,e,p); 00401 logfileHandler.WriteLog(logstr); //writes additional lines 00402 } 00403 } 00404 virtual void SerializeConstructionRequestAccepted(RakNet::BitStream *serializationBitstream, RakNet::Connection_RM3 *requestingConnection) { 00405 serializationBitstream->Write(GetName() + RakNet::RakString(facial_id) + RakNet::RakString(" created on server")); 00406 } 00407 virtual void DeserializeConstructionRequestAccepted(RakNet::BitStream *serializationBitstream, RakNet::Connection_RM3 *acceptingConnection) { 00408 PrintOutput(serializationBitstream); 00409 } 00410 virtual void SerializeConstructionRequestRejected(RakNet::BitStream *serializationBitstream, RakNet::Connection_RM3 *requestingConnection) { 00411 serializationBitstream->Write(GetName() + RakNet::RakString(facial_id) + RakNet::RakString(" not created on server")); 00412 } 00413 virtual void DeserializeConstructionRequestRejected(RakNet::BitStream *serializationBitstream, RakNet::Connection_RM3 *rejectingConnection) { 00414 PrintOutput(serializationBitstream); 00415 } 00416 00417 public: 00418 char facial_id[128]; 00419 bool blink; 00420 float smile; 00421 float frown; 00422 float o; 00423 float e; 00424 float p; 00425 node_info *thisnode; 00426 00427 BeamingFacialReplica() { } 00428 00429 virtual ~BeamingFacialReplica() { } 00430 }; 00431 00432 00434 class BeamingEmotionReplica : public BeamingUser 00435 { 00436 virtual RakNet::RakString GetName(void) const {return RakNet::RakString("EMOTION");} 00437 virtual void WriteAllocationID(RakNet::BitStream *allocationIdBitstream) const { 00438 allocationIdBitstream->Write(GetName()); 00439 } 00440 virtual void SerializeConstruction(RakNet::BitStream *constructionBitstream, RakNet::Connection_RM3 *destinationConnection) { 00441 BeamingUser::SerializeConstruction(constructionBitstream, destinationConnection); 00442 constructionBitstream->Write(GetName() + RakNet::RakString(emotion_id) + RakNet::RakString(" created for guid ") + RakNet::RakString(this->GetCreatingSystemGUID().ToString())); 00443 constructionBitstream->Write(emotion_id); 00444 } 00445 virtual bool DeserializeConstruction(RakNet::BitStream *constructionBitstream, RakNet::Connection_RM3 *sourceConnection) { 00446 if (!BeamingUser::DeserializeConstruction(constructionBitstream, sourceConnection)) 00447 return false; 00448 RakNetTimeMS time = RakNet::GetTime(); 00449 PrintOutput(constructionBitstream); 00450 constructionBitstream->Read(emotion_id); 00451 printf("Client: %s, Type: %s, Config: %s, Node: %s\n",clientname,clientType,clientConfig,emotion_id); 00452 if (topology == CLIENT) 00453 { 00454 emotion_replicas[this->GetCreatingSystemGUID()].push_back(this); //create within map on new client connection 00455 thisnode = new node_info; 00456 thisnode->name=emotion_id; 00457 thisnode->type=GetName().C_String(); 00458 thisnode->peername = clientname; 00459 thisnode->peertype = clientType; 00460 thisnode->peercfg = clientConfig; 00461 thisnode->ipport = ip_port; 00462 nodes_map[this->GetCreatingSystemGUID().ToString()].push_back(thisnode); 00463 } 00464 if ((topology==SERVER)&&(logging==true)) 00465 { 00466 //printf("%"PRINTF_64_BIT_MODIFIER"u: %s client created; rem %i\n",(unsigned long long)time,sourceConnection->GetRakNetGUID().ToString(),emotion_replicas.size()); 00467 logfileHandler.GetLocalTime(localtime); 00468 sprintf(logstr,"C;%"PRINTF_64_BIT_MODIFIER"u;%s;%s;0;%i",(unsigned long long)time,localtime,sourceConnection->GetRakNetGUID().ToString(),emotion_replicas.size()); 00469 logfileHandler.WriteLog(logstr); 00470 } 00471 return true; 00472 } 00473 virtual void SerializeDestruction(RakNet::BitStream *destructionBitstream, RakNet::Connection_RM3 *destinationConnection) { 00474 BeamingUser::SerializeDestruction(destructionBitstream, destinationConnection); 00475 destructionBitstream->Write(GetName() + RakNet::RakString(emotion_id) + RakNet::RakString(" removed for guid ") + RakNet::RakString(this->GetCreatingSystemGUID().ToString())); 00476 } 00477 virtual bool DeserializeDestruction(RakNet::BitStream *destructionBitstream, RakNet::Connection_RM3 *sourceConnection) { 00478 if (!BeamingUser::DeserializeDestruction(destructionBitstream, sourceConnection)) 00479 return false; 00480 RakNetTimeMS time = RakNet::GetTime(); 00481 PrintOutput(destructionBitstream); 00482 if (topology == CLIENT) 00483 { 00484 emotion_replicas.erase(this->GetCreatingSystemGUID()); //erase from map on client disconnection 00485 nodes_map.erase(this->GetCreatingSystemGUID().ToString()); 00486 } 00487 new_clients.erase(this->GetCreatingSystemGUID()); //deprecated 00488 if ((topology==SERVER)&&(logging==true)) 00489 { 00490 //printf("%"PRINTF_64_BIT_MODIFIER"u: %s client deleted; rem %i\n",(unsigned long long)time,sourceConnection->GetRakNetGUID().ToString(),emotion_replicas.size()); 00491 logfileHandler.GetLocalTime(localtime); 00492 sprintf(logstr,"D;%"PRINTF_64_BIT_MODIFIER"u;%s;%s;0;%i",(unsigned long long)time,localtime,sourceConnection->GetRakNetGUID().ToString(),emotion_replicas.size()); 00493 logfileHandler.WriteLog(logstr); 00494 } 00495 return true; 00496 } 00497 virtual void DeallocReplica(RakNet::Connection_RM3 *sourceConnection) { 00498 delete this; 00499 } 00500 virtual RM3SerializationResult Serialize(SerializeParameters *serializeParameters) { 00501 BeamingUser::Serialize(serializeParameters); 00502 RakNetTimeMS time = RakNet::GetTime(); 00503 serializeParameters->outputBitstream[0].WriteAlignedBytes((const unsigned char*)&valence,sizeof(valence)); 00504 serializeParameters->outputBitstream[0].WriteAlignedBytes((const unsigned char*)&arousal,sizeof(arousal)); 00505 serializeParameters->outputBitstream[0].WriteAlignedBytes((const unsigned char*)&misc,sizeof(misc)); 00506 return RM3SR_BROADCAST_IDENTICALLY; 00507 } 00508 virtual void Deserialize(RakNet::DeserializeParameters *deserializeParameters) { 00509 BeamingUser::Deserialize(deserializeParameters); 00510 RakNetTimeMS time = RakNet::GetTime(); 00511 deserializeParameters->serializationBitstream[0].ReadAlignedBytes((unsigned char*)&valence,sizeof(valence)); 00512 deserializeParameters->serializationBitstream[0].ReadAlignedBytes((unsigned char*)&arousal,sizeof(arousal)); 00513 deserializeParameters->serializationBitstream[0].ReadAlignedBytes((unsigned char*)&misc,sizeof(misc)); 00514 //printf("%"PRINTF_64_BIT_MODIFIER"u: %s %s %s %s %s - %f %f %f\n",(unsigned long long)time,clientname,this->GetCreatingSystemGUID().ToString(),clientType,clientConfig,emotion_id,valence,arousal,misc); 00515 if ((topology==SERVER)&&(logging==true))//logging on server 00516 { 00517 logfileHandler.GetLocalTime(localtime); 00518 sprintf(logstr,"M;%"PRINTF_64_BIT_MODIFIER"u;%s;%s;%s;%s;%s;%s;%f;%f;%f",(unsigned long long)time,localtime,clientname,this->GetCreatingSystemGUID().ToString(),clientType,clientConfig,emotion_id,valence,arousal,misc); 00519 logfileHandler.WriteLog(logstr); //writes additional lines 00520 } 00521 } 00522 virtual void SerializeConstructionRequestAccepted(RakNet::BitStream *serializationBitstream, RakNet::Connection_RM3 *requestingConnection) { 00523 serializationBitstream->Write(GetName() + RakNet::RakString(emotion_id) + RakNet::RakString(" created on server")); 00524 } 00525 virtual void DeserializeConstructionRequestAccepted(RakNet::BitStream *serializationBitstream, RakNet::Connection_RM3 *acceptingConnection) { 00526 PrintOutput(serializationBitstream); 00527 } 00528 virtual void SerializeConstructionRequestRejected(RakNet::BitStream *serializationBitstream, RakNet::Connection_RM3 *requestingConnection) { 00529 serializationBitstream->Write(GetName() + RakNet::RakString(emotion_id) + RakNet::RakString(" not created on server")); 00530 } 00531 virtual void DeserializeConstructionRequestRejected(RakNet::BitStream *serializationBitstream, RakNet::Connection_RM3 *rejectingConnection) { 00532 PrintOutput(serializationBitstream); 00533 } 00534 00535 public: 00536 char emotion_id[128]; 00537 double valence; 00538 double arousal; 00539 double misc; 00540 node_info *thisnode; 00541 00542 BeamingEmotionReplica() { } 00543 00544 virtual ~BeamingEmotionReplica() { } 00545 }; 00546 00547 00549 class BeamingTactileReplica : public BeamingUser 00550 { 00551 virtual RakNet::RakString GetName(void) const {return RakNet::RakString("TACTILE");} 00552 virtual void WriteAllocationID(RakNet::BitStream *allocationIdBitstream) const { 00553 allocationIdBitstream->Write(GetName()); 00554 } 00555 virtual void SerializeConstruction(RakNet::BitStream *constructionBitstream, RakNet::Connection_RM3 *destinationConnection) { 00556 BeamingUser::SerializeConstruction(constructionBitstream, destinationConnection); 00557 constructionBitstream->Write(GetName() + RakNet::RakString(tactile_id) + RakNet::RakString(" created for guid ") + RakNet::RakString(this->GetCreatingSystemGUID().ToString())); 00558 constructionBitstream->Write(tactile_id); 00559 } 00560 virtual bool DeserializeConstruction(RakNet::BitStream *constructionBitstream, RakNet::Connection_RM3 *sourceConnection) { 00561 if (!BeamingUser::DeserializeConstruction(constructionBitstream, sourceConnection)) 00562 return false; 00563 RakNetTimeMS time = RakNet::GetTime(); 00564 PrintOutput(constructionBitstream); 00565 constructionBitstream->Read(tactile_id); 00566 printf("Client: %s, Type: %s, Config: %s, Node: %s\n",clientname,clientType,clientConfig,tactile_id); 00567 if (topology == CLIENT) 00568 { 00569 tactile_replicas[this->GetCreatingSystemGUID()].push_back(this); //create within map on new client connection 00570 thisnode = new node_info; 00571 thisnode->name=tactile_id; 00572 thisnode->type=GetName().C_String(); 00573 thisnode->peername = clientname; 00574 thisnode->peertype = clientType; 00575 thisnode->peercfg = clientConfig; 00576 thisnode->ipport = ip_port; 00577 nodes_map[this->GetCreatingSystemGUID().ToString()].push_back(thisnode); 00578 } 00579 if ((topology==SERVER)&&(logging==true)) 00580 { 00581 //printf("%"PRINTF_64_BIT_MODIFIER"u: %s client created; rem %i\n",(unsigned long long)time,sourceConnection->GetRakNetGUID().ToString(),tactile_replicas.size()); 00582 logfileHandler.GetLocalTime(localtime); 00583 sprintf(logstr,"C;%"PRINTF_64_BIT_MODIFIER"u;%s;%s;0;%i",(unsigned long long)time,localtime,sourceConnection->GetRakNetGUID().ToString(),tactile_replicas.size()); 00584 logfileHandler.WriteLog(logstr); 00585 } 00586 return true; 00587 } 00588 virtual void SerializeDestruction(RakNet::BitStream *destructionBitstream, RakNet::Connection_RM3 *destinationConnection) { 00589 BeamingUser::SerializeDestruction(destructionBitstream, destinationConnection); 00590 destructionBitstream->Write(GetName() + RakNet::RakString(tactile_id) + RakNet::RakString(" removed for guid ") + RakNet::RakString(this->GetCreatingSystemGUID().ToString())); 00591 } 00592 virtual bool DeserializeDestruction(RakNet::BitStream *destructionBitstream, RakNet::Connection_RM3 *sourceConnection) { 00593 if (!BeamingUser::DeserializeDestruction(destructionBitstream, sourceConnection)) 00594 return false; 00595 RakNetTimeMS time = RakNet::GetTime(); 00596 PrintOutput(destructionBitstream); 00597 if (topology == CLIENT) 00598 { 00599 tactile_replicas.erase(this->GetCreatingSystemGUID()); //erase from map on client disconnection 00600 nodes_map.erase(this->GetCreatingSystemGUID().ToString()); 00601 } 00602 new_clients.erase(this->GetCreatingSystemGUID()); //deprecated 00603 if ((topology==SERVER)&&(logging==true)) 00604 { 00605 //printf("%"PRINTF_64_BIT_MODIFIER"u: %s client deleted; rem %i\n",(unsigned long long)time,sourceConnection->GetRakNetGUID().ToString(),tactile_replicas.size()); 00606 logfileHandler.GetLocalTime(localtime); 00607 sprintf(logstr,"D;%"PRINTF_64_BIT_MODIFIER"u;%s;%s;0;%i",(unsigned long long)time,localtime,sourceConnection->GetRakNetGUID().ToString(),tactile_replicas.size()); 00608 logfileHandler.WriteLog(logstr); 00609 } 00610 return true; 00611 } 00612 virtual void DeallocReplica(RakNet::Connection_RM3 *sourceConnection) { 00613 delete this; 00614 } 00615 virtual RM3SerializationResult Serialize(SerializeParameters *serializeParameters) { 00616 BeamingUser::Serialize(serializeParameters); 00617 RakNetTimeMS time = RakNet::GetTime(); 00618 serializeParameters->outputBitstream[0].WriteAlignedBytes((const unsigned char*)&duration,sizeof(duration)); 00619 serializeParameters->outputBitstream[0].WriteAlignedBytes((const unsigned char*)&intensity,sizeof(intensity)); 00620 serializeParameters->outputBitstream[0].WriteAlignedBytes((const unsigned char*)&temperature,sizeof(temperature)); 00621 return RM3SR_BROADCAST_IDENTICALLY; 00622 } 00623 virtual void Deserialize(RakNet::DeserializeParameters *deserializeParameters) { 00624 BeamingUser::Deserialize(deserializeParameters); 00625 RakNetTimeMS time = RakNet::GetTime(); 00626 deserializeParameters->serializationBitstream[0].ReadAlignedBytes((unsigned char*)&duration,sizeof(duration)); 00627 deserializeParameters->serializationBitstream[0].ReadAlignedBytes((unsigned char*)&intensity,sizeof(intensity)); 00628 deserializeParameters->serializationBitstream[0].ReadAlignedBytes((unsigned char*)&temperature,sizeof(temperature)); 00629 //printf("%"PRINTF_64_BIT_MODIFIER"u: %s %s %s %s %s - %f %.3f %.3f\n",(unsigned long long)time,clientname,this->GetCreatingSystemGUID().ToString(),clientType,clientConfig,tactile_id,duration,intensity,temperature); 00630 if ((topology==SERVER)&&(logging==true))//logging on server 00631 { 00632 logfileHandler.GetLocalTime(localtime); 00633 sprintf(logstr,"M;%"PRINTF_64_BIT_MODIFIER"u;%s;%s;%s;%s;%s;%s;%f;%.3f;%.3f",(unsigned long long)time,localtime,clientname,this->GetCreatingSystemGUID().ToString(),clientType,clientConfig,tactile_id,duration,intensity,temperature); 00634 logfileHandler.WriteLog(logstr); //writes additional lines 00635 } 00636 } 00637 virtual void SerializeConstructionRequestAccepted(RakNet::BitStream *serializationBitstream, RakNet::Connection_RM3 *requestingConnection) { 00638 serializationBitstream->Write(GetName() + RakNet::RakString(tactile_id) + RakNet::RakString(" created on server")); 00639 } 00640 virtual void DeserializeConstructionRequestAccepted(RakNet::BitStream *serializationBitstream, RakNet::Connection_RM3 *acceptingConnection) { 00641 PrintOutput(serializationBitstream); 00642 } 00643 virtual void SerializeConstructionRequestRejected(RakNet::BitStream *serializationBitstream, RakNet::Connection_RM3 *requestingConnection) { 00644 serializationBitstream->Write(GetName() + RakNet::RakString(tactile_id) + RakNet::RakString(" not created on server")); 00645 } 00646 virtual void DeserializeConstructionRequestRejected(RakNet::BitStream *serializationBitstream, RakNet::Connection_RM3 *rejectingConnection) { 00647 PrintOutput(serializationBitstream); 00648 } 00649 00650 public: 00651 char tactile_id[128]; 00652 double duration; 00653 float intensity; 00654 float temperature; 00655 node_info *thisnode; 00656 00657 BeamingTactileReplica() { } 00658 00659 virtual ~BeamingTactileReplica() { } 00660 }; 00661 00662 00664 class BeamingRobotReplica : public BeamingUser 00665 { 00666 virtual RakNet::RakString GetName(void) const {return RakNet::RakString("ROBOT");} 00667 virtual void WriteAllocationID(RakNet::BitStream *allocationIdBitstream) const { 00668 allocationIdBitstream->Write(GetName()); 00669 } 00670 virtual void SerializeConstruction(RakNet::BitStream *constructionBitstream, RakNet::Connection_RM3 *destinationConnection) { 00671 BeamingUser::SerializeConstruction(constructionBitstream, destinationConnection); 00672 constructionBitstream->Write(GetName() + RakNet::RakString(robot_id) + RakNet::RakString(" created for guid ") + RakNet::RakString(this->GetCreatingSystemGUID().ToString())); 00673 constructionBitstream->Write(robot_id); 00674 } 00675 virtual bool DeserializeConstruction(RakNet::BitStream *constructionBitstream, RakNet::Connection_RM3 *sourceConnection) { 00676 if (!BeamingUser::DeserializeConstruction(constructionBitstream, sourceConnection)) 00677 return false; 00678 RakNetTimeMS time = RakNet::GetTime(); 00679 PrintOutput(constructionBitstream); 00680 constructionBitstream->Read(robot_id); 00681 printf("Client: %s, Type: %s, Config: %s, Node: %s\n",clientname,clientType,clientConfig,robot_id); 00682 if (topology == CLIENT) 00683 { 00684 robot_replicas[this->GetCreatingSystemGUID()].push_back(this); //create within map on new client connection 00685 thisnode = new node_info; 00686 thisnode->name=robot_id; 00687 thisnode->type=GetName().C_String(); 00688 thisnode->peername = clientname; 00689 thisnode->peertype = clientType; 00690 thisnode->peercfg = clientConfig; 00691 thisnode->ipport = ip_port; 00692 nodes_map[this->GetCreatingSystemGUID().ToString()].push_back(thisnode); 00693 } 00694 if ((topology==SERVER)&&(logging==true)) 00695 { 00696 //printf("%"PRINTF_64_BIT_MODIFIER"u: %s client created; rem %i\n",(unsigned long long)time,sourceConnection->GetRakNetGUID().ToString(),robot_replicas.size()); 00697 logfileHandler.GetLocalTime(localtime); 00698 sprintf(logstr,"C;%"PRINTF_64_BIT_MODIFIER"u;%s;%s;0;%i",(unsigned long long)time,localtime,sourceConnection->GetRakNetGUID().ToString(),robot_replicas.size()); 00699 logfileHandler.WriteLog(logstr); 00700 } 00701 return true; 00702 } 00703 virtual void SerializeDestruction(RakNet::BitStream *destructionBitstream, RakNet::Connection_RM3 *destinationConnection) { 00704 BeamingUser::SerializeDestruction(destructionBitstream, destinationConnection); 00705 destructionBitstream->Write(GetName() + RakNet::RakString(robot_id) + RakNet::RakString(" removed for guid ") + RakNet::RakString(this->GetCreatingSystemGUID().ToString())); 00706 } 00707 virtual bool DeserializeDestruction(RakNet::BitStream *destructionBitstream, RakNet::Connection_RM3 *sourceConnection) { 00708 if (!BeamingUser::DeserializeDestruction(destructionBitstream, sourceConnection)) 00709 return false; 00710 RakNetTimeMS time = RakNet::GetTime(); 00711 PrintOutput(destructionBitstream); 00712 if (topology == CLIENT) 00713 { 00714 robot_replicas.erase(this->GetCreatingSystemGUID()); //erase from map on client disconnection 00715 nodes_map.erase(this->GetCreatingSystemGUID().ToString()); 00716 } 00717 new_clients.erase(this->GetCreatingSystemGUID()); //deprecated 00718 if ((topology==SERVER)&&(logging==true)) 00719 { 00720 //printf("%"PRINTF_64_BIT_MODIFIER"u: %s client deleted; rem %i\n",(unsigned long long)time,sourceConnection->GetRakNetGUID().ToString(),robot_replicas.size()); 00721 logfileHandler.GetLocalTime(localtime); 00722 sprintf(logstr,"D;%"PRINTF_64_BIT_MODIFIER"u;%s;%s;0;%i",(unsigned long long)time,localtime,sourceConnection->GetRakNetGUID().ToString(),robot_replicas.size()); 00723 logfileHandler.WriteLog(logstr); 00724 } 00725 return true; 00726 } 00727 virtual void DeallocReplica(RakNet::Connection_RM3 *sourceConnection) { 00728 delete this; 00729 } 00730 virtual RM3SerializationResult Serialize(SerializeParameters *serializeParameters) { 00731 BeamingUser::Serialize(serializeParameters); 00732 RakNetTimeMS time = RakNet::GetTime(); 00733 serializeParameters->outputBitstream[0].WriteAlignedBytes((const unsigned char*)&type,sizeof(type)); 00734 serializeParameters->outputBitstream[0].WriteAlignedBytes((const unsigned char*)&details,sizeof(details)); 00735 serializeParameters->outputBitstream[0].WriteAlignedBytes((const unsigned char*)&freespace,sizeof(freespace)); 00736 serializeParameters->outputBitstream[0].WriteAlignedBytes((const unsigned char*)&position,sizeof(position)); 00737 serializeParameters->outputBitstream[0].WriteAlignedBytes((const unsigned char*)&orientation,sizeof(orientation)); 00738 serializeParameters->outputBitstream[0].WriteAlignedBytes((const unsigned char*)&time_remain,sizeof(time_remain)); 00739 serializeParameters->outputBitstream[0].WriteAlignedBytes((const unsigned char*)&contact_type,sizeof(contact_type)); 00740 return RM3SR_BROADCAST_IDENTICALLY; 00741 } 00742 virtual void Deserialize(RakNet::DeserializeParameters *deserializeParameters) { 00743 BeamingUser::Deserialize(deserializeParameters); 00744 RakNetTimeMS time = RakNet::GetTime(); 00745 deserializeParameters->serializationBitstream[0].ReadAlignedBytes((unsigned char*)&type,sizeof(type)); 00746 deserializeParameters->serializationBitstream[0].ReadAlignedBytes((unsigned char*)&details,sizeof(details)); 00747 deserializeParameters->serializationBitstream[0].ReadAlignedBytes((unsigned char*)&freespace,sizeof(freespace)); 00748 deserializeParameters->serializationBitstream[0].ReadAlignedBytes((unsigned char*)&position,sizeof(position)); 00749 deserializeParameters->serializationBitstream[0].ReadAlignedBytes((unsigned char*)&orientation,sizeof(orientation)); 00750 deserializeParameters->serializationBitstream[0].ReadAlignedBytes((unsigned char*)&time_remain,sizeof(time_remain)); 00751 deserializeParameters->serializationBitstream[0].ReadAlignedBytes((unsigned char*)&contact_type,sizeof(contact_type)); 00752 //printf("%"PRINTF_64_BIT_MODIFIER"u: %s %s %s %s %s - %i %i %.3f %.3f %.3f %.3f %.3f %.3f %.3f %.3f %.3f %i\n",(unsigned long long)time,clientname,this->GetCreatingSystemGUID().ToString(),clientType,clientConfig,robot_id,type,details,freespace,position.x,position.y,position.z,orientation.x,orientation.y,orientation.z,orientation.w,time_remain,contact_type); 00753 if ((topology==SERVER)&&(logging==true))//logging on server 00754 { 00755 logfileHandler.GetLocalTime(localtime); 00756 sprintf(logstr,"M;%"PRINTF_64_BIT_MODIFIER"u;%s;%s;%s;%s;%s;%s;%i;%i;%.3f;%.3f;%.3f;%.3f;%.3f;%.3f;%.3f;%.3f;%.3f;%i",(unsigned long long)time,localtime,clientname,this->GetCreatingSystemGUID().ToString(),clientType,clientConfig,robot_id,type,details,freespace,position.x,position.y,position.z,orientation.x,orientation.y,orientation.z,orientation.w,time_remain,contact_type); 00757 logfileHandler.WriteLog(logstr); //writes additional lines 00758 } 00759 } 00760 virtual void SerializeConstructionRequestAccepted(RakNet::BitStream *serializationBitstream, RakNet::Connection_RM3 *requestingConnection) { 00761 serializationBitstream->Write(GetName() + RakNet::RakString(robot_id) + RakNet::RakString(" created on server")); 00762 } 00763 virtual void DeserializeConstructionRequestAccepted(RakNet::BitStream *serializationBitstream, RakNet::Connection_RM3 *acceptingConnection) { 00764 PrintOutput(serializationBitstream); 00765 } 00766 virtual void SerializeConstructionRequestRejected(RakNet::BitStream *serializationBitstream, RakNet::Connection_RM3 *requestingConnection) { 00767 serializationBitstream->Write(GetName() + RakNet::RakString(robot_id) + RakNet::RakString(" not created on server")); 00768 } 00769 virtual void DeserializeConstructionRequestRejected(RakNet::BitStream *serializationBitstream, RakNet::Connection_RM3 *rejectingConnection) { 00770 PrintOutput(serializationBitstream); 00771 } 00772 00773 public: 00774 char robot_id[128]; 00775 int type; 00776 int details; 00777 float freespace; 00778 CVec3 position; 00779 CQuat orientation; 00780 float time_remain; 00781 int contact_type; 00782 node_info *thisnode; 00783 00784 BeamingRobotReplica() { } 00785 00786 virtual ~BeamingRobotReplica() { } 00787 }; 00788 00790 class BeamingGenericReplica : public BeamingUser 00791 { 00792 virtual RakNet::RakString GetName(void) const {return RakNet::RakString("GENERIC");} 00793 virtual void WriteAllocationID(RakNet::BitStream *allocationIdBitstream) const { 00794 allocationIdBitstream->Write(GetName()); 00795 } 00796 virtual void SerializeConstruction(RakNet::BitStream *constructionBitstream, RakNet::Connection_RM3 *destinationConnection) { 00797 BeamingUser::SerializeConstruction(constructionBitstream, destinationConnection); 00798 constructionBitstream->Write(GetName() + RakNet::RakString(generic_id) + RakNet::RakString(" created for guid ") + RakNet::RakString(this->GetCreatingSystemGUID().ToString())); 00799 constructionBitstream->Write(generic_id); 00800 } 00801 virtual bool DeserializeConstruction(RakNet::BitStream *constructionBitstream, RakNet::Connection_RM3 *sourceConnection) { 00802 if (!BeamingUser::DeserializeConstruction(constructionBitstream, sourceConnection)) 00803 return false; 00804 RakNetTimeMS time = RakNet::GetTime(); 00805 PrintOutput(constructionBitstream); 00806 constructionBitstream->Read(generic_id); 00807 printf("Client: %s, Type: %s, Config: %s, Node: %s\n",clientname,clientType,clientConfig,generic_id); 00808 if (topology == CLIENT) 00809 { 00810 generic_replicas[this->GetCreatingSystemGUID()].push_back(this); //create within map on new client connection 00811 thisnode = new node_info; 00812 thisnode->name=generic_id; 00813 thisnode->type=GetName().C_String(); 00814 thisnode->peername = clientname; 00815 thisnode->peertype = clientType; 00816 thisnode->peercfg = clientConfig; 00817 thisnode->ipport = ip_port; 00818 nodes_map[this->GetCreatingSystemGUID().ToString()].push_back(thisnode); 00819 } 00820 if ((topology==SERVER)&&(logging==true)) 00821 { 00822 //printf("%"PRINTF_64_BIT_MODIFIER"u: %s client created; rem %i\n",(unsigned long long)time,sourceConnection->GetRakNetGUID().ToString(),generic_replicas.size()); 00823 logfileHandler.GetLocalTime(localtime); 00824 sprintf(logstr,"C;%"PRINTF_64_BIT_MODIFIER"u;%s;%s;0;%i",(unsigned long long)time,localtime,sourceConnection->GetRakNetGUID().ToString(),generic_replicas.size()); 00825 logfileHandler.WriteLog(logstr); 00826 } 00827 return true; 00828 } 00829 virtual void SerializeDestruction(RakNet::BitStream *destructionBitstream, RakNet::Connection_RM3 *destinationConnection) { 00830 BeamingUser::SerializeDestruction(destructionBitstream, destinationConnection); 00831 destructionBitstream->Write(GetName() + RakNet::RakString(generic_id) + RakNet::RakString(" removed for guid ") + RakNet::RakString(this->GetCreatingSystemGUID().ToString())); 00832 } 00833 virtual bool DeserializeDestruction(RakNet::BitStream *destructionBitstream, RakNet::Connection_RM3 *sourceConnection) { 00834 if (!BeamingUser::DeserializeDestruction(destructionBitstream, sourceConnection)) 00835 return false; 00836 RakNetTimeMS time = RakNet::GetTime(); 00837 PrintOutput(destructionBitstream); 00838 if (topology == CLIENT) 00839 { 00840 //remove generic from generic_replicas 00841 for ( std::vector<BeamingGenericReplica*>::iterator cIter = generic_replicas[this->GetCreatingSystemGUID()].begin(); cIter!=generic_replicas[this->GetCreatingSystemGUID()].end(); cIter++ ) { 00842 if (( strcmp((*cIter)->generic_id,generic_id) == 0 ) && ( strcmp((*cIter)->clientname,clientname) == 0 )) { 00843 generic_replicas[this->GetCreatingSystemGUID()].erase(cIter); 00844 break; 00845 } 00846 } 00847 //remove generic data from nodes_map 00848 for ( std::vector<node_info*>::iterator cIter = nodes_map[this->GetCreatingSystemGUID().ToString()].begin(); cIter!=nodes_map[this->GetCreatingSystemGUID().ToString()].end(); cIter++ ) { 00849 if (( strcmp((*cIter)->name.c_str(),generic_id) == 0 ) && ( strcmp((*cIter)->peername,clientname) == 0 )) { 00850 nodes_map[this->GetCreatingSystemGUID().ToString()].erase(cIter); 00851 break; 00852 } 00853 } 00854 if (nodes_map[this->GetCreatingSystemGUID().ToString()].empty()) 00855 { nodes_map.erase(this->GetCreatingSystemGUID().ToString()); } 00856 } 00857 new_clients.erase(this->GetCreatingSystemGUID()); //deprecated 00858 if ((topology==SERVER)&&(logging==true)) 00859 { 00860 //printf("%"PRINTF_64_BIT_MODIFIER"u: %s client deleted; rem %i\n",(unsigned long long)time,sourceConnection->GetRakNetGUID().ToString(),generic_replicas.size()); 00861 logfileHandler.GetLocalTime(localtime); 00862 sprintf(logstr,"D;%"PRINTF_64_BIT_MODIFIER"u;%s;%s;0;%i",(unsigned long long)time,localtime,sourceConnection->GetRakNetGUID().ToString(),generic_replicas.size()); 00863 logfileHandler.WriteLog(logstr); 00864 } 00865 return true; 00866 } 00867 virtual void DeallocReplica(RakNet::Connection_RM3 *sourceConnection) { 00868 delete this; 00869 } 00870 virtual RM3SerializationResult Serialize(SerializeParameters *serializeParameters) { 00871 BeamingUser::Serialize(serializeParameters); 00872 RakNetTimeMS time = RakNet::GetTime(); 00873 serializeParameters->outputBitstream[0].WriteBits((const unsigned char*)anydata,1024*8); 00874 serializeParameters->outputBitstream[0].WriteAlignedBytes((const unsigned char*)&datasize,sizeof(datasize)); 00875 /*//begin printf 00876 static int y = 0; 00877 struct mystruct{ 00878 int x; 00879 char name[28]; 00880 float myfloat; 00881 } st; 00882 if (y == 100) { 00883 printf("sending %s, %d, %.3f ...\n",((mystruct *)anydata)->name,((mystruct *)anydata)->x,((mystruct *)anydata)->myfloat); 00884 y = 0; 00885 } 00886 y++; 00887 //end printf*/ 00888 return RM3SR_BROADCAST_IDENTICALLY; 00889 } 00890 virtual void Deserialize(RakNet::DeserializeParameters *deserializeParameters) { 00891 BeamingUser::Deserialize(deserializeParameters); 00892 RakNetTimeMS time = RakNet::GetTime(); 00893 deserializeParameters->serializationBitstream[0].ReadBits((unsigned char*)anydata,1024*8); 00894 deserializeParameters->serializationBitstream[0].ReadAlignedBytes((unsigned char*)&datasize,sizeof(datasize)); 00895 //printf("%"PRINTF_64_BIT_MODIFIER"u: %s %s %s %s %s\n",(unsigned long long)time,clientname,this->GetCreatingSystemGUID().ToString(),clientType,clientConfig,generic_id/*,anydata*/); 00896 if ((topology==SERVER)&&(logging==true))//logging on server 00897 { 00898 logfileHandler.GetLocalTime(localtime); 00899 sprintf(logstr,"M;%"PRINTF_64_BIT_MODIFIER"u;%s;%s;%s;%s;%s;%s",(unsigned long long)time,localtime,clientname,this->GetCreatingSystemGUID().ToString(),clientType,clientConfig,generic_id/*,anydata*/); 00900 logfileHandler.WriteLog(logstr); //writes additional lines 00901 } 00902 /*//begin printf 00903 struct mystruct{ 00904 int x; 00905 char name[28]; 00906 float myfloat; 00907 } st; 00908 printf("receiving %s, %d, %.3f ...\n",((mystruct *)anydata)->name,((mystruct *)anydata)->x,((mystruct *)anydata)->myfloat); 00909 //end printf*/ 00910 } 00911 virtual void SerializeConstructionRequestAccepted(RakNet::BitStream *serializationBitstream, RakNet::Connection_RM3 *requestingConnection) { 00912 serializationBitstream->Write(GetName() + RakNet::RakString(generic_id) + RakNet::RakString(" created on server")); 00913 } 00914 virtual void DeserializeConstructionRequestAccepted(RakNet::BitStream *serializationBitstream, RakNet::Connection_RM3 *acceptingConnection) { 00915 PrintOutput(serializationBitstream); 00916 } 00917 virtual void SerializeConstructionRequestRejected(RakNet::BitStream *serializationBitstream, RakNet::Connection_RM3 *requestingConnection) { 00918 serializationBitstream->Write(GetName() + RakNet::RakString(generic_id) + RakNet::RakString(" not created on server")); 00919 } 00920 virtual void DeserializeConstructionRequestRejected(RakNet::BitStream *serializationBitstream, RakNet::Connection_RM3 *rejectingConnection) { 00921 PrintOutput(serializationBitstream); 00922 } 00923 00924 public: 00925 char generic_id[128]; 00926 node_info *thisnode; 00927 //std::string parentbone; 00928 void *anydata; 00929 int datasize; 00930 00931 BeamingGenericReplica() : anydata(malloc(1024)) { } 00932 00933 virtual ~BeamingGenericReplica() { } 00934 }; 00935 00936 00937 00939 class BeamingRoom : public Replica3 00940 { 00941 public: 00942 void PrintOutput(RakNet::BitStream *bs) 00943 { 00944 if (bs->GetNumberOfBitsUsed()==0) 00945 return; 00946 RakNet::RakString rakString; 00947 bs->Read(rakString); 00948 printf("Receive: %s\n", rakString.C_String()); 00949 } 00950 virtual void SerializeConstruction(RakNet::BitStream *constructionBitstream, RakNet::Connection_RM3 *destinationConnection) { 00951 constructionBitstream->Write(clientname); 00952 constructionBitstream->Write(clientType); 00953 constructionBitstream->Write(clientConfig); 00954 constructionBitstream->Write(ip_port); 00955 gethostname(hostname,128); 00956 constructionBitstream->Write(hostname); 00957 constructionBitstream->Write(file_url); 00958 constructionBitstream->Write(host); 00959 constructionBitstream->Write(port); 00960 } 00961 virtual bool DeserializeConstruction(RakNet::BitStream *constructionBitstream, RakNet::Connection_RM3 *sourceConnection) { 00962 constructionBitstream->Read(clientname); 00963 constructionBitstream->Read(clientType); 00964 constructionBitstream->Read(clientConfig); 00965 constructionBitstream->Read(ip_port); 00966 constructionBitstream->Read(hostname); 00967 if (topology == SERVER) 00968 { 00969 printf("Connection from host: %s, ip: %s\n",hostname,sourceConnection->GetSystemAddress().ToString()); 00970 sprintf(ip_port,"%s",sourceConnection->GetSystemAddress().ToString()); 00971 00972 } else { 00973 printf("Connection from host: %s\n",hostname); } 00974 constructionBitstream->Read(file_url); 00975 constructionBitstream->Read(host); 00976 constructionBitstream->Read(port); 00977 new_clients[this->GetCreatingSystemGUID()].push_back(clientname); 00978 new_clients[this->GetCreatingSystemGUID()].push_back(clientType); 00979 new_clients[this->GetCreatingSystemGUID()].push_back(clientConfig); 00980 return true; 00981 } 00982 virtual void SerializeDestruction(RakNet::BitStream *destructionBitstream, RakNet::Connection_RM3 *destinationConnection) { } 00983 virtual bool DeserializeDestruction(RakNet::BitStream *destructionBitstream, RakNet::Connection_RM3 *sourceConnection) { return true; } 00984 virtual void DeallocReplica(RakNet::Connection_RM3 *sourceConnection) { delete this; } 00985 virtual RM3SerializationResult Serialize(SerializeParameters *serializeParameters) { 00986 return RM3SR_BROADCAST_IDENTICALLY; 00987 } 00988 virtual void Deserialize(RakNet::DeserializeParameters *deserializeParameters) { } 00989 virtual void SerializeConstructionRequestAccepted(RakNet::BitStream *serializationBitstream, RakNet::Connection_RM3 *requestingConnection) { } 00990 virtual void DeserializeConstructionRequestAccepted(RakNet::BitStream *serializationBitstream, RakNet::Connection_RM3 *acceptingConnection) { } 00991 virtual void SerializeConstructionRequestRejected(RakNet::BitStream *serializationBitstream, RakNet::Connection_RM3 *requestingConnection) { } 00992 virtual void DeserializeConstructionRequestRejected(RakNet::BitStream *serializationBitstream, RakNet::Connection_RM3 *rejectingConnection) { } 00993 virtual RM3ConstructionState QueryConstruction(RakNet::Connection_RM3 *destinationConnection, ReplicaManager3 *replicaManager3) { 00994 return QueryConstruction_ClientConstruction(destinationConnection); 00995 } 00996 virtual bool QueryRemoteConstruction(RakNet::Connection_RM3 *sourceConnection) { 00997 return QueryRemoteConstruction_ClientConstruction(sourceConnection); 00998 } 00999 01000 virtual RM3QuerySerializationResult QuerySerialization(RakNet::Connection_RM3 *destinationConnection) { 01001 return QuerySerialization_ClientSerializable(destinationConnection); 01002 } 01003 virtual RM3ActionOnPopConnection QueryActionOnPopConnection(RakNet::Connection_RM3 *droppedConnection) const { 01004 if (topology==SERVER) 01005 return QueryActionOnPopConnection_Server(droppedConnection); 01006 else 01007 return QueryActionOnPopConnection_Client(droppedConnection); 01008 } 01009 01010 char clientname[128]; 01011 char clientConfig[128]; 01012 char clientType[128]; 01013 char hostname[128]; 01014 char host[128]; 01015 int port; 01016 char file_url[128]; 01017 char logstr[1024]; 01018 char localtime[128]; 01019 char ip_port[128]; 01020 01021 BeamingRoom() { } 01022 01023 virtual ~BeamingRoom() { 01024 if (topology==SERVER) 01025 BroadcastDestruction(); 01026 } 01027 }; 01028 01029 01030 01032 class BeamingObjectReplica : public BeamingRoom 01033 { 01034 virtual RakNet::RakString GetName(void) const {return RakNet::RakString("OBJECT");} 01035 virtual void WriteAllocationID(RakNet::BitStream *allocationIdBitstream) const { 01036 allocationIdBitstream->Write(GetName()); 01037 } 01038 virtual void SerializeConstruction(RakNet::BitStream *constructionBitstream, RakNet::Connection_RM3 *destinationConnection) { 01039 BeamingRoom::SerializeConstruction(constructionBitstream, destinationConnection); 01040 constructionBitstream->Write(GetName() + RakNet::RakString(object_id) + RakNet::RakString(" created for guid ") + RakNet::RakString(this->GetCreatingSystemGUID().ToString())); 01041 constructionBitstream->Write(object_id); 01042 } 01043 virtual bool DeserializeConstruction(RakNet::BitStream *constructionBitstream, RakNet::Connection_RM3 *sourceConnection) { 01044 if (!BeamingRoom::DeserializeConstruction(constructionBitstream, sourceConnection)) 01045 return false; 01046 RakNetTimeMS time = RakNet::GetTime(); 01047 PrintOutput(constructionBitstream); 01048 constructionBitstream->Read(object_id); 01049 printf("Client: %s, Type: %s, Config: %s, Node: %s\n",clientname,clientType,clientConfig,object_id); 01050 if (topology == CLIENT) 01051 { 01052 object_replicas[this->GetCreatingSystemGUID()].push_back(this); //create within map on new client connection 01053 thisnode = new node_info; 01054 thisnode->name=object_id; 01055 thisnode->type=GetName().C_String(); 01056 thisnode->peername = clientname; 01057 thisnode->peertype = clientType; 01058 thisnode->peercfg = clientConfig; 01059 thisnode->ipport = ip_port; 01060 nodes_map[this->GetCreatingSystemGUID().ToString()].push_back(thisnode); 01061 } 01062 if ((topology==SERVER)&&(logging==true)) 01063 { 01064 //printf("%"PRINTF_64_BIT_MODIFIER"u: %s client created; rem %i\n",(unsigned long long)time,sourceConnection->GetRakNetGUID().ToString(),object_replicas.size()); 01065 logfileHandler.GetLocalTime(localtime); 01066 sprintf(logstr,"C;%"PRINTF_64_BIT_MODIFIER"u;%s;%s;0;%i",(unsigned long long)time,localtime,sourceConnection->GetRakNetGUID().ToString(),object_replicas.size()); 01067 logfileHandler.WriteLog(logstr); 01068 } 01069 return true; 01070 } 01071 virtual void SerializeDestruction(RakNet::BitStream *destructionBitstream, RakNet::Connection_RM3 *destinationConnection) { 01072 BeamingRoom::SerializeDestruction(destructionBitstream, destinationConnection); 01073 destructionBitstream->Write(GetName() + RakNet::RakString(object_id) + RakNet::RakString(" removed for guid ") + RakNet::RakString(this->GetCreatingSystemGUID().ToString())); 01074 } 01075 virtual bool DeserializeDestruction(RakNet::BitStream *destructionBitstream, RakNet::Connection_RM3 *sourceConnection) { 01076 if (!BeamingRoom::DeserializeDestruction(destructionBitstream, sourceConnection)) 01077 return false; 01078 RakNetTimeMS time = RakNet::GetTime(); 01079 PrintOutput(destructionBitstream); 01080 if (topology == CLIENT) 01081 { 01082 object_replicas.erase(this->GetCreatingSystemGUID()); //erase from map on client disconnection 01083 nodes_map.erase(this->GetCreatingSystemGUID().ToString()); 01084 } 01085 new_clients.erase(this->GetCreatingSystemGUID()); //deprecated 01086 if ((topology==SERVER)&&(logging==true)) 01087 { 01088 //printf("%"PRINTF_64_BIT_MODIFIER"u: %s client deleted; rem %i\n",(unsigned long long)time,sourceConnection->GetRakNetGUID().ToString(),object_replicas.size()); 01089 logfileHandler.GetLocalTime(localtime); 01090 sprintf(logstr,"D;%"PRINTF_64_BIT_MODIFIER"u;%s;%s;0;%i",(unsigned long long)time,localtime,sourceConnection->GetRakNetGUID().ToString(),object_replicas.size()); 01091 logfileHandler.WriteLog(logstr); 01092 } 01093 return true; 01094 } 01095 virtual void DeallocReplica(RakNet::Connection_RM3 *sourceConnection) { 01096 delete this; 01097 } 01098 virtual RM3SerializationResult Serialize(SerializeParameters *serializeParameters) { 01099 BeamingRoom::Serialize(serializeParameters); 01100 RakNetTimeMS time = RakNet::GetTime(); 01101 serializeParameters->outputBitstream[0].WriteAlignedBytes((const unsigned char*)&position,sizeof(position)); 01102 serializeParameters->outputBitstream[0].WriteAlignedBytes((const unsigned char*)&orientation,sizeof(orientation)); 01103 return RM3SR_BROADCAST_IDENTICALLY; 01104 } 01105 virtual void Deserialize(RakNet::DeserializeParameters *deserializeParameters) { 01106 BeamingRoom::Deserialize(deserializeParameters); 01107 RakNetTimeMS time = RakNet::GetTime(); 01108 deserializeParameters->serializationBitstream[0].ReadAlignedBytes((unsigned char*)&position,sizeof(position)); 01109 deserializeParameters->serializationBitstream[0].ReadAlignedBytes((unsigned char*)&orientation,sizeof(orientation)); 01110 //printf("%"PRINTF_64_BIT_MODIFIER"u: %s %s %s %s %s - %.3f %.3f %.3f %.3f %.3f %.3f %.3f\n",(unsigned long long)time,clientname,this->GetCreatingSystemGUID().ToString(),clientType,clientConfig,object_id,position.x,position.y,position.z,orientation.x,orientation.y,orientation.z,orientation.w); 01111 if ((topology==SERVER)&&(logging==true))//logging on server 01112 { 01113 logfileHandler.GetLocalTime(localtime); 01114 sprintf(logstr,"M;%"PRINTF_64_BIT_MODIFIER"u;%s;%s;%s;%s;%s;%s;%.3f;%.3f;%.3f;%.3f;%.3f;%.3f;%.3f",(unsigned long long)time,localtime,clientname,this->GetCreatingSystemGUID().ToString(),clientType,clientConfig,object_id,position.x,position.y,position.z,orientation.x,orientation.y,orientation.z,orientation.w); 01115 logfileHandler.WriteLog(logstr); //writes additional lines 01116 } 01117 } 01118 virtual void SerializeConstructionRequestAccepted(RakNet::BitStream *serializationBitstream, RakNet::Connection_RM3 *requestingConnection) { 01119 serializationBitstream->Write(GetName() + RakNet::RakString(object_id) + RakNet::RakString(" created on server")); 01120 } 01121 virtual void DeserializeConstructionRequestAccepted(RakNet::BitStream *serializationBitstream, RakNet::Connection_RM3 *acceptingConnection) { 01122 PrintOutput(serializationBitstream); 01123 } 01124 virtual void SerializeConstructionRequestRejected(RakNet::BitStream *serializationBitstream, RakNet::Connection_RM3 *requestingConnection) { 01125 serializationBitstream->Write(GetName() + RakNet::RakString(object_id) + RakNet::RakString(" not created on server")); 01126 } 01127 virtual void DeserializeConstructionRequestRejected(RakNet::BitStream *serializationBitstream, RakNet::Connection_RM3 *rejectingConnection) { 01128 PrintOutput(serializationBitstream); 01129 } 01130 01131 public: 01132 char object_id[128]; 01133 CVec3 position; 01134 CQuat orientation; 01135 node_info *thisnode; 01136 01137 BeamingObjectReplica() { } 01138 01139 virtual ~BeamingObjectReplica() { } 01140 }; 01141 01142 01144 class BeamingVideoReplica : public BeamingRoom 01145 { 01146 virtual RakNet::RakString GetName(void) const {return RakNet::RakString("VIDEO");} 01147 virtual void WriteAllocationID(RakNet::BitStream *allocationIdBitstream) const { 01148 allocationIdBitstream->Write(GetName()); 01149 } 01150 virtual void SerializeConstruction(RakNet::BitStream *constructionBitstream, RakNet::Connection_RM3 *destinationConnection) { 01151 BeamingRoom::SerializeConstruction(constructionBitstream, destinationConnection); 01152 constructionBitstream->Write(GetName() + RakNet::RakString(video_id) + RakNet::RakString(" created for guid ") + RakNet::RakString(this->GetCreatingSystemGUID().ToString())); 01153 constructionBitstream->Write(video_id); 01154 } 01155 virtual bool DeserializeConstruction(RakNet::BitStream *constructionBitstream, RakNet::Connection_RM3 *sourceConnection) { 01156 if (!BeamingRoom::DeserializeConstruction(constructionBitstream, sourceConnection)) 01157 return false; 01158 RakNetTimeMS time = RakNet::GetTime(); 01159 PrintOutput(constructionBitstream); 01160 constructionBitstream->Read(video_id); 01161 printf("Client: %s, Type: %s, Config: %s, Node: %s\n",clientname,clientType,clientConfig,video_id); 01162 if (topology == CLIENT) 01163 { 01164 video_replicas[this->GetCreatingSystemGUID()].push_back(this); //create within map on new client connection 01165 thisnode = new node_info; 01166 thisnode->name=video_id; 01167 thisnode->type=GetName().C_String(); 01168 thisnode->peername = clientname; 01169 thisnode->peertype = clientType; 01170 thisnode->peercfg = clientConfig; 01171 thisnode->ipport = ip_port; 01172 nodes_map[this->GetCreatingSystemGUID().ToString()].push_back(thisnode); 01173 } 01174 if ((topology==SERVER)&&(logging==true)) 01175 { 01176 //printf("%"PRINTF_64_BIT_MODIFIER"u: %s client created; rem %i\n",(unsigned long long)time,sourceConnection->GetRakNetGUID().ToString(),video_replicas.size()); 01177 logfileHandler.GetLocalTime(localtime); 01178 sprintf(logstr,"C;%"PRINTF_64_BIT_MODIFIER"u;%s;%s;0;%i",(unsigned long long)time,localtime,sourceConnection->GetRakNetGUID().ToString(),video_replicas.size()); 01179 logfileHandler.WriteLog(logstr); 01180 } 01181 return true; 01182 } 01183 virtual void SerializeDestruction(RakNet::BitStream *destructionBitstream, RakNet::Connection_RM3 *destinationConnection) { 01184 BeamingRoom::SerializeDestruction(destructionBitstream, destinationConnection); 01185 destructionBitstream->Write(GetName() + RakNet::RakString(video_id) + RakNet::RakString(" removed for guid ") + RakNet::RakString(this->GetCreatingSystemGUID().ToString())); 01186 } 01187 virtual bool DeserializeDestruction(RakNet::BitStream *destructionBitstream, RakNet::Connection_RM3 *sourceConnection) { 01188 if (!BeamingRoom::DeserializeDestruction(destructionBitstream, sourceConnection)) 01189 return false; 01190 RakNetTimeMS time = RakNet::GetTime(); 01191 PrintOutput(destructionBitstream); 01192 if (topology == CLIENT) 01193 { 01194 video_replicas.erase(this->GetCreatingSystemGUID()); //erase from map on client disconnection 01195 nodes_map.erase(this->GetCreatingSystemGUID().ToString()); 01196 } 01197 new_clients.erase(this->GetCreatingSystemGUID()); //deprecated 01198 if ((topology==SERVER)&&(logging==true)) 01199 { 01200 //printf("%"PRINTF_64_BIT_MODIFIER"u: %s client deleted; rem %i\n",(unsigned long long)time,sourceConnection->GetRakNetGUID().ToString(),video_replicas.size()); 01201 logfileHandler.GetLocalTime(localtime); 01202 sprintf(logstr,"D;%"PRINTF_64_BIT_MODIFIER"u;%s;%s;0;%i",(unsigned long long)time,localtime,sourceConnection->GetRakNetGUID().ToString(),video_replicas.size()); 01203 logfileHandler.WriteLog(logstr); 01204 } 01205 return true; 01206 } 01207 virtual void DeallocReplica(RakNet::Connection_RM3 *sourceConnection) { 01208 delete this; 01209 } 01210 virtual RM3SerializationResult Serialize(SerializeParameters *serializeParameters) { 01211 BeamingRoom::Serialize(serializeParameters); 01212 RakNetTimeMS time = RakNet::GetTime(); 01213 serializeParameters->outputBitstream[0].WriteAlignedBytes((const unsigned char*)&frame_width,sizeof(frame_width)); 01214 serializeParameters->outputBitstream[0].WriteAlignedBytes((const unsigned char*)&frame_height,sizeof(frame_height)); 01215 serializeParameters->outputBitstream[0].WriteAlignedBytes((const unsigned char*)&bandwidth,sizeof(bandwidth)); 01216 serializeParameters->outputBitstream[0].WriteAlignedBytes((const unsigned char*)&calibration1,sizeof(calibration1)); 01217 serializeParameters->outputBitstream[0].WriteAlignedBytes((const unsigned char*)&calibration2,sizeof(calibration2)); 01218 return RM3SR_BROADCAST_IDENTICALLY; 01219 } 01220 virtual void Deserialize(RakNet::DeserializeParameters *deserializeParameters) { 01221 BeamingRoom::Deserialize(deserializeParameters); 01222 RakNetTimeMS time = RakNet::GetTime(); 01223 deserializeParameters->serializationBitstream[0].ReadAlignedBytes((unsigned char*)&frame_width,sizeof(frame_width)); 01224 deserializeParameters->serializationBitstream[0].ReadAlignedBytes((unsigned char*)&frame_height,sizeof(frame_height)); 01225 deserializeParameters->serializationBitstream[0].ReadAlignedBytes((unsigned char*)&bandwidth,sizeof(bandwidth)); 01226 deserializeParameters->serializationBitstream[0].ReadAlignedBytes((unsigned char*)&calibration1,sizeof(calibration1)); 01227 deserializeParameters->serializationBitstream[0].ReadAlignedBytes((unsigned char*)&calibration2,sizeof(calibration2)); 01228 //printf("%"PRINTF_64_BIT_MODIFIER"u: %s %s %s %s %s - %i %i %f\n",(unsigned long long)time,clientname,this->GetCreatingSystemGUID().ToString(),clientType,clientConfig,video_id,frame_width,frame_height,bandwidth); 01229 if ((topology==SERVER)&&(logging==true))//logging on server 01230 { 01231 logfileHandler.GetLocalTime(localtime); 01232 sprintf(logstr,"M;%"PRINTF_64_BIT_MODIFIER"u;%s;%s;%s;%s;%s;%s;%i;%i;%f",(unsigned long long)time,localtime,clientname,this->GetCreatingSystemGUID().ToString(),clientType,clientConfig,video_id,frame_width,frame_height,bandwidth); 01233 logfileHandler.WriteLog(logstr); //writes additional lines 01234 } 01235 } 01236 virtual void SerializeConstructionRequestAccepted(RakNet::BitStream *serializationBitstream, RakNet::Connection_RM3 *requestingConnection) { 01237 serializationBitstream->Write(GetName() + RakNet::RakString(video_id) + RakNet::RakString(" created on server")); 01238 } 01239 virtual void DeserializeConstructionRequestAccepted(RakNet::BitStream *serializationBitstream, RakNet::Connection_RM3 *acceptingConnection) { 01240 PrintOutput(serializationBitstream); 01241 } 01242 virtual void SerializeConstructionRequestRejected(RakNet::BitStream *serializationBitstream, RakNet::Connection_RM3 *requestingConnection) { 01243 serializationBitstream->Write(GetName() + RakNet::RakString(video_id) + RakNet::RakString(" not created on server")); 01244 } 01245 virtual void DeserializeConstructionRequestRejected(RakNet::BitStream *serializationBitstream, RakNet::Connection_RM3 *rejectingConnection) { 01246 PrintOutput(serializationBitstream); 01247 } 01248 01249 public: 01250 char video_id[128]; 01251 int frame_width; 01252 int frame_height; 01253 double bandwidth; 01254 CMatrix calibration1; 01255 CMatrix calibration2; 01256 node_info *thisnode; 01257 01258 BeamingVideoReplica() { } 01259 01260 virtual ~BeamingVideoReplica() { } 01261 }; 01262 01263 01265 class BeamingAudioReplica : public BeamingRoom 01266 { 01267 virtual RakNet::RakString GetName(void) const {return RakNet::RakString("AUDIO");} 01268 virtual void WriteAllocationID(RakNet::BitStream *allocationIdBitstream) const { 01269 allocationIdBitstream->Write(GetName()); 01270 } 01271 virtual void SerializeConstruction(RakNet::BitStream *constructionBitstream, RakNet::Connection_RM3 *destinationConnection) { 01272 BeamingRoom::SerializeConstruction(constructionBitstream, destinationConnection); 01273 constructionBitstream->Write(GetName() + RakNet::RakString(audio_id) + RakNet::RakString(" created for guid ") + RakNet::RakString(this->GetCreatingSystemGUID().ToString())); 01274 constructionBitstream->Write(audio_id); 01275 } 01276 virtual bool DeserializeConstruction(RakNet::BitStream *constructionBitstream, RakNet::Connection_RM3 *sourceConnection) { 01277 if (!BeamingRoom::DeserializeConstruction(constructionBitstream, sourceConnection)) 01278 return false; 01279 RakNetTimeMS time = RakNet::GetTime(); 01280 PrintOutput(constructionBitstream); 01281 constructionBitstream->Read(audio_id); 01282 printf("Client: %s, Type: %s, Config: %s, Node: %s\n",clientname,clientType,clientConfig,audio_id); 01283 if (topology == CLIENT) 01284 { 01285 audio_replicas[this->GetCreatingSystemGUID()].push_back(this); //create within map on new client connection 01286 thisnode = new node_info; 01287 thisnode->name=audio_id; 01288 thisnode->type=GetName().C_String(); 01289 thisnode->peername = clientname; 01290 thisnode->peertype = clientType; 01291 thisnode->peercfg = clientConfig; 01292 thisnode->ipport = ip_port; 01293 nodes_map[this->GetCreatingSystemGUID().ToString()].push_back(thisnode); 01294 } 01295 if ((topology==SERVER)&&(logging==true)) 01296 { 01297 //printf("%"PRINTF_64_BIT_MODIFIER"u: %s client created; rem %i\n",(unsigned long long)time,sourceConnection->GetRakNetGUID().ToString(),audio_replicas.size()); 01298 logfileHandler.GetLocalTime(localtime); 01299 sprintf(logstr,"C;%"PRINTF_64_BIT_MODIFIER"u;%s;%s;0;%i",(unsigned long long)time,localtime,sourceConnection->GetRakNetGUID().ToString(),audio_replicas.size()); 01300 logfileHandler.WriteLog(logstr); 01301 } 01302 return true; 01303 } 01304 virtual void SerializeDestruction(RakNet::BitStream *destructionBitstream, RakNet::Connection_RM3 *destinationConnection) { 01305 BeamingRoom::SerializeDestruction(destructionBitstream, destinationConnection); 01306 destructionBitstream->Write(GetName() + RakNet::RakString(audio_id) + RakNet::RakString(" removed for guid ") + RakNet::RakString(this->GetCreatingSystemGUID().ToString())); 01307 } 01308 virtual bool DeserializeDestruction(RakNet::BitStream *destructionBitstream, RakNet::Connection_RM3 *sourceConnection) { 01309 if (!BeamingRoom::DeserializeDestruction(destructionBitstream, sourceConnection)) 01310 return false; 01311 RakNetTimeMS time = RakNet::GetTime(); 01312 PrintOutput(destructionBitstream); 01313 audio_replicas.erase(this->GetCreatingSystemGUID()); //erase from map on client disconnection 01314 nodes_map.erase(this->GetCreatingSystemGUID().ToString()); 01315 new_clients.erase(this->GetCreatingSystemGUID()); //deprecated 01316 if ((topology==SERVER)&&(logging==true)) 01317 { 01318 //printf("%"PRINTF_64_BIT_MODIFIER"u: %s client deleted; rem %i\n",(unsigned long long)time,sourceConnection->GetRakNetGUID().ToString(),audio_replicas.size()); 01319 logfileHandler.GetLocalTime(localtime); 01320 sprintf(logstr,"D;%"PRINTF_64_BIT_MODIFIER"u;%s;%s;0;%i",(unsigned long long)time,localtime,sourceConnection->GetRakNetGUID().ToString(),audio_replicas.size()); 01321 logfileHandler.WriteLog(logstr); 01322 } 01323 return true; 01324 } 01325 virtual void DeallocReplica(RakNet::Connection_RM3 *sourceConnection) { 01326 delete this; 01327 } 01328 virtual RM3SerializationResult Serialize(SerializeParameters *serializeParameters) { 01329 BeamingRoom::Serialize(serializeParameters); 01330 RakNetTimeMS time = RakNet::GetTime(); 01331 serializeParameters->outputBitstream[0].WriteAlignedBytes((const unsigned char*)&config,sizeof(config)); 01332 return RM3SR_BROADCAST_IDENTICALLY; 01333 } 01334 virtual void Deserialize(RakNet::DeserializeParameters *deserializeParameters) { 01335 BeamingRoom::Deserialize(deserializeParameters); 01336 RakNetTimeMS time = RakNet::GetTime(); 01337 deserializeParameters->serializationBitstream[0].ReadAlignedBytes((unsigned char*)&config,sizeof(config)); 01338 //printf("%"PRINTF_64_BIT_MODIFIER"u: %s %s %s %s %s - %s\n",(unsigned long long)time,clientname,this->GetCreatingSystemGUID().ToString(),clientType,clientConfig,audio_id,config); 01339 if ((topology==SERVER)&&(logging==true))//logging on server 01340 { 01341 logfileHandler.GetLocalTime(localtime); 01342 sprintf(logstr,"M;%"PRINTF_64_BIT_MODIFIER"u;%s;%s;%s;%s;%s;%s;%s",(unsigned long long)time,localtime,clientname,this->GetCreatingSystemGUID().ToString(),clientType,clientConfig,audio_id,config); 01343 logfileHandler.WriteLog(logstr); //writes additional lines 01344 } 01345 } 01346 virtual void SerializeConstructionRequestAccepted(RakNet::BitStream *serializationBitstream, RakNet::Connection_RM3 *requestingConnection) { 01347 serializationBitstream->Write(GetName() + RakNet::RakString(audio_id) + RakNet::RakString(" created on server")); 01348 } 01349 virtual void DeserializeConstructionRequestAccepted(RakNet::BitStream *serializationBitstream, RakNet::Connection_RM3 *acceptingConnection) { 01350 PrintOutput(serializationBitstream); 01351 } 01352 virtual void SerializeConstructionRequestRejected(RakNet::BitStream *serializationBitstream, RakNet::Connection_RM3 *requestingConnection) { 01353 serializationBitstream->Write(GetName() + RakNet::RakString(audio_id) + RakNet::RakString(" not created on server")); 01354 } 01355 virtual void DeserializeConstructionRequestRejected(RakNet::BitStream *serializationBitstream, RakNet::Connection_RM3 *rejectingConnection) { 01356 PrintOutput(serializationBitstream); 01357 } 01358 01359 public: 01360 char audio_id[128]; 01361 char config[128]; 01362 node_info *thisnode; 01363 01364 BeamingAudioReplica() { } 01365 01366 virtual ~BeamingAudioReplica() { } 01367 }; 01368 01369 01371 class BeamingPointCloudReplica : public BeamingRoom 01372 { 01373 virtual RakNet::RakString GetName(void) const {return RakNet::RakString("POINTCLOUD");} 01374 virtual void WriteAllocationID(RakNet::BitStream *allocationIdBitstream) const { 01375 allocationIdBitstream->Write(GetName()); 01376 } 01377 virtual void SerializeConstruction(RakNet::BitStream *constructionBitstream, RakNet::Connection_RM3 *destinationConnection) { 01378 BeamingRoom::SerializeConstruction(constructionBitstream, destinationConnection); 01379 constructionBitstream->Write(GetName() + RakNet::RakString(pointcloud_id) + RakNet::RakString(" created for guid ") + RakNet::RakString(this->GetCreatingSystemGUID().ToString())); 01380 constructionBitstream->Write(pointcloud_id); 01381 } 01382 virtual bool DeserializeConstruction(RakNet::BitStream *constructionBitstream, RakNet::Connection_RM3 *sourceConnection) { 01383 if (!BeamingRoom::DeserializeConstruction(constructionBitstream, sourceConnection)) 01384 return false; 01385 RakNetTimeMS time = RakNet::GetTime(); 01386 PrintOutput(constructionBitstream); 01387 constructionBitstream->Read(pointcloud_id); 01388 printf("Client: %s, Type: %s, Config: %s, Node: %s\n",clientname,clientType,clientConfig,pointcloud_id); 01389 if (topology == CLIENT) 01390 { 01391 point_cloud_replicas[this->GetCreatingSystemGUID()].push_back(this); //create within map on new client connection 01392 thisnode = new node_info; 01393 thisnode->name=pointcloud_id; 01394 thisnode->type=GetName().C_String(); 01395 thisnode->peername = clientname; 01396 thisnode->peertype = clientType; 01397 thisnode->peercfg = clientConfig; 01398 thisnode->ipport = ip_port; 01399 nodes_map[this->GetCreatingSystemGUID().ToString()].push_back(thisnode); 01400 } 01401 if ((topology==SERVER)&&(logging==true)) 01402 { 01403 //printf("%"PRINTF_64_BIT_MODIFIER"u: %s client created; rem %i\n",(unsigned long long)time,sourceConnection->GetRakNetGUID().ToString(),point_cloud_replicas.size()); 01404 logfileHandler.GetLocalTime(localtime); 01405 sprintf(logstr,"C;%"PRINTF_64_BIT_MODIFIER"u;%s;%s;0;%i",(unsigned long long)time,localtime,sourceConnection->GetRakNetGUID().ToString(),point_cloud_replicas.size()); 01406 logfileHandler.WriteLog(logstr); 01407 } 01408 return true; 01409 } 01410 virtual void SerializeDestruction(RakNet::BitStream *destructionBitstream, RakNet::Connection_RM3 *destinationConnection) { 01411 BeamingRoom::SerializeDestruction(destructionBitstream, destinationConnection); 01412 destructionBitstream->Write(GetName() + RakNet::RakString(pointcloud_id) + RakNet::RakString(" removed for guid ") + RakNet::RakString(this->GetCreatingSystemGUID().ToString())); 01413 } 01414 virtual bool DeserializeDestruction(RakNet::BitStream *destructionBitstream, RakNet::Connection_RM3 *sourceConnection) { 01415 if (!BeamingRoom::DeserializeDestruction(destructionBitstream, sourceConnection)) 01416 return false; 01417 RakNetTimeMS time = RakNet::GetTime(); 01418 PrintOutput(destructionBitstream); 01419 if (topology == CLIENT) 01420 { 01421 point_cloud_replicas.erase(this->GetCreatingSystemGUID()); //erase from map on client disconnection 01422 nodes_map.erase(this->GetCreatingSystemGUID().ToString()); 01423 } 01424 new_clients.erase(this->GetCreatingSystemGUID()); //deprecated 01425 if ((topology==SERVER)&&(logging==true)) 01426 { 01427 //printf("%"PRINTF_64_BIT_MODIFIER"u: %s client deleted; rem %i\n",(unsigned long long)time,sourceConnection->GetRakNetGUID().ToString(),point_cloud_replicas.size()); 01428 logfileHandler.GetLocalTime(localtime); 01429 sprintf(logstr,"D;%"PRINTF_64_BIT_MODIFIER"u;%s;%s;0;%i",(unsigned long long)time,localtime,sourceConnection->GetRakNetGUID().ToString(),point_cloud_replicas.size()); 01430 logfileHandler.WriteLog(logstr); 01431 } 01432 return true; 01433 } 01434 virtual void DeallocReplica(RakNet::Connection_RM3 *sourceConnection) { 01435 delete this; 01436 } 01437 virtual RM3SerializationResult Serialize(SerializeParameters *serializeParameters) { 01438 BeamingRoom::Serialize(serializeParameters); 01439 RakNetTimeMS time = RakNet::GetTime(); 01440 serializeParameters->outputBitstream[0].WriteAlignedBytes((const unsigned char*)&size,sizeof(size)); 01441 serializeParameters->outputBitstream[0].WriteAlignedBytes((const unsigned char*)&bandwidth,sizeof(bandwidth)); 01442 serializeParameters->outputBitstream[0].WriteAlignedBytes((const unsigned char*)&RGB_flag,sizeof(RGB_flag)); 01443 serializeParameters->outputBitstream[0].WriteAlignedBytes((const unsigned char*)&quality_level,sizeof(quality_level)); 01444 return RM3SR_BROADCAST_IDENTICALLY; 01445 } 01446 virtual void Deserialize(RakNet::DeserializeParameters *deserializeParameters) { 01447 BeamingRoom::Deserialize(deserializeParameters); 01448 RakNetTimeMS time = RakNet::GetTime(); 01449 deserializeParameters->serializationBitstream[0].ReadAlignedBytes((unsigned char*)&size,sizeof(size)); 01450 deserializeParameters->serializationBitstream[0].ReadAlignedBytes((unsigned char*)&bandwidth,sizeof(bandwidth)); 01451 deserializeParameters->serializationBitstream[0].ReadAlignedBytes((unsigned char*)&RGB_flag,sizeof(RGB_flag)); 01452 deserializeParameters->serializationBitstream[0].ReadAlignedBytes((unsigned char*)&quality_level,sizeof(quality_level)); 01453 //printf("%"PRINTF_64_BIT_MODIFIER"u: %s %s %s %s %s - %i %f %i\n",(unsigned long long)time,clientname,this->GetCreatingSystemGUID().ToString(),clientType,clientConfig,pointcloud_id,size,bandwidth,RGB_flag); 01454 if ((topology==SERVER)&&(logging==true))//logging on server 01455 { 01456 logfileHandler.GetLocalTime(localtime); 01457 sprintf(logstr,"M;%"PRINTF_64_BIT_MODIFIER"u;%s;%s;%s;%s;%s;%s;%i;%f;%i",(unsigned long long)time,localtime,clientname,this->GetCreatingSystemGUID().ToString(),clientType,clientConfig,pointcloud_id,size,bandwidth,RGB_flag); 01458 logfileHandler.WriteLog(logstr); //writes additional lines 01459 } 01460 } 01461 virtual void SerializeConstructionRequestAccepted(RakNet::BitStream *serializationBitstream, RakNet::Connection_RM3 *requestingConnection) { 01462 serializationBitstream->Write(GetName() + RakNet::RakString(pointcloud_id) + RakNet::RakString(" created on server")); 01463 } 01464 virtual void DeserializeConstructionRequestAccepted(RakNet::BitStream *serializationBitstream, RakNet::Connection_RM3 *acceptingConnection) { 01465 PrintOutput(serializationBitstream); 01466 } 01467 virtual void SerializeConstructionRequestRejected(RakNet::BitStream *serializationBitstream, RakNet::Connection_RM3 *requestingConnection) { 01468 serializationBitstream->Write(GetName() + RakNet::RakString(pointcloud_id) + RakNet::RakString(" not created on server")); 01469 } 01470 virtual void DeserializeConstructionRequestRejected(RakNet::BitStream *serializationBitstream, RakNet::Connection_RM3 *rejectingConnection) { 01471 PrintOutput(serializationBitstream); 01472 } 01473 01474 public: 01475 char pointcloud_id[128]; 01476 int size; 01477 double bandwidth; 01478 bool RGB_flag; 01479 int quality_level; 01480 node_info *thisnode; 01481 01482 BeamingPointCloudReplica() { } 01483 01484 virtual ~BeamingPointCloudReplica() { } 01485 }; 01486 01487 01489 class BeamingConnection : public Connection_RM3 { 01490 public: 01491 BeamingConnection(SystemAddress _systemAddress, RakNetGUID _guid) : Connection_RM3(_systemAddress, _guid) {} 01492 virtual ~BeamingConnection() {} 01493 01495 virtual Replica3 *AllocReplica(RakNet::BitStream *allocationId, ReplicaManager3 *replicaManager3) 01496 { 01497 RakNet::RakString typeName; 01498 allocationId->Read(typeName); 01499 if (typeName=="AVATAR") return new BeamingAvatarJointReplica; 01500 if (typeName=="FACIAL") return new BeamingFacialReplica; 01501 if (typeName=="EMOTION") return new BeamingEmotionReplica; 01502 if (typeName=="TACTILE") return new BeamingTactileReplica; 01503 if (typeName=="ROBOT") return new BeamingRobotReplica; 01504 if (typeName=="OBJECT") return new BeamingObjectReplica; 01505 if (typeName=="VIDEO") return new BeamingVideoReplica; 01506 if (typeName=="AUDIO") return new BeamingAudioReplica; 01507 if (typeName=="POINTCLOUD") return new BeamingPointCloudReplica; 01508 if (typeName=="GENERIC") return new BeamingGenericReplica; 01509 return 0; 01510 } 01511 protected: 01512 }; 01513 01514 01516 class ReplicaManager3Beaming : public ReplicaManager3 01517 { 01518 virtual Connection_RM3* AllocConnection(SystemAddress systemAddress, RakNetGUID rakNetGUID) const { 01519 return new BeamingConnection(systemAddress,rakNetGUID); 01520 } 01521 virtual void DeallocConnection(Connection_RM3 *connection) const { 01522 delete connection; 01523 } 01524 }; 01525 01526 01527