// called on the other nodes - assigns it to my views of the others int OctreeQuery::parseData(ReceivedMessage& message) { const unsigned char* startPosition = reinterpret_cast<const unsigned char*>(message.getRawMessage()); const unsigned char* sourceBuffer = startPosition; // unpack the connection ID uint16_t newConnectionID; memcpy(&newConnectionID, sourceBuffer, sizeof(newConnectionID)); sourceBuffer += sizeof(newConnectionID); if (!_hasReceivedFirstQuery) { // set our flag to indicate that we've parsed for this query at least once _hasReceivedFirstQuery = true; // set the incoming connection ID as the current _connectionID = newConnectionID; } else { if (newConnectionID != _connectionID) { // the connection ID has changed - emit our signal so the server // knows that the client is starting a new session _connectionID = newConnectionID; emit incomingConnectionIDChanged(); } } // check if this query uses a view frustum uint8_t numFrustums = 0; memcpy(&numFrustums, sourceBuffer, sizeof(numFrustums)); sourceBuffer += sizeof(numFrustums); { QMutexLocker lock(&_conicalViewsLock); _conicalViews.clear(); for (int i = 0; i < numFrustums; ++i) { ConicalViewFrustum view; sourceBuffer += view.deserialize(sourceBuffer); _conicalViews.push_back(view); } } // desired Max Octree PPS memcpy(&_maxQueryPPS, sourceBuffer, sizeof(_maxQueryPPS)); sourceBuffer += sizeof(_maxQueryPPS); // desired _octreeElementSizeScale memcpy(&_octreeElementSizeScale, sourceBuffer, sizeof(_octreeElementSizeScale)); sourceBuffer += sizeof(_octreeElementSizeScale); // desired boundaryLevelAdjust memcpy(&_boundaryLevelAdjust, sourceBuffer, sizeof(_boundaryLevelAdjust)); sourceBuffer += sizeof(_boundaryLevelAdjust); // check if we have a packed JSON filter uint16_t binaryParametersBytes; memcpy(&binaryParametersBytes, sourceBuffer, sizeof(binaryParametersBytes)); sourceBuffer += sizeof(binaryParametersBytes); if (binaryParametersBytes > 0) { // unpack the binary JSON parameters QByteArray binaryJSONParameters { binaryParametersBytes, 0 }; memcpy(binaryJSONParameters.data(), sourceBuffer, binaryParametersBytes); sourceBuffer += binaryParametersBytes; // grab the parameter object from the packed binary representation of JSON auto newJsonDocument = QJsonDocument::fromBinaryData(binaryJSONParameters); QWriteLocker jsonParameterLocker { &_jsonParametersLock }; _jsonParameters = newJsonDocument.object(); } OctreeQueryFlags queryFlags; memcpy(&queryFlags, sourceBuffer, sizeof(queryFlags)); sourceBuffer += sizeof(queryFlags); _reportInitialCompletion = bool(queryFlags & OctreeQueryFlags::WantInitialCompletion); return sourceBuffer - startPosition; }
// called on the other nodes - assigns it to my views of the others int OctreeQuery::parseData(ReceivedMessage& message) { const unsigned char* startPosition = reinterpret_cast<const unsigned char*>(message.getRawMessage()); const unsigned char* sourceBuffer = startPosition; // unpack the connection ID uint16_t newConnectionID; memcpy(&newConnectionID, sourceBuffer, sizeof(newConnectionID)); sourceBuffer += sizeof(newConnectionID); if (!_hasReceivedFirstQuery) { // set our flag to indicate that we've parsed for this query at least once _hasReceivedFirstQuery = true; // set the incoming connection ID as the current _connectionID = newConnectionID; } else { if (newConnectionID != _connectionID) { // the connection ID has changed - emit our signal so the server // knows that the client is starting a new session _connectionID = newConnectionID; emit incomingConnectionIDChanged(); } } // check if this query uses a view frustum memcpy(&_usesFrustum, sourceBuffer, sizeof(_usesFrustum)); sourceBuffer += sizeof(_usesFrustum); if (_usesFrustum) { // unpack camera details memcpy(&_cameraPosition, sourceBuffer, sizeof(_cameraPosition)); sourceBuffer += sizeof(_cameraPosition); sourceBuffer += unpackOrientationQuatFromBytes(sourceBuffer, _cameraOrientation); sourceBuffer += unpackFloatAngleFromTwoByte((uint16_t*) sourceBuffer, &_cameraFov); sourceBuffer += unpackFloatRatioFromTwoByte(sourceBuffer,_cameraAspectRatio); sourceBuffer += unpackClipValueFromTwoByte(sourceBuffer,_cameraNearClip); sourceBuffer += unpackClipValueFromTwoByte(sourceBuffer,_cameraFarClip); memcpy(&_cameraEyeOffsetPosition, sourceBuffer, sizeof(_cameraEyeOffsetPosition)); sourceBuffer += sizeof(_cameraEyeOffsetPosition); } // desired Max Octree PPS memcpy(&_maxQueryPPS, sourceBuffer, sizeof(_maxQueryPPS)); sourceBuffer += sizeof(_maxQueryPPS); // desired _octreeElementSizeScale memcpy(&_octreeElementSizeScale, sourceBuffer, sizeof(_octreeElementSizeScale)); sourceBuffer += sizeof(_octreeElementSizeScale); // desired boundaryLevelAdjust memcpy(&_boundaryLevelAdjust, sourceBuffer, sizeof(_boundaryLevelAdjust)); sourceBuffer += sizeof(_boundaryLevelAdjust); memcpy(&_cameraCenterRadius, sourceBuffer, sizeof(_cameraCenterRadius)); sourceBuffer += sizeof(_cameraCenterRadius); // check if we have a packed JSON filter uint16_t binaryParametersBytes; memcpy(&binaryParametersBytes, sourceBuffer, sizeof(binaryParametersBytes)); sourceBuffer += sizeof(binaryParametersBytes); if (binaryParametersBytes > 0) { // unpack the binary JSON parameters QByteArray binaryJSONParameters { binaryParametersBytes, 0 }; memcpy(binaryJSONParameters.data(), sourceBuffer, binaryParametersBytes); sourceBuffer += binaryParametersBytes; // grab the parameter object from the packed binary representation of JSON auto newJsonDocument = QJsonDocument::fromBinaryData(binaryJSONParameters); QWriteLocker jsonParameterLocker { &_jsonParametersLock }; _jsonParameters = newJsonDocument.object(); } return sourceBuffer - startPosition; }