mirror of
https://github.com/overte-org/overte.git
synced 2025-08-09 03:17:02 +02:00
fix to how voxel servers are queried when they have no known jurisdiction
This commit is contained in:
parent
ee39898891
commit
af1047f5e0
1 changed files with 98 additions and 49 deletions
|
@ -2391,39 +2391,63 @@ void Application::queryVoxels() {
|
||||||
NodeList* nodeList = NodeList::getInstance();
|
NodeList* nodeList = NodeList::getInstance();
|
||||||
|
|
||||||
// Iterate all of the nodes, and get a count of how many voxel servers we have...
|
// Iterate all of the nodes, and get a count of how many voxel servers we have...
|
||||||
int voxelServerCount = 0;
|
int totalServers = 0;
|
||||||
|
int inViewServers = 0;
|
||||||
|
int unknownJurisdictionServers = 0;
|
||||||
|
|
||||||
for (NodeList::iterator node = nodeList->begin(); node != nodeList->end(); node++) {
|
for (NodeList::iterator node = nodeList->begin(); node != nodeList->end(); node++) {
|
||||||
// only send to the NodeTypes that are NODE_TYPE_VOXEL_SERVER
|
// only send to the NodeTypes that are NODE_TYPE_VOXEL_SERVER
|
||||||
if (node->getActiveSocket() != NULL && node->getType() == NODE_TYPE_VOXEL_SERVER) {
|
if (node->getActiveSocket() != NULL && node->getType() == NODE_TYPE_VOXEL_SERVER) {
|
||||||
|
totalServers++;
|
||||||
|
|
||||||
// get the server bounds for this server
|
// get the server bounds for this server
|
||||||
QUuid nodeUUID = node->getUUID();
|
QUuid nodeUUID = node->getUUID();
|
||||||
const JurisdictionMap& map = (_voxelServerJurisdictions)[nodeUUID];
|
|
||||||
|
|
||||||
unsigned char* rootCode = map.getRootOctalCode();
|
|
||||||
|
|
||||||
if (rootCode) {
|
// if we haven't heard from this voxel server, go ahead and send it a query, so we
|
||||||
VoxelPositionSize rootDetails;
|
// can get the jurisdiction...
|
||||||
voxelDetailsForCode(rootCode, rootDetails);
|
if (_voxelServerJurisdictions.find(nodeUUID) == _voxelServerJurisdictions.end()) {
|
||||||
AABox serverBounds(glm::vec3(rootDetails.x, rootDetails.y, rootDetails.z), rootDetails.s);
|
unknownJurisdictionServers++;
|
||||||
serverBounds.scale(TREE_SCALE);
|
} else {
|
||||||
|
const JurisdictionMap& map = (_voxelServerJurisdictions)[nodeUUID];
|
||||||
|
|
||||||
ViewFrustum::location serverFrustumLocation = _viewFrustum.boxInFrustum(serverBounds);
|
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);
|
||||||
|
|
||||||
if (serverFrustumLocation != ViewFrustum::OUTSIDE) {
|
ViewFrustum::location serverFrustumLocation = _viewFrustum.boxInFrustum(serverBounds);
|
||||||
voxelServerCount++;
|
|
||||||
|
if (serverFrustumLocation != ViewFrustum::OUTSIDE) {
|
||||||
|
inViewServers++;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//qDebug("Servers: total %d, in view %d, unknown jurisdiction %d \n",
|
||||||
|
// totalServers, inViewServers, unknownJurisdictionServers);
|
||||||
|
|
||||||
// assume there's at least one voxel server
|
int perServerPPS;
|
||||||
if (voxelServerCount < 1) {
|
const int SMALL_BUDGET = 10;
|
||||||
voxelServerCount = 1;
|
int perUnknownServer = SMALL_BUDGET;
|
||||||
|
|
||||||
|
// determine PPS based on number of servers
|
||||||
|
if (inViewServers >= 1) {
|
||||||
|
// set our preferred PPS to be exactly evenly divided among all of the voxel servers... and allocate 1 PPS
|
||||||
|
// for each unknown jurisdiction server
|
||||||
|
perServerPPS = (DEFAULT_MAX_VOXEL_PPS/inViewServers) - (unknownJurisdictionServers * SMALL_BUDGET);
|
||||||
|
} else {
|
||||||
|
perServerPPS = 0;
|
||||||
|
if (unknownJurisdictionServers > 0) {
|
||||||
|
perUnknownServer = (DEFAULT_MAX_VOXEL_PPS/unknownJurisdictionServers);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// set our preferred PPS to be exactly evenly divided among all of the voxel servers...
|
//qDebug("perServerPPS: %d perUnknownServer: %d\n", perServerPPS, perUnknownServer);
|
||||||
int perServerPPS = DEFAULT_MAX_VOXEL_PPS/voxelServerCount;
|
|
||||||
|
|
||||||
UDPSocket* nodeSocket = NodeList::getInstance()->getNodeSocket();
|
UDPSocket* nodeSocket = NodeList::getInstance()->getNodeSocket();
|
||||||
for (NodeList::iterator node = nodeList->begin(); node != nodeList->end(); node++) {
|
for (NodeList::iterator node = nodeList->begin(); node != nodeList->end(); node++) {
|
||||||
|
@ -2433,44 +2457,69 @@ void Application::queryVoxels() {
|
||||||
|
|
||||||
// get the server bounds for this server
|
// get the server bounds for this server
|
||||||
QUuid nodeUUID = node->getUUID();
|
QUuid nodeUUID = node->getUUID();
|
||||||
const JurisdictionMap& map = (_voxelServerJurisdictions)[nodeUUID];
|
|
||||||
|
|
||||||
unsigned char* rootCode = map.getRootOctalCode();
|
bool inView = false;
|
||||||
|
bool unknownView = false;
|
||||||
|
|
||||||
if (rootCode) {
|
// if we haven't heard from this voxel server, go ahead and send it a query, so we
|
||||||
VoxelPositionSize rootDetails;
|
// can get the jurisdiction...
|
||||||
voxelDetailsForCode(rootCode, rootDetails);
|
if (_voxelServerJurisdictions.find(nodeUUID) == _voxelServerJurisdictions.end()) {
|
||||||
AABox serverBounds(glm::vec3(rootDetails.x, rootDetails.y, rootDetails.z), rootDetails.s);
|
unknownView = true; // assume it's in view
|
||||||
serverBounds.scale(TREE_SCALE);
|
//qDebug() << "no known jurisdiction for node " << *node << ", assume it's visible.\n";
|
||||||
|
} else {
|
||||||
|
const JurisdictionMap& map = (_voxelServerJurisdictions)[nodeUUID];
|
||||||
|
|
||||||
ViewFrustum::location serverFrustumLocation = _viewFrustum.boxInFrustum(serverBounds);
|
unsigned char* rootCode = map.getRootOctalCode();
|
||||||
|
|
||||||
if (serverFrustumLocation != ViewFrustum::OUTSIDE) {
|
if (rootCode) {
|
||||||
//printf("_voxelQuery.setMaxVoxelPacketsPerSecond(perServerPPS=%d)\n",perServerPPS);
|
VoxelPositionSize rootDetails;
|
||||||
_voxelQuery.setMaxVoxelPacketsPerSecond(perServerPPS);
|
voxelDetailsForCode(rootCode, rootDetails);
|
||||||
} else {
|
AABox serverBounds(glm::vec3(rootDetails.x, rootDetails.y, rootDetails.z), rootDetails.s);
|
||||||
//printf("_voxelQuery.setMaxVoxelPacketsPerSecond(0)\n");
|
serverBounds.scale(TREE_SCALE);
|
||||||
_voxelQuery.setMaxVoxelPacketsPerSecond(0);
|
|
||||||
|
ViewFrustum::location serverFrustumLocation = _viewFrustum.boxInFrustum(serverBounds);
|
||||||
|
if (serverFrustumLocation != ViewFrustum::OUTSIDE) {
|
||||||
|
inView = true;
|
||||||
|
} else {
|
||||||
|
inView = false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
// set up the packet for sending...
|
|
||||||
unsigned char* endOfVoxelQueryPacket = voxelQueryPacket;
|
|
||||||
|
|
||||||
// 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);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (inView) {
|
||||||
|
_voxelQuery.setMaxVoxelPacketsPerSecond(perServerPPS);
|
||||||
|
} else if (unknownView) {
|
||||||
|
//qDebug() << "no known jurisdiction for node " << *node << ", give it budget of "
|
||||||
|
// << perUnknownServer << " to send us jurisdiction.\n";
|
||||||
|
|
||||||
|
// set the query's position/orientation to be degenerate in a manner that will get the scene quickly
|
||||||
|
_voxelQuery.setCameraPosition(glm::vec3(-0.1,-0.1,-0.1));
|
||||||
|
const glm::quat OFF_IN_NEGATIVE_SPACE = glm::quat(-0.5, 0, -0.5, 1.0);
|
||||||
|
_voxelQuery.setCameraOrientation(OFF_IN_NEGATIVE_SPACE);
|
||||||
|
_voxelQuery.setCameraNearClip(0.1);
|
||||||
|
_voxelQuery.setCameraFarClip(0.1);
|
||||||
|
_voxelQuery.setMaxVoxelPacketsPerSecond(perUnknownServer);
|
||||||
|
} else {
|
||||||
|
_voxelQuery.setMaxVoxelPacketsPerSecond(0);
|
||||||
|
}
|
||||||
|
// set up the packet for sending...
|
||||||
|
unsigned char* endOfVoxelQueryPacket = voxelQueryPacket;
|
||||||
|
|
||||||
|
// 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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue