only send PACKET_TYPE_VOXEL_QUERY to voxel servers in view

This commit is contained in:
ZappoMan 2013-10-24 18:37:31 -07:00
parent 76fb3c18a2
commit 37584244e6

View file

@ -2362,18 +2362,56 @@ void Application::queryVoxels() {
for (NodeList::iterator node = nodeList->begin(); node != nodeList->end(); node++) {
// only send to the NodeTypes that are NODE_TYPE_VOXEL_SERVER
if (node->getActiveSocket() != NULL && node->getType() == NODE_TYPE_VOXEL_SERVER) {
voxelServerCount++;
// get the server bounds for this server
QUuid nodeUUID = node->getUUID();
const JurisdictionMap& map = (_voxelServerJurisdictions)[nodeUUID];
unsigned char* rootCode = map.getRootOctalCode();
if (rootCode) {
VoxelPositionSize rootDetails;
voxelDetailsForCode(rootCode, rootDetails);
AABox serverBounds(glm::vec3(rootDetails.x, rootDetails.y, rootDetails.z), rootDetails.s);
serverBounds.scale(TREE_SCALE);
ViewFrustum::location serverFrustumLocation = _viewFrustum.boxInFrustum(serverBounds);
/**
printf("queryVoxels()... checking to server UUID=%s bounds=[%f, %f, %f, %f] ",
node->getUUID().toString().toLocal8Bit().constData(),
rootDetails.x, rootDetails.y, rootDetails.z, rootDetails.s);
switch (serverFrustumLocation) {
case ViewFrustum::OUTSIDE: {
printf("location=ViewFrustum::OUTSIDE\n");
} break;
case ViewFrustum::INSIDE: {
printf("location=ViewFrustum::INSIDE\n");
} break;
case ViewFrustum::INTERSECT: {
printf("location=ViewFrustum::INTERSECT\n");
} break;
}
**/
if (serverFrustumLocation != ViewFrustum::OUTSIDE) {
voxelServerCount++;
}
}
}
}
// make sure there's at least one voxel server
if (voxelServerCount < 1) {
//printf("queryVoxels()... no servers in view, not sending PACKET_TYPE_VOXEL_QUERY\n");
return; // no voxel servers to talk to, we can bail.
}
// set our preferred PPS to be exactly evenly divided among all of the voxel servers...
int perServerPPS = DEFAULT_MAX_VOXEL_PPS/voxelServerCount;
printf("queryVoxels()... perServerPPS=%d\n",perServerPPS);
//printf("queryVoxels()... perServerPPS=%d\n",perServerPPS);
_voxelQuery.setMaxVoxelPacketsPerSecond(perServerPPS);
@ -2382,28 +2420,49 @@ void Application::queryVoxels() {
// only send to the NodeTypes that are NODE_TYPE_VOXEL_SERVER
if (node->getActiveSocket() != NULL && node->getType() == NODE_TYPE_VOXEL_SERVER) {
// we can use this to get the voxel server details
//QUuid nodeUUID = node->getUUID();
//const JurisdictionMap& map = (_voxelServerJurisdictions)[nodeUUID];
// set up the packet for sending...
unsigned char* endOfVoxelQueryPacket = voxelQueryPacket;
// get the server bounds for this server
QUuid nodeUUID = node->getUUID();
const JurisdictionMap& map = (_voxelServerJurisdictions)[nodeUUID];
// insert packet type/version and node UUID
endOfVoxelQueryPacket += populateTypeAndVersion(endOfVoxelQueryPacket, PACKET_TYPE_VOXEL_QUERY);
QByteArray ownerUUID = nodeList->getOwnerUUID().toRfc4122();
memcpy(endOfVoxelQueryPacket, ownerUUID.constData(), ownerUUID.size());
endOfVoxelQueryPacket += ownerUUID.size();
// encode the query data...
endOfVoxelQueryPacket += _voxelQuery.getBroadcastData(endOfVoxelQueryPacket);
unsigned char* rootCode = map.getRootOctalCode();
int packetLength = endOfVoxelQueryPacket - voxelQueryPacket;
if (rootCode) {
VoxelPositionSize rootDetails;
voxelDetailsForCode(rootCode, rootDetails);
AABox serverBounds(glm::vec3(rootDetails.x, rootDetails.y, rootDetails.z), rootDetails.s);
serverBounds.scale(TREE_SCALE);
nodeSocket->send(node->getActiveSocket(), voxelQueryPacket, packetLength);
ViewFrustum::location serverFrustumLocation = _viewFrustum.boxInFrustum(serverBounds);
if (serverFrustumLocation != ViewFrustum::OUTSIDE) {
/**
printf("queryVoxels()... sending PACKET_TYPE_VOXEL_QUERY to server UUID=%s bounds=[%f, %f, %f, %f] PPS=%d\n",
node->getUUID().toString().toLocal8Bit().constData(),
rootDetails.x, rootDetails.y, rootDetails.z, rootDetails.s, perServerPPS);
**/
// set up the packet for sending...
unsigned char* endOfVoxelQueryPacket = voxelQueryPacket;
// Feed number of bytes to corresponding channel of the bandwidth meter
_bandwidthMeter.outputStream(BandwidthMeter::VOXELS).updateValue(packetLength);
// insert packet type/version and node UUID
endOfVoxelQueryPacket += populateTypeAndVersion(endOfVoxelQueryPacket, PACKET_TYPE_VOXEL_QUERY);
QByteArray ownerUUID = nodeList->getOwnerUUID().toRfc4122();
memcpy(endOfVoxelQueryPacket, ownerUUID.constData(), ownerUUID.size());
endOfVoxelQueryPacket += ownerUUID.size();
// encode the query data...
endOfVoxelQueryPacket += _voxelQuery.getBroadcastData(endOfVoxelQueryPacket);
int packetLength = endOfVoxelQueryPacket - voxelQueryPacket;
nodeSocket->send(node->getActiveSocket(), voxelQueryPacket, packetLength);
// Feed number of bytes to corresponding channel of the bandwidth meter
_bandwidthMeter.outputStream(BandwidthMeter::VOXELS).updateValue(packetLength);
}
}
}
}
}