From 22190c1340aac18ba59b0c653482740eea101cef Mon Sep 17 00:00:00 2001 From: barnold1953 Date: Thu, 22 May 2014 17:55:25 -0700 Subject: [PATCH 01/14] Made overlays thread safe for write operations, which solved a script crash. --- interface/src/ui/overlays/Overlays.cpp | 6 +++--- interface/src/ui/overlays/Overlays.h | 1 + 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/interface/src/ui/overlays/Overlays.cpp b/interface/src/ui/overlays/Overlays.cpp index 9e4a594bbc..6c6f150ae7 100644 --- a/interface/src/ui/overlays/Overlays.cpp +++ b/interface/src/ui/overlays/Overlays.cpp @@ -96,7 +96,6 @@ void Overlays::render3D() { } } -// TODO: make multi-threaded safe unsigned int Overlays::addOverlay(const QString& type, const QScriptValue& properties) { unsigned int thisID = 0; bool created = false; @@ -140,6 +139,7 @@ unsigned int Overlays::addOverlay(const QString& type, const QScriptValue& prope } if (created) { + QWriteLocker lock(&_lock); thisID = _nextOverlayID; _nextOverlayID++; if (is3D) { @@ -152,9 +152,9 @@ unsigned int Overlays::addOverlay(const QString& type, const QScriptValue& prope return thisID; } -// TODO: make multi-threaded safe bool Overlays::editOverlay(unsigned int id, const QScriptValue& properties) { Overlay* thisOverlay = NULL; + QWriteLocker lock(&_lock); if (_overlays2D.contains(id)) { thisOverlay = _overlays2D[id]; } else if (_overlays3D.contains(id)) { @@ -167,9 +167,9 @@ bool Overlays::editOverlay(unsigned int id, const QScriptValue& properties) { return false; } -// TODO: make multi-threaded safe void Overlays::deleteOverlay(unsigned int id) { Overlay* overlayToDelete; + QWriteLocker lock(&_lock); if (_overlays2D.contains(id)) { overlayToDelete = _overlays2D.take(id); } else if (_overlays3D.contains(id)) { diff --git a/interface/src/ui/overlays/Overlays.h b/interface/src/ui/overlays/Overlays.h index b3477be0c2..20015b8af9 100644 --- a/interface/src/ui/overlays/Overlays.h +++ b/interface/src/ui/overlays/Overlays.h @@ -45,6 +45,7 @@ private: QList _overlaysToDelete; unsigned int _nextOverlayID; QGLWidget* _parent; + QReadWriteLock _lock; }; From 55ed3e98a5615e4b739407860b27e0a0779f1dce Mon Sep 17 00:00:00 2001 From: barnold1953 Date: Fri, 23 May 2014 10:44:40 -0700 Subject: [PATCH 02/14] Added some missing locks to make Overlays thread safe for reading as well. --- interface/src/ui/overlays/Overlays.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/interface/src/ui/overlays/Overlays.cpp b/interface/src/ui/overlays/Overlays.cpp index 6c6f150ae7..bcac86d7f1 100644 --- a/interface/src/ui/overlays/Overlays.cpp +++ b/interface/src/ui/overlays/Overlays.cpp @@ -39,6 +39,7 @@ void Overlays::init(QGLWidget* parent) { } void Overlays::update(float deltatime) { + QWriteLocker lock(&_lock); foreach (Overlay* thisOverlay, _overlays2D) { thisOverlay->update(deltatime); } @@ -52,12 +53,14 @@ void Overlays::update(float deltatime) { } void Overlays::render2D() { + QReadLocker lock(&_lock); foreach(Overlay* thisOverlay, _overlays2D) { thisOverlay->render(); } } void Overlays::render3D() { + QReadLocker lock(&_lock); if (_overlays3D.size() == 0) { return; } @@ -182,6 +185,7 @@ void Overlays::deleteOverlay(unsigned int id) { } unsigned int Overlays::getOverlayAtPoint(const glm::vec2& point) { + QReadLocker lock(&_lock); QMapIterator i(_overlays2D); i.toBack(); while (i.hasPrevious()) { From 495a54291c6fd01b889373fa7e8af6e44cfcac92 Mon Sep 17 00:00:00 2001 From: Andrzej Kapolka Date: Fri, 23 May 2014 10:57:14 -0700 Subject: [PATCH 03/14] Use local viewer model for specular. --- interface/resources/shaders/model.frag | 5 ++++- interface/resources/shaders/model.vert | 6 ++++++ interface/resources/shaders/model_normal_map.frag | 7 +++++-- interface/resources/shaders/model_normal_map.vert | 6 +++++- .../resources/shaders/model_normal_specular_map.frag | 7 +++++-- interface/resources/shaders/model_specular_map.frag | 5 ++++- interface/resources/shaders/skin_model.vert | 9 ++++++--- .../resources/shaders/skin_model_normal_map.vert | 11 +++++++---- 8 files changed, 42 insertions(+), 14 deletions(-) diff --git a/interface/resources/shaders/model.frag b/interface/resources/shaders/model.frag index a9d93f2f6a..488736abf9 100644 --- a/interface/resources/shaders/model.frag +++ b/interface/resources/shaders/model.frag @@ -14,6 +14,9 @@ // the diffuse texture uniform sampler2D diffuseMap; +// the interpolated position +varying vec4 position; + // the interpolated normal varying vec4 normal; @@ -26,7 +29,7 @@ void main(void) { gl_FrontLightProduct[0].diffuse * (diffuse * facingLight)); // compute the specular component (sans exponent) - float specular = facingLight * max(0.0, dot(normalize(gl_LightSource[0].position + vec4(0.0, 0.0, 1.0, 0.0)), + float specular = facingLight * max(0.0, dot(normalize(gl_LightSource[0].position - normalize(vec4(position.xyz, 0.0))), normalizedNormal)); // modulate texture by base color and add specular contribution diff --git a/interface/resources/shaders/model.vert b/interface/resources/shaders/model.vert index 904e3c2a8b..f78ed5045b 100644 --- a/interface/resources/shaders/model.vert +++ b/interface/resources/shaders/model.vert @@ -11,6 +11,9 @@ // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // +// the interpolated position +varying vec4 position; + // the interpolated normal varying vec4 normal; @@ -19,6 +22,9 @@ void main(void) { // transform and store the normal for interpolation normal = normalize(gl_ModelViewMatrix * vec4(gl_Normal, 0.0)); + // likewise with the position + position = gl_ModelViewMatrix * gl_Vertex; + // pass along the vertex color gl_FrontColor = gl_Color; diff --git a/interface/resources/shaders/model_normal_map.frag b/interface/resources/shaders/model_normal_map.frag index 392be1f1cf..8444f2d6ea 100644 --- a/interface/resources/shaders/model_normal_map.frag +++ b/interface/resources/shaders/model_normal_map.frag @@ -17,6 +17,9 @@ uniform sampler2D diffuseMap; // the normal map texture uniform sampler2D normalMap; +// the interpolated position +varying vec4 interpolatedPosition; + // the interpolated normal varying vec4 interpolatedNormal; @@ -38,8 +41,8 @@ void main(void) { gl_FrontLightProduct[0].diffuse * (diffuse * facingLight)); // compute the specular component (sans exponent) - float specular = facingLight * max(0.0, dot(normalize(gl_LightSource[0].position + vec4(0.0, 0.0, 1.0, 0.0)), - viewNormal)); + float specular = facingLight * max(0.0, dot(normalize(gl_LightSource[0].position - + normalize(vec4(vec3(interpolatedPosition), 0.0))), viewNormal)); // modulate texture by base color and add specular contribution gl_FragColor = base * texture2D(diffuseMap, gl_TexCoord[0].st) + diff --git a/interface/resources/shaders/model_normal_map.vert b/interface/resources/shaders/model_normal_map.vert index 3607501acf..b013a0a736 100644 --- a/interface/resources/shaders/model_normal_map.vert +++ b/interface/resources/shaders/model_normal_map.vert @@ -14,6 +14,9 @@ // the tangent vector attribute vec3 tangent; +// the interpolated position +varying vec4 interpolatedPosition; + // the interpolated normal varying vec4 interpolatedNormal; @@ -22,7 +25,8 @@ varying vec4 interpolatedTangent; void main(void) { - // transform and store the normal and tangent for interpolation + // transform and store the position, normal and tangent for interpolation + interpolatedPosition = gl_ModelViewMatrix * gl_Vertex; interpolatedNormal = gl_ModelViewMatrix * vec4(gl_Normal, 0.0); interpolatedTangent = gl_ModelViewMatrix * vec4(tangent, 0.0); diff --git a/interface/resources/shaders/model_normal_specular_map.frag b/interface/resources/shaders/model_normal_specular_map.frag index dbbb343c62..357677d82a 100644 --- a/interface/resources/shaders/model_normal_specular_map.frag +++ b/interface/resources/shaders/model_normal_specular_map.frag @@ -20,6 +20,9 @@ uniform sampler2D normalMap; // the specular map texture uniform sampler2D specularMap; +// the interpolated position +varying vec4 interpolatedPosition; + // the interpolated normal varying vec4 interpolatedNormal; @@ -41,8 +44,8 @@ void main(void) { gl_FrontLightProduct[0].diffuse * (diffuse * facingLight)); // compute the specular component (sans exponent) - float specular = facingLight * max(0.0, dot(normalize(gl_LightSource[0].position + vec4(0.0, 0.0, 1.0, 0.0)), - viewNormal)); + float specular = facingLight * max(0.0, dot(normalize(gl_LightSource[0].position - + normalize(vec4(interpolatedPosition.xyz, 0.0))), viewNormal)); // modulate texture by base color and add specular contribution gl_FragColor = base * texture2D(diffuseMap, gl_TexCoord[0].st) + vec4(pow(specular, gl_FrontMaterial.shininess) * diff --git a/interface/resources/shaders/model_specular_map.frag b/interface/resources/shaders/model_specular_map.frag index b955b5cfa6..a07324cd1b 100644 --- a/interface/resources/shaders/model_specular_map.frag +++ b/interface/resources/shaders/model_specular_map.frag @@ -17,6 +17,9 @@ uniform sampler2D diffuseMap; // the specular texture uniform sampler2D specularMap; +// the interpolated position in view space +varying vec4 position; + // the interpolated normal varying vec4 normal; @@ -29,7 +32,7 @@ void main(void) { gl_FrontLightProduct[0].diffuse * (diffuse * facingLight)); // compute the specular component (sans exponent) - float specular = facingLight * max(0.0, dot(normalize(gl_LightSource[0].position + vec4(0.0, 0.0, 1.0, 0.0)), + float specular = facingLight * max(0.0, dot(normalize(gl_LightSource[0].position - normalize(vec4(position.xyz, 0.0))), normalizedNormal)); // modulate texture by base color and add specular contribution diff --git a/interface/resources/shaders/skin_model.vert b/interface/resources/shaders/skin_model.vert index 12320ba9a9..f743609dc3 100644 --- a/interface/resources/shaders/skin_model.vert +++ b/interface/resources/shaders/skin_model.vert @@ -19,11 +19,14 @@ uniform mat4 clusterMatrices[MAX_CLUSTERS]; attribute vec4 clusterIndices; attribute vec4 clusterWeights; +// the interpolated position +varying vec4 position; + // the interpolated normal varying vec4 normal; void main(void) { - vec4 position = vec4(0.0, 0.0, 0.0, 0.0); + position = vec4(0.0, 0.0, 0.0, 0.0); normal = vec4(0.0, 0.0, 0.0, 0.0); for (int i = 0; i < INDICES_PER_VERTEX; i++) { mat4 clusterMatrix = clusterMatrices[int(clusterIndices[i])]; @@ -31,7 +34,7 @@ void main(void) { position += clusterMatrix * gl_Vertex * clusterWeight; normal += clusterMatrix * vec4(gl_Normal, 0.0) * clusterWeight; } - position = gl_ModelViewProjectionMatrix * position; + position = gl_ModelViewMatrix * position; normal = normalize(gl_ModelViewMatrix * normal); // pass along the vertex color @@ -40,5 +43,5 @@ void main(void) { // and the texture coordinates gl_TexCoord[0] = gl_MultiTexCoord0; - gl_Position = position; + gl_Position = gl_ProjectionMatrix * position; } diff --git a/interface/resources/shaders/skin_model_normal_map.vert b/interface/resources/shaders/skin_model_normal_map.vert index 872cbe2fc3..5dbc32626a 100644 --- a/interface/resources/shaders/skin_model_normal_map.vert +++ b/interface/resources/shaders/skin_model_normal_map.vert @@ -22,6 +22,9 @@ attribute vec3 tangent; attribute vec4 clusterIndices; attribute vec4 clusterWeights; +// the interpolated position +varying vec4 interpolatedPosition; + // the interpolated normal varying vec4 interpolatedNormal; @@ -29,17 +32,17 @@ varying vec4 interpolatedNormal; varying vec4 interpolatedTangent; void main(void) { - vec4 position = vec4(0.0, 0.0, 0.0, 0.0); + interpolatedPosition = vec4(0.0, 0.0, 0.0, 0.0); interpolatedNormal = vec4(0.0, 0.0, 0.0, 0.0); interpolatedTangent = vec4(0.0, 0.0, 0.0, 0.0); for (int i = 0; i < INDICES_PER_VERTEX; i++) { mat4 clusterMatrix = clusterMatrices[int(clusterIndices[i])]; float clusterWeight = clusterWeights[i]; - position += clusterMatrix * gl_Vertex * clusterWeight; + interpolatedPosition += clusterMatrix * gl_Vertex * clusterWeight; interpolatedNormal += clusterMatrix * vec4(gl_Normal, 0.0) * clusterWeight; interpolatedTangent += clusterMatrix * vec4(tangent, 0.0) * clusterWeight; } - position = gl_ModelViewProjectionMatrix * position; + interpolatedPosition = gl_ModelViewMatrix * interpolatedPosition; interpolatedNormal = gl_ModelViewMatrix * interpolatedNormal; interpolatedTangent = gl_ModelViewMatrix * interpolatedTangent; @@ -49,5 +52,5 @@ void main(void) { // and the texture coordinates gl_TexCoord[0] = gl_MultiTexCoord0; - gl_Position = position; + gl_Position = gl_ProjectionMatrix * interpolatedPosition; } From 38ae1f3be329c5c2a26aa4dae672f7d1d4326cad Mon Sep 17 00:00:00 2001 From: barnold1953 Date: Fri, 23 May 2014 11:17:55 -0700 Subject: [PATCH 04/14] Added a new lock specific to deleting, and improved safety --- interface/src/ui/overlays/Overlays.cpp | 43 ++++++++++++++++---------- interface/src/ui/overlays/Overlays.h | 1 + 2 files changed, 28 insertions(+), 16 deletions(-) diff --git a/interface/src/ui/overlays/Overlays.cpp b/interface/src/ui/overlays/Overlays.cpp index bcac86d7f1..da7b05ead7 100644 --- a/interface/src/ui/overlays/Overlays.cpp +++ b/interface/src/ui/overlays/Overlays.cpp @@ -39,15 +39,22 @@ void Overlays::init(QGLWidget* parent) { } void Overlays::update(float deltatime) { - QWriteLocker lock(&_lock); - foreach (Overlay* thisOverlay, _overlays2D) { - thisOverlay->update(deltatime); + + { + QWriteLocker lock(&_lock); + foreach(Overlay* thisOverlay, _overlays2D) { + thisOverlay->update(deltatime); + } + foreach(Overlay* thisOverlay, _overlays3D) { + thisOverlay->update(deltatime); + } } - foreach (Overlay* thisOverlay, _overlays3D) { - thisOverlay->update(deltatime); - } - while (!_overlaysToDelete.isEmpty()) { - delete _overlaysToDelete.takeLast(); + + if (!_overlaysToDelete.isEmpty()) { + QWriteLocker lock(&_deleteLock); + do { + delete _overlaysToDelete.takeLast(); + } while (!_overlaysToDelete.isEmpty()); } } @@ -172,15 +179,19 @@ bool Overlays::editOverlay(unsigned int id, const QScriptValue& properties) { void Overlays::deleteOverlay(unsigned int id) { Overlay* overlayToDelete; - QWriteLocker lock(&_lock); - if (_overlays2D.contains(id)) { - overlayToDelete = _overlays2D.take(id); - } else if (_overlays3D.contains(id)) { - overlayToDelete = _overlays3D.take(id); - } else { - return; + + { + QWriteLocker lock(&_lock); + if (_overlays2D.contains(id)) { + overlayToDelete = _overlays2D.take(id); + } else if (_overlays3D.contains(id)) { + overlayToDelete = _overlays3D.take(id); + } else { + return; + } } - + + QWriteLocker lock(&_deleteLock); _overlaysToDelete.push_back(overlayToDelete); } diff --git a/interface/src/ui/overlays/Overlays.h b/interface/src/ui/overlays/Overlays.h index 20015b8af9..2fbdb993f4 100644 --- a/interface/src/ui/overlays/Overlays.h +++ b/interface/src/ui/overlays/Overlays.h @@ -46,6 +46,7 @@ private: unsigned int _nextOverlayID; QGLWidget* _parent; QReadWriteLock _lock; + QReadWriteLock _deleteLock; }; From e89d33dc60f560042c35ec81db4074515ceb2833 Mon Sep 17 00:00:00 2001 From: wangyix Date: Tue, 27 May 2014 18:02:49 -0700 Subject: [PATCH 05/14] added if to not track ParticleErase packets --- .../src/octree/OctreeQueryNode.cpp | 14 +++++++ .../src/octree/OctreeQueryNode.h | 2 + .../src/octree/OctreeSendThread.cpp | 10 ++++- interface/src/Application.cpp | 7 +++- interface/src/voxels/VoxelPacketProcessor.cpp | 3 +- libraries/networking/src/LimitedNodeList.cpp | 38 +++++++++++++++++++ libraries/octree/src/OctreeSceneStats.cpp | 21 ++++++---- libraries/octree/src/OctreeSceneStats.h | 2 +- 8 files changed, 86 insertions(+), 11 deletions(-) diff --git a/assignment-client/src/octree/OctreeQueryNode.cpp b/assignment-client/src/octree/OctreeQueryNode.cpp index ede6dee5e3..f56a96d367 100644 --- a/assignment-client/src/octree/OctreeQueryNode.cpp +++ b/assignment-client/src/octree/OctreeQueryNode.cpp @@ -365,4 +365,18 @@ void OctreeQueryNode::dumpOutOfView() { void OctreeQueryNode::incrementSequenceNumber() { _sequenceNumber++; +} + +void OctreeQueryNode::updatePacketTimestamp() { + + int numBytesPacketHeader = populatePacketHeader(reinterpret_cast(_octreePacket), _myPacketType); + _octreePacketAt = _octreePacket + numBytesPacketHeader; + _octreePacketAt += sizeof(OCTREE_PACKET_FLAGS); + _octreePacketAt += sizeof(OCTREE_PACKET_SEQUENCE); + + // pack in timestamp + OCTREE_PACKET_SENT_TIME now = usecTimestampNow(); + OCTREE_PACKET_SENT_TIME* timeAt = (OCTREE_PACKET_SENT_TIME*)_octreePacketAt; + *timeAt = now; + } \ No newline at end of file diff --git a/assignment-client/src/octree/OctreeQueryNode.h b/assignment-client/src/octree/OctreeQueryNode.h index 1bb3a72a0c..a1a8aa4a66 100644 --- a/assignment-client/src/octree/OctreeQueryNode.h +++ b/assignment-client/src/octree/OctreeQueryNode.h @@ -101,6 +101,8 @@ public: bool isShuttingDown() const { return _isShuttingDown; } void incrementSequenceNumber(); + + void updatePacketTimestamp(); private slots: void sendThreadFinished(); diff --git a/assignment-client/src/octree/OctreeSendThread.cpp b/assignment-client/src/octree/OctreeSendThread.cpp index 8d6803adac..c98c8c77b8 100644 --- a/assignment-client/src/octree/OctreeSendThread.cpp +++ b/assignment-client/src/octree/OctreeSendThread.cpp @@ -142,12 +142,18 @@ int OctreeSendThread::handlePacketSend(OctreeQueryNode* nodeData, int& trueBytes } const unsigned char* messageData = nodeData->getPacket(); +//unsigned char messageData[MAX_PACKET_SIZE]; +//memcpy(messageData, nodeData->getPacket(), MAX_PACKET_SIZE); // DEBUG: make copy of message to send + int numBytesPacketHeader = numBytesForPacketHeader(reinterpret_cast(messageData)); const unsigned char* dataAt = messageData + numBytesPacketHeader; dataAt += sizeof(OCTREE_PACKET_FLAGS); OCTREE_PACKET_SEQUENCE sequence = (*(OCTREE_PACKET_SEQUENCE*)dataAt); dataAt += sizeof(OCTREE_PACKET_SEQUENCE); + OCTREE_PACKET_SENT_TIME timestamp = (*(OCTREE_PACKET_SENT_TIME*)dataAt); + dataAt += sizeof(OCTREE_PACKET_SENT_TIME); + // If we've got a stats message ready to send, then see if we can piggyback them together if (nodeData->stats.isReadyToSend() && !nodeData->isShuttingDown()) { @@ -161,6 +167,7 @@ int OctreeSendThread::handlePacketSend(OctreeQueryNode* nodeData, int& trueBytes // copy voxel message to back of stats message memcpy(statsMessage + statsMessageLength, nodeData->getPacket(), nodeData->getPacketLength()); +//memcpy(statsMessage + statsMessageLength, messageData, nodeData->getPacketLength()); statsMessageLength += nodeData->getPacketLength(); // since a stats message is only included on end of scene, don't consider any of these bytes "wasted", since @@ -203,6 +210,7 @@ int OctreeSendThread::handlePacketSend(OctreeQueryNode* nodeData, int& trueBytes OctreeServer::didCallWriteDatagram(this); NodeList::getInstance()->writeDatagram((char*) nodeData->getPacket(), nodeData->getPacketLength(), _node); +//NodeList::getInstance()->writeDatagram((char*)messageData, nodeData->getPacketLength(), _node); packetSent = true; @@ -223,6 +231,7 @@ int OctreeSendThread::handlePacketSend(OctreeQueryNode* nodeData, int& trueBytes // just send the voxel packet OctreeServer::didCallWriteDatagram(this); NodeList::getInstance()->writeDatagram((char*) nodeData->getPacket(), nodeData->getPacketLength(), _node); +//NodeList::getInstance()->writeDatagram((char*)messageData, nodeData->getPacketLength(), _node); packetSent = true; int thisWastedBytes = MAX_PACKET_SIZE - nodeData->getPacketLength(); @@ -245,7 +254,6 @@ int OctreeSendThread::handlePacketSend(OctreeQueryNode* nodeData, int& trueBytes nodeData->incrementSequenceNumber(); nodeData->resetOctreePacket(); } - return packetsSent; } diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 07309fab85..a8b56f360d 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -3301,7 +3301,12 @@ void Application::trackIncomingVoxelPacket(const QByteArray& packet, const Share _octreeSceneStatsLock.lockForWrite(); if (_octreeServerSceneStats.find(nodeUUID) != _octreeServerSceneStats.end()) { OctreeSceneStats& stats = _octreeServerSceneStats[nodeUUID]; - stats.trackIncomingOctreePacket(packet, wasStatsPacket, sendingNode->getClockSkewUsec()); + if (stats.trackIncomingOctreePacket(packet, wasStatsPacket, sendingNode->getClockSkewUsec())) { + + // DEBUG! unreasonable flight time + qDebug() << " sending node type: " << NodeType::getNodeTypeName(sendingNode->getType()) << "\n"; + //qDebug() << "\t\t clock skew: " << sendingNode->getClockSkewUsec(); + } } _octreeSceneStatsLock.unlock(); } diff --git a/interface/src/voxels/VoxelPacketProcessor.cpp b/interface/src/voxels/VoxelPacketProcessor.cpp index c0f27264f6..d03eaf0946 100644 --- a/interface/src/voxels/VoxelPacketProcessor.cpp +++ b/interface/src/voxels/VoxelPacketProcessor.cpp @@ -39,7 +39,7 @@ void VoxelPacketProcessor::processPacket(const SharedNodePointer& sendingNode, c } PacketType voxelPacketType = packetTypeForPacket(mutablePacket); - + // note: PacketType_OCTREE_STATS can have PacketType_VOXEL_DATA // immediately following them inside the same packet. So, we process the PacketType_OCTREE_STATS first // then process any remaining bytes as if it was another packet @@ -81,6 +81,7 @@ void VoxelPacketProcessor::processPacket(const SharedNodePointer& sendingNode, c if (Menu::getInstance()->isOptionChecked(MenuOption::Voxels)) { +if (voxelPacketType != PacketTypeParticleErase) app->trackIncomingVoxelPacket(mutablePacket, sendingNode, wasStatsPacket); if (sendingNode) { diff --git a/libraries/networking/src/LimitedNodeList.cpp b/libraries/networking/src/LimitedNodeList.cpp index c0d7941edf..68255bbd41 100644 --- a/libraries/networking/src/LimitedNodeList.cpp +++ b/libraries/networking/src/LimitedNodeList.cpp @@ -268,6 +268,44 @@ qint64 LimitedNodeList::writeUnverifiedDatagram(const QByteArray& datagram, cons qint64 LimitedNodeList::writeDatagram(const char* data, qint64 size, const SharedNodePointer& destinationNode, const HifiSockAddr& overridenSockAddr) { + /* + QByteArray datagram(data, size); + + qDebug() << "\t writeDatagram()..."; + + PacketType type = packetTypeForPacket(datagram); + if (type != PacketType::PacketTypeParticleErase) { + + qDebug() << "\t\t type: " << (unsigned char)type; + qDebug() << "\t\t UUID: " << uuidFromPacketHeader(datagram); + qDebug() << "\t\t MD5: " << hashFromPacketHeader(datagram); + + + int numBytesPacketHeader = numBytesForPacketHeader(datagram); + const unsigned char* dataAt = reinterpret_cast(datagram.data()) + numBytesPacketHeader; + + unsigned char flags = (*(unsigned char*)(dataAt)); + dataAt += sizeof(unsigned char); + qDebug() << "\t\t flags: " << QString::number(flags, 2); + + uint16_t sequence = (*(uint16_t*)dataAt); + dataAt += sizeof(uint16_t); + qDebug() << "\t\t sequence: " << QString::number(sequence, 16); + + quint64 sentAt = (*(quint64*)dataAt); + dataAt += sizeof(quint64); + qDebug() << "\t\t sent at: " << QString::number(sentAt, 16) << "\n"; + } + else { + qDebug() << "size: " << size; + const char* dataAt = data; + for (int i = 0; i < size; i++) { + unsigned char byte = *((unsigned char*)dataAt); + dataAt += sizeof(unsigned char); + qDebug() << "\t\t " << QString::number(byte, 16); + } + }*/ + return writeDatagram(QByteArray(data, size), destinationNode, overridenSockAddr); } diff --git a/libraries/octree/src/OctreeSceneStats.cpp b/libraries/octree/src/OctreeSceneStats.cpp index c08e723f89..2b04b5652c 100644 --- a/libraries/octree/src/OctreeSceneStats.cpp +++ b/libraries/octree/src/OctreeSceneStats.cpp @@ -839,7 +839,7 @@ const char* OctreeSceneStats::getItemValue(Item item) { return _itemValueBuffer; } -void OctreeSceneStats::trackIncomingOctreePacket(const QByteArray& packet, +bool OctreeSceneStats::trackIncomingOctreePacket(const QByteArray& packet, bool wasStatsPacket, int nodeClockSkewUsec) { const bool wantExtraDebugging = false; @@ -857,8 +857,8 @@ void OctreeSceneStats::trackIncomingOctreePacket(const QByteArray& packet, //bool packetIsColored = oneAtBit(flags, PACKET_IS_COLOR_BIT); //bool packetIsCompressed = oneAtBit(flags, PACKET_IS_COMPRESSED_BIT); - OCTREE_PACKET_SENT_TIME arrivedAt = usecTimestampNow(); - int flightTime = arrivedAt - sentAt + nodeClockSkewUsec; + OCTREE_PACKET_SENT_TIME arrivedAt = usecTimestampNow(); // DEBUG!!! + qint64 flightTime = arrivedAt - sentAt + nodeClockSkewUsec; if (wantExtraDebugging) { qDebug() << "sentAt:" << sentAt << " usecs"; @@ -866,13 +866,20 @@ void OctreeSceneStats::trackIncomingOctreePacket(const QByteArray& packet, qDebug() << "nodeClockSkewUsec:" << nodeClockSkewUsec << " usecs"; qDebug() << "flightTime:" << flightTime << " usecs"; } - + + +//qDebug() << "\t" << QString::number(sequence, 16) << "\t sentAt:" << QString::number(sentAt, 16) << " usecs"; + // Guard against possible corrupted packets... with bad timestamps const int MAX_RESONABLE_FLIGHT_TIME = 200 * USECS_PER_SECOND; // 200 seconds is more than enough time for a packet to arrive const int MIN_RESONABLE_FLIGHT_TIME = 0; if (flightTime > MAX_RESONABLE_FLIGHT_TIME || flightTime < MIN_RESONABLE_FLIGHT_TIME) { qDebug() << "ignoring unreasonable packet... flightTime:" << flightTime; - return; // ignore any packets that are unreasonable +qDebug() << "\t sentAt:" << QString::number(sentAt, 16) << " usecs"; +qDebug() << "\t arrivedAt:" << QString::number(arrivedAt, 16) << " usecs"; +qDebug() << "\t nodeClockSkewUsec:" << nodeClockSkewUsec << " usecs"; +qDebug() << "\t flightTime:" << flightTime << " usecs"; + return true; // ignore any packets that are unreasonable } // determine our expected sequence number... handle rollover appropriately @@ -884,7 +891,7 @@ void OctreeSceneStats::trackIncomingOctreePacket(const QByteArray& packet, int sequenceOffset = (sequence - expected); if (sequenceOffset > MAX_RESONABLE_SEQUENCE_OFFSET || sequenceOffset < MIN_RESONABLE_SEQUENCE_OFFSET) { qDebug() << "ignoring unreasonable packet... sequence:" << sequence << "_incomingLastSequence:" << _incomingLastSequence; - return; // ignore any packets that are unreasonable + return false; // ignore any packets that are unreasonable } // track packets here... @@ -985,6 +992,6 @@ void OctreeSceneStats::trackIncomingOctreePacket(const QByteArray& packet, } } } - + return false; } diff --git a/libraries/octree/src/OctreeSceneStats.h b/libraries/octree/src/OctreeSceneStats.h index ef22fd7c1c..dd0b31b010 100644 --- a/libraries/octree/src/OctreeSceneStats.h +++ b/libraries/octree/src/OctreeSceneStats.h @@ -158,7 +158,7 @@ public: quint64 getLastFullTotalBytes() const { return _lastFullTotalBytes; } // Used in client implementations to track individual octree packets - void trackIncomingOctreePacket(const QByteArray& packet, bool wasStatsPacket, int nodeClockSkewUsec); + bool trackIncomingOctreePacket(const QByteArray& packet, bool wasStatsPacket, int nodeClockSkewUsec); quint32 getIncomingPackets() const { return _incomingPacket; } quint64 getIncomingBytes() const { return _incomingBytes; } From f361b9a8a7b91e44a260e5db450b4e181ba2ad81 Mon Sep 17 00:00:00 2001 From: wangyix Date: Tue, 27 May 2014 18:04:53 -0700 Subject: [PATCH 06/14] removed updatePacketTimestamp() ..from OctreeQueryNode --- assignment-client/src/octree/OctreeQueryNode.cpp | 14 -------------- assignment-client/src/octree/OctreeQueryNode.h | 2 -- 2 files changed, 16 deletions(-) diff --git a/assignment-client/src/octree/OctreeQueryNode.cpp b/assignment-client/src/octree/OctreeQueryNode.cpp index f56a96d367..a5f89dc71b 100644 --- a/assignment-client/src/octree/OctreeQueryNode.cpp +++ b/assignment-client/src/octree/OctreeQueryNode.cpp @@ -366,17 +366,3 @@ void OctreeQueryNode::dumpOutOfView() { void OctreeQueryNode::incrementSequenceNumber() { _sequenceNumber++; } - -void OctreeQueryNode::updatePacketTimestamp() { - - int numBytesPacketHeader = populatePacketHeader(reinterpret_cast(_octreePacket), _myPacketType); - _octreePacketAt = _octreePacket + numBytesPacketHeader; - _octreePacketAt += sizeof(OCTREE_PACKET_FLAGS); - _octreePacketAt += sizeof(OCTREE_PACKET_SEQUENCE); - - // pack in timestamp - OCTREE_PACKET_SENT_TIME now = usecTimestampNow(); - OCTREE_PACKET_SENT_TIME* timeAt = (OCTREE_PACKET_SENT_TIME*)_octreePacketAt; - *timeAt = now; - -} \ No newline at end of file diff --git a/assignment-client/src/octree/OctreeQueryNode.h b/assignment-client/src/octree/OctreeQueryNode.h index a1a8aa4a66..1bb3a72a0c 100644 --- a/assignment-client/src/octree/OctreeQueryNode.h +++ b/assignment-client/src/octree/OctreeQueryNode.h @@ -101,8 +101,6 @@ public: bool isShuttingDown() const { return _isShuttingDown; } void incrementSequenceNumber(); - - void updatePacketTimestamp(); private slots: void sendThreadFinished(); From c7990773790e4f00fd02e30e8eb13b7ea0171508 Mon Sep 17 00:00:00 2001 From: wangyix Date: Wed, 28 May 2014 17:20:10 -0700 Subject: [PATCH 07/14] added flag,seq,ts to ParticleErase and ModelErase ... this fixes unreasonable flight-time issue --- assignment-client/src/models/ModelServer.cpp | 5 +-- assignment-client/src/models/ModelServer.h | 2 +- .../src/octree/OctreeQueryNode.cpp | 11 ++++--- .../src/octree/OctreeQueryNode.h | 6 ++-- .../src/octree/OctreeSendThread.cpp | 20 ++++++------ .../src/octree/OctreeSendThread.h | 2 ++ assignment-client/src/octree/OctreeServer.h | 2 +- .../src/particles/ParticleServer.cpp | 5 +-- .../src/particles/ParticleServer.h | 2 +- assignment-client/src/voxels/VoxelServer.cpp | 5 ++- assignment-client/src/voxels/VoxelServer.h | 2 +- interface/src/voxels/VoxelPacketProcessor.cpp | 2 +- libraries/models/src/ModelTree.cpp | 29 +++++++++++++++-- libraries/models/src/ModelTree.h | 2 +- libraries/networking/src/LimitedNodeList.cpp | 32 +++++++++---------- libraries/octree/src/OctreeSceneStats.cpp | 2 +- libraries/particles/src/ParticleTree.cpp | 27 ++++++++++++++-- libraries/particles/src/ParticleTree.h | 2 +- 18 files changed, 106 insertions(+), 52 deletions(-) diff --git a/assignment-client/src/models/ModelServer.cpp b/assignment-client/src/models/ModelServer.cpp index a71c98ed83..8f322e4c82 100644 --- a/assignment-client/src/models/ModelServer.cpp +++ b/assignment-client/src/models/ModelServer.cpp @@ -86,7 +86,7 @@ bool ModelServer::hasSpecialPacketToSend(const SharedNodePointer& node) { return shouldSendDeletedModels; } -int ModelServer::sendSpecialPacket(const SharedNodePointer& node) { +int ModelServer::sendSpecialPacket(OCTREE_PACKET_SEQUENCE& sequenceNumber, const SharedNodePointer& node) { unsigned char outputBuffer[MAX_PACKET_SIZE]; size_t packetLength = 0; @@ -100,12 +100,13 @@ int ModelServer::sendSpecialPacket(const SharedNodePointer& node) { // TODO: is it possible to send too many of these packets? what if you deleted 1,000,000 models? while (hasMoreToSend) { - hasMoreToSend = tree->encodeModelsDeletedSince(deletedModelsSentAt, + hasMoreToSend = tree->encodeModelsDeletedSince(sequenceNumber, deletedModelsSentAt, outputBuffer, MAX_PACKET_SIZE, packetLength); //qDebug() << "sending PacketType_MODEL_ERASE packetLength:" << packetLength; NodeList::getInstance()->writeDatagram((char*) outputBuffer, packetLength, SharedNodePointer(node)); + sequenceNumber++; } nodeData->setLastDeletedModelsSentAt(deletePacketSentAt); diff --git a/assignment-client/src/models/ModelServer.h b/assignment-client/src/models/ModelServer.h index c2ca6d1f5b..35cb79d8cf 100644 --- a/assignment-client/src/models/ModelServer.h +++ b/assignment-client/src/models/ModelServer.h @@ -37,7 +37,7 @@ public: // subclass may implement these method virtual void beforeRun(); virtual bool hasSpecialPacketToSend(const SharedNodePointer& node); - virtual int sendSpecialPacket(const SharedNodePointer& node); + virtual int sendSpecialPacket(OCTREE_PACKET_SEQUENCE& sequenceNumber, const SharedNodePointer& node); virtual void modelCreated(const ModelItem& newModel, const SharedNodePointer& senderNode); diff --git a/assignment-client/src/octree/OctreeQueryNode.cpp b/assignment-client/src/octree/OctreeQueryNode.cpp index a5f89dc71b..ea15770f9e 100644 --- a/assignment-client/src/octree/OctreeQueryNode.cpp +++ b/assignment-client/src/octree/OctreeQueryNode.cpp @@ -38,7 +38,7 @@ OctreeQueryNode::OctreeQueryNode() : _lastClientOctreeSizeScale(DEFAULT_OCTREE_SIZE_SCALE), _lodChanged(false), _lodInitialized(false), - _sequenceNumber(0), + //_sequenceNumber(0), _lastRootTimestamp(0), _myPacketType(PacketTypeUnknown), _isShuttingDown(false) @@ -158,11 +158,11 @@ bool OctreeQueryNode::shouldSuppressDuplicatePacket() { void OctreeQueryNode::init() { _myPacketType = getMyPacketType(); - resetOctreePacket(); // don't bump sequence + resetOctreePacket(0); // don't bump sequence } -void OctreeQueryNode::resetOctreePacket() { +void OctreeQueryNode::resetOctreePacket(OCTREE_PACKET_SEQUENCE sequenceNumber) { // if shutting down, return immediately if (_isShuttingDown) { return; @@ -200,7 +200,7 @@ void OctreeQueryNode::resetOctreePacket() { // pack in sequence number OCTREE_PACKET_SEQUENCE* sequenceAt = (OCTREE_PACKET_SEQUENCE*)_octreePacketAt; - *sequenceAt = _sequenceNumber; + *sequenceAt = sequenceNumber; _octreePacketAt += sizeof(OCTREE_PACKET_SEQUENCE); _octreePacketAvailableBytes -= sizeof(OCTREE_PACKET_SEQUENCE); @@ -362,7 +362,8 @@ void OctreeQueryNode::dumpOutOfView() { } } } - +/* void OctreeQueryNode::incrementSequenceNumber() { _sequenceNumber++; } +*/ diff --git a/assignment-client/src/octree/OctreeQueryNode.h b/assignment-client/src/octree/OctreeQueryNode.h index 1bb3a72a0c..af293189a4 100644 --- a/assignment-client/src/octree/OctreeQueryNode.h +++ b/assignment-client/src/octree/OctreeQueryNode.h @@ -35,7 +35,7 @@ public: void init(); // called after creation to set up some virtual items virtual PacketType getMyPacketType() const = 0; - void resetOctreePacket(); // resets octree packet to after "V" header + void resetOctreePacket(OCTREE_PACKET_SEQUENCE sequenceNumber); // resets octree packet to after "V" header void writeToPacket(const unsigned char* buffer, unsigned int bytes); // writes to end of packet @@ -100,7 +100,7 @@ public: void forceNodeShutdown(); bool isShuttingDown() const { return _isShuttingDown; } - void incrementSequenceNumber(); + //void incrementSequenceNumber(); private slots: void sendThreadFinished(); @@ -138,7 +138,7 @@ private: bool _lodChanged; bool _lodInitialized; - OCTREE_PACKET_SEQUENCE _sequenceNumber; + //OCTREE_PACKET_SEQUENCE _sequenceNumber; quint64 _lastRootTimestamp; diff --git a/assignment-client/src/octree/OctreeSendThread.cpp b/assignment-client/src/octree/OctreeSendThread.cpp index c98c8c77b8..dca18026a1 100644 --- a/assignment-client/src/octree/OctreeSendThread.cpp +++ b/assignment-client/src/octree/OctreeSendThread.cpp @@ -28,7 +28,8 @@ OctreeSendThread::OctreeSendThread(const SharedAssignmentPointer& myAssignment, _nodeUUID(node->getUUID()), _packetData(), _nodeMissingCount(0), - _isShuttingDown(false) + _isShuttingDown(false), + _sequenceNumber(0) { QString safeServerName("Octree"); if (_myServer) { @@ -137,7 +138,7 @@ int OctreeSendThread::handlePacketSend(OctreeQueryNode* nodeData, int& trueBytes // obscure the packet and not send it. This allows the callers and upper level logic to not need to know about // this rate control savings. if (nodeData->shouldSuppressDuplicatePacket()) { - nodeData->resetOctreePacket(); // we still need to reset it though! + nodeData->resetOctreePacket(_sequenceNumber); // we still need to reset it though! return packetsSent; // without sending... } @@ -163,11 +164,10 @@ int OctreeSendThread::handlePacketSend(OctreeQueryNode* nodeData, int& trueBytes int piggyBackSize = nodeData->getPacketLength() + statsMessageLength; // If the size of the stats message and the voxel message will fit in a packet, then piggyback them - if (piggyBackSize < MAX_PACKET_SIZE) { +if (piggyBackSize < MAX_PACKET_SIZE && false) { // copy voxel message to back of stats message memcpy(statsMessage + statsMessageLength, nodeData->getPacket(), nodeData->getPacketLength()); -//memcpy(statsMessage + statsMessageLength, messageData, nodeData->getPacketLength()); statsMessageLength += nodeData->getPacketLength(); // since a stats message is only included on end of scene, don't consider any of these bytes "wasted", since @@ -210,7 +210,6 @@ int OctreeSendThread::handlePacketSend(OctreeQueryNode* nodeData, int& trueBytes OctreeServer::didCallWriteDatagram(this); NodeList::getInstance()->writeDatagram((char*) nodeData->getPacket(), nodeData->getPacketLength(), _node); -//NodeList::getInstance()->writeDatagram((char*)messageData, nodeData->getPacketLength(), _node); packetSent = true; @@ -231,7 +230,6 @@ int OctreeSendThread::handlePacketSend(OctreeQueryNode* nodeData, int& trueBytes // just send the voxel packet OctreeServer::didCallWriteDatagram(this); NodeList::getInstance()->writeDatagram((char*) nodeData->getPacket(), nodeData->getPacketLength(), _node); -//NodeList::getInstance()->writeDatagram((char*)messageData, nodeData->getPacketLength(), _node); packetSent = true; int thisWastedBytes = MAX_PACKET_SIZE - nodeData->getPacketLength(); @@ -251,8 +249,8 @@ int OctreeSendThread::handlePacketSend(OctreeQueryNode* nodeData, int& trueBytes trueBytesSent += nodeData->getPacketLength(); truePacketsSent++; packetsSent++; - nodeData->incrementSequenceNumber(); - nodeData->resetOctreePacket(); + _sequenceNumber++; + nodeData->resetOctreePacket(_sequenceNumber); } return packetsSent; } @@ -291,7 +289,7 @@ int OctreeSendThread::packetDistributor(OctreeQueryNode* nodeData, bool viewFrus if (nodeData->isPacketWaiting()) { packetsSentThisInterval += handlePacketSend(nodeData, trueBytesSent, truePacketsSent); } else { - nodeData->resetOctreePacket(); + nodeData->resetOctreePacket(_sequenceNumber); } int targetSize = MAX_OCTREE_PACKET_DATA_SIZE; if (wantCompression) { @@ -537,7 +535,9 @@ int OctreeSendThread::packetDistributor(OctreeQueryNode* nodeData, bool viewFrus // send the environment packet // TODO: should we turn this into a while loop to better handle sending multiple special packets if (_myServer->hasSpecialPacketToSend(_node) && !nodeData->isShuttingDown()) { - trueBytesSent += _myServer->sendSpecialPacket(_node); +qDebug() << "sending special packet..."; + trueBytesSent += _myServer->sendSpecialPacket(_sequenceNumber, _node); + nodeData->resetOctreePacket(_sequenceNumber); // because _sequenceNumber has changed truePacketsSent++; packetsSentThisInterval++; } diff --git a/assignment-client/src/octree/OctreeSendThread.h b/assignment-client/src/octree/OctreeSendThread.h index d8eed27802..9dcf266cd8 100644 --- a/assignment-client/src/octree/OctreeSendThread.h +++ b/assignment-client/src/octree/OctreeSendThread.h @@ -55,6 +55,8 @@ private: int _nodeMissingCount; bool _isShuttingDown; + + OCTREE_PACKET_SEQUENCE _sequenceNumber; }; #endif // hifi_OctreeSendThread_h diff --git a/assignment-client/src/octree/OctreeServer.h b/assignment-client/src/octree/OctreeServer.h index ff62561c58..df8519e200 100644 --- a/assignment-client/src/octree/OctreeServer.h +++ b/assignment-client/src/octree/OctreeServer.h @@ -72,7 +72,7 @@ public: // subclass may implement these method virtual void beforeRun() { }; virtual bool hasSpecialPacketToSend(const SharedNodePointer& node) { return false; } - virtual int sendSpecialPacket(const SharedNodePointer& node) { return 0; } + virtual int sendSpecialPacket(OCTREE_PACKET_SEQUENCE& sequenceNumber, const SharedNodePointer& node) { return 0; } static void attachQueryNodeToNode(Node* newNode); diff --git a/assignment-client/src/particles/ParticleServer.cpp b/assignment-client/src/particles/ParticleServer.cpp index 649ee0cff9..e752900059 100644 --- a/assignment-client/src/particles/ParticleServer.cpp +++ b/assignment-client/src/particles/ParticleServer.cpp @@ -86,7 +86,7 @@ bool ParticleServer::hasSpecialPacketToSend(const SharedNodePointer& node) { return shouldSendDeletedParticles; } -int ParticleServer::sendSpecialPacket(const SharedNodePointer& node) { +int ParticleServer::sendSpecialPacket(OCTREE_PACKET_SEQUENCE& sequenceNumber, const SharedNodePointer& node) { unsigned char outputBuffer[MAX_PACKET_SIZE]; size_t packetLength = 0; @@ -100,12 +100,13 @@ int ParticleServer::sendSpecialPacket(const SharedNodePointer& node) { // TODO: is it possible to send too many of these packets? what if you deleted 1,000,000 particles? while (hasMoreToSend) { - hasMoreToSend = tree->encodeParticlesDeletedSince(deletedParticlesSentAt, + hasMoreToSend = tree->encodeParticlesDeletedSince(sequenceNumber, deletedParticlesSentAt, outputBuffer, MAX_PACKET_SIZE, packetLength); //qDebug() << "sending PacketType_PARTICLE_ERASE packetLength:" << packetLength; NodeList::getInstance()->writeDatagram((char*) outputBuffer, packetLength, SharedNodePointer(node)); + sequenceNumber++; } nodeData->setLastDeletedParticlesSentAt(deletePacketSentAt); diff --git a/assignment-client/src/particles/ParticleServer.h b/assignment-client/src/particles/ParticleServer.h index 1e0bb1b967..cb8e128475 100644 --- a/assignment-client/src/particles/ParticleServer.h +++ b/assignment-client/src/particles/ParticleServer.h @@ -37,7 +37,7 @@ public: // subclass may implement these method virtual void beforeRun(); virtual bool hasSpecialPacketToSend(const SharedNodePointer& node); - virtual int sendSpecialPacket(const SharedNodePointer& node); + virtual int sendSpecialPacket(OCTREE_PACKET_SEQUENCE& sequenceNumber, const SharedNodePointer& node); virtual void particleCreated(const Particle& newParticle, const SharedNodePointer& senderNode); diff --git a/assignment-client/src/voxels/VoxelServer.cpp b/assignment-client/src/voxels/VoxelServer.cpp index 7747b8336b..1251358320 100644 --- a/assignment-client/src/voxels/VoxelServer.cpp +++ b/assignment-client/src/voxels/VoxelServer.cpp @@ -40,7 +40,10 @@ bool VoxelServer::hasSpecialPacketToSend(const SharedNodePointer& node) { return shouldSendEnvironments; } -int VoxelServer::sendSpecialPacket(const SharedNodePointer& node) { +int VoxelServer::sendSpecialPacket(OCTREE_PACKET_SEQUENCE& sequence, const SharedNodePointer& node) { + + // TODO: add flags, seq, timestamp to packet + int numBytesPacketHeader = populatePacketHeader(reinterpret_cast(_tempOutputBuffer), PacketTypeEnvironmentData); int envPacketLength = numBytesPacketHeader; int environmentsToSend = getSendMinimalEnvironment() ? 1 : getEnvironmentDataCount(); diff --git a/assignment-client/src/voxels/VoxelServer.h b/assignment-client/src/voxels/VoxelServer.h index bec60cadfe..8fba2e9d69 100644 --- a/assignment-client/src/voxels/VoxelServer.h +++ b/assignment-client/src/voxels/VoxelServer.h @@ -46,7 +46,7 @@ public: // subclass may implement these method virtual void beforeRun(); virtual bool hasSpecialPacketToSend(const SharedNodePointer& node); - virtual int sendSpecialPacket(const SharedNodePointer& node); + virtual int sendSpecialPacket(OCTREE_PACKET_SEQUENCE& sequence, const SharedNodePointer& node); private: bool _sendEnvironments; diff --git a/interface/src/voxels/VoxelPacketProcessor.cpp b/interface/src/voxels/VoxelPacketProcessor.cpp index d03eaf0946..11e62b0fe3 100644 --- a/interface/src/voxels/VoxelPacketProcessor.cpp +++ b/interface/src/voxels/VoxelPacketProcessor.cpp @@ -81,7 +81,7 @@ void VoxelPacketProcessor::processPacket(const SharedNodePointer& sendingNode, c if (Menu::getInstance()->isOptionChecked(MenuOption::Voxels)) { -if (voxelPacketType != PacketTypeParticleErase) +//if (voxelPacketType != PacketTypeParticleErase) app->trackIncomingVoxelPacket(mutablePacket, sendingNode, wasStatsPacket); if (sendingNode) { diff --git a/libraries/models/src/ModelTree.cpp b/libraries/models/src/ModelTree.cpp index 637079560b..44f1c60ac7 100644 --- a/libraries/models/src/ModelTree.cpp +++ b/libraries/models/src/ModelTree.cpp @@ -545,8 +545,8 @@ bool ModelTree::hasModelsDeletedSince(quint64 sinceTime) { } // sinceTime is an in/out parameter - it will be side effected with the last time sent out -bool ModelTree::encodeModelsDeletedSince(quint64& sinceTime, unsigned char* outputBuffer, size_t maxLength, - size_t& outputLength) { +bool ModelTree::encodeModelsDeletedSince(OCTREE_PACKET_SEQUENCE sequenceNumber, quint64& sinceTime, unsigned char* outputBuffer, + size_t maxLength, size_t& outputLength) { bool hasMoreToSend = true; @@ -555,6 +555,26 @@ bool ModelTree::encodeModelsDeletedSince(quint64& sinceTime, unsigned char* outp copyAt += numBytesPacketHeader; outputLength = numBytesPacketHeader; +// pack in flags +OCTREE_PACKET_FLAGS flags = 0; +OCTREE_PACKET_FLAGS* flagsAt = (OCTREE_PACKET_FLAGS*)copyAt; +*flagsAt = flags; +copyAt += sizeof(OCTREE_PACKET_FLAGS); +outputLength += sizeof(OCTREE_PACKET_FLAGS); + +// pack in sequence number +OCTREE_PACKET_SEQUENCE* sequenceAt = (OCTREE_PACKET_SEQUENCE*)copyAt; +*sequenceAt = sequenceNumber; +copyAt += sizeof(OCTREE_PACKET_SEQUENCE); +outputLength += sizeof(OCTREE_PACKET_SEQUENCE); + +// pack in timestamp +OCTREE_PACKET_SENT_TIME now = usecTimestampNow(); +OCTREE_PACKET_SENT_TIME* timeAt = (OCTREE_PACKET_SENT_TIME*)copyAt; +*timeAt = now; +copyAt += sizeof(OCTREE_PACKET_SENT_TIME); +outputLength += sizeof(OCTREE_PACKET_SENT_TIME); + uint16_t numberOfIds = 0; // placeholder for now unsigned char* numberOfIDsAt = copyAt; memcpy(copyAt, &numberOfIds, sizeof(numberOfIds)); @@ -642,8 +662,13 @@ void ModelTree::processEraseMessage(const QByteArray& dataByteArray, const Share size_t processedBytes = numBytesPacketHeader; dataAt += numBytesPacketHeader; +dataAt += sizeof(OCTREE_PACKET_FLAGS); +dataAt += sizeof(OCTREE_PACKET_SEQUENCE); +dataAt += sizeof(OCTREE_PACKET_SENT_TIME); + uint16_t numberOfIds = 0; // placeholder for now memcpy(&numberOfIds, dataAt, sizeof(numberOfIds)); +qDebug() << "\t\t\t numberOfIds: " << numberOfIds; dataAt += sizeof(numberOfIds); processedBytes += sizeof(numberOfIds); diff --git a/libraries/models/src/ModelTree.h b/libraries/models/src/ModelTree.h index b8df1c1a22..df45ae9c15 100644 --- a/libraries/models/src/ModelTree.h +++ b/libraries/models/src/ModelTree.h @@ -69,7 +69,7 @@ public: bool hasAnyDeletedModels() const { return _recentlyDeletedModelItemIDs.size() > 0; } bool hasModelsDeletedSince(quint64 sinceTime); - bool encodeModelsDeletedSince(quint64& sinceTime, unsigned char* packetData, size_t maxLength, size_t& outputLength); + bool encodeModelsDeletedSince(OCTREE_PACKET_SEQUENCE sequenceNumber, quint64& sinceTime, unsigned char* packetData, size_t maxLength, size_t& outputLength); void forgetModelsDeletedBefore(quint64 sinceTime); void processEraseMessage(const QByteArray& dataByteArray, const SharedNodePointer& sourceNode); diff --git a/libraries/networking/src/LimitedNodeList.cpp b/libraries/networking/src/LimitedNodeList.cpp index 68255bbd41..ed5ea579e0 100644 --- a/libraries/networking/src/LimitedNodeList.cpp +++ b/libraries/networking/src/LimitedNodeList.cpp @@ -268,21 +268,22 @@ qint64 LimitedNodeList::writeUnverifiedDatagram(const QByteArray& datagram, cons qint64 LimitedNodeList::writeDatagram(const char* data, qint64 size, const SharedNodePointer& destinationNode, const HifiSockAddr& overridenSockAddr) { - /* + QByteArray datagram(data, size); qDebug() << "\t writeDatagram()..."; + int numBytesPacketHeader = numBytesForPacketHeader(datagram); + const unsigned char* dataAt = reinterpret_cast(datagram.data()) + numBytesPacketHeader; + PacketType type = packetTypeForPacket(datagram); - if (type != PacketType::PacketTypeParticleErase) { - - qDebug() << "\t\t type: " << (unsigned char)type; - qDebug() << "\t\t UUID: " << uuidFromPacketHeader(datagram); - qDebug() << "\t\t MD5: " << hashFromPacketHeader(datagram); + qDebug() << "\t\t type: " << (unsigned char)type; - int numBytesPacketHeader = numBytesForPacketHeader(datagram); - const unsigned char* dataAt = reinterpret_cast(datagram.data()) + numBytesPacketHeader; + if (type != PacketTypeOctreeStats) { + + //qDebug() << "\t\t UUID: " << uuidFromPacketHeader(datagram); + //qDebug() << "\t\t MD5: " << hashFromPacketHeader(datagram); unsigned char flags = (*(unsigned char*)(dataAt)); dataAt += sizeof(unsigned char); @@ -296,15 +297,12 @@ qint64 LimitedNodeList::writeDatagram(const char* data, qint64 size, const Share dataAt += sizeof(quint64); qDebug() << "\t\t sent at: " << QString::number(sentAt, 16) << "\n"; } - else { - qDebug() << "size: " << size; - const char* dataAt = data; - for (int i = 0; i < size; i++) { - unsigned char byte = *((unsigned char*)dataAt); - dataAt += sizeof(unsigned char); - qDebug() << "\t\t " << QString::number(byte, 16); - } - }*/ + + if (type == PacketTypeParticleErase || type==PacketTypeModelErase) { + uint16_t ids = *((uint16_t*)dataAt); + dataAt += sizeof(uint16_t); + qDebug() << "\t\t\t ids: " << ids; + } return writeDatagram(QByteArray(data, size), destinationNode, overridenSockAddr); } diff --git a/libraries/octree/src/OctreeSceneStats.cpp b/libraries/octree/src/OctreeSceneStats.cpp index 2b04b5652c..4ca2237b43 100644 --- a/libraries/octree/src/OctreeSceneStats.cpp +++ b/libraries/octree/src/OctreeSceneStats.cpp @@ -868,7 +868,7 @@ bool OctreeSceneStats::trackIncomingOctreePacket(const QByteArray& packet, } -//qDebug() << "\t" << QString::number(sequence, 16) << "\t sentAt:" << QString::number(sentAt, 16) << " usecs"; +qDebug() << "\t" << QString::number(sequence, 16) << "\t sentAt:" << QString::number(sentAt, 16) << " usecs"; // Guard against possible corrupted packets... with bad timestamps const int MAX_RESONABLE_FLIGHT_TIME = 200 * USECS_PER_SECOND; // 200 seconds is more than enough time for a packet to arrive diff --git a/libraries/particles/src/ParticleTree.cpp b/libraries/particles/src/ParticleTree.cpp index dd8cb6e618..a597c76bd9 100644 --- a/libraries/particles/src/ParticleTree.cpp +++ b/libraries/particles/src/ParticleTree.cpp @@ -511,8 +511,8 @@ bool ParticleTree::hasParticlesDeletedSince(quint64 sinceTime) { } // sinceTime is an in/out parameter - it will be side effected with the last time sent out -bool ParticleTree::encodeParticlesDeletedSince(quint64& sinceTime, unsigned char* outputBuffer, size_t maxLength, - size_t& outputLength) { +bool ParticleTree::encodeParticlesDeletedSince(OCTREE_PACKET_SEQUENCE sequenceNumber, quint64& sinceTime, unsigned char* outputBuffer, + size_t maxLength, size_t& outputLength) { bool hasMoreToSend = true; @@ -521,6 +521,24 @@ bool ParticleTree::encodeParticlesDeletedSince(quint64& sinceTime, unsigned char copyAt += numBytesPacketHeader; outputLength = numBytesPacketHeader; +// pack in flags +OCTREE_PACKET_FLAGS flags = 0; +memcpy(copyAt, &flags, sizeof(OCTREE_PACKET_FLAGS)); +copyAt += sizeof(OCTREE_PACKET_FLAGS); +outputLength += sizeof(OCTREE_PACKET_FLAGS); + +// pack in sequence number +memcpy(copyAt, &sequenceNumber, sizeof(OCTREE_PACKET_SEQUENCE)); +copyAt += sizeof(OCTREE_PACKET_SEQUENCE); +outputLength += sizeof(OCTREE_PACKET_SEQUENCE); + +// pack in timestamp +OCTREE_PACKET_SENT_TIME now = usecTimestampNow(); +memcpy(copyAt, &now, sizeof(OCTREE_PACKET_SENT_TIME)); +copyAt += sizeof(OCTREE_PACKET_SENT_TIME); +outputLength += sizeof(OCTREE_PACKET_SENT_TIME); + + uint16_t numberOfIds = 0; // placeholder for now unsigned char* numberOfIDsAt = copyAt; memcpy(copyAt, &numberOfIds, sizeof(numberOfIds)); @@ -609,8 +627,13 @@ void ParticleTree::processEraseMessage(const QByteArray& dataByteArray, const Sh size_t processedBytes = numBytesPacketHeader; dataAt += numBytesPacketHeader; +dataAt += sizeof(OCTREE_PACKET_FLAGS); +dataAt += sizeof(OCTREE_PACKET_SEQUENCE); +dataAt += sizeof(OCTREE_PACKET_SENT_TIME); + uint16_t numberOfIds = 0; // placeholder for now memcpy(&numberOfIds, dataAt, sizeof(numberOfIds)); +qDebug() << "\t\t\t numberOfIds: " << numberOfIds; dataAt += sizeof(numberOfIds); processedBytes += sizeof(numberOfIds); diff --git a/libraries/particles/src/ParticleTree.h b/libraries/particles/src/ParticleTree.h index 0a2ac285b7..88cff94249 100644 --- a/libraries/particles/src/ParticleTree.h +++ b/libraries/particles/src/ParticleTree.h @@ -67,7 +67,7 @@ public: bool hasAnyDeletedParticles() const { return _recentlyDeletedParticleIDs.size() > 0; } bool hasParticlesDeletedSince(quint64 sinceTime); - bool encodeParticlesDeletedSince(quint64& sinceTime, unsigned char* packetData, size_t maxLength, size_t& outputLength); + bool encodeParticlesDeletedSince(OCTREE_PACKET_SEQUENCE sequenceNumber, quint64& sinceTime, unsigned char* packetData, size_t maxLength, size_t& outputLength); void forgetParticlesDeletedBefore(quint64 sinceTime); void processEraseMessage(const QByteArray& dataByteArray, const SharedNodePointer& sourceNode); From 5d4b0df1088b9700cc8ecb8600845b15797dc4b6 Mon Sep 17 00:00:00 2001 From: wangyix Date: Wed, 28 May 2014 17:41:38 -0700 Subject: [PATCH 08/14] added flag,seq,st to EnvironmentData, untested removed/commented out debug prints --- assignment-client/src/voxels/VoxelServer.cpp | 30 ++++++++++++++++++-- assignment-client/src/voxels/VoxelServer.h | 2 +- interface/src/Environment.cpp | 5 ++++ libraries/models/src/ModelTree.cpp | 1 - libraries/networking/src/LimitedNodeList.cpp | 4 +-- libraries/octree/src/OctreeSceneStats.cpp | 3 +- libraries/particles/src/ParticleTree.cpp | 1 - 7 files changed, 38 insertions(+), 8 deletions(-) diff --git a/assignment-client/src/voxels/VoxelServer.cpp b/assignment-client/src/voxels/VoxelServer.cpp index 1251358320..181a51ebc9 100644 --- a/assignment-client/src/voxels/VoxelServer.cpp +++ b/assignment-client/src/voxels/VoxelServer.cpp @@ -40,12 +40,36 @@ bool VoxelServer::hasSpecialPacketToSend(const SharedNodePointer& node) { return shouldSendEnvironments; } -int VoxelServer::sendSpecialPacket(OCTREE_PACKET_SEQUENCE& sequence, const SharedNodePointer& node) { +int VoxelServer::sendSpecialPacket(OCTREE_PACKET_SEQUENCE& sequenceNumber, const SharedNodePointer& node) { - // TODO: add flags, seq, timestamp to packet +unsigned char* copyAt = _tempOutputBuffer; int numBytesPacketHeader = populatePacketHeader(reinterpret_cast(_tempOutputBuffer), PacketTypeEnvironmentData); +copyAt += numBytesPacketHeader; int envPacketLength = numBytesPacketHeader; + + +// pack in flags +OCTREE_PACKET_FLAGS flags = 0; +OCTREE_PACKET_FLAGS* flagsAt = (OCTREE_PACKET_FLAGS*)copyAt; +*flagsAt = flags; +copyAt += sizeof(OCTREE_PACKET_FLAGS); +envPacketLength += sizeof(OCTREE_PACKET_FLAGS); + +// pack in sequence number +OCTREE_PACKET_SEQUENCE* sequenceAt = (OCTREE_PACKET_SEQUENCE*)copyAt; +*sequenceAt = sequenceNumber; +copyAt += sizeof(OCTREE_PACKET_SEQUENCE); +envPacketLength += sizeof(OCTREE_PACKET_SEQUENCE); + +// pack in timestamp +OCTREE_PACKET_SENT_TIME now = usecTimestampNow(); +OCTREE_PACKET_SENT_TIME* timeAt = (OCTREE_PACKET_SENT_TIME*)copyAt; +*timeAt = now; +copyAt += sizeof(OCTREE_PACKET_SENT_TIME); +envPacketLength += sizeof(OCTREE_PACKET_SENT_TIME); + + int environmentsToSend = getSendMinimalEnvironment() ? 1 : getEnvironmentDataCount(); for (int i = 0; i < environmentsToSend; i++) { @@ -53,6 +77,8 @@ int VoxelServer::sendSpecialPacket(OCTREE_PACKET_SEQUENCE& sequence, const Share } NodeList::getInstance()->writeDatagram((char*) _tempOutputBuffer, envPacketLength, SharedNodePointer(node)); + sequenceNumber++; + return envPacketLength; } diff --git a/assignment-client/src/voxels/VoxelServer.h b/assignment-client/src/voxels/VoxelServer.h index 8fba2e9d69..b9277fed0c 100644 --- a/assignment-client/src/voxels/VoxelServer.h +++ b/assignment-client/src/voxels/VoxelServer.h @@ -46,7 +46,7 @@ public: // subclass may implement these method virtual void beforeRun(); virtual bool hasSpecialPacketToSend(const SharedNodePointer& node); - virtual int sendSpecialPacket(OCTREE_PACKET_SEQUENCE& sequence, const SharedNodePointer& node); + virtual int sendSpecialPacket(OCTREE_PACKET_SEQUENCE& sequenceNumber, const SharedNodePointer& node); private: bool _sendEnvironments; diff --git a/interface/src/Environment.cpp b/interface/src/Environment.cpp index 1ba2f0501c..c302907cd7 100644 --- a/interface/src/Environment.cpp +++ b/interface/src/Environment.cpp @@ -160,6 +160,11 @@ bool Environment::findCapsulePenetration(const glm::vec3& start, const glm::vec3 int Environment::parseData(const HifiSockAddr& senderAddress, const QByteArray& packet) { // push past the packet header int bytesRead = numBytesForPacketHeader(packet); + +// push past flags, sequence, timestamp +bytesRead += sizeof(OCTREE_PACKET_FLAGS); +bytesRead += sizeof(OCTREE_PACKET_SEQUENCE); +bytesRead += sizeof(OCTREE_PACKET_SENT_TIME); // get the lock for the duration of the call QMutexLocker locker(&_mutex); diff --git a/libraries/models/src/ModelTree.cpp b/libraries/models/src/ModelTree.cpp index 44f1c60ac7..8b249411ba 100644 --- a/libraries/models/src/ModelTree.cpp +++ b/libraries/models/src/ModelTree.cpp @@ -668,7 +668,6 @@ dataAt += sizeof(OCTREE_PACKET_SENT_TIME); uint16_t numberOfIds = 0; // placeholder for now memcpy(&numberOfIds, dataAt, sizeof(numberOfIds)); -qDebug() << "\t\t\t numberOfIds: " << numberOfIds; dataAt += sizeof(numberOfIds); processedBytes += sizeof(numberOfIds); diff --git a/libraries/networking/src/LimitedNodeList.cpp b/libraries/networking/src/LimitedNodeList.cpp index ed5ea579e0..743cbe949a 100644 --- a/libraries/networking/src/LimitedNodeList.cpp +++ b/libraries/networking/src/LimitedNodeList.cpp @@ -268,7 +268,7 @@ qint64 LimitedNodeList::writeUnverifiedDatagram(const QByteArray& datagram, cons qint64 LimitedNodeList::writeDatagram(const char* data, qint64 size, const SharedNodePointer& destinationNode, const HifiSockAddr& overridenSockAddr) { - + /* QByteArray datagram(data, size); qDebug() << "\t writeDatagram()..."; @@ -303,7 +303,7 @@ qint64 LimitedNodeList::writeDatagram(const char* data, qint64 size, const Share dataAt += sizeof(uint16_t); qDebug() << "\t\t\t ids: " << ids; } - + */ return writeDatagram(QByteArray(data, size), destinationNode, overridenSockAddr); } diff --git a/libraries/octree/src/OctreeSceneStats.cpp b/libraries/octree/src/OctreeSceneStats.cpp index 4ca2237b43..3659c8bd24 100644 --- a/libraries/octree/src/OctreeSceneStats.cpp +++ b/libraries/octree/src/OctreeSceneStats.cpp @@ -868,13 +868,14 @@ bool OctreeSceneStats::trackIncomingOctreePacket(const QByteArray& packet, } -qDebug() << "\t" << QString::number(sequence, 16) << "\t sentAt:" << QString::number(sentAt, 16) << " usecs"; +//qDebug() << "\t" << QString::number(sequence, 16) << "\t sentAt:" << QString::number(sentAt, 16) << " usecs"; // Guard against possible corrupted packets... with bad timestamps const int MAX_RESONABLE_FLIGHT_TIME = 200 * USECS_PER_SECOND; // 200 seconds is more than enough time for a packet to arrive const int MIN_RESONABLE_FLIGHT_TIME = 0; if (flightTime > MAX_RESONABLE_FLIGHT_TIME || flightTime < MIN_RESONABLE_FLIGHT_TIME) { qDebug() << "ignoring unreasonable packet... flightTime:" << flightTime; +qDebug() << "\t sequence:" << QString::number(sequence, 16); qDebug() << "\t sentAt:" << QString::number(sentAt, 16) << " usecs"; qDebug() << "\t arrivedAt:" << QString::number(arrivedAt, 16) << " usecs"; qDebug() << "\t nodeClockSkewUsec:" << nodeClockSkewUsec << " usecs"; diff --git a/libraries/particles/src/ParticleTree.cpp b/libraries/particles/src/ParticleTree.cpp index a597c76bd9..50f9ea1090 100644 --- a/libraries/particles/src/ParticleTree.cpp +++ b/libraries/particles/src/ParticleTree.cpp @@ -633,7 +633,6 @@ dataAt += sizeof(OCTREE_PACKET_SENT_TIME); uint16_t numberOfIds = 0; // placeholder for now memcpy(&numberOfIds, dataAt, sizeof(numberOfIds)); -qDebug() << "\t\t\t numberOfIds: " << numberOfIds; dataAt += sizeof(numberOfIds); processedBytes += sizeof(numberOfIds); From c87c4748771376d6d63cbfb9e0903f03565fa6d3 Mon Sep 17 00:00:00 2001 From: wangyix Date: Thu, 29 May 2014 10:39:40 -0700 Subject: [PATCH 09/14] removed debug info, cleaned code for pull req --- .../src/octree/OctreeSendThread.cpp | 1 - assignment-client/src/voxels/VoxelServer.cpp | 38 +++++++++--------- interface/src/Application.cpp | 7 +--- interface/src/Environment.cpp | 8 ++-- interface/src/voxels/VoxelPacketProcessor.cpp | 2 +- libraries/models/src/ModelTree.cpp | 40 +++++++++---------- libraries/networking/src/LimitedNodeList.cpp | 36 ----------------- libraries/octree/src/OctreeSceneStats.cpp | 16 ++------ libraries/octree/src/OctreeSceneStats.h | 2 +- libraries/particles/src/ParticleTree.cpp | 34 ++++++++-------- 10 files changed, 67 insertions(+), 117 deletions(-) diff --git a/assignment-client/src/octree/OctreeSendThread.cpp b/assignment-client/src/octree/OctreeSendThread.cpp index dca18026a1..b91c4c4761 100644 --- a/assignment-client/src/octree/OctreeSendThread.cpp +++ b/assignment-client/src/octree/OctreeSendThread.cpp @@ -535,7 +535,6 @@ int OctreeSendThread::packetDistributor(OctreeQueryNode* nodeData, bool viewFrus // send the environment packet // TODO: should we turn this into a while loop to better handle sending multiple special packets if (_myServer->hasSpecialPacketToSend(_node) && !nodeData->isShuttingDown()) { -qDebug() << "sending special packet..."; trueBytesSent += _myServer->sendSpecialPacket(_sequenceNumber, _node); nodeData->resetOctreePacket(_sequenceNumber); // because _sequenceNumber has changed truePacketsSent++; diff --git a/assignment-client/src/voxels/VoxelServer.cpp b/assignment-client/src/voxels/VoxelServer.cpp index 181a51ebc9..9a4da4d611 100644 --- a/assignment-client/src/voxels/VoxelServer.cpp +++ b/assignment-client/src/voxels/VoxelServer.cpp @@ -42,32 +42,32 @@ bool VoxelServer::hasSpecialPacketToSend(const SharedNodePointer& node) { int VoxelServer::sendSpecialPacket(OCTREE_PACKET_SEQUENCE& sequenceNumber, const SharedNodePointer& node) { -unsigned char* copyAt = _tempOutputBuffer; + unsigned char* copyAt = _tempOutputBuffer; int numBytesPacketHeader = populatePacketHeader(reinterpret_cast(_tempOutputBuffer), PacketTypeEnvironmentData); -copyAt += numBytesPacketHeader; + copyAt += numBytesPacketHeader; int envPacketLength = numBytesPacketHeader; -// pack in flags -OCTREE_PACKET_FLAGS flags = 0; -OCTREE_PACKET_FLAGS* flagsAt = (OCTREE_PACKET_FLAGS*)copyAt; -*flagsAt = flags; -copyAt += sizeof(OCTREE_PACKET_FLAGS); -envPacketLength += sizeof(OCTREE_PACKET_FLAGS); + // pack in flags + OCTREE_PACKET_FLAGS flags = 0; + OCTREE_PACKET_FLAGS* flagsAt = (OCTREE_PACKET_FLAGS*)copyAt; + *flagsAt = flags; + copyAt += sizeof(OCTREE_PACKET_FLAGS); + envPacketLength += sizeof(OCTREE_PACKET_FLAGS); -// pack in sequence number -OCTREE_PACKET_SEQUENCE* sequenceAt = (OCTREE_PACKET_SEQUENCE*)copyAt; -*sequenceAt = sequenceNumber; -copyAt += sizeof(OCTREE_PACKET_SEQUENCE); -envPacketLength += sizeof(OCTREE_PACKET_SEQUENCE); + // pack in sequence number + OCTREE_PACKET_SEQUENCE* sequenceAt = (OCTREE_PACKET_SEQUENCE*)copyAt; + *sequenceAt = sequenceNumber; + copyAt += sizeof(OCTREE_PACKET_SEQUENCE); + envPacketLength += sizeof(OCTREE_PACKET_SEQUENCE); -// pack in timestamp -OCTREE_PACKET_SENT_TIME now = usecTimestampNow(); -OCTREE_PACKET_SENT_TIME* timeAt = (OCTREE_PACKET_SENT_TIME*)copyAt; -*timeAt = now; -copyAt += sizeof(OCTREE_PACKET_SENT_TIME); -envPacketLength += sizeof(OCTREE_PACKET_SENT_TIME); + // pack in timestamp + OCTREE_PACKET_SENT_TIME now = usecTimestampNow(); + OCTREE_PACKET_SENT_TIME* timeAt = (OCTREE_PACKET_SENT_TIME*)copyAt; + *timeAt = now; + copyAt += sizeof(OCTREE_PACKET_SENT_TIME); + envPacketLength += sizeof(OCTREE_PACKET_SENT_TIME); int environmentsToSend = getSendMinimalEnvironment() ? 1 : getEnvironmentDataCount(); diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 7ad3409f8e..4ee15bc949 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -3142,12 +3142,7 @@ void Application::trackIncomingVoxelPacket(const QByteArray& packet, const Share _octreeSceneStatsLock.lockForWrite(); if (_octreeServerSceneStats.find(nodeUUID) != _octreeServerSceneStats.end()) { OctreeSceneStats& stats = _octreeServerSceneStats[nodeUUID]; - if (stats.trackIncomingOctreePacket(packet, wasStatsPacket, sendingNode->getClockSkewUsec())) { - - // DEBUG! unreasonable flight time - qDebug() << " sending node type: " << NodeType::getNodeTypeName(sendingNode->getType()) << "\n"; - //qDebug() << "\t\t clock skew: " << sendingNode->getClockSkewUsec(); - } + stats.trackIncomingOctreePacket(packet, wasStatsPacket, sendingNode->getClockSkewUsec()); } _octreeSceneStatsLock.unlock(); } diff --git a/interface/src/Environment.cpp b/interface/src/Environment.cpp index c302907cd7..67337f963c 100644 --- a/interface/src/Environment.cpp +++ b/interface/src/Environment.cpp @@ -161,10 +161,10 @@ int Environment::parseData(const HifiSockAddr& senderAddress, const QByteArray& // push past the packet header int bytesRead = numBytesForPacketHeader(packet); -// push past flags, sequence, timestamp -bytesRead += sizeof(OCTREE_PACKET_FLAGS); -bytesRead += sizeof(OCTREE_PACKET_SEQUENCE); -bytesRead += sizeof(OCTREE_PACKET_SENT_TIME); + // push past flags, sequence, timestamp + bytesRead += sizeof(OCTREE_PACKET_FLAGS); + bytesRead += sizeof(OCTREE_PACKET_SEQUENCE); + bytesRead += sizeof(OCTREE_PACKET_SENT_TIME); // get the lock for the duration of the call QMutexLocker locker(&_mutex); diff --git a/interface/src/voxels/VoxelPacketProcessor.cpp b/interface/src/voxels/VoxelPacketProcessor.cpp index 11e62b0fe3..095c378c04 100644 --- a/interface/src/voxels/VoxelPacketProcessor.cpp +++ b/interface/src/voxels/VoxelPacketProcessor.cpp @@ -81,7 +81,7 @@ void VoxelPacketProcessor::processPacket(const SharedNodePointer& sendingNode, c if (Menu::getInstance()->isOptionChecked(MenuOption::Voxels)) { -//if (voxelPacketType != PacketTypeParticleErase) + app->trackIncomingVoxelPacket(mutablePacket, sendingNode, wasStatsPacket); if (sendingNode) { diff --git a/libraries/models/src/ModelTree.cpp b/libraries/models/src/ModelTree.cpp index 279508bf29..e88a969061 100644 --- a/libraries/models/src/ModelTree.cpp +++ b/libraries/models/src/ModelTree.cpp @@ -555,25 +555,25 @@ bool ModelTree::encodeModelsDeletedSince(OCTREE_PACKET_SEQUENCE sequenceNumber, copyAt += numBytesPacketHeader; outputLength = numBytesPacketHeader; -// pack in flags -OCTREE_PACKET_FLAGS flags = 0; -OCTREE_PACKET_FLAGS* flagsAt = (OCTREE_PACKET_FLAGS*)copyAt; -*flagsAt = flags; -copyAt += sizeof(OCTREE_PACKET_FLAGS); -outputLength += sizeof(OCTREE_PACKET_FLAGS); + // pack in flags + OCTREE_PACKET_FLAGS flags = 0; + OCTREE_PACKET_FLAGS* flagsAt = (OCTREE_PACKET_FLAGS*)copyAt; + *flagsAt = flags; + copyAt += sizeof(OCTREE_PACKET_FLAGS); + outputLength += sizeof(OCTREE_PACKET_FLAGS); -// pack in sequence number -OCTREE_PACKET_SEQUENCE* sequenceAt = (OCTREE_PACKET_SEQUENCE*)copyAt; -*sequenceAt = sequenceNumber; -copyAt += sizeof(OCTREE_PACKET_SEQUENCE); -outputLength += sizeof(OCTREE_PACKET_SEQUENCE); + // pack in sequence number + OCTREE_PACKET_SEQUENCE* sequenceAt = (OCTREE_PACKET_SEQUENCE*)copyAt; + *sequenceAt = sequenceNumber; + copyAt += sizeof(OCTREE_PACKET_SEQUENCE); + outputLength += sizeof(OCTREE_PACKET_SEQUENCE); -// pack in timestamp -OCTREE_PACKET_SENT_TIME now = usecTimestampNow(); -OCTREE_PACKET_SENT_TIME* timeAt = (OCTREE_PACKET_SENT_TIME*)copyAt; -*timeAt = now; -copyAt += sizeof(OCTREE_PACKET_SENT_TIME); -outputLength += sizeof(OCTREE_PACKET_SENT_TIME); + // pack in timestamp + OCTREE_PACKET_SENT_TIME now = usecTimestampNow(); + OCTREE_PACKET_SENT_TIME* timeAt = (OCTREE_PACKET_SENT_TIME*)copyAt; + *timeAt = now; + copyAt += sizeof(OCTREE_PACKET_SENT_TIME); + outputLength += sizeof(OCTREE_PACKET_SENT_TIME); uint16_t numberOfIds = 0; // placeholder for now unsigned char* numberOfIDsAt = copyAt; @@ -662,9 +662,9 @@ void ModelTree::processEraseMessage(const QByteArray& dataByteArray, const Share size_t processedBytes = numBytesPacketHeader; dataAt += numBytesPacketHeader; -dataAt += sizeof(OCTREE_PACKET_FLAGS); -dataAt += sizeof(OCTREE_PACKET_SEQUENCE); -dataAt += sizeof(OCTREE_PACKET_SENT_TIME); + dataAt += sizeof(OCTREE_PACKET_FLAGS); + dataAt += sizeof(OCTREE_PACKET_SEQUENCE); + dataAt += sizeof(OCTREE_PACKET_SENT_TIME); uint16_t numberOfIds = 0; // placeholder for now memcpy(&numberOfIds, dataAt, sizeof(numberOfIds)); diff --git a/libraries/networking/src/LimitedNodeList.cpp b/libraries/networking/src/LimitedNodeList.cpp index 743cbe949a..c0d7941edf 100644 --- a/libraries/networking/src/LimitedNodeList.cpp +++ b/libraries/networking/src/LimitedNodeList.cpp @@ -268,42 +268,6 @@ qint64 LimitedNodeList::writeUnverifiedDatagram(const QByteArray& datagram, cons qint64 LimitedNodeList::writeDatagram(const char* data, qint64 size, const SharedNodePointer& destinationNode, const HifiSockAddr& overridenSockAddr) { - /* - QByteArray datagram(data, size); - - qDebug() << "\t writeDatagram()..."; - - int numBytesPacketHeader = numBytesForPacketHeader(datagram); - const unsigned char* dataAt = reinterpret_cast(datagram.data()) + numBytesPacketHeader; - - PacketType type = packetTypeForPacket(datagram); - qDebug() << "\t\t type: " << (unsigned char)type; - - - if (type != PacketTypeOctreeStats) { - - //qDebug() << "\t\t UUID: " << uuidFromPacketHeader(datagram); - //qDebug() << "\t\t MD5: " << hashFromPacketHeader(datagram); - - unsigned char flags = (*(unsigned char*)(dataAt)); - dataAt += sizeof(unsigned char); - qDebug() << "\t\t flags: " << QString::number(flags, 2); - - uint16_t sequence = (*(uint16_t*)dataAt); - dataAt += sizeof(uint16_t); - qDebug() << "\t\t sequence: " << QString::number(sequence, 16); - - quint64 sentAt = (*(quint64*)dataAt); - dataAt += sizeof(quint64); - qDebug() << "\t\t sent at: " << QString::number(sentAt, 16) << "\n"; - } - - if (type == PacketTypeParticleErase || type==PacketTypeModelErase) { - uint16_t ids = *((uint16_t*)dataAt); - dataAt += sizeof(uint16_t); - qDebug() << "\t\t\t ids: " << ids; - } - */ return writeDatagram(QByteArray(data, size), destinationNode, overridenSockAddr); } diff --git a/libraries/octree/src/OctreeSceneStats.cpp b/libraries/octree/src/OctreeSceneStats.cpp index 3659c8bd24..269b64559f 100644 --- a/libraries/octree/src/OctreeSceneStats.cpp +++ b/libraries/octree/src/OctreeSceneStats.cpp @@ -839,7 +839,7 @@ const char* OctreeSceneStats::getItemValue(Item item) { return _itemValueBuffer; } -bool OctreeSceneStats::trackIncomingOctreePacket(const QByteArray& packet, +void OctreeSceneStats::trackIncomingOctreePacket(const QByteArray& packet, bool wasStatsPacket, int nodeClockSkewUsec) { const bool wantExtraDebugging = false; @@ -866,21 +866,13 @@ bool OctreeSceneStats::trackIncomingOctreePacket(const QByteArray& packet, qDebug() << "nodeClockSkewUsec:" << nodeClockSkewUsec << " usecs"; qDebug() << "flightTime:" << flightTime << " usecs"; } - - -//qDebug() << "\t" << QString::number(sequence, 16) << "\t sentAt:" << QString::number(sentAt, 16) << " usecs"; // Guard against possible corrupted packets... with bad timestamps const int MAX_RESONABLE_FLIGHT_TIME = 200 * USECS_PER_SECOND; // 200 seconds is more than enough time for a packet to arrive const int MIN_RESONABLE_FLIGHT_TIME = 0; if (flightTime > MAX_RESONABLE_FLIGHT_TIME || flightTime < MIN_RESONABLE_FLIGHT_TIME) { qDebug() << "ignoring unreasonable packet... flightTime:" << flightTime; -qDebug() << "\t sequence:" << QString::number(sequence, 16); -qDebug() << "\t sentAt:" << QString::number(sentAt, 16) << " usecs"; -qDebug() << "\t arrivedAt:" << QString::number(arrivedAt, 16) << " usecs"; -qDebug() << "\t nodeClockSkewUsec:" << nodeClockSkewUsec << " usecs"; -qDebug() << "\t flightTime:" << flightTime << " usecs"; - return true; // ignore any packets that are unreasonable + return; } // determine our expected sequence number... handle rollover appropriately @@ -892,7 +884,7 @@ qDebug() << "\t flightTime:" << flightTime << " usecs"; int sequenceOffset = (sequence - expected); if (sequenceOffset > MAX_RESONABLE_SEQUENCE_OFFSET || sequenceOffset < MIN_RESONABLE_SEQUENCE_OFFSET) { qDebug() << "ignoring unreasonable packet... sequence:" << sequence << "_incomingLastSequence:" << _incomingLastSequence; - return false; // ignore any packets that are unreasonable + return; // ignore any packets that are unreasonable } // track packets here... @@ -993,6 +985,6 @@ qDebug() << "\t flightTime:" << flightTime << " usecs"; } } } - return false; + return; } diff --git a/libraries/octree/src/OctreeSceneStats.h b/libraries/octree/src/OctreeSceneStats.h index dd0b31b010..ef22fd7c1c 100644 --- a/libraries/octree/src/OctreeSceneStats.h +++ b/libraries/octree/src/OctreeSceneStats.h @@ -158,7 +158,7 @@ public: quint64 getLastFullTotalBytes() const { return _lastFullTotalBytes; } // Used in client implementations to track individual octree packets - bool trackIncomingOctreePacket(const QByteArray& packet, bool wasStatsPacket, int nodeClockSkewUsec); + void trackIncomingOctreePacket(const QByteArray& packet, bool wasStatsPacket, int nodeClockSkewUsec); quint32 getIncomingPackets() const { return _incomingPacket; } quint64 getIncomingBytes() const { return _incomingBytes; } diff --git a/libraries/particles/src/ParticleTree.cpp b/libraries/particles/src/ParticleTree.cpp index c36e029ce1..cd79ff303e 100644 --- a/libraries/particles/src/ParticleTree.cpp +++ b/libraries/particles/src/ParticleTree.cpp @@ -521,22 +521,22 @@ bool ParticleTree::encodeParticlesDeletedSince(OCTREE_PACKET_SEQUENCE sequenceNu copyAt += numBytesPacketHeader; outputLength = numBytesPacketHeader; -// pack in flags -OCTREE_PACKET_FLAGS flags = 0; -memcpy(copyAt, &flags, sizeof(OCTREE_PACKET_FLAGS)); -copyAt += sizeof(OCTREE_PACKET_FLAGS); -outputLength += sizeof(OCTREE_PACKET_FLAGS); + // pack in flags + OCTREE_PACKET_FLAGS flags = 0; + memcpy(copyAt, &flags, sizeof(OCTREE_PACKET_FLAGS)); + copyAt += sizeof(OCTREE_PACKET_FLAGS); + outputLength += sizeof(OCTREE_PACKET_FLAGS); -// pack in sequence number -memcpy(copyAt, &sequenceNumber, sizeof(OCTREE_PACKET_SEQUENCE)); -copyAt += sizeof(OCTREE_PACKET_SEQUENCE); -outputLength += sizeof(OCTREE_PACKET_SEQUENCE); + // pack in sequence number + memcpy(copyAt, &sequenceNumber, sizeof(OCTREE_PACKET_SEQUENCE)); + copyAt += sizeof(OCTREE_PACKET_SEQUENCE); + outputLength += sizeof(OCTREE_PACKET_SEQUENCE); -// pack in timestamp -OCTREE_PACKET_SENT_TIME now = usecTimestampNow(); -memcpy(copyAt, &now, sizeof(OCTREE_PACKET_SENT_TIME)); -copyAt += sizeof(OCTREE_PACKET_SENT_TIME); -outputLength += sizeof(OCTREE_PACKET_SENT_TIME); + // pack in timestamp + OCTREE_PACKET_SENT_TIME now = usecTimestampNow(); + memcpy(copyAt, &now, sizeof(OCTREE_PACKET_SENT_TIME)); + copyAt += sizeof(OCTREE_PACKET_SENT_TIME); + outputLength += sizeof(OCTREE_PACKET_SENT_TIME); uint16_t numberOfIds = 0; // placeholder for now @@ -627,9 +627,9 @@ void ParticleTree::processEraseMessage(const QByteArray& dataByteArray, const Sh size_t processedBytes = numBytesPacketHeader; dataAt += numBytesPacketHeader; -dataAt += sizeof(OCTREE_PACKET_FLAGS); -dataAt += sizeof(OCTREE_PACKET_SEQUENCE); -dataAt += sizeof(OCTREE_PACKET_SENT_TIME); + dataAt += sizeof(OCTREE_PACKET_FLAGS); + dataAt += sizeof(OCTREE_PACKET_SEQUENCE); + dataAt += sizeof(OCTREE_PACKET_SENT_TIME); uint16_t numberOfIds = 0; // placeholder for now memcpy(&numberOfIds, dataAt, sizeof(numberOfIds)); From fe1a0e45654a59beadcf19a8d5c75882734f9b8d Mon Sep 17 00:00:00 2001 From: wangyix Date: Thu, 29 May 2014 11:27:14 -0700 Subject: [PATCH 10/14] removed debug stuff i missed --- assignment-client/src/octree/OctreeQueryNode.cpp | 6 ------ assignment-client/src/octree/OctreeQueryNode.h | 4 ---- assignment-client/src/octree/OctreeSendThread.cpp | 5 ++--- assignment-client/src/voxels/VoxelServer.cpp | 2 -- libraries/octree/src/OctreeSceneStats.cpp | 6 +++--- 5 files changed, 5 insertions(+), 18 deletions(-) diff --git a/assignment-client/src/octree/OctreeQueryNode.cpp b/assignment-client/src/octree/OctreeQueryNode.cpp index ea15770f9e..f7b293dfa8 100644 --- a/assignment-client/src/octree/OctreeQueryNode.cpp +++ b/assignment-client/src/octree/OctreeQueryNode.cpp @@ -38,7 +38,6 @@ OctreeQueryNode::OctreeQueryNode() : _lastClientOctreeSizeScale(DEFAULT_OCTREE_SIZE_SCALE), _lodChanged(false), _lodInitialized(false), - //_sequenceNumber(0), _lastRootTimestamp(0), _myPacketType(PacketTypeUnknown), _isShuttingDown(false) @@ -362,8 +361,3 @@ void OctreeQueryNode::dumpOutOfView() { } } } -/* -void OctreeQueryNode::incrementSequenceNumber() { - _sequenceNumber++; -} -*/ diff --git a/assignment-client/src/octree/OctreeQueryNode.h b/assignment-client/src/octree/OctreeQueryNode.h index af293189a4..eeea98699c 100644 --- a/assignment-client/src/octree/OctreeQueryNode.h +++ b/assignment-client/src/octree/OctreeQueryNode.h @@ -99,8 +99,6 @@ public: void nodeKilled(); void forceNodeShutdown(); bool isShuttingDown() const { return _isShuttingDown; } - - //void incrementSequenceNumber(); private slots: void sendThreadFinished(); @@ -138,8 +136,6 @@ private: bool _lodChanged; bool _lodInitialized; - //OCTREE_PACKET_SEQUENCE _sequenceNumber; - quint64 _lastRootTimestamp; PacketType _myPacketType; diff --git a/assignment-client/src/octree/OctreeSendThread.cpp b/assignment-client/src/octree/OctreeSendThread.cpp index b91c4c4761..a396e1170c 100644 --- a/assignment-client/src/octree/OctreeSendThread.cpp +++ b/assignment-client/src/octree/OctreeSendThread.cpp @@ -143,8 +143,6 @@ int OctreeSendThread::handlePacketSend(OctreeQueryNode* nodeData, int& trueBytes } const unsigned char* messageData = nodeData->getPacket(); -//unsigned char messageData[MAX_PACKET_SIZE]; -//memcpy(messageData, nodeData->getPacket(), MAX_PACKET_SIZE); // DEBUG: make copy of message to send int numBytesPacketHeader = numBytesForPacketHeader(reinterpret_cast(messageData)); const unsigned char* dataAt = messageData + numBytesPacketHeader; @@ -164,7 +162,7 @@ int OctreeSendThread::handlePacketSend(OctreeQueryNode* nodeData, int& trueBytes int piggyBackSize = nodeData->getPacketLength() + statsMessageLength; // If the size of the stats message and the voxel message will fit in a packet, then piggyback them -if (piggyBackSize < MAX_PACKET_SIZE && false) { + if (piggyBackSize < MAX_PACKET_SIZE) { // copy voxel message to back of stats message memcpy(statsMessage + statsMessageLength, nodeData->getPacket(), nodeData->getPacketLength()); @@ -252,6 +250,7 @@ if (piggyBackSize < MAX_PACKET_SIZE && false) { _sequenceNumber++; nodeData->resetOctreePacket(_sequenceNumber); } + return packetsSent; } diff --git a/assignment-client/src/voxels/VoxelServer.cpp b/assignment-client/src/voxels/VoxelServer.cpp index 9a4da4d611..43d01f1c77 100644 --- a/assignment-client/src/voxels/VoxelServer.cpp +++ b/assignment-client/src/voxels/VoxelServer.cpp @@ -48,7 +48,6 @@ int VoxelServer::sendSpecialPacket(OCTREE_PACKET_SEQUENCE& sequenceNumber, const copyAt += numBytesPacketHeader; int envPacketLength = numBytesPacketHeader; - // pack in flags OCTREE_PACKET_FLAGS flags = 0; OCTREE_PACKET_FLAGS* flagsAt = (OCTREE_PACKET_FLAGS*)copyAt; @@ -69,7 +68,6 @@ int VoxelServer::sendSpecialPacket(OCTREE_PACKET_SEQUENCE& sequenceNumber, const copyAt += sizeof(OCTREE_PACKET_SENT_TIME); envPacketLength += sizeof(OCTREE_PACKET_SENT_TIME); - int environmentsToSend = getSendMinimalEnvironment() ? 1 : getEnvironmentDataCount(); for (int i = 0; i < environmentsToSend; i++) { diff --git a/libraries/octree/src/OctreeSceneStats.cpp b/libraries/octree/src/OctreeSceneStats.cpp index 269b64559f..9580ae6d13 100644 --- a/libraries/octree/src/OctreeSceneStats.cpp +++ b/libraries/octree/src/OctreeSceneStats.cpp @@ -857,7 +857,7 @@ void OctreeSceneStats::trackIncomingOctreePacket(const QByteArray& packet, //bool packetIsColored = oneAtBit(flags, PACKET_IS_COLOR_BIT); //bool packetIsCompressed = oneAtBit(flags, PACKET_IS_COMPRESSED_BIT); - OCTREE_PACKET_SENT_TIME arrivedAt = usecTimestampNow(); // DEBUG!!! + OCTREE_PACKET_SENT_TIME arrivedAt = usecTimestampNow(); qint64 flightTime = arrivedAt - sentAt + nodeClockSkewUsec; if (wantExtraDebugging) { @@ -872,7 +872,7 @@ void OctreeSceneStats::trackIncomingOctreePacket(const QByteArray& packet, const int MIN_RESONABLE_FLIGHT_TIME = 0; if (flightTime > MAX_RESONABLE_FLIGHT_TIME || flightTime < MIN_RESONABLE_FLIGHT_TIME) { qDebug() << "ignoring unreasonable packet... flightTime:" << flightTime; - return; + return; // ignore any packets that are unreasonable } // determine our expected sequence number... handle rollover appropriately @@ -985,6 +985,6 @@ void OctreeSceneStats::trackIncomingOctreePacket(const QByteArray& packet, } } } - return; + } From 65508b2016d1688a6beba885aa2efed8bc920b15 Mon Sep 17 00:00:00 2001 From: wangyix Date: Thu, 29 May 2014 11:42:35 -0700 Subject: [PATCH 11/14] updated packet type version numbers --- libraries/networking/src/PacketHeaders.cpp | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/libraries/networking/src/PacketHeaders.cpp b/libraries/networking/src/PacketHeaders.cpp index 0f0b57635c..c56dba9cf1 100644 --- a/libraries/networking/src/PacketHeaders.cpp +++ b/libraries/networking/src/PacketHeaders.cpp @@ -52,7 +52,7 @@ PacketVersion versionForPacketType(PacketType type) { case PacketTypeAvatarIdentity: return 1; case PacketTypeEnvironmentData: - return 1; + return 2; case PacketTypeDomainList: case PacketTypeDomainListRequest: return 3; @@ -66,8 +66,12 @@ PacketVersion versionForPacketType(PacketType type) { return 1; case PacketTypeParticleData: return 1; + case PacketTypeParticleErase: + return 1; case PacketTypeModelData: - return 2; + return 2; + case PacketTypeModelErase: + return 1; default: return 0; } From f82be105e8056f9835e3cbba34561455e3207393 Mon Sep 17 00:00:00 2001 From: wangyix Date: Thu, 29 May 2014 12:54:34 -0700 Subject: [PATCH 12/14] moved _sequenceNumber back to OctreeQueryNode --- assignment-client/src/models/ModelServer.cpp | 6 +++--- assignment-client/src/models/ModelServer.h | 2 +- assignment-client/src/octree/OctreeQueryNode.cpp | 15 ++++++++++++--- assignment-client/src/octree/OctreeQueryNode.h | 8 +++++++- assignment-client/src/octree/OctreeSendThread.cpp | 10 +++++----- assignment-client/src/octree/OctreeServer.h | 2 +- .../src/particles/ParticleServer.cpp | 6 +++--- assignment-client/src/particles/ParticleServer.h | 2 +- assignment-client/src/voxels/VoxelServer.cpp | 6 +++--- assignment-client/src/voxels/VoxelServer.h | 2 +- 10 files changed, 37 insertions(+), 22 deletions(-) diff --git a/assignment-client/src/models/ModelServer.cpp b/assignment-client/src/models/ModelServer.cpp index 8f322e4c82..ff2367ec6e 100644 --- a/assignment-client/src/models/ModelServer.cpp +++ b/assignment-client/src/models/ModelServer.cpp @@ -86,7 +86,7 @@ bool ModelServer::hasSpecialPacketToSend(const SharedNodePointer& node) { return shouldSendDeletedModels; } -int ModelServer::sendSpecialPacket(OCTREE_PACKET_SEQUENCE& sequenceNumber, const SharedNodePointer& node) { +int ModelServer::sendSpecialPacket(OctreeQueryNode* queryNode, const SharedNodePointer& node) { unsigned char outputBuffer[MAX_PACKET_SIZE]; size_t packetLength = 0; @@ -100,13 +100,13 @@ int ModelServer::sendSpecialPacket(OCTREE_PACKET_SEQUENCE& sequenceNumber, const // TODO: is it possible to send too many of these packets? what if you deleted 1,000,000 models? while (hasMoreToSend) { - hasMoreToSend = tree->encodeModelsDeletedSince(sequenceNumber, deletedModelsSentAt, + hasMoreToSend = tree->encodeModelsDeletedSince(queryNode->getSequenceNumber(), deletedModelsSentAt, outputBuffer, MAX_PACKET_SIZE, packetLength); //qDebug() << "sending PacketType_MODEL_ERASE packetLength:" << packetLength; NodeList::getInstance()->writeDatagram((char*) outputBuffer, packetLength, SharedNodePointer(node)); - sequenceNumber++; + queryNode->incrementSequenceNumber(); } nodeData->setLastDeletedModelsSentAt(deletePacketSentAt); diff --git a/assignment-client/src/models/ModelServer.h b/assignment-client/src/models/ModelServer.h index 35cb79d8cf..7e7f239f2a 100644 --- a/assignment-client/src/models/ModelServer.h +++ b/assignment-client/src/models/ModelServer.h @@ -37,7 +37,7 @@ public: // subclass may implement these method virtual void beforeRun(); virtual bool hasSpecialPacketToSend(const SharedNodePointer& node); - virtual int sendSpecialPacket(OCTREE_PACKET_SEQUENCE& sequenceNumber, const SharedNodePointer& node); + virtual int sendSpecialPacket(OctreeQueryNode* queryNode, const SharedNodePointer& node); virtual void modelCreated(const ModelItem& newModel, const SharedNodePointer& senderNode); diff --git a/assignment-client/src/octree/OctreeQueryNode.cpp b/assignment-client/src/octree/OctreeQueryNode.cpp index f7b293dfa8..30df4373f5 100644 --- a/assignment-client/src/octree/OctreeQueryNode.cpp +++ b/assignment-client/src/octree/OctreeQueryNode.cpp @@ -38,6 +38,7 @@ OctreeQueryNode::OctreeQueryNode() : _lastClientOctreeSizeScale(DEFAULT_OCTREE_SIZE_SCALE), _lodChanged(false), _lodInitialized(false), + _sequenceNumber(0), _lastRootTimestamp(0), _myPacketType(PacketTypeUnknown), _isShuttingDown(false) @@ -157,11 +158,11 @@ bool OctreeQueryNode::shouldSuppressDuplicatePacket() { void OctreeQueryNode::init() { _myPacketType = getMyPacketType(); - resetOctreePacket(0); // don't bump sequence + resetOctreePacket(); // don't bump sequence } -void OctreeQueryNode::resetOctreePacket(OCTREE_PACKET_SEQUENCE sequenceNumber) { +void OctreeQueryNode::resetOctreePacket() { // if shutting down, return immediately if (_isShuttingDown) { return; @@ -199,7 +200,7 @@ void OctreeQueryNode::resetOctreePacket(OCTREE_PACKET_SEQUENCE sequenceNumber) { // pack in sequence number OCTREE_PACKET_SEQUENCE* sequenceAt = (OCTREE_PACKET_SEQUENCE*)_octreePacketAt; - *sequenceAt = sequenceNumber; + *sequenceAt = _sequenceNumber; _octreePacketAt += sizeof(OCTREE_PACKET_SEQUENCE); _octreePacketAvailableBytes -= sizeof(OCTREE_PACKET_SEQUENCE); @@ -361,3 +362,11 @@ void OctreeQueryNode::dumpOutOfView() { } } } + +void OctreeQueryNode::incrementSequenceNumber() { + _sequenceNumber++; +} + +OCTREE_PACKET_SEQUENCE OctreeQueryNode::getSequenceNumber() { + return _sequenceNumber; +} \ No newline at end of file diff --git a/assignment-client/src/octree/OctreeQueryNode.h b/assignment-client/src/octree/OctreeQueryNode.h index eeea98699c..f60634f33d 100644 --- a/assignment-client/src/octree/OctreeQueryNode.h +++ b/assignment-client/src/octree/OctreeQueryNode.h @@ -35,7 +35,7 @@ public: void init(); // called after creation to set up some virtual items virtual PacketType getMyPacketType() const = 0; - void resetOctreePacket(OCTREE_PACKET_SEQUENCE sequenceNumber); // resets octree packet to after "V" header + void resetOctreePacket(); // resets octree packet to after "V" header void writeToPacket(const unsigned char* buffer, unsigned int bytes); // writes to end of packet @@ -99,6 +99,10 @@ public: void nodeKilled(); void forceNodeShutdown(); bool isShuttingDown() const { return _isShuttingDown; } + + void incrementSequenceNumber(); + + OCTREE_PACKET_SEQUENCE getSequenceNumber(); private slots: void sendThreadFinished(); @@ -136,6 +140,8 @@ private: bool _lodChanged; bool _lodInitialized; + OCTREE_PACKET_SEQUENCE _sequenceNumber; + quint64 _lastRootTimestamp; PacketType _myPacketType; diff --git a/assignment-client/src/octree/OctreeSendThread.cpp b/assignment-client/src/octree/OctreeSendThread.cpp index a396e1170c..d8aebd0cdf 100644 --- a/assignment-client/src/octree/OctreeSendThread.cpp +++ b/assignment-client/src/octree/OctreeSendThread.cpp @@ -138,7 +138,7 @@ int OctreeSendThread::handlePacketSend(OctreeQueryNode* nodeData, int& trueBytes // obscure the packet and not send it. This allows the callers and upper level logic to not need to know about // this rate control savings. if (nodeData->shouldSuppressDuplicatePacket()) { - nodeData->resetOctreePacket(_sequenceNumber); // we still need to reset it though! + nodeData->resetOctreePacket(); // we still need to reset it though! return packetsSent; // without sending... } @@ -248,7 +248,7 @@ int OctreeSendThread::handlePacketSend(OctreeQueryNode* nodeData, int& trueBytes truePacketsSent++; packetsSent++; _sequenceNumber++; - nodeData->resetOctreePacket(_sequenceNumber); + nodeData->resetOctreePacket(); } return packetsSent; @@ -288,7 +288,7 @@ int OctreeSendThread::packetDistributor(OctreeQueryNode* nodeData, bool viewFrus if (nodeData->isPacketWaiting()) { packetsSentThisInterval += handlePacketSend(nodeData, trueBytesSent, truePacketsSent); } else { - nodeData->resetOctreePacket(_sequenceNumber); + nodeData->resetOctreePacket(); } int targetSize = MAX_OCTREE_PACKET_DATA_SIZE; if (wantCompression) { @@ -534,8 +534,8 @@ int OctreeSendThread::packetDistributor(OctreeQueryNode* nodeData, bool viewFrus // send the environment packet // TODO: should we turn this into a while loop to better handle sending multiple special packets if (_myServer->hasSpecialPacketToSend(_node) && !nodeData->isShuttingDown()) { - trueBytesSent += _myServer->sendSpecialPacket(_sequenceNumber, _node); - nodeData->resetOctreePacket(_sequenceNumber); // because _sequenceNumber has changed + trueBytesSent += _myServer->sendSpecialPacket(nodeData, _node); + nodeData->resetOctreePacket(); // because nodeData's _sequenceNumber has changed truePacketsSent++; packetsSentThisInterval++; } diff --git a/assignment-client/src/octree/OctreeServer.h b/assignment-client/src/octree/OctreeServer.h index df8519e200..f0db93feb3 100644 --- a/assignment-client/src/octree/OctreeServer.h +++ b/assignment-client/src/octree/OctreeServer.h @@ -72,7 +72,7 @@ public: // subclass may implement these method virtual void beforeRun() { }; virtual bool hasSpecialPacketToSend(const SharedNodePointer& node) { return false; } - virtual int sendSpecialPacket(OCTREE_PACKET_SEQUENCE& sequenceNumber, const SharedNodePointer& node) { return 0; } + virtual int sendSpecialPacket(OctreeQueryNode* queryNode, const SharedNodePointer& node) { return 0; } static void attachQueryNodeToNode(Node* newNode); diff --git a/assignment-client/src/particles/ParticleServer.cpp b/assignment-client/src/particles/ParticleServer.cpp index e752900059..1dd65f11f3 100644 --- a/assignment-client/src/particles/ParticleServer.cpp +++ b/assignment-client/src/particles/ParticleServer.cpp @@ -86,7 +86,7 @@ bool ParticleServer::hasSpecialPacketToSend(const SharedNodePointer& node) { return shouldSendDeletedParticles; } -int ParticleServer::sendSpecialPacket(OCTREE_PACKET_SEQUENCE& sequenceNumber, const SharedNodePointer& node) { +int ParticleServer::sendSpecialPacket(OctreeQueryNode* queryNode, const SharedNodePointer& node) { unsigned char outputBuffer[MAX_PACKET_SIZE]; size_t packetLength = 0; @@ -100,13 +100,13 @@ int ParticleServer::sendSpecialPacket(OCTREE_PACKET_SEQUENCE& sequenceNumber, co // TODO: is it possible to send too many of these packets? what if you deleted 1,000,000 particles? while (hasMoreToSend) { - hasMoreToSend = tree->encodeParticlesDeletedSince(sequenceNumber, deletedParticlesSentAt, + hasMoreToSend = tree->encodeParticlesDeletedSince(queryNode->getSequenceNumber(), deletedParticlesSentAt, outputBuffer, MAX_PACKET_SIZE, packetLength); //qDebug() << "sending PacketType_PARTICLE_ERASE packetLength:" << packetLength; NodeList::getInstance()->writeDatagram((char*) outputBuffer, packetLength, SharedNodePointer(node)); - sequenceNumber++; + queryNode->incrementSequenceNumber(); } nodeData->setLastDeletedParticlesSentAt(deletePacketSentAt); diff --git a/assignment-client/src/particles/ParticleServer.h b/assignment-client/src/particles/ParticleServer.h index cb8e128475..3066c5fa98 100644 --- a/assignment-client/src/particles/ParticleServer.h +++ b/assignment-client/src/particles/ParticleServer.h @@ -37,7 +37,7 @@ public: // subclass may implement these method virtual void beforeRun(); virtual bool hasSpecialPacketToSend(const SharedNodePointer& node); - virtual int sendSpecialPacket(OCTREE_PACKET_SEQUENCE& sequenceNumber, const SharedNodePointer& node); + virtual int sendSpecialPacket(OctreeQueryNode* queryNode, const SharedNodePointer& node); virtual void particleCreated(const Particle& newParticle, const SharedNodePointer& senderNode); diff --git a/assignment-client/src/voxels/VoxelServer.cpp b/assignment-client/src/voxels/VoxelServer.cpp index 43d01f1c77..8f4a8bab36 100644 --- a/assignment-client/src/voxels/VoxelServer.cpp +++ b/assignment-client/src/voxels/VoxelServer.cpp @@ -40,7 +40,7 @@ bool VoxelServer::hasSpecialPacketToSend(const SharedNodePointer& node) { return shouldSendEnvironments; } -int VoxelServer::sendSpecialPacket(OCTREE_PACKET_SEQUENCE& sequenceNumber, const SharedNodePointer& node) { +int VoxelServer::sendSpecialPacket(OctreeQueryNode* queryNode, const SharedNodePointer& node) { unsigned char* copyAt = _tempOutputBuffer; @@ -57,7 +57,7 @@ int VoxelServer::sendSpecialPacket(OCTREE_PACKET_SEQUENCE& sequenceNumber, const // pack in sequence number OCTREE_PACKET_SEQUENCE* sequenceAt = (OCTREE_PACKET_SEQUENCE*)copyAt; - *sequenceAt = sequenceNumber; + *sequenceAt = queryNode->getSequenceNumber(); copyAt += sizeof(OCTREE_PACKET_SEQUENCE); envPacketLength += sizeof(OCTREE_PACKET_SEQUENCE); @@ -75,7 +75,7 @@ int VoxelServer::sendSpecialPacket(OCTREE_PACKET_SEQUENCE& sequenceNumber, const } NodeList::getInstance()->writeDatagram((char*) _tempOutputBuffer, envPacketLength, SharedNodePointer(node)); - sequenceNumber++; + queryNode->incrementSequenceNumber(); return envPacketLength; } diff --git a/assignment-client/src/voxels/VoxelServer.h b/assignment-client/src/voxels/VoxelServer.h index b9277fed0c..4e04c48cfd 100644 --- a/assignment-client/src/voxels/VoxelServer.h +++ b/assignment-client/src/voxels/VoxelServer.h @@ -46,7 +46,7 @@ public: // subclass may implement these method virtual void beforeRun(); virtual bool hasSpecialPacketToSend(const SharedNodePointer& node); - virtual int sendSpecialPacket(OCTREE_PACKET_SEQUENCE& sequenceNumber, const SharedNodePointer& node); + virtual int sendSpecialPacket(OctreeQueryNode* queryNode, const SharedNodePointer& node); private: bool _sendEnvironments; From d8b0b03e591f1a1471cf4128e2f4f1beb925cc86 Mon Sep 17 00:00:00 2001 From: wangyix Date: Thu, 29 May 2014 13:39:57 -0700 Subject: [PATCH 13/14] removed _sequenceNumber from OctreeSendThread inlined getSequenceNumber and incrementSequenceNumber --- assignment-client/src/octree/OctreeQueryNode.h | 4 ++-- assignment-client/src/octree/OctreeSendThread.cpp | 5 ++--- assignment-client/src/octree/OctreeSendThread.h | 2 -- 3 files changed, 4 insertions(+), 7 deletions(-) diff --git a/assignment-client/src/octree/OctreeQueryNode.h b/assignment-client/src/octree/OctreeQueryNode.h index f60634f33d..eb420039e6 100644 --- a/assignment-client/src/octree/OctreeQueryNode.h +++ b/assignment-client/src/octree/OctreeQueryNode.h @@ -100,9 +100,9 @@ public: void forceNodeShutdown(); bool isShuttingDown() const { return _isShuttingDown; } - void incrementSequenceNumber(); + void incrementSequenceNumber() { _sequenceNumber++; } - OCTREE_PACKET_SEQUENCE getSequenceNumber(); + OCTREE_PACKET_SEQUENCE getSequenceNumber() const { return _sequenceNumber; } private slots: void sendThreadFinished(); diff --git a/assignment-client/src/octree/OctreeSendThread.cpp b/assignment-client/src/octree/OctreeSendThread.cpp index d8aebd0cdf..fab9be24d3 100644 --- a/assignment-client/src/octree/OctreeSendThread.cpp +++ b/assignment-client/src/octree/OctreeSendThread.cpp @@ -28,8 +28,7 @@ OctreeSendThread::OctreeSendThread(const SharedAssignmentPointer& myAssignment, _nodeUUID(node->getUUID()), _packetData(), _nodeMissingCount(0), - _isShuttingDown(false), - _sequenceNumber(0) + _isShuttingDown(false) { QString safeServerName("Octree"); if (_myServer) { @@ -247,7 +246,7 @@ int OctreeSendThread::handlePacketSend(OctreeQueryNode* nodeData, int& trueBytes trueBytesSent += nodeData->getPacketLength(); truePacketsSent++; packetsSent++; - _sequenceNumber++; + nodeData->incrementSequenceNumber(); nodeData->resetOctreePacket(); } diff --git a/assignment-client/src/octree/OctreeSendThread.h b/assignment-client/src/octree/OctreeSendThread.h index 9dcf266cd8..d8eed27802 100644 --- a/assignment-client/src/octree/OctreeSendThread.h +++ b/assignment-client/src/octree/OctreeSendThread.h @@ -55,8 +55,6 @@ private: int _nodeMissingCount; bool _isShuttingDown; - - OCTREE_PACKET_SEQUENCE _sequenceNumber; }; #endif // hifi_OctreeSendThread_h From 4c4ff45f318f8b31079d6b5b2922cd837bbf599e Mon Sep 17 00:00:00 2001 From: wangyix Date: Thu, 29 May 2014 14:31:40 -0700 Subject: [PATCH 14/14] removed duplicate function bodies --- assignment-client/src/octree/OctreeQueryNode.cpp | 8 -------- 1 file changed, 8 deletions(-) diff --git a/assignment-client/src/octree/OctreeQueryNode.cpp b/assignment-client/src/octree/OctreeQueryNode.cpp index 30df4373f5..6acd85bff6 100644 --- a/assignment-client/src/octree/OctreeQueryNode.cpp +++ b/assignment-client/src/octree/OctreeQueryNode.cpp @@ -362,11 +362,3 @@ void OctreeQueryNode::dumpOutOfView() { } } } - -void OctreeQueryNode::incrementSequenceNumber() { - _sequenceNumber++; -} - -OCTREE_PACKET_SEQUENCE OctreeQueryNode::getSequenceNumber() { - return _sequenceNumber; -} \ No newline at end of file