Beaming Scene Service  2.0
RakNet wrapper for managing data communications between multiple Beaming clients
netClient/client.cpp
Go to the documentation of this file.
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 }
 All Classes Files Functions Variables Enumerations Enumerator Defines