Changeset 7954 in orxonox.OLD for trunk/src/lib/coord
- Timestamp:
- May 29, 2006, 3:28:41 PM (19 years ago)
- Location:
- trunk/src/lib/coord
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/lib/coord/p_node.cc
r7725 r7954 53 53 if (parent != NULL) 54 54 parent->addChild(this); 55 56 this->relCoordinate_handle = this->registerVarId( new SynchronizeableVector( &relCoordinate, &relCoordinate_write, "coordinate" ) ); 57 this->relDirection_handle = this->registerVarId( new SynchronizeableQuaternion( &relDirection, &relDirection_write, "direction" ) ); 55 58 } 56 59 … … 1077 1080 1078 1081 /** 1079 * Writes data from network containing information about the state 1080 * @param data pointer to data 1081 * @param length length of data 1082 * @param sender hostID of sender 1083 */ 1084 int PNode::writeState( const byte * data, int length, int sender ) 1085 { 1086 SYNCHELP_READ_BEGIN(); 1087 1088 SYNCHELP_READ_FKT( BaseObject::writeState, NWT_PN_BO_WRITESTATE ); 1089 1090 // char * parentName = NULL; 1091 // SYNCHELP_READ_STRINGM( parentName ); 1092 // 1093 // if ( strcmp(parentName, "")==0 ) 1094 // { 1095 // setParent( (char*)NULL ); 1096 // } 1097 // else 1098 // { 1099 // setParent( parentName ); 1100 // } 1101 // 1102 // delete[] parentName; 1103 1104 int parentMode; 1105 SYNCHELP_READ_INT( parentMode, NWT_PN_PARENTMODE ); 1106 this->setParentMode((PARENT_MODE)parentMode); 1107 1108 float f1, f2, f3, f4; 1109 1110 SYNCHELP_READ_FLOAT( f1, NWT_PN_COORX ); 1111 SYNCHELP_READ_FLOAT( f2, NWT_PN_COORY ); 1112 SYNCHELP_READ_FLOAT( f3, NWT_PN_COORZ ); 1113 this->setRelCoor( f1, f2, f3 ); 1114 1115 1116 SYNCHELP_READ_FLOAT( f1, NWT_PN_ROTV ); 1117 SYNCHELP_READ_FLOAT( f2, NWT_PN_ROTX ); 1118 SYNCHELP_READ_FLOAT( f3, NWT_PN_ROTY ); 1119 SYNCHELP_READ_FLOAT( f4, NWT_PN_ROTZ ); 1120 this->setRelDir( Quaternion( Vector(f2, f3, f4), f1 ) ); 1121 1122 // int n; 1123 // char * childName; 1124 // 1125 // PRINTF(0)("JKLO %d %d %d %d\n", data[__synchelp_read_i], data[__synchelp_read_i+1], data[__synchelp_read_i+2], data[__synchelp_read_i+3]); 1126 // SYNCHELP_READ_INT( n ); 1127 // PRINTF(0)("read %s:n=%d\n", this->getName(), n); 1128 // 1129 // for (int i = 0; i<n; i++) 1130 // { 1131 // SYNCHELP_READ_STRINGM( childName ); 1132 // PRINTF(0)("RCVD CHILD = %s\n", childName); 1133 // addChild( childName ); 1134 // delete childName; 1135 // childName = NULL; 1136 // } 1137 1138 return SYNCHELP_READ_N; 1139 } 1140 1141 /** 1142 * data copied in data will bee sent to another host 1143 * @param data pointer to data 1144 * @param maxLength max length of data 1145 * @return the number of bytes writen 1146 */ 1147 int PNode::readState( byte * data, int maxLength ) 1148 { 1149 SYNCHELP_WRITE_BEGIN(); 1150 1151 SYNCHELP_WRITE_FKT( BaseObject::readState, NWT_PN_BO_WRITESTATE ); 1152 1153 // if ( this->parent ) 1154 // { 1155 // SYNCHELP_WRITE_STRING( parent->getName() ); 1156 // } 1157 // else 1158 // { 1159 // SYNCHELP_WRITE_STRING( "" ); 1160 // } 1161 1162 SYNCHELP_WRITE_INT( this->parentMode, NWT_PN_PARENTMODE ); 1163 1164 SYNCHELP_WRITE_FLOAT( this->relCoordinate.x, NWT_PN_COORX ); 1165 SYNCHELP_WRITE_FLOAT( this->relCoordinate.y, NWT_PN_COORY ); 1166 SYNCHELP_WRITE_FLOAT( this->relCoordinate.z, NWT_PN_COORZ ); 1167 1168 SYNCHELP_WRITE_FLOAT( this->relDirection.w, NWT_PN_ROTV ); 1169 SYNCHELP_WRITE_FLOAT( this->relDirection.v.x, NWT_PN_ROTX ); 1170 SYNCHELP_WRITE_FLOAT( this->relDirection.v.y, NWT_PN_ROTY ); 1171 SYNCHELP_WRITE_FLOAT( this->relDirection.v.z, NWT_PN_ROTZ ); 1172 1173 // int n = children.size(); 1174 // //check if camera is in children 1175 // for (std::std::list<PNode*>::const_iterator it = children.begin(); it!=children.end(); it++) 1176 // { 1177 // if ( (*it)->isA(CL_CAMERA) ) 1178 // n--; 1179 // } 1180 // PRINTF(0)("write %s:n=%d\n", this->getName(), n); 1181 // SYNCHELP_WRITE_INT( n ); 1182 // PRINTF(0)("ASDF %d %d %d %d\n", data[__synchelp_write_i-4], data[__synchelp_write_i-3], data[__synchelp_write_i-2], data[__synchelp_write_i-1]); 1183 // 1184 // 1185 // for (std::list<PNode*>::const_iterator it = children.begin(); it!=children.end(); it++) 1186 // { 1187 // //dont add camera because there is only one camera attached to local player 1188 // if ( !(*it)->isA(CL_CAMERA) ) 1189 // { 1190 // PRINTF(0)("SENDING CHILD: %s\n", (*it)->getName()); 1191 // SYNCHELP_WRITE_STRING( (*it)->getName() ); 1192 // } 1193 // } 1194 1195 return SYNCHELP_WRITE_N; 1196 } 1197 1198 #define __FLAG_COOR 1 1199 #define __FLAG_ROT 2 1200 1201 #define __OFFSET_POS 1 1202 #define __OFFSET_ROT 0.05 1203 1204 /** 1205 * Writes data from network containing information about the state which has changed 1206 * @param data pointer to data 1207 * @param length length of data 1208 * @param sender hostID of sender 1209 */ 1210 int PNode::writeSync( const byte * data, int length, int sender ) 1211 { 1212 SYNCHELP_READ_BEGIN(); 1213 1214 if ( this->getHostID()==this->getOwner() ) 1215 { 1216 return SYNCHELP_READ_N; 1217 } 1218 1219 byte flags = 0; 1220 SYNCHELP_READ_BYTE( flags, NWT_PN_FLAGS ); 1221 //PRINTF(0)("%s::FLAGS = %d\n", this->getName(), flags); 1222 1223 float f1, f2, f3, f4; 1224 1225 if ( flags & __FLAG_COOR ) 1226 { 1227 SYNCHELP_READ_FLOAT( f1, NWT_PN_SCOORX ); 1228 SYNCHELP_READ_FLOAT( f2, NWT_PN_SCOORY ); 1229 SYNCHELP_READ_FLOAT( f3, NWT_PN_SCOORZ ); 1230 PRINTF(0)("RCVD COOR: %f %f %f\n", f1, f2, f3); 1231 this->setRelCoor( f1, f2, f3 ); 1232 } 1233 1234 if ( flags & __FLAG_ROT ) 1235 { 1236 SYNCHELP_READ_FLOAT( f1, NWT_PN_SROTV ); 1237 SYNCHELP_READ_FLOAT( f2, NWT_PN_SROTX ); 1238 SYNCHELP_READ_FLOAT( f3, NWT_PN_SROTY ); 1239 SYNCHELP_READ_FLOAT( f4, NWT_PN_SROTZ ); 1240 PRINTF(0)("RCVD QUAT: %f %f %f %f\n", f1, f2, f3, f4); 1241 //this->setRelDir( Quaternion( Vector(f2, f3, f4), f1 ) ); 1242 Quaternion q; 1243 q.w = f1; 1244 q.v.x = f2; 1245 q.v.y = f3; 1246 q.v.z = f4; 1247 this->setAbsDir( q ); 1248 } 1249 1250 return SYNCHELP_READ_N; 1251 } 1252 1253 /** 1254 * data copied in data will bee sent to another host 1255 * @param data pointer to data 1256 * @param maxLength max length of data 1257 * @return the number of bytes writen 1258 */ 1259 int PNode::readSync( byte * data, int maxLength ) 1260 { 1261 //WARNING: if you change this file make sure you also change needsReadSync 1262 SYNCHELP_WRITE_BEGIN(); 1263 1264 if ( this->getHostID()!=0 && this->getHostID()!=this->getOwner() ) 1265 { 1266 return SYNCHELP_WRITE_N; 1267 } 1268 1269 byte flags = 0; 1270 if ( fabs( coorx - relCoordinate.x ) > __OFFSET_POS*0.05*this->velocity.len() || 1271 fabs( coory - relCoordinate.y ) > __OFFSET_POS*0.05*this->velocity.len() || 1272 fabs( coorz - relCoordinate.z ) > __OFFSET_POS*0.05*this->velocity.len() ) 1273 flags |= __FLAG_COOR; 1274 1275 if ( fabs( rotw - absDirection.w ) > __OFFSET_ROT || 1276 fabs( rotx - absDirection.v.x ) > __OFFSET_ROT || 1277 fabs( roty - absDirection.v.y ) > __OFFSET_ROT || 1278 fabs( rotz - absDirection.v.z ) > __OFFSET_ROT ) 1279 flags |= __FLAG_ROT; 1280 1281 1282 SYNCHELP_WRITE_BYTE( flags, NWT_PN_FLAGS ); 1283 PRINTF(0)("FLAGS = %d\n", flags); 1284 1285 if ( flags & __FLAG_COOR ) 1286 { 1287 1288 PRINTF(0)("SEND COOR: %f %f %f\n", this->relCoordinate.x, this->relCoordinate.y, this->relCoordinate.z); 1289 1290 SYNCHELP_WRITE_FLOAT( this->relCoordinate.x, NWT_PN_SCOORX ); 1291 SYNCHELP_WRITE_FLOAT( this->relCoordinate.y, NWT_PN_SCOORY ); 1292 SYNCHELP_WRITE_FLOAT( this->relCoordinate.z, NWT_PN_SCOORZ ); 1293 1294 coorx = relCoordinate.x; 1295 coory = relCoordinate.y; 1296 coorz = relCoordinate.z; 1297 } 1298 1299 if ( flags & __FLAG_ROT ) 1300 { 1301 1302 PRINTF(0)("SEND QUAT: %f %f %f %f\n", this->absDirection.w, this->absDirection.v.x, this->absDirection.v.y, this->absDirection.v.z); 1303 1304 SYNCHELP_WRITE_FLOAT( this->absDirection.w, NWT_PN_SROTV ); 1305 SYNCHELP_WRITE_FLOAT( this->absDirection.v.x, NWT_PN_SROTX ); 1306 SYNCHELP_WRITE_FLOAT( this->absDirection.v.y, NWT_PN_SROTY ); 1307 SYNCHELP_WRITE_FLOAT( this->absDirection.v.z, NWT_PN_SROTZ ); 1308 1309 rotw = absDirection.w; 1310 rotx = absDirection.v.x; 1311 roty = absDirection.v.y; 1312 rotz = absDirection.v.z; 1313 } 1314 1315 return SYNCHELP_WRITE_N; 1316 } 1317 1318 bool PNode::needsReadSync( ) 1319 { 1320 if ( fabs( coorx - relCoordinate.x ) > __OFFSET_POS*0.05*this->velocity.len() || 1321 fabs( coory - relCoordinate.y ) > __OFFSET_POS*0.05*this->velocity.len() || 1322 fabs( coorz - relCoordinate.z ) > __OFFSET_POS*0.05*this->velocity.len() ) 1323 return true; 1324 1325 if ( fabs( rotw - absDirection.w ) > __OFFSET_ROT || 1326 fabs( rotx - absDirection.v.x ) > __OFFSET_ROT || 1327 fabs( roty - absDirection.v.y ) > __OFFSET_ROT || 1328 fabs( rotz - absDirection.v.z ) > __OFFSET_ROT ) 1329 return true; 1330 1331 return false; 1332 } 1082 * handles changes in synchronizable variables 1083 * @param id id's which changed 1084 */ 1085 void PNode::varChangeHandler( std::list< int > & id ) 1086 { 1087 if ( std::find( id.begin(), id.end(), relCoordinate_handle ) != id.end() ) 1088 { 1089 setRelCoor( relCoordinate_write ); 1090 } 1091 1092 if ( std::find( id.begin(), id.end(), relDirection_handle ) != id.end() ) 1093 { 1094 setRelDir( relDirection_write ); 1095 } 1096 } 1097 1098 -
trunk/src/lib/coord/p_node.h
r7725 r7954 186 186 float distance(const PNode* node) const { return (this->getAbsCoor() - node->getAbsCoor()).len(); }; 187 187 188 int writeState(const byte* data, int length, int sender);189 int readState(byte* data, int maxLength );190 int writeSync(const byte* data, int length, int sender);191 int readSync(byte* data, int maxLength );192 bool needsReadSync();193 194 188 private: 195 189 /** tells the child that the parent's Coordinate has changed */ … … 243 237 float roty; 244 238 float rotz; 239 240 private: 241 int relCoordinate_handle; 242 int relDirection_handle; 243 Vector relCoordinate_write; 244 Quaternion relDirection_write; 245 246 public: 247 virtual void varChangeHandler( std::list<int> & id ); 245 248 }; 246 249
Note: See TracChangeset
for help on using the changeset viewer.