![]() |
Beaming Scene Service
2.0
RakNet wrapper for managing data communications between multiple Beaming clients
|
00001 //Client Dll - links to RakNet 00002 00003 #include "client.h" 00004 #include "ClientServer.h" 00005 #include <list> 00006 00007 class BeamingUser; 00008 class BeamingAvatarJointReplica; 00009 class BeamingEmotionReplica; 00010 class BeamingFacialReplica; 00011 class BeamingTactileReplica; 00012 class BeamingRobotReplica; 00013 class BeamingRoom; 00014 class BeamingVideoReplica; 00015 class BeamingObjectReplica; 00016 class BeamingAudioReplica; 00017 class BeamingPointCloudReplica; 00018 00019 char ch; 00020 SocketDescriptor sd; 00021 char ip[128]; 00022 static int SERVER_PORT=12050; 00023 Packet *packet; 00024 bool isconnected=false; 00025 bool connection_lost=false; 00026 std::map<std::string, BeamingDataType> node_type_map; 00027 std::map<std::string, BeamingAvatarJointReplica*> AvatarNodeMap; 00028 std::map<std::string, BeamingEmotionReplica*> EmotionNodeMap; 00029 std::map<std::string, BeamingFacialReplica*> FacialNodeMap; 00030 std::map<std::string, BeamingTactileReplica*> TactileNodeMap; 00031 std::map<std::string, BeamingRobotReplica*> RobotNodeMap; 00032 std::map<std::string, BeamingVideoReplica*> VideoNodeMap; 00033 std::map<std::string, BeamingObjectReplica*> ObjectNodeMap; 00034 std::map<std::string, BeamingAudioReplica*> AudioNodeMap; 00035 std::map<std::string, BeamingPointCloudReplica*> PointCloudNodeMap; 00036 std::map<std::string, BeamingGenericReplica*> GenericNodeMap; 00037 std::string myid, my_config, client_type; 00038 char client_name[128]; 00039 bool viewing_only = false; 00040 00042 NetworkIDManager networkIdManager; 00044 RakPeerInterface *rakPeer; 00046 ReplicaManager3Beaming replicaManager; 00047 00048 00049 #ifdef WIN32 00050 CLIENT_LIB_EXPORT int startclient(char *server_address, int server_port, char *client, char *clienttype, char *config, int viewer, int reliability, int priority, int interval_ms ) 00051 #else 00052 int startclient(char *server_address, int server_port, char *client, char *clienttype, char *config, int viewer, int reliability, int priority, int interval_ms) 00053 #endif 00054 { 00055 strcpy(ip,server_address); 00056 strcpy(client_name,client); 00057 SERVER_PORT = server_port; 00058 rakPeer = RakNetworkFactory::GetRakPeerInterface(); 00059 topology=CLIENT; 00060 sd.port=0; 00061 // ObjectMemberRPC, AutoRPC for objects, and ReplicaManager3 require that you call SetNetworkIDManager() 00062 rakPeer->SetNetworkIDManager(&networkIdManager); 00063 // The network ID authority is the system that creates the common numerical identifier used to lookup pointers. 00064 // For client/server this is the server 00065 // For peer to peer this would be true on every system, and NETWORK_ID_SUPPORTS_PEER_TO_PEER should be defined in RakNetDefines.h 00066 networkIdManager.SetIsNetworkIDAuthority(false); 00067 00068 //set reliability and priority - see PacketPriority.h 00069 //Note that the transmission of one of the three reliable packets types is required for the detection of lost connections. 00070 //If you never send reliable packets you need to implement lost connection detection manually. 00071 replicaManager.SetDefaultPacketReliability((PacketReliability)reliability); 00072 replicaManager.SetDefaultPacketPriority((PacketPriority)priority); 00073 replicaManager.SetAutoSerializeInterval(interval_ms); 00074 //printf("%i, %i, %i\n", reliability, priority, interval_ms); 00075 00076 // Start RakNet 00077 rakPeer->Startup(1,10,&sd,1); //isServer ? 32 : 1 00078 rakPeer->AttachPlugin(&replicaManager); 00079 00080 rakPeer->Connect(ip,SERVER_PORT,0,0,0); 00081 printf("Connecting...\n"); 00082 RakSleep(1000); 00083 check(); 00084 printf("Client %s (%s) is %s\n", client, clienttype, (isconnected)?"connected":"not connected"); 00085 00086 myid = rakPeer->GetGuidFromSystemAddress(UNASSIGNED_SYSTEM_ADDRESS).ToString(); 00087 if (isconnected) { 00088 printf("Client (%s) GUID is %s \n",myid.c_str(),(viewer)?"viewer only":"bidirectional"); 00089 } 00090 //set up node_type map 00091 node_type_map["AVATAR"]=AVATAR; 00092 node_type_map["FACIAL"]=FACIAL; 00093 node_type_map["EMOTION"]=EMOTION; 00094 node_type_map["VIDEO"]=VIDEO; 00095 node_type_map["TACTILE"]=TACTILE; 00096 node_type_map["ROBOT"]=ROBOT; 00097 node_type_map["OBJECT"]=OBJECT; 00098 node_type_map["AUDIO"]=AUDIO; 00099 node_type_map["POINTCLOUD"]=POINTCLOUD; 00100 node_type_map["GENERIC"]=GENERIC; 00101 my_config = config; 00102 client_type = clienttype; 00103 if(viewer) 00104 viewing_only = true; 00105 return isconnected; 00106 } 00107 00108 00109 #ifdef WIN32 00110 CLIENT_LIB_EXPORT void check() 00111 #else 00112 void check() 00113 #endif 00114 { 00115 for (packet = rakPeer->Receive(); packet; rakPeer->DeallocatePacket(packet), packet = rakPeer->Receive()) 00116 { 00117 switch (packet->data[0]) 00118 { 00119 case ID_CONNECTION_ATTEMPT_FAILED: 00120 printf("ID_CONNECTION_ATTEMPT_FAILED\n"); 00121 printf("Attempting reconnection ..."); 00122 break; 00123 case ID_NO_FREE_INCOMING_CONNECTIONS: 00124 printf("ID_NO_FREE_INCOMING_CONNECTIONS\n"); 00125 break; 00126 case ID_CONNECTION_REQUEST_ACCEPTED: 00127 printf("ID_CONNECTION_REQUEST_ACCEPTED\n"); 00128 isconnected=true; 00129 connection_lost=false; 00130 break; 00131 case ID_NEW_INCOMING_CONNECTION: 00132 printf("ID_NEW_INCOMING_CONNECTION from %s\n", packet->systemAddress.ToString()); 00133 break; 00134 case ID_DISCONNECTION_NOTIFICATION: 00135 removeAllNodes(); 00136 printf("ID_DISCONNECTION_NOTIFICATION\n"); 00137 isconnected=false; 00138 break; 00139 case ID_CONNECTION_LOST: 00140 printf("ID_CONNECTION_LOST\n"); 00141 printf("Attempting reconnection ..."); 00142 connection_lost=true; 00143 break; 00144 } 00145 } 00146 //timeBeginPeriod(1); 00147 00148 if (connection_lost) 00149 { 00150 printf("."); 00151 RakSleep(200); 00152 rakPeer->Connect(ip,SERVER_PORT,0,0,0); 00153 RakSleep(200); 00154 } 00155 00156 00157 RakSleep(1); 00158 } 00159 00160 #ifdef WIN32 00161 CLIENT_LIB_EXPORT void createNode(char *id) 00162 #else 00163 void createNode(char *id) 00164 #endif 00165 { 00166 if (viewing_only) return; 00167 addNode(id,"AVATAR"); 00168 } 00169 00170 00171 #ifdef WIN32 00172 CLIENT_LIB_EXPORT int addRocketBoxAvatar(char *avatar_id, char *avatar_cfg) 00173 #else 00174 int addRocketBoxAvatar(char *avatar_id, char *avatar_cfg) 00175 #endif 00176 { 00177 if (viewing_only) return 0; 00178 char id1[128]; 00179 char id2[128]; 00180 sprintf(id1,"%s0",avatar_id); 00181 if (AvatarNodeMap.find(id1) != AvatarNodeMap.end()) //if id exists in node database 00182 { 00183 printf("An avatar with the same id already exists\n"); 00184 return 0; 00185 } 00186 sprintf(id1,"%s0",avatar_id); addNode(id1,"AVATAR"); updateAvatarNodes(id1,0,-1.18448e-015,-2.70976e-008,0,0.707106,-3.09086e-008,0.707107); strcpy(AvatarNodeMap[id1]->clientConfig,avatar_cfg); strcpy(AvatarNodeMap[id1]->avatarjoint_id,"0"); strcpy(AvatarNodeMap[id1]->clientname,avatar_id); 00187 sprintf(id1,"%s1",avatar_id); sprintf(id2,"%s0",avatar_id); addChildNode(id1,id2,"AVATAR"); updateAvatarNodes(id1,0,-0.897348,3.92243e-008,0,-0.707106,3.09086e-008,0.707107); strcpy(AvatarNodeMap[id1]->clientConfig,avatar_cfg); strcpy(AvatarNodeMap[id1]->avatarjoint_id,"1"); strcpy(AvatarNodeMap[id1]->clientname,avatar_id); 00188 sprintf(id1,"%s2",avatar_id); sprintf(id2,"%s0",avatar_id); addChildNode(id1,id2,"AVATAR"); updateAvatarNodes(id1,0,0,0,0.499999,0.5,-0.5,0.500001); strcpy(AvatarNodeMap[id1]->clientConfig,avatar_cfg); strcpy(AvatarNodeMap[id1]->avatarjoint_id,"2"); strcpy(AvatarNodeMap[id1]->clientname,avatar_id); 00189 sprintf(id1,"%s3",avatar_id); sprintf(id2,"%s2",avatar_id); addChildNode(id1,id2,"AVATAR"); updateAvatarNodes(id1,0.120265,1.66875e-007,0.00162871,7.39912e-007,-2.04582e-008,-7.15256e-007,1); strcpy(AvatarNodeMap[id1]->clientConfig,avatar_cfg); strcpy(AvatarNodeMap[id1]->avatarjoint_id,"3"); strcpy(AvatarNodeMap[id1]->clientname,avatar_id); 00190 sprintf(id1,"%s4",avatar_id); sprintf(id2,"%s3",avatar_id); addChildNode(id1,id2,"AVATAR"); updateAvatarNodes(id1,0.153172,-9.10502e-009,0.000121967,-1.55036e-006,-2.79393e-009,-2.98024e-008,1); strcpy(AvatarNodeMap[id1]->clientConfig,avatar_cfg); strcpy(AvatarNodeMap[id1]->avatarjoint_id,"4"); strcpy(AvatarNodeMap[id1]->clientname,avatar_id); 00191 sprintf(id1,"%s5",avatar_id); sprintf(id2,"%s4",avatar_id); addChildNode(id1,id2,"AVATAR"); updateAvatarNodes(id1,0.153172,7.48332e-009,0.000121967,1.22113e-006,4.56349e-008,7.45057e-008,1); strcpy(AvatarNodeMap[id1]->clientConfig,avatar_cfg); strcpy(AvatarNodeMap[id1]->avatarjoint_id,"5"); strcpy(AvatarNodeMap[id1]->clientname,avatar_id); 00192 sprintf(id1,"%s6",avatar_id); sprintf(id2,"%s5",avatar_id); addChildNode(id1,id2,"AVATAR"); updateAvatarNodes(id1,0.199124,2.79132e-008,-0.0156307,1.39536e-007,4.39412e-013,4.61936e-007,1); strcpy(AvatarNodeMap[id1]->clientConfig,avatar_cfg); strcpy(AvatarNodeMap[id1]->avatarjoint_id,"6"); strcpy(AvatarNodeMap[id1]->clientname,avatar_id); 00193 sprintf(id1,"%s7",avatar_id); sprintf(id2,"%s6",avatar_id); addChildNode(id1,id2,"AVATAR"); updateAvatarNodes(id1,0.069177,-3.00309e-006,-1.07102e-006,1.55691e-006,-0.0758123,-5.73888e-007,0.997122); strcpy(AvatarNodeMap[id1]->clientConfig,avatar_cfg); strcpy(AvatarNodeMap[id1]->avatarjoint_id,"7"); strcpy(AvatarNodeMap[id1]->clientname,avatar_id); 00194 sprintf(id1,"%s8",avatar_id); sprintf(id2,"%s7",avatar_id); addChildNode(id1,id2,"AVATAR"); updateAvatarNodes(id1,0.207666,-1.2034e-008,5.26022e-016,0,0,0,1); strcpy(AvatarNodeMap[id1]->clientConfig,avatar_cfg); strcpy(AvatarNodeMap[id1]->avatarjoint_id,"8"); strcpy(AvatarNodeMap[id1]->clientname,avatar_id); 00195 sprintf(id1,"%s9",avatar_id); sprintf(id2,"%s7",avatar_id); addChildNode(id1,id2,"AVATAR"); updateAvatarNodes(id1,0.110821,-0.0318851,-0.0699177,-6.49591e-006,-0.651464,4.80961e-006,0.758679); strcpy(AvatarNodeMap[id1]->clientConfig,avatar_cfg); strcpy(AvatarNodeMap[id1]->avatarjoint_id,"9"); strcpy(AvatarNodeMap[id1]->clientname,avatar_id); 00196 sprintf(id1,"%s10",avatar_id); sprintf(id2,"%s9",avatar_id); addChildNode(id1,id2,"AVATAR"); updateAvatarNodes(id1,0.0250902,0,0,0.707388,9.59679e-007,-0.706825,9.37676e-007); strcpy(AvatarNodeMap[id1]->clientConfig,avatar_cfg); strcpy(AvatarNodeMap[id1]->avatarjoint_id,"10"); strcpy(AvatarNodeMap[id1]->clientname,avatar_id); 00197 sprintf(id1,"%s11",avatar_id); sprintf(id2,"%s7",avatar_id); addChildNode(id1,id2,"AVATAR"); updateAvatarNodes(id1,0.110821,0.0318855,-0.0699175,6.47779e-006,-0.651464,-8.29754e-006,0.758679); strcpy(AvatarNodeMap[id1]->clientConfig,avatar_cfg); strcpy(AvatarNodeMap[id1]->avatarjoint_id,"11"); strcpy(AvatarNodeMap[id1]->clientname,avatar_id); 00198 sprintf(id1,"%s12",avatar_id); sprintf(id2,"%s11",avatar_id); addChildNode(id1,id2,"AVATAR"); updateAvatarNodes(id1,0.0250902,0,0,0.707388,9.36822e-007,-0.706825,9.80782e-007); strcpy(AvatarNodeMap[id1]->clientConfig,avatar_cfg); strcpy(AvatarNodeMap[id1]->avatarjoint_id,"12"); strcpy(AvatarNodeMap[id1]->clientname,avatar_id); 00199 sprintf(id1,"%s13",avatar_id); sprintf(id2,"%s7",avatar_id); addChildNode(id1,id2,"AVATAR"); updateAvatarNodes(id1,0.0328945,1.326e-008,-0.0124002,-0.00120468,-0.764102,-0.00426142,0.64508); strcpy(AvatarNodeMap[id1]->clientConfig,avatar_cfg); strcpy(AvatarNodeMap[id1]->avatarjoint_id,"13"); strcpy(AvatarNodeMap[id1]->clientname,avatar_id); 00200 sprintf(id1,"%s14",avatar_id); sprintf(id2,"%s13",avatar_id); addChildNode(id1,id2,"AVATAR"); updateAvatarNodes(id1,0.149929,-9.31325e-010,-5.96046e-008,0.707388,9.85348e-007,-0.706825,9.66667e-007); strcpy(AvatarNodeMap[id1]->clientConfig,avatar_cfg); strcpy(AvatarNodeMap[id1]->avatarjoint_id,"14"); strcpy(AvatarNodeMap[id1]->clientname,avatar_id); 00201 sprintf(id1,"%s15",avatar_id); sprintf(id2,"%s13",avatar_id); addChildNode(id1,id2,"AVATAR"); updateAvatarNodes(id1,0.10554,-0.000890068,0.023332,8.28424e-007,0.173648,1.9523e-006,0.984808); strcpy(AvatarNodeMap[id1]->clientConfig,avatar_cfg); strcpy(AvatarNodeMap[id1]->avatarjoint_id,"15"); strcpy(AvatarNodeMap[id1]->clientname,avatar_id); 00202 sprintf(id1,"%s16",avatar_id); sprintf(id2,"%s15",avatar_id); addChildNode(id1,id2,"AVATAR"); updateAvatarNodes(id1,0.0174011,-7.21775e-009,5.96046e-008,0.707388,9.51017e-007,-0.706825,1.02989e-006); strcpy(AvatarNodeMap[id1]->clientConfig,avatar_cfg); strcpy(AvatarNodeMap[id1]->avatarjoint_id,"16"); strcpy(AvatarNodeMap[id1]->clientname,avatar_id); 00203 sprintf(id1,"%s17",avatar_id); sprintf(id2,"%s13",avatar_id); addChildNode(id1,id2,"AVATAR"); updateAvatarNodes(id1,0.0725112,0.000609742,0.0156659,-0.00303031,0.175704,0.0133431,0.984348); strcpy(AvatarNodeMap[id1]->clientConfig,avatar_cfg); strcpy(AvatarNodeMap[id1]->avatarjoint_id,"17"); strcpy(AvatarNodeMap[id1]->clientname,avatar_id); 00204 sprintf(id1,"%s18",avatar_id); sprintf(id2,"%s17",avatar_id); addChildNode(id1,id2,"AVATAR"); updateAvatarNodes(id1,0.0225375,6.98492e-010,-3.05321e-017,0.707388,9.18663e-007,-0.706825,9.91247e-007); strcpy(AvatarNodeMap[id1]->clientConfig,avatar_cfg); strcpy(AvatarNodeMap[id1]->avatarjoint_id,"18"); strcpy(AvatarNodeMap[id1]->clientname,avatar_id); 00205 sprintf(id1,"%s19",avatar_id); sprintf(id2,"%s13",avatar_id); addChildNode(id1,id2,"AVATAR"); updateAvatarNodes(id1,0.103353,0.0130727,0.0243573,0.0383811,0.169407,-0.216065,0.960804); strcpy(AvatarNodeMap[id1]->clientConfig,avatar_cfg); strcpy(AvatarNodeMap[id1]->avatarjoint_id,"19"); strcpy(AvatarNodeMap[id1]->clientname,avatar_id); 00206 sprintf(id1,"%s20",avatar_id); sprintf(id2,"%s19",avatar_id); addChildNode(id1,id2,"AVATAR"); updateAvatarNodes(id1,0.0101238,3.72529e-009,-1.62838e-016,0.707388,9.87662e-007,-0.706825,9.60084e-007); strcpy(AvatarNodeMap[id1]->clientConfig,avatar_cfg); strcpy(AvatarNodeMap[id1]->avatarjoint_id,"20"); strcpy(AvatarNodeMap[id1]->clientname,avatar_id); 00207 sprintf(id1,"%s21",avatar_id); sprintf(id2,"%s13",avatar_id); addChildNode(id1,id2,"AVATAR"); updateAvatarNodes(id1,0.10315,-0.014825,0.0242156,-0.0382873,0.169427,0.215535,0.960923); strcpy(AvatarNodeMap[id1]->clientConfig,avatar_cfg); strcpy(AvatarNodeMap[id1]->avatarjoint_id,"21"); strcpy(AvatarNodeMap[id1]->clientname,avatar_id); 00208 sprintf(id1,"%s22",avatar_id); sprintf(id2,"%s21",avatar_id); addChildNode(id1,id2,"AVATAR"); updateAvatarNodes(id1,0.0101238,-7.45058e-009,5.96046e-008,0.707388,9.48031e-007,-0.706825,9.16134e-007); strcpy(AvatarNodeMap[id1]->clientConfig,avatar_cfg); strcpy(AvatarNodeMap[id1]->avatarjoint_id,"22"); strcpy(AvatarNodeMap[id1]->clientname,avatar_id); 00209 sprintf(id1,"%s23",avatar_id); sprintf(id2,"%s7",avatar_id); addChildNode(id1,id2,"AVATAR"); updateAvatarNodes(id1,0.0458031,-0.0571939,-0.0772107,0.258198,-0.681405,0.282449,0.623894); strcpy(AvatarNodeMap[id1]->clientConfig,avatar_cfg); strcpy(AvatarNodeMap[id1]->avatarjoint_id,"23"); strcpy(AvatarNodeMap[id1]->clientname,avatar_id); 00210 sprintf(id1,"%s24",avatar_id); sprintf(id2,"%s23",avatar_id); addChildNode(id1,id2,"AVATAR"); updateAvatarNodes(id1,0.0189569,0,0,0.707388,9.60477e-007,-0.706825,1.021e-006); strcpy(AvatarNodeMap[id1]->clientConfig,avatar_cfg); strcpy(AvatarNodeMap[id1]->avatarjoint_id,"24"); strcpy(AvatarNodeMap[id1]->clientname,avatar_id); 00211 sprintf(id1,"%s25",avatar_id); sprintf(id2,"%s7",avatar_id); addChildNode(id1,id2,"AVATAR"); updateAvatarNodes(id1,0.0458031,0.0571943,-0.0772104,-0.2582,-0.681403,-0.282455,0.623893); strcpy(AvatarNodeMap[id1]->clientConfig,avatar_cfg); strcpy(AvatarNodeMap[id1]->avatarjoint_id,"25"); strcpy(AvatarNodeMap[id1]->clientname,avatar_id); 00212 sprintf(id1,"%s26",avatar_id); sprintf(id2,"%s25",avatar_id); addChildNode(id1,id2,"AVATAR"); updateAvatarNodes(id1,0.0189569,0,0,0.707388,9.62452e-007,-0.706825,9.81499e-007); strcpy(AvatarNodeMap[id1]->clientConfig,avatar_cfg); strcpy(AvatarNodeMap[id1]->avatarjoint_id,"26"); strcpy(AvatarNodeMap[id1]->clientname,avatar_id); 00213 sprintf(id1,"%s27",avatar_id); sprintf(id2,"%s7",avatar_id); addChildNode(id1,id2,"AVATAR"); updateAvatarNodes(id1,0.0508165,1.60252e-007,-0.118314,1.12487e-007,-0.675884,-2.66852e-006,0.737008); strcpy(AvatarNodeMap[id1]->clientConfig,avatar_cfg); strcpy(AvatarNodeMap[id1]->avatarjoint_id,"27"); strcpy(AvatarNodeMap[id1]->clientname,avatar_id); 00214 sprintf(id1,"%s28",avatar_id); sprintf(id2,"%s27",avatar_id); addChildNode(id1,id2,"AVATAR"); updateAvatarNodes(id1,0.014684,-2.60115e-010,1.137e-017,0.707388,1.01365e-006,-0.706825,1.03353e-006); strcpy(AvatarNodeMap[id1]->clientConfig,avatar_cfg); strcpy(AvatarNodeMap[id1]->avatarjoint_id,"28"); strcpy(AvatarNodeMap[id1]->clientname,avatar_id); 00215 sprintf(id1,"%s29",avatar_id); sprintf(id2,"%s7",avatar_id); addChildNode(id1,id2,"AVATAR"); updateAvatarNodes(id1,0.0624822,-0.029447,-0.10813,0.190613,-0.652834,0.175083,0.711914); strcpy(AvatarNodeMap[id1]->clientConfig,avatar_cfg); strcpy(AvatarNodeMap[id1]->avatarjoint_id,"29"); strcpy(AvatarNodeMap[id1]->clientname,avatar_id); 00216 sprintf(id1,"%s30",avatar_id); sprintf(id2,"%s29",avatar_id); addChildNode(id1,id2,"AVATAR"); updateAvatarNodes(id1,0.0131441,-2.6054e-015,-5.96046e-008,0.707388,9.49204e-007,-0.706825,1.01581e-006); strcpy(AvatarNodeMap[id1]->clientConfig,avatar_cfg); strcpy(AvatarNodeMap[id1]->avatarjoint_id,"30"); strcpy(AvatarNodeMap[id1]->clientname,avatar_id); 00217 sprintf(id1,"%s31",avatar_id); sprintf(id2,"%s7",avatar_id); addChildNode(id1,id2,"AVATAR"); updateAvatarNodes(id1,0.0624822,0.0294476,-0.10813,-0.190613,-0.652833,-0.175086,0.711914); strcpy(AvatarNodeMap[id1]->clientConfig,avatar_cfg); strcpy(AvatarNodeMap[id1]->avatarjoint_id,"31"); strcpy(AvatarNodeMap[id1]->clientname,avatar_id); 00218 sprintf(id1,"%s32",avatar_id); sprintf(id2,"%s31",avatar_id); addChildNode(id1,id2,"AVATAR"); updateAvatarNodes(id1,0.0131441,0,0,0.707388,9.94708e-007,-0.706825,1.00289e-006); strcpy(AvatarNodeMap[id1]->clientConfig,avatar_cfg); strcpy(AvatarNodeMap[id1]->avatarjoint_id,"32"); strcpy(AvatarNodeMap[id1]->clientname,avatar_id); 00219 sprintf(id1,"%s33",avatar_id); sprintf(id2,"%s7",avatar_id); addChildNode(id1,id2,"AVATAR"); updateAvatarNodes(id1,0.103746,-0.0341106,-0.0875056,0.0961292,-0.670102,0.0882967,0.730703); strcpy(AvatarNodeMap[id1]->clientConfig,avatar_cfg); strcpy(AvatarNodeMap[id1]->avatarjoint_id,"33"); strcpy(AvatarNodeMap[id1]->clientname,avatar_id); 00220 sprintf(id1,"%s34",avatar_id); sprintf(id2,"%s33",avatar_id); addChildNode(id1,id2,"AVATAR"); updateAvatarNodes(id1,0.0106172,0,0,0.707388,1.02598e-006,-0.706825,9.51712e-007); strcpy(AvatarNodeMap[id1]->clientConfig,avatar_cfg); strcpy(AvatarNodeMap[id1]->avatarjoint_id,"34"); strcpy(AvatarNodeMap[id1]->clientname,avatar_id); 00221 sprintf(id1,"%s35",avatar_id); sprintf(id2,"%s7",avatar_id); addChildNode(id1,id2,"AVATAR"); updateAvatarNodes(id1,0.103746,0.034111,-0.0875054,-0.0961293,-0.670101,-0.0883003,0.730703); strcpy(AvatarNodeMap[id1]->clientConfig,avatar_cfg); strcpy(AvatarNodeMap[id1]->avatarjoint_id,"35"); strcpy(AvatarNodeMap[id1]->clientname,avatar_id); 00222 sprintf(id1,"%s36",avatar_id); sprintf(id2,"%s35",avatar_id); addChildNode(id1,id2,"AVATAR"); updateAvatarNodes(id1,0.0106172,3.72529e-009,-5.96046e-008,0.707388,9.79238e-007,-0.706825,9.76644e-007); strcpy(AvatarNodeMap[id1]->clientConfig,avatar_cfg); strcpy(AvatarNodeMap[id1]->avatarjoint_id,"36"); strcpy(AvatarNodeMap[id1]->clientname,avatar_id); 00223 sprintf(id1,"%s37",avatar_id); sprintf(id2,"%s7",avatar_id); addChildNode(id1,id2,"AVATAR"); updateAvatarNodes(id1,0.0502486,-0.0142556,-0.116842,0.170335,-0.686537,0.170568,0.685974); strcpy(AvatarNodeMap[id1]->clientConfig,avatar_cfg); strcpy(AvatarNodeMap[id1]->avatarjoint_id,"37"); strcpy(AvatarNodeMap[id1]->clientname,avatar_id); 00224 sprintf(id1,"%s38",avatar_id); sprintf(id2,"%s37",avatar_id); addChildNode(id1,id2,"AVATAR"); updateAvatarNodes(id1,0.0143248,-7.45058e-009,-5.96046e-008,0.707388,9.53894e-007,-0.706825,1.01441e-006); strcpy(AvatarNodeMap[id1]->clientConfig,avatar_cfg); strcpy(AvatarNodeMap[id1]->avatarjoint_id,"38"); strcpy(AvatarNodeMap[id1]->clientname,avatar_id); 00225 sprintf(id1,"%s39",avatar_id); sprintf(id2,"%s7",avatar_id); addChildNode(id1,id2,"AVATAR"); updateAvatarNodes(id1,0.0502486,0.0142563,-0.116842,-0.170181,-0.686574,-0.170416,0.686012); strcpy(AvatarNodeMap[id1]->clientConfig,avatar_cfg); strcpy(AvatarNodeMap[id1]->avatarjoint_id,"39"); strcpy(AvatarNodeMap[id1]->clientname,avatar_id); 00226 sprintf(id1,"%s40",avatar_id); sprintf(id2,"%s39",avatar_id); addChildNode(id1,id2,"AVATAR"); updateAvatarNodes(id1,0.0143248,2.6054e-015,5.96046e-008,0.707388,9.55869e-007,-0.706825,1.00454e-006); strcpy(AvatarNodeMap[id1]->clientConfig,avatar_cfg); strcpy(AvatarNodeMap[id1]->avatarjoint_id,"40"); strcpy(AvatarNodeMap[id1]->clientname,avatar_id); 00227 sprintf(id1,"%s41",avatar_id); sprintf(id2,"%s7",avatar_id); addChildNode(id1,id2,"AVATAR"); updateAvatarNodes(id1,0.0408259,-0.0277009,-0.107142,0.15813,-0.714628,0.201546,0.650908); strcpy(AvatarNodeMap[id1]->clientConfig,avatar_cfg); strcpy(AvatarNodeMap[id1]->avatarjoint_id,"41"); strcpy(AvatarNodeMap[id1]->clientname,avatar_id); 00228 sprintf(id1,"%s42",avatar_id); sprintf(id2,"%s41",avatar_id); addChildNode(id1,id2,"AVATAR"); updateAvatarNodes(id1,0.0198967,3.72529e-009,-1.62838e-016,0.707388,9.0946e-007,-0.706825,1.03449e-006); strcpy(AvatarNodeMap[id1]->clientConfig,avatar_cfg); strcpy(AvatarNodeMap[id1]->avatarjoint_id,"42"); strcpy(AvatarNodeMap[id1]->clientname,avatar_id); 00229 sprintf(id1,"%s43",avatar_id); sprintf(id2,"%s7",avatar_id); addChildNode(id1,id2,"AVATAR"); updateAvatarNodes(id1,0.040826,0.0277015,-0.107142,-0.158133,-0.714626,-0.201553,0.650907); strcpy(AvatarNodeMap[id1]->clientConfig,avatar_cfg); strcpy(AvatarNodeMap[id1]->avatarjoint_id,"43"); strcpy(AvatarNodeMap[id1]->clientname,avatar_id); 00230 sprintf(id1,"%s44",avatar_id); sprintf(id2,"%s43",avatar_id); addChildNode(id1,id2,"AVATAR"); updateAvatarNodes(id1,0.0198967,-5.58794e-009,-5.96046e-008,0.707388,9.16372e-007,-0.706825,9.04809e-007); strcpy(AvatarNodeMap[id1]->clientConfig,avatar_cfg); strcpy(AvatarNodeMap[id1]->avatarjoint_id,"44"); strcpy(AvatarNodeMap[id1]->clientname,avatar_id); 00231 sprintf(id1,"%s45",avatar_id); sprintf(id2,"%s7",avatar_id); addChildNode(id1,id2,"AVATAR"); updateAvatarNodes(id1,0.0847544,-0.0413737,-0.0965376,0.132563,-0.699922,0.134937,0.688715); strcpy(AvatarNodeMap[id1]->clientConfig,avatar_cfg); strcpy(AvatarNodeMap[id1]->avatarjoint_id,"45"); strcpy(AvatarNodeMap[id1]->clientname,avatar_id); 00232 sprintf(id1,"%s46",avatar_id); sprintf(id2,"%s45",avatar_id); addChildNode(id1,id2,"AVATAR"); updateAvatarNodes(id1,0.016866,3.72529e-009,-1.62838e-016,0.707388,9.85492e-007,-0.706825,9.74587e-007); strcpy(AvatarNodeMap[id1]->clientConfig,avatar_cfg); strcpy(AvatarNodeMap[id1]->avatarjoint_id,"46"); strcpy(AvatarNodeMap[id1]->clientname,avatar_id); 00233 sprintf(id1,"%s47",avatar_id); sprintf(id2,"%s7",avatar_id); addChildNode(id1,id2,"AVATAR"); updateAvatarNodes(id1,0.0847544,0.0413742,-0.0965374,-0.132569,-0.69992,-0.134947,0.688714); strcpy(AvatarNodeMap[id1]->clientConfig,avatar_cfg); strcpy(AvatarNodeMap[id1]->avatarjoint_id,"47"); strcpy(AvatarNodeMap[id1]->clientname,avatar_id); 00234 sprintf(id1,"%s48",avatar_id); sprintf(id2,"%s47",avatar_id); addChildNode(id1,id2,"AVATAR"); updateAvatarNodes(id1,0.016866,0,0,0.707388,9.69364e-007,-0.706825,9.86765e-007); strcpy(AvatarNodeMap[id1]->clientConfig,avatar_cfg); strcpy(AvatarNodeMap[id1]->avatarjoint_id,"48"); strcpy(AvatarNodeMap[id1]->clientname,avatar_id); 00235 sprintf(id1,"%s49",avatar_id); sprintf(id2,"%s7",avatar_id); addChildNode(id1,id2,"AVATAR"); updateAvatarNodes(id1,0.118678,-0.0333581,-0.0843964,0.101902,-0.561859,0.108616,0.813716); strcpy(AvatarNodeMap[id1]->clientConfig,avatar_cfg); strcpy(AvatarNodeMap[id1]->avatarjoint_id,"49"); strcpy(AvatarNodeMap[id1]->clientname,avatar_id); 00236 sprintf(id1,"%s50",avatar_id); sprintf(id2,"%s49",avatar_id); addChildNode(id1,id2,"AVATAR"); updateAvatarNodes(id1,0.0125087,3.72529e-009,-1.62838e-016,0.707388,9.97917e-007,-0.706825,1.02355e-006); strcpy(AvatarNodeMap[id1]->clientConfig,avatar_cfg); strcpy(AvatarNodeMap[id1]->avatarjoint_id,"50"); strcpy(AvatarNodeMap[id1]->clientname,avatar_id); 00237 sprintf(id1,"%s51",avatar_id); sprintf(id2,"%s7",avatar_id); addChildNode(id1,id2,"AVATAR"); updateAvatarNodes(id1,0.118678,0.0333586,-0.0843962,-0.101902,-0.561858,-0.108619,0.813716); strcpy(AvatarNodeMap[id1]->clientConfig,avatar_cfg); strcpy(AvatarNodeMap[id1]->avatarjoint_id,"51"); strcpy(AvatarNodeMap[id1]->clientname,avatar_id); 00238 sprintf(id1,"%s52",avatar_id); sprintf(id2,"%s51",avatar_id); addChildNode(id1,id2,"AVATAR"); updateAvatarNodes(id1,0.0125086,7.45058e-009,-3.25675e-016,0.707388,9.47805e-007,-0.706825,1.00857e-006); strcpy(AvatarNodeMap[id1]->clientConfig,avatar_cfg); strcpy(AvatarNodeMap[id1]->avatarjoint_id,"52"); strcpy(AvatarNodeMap[id1]->clientname,avatar_id); 00239 sprintf(id1,"%s53",avatar_id); sprintf(id2,"%s7",avatar_id); addChildNode(id1,id2,"AVATAR"); updateAvatarNodes(id1,0.130053,-0.0264132,-0.0946507,0.0641865,-0.673312,0.0589568,0.734204); strcpy(AvatarNodeMap[id1]->clientConfig,avatar_cfg); strcpy(AvatarNodeMap[id1]->avatarjoint_id,"53"); strcpy(AvatarNodeMap[id1]->clientname,avatar_id); 00240 sprintf(id1,"%s54",avatar_id); sprintf(id2,"%s53",avatar_id); addChildNode(id1,id2,"AVATAR"); updateAvatarNodes(id1,0.0229148,-1.86265e-009,8.14188e-017,0.707388,1.01771e-006,-0.706825,9.55497e-007); strcpy(AvatarNodeMap[id1]->clientConfig,avatar_cfg); strcpy(AvatarNodeMap[id1]->avatarjoint_id,"54"); strcpy(AvatarNodeMap[id1]->clientname,avatar_id); 00241 sprintf(id1,"%s55",avatar_id); sprintf(id2,"%s7",avatar_id); addChildNode(id1,id2,"AVATAR"); updateAvatarNodes(id1,0.130053,0.0264137,-0.0946506,-0.0641866,-0.673312,-0.0589604,0.734204); strcpy(AvatarNodeMap[id1]->clientConfig,avatar_cfg); strcpy(AvatarNodeMap[id1]->avatarjoint_id,"55"); strcpy(AvatarNodeMap[id1]->clientname,avatar_id); 00242 sprintf(id1,"%s56",avatar_id); sprintf(id2,"%s55",avatar_id); addChildNode(id1,id2,"AVATAR"); updateAvatarNodes(id1,0.0229148,-1.86265e-009,8.14188e-017,0.707388,8.84075e-007,-0.706825,9.96187e-007); strcpy(AvatarNodeMap[id1]->clientConfig,avatar_cfg); strcpy(AvatarNodeMap[id1]->avatarjoint_id,"56"); strcpy(AvatarNodeMap[id1]->clientname,avatar_id); 00243 sprintf(id1,"%s57",avatar_id); sprintf(id2,"%s7",avatar_id); addChildNode(id1,id2,"AVATAR"); updateAvatarNodes(id1,0.127065,1.26145e-007,-0.100129,1.46018e-009,-0.676903,-1.82665e-006,0.736073); strcpy(AvatarNodeMap[id1]->clientConfig,avatar_cfg); strcpy(AvatarNodeMap[id1]->avatarjoint_id,"57"); strcpy(AvatarNodeMap[id1]->clientname,avatar_id); 00244 sprintf(id1,"%s58",avatar_id); sprintf(id2,"%s57",avatar_id); addChildNode(id1,id2,"AVATAR"); updateAvatarNodes(id1,0.0183988,6.95763e-010,-3.04128e-017,0.707388,9.31625e-007,-0.706825,1.01705e-006); strcpy(AvatarNodeMap[id1]->clientConfig,avatar_cfg); strcpy(AvatarNodeMap[id1]->avatarjoint_id,"58"); strcpy(AvatarNodeMap[id1]->clientname,avatar_id); 00245 sprintf(id1,"%s59",avatar_id); sprintf(id2,"%s7",avatar_id); addChildNode(id1,id2,"AVATAR"); updateAvatarNodes(id1,0.125416,-0.0492667,-0.0829298,0.180391,-0.656002,0.185586,0.708998); strcpy(AvatarNodeMap[id1]->clientConfig,avatar_cfg); strcpy(AvatarNodeMap[id1]->avatarjoint_id,"59"); strcpy(AvatarNodeMap[id1]->clientname,avatar_id); 00246 sprintf(id1,"%s60",avatar_id); sprintf(id2,"%s59",avatar_id); addChildNode(id1,id2,"AVATAR"); updateAvatarNodes(id1,0.0209223,-7.45058e-009,3.25675e-016,0.707388,9.55951e-007,-0.706825,9.64137e-007); strcpy(AvatarNodeMap[id1]->clientConfig,avatar_cfg); strcpy(AvatarNodeMap[id1]->avatarjoint_id,"60"); strcpy(AvatarNodeMap[id1]->clientname,avatar_id); 00247 sprintf(id1,"%s61",avatar_id); sprintf(id2,"%s7",avatar_id); addChildNode(id1,id2,"AVATAR"); updateAvatarNodes(id1,0.125416,0.0492671,-0.0829295,-0.180391,-0.656,-0.18559,0.708999); strcpy(AvatarNodeMap[id1]->clientConfig,avatar_cfg); strcpy(AvatarNodeMap[id1]->avatarjoint_id,"61"); strcpy(AvatarNodeMap[id1]->clientname,avatar_id); 00248 sprintf(id1,"%s62",avatar_id); sprintf(id2,"%s61",avatar_id); addChildNode(id1,id2,"AVATAR"); updateAvatarNodes(id1,0.0209223,3.72529e-009,5.96046e-008,0.707388,9.38425e-007,-0.706825,9.95652e-007); strcpy(AvatarNodeMap[id1]->clientConfig,avatar_cfg); strcpy(AvatarNodeMap[id1]->avatarjoint_id,"62"); strcpy(AvatarNodeMap[id1]->clientname,avatar_id); 00249 sprintf(id1,"%s63",avatar_id); sprintf(id2,"%s7",avatar_id); addChildNode(id1,id2,"AVATAR"); updateAvatarNodes(id1,0.0870816,1.58052e-007,-0.121933,1.08481e-007,-0.673129,-2.65695e-006,0.739525); strcpy(AvatarNodeMap[id1]->clientConfig,avatar_cfg); strcpy(AvatarNodeMap[id1]->avatarjoint_id,"63"); strcpy(AvatarNodeMap[id1]->clientname,avatar_id); 00250 sprintf(id1,"%s64",avatar_id); sprintf(id2,"%s63",avatar_id); addChildNode(id1,id2,"AVATAR"); updateAvatarNodes(id1,0.0296604,-3.87445e-010,1.69357e-017,0.707388,9.65289e-007,-0.706825,1.00774e-006); strcpy(AvatarNodeMap[id1]->clientConfig,avatar_cfg); strcpy(AvatarNodeMap[id1]->avatarjoint_id,"64"); strcpy(AvatarNodeMap[id1]->clientname,avatar_id); 00251 sprintf(id1,"%s65",avatar_id); sprintf(id2,"%s6",avatar_id); addChildNode(id1,id2,"AVATAR"); updateAvatarNodes(id1,-0.0608789,0.0728218,0.0139226,0.706984,0.70723,0.000321929,-0.000241136); strcpy(AvatarNodeMap[id1]->clientConfig,avatar_cfg); strcpy(AvatarNodeMap[id1]->avatarjoint_id,"65"); strcpy(AvatarNodeMap[id1]->clientname,avatar_id); 00252 sprintf(id1,"%s66",avatar_id); sprintf(id2,"%s65",avatar_id); addChildNode(id1,id2,"AVATAR"); updateAvatarNodes(id1,0.14108,-5.96046e-008,2.6054e-015,-0.000398014,-0.000816058,-0.000173655,1); strcpy(AvatarNodeMap[id1]->clientConfig,avatar_cfg); strcpy(AvatarNodeMap[id1]->avatarjoint_id,"66"); strcpy(AvatarNodeMap[id1]->clientname,avatar_id); 00253 sprintf(id1,"%s67",avatar_id); sprintf(id2,"%s66",avatar_id); addChildNode(id1,id2,"AVATAR"); updateAvatarNodes(id1,0.285801,1.27217e-018,2.91038e-011,3.59714e-013,0.00292861,-1.28013e-010,0.999996); strcpy(AvatarNodeMap[id1]->clientConfig,avatar_cfg); strcpy(AvatarNodeMap[id1]->avatarjoint_id,"67"); strcpy(AvatarNodeMap[id1]->clientname,avatar_id); 00254 sprintf(id1,"%s68",avatar_id); sprintf(id2,"%s67",avatar_id); addChildNode(id1,id2,"AVATAR"); updateAvatarNodes(id1,0.27092,-2.03547e-017,-4.65661e-010,0.707104,-0.00144577,-0.00146178,0.707106); strcpy(AvatarNodeMap[id1]->clientConfig,avatar_cfg); strcpy(AvatarNodeMap[id1]->avatarjoint_id,"68"); strcpy(AvatarNodeMap[id1]->clientname,avatar_id); 00255 sprintf(id1,"%s69",avatar_id); sprintf(id2,"%s68",avatar_id); addChildNode(id1,id2,"AVATAR"); updateAvatarNodes(id1,0.0267608,-0.0319825,-0.00628209,-0.653939,0.0332818,0.366751,0.66087); strcpy(AvatarNodeMap[id1]->clientConfig,avatar_cfg); strcpy(AvatarNodeMap[id1]->avatarjoint_id,"69"); strcpy(AvatarNodeMap[id1]->clientname,avatar_id); 00256 sprintf(id1,"%s70",avatar_id); sprintf(id2,"%s69",avatar_id); addChildNode(id1,id2,"AVATAR"); updateAvatarNodes(id1,0.0282782,-5.96046e-008,2.6054e-015,-0.00489643,-0.282866,-0.235788,0.929713); strcpy(AvatarNodeMap[id1]->clientConfig,avatar_cfg); strcpy(AvatarNodeMap[id1]->avatarjoint_id,"70"); strcpy(AvatarNodeMap[id1]->clientname,avatar_id); 00257 sprintf(id1,"%s71",avatar_id); sprintf(id2,"%s70",avatar_id); addChildNode(id1,id2,"AVATAR"); updateAvatarNodes(id1,0.0310035,5.96046e-008,-7.45058e-009,-1.11757e-008,-1.1921e-007,-8.19564e-008,1); strcpy(AvatarNodeMap[id1]->clientConfig,avatar_cfg); strcpy(AvatarNodeMap[id1]->avatarjoint_id,"71"); strcpy(AvatarNodeMap[id1]->clientname,avatar_id); 00258 sprintf(id1,"%s72",avatar_id); sprintf(id2,"%s71",avatar_id); addChildNode(id1,id2,"AVATAR"); updateAvatarNodes(id1,0.0268396,-1.62838e-016,-3.72529e-009,0,0,0,1); strcpy(AvatarNodeMap[id1]->clientConfig,avatar_cfg); strcpy(AvatarNodeMap[id1]->avatarjoint_id,"72"); strcpy(AvatarNodeMap[id1]->clientname,avatar_id); 00259 sprintf(id1,"%s73",avatar_id); sprintf(id2,"%s68",avatar_id); addChildNode(id1,id2,"AVATAR"); updateAvatarNodes(id1,0.0943896,-0.0224244,0.00203925,8.34451e-007,-1.111e-005,6.67363e-008,1); strcpy(AvatarNodeMap[id1]->clientConfig,avatar_cfg); strcpy(AvatarNodeMap[id1]->avatarjoint_id,"73"); strcpy(AvatarNodeMap[id1]->clientname,avatar_id); 00260 sprintf(id1,"%s74",avatar_id); sprintf(id2,"%s73",avatar_id); addChildNode(id1,id2,"AVATAR"); updateAvatarNodes(id1,0.0312896,7.45058e-009,5.96046e-008,0,-1.49011e-008,-4.52129e-008,1); strcpy(AvatarNodeMap[id1]->clientConfig,avatar_cfg); strcpy(AvatarNodeMap[id1]->avatarjoint_id,"74"); strcpy(AvatarNodeMap[id1]->clientname,avatar_id); 00261 sprintf(id1,"%s75",avatar_id); sprintf(id2,"%s74",avatar_id); addChildNode(id1,id2,"AVATAR"); updateAvatarNodes(id1,0.0237906,9.31323e-009,-4.07094e-016,-4.26326e-014,-2.17221e-014,-9.28401e-009,1); strcpy(AvatarNodeMap[id1]->clientConfig,avatar_cfg); strcpy(AvatarNodeMap[id1]->avatarjoint_id,"75"); strcpy(AvatarNodeMap[id1]->clientname,avatar_id); 00262 sprintf(id1,"%s76",avatar_id); sprintf(id2,"%s75",avatar_id); addChildNode(id1,id2,"AVATAR"); updateAvatarNodes(id1,0.0209992,5.58794e-009,-2.44256e-016,0,0,0,1); strcpy(AvatarNodeMap[id1]->clientConfig,avatar_cfg); strcpy(AvatarNodeMap[id1]->avatarjoint_id,"76"); strcpy(AvatarNodeMap[id1]->clientname,avatar_id); 00263 sprintf(id1,"%s77",avatar_id); sprintf(id2,"%s68",avatar_id); addChildNode(id1,id2,"AVATAR"); updateAvatarNodes(id1,0.0955927,0.00145351,0.00186419,1.07287e-006,-1.12441e-005,-8.65295e-008,1); strcpy(AvatarNodeMap[id1]->clientConfig,avatar_cfg); strcpy(AvatarNodeMap[id1]->avatarjoint_id,"77"); strcpy(AvatarNodeMap[id1]->clientname,avatar_id); 00264 sprintf(id1,"%s78",avatar_id); sprintf(id2,"%s77",avatar_id); addChildNode(id1,id2,"AVATAR"); updateAvatarNodes(id1,0.0380142,1.86265e-009,-8.14188e-017,2.98023e-008,-7.45057e-009,9.31311e-009,1); strcpy(AvatarNodeMap[id1]->clientConfig,avatar_cfg); strcpy(AvatarNodeMap[id1]->avatarjoint_id,"78"); strcpy(AvatarNodeMap[id1]->clientname,avatar_id); 00265 sprintf(id1,"%s79",avatar_id); sprintf(id2,"%s78",avatar_id); addChildNode(id1,id2,"AVATAR"); updateAvatarNodes(id1,0.0284879,3.0268e-009,-1.32306e-016,-1.77636e-014,-1.49012e-008,6.33302e-008,1); strcpy(AvatarNodeMap[id1]->clientConfig,avatar_cfg); strcpy(AvatarNodeMap[id1]->avatarjoint_id,"79"); strcpy(AvatarNodeMap[id1]->clientname,avatar_id); 00266 sprintf(id1,"%s80",avatar_id); sprintf(id2,"%s79",avatar_id); addChildNode(id1,id2,"AVATAR"); updateAvatarNodes(id1,0.0201886,1.5134e-009,-6.61528e-017,0,0,0,1); strcpy(AvatarNodeMap[id1]->clientConfig,avatar_cfg); strcpy(AvatarNodeMap[id1]->avatarjoint_id,"80"); strcpy(AvatarNodeMap[id1]->clientname,avatar_id); 00267 sprintf(id1,"%s81",avatar_id); sprintf(id2,"%s68",avatar_id); addChildNode(id1,id2,"AVATAR"); updateAvatarNodes(id1,0.0899363,0.0230169,-0.00226975,1.10267e-006,-1.15198e-005,-2.4363e-008,1); strcpy(AvatarNodeMap[id1]->clientConfig,avatar_cfg); strcpy(AvatarNodeMap[id1]->avatarjoint_id,"81"); strcpy(AvatarNodeMap[id1]->clientname,avatar_id); 00268 sprintf(id1,"%s82",avatar_id); sprintf(id2,"%s81",avatar_id); addChildNode(id1,id2,"AVATAR"); updateAvatarNodes(id1,0.0336964,1.11759e-008,-4.88513e-016,-2.98023e-008,5.21541e-008,9.31323e-008,1); strcpy(AvatarNodeMap[id1]->clientConfig,avatar_cfg); strcpy(AvatarNodeMap[id1]->avatarjoint_id,"82"); strcpy(AvatarNodeMap[id1]->clientname,avatar_id); 00269 sprintf(id1,"%s83",avatar_id); sprintf(id2,"%s82",avatar_id); addChildNode(id1,id2,"AVATAR"); updateAvatarNodes(id1,0.0244422,7.45058e-009,5.96046e-008,-5.96043e-008,2.83122e-007,-1.05705e-007,1); strcpy(AvatarNodeMap[id1]->clientConfig,avatar_cfg); strcpy(AvatarNodeMap[id1]->avatarjoint_id,"83"); strcpy(AvatarNodeMap[id1]->clientname,avatar_id); 00270 sprintf(id1,"%s84",avatar_id); sprintf(id2,"%s83",avatar_id); addChildNode(id1,id2,"AVATAR"); updateAvatarNodes(id1,0.0205782,5.58794e-009,-2.44256e-016,0,0,0,1); strcpy(AvatarNodeMap[id1]->clientConfig,avatar_cfg); strcpy(AvatarNodeMap[id1]->avatarjoint_id,"84"); strcpy(AvatarNodeMap[id1]->clientname,avatar_id); 00271 sprintf(id1,"%s85",avatar_id); sprintf(id2,"%s68",avatar_id); addChildNode(id1,id2,"AVATAR"); updateAvatarNodes(id1,0.0802381,0.0397473,-0.0120191,1.10267e-006,-1.13335e-005,9.90361e-008,1); strcpy(AvatarNodeMap[id1]->clientConfig,avatar_cfg); strcpy(AvatarNodeMap[id1]->avatarjoint_id,"85"); strcpy(AvatarNodeMap[id1]->clientname,avatar_id); 00272 sprintf(id1,"%s86",avatar_id); sprintf(id2,"%s85",avatar_id); addChildNode(id1,id2,"AVATAR"); updateAvatarNodes(id1,0.0290878,0,0,-8.88178e-016,-1.09616e-013,9.31323e-008,1); strcpy(AvatarNodeMap[id1]->clientConfig,avatar_cfg); strcpy(AvatarNodeMap[id1]->avatarjoint_id,"86"); strcpy(AvatarNodeMap[id1]->clientname,avatar_id); 00273 sprintf(id1,"%s87",avatar_id); sprintf(id2,"%s86",avatar_id); addChildNode(id1,id2,"AVATAR"); updateAvatarNodes(id1,0.015358,2.6054e-015,5.96046e-008,8.88178e-015,7.45058e-009,-1.11759e-008,1); strcpy(AvatarNodeMap[id1]->clientConfig,avatar_cfg); strcpy(AvatarNodeMap[id1]->avatarjoint_id,"87"); strcpy(AvatarNodeMap[id1]->clientname,avatar_id); 00274 sprintf(id1,"%s88",avatar_id); sprintf(id2,"%s87",avatar_id); addChildNode(id1,id2,"AVATAR"); updateAvatarNodes(id1,0.0163014,-3.72529e-009,1.62838e-016,0,0,0,1); strcpy(AvatarNodeMap[id1]->clientConfig,avatar_cfg); strcpy(AvatarNodeMap[id1]->avatarjoint_id,"88"); strcpy(AvatarNodeMap[id1]->clientname,avatar_id); 00275 sprintf(id1,"%s89",avatar_id); sprintf(id2,"%s6",avatar_id); addChildNode(id1,id2,"AVATAR"); updateAvatarNodes(id1,-0.0608788,-0.0728219,0.0139221,-0.706984,0.707229,-0.000319832,-0.000243294); strcpy(AvatarNodeMap[id1]->clientConfig,avatar_cfg); strcpy(AvatarNodeMap[id1]->avatarjoint_id,"89"); strcpy(AvatarNodeMap[id1]->clientname,avatar_id); 00276 sprintf(id1,"%s90",avatar_id); sprintf(id2,"%s89",avatar_id); addChildNode(id1,id2,"AVATAR"); updateAvatarNodes(id1,0.14108,5.96046e-008,5.82051e-011,0.000398013,-0.000819397,0.00017363,1); strcpy(AvatarNodeMap[id1]->clientConfig,avatar_cfg); strcpy(AvatarNodeMap[id1]->avatarjoint_id,"90"); strcpy(AvatarNodeMap[id1]->clientname,avatar_id); 00277 sprintf(id1,"%s91",avatar_id); sprintf(id2,"%s90",avatar_id); addChildNode(id1,id2,"AVATAR"); updateAvatarNodes(id1,0.285801,5.08868e-018,1.16415e-010,-3.59714e-013,0.00292861,-1.28014e-010,0.999996); strcpy(AvatarNodeMap[id1]->clientConfig,avatar_cfg); strcpy(AvatarNodeMap[id1]->avatarjoint_id,"91"); strcpy(AvatarNodeMap[id1]->clientname,avatar_id); 00278 sprintf(id1,"%s92",avatar_id); sprintf(id2,"%s91",avatar_id); addChildNode(id1,id2,"AVATAR"); updateAvatarNodes(id1,0.27092,-1.01774e-017,-2.32831e-010,-0.707104,-0.00144577,0.00146178,0.707106); strcpy(AvatarNodeMap[id1]->clientConfig,avatar_cfg); strcpy(AvatarNodeMap[id1]->avatarjoint_id,"92"); strcpy(AvatarNodeMap[id1]->clientname,avatar_id); 00279 sprintf(id1,"%s93",avatar_id); sprintf(id2,"%s92",avatar_id); addChildNode(id1,id2,"AVATAR"); updateAvatarNodes(id1,0.0267608,0.0319825,-0.00628209,0.653939,0.0332817,-0.366751,0.66087); strcpy(AvatarNodeMap[id1]->clientConfig,avatar_cfg); strcpy(AvatarNodeMap[id1]->avatarjoint_id,"93"); strcpy(AvatarNodeMap[id1]->clientname,avatar_id); 00280 sprintf(id1,"%s94",avatar_id); sprintf(id2,"%s93",avatar_id); addChildNode(id1,id2,"AVATAR"); updateAvatarNodes(id1,0.0282782,0,0,0.00489644,-0.282866,0.235788,0.929713); strcpy(AvatarNodeMap[id1]->clientConfig,avatar_cfg); strcpy(AvatarNodeMap[id1]->avatarjoint_id,"94"); strcpy(AvatarNodeMap[id1]->clientname,avatar_id); 00281 sprintf(id1,"%s95",avatar_id); sprintf(id2,"%s94",avatar_id); addChildNode(id1,id2,"AVATAR"); updateAvatarNodes(id1,0.0310035,-5.96046e-008,3.72529e-009,7.45057e-009,-1.04308e-007,7.26432e-008,1); strcpy(AvatarNodeMap[id1]->clientConfig,avatar_cfg); strcpy(AvatarNodeMap[id1]->avatarjoint_id,"95"); strcpy(AvatarNodeMap[id1]->clientname,avatar_id); 00282 sprintf(id1,"%s96",avatar_id); sprintf(id2,"%s95",avatar_id); addChildNode(id1,id2,"AVATAR"); updateAvatarNodes(id1,0.0268396,0,0,-3.47783e-023,1,-4.37114e-008,0); strcpy(AvatarNodeMap[id1]->clientConfig,avatar_cfg); strcpy(AvatarNodeMap[id1]->avatarjoint_id,"96"); strcpy(AvatarNodeMap[id1]->clientname,avatar_id); 00283 sprintf(id1,"%s97",avatar_id); sprintf(id2,"%s92",avatar_id); addChildNode(id1,id2,"AVATAR"); updateAvatarNodes(id1,0.0943896,0.0224244,0.00203925,-8.34466e-007,-1.111e-005,-6.65031e-008,1); strcpy(AvatarNodeMap[id1]->clientConfig,avatar_cfg); strcpy(AvatarNodeMap[id1]->avatarjoint_id,"97"); strcpy(AvatarNodeMap[id1]->clientname,avatar_id); 00284 sprintf(id1,"%s98",avatar_id); sprintf(id2,"%s97",avatar_id); addChildNode(id1,id2,"AVATAR"); updateAvatarNodes(id1,0.0312896,-9.31322e-009,5.96046e-008,2.98023e-008,-1.49012e-008,4.49817e-008,1); strcpy(AvatarNodeMap[id1]->clientConfig,avatar_cfg); strcpy(AvatarNodeMap[id1]->avatarjoint_id,"98"); strcpy(AvatarNodeMap[id1]->clientname,avatar_id); 00285 sprintf(id1,"%s99",avatar_id); sprintf(id2,"%s98",avatar_id); addChildNode(id1,id2,"AVATAR"); updateAvatarNodes(id1,0.0237906,-5.58794e-009,2.44256e-016,-2.98023e-008,1.46269e-014,9.51695e-009,1); strcpy(AvatarNodeMap[id1]->clientConfig,avatar_cfg); strcpy(AvatarNodeMap[id1]->avatarjoint_id,"99"); strcpy(AvatarNodeMap[id1]->clientname,avatar_id); 00286 sprintf(id1,"%s100",avatar_id); sprintf(id2,"%s99",avatar_id); addChildNode(id1,id2,"AVATAR"); updateAvatarNodes(id1,0.0209992,-5.58794e-009,2.44256e-016,2.84217e-014,1,-2.88102e-008,1.42109e-014); strcpy(AvatarNodeMap[id1]->clientConfig,avatar_cfg); strcpy(AvatarNodeMap[id1]->avatarjoint_id,"100"); strcpy(AvatarNodeMap[id1]->clientname,avatar_id); 00287 sprintf(id1,"%s101",avatar_id); sprintf(id2,"%s92",avatar_id); addChildNode(id1,id2,"AVATAR"); updateAvatarNodes(id1,0.0955927,-0.00145351,0.00186419,-1.04308e-006,-1.12441e-005,7.95455e-008,1); strcpy(AvatarNodeMap[id1]->clientConfig,avatar_cfg); strcpy(AvatarNodeMap[id1]->avatarjoint_id,"101"); strcpy(AvatarNodeMap[id1]->clientname,avatar_id); 00288 sprintf(id1,"%s102",avatar_id); sprintf(id2,"%s101",avatar_id); addChildNode(id1,id2,"AVATAR"); updateAvatarNodes(id1,0.0380142,-2.56114e-009,1.11951e-016,-4.47035e-008,-1.49012e-008,-7.45057e-009,1); strcpy(AvatarNodeMap[id1]->clientConfig,avatar_cfg); strcpy(AvatarNodeMap[id1]->avatarjoint_id,"102"); strcpy(AvatarNodeMap[id1]->clientname,avatar_id); 00289 sprintf(id1,"%s103",avatar_id); sprintf(id2,"%s102",avatar_id); addChildNode(id1,id2,"AVATAR"); updateAvatarNodes(id1,0.0284879,-1.74623e-009,7.63301e-017,-2.66454e-015,-1.49012e-008,-6.14673e-008,1); strcpy(AvatarNodeMap[id1]->clientConfig,avatar_cfg); strcpy(AvatarNodeMap[id1]->avatarjoint_id,"103"); strcpy(AvatarNodeMap[id1]->clientname,avatar_id); 00290 sprintf(id1,"%s104",avatar_id); sprintf(id2,"%s103",avatar_id); addChildNode(id1,id2,"AVATAR"); updateAvatarNodes(id1,0.0201886,-1.62981e-009,7.12415e-017,1.06581e-014,1,-4.37114e-008,-2.13163e-014); strcpy(AvatarNodeMap[id1]->clientConfig,avatar_cfg); strcpy(AvatarNodeMap[id1]->avatarjoint_id,"104"); strcpy(AvatarNodeMap[id1]->clientname,avatar_id); 00291 sprintf(id1,"%s105",avatar_id); sprintf(id2,"%s92",avatar_id); addChildNode(id1,id2,"AVATAR"); updateAvatarNodes(id1,0.0899363,-0.0230169,-0.00226974,-1.08778e-006,-1.15198e-005,2.34336e-008,1); strcpy(AvatarNodeMap[id1]->clientConfig,avatar_cfg); strcpy(AvatarNodeMap[id1]->avatarjoint_id,"105"); strcpy(AvatarNodeMap[id1]->clientname,avatar_id); 00292 sprintf(id1,"%s106",avatar_id); sprintf(id2,"%s105",avatar_id); addChildNode(id1,id2,"AVATAR"); updateAvatarNodes(id1,0.0336965,-1.11759e-008,4.88513e-016,4.47035e-008,5.2154e-008,-9.31323e-008,1); strcpy(AvatarNodeMap[id1]->clientConfig,avatar_cfg); strcpy(AvatarNodeMap[id1]->avatarjoint_id,"106"); strcpy(AvatarNodeMap[id1]->clientname,avatar_id); 00293 sprintf(id1,"%s107",avatar_id); sprintf(id2,"%s106",avatar_id); addChildNode(id1,id2,"AVATAR"); updateAvatarNodes(id1,0.0244422,-7.45058e-009,5.96046e-008,2.98023e-008,2.83122e-007,1.05239e-007,1); strcpy(AvatarNodeMap[id1]->clientConfig,avatar_cfg); strcpy(AvatarNodeMap[id1]->avatarjoint_id,"107"); strcpy(AvatarNodeMap[id1]->clientname,avatar_id); 00294 sprintf(id1,"%s108",avatar_id); sprintf(id2,"%s107",avatar_id); addChildNode(id1,id2,"AVATAR"); updateAvatarNodes(id1,0.0205782,-5.58794e-009,2.44256e-016,5.32907e-014,1,-2.88102e-008,-7.10543e-015); strcpy(AvatarNodeMap[id1]->clientConfig,avatar_cfg); strcpy(AvatarNodeMap[id1]->avatarjoint_id,"108"); strcpy(AvatarNodeMap[id1]->clientname,avatar_id); 00295 sprintf(id1,"%s109",avatar_id); sprintf(id2,"%s92",avatar_id); addChildNode(id1,id2,"AVATAR"); updateAvatarNodes(id1,0.0802381,-0.0397473,-0.0120191,-1.08779e-006,-1.13409e-005,-9.53098e-008,1); strcpy(AvatarNodeMap[id1]->clientConfig,avatar_cfg); strcpy(AvatarNodeMap[id1]->avatarjoint_id,"109"); strcpy(AvatarNodeMap[id1]->clientname,avatar_id); 00296 sprintf(id1,"%s110",avatar_id); sprintf(id2,"%s109",avatar_id); addChildNode(id1,id2,"AVATAR"); updateAvatarNodes(id1,0.0290878,-3.72529e-009,1.62838e-016,2.66454e-015,-5.02562e-014,-9.31323e-008,1); strcpy(AvatarNodeMap[id1]->clientConfig,avatar_cfg); strcpy(AvatarNodeMap[id1]->avatarjoint_id,"110"); strcpy(AvatarNodeMap[id1]->clientname,avatar_id); 00297 sprintf(id1,"%s111",avatar_id); sprintf(id2,"%s110",avatar_id); addChildNode(id1,id2,"AVATAR"); updateAvatarNodes(id1,0.0153581,3.72529e-009,5.96046e-008,8.88178e-016,7.4506e-009,1.11759e-008,1); strcpy(AvatarNodeMap[id1]->clientConfig,avatar_cfg); strcpy(AvatarNodeMap[id1]->avatarjoint_id,"111"); strcpy(AvatarNodeMap[id1]->clientname,avatar_id); 00298 sprintf(id1,"%s112",avatar_id); sprintf(id2,"%s111",avatar_id); addChildNode(id1,id2,"AVATAR"); updateAvatarNodes(id1,0.0163014,0,0,0,1,-4.37114e-008,-2.13163e-014); strcpy(AvatarNodeMap[id1]->clientConfig,avatar_cfg); strcpy(AvatarNodeMap[id1]->avatarjoint_id,"112"); strcpy(AvatarNodeMap[id1]->clientname,avatar_id); 00299 sprintf(id1,"%s113",avatar_id); sprintf(id2,"%s3",avatar_id); addChildNode(id1,id2,"AVATAR"); updateAvatarNodes(id1,-0.120265,0.0883685,-0.00162871,-2.04243e-008,-7.31909e-007,1,2.93099e-014); strcpy(AvatarNodeMap[id1]->clientConfig,avatar_cfg); strcpy(AvatarNodeMap[id1]->avatarjoint_id,"113"); strcpy(AvatarNodeMap[id1]->clientname,avatar_id); 00300 sprintf(id1,"%s114",avatar_id); sprintf(id2,"%s113",avatar_id); addChildNode(id1,id2,"AVATAR"); updateAvatarNodes(id1,0.399035,1.49012e-008,-3.61785e-014,-9.76641e-012,0.00063169,8.65941e-010,1); strcpy(AvatarNodeMap[id1]->clientConfig,avatar_cfg); strcpy(AvatarNodeMap[id1]->avatarjoint_id,"114"); strcpy(AvatarNodeMap[id1]->clientname,avatar_id); 00301 sprintf(id1,"%s115",avatar_id); sprintf(id2,"%s114",avatar_id); addChildNode(id1,id2,"AVATAR"); updateAvatarNodes(id1,0.396689,7.45058e-009,5.82073e-011,-9.26113e-008,-0.000631698,-8.07444e-010,1); strcpy(AvatarNodeMap[id1]->clientConfig,avatar_cfg); strcpy(AvatarNodeMap[id1]->avatarjoint_id,"115"); strcpy(AvatarNodeMap[id1]->clientname,avatar_id); 00302 sprintf(id1,"%s116",avatar_id); sprintf(id2,"%s115",avatar_id); addChildNode(id1,id2,"AVATAR"); updateAvatarNodes(id1,0.101624,-5.95767e-009,-0.136296,-2.85965e-008,-0.707107,6.55324e-008,0.707107); strcpy(AvatarNodeMap[id1]->clientConfig,avatar_cfg); strcpy(AvatarNodeMap[id1]->avatarjoint_id,"116"); strcpy(AvatarNodeMap[id1]->clientname,avatar_id); 00303 sprintf(id1,"%s117",avatar_id); sprintf(id2,"%s116",avatar_id); addChildNode(id1,id2,"AVATAR"); updateAvatarNodes(id1,0.0838147,-7.45058e-009,3.25675e-016,0,1,-4.37114e-008,0); strcpy(AvatarNodeMap[id1]->clientConfig,avatar_cfg); strcpy(AvatarNodeMap[id1]->avatarjoint_id,"117"); strcpy(AvatarNodeMap[id1]->clientname,avatar_id); 00304 sprintf(id1,"%s118",avatar_id); sprintf(id2,"%s3",avatar_id); addChildNode(id1,id2,"AVATAR"); updateAvatarNodes(id1,-0.120265,-0.0883685,-0.00162872,-2.04243e-008,7.26309e-007,1,-1.77636e-015); strcpy(AvatarNodeMap[id1]->clientConfig,avatar_cfg); strcpy(AvatarNodeMap[id1]->avatarjoint_id,"118"); strcpy(AvatarNodeMap[id1]->clientname,avatar_id); 00305 sprintf(id1,"%s119",avatar_id); sprintf(id2,"%s118",avatar_id); addChildNode(id1,id2,"AVATAR"); updateAvatarNodes(id1,0.399035,1.49012e-008,1.35595e-014,-1.0294e-011,0.00063169,-5.51985e-011,1); strcpy(AvatarNodeMap[id1]->clientConfig,avatar_cfg); strcpy(AvatarNodeMap[id1]->avatarjoint_id,"119"); strcpy(AvatarNodeMap[id1]->clientname,avatar_id); 00306 sprintf(id1,"%s120",avatar_id); sprintf(id2,"%s119",avatar_id); addChildNode(id1,id2,"AVATAR"); updateAvatarNodes(id1,0.396689,7.45058e-009,-3.25675e-016,9.26502e-008,-0.000631698,4.47002e-008,1); strcpy(AvatarNodeMap[id1]->clientConfig,avatar_cfg); strcpy(AvatarNodeMap[id1]->avatarjoint_id,"120"); strcpy(AvatarNodeMap[id1]->clientname,avatar_id); 00307 sprintf(id1,"%s121",avatar_id); sprintf(id2,"%s120",avatar_id); addChildNode(id1,id2,"AVATAR"); updateAvatarNodes(id1,0.101624,-1.34083e-008,-0.136296,-3.46237e-008,-0.707107,5.95052e-008,0.707107); strcpy(AvatarNodeMap[id1]->clientConfig,avatar_cfg); strcpy(AvatarNodeMap[id1]->avatarjoint_id,"121"); strcpy(AvatarNodeMap[id1]->clientname,avatar_id); 00308 sprintf(id1,"%s122",avatar_id); sprintf(id2,"%s121",avatar_id); addChildNode(id1,id2,"AVATAR"); updateAvatarNodes(id1,0.0838147,0,0,0,0,0,1); strcpy(AvatarNodeMap[id1]->clientConfig,avatar_cfg); strcpy(AvatarNodeMap[id1]->avatarjoint_id,"122"); strcpy(AvatarNodeMap[id1]->clientname,avatar_id); 00309 return 1; 00310 } 00311 00312 00313 #ifdef WIN32 00314 CLIENT_LIB_EXPORT void addNode(char *id, char node_type[]) 00315 #else 00316 void addNode(char *id, char node_type[]) 00317 #endif 00318 { 00319 int i = 0; 00320 float calibration1[9] = {0.f}; 00321 float calibration2[16] = {0.f}; 00322 if (viewing_only) return; 00323 if (node_type_map.find(node_type) == node_type_map.end()) { 00324 printf("Incorrect node type (see BeamingDataType in documentation\n"); 00325 return; 00326 } 00327 //convert to uppercase letters 00328 /*while (node_type[i]) 00329 { 00330 node_type[i] = (char)toupper(node_type[i]); 00331 i++; 00332 }*/ 00333 //create a new replica instance and tell the replication system about it. 00334 //first update needed after node created 00335 switch (node_type_map[node_type]) 00336 { 00337 case AVATAR: 00338 AvatarNodeMap[id] = new BeamingAvatarJointReplica; 00339 updateAvatarNodes(id,0.f,1.f,0.f,0.f,1.f,0.f,0.f); 00340 replicaManager.Reference(AvatarNodeMap[id]); 00341 //copy the global id, name and cfg_file here for backwards compatibility, gets overwritten in addRocketBoxAvatar 00342 strcpy(AvatarNodeMap[id]->clientConfig,my_config.c_str()); 00343 strcpy(AvatarNodeMap[id]->clientname,client_name); 00344 strcpy(AvatarNodeMap[id]->avatarjoint_id,id); 00345 strcpy(AvatarNodeMap[id]->clientType,node_type); 00346 break; 00347 case FACIAL: 00348 FacialNodeMap[id] = new BeamingFacialReplica; 00349 updateFacialNodes(id,false,0.f,0.f,0.f,0.f,0.f); 00350 replicaManager.Reference(FacialNodeMap[id]); 00351 strcpy(FacialNodeMap[id]->clientType,node_type); 00352 break; 00353 case EMOTION: 00354 EmotionNodeMap[id] = new BeamingEmotionReplica; 00355 updateEmotionNodes(id,0,0,0); 00356 replicaManager.Reference(EmotionNodeMap[id]); 00357 strcpy(EmotionNodeMap[id]->clientType,node_type); 00358 break; 00359 case VIDEO: 00360 VideoNodeMap[id] = new BeamingVideoReplica; 00361 updateVideoNodes(id,"127.0.0.1",0,"http://localhost",1,1,1,calibration1,calibration2); 00362 replicaManager.Reference(VideoNodeMap[id]); 00363 strcpy(VideoNodeMap[id]->clientType,node_type); 00364 break; 00365 case TACTILE: 00366 TactileNodeMap[id] = new BeamingTactileReplica; 00367 updateTactileNodes(id,0,0,0); 00368 replicaManager.Reference(TactileNodeMap[id]); 00369 strcpy(TactileNodeMap[id]->clientType,node_type); 00370 break; 00371 case ROBOT: 00372 RobotNodeMap[id] = new BeamingRobotReplica; 00373 updateRobotNodes(id,0,0,0,0,0,0,0,1,0,0,0,0); 00374 replicaManager.Reference(RobotNodeMap[id]); 00375 strcpy(RobotNodeMap[id]->clientType,node_type); 00376 break; 00377 case OBJECT: 00378 ObjectNodeMap[id] = new BeamingObjectReplica; 00379 updateObjectNodes(id,"127.0.0.1",0,"http://localhost",0,0,0,0,1,0,0); 00380 replicaManager.Reference(ObjectNodeMap[id]); 00381 strcpy(ObjectNodeMap[id]->clientType,node_type); 00382 break; 00383 case AUDIO: 00384 AudioNodeMap[id] = new BeamingAudioReplica; 00385 updateAudioNodes(id,"127.0.0.1",0,"http://localhost","config file"); 00386 replicaManager.Reference(AudioNodeMap[id]); 00387 strcpy(AudioNodeMap[id]->clientType,node_type); 00388 break; 00389 case POINTCLOUD: 00390 PointCloudNodeMap[id] = new BeamingPointCloudReplica; 00391 updatePointCloudNodes(id,"127.0.0.1",0,"http://localhost",0,0,0,0); 00392 replicaManager.Reference(PointCloudNodeMap[id]); 00393 strcpy(PointCloudNodeMap[id]->clientType,node_type); 00394 break; 00395 case GENERIC: 00396 GenericNodeMap[id] = new BeamingGenericReplica; 00397 void *data = malloc(1024); 00398 memset(data,0x00,1024); 00399 updateGenericNodes(id,data,1024); 00400 replicaManager.Reference(GenericNodeMap[id]); 00401 strcpy(GenericNodeMap[id]->clientType,node_type); 00402 break; 00403 } 00404 } 00405 00406 00407 #ifdef WIN32 00408 CLIENT_LIB_EXPORT void addChildNode(char *id, char *parent_id, char node_type[]) 00409 #else 00410 void addChildNode(char *id, char *parent_id, char node_type[]) 00411 #endif 00412 { 00413 if (viewing_only) return; 00414 addNode(id,node_type); 00415 if (AvatarNodeMap.find(parent_id) != AvatarNodeMap.end()) //if id exists in node database, then set parent 00416 { 00417 AvatarNodeMap[id]->parentbone = AvatarNodeMap[parent_id]->avatarjoint_id; 00418 } 00419 } 00420 00421 00422 #ifdef WIN32 00423 CLIENT_LIB_EXPORT int deleteRocketBoxAvatar(char *avatar_id) 00424 #else 00425 int deleteRocketBoxAvatar(char *avatar_id) 00426 #endif 00427 { 00428 char id[128]; 00429 int i; 00430 for ( int i=0; i<123; i++ ) 00431 { 00432 sprintf(id,"%s%d",avatar_id,i); 00433 std::map<std::string, BeamingAvatarJointReplica*>::iterator it = AvatarNodeMap.find(id); 00434 if (it != AvatarNodeMap.end()) //if id exists in node database, delete 00435 { 00436 replicaManager.BroadcastDestruction(AvatarNodeMap[id],UNASSIGNED_SYSTEM_ADDRESS); 00437 replicaManager.Dereference(AvatarNodeMap[id]); 00438 delete AvatarNodeMap[id]; //destructor in replica3 broadcasts destruction 00439 AvatarNodeMap.erase(id); 00440 } 00441 } 00442 return 1; 00443 } 00444 00445 00446 #ifdef WIN32 00447 CLIENT_LIB_EXPORT void removeNode(char *id, char node_type[]) 00448 #else 00449 void removeNode(char *id, char node_type[]) 00450 #endif 00451 { 00452 int i = 0; 00453 if (viewing_only) return; 00454 if (node_type_map.find(node_type) == node_type_map.end()) { 00455 printf("Incorrect node type (see BeamingDataType in documentation\n"); 00456 return; 00457 } 00458 //delete a new replica instance and tell the replication system about it. 00459 switch (node_type_map[node_type]) 00460 { 00461 /* case AVATAR: 00462 std::map<std::string, BeamingAvatarJointReplica*>::iterator it = AvatarNodeMap.find(id); 00463 if (it != AvatarNodeMap.end()) //if id exists in node database, delete 00464 { 00465 replicaManager.BroadcastDestruction(AvatarNodeMap[id],UNASSIGNED_SYSTEM_ADDRESS); 00466 replicaManager.Dereference(AvatarNodeMap[id]); 00467 delete AvatarNodeMap[id]; //destructor in replica3 broadcasts destruction 00468 AvatarNodeMap.erase(id); 00469 } 00470 break;*/ 00471 case FACIAL: 00472 { 00473 std::map<std::string, BeamingFacialReplica*>::iterator it = FacialNodeMap.find(id); 00474 if (it != FacialNodeMap.end()) //if id exists in node database, delete 00475 { 00476 replicaManager.BroadcastDestruction(FacialNodeMap[id],UNASSIGNED_SYSTEM_ADDRESS); 00477 replicaManager.Dereference(FacialNodeMap[id]); 00478 delete FacialNodeMap[id]; //destructor in replica3 broadcasts destruction 00479 FacialNodeMap.erase(id); 00480 } 00481 } 00482 break; 00483 case EMOTION: 00484 { 00485 std::map<std::string, BeamingEmotionReplica*>::iterator it = EmotionNodeMap.find(id); 00486 if (it != EmotionNodeMap.end()) //if id exists in node database, delete 00487 { 00488 replicaManager.BroadcastDestruction(EmotionNodeMap[id],UNASSIGNED_SYSTEM_ADDRESS); 00489 replicaManager.Dereference(EmotionNodeMap[id]); 00490 delete EmotionNodeMap[id]; //destructor in replica3 broadcasts destruction 00491 EmotionNodeMap.erase(id); 00492 } 00493 } 00494 break; 00495 case VIDEO: 00496 { 00497 std::map<std::string, BeamingVideoReplica*>::iterator it = VideoNodeMap.find(id); 00498 if (it != VideoNodeMap.end()) //if id exists in node database, delete 00499 { 00500 replicaManager.BroadcastDestruction(VideoNodeMap[id],UNASSIGNED_SYSTEM_ADDRESS); 00501 replicaManager.Dereference(VideoNodeMap[id]); 00502 delete VideoNodeMap[id]; //destructor in replica3 broadcasts destruction 00503 VideoNodeMap.erase(id); 00504 } 00505 } 00506 break; 00507 case TACTILE: 00508 { 00509 std::map<std::string, BeamingTactileReplica*>::iterator it = TactileNodeMap.find(id); 00510 if (it != TactileNodeMap.end()) //if id exists in node database, delete 00511 { 00512 replicaManager.BroadcastDestruction(TactileNodeMap[id],UNASSIGNED_SYSTEM_ADDRESS); 00513 replicaManager.Dereference(TactileNodeMap[id]); 00514 delete TactileNodeMap[id]; //destructor in replica3 broadcasts destruction 00515 TactileNodeMap.erase(id); 00516 } 00517 } 00518 break; 00519 case ROBOT: 00520 { 00521 std::map<std::string, BeamingRobotReplica*>::iterator it = RobotNodeMap.find(id); 00522 if (it != RobotNodeMap.end()) //if id exists in node database, delete 00523 { 00524 replicaManager.BroadcastDestruction(RobotNodeMap[id],UNASSIGNED_SYSTEM_ADDRESS); 00525 replicaManager.Dereference(RobotNodeMap[id]); 00526 delete RobotNodeMap[id]; //destructor in replica3 broadcasts destruction 00527 RobotNodeMap.erase(id); 00528 } 00529 } 00530 break; 00531 case OBJECT: 00532 { 00533 std::map<std::string, BeamingObjectReplica*>::iterator it = ObjectNodeMap.find(id); 00534 if (it != ObjectNodeMap.end()) //if id exists in node database, delete 00535 { 00536 replicaManager.BroadcastDestruction(ObjectNodeMap[id],UNASSIGNED_SYSTEM_ADDRESS); 00537 replicaManager.Dereference(ObjectNodeMap[id]); 00538 delete ObjectNodeMap[id]; //destructor in replica3 broadcasts destruction 00539 ObjectNodeMap.erase(id); 00540 } 00541 } 00542 break; 00543 case AUDIO: 00544 { 00545 std::map<std::string, BeamingAudioReplica*>::iterator it = AudioNodeMap.find(id); 00546 if (it != AudioNodeMap.end()) //if id exists in node database, delete 00547 { 00548 replicaManager.BroadcastDestruction(AudioNodeMap[id],UNASSIGNED_SYSTEM_ADDRESS); 00549 replicaManager.Dereference(AudioNodeMap[id]); 00550 delete AudioNodeMap[id]; //destructor in replica3 broadcasts destruction 00551 AudioNodeMap.erase(id); 00552 } 00553 } 00554 break; 00555 case POINTCLOUD: 00556 { 00557 std::map<std::string, BeamingPointCloudReplica*>::iterator it = PointCloudNodeMap.find(id); 00558 if (it != PointCloudNodeMap.end()) //if id exists in node database, delete 00559 { 00560 replicaManager.BroadcastDestruction(PointCloudNodeMap[id],UNASSIGNED_SYSTEM_ADDRESS); 00561 replicaManager.Dereference(PointCloudNodeMap[id]); 00562 delete PointCloudNodeMap[id]; //destructor in replica3 broadcasts destruction 00563 PointCloudNodeMap.erase(id); 00564 } 00565 } 00566 break; 00567 case GENERIC: 00568 { 00569 std::map<std::string, BeamingGenericReplica*>::iterator it = GenericNodeMap.find(id); 00570 if (it != GenericNodeMap.end()) //if id exists in node database, delete 00571 { 00572 replicaManager.BroadcastDestruction(GenericNodeMap[id],UNASSIGNED_SYSTEM_ADDRESS); 00573 replicaManager.Dereference(GenericNodeMap[id]); 00574 delete GenericNodeMap[id]; //destructor in replica3 broadcasts destruction 00575 GenericNodeMap.erase(id); 00576 } 00577 } 00578 break; 00579 } 00580 } 00581 00582 00583 #ifdef WIN32 00584 CLIENT_LIB_EXPORT int setAvatarName(char *avatar_id, char *firstname, char *lastname) 00585 #else 00586 int setAvatarName(char *avatar_id, char *firstname, char *lastname) 00587 #endif 00588 { 00589 if (viewing_only) return 0; 00590 char id[128]; 00591 sprintf(id,"%s0",avatar_id); 00592 std::map<std::string, BeamingAvatarJointReplica*>::iterator it = AvatarNodeMap.find(id); 00593 if (it != AvatarNodeMap.end()) //if id exists in node database, then update 00594 { 00595 strcpy(it->second->fname,firstname); 00596 strcpy(it->second->lname,lastname); 00597 return 1; 00598 } 00599 else { 00600 //printf("no node %s to update\n",id); 00601 return 0; 00602 } 00603 } 00604 00605 00606 #ifdef WIN32 00607 CLIENT_LIB_EXPORT int updateNodes(char *id, float x, float y, float z, float rx, float ry, float rz, float w) 00608 #else 00609 int updateNodes(char *id, float x, float y, float z, float rx, float ry, float rz, float w) 00610 #endif 00611 { 00612 if (viewing_only) return 0; 00613 updateAvatarNodes(id,x,y,z,rx,ry,rz,w); 00614 return 1; 00615 } 00616 00617 00618 #ifdef WIN32 00619 CLIENT_LIB_EXPORT int updateRocketBoxAvatar(char *avatar_id, char *node_id, float x, float y, float z, float rx, float ry, float rz, float w) 00620 #else 00621 int updateRocketBoxAvatar(char *avatar_id, char *node_id, float x, float y, float z, float rx, float ry, float rz, float w) 00622 #endif 00623 { 00624 if (viewing_only) return 0; 00625 char id1[128]; 00626 sprintf(id1,"%s%s",avatar_id,node_id); 00627 return updateAvatarNodes(id1,x,y,z,rx,ry,rz,w); 00628 } 00629 00630 #ifdef WIN32 00631 CLIENT_LIB_EXPORT int updateAvatarNodes(char *id, float x, float y, float z, float rx, float ry, float rz, float w) 00632 #else 00633 int updateAvatarNodes(char *id, float x, float y, float z, float rx, float ry, float rz, float w) 00634 #endif 00635 { 00636 if (viewing_only) return 0; 00637 std::map<std::string, BeamingAvatarJointReplica*>::iterator it = AvatarNodeMap.find(id); 00638 if (it != AvatarNodeMap.end()) //if id exists in node database, then update 00639 { 00640 //strcpy(it->second->avatarjoint_id,id); 00641 //rounding floats to 4 decimal places here to avoid network flooding due to very tiny differences 00642 if (x!=999.f && y!=999.f && z!=999.f) 00643 { 00644 it->second->position.x = floor((x*10000.f)+0.5f)/10000.f; 00645 it->second->position.y = floor((y*10000.f)+0.5f)/10000.f; 00646 it->second->position.z = floor((z*10000.f)+0.5f)/10000.f; 00647 } 00648 it->second->orientation.x = floor((rx*10000.f)+0.5f)/10000.f; 00649 it->second->orientation.y = floor((ry*10000.f)+0.5f)/10000.f; 00650 it->second->orientation.z = floor((rz*10000.f)+0.5f)/10000.f; 00651 it->second->orientation.w = floor((w*10000.f)+0.5f)/10000.f; 00652 return 1; 00653 } 00654 else { 00655 //printf("no node %s to update\n",id); 00656 return 0; 00657 } 00658 } 00659 00660 00661 #ifdef WIN32 00662 CLIENT_LIB_EXPORT int updateGenericNodes(char *id, void *pdata, int psize) 00663 #else 00664 int updateGenericNodes(char *id, void *pdata, int psize) 00665 #endif 00666 { 00667 if (viewing_only) return 0; 00668 std::map<std::string, BeamingGenericReplica*>::iterator it = GenericNodeMap.find(id); 00669 if (it != GenericNodeMap.end()) //if id exists in node database, then update 00670 { 00671 strcpy(it->second->clientname,client_name); 00672 strcpy(it->second->clientConfig,my_config.c_str()); 00673 strcpy(it->second->generic_id,id); 00674 memcpy ( it->second->anydata, pdata, 1024 ); 00675 it->second->datasize = psize; 00676 /*//begin printf 00677 struct mystruct{ 00678 int x; 00679 char name[28]; 00680 float myfloat; 00681 } st; 00682 printf("sending %s, %d, %.3f ...\n",((mystruct *)it->second->anydata)->name,((mystruct *)it->second->anydata)->x,((mystruct *)it->second->anydata)->myfloat); 00683 //end printf*/ 00684 return 1; 00685 } 00686 else { 00687 //printf("no node %s to update\n",id); 00688 return 0; 00689 } 00690 } 00691 00692 00693 #ifdef WIN32 00694 CLIENT_LIB_EXPORT int updateFacialNodes(char *id, bool blink, float smile, float frown, float o, float e, float p) 00695 #else 00696 int updateFacialNodes(char *id, bool blink, float smile, float frown, float o, float e, float p) 00697 #endif 00698 { 00699 if (viewing_only) return 0; 00700 std::map<std::string, BeamingFacialReplica*>::iterator it = FacialNodeMap.find(id); 00701 if (it != FacialNodeMap.end()) //if id exists in node database, then update 00702 { 00703 strcpy(it->second->clientname,client_name); 00704 strcpy(it->second->clientConfig,my_config.c_str()); 00705 strcpy(it->second->facial_id,id); 00706 it->second->blink = blink; 00707 //rounding floats to 4 decimal places here to avoid network flooding due to very tiny differences 00708 it->second->smile = floor((smile*10000.f)+0.5f)/10000.f; 00709 it->second->frown = floor((frown*10000.f)+0.5f)/10000.f; 00710 it->second->o = floor((o*10000.f)+0.5f)/10000.f; 00711 it->second->e = floor((e*10000.f)+0.5f)/10000.f; 00712 it->second->p= floor((p*10000.f)+0.5f)/10000.f; 00713 return 1; 00714 } 00715 else { 00716 //printf("no node %s to update\n",id); 00717 return 0; 00718 } 00719 } 00720 00721 00722 #ifdef WIN32 00723 CLIENT_LIB_EXPORT int updateEmotionNodes(char *id, double valence, double arousal, double misc) 00724 #else 00725 int updateEmotionNodes(char *id, double valence, double arousal, double misc) 00726 #endif 00727 { 00728 if (viewing_only) return 0; 00729 std::map<std::string, BeamingEmotionReplica*>::iterator it = EmotionNodeMap.find(id); 00730 if (it != EmotionNodeMap.end()) //if id exists in node database, then update 00731 { 00732 strcpy(it->second->clientname,client_name); 00733 strcpy(it->second->clientConfig,my_config.c_str()); 00734 strcpy(it->second->emotion_id,id); 00735 it->second->valence = valence; 00736 it->second->arousal = arousal; 00737 it->second->misc = misc; 00738 return 1; 00739 } 00740 else { 00741 //printf("no node %s to update\n",id); 00742 return 0; 00743 } 00744 } 00745 00746 00747 #ifdef WIN32 00748 CLIENT_LIB_EXPORT int updateTactileNodes(char *id, double duration, float intensity, float temperature) 00749 #else 00750 int updateTactileNodes(char *id, double duration, float intensity, float temperature) 00751 #endif 00752 { 00753 if (viewing_only) return 0; 00754 std::map<std::string, BeamingTactileReplica*>::iterator it = TactileNodeMap.find(id); 00755 if (it != TactileNodeMap.end()) //if id exists in node database, then update 00756 { 00757 strcpy(it->second->clientname,client_name); 00758 strcpy(it->second->clientConfig,my_config.c_str()); 00759 strcpy(it->second->tactile_id,id); 00760 it->second->duration = duration; 00761 it->second->intensity = intensity; 00762 it->second->temperature = temperature; 00763 return 1; 00764 } 00765 else { 00766 //printf("no node %s to update\n",id); 00767 return 0; 00768 } 00769 } 00770 00771 00772 #ifdef WIN32 00773 CLIENT_LIB_EXPORT int updateRobotNodes(char *id, int type, int details, float freespace, float x, float y, float z, float rx, float ry, float rz, float w, float time_remain, int contact_type) 00774 #else 00775 int updateRobotNodes(char *id, int type, int details, float freespace, float x, float y, float z, float rx, float ry, float rz, float w, float time_remain, int contact_type) 00776 #endif 00777 { 00778 if (viewing_only) return 0; 00779 std::map<std::string, BeamingRobotReplica*>::iterator it = RobotNodeMap.find(id); 00780 if (it != RobotNodeMap.end()) //if id exists in node database, then update 00781 { 00782 strcpy(it->second->clientname,client_name); 00783 strcpy(it->second->clientConfig,my_config.c_str()); 00784 strcpy(it->second->robot_id,id); 00785 it->second->type = type; 00786 it->second->details = details; 00787 it->second->freespace = freespace; 00788 it->second->time_remain = time_remain; 00789 it->second->contact_type = contact_type; 00790 //rounding floats to 4 decimal places here to avoid network flooding due to very tiny differences 00791 it->second->position.x = floor((x*10000.f)+0.5f)/10000.f; 00792 it->second->position.y = floor((y*10000.f)+0.5f)/10000.f; 00793 it->second->position.z = floor((z*10000.f)+0.5f)/10000.f; 00794 it->second->orientation.x = floor((rx*10000.f)+0.5f)/10000.f; 00795 it->second->orientation.y = floor((ry*10000.f)+0.5f)/10000.f; 00796 it->second->orientation.z = floor((rz*10000.f)+0.5f)/10000.f; 00797 it->second->orientation.w = floor((w*10000.f)+0.5f)/10000.f; 00798 return 1; 00799 } 00800 else { 00801 //printf("no node %s to update\n",id); 00802 return 0; 00803 } 00804 } 00805 00806 00807 #ifdef WIN32 00808 CLIENT_LIB_EXPORT int updateAudioNodes(char *id, char *host, int port, char *file_url, char *config) 00809 #else 00810 int updateAudioNodes(char *id, char *host, int port, char *file_url, char *config) 00811 #endif 00812 { 00813 if (viewing_only) return 0; 00814 std::map<std::string, BeamingAudioReplica*>::iterator it = AudioNodeMap.find(id); 00815 if (it != AudioNodeMap.end()) //if id exists in node database, then update 00816 { 00817 strcpy(it->second->clientname,client_name); 00818 strcpy(it->second->clientConfig,my_config.c_str()); 00819 strcpy(it->second->audio_id,id); 00820 strcpy(it->second->host,host); 00821 it->second->port = port; 00822 strcpy(it->second->file_url,file_url); 00823 strcpy(it->second->config,config); 00824 return 1; 00825 } 00826 else { 00827 //printf("no node %s to update\n",id); 00828 return 0; 00829 } 00830 } 00831 00832 00833 #ifdef WIN32 00834 CLIENT_LIB_EXPORT int updateVideoNodes(char *id, char *host, int port, char *file_url, int frame_width, int frame_height, double bandwidth, float *camera_calibration1, float *camera_calibration2) 00835 #else 00836 int updateVideoNodes(char *id, char *host, int port, char *file_url, int frame_width, int frame_height, double bandwidth, float *camera_calibration1, float *camera_calibration2) 00837 #endif 00838 { 00839 if (viewing_only) return 0; 00840 std::map<std::string, BeamingVideoReplica*>::iterator it = VideoNodeMap.find(id); 00841 if (it != VideoNodeMap.end()) //if id exists in node database, then update 00842 { 00843 strcpy(it->second->clientname,client_name); 00844 strcpy(it->second->clientConfig,my_config.c_str()); 00845 strcpy(it->second->video_id,id); 00846 strcpy(it->second->host,host); 00847 it->second->port = port; 00848 strcpy(it->second->file_url,file_url); 00849 it->second->frame_width = frame_width; 00850 it->second->frame_height = frame_height; 00851 it->second->bandwidth = bandwidth; 00852 for (int i=0; i<9; i++) 00853 it->second->calibration1.mf[i] = camera_calibration1[i]; 00854 //printf("%.3f\n",camera_calibration1[5]); 00855 for (int i=0; i<16; i++) 00856 it->second->calibration2.mf[i] = camera_calibration2[i]; 00857 //printf("%.3f\n",camera_calibration2[5]); 00858 return 1; 00859 } 00860 else { 00861 //printf("no node %s to update\n",id); 00862 return 0; 00863 } 00864 } 00865 00866 00867 #ifdef WIN32 00868 CLIENT_LIB_EXPORT int updateObjectNodes(char *id, char *host, int port, char *file_url, float x, float y, float z, float rx, float ry, float rz, float w) 00869 #else 00870 int updateObjectNodes(char *id, char *host, int port, char *file_url, float x, float y, float z, float rx, float ry, float rz, float w) 00871 #endif 00872 { 00873 if (viewing_only) return 0; 00874 std::map<std::string, BeamingObjectReplica*>::iterator it = ObjectNodeMap.find(id); 00875 if (it != ObjectNodeMap.end()) //if id exists in node database, then update 00876 { 00877 strcpy(it->second->clientname,client_name); 00878 strcpy(it->second->clientConfig,my_config.c_str()); 00879 strcpy(it->second->object_id,id); 00880 strcpy(it->second->host,host); 00881 it->second->port = port; 00882 strcpy(it->second->file_url,file_url); 00883 //rounding floats to 4 decimal places here to avoid network flooding due to very tiny differences 00884 it->second->position.x = floor((x*10000.f)+0.5f)/10000.f; 00885 it->second->position.y = floor((y*10000.f)+0.5f)/10000.f; 00886 it->second->position.z = floor((z*10000.f)+0.5f)/10000.f; 00887 it->second->orientation.x = floor((rx*10000.f)+0.5f)/10000.f; 00888 it->second->orientation.y = floor((ry*10000.f)+0.5f)/10000.f; 00889 it->second->orientation.z = floor((rz*10000.f)+0.5f)/10000.f; 00890 it->second->orientation.w = floor((w*10000.f)+0.5f)/10000.f; 00891 return 1; 00892 } 00893 else { 00894 //printf("no node %s to update\n",id); 00895 return 0; 00896 } 00897 } 00898 00899 00900 #ifdef WIN32 00901 CLIENT_LIB_EXPORT int updatePointCloudNodes(char *id, char *host, int port, char *file_url, int size, double bandwidth, bool RGB_flag, int quality) 00902 #else 00903 int updatePointCloudNodes(char *id, char *host, int port, char *file_url, int size, double bandwidth, bool RGB_flag, int quality) 00904 #endif 00905 { 00906 if (viewing_only) return 0; 00907 std::map<std::string, BeamingPointCloudReplica*>::iterator it = PointCloudNodeMap.find(id); 00908 if (it != PointCloudNodeMap.end()) //if id exists in node database, then update 00909 { 00910 strcpy(it->second->clientname,client_name); 00911 strcpy(it->second->clientConfig,my_config.c_str()); 00912 strcpy(it->second->pointcloud_id,id); 00913 strcpy(it->second->host,host); 00914 it->second->port = port; 00915 strcpy(it->second->file_url,file_url); 00916 it->second->size = size; 00917 it->second->bandwidth = bandwidth; 00918 it->second->RGB_flag = RGB_flag; 00919 it->second->quality_level = quality; 00920 return 1; 00921 } 00922 else { 00923 //printf("no node %s to update\n",id); 00924 return 0; 00925 } 00926 } 00927 00928 00929 #ifdef WIN32 00930 CLIENT_LIB_EXPORT int getPeersInfo(char *peers_info) 00931 #else 00932 int getPeersInfo(char *peers_info) 00933 #endif 00934 { 00935 strcpy(peers_info,""); 00936 for ( std::map<std::string, std::vector<node_info*> >::iterator cIter = nodes_map.begin(); cIter!=nodes_map.end(); cIter++ ) 00937 { 00938 char tmpstr[64]; 00939 sprintf(tmpstr,"%s,%s,%s,%s;",cIter->first.c_str(),cIter->second[0]->peername,cIter->second[0]->peertype,cIter->second[0]->peercfg);//guid,client-name,client-type,client-config 00940 strcat(peers_info,tmpstr); 00941 } 00942 return nodes_map.size(); 00943 } 00944 00945 00946 #ifdef WIN32 00947 CLIENT_LIB_EXPORT int getMyGUID(char *mGUID) 00948 #else 00949 int getMyGUID(char *mGUID) 00950 #endif 00951 { 00952 strcpy(mGUID,""); 00953 strcpy(mGUID,myid.c_str()); 00954 return 1; 00955 } 00956 00957 #ifdef WIN32 00958 CLIENT_LIB_EXPORT void getIPinfo(char strid[], char *ipinfo) 00959 #else 00960 void getIPinfo(char strid[], char *ipinfo) 00961 #endif 00962 { 00963 //RakNetGUID strguid; 00964 //strguid.FromString(strid); 00965 std::map<std::string, std::vector<node_info*> >::iterator it = nodes_map.find(strid); 00966 if (it != nodes_map.end()) //if id exists in node database, get ip 00967 { 00968 sprintf(ipinfo,"%s",it->second[0]->ipport); 00969 } 00970 //SystemAddress address = rakPeer->GetSystemAddressFromGuid(strguid); 00971 //sprintf(ipinfo,"%s",address.ToString()); 00972 //printf("%s\n",address.ToString()); 00973 /*DataStructures::List<SystemAddress> connected_ips; 00974 DataStructures::List<RakNetGUID> connected_guids; 00975 unsigned short numConnections; 00976 SystemAddress *connectedSystems = new SystemAddress; 00977 printf("%d\n",replicaManager.GetConnectionCount()); 00978 rakPeer->GetConnectionList(connectedSystems,&numConnections); 00979 printf("%d\n",numConnections); 00980 for (int index=0; index < connectedSystems->size(); index++) 00981 { 00982 printf("%s\n",connectedSystems[index].ToString()); 00983 } 00984 rakPeer->GetSystemList(connected_ips,connected_guids); 00985 for (int index=0; index < connected_guids.Size(); index++) 00986 { 00987 printf("%s\n",connected_guids[index].ToString()); 00988 }*/ 00989 } 00990 00991 00992 #ifdef WIN32 00993 CLIENT_LIB_EXPORT int getPeersID(char *peers_info) 00994 #else 00995 int getPeersID(char *peers_info) 00996 #endif 00997 { 00998 strcpy(peers_info,""); 00999 for ( std::map<std::string, std::vector<node_info*> >::iterator cIter = nodes_map.begin(); cIter!=nodes_map.end(); cIter++ ) 01000 { 01001 char tmpstr[64]; 01002 sprintf(tmpstr,"%s;",cIter->first.c_str());//guid 01003 strcat(peers_info,tmpstr); 01004 } 01005 return nodes_map.size(); 01006 } 01007 01008 01009 #ifdef WIN32 01010 CLIENT_LIB_EXPORT int getNodesInfo(char peer_guid[], char *nodes_info) 01011 #else 01012 int getNodesInfo(char peer_guid[], char *nodes_info) 01013 #endif 01014 { 01015 int x=0; 01016 char tmpstr[256]; 01017 strcpy(nodes_info,""); 01018 std::map<std::string, std::vector<node_info*> >::iterator it = nodes_map.find(peer_guid); 01019 if (it != nodes_map.end()) //if id exists in node database, add to nodes_info string 01020 { 01021 for ( std::vector<node_info*>::iterator cIter = it->second.begin(); cIter!=it->second.end(); cIter++ ) 01022 { 01023 // presents one full rocketbox avatar as one node 01024 if ( ( (strcmp((*cIter)->name.c_str(),"0")==0) && (strcmp((*cIter)->peertype,"AVATAR")==0) ) //check for multiple avatars through unique root node 01025 || (strcmp((*cIter)->type.c_str(),"AVATAR")!=0) ) 01026 { 01027 sprintf(tmpstr,"%s,%s,%s,%s;",(*cIter)->peername,(*cIter)->name.c_str(),(*cIter)->type.c_str(),(*cIter)->peercfg); 01028 //printf("%s,%s,%s,%s\n",(*cIter)->peername,(*cIter)->name.c_str(),(*cIter)->type.c_str(),(*cIter)->peercfg); 01029 strcat(nodes_info,tmpstr); 01030 x++; 01031 } 01032 } 01033 //printf("%s\t",nodes_info); 01034 } 01035 return x; 01036 } 01037 01038 #ifdef WIN32 01039 CLIENT_LIB_EXPORT void getAvatarName(char strid[], char avatar_id[], char *firstname, char *lastname) 01040 #else 01041 void getAvatarName(char strid[], char avatar_id[], char *firstname, char *lastname) 01042 #endif 01043 { 01044 RakNetGUID strguid; 01045 strguid.FromString(strid); 01046 //check to see if deleted 01047 DataStructures::Multilist<ML_STACK, Replica3*> replicaListOut; 01048 replicaManager.GetReplicasCreatedByGuid(strguid,replicaListOut); 01049 if (replicaListOut.GetSize()==0) { 01050 avatar_joint_replicas.erase(strguid); 01051 return; 01052 } 01053 strcpy(firstname,""); 01054 strcpy(lastname,""); 01055 for ( std::vector<BeamingAvatarJointReplica*>::iterator cIter = avatar_joint_replicas[strguid].begin(); cIter!=avatar_joint_replicas[strguid].end(); cIter++ ) 01056 { 01057 if (( strcmp((*cIter)->avatarjoint_id,"0") == 0 ) && ( strcmp((*cIter)->clientname,avatar_id) == 0 )) 01058 { 01059 char tmpstr[128]; 01060 sprintf(firstname,"%s",(*cIter)->fname); 01061 sprintf(lastname,"%s",(*cIter)->lname); 01062 break; 01063 } 01064 } 01065 } 01066 01067 01068 #ifdef WIN32 01069 CLIENT_LIB_EXPORT int getAvatarData(char strid[], char avatar_id[], char *node_ids, float *fa) 01070 #else 01071 int getAvatarData(char strid[], char avatar_id[], char *node_ids, float *fa) 01072 #endif 01073 { 01074 //printf("fetching %s ",strid); 01075 int x = 0, y = 0; 01076 RakNetGUID strguid; 01077 strguid.FromString(strid); 01078 //check to see if deleted 01079 DataStructures::Multilist<ML_STACK, Replica3*> replicaListOut; 01080 replicaManager.GetReplicasCreatedByGuid(strguid,replicaListOut); 01081 if (replicaListOut.GetSize()==0) { 01082 avatar_joint_replicas.erase(strguid); 01083 return 0; 01084 } 01085 strcpy(node_ids,""); 01086 for ( std::vector<BeamingAvatarJointReplica*>::iterator cIter = avatar_joint_replicas[strguid].begin(); cIter!=avatar_joint_replicas[strguid].end(); cIter++ ) 01087 { 01088 if ( strcmp((*cIter)->clientname,avatar_id) == 0 ) 01089 { 01090 char tmpstr[128]; 01091 sprintf(tmpstr,"%s,",(*cIter)->avatarjoint_id); //return node-ids as comma-delimited strings 01092 strcat(node_ids,tmpstr); 01093 fa[x] = (*cIter)->position.x; 01094 fa[++x] = (*cIter)->position.y; 01095 fa[++x] = (*cIter)->position.z; 01096 fa[++x] = (*cIter)->orientation.x; 01097 fa[++x] = (*cIter)->orientation.y; 01098 fa[++x] = (*cIter)->orientation.z; 01099 fa[++x] = (*cIter)->orientation.w; 01100 x++; 01101 y++; 01102 } 01103 } 01104 //printf("%s\n",node_ids); 01105 return y; 01106 } 01107 01108 01109 #ifdef WIN32 01110 CLIENT_LIB_EXPORT int getFacialData(char strid[], char *node_ids, bool *blink, float *smile, float *frown, float *o, float *e, float *p) 01111 #else 01112 int getFacialData(char strid[], char *node_ids, bool *blink, float *smile, float *frown, float *o, float *e, float *p) 01113 #endif 01114 { 01115 //printf("fetching %s ",strid); 01116 int y = 0; 01117 RakNetGUID strguid; 01118 strguid.FromString(strid); 01119 //check to see if deleted 01120 DataStructures::Multilist<ML_STACK, Replica3*> replicaListOut; 01121 replicaManager.GetReplicasCreatedByGuid(strguid,replicaListOut); 01122 if (replicaListOut.GetSize()==0) { 01123 facial_replicas.erase(strguid); 01124 return 0; 01125 } 01126 strcpy(node_ids,""); 01127 for ( std::vector<BeamingFacialReplica*>::iterator cIter = facial_replicas[strguid].begin(); cIter!=facial_replicas[strguid].end(); cIter++ ) 01128 { 01129 char tmpstr[128]; 01130 sprintf(tmpstr,"%s,",(*cIter)->facial_id); //return node-ids as comma-delimited strings 01131 strcat(node_ids,tmpstr); 01132 blink[y] = (*cIter)->blink; 01133 smile[y] = (*cIter)->smile; 01134 frown[y] = (*cIter)->frown; 01135 o[y] = (*cIter)->o; 01136 e[y] = (*cIter)->e; 01137 p[y] = (*cIter)->p; 01138 y++; 01139 } 01140 //printf("%s\n",node_ids); 01141 return y; 01142 } 01143 01144 01145 #ifdef WIN32 01146 CLIENT_LIB_EXPORT int getEmotionData(char strid[], char *node_ids, double *valence, double *arousal, double *misc) 01147 #else 01148 int getEmotionData(char strid[], char *node_ids, double *valence, double *arousal, double *misc) 01149 #endif 01150 { 01151 //printf("fetching %s ",strid); 01152 int y = 0; 01153 RakNetGUID strguid; 01154 strguid.FromString(strid); 01155 //check to see if deleted 01156 DataStructures::Multilist<ML_STACK, Replica3*> replicaListOut; 01157 replicaManager.GetReplicasCreatedByGuid(strguid,replicaListOut); 01158 if (replicaListOut.GetSize()==0) { 01159 emotion_replicas.erase(strguid); 01160 return 0; 01161 } 01162 strcpy(node_ids,""); 01163 for ( std::vector<BeamingEmotionReplica*>::iterator cIter = emotion_replicas[strguid].begin(); cIter!=emotion_replicas[strguid].end(); cIter++ ) 01164 { 01165 char tmpstr[128]; 01166 sprintf(tmpstr,"%s,",(*cIter)->emotion_id); //return node-ids as comma-delimited strings 01167 strcat(node_ids,tmpstr); 01168 valence[y] = (*cIter)->valence; 01169 arousal[y] = (*cIter)->arousal; 01170 misc[y] = (*cIter)->misc; 01171 y++; 01172 } 01173 //printf("%s\n",node_ids); 01174 return y; 01175 } 01176 01177 01178 #ifdef WIN32 01179 CLIENT_LIB_EXPORT int getTactileData(char strid[], char *node_ids, double *duration, float *intensity, float *temperature) 01180 #else 01181 int getTactileData(char strid[], char *node_ids, double *duration, float *intensity, float *temperature) 01182 #endif 01183 { 01184 //printf("fetching %s ",strid); 01185 int x = 0, y = 0; 01186 RakNetGUID strguid; 01187 strguid.FromString(strid); 01188 //check to see if deleted 01189 DataStructures::Multilist<ML_STACK, Replica3*> replicaListOut; 01190 replicaManager.GetReplicasCreatedByGuid(strguid,replicaListOut); 01191 if (replicaListOut.GetSize()==0) { 01192 tactile_replicas.erase(strguid); 01193 return 0; 01194 } 01195 strcpy(node_ids,""); 01196 for ( std::vector<BeamingTactileReplica*>::iterator cIter = tactile_replicas[strguid].begin(); cIter!=tactile_replicas[strguid].end(); cIter++ ) 01197 { 01198 char tmpstr[128]; 01199 sprintf(tmpstr,"%s,",(*cIter)->tactile_id); //return node-ids as comma-delimited strings 01200 strcat(node_ids,tmpstr); 01201 duration[y] = (*cIter)->duration; 01202 intensity[y] = (*cIter)->intensity; 01203 temperature[y] = (*cIter)->temperature; 01204 y++; 01205 } 01206 //printf("%s\n",node_ids); 01207 return y; 01208 } 01209 01210 01211 #ifdef WIN32 01212 CLIENT_LIB_EXPORT int getRobotData(char strid[], char *node_ids, int *type, int *details, float *freespace, float *fa, float *time_remain, int *contact_type) 01213 #else 01214 int getRobotData(char strid[], char *node_ids, int *type, int *details, float *freespace, float *fa, float *time_remain, int *contact_type) 01215 #endif 01216 { 01217 //printf("fetching %s ",strid); 01218 int x = 0, y = 0; 01219 RakNetGUID strguid; 01220 strguid.FromString(strid); 01221 //check to see if deleted 01222 DataStructures::Multilist<ML_STACK, Replica3*> replicaListOut; 01223 replicaManager.GetReplicasCreatedByGuid(strguid,replicaListOut); 01224 if (replicaListOut.GetSize()==0) { 01225 robot_replicas.erase(strguid); 01226 return 0; 01227 } 01228 strcpy(node_ids,""); 01229 for ( std::vector<BeamingRobotReplica*>::iterator cIter = robot_replicas[strguid].begin(); cIter!=robot_replicas[strguid].end(); cIter++ ) 01230 { 01231 char tmpstr[128]; 01232 sprintf(tmpstr,"%s,",(*cIter)->robot_id); //return node-ids as comma-delimited strings 01233 strcat(node_ids,tmpstr); 01234 type[y] = (*cIter)->type; 01235 details[y] = (*cIter)->details; 01236 freespace[y] = (*cIter)->freespace; 01237 fa[x] = (*cIter)->position.x; 01238 fa[++x] = (*cIter)->position.y; 01239 fa[++x] = (*cIter)->position.z; 01240 fa[++x] = (*cIter)->orientation.x; 01241 fa[++x] = (*cIter)->orientation.y; 01242 fa[++x] = (*cIter)->orientation.z; 01243 fa[++x] = (*cIter)->orientation.w; 01244 time_remain[y] = (*cIter)->time_remain; 01245 contact_type[y] = (*cIter)->contact_type; 01246 x++; 01247 y++; 01248 } 01249 //printf("%s\n",node_ids); 01250 return y; 01251 } 01252 01253 01254 #ifdef WIN32 01255 CLIENT_LIB_EXPORT int getAudioData(char strid[], char *node_ids, char *host, int *port, char *file_url, char *config) 01256 #else 01257 int getAudioData(char strid[], char *node_ids, char *host, int *port, char *file_url, char *config) 01258 #endif 01259 { 01260 //printf("fetching %s ",strid); 01261 int y = 0; 01262 RakNetGUID strguid; 01263 strguid.FromString(strid); 01264 //check to see if deleted 01265 DataStructures::Multilist<ML_STACK, Replica3*> replicaListOut; 01266 replicaManager.GetReplicasCreatedByGuid(strguid,replicaListOut); 01267 if (replicaListOut.GetSize()==0) { 01268 audio_replicas.erase(strguid); 01269 return 0; 01270 } 01271 strcpy(node_ids,""); 01272 strcpy(host,""); 01273 strcpy(file_url,""); 01274 strcpy(config,""); 01275 for ( std::vector<BeamingAudioReplica*>::iterator cIter = audio_replicas[strguid].begin(); cIter!=audio_replicas[strguid].end(); cIter++ ) 01276 { 01277 char tmpstr[128]; 01278 sprintf(tmpstr,"%s,",(*cIter)->audio_id); //return node-ids as comma-delimited strings 01279 strcat(node_ids,tmpstr); 01280 sprintf(tmpstr,"%s,",(*cIter)->host); //return hosts as comma-delimited strings 01281 strcat(host,tmpstr); 01282 port[y] = (*cIter)->port; 01283 sprintf(tmpstr,"%s,",(*cIter)->file_url); //return file_url as comma-delimited strings 01284 strcat(file_url,tmpstr); 01285 sprintf(tmpstr,"%s,",(*cIter)->config); //return config as comma-delimited strings 01286 strcat(config,tmpstr); 01287 y++; 01288 } 01289 //printf("%s\n",node_ids); 01290 return y; 01291 } 01292 01293 01294 #ifdef WIN32 01295 CLIENT_LIB_EXPORT int getVideoData(char strid[], char *node_ids, char *host, int *port, char *file_url, int *frame_width, int *frame_height, double *bandwidth, float *camera_calibration1, float *camera_calibration2) 01296 #else 01297 int getVideoData(char strid[], char *node_ids, char *host, int *port, char *file_url, int *frame_width, int *frame_height, double *bandwidth, float *camera_calibration1, float *camera_calibration2) 01298 #endif 01299 { 01300 //printf("fetching %s ",strid); 01301 int y = 0; 01302 RakNetGUID strguid; 01303 strguid.FromString(strid); 01304 //check to see if deleted 01305 DataStructures::Multilist<ML_STACK, Replica3*> replicaListOut; 01306 replicaManager.GetReplicasCreatedByGuid(strguid,replicaListOut); 01307 if (replicaListOut.GetSize()==0) { 01308 video_replicas.erase(strguid); 01309 return 0; 01310 } 01311 strcpy(node_ids,""); 01312 strcpy(host,""); 01313 strcpy(file_url,""); 01314 for ( std::vector<BeamingVideoReplica*>::iterator cIter = video_replicas[strguid].begin(); cIter!=video_replicas[strguid].end(); cIter++ ) 01315 { 01316 char tmpstr[128]; 01317 sprintf(tmpstr,"%s,",(*cIter)->video_id); //return node-ids as strings 01318 strcat(node_ids,tmpstr); 01319 sprintf(tmpstr,"%s,",(*cIter)->host); //return hosts as comma-delimited strings 01320 strcat(host,tmpstr); 01321 port[y] = (*cIter)->port; 01322 sprintf(tmpstr,"%s,",(*cIter)->file_url); //return file_url as comma-delimited strings 01323 strcat(file_url,tmpstr); 01324 frame_width[y] = (*cIter)->frame_width; 01325 frame_height[y] = (*cIter)->frame_height; 01326 bandwidth[y] = (*cIter)->bandwidth; 01327 for (int i=0; i<9; i++) 01328 camera_calibration1[i+(y*8)] = (*cIter)->calibration1.mf[i]; 01329 for (int i=0; i<16; i++) 01330 camera_calibration2[i+(y*15)] = (*cIter)->calibration2.mf[i]; 01331 y++; 01332 } 01333 //printf("%s\n",node_ids); 01334 return y; 01335 } 01336 01337 01338 #ifdef WIN32 01339 CLIENT_LIB_EXPORT int getObjectData(char strid[], char *node_ids, char *host, int *port, char *file_url, float *fa) 01340 #else 01341 int getObjectData(char strid[], char *node_ids, char *host, int *port, char *file_url, float *fa) 01342 #endif 01343 { 01344 //printf("fetching %s ",strid); 01345 int x = 0, y = 0; 01346 RakNetGUID strguid; 01347 strguid.FromString(strid); 01348 //check to see if deleted 01349 DataStructures::Multilist<ML_STACK, Replica3*> replicaListOut; 01350 replicaManager.GetReplicasCreatedByGuid(strguid,replicaListOut); 01351 if (replicaListOut.GetSize()==0) { 01352 object_replicas.erase(strguid); 01353 return 0; 01354 } 01355 strcpy(node_ids,""); 01356 strcpy(host,""); 01357 strcpy(file_url,""); 01358 for ( std::vector<BeamingObjectReplica*>::iterator cIter = object_replicas[strguid].begin(); cIter!=object_replicas[strguid].end(); cIter++ ) 01359 { 01360 char tmpstr[128]; 01361 sprintf(tmpstr,"%s,",(*cIter)->object_id); //return node-ids as strings 01362 strcat(node_ids,tmpstr); 01363 sprintf(tmpstr,"%s,",(*cIter)->host); //return hosts as comma-delimited strings 01364 strcat(host,tmpstr); 01365 port[y] = (*cIter)->port; 01366 sprintf(tmpstr,"%s,",(*cIter)->file_url); //return file_url as comma-delimited strings 01367 strcat(file_url,tmpstr); 01368 fa[x] = (*cIter)->position.x; 01369 fa[++x] = (*cIter)->position.y; 01370 fa[++x] = (*cIter)->position.z; 01371 fa[++x] = (*cIter)->orientation.x; 01372 fa[++x] = (*cIter)->orientation.y; 01373 fa[++x] = (*cIter)->orientation.z; 01374 fa[++x] = (*cIter)->orientation.w; 01375 x++; 01376 y++; 01377 } 01378 //printf("%s\n",node_ids); 01379 return y; 01380 } 01381 01382 01383 #ifdef WIN32 01384 CLIENT_LIB_EXPORT int getPointCloudData(char strid[], char *node_ids, char *host, int *port, char *file_url, int *size, double *bandwidth, bool *RGB_flag, int *quality) 01385 #else 01386 int getPointCloudData(char strid[], char *node_ids, char *host, int *port, char *file_url, int *size, double *bandwidth, bool *RGB_flag, int *quality) 01387 #endif 01388 { 01389 //printf("fetching %s ",strid); 01390 int y = 0; 01391 RakNetGUID strguid; 01392 strguid.FromString(strid); 01393 //check to see if deleted 01394 DataStructures::Multilist<ML_STACK, Replica3*> replicaListOut; 01395 replicaManager.GetReplicasCreatedByGuid(strguid,replicaListOut); 01396 if (replicaListOut.GetSize()==0) { 01397 point_cloud_replicas.erase(strguid); 01398 return 0; 01399 } 01400 strcpy(node_ids,""); 01401 strcpy(host,""); 01402 strcpy(file_url,""); 01403 for ( std::vector<BeamingPointCloudReplica*>::iterator cIter = point_cloud_replicas[strguid].begin(); cIter!=point_cloud_replicas[strguid].end(); cIter++ ) 01404 { 01405 char tmpstr[128]; 01406 sprintf(tmpstr,"%s,",(*cIter)->pointcloud_id); //return node-ids as strings 01407 strcat(node_ids,tmpstr); 01408 sprintf(tmpstr,"%s,",(*cIter)->host); //return hosts as comma-delimited strings 01409 strcat(host,tmpstr); 01410 port[y] = (*cIter)->port; 01411 sprintf(tmpstr,"%s,",(*cIter)->file_url); //return file_url as comma-delimited strings 01412 strcat(file_url,tmpstr); 01413 size[y] = (*cIter)->size; 01414 RGB_flag[y] = (*cIter)->RGB_flag; 01415 bandwidth[y] = (*cIter)->bandwidth; 01416 quality[y] = (*cIter)->quality_level; 01417 y++; 01418 } 01419 //printf("%s\n",node_ids); 01420 return y; 01421 } 01422 01423 01424 #ifdef WIN32 01425 CLIENT_LIB_EXPORT bool getAvatarSpecificData(char strid[], char avatar_id[], char node_id[], float *fa) 01426 #else 01427 bool getAvatarSpecificData(char strid[], char avatar_id[], char node_id[], float *fa) 01428 #endif 01429 { 01430 RakNetGUID strguid; 01431 strguid.FromString(strid); 01432 //check to see if deleted 01433 DataStructures::Multilist<ML_STACK, Replica3*> replicaListOut; 01434 replicaManager.GetReplicasCreatedByGuid(strguid,replicaListOut); 01435 if (replicaListOut.GetSize()==0) { 01436 avatar_joint_replicas.erase(strguid); 01437 return 0; 01438 } 01439 for ( std::vector<BeamingAvatarJointReplica*>::iterator cIter = avatar_joint_replicas[strguid].begin(); cIter!=avatar_joint_replicas[strguid].end(); cIter++ ) 01440 { 01441 if (( strcmp((*cIter)->avatarjoint_id,node_id) == 0 ) && ( strcmp((*cIter)->clientname,avatar_id) == 0 )) 01442 { 01443 fa[0] = (*cIter)->position.x; 01444 fa[1] = (*cIter)->position.y; 01445 fa[2] = (*cIter)->position.z; 01446 fa[3] = (*cIter)->orientation.x; 01447 fa[4] = (*cIter)->orientation.y; 01448 fa[5] = (*cIter)->orientation.z; 01449 fa[6] = (*cIter)->orientation.w; 01450 break; 01451 } 01452 } 01453 return 1; 01454 } 01455 01456 01457 //NOTE: I haven't tested this function visually to ensure it works as expected. 01458 #ifdef WIN32 01459 CLIENT_LIB_EXPORT bool getAvatarSpecificGlobalData(char strid[], char avatar_id[], char node_id[], float *fa) 01460 #else 01461 bool getAvatarSpecificGlobalData(char strid[], char avatar_id[], char node_id[], float *fa) 01462 #endif 01463 { 01464 std::map<std::string, std::vector<float> > global_vars; 01465 std::map<std::string, std::string > parent; 01466 std::list<std::string> parents; 01467 RakNetGUID strguid; 01468 strguid.FromString(strid); 01469 //check to see if deleted 01470 DataStructures::Multilist<ML_STACK, Replica3*> replicaListOut; 01471 replicaManager.GetReplicasCreatedByGuid(strguid,replicaListOut); 01472 if (replicaListOut.GetSize()==0) { 01473 avatar_joint_replicas.erase(strguid); 01474 return 0; 01475 } 01476 for ( std::vector<BeamingAvatarJointReplica*>::iterator cIter = avatar_joint_replicas[strguid].begin(); cIter!=avatar_joint_replicas[strguid].end(); cIter++ ) 01477 { 01478 global_vars[(*cIter)->avatarjoint_id].push_back((*cIter)->position.x); 01479 global_vars[(*cIter)->avatarjoint_id].push_back((*cIter)->position.y); 01480 global_vars[(*cIter)->avatarjoint_id].push_back((*cIter)->position.z); 01481 global_vars[(*cIter)->avatarjoint_id].push_back((*cIter)->orientation.x); 01482 global_vars[(*cIter)->avatarjoint_id].push_back((*cIter)->orientation.y); 01483 global_vars[(*cIter)->avatarjoint_id].push_back((*cIter)->orientation.z); 01484 global_vars[(*cIter)->avatarjoint_id].push_back((*cIter)->orientation.w); 01485 parent[(*cIter)->avatarjoint_id] = (*cIter)->parentbone; 01486 //printf("%s,%s\n",(*cIter)->avatarjoint_id,(*cIter)->parentbone.c_str()); 01487 if (( strcmp((*cIter)->avatarjoint_id,node_id) == 0 ) && ( strcmp((*cIter)->clientname,avatar_id) == 0 )) 01488 { 01489 //printf("%s",(*cIter)->avatarjoint_id); 01490 parents.push_front((*cIter)->avatarjoint_id); 01491 std::string avatarbone = (*cIter)->parentbone.C_String(); 01492 while(!avatarbone.empty()) 01493 { 01494 //printf("\t%s",avatarbone.c_str()); 01495 parents.push_front(avatarbone); 01496 avatarbone = parent[avatarbone]; 01497 } 01498 //printf("\n"); 01499 break; 01500 } 01501 } 01502 CVec3 pos = CVec3(); 01503 CQuat rot = CQuat(); 01504 for (std::list<std::string>::iterator it=parents.begin(); it!=parents.end(); ++it) 01505 { 01506 pos = pos + CVec3(global_vars[*it][0],global_vars[*it][1],global_vars[*it][2]); 01507 rot = rot * CQuat(global_vars[*it][3],global_vars[*it][4],global_vars[*it][5],global_vars[*it][6]); 01508 } 01509 fa[0] = pos.x; 01510 fa[1] = pos.y; 01511 fa[2] = pos.z; 01512 fa[3] = rot.x; 01513 fa[4] = rot.y; 01514 fa[5] = rot.z; 01515 fa[6] = rot.w; 01516 return 1; 01517 } 01518 01519 01520 #ifdef WIN32 01521 CLIENT_LIB_EXPORT bool getFacialSpecificData(char strid[], char node_id[], bool *blink, float *smile, float *frown, float *o, float *e, float *p) 01522 #else 01523 bool getFacialSpecificData(char strid[], char node_id[], bool *blink, float *smile, float *frown, float *o, float *e, float *p) 01524 #endif 01525 { 01526 int y = 0; 01527 RakNetGUID strguid; 01528 strguid.FromString(strid); 01529 //check to see if deleted 01530 DataStructures::Multilist<ML_STACK, Replica3*> replicaListOut; 01531 replicaManager.GetReplicasCreatedByGuid(strguid,replicaListOut); 01532 if (replicaListOut.GetSize()==0) { 01533 facial_replicas.erase(strguid); 01534 return 0; 01535 } 01536 for ( std::vector<BeamingFacialReplica*>::iterator cIter = facial_replicas[strguid].begin(); cIter!=facial_replicas[strguid].end(); cIter++ ) 01537 { 01538 if ( strcmp((*cIter)->facial_id,node_id) == 0 ) 01539 { 01540 *blink = (*cIter)->blink; 01541 *smile = (*cIter)->smile; 01542 *frown = (*cIter)->frown; 01543 *o = (*cIter)->o; 01544 *e = (*cIter)->e; 01545 *p = (*cIter)->p; 01546 break; 01547 } 01548 } 01549 return 1; 01550 } 01551 01552 01553 #ifdef WIN32 01554 CLIENT_LIB_EXPORT bool getEmotionSpecificData(char strid[], char node_id[], double *valence, double *arousal, double *misc) 01555 #else 01556 bool getEmotionSpecificData(char strid[], char node_id[], double *valence, double *arousal, double *misc) 01557 #endif 01558 { 01559 RakNetGUID strguid; 01560 strguid.FromString(strid); 01561 //check to see if deleted 01562 DataStructures::Multilist<ML_STACK, Replica3*> replicaListOut; 01563 replicaManager.GetReplicasCreatedByGuid(strguid,replicaListOut); 01564 if (replicaListOut.GetSize()==0) { 01565 emotion_replicas.erase(strguid); 01566 return 0; 01567 } 01568 for ( std::vector<BeamingEmotionReplica*>::iterator cIter = emotion_replicas[strguid].begin(); cIter!=emotion_replicas[strguid].end(); cIter++ ) 01569 { 01570 if ( strcmp((*cIter)->emotion_id,node_id) == 0 ) 01571 { 01572 *valence = (*cIter)->valence; 01573 *arousal = (*cIter)->arousal; 01574 *misc = (*cIter)->misc; 01575 break; 01576 } 01577 } 01578 return 1; 01579 } 01580 01581 #ifdef WIN32 01582 CLIENT_LIB_EXPORT bool getTactileSpecificData(char strid[], char node_id[], double *duration, float *intensity, float *temperature) 01583 #else 01584 bool getTactileSpecificData(char strid[], char node_id[], double *duration, float *intensity, float *temperature) 01585 #endif 01586 { 01587 RakNetGUID strguid; 01588 strguid.FromString(strid); 01589 //check to see if deleted 01590 DataStructures::Multilist<ML_STACK, Replica3*> replicaListOut; 01591 replicaManager.GetReplicasCreatedByGuid(strguid,replicaListOut); 01592 if (replicaListOut.GetSize()==0) { 01593 tactile_replicas.erase(strguid); 01594 return 0; 01595 } 01596 for ( std::vector<BeamingTactileReplica*>::iterator cIter = tactile_replicas[strguid].begin(); cIter!=tactile_replicas[strguid].end(); cIter++ ) 01597 { 01598 if ( strcmp((*cIter)->tactile_id,node_id) == 0 ) 01599 { 01600 *duration = (*cIter)->duration; 01601 *intensity = (*cIter)->intensity; 01602 *temperature = (*cIter)->temperature; 01603 break; 01604 } 01605 } 01606 return 1; 01607 } 01608 01609 01610 #ifdef WIN32 01611 CLIENT_LIB_EXPORT bool getRobotSpecificData(char strid[], char node_id[], int *type, int *details, float *freespace, float *fa, float *time_remain, int *contact_type) 01612 #else 01613 bool getRobotSpecificData(char strid[], char node_id[], int *type, int *details, float *freespace, float *fa, float *time_remain, int *contact_type) 01614 #endif 01615 { 01616 //printf("fetching %s ",strid); 01617 int x = 0, y = 0; 01618 RakNetGUID strguid; 01619 strguid.FromString(strid); 01620 //check to see if deleted 01621 DataStructures::Multilist<ML_STACK, Replica3*> replicaListOut; 01622 replicaManager.GetReplicasCreatedByGuid(strguid,replicaListOut); 01623 if (replicaListOut.GetSize()==0) { 01624 robot_replicas.erase(strguid); 01625 return 0; 01626 } 01627 for ( std::vector<BeamingRobotReplica*>::iterator cIter = robot_replicas[strguid].begin(); cIter!=robot_replicas[strguid].end(); cIter++ ) 01628 { 01629 if ( strcmp((*cIter)->robot_id,node_id) == 0 ) 01630 { 01631 *type = (*cIter)->type; 01632 *details = (*cIter)->details; 01633 *freespace = (*cIter)->freespace; 01634 fa[0] = (*cIter)->position.x; 01635 fa[1] = (*cIter)->position.y; 01636 fa[2] = (*cIter)->position.z; 01637 fa[3] = (*cIter)->orientation.x; 01638 fa[4] = (*cIter)->orientation.y; 01639 fa[5] = (*cIter)->orientation.z; 01640 fa[6] = (*cIter)->orientation.w; 01641 *time_remain = (*cIter)->time_remain; 01642 *contact_type = (*cIter)->contact_type; 01643 break; 01644 } 01645 } 01646 return 1; 01647 } 01648 01649 01650 #ifdef WIN32 01651 CLIENT_LIB_EXPORT bool getAudioSpecificData(char strid[], char node_id[], char *host, int *port, char *file_url, char *config) 01652 #else 01653 bool getAudioSpecificData(char strid[], char node_id[], char *host, int *port, char *file_url, char *config) 01654 #endif 01655 { 01656 RakNetGUID strguid; 01657 strguid.FromString(strid); 01658 //check to see if deleted 01659 DataStructures::Multilist<ML_STACK, Replica3*> replicaListOut; 01660 replicaManager.GetReplicasCreatedByGuid(strguid,replicaListOut); 01661 if (replicaListOut.GetSize()==0) { 01662 audio_replicas.erase(strguid); 01663 return 0; 01664 } 01665 for ( std::vector<BeamingAudioReplica*>::iterator cIter = audio_replicas[strguid].begin(); cIter!=audio_replicas[strguid].end(); cIter++ ) 01666 { 01667 if ( strcmp((*cIter)->audio_id,node_id) == 0 ) 01668 { 01669 strcpy(host,(*cIter)->host); 01670 *port = (*cIter)->port; 01671 strcpy(file_url,(*cIter)->file_url); 01672 strcpy(config,(*cIter)->config); 01673 break; 01674 } 01675 } 01676 return 1; 01677 } 01678 01679 01680 #ifdef WIN32 01681 CLIENT_LIB_EXPORT bool getVideoSpecificData(char strid[], char node_id[], char *host, int *port, char *file_url, int *frame_width, int *frame_height, double *bandwidth, float *camera_calibration1, float *camera_calibration2) 01682 #else 01683 bool getVideoSpecificData(char strid[], char node_id[], char *host, int *port, char *file_url, int *frame_width, int *frame_height, double *bandwidth, float *camera_calibration1, float *camera_calibration2) 01684 #endif 01685 { 01686 RakNetGUID strguid; 01687 strguid.FromString(strid); 01688 //check to see if deleted 01689 DataStructures::Multilist<ML_STACK, Replica3*> replicaListOut; 01690 replicaManager.GetReplicasCreatedByGuid(strguid,replicaListOut); 01691 if (replicaListOut.GetSize()==0) { 01692 video_replicas.erase(strguid); 01693 return 0; 01694 } 01695 for ( std::vector<BeamingVideoReplica*>::iterator cIter = video_replicas[strguid].begin(); cIter!=video_replicas[strguid].end(); cIter++ ) 01696 { 01697 if ( strcmp((*cIter)->video_id,node_id) == 0 ) 01698 { 01699 strcpy(host,(*cIter)->host); 01700 *port = (*cIter)->port; 01701 strcpy(file_url,(*cIter)->file_url); 01702 *frame_width = (*cIter)->frame_width; 01703 *frame_height = (*cIter)->frame_height; 01704 *bandwidth = (*cIter)->bandwidth; 01705 for (int i=0; i<9; i++) 01706 camera_calibration1[i] = (*cIter)->calibration1.mf[i]; 01707 for (int i=0; i<16; i++) 01708 camera_calibration2[i] = (*cIter)->calibration2.mf[i]; 01709 break; 01710 } 01711 } 01712 return 1; 01713 } 01714 01715 01716 #ifdef WIN32 01717 CLIENT_LIB_EXPORT bool getObjectSpecificData(char strid[], char node_id[], char *host, int *port, char *file_url, float *fa) 01718 #else 01719 bool getObjectSpecificData(char strid[], char node_id[], char *host, int *port, char *file_url, float *fa) 01720 #endif 01721 { 01722 RakNetGUID strguid; 01723 strguid.FromString(strid); 01724 //check to see if deleted 01725 DataStructures::Multilist<ML_STACK, Replica3*> replicaListOut; 01726 replicaManager.GetReplicasCreatedByGuid(strguid,replicaListOut); 01727 if (replicaListOut.GetSize()==0) { 01728 object_replicas.erase(strguid); 01729 return 0; 01730 } 01731 for ( std::vector<BeamingObjectReplica*>::iterator cIter = object_replicas[strguid].begin(); cIter!=object_replicas[strguid].end(); cIter++ ) 01732 { 01733 if ( strcmp((*cIter)->object_id,node_id) == 0 ) 01734 { 01735 strcpy(host,(*cIter)->host); 01736 *port = (*cIter)->port; 01737 strcpy(file_url,(*cIter)->file_url); 01738 fa[0] = (*cIter)->position.x; 01739 fa[1] = (*cIter)->position.y; 01740 fa[2] = (*cIter)->position.z; 01741 fa[3] = (*cIter)->orientation.x; 01742 fa[4] = (*cIter)->orientation.y; 01743 fa[5] = (*cIter)->orientation.z; 01744 fa[6] = (*cIter)->orientation.w; 01745 break; 01746 } 01747 } 01748 return 1; 01749 } 01750 01751 01752 #ifdef WIN32 01753 CLIENT_LIB_EXPORT bool getPointCloudSpecificData(char strid[], char node_id[], char *host, int *port, char *file_url, int *size, double *bandwidth, bool *RGB_flag, int *quality) 01754 #else 01755 bool getPointCloudSpecificData(char strid[], char node_id[], char *host, int *port, char *file_url, int *size, double *bandwidth, bool *RGB_flag, int *quality) 01756 #endif 01757 { 01758 int y = 0; 01759 RakNetGUID strguid; 01760 strguid.FromString(strid); 01761 //check to see if deleted 01762 DataStructures::Multilist<ML_STACK, Replica3*> replicaListOut; 01763 replicaManager.GetReplicasCreatedByGuid(strguid,replicaListOut); 01764 if (replicaListOut.GetSize()==0) { 01765 point_cloud_replicas.erase(strguid); 01766 return 0; 01767 } 01768 for ( std::vector<BeamingPointCloudReplica*>::iterator cIter = point_cloud_replicas[strguid].begin(); cIter!=point_cloud_replicas[strguid].end(); cIter++ ) 01769 { 01770 if ( strcmp((*cIter)->pointcloud_id,node_id) == 0 ) 01771 { 01772 strcpy(host,(*cIter)->host); 01773 *port = (*cIter)->port; 01774 strcpy(file_url,(*cIter)->file_url); 01775 *size = (*cIter)->size; 01776 *RGB_flag = (*cIter)->RGB_flag; 01777 *bandwidth = (*cIter)->bandwidth; 01778 *quality = (*cIter)->quality_level; 01779 break; 01780 } 01781 } 01782 return 1; 01783 } 01784 01785 01786 #ifdef WIN32 01787 CLIENT_LIB_EXPORT bool getGenericData(char strid[], char generic_id[], void *pdata, int *psize) 01788 #else 01789 bool getGenericData(char strid[], char generic_id[], void *pdata, int *psize) 01790 #endif 01791 { 01792 RakNetGUID strguid; 01793 strguid.FromString(strid); 01794 //check to see if deleted 01795 DataStructures::Multilist<ML_STACK, Replica3*> replicaListOut; 01796 replicaManager.GetReplicasCreatedByGuid(strguid,replicaListOut); 01797 if (replicaListOut.GetSize()==0) { 01798 generic_replicas.erase(strguid); 01799 return 0; 01800 } 01801 for ( std::vector<BeamingGenericReplica*>::iterator cIter = generic_replicas[strguid].begin(); cIter!=generic_replicas[strguid].end(); cIter++ ) 01802 { 01803 if ( strcmp((*cIter)->generic_id,generic_id) == 0 ) 01804 { 01805 *psize = (*cIter)->datasize; 01806 memcpy ( pdata, (*cIter)->anydata, 1024 ); 01807 /*//begin printf 01808 struct mystruct{ 01809 int x; 01810 char name[28]; 01811 float myfloat; 01812 } st; 01813 printf("receiving %s, %d, %.3f ...\n",((mystruct *)(*cIter)->anydata)->name,((mystruct *)(*cIter)->anydata)->x,((mystruct *)(*cIter)->anydata)->myfloat); 01814 //end printf*/ 01815 break; 01816 } 01817 } 01818 return 1; 01819 } 01820 01821 01822 #ifdef WIN32 01823 CLIENT_LIB_EXPORT int checkStatus(char *idstr, char *mytype, char *name, char *myconfig) 01824 #else 01825 int checkStatus(char *idstr, char *mytype, char *name, char *myconfig) 01826 #endif 01827 { 01828 int x = new_clients.size(); 01829 if ( x > 0 ) 01830 { 01831 std::map<RakNetGUID, std::vector<std::string> >::iterator cIter = new_clients.begin(); //get first item in the list 01832 strcpy(idstr,cIter->first.ToString()); //copy guid 01833 strcpy(name,cIter->second[0].c_str()); //copy name 01834 strcpy(mytype,cIter->second[1].c_str()); //copy type 01835 strcpy(myconfig,cIter->second[2].c_str()); //copy avatar name 01836 printf("checkStatus -> %s %s %s \n",name,mytype,myconfig); 01837 new_clients.erase(cIter->first); //erase this item once accessed 01838 } 01839 //printf("size %i \n",x); 01840 return x; 01841 } 01842 01843 01844 #ifdef WIN32 01845 CLIENT_LIB_EXPORT int fetch(char strid[], float *fa) 01846 #else 01847 int fetch(char strid[], float *fa) 01848 #endif 01849 { 01850 //printf("fetching %s ",strid); 01851 int x = 0, y = 0; 01852 RakNetGUID strguid; 01853 strguid.FromString(strid); 01854 //check to see if deleted 01855 DataStructures::Multilist<ML_STACK, Replica3*> replicaListOut; 01856 replicaManager.GetReplicasCreatedByGuid(strguid,replicaListOut); 01857 if (replicaListOut.GetSize()==0) 01858 { 01859 avatar_joint_replicas.erase(strguid); 01860 //printf("client %s not available\n", strid); 01861 return 0; 01862 } 01863 //std::cout<<" guid="<<cIter->first.ToString()<<" replicas="<<replicaListOut.GetSize()<<", "<<cIter->second.size()<<std::endl; 01864 for ( std::vector<BeamingAvatarJointReplica*>::iterator cIter = avatar_joint_replicas[strguid].begin(); cIter!=avatar_joint_replicas[strguid].end(); cIter++ ) 01865 { 01866 if (y>122) { 01867 printf("More than one AVATAR added by %s, use getNodesInfo()",strid); 01868 break; 01869 } 01870 float z=0; //for printf 01871 fa[x] = z = y;//atof((*cIter))->avatarjoint_id; //return node_ids as a number even if string 01872 //printf("object fa[%i]=%.f ",x,z); 01873 fa[++x] = z = (*cIter)->position.x; 01874 //printf("position/orientation fa[%i]=%.3f ",x,z); 01875 fa[++x] = z = (*cIter)->position.y; 01876 //printf("fa[%i]=%.3f ",x,z); 01877 fa[++x] = z = (*cIter)->position.z; 01878 //printf("fa[%i]=%.3f ",x,z); 01879 fa[++x] = z = (*cIter)->orientation.x; 01880 //printf("fa[%i]=%.3f ",x,z); 01881 fa[++x] = z = (*cIter)->orientation.y; 01882 //printf("fa[%i]=%.3f ",x,z); 01883 fa[++x] = z = (*cIter)->orientation.z; 01884 //printf("fa[%i]=%.3f ",x,z); 01885 fa[++x] = z = (*cIter)->orientation.w; 01886 //printf("fa[%i]=%.3f ",x,z); 01887 x++; 01888 y++; 01889 } 01890 //printf("count=%i \n",y); 01891 return y; 01892 } 01893 01894 #ifdef WIN32 01895 CLIENT_LIB_EXPORT int fetch2(char strid[], char *fa) 01896 #else 01897 int fetch2(char strid[], char *fa) 01898 #endif 01899 { 01900 //printf("fetching %s ",strid); 01901 int x = 0, y = 0; 01902 RakNetGUID strguid; 01903 strguid.FromString(strid); 01904 //check to see if deleted 01905 DataStructures::Multilist<ML_STACK, Replica3*> replicaListOut; 01906 replicaManager.GetReplicasCreatedByGuid(strguid,replicaListOut); 01907 if (replicaListOut.GetSize()==0) 01908 { 01909 avatar_joint_replicas.erase(strguid); 01910 //printf("client %s not available\n", strid); 01911 return 0; 01912 } 01913 //std::cout<<" guid="<<cIter->first.ToString()<<" replicas="<<replicaListOut.GetSize()<<", "<<cIter->second.size()<<std::endl; 01914 std::stringstream tmp; 01915 for ( std::vector<BeamingAvatarJointReplica*>::iterator cIter = avatar_joint_replicas[strguid].begin(); cIter!=avatar_joint_replicas[strguid].end(); cIter++ ) 01916 { 01917 if (y>122) { 01918 printf("More than one AVATAR added by %s, use getNodesInfo()",strid); 01919 break; 01920 } 01921 tmp << y << ","<<(*cIter)->position.x<<","<<(*cIter)->position.y<<","<<(*cIter)->position.z<<","<<(*cIter)->orientation.x<<","<<(*cIter)->orientation.y<<","<<(*cIter)->orientation.z<<","<<(*cIter)->orientation.w<<";"; 01922 y++; 01923 } 01924 strcpy(fa,tmp.str().c_str()); 01925 //printf("count=%i \n",y); 01926 return y; 01927 } 01928 01929 #ifdef WIN32 01930 CLIENT_LIB_EXPORT void removeAllNodes() 01931 #else 01932 void removeAllNodes() 01933 #endif 01934 { 01935 printf("All nodes for %s destroyed.\n",myid.c_str()); 01936 DataStructures::Multilist<ML_STACK, Replica3*> replicaListOut; 01937 // ClearPointers is needed, as I don't track which objects have and have not been allocated at the application level. 01938 // So ClearPointers will call delete on every object in the returned list, 01939 // which is every object that the application has created. Another way to put it is 01940 // A. Send a packet to tell other systems to delete these objects 01941 // B. Delete these objects on my own system 01942 replicaManager.GetReplicasCreatedByMe(replicaListOut); 01943 replicaManager.BroadcastDestructionList(replicaListOut, UNASSIGNED_SYSTEM_ADDRESS); 01944 replicaListOut.ClearPointers( true, __FILE__, __LINE__ ); 01945 AvatarNodeMap.clear(); 01946 EmotionNodeMap.clear(); 01947 FacialNodeMap.clear(); 01948 TactileNodeMap.clear(); 01949 RobotNodeMap.clear(); 01950 VideoNodeMap.clear(); 01951 ObjectNodeMap.clear(); 01952 AudioNodeMap.clear(); 01953 PointCloudNodeMap.clear(); 01954 GenericNodeMap.clear(); 01955 01956 } 01957 01958 01959 #ifdef WIN32 01960 CLIENT_LIB_EXPORT void stop() 01961 #else 01962 void stop() 01963 #endif 01964 { 01965 rakPeer->Shutdown(100,0); 01966 RakNetworkFactory::DestroyRakPeerInterface(rakPeer); 01967 isconnected=false; 01968 viewing_only = false; 01969 } 01970 01971 #ifdef WIN32 01972 CLIENT_LIB_EXPORT void exitlibrary() 01973 #else 01974 void exitlibrary() 01975 #endif 01976 { 01977 exit(0); 01978 }