From 251e38cc16d408ecdff36e0f9fde81392bf8f599 Mon Sep 17 00:00:00 2001 From: matsukaze Date: Sun, 2 Mar 2014 14:28:44 -0500 Subject: [PATCH 01/97] Removed TODO --- interface/src/VoxelSystem.cpp | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/interface/src/VoxelSystem.cpp b/interface/src/VoxelSystem.cpp index 99f6171b7a..7513774a07 100644 --- a/interface/src/VoxelSystem.cpp +++ b/interface/src/VoxelSystem.cpp @@ -1751,11 +1751,12 @@ bool VoxelSystem::inspectForExteriorOcclusionsOperation(OctreeElement* element, //qDebug("Completely occupied voxel at %f %f %f size: %f", v.x, v.y, v.z, s); - // TODO: All of the exterior faces of this voxel element are - // occluders, which means that this element is completely - // occupied. Hence, the subtree from this node could be - // pruned and replaced by a leaf voxel, if the visible - // properties of the children are the same + // All of the exterior faces of this voxel element are + // occluders, which means that this element is completely + // occupied. Hence, the subtree from this node could be + // pruned and replaced by a leaf voxel, if the visible + // properties of the children are the same + } else if (exteriorOcclusions != OctreeElement::HalfSpace::None) { //const glm::vec3& v = voxel->getCorner(); //float s = voxel->getScale(); From ddb7fb9271ed9536cb68a5a98f334a81c605c5e4 Mon Sep 17 00:00:00 2001 From: matsukaze Date: Sun, 2 Mar 2014 14:29:25 -0500 Subject: [PATCH 02/97] Additional documentation --- interface/src/PrimitiveRenderer.h | 112 +++++++++++++++++------------- 1 file changed, 62 insertions(+), 50 deletions(-) diff --git a/interface/src/PrimitiveRenderer.h b/interface/src/PrimitiveRenderer.h index 51d96e0840..55f24cdf7a 100644 --- a/interface/src/PrimitiveRenderer.h +++ b/interface/src/PrimitiveRenderer.h @@ -103,7 +103,7 @@ private: /// Copy constructor prohibited. /// Primitive( - const Primitive& prim + const Primitive& copy ); // SPI methods are defined here @@ -150,14 +150,14 @@ public: /// Configuration dependency injection constructor. /// Cube( - float x, - float y, - float z, - float s, - unsigned char r, - unsigned char g, - unsigned char b, - unsigned char faces + float x, ///< Cube location on X-axis + float y, ///< Cube location on Y-axis + float z, ///< Cube location on Z-axis + float s, ///< Cube size + unsigned char r, ///< Cube red color component + unsigned char g, ///< Cube green color component + unsigned char b, ///< Cube blue color component + unsigned char faces ///< Bitmask of faces of cube excluded from construction ); ~Cube(); @@ -169,36 +169,48 @@ private: const Cube& cube ); + /// Cube initialization + /// void init( - float x, - float y, - float z, - float s, - unsigned char r, - unsigned char g, - unsigned char b, - unsigned char faceExclusions + float x, ///< Cube location on X-axis + float y, ///< Cube location on Y-axis + float z, ///< Cube location on Z-axis + float s, ///< Cube size + unsigned char r, ///< Cube red color component + unsigned char g, ///< Cube green color component + unsigned char b, ///< Cube blue color component + unsigned char faceExclusions ///< Bitmask of faces of cube excluded from construction ); + /// Cube termination + /// void terminate(); + /// Initialize cube's vertex list + /// void initializeVertices( - float x, - float y, - float z, - float s, - unsigned char r, - unsigned char g, - unsigned char b, - unsigned char faceExclusions + float x, ///< Cube location on X-axis + float y, ///< Cube location on Y-axis + float z, ///< Cube location on Z-axis + float s, ///< Cube size + unsigned char r, ///< Cube red color component + unsigned char g, ///< Cube green color component + unsigned char b, ///< Cube blue color component + unsigned char faceExclusions ///< Bitmask of faces of cube excluded from construction ); + /// Terminate cube's vertex list + /// void terminateVertices(); + /// Initialize cube's triangle list + /// void initializeTris( unsigned char faceExclusions ); + /// Terminate cube's triangle list + /// void terminateTris(); // SPI virtual override methods go here @@ -216,11 +228,11 @@ private: unsigned long _cpuMemoryUsage; ///< Memory allocation of object - static const int _sNumFacesPerCube = 6; - static const int _sNumVerticesPerCube = 24; - static unsigned char _sFaceIndexToHalfSpaceMask[6]; - static float _sVertexIndexToConstructionVector[24][3]; - static float _sVertexIndexToNormalVector[6][3]; + static const int _sNumFacesPerCube = 6; ///< Number of faces per cube + static const int _sNumVerticesPerCube = 24; ///< Number of vertices per cube + static unsigned char _sFaceIndexToHalfSpaceMask[6]; ///< index to bitmask map + static float _sVertexIndexToConstructionVector[24][3]; ///< Vertex index to construction vector map + static float _sVertexIndexToNormalVector[6][3]; ///< Vertex index to normal vector map }; @@ -239,13 +251,13 @@ public: /// Add primitive to renderer database. /// int add( - Primitive* primitive ///< Pointer to primitive + Primitive* primitive ///< Primitive instance to be added ); /// Remove primitive from renderer database. /// void remove( - int id ///< Primitive id + int id ///< Primitive id to be removed ); /// Clear all primitives from renderer database @@ -275,7 +287,7 @@ private: /// Copy constructor prohibited. /// Renderer( - const Renderer& primitive + const Renderer& copy ); // SPI methods are defined here @@ -283,10 +295,10 @@ private: /// Add primitive to renderer database. /// Service implementer to provide private override for this method /// in derived class - /// @return primitive id + /// @return Primitive id /// virtual int vAdd( - Primitive* primitive ///< Pointer to primitive + Primitive* primitive ///< Primitive instance to be added ) = 0; /// Remove primitive from renderer database. @@ -294,7 +306,7 @@ private: /// in derived class /// virtual void vRemove( - int id ///< Primitive id + int id ///< Primitive id ) = 0; /// Clear all primitives from renderer database @@ -329,7 +341,7 @@ public: /// Configuration dependency injection constructor. /// PrimitiveRenderer( - int maxCount + int maxCount ///< Max count ); ~PrimitiveRenderer(); @@ -362,39 +374,39 @@ private: /// Construct the elements of the faces of the primitive. /// void constructElements( - Primitive* primitive + Primitive* primitive ///< Primitive instance ); /// Deconstruct the elements of the faces of the primitive. /// void deconstructElements( - Primitive* primitive + Primitive* primitive ///< Primitive instance ); /// Deconstruct the triangle element from the GL buffer. /// void deconstructTriElement( - int idx + int idx ///< Triangle element index ); /// Deconstruct the vertex element from the GL buffer. /// void deconstructVertexElement( - int idx + int idx ///< Vertex element index ); /// Transfer the vertex element to the GL buffer. /// void transferVertexElement( - int idx, - VertexElement *vertex + int idx, ///< Vertex element index + VertexElement *vertex ///< Vertex element instance ); /// Transfer the triangle element to the GL buffer. /// void transferTriElement( - int idx, - int tri[3] + int idx, ///< Triangle element index + int tri[3] ///< Triangle element data ); /// Get available primitive index. @@ -421,13 +433,13 @@ private: /// Add primitive to renderer database. /// int vAdd( - Primitive* primitive + Primitive* primitive ///< Primitive instance to be added ); /// Remove primitive from renderer database. /// void vRemove( - int id + int id ///< Primitive id to be removed ); /// Clear all primitives from renderer database @@ -448,7 +460,7 @@ private: private: - int _maxCount; + int _maxCount; ///< Maximum count of tris // GL related parameters @@ -476,8 +488,8 @@ private: // Statistics parameters, not necessary for proper operation - unsigned long _gpuMemoryUsage; - unsigned long _cpuMemoryUsage; + unsigned long _gpuMemoryUsage; ///< GPU memory used by this instance + unsigned long _cpuMemoryUsage; ///< CPU memory used by this instance static const int _sIndicesPerTri = 3; From 0cb9bec1aa372322bfb74d672bf1b5bfbe959bb5 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Thu, 27 Mar 2014 19:29:18 -0700 Subject: [PATCH 03/97] keep SharedNodePointer in the OctreeSendThread --- .../src/octree/OctreeSendThread.cpp | 22 +++++-------------- .../src/octree/OctreeSendThread.h | 1 + 2 files changed, 6 insertions(+), 17 deletions(-) diff --git a/assignment-client/src/octree/OctreeSendThread.cpp b/assignment-client/src/octree/OctreeSendThread.cpp index 4105b21eb8..6ee7904c55 100644 --- a/assignment-client/src/octree/OctreeSendThread.cpp +++ b/assignment-client/src/octree/OctreeSendThread.cpp @@ -21,6 +21,7 @@ quint64 endSceneSleepTime = 0; OctreeSendThread::OctreeSendThread(OctreeServer* myServer, SharedNodePointer node) : _myServer(myServer), + _node(node), _nodeUUID(node->getUUID()), _packetData(), _nodeMissingCount(0), @@ -45,6 +46,7 @@ OctreeSendThread::~OctreeSendThread() { qDebug() << qPrintable(safeServerName) << "server [" << _myServer << "]: client disconnected " "- ending sending thread [" << this << "]"; OctreeServer::clientDisconnected(); + _node.clear(); } void OctreeSendThread::setIsShuttingDown() { @@ -74,28 +76,14 @@ bool OctreeSendThread::process() { // don't do any send processing until the initial load of the octree is complete... if (_myServer->isInitialLoadComplete()) { - SharedNodePointer node = NodeList::getInstance()->nodeWithUUID(_nodeUUID, false); - if (node) { + if (!_node.isNull()) { _nodeMissingCount = 0; - OctreeQueryNode* nodeData = static_cast(node->getLinkedData()); + OctreeQueryNode* nodeData = static_cast(_node->getLinkedData()); // Sometimes the node data has not yet been linked, in which case we can't really do anything if (nodeData && !nodeData->isShuttingDown()) { bool viewFrustumChanged = nodeData->updateCurrentViewFrustum(); - packetDistributor(node, nodeData, viewFrustumChanged); - } - } else { - _nodeMissingCount++; - const int MANY_FAILED_LOCKS = 1; - if (_nodeMissingCount >= MANY_FAILED_LOCKS) { - - QString safeServerName("Octree"); - if (_myServer) { - safeServerName = _myServer->getMyServerName(); - } - - qDebug() << qPrintable(safeServerName) << "server: sending thread [" << this << "]" - << "failed to get nodeWithUUID() " << _nodeUUID <<". Failed:" << _nodeMissingCount << "times"; + packetDistributor(_node, nodeData, viewFrustumChanged); } } } diff --git a/assignment-client/src/octree/OctreeSendThread.h b/assignment-client/src/octree/OctreeSendThread.h index 4b1b6d8c92..ef968707f9 100644 --- a/assignment-client/src/octree/OctreeSendThread.h +++ b/assignment-client/src/octree/OctreeSendThread.h @@ -39,6 +39,7 @@ protected: private: OctreeServer* _myServer; + SharedNodePointer _node; QUuid _nodeUUID; int handlePacketSend(const SharedNodePointer& node, OctreeQueryNode* nodeData, int& trueBytesSent, int& truePacketsSent); From 8856a609a4436b55c449708d6031287e97669a7f Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Fri, 28 Mar 2014 09:46:23 -0700 Subject: [PATCH 04/97] first cut at migrating to SharedOctreeServerPointer for ref count management of OctreeServer --- .../src/octree/OctreeQueryNode.cpp | 2 +- .../src/octree/OctreeQueryNode.h | 3 +- .../src/octree/OctreeSendThread.cpp | 41 ++++++++++--------- .../src/octree/OctreeSendThread.h | 9 ++-- assignment-client/src/octree/OctreeServer.cpp | 13 ++++-- assignment-client/src/octree/OctreeServer.h | 6 ++- 6 files changed, 43 insertions(+), 31 deletions(-) diff --git a/assignment-client/src/octree/OctreeQueryNode.cpp b/assignment-client/src/octree/OctreeQueryNode.cpp index 984ce42631..ab7b2f65fd 100644 --- a/assignment-client/src/octree/OctreeQueryNode.cpp +++ b/assignment-client/src/octree/OctreeQueryNode.cpp @@ -76,7 +76,7 @@ void OctreeQueryNode::deleteLater() { } -void OctreeQueryNode::initializeOctreeSendThread(OctreeServer* octreeServer, SharedNodePointer node) { +void OctreeQueryNode::initializeOctreeSendThread(const SharedOctreeServerPointer& octreeServer, SharedNodePointer node) { // Create octree sending thread... _octreeSendThread = new OctreeSendThread(octreeServer, node); _octreeSendThread->initialize(true); diff --git a/assignment-client/src/octree/OctreeQueryNode.h b/assignment-client/src/octree/OctreeQueryNode.h index 17d6f6337c..ace1235908 100644 --- a/assignment-client/src/octree/OctreeQueryNode.h +++ b/assignment-client/src/octree/OctreeQueryNode.h @@ -21,6 +21,7 @@ class OctreeSendThread; class OctreeServer; +typedef QSharedPointer SharedOctreeServerPointer; class OctreeQueryNode : public OctreeQuery { Q_OBJECT @@ -83,7 +84,7 @@ public: OctreeSceneStats stats; - void initializeOctreeSendThread(OctreeServer* octreeServer, SharedNodePointer node); + void initializeOctreeSendThread(const SharedOctreeServerPointer& octreeServer, SharedNodePointer node); bool isOctreeSendThreadInitalized() { return _octreeSendThread; } void dumpOutOfView(); diff --git a/assignment-client/src/octree/OctreeSendThread.cpp b/assignment-client/src/octree/OctreeSendThread.cpp index 6ee7904c55..ef115167af 100644 --- a/assignment-client/src/octree/OctreeSendThread.cpp +++ b/assignment-client/src/octree/OctreeSendThread.cpp @@ -19,7 +19,7 @@ quint64 startSceneSleepTime = 0; quint64 endSceneSleepTime = 0; -OctreeSendThread::OctreeSendThread(OctreeServer* myServer, SharedNodePointer node) : +OctreeSendThread::OctreeSendThread(const SharedOctreeServerPointer& myServer, SharedNodePointer node) : _myServer(myServer), _node(node), _nodeUUID(node->getUUID()), @@ -29,7 +29,7 @@ OctreeSendThread::OctreeSendThread(OctreeServer* myServer, SharedNodePointer nod _isShuttingDown(false) { QString safeServerName("Octree"); - if (_myServer) { + if (!_myServer.isNull()) { safeServerName = _myServer->getMyServerName(); } qDebug() << qPrintable(safeServerName) << "server [" << _myServer << "]: client connected " @@ -40,7 +40,7 @@ OctreeSendThread::OctreeSendThread(OctreeServer* myServer, SharedNodePointer nod OctreeSendThread::~OctreeSendThread() { QString safeServerName("Octree"); - if (_myServer) { + if (!_myServer.isNull()) { safeServerName = _myServer->getMyServerName(); } qDebug() << qPrintable(safeServerName) << "server [" << _myServer << "]: client disconnected " @@ -63,6 +63,11 @@ bool OctreeSendThread::process() { return false; // exit early if we're shutting down } + // check that our WeakPointer to our server is still valid + if (_myServer.isNull()) { + return false; // exit early if it's not, it means the server is shutting down + } + OctreeServer::didProcess(this); float lockWaitElapsedUsec = OctreeServer::SKIP_TIME; @@ -83,7 +88,7 @@ bool OctreeSendThread::process() { // Sometimes the node data has not yet been linked, in which case we can't really do anything if (nodeData && !nodeData->isShuttingDown()) { bool viewFrustumChanged = nodeData->updateCurrentViewFrustum(); - packetDistributor(_node, nodeData, viewFrustumChanged); + packetDistributor(nodeData, viewFrustumChanged); } } } @@ -119,8 +124,7 @@ quint64 OctreeSendThread::_totalBytes = 0; quint64 OctreeSendThread::_totalWastedBytes = 0; quint64 OctreeSendThread::_totalPackets = 0; -int OctreeSendThread::handlePacketSend(const SharedNodePointer& node, - OctreeQueryNode* nodeData, int& trueBytesSent, int& truePacketsSent) { +int OctreeSendThread::handlePacketSend(OctreeQueryNode* nodeData, int& trueBytesSent, int& truePacketsSent) { OctreeServer::didHandlePacketSend(this); @@ -180,12 +184,12 @@ int OctreeSendThread::handlePacketSend(const SharedNodePointer& node, // actually send it OctreeServer::didCallWriteDatagram(this); - NodeList::getInstance()->writeDatagram((char*) statsMessage, statsMessageLength, SharedNodePointer(node)); + NodeList::getInstance()->writeDatagram((char*) statsMessage, statsMessageLength, _node); packetSent = true; } else { // not enough room in the packet, send two packets OctreeServer::didCallWriteDatagram(this); - NodeList::getInstance()->writeDatagram((char*) statsMessage, statsMessageLength, SharedNodePointer(node)); + NodeList::getInstance()->writeDatagram((char*) statsMessage, statsMessageLength, _node); // since a stats message is only included on end of scene, don't consider any of these bytes "wasted", since // there was nothing else to send. @@ -204,8 +208,7 @@ int OctreeSendThread::handlePacketSend(const SharedNodePointer& node, packetsSent++; OctreeServer::didCallWriteDatagram(this); - NodeList::getInstance()->writeDatagram((char*) nodeData->getPacket(), nodeData->getPacketLength(), - SharedNodePointer(node)); + NodeList::getInstance()->writeDatagram((char*) nodeData->getPacket(), nodeData->getPacketLength(), _node); packetSent = true; @@ -225,8 +228,7 @@ int OctreeSendThread::handlePacketSend(const SharedNodePointer& node, if (nodeData->isPacketWaiting() && !nodeData->isShuttingDown()) { // just send the voxel packet OctreeServer::didCallWriteDatagram(this); - NodeList::getInstance()->writeDatagram((char*) nodeData->getPacket(), nodeData->getPacketLength(), - SharedNodePointer(node)); + NodeList::getInstance()->writeDatagram((char*) nodeData->getPacket(), nodeData->getPacketLength(), _node); packetSent = true; int thisWastedBytes = MAX_PACKET_SIZE - nodeData->getPacketLength(); @@ -253,7 +255,8 @@ int OctreeSendThread::handlePacketSend(const SharedNodePointer& node, } /// Version of voxel distributor that sends the deepest LOD level at once -int OctreeSendThread::packetDistributor(const SharedNodePointer& node, OctreeQueryNode* nodeData, bool viewFrustumChanged) { +int OctreeSendThread::packetDistributor(OctreeQueryNode* nodeData, bool viewFrustumChanged) { + OctreeServer::didPacketDistributor(this); // if shutting down, exit early @@ -283,7 +286,7 @@ int OctreeSendThread::packetDistributor(const SharedNodePointer& node, OctreeQue // then let's just send that waiting packet. if (!nodeData->getCurrentPacketFormatMatches()) { if (nodeData->isPacketWaiting()) { - packetsSentThisInterval += handlePacketSend(node, nodeData, trueBytesSent, truePacketsSent); + packetsSentThisInterval += handlePacketSend(nodeData, trueBytesSent, truePacketsSent); } else { nodeData->resetOctreePacket(); } @@ -324,7 +327,7 @@ int OctreeSendThread::packetDistributor(const SharedNodePointer& node, OctreeQue //unsigned long encodeTime = nodeData->stats.getTotalEncodeTime(); //unsigned long elapsedTime = nodeData->stats.getElapsedTime(); - int packetsJustSent = handlePacketSend(node, nodeData, trueBytesSent, truePacketsSent); + int packetsJustSent = handlePacketSend(nodeData, trueBytesSent, truePacketsSent); packetsSentThisInterval += packetsJustSent; // If we're starting a full scene, then definitely we want to empty the nodeBag @@ -475,7 +478,7 @@ int OctreeSendThread::packetDistributor(const SharedNodePointer& node, OctreeQue if (writtenSize > nodeData->getAvailable()) { - packetsSentThisInterval += handlePacketSend(node, nodeData, trueBytesSent, truePacketsSent); + packetsSentThisInterval += handlePacketSend(nodeData, trueBytesSent, truePacketsSent); } nodeData->writeToPacket(_packetData.getFinalizedData(), _packetData.getFinalizedSize()); @@ -497,7 +500,7 @@ int OctreeSendThread::packetDistributor(const SharedNodePointer& node, OctreeQue int targetSize = MAX_OCTREE_PACKET_DATA_SIZE; if (sendNow) { quint64 packetSendingStart = usecTimestampNow(); - packetsSentThisInterval += handlePacketSend(node, nodeData, trueBytesSent, truePacketsSent); + packetsSentThisInterval += handlePacketSend(nodeData, trueBytesSent, truePacketsSent); quint64 packetSendingEnd = usecTimestampNow(); packetSendingElapsedUsec = (float)(packetSendingEnd - packetSendingStart); @@ -530,8 +533,8 @@ int OctreeSendThread::packetDistributor(const SharedNodePointer& node, OctreeQue // Here's where we can/should allow the server to send other data... // 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); + if (_myServer->hasSpecialPacketToSend(_node) && !nodeData->isShuttingDown()) { + trueBytesSent += _myServer->sendSpecialPacket(_node); truePacketsSent++; packetsSentThisInterval++; } diff --git a/assignment-client/src/octree/OctreeSendThread.h b/assignment-client/src/octree/OctreeSendThread.h index ef968707f9..bcaa9baf0e 100644 --- a/assignment-client/src/octree/OctreeSendThread.h +++ b/assignment-client/src/octree/OctreeSendThread.h @@ -16,12 +16,11 @@ #include "OctreeQueryNode.h" #include "OctreeServer.h" - /// Threaded processor for sending voxel packets to a single client class OctreeSendThread : public GenericThread { Q_OBJECT public: - OctreeSendThread(OctreeServer* myServer, SharedNodePointer node); + OctreeSendThread(const SharedOctreeServerPointer& myServer, SharedNodePointer node); virtual ~OctreeSendThread(); void setIsShuttingDown(); @@ -38,12 +37,12 @@ protected: virtual bool process(); private: - OctreeServer* _myServer; + SharedOctreeServerPointer _myServer; SharedNodePointer _node; QUuid _nodeUUID; - int handlePacketSend(const SharedNodePointer& node, OctreeQueryNode* nodeData, int& trueBytesSent, int& truePacketsSent); - int packetDistributor(const SharedNodePointer& node, OctreeQueryNode* nodeData, bool viewFrustumChanged); + int handlePacketSend(OctreeQueryNode* nodeData, int& trueBytesSent, int& truePacketsSent); + int packetDistributor(OctreeQueryNode* nodeData, bool viewFrustumChanged); OctreePacketData _packetData; diff --git a/assignment-client/src/octree/OctreeServer.cpp b/assignment-client/src/octree/OctreeServer.cpp index fd3f9e6cb7..d711215643 100644 --- a/assignment-client/src/octree/OctreeServer.cpp +++ b/assignment-client/src/octree/OctreeServer.cpp @@ -19,7 +19,7 @@ #include "OctreeServer.h" #include "OctreeServerConsts.h" -OctreeServer* OctreeServer::_instance = NULL; +SharedOctreeServerPointer OctreeServer::_instance; int OctreeServer::_clientCount = 0; const int MOVING_AVERAGE_SAMPLE_COUNTS = 1000000; @@ -203,7 +203,7 @@ void OctreeServer::trackProcessWaitTime(float time) { } void OctreeServer::attachQueryNodeToNode(Node* newNode) { - if (!newNode->getLinkedData()) { + if (!newNode->getLinkedData() && !_instance.isNull()) { OctreeQueryNode* newQueryNodeData = _instance->createOctreeQueryNode(); newQueryNodeData->init(); newNode->setLinkedData(newQueryNodeData); @@ -231,7 +231,8 @@ OctreeServer::OctreeServer(const QByteArray& packet) : _started(time(0)), _startedUSecs(usecTimestampNow()) { - _instance = this; + assert(_instance.isNull()); // you should only ever have one instance at a time! + _instance = SharedOctreeServerPointer(this); _averageLoopTime.updateAverage(0); qDebug() << "Octree server starting... [" << this << "]"; } @@ -835,7 +836,8 @@ void OctreeServer::readPendingDatagrams() { if (debug) { qDebug() << "calling initializeOctreeSendThread()... node:" << *matchingNode; } - nodeData->initializeOctreeSendThread(this, matchingNode); + SharedOctreeServerPointer myServer(this); + nodeData->initializeOctreeSendThread(myServer, matchingNode); } } } else if (packetType == PacketTypeJurisdictionRequest) { @@ -1058,6 +1060,9 @@ void OctreeServer::aboutToFinish() { nodeKilled(node); } qDebug() << qPrintable(_safeServerName) << "server ENDING about to finish..."; + + // release our reference to the instance, this will allow the shared pointers to properly unwind + _instance.clear(); } QString OctreeServer::getUptime() { diff --git a/assignment-client/src/octree/OctreeServer.h b/assignment-client/src/octree/OctreeServer.h index 63d43b6634..5cf5fda59f 100644 --- a/assignment-client/src/octree/OctreeServer.h +++ b/assignment-client/src/octree/OctreeServer.h @@ -13,6 +13,7 @@ #include #include #include +#include #include @@ -26,6 +27,9 @@ const int DEFAULT_PACKETS_PER_INTERVAL = 2000; // some 120,000 packets per second total +class OctreeServer; +typedef QSharedPointer SharedOctreeServerPointer; + /// Handles assignments of type OctreeServer - sending octrees to various clients. class OctreeServer : public ThreadedAssignment, public HTTPRequestHandler { Q_OBJECT @@ -154,7 +158,7 @@ protected: OctreeInboundPacketProcessor* _octreeInboundPacketProcessor; OctreePersistThread* _persistThread; - static OctreeServer* _instance; + static SharedOctreeServerPointer _instance; time_t _started; quint64 _startedUSecs; From ce6af9ecb84a5dd63580fd4f69718f04a48b5521 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Fri, 28 Mar 2014 11:04:27 -0700 Subject: [PATCH 05/97] added debug destructor to persist thread --- libraries/octree/src/OctreePersistThread.cpp | 4 ++++ libraries/octree/src/OctreePersistThread.h | 1 + 2 files changed, 5 insertions(+) diff --git a/libraries/octree/src/OctreePersistThread.cpp b/libraries/octree/src/OctreePersistThread.cpp index 29715f9d90..6c0c0d9bfe 100644 --- a/libraries/octree/src/OctreePersistThread.cpp +++ b/libraries/octree/src/OctreePersistThread.cpp @@ -23,6 +23,10 @@ OctreePersistThread::OctreePersistThread(Octree* tree, const QString& filename, { } +OctreePersistThread::~OctreePersistThread() { + qDebug() << "OctreePersistThread::~OctreePersistThread()..."; +} + bool OctreePersistThread::process() { if (!_initialLoadComplete) { diff --git a/libraries/octree/src/OctreePersistThread.h b/libraries/octree/src/OctreePersistThread.h index ce6190b0e6..8e70733192 100644 --- a/libraries/octree/src/OctreePersistThread.h +++ b/libraries/octree/src/OctreePersistThread.h @@ -22,6 +22,7 @@ public: static const int DEFAULT_PERSIST_INTERVAL = 1000 * 30; // every 30 seconds OctreePersistThread(Octree* tree, const QString& filename, int persistInterval = DEFAULT_PERSIST_INTERVAL); + ~OctreePersistThread(); bool isInitialLoadComplete() const { return _initialLoadComplete; } quint64 getLoadElapsedTime() const { return _loadTimeUSecs; } From 640dbaacab83bff79813d8f94981426f663a9c13 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Fri, 28 Mar 2014 11:05:54 -0700 Subject: [PATCH 06/97] migration to shared pointers --- .../src/octree/OctreeSendThread.cpp | 31 ++++++++++------- assignment-client/src/octree/OctreeServer.cpp | 33 ++++++++++++++----- assignment-client/src/octree/OctreeServer.h | 2 +- 3 files changed, 45 insertions(+), 21 deletions(-) diff --git a/assignment-client/src/octree/OctreeSendThread.cpp b/assignment-client/src/octree/OctreeSendThread.cpp index ef115167af..c760963310 100644 --- a/assignment-client/src/octree/OctreeSendThread.cpp +++ b/assignment-client/src/octree/OctreeSendThread.cpp @@ -28,25 +28,34 @@ OctreeSendThread::OctreeSendThread(const SharedOctreeServerPointer& myServer, Sh _processLock(), _isShuttingDown(false) { - QString safeServerName("Octree"); - if (!_myServer.isNull()) { - safeServerName = _myServer->getMyServerName(); - } - qDebug() << qPrintable(safeServerName) << "server [" << _myServer << "]: client connected " + qDebug() << qPrintable(_myServer->getMyServerName()) << "server [" << _myServer.data() << "]: client connected " "- starting sending thread [" << this << "]"; OctreeServer::clientConnected(); } -OctreeSendThread::~OctreeSendThread() { - QString safeServerName("Octree"); - if (!_myServer.isNull()) { - safeServerName = _myServer->getMyServerName(); - } - qDebug() << qPrintable(safeServerName) << "server [" << _myServer << "]: client disconnected " +OctreeSendThread::~OctreeSendThread() { + QString serverName(_myServer->getMyServerName()); + + qDebug() << qPrintable(serverName) << "server [" << _myServer.data() << "]: client disconnected " "- ending sending thread [" << this << "]"; OctreeServer::clientDisconnected(); + + qDebug() << qPrintable(serverName) << "server [" << _myServer.data() << "]: " + "- OctreeSendThread::~OctreeSendThread() this=[" << this << "]" + "line: " << __LINE__; + _node.clear(); + + qDebug() << qPrintable(serverName) << "server [" << _myServer.data() << "]: " + "- OctreeSendThread::~OctreeSendThread() this=[" << this << "]" + "line: " << __LINE__; + void* serverPtr = _myServer.data(); + _myServer.clear(); + + qDebug() << qPrintable(serverName) << "server [" << serverPtr << "]: " + "- OctreeSendThread::~OctreeSendThread() this=[" << this << "]" + "line: " << __LINE__; } void OctreeSendThread::setIsShuttingDown() { diff --git a/assignment-client/src/octree/OctreeServer.cpp b/assignment-client/src/octree/OctreeServer.cpp index d711215643..e5c8cd262c 100644 --- a/assignment-client/src/octree/OctreeServer.cpp +++ b/assignment-client/src/octree/OctreeServer.cpp @@ -19,7 +19,7 @@ #include "OctreeServer.h" #include "OctreeServerConsts.h" -SharedOctreeServerPointer OctreeServer::_instance; +OctreeServer* OctreeServer::_instance; int OctreeServer::_clientCount = 0; const int MOVING_AVERAGE_SAMPLE_COUNTS = 1000000; @@ -203,7 +203,7 @@ void OctreeServer::trackProcessWaitTime(float time) { } void OctreeServer::attachQueryNodeToNode(Node* newNode) { - if (!newNode->getLinkedData() && !_instance.isNull()) { + if (!newNode->getLinkedData() && _instance) { OctreeQueryNode* newQueryNodeData = _instance->createOctreeQueryNode(); newQueryNodeData->init(); newNode->setLinkedData(newQueryNodeData); @@ -231,8 +231,11 @@ OctreeServer::OctreeServer(const QByteArray& packet) : _started(time(0)), _startedUSecs(usecTimestampNow()) { - assert(_instance.isNull()); // you should only ever have one instance at a time! - _instance = SharedOctreeServerPointer(this); + assert(!_instance); // you should only ever have one instance at a time! + + qDebug() << "Octree Server starting... setting _instance to=[" << this << "]"; + _instance = this; + _averageLoopTime.updateAverage(0); qDebug() << "Octree server starting... [" << this << "]"; } @@ -245,25 +248,40 @@ OctreeServer::~OctreeServer() { } delete[] _parsedArgV; } + qDebug() << qPrintable(_safeServerName) << "server shutting down... [" << this << "] OctreeServer::~OctreeServer() line:" << __LINE__; if (_jurisdictionSender) { _jurisdictionSender->terminate(); _jurisdictionSender->deleteLater(); } + qDebug() << qPrintable(_safeServerName) << "server shutting down... [" << this << "] OctreeServer::~OctreeServer() line:" << __LINE__; + if (_octreeInboundPacketProcessor) { _octreeInboundPacketProcessor->terminate(); _octreeInboundPacketProcessor->deleteLater(); } + qDebug() << qPrintable(_safeServerName) << "server shutting down... [" << this << "] OctreeServer::~OctreeServer() line:" << __LINE__; + if (_persistThread) { + qDebug() << qPrintable(_safeServerName) << "server shutting down... [" << this << "] OctreeServer::~OctreeServer() line:" << __LINE__; _persistThread->terminate(); + qDebug() << qPrintable(_safeServerName) << "server shutting down... [" << this << "] OctreeServer::~OctreeServer() line:" << __LINE__; _persistThread->deleteLater(); + qDebug() << qPrintable(_safeServerName) << "server shutting down... [" << this << "] OctreeServer::~OctreeServer() line:" << __LINE__; } + qDebug() << qPrintable(_safeServerName) << "server shutting down... [" << this << "] OctreeServer::~OctreeServer() line:" << __LINE__; + delete _jurisdiction; _jurisdiction = NULL; qDebug() << qPrintable(_safeServerName) << "server DONE shutting down... [" << this << "]"; + + qDebug() << qPrintable(_safeServerName) << "server shutting down... [" << this << "] OctreeServer::~OctreeServer() line:" << __LINE__; + + _instance = NULL; // we are gone + qDebug() << qPrintable(_safeServerName) << "server shutting down... [" << this << "] OctreeServer::~OctreeServer() line:" << __LINE__; } void OctreeServer::initHTTPManager(int port) { @@ -836,8 +854,7 @@ void OctreeServer::readPendingDatagrams() { if (debug) { qDebug() << "calling initializeOctreeSendThread()... node:" << *matchingNode; } - SharedOctreeServerPointer myServer(this); - nodeData->initializeOctreeSendThread(myServer, matchingNode); + nodeData->initializeOctreeSendThread(SharedOctreeServerPointer(this), matchingNode); } } } else if (packetType == PacketTypeJurisdictionRequest) { @@ -1059,10 +1076,8 @@ void OctreeServer::aboutToFinish() { qDebug() << qPrintable(_safeServerName) << "server about to finish while node still connected node:" << *node; nodeKilled(node); } + qDebug() << qPrintable(_safeServerName) << "server ENDING about to finish..."; - - // release our reference to the instance, this will allow the shared pointers to properly unwind - _instance.clear(); } QString OctreeServer::getUptime() { diff --git a/assignment-client/src/octree/OctreeServer.h b/assignment-client/src/octree/OctreeServer.h index 5cf5fda59f..ff9452170d 100644 --- a/assignment-client/src/octree/OctreeServer.h +++ b/assignment-client/src/octree/OctreeServer.h @@ -158,7 +158,7 @@ protected: OctreeInboundPacketProcessor* _octreeInboundPacketProcessor; OctreePersistThread* _persistThread; - static SharedOctreeServerPointer _instance; + static OctreeServer* _instance; time_t _started; quint64 _startedUSecs; From faa062f8ab4793c520e5f50b752bfca9a76eb8c3 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Mon, 31 Mar 2014 14:08:19 -0700 Subject: [PATCH 07/97] use single instance of SharedAssignmentPointer for assignment client so we actually get reference counting --- assignment-client/src/AssignmentClient.cpp | 5 +++-- assignment-client/src/AssignmentClient.h | 6 +++++- .../src/octree/OctreeQueryNode.cpp | 4 ++-- .../src/octree/OctreeQueryNode.h | 6 +++--- .../src/octree/OctreeSendThread.cpp | 20 +++++++++---------- .../src/octree/OctreeSendThread.h | 11 ++++++++-- assignment-client/src/octree/OctreeServer.cpp | 5 ++++- assignment-client/src/octree/OctreeServer.h | 8 ++++++-- libraries/shared/src/ThreadedAssignment.cpp | 1 - libraries/shared/src/ThreadedAssignment.h | 7 +++++-- 10 files changed, 47 insertions(+), 26 deletions(-) diff --git a/assignment-client/src/AssignmentClient.cpp b/assignment-client/src/AssignmentClient.cpp index aa20f2ff29..8795dc5bc4 100644 --- a/assignment-client/src/AssignmentClient.cpp +++ b/assignment-client/src/AssignmentClient.cpp @@ -25,11 +25,12 @@ const QString ASSIGNMENT_CLIENT_TARGET_NAME = "assignment-client"; const long long ASSIGNMENT_REQUEST_INTERVAL_MSECS = 1 * 1000; +SharedAssignmentPointer AssignmentClient::_currentAssignment; + int hifiSockAddrMeta = qRegisterMetaType("HifiSockAddr"); AssignmentClient::AssignmentClient(int &argc, char **argv) : - QCoreApplication(argc, argv), - _currentAssignment() + QCoreApplication(argc, argv) { setOrganizationName("High Fidelity"); setOrganizationDomain("highfidelity.io"); diff --git a/assignment-client/src/AssignmentClient.h b/assignment-client/src/AssignmentClient.h index c267c6238b..1b61fb3efe 100644 --- a/assignment-client/src/AssignmentClient.h +++ b/assignment-client/src/AssignmentClient.h @@ -17,14 +17,18 @@ class AssignmentClient : public QCoreApplication { Q_OBJECT public: AssignmentClient(int &argc, char **argv); + + static const SharedAssignmentPointer& getCurrentAssignment() { return _currentAssignment; } + private slots: void sendAssignmentRequest(); void readPendingDatagrams(); void assignmentCompleted(); void handleAuthenticationRequest(); + private: Assignment _requestAssignment; - SharedAssignmentPointer _currentAssignment; + static SharedAssignmentPointer _currentAssignment; }; #endif /* defined(__hifi__AssignmentClient__) */ diff --git a/assignment-client/src/octree/OctreeQueryNode.cpp b/assignment-client/src/octree/OctreeQueryNode.cpp index ab7b2f65fd..77d36f69fa 100644 --- a/assignment-client/src/octree/OctreeQueryNode.cpp +++ b/assignment-client/src/octree/OctreeQueryNode.cpp @@ -76,9 +76,9 @@ void OctreeQueryNode::deleteLater() { } -void OctreeQueryNode::initializeOctreeSendThread(const SharedOctreeServerPointer& octreeServer, SharedNodePointer node) { +void OctreeQueryNode::initializeOctreeSendThread(const SharedAssignmentPointer& myAssignment, SharedNodePointer node) { // Create octree sending thread... - _octreeSendThread = new OctreeSendThread(octreeServer, node); + _octreeSendThread = new OctreeSendThread(myAssignment, node); _octreeSendThread->initialize(true); } diff --git a/assignment-client/src/octree/OctreeQueryNode.h b/assignment-client/src/octree/OctreeQueryNode.h index ace1235908..66e4e5b0bb 100644 --- a/assignment-client/src/octree/OctreeQueryNode.h +++ b/assignment-client/src/octree/OctreeQueryNode.h @@ -19,9 +19,9 @@ #include #include +#include "OctreeServer.h" + class OctreeSendThread; -class OctreeServer; -typedef QSharedPointer SharedOctreeServerPointer; class OctreeQueryNode : public OctreeQuery { Q_OBJECT @@ -84,7 +84,7 @@ public: OctreeSceneStats stats; - void initializeOctreeSendThread(const SharedOctreeServerPointer& octreeServer, SharedNodePointer node); + void initializeOctreeSendThread(const SharedAssignmentPointer& myAssignment, SharedNodePointer node); bool isOctreeSendThreadInitalized() { return _octreeSendThread; } void dumpOutOfView(); diff --git a/assignment-client/src/octree/OctreeSendThread.cpp b/assignment-client/src/octree/OctreeSendThread.cpp index c760963310..8fe2fb6f30 100644 --- a/assignment-client/src/octree/OctreeSendThread.cpp +++ b/assignment-client/src/octree/OctreeSendThread.cpp @@ -19,8 +19,9 @@ quint64 startSceneSleepTime = 0; quint64 endSceneSleepTime = 0; -OctreeSendThread::OctreeSendThread(const SharedOctreeServerPointer& myServer, SharedNodePointer node) : - _myServer(myServer), +OctreeSendThread::OctreeSendThread(const SharedAssignmentPointer& myAssignment, SharedNodePointer node) : + _myAssignment(myAssignment), + _myServer(static_cast(myAssignment.data())), _node(node), _nodeUUID(node->getUUID()), _packetData(), @@ -28,7 +29,7 @@ OctreeSendThread::OctreeSendThread(const SharedOctreeServerPointer& myServer, Sh _processLock(), _isShuttingDown(false) { - qDebug() << qPrintable(_myServer->getMyServerName()) << "server [" << _myServer.data() << "]: client connected " + qDebug() << qPrintable(_myServer->getMyServerName()) << "server [" << _myServer << "]: client connected " "- starting sending thread [" << this << "]"; OctreeServer::clientConnected(); @@ -37,23 +38,22 @@ OctreeSendThread::OctreeSendThread(const SharedOctreeServerPointer& myServer, Sh OctreeSendThread::~OctreeSendThread() { QString serverName(_myServer->getMyServerName()); - qDebug() << qPrintable(serverName) << "server [" << _myServer.data() << "]: client disconnected " + qDebug() << qPrintable(serverName) << "server [" << _myServer << "]: client disconnected " "- ending sending thread [" << this << "]"; OctreeServer::clientDisconnected(); - qDebug() << qPrintable(serverName) << "server [" << _myServer.data() << "]: " + qDebug() << qPrintable(serverName) << "server [" << _myServer << "]: " "- OctreeSendThread::~OctreeSendThread() this=[" << this << "]" "line: " << __LINE__; _node.clear(); - qDebug() << qPrintable(serverName) << "server [" << _myServer.data() << "]: " + qDebug() << qPrintable(serverName) << "server [" << _myServer << "]: " "- OctreeSendThread::~OctreeSendThread() this=[" << this << "]" "line: " << __LINE__; - void* serverPtr = _myServer.data(); - _myServer.clear(); + _myAssignment.clear(); - qDebug() << qPrintable(serverName) << "server [" << serverPtr << "]: " + qDebug() << qPrintable(serverName) << "server [" << _myServer << "]: " "- OctreeSendThread::~OctreeSendThread() this=[" << this << "]" "line: " << __LINE__; } @@ -73,7 +73,7 @@ bool OctreeSendThread::process() { } // check that our WeakPointer to our server is still valid - if (_myServer.isNull()) { + if (!_myServer || _myAssignment.isNull()) { return false; // exit early if it's not, it means the server is shutting down } diff --git a/assignment-client/src/octree/OctreeSendThread.h b/assignment-client/src/octree/OctreeSendThread.h index bcaa9baf0e..a341a5be7d 100644 --- a/assignment-client/src/octree/OctreeSendThread.h +++ b/assignment-client/src/octree/OctreeSendThread.h @@ -13,6 +13,12 @@ #include #include #include + + +class OctreeServer; +class OctreeQueryNode; + + #include "OctreeQueryNode.h" #include "OctreeServer.h" @@ -20,7 +26,7 @@ class OctreeSendThread : public GenericThread { Q_OBJECT public: - OctreeSendThread(const SharedOctreeServerPointer& myServer, SharedNodePointer node); + OctreeSendThread(const SharedAssignmentPointer& myAssignment, SharedNodePointer node); virtual ~OctreeSendThread(); void setIsShuttingDown(); @@ -37,7 +43,8 @@ protected: virtual bool process(); private: - SharedOctreeServerPointer _myServer; + SharedAssignmentPointer _myAssignment; + OctreeServer* _myServer; SharedNodePointer _node; QUuid _nodeUUID; diff --git a/assignment-client/src/octree/OctreeServer.cpp b/assignment-client/src/octree/OctreeServer.cpp index e5c8cd262c..3134b577ae 100644 --- a/assignment-client/src/octree/OctreeServer.cpp +++ b/assignment-client/src/octree/OctreeServer.cpp @@ -16,6 +16,8 @@ #include #include +#include "../AssignmentClient.h" + #include "OctreeServer.h" #include "OctreeServerConsts.h" @@ -854,7 +856,8 @@ void OctreeServer::readPendingDatagrams() { if (debug) { qDebug() << "calling initializeOctreeSendThread()... node:" << *matchingNode; } - nodeData->initializeOctreeSendThread(SharedOctreeServerPointer(this), matchingNode); + SharedAssignmentPointer sharedAssignment = AssignmentClient::getCurrentAssignment(); + nodeData->initializeOctreeSendThread(sharedAssignment, matchingNode); } } } else if (packetType == PacketTypeJurisdictionRequest) { diff --git a/assignment-client/src/octree/OctreeServer.h b/assignment-client/src/octree/OctreeServer.h index ff9452170d..6405dc986e 100644 --- a/assignment-client/src/octree/OctreeServer.h +++ b/assignment-client/src/octree/OctreeServer.h @@ -20,6 +20,10 @@ #include #include +class OctreeServer; +class OctreeQueryNode; +class OctreeSendThread; + #include "OctreePersistThread.h" #include "OctreeSendThread.h" #include "OctreeServerConsts.h" @@ -27,8 +31,8 @@ const int DEFAULT_PACKETS_PER_INTERVAL = 2000; // some 120,000 packets per second total -class OctreeServer; -typedef QSharedPointer SharedOctreeServerPointer; +//class OctreeServer; +//typedef QSharedPointer SharedOctreeServerPointer; /// Handles assignments of type OctreeServer - sending octrees to various clients. class OctreeServer : public ThreadedAssignment, public HTTPRequestHandler { diff --git a/libraries/shared/src/ThreadedAssignment.cpp b/libraries/shared/src/ThreadedAssignment.cpp index fdf2d91c36..66c0ca750d 100644 --- a/libraries/shared/src/ThreadedAssignment.cpp +++ b/libraries/shared/src/ThreadedAssignment.cpp @@ -17,7 +17,6 @@ ThreadedAssignment::ThreadedAssignment(const QByteArray& packet) : Assignment(packet), _isFinished(false) { - } void ThreadedAssignment::setFinished(bool isFinished) { diff --git a/libraries/shared/src/ThreadedAssignment.h b/libraries/shared/src/ThreadedAssignment.h index f9652dd98d..32118997a9 100644 --- a/libraries/shared/src/ThreadedAssignment.h +++ b/libraries/shared/src/ThreadedAssignment.h @@ -13,6 +13,10 @@ #include "Assignment.h" + +class ThreadedAssignment; +typedef QSharedPointer SharedAssignmentPointer; + class ThreadedAssignment : public Assignment { Q_OBJECT public: @@ -35,8 +39,7 @@ private slots: void checkInWithDomainServerOrExit(); signals: void finished(); -}; + }; -typedef QSharedPointer SharedAssignmentPointer; #endif /* defined(__hifi__ThreadedAssignment__) */ From 0f9df4a8ee4fb9796e226ef95020423dd592a59b Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Mon, 31 Mar 2014 14:11:47 -0700 Subject: [PATCH 08/97] clean up includes --- assignment-client/src/octree/OctreeQueryNode.h | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/assignment-client/src/octree/OctreeQueryNode.h b/assignment-client/src/octree/OctreeQueryNode.h index 66e4e5b0bb..f5b64627a7 100644 --- a/assignment-client/src/octree/OctreeQueryNode.h +++ b/assignment-client/src/octree/OctreeQueryNode.h @@ -10,16 +10,16 @@ #define __hifi__OctreeQueryNode__ #include -#include -#include -#include + #include +#include #include #include +#include +#include #include - -#include "OctreeServer.h" +#include // for SharedAssignmentPointer class OctreeSendThread; From 226274e98b8a4739ae9a179c106eb9a7671285fa Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Mon, 31 Mar 2014 14:24:08 -0700 Subject: [PATCH 09/97] cleaning up SharedNodePointer usage --- assignment-client/src/octree/OctreeQueryNode.cpp | 2 +- assignment-client/src/octree/OctreeQueryNode.h | 2 +- assignment-client/src/octree/OctreeSendThread.cpp | 2 +- assignment-client/src/octree/OctreeSendThread.h | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/assignment-client/src/octree/OctreeQueryNode.cpp b/assignment-client/src/octree/OctreeQueryNode.cpp index 77d36f69fa..20a8d5ce4c 100644 --- a/assignment-client/src/octree/OctreeQueryNode.cpp +++ b/assignment-client/src/octree/OctreeQueryNode.cpp @@ -76,7 +76,7 @@ void OctreeQueryNode::deleteLater() { } -void OctreeQueryNode::initializeOctreeSendThread(const SharedAssignmentPointer& myAssignment, SharedNodePointer node) { +void OctreeQueryNode::initializeOctreeSendThread(const SharedAssignmentPointer& myAssignment, const SharedNodePointer& node) { // Create octree sending thread... _octreeSendThread = new OctreeSendThread(myAssignment, node); _octreeSendThread->initialize(true); diff --git a/assignment-client/src/octree/OctreeQueryNode.h b/assignment-client/src/octree/OctreeQueryNode.h index f5b64627a7..fd8d338663 100644 --- a/assignment-client/src/octree/OctreeQueryNode.h +++ b/assignment-client/src/octree/OctreeQueryNode.h @@ -84,7 +84,7 @@ public: OctreeSceneStats stats; - void initializeOctreeSendThread(const SharedAssignmentPointer& myAssignment, SharedNodePointer node); + void initializeOctreeSendThread(const SharedAssignmentPointer& myAssignment, const SharedNodePointer& node); bool isOctreeSendThreadInitalized() { return _octreeSendThread; } void dumpOutOfView(); diff --git a/assignment-client/src/octree/OctreeSendThread.cpp b/assignment-client/src/octree/OctreeSendThread.cpp index 8fe2fb6f30..14e7086f5c 100644 --- a/assignment-client/src/octree/OctreeSendThread.cpp +++ b/assignment-client/src/octree/OctreeSendThread.cpp @@ -19,7 +19,7 @@ quint64 startSceneSleepTime = 0; quint64 endSceneSleepTime = 0; -OctreeSendThread::OctreeSendThread(const SharedAssignmentPointer& myAssignment, SharedNodePointer node) : +OctreeSendThread::OctreeSendThread(const SharedAssignmentPointer& myAssignment, const SharedNodePointer& node) : _myAssignment(myAssignment), _myServer(static_cast(myAssignment.data())), _node(node), diff --git a/assignment-client/src/octree/OctreeSendThread.h b/assignment-client/src/octree/OctreeSendThread.h index a341a5be7d..a96a30d617 100644 --- a/assignment-client/src/octree/OctreeSendThread.h +++ b/assignment-client/src/octree/OctreeSendThread.h @@ -26,7 +26,7 @@ class OctreeQueryNode; class OctreeSendThread : public GenericThread { Q_OBJECT public: - OctreeSendThread(const SharedAssignmentPointer& myAssignment, SharedNodePointer node); + OctreeSendThread(const SharedAssignmentPointer& myAssignment, const SharedNodePointer& node); virtual ~OctreeSendThread(); void setIsShuttingDown(); From 6df3ff57c42503d8238148b9d4a58e3398c97df0 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Mon, 31 Mar 2014 14:30:25 -0700 Subject: [PATCH 10/97] cleanup isNull() usage --- assignment-client/src/octree/OctreeSendThread.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/assignment-client/src/octree/OctreeSendThread.cpp b/assignment-client/src/octree/OctreeSendThread.cpp index 14e7086f5c..b2e292fb12 100644 --- a/assignment-client/src/octree/OctreeSendThread.cpp +++ b/assignment-client/src/octree/OctreeSendThread.cpp @@ -73,7 +73,7 @@ bool OctreeSendThread::process() { } // check that our WeakPointer to our server is still valid - if (!_myServer || _myAssignment.isNull()) { + if (!_myServer || !_myAssignment) { return false; // exit early if it's not, it means the server is shutting down } @@ -90,7 +90,7 @@ bool OctreeSendThread::process() { // don't do any send processing until the initial load of the octree is complete... if (_myServer->isInitialLoadComplete()) { - if (!_node.isNull()) { + if (_node) { _nodeMissingCount = 0; OctreeQueryNode* nodeData = static_cast(_node->getLinkedData()); From 6601a0d4e96140cd6868294f5696560eb35d443d Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Mon, 31 Mar 2014 14:54:39 -0700 Subject: [PATCH 11/97] cleaning up nodeKilled() --- .../src/octree/OctreeQueryNode.cpp | 21 ++++++++++++++++++- .../src/octree/OctreeQueryNode.h | 1 + assignment-client/src/octree/OctreeServer.cpp | 8 +++---- 3 files changed, 24 insertions(+), 6 deletions(-) diff --git a/assignment-client/src/octree/OctreeQueryNode.cpp b/assignment-client/src/octree/OctreeQueryNode.cpp index 20a8d5ce4c..57de87c45d 100644 --- a/assignment-client/src/octree/OctreeQueryNode.cpp +++ b/assignment-client/src/octree/OctreeQueryNode.cpp @@ -44,7 +44,7 @@ OctreeQueryNode::OctreeQueryNode() : OctreeQueryNode::~OctreeQueryNode() { _isShuttingDown = true; - const bool extraDebugging = false; + const bool extraDebugging = true; if (extraDebugging) { qDebug() << "OctreeQueryNode::~OctreeQueryNode()"; } @@ -75,6 +75,25 @@ void OctreeQueryNode::deleteLater() { OctreeQuery::deleteLater(); } +void OctreeQueryNode::nodeKilled() { + _isShuttingDown = true; + const bool extraDebugging = true; + if (extraDebugging) { + qDebug() << "OctreeQueryNode::nodeKilled()"; + } + if (_octreeSendThread) { + if (extraDebugging) { + qDebug() << "OctreeQueryNode::nodeKilled()... calling _octreeSendThread->terminate()"; + } + _octreeSendThread->terminate(); + if (extraDebugging) { + qDebug() << "OctreeQueryNode::nodeKilled()... calling delete _octreeSendThread"; + } + delete _octreeSendThread; + _octreeSendThread = NULL; + } +} + void OctreeQueryNode::initializeOctreeSendThread(const SharedAssignmentPointer& myAssignment, const SharedNodePointer& node) { // Create octree sending thread... diff --git a/assignment-client/src/octree/OctreeQueryNode.h b/assignment-client/src/octree/OctreeQueryNode.h index fd8d338663..c08bdcb2bf 100644 --- a/assignment-client/src/octree/OctreeQueryNode.h +++ b/assignment-client/src/octree/OctreeQueryNode.h @@ -94,6 +94,7 @@ public: unsigned int getlastOctreePacketLength() const { return _lastOctreePacketLength; } int getDuplicatePacketCount() const { return _duplicatePacketCount; } + void nodeKilled(); bool isShuttingDown() const { return _isShuttingDown; } private: diff --git a/assignment-client/src/octree/OctreeServer.cpp b/assignment-client/src/octree/OctreeServer.cpp index 3134b577ae..6499a2f4a4 100644 --- a/assignment-client/src/octree/OctreeServer.cpp +++ b/assignment-client/src/octree/OctreeServer.cpp @@ -21,7 +21,7 @@ #include "OctreeServer.h" #include "OctreeServerConsts.h" -OctreeServer* OctreeServer::_instance; +OctreeServer* OctreeServer::_instance = NULL; int OctreeServer::_clientCount = 0; const int MOVING_AVERAGE_SAMPLE_COUNTS = 1000000; @@ -1064,10 +1064,8 @@ void OctreeServer::nodeKilled(SharedNodePointer node) { qDebug() << qPrintable(_safeServerName) << "server killed node:" << *node; OctreeQueryNode* nodeData = static_cast(node->getLinkedData()); if (nodeData) { - qDebug() << qPrintable(_safeServerName) << "server resetting Linked Data for node:" << *node; - node->setLinkedData(NULL); // set this first in case another thread comes through and tryes to acces this - qDebug() << qPrintable(_safeServerName) << "server deleting Linked Data for node:" << *node; - nodeData->deleteLater(); + qDebug() << qPrintable(_safeServerName) << "server calling nodeData->nodeKilled() for node:" << *node; + nodeData->nodeKilled(); // tell our node data and sending threads that we'd like to shut down } else { qDebug() << qPrintable(_safeServerName) << "server node missing linked data node:" << *node; } From a82a583030399c9651062e7db1cc0a21b1c488a0 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Mon, 31 Mar 2014 14:59:28 -0700 Subject: [PATCH 12/97] cleanup --- assignment-client/src/octree/OctreeSendThread.cpp | 2 +- assignment-client/src/octree/OctreeServer.h | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/assignment-client/src/octree/OctreeSendThread.cpp b/assignment-client/src/octree/OctreeSendThread.cpp index b2e292fb12..9c0ddbb779 100644 --- a/assignment-client/src/octree/OctreeSendThread.cpp +++ b/assignment-client/src/octree/OctreeSendThread.cpp @@ -72,7 +72,7 @@ bool OctreeSendThread::process() { return false; // exit early if we're shutting down } - // check that our WeakPointer to our server is still valid + // check that our server and assignment is still valid if (!_myServer || !_myAssignment) { return false; // exit early if it's not, it means the server is shutting down } diff --git a/assignment-client/src/octree/OctreeServer.h b/assignment-client/src/octree/OctreeServer.h index 6405dc986e..4ac0339001 100644 --- a/assignment-client/src/octree/OctreeServer.h +++ b/assignment-client/src/octree/OctreeServer.h @@ -13,7 +13,6 @@ #include #include #include -#include #include From d2cf898e220f1829f81d5a261cfa0235218983d0 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Mon, 31 Mar 2014 15:06:17 -0700 Subject: [PATCH 13/97] revert tweaks --- libraries/shared/src/ThreadedAssignment.h | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/libraries/shared/src/ThreadedAssignment.h b/libraries/shared/src/ThreadedAssignment.h index 32118997a9..aa2994a2be 100644 --- a/libraries/shared/src/ThreadedAssignment.h +++ b/libraries/shared/src/ThreadedAssignment.h @@ -13,10 +13,6 @@ #include "Assignment.h" - -class ThreadedAssignment; -typedef QSharedPointer SharedAssignmentPointer; - class ThreadedAssignment : public Assignment { Q_OBJECT public: @@ -39,7 +35,9 @@ private slots: void checkInWithDomainServerOrExit(); signals: void finished(); - }; +}; + +typedef QSharedPointer SharedAssignmentPointer; #endif /* defined(__hifi__ThreadedAssignment__) */ From 5ef437da39ee86794dfadb97cc5810fe1f86d3ca Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Mon, 31 Mar 2014 15:07:13 -0700 Subject: [PATCH 14/97] revert tweaks --- libraries/shared/src/ThreadedAssignment.h | 1 - 1 file changed, 1 deletion(-) diff --git a/libraries/shared/src/ThreadedAssignment.h b/libraries/shared/src/ThreadedAssignment.h index aa2994a2be..f9652dd98d 100644 --- a/libraries/shared/src/ThreadedAssignment.h +++ b/libraries/shared/src/ThreadedAssignment.h @@ -39,5 +39,4 @@ signals: typedef QSharedPointer SharedAssignmentPointer; - #endif /* defined(__hifi__ThreadedAssignment__) */ From 6fd1a6f4e44f7bec3f5632cac242a6cc70a9f09f Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Mon, 31 Mar 2014 15:07:34 -0700 Subject: [PATCH 15/97] revert tweaks --- libraries/shared/src/ThreadedAssignment.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/libraries/shared/src/ThreadedAssignment.cpp b/libraries/shared/src/ThreadedAssignment.cpp index 66c0ca750d..09569dbe81 100644 --- a/libraries/shared/src/ThreadedAssignment.cpp +++ b/libraries/shared/src/ThreadedAssignment.cpp @@ -17,6 +17,7 @@ ThreadedAssignment::ThreadedAssignment(const QByteArray& packet) : Assignment(packet), _isFinished(false) { + } void ThreadedAssignment::setFinished(bool isFinished) { From 989e087701dc7e324b0e2293f5467052a01f7850 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Mon, 31 Mar 2014 15:09:18 -0700 Subject: [PATCH 16/97] revert tweaks --- libraries/shared/src/ThreadedAssignment.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/shared/src/ThreadedAssignment.cpp b/libraries/shared/src/ThreadedAssignment.cpp index 09569dbe81..fdf2d91c36 100644 --- a/libraries/shared/src/ThreadedAssignment.cpp +++ b/libraries/shared/src/ThreadedAssignment.cpp @@ -17,7 +17,7 @@ ThreadedAssignment::ThreadedAssignment(const QByteArray& packet) : Assignment(packet), _isFinished(false) { - + } void ThreadedAssignment::setFinished(bool isFinished) { From 514f43c6cc0dad10b7eb17ee3765c609a7af2fa5 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Mon, 31 Mar 2014 15:10:36 -0700 Subject: [PATCH 17/97] revert tweaks --- assignment-client/src/octree/OctreeServer.h | 7 ------- 1 file changed, 7 deletions(-) diff --git a/assignment-client/src/octree/OctreeServer.h b/assignment-client/src/octree/OctreeServer.h index 4ac0339001..63d43b6634 100644 --- a/assignment-client/src/octree/OctreeServer.h +++ b/assignment-client/src/octree/OctreeServer.h @@ -19,10 +19,6 @@ #include #include -class OctreeServer; -class OctreeQueryNode; -class OctreeSendThread; - #include "OctreePersistThread.h" #include "OctreeSendThread.h" #include "OctreeServerConsts.h" @@ -30,9 +26,6 @@ class OctreeSendThread; const int DEFAULT_PACKETS_PER_INTERVAL = 2000; // some 120,000 packets per second total -//class OctreeServer; -//typedef QSharedPointer SharedOctreeServerPointer; - /// Handles assignments of type OctreeServer - sending octrees to various clients. class OctreeServer : public ThreadedAssignment, public HTTPRequestHandler { Q_OBJECT From 27f42b5b863f35ba187e2f986fb25c98def3904b Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Mon, 31 Mar 2014 15:15:54 -0700 Subject: [PATCH 18/97] clean up headers --- assignment-client/src/octree/OctreeSendThread.h | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/assignment-client/src/octree/OctreeSendThread.h b/assignment-client/src/octree/OctreeSendThread.h index a96a30d617..85c7c18b19 100644 --- a/assignment-client/src/octree/OctreeSendThread.h +++ b/assignment-client/src/octree/OctreeSendThread.h @@ -13,14 +13,11 @@ #include #include #include - - -class OctreeServer; -class OctreeQueryNode; - +#include #include "OctreeQueryNode.h" -#include "OctreeServer.h" + +class OctreeServer; /// Threaded processor for sending voxel packets to a single client class OctreeSendThread : public GenericThread { From a9d153054fde6b0def1240f16dbde6caa59e644c Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Mon, 31 Mar 2014 15:28:13 -0700 Subject: [PATCH 19/97] remove _process mutex since it's no longer needed --- assignment-client/src/octree/OctreeSendThread.cpp | 13 ------------- assignment-client/src/octree/OctreeSendThread.h | 1 - 2 files changed, 14 deletions(-) diff --git a/assignment-client/src/octree/OctreeSendThread.cpp b/assignment-client/src/octree/OctreeSendThread.cpp index 9c0ddbb779..b2bb2a8c16 100644 --- a/assignment-client/src/octree/OctreeSendThread.cpp +++ b/assignment-client/src/octree/OctreeSendThread.cpp @@ -26,7 +26,6 @@ OctreeSendThread::OctreeSendThread(const SharedAssignmentPointer& myAssignment, _nodeUUID(node->getUUID()), _packetData(), _nodeMissingCount(0), - _processLock(), _isShuttingDown(false) { qDebug() << qPrintable(_myServer->getMyServerName()) << "server [" << _myServer << "]: client connected " @@ -61,9 +60,6 @@ OctreeSendThread::~OctreeSendThread() { void OctreeSendThread::setIsShuttingDown() { _isShuttingDown = true; OctreeServer::stopTrackingThread(this); - - // this will cause us to wait till the process loop is complete, we do this after we change _isShuttingDown - QMutexLocker locker(&_processLock); } @@ -79,13 +75,6 @@ bool OctreeSendThread::process() { OctreeServer::didProcess(this); - float lockWaitElapsedUsec = OctreeServer::SKIP_TIME; - quint64 lockWaitStart = usecTimestampNow(); - _processLock.lock(); - quint64 lockWaitEnd = usecTimestampNow(); - lockWaitElapsedUsec = (float)(lockWaitEnd - lockWaitStart); - OctreeServer::trackProcessWaitTime(lockWaitElapsedUsec); - quint64 start = usecTimestampNow(); // don't do any send processing until the initial load of the octree is complete... @@ -102,8 +91,6 @@ bool OctreeSendThread::process() { } } - _processLock.unlock(); - if (_isShuttingDown) { return false; // exit early if we're shutting down } diff --git a/assignment-client/src/octree/OctreeSendThread.h b/assignment-client/src/octree/OctreeSendThread.h index 85c7c18b19..971e27668c 100644 --- a/assignment-client/src/octree/OctreeSendThread.h +++ b/assignment-client/src/octree/OctreeSendThread.h @@ -51,7 +51,6 @@ private: OctreePacketData _packetData; int _nodeMissingCount; - QMutex _processLock; // don't allow us to have our nodeData, or our thread to be deleted while we're processing bool _isShuttingDown; }; From 1eb15b0d12c230ea9de3dbade8284ece9cc43845 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Mon, 31 Mar 2014 15:37:53 -0700 Subject: [PATCH 20/97] cleanup --- assignment-client/src/octree/OctreeQueryNode.cpp | 12 +----------- 1 file changed, 1 insertion(+), 11 deletions(-) diff --git a/assignment-client/src/octree/OctreeQueryNode.cpp b/assignment-client/src/octree/OctreeQueryNode.cpp index 57de87c45d..56fdbb997b 100644 --- a/assignment-client/src/octree/OctreeQueryNode.cpp +++ b/assignment-client/src/octree/OctreeQueryNode.cpp @@ -44,7 +44,7 @@ OctreeQueryNode::OctreeQueryNode() : OctreeQueryNode::~OctreeQueryNode() { _isShuttingDown = true; - const bool extraDebugging = true; + const bool extraDebugging = false; if (extraDebugging) { qDebug() << "OctreeQueryNode::~OctreeQueryNode()"; } @@ -77,18 +77,8 @@ void OctreeQueryNode::deleteLater() { void OctreeQueryNode::nodeKilled() { _isShuttingDown = true; - const bool extraDebugging = true; - if (extraDebugging) { - qDebug() << "OctreeQueryNode::nodeKilled()"; - } if (_octreeSendThread) { - if (extraDebugging) { - qDebug() << "OctreeQueryNode::nodeKilled()... calling _octreeSendThread->terminate()"; - } _octreeSendThread->terminate(); - if (extraDebugging) { - qDebug() << "OctreeQueryNode::nodeKilled()... calling delete _octreeSendThread"; - } delete _octreeSendThread; _octreeSendThread = NULL; } From b3734d870b31803281c79be2570451d91e9549a5 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Mon, 31 Mar 2014 15:39:12 -0700 Subject: [PATCH 21/97] cleanup --- assignment-client/src/octree/OctreeSendThread.cpp | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/assignment-client/src/octree/OctreeSendThread.cpp b/assignment-client/src/octree/OctreeSendThread.cpp index b2bb2a8c16..8bf70c3853 100644 --- a/assignment-client/src/octree/OctreeSendThread.cpp +++ b/assignment-client/src/octree/OctreeSendThread.cpp @@ -40,21 +40,8 @@ OctreeSendThread::~OctreeSendThread() { qDebug() << qPrintable(serverName) << "server [" << _myServer << "]: client disconnected " "- ending sending thread [" << this << "]"; OctreeServer::clientDisconnected(); - - qDebug() << qPrintable(serverName) << "server [" << _myServer << "]: " - "- OctreeSendThread::~OctreeSendThread() this=[" << this << "]" - "line: " << __LINE__; - _node.clear(); - - qDebug() << qPrintable(serverName) << "server [" << _myServer << "]: " - "- OctreeSendThread::~OctreeSendThread() this=[" << this << "]" - "line: " << __LINE__; _myAssignment.clear(); - - qDebug() << qPrintable(serverName) << "server [" << _myServer << "]: " - "- OctreeSendThread::~OctreeSendThread() this=[" << this << "]" - "line: " << __LINE__; } void OctreeSendThread::setIsShuttingDown() { From 5c37a79378c2023c54d400711a6c95fa259d4a6d Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Mon, 31 Mar 2014 15:42:16 -0700 Subject: [PATCH 22/97] cleanup of debuggin --- assignment-client/src/octree/OctreeServer.cpp | 16 +--------------- 1 file changed, 1 insertion(+), 15 deletions(-) diff --git a/assignment-client/src/octree/OctreeServer.cpp b/assignment-client/src/octree/OctreeServer.cpp index 6499a2f4a4..a79bba44a4 100644 --- a/assignment-client/src/octree/OctreeServer.cpp +++ b/assignment-client/src/octree/OctreeServer.cpp @@ -250,40 +250,26 @@ OctreeServer::~OctreeServer() { } delete[] _parsedArgV; } - qDebug() << qPrintable(_safeServerName) << "server shutting down... [" << this << "] OctreeServer::~OctreeServer() line:" << __LINE__; if (_jurisdictionSender) { _jurisdictionSender->terminate(); _jurisdictionSender->deleteLater(); } - qDebug() << qPrintable(_safeServerName) << "server shutting down... [" << this << "] OctreeServer::~OctreeServer() line:" << __LINE__; - if (_octreeInboundPacketProcessor) { _octreeInboundPacketProcessor->terminate(); _octreeInboundPacketProcessor->deleteLater(); } - qDebug() << qPrintable(_safeServerName) << "server shutting down... [" << this << "] OctreeServer::~OctreeServer() line:" << __LINE__; - if (_persistThread) { - qDebug() << qPrintable(_safeServerName) << "server shutting down... [" << this << "] OctreeServer::~OctreeServer() line:" << __LINE__; _persistThread->terminate(); - qDebug() << qPrintable(_safeServerName) << "server shutting down... [" << this << "] OctreeServer::~OctreeServer() line:" << __LINE__; _persistThread->deleteLater(); - qDebug() << qPrintable(_safeServerName) << "server shutting down... [" << this << "] OctreeServer::~OctreeServer() line:" << __LINE__; } - qDebug() << qPrintable(_safeServerName) << "server shutting down... [" << this << "] OctreeServer::~OctreeServer() line:" << __LINE__; - delete _jurisdiction; _jurisdiction = NULL; - qDebug() << qPrintable(_safeServerName) << "server DONE shutting down... [" << this << "]"; - - qDebug() << qPrintable(_safeServerName) << "server shutting down... [" << this << "] OctreeServer::~OctreeServer() line:" << __LINE__; - _instance = NULL; // we are gone - qDebug() << qPrintable(_safeServerName) << "server shutting down... [" << this << "] OctreeServer::~OctreeServer() line:" << __LINE__; + qDebug() << qPrintable(_safeServerName) << "server DONE shutting down... [" << this << "]"; } void OctreeServer::initHTTPManager(int port) { From 81fc0bea4dc35da6adaf93b53dafd3019afb9f17 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Mon, 31 Mar 2014 15:50:40 -0700 Subject: [PATCH 23/97] revert small tweaks --- libraries/octree/src/OctreePersistThread.cpp | 4 ---- libraries/octree/src/OctreePersistThread.h | 1 - 2 files changed, 5 deletions(-) diff --git a/libraries/octree/src/OctreePersistThread.cpp b/libraries/octree/src/OctreePersistThread.cpp index 6c0c0d9bfe..29715f9d90 100644 --- a/libraries/octree/src/OctreePersistThread.cpp +++ b/libraries/octree/src/OctreePersistThread.cpp @@ -23,10 +23,6 @@ OctreePersistThread::OctreePersistThread(Octree* tree, const QString& filename, { } -OctreePersistThread::~OctreePersistThread() { - qDebug() << "OctreePersistThread::~OctreePersistThread()..."; -} - bool OctreePersistThread::process() { if (!_initialLoadComplete) { diff --git a/libraries/octree/src/OctreePersistThread.h b/libraries/octree/src/OctreePersistThread.h index 8e70733192..ce6190b0e6 100644 --- a/libraries/octree/src/OctreePersistThread.h +++ b/libraries/octree/src/OctreePersistThread.h @@ -22,7 +22,6 @@ public: static const int DEFAULT_PERSIST_INTERVAL = 1000 * 30; // every 30 seconds OctreePersistThread(Octree* tree, const QString& filename, int persistInterval = DEFAULT_PERSIST_INTERVAL); - ~OctreePersistThread(); bool isInitialLoadComplete() const { return _initialLoadComplete; } quint64 getLoadElapsedTime() const { return _loadTimeUSecs; } From 7a683b177da5eb88a1725a9091f08536352c32ad Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Mon, 31 Mar 2014 16:43:25 -0700 Subject: [PATCH 24/97] added some debugging, and reordered some shutdown logic --- .../src/octree/OctreeQueryNode.cpp | 17 +++++++++++++++-- .../src/octree/OctreeSendThread.cpp | 17 ++++++++++++++++- assignment-client/src/octree/OctreeServer.cpp | 1 + 3 files changed, 32 insertions(+), 3 deletions(-) diff --git a/assignment-client/src/octree/OctreeQueryNode.cpp b/assignment-client/src/octree/OctreeQueryNode.cpp index 56fdbb997b..3b73617845 100644 --- a/assignment-client/src/octree/OctreeQueryNode.cpp +++ b/assignment-client/src/octree/OctreeQueryNode.cpp @@ -44,7 +44,7 @@ OctreeQueryNode::OctreeQueryNode() : OctreeQueryNode::~OctreeQueryNode() { _isShuttingDown = true; - const bool extraDebugging = false; + const bool extraDebugging = true; if (extraDebugging) { qDebug() << "OctreeQueryNode::~OctreeQueryNode()"; } @@ -76,12 +76,25 @@ void OctreeQueryNode::deleteLater() { } void OctreeQueryNode::nodeKilled() { + qDebug() << "OctreeQueryNode::nodeKilled()... "; _isShuttingDown = true; if (_octreeSendThread) { + qDebug() << "OctreeQueryNode::nodeKilled()... calling _octreeSendThread->terminate()"; _octreeSendThread->terminate(); - delete _octreeSendThread; + qDebug() << "OctreeQueryNode::nodeKilled()... AFTER _octreeSendThread->terminate()"; + + OctreeSendThread* sendThread = _octreeSendThread; + + qDebug() << "OctreeQueryNode::nodeKilled()... calling _octreeSendThread = NULL"; _octreeSendThread = NULL; + qDebug() << "OctreeQueryNode::nodeKilled()... AFTER _octreeSendThread = NULL"; + + qDebug() << "OctreeQueryNode::nodeKilled()... calling delete sendThread"; + delete sendThread; + qDebug() << "OctreeQueryNode::nodeKilled()... AFTER delete sendThread"; + } + qDebug() << "OctreeQueryNode::nodeKilled()... DONE"; } diff --git a/assignment-client/src/octree/OctreeSendThread.cpp b/assignment-client/src/octree/OctreeSendThread.cpp index 8bf70c3853..b98d17c033 100644 --- a/assignment-client/src/octree/OctreeSendThread.cpp +++ b/assignment-client/src/octree/OctreeSendThread.cpp @@ -35,13 +35,28 @@ OctreeSendThread::OctreeSendThread(const SharedAssignmentPointer& myAssignment, } OctreeSendThread::~OctreeSendThread() { - QString serverName(_myServer->getMyServerName()); + qDebug() << "OctreeSendThread::~OctreeSendThread()... START"; + QString serverName("Octree"); + if (_myServer) { + serverName = _myServer->getMyServerName(); + } qDebug() << qPrintable(serverName) << "server [" << _myServer << "]: client disconnected " "- ending sending thread [" << this << "]"; + + qDebug() << "OctreeSendThread::~OctreeSendThread()... BEFORE OctreeServer::clientDisconnected();"; OctreeServer::clientDisconnected(); + qDebug() << "OctreeSendThread::~OctreeSendThread()... AFTER OctreeServer::clientDisconnected();"; + + qDebug() << "OctreeSendThread::~OctreeSendThread()... BEFORE _node.clear();"; _node.clear(); + qDebug() << "OctreeSendThread::~OctreeSendThread()... AFTER _node.clear();"; + + qDebug() << "OctreeSendThread::~OctreeSendThread()... BEFORE _myAssignment.clear();"; _myAssignment.clear(); + qDebug() << "OctreeSendThread::~OctreeSendThread()... BEFORE _myAssignment.clear();"; + + qDebug() << "OctreeSendThread::~OctreeSendThread()... DONE"; } void OctreeSendThread::setIsShuttingDown() { diff --git a/assignment-client/src/octree/OctreeServer.cpp b/assignment-client/src/octree/OctreeServer.cpp index a79bba44a4..977c0c25f3 100644 --- a/assignment-client/src/octree/OctreeServer.cpp +++ b/assignment-client/src/octree/OctreeServer.cpp @@ -1052,6 +1052,7 @@ void OctreeServer::nodeKilled(SharedNodePointer node) { if (nodeData) { qDebug() << qPrintable(_safeServerName) << "server calling nodeData->nodeKilled() for node:" << *node; nodeData->nodeKilled(); // tell our node data and sending threads that we'd like to shut down + qDebug() << qPrintable(_safeServerName) << "server AFTER nodeData->nodeKilled() for node:" << *node; } else { qDebug() << qPrintable(_safeServerName) << "server node missing linked data node:" << *node; } From dc302e7126cd6e33abc68e444b71144a802b1beb Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Mon, 31 Mar 2014 16:51:00 -0700 Subject: [PATCH 25/97] tweak shutdown --- assignment-client/src/octree/OctreeQueryNode.cpp | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/assignment-client/src/octree/OctreeQueryNode.cpp b/assignment-client/src/octree/OctreeQueryNode.cpp index 3b73617845..d2c1cf281e 100644 --- a/assignment-client/src/octree/OctreeQueryNode.cpp +++ b/assignment-client/src/octree/OctreeQueryNode.cpp @@ -48,6 +48,8 @@ OctreeQueryNode::~OctreeQueryNode() { if (extraDebugging) { qDebug() << "OctreeQueryNode::~OctreeQueryNode()"; } + + /* if (_octreeSendThread) { if (extraDebugging) { qDebug() << "OctreeQueryNode::~OctreeQueryNode()... calling _octreeSendThread->terminate()"; @@ -58,6 +60,7 @@ OctreeQueryNode::~OctreeQueryNode() { } delete _octreeSendThread; } + */ delete[] _octreePacket; delete[] _lastOctreePacket; @@ -79,16 +82,20 @@ void OctreeQueryNode::nodeKilled() { qDebug() << "OctreeQueryNode::nodeKilled()... "; _isShuttingDown = true; if (_octreeSendThread) { - qDebug() << "OctreeQueryNode::nodeKilled()... calling _octreeSendThread->terminate()"; - _octreeSendThread->terminate(); - qDebug() << "OctreeQueryNode::nodeKilled()... AFTER _octreeSendThread->terminate()"; - OctreeSendThread* sendThread = _octreeSendThread; qDebug() << "OctreeQueryNode::nodeKilled()... calling _octreeSendThread = NULL"; _octreeSendThread = NULL; qDebug() << "OctreeQueryNode::nodeKilled()... AFTER _octreeSendThread = NULL"; + qDebug() << "OctreeQueryNode::nodeKilled()... calling _octreeSendThread->setIsShuttingDown()"; + sendThread->setIsShuttingDown(); + qDebug() << "OctreeQueryNode::nodeKilled()... AFTER _octreeSendThread->setIsShuttingDown()"; + + qDebug() << "OctreeQueryNode::nodeKilled()... calling _octreeSendThread->terminate()"; + sendThread->terminate(); + qDebug() << "OctreeQueryNode::nodeKilled()... AFTER _octreeSendThread->terminate()"; + qDebug() << "OctreeQueryNode::nodeKilled()... calling delete sendThread"; delete sendThread; qDebug() << "OctreeQueryNode::nodeKilled()... AFTER delete sendThread"; From ef68f164c9a7aa1bfd9fe66d6045df196c883dcc Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Mon, 31 Mar 2014 17:05:31 -0700 Subject: [PATCH 26/97] tweak shutdown --- assignment-client/src/octree/OctreeQueryNode.cpp | 5 +++++ assignment-client/src/octree/OctreeSendThread.cpp | 11 ++++++++++- assignment-client/src/octree/OctreeServer.cpp | 4 ++++ 3 files changed, 19 insertions(+), 1 deletion(-) diff --git a/assignment-client/src/octree/OctreeQueryNode.cpp b/assignment-client/src/octree/OctreeQueryNode.cpp index d2c1cf281e..fe2e271a09 100644 --- a/assignment-client/src/octree/OctreeQueryNode.cpp +++ b/assignment-client/src/octree/OctreeQueryNode.cpp @@ -107,8 +107,13 @@ void OctreeQueryNode::nodeKilled() { void OctreeQueryNode::initializeOctreeSendThread(const SharedAssignmentPointer& myAssignment, const SharedNodePointer& node) { // Create octree sending thread... + qDebug() << "OctreeQueryNode::initializeOctreeSendThread()... BEFORE new OctreeSendThread(myAssignment, node);"; _octreeSendThread = new OctreeSendThread(myAssignment, node); + qDebug() << "OctreeQueryNode::initializeOctreeSendThread()... AFTER new OctreeSendThread(myAssignment, node);"; + + qDebug() << "OctreeQueryNode::initializeOctreeSendThread()... BEFORE _octreeSendThread->initialize(true)"; _octreeSendThread->initialize(true); + qDebug() << "OctreeQueryNode::initializeOctreeSendThread()... AFTER _octreeSendThread->initialize(true)"; } bool OctreeQueryNode::packetIsDuplicate() const { diff --git a/assignment-client/src/octree/OctreeSendThread.cpp b/assignment-client/src/octree/OctreeSendThread.cpp index b98d17c033..20a7260737 100644 --- a/assignment-client/src/octree/OctreeSendThread.cpp +++ b/assignment-client/src/octree/OctreeSendThread.cpp @@ -28,10 +28,19 @@ OctreeSendThread::OctreeSendThread(const SharedAssignmentPointer& myAssignment, _nodeMissingCount(0), _isShuttingDown(false) { - qDebug() << qPrintable(_myServer->getMyServerName()) << "server [" << _myServer << "]: client connected " + qDebug() << "OctreeSendThread::OctreeSendThread()... START"; + + QString serverName("Octree"); + if (_myServer) { + serverName = _myServer->getMyServerName(); + } + qDebug() << qPrintable(serverName) << "server [" << _myServer << "]: client connected " "- starting sending thread [" << this << "]"; + qDebug() << "OctreeSendThread::OctreeSendThread()... before OctreeServer::clientConnected()"; OctreeServer::clientConnected(); + qDebug() << "OctreeSendThread::OctreeSendThread()... AFTER OctreeServer::clientConnected()"; + qDebug() << "OctreeSendThread::OctreeSendThread()... DONE"; } OctreeSendThread::~OctreeSendThread() { diff --git a/assignment-client/src/octree/OctreeServer.cpp b/assignment-client/src/octree/OctreeServer.cpp index 977c0c25f3..e791b542fc 100644 --- a/assignment-client/src/octree/OctreeServer.cpp +++ b/assignment-client/src/octree/OctreeServer.cpp @@ -842,8 +842,12 @@ void OctreeServer::readPendingDatagrams() { if (debug) { qDebug() << "calling initializeOctreeSendThread()... node:" << *matchingNode; } + + + qDebug() << "OctreeServer::readPendingDatagrams()... BEFORE nodeData->initializeOctreeSendThread()"; SharedAssignmentPointer sharedAssignment = AssignmentClient::getCurrentAssignment(); nodeData->initializeOctreeSendThread(sharedAssignment, matchingNode); + qDebug() << "OctreeServer::readPendingDatagrams()... AFTER nodeData->initializeOctreeSendThread()"; } } } else if (packetType == PacketTypeJurisdictionRequest) { From 4bf7faba7b64f45cc65255796bee828ffd00c893 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Mon, 31 Mar 2014 17:55:40 -0700 Subject: [PATCH 27/97] workaround for assert failures when bad view frustum input --- libraries/octree/src/ViewFrustum.cpp | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/libraries/octree/src/ViewFrustum.cpp b/libraries/octree/src/ViewFrustum.cpp index fa6873b093..dbb6f955f2 100644 --- a/libraries/octree/src/ViewFrustum.cpp +++ b/libraries/octree/src/ViewFrustum.cpp @@ -129,9 +129,11 @@ void ViewFrustum::calculate() { // Also calculate our projection matrix in case people want to project points... // Projection matrix : Field of View, ratio, display range : near to far - glm::mat4 projection = glm::perspective(_fieldOfView, _aspectRatio, _nearClip, _farClip); - glm::vec3 lookAt = _position + _direction; - glm::mat4 view = glm::lookAt(_position, lookAt, _up); + const float CLIP_NUDGE = 1.0f; + float farClip = (_farClip != _nearClip) ? _farClip : _nearClip + CLIP_NUDGE; // don't allow near and far to be equal + glm::mat4 projection = glm::perspective(_fieldOfView, _aspectRatio, _nearClip, farClip); + glm::vec3 lookAt = _position + _direction; + glm::mat4 view = glm::lookAt(_position, lookAt, _up); // Our ModelViewProjection : multiplication of our 3 matrices (note: model is identity, so we can drop it) _ourModelViewProjectionMatrix = projection * view; // Remember, matrix multiplication is the other way around From 9d60be97736f5c9e1b594bb6768cbe9cd74e242e Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Mon, 31 Mar 2014 17:57:48 -0700 Subject: [PATCH 28/97] cleanup some debugging --- .../src/octree/OctreeQueryNode.cpp | 37 ++++++------------- .../src/octree/OctreeSendThread.cpp | 24 ++++++------ 2 files changed, 24 insertions(+), 37 deletions(-) diff --git a/assignment-client/src/octree/OctreeQueryNode.cpp b/assignment-client/src/octree/OctreeQueryNode.cpp index fe2e271a09..3291fb49ba 100644 --- a/assignment-client/src/octree/OctreeQueryNode.cpp +++ b/assignment-client/src/octree/OctreeQueryNode.cpp @@ -49,19 +49,6 @@ OctreeQueryNode::~OctreeQueryNode() { qDebug() << "OctreeQueryNode::~OctreeQueryNode()"; } - /* - if (_octreeSendThread) { - if (extraDebugging) { - qDebug() << "OctreeQueryNode::~OctreeQueryNode()... calling _octreeSendThread->terminate()"; - } - _octreeSendThread->terminate(); - if (extraDebugging) { - qDebug() << "OctreeQueryNode::~OctreeQueryNode()... calling delete _octreeSendThread"; - } - delete _octreeSendThread; - } - */ - delete[] _octreePacket; delete[] _lastOctreePacket; if (extraDebugging) { @@ -84,21 +71,21 @@ void OctreeQueryNode::nodeKilled() { if (_octreeSendThread) { OctreeSendThread* sendThread = _octreeSendThread; - qDebug() << "OctreeQueryNode::nodeKilled()... calling _octreeSendThread = NULL"; + //qDebug() << "OctreeQueryNode::nodeKilled()... calling _octreeSendThread = NULL"; _octreeSendThread = NULL; - qDebug() << "OctreeQueryNode::nodeKilled()... AFTER _octreeSendThread = NULL"; + //qDebug() << "OctreeQueryNode::nodeKilled()... AFTER _octreeSendThread = NULL"; - qDebug() << "OctreeQueryNode::nodeKilled()... calling _octreeSendThread->setIsShuttingDown()"; + //qDebug() << "OctreeQueryNode::nodeKilled()... calling _octreeSendThread->setIsShuttingDown()"; sendThread->setIsShuttingDown(); - qDebug() << "OctreeQueryNode::nodeKilled()... AFTER _octreeSendThread->setIsShuttingDown()"; + //qDebug() << "OctreeQueryNode::nodeKilled()... AFTER _octreeSendThread->setIsShuttingDown()"; - qDebug() << "OctreeQueryNode::nodeKilled()... calling _octreeSendThread->terminate()"; + //qDebug() << "OctreeQueryNode::nodeKilled()... calling _octreeSendThread->terminate()"; sendThread->terminate(); - qDebug() << "OctreeQueryNode::nodeKilled()... AFTER _octreeSendThread->terminate()"; + //qDebug() << "OctreeQueryNode::nodeKilled()... AFTER _octreeSendThread->terminate()"; - qDebug() << "OctreeQueryNode::nodeKilled()... calling delete sendThread"; + //qDebug() << "OctreeQueryNode::nodeKilled()... calling delete sendThread"; delete sendThread; - qDebug() << "OctreeQueryNode::nodeKilled()... AFTER delete sendThread"; + //qDebug() << "OctreeQueryNode::nodeKilled()... AFTER delete sendThread"; } qDebug() << "OctreeQueryNode::nodeKilled()... DONE"; @@ -107,13 +94,13 @@ void OctreeQueryNode::nodeKilled() { void OctreeQueryNode::initializeOctreeSendThread(const SharedAssignmentPointer& myAssignment, const SharedNodePointer& node) { // Create octree sending thread... - qDebug() << "OctreeQueryNode::initializeOctreeSendThread()... BEFORE new OctreeSendThread(myAssignment, node);"; + //qDebug() << "OctreeQueryNode::initializeOctreeSendThread()... BEFORE new OctreeSendThread(myAssignment, node);"; _octreeSendThread = new OctreeSendThread(myAssignment, node); - qDebug() << "OctreeQueryNode::initializeOctreeSendThread()... AFTER new OctreeSendThread(myAssignment, node);"; + //qDebug() << "OctreeQueryNode::initializeOctreeSendThread()... AFTER new OctreeSendThread(myAssignment, node);"; - qDebug() << "OctreeQueryNode::initializeOctreeSendThread()... BEFORE _octreeSendThread->initialize(true)"; + //qDebug() << "OctreeQueryNode::initializeOctreeSendThread()... BEFORE _octreeSendThread->initialize(true)"; _octreeSendThread->initialize(true); - qDebug() << "OctreeQueryNode::initializeOctreeSendThread()... AFTER _octreeSendThread->initialize(true)"; + //qDebug() << "OctreeQueryNode::initializeOctreeSendThread()... AFTER _octreeSendThread->initialize(true)"; } bool OctreeQueryNode::packetIsDuplicate() const { diff --git a/assignment-client/src/octree/OctreeSendThread.cpp b/assignment-client/src/octree/OctreeSendThread.cpp index 20a7260737..a748d766c3 100644 --- a/assignment-client/src/octree/OctreeSendThread.cpp +++ b/assignment-client/src/octree/OctreeSendThread.cpp @@ -28,7 +28,7 @@ OctreeSendThread::OctreeSendThread(const SharedAssignmentPointer& myAssignment, _nodeMissingCount(0), _isShuttingDown(false) { - qDebug() << "OctreeSendThread::OctreeSendThread()... START"; + //qDebug() << "OctreeSendThread::OctreeSendThread()... START"; QString serverName("Octree"); if (_myServer) { @@ -37,14 +37,14 @@ OctreeSendThread::OctreeSendThread(const SharedAssignmentPointer& myAssignment, qDebug() << qPrintable(serverName) << "server [" << _myServer << "]: client connected " "- starting sending thread [" << this << "]"; - qDebug() << "OctreeSendThread::OctreeSendThread()... before OctreeServer::clientConnected()"; + //qDebug() << "OctreeSendThread::OctreeSendThread()... before OctreeServer::clientConnected()"; OctreeServer::clientConnected(); - qDebug() << "OctreeSendThread::OctreeSendThread()... AFTER OctreeServer::clientConnected()"; - qDebug() << "OctreeSendThread::OctreeSendThread()... DONE"; + //qDebug() << "OctreeSendThread::OctreeSendThread()... AFTER OctreeServer::clientConnected()"; + //qDebug() << "OctreeSendThread::OctreeSendThread()... DONE"; } OctreeSendThread::~OctreeSendThread() { - qDebug() << "OctreeSendThread::~OctreeSendThread()... START"; + //qDebug() << "OctreeSendThread::~OctreeSendThread()... START"; QString serverName("Octree"); if (_myServer) { serverName = _myServer->getMyServerName(); @@ -53,19 +53,19 @@ OctreeSendThread::~OctreeSendThread() { qDebug() << qPrintable(serverName) << "server [" << _myServer << "]: client disconnected " "- ending sending thread [" << this << "]"; - qDebug() << "OctreeSendThread::~OctreeSendThread()... BEFORE OctreeServer::clientDisconnected();"; + //qDebug() << "OctreeSendThread::~OctreeSendThread()... BEFORE OctreeServer::clientDisconnected();"; OctreeServer::clientDisconnected(); - qDebug() << "OctreeSendThread::~OctreeSendThread()... AFTER OctreeServer::clientDisconnected();"; + //qDebug() << "OctreeSendThread::~OctreeSendThread()... AFTER OctreeServer::clientDisconnected();"; - qDebug() << "OctreeSendThread::~OctreeSendThread()... BEFORE _node.clear();"; + //qDebug() << "OctreeSendThread::~OctreeSendThread()... BEFORE _node.clear();"; _node.clear(); - qDebug() << "OctreeSendThread::~OctreeSendThread()... AFTER _node.clear();"; + //qDebug() << "OctreeSendThread::~OctreeSendThread()... AFTER _node.clear();"; - qDebug() << "OctreeSendThread::~OctreeSendThread()... BEFORE _myAssignment.clear();"; + //qDebug() << "OctreeSendThread::~OctreeSendThread()... BEFORE _myAssignment.clear();"; _myAssignment.clear(); - qDebug() << "OctreeSendThread::~OctreeSendThread()... BEFORE _myAssignment.clear();"; + //qDebug() << "OctreeSendThread::~OctreeSendThread()... BEFORE _myAssignment.clear();"; - qDebug() << "OctreeSendThread::~OctreeSendThread()... DONE"; + //qDebug() << "OctreeSendThread::~OctreeSendThread()... DONE"; } void OctreeSendThread::setIsShuttingDown() { From b5c538b05130dff271538c9107363ceba0c5ee24 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Mon, 31 Mar 2014 18:22:06 -0700 Subject: [PATCH 29/97] added some debugging --- assignment-client/src/octree/OctreeServer.cpp | 6 ++++++ libraries/shared/src/ThreadedAssignment.cpp | 4 ++++ 2 files changed, 10 insertions(+) diff --git a/assignment-client/src/octree/OctreeServer.cpp b/assignment-client/src/octree/OctreeServer.cpp index e791b542fc..11d0e0ca37 100644 --- a/assignment-client/src/octree/OctreeServer.cpp +++ b/assignment-client/src/octree/OctreeServer.cpp @@ -1051,6 +1051,8 @@ void OctreeServer::nodeAdded(SharedNodePointer node) { } void OctreeServer::nodeKilled(SharedNodePointer node) { + quint64 start = usecTimestampNow(); + qDebug() << qPrintable(_safeServerName) << "server killed node:" << *node; OctreeQueryNode* nodeData = static_cast(node->getLinkedData()); if (nodeData) { @@ -1060,6 +1062,10 @@ void OctreeServer::nodeKilled(SharedNodePointer node) { } else { qDebug() << qPrintable(_safeServerName) << "server node missing linked data node:" << *node; } + + quint64 end = usecTimestampNow(); + quint64 usecsElapsed = (end - start); + qDebug() << qPrintable(_safeServerName) << "server killed node:" << *node << " took: " << usecsElapsed << " usecs"; } void OctreeServer::aboutToFinish() { diff --git a/libraries/shared/src/ThreadedAssignment.cpp b/libraries/shared/src/ThreadedAssignment.cpp index fdf2d91c36..eed5aa46f6 100644 --- a/libraries/shared/src/ThreadedAssignment.cpp +++ b/libraries/shared/src/ThreadedAssignment.cpp @@ -74,6 +74,10 @@ void ThreadedAssignment::sendStatsPacket() { } void ThreadedAssignment::checkInWithDomainServerOrExit() { + qDebug() << "ThreadedAssignment::checkInWithDomainServerOrExit()... " + "Num No Reply Domain Check Ins=" << NodeList::getInstance()->getNumNoReplyDomainCheckIns() + << "MAX_SILENT_DOMAIN_SERVER_CHECK_INS=" << MAX_SILENT_DOMAIN_SERVER_CHECK_INS; + if (NodeList::getInstance()->getNumNoReplyDomainCheckIns() == MAX_SILENT_DOMAIN_SERVER_CHECK_INS) { setFinished(true); } else { From 7cd39d3ef044d77fd3615a27230cc0ae4cea3761 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Mon, 31 Mar 2014 20:53:34 -0700 Subject: [PATCH 30/97] add forceNodeShutdown() to handle forced shutdown of nodes in case of server shutdown --- .../src/octree/OctreeQueryNode.cpp | 48 +++++++++---------- .../src/octree/OctreeQueryNode.h | 7 ++- .../src/octree/OctreeSendThread.cpp | 13 +---- assignment-client/src/octree/OctreeServer.cpp | 34 +++++++++++-- assignment-client/src/octree/OctreeServer.h | 1 + libraries/shared/src/ThreadedAssignment.cpp | 4 -- 6 files changed, 60 insertions(+), 47 deletions(-) diff --git a/assignment-client/src/octree/OctreeQueryNode.cpp b/assignment-client/src/octree/OctreeQueryNode.cpp index 3291fb49ba..642a34edd7 100644 --- a/assignment-client/src/octree/OctreeQueryNode.cpp +++ b/assignment-client/src/octree/OctreeQueryNode.cpp @@ -49,6 +49,10 @@ OctreeQueryNode::~OctreeQueryNode() { qDebug() << "OctreeQueryNode::~OctreeQueryNode()"; } + if (_octreeSendThread) { + forceNodeShutdown(); + } + delete[] _octreePacket; delete[] _lastOctreePacket; if (extraDebugging) { @@ -56,51 +60,45 @@ OctreeQueryNode::~OctreeQueryNode() { } } - -void OctreeQueryNode::deleteLater() { +void OctreeQueryNode::nodeKilled() { _isShuttingDown = true; if (_octreeSendThread) { + // just tell our thread we want to shutdown, this is asynchronous, and fast, we don't need or want it to block + // while the thread actually shuts down _octreeSendThread->setIsShuttingDown(); } - OctreeQuery::deleteLater(); } -void OctreeQueryNode::nodeKilled() { - qDebug() << "OctreeQueryNode::nodeKilled()... "; +void OctreeQueryNode::forceNodeShutdown() { _isShuttingDown = true; if (_octreeSendThread) { + // we really need to force our thread to shutdown, this is synchronous, we will block while the thread actually + // shuts down because we really need it to shutdown, and it's ok if we wait for it to complete OctreeSendThread* sendThread = _octreeSendThread; - - //qDebug() << "OctreeQueryNode::nodeKilled()... calling _octreeSendThread = NULL"; _octreeSendThread = NULL; - //qDebug() << "OctreeQueryNode::nodeKilled()... AFTER _octreeSendThread = NULL"; - - //qDebug() << "OctreeQueryNode::nodeKilled()... calling _octreeSendThread->setIsShuttingDown()"; sendThread->setIsShuttingDown(); - //qDebug() << "OctreeQueryNode::nodeKilled()... AFTER _octreeSendThread->setIsShuttingDown()"; - - //qDebug() << "OctreeQueryNode::nodeKilled()... calling _octreeSendThread->terminate()"; sendThread->terminate(); - //qDebug() << "OctreeQueryNode::nodeKilled()... AFTER _octreeSendThread->terminate()"; - - //qDebug() << "OctreeQueryNode::nodeKilled()... calling delete sendThread"; delete sendThread; - //qDebug() << "OctreeQueryNode::nodeKilled()... AFTER delete sendThread"; - } - qDebug() << "OctreeQueryNode::nodeKilled()... DONE"; } +void OctreeQueryNode::sendThreadFinished() { + // We've been notified by our thread that it is shutting down. So we can clean up our reference to it, and + // delete the actual thread object. Cleaning up our thread will correctly unroll all refereces to shared + // pointers to our node as well as the octree server assignment + if (_octreeSendThread) { + OctreeSendThread* sendThread = _octreeSendThread; + _octreeSendThread = NULL; + delete sendThread; + } +} void OctreeQueryNode::initializeOctreeSendThread(const SharedAssignmentPointer& myAssignment, const SharedNodePointer& node) { - // Create octree sending thread... - //qDebug() << "OctreeQueryNode::initializeOctreeSendThread()... BEFORE new OctreeSendThread(myAssignment, node);"; _octreeSendThread = new OctreeSendThread(myAssignment, node); - //qDebug() << "OctreeQueryNode::initializeOctreeSendThread()... AFTER new OctreeSendThread(myAssignment, node);"; - - //qDebug() << "OctreeQueryNode::initializeOctreeSendThread()... BEFORE _octreeSendThread->initialize(true)"; + + // we want to be notified when the thread finishes + connect(_octreeSendThread, &GenericThread::finished, this, &OctreeQueryNode::sendThreadFinished); _octreeSendThread->initialize(true); - //qDebug() << "OctreeQueryNode::initializeOctreeSendThread()... AFTER _octreeSendThread->initialize(true)"; } bool OctreeQueryNode::packetIsDuplicate() const { diff --git a/assignment-client/src/octree/OctreeQueryNode.h b/assignment-client/src/octree/OctreeQueryNode.h index c08bdcb2bf..a3f31ba98b 100644 --- a/assignment-client/src/octree/OctreeQueryNode.h +++ b/assignment-client/src/octree/OctreeQueryNode.h @@ -28,8 +28,7 @@ class OctreeQueryNode : public OctreeQuery { public: OctreeQueryNode(); virtual ~OctreeQueryNode(); - virtual void deleteLater(); - + void init(); // called after creation to set up some virtual items virtual PacketType getMyPacketType() const = 0; @@ -95,8 +94,12 @@ public: int getDuplicatePacketCount() const { return _duplicatePacketCount; } void nodeKilled(); + void forceNodeShutdown(); bool isShuttingDown() const { return _isShuttingDown; } +private slots: + void sendThreadFinished(); + private: OctreeQueryNode(const OctreeQueryNode &); OctreeQueryNode& operator= (const OctreeQueryNode&); diff --git a/assignment-client/src/octree/OctreeSendThread.cpp b/assignment-client/src/octree/OctreeSendThread.cpp index a748d766c3..e655acc400 100644 --- a/assignment-client/src/octree/OctreeSendThread.cpp +++ b/assignment-client/src/octree/OctreeSendThread.cpp @@ -44,28 +44,17 @@ OctreeSendThread::OctreeSendThread(const SharedAssignmentPointer& myAssignment, } OctreeSendThread::~OctreeSendThread() { - //qDebug() << "OctreeSendThread::~OctreeSendThread()... START"; QString serverName("Octree"); if (_myServer) { serverName = _myServer->getMyServerName(); } - + qDebug() << qPrintable(serverName) << "server [" << _myServer << "]: client disconnected " "- ending sending thread [" << this << "]"; - //qDebug() << "OctreeSendThread::~OctreeSendThread()... BEFORE OctreeServer::clientDisconnected();"; OctreeServer::clientDisconnected(); - //qDebug() << "OctreeSendThread::~OctreeSendThread()... AFTER OctreeServer::clientDisconnected();"; - - //qDebug() << "OctreeSendThread::~OctreeSendThread()... BEFORE _node.clear();"; _node.clear(); - //qDebug() << "OctreeSendThread::~OctreeSendThread()... AFTER _node.clear();"; - - //qDebug() << "OctreeSendThread::~OctreeSendThread()... BEFORE _myAssignment.clear();"; _myAssignment.clear(); - //qDebug() << "OctreeSendThread::~OctreeSendThread()... BEFORE _myAssignment.clear();"; - - //qDebug() << "OctreeSendThread::~OctreeSendThread()... DONE"; } void OctreeSendThread::setIsShuttingDown() { diff --git a/assignment-client/src/octree/OctreeServer.cpp b/assignment-client/src/octree/OctreeServer.cpp index 11d0e0ca37..567e91157d 100644 --- a/assignment-client/src/octree/OctreeServer.cpp +++ b/assignment-client/src/octree/OctreeServer.cpp @@ -233,7 +233,10 @@ OctreeServer::OctreeServer(const QByteArray& packet) : _started(time(0)), _startedUSecs(usecTimestampNow()) { - assert(!_instance); // you should only ever have one instance at a time! + //assert(!_instance); // you should only ever have one instance at a time! + if (_instance) { + qDebug() << "Octree Server starting... while old instance still running _instance=["<<_instance<<"] this=[" << this << "]"; + } qDebug() << "Octree Server starting... setting _instance to=[" << this << "]"; _instance = this; @@ -268,7 +271,10 @@ OctreeServer::~OctreeServer() { delete _jurisdiction; _jurisdiction = NULL; - _instance = NULL; // we are gone + + if (_instance == this) { + _instance = NULL; // we are gone + } qDebug() << qPrintable(_safeServerName) << "server DONE shutting down... [" << this << "]"; } @@ -1065,14 +1071,34 @@ void OctreeServer::nodeKilled(SharedNodePointer node) { quint64 end = usecTimestampNow(); quint64 usecsElapsed = (end - start); - qDebug() << qPrintable(_safeServerName) << "server killed node:" << *node << " took: " << usecsElapsed << " usecs"; + qDebug() << qPrintable(_safeServerName) << "server killed took: " << usecsElapsed << " usecs for node:" << *node; } +void OctreeServer::forceNodeShutdown(SharedNodePointer node) { + quint64 start = usecTimestampNow(); + + qDebug() << qPrintable(_safeServerName) << "server killed node:" << *node; + OctreeQueryNode* nodeData = static_cast(node->getLinkedData()); + if (nodeData) { + qDebug() << qPrintable(_safeServerName) << "server calling nodeData->forceNodeShutdown() for node:" << *node; + nodeData->forceNodeShutdown(); // tell our node data and sending threads that we'd like to shut down + qDebug() << qPrintable(_safeServerName) << "server AFTER nodeData->forceNodeShutdown() for node:" << *node; + } else { + qDebug() << qPrintable(_safeServerName) << "server node missing linked data node:" << *node; + } + + quint64 end = usecTimestampNow(); + quint64 usecsElapsed = (end - start); + qDebug() << qPrintable(_safeServerName) << "server killed took: " << usecsElapsed << " usecs for node:" << *node; +} + + void OctreeServer::aboutToFinish() { qDebug() << qPrintable(_safeServerName) << "server STARTING about to finish..."; foreach (const SharedNodePointer& node, NodeList::getInstance()->getNodeHash()) { qDebug() << qPrintable(_safeServerName) << "server about to finish while node still connected node:" << *node; - nodeKilled(node); + + forceNodeShutdown(node); } qDebug() << qPrintable(_safeServerName) << "server ENDING about to finish..."; diff --git a/assignment-client/src/octree/OctreeServer.h b/assignment-client/src/octree/OctreeServer.h index 63d43b6634..63a3341f55 100644 --- a/assignment-client/src/octree/OctreeServer.h +++ b/assignment-client/src/octree/OctreeServer.h @@ -115,6 +115,7 @@ public: bool handleHTTPRequest(HTTPConnection* connection, const QUrl& url); virtual void aboutToFinish(); + void forceNodeShutdown(SharedNodePointer node); public slots: /// runs the voxel server assignment diff --git a/libraries/shared/src/ThreadedAssignment.cpp b/libraries/shared/src/ThreadedAssignment.cpp index eed5aa46f6..fdf2d91c36 100644 --- a/libraries/shared/src/ThreadedAssignment.cpp +++ b/libraries/shared/src/ThreadedAssignment.cpp @@ -74,10 +74,6 @@ void ThreadedAssignment::sendStatsPacket() { } void ThreadedAssignment::checkInWithDomainServerOrExit() { - qDebug() << "ThreadedAssignment::checkInWithDomainServerOrExit()... " - "Num No Reply Domain Check Ins=" << NodeList::getInstance()->getNumNoReplyDomainCheckIns() - << "MAX_SILENT_DOMAIN_SERVER_CHECK_INS=" << MAX_SILENT_DOMAIN_SERVER_CHECK_INS; - if (NodeList::getInstance()->getNumNoReplyDomainCheckIns() == MAX_SILENT_DOMAIN_SERVER_CHECK_INS) { setFinished(true); } else { From 9df315d8896e1f2685495f03b3a7aabb16b31c55 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Mon, 31 Mar 2014 20:54:58 -0700 Subject: [PATCH 31/97] removed dead debug code --- assignment-client/src/octree/OctreeSendThread.cpp | 5 ----- 1 file changed, 5 deletions(-) diff --git a/assignment-client/src/octree/OctreeSendThread.cpp b/assignment-client/src/octree/OctreeSendThread.cpp index e655acc400..48d45bbb55 100644 --- a/assignment-client/src/octree/OctreeSendThread.cpp +++ b/assignment-client/src/octree/OctreeSendThread.cpp @@ -28,8 +28,6 @@ OctreeSendThread::OctreeSendThread(const SharedAssignmentPointer& myAssignment, _nodeMissingCount(0), _isShuttingDown(false) { - //qDebug() << "OctreeSendThread::OctreeSendThread()... START"; - QString serverName("Octree"); if (_myServer) { serverName = _myServer->getMyServerName(); @@ -37,10 +35,7 @@ OctreeSendThread::OctreeSendThread(const SharedAssignmentPointer& myAssignment, qDebug() << qPrintable(serverName) << "server [" << _myServer << "]: client connected " "- starting sending thread [" << this << "]"; - //qDebug() << "OctreeSendThread::OctreeSendThread()... before OctreeServer::clientConnected()"; OctreeServer::clientConnected(); - //qDebug() << "OctreeSendThread::OctreeSendThread()... AFTER OctreeServer::clientConnected()"; - //qDebug() << "OctreeSendThread::OctreeSendThread()... DONE"; } OctreeSendThread::~OctreeSendThread() { From 6ed9b968b08882fbebf0b2e6c8d5ced6642d6326 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Tue, 1 Apr 2014 09:23:19 -0700 Subject: [PATCH 32/97] removed some extra debugging --- 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 642a34edd7..a20b3dad01 100644 --- a/assignment-client/src/octree/OctreeQueryNode.cpp +++ b/assignment-client/src/octree/OctreeQueryNode.cpp @@ -44,20 +44,12 @@ OctreeQueryNode::OctreeQueryNode() : OctreeQueryNode::~OctreeQueryNode() { _isShuttingDown = true; - const bool extraDebugging = true; - if (extraDebugging) { - qDebug() << "OctreeQueryNode::~OctreeQueryNode()"; - } - if (_octreeSendThread) { forceNodeShutdown(); } delete[] _octreePacket; delete[] _lastOctreePacket; - if (extraDebugging) { - qDebug() << "OctreeQueryNode::~OctreeQueryNode()... DONE..."; - } } void OctreeQueryNode::nodeKilled() { From 20d944a43b8ce7101db602589f8c15b0fdc0eee3 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Tue, 1 Apr 2014 09:31:40 -0700 Subject: [PATCH 33/97] removed some debug --- assignment-client/src/octree/OctreeServer.cpp | 30 ++----------------- 1 file changed, 3 insertions(+), 27 deletions(-) diff --git a/assignment-client/src/octree/OctreeServer.cpp b/assignment-client/src/octree/OctreeServer.cpp index 567e91157d..06b3e6eeeb 100644 --- a/assignment-client/src/octree/OctreeServer.cpp +++ b/assignment-client/src/octree/OctreeServer.cpp @@ -826,34 +826,15 @@ void OctreeServer::readPendingDatagrams() { SharedNodePointer matchingNode = nodeList->sendingNodeForPacket(receivedPacket); if (packetType == getMyQueryMessageType()) { - bool debug = false; - if (debug) { - if (matchingNode) { - qDebug() << "Got PacketTypeVoxelQuery at" << usecTimestampNow() << "node:" << *matchingNode; - } else { - qDebug() << "Got PacketTypeVoxelQuery at" << usecTimestampNow() << "node: ??????"; - } - } - // If we got a PacketType_VOXEL_QUERY, then we're talking to an NodeType_t_AVATAR, and we // need to make sure we have it in our nodeList. if (matchingNode) { - if (debug) { - qDebug() << "calling updateNodeWithDataFromPacket()... node:" << *matchingNode; - } nodeList->updateNodeWithDataFromPacket(matchingNode, receivedPacket); OctreeQueryNode* nodeData = (OctreeQueryNode*) matchingNode->getLinkedData(); if (nodeData && !nodeData->isOctreeSendThreadInitalized()) { - if (debug) { - qDebug() << "calling initializeOctreeSendThread()... node:" << *matchingNode; - } - - - qDebug() << "OctreeServer::readPendingDatagrams()... BEFORE nodeData->initializeOctreeSendThread()"; SharedAssignmentPointer sharedAssignment = AssignmentClient::getCurrentAssignment(); nodeData->initializeOctreeSendThread(sharedAssignment, matchingNode); - qDebug() << "OctreeServer::readPendingDatagrams()... AFTER nodeData->initializeOctreeSendThread()"; } } } else if (packetType == PacketTypeJurisdictionRequest) { @@ -1062,16 +1043,14 @@ void OctreeServer::nodeKilled(SharedNodePointer node) { qDebug() << qPrintable(_safeServerName) << "server killed node:" << *node; OctreeQueryNode* nodeData = static_cast(node->getLinkedData()); if (nodeData) { - qDebug() << qPrintable(_safeServerName) << "server calling nodeData->nodeKilled() for node:" << *node; nodeData->nodeKilled(); // tell our node data and sending threads that we'd like to shut down - qDebug() << qPrintable(_safeServerName) << "server AFTER nodeData->nodeKilled() for node:" << *node; } else { qDebug() << qPrintable(_safeServerName) << "server node missing linked data node:" << *node; } quint64 end = usecTimestampNow(); quint64 usecsElapsed = (end - start); - qDebug() << qPrintable(_safeServerName) << "server killed took: " << usecsElapsed << " usecs for node:" << *node; + qDebug() << qPrintable(_safeServerName) << "server nodeKilled() took: " << usecsElapsed << " usecs for node:" << *node; } void OctreeServer::forceNodeShutdown(SharedNodePointer node) { @@ -1080,16 +1059,15 @@ void OctreeServer::forceNodeShutdown(SharedNodePointer node) { qDebug() << qPrintable(_safeServerName) << "server killed node:" << *node; OctreeQueryNode* nodeData = static_cast(node->getLinkedData()); if (nodeData) { - qDebug() << qPrintable(_safeServerName) << "server calling nodeData->forceNodeShutdown() for node:" << *node; nodeData->forceNodeShutdown(); // tell our node data and sending threads that we'd like to shut down - qDebug() << qPrintable(_safeServerName) << "server AFTER nodeData->forceNodeShutdown() for node:" << *node; } else { qDebug() << qPrintable(_safeServerName) << "server node missing linked data node:" << *node; } quint64 end = usecTimestampNow(); quint64 usecsElapsed = (end - start); - qDebug() << qPrintable(_safeServerName) << "server killed took: " << usecsElapsed << " usecs for node:" << *node; + qDebug() << qPrintable(_safeServerName) << "server forceNodeShutdown() took: " + << usecsElapsed << " usecs for node:" << *node; } @@ -1097,10 +1075,8 @@ void OctreeServer::aboutToFinish() { qDebug() << qPrintable(_safeServerName) << "server STARTING about to finish..."; foreach (const SharedNodePointer& node, NodeList::getInstance()->getNodeHash()) { qDebug() << qPrintable(_safeServerName) << "server about to finish while node still connected node:" << *node; - forceNodeShutdown(node); } - qDebug() << qPrintable(_safeServerName) << "server ENDING about to finish..."; } From 21e0bc119b414efd0e956e0ac478e37ecc28a171 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Tue, 1 Apr 2014 09:50:10 -0700 Subject: [PATCH 34/97] moved OctreeServer::stopTrackingThread() to destructor instead of setIsShuttingDown() --- assignment-client/src/octree/OctreeSendThread.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/assignment-client/src/octree/OctreeSendThread.cpp b/assignment-client/src/octree/OctreeSendThread.cpp index 48d45bbb55..70d6033e3e 100644 --- a/assignment-client/src/octree/OctreeSendThread.cpp +++ b/assignment-client/src/octree/OctreeSendThread.cpp @@ -48,13 +48,14 @@ OctreeSendThread::~OctreeSendThread() { "- ending sending thread [" << this << "]"; OctreeServer::clientDisconnected(); + OctreeServer::stopTrackingThread(this); + _node.clear(); _myAssignment.clear(); } void OctreeSendThread::setIsShuttingDown() { _isShuttingDown = true; - OctreeServer::stopTrackingThread(this); } From ff17c6a0717c6af6eca712efa965d69d7b1c88df Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Tue, 1 Apr 2014 10:08:46 -0700 Subject: [PATCH 35/97] quiet some debugging --- assignment-client/src/octree/OctreeServer.cpp | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/assignment-client/src/octree/OctreeServer.cpp b/assignment-client/src/octree/OctreeServer.cpp index 06b3e6eeeb..bc823983e0 100644 --- a/assignment-client/src/octree/OctreeServer.cpp +++ b/assignment-client/src/octree/OctreeServer.cpp @@ -1040,17 +1040,20 @@ void OctreeServer::nodeAdded(SharedNodePointer node) { void OctreeServer::nodeKilled(SharedNodePointer node) { quint64 start = usecTimestampNow(); - qDebug() << qPrintable(_safeServerName) << "server killed node:" << *node; + //qDebug() << qPrintable(_safeServerName) << "server killed node:" << *node; OctreeQueryNode* nodeData = static_cast(node->getLinkedData()); if (nodeData) { nodeData->nodeKilled(); // tell our node data and sending threads that we'd like to shut down } else { - qDebug() << qPrintable(_safeServerName) << "server node missing linked data node:" << *node; + //qDebug() << qPrintable(_safeServerName) << "server node missing linked data node:" << *node; } quint64 end = usecTimestampNow(); quint64 usecsElapsed = (end - start); - qDebug() << qPrintable(_safeServerName) << "server nodeKilled() took: " << usecsElapsed << " usecs for node:" << *node; + if (usecsElapsed > 1000) { + qDebug() << qPrintable(_safeServerName) << "server nodeKilled() took: " << usecsElapsed << "<<<<<<<<<<<<<<<<<<<<<<<<<<<<<"; + // << " usecs for node:" << *node; + } } void OctreeServer::forceNodeShutdown(SharedNodePointer node) { From 64c7a6a4400f142166076dbe901c84c5f403237e Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Tue, 1 Apr 2014 10:25:32 -0700 Subject: [PATCH 36/97] testing, remove create sending thread and processing of query --- assignment-client/src/octree/OctreeServer.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/assignment-client/src/octree/OctreeServer.cpp b/assignment-client/src/octree/OctreeServer.cpp index bc823983e0..2a1db54924 100644 --- a/assignment-client/src/octree/OctreeServer.cpp +++ b/assignment-client/src/octree/OctreeServer.cpp @@ -826,6 +826,8 @@ void OctreeServer::readPendingDatagrams() { SharedNodePointer matchingNode = nodeList->sendingNodeForPacket(receivedPacket); if (packetType == getMyQueryMessageType()) { + + /** // If we got a PacketType_VOXEL_QUERY, then we're talking to an NodeType_t_AVATAR, and we // need to make sure we have it in our nodeList. if (matchingNode) { @@ -837,6 +839,7 @@ void OctreeServer::readPendingDatagrams() { nodeData->initializeOctreeSendThread(sharedAssignment, matchingNode); } } + **/ } else if (packetType == PacketTypeJurisdictionRequest) { _jurisdictionSender->queueReceivedPacket(matchingNode, receivedPacket); } else if (_octreeInboundPacketProcessor && getOctree()->handlesEditPacketType(packetType)) { @@ -1034,7 +1037,7 @@ void OctreeServer::run() { void OctreeServer::nodeAdded(SharedNodePointer node) { // we might choose to use this notifier to track clients in a pending state - qDebug() << qPrintable(_safeServerName) << "server added node:" << *node; + //qDebug() << qPrintable(_safeServerName) << "server added node:" << *node; } void OctreeServer::nodeKilled(SharedNodePointer node) { From ce8a599b16cd43d041a152d10495a68e890b8ec4 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Tue, 1 Apr 2014 10:38:21 -0700 Subject: [PATCH 37/97] tweak --- assignment-client/src/octree/OctreeServer.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/assignment-client/src/octree/OctreeServer.cpp b/assignment-client/src/octree/OctreeServer.cpp index 2a1db54924..2267f99201 100644 --- a/assignment-client/src/octree/OctreeServer.cpp +++ b/assignment-client/src/octree/OctreeServer.cpp @@ -827,7 +827,6 @@ void OctreeServer::readPendingDatagrams() { if (packetType == getMyQueryMessageType()) { - /** // If we got a PacketType_VOXEL_QUERY, then we're talking to an NodeType_t_AVATAR, and we // need to make sure we have it in our nodeList. if (matchingNode) { @@ -835,11 +834,12 @@ void OctreeServer::readPendingDatagrams() { OctreeQueryNode* nodeData = (OctreeQueryNode*) matchingNode->getLinkedData(); if (nodeData && !nodeData->isOctreeSendThreadInitalized()) { + /** SharedAssignmentPointer sharedAssignment = AssignmentClient::getCurrentAssignment(); nodeData->initializeOctreeSendThread(sharedAssignment, matchingNode); + **/ } } - **/ } else if (packetType == PacketTypeJurisdictionRequest) { _jurisdictionSender->queueReceivedPacket(matchingNode, receivedPacket); } else if (_octreeInboundPacketProcessor && getOctree()->handlesEditPacketType(packetType)) { From 9d757434ab9c7a719c22d120f726a870be956041 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Tue, 1 Apr 2014 10:47:25 -0700 Subject: [PATCH 38/97] testing tweak --- assignment-client/src/octree/OctreeSendThread.cpp | 2 ++ assignment-client/src/octree/OctreeServer.cpp | 2 -- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/assignment-client/src/octree/OctreeSendThread.cpp b/assignment-client/src/octree/OctreeSendThread.cpp index 70d6033e3e..ca7e835b8a 100644 --- a/assignment-client/src/octree/OctreeSendThread.cpp +++ b/assignment-client/src/octree/OctreeSendThread.cpp @@ -81,8 +81,10 @@ bool OctreeSendThread::process() { // Sometimes the node data has not yet been linked, in which case we can't really do anything if (nodeData && !nodeData->isShuttingDown()) { + /* bool viewFrustumChanged = nodeData->updateCurrentViewFrustum(); packetDistributor(nodeData, viewFrustumChanged); + */ } } } diff --git a/assignment-client/src/octree/OctreeServer.cpp b/assignment-client/src/octree/OctreeServer.cpp index 2267f99201..b0a9a9b4de 100644 --- a/assignment-client/src/octree/OctreeServer.cpp +++ b/assignment-client/src/octree/OctreeServer.cpp @@ -834,10 +834,8 @@ void OctreeServer::readPendingDatagrams() { OctreeQueryNode* nodeData = (OctreeQueryNode*) matchingNode->getLinkedData(); if (nodeData && !nodeData->isOctreeSendThreadInitalized()) { - /** SharedAssignmentPointer sharedAssignment = AssignmentClient::getCurrentAssignment(); nodeData->initializeOctreeSendThread(sharedAssignment, matchingNode); - **/ } } } else if (packetType == PacketTypeJurisdictionRequest) { From 193e2372855b0baa2043ca8904d2b12c06ecf2ca Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Tue, 1 Apr 2014 10:58:20 -0700 Subject: [PATCH 39/97] tweaks --- assignment-client/src/octree/OctreeSendThread.cpp | 2 -- assignment-client/src/octree/OctreeServer.cpp | 7 +++++++ 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/assignment-client/src/octree/OctreeSendThread.cpp b/assignment-client/src/octree/OctreeSendThread.cpp index ca7e835b8a..70d6033e3e 100644 --- a/assignment-client/src/octree/OctreeSendThread.cpp +++ b/assignment-client/src/octree/OctreeSendThread.cpp @@ -81,10 +81,8 @@ bool OctreeSendThread::process() { // Sometimes the node data has not yet been linked, in which case we can't really do anything if (nodeData && !nodeData->isShuttingDown()) { - /* bool viewFrustumChanged = nodeData->updateCurrentViewFrustum(); packetDistributor(nodeData, viewFrustumChanged); - */ } } } diff --git a/assignment-client/src/octree/OctreeServer.cpp b/assignment-client/src/octree/OctreeServer.cpp index b0a9a9b4de..03f40c5b7b 100644 --- a/assignment-client/src/octree/OctreeServer.cpp +++ b/assignment-client/src/octree/OctreeServer.cpp @@ -1184,6 +1184,11 @@ QString OctreeServer::getStatusLink() { } void OctreeServer::sendStatsPacket() { + + static QJsonObject statsObject1; + ThreadedAssignment::addPacketStatsAndSendStatsPacket(statsObject1); + + /** // TODO: we have too many stats to fit in a single MTU... so for now, we break it into multiple JSON objects and // send them separately. What we really should do is change the NodeList::sendStatsToDomainServer() to handle the // the following features: @@ -1257,6 +1262,8 @@ void OctreeServer::sendStatsPacket() { (double)_octreeInboundPacketProcessor->getAverageLockWaitTimePerElement(); NodeList::getInstance()->sendStatsToDomainServer(statsObject3); + + **/ } QMap OctreeServer::_threadsDidProcess; From 9e445098f1ab696daabea04e57413acbfb3aa623 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Tue, 1 Apr 2014 11:22:44 -0700 Subject: [PATCH 40/97] more debugging --- assignment-client/src/octree/OctreeServer.cpp | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/assignment-client/src/octree/OctreeServer.cpp b/assignment-client/src/octree/OctreeServer.cpp index 03f40c5b7b..259d9be954 100644 --- a/assignment-client/src/octree/OctreeServer.cpp +++ b/assignment-client/src/octree/OctreeServer.cpp @@ -813,7 +813,13 @@ void OctreeServer::parsePayload() { } } +quint64 lastReadPendingDatagrams = usecTimestampNow(); +quint64 lastProcessNodeData = usecTimestampNow(); + void OctreeServer::readPendingDatagrams() { + quint64 now = usecTimestampNow(); + qDebug() << "OctreeServer::readPendingDatagrams(): since lastReadPendingDatagrams=" << (now - lastReadPendingDatagrams) << "usecs"; + QByteArray receivedPacket; HifiSockAddr senderSockAddr; @@ -843,6 +849,9 @@ void OctreeServer::readPendingDatagrams() { } else if (_octreeInboundPacketProcessor && getOctree()->handlesEditPacketType(packetType)) { _octreeInboundPacketProcessor->queueReceivedPacket(matchingNode, receivedPacket); } else { + quint64 now = usecTimestampNow(); + qDebug() << "OctreeServer::readPendingDatagrams(): since lastProcessNodeData=" << (now - lastProcessNodeData) << "usecs"; + // let processNodeData handle it. NodeList::getInstance()->processNodeData(senderSockAddr, receivedPacket); } From 1aa05c4de5526ba3d9efda890b17287b254d17e5 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Tue, 1 Apr 2014 11:26:55 -0700 Subject: [PATCH 41/97] more debugging --- assignment-client/src/octree/OctreeServer.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/assignment-client/src/octree/OctreeServer.cpp b/assignment-client/src/octree/OctreeServer.cpp index 259d9be954..332ab28807 100644 --- a/assignment-client/src/octree/OctreeServer.cpp +++ b/assignment-client/src/octree/OctreeServer.cpp @@ -819,6 +819,7 @@ quint64 lastProcessNodeData = usecTimestampNow(); void OctreeServer::readPendingDatagrams() { quint64 now = usecTimestampNow(); qDebug() << "OctreeServer::readPendingDatagrams(): since lastReadPendingDatagrams=" << (now - lastReadPendingDatagrams) << "usecs"; + lastReadPendingDatagrams = now; QByteArray receivedPacket; HifiSockAddr senderSockAddr; @@ -851,6 +852,7 @@ void OctreeServer::readPendingDatagrams() { } else { quint64 now = usecTimestampNow(); qDebug() << "OctreeServer::readPendingDatagrams(): since lastProcessNodeData=" << (now - lastProcessNodeData) << "usecs"; + lastProcessNodeData = now; // let processNodeData handle it. NodeList::getInstance()->processNodeData(senderSockAddr, receivedPacket); From 30ff4a1d19833f01088c3a3e276d6ca6cffde834 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Tue, 1 Apr 2014 11:32:35 -0700 Subject: [PATCH 42/97] more debugging --- assignment-client/src/octree/OctreeServer.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/assignment-client/src/octree/OctreeServer.cpp b/assignment-client/src/octree/OctreeServer.cpp index 332ab28807..e598310470 100644 --- a/assignment-client/src/octree/OctreeServer.cpp +++ b/assignment-client/src/octree/OctreeServer.cpp @@ -818,7 +818,9 @@ quint64 lastProcessNodeData = usecTimestampNow(); void OctreeServer::readPendingDatagrams() { quint64 now = usecTimestampNow(); - qDebug() << "OctreeServer::readPendingDatagrams(): since lastReadPendingDatagrams=" << (now - lastReadPendingDatagrams) << "usecs"; + if ((now - lastReadPendingDatagrams) > 100000) { + qDebug() << "OctreeServer::readPendingDatagrams(): since lastReadPendingDatagrams=" << (now - lastReadPendingDatagrams) << "usecs"; + } lastReadPendingDatagrams = now; QByteArray receivedPacket; From 58a52cf5e18baeb431d969d8c92514ee4a98163a Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Tue, 1 Apr 2014 11:45:29 -0700 Subject: [PATCH 43/97] more debugging --- assignment-client/src/octree/OctreeServer.cpp | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/assignment-client/src/octree/OctreeServer.cpp b/assignment-client/src/octree/OctreeServer.cpp index e598310470..b46331e39d 100644 --- a/assignment-client/src/octree/OctreeServer.cpp +++ b/assignment-client/src/octree/OctreeServer.cpp @@ -832,14 +832,24 @@ void OctreeServer::readPendingDatagrams() { if (nodeList->packetVersionAndHashMatch(receivedPacket)) { PacketType packetType = packetTypeForPacket(receivedPacket); + quint64 startNodeLookup = usecTimestampNow(); SharedNodePointer matchingNode = nodeList->sendingNodeForPacket(receivedPacket); + quint64 endNodeLookup = usecTimestampNow(); + if ((endNodeLookup - startNodeLookup) > 100000) { + qDebug() << "OctreeServer::readPendingDatagrams(): sendingNodeForPacket() took" << (endNodeLookup - startNodeLookup) << "usecs"; + } if (packetType == getMyQueryMessageType()) { // If we got a PacketType_VOXEL_QUERY, then we're talking to an NodeType_t_AVATAR, and we // need to make sure we have it in our nodeList. if (matchingNode) { + quint64 startUpdateNode = usecTimestampNow(); nodeList->updateNodeWithDataFromPacket(matchingNode, receivedPacket); + quint64 endUpdateNode = usecTimestampNow(); + if ((endUpdateNode - startUpdateNode) > 100000) { + qDebug() << "OctreeServer::readPendingDatagrams(): updateNodeWithDataFromPacket() took" << (endUpdateNode - startUpdateNode) << "usecs"; + } OctreeQueryNode* nodeData = (OctreeQueryNode*) matchingNode->getLinkedData(); if (nodeData && !nodeData->isOctreeSendThreadInitalized()) { @@ -857,7 +867,12 @@ void OctreeServer::readPendingDatagrams() { lastProcessNodeData = now; // let processNodeData handle it. + quint64 startProcessNodeData = usecTimestampNow(); NodeList::getInstance()->processNodeData(senderSockAddr, receivedPacket); + quint64 endProcessNodeData = usecTimestampNow(); + if ((endProcessNodeData - startProcessNodeData) > 100000) { + qDebug() << "OctreeServer::readPendingDatagrams(): processNodeData() took" << (endProcessNodeData - startProcessNodeData) << "usecs"; + } } } } From f5045696555c64c538101ecff4503400e4da855e Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Tue, 1 Apr 2014 11:49:49 -0700 Subject: [PATCH 44/97] more debugging --- assignment-client/src/octree/OctreeServer.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/assignment-client/src/octree/OctreeServer.cpp b/assignment-client/src/octree/OctreeServer.cpp index b46331e39d..d38a654219 100644 --- a/assignment-client/src/octree/OctreeServer.cpp +++ b/assignment-client/src/octree/OctreeServer.cpp @@ -863,7 +863,9 @@ void OctreeServer::readPendingDatagrams() { _octreeInboundPacketProcessor->queueReceivedPacket(matchingNode, receivedPacket); } else { quint64 now = usecTimestampNow(); - qDebug() << "OctreeServer::readPendingDatagrams(): since lastProcessNodeData=" << (now - lastProcessNodeData) << "usecs"; + if ((now - lastProcessNodeData) > 500000) { + qDebug() << "OctreeServer::readPendingDatagrams(): since lastProcessNodeData=" << (now - lastProcessNodeData) << "usecs"; + } lastProcessNodeData = now; // let processNodeData handle it. From 916a5d2da07fb2052a5f5beffa81f35d5f1fd826 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Tue, 1 Apr 2014 12:24:03 -0700 Subject: [PATCH 45/97] more debugging --- assignment-client/src/octree/OctreeServer.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/assignment-client/src/octree/OctreeServer.cpp b/assignment-client/src/octree/OctreeServer.cpp index d38a654219..15beafa0c0 100644 --- a/assignment-client/src/octree/OctreeServer.cpp +++ b/assignment-client/src/octree/OctreeServer.cpp @@ -828,6 +828,7 @@ void OctreeServer::readPendingDatagrams() { NodeList* nodeList = NodeList::getInstance(); + quint64 startReadAvailable = usecTimestampNow(); while (readAvailableDatagram(receivedPacket, senderSockAddr)) { if (nodeList->packetVersionAndHashMatch(receivedPacket)) { PacketType packetType = packetTypeForPacket(receivedPacket); @@ -878,6 +879,9 @@ void OctreeServer::readPendingDatagrams() { } } } + quint64 endReadAvailable = usecTimestampNow(); + qDebug() << "OctreeServer::readPendingDatagrams(): while(readAvailable) took" << (endReadAvailable - startReadAvailable) << "usecs"; + } void OctreeServer::run() { From 6cb44a4d0ca13c066fd7b5fea26fded32797697d Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Tue, 1 Apr 2014 12:33:59 -0700 Subject: [PATCH 46/97] more debugging --- assignment-client/src/octree/OctreeServer.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/assignment-client/src/octree/OctreeServer.cpp b/assignment-client/src/octree/OctreeServer.cpp index 15beafa0c0..c3c6510982 100644 --- a/assignment-client/src/octree/OctreeServer.cpp +++ b/assignment-client/src/octree/OctreeServer.cpp @@ -880,7 +880,9 @@ void OctreeServer::readPendingDatagrams() { } } quint64 endReadAvailable = usecTimestampNow(); - qDebug() << "OctreeServer::readPendingDatagrams(): while(readAvailable) took" << (endReadAvailable - startReadAvailable) << "usecs"; + if (endReadAvailable - startReadAvailable > 1000) { + qDebug() << "OctreeServer::readPendingDatagrams(): while(readAvailable) took" << (endReadAvailable - startReadAvailable) << "usecs"; + } } From 124619f8d90fa57ecd52b842522e400f60483f0b Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Tue, 1 Apr 2014 12:51:34 -0700 Subject: [PATCH 47/97] more debugging --- assignment-client/src/octree/OctreeServer.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/assignment-client/src/octree/OctreeServer.cpp b/assignment-client/src/octree/OctreeServer.cpp index c3c6510982..0958e2fa20 100644 --- a/assignment-client/src/octree/OctreeServer.cpp +++ b/assignment-client/src/octree/OctreeServer.cpp @@ -829,7 +829,9 @@ void OctreeServer::readPendingDatagrams() { NodeList* nodeList = NodeList::getInstance(); quint64 startReadAvailable = usecTimestampNow(); + int readDataGrams = 0; while (readAvailableDatagram(receivedPacket, senderSockAddr)) { + readDataGrams++; if (nodeList->packetVersionAndHashMatch(receivedPacket)) { PacketType packetType = packetTypeForPacket(receivedPacket); @@ -881,7 +883,8 @@ void OctreeServer::readPendingDatagrams() { } quint64 endReadAvailable = usecTimestampNow(); if (endReadAvailable - startReadAvailable > 1000) { - qDebug() << "OctreeServer::readPendingDatagrams(): while(readAvailable) took" << (endReadAvailable - startReadAvailable) << "usecs"; + qDebug() << "OctreeServer::readPendingDatagrams(): while(readAvailable) took" << (endReadAvailable - startReadAvailable) << "usecs" + << " readDataGrams=" << readDataGrams; } } From b7695ba050b007e54b5240d3bc1617d0cd67c459 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Tue, 1 Apr 2014 13:55:25 -0700 Subject: [PATCH 48/97] more debugging --- assignment-client/src/octree/OctreeServer.cpp | 42 ++++++++++++++++++- 1 file changed, 41 insertions(+), 1 deletion(-) diff --git a/assignment-client/src/octree/OctreeServer.cpp b/assignment-client/src/octree/OctreeServer.cpp index 0958e2fa20..bb0424c27e 100644 --- a/assignment-client/src/octree/OctreeServer.cpp +++ b/assignment-client/src/octree/OctreeServer.cpp @@ -830,6 +830,18 @@ void OctreeServer::readPendingDatagrams() { quint64 startReadAvailable = usecTimestampNow(); int readDataGrams = 0; + + int queryPackets = 0; + int jurisdictionRequests = 0; + int editPackets = 0; + int nodeListPackets = 0; + + quint64 queryElapsed = 0; + quint64 jurisdictionElapsed = 0; + quint64 editElapsed = 0; + quint64 nodeListElapsed = 0; + + while (readAvailableDatagram(receivedPacket, senderSockAddr)) { readDataGrams++; if (nodeList->packetVersionAndHashMatch(receivedPacket)) { @@ -843,6 +855,8 @@ void OctreeServer::readPendingDatagrams() { } if (packetType == getMyQueryMessageType()) { + quint64 queryStart = usecTimestampNow(); + queryPackets++; // If we got a PacketType_VOXEL_QUERY, then we're talking to an NodeType_t_AVATAR, and we // need to make sure we have it in our nodeList. @@ -860,11 +874,24 @@ void OctreeServer::readPendingDatagrams() { nodeData->initializeOctreeSendThread(sharedAssignment, matchingNode); } } + quint64 queryEnd = usecTimestampNow(); + queryElapsed += (queryEnd - queryStart); } else if (packetType == PacketTypeJurisdictionRequest) { + quint64 jurisdictionStart = usecTimestampNow(); + jurisdictionRequests++; _jurisdictionSender->queueReceivedPacket(matchingNode, receivedPacket); + quint64 jurisdictionEnd = usecTimestampNow(); + jurisdictionElapsed += (jurisdictionEnd - jurisdictionStart); } else if (_octreeInboundPacketProcessor && getOctree()->handlesEditPacketType(packetType)) { + quint64 editStart = usecTimestampNow(); + editPackets++; _octreeInboundPacketProcessor->queueReceivedPacket(matchingNode, receivedPacket); + quint64 editEnd = usecTimestampNow(); + editElapsed += (editEnd - editStart); } else { + quint64 nodeListStart = usecTimestampNow(); + + nodeListPackets++; quint64 now = usecTimestampNow(); if ((now - lastProcessNodeData) > 500000) { qDebug() << "OctreeServer::readPendingDatagrams(): since lastProcessNodeData=" << (now - lastProcessNodeData) << "usecs"; @@ -878,13 +905,26 @@ void OctreeServer::readPendingDatagrams() { if ((endProcessNodeData - startProcessNodeData) > 100000) { qDebug() << "OctreeServer::readPendingDatagrams(): processNodeData() took" << (endProcessNodeData - startProcessNodeData) << "usecs"; } + + quint64 nodeListEnd = usecTimestampNow(); + nodeListElapsed += (nodeListEnd - nodeListStart); } } } quint64 endReadAvailable = usecTimestampNow(); if (endReadAvailable - startReadAvailable > 1000) { qDebug() << "OctreeServer::readPendingDatagrams(): while(readAvailable) took" << (endReadAvailable - startReadAvailable) << "usecs" - << " readDataGrams=" << readDataGrams; + << " readDataGrams=" << readDataGrams + << " nodeListPackets=" << nodeListPackets + << " editPackets=" << editPackets + << " jurisdictionRequests=" << jurisdictionRequests + << " queryPackets=" << queryPackets; + + qDebug() << "OctreeServer::readPendingDatagrams(): while(readAvailable) took" << (endReadAvailable - startReadAvailable) << "usecs" + << " nodeListElapsed=" << nodeListElapsed + << " editElapsed=" << editElapsed + << " jurisdictionElapsed=" << jurisdictionElapsed + << " queryElapsed=" << queryElapsed; } } From 97b2e689881a591658048b6446b749514b3f5f33 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Tue, 1 Apr 2014 14:05:05 -0700 Subject: [PATCH 49/97] more debugging --- assignment-client/src/octree/OctreeServer.cpp | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/assignment-client/src/octree/OctreeServer.cpp b/assignment-client/src/octree/OctreeServer.cpp index bb0424c27e..4ead1705fa 100644 --- a/assignment-client/src/octree/OctreeServer.cpp +++ b/assignment-client/src/octree/OctreeServer.cpp @@ -840,16 +840,26 @@ void OctreeServer::readPendingDatagrams() { quint64 jurisdictionElapsed = 0; quint64 editElapsed = 0; quint64 nodeListElapsed = 0; + quint64 versionMatchElapsed = 0; + quint64 matchingElapsed = 0; while (readAvailableDatagram(receivedPacket, senderSockAddr)) { readDataGrams++; - if (nodeList->packetVersionAndHashMatch(receivedPacket)) { + + quint64 versionMatchStart = usecTimestampNow(); + bool matches = nodeList->packetVersionAndHashMatch(receivedPacket); + quint64 versionMatchEnd = usecTimestampNow(); + versionMatchElapsed += (versionMatchEnd - versionMatchStart); + + if (matches) { PacketType packetType = packetTypeForPacket(receivedPacket); quint64 startNodeLookup = usecTimestampNow(); SharedNodePointer matchingNode = nodeList->sendingNodeForPacket(receivedPacket); quint64 endNodeLookup = usecTimestampNow(); + matchingElapsed += (endNodeLookup - startNodeLookup); + if ((endNodeLookup - startNodeLookup) > 100000) { qDebug() << "OctreeServer::readPendingDatagrams(): sendingNodeForPacket() took" << (endNodeLookup - startNodeLookup) << "usecs"; } @@ -924,7 +934,9 @@ void OctreeServer::readPendingDatagrams() { << " nodeListElapsed=" << nodeListElapsed << " editElapsed=" << editElapsed << " jurisdictionElapsed=" << jurisdictionElapsed - << " queryElapsed=" << queryElapsed; + << " queryElapsed=" << queryElapsed + << " versionMatchElapsed=" << versionMatchElapsed + << " matchingElapsed=" << matchingElapsed; } } From 5325453c89669dbfff10d36bee7dcb80abb204dd Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Tue, 1 Apr 2014 14:39:59 -0700 Subject: [PATCH 50/97] more debugging --- libraries/shared/src/NodeList.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/libraries/shared/src/NodeList.cpp b/libraries/shared/src/NodeList.cpp index 879377a2fd..ff835771cb 100644 --- a/libraries/shared/src/NodeList.cpp +++ b/libraries/shared/src/NodeList.cpp @@ -135,7 +135,8 @@ bool NodeList::packetVersionAndHashMatch(const QByteArray& packet) { << PacketTypeDomainServerAuthRequest << PacketTypeDomainConnectRequest << PacketTypeStunResponse << PacketTypeDataServerConfirm << PacketTypeDataServerGet << PacketTypeDataServerPut << PacketTypeDataServerSend - << PacketTypeCreateAssignment << PacketTypeRequestAssignment; + << PacketTypeCreateAssignment << PacketTypeRequestAssignment + << PacketTypeVoxelQuery << PacketTypeParticleQuery; if (!NON_VERIFIED_PACKETS.contains(checkType)) { // figure out which node this is from From bef5677e91705c3c5b8b28dcd981b7e715cc5ad2 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Tue, 1 Apr 2014 14:51:19 -0700 Subject: [PATCH 51/97] more debugging --- libraries/shared/src/ThreadedAssignment.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/libraries/shared/src/ThreadedAssignment.cpp b/libraries/shared/src/ThreadedAssignment.cpp index fdf2d91c36..0269edd193 100644 --- a/libraries/shared/src/ThreadedAssignment.cpp +++ b/libraries/shared/src/ThreadedAssignment.cpp @@ -11,6 +11,7 @@ #include #include "Logging.h" +#include "SharedUtil.h" #include "ThreadedAssignment.h" ThreadedAssignment::ThreadedAssignment(const QByteArray& packet) : @@ -73,7 +74,14 @@ void ThreadedAssignment::sendStatsPacket() { addPacketStatsAndSendStatsPacket(statsObject); } +quint64 lastCheckIn = usecTimestampNow(); void ThreadedAssignment::checkInWithDomainServerOrExit() { + quint64 now = usecTimestampNow(); + if ((now - lastCheckIn) > 100000) { + qDebug() << "ThreadedAssignment::checkInWithDomainServerOrExit(): since lastCheckIn=" << (now - lastCheckIn) << "usecs"; + } + lastCheckIn = now; + if (NodeList::getInstance()->getNumNoReplyDomainCheckIns() == MAX_SILENT_DOMAIN_SERVER_CHECK_INS) { setFinished(true); } else { From 5b7ab1e49a20d81699377cdbdb9aff71a7cf07c1 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Tue, 1 Apr 2014 14:59:52 -0700 Subject: [PATCH 52/97] more debugging --- libraries/shared/src/NodeList.cpp | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/libraries/shared/src/NodeList.cpp b/libraries/shared/src/NodeList.cpp index ff835771cb..db625d416a 100644 --- a/libraries/shared/src/NodeList.cpp +++ b/libraries/shared/src/NodeList.cpp @@ -924,6 +924,7 @@ void NodeList::resetPacketStats() { } void NodeList::removeSilentNodes() { + quint64 removeSilentNodesStart = usecTimestampNow(); _nodeHashMutex.lock(); @@ -946,6 +947,12 @@ void NodeList::removeSilentNodes() { } _nodeHashMutex.unlock(); + + quint64 removeSilentNodesEnd = usecTimestampNow(); + quint64 removeSilentNodesElapsed = (removeSilentNodesEnd - removeSilentNodesStart); + if (removeSilentNodesElapsed > 100000) { + qDebug() << "removeSilentNodesElapsed="< Date: Tue, 1 Apr 2014 20:14:38 -0700 Subject: [PATCH 53/97] more debugging --- assignment-client/src/octree/OctreeServer.cpp | 26 ++++++++++++++++++- libraries/shared/src/NodeList.cpp | 3 +++ 2 files changed, 28 insertions(+), 1 deletion(-) diff --git a/assignment-client/src/octree/OctreeServer.cpp b/assignment-client/src/octree/OctreeServer.cpp index 4ead1705fa..0a23019bef 100644 --- a/assignment-client/src/octree/OctreeServer.cpp +++ b/assignment-client/src/octree/OctreeServer.cpp @@ -205,11 +205,16 @@ void OctreeServer::trackProcessWaitTime(float time) { } void OctreeServer::attachQueryNodeToNode(Node* newNode) { + quint64 start = usecTimestampNow(); if (!newNode->getLinkedData() && _instance) { OctreeQueryNode* newQueryNodeData = _instance->createOctreeQueryNode(); newQueryNodeData->init(); newNode->setLinkedData(newQueryNodeData); } + quint64 end = usecTimestampNow(); + if (end - start > 1000) { + qDebug() << "OctreeServer::attachQueryNodeToNode() took:" << (end - start); + } } OctreeServer::OctreeServer(const QByteArray& packet) : @@ -243,6 +248,21 @@ OctreeServer::OctreeServer(const QByteArray& packet) : _averageLoopTime.updateAverage(0); qDebug() << "Octree server starting... [" << this << "]"; + + + QTimer* timer = new QTimer(this); + connect(timer, SIGNAL(timeout()), SLOT(doNothing())); + timer->start(0); + +} + +quint64 lastNothing = usecTimestampNow(); +void OctreeServer::doNothing() { + quint64 now = usecTimestampNow(); + if (now - lastNothing > 100) { + qDebug() << "since last doNothing:" << (now - lastNothing); + } + lastNothing = now; } OctreeServer::~OctreeServer() { @@ -1275,9 +1295,13 @@ QString OctreeServer::getStatusLink() { } void OctreeServer::sendStatsPacket() { - + quint64 start = usecTimestampNow(); static QJsonObject statsObject1; ThreadedAssignment::addPacketStatsAndSendStatsPacket(statsObject1); + quint64 end = usecTimestampNow(); + if (end - start > 1000) { + qDebug() << "OctreeServer::sendStatsPacket() took:" << (end - start); + } /** // TODO: we have too many stats to fit in a single MTU... so for now, we break it into multiple JSON objects and diff --git a/libraries/shared/src/NodeList.cpp b/libraries/shared/src/NodeList.cpp index db625d416a..1e93ebf56e 100644 --- a/libraries/shared/src/NodeList.cpp +++ b/libraries/shared/src/NodeList.cpp @@ -923,8 +923,11 @@ void NodeList::resetPacketStats() { _packetStatTimer.restart(); } +quint64 lastSilentNodesStart = usecTimestampNow(); void NodeList::removeSilentNodes() { quint64 removeSilentNodesStart = usecTimestampNow(); + qDebug() << "since last removeSilentNodes()..." << (lastSilentNodesStart - removeSilentNodesStart); + lastSilentNodesStart = removeSilentNodesStart; _nodeHashMutex.lock(); From af47510b051f4c73e2d56ce91b4a66d8bc5e6b9e Mon Sep 17 00:00:00 2001 From: Thijs Wenker Date: Tue, 15 Apr 2014 00:30:01 +0200 Subject: [PATCH 54/97] Initial script editor widget / icons made by MaximillianMerlin ty --- interface/resources/icons/load-script.svg | 125 ++++ interface/resources/icons/new-script.svg | 129 +++++ interface/resources/icons/save-script.svg | 674 ++++++++++++++++++++++ interface/src/Application.h | 1 + interface/src/Menu.cpp | 8 + interface/src/Menu.h | 4 + interface/src/ScriptHighlighting.cpp | 18 + interface/src/ScriptHighlighting.h | 25 + interface/src/ui/ScriptEditorWidget.cpp | 39 ++ interface/src/ui/ScriptEditorWidget.h | 34 ++ interface/src/ui/ScriptEditorWindow.cpp | 62 ++ interface/src/ui/ScriptEditorWindow.h | 39 ++ interface/ui/ScriptEditorWidget.ui | 89 +++ interface/ui/ScriptEditorWindow.ui | 290 ++++++++++ 14 files changed, 1537 insertions(+) create mode 100644 interface/resources/icons/load-script.svg create mode 100644 interface/resources/icons/new-script.svg create mode 100644 interface/resources/icons/save-script.svg create mode 100644 interface/src/ScriptHighlighting.cpp create mode 100644 interface/src/ScriptHighlighting.h create mode 100644 interface/src/ui/ScriptEditorWidget.cpp create mode 100644 interface/src/ui/ScriptEditorWidget.h create mode 100644 interface/src/ui/ScriptEditorWindow.cpp create mode 100644 interface/src/ui/ScriptEditorWindow.h create mode 100644 interface/ui/ScriptEditorWidget.ui create mode 100644 interface/ui/ScriptEditorWindow.ui diff --git a/interface/resources/icons/load-script.svg b/interface/resources/icons/load-script.svg new file mode 100644 index 0000000000..21be61c321 --- /dev/null +++ b/interface/resources/icons/load-script.svg @@ -0,0 +1,125 @@ + + + + + + + + + + image/svg+xml + + + + + T.Hofmeister + + + + + + + + + + + + + + + + + + + + + + diff --git a/interface/resources/icons/new-script.svg b/interface/resources/icons/new-script.svg new file mode 100644 index 0000000000..f68fcfa967 --- /dev/null +++ b/interface/resources/icons/new-script.svg @@ -0,0 +1,129 @@ + + + + + + + + + + image/svg+xml + + + + + T.Hofmeister + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/interface/resources/icons/save-script.svg b/interface/resources/icons/save-script.svg new file mode 100644 index 0000000000..04d41b8302 --- /dev/null +++ b/interface/resources/icons/save-script.svg @@ -0,0 +1,674 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + T.Hofmeister + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/interface/src/Application.h b/interface/src/Application.h index 6a14788caa..761b24bb31 100644 --- a/interface/src/Application.h +++ b/interface/src/Application.h @@ -244,6 +244,7 @@ public: void skipVersion(QString latestVersion); QStringList getRunningScripts() { return _scriptEnginesHash.keys(); } + ScriptEngine* getScriptEngine(QString scriptHash) { return _scriptEnginesHash.contains(scriptHash) ? _scriptEnginesHash[scriptHash] : NULL; } signals: diff --git a/interface/src/Menu.cpp b/interface/src/Menu.cpp index 8ad55dec5b..87ab75cf3f 100644 --- a/interface/src/Menu.cpp +++ b/interface/src/Menu.cpp @@ -192,6 +192,7 @@ Menu::Menu() : QMenu* toolsMenu = addMenu("Tools"); addActionToQMenuAndActionHash(toolsMenu, MenuOption::MetavoxelEditor, 0, this, SLOT(showMetavoxelEditor())); + addActionToQMenuAndActionHash(toolsMenu, MenuOption::ScriptEditor, 0, this, SLOT(showScriptEditor())); #ifdef HAVE_QXMPP _chatAction = addActionToQMenuAndActionHash(toolsMenu, @@ -1058,6 +1059,13 @@ void Menu::showMetavoxelEditor() { _MetavoxelEditor->raise(); } +void Menu::showScriptEditor() { + if(!_ScriptEditor) { + _ScriptEditor = new ScriptEditorWindow(); + } + _ScriptEditor->raise(); +} + void Menu::showChat() { QMainWindow* mainWindow = Application::getInstance()->getWindow(); if (!_chatWindow) { diff --git a/interface/src/Menu.h b/interface/src/Menu.h index e827e43014..14ebbf356d 100644 --- a/interface/src/Menu.h +++ b/interface/src/Menu.h @@ -24,6 +24,7 @@ #include "location/LocationManager.h" #include "ui/PreferencesDialog.h" #include "ui/ChatWindow.h" +#include "ui/ScriptEditorWindow.h" const float ADJUST_LOD_DOWN_FPS = 40.0; const float ADJUST_LOD_UP_FPS = 55.0; @@ -161,6 +162,7 @@ private slots: void cycleFrustumRenderMode(); void runTests(); void showMetavoxelEditor(); + void showScriptEditor(); void showChat(); void toggleChat(); void audioMuteToggled(); @@ -212,6 +214,7 @@ private: FrustumDrawMode _frustumDrawMode; ViewFrustumOffset _viewFrustumOffset; QPointer _MetavoxelEditor; + QPointer _ScriptEditor; QPointer _chatWindow; OctreeStatsDialog* _octreeStatsDialog; LodToolsDialog* _lodToolsDialog; @@ -308,6 +311,7 @@ namespace MenuOption { const QString ResetAvatarSize = "Reset Avatar Size"; const QString RunningScripts = "Running Scripts"; const QString RunTimingTests = "Run Timing Tests"; + const QString ScriptEditor = "Script Editor..."; const QString SettingsExport = "Export Settings"; const QString SettingsImport = "Import Settings"; const QString Shadows = "Shadows"; diff --git a/interface/src/ScriptHighlighting.cpp b/interface/src/ScriptHighlighting.cpp new file mode 100644 index 0000000000..15505ac49a --- /dev/null +++ b/interface/src/ScriptHighlighting.cpp @@ -0,0 +1,18 @@ +// +// ScriptHighlighting.cpp +// interface/src +// +// Created by Thijs Wenker on 4/15/14. +// Copyright 2014 High Fidelity, Inc. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +// + +#include "ScriptHighlighting.h" + +ScriptHighlighting::ScriptHighlighting(QObject* parent) : + QSyntaxHighlighter(parent) +{ + +} \ No newline at end of file diff --git a/interface/src/ScriptHighlighting.h b/interface/src/ScriptHighlighting.h new file mode 100644 index 0000000000..f2bd97930e --- /dev/null +++ b/interface/src/ScriptHighlighting.h @@ -0,0 +1,25 @@ +// +// ScriptHighlighting.h +// interface/src +// +// Created by Thijs Wenker on 4/15/14. +// Copyright 2014 High Fidelity, Inc. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +// + +#ifndef hifi_ScriptHighlighting_h +#define hifi_ScriptHighlighting_h + +#include + +class ScriptHighlighting : public QSyntaxHighlighter { + Q_OBJECT + +public: + ScriptHighlighting(QObject* parent = 0); + +}; + +#endif // hifi_ScriptHighlighting_h diff --git a/interface/src/ui/ScriptEditorWidget.cpp b/interface/src/ui/ScriptEditorWidget.cpp new file mode 100644 index 0000000000..4adf01a28a --- /dev/null +++ b/interface/src/ui/ScriptEditorWidget.cpp @@ -0,0 +1,39 @@ +// +// ScriptEditorWidget.cpp +// interface/src/ui +// +// Created by Thijs Wenker on 4/14/14. +// Copyright 2014 High Fidelity, Inc. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +// + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "Application.h" +#include "ui_scriptEditorWidget.h" + +#include "ScriptEditorWidget.h" + +ScriptEditorWidget::ScriptEditorWidget() : + ui(new Ui::ScriptEditorWidget) +{ + ui->setupUi(this); + + // remove the title bar (see the Qt docs on setTitleBarWidget) + setTitleBarWidget(new QWidget()); + //QSyntaxHighlighter* highlighter = new QSyntaxHighlighter(); +} + +ScriptEditorWidget::~ScriptEditorWidget() { + delete ui; +} \ No newline at end of file diff --git a/interface/src/ui/ScriptEditorWidget.h b/interface/src/ui/ScriptEditorWidget.h new file mode 100644 index 0000000000..931ec105c9 --- /dev/null +++ b/interface/src/ui/ScriptEditorWidget.h @@ -0,0 +1,34 @@ +// +// ScriptEditorWidget.h +// interface/src/ui +// +// Created by Thijs Wenker on 4/14/14. +// Copyright 2014 High Fidelity, Inc. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +// + +#ifndef hifi_ScriptEditorWidget_h +#define hifi_ScriptEditorWidget_h + +#include + +#include + +namespace Ui { +class ScriptEditorWidget; +} + +class ScriptEditorWidget : public QDockWidget { + Q_OBJECT + +public: + ScriptEditorWidget(); + ~ScriptEditorWidget(); + +private: + Ui::ScriptEditorWidget* ui; +}; + +#endif // hifi_ScriptEditorWidget_h diff --git a/interface/src/ui/ScriptEditorWindow.cpp b/interface/src/ui/ScriptEditorWindow.cpp new file mode 100644 index 0000000000..38fa26622a --- /dev/null +++ b/interface/src/ui/ScriptEditorWindow.cpp @@ -0,0 +1,62 @@ +// +// ScriptEditorWindow.cpp +// interface/src/ui +// +// Created by Thijs Wenker on 4/14/14. +// Copyright 2014 High Fidelity, Inc. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +// + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "Application.h" +#include "FlowLayout.h" +#include "ui_scriptEditorWindow.h" +#include "ScriptEditorWidget.h" + +#include "ScriptEditorWindow.h" + +ScriptEditorWindow::ScriptEditorWindow() : + ui(new Ui::ScriptEditorWindow) +{ + ui->setupUi(this); + show(); +} + +ScriptEditorWindow::~ScriptEditorWindow() { + delete ui; +} + +void ScriptEditorWindow::loadScriptClicked(){ + +} + +void ScriptEditorWindow::newScriptClicked(){ + addScriptEditorWidget(QString("new Script")); +} + +void ScriptEditorWindow::toggleRunScriptClicked(){ + +} + +void ScriptEditorWindow::saveScriptClicked(){ + +} + +void ScriptEditorWindow::addScriptEditorWidget(QString title){ + ScriptEditorWidget* newScriptEditorWidget = new ScriptEditorWidget();//ScriptEditorWidget(); + ui->tabWidget->addTab(newScriptEditorWidget, title); + ui->tabWidget->setCurrentWidget(newScriptEditorWidget); + newScriptEditorWidget->setUpdatesEnabled(true); + newScriptEditorWidget->adjustSize(); +} \ No newline at end of file diff --git a/interface/src/ui/ScriptEditorWindow.h b/interface/src/ui/ScriptEditorWindow.h new file mode 100644 index 0000000000..718826cf9d --- /dev/null +++ b/interface/src/ui/ScriptEditorWindow.h @@ -0,0 +1,39 @@ +// +// ScriptEditorWindow.h +// interface/src/ui +// +// Created by Thijs Wenker on 4/14/14. +// Copyright 2014 High Fidelity, Inc. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +// + +#ifndef hifi_ScriptEditorWindow_h +#define hifi_ScriptEditorWindow_h + +#include + +namespace Ui { +class ScriptEditorWindow; +} + +class ScriptEditorWindow : public QWidget { + Q_OBJECT + +public: + ScriptEditorWindow(); + ~ScriptEditorWindow(); + +private: + Ui::ScriptEditorWindow* ui; + void addScriptEditorWidget(QString title); + +private slots: + void loadScriptClicked(); + void newScriptClicked(); + void toggleRunScriptClicked(); + void saveScriptClicked(); +}; + +#endif // hifi_ScriptEditorWindow_h diff --git a/interface/ui/ScriptEditorWidget.ui b/interface/ui/ScriptEditorWidget.ui new file mode 100644 index 0000000000..82398d587c --- /dev/null +++ b/interface/ui/ScriptEditorWidget.ui @@ -0,0 +1,89 @@ + + + ScriptEditorWidget + + + + 0 + 0 + 702 + 543 + + + + + 0 + 0 + + + + + 400 + 238 + + + + font-family: Helvetica, Arial, sans-serif; + + + QDockWidget::DockWidgetFloatable|QDockWidget::DockWidgetMovable + + + Qt::NoDockWidgetArea + + + Edit Script + + + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + + + + Courier + 9 + 50 + false + false + + + + font: 9pt "Courier"; + + + + + + + Debug Log: + + + + + + + font: 8pt "Courier"; + + + + + + + + + diff --git a/interface/ui/ScriptEditorWindow.ui b/interface/ui/ScriptEditorWindow.ui new file mode 100644 index 0000000000..a612b2b1c9 --- /dev/null +++ b/interface/ui/ScriptEditorWindow.ui @@ -0,0 +1,290 @@ + + + ScriptEditorWindow + + + Qt::WindowModal + + + + 0 + 0 + 474 + 638 + + + + + 400 + 250 + + + + Script editor [] + + + font-family: Helvetica, Arial, sans-serif; + + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + + + 3 + + + QLayout::SetNoConstraint + + + 0 + + + 0 + + + + + New Script + + + New + + + + ../resources/icons/new-script.svg + ../resources/images/pinned.svg../resources/icons/new-script.svg + + + + 32 + 32 + + + + + + + + + 30 + 0 + + + + + 25 + 0 + + + + Load Script + + + Load + + + + ../resources/icons/load-script.svg../resources/icons/load-script.svg + + + + 32 + 32 + + + + false + + + QToolButton::MenuButtonPopup + + + Qt::ToolButtonIconOnly + + + + + + + + 0 + 2 + + + + Qt::NoFocus + + + Qt::NoContextMenu + + + Save Script + + + Save + + + + ../resources/icons/save-script.svg../resources/icons/save-script.svg + + + + 32 + 32 + + + + 316 + + + + + + + Toggle Run Script + + + Run/Stop + + + + ../resources/images/plus.svg../resources/images/plus.svg + + + + 32 + 32 + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + true + + + + 250 + 80 + + + + QTabWidget::West + + + QTabWidget::Triangular + + + -1 + + + Qt::ElideNone + + + true + + + true + + + + + + + + + saveButton + clicked() + ScriptEditorWindow + saveScriptClicked() + + + 236 + 10 + + + 199 + 264 + + + + + toggleRunButton + clicked() + ScriptEditorWindow + toggleRunScriptClicked() + + + 330 + 10 + + + 199 + 264 + + + + + newButton + clicked() + ScriptEditorWindow + newScriptClicked() + + + 58 + 10 + + + 199 + 264 + + + + + loadButton + clicked() + ScriptEditorWindow + loadScriptClicked() + + + 85 + 10 + + + 199 + 264 + + + + + From e66822c6ee56cc12854628e6b1448bdc635fdb82 Mon Sep 17 00:00:00 2001 From: Thijs Wenker Date: Wed, 16 Apr 2014 00:55:06 +0200 Subject: [PATCH 55/97] ScriptEditor: Syntax highlighting update --- interface/src/ScriptHighlighting.cpp | 57 ++++++++++++++++++++- interface/src/ScriptHighlighting.h | 20 +++++++- interface/src/ui/ScriptEditorWidget.cpp | 5 +- interface/ui/ScriptEditorWidget.ui | 66 ++++++++++++++++++++++--- 4 files changed, 137 insertions(+), 11 deletions(-) diff --git a/interface/src/ScriptHighlighting.cpp b/interface/src/ScriptHighlighting.cpp index 15505ac49a..119926742c 100644 --- a/interface/src/ScriptHighlighting.cpp +++ b/interface/src/ScriptHighlighting.cpp @@ -11,8 +11,61 @@ #include "ScriptHighlighting.h" -ScriptHighlighting::ScriptHighlighting(QObject* parent) : +ScriptHighlighting::ScriptHighlighting(QTextDocument* parent) : QSyntaxHighlighter(parent) { + keywordRegex = QRegExp("\\b(break|case|catch|continue|debugger|default|delete|do|else|finally|for|function|if|in|instanceof|new|return|switch|this|throw|try|typeof|var|void|while|with)\\b"); + qoutedTextRegex = QRegExp("\".*\""); + multiLineCommentBegin = QRegExp("/\\*"); + multiLineCommentEnd = QRegExp("\\*/"); + numberRegex = QRegExp("[0-9]+(\\.[0-9]+){0,1}"); +} -} \ No newline at end of file +void ScriptHighlighting::highlightBlock(const QString &text) { + this->highlightKeywords(text); + this->formatComments(text); + this->formatQoutedText(text); + this->formatNumbers(text); +} + +void ScriptHighlighting::highlightKeywords(const QString &text) { + int index = keywordRegex.indexIn(text); + while (index >= 0) { + int length = keywordRegex.matchedLength(); + setFormat(index, length, Qt::blue); + index = keywordRegex.indexIn(text, index + length); + } +} + +void ScriptHighlighting::formatComments(const QString &text) { + + setCurrentBlockState(BlockStateClean); + + int start = (previousBlockState() != BlockStateInMultiComment) ? text.indexOf(multiLineCommentBegin) : 0; + + while (start > -1) { + int end = text.indexOf(multiLineCommentEnd, start); + int length = (end == -1 ? text.length() : (end + multiLineCommentEnd.matchedLength())) - start; + setFormat(start, length, Qt::lightGray); + start = text.indexOf(multiLineCommentBegin, start + length); + if (end == -1) setCurrentBlockState(BlockStateInMultiComment); + } +} + +void ScriptHighlighting::formatQoutedText(const QString &text){ + int index = qoutedTextRegex.indexIn(text); + while (index >= 0) { + int length = qoutedTextRegex.matchedLength(); + setFormat(index, length, Qt::red); + index = qoutedTextRegex.indexIn(text, index + length); + } +} + +void ScriptHighlighting::formatNumbers(const QString &text){ + int index = numberRegex.indexIn(text); + while (index >= 0) { + int length = numberRegex.matchedLength(); + setFormat(index, length, Qt::green); + index = numberRegex.indexIn(text, index + length); + } +} diff --git a/interface/src/ScriptHighlighting.h b/interface/src/ScriptHighlighting.h index f2bd97930e..b9567cb06a 100644 --- a/interface/src/ScriptHighlighting.h +++ b/interface/src/ScriptHighlighting.h @@ -18,8 +18,26 @@ class ScriptHighlighting : public QSyntaxHighlighter { Q_OBJECT public: - ScriptHighlighting(QObject* parent = 0); + ScriptHighlighting(QTextDocument* parent = 0); + enum BlockState { + BlockStateClean, + BlockStateInMultiComment + }; + +protected: + void highlightBlock(const QString &text); + void highlightKeywords(const QString &text); + void formatComments(const QString &text); + void formatQoutedText(const QString &text); + void formatNumbers(const QString &text); + +private: + QRegExp keywordRegex; + QRegExp qoutedTextRegex; + QRegExp multiLineCommentBegin; + QRegExp multiLineCommentEnd; + QRegExp numberRegex; }; #endif // hifi_ScriptHighlighting_h diff --git a/interface/src/ui/ScriptEditorWidget.cpp b/interface/src/ui/ScriptEditorWidget.cpp index 4adf01a28a..618e405448 100644 --- a/interface/src/ui/ScriptEditorWidget.cpp +++ b/interface/src/ui/ScriptEditorWidget.cpp @@ -20,6 +20,7 @@ #include #include "Application.h" +#include "ScriptHighlighting.h" #include "ui_scriptEditorWidget.h" #include "ScriptEditorWidget.h" @@ -31,7 +32,9 @@ ScriptEditorWidget::ScriptEditorWidget() : // remove the title bar (see the Qt docs on setTitleBarWidget) setTitleBarWidget(new QWidget()); - //QSyntaxHighlighter* highlighter = new QSyntaxHighlighter(); + QFontMetrics fm(this->ui->scriptEdit->font()); + this->ui->scriptEdit->setTabStopWidth(fm.width('0') * 4); + ScriptHighlighting* highlighting = new ScriptHighlighting(this->ui->scriptEdit->document()); } ScriptEditorWidget::~ScriptEditorWidget() { diff --git a/interface/ui/ScriptEditorWidget.ui b/interface/ui/ScriptEditorWidget.ui index 82398d587c..5878f26c69 100644 --- a/interface/ui/ScriptEditorWidget.ui +++ b/interface/ui/ScriptEditorWidget.ui @@ -52,7 +52,7 @@ 0 - + Courier @@ -68,22 +68,74 @@ - - - Debug Log: + + + 0 - + + 0 + + + 0 + + + + + + 0 + 0 + + + + Debug Log: + + + + + + + Clear + + + + 16 + 16 + + + + + - + font: 8pt "Courier"; + + true + - + + + clearButton + clicked() + debugText + clear() + + + 663 + 447 + + + 350 + 501 + + + + From 0b644b5738b8ed3324f61fbb7957529865b79b63 Mon Sep 17 00:00:00 2001 From: Thijs Wenker Date: Wed, 16 Apr 2014 22:58:44 +0200 Subject: [PATCH 56/97] ctrl+shift+s to open the script editor --- interface/src/Menu.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/interface/src/Menu.cpp b/interface/src/Menu.cpp index cfeba0705f..303e155da6 100644 --- a/interface/src/Menu.cpp +++ b/interface/src/Menu.cpp @@ -192,7 +192,7 @@ Menu::Menu() : QMenu* toolsMenu = addMenu("Tools"); addActionToQMenuAndActionHash(toolsMenu, MenuOption::MetavoxelEditor, 0, this, SLOT(showMetavoxelEditor())); - addActionToQMenuAndActionHash(toolsMenu, MenuOption::ScriptEditor, 0, this, SLOT(showScriptEditor())); + addActionToQMenuAndActionHash(toolsMenu, MenuOption::ScriptEditor, Qt::CTRL | Qt::SHIFT | Qt::Key_S, this, SLOT(showScriptEditor())); #ifdef HAVE_QXMPP _chatAction = addActionToQMenuAndActionHash(toolsMenu, From 50f7db8fe167c07bf01d1a6ff403443d1281f6db Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Fri, 18 Apr 2014 15:02:10 -0700 Subject: [PATCH 57/97] quiet some debugging --- assignment-client/src/octree/OctreeServer.cpp | 15 ++++++++++----- assignment-client/src/octree/OctreeServer.h | 1 + libraries/networking/src/ThreadedAssignment.cpp | 2 +- 3 files changed, 12 insertions(+), 6 deletions(-) diff --git a/assignment-client/src/octree/OctreeServer.cpp b/assignment-client/src/octree/OctreeServer.cpp index e878959e51..1a593f3be7 100644 --- a/assignment-client/src/octree/OctreeServer.cpp +++ b/assignment-client/src/octree/OctreeServer.cpp @@ -253,9 +253,11 @@ OctreeServer::OctreeServer(const QByteArray& packet) : qDebug() << "Octree server starting... [" << this << "]"; + /* QTimer* timer = new QTimer(this); connect(timer, SIGNAL(timeout()), SLOT(doNothing())); timer->start(0); + */ } @@ -842,7 +844,7 @@ quint64 lastProcessNodeData = usecTimestampNow(); void OctreeServer::readPendingDatagrams() { quint64 now = usecTimestampNow(); if ((now - lastReadPendingDatagrams) > 100000) { - qDebug() << "OctreeServer::readPendingDatagrams(): since lastReadPendingDatagrams=" << (now - lastReadPendingDatagrams) << "usecs"; + //qDebug() << "OctreeServer::readPendingDatagrams(): since lastReadPendingDatagrams=" << (now - lastReadPendingDatagrams) << "usecs"; } lastReadPendingDatagrams = now; @@ -884,10 +886,13 @@ void OctreeServer::readPendingDatagrams() { matchingElapsed += (endNodeLookup - startNodeLookup); if ((endNodeLookup - startNodeLookup) > 100000) { - qDebug() << "OctreeServer::readPendingDatagrams(): sendingNodeForPacket() took" << (endNodeLookup - startNodeLookup) << "usecs"; + //qDebug() << "OctreeServer::readPendingDatagrams(): sendingNodeForPacket() took" << (endNodeLookup - startNodeLookup) << "usecs"; } if (packetType == getMyQueryMessageType()) { + +qDebug() << "got a query..."; + quint64 queryStart = usecTimestampNow(); queryPackets++; @@ -898,7 +903,7 @@ void OctreeServer::readPendingDatagrams() { nodeList->updateNodeWithDataFromPacket(matchingNode, receivedPacket); quint64 endUpdateNode = usecTimestampNow(); if ((endUpdateNode - startUpdateNode) > 100000) { - qDebug() << "OctreeServer::readPendingDatagrams(): updateNodeWithDataFromPacket() took" << (endUpdateNode - startUpdateNode) << "usecs"; + //qDebug() << "OctreeServer::readPendingDatagrams(): updateNodeWithDataFromPacket() took" << (endUpdateNode - startUpdateNode) << "usecs"; } OctreeQueryNode* nodeData = (OctreeQueryNode*) matchingNode->getLinkedData(); @@ -927,7 +932,7 @@ void OctreeServer::readPendingDatagrams() { nodeListPackets++; quint64 now = usecTimestampNow(); if ((now - lastProcessNodeData) > 500000) { - qDebug() << "OctreeServer::readPendingDatagrams(): since lastProcessNodeData=" << (now - lastProcessNodeData) << "usecs"; + //qDebug() << "OctreeServer::readPendingDatagrams(): since lastProcessNodeData=" << (now - lastProcessNodeData) << "usecs"; } lastProcessNodeData = now; @@ -936,7 +941,7 @@ void OctreeServer::readPendingDatagrams() { NodeList::getInstance()->processNodeData(senderSockAddr, receivedPacket); quint64 endProcessNodeData = usecTimestampNow(); if ((endProcessNodeData - startProcessNodeData) > 100000) { - qDebug() << "OctreeServer::readPendingDatagrams(): processNodeData() took" << (endProcessNodeData - startProcessNodeData) << "usecs"; + //qDebug() << "OctreeServer::readPendingDatagrams(): processNodeData() took" << (endProcessNodeData - startProcessNodeData) << "usecs"; } quint64 nodeListEnd = usecTimestampNow(); diff --git a/assignment-client/src/octree/OctreeServer.h b/assignment-client/src/octree/OctreeServer.h index d7139b5c3d..7427ee0dbe 100644 --- a/assignment-client/src/octree/OctreeServer.h +++ b/assignment-client/src/octree/OctreeServer.h @@ -126,6 +126,7 @@ public slots: void nodeAdded(SharedNodePointer node); void nodeKilled(SharedNodePointer node); void sendStatsPacket(); + void doNothing(); protected: void parsePayload(); diff --git a/libraries/networking/src/ThreadedAssignment.cpp b/libraries/networking/src/ThreadedAssignment.cpp index 3b00a6a620..528c0b0ff3 100644 --- a/libraries/networking/src/ThreadedAssignment.cpp +++ b/libraries/networking/src/ThreadedAssignment.cpp @@ -81,7 +81,7 @@ quint64 lastCheckIn = usecTimestampNow(); void ThreadedAssignment::checkInWithDomainServerOrExit() { quint64 now = usecTimestampNow(); if ((now - lastCheckIn) > 100000) { - qDebug() << "ThreadedAssignment::checkInWithDomainServerOrExit(): since lastCheckIn=" << (now - lastCheckIn) << "usecs"; + //qDebug() << "ThreadedAssignment::checkInWithDomainServerOrExit(): since lastCheckIn=" << (now - lastCheckIn) << "usecs"; } lastCheckIn = now; From 334f688e4ee591a58e20618debc447ea9b8d3a40 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Fri, 18 Apr 2014 15:30:45 -0700 Subject: [PATCH 58/97] add support for sending unverified datagrams to nodes --- interface/src/Application.cpp | 2 +- libraries/networking/src/LimitedNodeList.cpp | 29 ++++++++++++++++++++ libraries/networking/src/LimitedNodeList.h | 7 +++++ 3 files changed, 37 insertions(+), 1 deletion(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index b01b694662..a1fffff78f 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -2205,7 +2205,7 @@ void Application::queryOctree(NodeType_t serverType, PacketType packetType, Node int packetLength = endOfQueryPacket - queryPacket; // make sure we still have an active socket - nodeList->writeDatagram(reinterpret_cast(queryPacket), packetLength, node); + nodeList->writeUnverifiedDatagram(reinterpret_cast(queryPacket), packetLength, node); // Feed number of bytes to corresponding channel of the bandwidth meter _bandwidthMeter.outputStream(BandwidthMeter::VOXELS).updateValue(packetLength); diff --git a/libraries/networking/src/LimitedNodeList.cpp b/libraries/networking/src/LimitedNodeList.cpp index db8a689001..2c7ab2f5a8 100644 --- a/libraries/networking/src/LimitedNodeList.cpp +++ b/libraries/networking/src/LimitedNodeList.cpp @@ -234,6 +234,30 @@ qint64 LimitedNodeList::writeDatagram(const QByteArray& datagram, const SharedNo return 0; } +qint64 LimitedNodeList::writeUnverifiedDatagram(const QByteArray& datagram, const SharedNodePointer& destinationNode, + const HifiSockAddr& overridenSockAddr) { + if (destinationNode) { + // if we don't have an ovveriden address, assume they want to send to the node's active socket + const HifiSockAddr* destinationSockAddr = &overridenSockAddr; + if (overridenSockAddr.isNull()) { + if (destinationNode->getActiveSocket()) { + // use the node's active socket as the destination socket + destinationSockAddr = destinationNode->getActiveSocket(); + } else { + // we don't have a socket to send to, return 0 + return 0; + } + } + + + // don't use the node secret! + writeDatagram(datagram, *destinationSockAddr, QUuid()); + } + + // didn't have a destinationNode to send to, return 0 + return 0; +} + qint64 LimitedNodeList::writeUnverifiedDatagram(const QByteArray& datagram, const HifiSockAddr& destinationSockAddr) { return writeDatagram(datagram, destinationSockAddr, QUuid()); } @@ -243,6 +267,11 @@ qint64 LimitedNodeList::writeDatagram(const char* data, qint64 size, const Share return writeDatagram(QByteArray(data, size), destinationNode, overridenSockAddr); } +qint64 LimitedNodeList::writeUnverifiedDatagram(const char* data, qint64 size, const SharedNodePointer& destinationNode, + const HifiSockAddr& overridenSockAddr) { + return writeUnverifiedDatagram(QByteArray(data, size), destinationNode, overridenSockAddr); +} + void LimitedNodeList::processNodeData(const HifiSockAddr& senderSockAddr, const QByteArray& packet) { // the node decided not to do anything with this packet // if it comes from a known source we should keep that node alive diff --git a/libraries/networking/src/LimitedNodeList.h b/libraries/networking/src/LimitedNodeList.h index ea9cb42436..2a98dc536f 100644 --- a/libraries/networking/src/LimitedNodeList.h +++ b/libraries/networking/src/LimitedNodeList.h @@ -66,10 +66,17 @@ public: qint64 writeDatagram(const QByteArray& datagram, const SharedNodePointer& destinationNode, const HifiSockAddr& overridenSockAddr = HifiSockAddr()); + + qint64 writeUnverifiedDatagram(const QByteArray& datagram, const SharedNodePointer& destinationNode, + const HifiSockAddr& overridenSockAddr = HifiSockAddr()); + qint64 writeUnverifiedDatagram(const QByteArray& datagram, const HifiSockAddr& destinationSockAddr); qint64 writeDatagram(const char* data, qint64 size, const SharedNodePointer& destinationNode, const HifiSockAddr& overridenSockAddr = HifiSockAddr()); + qint64 writeUnverifiedDatagram(const char* data, qint64 size, const SharedNodePointer& destinationNode, + const HifiSockAddr& overridenSockAddr = HifiSockAddr()); + void(*linkedDataCreateCallback)(Node *); NodeHash getNodeHash(); From c2bcb328049fa0fc331fdbd4938f5b5c252d7431 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Fri, 18 Apr 2014 15:33:27 -0700 Subject: [PATCH 59/97] add support for sending unverified datagrams to nodes --- libraries/octree/src/OctreeHeadlessViewer.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/octree/src/OctreeHeadlessViewer.cpp b/libraries/octree/src/OctreeHeadlessViewer.cpp index b25cb4ff8a..5574b376cb 100644 --- a/libraries/octree/src/OctreeHeadlessViewer.cpp +++ b/libraries/octree/src/OctreeHeadlessViewer.cpp @@ -221,7 +221,7 @@ void OctreeHeadlessViewer::queryOctree() { int packetLength = endOfQueryPacket - queryPacket; // make sure we still have an active socket - nodeList->writeDatagram(reinterpret_cast(queryPacket), packetLength, node); + nodeList->writeUnverifiedDatagram(reinterpret_cast(queryPacket), packetLength, node); } } } From 59cbda20c67432858d837b1b518cb702e8679504 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Sun, 20 Apr 2014 19:48:17 -0700 Subject: [PATCH 60/97] added some threading and event debugging --- assignment-client/src/AssignmentClient.cpp | 11 +++++++++++ assignment-client/src/octree/OctreeServer.cpp | 19 +++++++++++++++++++ assignment-client/src/octree/OctreeServer.h | 2 ++ .../networking/src/ThreadedAssignment.cpp | 8 ++++++++ 4 files changed, 40 insertions(+) diff --git a/assignment-client/src/AssignmentClient.cpp b/assignment-client/src/AssignmentClient.cpp index d60885e2a7..e4b38258f0 100644 --- a/assignment-client/src/AssignmentClient.cpp +++ b/assignment-client/src/AssignmentClient.cpp @@ -17,11 +17,13 @@ #include #include +#include #include #include #include #include + #include "AssignmentFactory.h" #include "AssignmentThread.h" @@ -144,6 +146,11 @@ void AssignmentClient::readPendingDatagrams() { // start the deployed assignment AssignmentThread* workerThread = new AssignmentThread(_currentAssignment, this); + qDebug() << "workerThread->eventDispatcher()=" << workerThread->eventDispatcher(); + qDebug() << "thread()->eventDispatcher()=" << thread()->eventDispatcher(); + + //DebuggingEventDispatcher* debugDispatcher = new DebuggingEventDispatcher(workerThread); + connect(workerThread, &QThread::started, _currentAssignment.data(), &ThreadedAssignment::run); connect(_currentAssignment.data(), &ThreadedAssignment::finished, workerThread, &QThread::quit); connect(_currentAssignment.data(), &ThreadedAssignment::finished, @@ -162,6 +169,10 @@ void AssignmentClient::readPendingDatagrams() { // Starts an event loop, and emits workerThread->started() workerThread->start(); + + qDebug() << "workerThread->eventDispatcher()=" << workerThread->eventDispatcher(); + qDebug() << "thread()->eventDispatcher()=" << thread()->eventDispatcher(); + } else { qDebug() << "Received an assignment that could not be unpacked. Re-requesting."; } diff --git a/assignment-client/src/octree/OctreeServer.cpp b/assignment-client/src/octree/OctreeServer.cpp index 1a593f3be7..24d179b707 100644 --- a/assignment-client/src/octree/OctreeServer.cpp +++ b/assignment-client/src/octree/OctreeServer.cpp @@ -9,6 +9,7 @@ // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // +#include #include #include #include @@ -842,6 +843,9 @@ quint64 lastReadPendingDatagrams = usecTimestampNow(); quint64 lastProcessNodeData = usecTimestampNow(); void OctreeServer::readPendingDatagrams() { + qDebug() << "OctreeServer::readPendingDatagrams()... thread()->eventDispatcher()=" << thread()->eventDispatcher(); + + quint64 now = usecTimestampNow(); if ((now - lastReadPendingDatagrams) > 100000) { //qDebug() << "OctreeServer::readPendingDatagrams(): since lastReadPendingDatagrams=" << (now - lastReadPendingDatagrams) << "usecs"; @@ -969,7 +973,22 @@ qDebug() << "got a query..."; } +void OctreeServer::aboutToBlock() { + qDebug() << "OctreeServer::aboutToBlock()..."; +} + +void OctreeServer::awake() { + qDebug() << "OctreeServer::awake()..."; +} + void OctreeServer::run() { + + QAbstractEventDispatcher* eventDispatcher = thread()->eventDispatcher(); + qDebug() << "OctreeServer::run()... thread()->eventDispatcher()=" << eventDispatcher; + + connect(eventDispatcher, &QAbstractEventDispatcher::aboutToBlock, this, &OctreeServer::aboutToBlock); + connect(eventDispatcher, &QAbstractEventDispatcher::awake, this, &OctreeServer::awake); + _safeServerName = getMyServerName(); // Before we do anything else, create our tree... diff --git a/assignment-client/src/octree/OctreeServer.h b/assignment-client/src/octree/OctreeServer.h index 7427ee0dbe..1b57f3e63d 100644 --- a/assignment-client/src/octree/OctreeServer.h +++ b/assignment-client/src/octree/OctreeServer.h @@ -127,6 +127,8 @@ public slots: void nodeKilled(SharedNodePointer node); void sendStatsPacket(); void doNothing(); + void awake(); + void aboutToBlock(); protected: void parsePayload(); diff --git a/libraries/networking/src/ThreadedAssignment.cpp b/libraries/networking/src/ThreadedAssignment.cpp index 528c0b0ff3..d3de3cdd74 100644 --- a/libraries/networking/src/ThreadedAssignment.cpp +++ b/libraries/networking/src/ThreadedAssignment.cpp @@ -12,6 +12,7 @@ #include #include #include +#include #include "Logging.h" #include "SharedUtil.h" @@ -57,6 +58,9 @@ void ThreadedAssignment::commonInit(const QString& targetName, NodeType_t nodeTy connect(statsTimer, &QTimer::timeout, this, &ThreadedAssignment::sendStatsPacket); statsTimer->start(1000); } + + qDebug() << "ThreadedAssignment::commonInit()... thread()->eventDispatcher()=" << thread()->eventDispatcher(); + } void ThreadedAssignment::addPacketStatsAndSendStatsPacket(QJsonObject &statsObject) { @@ -79,6 +83,10 @@ void ThreadedAssignment::sendStatsPacket() { quint64 lastCheckIn = usecTimestampNow(); void ThreadedAssignment::checkInWithDomainServerOrExit() { + + qDebug() << "ThreadedAssignment::checkInWithDomainServerOrExit()... thread()->eventDispatcher()=" << thread()->eventDispatcher(); + + quint64 now = usecTimestampNow(); if ((now - lastCheckIn) > 100000) { //qDebug() << "ThreadedAssignment::checkInWithDomainServerOrExit(): since lastCheckIn=" << (now - lastCheckIn) << "usecs"; From c016d6557ef5f473b866a0e850718aa2401bde67 Mon Sep 17 00:00:00 2001 From: Thijs Wenker Date: Mon, 21 Apr 2014 05:25:28 +0200 Subject: [PATCH 61/97] - few Adjustments in Application class for Script editor - Shortkey for script editor (Alt+S) - highlighter: bold true/false , single line comments - Run scripts from the editor works - More icons from Maximillian, Thanks - Run on the fly checkbox, works if the script is running. - Load/save features --- interface/resources/icons/start-script.svg | 557 +++++++++++++++++++ interface/resources/icons/stop-script.svg | 163 ++++++ interface/src/Application.cpp | 35 +- interface/src/Application.h | 2 +- interface/src/Menu.cpp | 4 +- interface/src/ScriptHighlighting.cpp | 26 +- interface/src/ScriptHighlighting.h | 13 +- interface/src/ui/ScriptEditorWidget.cpp | 114 ++++ interface/src/ui/ScriptEditorWidget.h | 22 + interface/src/ui/ScriptEditorWindow.cpp | 148 ++++- interface/src/ui/ScriptEditorWindow.h | 17 +- interface/ui/ScriptEditorWidget.ui | 13 +- interface/ui/ScriptEditorWindow.ui | 69 ++- libraries/script-engine/src/ScriptEngine.cpp | 24 +- libraries/script-engine/src/ScriptEngine.h | 7 + 15 files changed, 1163 insertions(+), 51 deletions(-) create mode 100644 interface/resources/icons/start-script.svg create mode 100644 interface/resources/icons/stop-script.svg diff --git a/interface/resources/icons/start-script.svg b/interface/resources/icons/start-script.svg new file mode 100644 index 0000000000..86354a555d --- /dev/null +++ b/interface/resources/icons/start-script.svg @@ -0,0 +1,557 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + Maximillian Merlin + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/interface/resources/icons/stop-script.svg b/interface/resources/icons/stop-script.svg new file mode 100644 index 0000000000..31cdcee749 --- /dev/null +++ b/interface/resources/icons/stop-script.svg @@ -0,0 +1,163 @@ + + + + + + + + + + image/svg+xml + + + + + Maximillian Merlin + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 438722df17..769791d09f 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -797,6 +797,7 @@ void Application::keyPressEvent(QKeyEvent* event) { if (activeWindow() == _window) { bool isShifted = event->modifiers().testFlag(Qt::ShiftModifier); bool isMeta = event->modifiers().testFlag(Qt::ControlModifier); + bool isOption = event->modifiers().testFlag(Qt::AltModifier); switch (event->key()) { break; case Qt::Key_BracketLeft: @@ -839,9 +840,11 @@ void Application::keyPressEvent(QKeyEvent* event) { break; case Qt::Key_S: - if (isShifted && isMeta) { + if (isShifted && isMeta && !isOption) { Menu::getInstance()->triggerOption(MenuOption::SuppressShortTimings); - } else if (!isShifted && isMeta) { + } else if (isOption && !isShifted && !isMeta) { + Menu::getInstance()->triggerOption(MenuOption::ScriptEditor); + } else if (!isOption && !isShifted && isMeta) { takeSnapshot(); } else { _myAvatar->setDriveKeys(BACK, 1.f); @@ -3299,13 +3302,14 @@ void Application::stopAllScripts() { bumpSettings(); } -void Application::stopScript(const QString &scriptName) -{ - _scriptEnginesHash.value(scriptName)->stop(); - qDebug() << "stopping script..." << scriptName; - _scriptEnginesHash.remove(scriptName); - _runningScriptsWidget->setRunningScripts(getRunningScripts()); - bumpSettings(); +void Application::stopScript(const QString &scriptName) { + if (_scriptEnginesHash.contains(scriptName)) { + _scriptEnginesHash.value(scriptName)->stop(); + qDebug() << "stopping script..." << scriptName; + _scriptEnginesHash.remove(scriptName); + _runningScriptsWidget->setRunningScripts(getRunningScripts()); + bumpSettings(); + } } void Application::reloadAllScripts() { @@ -3366,7 +3370,10 @@ void Application::uploadSkeleton() { uploadFST(false); } -void Application::loadScript(const QString& scriptName) { +ScriptEngine* Application::loadScript(const QString& scriptName, bool focusMainWindow) { + if(_scriptEnginesHash.contains(scriptName) && !_scriptEnginesHash[scriptName]->isFinished()){ + return _scriptEnginesHash[scriptName]; + } // start the script on a new thread... ScriptEngine* scriptEngine = new ScriptEngine(QUrl(scriptName), &_controllerScriptingInterface); @@ -3374,7 +3381,7 @@ void Application::loadScript(const QString& scriptName) { if (!scriptEngine->hasScript()) { qDebug() << "Application::loadScript(), script failed to load..."; - return; + return NULL; } _runningScriptsWidget->setRunningScripts(getRunningScripts()); @@ -3422,8 +3429,12 @@ void Application::loadScript(const QString& scriptName) { workerThread->start(); // restore the main window's active state - _window->activateWindow(); + if (focusMainWindow) { + _window->activateWindow(); + } bumpSettings(); + + return scriptEngine; } void Application::loadDialog() { diff --git a/interface/src/Application.h b/interface/src/Application.h index 00b71c4ce7..3254c874b6 100644 --- a/interface/src/Application.h +++ b/interface/src/Application.h @@ -121,7 +121,7 @@ public: ~Application(); void restoreSizeAndPosition(); - void loadScript(const QString& fileNameString); + ScriptEngine* loadScript(const QString& fileNameString, bool focusMainWindow = true); void loadScripts(); void storeSizeAndPosition(); void clearScriptsBeforeRunning(); diff --git a/interface/src/Menu.cpp b/interface/src/Menu.cpp index 6f70c5616c..4e6dd2eec2 100644 --- a/interface/src/Menu.cpp +++ b/interface/src/Menu.cpp @@ -195,7 +195,7 @@ Menu::Menu() : QMenu* toolsMenu = addMenu("Tools"); addActionToQMenuAndActionHash(toolsMenu, MenuOption::MetavoxelEditor, 0, this, SLOT(showMetavoxelEditor())); - addActionToQMenuAndActionHash(toolsMenu, MenuOption::ScriptEditor, Qt::CTRL | Qt::SHIFT | Qt::Key_S, this, SLOT(showScriptEditor())); + addActionToQMenuAndActionHash(toolsMenu, MenuOption::ScriptEditor, Qt::ALT | Qt::Key_S, this, SLOT(showScriptEditor())); #ifdef HAVE_QXMPP _chatAction = addActionToQMenuAndActionHash(toolsMenu, @@ -1125,7 +1125,7 @@ void Menu::showMetavoxelEditor() { } void Menu::showScriptEditor() { - if(!_ScriptEditor) { + if(!_ScriptEditor || !_ScriptEditor->isVisible()) { _ScriptEditor = new ScriptEditorWindow(); } _ScriptEditor->raise(); diff --git a/interface/src/ScriptHighlighting.cpp b/interface/src/ScriptHighlighting.cpp index 119926742c..b2c5ca2ec6 100644 --- a/interface/src/ScriptHighlighting.cpp +++ b/interface/src/ScriptHighlighting.cpp @@ -10,6 +10,7 @@ // #include "ScriptHighlighting.h" +#include ScriptHighlighting::ScriptHighlighting(QTextDocument* parent) : QSyntaxHighlighter(parent) @@ -19,13 +20,16 @@ ScriptHighlighting::ScriptHighlighting(QTextDocument* parent) : multiLineCommentBegin = QRegExp("/\\*"); multiLineCommentEnd = QRegExp("\\*/"); numberRegex = QRegExp("[0-9]+(\\.[0-9]+){0,1}"); + singleLineComment = QRegExp("//[^\n]*"); + truefalseRegex = QRegExp("\\b(true|false)\\b"); } void ScriptHighlighting::highlightBlock(const QString &text) { this->highlightKeywords(text); - this->formatComments(text); - this->formatQoutedText(text); this->formatNumbers(text); + this->formatTrueFalse(text); + this->formatQoutedText(text); + this->formatComments(text); } void ScriptHighlighting::highlightKeywords(const QString &text) { @@ -50,6 +54,13 @@ void ScriptHighlighting::formatComments(const QString &text) { start = text.indexOf(multiLineCommentBegin, start + length); if (end == -1) setCurrentBlockState(BlockStateInMultiComment); } + + int index = singleLineComment.indexIn(text); + while (index >= 0) { + int length = singleLineComment.matchedLength(); + setFormat(index, length, Qt::lightGray); + index = singleLineComment.indexIn(text, index + length); + } } void ScriptHighlighting::formatQoutedText(const QString &text){ @@ -69,3 +80,14 @@ void ScriptHighlighting::formatNumbers(const QString &text){ index = numberRegex.indexIn(text, index + length); } } + +void ScriptHighlighting::formatTrueFalse(const QString text){ + int index = truefalseRegex.indexIn(text); + while (index >= 0) { + int length = truefalseRegex.matchedLength(); + QFont* font = new QFont(this->document()->defaultFont()); + font->setBold(true); + setFormat(index, length, *font); + index = truefalseRegex.indexIn(text, index + length); + } +} \ No newline at end of file diff --git a/interface/src/ScriptHighlighting.h b/interface/src/ScriptHighlighting.h index b9567cb06a..9cbbf277cc 100644 --- a/interface/src/ScriptHighlighting.h +++ b/interface/src/ScriptHighlighting.h @@ -26,11 +26,12 @@ public: }; protected: - void highlightBlock(const QString &text); - void highlightKeywords(const QString &text); - void formatComments(const QString &text); - void formatQoutedText(const QString &text); - void formatNumbers(const QString &text); + void highlightBlock(const QString& text); + void highlightKeywords(const QString& text); + void formatComments(const QString& text); + void formatQoutedText(const QString& text); + void formatNumbers(const QString& text); + void formatTrueFalse(const QString text); private: QRegExp keywordRegex; @@ -38,6 +39,8 @@ private: QRegExp multiLineCommentBegin; QRegExp multiLineCommentEnd; QRegExp numberRegex; + QRegExp singleLineComment; + QRegExp truefalseRegex; }; #endif // hifi_ScriptHighlighting_h diff --git a/interface/src/ui/ScriptEditorWidget.cpp b/interface/src/ui/ScriptEditorWidget.cpp index 618e405448..98b6f2fe96 100644 --- a/interface/src/ui/ScriptEditorWidget.cpp +++ b/interface/src/ui/ScriptEditorWidget.cpp @@ -13,6 +13,7 @@ #include #include #include +#include #include #include #include @@ -30,13 +31,126 @@ ScriptEditorWidget::ScriptEditorWidget() : { ui->setupUi(this); + scriptEngine = NULL; + + connect(ui->scriptEdit->document(), SIGNAL(modificationChanged(bool)), this, SIGNAL(scriptModified())); + connect(ui->scriptEdit->document(), SIGNAL(contentsChanged()), this, SLOT(onScriptModified())); + // remove the title bar (see the Qt docs on setTitleBarWidget) setTitleBarWidget(new QWidget()); QFontMetrics fm(this->ui->scriptEdit->font()); this->ui->scriptEdit->setTabStopWidth(fm.width('0') * 4); ScriptHighlighting* highlighting = new ScriptHighlighting(this->ui->scriptEdit->document()); + QTimer::singleShot(0, this->ui->scriptEdit, SLOT(setFocus())); } ScriptEditorWidget::~ScriptEditorWidget() { delete ui; +} + +void ScriptEditorWidget::onScriptModified() { + if(ui->onTheFlyCheckBox->isChecked() && isRunning()) { + setRunning(false); + setRunning(true); + } +} + +bool ScriptEditorWidget::isModified() { + return ui->scriptEdit->document()->isModified(); +} + +bool ScriptEditorWidget::isRunning() { + return (scriptEngine != NULL) ? scriptEngine->isRunning() : false; +} + +bool ScriptEditorWidget::setRunning(bool run) { + if (run && !save()) { + return false; + } + // Clean-up old connections. + disconnect(this, SLOT(onScriptError(const QString&))); + disconnect(this, SLOT(onScriptPrint(const QString&))); + + if (run) { + scriptEngine = Application::getInstance()->loadScript(this->currentScript, false); + connect(scriptEngine, SIGNAL(runningStateChanged()), this, SIGNAL(runningStateChanged())); + + // Make new connections. + connect(scriptEngine, SIGNAL(errorMessage(const QString&)), this, SLOT(onScriptError(const QString&))); + connect(scriptEngine, SIGNAL(printedMessage(const QString&)), this, SLOT(onScriptPrint(const QString&))); + } else { + Application::getInstance()->stopScript(this->currentScript); + scriptEngine = NULL; + } + return true; +} + +bool ScriptEditorWidget::saveFile(const QString &scriptPath) { + QFile file(scriptPath); + if (!file.open(QFile::WriteOnly | QFile::Text)) { + QMessageBox::warning(this, tr("Interface"), tr("Cannot write script %1:\n%2.").arg(scriptPath).arg(file.errorString())); + return false; + } + + QTextStream out(&file); + out << ui->scriptEdit->toPlainText(); + + setScriptFile(scriptPath); + return true; +} + +void ScriptEditorWidget::loadFile(const QString &scriptPath) { + QFile file(scriptPath); + if (!file.open(QFile::ReadOnly | QFile::Text)) { + QMessageBox::warning(this, tr("Interface"), tr("Cannot read script %1:\n%2.").arg(scriptPath).arg(file.errorString())); + return; + } + + QTextStream in(&file); + ui->scriptEdit->setPlainText(in.readAll()); + + setScriptFile(scriptPath); + + disconnect(this, SLOT(onScriptError(const QString&))); + disconnect(this, SLOT(onScriptPrint(const QString&))); + + scriptEngine = Application::getInstance()->getScriptEngine(scriptPath); + if (scriptEngine != NULL) { + connect(scriptEngine, SIGNAL(runningStateChanged()), this, SIGNAL(runningStateChanged())); + connect(scriptEngine, SIGNAL(errorMessage(const QString&)), this, SLOT(onScriptError(const QString&))); + connect(scriptEngine, SIGNAL(printedMessage(const QString&)), this, SLOT(onScriptPrint(const QString&))); + } +} + +bool ScriptEditorWidget::save() { + return currentScript.isEmpty() ? saveAs() : saveFile(currentScript); +} + +bool ScriptEditorWidget::saveAs() { + QString fileName = QFileDialog::getSaveFileName(this, tr("Save script"), QString(), tr("Javascript (*.js)")); + return !fileName.isEmpty() ? saveFile(fileName) : false; +} + +void ScriptEditorWidget::setScriptFile(const QString& scriptPath) { + currentScript = scriptPath; + ui->scriptEdit->document()->setModified(false); + setWindowModified(false); + + emit scriptnameChanged(); +} + +bool ScriptEditorWidget::questionSave() { + if (ui->scriptEdit->document()->isModified()) { + QMessageBox::StandardButton button = QMessageBox::warning(this, tr("Interface"), tr("The script has been modified.\nDo you want to save your changes?"), QMessageBox::Save | QMessageBox::Discard | QMessageBox::Cancel, QMessageBox::Save); + return button == QMessageBox::Save ? save() : (button == QMessageBox::Cancel ? false : true); + } + return true; +} + +void ScriptEditorWidget::onScriptError(const QString& message) { + ui->debugText->appendPlainText("ERROR: "+ message); +} + +void ScriptEditorWidget::onScriptPrint(const QString& message) { + ui->debugText->appendPlainText("> "+message); } \ No newline at end of file diff --git a/interface/src/ui/ScriptEditorWidget.h b/interface/src/ui/ScriptEditorWidget.h index 931ec105c9..674304acb6 100644 --- a/interface/src/ui/ScriptEditorWidget.h +++ b/interface/src/ui/ScriptEditorWidget.h @@ -27,8 +27,30 @@ public: ScriptEditorWidget(); ~ScriptEditorWidget(); + bool isModified(); + bool isRunning(); + bool setRunning(bool run); + bool saveFile(const QString& scriptPath); + void loadFile(const QString& scriptPath); + void setScriptFile(const QString& scriptPath); + bool save(); + bool saveAs(); + bool questionSave(); + const QString getScriptName() const { return currentScript; }; +signals: + void runningStateChanged(); + void scriptnameChanged(); + void scriptModified(); + +private slots: + void onScriptError(const QString& message); + void onScriptPrint(const QString& message); + void onScriptModified(); + private: Ui::ScriptEditorWidget* ui; + ScriptEngine* scriptEngine; + QString currentScript; }; #endif // hifi_ScriptEditorWidget_h diff --git a/interface/src/ui/ScriptEditorWindow.cpp b/interface/src/ui/ScriptEditorWindow.cpp index 38fa26622a..687b992c5f 100644 --- a/interface/src/ui/ScriptEditorWindow.cpp +++ b/interface/src/ui/ScriptEditorWindow.cpp @@ -13,8 +13,10 @@ #include #include #include +#include #include #include +#include #include #include #include @@ -31,32 +33,158 @@ ScriptEditorWindow::ScriptEditorWindow() : { ui->setupUi(this); show(); + addScriptEditorWidget("New script"); + loadMenu = new QMenu(); + connect(loadMenu, SIGNAL(aboutToShow()), this, SLOT(loadMenuAboutToShow())); + ui->loadButton->setMenu(loadMenu); + + saveMenu = new QMenu(); + saveMenu->addAction("Save as..", this, SLOT(saveScriptAsClicked()), Qt::CTRL|Qt::SHIFT|Qt::Key_S); + + ui->saveButton->setMenu(saveMenu); + + connect(new QShortcut(QKeySequence("Ctrl+N"), this), SIGNAL(activated()), this, SLOT(newScriptClicked())); + connect(new QShortcut(QKeySequence("Ctrl+S"), this), SIGNAL(activated()), this, SLOT(saveScriptClicked())); + connect(new QShortcut(QKeySequence("Ctrl+O"), this), SIGNAL(activated()), this, SLOT(loadScriptClicked())); + connect(new QShortcut(QKeySequence("F5"), this), SIGNAL(activated()), this, SLOT(toggleRunScriptClicked())); } ScriptEditorWindow::~ScriptEditorWindow() { delete ui; } -void ScriptEditorWindow::loadScriptClicked(){ - +void ScriptEditorWindow::setRunningState(bool run) { + if (ui->tabWidget->currentIndex() != -1) { + ((ScriptEditorWidget*)ui->tabWidget->currentWidget())->setRunning(run); + } + this->updateButtons(); } -void ScriptEditorWindow::newScriptClicked(){ - addScriptEditorWidget(QString("new Script")); +void ScriptEditorWindow::updateButtons() { + ui->toggleRunButton->setEnabled(ui->tabWidget->currentIndex() != -1); + ui->toggleRunButton->setIcon(ui->tabWidget->currentIndex() != -1 && ((ScriptEditorWidget*)ui->tabWidget->currentWidget())->isRunning() ? QIcon("../resources/icons/stop-script.svg"):QIcon("../resources/icons/start-script.svg")); } -void ScriptEditorWindow::toggleRunScriptClicked(){ - +void ScriptEditorWindow::loadScriptMenu(const QString& scriptName) { + addScriptEditorWidget("loading...")->loadFile(scriptName); + updateButtons(); } -void ScriptEditorWindow::saveScriptClicked(){ - +void ScriptEditorWindow::loadScriptClicked() { + QString scriptName = QFileDialog::getOpenFileName(this, tr("Interface"), QString(), tr("Javascript (*.js)")); + if (!scriptName.isEmpty()) { + addScriptEditorWidget("loading...")->loadFile(scriptName); + updateButtons(); + } } -void ScriptEditorWindow::addScriptEditorWidget(QString title){ - ScriptEditorWidget* newScriptEditorWidget = new ScriptEditorWidget();//ScriptEditorWidget(); +void ScriptEditorWindow::loadMenuAboutToShow() { + loadMenu->clear(); + QStringList runningScripts = Application::getInstance()->getRunningScripts(); + if (runningScripts.count() > 0) { + QSignalMapper* signalMapper = new QSignalMapper(this); + foreach (const QString& runningScript, runningScripts) { + QAction* runningScriptAction = new QAction(runningScript, loadMenu); + connect(runningScriptAction, SIGNAL(triggered()), signalMapper, SLOT(map())); + signalMapper->setMapping(runningScriptAction, runningScript); + loadMenu->addAction(runningScriptAction); + } + connect(signalMapper, SIGNAL(mapped(const QString &)), this, SLOT(loadScriptMenu(const QString &))); + } else { + QAction* naAction = new QAction("(no running scripts)",loadMenu); + naAction->setDisabled(true); + loadMenu->addAction(naAction); + } +} + +void ScriptEditorWindow::newScriptClicked() { + addScriptEditorWidget(QString("New script")); +} + +void ScriptEditorWindow::toggleRunScriptClicked() { + this->setRunningState(!(ui->tabWidget->currentIndex() !=-1 && ((ScriptEditorWidget*)ui->tabWidget->currentWidget())->isRunning())); +} + +void ScriptEditorWindow::saveScriptClicked() { + if (ui->tabWidget->currentIndex() != -1) { + ScriptEditorWidget* currentScriptWidget = (ScriptEditorWidget*)ui->tabWidget->currentWidget(); + currentScriptWidget->save(); + } +} + +void ScriptEditorWindow::saveScriptAsClicked() { + if (ui->tabWidget->currentIndex() != -1) { + ScriptEditorWidget* currentScriptWidget = (ScriptEditorWidget*)ui->tabWidget->currentWidget(); + currentScriptWidget->saveAs(); + } +} + +ScriptEditorWidget* ScriptEditorWindow::addScriptEditorWidget(QString title) { + ScriptEditorWidget* newScriptEditorWidget = new ScriptEditorWidget(); + connect(newScriptEditorWidget, SIGNAL(scriptnameChanged()), this, SLOT(updateScriptNameOrStatus())); + connect(newScriptEditorWidget, SIGNAL(scriptModified()), this, SLOT(updateScriptNameOrStatus())); + connect(newScriptEditorWidget, SIGNAL(runningStateChanged()), this, SLOT(updateButtons())); ui->tabWidget->addTab(newScriptEditorWidget, title); ui->tabWidget->setCurrentWidget(newScriptEditorWidget); newScriptEditorWidget->setUpdatesEnabled(true); newScriptEditorWidget->adjustSize(); + return newScriptEditorWidget; +} + +void ScriptEditorWindow::tabSwitched(int tabIndex) { + this->updateButtons(); + if (ui->tabWidget->currentIndex() != -1) { + ScriptEditorWidget* currentScriptWidget = (ScriptEditorWidget*)ui->tabWidget->currentWidget(); + QString modifiedStar = (currentScriptWidget->isModified()?"*":""); + if (currentScriptWidget->getScriptName().length() > 0) { + this->setWindowTitle("Script Editor ["+currentScriptWidget->getScriptName()+modifiedStar+"]"); + } else { + this->setWindowTitle("Script Editor [New script"+modifiedStar+"]"); + } + } else { + this->setWindowTitle("Script Editor"); + } +} + +void ScriptEditorWindow::tabCloseRequested(int tabIndex) { + ScriptEditorWidget* closingScriptWidget = (ScriptEditorWidget*)ui->tabWidget->widget(tabIndex); + if(closingScriptWidget->questionSave()) { + ui->tabWidget->removeTab(tabIndex); + } +} + +void ScriptEditorWindow::closeEvent(QCloseEvent *event) { + bool unsaved_docs_warning = false; + for (int i = 0; i < ui->tabWidget->count(); i++ && !unsaved_docs_warning){ + if(((ScriptEditorWidget*)ui->tabWidget->widget(i))->isModified()){ + unsaved_docs_warning = true; + } + } + + if (!unsaved_docs_warning || QMessageBox::warning(this, tr("Interface"), tr("There are some unsaved scripts, are you sure you want to close the editor? Changes will be lost!"), QMessageBox::Discard | QMessageBox::Cancel, QMessageBox::Cancel) == QMessageBox::Discard) { + event->accept(); + } else { + event->ignore(); + } +} + +void ScriptEditorWindow::updateScriptNameOrStatus() { + ScriptEditorWidget* source = (ScriptEditorWidget*)QObject::sender(); + QString modifiedStar = (source->isModified()?"*":""); + if (source->getScriptName().length() > 0) { + for (int i = 0; i < ui->tabWidget->count(); i++){ + if (ui->tabWidget->widget(i) == source) { + ui->tabWidget->setTabText(i,modifiedStar+QFileInfo(source->getScriptName()).fileName()); + ui->tabWidget->setTabToolTip(i, source->getScriptName()); + } + } + } + + if (ui->tabWidget->currentWidget() == source) { + if (source->getScriptName().length() > 0) { + this->setWindowTitle("Script Editor ["+source->getScriptName()+modifiedStar+"]"); + } else { + this->setWindowTitle("Script Editor [New script"+modifiedStar+"]"); + } + } } \ No newline at end of file diff --git a/interface/src/ui/ScriptEditorWindow.h b/interface/src/ui/ScriptEditorWindow.h index 718826cf9d..290a9d6051 100644 --- a/interface/src/ui/ScriptEditorWindow.h +++ b/interface/src/ui/ScriptEditorWindow.h @@ -13,6 +13,7 @@ #define hifi_ScriptEditorWindow_h #include +#include "ScriptEditorWidget.h" namespace Ui { class ScriptEditorWindow; @@ -25,15 +26,29 @@ public: ScriptEditorWindow(); ~ScriptEditorWindow(); +protected: + void closeEvent(QCloseEvent *event); + private: Ui::ScriptEditorWindow* ui; - void addScriptEditorWidget(QString title); + QMenu* loadMenu; + QMenu* saveMenu; + ScriptEditorWidget* addScriptEditorWidget(QString title); + void setRunningState(bool run); + void setScriptName(const QString& scriptName); private slots: + void loadScriptMenu(const QString& scriptName); void loadScriptClicked(); void newScriptClicked(); void toggleRunScriptClicked(); void saveScriptClicked(); + void saveScriptAsClicked(); + void loadMenuAboutToShow(); + void tabSwitched(int tabIndex); + void tabCloseRequested(int tabIndex); + void updateScriptNameOrStatus(); + void updateButtons(); }; #endif // hifi_ScriptEditorWindow_h diff --git a/interface/ui/ScriptEditorWidget.ui b/interface/ui/ScriptEditorWidget.ui index 5878f26c69..88761c91c5 100644 --- a/interface/ui/ScriptEditorWidget.ui +++ b/interface/ui/ScriptEditorWidget.ui @@ -6,8 +6,8 @@ 0 0 - 702 - 543 + 691 + 549 @@ -18,7 +18,7 @@ - 400 + 541 238 @@ -91,6 +91,13 @@ + + + + Run on the fly (Careful: Any valid change made to the code will run immediately) + + + diff --git a/interface/ui/ScriptEditorWindow.ui b/interface/ui/ScriptEditorWindow.ui index a612b2b1c9..9e1b08de3e 100644 --- a/interface/ui/ScriptEditorWindow.ui +++ b/interface/ui/ScriptEditorWindow.ui @@ -9,8 +9,8 @@ 0 0 - 474 - 638 + 706 + 682 @@ -20,7 +20,7 @@ - Script editor [] + Script Editor font-family: Helvetica, Arial, sans-serif; @@ -58,7 +58,7 @@ - New Script + New Script (Ctrl+N) New @@ -66,7 +66,7 @@ ../resources/icons/new-script.svg - ../resources/images/pinned.svg../resources/icons/new-script.svg + ../resources/icons/new-script.svg../resources/icons/new-script.svg @@ -91,7 +91,7 @@ - Load Script + Load Script (Ctrl+O) Load @@ -119,11 +119,17 @@ - - - 0 - 2 - + + + 30 + 0 + + + + + 32 + 0 + Qt::NoFocus @@ -132,7 +138,7 @@ Qt::NoContextMenu - Save Script + Save Script (Ctrl+S) Save @@ -150,19 +156,22 @@ 316 + + QToolButton::MenuButtonPopup + - Toggle Run Script + Toggle Run Script (F5) Run/Stop - ../resources/images/plus.svg../resources/images/plus.svg + ../resources/icons/start-script.svg../resources/icons/start-script.svg @@ -286,5 +295,37 @@ + + tabWidget + currentChanged(int) + ScriptEditorWindow + tabSwitched(int) + + + 352 + 360 + + + 352 + 340 + + + + + tabWidget + tabCloseRequested(int) + ScriptEditorWindow + tabCloseRequested(int) + + + 352 + 360 + + + 352 + 340 + + + diff --git a/libraries/script-engine/src/ScriptEngine.cpp b/libraries/script-engine/src/ScriptEngine.cpp index 684c55fbb0..eeb1cebe09 100644 --- a/libraries/script-engine/src/ScriptEngine.cpp +++ b/libraries/script-engine/src/ScriptEngine.cpp @@ -43,6 +43,11 @@ static QScriptValue soundConstructor(QScriptContext* context, QScriptEngine* eng return soundScriptValue; } +static QScriptValue debugPrint(QScriptContext* context, QScriptEngine* engine){ + qDebug() << "script:print()<<" << context->argument(0).toString(); + engine->evaluate("Script.print('"+context->argument(0).toString()+"')"); + return QScriptValue(); +} ScriptEngine::ScriptEngine(const QString& scriptContents, const QString& fileNameString, AbstractControllerScriptingInterface* controllerScriptingInterface) : @@ -115,6 +120,7 @@ ScriptEngine::ScriptEngine(const QUrl& scriptURL, _scriptContents = in.readAll(); } else { qDebug() << "ERROR Loading file:" << fileName; + emit errorMessage("ERROR Loading file:" + fileName); } } else { QNetworkAccessManager* networkManager = new QNetworkAccessManager(this); @@ -200,6 +206,9 @@ void ScriptEngine::init() { qScriptRegisterSequenceMetaType >(&_engine); qScriptRegisterSequenceMetaType >(&_engine); + QScriptValue printConstructorValue = _engine.newFunction(debugPrint); + _engine.globalObject().setProperty("print", printConstructorValue); + QScriptValue soundConstructorValue = _engine.newFunction(soundConstructor); QScriptValue soundMetaObject = _engine.newQMetaObject(&Sound::staticMetaObject, soundConstructorValue); _engine.globalObject().setProperty("Sound", soundMetaObject); @@ -246,6 +255,7 @@ void ScriptEngine::evaluate() { if (_engine.hasUncaughtException()) { int line = _engine.uncaughtExceptionLineNumber(); qDebug() << "Uncaught exception at line" << line << ":" << result.toString(); + emit errorMessage("Uncaught exception at line" + QString::number(line) + ":" + result.toString()); } } @@ -266,11 +276,14 @@ void ScriptEngine::run() { init(); } _isRunning = true; + emit runningStateChanged(); QScriptValue result = _engine.evaluate(_scriptContents); if (_engine.hasUncaughtException()) { int line = _engine.uncaughtExceptionLineNumber(); + qDebug() << "Uncaught exception at line" << line << ":" << result.toString(); + emit errorMessage("Uncaught exception at line" + QString::number(line) + ":" + result.toString()); } timeval startTime; @@ -401,6 +414,7 @@ void ScriptEngine::run() { if (_engine.hasUncaughtException()) { int line = _engine.uncaughtExceptionLineNumber(); qDebug() << "Uncaught exception at line" << line << ":" << _engine.uncaughtException().toString(); + emit errorMessage("Uncaught exception at line" + QString::number(line) + ":" + _engine.uncaughtException().toString()); } } emit scriptEnding(); @@ -436,10 +450,12 @@ void ScriptEngine::run() { emit finished(_fileNameString); _isRunning = false; + emit runningStateChanged(); } void ScriptEngine::stop() { _isFinished = true; + emit runningStateChanged(); } void ScriptEngine::timerFired() { @@ -510,6 +526,10 @@ QUrl ScriptEngine::resolveInclude(const QString& include) const { return url; } +void ScriptEngine::print(const QString& message) { + emit printedMessage(message); +} + void ScriptEngine::include(const QString& includeFile) { QUrl url = resolveInclude(includeFile); QString includeContents; @@ -523,6 +543,7 @@ void ScriptEngine::include(const QString& includeFile) { includeContents = in.readAll(); } else { qDebug() << "ERROR Loading file:" << fileName; + emit errorMessage("ERROR Loading file:" + fileName); } } else { QNetworkAccessManager* networkManager = new QNetworkAccessManager(this); @@ -538,5 +559,6 @@ void ScriptEngine::include(const QString& includeFile) { if (_engine.hasUncaughtException()) { int line = _engine.uncaughtExceptionLineNumber(); qDebug() << "Uncaught exception at (" << includeFile << ") line" << line << ":" << result.toString(); + emit errorMessage("Uncaught exception at (" + includeFile + ") line" + QString::number(line) + ":" + result.toString()); } -} +} \ No newline at end of file diff --git a/libraries/script-engine/src/ScriptEngine.h b/libraries/script-engine/src/ScriptEngine.h index 941c6bbe27..9ea99276d3 100644 --- a/libraries/script-engine/src/ScriptEngine.h +++ b/libraries/script-engine/src/ScriptEngine.h @@ -80,6 +80,9 @@ public: bool hasScript() const { return !_scriptContents.isEmpty(); } + bool isFinished() const { return _isFinished; } + bool isRunning() const { return _isRunning; } + public slots: void stop(); @@ -88,12 +91,16 @@ public slots: void clearInterval(QObject* timer) { stopTimer(reinterpret_cast(timer)); } void clearTimeout(QObject* timer) { stopTimer(reinterpret_cast(timer)); } void include(const QString& includeFile); + void print(const QString& message); signals: void update(float deltaTime); void scriptEnding(); void finished(const QString& fileNameString); void cleanupMenuItem(const QString& menuItemString); + void printedMessage(const QString& message); + void errorMessage(const QString& message); + void runningStateChanged(); protected: QString _scriptContents; From 5bffb17643f013e267deeeea6efe615449386232 Mon Sep 17 00:00:00 2001 From: Thijs Wenker Date: Mon, 21 Apr 2014 05:51:34 +0200 Subject: [PATCH 62/97] #include -> #include --- interface/src/ui/ScriptEditorWindow.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/interface/src/ui/ScriptEditorWindow.cpp b/interface/src/ui/ScriptEditorWindow.cpp index 687b992c5f..0774ed02f0 100644 --- a/interface/src/ui/ScriptEditorWindow.cpp +++ b/interface/src/ui/ScriptEditorWindow.cpp @@ -13,7 +13,7 @@ #include #include #include -#include +#include #include #include #include From 77994ae0cbaecdb0175051de3ae04d4db80ca123 Mon Sep 17 00:00:00 2001 From: Thijs Wenker Date: Mon, 21 Apr 2014 06:20:18 +0200 Subject: [PATCH 63/97] header cleanup (hopefully the ubuntu test-build will like this) --- interface/src/ui/ScriptEditorWidget.cpp | 6 +++--- interface/src/ui/ScriptEditorWidget.h | 4 ++-- interface/src/ui/ScriptEditorWindow.cpp | 8 ++++---- interface/src/ui/ScriptEditorWindow.h | 1 - 4 files changed, 9 insertions(+), 10 deletions(-) diff --git a/interface/src/ui/ScriptEditorWidget.cpp b/interface/src/ui/ScriptEditorWidget.cpp index 98b6f2fe96..91e3efe1df 100644 --- a/interface/src/ui/ScriptEditorWidget.cpp +++ b/interface/src/ui/ScriptEditorWidget.cpp @@ -9,6 +9,9 @@ // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // +#include "ui_scriptEditorWidget.h" +#include "ScriptEditorWidget.h" + #include #include #include @@ -22,9 +25,6 @@ #include "Application.h" #include "ScriptHighlighting.h" -#include "ui_scriptEditorWidget.h" - -#include "ScriptEditorWidget.h" ScriptEditorWidget::ScriptEditorWidget() : ui(new Ui::ScriptEditorWidget) diff --git a/interface/src/ui/ScriptEditorWidget.h b/interface/src/ui/ScriptEditorWidget.h index 674304acb6..5fed373658 100644 --- a/interface/src/ui/ScriptEditorWidget.h +++ b/interface/src/ui/ScriptEditorWidget.h @@ -13,8 +13,8 @@ #define hifi_ScriptEditorWidget_h #include - -#include +#include "ScriptEditorWidget.h" +#include "ScriptEngine.h" namespace Ui { class ScriptEditorWidget; diff --git a/interface/src/ui/ScriptEditorWindow.cpp b/interface/src/ui/ScriptEditorWindow.cpp index 0774ed02f0..69283feccf 100644 --- a/interface/src/ui/ScriptEditorWindow.cpp +++ b/interface/src/ui/ScriptEditorWindow.cpp @@ -9,6 +9,10 @@ // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // +#include "ui_scriptEditorWindow.h" +#include "ScriptEditorWindow.h" +#include "ScriptEditorWidget.h" + #include #include #include @@ -23,10 +27,6 @@ #include "Application.h" #include "FlowLayout.h" -#include "ui_scriptEditorWindow.h" -#include "ScriptEditorWidget.h" - -#include "ScriptEditorWindow.h" ScriptEditorWindow::ScriptEditorWindow() : ui(new Ui::ScriptEditorWindow) diff --git a/interface/src/ui/ScriptEditorWindow.h b/interface/src/ui/ScriptEditorWindow.h index 290a9d6051..a1b72423ec 100644 --- a/interface/src/ui/ScriptEditorWindow.h +++ b/interface/src/ui/ScriptEditorWindow.h @@ -12,7 +12,6 @@ #ifndef hifi_ScriptEditorWindow_h #define hifi_ScriptEditorWindow_h -#include #include "ScriptEditorWidget.h" namespace Ui { From 0e28ff2fcda7ee5e1bd13decb5cb6b20eed2506c Mon Sep 17 00:00:00 2001 From: "U-Uthoypia\\Thijs" Date: Mon, 21 Apr 2014 06:33:20 +0200 Subject: [PATCH 64/97] This should fix the ubuntu build --- interface/ui/{ScriptEditorWidget.ui => scriptEditorWidget.ui} | 0 interface/ui/{ScriptEditorWindow.ui => scriptEditorWindow.ui} | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename interface/ui/{ScriptEditorWidget.ui => scriptEditorWidget.ui} (100%) rename interface/ui/{ScriptEditorWindow.ui => scriptEditorWindow.ui} (100%) diff --git a/interface/ui/ScriptEditorWidget.ui b/interface/ui/scriptEditorWidget.ui similarity index 100% rename from interface/ui/ScriptEditorWidget.ui rename to interface/ui/scriptEditorWidget.ui diff --git a/interface/ui/ScriptEditorWindow.ui b/interface/ui/scriptEditorWindow.ui similarity index 100% rename from interface/ui/ScriptEditorWindow.ui rename to interface/ui/scriptEditorWindow.ui From c9b04443105f29af8343a1864cf327db19816db3 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Mon, 21 Apr 2014 08:47:14 -0700 Subject: [PATCH 65/97] correct re-assignment of static assignments --- domain-server/src/DomainServer.cpp | 51 ++++++++++++++++-------------- 1 file changed, 28 insertions(+), 23 deletions(-) diff --git a/domain-server/src/DomainServer.cpp b/domain-server/src/DomainServer.cpp index d882bea1c8..003a53027e 100644 --- a/domain-server/src/DomainServer.cpp +++ b/domain-server/src/DomainServer.cpp @@ -344,7 +344,6 @@ const NodeSet STATICALLY_ASSIGNED_NODES = NodeSet() << NodeType::AudioMixer << NodeType::AvatarMixer << NodeType::VoxelServer << NodeType::ParticleServer << NodeType::MetavoxelServer; - void DomainServer::addNodeToNodeListAndConfirmConnection(const QByteArray& packet, const HifiSockAddr& senderSockAddr) { NodeType_t nodeType; @@ -353,34 +352,40 @@ void DomainServer::addNodeToNodeListAndConfirmConnection(const QByteArray& packe int numPreInterestBytes = parseNodeDataFromByteArray(nodeType, publicSockAddr, localSockAddr, packet, senderSockAddr); QUuid assignmentUUID = uuidFromPacketHeader(packet); - SharedAssignmentPointer matchingAssignment; + bool isStaticAssignment = _staticAssignmentHash.contains(assignmentUUID); + SharedAssignmentPointer matchingAssignment = SharedAssignmentPointer(); - if (!assignmentUUID.isNull() && (matchingAssignment = matchingStaticAssignmentForCheckIn(assignmentUUID, nodeType)) - && matchingAssignment) { - // this is an assigned node, make sure the UUID sent is for an assignment we're actually trying to give out + if (isStaticAssignment) { + // this is a static assignment, make sure the UUID sent is for an assignment we're actually trying to give out + matchingAssignment = matchingStaticAssignmentForCheckIn(assignmentUUID, nodeType); - // remove the matching assignment from the assignment queue so we don't take the next check in - // (if it exists) - removeMatchingAssignmentFromQueue(matchingAssignment); + if (matchingAssignment) { + // remove the matching assignment from the assignment queue so we don't take the next check in + // (if it exists) + removeMatchingAssignmentFromQueue(matchingAssignment); + } } else { assignmentUUID = QUuid(); } - // create a new session UUID for this node - QUuid nodeUUID = QUuid::createUuid(); - - SharedNodePointer newNode = LimitedNodeList::getInstance()->addOrUpdateNode(nodeUUID, nodeType, - publicSockAddr, localSockAddr); - - // when the newNode is created the linked data is also created - // if this was a static assignment set the UUID, set the sendingSockAddr - DomainServerNodeData* nodeData = reinterpret_cast(newNode->getLinkedData()); - - nodeData->setStaticAssignmentUUID(assignmentUUID); - nodeData->setSendingSockAddr(senderSockAddr); - - // reply back to the user with a PacketTypeDomainList - sendDomainListToNode(newNode, senderSockAddr, nodeInterestListFromPacket(packet, numPreInterestBytes)); + // make sure this was either not a static assignment or it was and we had a matching one in teh queue + if ((!isStaticAssignment && !STATICALLY_ASSIGNED_NODES.contains(nodeType)) || (isStaticAssignment && matchingAssignment)) { + // create a new session UUID for this node + QUuid nodeUUID = QUuid::createUuid(); + + SharedNodePointer newNode = LimitedNodeList::getInstance()->addOrUpdateNode(nodeUUID, nodeType, + publicSockAddr, localSockAddr); + + // when the newNode is created the linked data is also created + // if this was a static assignment set the UUID, set the sendingSockAddr + DomainServerNodeData* nodeData = reinterpret_cast(newNode->getLinkedData()); + + nodeData->setStaticAssignmentUUID(assignmentUUID); + nodeData->setSendingSockAddr(senderSockAddr); + + // reply back to the user with a PacketTypeDomainList + sendDomainListToNode(newNode, senderSockAddr, nodeInterestListFromPacket(packet, numPreInterestBytes)); + } } int DomainServer::parseNodeDataFromByteArray(NodeType_t& nodeType, HifiSockAddr& publicSockAddr, From 419e0928585dee5fe77bfbd5730527982cf7bd4d Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Mon, 21 Apr 2014 08:48:29 -0700 Subject: [PATCH 66/97] rename matching static method in DS --- domain-server/src/DomainServer.cpp | 4 ++-- domain-server/src/DomainServer.h | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/domain-server/src/DomainServer.cpp b/domain-server/src/DomainServer.cpp index 003a53027e..856078b8a9 100644 --- a/domain-server/src/DomainServer.cpp +++ b/domain-server/src/DomainServer.cpp @@ -357,7 +357,7 @@ void DomainServer::addNodeToNodeListAndConfirmConnection(const QByteArray& packe if (isStaticAssignment) { // this is a static assignment, make sure the UUID sent is for an assignment we're actually trying to give out - matchingAssignment = matchingStaticAssignmentForCheckIn(assignmentUUID, nodeType); + matchingAssignment = matchingQueuedAssignmentForCheckIn(assignmentUUID, nodeType); if (matchingAssignment) { // remove the matching assignment from the assignment queue so we don't take the next check in @@ -1009,7 +1009,7 @@ void DomainServer::nodeKilled(SharedNodePointer node) { } } -SharedAssignmentPointer DomainServer::matchingStaticAssignmentForCheckIn(const QUuid& checkInUUID, NodeType_t nodeType) { +SharedAssignmentPointer DomainServer::matchingQueuedAssignmentForCheckIn(const QUuid& checkInUUID, NodeType_t nodeType) { QQueue::iterator i = _assignmentQueue.begin(); while (i != _assignmentQueue.end()) { diff --git a/domain-server/src/DomainServer.h b/domain-server/src/DomainServer.h index 9bd10b8c60..1bc9b71064 100644 --- a/domain-server/src/DomainServer.h +++ b/domain-server/src/DomainServer.h @@ -70,7 +70,7 @@ private: void createStaticAssignmentsForType(Assignment::Type type, const QJsonArray& configArray); void populateDefaultStaticAssignmentsExcludingTypes(const QSet& excludedTypes); - SharedAssignmentPointer matchingStaticAssignmentForCheckIn(const QUuid& checkInUUID, NodeType_t nodeType); + SharedAssignmentPointer matchingQueuedAssignmentForCheckIn(const QUuid& checkInUUID, NodeType_t nodeType); SharedAssignmentPointer deployableAssignmentForRequest(const Assignment& requestAssignment); void removeMatchingAssignmentFromQueue(const SharedAssignmentPointer& removableAssignment); void refreshStaticAssignmentAndAddToQueue(SharedAssignmentPointer& assignment); From cc7d9863989b797c1b860b24d5d0d954184d6196 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Mon, 21 Apr 2014 09:29:08 -0700 Subject: [PATCH 67/97] don't make scripts statically assigned --- domain-server/src/DomainServer.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/domain-server/src/DomainServer.cpp b/domain-server/src/DomainServer.cpp index 856078b8a9..f42eb6c005 100644 --- a/domain-server/src/DomainServer.cpp +++ b/domain-server/src/DomainServer.cpp @@ -279,7 +279,7 @@ void DomainServer::createScriptedAssignmentsFromArray(const QJsonArray &configAr qDebug() << "URL for script is" << assignmentURL; // scripts passed on CL or via JSON are static - so they are added back to the queue if the node dies - addStaticAssignmentToAssignmentHash(scriptAssignment); + _assignmentQueue.enqueue(SharedAssignmentPointer(scriptAssignment)); } } } @@ -991,6 +991,8 @@ void DomainServer::nodeKilled(SharedNodePointer node) { } } + if (node->getType() == NodeType::Agent && n + // cleanup the connection secrets that we set up for this node (on the other nodes) foreach (const QUuid& otherNodeSessionUUID, nodeData->getSessionSecretHash().keys()) { SharedNodePointer otherNode = LimitedNodeList::getInstance()->nodeWithUUID(otherNodeSessionUUID); From 07387a132e80a37938f3dc8c07f4967d88aa40cf Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Mon, 21 Apr 2014 09:31:21 -0700 Subject: [PATCH 68/97] fix broken DS build --- domain-server/src/DomainServer.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/domain-server/src/DomainServer.cpp b/domain-server/src/DomainServer.cpp index f42eb6c005..eb62dacf79 100644 --- a/domain-server/src/DomainServer.cpp +++ b/domain-server/src/DomainServer.cpp @@ -991,8 +991,6 @@ void DomainServer::nodeKilled(SharedNodePointer node) { } } - if (node->getType() == NodeType::Agent && n - // cleanup the connection secrets that we set up for this node (on the other nodes) foreach (const QUuid& otherNodeSessionUUID, nodeData->getSessionSecretHash().keys()) { SharedNodePointer otherNode = LimitedNodeList::getInstance()->nodeWithUUID(otherNodeSessionUUID); From ffc73e04ebdcbf2638ff56900ffacac1ee4a3e80 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Mon, 21 Apr 2014 11:48:42 -0700 Subject: [PATCH 69/97] added new load testing example script --- examples/testingVoxelViewerRestart.js | 93 +++++++++++++++++++++++++++ 1 file changed, 93 insertions(+) create mode 100644 examples/testingVoxelViewerRestart.js diff --git a/examples/testingVoxelViewerRestart.js b/examples/testingVoxelViewerRestart.js new file mode 100644 index 0000000000..309f970cd8 --- /dev/null +++ b/examples/testingVoxelViewerRestart.js @@ -0,0 +1,93 @@ +// +// seeingVoxelsExample.js +// hifi +// +// Created by Brad Hefta-Gaub on 2/26/14 +// Copyright (c) 2014 HighFidelity, Inc. All rights reserved. +// +// This is an example script +// + +var count = 0; +var yawDirection = -1; +var yaw = 45; +var yawMax = 70; +var yawMin = 20; +var vantagePoint = {x: 5000, y: 500, z: 5000}; + +var isLocal = false; + +// set up our VoxelViewer with a position and orientation +var orientation = Quat.fromPitchYawRollDegrees(0, yaw, 0); + +function getRandomInt(min, max) { + return Math.floor(Math.random() * (max - min + 1)) + min; +} + +function init() { + if (isLocal) { + MyAvatar.position = vantagePoint; + MyAvatar.orientation = orientation; + } else { + VoxelViewer.setPosition(vantagePoint); + VoxelViewer.setOrientation(orientation); + VoxelViewer.queryOctree(); + Agent.isAvatar = true; + } +} + +function keepLooking(deltaTime) { + //print("count =" + count); + + if (count == 0) { + init(); + } + count++; + if (count % getRandomInt(5, 15) == 0) { + yaw += yawDirection; + orientation = Quat.fromPitchYawRollDegrees(0, yaw, 0); + if (yaw > yawMax || yaw < yawMin) { + yawDirection = yawDirection * -1; + } + + //if (count % 10000 == 0) { + // print("calling VoxelViewer.queryOctree()... count=" + count + " yaw=" + yaw); + //} + + if (isLocal) { + MyAvatar.orientation = orientation; + } else { + VoxelViewer.setOrientation(orientation); + VoxelViewer.queryOctree(); + + //if (count % 10000 == 0) { + // print("VoxelViewer.getOctreeElementsCount()=" + VoxelViewer.getOctreeElementsCount()); + //} + } + } + + // approximately every second, consider stopping + if (count % 60 == 0) { + print("considering stop.... elementCount:" + VoxelViewer.getOctreeElementsCount()); + var stopProbability = 0.05; // 5% chance of stopping + if (Math.random() < stopProbability) { + print("stopping.... elementCount:" + VoxelViewer.getOctreeElementsCount()); + Script.stop(); + } + } +} + +function scriptEnding() { + print("SCRIPT ENDNG!!!\n"); +} + +// register the call back so it fires before each data send +Script.update.connect(keepLooking); + +// register our scriptEnding callback +Script.scriptEnding.connect(scriptEnding); + + +// test for local... +Menu.isOptionChecked("Voxels"); +isLocal = true; // will only get here on local client From 7798c6eb09f41e5a19482e10a8b0e14c8cf04bcd Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Mon, 21 Apr 2014 11:48:58 -0700 Subject: [PATCH 70/97] some debugging --- assignment-client/src/octree/OctreeServer.cpp | 38 +++++++++++-------- .../networking/src/ThreadedAssignment.cpp | 8 ++-- 2 files changed, 27 insertions(+), 19 deletions(-) diff --git a/assignment-client/src/octree/OctreeServer.cpp b/assignment-client/src/octree/OctreeServer.cpp index 24d179b707..a73701d695 100644 --- a/assignment-client/src/octree/OctreeServer.cpp +++ b/assignment-client/src/octree/OctreeServer.cpp @@ -843,12 +843,14 @@ quint64 lastReadPendingDatagrams = usecTimestampNow(); quint64 lastProcessNodeData = usecTimestampNow(); void OctreeServer::readPendingDatagrams() { - qDebug() << "OctreeServer::readPendingDatagrams()... thread()->eventDispatcher()=" << thread()->eventDispatcher(); + //qDebug() << "OctreeServer::readPendingDatagrams()... thread()->eventDispatcher()=" << thread()->eventDispatcher(); quint64 now = usecTimestampNow(); - if ((now - lastReadPendingDatagrams) > 100000) { - //qDebug() << "OctreeServer::readPendingDatagrams(): since lastReadPendingDatagrams=" << (now - lastReadPendingDatagrams) << "usecs"; + + // more than 1.1 second is probably a problem + if ((now - lastReadPendingDatagrams) > 1100000) { + qDebug() << "OctreeServer::readPendingDatagrams(): since lastReadPendingDatagrams=" << (now - lastReadPendingDatagrams) << "usecs"; } lastReadPendingDatagrams = now; @@ -890,13 +892,11 @@ void OctreeServer::readPendingDatagrams() { matchingElapsed += (endNodeLookup - startNodeLookup); if ((endNodeLookup - startNodeLookup) > 100000) { - //qDebug() << "OctreeServer::readPendingDatagrams(): sendingNodeForPacket() took" << (endNodeLookup - startNodeLookup) << "usecs"; + qDebug() << "OctreeServer::readPendingDatagrams(): sendingNodeForPacket() took" << (endNodeLookup - startNodeLookup) << "usecs"; } if (packetType == getMyQueryMessageType()) { -qDebug() << "got a query..."; - quint64 queryStart = usecTimestampNow(); queryPackets++; @@ -907,7 +907,7 @@ qDebug() << "got a query..."; nodeList->updateNodeWithDataFromPacket(matchingNode, receivedPacket); quint64 endUpdateNode = usecTimestampNow(); if ((endUpdateNode - startUpdateNode) > 100000) { - //qDebug() << "OctreeServer::readPendingDatagrams(): updateNodeWithDataFromPacket() took" << (endUpdateNode - startUpdateNode) << "usecs"; + qDebug() << "OctreeServer::readPendingDatagrams(): updateNodeWithDataFromPacket() took" << (endUpdateNode - startUpdateNode) << "usecs"; } OctreeQueryNode* nodeData = (OctreeQueryNode*) matchingNode->getLinkedData(); @@ -935,8 +935,10 @@ qDebug() << "got a query..."; nodeListPackets++; quint64 now = usecTimestampNow(); - if ((now - lastProcessNodeData) > 500000) { - //qDebug() << "OctreeServer::readPendingDatagrams(): since lastProcessNodeData=" << (now - lastProcessNodeData) << "usecs"; + + // more than 1.1 second is probably a problem + if ((now - lastProcessNodeData) > 1100000) { + qDebug() << "OctreeServer::readPendingDatagrams(): since lastProcessNodeData=" << (now - lastProcessNodeData) << "usecs"; } lastProcessNodeData = now; @@ -945,7 +947,7 @@ qDebug() << "got a query..."; NodeList::getInstance()->processNodeData(senderSockAddr, receivedPacket); quint64 endProcessNodeData = usecTimestampNow(); if ((endProcessNodeData - startProcessNodeData) > 100000) { - //qDebug() << "OctreeServer::readPendingDatagrams(): processNodeData() took" << (endProcessNodeData - startProcessNodeData) << "usecs"; + qDebug() << "OctreeServer::readPendingDatagrams(): processNodeData() took" << (endProcessNodeData - startProcessNodeData) << "usecs"; } quint64 nodeListEnd = usecTimestampNow(); @@ -974,11 +976,17 @@ qDebug() << "got a query..."; } void OctreeServer::aboutToBlock() { - qDebug() << "OctreeServer::aboutToBlock()..."; + const bool wantDebug = false; + if (wantDebug) { + qDebug() << "OctreeServer::aboutToBlock()..."; + } } void OctreeServer::awake() { - qDebug() << "OctreeServer::awake()..."; + const bool wantDebug = false; + if (wantDebug) { + qDebug() << "OctreeServer::awake()..."; + } } void OctreeServer::run() { @@ -1322,6 +1330,8 @@ QString OctreeServer::getStatusLink() { } void OctreeServer::sendStatsPacket() { + + /* quint64 start = usecTimestampNow(); static QJsonObject statsObject1; ThreadedAssignment::addPacketStatsAndSendStatsPacket(statsObject1); @@ -1329,8 +1339,8 @@ void OctreeServer::sendStatsPacket() { if (end - start > 1000) { qDebug() << "OctreeServer::sendStatsPacket() took:" << (end - start); } + */ - /** // TODO: we have too many stats to fit in a single MTU... so for now, we break it into multiple JSON objects and // send them separately. What we really should do is change the NodeList::sendStatsToDomainServer() to handle the // the following features: @@ -1404,8 +1414,6 @@ void OctreeServer::sendStatsPacket() { (double)_octreeInboundPacketProcessor->getAverageLockWaitTimePerElement(); NodeList::getInstance()->sendStatsToDomainServer(statsObject3); - - **/ } QMap OctreeServer::_threadsDidProcess; diff --git a/libraries/networking/src/ThreadedAssignment.cpp b/libraries/networking/src/ThreadedAssignment.cpp index d3de3cdd74..ebb1435e63 100644 --- a/libraries/networking/src/ThreadedAssignment.cpp +++ b/libraries/networking/src/ThreadedAssignment.cpp @@ -59,7 +59,7 @@ void ThreadedAssignment::commonInit(const QString& targetName, NodeType_t nodeTy statsTimer->start(1000); } - qDebug() << "ThreadedAssignment::commonInit()... thread()->eventDispatcher()=" << thread()->eventDispatcher(); + //qDebug() << "ThreadedAssignment::commonInit()... thread()->eventDispatcher()=" << thread()->eventDispatcher(); } @@ -84,12 +84,12 @@ void ThreadedAssignment::sendStatsPacket() { quint64 lastCheckIn = usecTimestampNow(); void ThreadedAssignment::checkInWithDomainServerOrExit() { - qDebug() << "ThreadedAssignment::checkInWithDomainServerOrExit()... thread()->eventDispatcher()=" << thread()->eventDispatcher(); + //qDebug() << "ThreadedAssignment::checkInWithDomainServerOrExit()... thread()->eventDispatcher()=" << thread()->eventDispatcher(); quint64 now = usecTimestampNow(); - if ((now - lastCheckIn) > 100000) { - //qDebug() << "ThreadedAssignment::checkInWithDomainServerOrExit(): since lastCheckIn=" << (now - lastCheckIn) << "usecs"; + if ((now - lastCheckIn) > 1100000) { + qDebug() << "ThreadedAssignment::checkInWithDomainServerOrExit(): since lastCheckIn=" << (now - lastCheckIn) << "usecs"; } lastCheckIn = now; From c1ed38f4deddbd7e9873b522e6bb3d3f3d559cc0 Mon Sep 17 00:00:00 2001 From: Thijs Wenker Date: Mon, 21 Apr 2014 21:23:39 +0200 Subject: [PATCH 71/97] Style --- interface/src/ScriptHighlighting.cpp | 68 +++++++++--------- interface/src/ScriptHighlighting.h | 18 ++--- interface/src/ui/ScriptEditorWidget.cpp | 74 +++++++++---------- interface/src/ui/ScriptEditorWidget.h | 11 +-- interface/src/ui/ScriptEditorWindow.cpp | 96 ++++++++++++++----------- interface/src/ui/ScriptEditorWindow.h | 11 +-- 6 files changed, 147 insertions(+), 131 deletions(-) diff --git a/interface/src/ScriptHighlighting.cpp b/interface/src/ScriptHighlighting.cpp index b2c5ca2ec6..9b58298b62 100644 --- a/interface/src/ScriptHighlighting.cpp +++ b/interface/src/ScriptHighlighting.cpp @@ -15,16 +15,16 @@ ScriptHighlighting::ScriptHighlighting(QTextDocument* parent) : QSyntaxHighlighter(parent) { - keywordRegex = QRegExp("\\b(break|case|catch|continue|debugger|default|delete|do|else|finally|for|function|if|in|instanceof|new|return|switch|this|throw|try|typeof|var|void|while|with)\\b"); - qoutedTextRegex = QRegExp("\".*\""); - multiLineCommentBegin = QRegExp("/\\*"); - multiLineCommentEnd = QRegExp("\\*/"); - numberRegex = QRegExp("[0-9]+(\\.[0-9]+){0,1}"); - singleLineComment = QRegExp("//[^\n]*"); - truefalseRegex = QRegExp("\\b(true|false)\\b"); + _keywordRegex = QRegExp("\\b(break|case|catch|continue|debugger|default|delete|do|else|finally|for|function|if|in|instanceof|new|return|switch|this|throw|try|typeof|var|void|while|with)\\b"); + _qoutedTextRegex = QRegExp("\".*\""); + _multiLineCommentBegin = QRegExp("/\\*"); + _multiLineCommentEnd = QRegExp("\\*/"); + _numberRegex = QRegExp("[0-9]+(\\.[0-9]+){0,1}"); + _singleLineComment = QRegExp("//[^\n]*"); + _truefalseRegex = QRegExp("\\b(true|false)\\b"); } -void ScriptHighlighting::highlightBlock(const QString &text) { +void ScriptHighlighting::highlightBlock(const QString& text) { this->highlightKeywords(text); this->formatNumbers(text); this->formatTrueFalse(text); @@ -32,62 +32,64 @@ void ScriptHighlighting::highlightBlock(const QString &text) { this->formatComments(text); } -void ScriptHighlighting::highlightKeywords(const QString &text) { - int index = keywordRegex.indexIn(text); +void ScriptHighlighting::highlightKeywords(const QString& text) { + int index = _keywordRegex.indexIn(text); while (index >= 0) { - int length = keywordRegex.matchedLength(); + int length = _keywordRegex.matchedLength(); setFormat(index, length, Qt::blue); - index = keywordRegex.indexIn(text, index + length); + index = _keywordRegex.indexIn(text, index + length); } } -void ScriptHighlighting::formatComments(const QString &text) { +void ScriptHighlighting::formatComments(const QString& text) { setCurrentBlockState(BlockStateClean); - int start = (previousBlockState() != BlockStateInMultiComment) ? text.indexOf(multiLineCommentBegin) : 0; + int start = (previousBlockState() != BlockStateInMultiComment) ? text.indexOf(_multiLineCommentBegin) : 0; while (start > -1) { - int end = text.indexOf(multiLineCommentEnd, start); - int length = (end == -1 ? text.length() : (end + multiLineCommentEnd.matchedLength())) - start; + int end = text.indexOf(_multiLineCommentEnd, start); + int length = (end == -1 ? text.length() : (end + _multiLineCommentEnd.matchedLength())) - start; setFormat(start, length, Qt::lightGray); - start = text.indexOf(multiLineCommentBegin, start + length); - if (end == -1) setCurrentBlockState(BlockStateInMultiComment); + start = text.indexOf(_multiLineCommentBegin, start + length); + if (end == -1) { + setCurrentBlockState(BlockStateInMultiComment); + } } - int index = singleLineComment.indexIn(text); + int index = _singleLineComment.indexIn(text); while (index >= 0) { - int length = singleLineComment.matchedLength(); + int length = _singleLineComment.matchedLength(); setFormat(index, length, Qt::lightGray); - index = singleLineComment.indexIn(text, index + length); + index = _singleLineComment.indexIn(text, index + length); } } -void ScriptHighlighting::formatQoutedText(const QString &text){ - int index = qoutedTextRegex.indexIn(text); +void ScriptHighlighting::formatQoutedText(const QString& text){ + int index = _qoutedTextRegex.indexIn(text); while (index >= 0) { - int length = qoutedTextRegex.matchedLength(); + int length = _qoutedTextRegex.matchedLength(); setFormat(index, length, Qt::red); - index = qoutedTextRegex.indexIn(text, index + length); + index = _qoutedTextRegex.indexIn(text, index + length); } } -void ScriptHighlighting::formatNumbers(const QString &text){ - int index = numberRegex.indexIn(text); +void ScriptHighlighting::formatNumbers(const QString& text){ + int index = _numberRegex.indexIn(text); while (index >= 0) { - int length = numberRegex.matchedLength(); + int length = _numberRegex.matchedLength(); setFormat(index, length, Qt::green); - index = numberRegex.indexIn(text, index + length); + index = _numberRegex.indexIn(text, index + length); } } -void ScriptHighlighting::formatTrueFalse(const QString text){ - int index = truefalseRegex.indexIn(text); +void ScriptHighlighting::formatTrueFalse(const QString& text){ + int index = _truefalseRegex.indexIn(text); while (index >= 0) { - int length = truefalseRegex.matchedLength(); + int length = _truefalseRegex.matchedLength(); QFont* font = new QFont(this->document()->defaultFont()); font->setBold(true); setFormat(index, length, *font); - index = truefalseRegex.indexIn(text, index + length); + index = _truefalseRegex.indexIn(text, index + length); } } \ No newline at end of file diff --git a/interface/src/ScriptHighlighting.h b/interface/src/ScriptHighlighting.h index 9cbbf277cc..d86d6f4d77 100644 --- a/interface/src/ScriptHighlighting.h +++ b/interface/src/ScriptHighlighting.h @@ -18,7 +18,7 @@ class ScriptHighlighting : public QSyntaxHighlighter { Q_OBJECT public: - ScriptHighlighting(QTextDocument* parent = 0); + ScriptHighlighting(QTextDocument* parent = NULL); enum BlockState { BlockStateClean, @@ -31,16 +31,16 @@ protected: void formatComments(const QString& text); void formatQoutedText(const QString& text); void formatNumbers(const QString& text); - void formatTrueFalse(const QString text); + void formatTrueFalse(const QString& text); private: - QRegExp keywordRegex; - QRegExp qoutedTextRegex; - QRegExp multiLineCommentBegin; - QRegExp multiLineCommentEnd; - QRegExp numberRegex; - QRegExp singleLineComment; - QRegExp truefalseRegex; + QRegExp _keywordRegex; + QRegExp _qoutedTextRegex; + QRegExp _multiLineCommentBegin; + QRegExp _multiLineCommentEnd; + QRegExp _numberRegex; + QRegExp _singleLineComment; + QRegExp _truefalseRegex; }; #endif // hifi_ScriptHighlighting_h diff --git a/interface/src/ui/ScriptEditorWidget.cpp b/interface/src/ui/ScriptEditorWidget.cpp index 91e3efe1df..d24c68a613 100644 --- a/interface/src/ui/ScriptEditorWidget.cpp +++ b/interface/src/ui/ScriptEditorWidget.cpp @@ -27,40 +27,39 @@ #include "ScriptHighlighting.h" ScriptEditorWidget::ScriptEditorWidget() : - ui(new Ui::ScriptEditorWidget) + _scriptEditorWidgetUI(new Ui::ScriptEditorWidget), + _scriptEngine(NULL) { - ui->setupUi(this); + _scriptEditorWidgetUI->setupUi(this); - scriptEngine = NULL; - - connect(ui->scriptEdit->document(), SIGNAL(modificationChanged(bool)), this, SIGNAL(scriptModified())); - connect(ui->scriptEdit->document(), SIGNAL(contentsChanged()), this, SLOT(onScriptModified())); + connect(_scriptEditorWidgetUI->scriptEdit->document(), SIGNAL(modificationChanged(bool)), this, SIGNAL(scriptModified())); + connect(_scriptEditorWidgetUI->scriptEdit->document(), SIGNAL(contentsChanged()), this, SLOT(onScriptModified())); // remove the title bar (see the Qt docs on setTitleBarWidget) setTitleBarWidget(new QWidget()); - QFontMetrics fm(this->ui->scriptEdit->font()); - this->ui->scriptEdit->setTabStopWidth(fm.width('0') * 4); - ScriptHighlighting* highlighting = new ScriptHighlighting(this->ui->scriptEdit->document()); - QTimer::singleShot(0, this->ui->scriptEdit, SLOT(setFocus())); + QFontMetrics fm(_scriptEditorWidgetUI->scriptEdit->font()); + _scriptEditorWidgetUI->scriptEdit->setTabStopWidth(fm.width('0') * 4); + ScriptHighlighting* highlighting = new ScriptHighlighting(_scriptEditorWidgetUI->scriptEdit->document()); + QTimer::singleShot(0, _scriptEditorWidgetUI->scriptEdit, SLOT(setFocus())); } ScriptEditorWidget::~ScriptEditorWidget() { - delete ui; + delete _scriptEditorWidgetUI; } void ScriptEditorWidget::onScriptModified() { - if(ui->onTheFlyCheckBox->isChecked() && isRunning()) { + if(_scriptEditorWidgetUI->onTheFlyCheckBox->isChecked() && isRunning()) { setRunning(false); setRunning(true); } } bool ScriptEditorWidget::isModified() { - return ui->scriptEdit->document()->isModified(); + return _scriptEditorWidgetUI->scriptEdit->document()->isModified(); } bool ScriptEditorWidget::isRunning() { - return (scriptEngine != NULL) ? scriptEngine->isRunning() : false; + return (_scriptEngine != NULL) ? _scriptEngine->isRunning() : false; } bool ScriptEditorWidget::setRunning(bool run) { @@ -72,15 +71,15 @@ bool ScriptEditorWidget::setRunning(bool run) { disconnect(this, SLOT(onScriptPrint(const QString&))); if (run) { - scriptEngine = Application::getInstance()->loadScript(this->currentScript, false); - connect(scriptEngine, SIGNAL(runningStateChanged()), this, SIGNAL(runningStateChanged())); + _scriptEngine = Application::getInstance()->loadScript(_currentScript, false); + connect(_scriptEngine, SIGNAL(runningStateChanged()), this, SIGNAL(runningStateChanged())); // Make new connections. - connect(scriptEngine, SIGNAL(errorMessage(const QString&)), this, SLOT(onScriptError(const QString&))); - connect(scriptEngine, SIGNAL(printedMessage(const QString&)), this, SLOT(onScriptPrint(const QString&))); + connect(_scriptEngine, SIGNAL(errorMessage(const QString&)), this, SLOT(onScriptError(const QString&))); + connect(_scriptEngine, SIGNAL(printedMessage(const QString&)), this, SLOT(onScriptPrint(const QString&))); } else { - Application::getInstance()->stopScript(this->currentScript); - scriptEngine = NULL; + Application::getInstance()->stopScript(_currentScript); + _scriptEngine = NULL; } return true; } @@ -88,18 +87,19 @@ bool ScriptEditorWidget::setRunning(bool run) { bool ScriptEditorWidget::saveFile(const QString &scriptPath) { QFile file(scriptPath); if (!file.open(QFile::WriteOnly | QFile::Text)) { - QMessageBox::warning(this, tr("Interface"), tr("Cannot write script %1:\n%2.").arg(scriptPath).arg(file.errorString())); + QMessageBox::warning(this, tr("Interface"), tr("Cannot write script %1:\n%2.").arg(scriptPath) + .arg(file.errorString())); return false; } QTextStream out(&file); - out << ui->scriptEdit->toPlainText(); + out << _scriptEditorWidgetUI->scriptEdit->toPlainText(); setScriptFile(scriptPath); return true; } -void ScriptEditorWidget::loadFile(const QString &scriptPath) { +void ScriptEditorWidget::loadFile(const QString& scriptPath) { QFile file(scriptPath); if (!file.open(QFile::ReadOnly | QFile::Text)) { QMessageBox::warning(this, tr("Interface"), tr("Cannot read script %1:\n%2.").arg(scriptPath).arg(file.errorString())); @@ -107,23 +107,23 @@ void ScriptEditorWidget::loadFile(const QString &scriptPath) { } QTextStream in(&file); - ui->scriptEdit->setPlainText(in.readAll()); + _scriptEditorWidgetUI->scriptEdit->setPlainText(in.readAll()); setScriptFile(scriptPath); disconnect(this, SLOT(onScriptError(const QString&))); disconnect(this, SLOT(onScriptPrint(const QString&))); - scriptEngine = Application::getInstance()->getScriptEngine(scriptPath); - if (scriptEngine != NULL) { - connect(scriptEngine, SIGNAL(runningStateChanged()), this, SIGNAL(runningStateChanged())); - connect(scriptEngine, SIGNAL(errorMessage(const QString&)), this, SLOT(onScriptError(const QString&))); - connect(scriptEngine, SIGNAL(printedMessage(const QString&)), this, SLOT(onScriptPrint(const QString&))); + _scriptEngine = Application::getInstance()->getScriptEngine(scriptPath); + if (_scriptEngine != NULL) { + connect(_scriptEngine, SIGNAL(runningStateChanged()), this, SIGNAL(runningStateChanged())); + connect(_scriptEngine, SIGNAL(errorMessage(const QString&)), this, SLOT(onScriptError(const QString&))); + connect(_scriptEngine, SIGNAL(printedMessage(const QString&)), this, SLOT(onScriptPrint(const QString&))); } } bool ScriptEditorWidget::save() { - return currentScript.isEmpty() ? saveAs() : saveFile(currentScript); + return _currentScript.isEmpty() ? saveAs() : saveFile(_currentScript); } bool ScriptEditorWidget::saveAs() { @@ -132,25 +132,27 @@ bool ScriptEditorWidget::saveAs() { } void ScriptEditorWidget::setScriptFile(const QString& scriptPath) { - currentScript = scriptPath; - ui->scriptEdit->document()->setModified(false); + _currentScript = scriptPath; + _scriptEditorWidgetUI->scriptEdit->document()->setModified(false); setWindowModified(false); emit scriptnameChanged(); } bool ScriptEditorWidget::questionSave() { - if (ui->scriptEdit->document()->isModified()) { - QMessageBox::StandardButton button = QMessageBox::warning(this, tr("Interface"), tr("The script has been modified.\nDo you want to save your changes?"), QMessageBox::Save | QMessageBox::Discard | QMessageBox::Cancel, QMessageBox::Save); + if (_scriptEditorWidgetUI->scriptEdit->document()->isModified()) { + QMessageBox::StandardButton button = QMessageBox::warning(this, tr("Interface"), + tr("The script has been modified.\nDo you want to save your changes?"), QMessageBox::Save | QMessageBox::Discard | + QMessageBox::Cancel, QMessageBox::Save); return button == QMessageBox::Save ? save() : (button == QMessageBox::Cancel ? false : true); } return true; } void ScriptEditorWidget::onScriptError(const QString& message) { - ui->debugText->appendPlainText("ERROR: "+ message); + _scriptEditorWidgetUI->debugText->appendPlainText("ERROR: " + message); } void ScriptEditorWidget::onScriptPrint(const QString& message) { - ui->debugText->appendPlainText("> "+message); + _scriptEditorWidgetUI->debugText->appendPlainText("> " + message); } \ No newline at end of file diff --git a/interface/src/ui/ScriptEditorWidget.h b/interface/src/ui/ScriptEditorWidget.h index 5fed373658..3e50280a62 100644 --- a/interface/src/ui/ScriptEditorWidget.h +++ b/interface/src/ui/ScriptEditorWidget.h @@ -17,7 +17,7 @@ #include "ScriptEngine.h" namespace Ui { -class ScriptEditorWidget; + class ScriptEditorWidget; } class ScriptEditorWidget : public QDockWidget { @@ -36,7 +36,8 @@ public: bool save(); bool saveAs(); bool questionSave(); - const QString getScriptName() const { return currentScript; }; + const QString getScriptName() const { return _currentScript; }; + signals: void runningStateChanged(); void scriptnameChanged(); @@ -48,9 +49,9 @@ private slots: void onScriptModified(); private: - Ui::ScriptEditorWidget* ui; - ScriptEngine* scriptEngine; - QString currentScript; + Ui::ScriptEditorWidget* _scriptEditorWidgetUI; + ScriptEngine* _scriptEngine; + QString _currentScript; }; #endif // hifi_ScriptEditorWidget_h diff --git a/interface/src/ui/ScriptEditorWindow.cpp b/interface/src/ui/ScriptEditorWindow.cpp index 69283feccf..00a3ef9f0c 100644 --- a/interface/src/ui/ScriptEditorWindow.cpp +++ b/interface/src/ui/ScriptEditorWindow.cpp @@ -29,19 +29,19 @@ #include "FlowLayout.h" ScriptEditorWindow::ScriptEditorWindow() : - ui(new Ui::ScriptEditorWindow) + _ScriptEditorWindowUI(new Ui::ScriptEditorWindow), + _loadMenu(new QMenu), + _saveMenu(new QMenu) { - ui->setupUi(this); + _ScriptEditorWindowUI->setupUi(this); show(); addScriptEditorWidget("New script"); - loadMenu = new QMenu(); - connect(loadMenu, SIGNAL(aboutToShow()), this, SLOT(loadMenuAboutToShow())); - ui->loadButton->setMenu(loadMenu); + connect(_loadMenu, SIGNAL(aboutToShow()), this, SLOT(loadMenuAboutToShow())); + _ScriptEditorWindowUI->loadButton->setMenu(_loadMenu); - saveMenu = new QMenu(); - saveMenu->addAction("Save as..", this, SLOT(saveScriptAsClicked()), Qt::CTRL|Qt::SHIFT|Qt::Key_S); + _saveMenu->addAction("Save as..", this, SLOT(saveScriptAsClicked()), Qt::CTRL | Qt::SHIFT | Qt::Key_S); - ui->saveButton->setMenu(saveMenu); + _ScriptEditorWindowUI->saveButton->setMenu(_saveMenu); connect(new QShortcut(QKeySequence("Ctrl+N"), this), SIGNAL(activated()), this, SLOT(newScriptClicked())); connect(new QShortcut(QKeySequence("Ctrl+S"), this), SIGNAL(activated()), this, SLOT(saveScriptClicked())); @@ -50,19 +50,21 @@ ScriptEditorWindow::ScriptEditorWindow() : } ScriptEditorWindow::~ScriptEditorWindow() { - delete ui; + delete _ScriptEditorWindowUI; } void ScriptEditorWindow::setRunningState(bool run) { - if (ui->tabWidget->currentIndex() != -1) { - ((ScriptEditorWidget*)ui->tabWidget->currentWidget())->setRunning(run); + if (_ScriptEditorWindowUI->tabWidget->currentIndex() != -1) { + static_cast(_ScriptEditorWindowUI->tabWidget->currentWidget())->setRunning(run); } this->updateButtons(); } void ScriptEditorWindow::updateButtons() { - ui->toggleRunButton->setEnabled(ui->tabWidget->currentIndex() != -1); - ui->toggleRunButton->setIcon(ui->tabWidget->currentIndex() != -1 && ((ScriptEditorWidget*)ui->tabWidget->currentWidget())->isRunning() ? QIcon("../resources/icons/stop-script.svg"):QIcon("../resources/icons/start-script.svg")); + _ScriptEditorWindowUI->toggleRunButton->setEnabled(_ScriptEditorWindowUI->tabWidget->currentIndex() != -1); + _ScriptEditorWindowUI->toggleRunButton->setIcon(_ScriptEditorWindowUI->tabWidget->currentIndex() != -1 && + static_cast(_ScriptEditorWindowUI->tabWidget->currentWidget())->isRunning() ? + QIcon("../resources/icons/stop-script.svg") : QIcon("../resources/icons/start-script.svg")); } void ScriptEditorWindow::loadScriptMenu(const QString& scriptName) { @@ -79,21 +81,21 @@ void ScriptEditorWindow::loadScriptClicked() { } void ScriptEditorWindow::loadMenuAboutToShow() { - loadMenu->clear(); + _loadMenu->clear(); QStringList runningScripts = Application::getInstance()->getRunningScripts(); if (runningScripts.count() > 0) { QSignalMapper* signalMapper = new QSignalMapper(this); foreach (const QString& runningScript, runningScripts) { - QAction* runningScriptAction = new QAction(runningScript, loadMenu); + QAction* runningScriptAction = new QAction(runningScript, _loadMenu); connect(runningScriptAction, SIGNAL(triggered()), signalMapper, SLOT(map())); signalMapper->setMapping(runningScriptAction, runningScript); - loadMenu->addAction(runningScriptAction); + _loadMenu->addAction(runningScriptAction); } - connect(signalMapper, SIGNAL(mapped(const QString &)), this, SLOT(loadScriptMenu(const QString &))); + connect(signalMapper, SIGNAL(mapped(const QString &)), this, SLOT(loadScriptMenu(const QString&))); } else { - QAction* naAction = new QAction("(no running scripts)",loadMenu); + QAction* naAction = new QAction("(no running scripts)", _loadMenu); naAction->setDisabled(true); - loadMenu->addAction(naAction); + _loadMenu->addAction(naAction); } } @@ -102,19 +104,22 @@ void ScriptEditorWindow::newScriptClicked() { } void ScriptEditorWindow::toggleRunScriptClicked() { - this->setRunningState(!(ui->tabWidget->currentIndex() !=-1 && ((ScriptEditorWidget*)ui->tabWidget->currentWidget())->isRunning())); + this->setRunningState(!(_ScriptEditorWindowUI->tabWidget->currentIndex() !=-1 + && static_cast(_ScriptEditorWindowUI->tabWidget->currentWidget())->isRunning())); } void ScriptEditorWindow::saveScriptClicked() { - if (ui->tabWidget->currentIndex() != -1) { - ScriptEditorWidget* currentScriptWidget = (ScriptEditorWidget*)ui->tabWidget->currentWidget(); + if (_ScriptEditorWindowUI->tabWidget->currentIndex() != -1) { + ScriptEditorWidget* currentScriptWidget = static_cast(_ScriptEditorWindowUI->tabWidget + ->currentWidget()); currentScriptWidget->save(); } } void ScriptEditorWindow::saveScriptAsClicked() { - if (ui->tabWidget->currentIndex() != -1) { - ScriptEditorWidget* currentScriptWidget = (ScriptEditorWidget*)ui->tabWidget->currentWidget(); + if (_ScriptEditorWindowUI->tabWidget->currentIndex() != -1) { + ScriptEditorWidget* currentScriptWidget = static_cast(_ScriptEditorWindowUI->tabWidget + ->currentWidget()); currentScriptWidget->saveAs(); } } @@ -124,8 +129,8 @@ ScriptEditorWidget* ScriptEditorWindow::addScriptEditorWidget(QString title) { connect(newScriptEditorWidget, SIGNAL(scriptnameChanged()), this, SLOT(updateScriptNameOrStatus())); connect(newScriptEditorWidget, SIGNAL(scriptModified()), this, SLOT(updateScriptNameOrStatus())); connect(newScriptEditorWidget, SIGNAL(runningStateChanged()), this, SLOT(updateButtons())); - ui->tabWidget->addTab(newScriptEditorWidget, title); - ui->tabWidget->setCurrentWidget(newScriptEditorWidget); + _ScriptEditorWindowUI->tabWidget->addTab(newScriptEditorWidget, title); + _ScriptEditorWindowUI->tabWidget->setCurrentWidget(newScriptEditorWidget); newScriptEditorWidget->setUpdatesEnabled(true); newScriptEditorWidget->adjustSize(); return newScriptEditorWidget; @@ -133,13 +138,14 @@ ScriptEditorWidget* ScriptEditorWindow::addScriptEditorWidget(QString title) { void ScriptEditorWindow::tabSwitched(int tabIndex) { this->updateButtons(); - if (ui->tabWidget->currentIndex() != -1) { - ScriptEditorWidget* currentScriptWidget = (ScriptEditorWidget*)ui->tabWidget->currentWidget(); - QString modifiedStar = (currentScriptWidget->isModified()?"*":""); + if (_ScriptEditorWindowUI->tabWidget->currentIndex() != -1) { + ScriptEditorWidget* currentScriptWidget = static_cast(_ScriptEditorWindowUI->tabWidget + ->currentWidget()); + QString modifiedStar = (currentScriptWidget->isModified() ? "*" : ""); if (currentScriptWidget->getScriptName().length() > 0) { - this->setWindowTitle("Script Editor ["+currentScriptWidget->getScriptName()+modifiedStar+"]"); + this->setWindowTitle("Script Editor [" + currentScriptWidget->getScriptName() + modifiedStar + "]"); } else { - this->setWindowTitle("Script Editor [New script"+modifiedStar+"]"); + this->setWindowTitle("Script Editor [New script" + modifiedStar + "]"); } } else { this->setWindowTitle("Script Editor"); @@ -147,21 +153,25 @@ void ScriptEditorWindow::tabSwitched(int tabIndex) { } void ScriptEditorWindow::tabCloseRequested(int tabIndex) { - ScriptEditorWidget* closingScriptWidget = (ScriptEditorWidget*)ui->tabWidget->widget(tabIndex); + ScriptEditorWidget* closingScriptWidget = static_cast(_ScriptEditorWindowUI->tabWidget + ->widget(tabIndex)); if(closingScriptWidget->questionSave()) { - ui->tabWidget->removeTab(tabIndex); + _ScriptEditorWindowUI->tabWidget->removeTab(tabIndex); } } void ScriptEditorWindow::closeEvent(QCloseEvent *event) { bool unsaved_docs_warning = false; - for (int i = 0; i < ui->tabWidget->count(); i++ && !unsaved_docs_warning){ - if(((ScriptEditorWidget*)ui->tabWidget->widget(i))->isModified()){ + for (int i = 0; i < _ScriptEditorWindowUI->tabWidget->count(); i++){ + if(static_cast(_ScriptEditorWindowUI->tabWidget->widget(i))->isModified()){ unsaved_docs_warning = true; + break; } } - if (!unsaved_docs_warning || QMessageBox::warning(this, tr("Interface"), tr("There are some unsaved scripts, are you sure you want to close the editor? Changes will be lost!"), QMessageBox::Discard | QMessageBox::Cancel, QMessageBox::Cancel) == QMessageBox::Discard) { + if (!unsaved_docs_warning || QMessageBox::warning(this, tr("Interface"), + tr("There are some unsaved scripts, are you sure you want to close the editor? Changes will be lost!"), + QMessageBox::Discard | QMessageBox::Cancel, QMessageBox::Cancel) == QMessageBox::Discard) { event->accept(); } else { event->ignore(); @@ -172,19 +182,19 @@ void ScriptEditorWindow::updateScriptNameOrStatus() { ScriptEditorWidget* source = (ScriptEditorWidget*)QObject::sender(); QString modifiedStar = (source->isModified()?"*":""); if (source->getScriptName().length() > 0) { - for (int i = 0; i < ui->tabWidget->count(); i++){ - if (ui->tabWidget->widget(i) == source) { - ui->tabWidget->setTabText(i,modifiedStar+QFileInfo(source->getScriptName()).fileName()); - ui->tabWidget->setTabToolTip(i, source->getScriptName()); + for (int i = 0; i < _ScriptEditorWindowUI->tabWidget->count(); i++){ + if (_ScriptEditorWindowUI->tabWidget->widget(i) == source) { + _ScriptEditorWindowUI->tabWidget->setTabText(i,modifiedStar + QFileInfo(source->getScriptName()).fileName()); + _ScriptEditorWindowUI->tabWidget->setTabToolTip(i, source->getScriptName()); } } } - if (ui->tabWidget->currentWidget() == source) { + if (_ScriptEditorWindowUI->tabWidget->currentWidget() == source) { if (source->getScriptName().length() > 0) { - this->setWindowTitle("Script Editor ["+source->getScriptName()+modifiedStar+"]"); + this->setWindowTitle("Script Editor [" + source->getScriptName() + modifiedStar + "]"); } else { - this->setWindowTitle("Script Editor [New script"+modifiedStar+"]"); + this->setWindowTitle("Script Editor [New script" + modifiedStar + "]"); } } } \ No newline at end of file diff --git a/interface/src/ui/ScriptEditorWindow.h b/interface/src/ui/ScriptEditorWindow.h index a1b72423ec..0bf5015ccf 100644 --- a/interface/src/ui/ScriptEditorWindow.h +++ b/interface/src/ui/ScriptEditorWindow.h @@ -15,7 +15,7 @@ #include "ScriptEditorWidget.h" namespace Ui { -class ScriptEditorWindow; + class ScriptEditorWindow; } class ScriptEditorWindow : public QWidget { @@ -26,12 +26,13 @@ public: ~ScriptEditorWindow(); protected: - void closeEvent(QCloseEvent *event); + void closeEvent(QCloseEvent* event); private: - Ui::ScriptEditorWindow* ui; - QMenu* loadMenu; - QMenu* saveMenu; + Ui::ScriptEditorWindow* _ScriptEditorWindowUI; + QMenu* _loadMenu; + QMenu* _saveMenu; + ScriptEditorWidget* addScriptEditorWidget(QString title); void setRunningState(bool run); void setScriptName(const QString& scriptName); From 9faee0d82d9a42938778075f5bc43d38bf16e21d Mon Sep 17 00:00:00 2001 From: Thijs Wenker Date: Mon, 21 Apr 2014 21:37:49 +0200 Subject: [PATCH 72/97] - Style - Script Editor can run script file once at time, but you can still start multiple scripts through the original ways. --- interface/src/Application.cpp | 6 +++--- interface/src/Application.h | 2 +- interface/src/ui/ScriptEditorWidget.cpp | 2 +- interface/src/ui/ScriptEditorWindow.cpp | 4 ++-- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 79d3e7597e..4ba465bbe1 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -3377,8 +3377,8 @@ void Application::uploadSkeleton() { uploadFST(false); } -ScriptEngine* Application::loadScript(const QString& scriptName, bool focusMainWindow) { - if(_scriptEnginesHash.contains(scriptName) && !_scriptEnginesHash[scriptName]->isFinished()){ +ScriptEngine* Application::loadScript(const QString& scriptName, bool loadScriptFromEditor) { + if(loadScriptFromEditor && _scriptEnginesHash.contains(scriptName) && !_scriptEnginesHash[scriptName]->isFinished()){ return _scriptEnginesHash[scriptName]; } @@ -3436,7 +3436,7 @@ ScriptEngine* Application::loadScript(const QString& scriptName, bool focusMainW workerThread->start(); // restore the main window's active state - if (focusMainWindow) { + if (!loadScriptFromEditor) { _window->activateWindow(); } bumpSettings(); diff --git a/interface/src/Application.h b/interface/src/Application.h index e66e7e2975..fb48acb721 100644 --- a/interface/src/Application.h +++ b/interface/src/Application.h @@ -121,7 +121,7 @@ public: ~Application(); void restoreSizeAndPosition(); - ScriptEngine* loadScript(const QString& fileNameString, bool focusMainWindow = true); + ScriptEngine* loadScript(const QString& fileNameString, bool loadScriptFromEditor = false); void loadScripts(); void storeSizeAndPosition(); void clearScriptsBeforeRunning(); diff --git a/interface/src/ui/ScriptEditorWidget.cpp b/interface/src/ui/ScriptEditorWidget.cpp index d24c68a613..74b74e1ad6 100644 --- a/interface/src/ui/ScriptEditorWidget.cpp +++ b/interface/src/ui/ScriptEditorWidget.cpp @@ -71,7 +71,7 @@ bool ScriptEditorWidget::setRunning(bool run) { disconnect(this, SLOT(onScriptPrint(const QString&))); if (run) { - _scriptEngine = Application::getInstance()->loadScript(_currentScript, false); + _scriptEngine = Application::getInstance()->loadScript(_currentScript, true); connect(_scriptEngine, SIGNAL(runningStateChanged()), this, SIGNAL(runningStateChanged())); // Make new connections. diff --git a/interface/src/ui/ScriptEditorWindow.cpp b/interface/src/ui/ScriptEditorWindow.cpp index 00a3ef9f0c..26488f0223 100644 --- a/interface/src/ui/ScriptEditorWindow.cpp +++ b/interface/src/ui/ScriptEditorWindow.cpp @@ -180,11 +180,11 @@ void ScriptEditorWindow::closeEvent(QCloseEvent *event) { void ScriptEditorWindow::updateScriptNameOrStatus() { ScriptEditorWidget* source = (ScriptEditorWidget*)QObject::sender(); - QString modifiedStar = (source->isModified()?"*":""); + QString modifiedStar = (source->isModified()? "*" : ""); if (source->getScriptName().length() > 0) { for (int i = 0; i < _ScriptEditorWindowUI->tabWidget->count(); i++){ if (_ScriptEditorWindowUI->tabWidget->widget(i) == source) { - _ScriptEditorWindowUI->tabWidget->setTabText(i,modifiedStar + QFileInfo(source->getScriptName()).fileName()); + _ScriptEditorWindowUI->tabWidget->setTabText(i, modifiedStar + QFileInfo(source->getScriptName()).fileName()); _ScriptEditorWindowUI->tabWidget->setTabToolTip(i, source->getScriptName()); } } From 70ac93c20d8153ca32fbc7a6f49633462c6c17f8 Mon Sep 17 00:00:00 2001 From: Thijs Wenker Date: Mon, 21 Apr 2014 21:44:50 +0200 Subject: [PATCH 73/97] Style --- interface/src/ui/ScriptEditorWindow.cpp | 2 +- libraries/script-engine/src/ScriptEngine.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/interface/src/ui/ScriptEditorWindow.cpp b/interface/src/ui/ScriptEditorWindow.cpp index 26488f0223..ec63e0341d 100644 --- a/interface/src/ui/ScriptEditorWindow.cpp +++ b/interface/src/ui/ScriptEditorWindow.cpp @@ -179,7 +179,7 @@ void ScriptEditorWindow::closeEvent(QCloseEvent *event) { } void ScriptEditorWindow::updateScriptNameOrStatus() { - ScriptEditorWidget* source = (ScriptEditorWidget*)QObject::sender(); + ScriptEditorWidget* source = static_cast(QObject::sender()); QString modifiedStar = (source->isModified()? "*" : ""); if (source->getScriptName().length() > 0) { for (int i = 0; i < _ScriptEditorWindowUI->tabWidget->count(); i++){ diff --git a/libraries/script-engine/src/ScriptEngine.cpp b/libraries/script-engine/src/ScriptEngine.cpp index eeb1cebe09..2e92567fe7 100644 --- a/libraries/script-engine/src/ScriptEngine.cpp +++ b/libraries/script-engine/src/ScriptEngine.cpp @@ -45,7 +45,7 @@ static QScriptValue soundConstructor(QScriptContext* context, QScriptEngine* eng static QScriptValue debugPrint(QScriptContext* context, QScriptEngine* engine){ qDebug() << "script:print()<<" << context->argument(0).toString(); - engine->evaluate("Script.print('"+context->argument(0).toString()+"')"); + engine->evaluate("Script.print('" + context->argument(0).toString() + "')"); return QScriptValue(); } From 14e1fa269a78c50454b9b8e3b9eab4d2b7eaeca8 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Mon, 21 Apr 2014 13:28:03 -0700 Subject: [PATCH 74/97] cleanup --- assignment-client/src/AssignmentClient.cpp | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/assignment-client/src/AssignmentClient.cpp b/assignment-client/src/AssignmentClient.cpp index e4b38258f0..ff876596b0 100644 --- a/assignment-client/src/AssignmentClient.cpp +++ b/assignment-client/src/AssignmentClient.cpp @@ -17,7 +17,6 @@ #include #include -#include #include #include #include @@ -146,11 +145,6 @@ void AssignmentClient::readPendingDatagrams() { // start the deployed assignment AssignmentThread* workerThread = new AssignmentThread(_currentAssignment, this); - qDebug() << "workerThread->eventDispatcher()=" << workerThread->eventDispatcher(); - qDebug() << "thread()->eventDispatcher()=" << thread()->eventDispatcher(); - - //DebuggingEventDispatcher* debugDispatcher = new DebuggingEventDispatcher(workerThread); - connect(workerThread, &QThread::started, _currentAssignment.data(), &ThreadedAssignment::run); connect(_currentAssignment.data(), &ThreadedAssignment::finished, workerThread, &QThread::quit); connect(_currentAssignment.data(), &ThreadedAssignment::finished, @@ -169,10 +163,6 @@ void AssignmentClient::readPendingDatagrams() { // Starts an event loop, and emits workerThread->started() workerThread->start(); - - qDebug() << "workerThread->eventDispatcher()=" << workerThread->eventDispatcher(); - qDebug() << "thread()->eventDispatcher()=" << thread()->eventDispatcher(); - } else { qDebug() << "Received an assignment that could not be unpacked. Re-requesting."; } From 9a63fa7550b168220290d7972d4ab000d588f501 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Mon, 21 Apr 2014 13:36:13 -0700 Subject: [PATCH 75/97] some cleanup --- assignment-client/src/octree/OctreeSendThread.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/assignment-client/src/octree/OctreeSendThread.cpp b/assignment-client/src/octree/OctreeSendThread.cpp index 71dc819844..d8a9f3d1ea 100644 --- a/assignment-client/src/octree/OctreeSendThread.cpp +++ b/assignment-client/src/octree/OctreeSendThread.cpp @@ -32,23 +32,23 @@ OctreeSendThread::OctreeSendThread(const SharedAssignmentPointer& myAssignment, _nodeMissingCount(0), _isShuttingDown(false) { - QString serverName("Octree"); + QString safeServerName("Octree"); if (_myServer) { - serverName = _myServer->getMyServerName(); + safeServerName = _myServer->getMyServerName(); } - qDebug() << qPrintable(serverName) << "server [" << _myServer << "]: client connected " + qDebug() << qPrintable(safeServerName) << "server [" << _myServer << "]: client connected " "- starting sending thread [" << this << "]"; OctreeServer::clientConnected(); } OctreeSendThread::~OctreeSendThread() { - QString serverName("Octree"); + QString safeServerName("Octree"); if (_myServer) { - serverName = _myServer->getMyServerName(); + safeServerName = _myServer->getMyServerName(); } - qDebug() << qPrintable(serverName) << "server [" << _myServer << "]: client disconnected " + qDebug() << qPrintable(safeServerName) << "server [" << _myServer << "]: client disconnected " "- ending sending thread [" << this << "]"; OctreeServer::clientDisconnected(); From 75f079e2b37a8162a697c7578d18e4b0e9593c75 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Mon, 21 Apr 2014 14:15:13 -0700 Subject: [PATCH 76/97] tweak debugging --- assignment-client/src/octree/OctreeServer.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/assignment-client/src/octree/OctreeServer.cpp b/assignment-client/src/octree/OctreeServer.cpp index a73701d695..cf0cf725a9 100644 --- a/assignment-client/src/octree/OctreeServer.cpp +++ b/assignment-client/src/octree/OctreeServer.cpp @@ -956,7 +956,7 @@ void OctreeServer::readPendingDatagrams() { } } quint64 endReadAvailable = usecTimestampNow(); - if (endReadAvailable - startReadAvailable > 1000) { + if (endReadAvailable - startReadAvailable > 500000) { qDebug() << "OctreeServer::readPendingDatagrams(): while(readAvailable) took" << (endReadAvailable - startReadAvailable) << "usecs" << " readDataGrams=" << readDataGrams << " nodeListPackets=" << nodeListPackets From 7a8a8e2fac32cf5dfc173f31438f266b1b573f55 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Mon, 21 Apr 2014 15:14:06 -0700 Subject: [PATCH 77/97] delete tree on server shutdown --- assignment-client/src/octree/OctreeServer.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/assignment-client/src/octree/OctreeServer.cpp b/assignment-client/src/octree/OctreeServer.cpp index cf0cf725a9..4f435cd371 100644 --- a/assignment-client/src/octree/OctreeServer.cpp +++ b/assignment-client/src/octree/OctreeServer.cpp @@ -298,6 +298,12 @@ OctreeServer::~OctreeServer() { delete _jurisdiction; _jurisdiction = NULL; + // cleanup our tree here... + qDebug() << qPrintable(_safeServerName) << "server cleaning up octree... [" << this << "]"; + delete _tree; + _tree = NULL; + qDebug() << qPrintable(_safeServerName) << "server DONE cleaning up octree... [" << this << "]"; + if (_instance == this) { _instance = NULL; // we are gone } From a473fe3aee736e0e282e5cd5eb83459d902c81ae Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Mon, 21 Apr 2014 15:14:14 -0700 Subject: [PATCH 78/97] fix header --- examples/testingVoxelViewerRestart.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/testingVoxelViewerRestart.js b/examples/testingVoxelViewerRestart.js index 309f970cd8..4fbdee1223 100644 --- a/examples/testingVoxelViewerRestart.js +++ b/examples/testingVoxelViewerRestart.js @@ -1,5 +1,5 @@ // -// seeingVoxelsExample.js +// testingVoxelSeeingRestart.js // hifi // // Created by Brad Hefta-Gaub on 2/26/14 From 779b5a682775131c738e0703eb09a97f50c3c365 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Mon, 21 Apr 2014 15:32:44 -0700 Subject: [PATCH 79/97] debug --- libraries/octree/src/OctreeElementBag.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/libraries/octree/src/OctreeElementBag.cpp b/libraries/octree/src/OctreeElementBag.cpp index f929980a75..9f63b5b071 100644 --- a/libraries/octree/src/OctreeElementBag.cpp +++ b/libraries/octree/src/OctreeElementBag.cpp @@ -24,6 +24,7 @@ OctreeElementBag::~OctreeElementBag() { } void OctreeElementBag::elementDeleted(OctreeElement* element) { +qDebug() << "OctreeElementBag::elementDeleted()..."; remove(element); // note: remove can safely handle nodes that aren't in it, so we don't need to check contains() } From f3aa9d3b8fad2a1dc6d1a5d0de179c0d5e40c3b1 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Mon, 21 Apr 2014 15:45:12 -0700 Subject: [PATCH 80/97] unhook node bag from element notifications on shutdown to speed up cleanup --- assignment-client/src/octree/OctreeQueryNode.cpp | 1 + libraries/octree/src/OctreeElementBag.cpp | 9 ++++++++- libraries/octree/src/OctreeElementBag.h | 3 +++ 3 files changed, 12 insertions(+), 1 deletion(-) diff --git a/assignment-client/src/octree/OctreeQueryNode.cpp b/assignment-client/src/octree/OctreeQueryNode.cpp index 5c882fd032..dfaf641753 100644 --- a/assignment-client/src/octree/OctreeQueryNode.cpp +++ b/assignment-client/src/octree/OctreeQueryNode.cpp @@ -62,6 +62,7 @@ void OctreeQueryNode::nodeKilled() { // while the thread actually shuts down _octreeSendThread->setIsShuttingDown(); } + nodeBag.unhookNotifications(); // if our node is shutting down, then we no longer need octree element notifications } void OctreeQueryNode::forceNodeShutdown() { diff --git a/libraries/octree/src/OctreeElementBag.cpp b/libraries/octree/src/OctreeElementBag.cpp index 9f63b5b071..d4084101cb 100644 --- a/libraries/octree/src/OctreeElementBag.cpp +++ b/libraries/octree/src/OctreeElementBag.cpp @@ -16,13 +16,20 @@ OctreeElementBag::OctreeElementBag() : _bagElements() { OctreeElement::addDeleteHook(this); + _hooked = true; }; OctreeElementBag::~OctreeElementBag() { - OctreeElement::removeDeleteHook(this); + unhookNotifications(); deleteAll(); } +void OctreeElementBag::unhookNotifications() { + if (_hooked) { + OctreeElement::removeDeleteHook(this); + } +} + void OctreeElementBag::elementDeleted(OctreeElement* element) { qDebug() << "OctreeElementBag::elementDeleted()..."; remove(element); // note: remove can safely handle nodes that aren't in it, so we don't need to check contains() diff --git a/libraries/octree/src/OctreeElementBag.h b/libraries/octree/src/OctreeElementBag.h index afc34bf1a6..8c18ece773 100644 --- a/libraries/octree/src/OctreeElementBag.h +++ b/libraries/octree/src/OctreeElementBag.h @@ -36,8 +36,11 @@ public: void deleteAll(); virtual void elementDeleted(OctreeElement* element); + void unhookNotifications(); + private: QSet _bagElements; + bool _hooked; }; #endif // hifi_OctreeElementBag_h From 003e3ae507d96761b048720e3afc1875e5f4f39e Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Mon, 21 Apr 2014 16:01:37 -0700 Subject: [PATCH 81/97] properly unhook delete notifications --- assignment-client/src/octree/OctreeQueryNode.cpp | 3 ++- libraries/octree/src/OctreeElementBag.cpp | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/assignment-client/src/octree/OctreeQueryNode.cpp b/assignment-client/src/octree/OctreeQueryNode.cpp index dfaf641753..10d30ad1ae 100644 --- a/assignment-client/src/octree/OctreeQueryNode.cpp +++ b/assignment-client/src/octree/OctreeQueryNode.cpp @@ -57,16 +57,17 @@ OctreeQueryNode::~OctreeQueryNode() { void OctreeQueryNode::nodeKilled() { _isShuttingDown = true; + nodeBag.unhookNotifications(); // if our node is shutting down, then we no longer need octree element notifications if (_octreeSendThread) { // just tell our thread we want to shutdown, this is asynchronous, and fast, we don't need or want it to block // while the thread actually shuts down _octreeSendThread->setIsShuttingDown(); } - nodeBag.unhookNotifications(); // if our node is shutting down, then we no longer need octree element notifications } void OctreeQueryNode::forceNodeShutdown() { _isShuttingDown = true; + nodeBag.unhookNotifications(); // if our node is shutting down, then we no longer need octree element notifications if (_octreeSendThread) { // we really need to force our thread to shutdown, this is synchronous, we will block while the thread actually // shuts down because we really need it to shutdown, and it's ok if we wait for it to complete diff --git a/libraries/octree/src/OctreeElementBag.cpp b/libraries/octree/src/OctreeElementBag.cpp index d4084101cb..92a8fe5bff 100644 --- a/libraries/octree/src/OctreeElementBag.cpp +++ b/libraries/octree/src/OctreeElementBag.cpp @@ -27,11 +27,11 @@ OctreeElementBag::~OctreeElementBag() { void OctreeElementBag::unhookNotifications() { if (_hooked) { OctreeElement::removeDeleteHook(this); + _hooked = false; } } void OctreeElementBag::elementDeleted(OctreeElement* element) { -qDebug() << "OctreeElementBag::elementDeleted()..."; remove(element); // note: remove can safely handle nodes that aren't in it, so we don't need to check contains() } From 681aab5bf036a75383918a6822f1f01f9277e3b3 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Mon, 21 Apr 2014 16:17:45 -0700 Subject: [PATCH 82/97] Remove printf and replace them by qDebug() --- animation-server/src/AnimationServer.cpp | 36 +++++++++---------- .../octree/OctreeInboundPacketProcessor.cpp | 10 +++--- assignment-client/src/octree/OctreeServer.cpp | 18 +++++----- interface/src/Application.cpp | 6 ++-- interface/src/DatagramProcessor.cpp | 2 +- interface/src/Util.cpp | 2 +- interface/src/avatar/MyAvatar.cpp | 2 +- interface/src/devices/SixenseManager.cpp | 2 +- interface/src/voxels/VoxelSystem.cpp | 2 +- libraries/networking/src/Logging.cpp | 2 +- libraries/octree/src/Octree.cpp | 10 +++--- libraries/octree/src/Octree.h | 20 +++++------ .../octree/src/OctreeEditPacketSender.cpp | 4 +-- libraries/octree/src/OctreeElement.cpp | 4 +-- libraries/octree/src/OctreePacketData.cpp | 14 ++++---- .../octree/src/OctreeProjectedPolygon.cpp | 8 ++--- libraries/octree/src/Plane.cpp | 4 ++- libraries/particles/src/Particle.cpp | 28 +++++++-------- .../particles/src/ParticleTreeElement.cpp | 6 ++-- voxel-edit/src/SceneUtils.cpp | 8 ++--- 20 files changed, 95 insertions(+), 93 deletions(-) diff --git a/animation-server/src/AnimationServer.cpp b/animation-server/src/AnimationServer.cpp index ffb98b4ae0..32a95b48ea 100644 --- a/animation-server/src/AnimationServer.cpp +++ b/animation-server/src/AnimationServer.cpp @@ -171,7 +171,7 @@ static void renderMovingBug() { } } else { - //printf("bugPathCenter=(%f,%f,%f)\n", bugPathCenter.x, bugPathCenter.y, bugPathCenter.z); + //qDebug("bugPathCenter=(%f,%f,%f)", bugPathCenter.x, bugPathCenter.y, bugPathCenter.z); bugPathTheta += bugAngleDelta; // move slightly bugRotation -= bugAngleDelta; // rotate slightly @@ -187,12 +187,12 @@ static void renderMovingBug() { float y = bugPathCenter.y; bugPosition = glm::vec3(x, y, z); - //printf("bugPathTheta=%f\n", bugPathTheta); - //printf("bugRotation=%f\n", bugRotation); + //qDebug("bugPathTheta=%f", bugPathTheta); + //qDebug("bugRotation=%f", bugRotation); } - //printf("bugPosition=(%f,%f,%f)\n", bugPosition.x, bugPosition.y, bugPosition.z); - //printf("bugDirection=(%f,%f,%f)\n", bugDirection.x, bugDirection.y, bugDirection.z); + //qDebug("bugPosition=(%f,%f,%f)", bugPosition.x, bugPosition.y, bugPosition.z); + //qDebug("bugDirection=(%f,%f,%f)", bugDirection.x, bugDirection.y, bugDirection.z); // would be nice to add some randomness here... // Generate voxels for where bug is going to @@ -690,32 +690,32 @@ AnimationServer::AnimationServer(int &argc, char **argv) : // Handle Local Domain testing with the --local command line const char* NON_THREADED_PACKETSENDER = "--NonThreadedPacketSender"; ::nonThreadedPacketSender = cmdOptionExists(argc, (const char**) argv, NON_THREADED_PACKETSENDER); - printf("nonThreadedPacketSender=%s\n", debug::valueOf(::nonThreadedPacketSender)); + qDebug("nonThreadedPacketSender=%s", debug::valueOf(::nonThreadedPacketSender)); // Handle Local Domain testing with the --local command line const char* NO_BILLBOARD = "--NoBillboard"; ::includeBillboard = !cmdOptionExists(argc, (const char**) argv, NO_BILLBOARD); - printf("includeBillboard=%s\n", debug::valueOf(::includeBillboard)); + qDebug("includeBillboard=%s", debug::valueOf(::includeBillboard)); const char* NO_BORDER_TRACER = "--NoBorderTracer"; ::includeBorderTracer = !cmdOptionExists(argc, (const char**) argv, NO_BORDER_TRACER); - printf("includeBorderTracer=%s\n", debug::valueOf(::includeBorderTracer)); + qDebug("includeBorderTracer=%s", debug::valueOf(::includeBorderTracer)); const char* NO_MOVING_BUG = "--NoMovingBug"; ::includeMovingBug = !cmdOptionExists(argc, (const char**) argv, NO_MOVING_BUG); - printf("includeMovingBug=%s\n", debug::valueOf(::includeMovingBug)); + qDebug("includeMovingBug=%s", debug::valueOf(::includeMovingBug)); const char* INCLUDE_BLINKING_VOXEL = "--includeBlinkingVoxel"; ::includeBlinkingVoxel = cmdOptionExists(argc, (const char**) argv, INCLUDE_BLINKING_VOXEL); - printf("includeBlinkingVoxel=%s\n", debug::valueOf(::includeBlinkingVoxel)); + qDebug("includeBlinkingVoxel=%s", debug::valueOf(::includeBlinkingVoxel)); const char* NO_DANCE_FLOOR = "--NoDanceFloor"; ::includeDanceFloor = !cmdOptionExists(argc, (const char**) argv, NO_DANCE_FLOOR); - printf("includeDanceFloor=%s\n", debug::valueOf(::includeDanceFloor)); + qDebug("includeDanceFloor=%s", debug::valueOf(::includeDanceFloor)); const char* BUILD_STREET = "--BuildStreet"; ::buildStreet = cmdOptionExists(argc, (const char**) argv, BUILD_STREET); - printf("buildStreet=%s\n", debug::valueOf(::buildStreet)); + qDebug("buildStreet=%s", debug::valueOf(::buildStreet)); // Handle Local Domain testing with the --local command line const char* showPPS = "--showPPS"; @@ -725,7 +725,7 @@ AnimationServer::AnimationServer(int &argc, char **argv) : const char* local = "--local"; ::wantLocalDomain = cmdOptionExists(argc, (const char**) argv,local); if (::wantLocalDomain) { - printf("Local Domain MODE!\n"); + qDebug("Local Domain MODE!"); nodeList->getDomainHandler().setIPToLocalhost(); } @@ -738,7 +738,7 @@ AnimationServer::AnimationServer(int &argc, char **argv) : if (packetsPerSecondCommand) { ::packetsPerSecond = atoi(packetsPerSecondCommand); } - printf("packetsPerSecond=%d\n",packetsPerSecond); + qDebug("packetsPerSecond=%d",packetsPerSecond); const char* animateFPSCommand = getCmdOption(argc, (const char**) argv, "--AnimateFPS"); const char* animateIntervalCommand = getCmdOption(argc, (const char**) argv, "--AnimateInterval"); @@ -753,8 +753,8 @@ AnimationServer::AnimationServer(int &argc, char **argv) : ::ANIMATE_VOXELS_INTERVAL_USECS = (ANIMATE_FPS_IN_MILLISECONDS * 1000.0); // converts from milliseconds to usecs } } - printf("ANIMATE_FPS=%d\n",ANIMATE_FPS); - printf("ANIMATE_VOXELS_INTERVAL_USECS=%llu\n",ANIMATE_VOXELS_INTERVAL_USECS); + qDebug("ANIMATE_FPS=%d",ANIMATE_FPS); + qDebug("ANIMATE_VOXELS_INTERVAL_USECS=%llu",ANIMATE_VOXELS_INTERVAL_USECS); const char* processingFPSCommand = getCmdOption(argc, (const char**) argv, "--ProcessingFPS"); const char* processingIntervalCommand = getCmdOption(argc, (const char**) argv, "--ProcessingInterval"); @@ -769,8 +769,8 @@ AnimationServer::AnimationServer(int &argc, char **argv) : ::PROCESSING_INTERVAL_USECS = (PROCESSING_FPS_IN_MILLISECONDS * 1000.0) - FUDGE_USECS; // converts from milliseconds to usecs } } - printf("PROCESSING_FPS=%d\n",PROCESSING_FPS); - printf("PROCESSING_INTERVAL_USECS=%llu\n",PROCESSING_INTERVAL_USECS); + qDebug("PROCESSING_FPS=%d",PROCESSING_FPS); + qDebug("PROCESSING_INTERVAL_USECS=%llu",PROCESSING_INTERVAL_USECS); nodeList->linkedDataCreateCallback = NULL; // do we need a callback? diff --git a/assignment-client/src/octree/OctreeInboundPacketProcessor.cpp b/assignment-client/src/octree/OctreeInboundPacketProcessor.cpp index 41158bf339..545c502036 100644 --- a/assignment-client/src/octree/OctreeInboundPacketProcessor.cpp +++ b/assignment-client/src/octree/OctreeInboundPacketProcessor.cpp @@ -45,7 +45,7 @@ void OctreeInboundPacketProcessor::processPacket(const SharedNodePointer& sendin bool debugProcessPacket = _myServer->wantsVerboseDebug(); if (debugProcessPacket) { - printf("OctreeInboundPacketProcessor::processPacket() packetData=%p packetLength=%d\n", &packet, packet.size()); + qDebug("OctreeInboundPacketProcessor::processPacket() packetData=%p packetLength=%d", &packet, packet.size()); } int numBytesPacketHeader = numBytesForPacketHeader(packet); @@ -78,8 +78,8 @@ void OctreeInboundPacketProcessor::processPacket(const SharedNodePointer& sendin int maxSize = packet.size() - atByte; if (debugProcessPacket) { - printf("OctreeInboundPacketProcessor::processPacket() %c " - "packetData=%p packetLength=%d voxelData=%p atByte=%d maxSize=%d\n", + qDebug("OctreeInboundPacketProcessor::processPacket() %c " + "packetData=%p packetLength=%d voxelData=%p atByte=%d maxSize=%d", packetType, packetData, packet.size(), editData, atByte, maxSize); } @@ -105,8 +105,8 @@ void OctreeInboundPacketProcessor::processPacket(const SharedNodePointer& sendin } if (debugProcessPacket) { - printf("OctreeInboundPacketProcessor::processPacket() DONE LOOPING FOR %c " - "packetData=%p packetLength=%d voxelData=%p atByte=%d\n", + qDebug("OctreeInboundPacketProcessor::processPacket() DONE LOOPING FOR %c " + "packetData=%p packetLength=%d voxelData=%p atByte=%d", packetType, packetData, packet.size(), editData, atByte); } diff --git a/assignment-client/src/octree/OctreeServer.cpp b/assignment-client/src/octree/OctreeServer.cpp index 2e8a354c6a..21762f1534 100644 --- a/assignment-client/src/octree/OctreeServer.cpp +++ b/assignment-client/src/octree/OctreeServer.cpp @@ -486,7 +486,7 @@ bool OctreeServer::handleHTTPRequest(HTTPConnection* connection, const QUrl& url // encode float averageEncodeTime = getAverageEncodeTime(); - statsString += QString().sprintf(" Average encode time: %9.2f usecs\r\n", averageEncodeTime); + statsString += QString().sqDebug(" Average encode time: %9.2f usecs\r", averageEncodeTime); int allEncodeTimes = _noEncode + _shortEncode + _longEncode + _extraLongEncode; @@ -554,9 +554,9 @@ bool OctreeServer::handleHTTPRequest(HTTPConnection* connection, const QUrl& url noVsTotalSend * AS_PERCENT, _noSend); float averageNodeWaitTime = getAverageNodeWaitTime(); - statsString += QString().sprintf(" Average node lock wait time: %9.2f usecs\r\n", averageNodeWaitTime); + statsString += QString().sqDebug(" Average node lock wait time: %9.2f usecs\r", averageNodeWaitTime); - statsString += QString().sprintf("--------------------------------------------------------------\r\n"); + statsString += QString().sqDebug("--------------------------------------------------------------\r"); float encodeToInsidePercent = averageInsideTime == 0.0f ? 0.0f : (averageEncodeTime / averageInsideTime) * AS_PERCENT; statsString += QString().sprintf(" encode ratio: %5.2f%%\r\n", @@ -564,7 +564,7 @@ bool OctreeServer::handleHTTPRequest(HTTPConnection* connection, const QUrl& url float waitToInsidePercent = averageInsideTime == 0.0f ? 0.0f : ((averageTreeWaitTime + averageNodeWaitTime) / averageInsideTime) * AS_PERCENT; - statsString += QString().sprintf(" waiting ratio: %5.2f%%\r\n", waitToInsidePercent); + statsString += QString().sqDebug(" waiting ratio: %5.2f%%\r", waitToInsidePercent); float compressAndWriteToInsidePercent = averageInsideTime == 0.0f ? 0.0f : (averageCompressAndWriteTime / averageInsideTime) * AS_PERCENT; @@ -573,7 +573,7 @@ bool OctreeServer::handleHTTPRequest(HTTPConnection* connection, const QUrl& url float sendingToInsidePercent = averageInsideTime == 0.0f ? 0.0f : (averagePacketSendingTime / averageInsideTime) * AS_PERCENT; - statsString += QString().sprintf(" sending ratio: %5.2f%%\r\n", sendingToInsidePercent); + statsString += QString().sqDebug(" sending ratio: %5.2f%%\r", sendingToInsidePercent); @@ -615,7 +615,7 @@ bool OctreeServer::handleHTTPRequest(HTTPConnection* connection, const QUrl& url .arg(locale.toString((uint)totalPacketsProcessed).rightJustified(COLUMN_WIDTH, ' ')); statsString += QString(" Total Inbound Elements: %1 elements\r\n") .arg(locale.toString((uint)totalElementsProcessed).rightJustified(COLUMN_WIDTH, ' ')); - statsString += QString().sprintf(" Average Inbound Elements/Packet: %f elements/packet\r\n", averageElementsPerPacket); + statsString += QString().sqDebug(" Average Inbound Elements/Packet: %f elements/packet\r", averageElementsPerPacket); statsString += QString(" Average Transit Time/Packet: %1 usecs\r\n") .arg(locale.toString((uint)averageTransitTimePerPacket).rightJustified(COLUMN_WIDTH, ' ')); statsString += QString(" Average Process Time/Packet: %1 usecs\r\n") @@ -671,7 +671,7 @@ bool OctreeServer::handleHTTPRequest(HTTPConnection* connection, const QUrl& url // display memory usage stats statsString += "Current Memory Usage Statistics\r\n"; - statsString += QString().sprintf("\r\nOctreeElement size... %ld bytes\r\n", sizeof(OctreeElement)); + statsString += QString().sqDebug("\r\nOctreeElement size... %ld bytes\r", sizeof(OctreeElement)); statsString += "\r\n"; const char* memoryScaleLabel; @@ -738,8 +738,8 @@ bool OctreeServer::handleHTTPRequest(HTTPConnection* connection, const QUrl& url OctreeElement::getExternalChildrenCount(); statsString += " ----------------\r\n"; - statsString += QString().sprintf(" Total: %10.llu nodes\r\n", checkSum); - statsString += QString().sprintf(" Expected: %10.lu nodes\r\n", nodeCount); + statsString += QString().sqDebug(" Total: %10.llu nodes\r", checkSum); + statsString += QString().sqDebug(" Expected: %10.lu nodes\r", nodeCount); statsString += "\r\n"; statsString += "In other news....\r\n"; diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index cd07f21300..a885c80968 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -3122,7 +3122,7 @@ void Application::nodeKilled(SharedNodePointer node) { VoxelPositionSize rootDetails; voxelDetailsForCode(rootCode, rootDetails); - printf("voxel server going away...... v[%f, %f, %f, %f]\n", + qDebug("voxel server going away...... v[%f, %f, %f, %f]", rootDetails.x, rootDetails.y, rootDetails.z, rootDetails.s); // Add the jurisditionDetails object to the list of "fade outs" @@ -3153,7 +3153,7 @@ void Application::nodeKilled(SharedNodePointer node) { VoxelPositionSize rootDetails; voxelDetailsForCode(rootCode, rootDetails); - printf("particle server going away...... v[%f, %f, %f, %f]\n", + qDebug("particle server going away...... v[%f, %f, %f, %f]", rootDetails.x, rootDetails.y, rootDetails.z, rootDetails.s); // Add the jurisditionDetails object to the list of "fade outs" @@ -3234,7 +3234,7 @@ int Application::parseOctreeStats(const QByteArray& packet, const SharedNodePoin if (jurisdiction->find(nodeUUID) == jurisdiction->end()) { - printf("stats from new server... v[%f, %f, %f, %f]\n", + qDebug("stats from new server... v[%f, %f, %f, %f]", rootDetails.x, rootDetails.y, rootDetails.z, rootDetails.s); // Add the jurisditionDetails object to the list of "fade outs" diff --git a/interface/src/DatagramProcessor.cpp b/interface/src/DatagramProcessor.cpp index 92260ad9dc..6525e79cf2 100644 --- a/interface/src/DatagramProcessor.cpp +++ b/interface/src/DatagramProcessor.cpp @@ -78,7 +78,7 @@ void DatagramProcessor::processDatagrams() { OCTREE_PACKET_SENT_TIME arrivedAt = usecTimestampNow(); int flightTime = arrivedAt - sentAt; - printf("got PacketType_VOXEL_DATA, sequence:%d flightTime:%d\n", sequence, flightTime); + qDebug("got PacketType_VOXEL_DATA, sequence:%d flightTime:%d", sequence, flightTime); } SharedNodePointer matchedNode = NodeList::getInstance()->sendingNodeForPacket(incomingPacket); diff --git a/interface/src/Util.cpp b/interface/src/Util.cpp index 1dae3a4fd6..febcb2f36e 100644 --- a/interface/src/Util.cpp +++ b/interface/src/Util.cpp @@ -63,7 +63,7 @@ void eulerToOrthonormals(glm::vec3 * angles, glm::vec3 * front, glm::vec3 * righ } void printVector(glm::vec3 vec) { - printf("%4.2f, %4.2f, %4.2f\n", vec.x, vec.y, vec.z); + qDebug("%4.2f, %4.2f, %4.2f", vec.x, vec.y, vec.z); } // Return the azimuth angle (in radians) between two points. diff --git a/interface/src/avatar/MyAvatar.cpp b/interface/src/avatar/MyAvatar.cpp index 8229611646..317f408aa7 100644 --- a/interface/src/avatar/MyAvatar.cpp +++ b/interface/src/avatar/MyAvatar.cpp @@ -432,7 +432,7 @@ void MyAvatar::renderDebugBodyPoints() { glm::vec3 headPosition(getHead()->getEyePosition()); float torsoToHead = glm::length(headPosition - torsoPosition); glm::vec3 position; - printf("head-above-torso %.2f, scale = %0.2f\n", torsoToHead, getScale()); + qDebug("head-above-torso %.2f, scale = %0.2f", torsoToHead, getScale()); // Torso Sphere position = torsoPosition; diff --git a/interface/src/devices/SixenseManager.cpp b/interface/src/devices/SixenseManager.cpp index b950e6097c..f7c00411c1 100644 --- a/interface/src/devices/SixenseManager.cpp +++ b/interface/src/devices/SixenseManager.cpp @@ -96,7 +96,7 @@ void SixenseManager::update(float deltaTime) { hand->getPalms().push_back(newPalm); palm = &(hand->getPalms()[hand->getNumPalms() - 1]); palm->setSixenseID(data->controller_index); - printf("Found new Sixense controller, ID %i\n", data->controller_index); + qDebug("Found new Sixense controller, ID %i", data->controller_index); } palm->setActive(true); diff --git a/interface/src/voxels/VoxelSystem.cpp b/interface/src/voxels/VoxelSystem.cpp index 692f299bdc..8d59f33674 100644 --- a/interface/src/voxels/VoxelSystem.cpp +++ b/interface/src/voxels/VoxelSystem.cpp @@ -117,7 +117,7 @@ void VoxelSystem::elementDeleted(OctreeElement* element) { forceRemoveNodeFromArrays(voxel); } else { if (Menu::getInstance()->isOptionChecked(MenuOption::PipelineWarnings)) { - printf("VoxelSystem::elementDeleted() while _voxelsInWriteArrays==0, is that expected? \n"); + qDebug("VoxelSystem::elementDeleted() while _voxelsInWriteArrays==0, is that expected? "); } } } diff --git a/libraries/networking/src/Logging.cpp b/libraries/networking/src/Logging.cpp index 17a4706de0..f42f1bda58 100644 --- a/libraries/networking/src/Logging.cpp +++ b/libraries/networking/src/Logging.cpp @@ -46,7 +46,7 @@ const HifiSockAddr& Logging::socket() { // use the first IP address _logstashSocket.setAddress(hostInfo.addresses().first()); } else { - printf("Failed to lookup logstash IP - will try again on next log attempt.\n"); + qDebug("Failed to lookup logstash IP - will try again on next log attempt."); } } diff --git a/libraries/octree/src/Octree.cpp b/libraries/octree/src/Octree.cpp index 696a65b4b5..d7fc7713cf 100644 --- a/libraries/octree/src/Octree.cpp +++ b/libraries/octree/src/Octree.cpp @@ -471,8 +471,8 @@ void Octree::processRemoveOctreeElementsBitstream(const unsigned char* bitstream int codeLength = numberOfThreeBitSectionsInCode(voxelCode, maxSize); if (codeLength == OVERFLOWED_OCTCODE_BUFFER) { - printf("WARNING! Got remove voxel bitstream that would overflow buffer in numberOfThreeBitSectionsInCode(), "); - printf("bailing processing of packet!\n"); + qDebug("WARNING! Got remove voxel bitstream that would overflow buffer in numberOfThreeBitSectionsInCode()," + " bailing processing of packet!"); break; } int voxelDataSize = bytesRequiredForCodeLength(codeLength) + SIZE_OF_COLOR_DATA; @@ -482,7 +482,7 @@ void Octree::processRemoveOctreeElementsBitstream(const unsigned char* bitstream voxelCode += voxelDataSize; atByte += voxelDataSize; } else { - printf("WARNING! Got remove voxel bitstream that would overflow buffer, bailing processing!\n"); + qDebug("WARNING! Got remove voxel bitstream that would overflow buffer, bailing processing!"); break; } } @@ -1404,7 +1404,7 @@ int Octree::encodeTreeBitstreamRecursion(OctreeElement* node, outputBits(childrenExistInPacketBits, false, true); printf(" childrenColored:"); outputBits(childrenColoredBits, false, true); - printf("\n"); + qDebug(""); **/ // if we were unable to fit this level in our packet, then rewind and add it to the node bag for @@ -1620,7 +1620,7 @@ void Octree::copyFromTreeIntoSubTree(Octree* sourceTree, OctreeElement* destinat } void dumpSetContents(const char* name, std::set set) { - printf("set %s has %ld elements\n", name, set.size()); + qDebug("set %s has %ld elements", name, set.size()); /* for (std::set::iterator i = set.begin(); i != set.end(); ++i) { printOctalCode(*i); diff --git a/libraries/octree/src/Octree.h b/libraries/octree/src/Octree.h index 839e61d1c2..3c868ab172 100644 --- a/libraries/octree/src/Octree.h +++ b/libraries/octree/src/Octree.h @@ -129,17 +129,17 @@ public: printf("StopReason: "); switch (stopReason) { default: - case UNKNOWN: printf("UNKNOWN\n"); break; + case UNKNOWN: qDebug("UNKNOWN"); break; - case DIDNT_FIT: printf("DIDNT_FIT\n"); break; - case NULL_NODE: printf("NULL_NODE\n"); break; - case TOO_DEEP: printf("TOO_DEEP\n"); break; - case OUT_OF_JURISDICTION: printf("OUT_OF_JURISDICTION\n"); break; - case LOD_SKIP: printf("LOD_SKIP\n"); break; - case OUT_OF_VIEW: printf("OUT_OF_VIEW\n"); break; - case WAS_IN_VIEW: printf("WAS_IN_VIEW\n"); break; - case NO_CHANGE: printf("NO_CHANGE\n"); break; - case OCCLUDED: printf("OCCLUDED\n"); break; + case DIDNT_FIT: qDebug("DIDNT_FIT"); break; + case NULL_NODE: qDebug("NULL_NODE"); break; + case TOO_DEEP: qDebug("TOO_DEEP"); break; + case OUT_OF_JURISDICTION: qDebug("OUT_OF_JURISDICTION"); break; + case LOD_SKIP: qDebug("LOD_SKIP"); break; + case OUT_OF_VIEW: qDebug("OUT_OF_VIEW"); break; + case WAS_IN_VIEW: qDebug("WAS_IN_VIEW"); break; + case NO_CHANGE: qDebug("NO_CHANGE"); break; + case OCCLUDED: qDebug("OCCLUDED"); break; } } }; diff --git a/libraries/octree/src/OctreeEditPacketSender.cpp b/libraries/octree/src/OctreeEditPacketSender.cpp index b606dffe44..7e59b3ae7f 100644 --- a/libraries/octree/src/OctreeEditPacketSender.cpp +++ b/libraries/octree/src/OctreeEditPacketSender.cpp @@ -37,7 +37,7 @@ OctreeEditPacketSender::OctreeEditPacketSender() : _serverJurisdictions(NULL), _sequenceNumber(0), _maxPacketSize(MAX_PACKET_SIZE) { - //printf("OctreeEditPacketSender::OctreeEditPacketSender() [%p] created... \n", this); + //qDebug("OctreeEditPacketSender::OctreeEditPacketSender() [%p] created... ", this); } OctreeEditPacketSender::~OctreeEditPacketSender() { @@ -53,7 +53,7 @@ OctreeEditPacketSender::~OctreeEditPacketSender() { _preServerPackets.erase(_preServerPackets.begin()); } _pendingPacketsLock.unlock(); - //printf("OctreeEditPacketSender::~OctreeEditPacketSender() [%p] destroyed... \n", this); + //qDebug("OctreeEditPacketSender::~OctreeEditPacketSender() [%p] destroyed... ", this); } diff --git a/libraries/octree/src/OctreeElement.cpp b/libraries/octree/src/OctreeElement.cpp index e21148df5e..96311ceabd 100644 --- a/libraries/octree/src/OctreeElement.cpp +++ b/libraries/octree/src/OctreeElement.cpp @@ -204,7 +204,7 @@ void OctreeElement::calculateAABox() { void OctreeElement::deleteChildAtIndex(int childIndex) { OctreeElement* childAt = getChildAtIndex(childIndex); if (childAt) { - //printf("deleteChildAtIndex()... about to call delete childAt=%p\n",childAt); + //qDebug("deleteChildAtIndex()... about to call delete childAt=%p",childAt); delete childAt; setChildAtIndex(childIndex, NULL); _isDirty = true; @@ -1315,7 +1315,7 @@ OctreeElement* OctreeElement::getOrCreateChildElementAt(float x, float y, float float halfOurScale = ourScale / 2.0f; if(s > ourScale) { - printf("UNEXPECTED -- OctreeElement::getOrCreateChildElementAt() s=[%f] > ourScale=[%f] \n", s, ourScale); + qDebug("UNEXPECTED -- OctreeElement::getOrCreateChildElementAt() s=[%f] > ourScale=[%f] ", s, ourScale); } if (s > halfOurScale) { diff --git a/libraries/octree/src/OctreePacketData.cpp b/libraries/octree/src/OctreePacketData.cpp index 2edf560de6..b54a87bef8 100644 --- a/libraries/octree/src/OctreePacketData.cpp +++ b/libraries/octree/src/OctreePacketData.cpp @@ -125,7 +125,7 @@ const unsigned char* OctreePacketData::getFinalizedData() { if (_dirty) { if (_debug) { - printf("getFinalizedData() _compressedBytes=%d _bytesInUse=%d\n",_compressedBytes, _bytesInUse); + qDebug("getFinalizedData() _compressedBytes=%d _bytesInUse=%d",_compressedBytes, _bytesInUse); } compressContent(); } @@ -139,7 +139,7 @@ int OctreePacketData::getFinalizedSize() { if (_dirty) { if (_debug) { - printf("getFinalizedSize() _compressedBytes=%d _bytesInUse=%d\n",_compressedBytes, _bytesInUse); + qDebug("getFinalizedSize() _compressedBytes=%d _bytesInUse=%d",_compressedBytes, _bytesInUse); } compressContent(); } @@ -187,7 +187,7 @@ void OctreePacketData::discardLevel(LevelDetails key) { _totalBytesOfColor -= reduceBytesOfColor; if (_debug) { - printf("discardLevel() BEFORE _dirty=%s bytesInLevel=%d _compressedBytes=%d _bytesInUse=%d\n", + qDebug("discardLevel() BEFORE _dirty=%s bytesInLevel=%d _compressedBytes=%d _bytesInUse=%d", debug::valueOf(_dirty), bytesInLevel, _compressedBytes, _bytesInUse); } @@ -196,7 +196,7 @@ void OctreePacketData::discardLevel(LevelDetails key) { _dirty = true; if (_debug) { - printf("discardLevel() AFTER _dirty=%s bytesInLevel=%d _compressedBytes=%d _bytesInUse=%d\n", + qDebug("discardLevel() AFTER _dirty=%s bytesInLevel=%d _compressedBytes=%d _bytesInUse=%d", debug::valueOf(_dirty), bytesInLevel, _compressedBytes, _bytesInUse); } } @@ -413,13 +413,13 @@ void OctreePacketData::loadFinalizedContent(const unsigned char* data, int lengt } } else { if (_debug) { - printf("OctreePacketData::loadCompressedContent()... length = 0, nothing to do...\n"); + qDebug("OctreePacketData::loadCompressedContent()... length = 0, nothing to do..."); } } } void OctreePacketData::debugContent() { - printf("OctreePacketData::debugContent()... COMPRESSED DATA.... size=%d\n",_compressedBytes); + qDebug("OctreePacketData::debugContent()... COMPRESSED DATA.... size=%d",_compressedBytes); int perline=0; for (int i = 0; i < _compressedBytes; i++) { printf("%.2x ",_compressed[i]); @@ -431,7 +431,7 @@ void OctreePacketData::debugContent() { } printf("\n"); - printf("OctreePacketData::debugContent()... UNCOMPRESSED DATA.... size=%d\n",_bytesInUse); + qDebug("OctreePacketData::debugContent()... UNCOMPRESSED DATA.... size=%d",_bytesInUse); perline=0; for (int i = 0; i < _bytesInUse; i++) { printf("%.2x ",_uncompressed[i]); diff --git a/libraries/octree/src/OctreeProjectedPolygon.cpp b/libraries/octree/src/OctreeProjectedPolygon.cpp index f86d598a87..92a5b2ac18 100644 --- a/libraries/octree/src/OctreeProjectedPolygon.cpp +++ b/libraries/octree/src/OctreeProjectedPolygon.cpp @@ -263,12 +263,12 @@ bool OctreeProjectedPolygon::pointInside(const glm::vec2& point, bool* matchesVe } void OctreeProjectedPolygon::printDebugDetails() const { - printf("OctreeProjectedPolygon..."); - printf(" minX=%f maxX=%f minY=%f maxY=%f\n", getMinX(), getMaxX(), getMinY(), getMaxY()); - printf(" vertex count=%d distance=%f\n", getVertexCount(), getDistance()); + qDebug("OctreeProjectedPolygon..." + " minX=%f maxX=%f minY=%f maxY=%f", getMinX(), getMaxX(), getMinY(), getMaxY()); + qDebug(" vertex count=%d distance=%f", getVertexCount(), getDistance()); for (int i = 0; i < getVertexCount(); i++) { glm::vec2 point = getVertex(i); - printf(" vertex[%d] = %f, %f \n", i, point.x, point.y); + qDebug(" vertex[%d] = %f, %f ", i, point.x, point.y); } } diff --git a/libraries/octree/src/Plane.cpp b/libraries/octree/src/Plane.cpp index d7cb2c54ff..d9e5633233 100755 --- a/libraries/octree/src/Plane.cpp +++ b/libraries/octree/src/Plane.cpp @@ -14,6 +14,8 @@ #include "Plane.h" +#include + #include void Plane::set3Points(const glm::vec3 &v1, const glm::vec3 &v2, const glm::vec3 &v3) { @@ -61,6 +63,6 @@ float Plane::distance(const glm::vec3 &point) const { } void Plane::print() const { - printf("Plane - point (x=%f y=%f z=%f) normal (x=%f y=%f z=%f) d=%f\n", + qDebug("Plane - point (x=%f y=%f z=%f) normal (x=%f y=%f z=%f) d=%f", _point.x, _point.y, _point.z, _normal.x, _normal.y, _normal.z, _dCoefficient); } diff --git a/libraries/particles/src/Particle.cpp b/libraries/particles/src/Particle.cpp index a36998aad4..59265c00dc 100644 --- a/libraries/particles/src/Particle.cpp +++ b/libraries/particles/src/Particle.cpp @@ -146,7 +146,7 @@ bool Particle::appendParticleData(OctreePacketData* packetData) const { bool success = packetData->appendValue(getID()); - //printf("Particle::appendParticleData()... getID()=%d\n", getID()); + //qDebug("Particle::appendParticleData()... getID()=%d", getID()); if (success) { success = packetData->appendValue(getAge()); @@ -541,15 +541,15 @@ Particle Particle::fromEditPacket(const unsigned char* data, int length, int& pr } void Particle::debugDump() const { - printf("Particle id :%u\n", _id); - printf(" age:%f\n", getAge()); - printf(" edited ago:%f\n", getEditedAgo()); - printf(" should die:%s\n", debug::valueOf(getShouldDie())); - printf(" position:%f,%f,%f\n", _position.x, _position.y, _position.z); - printf(" radius:%f\n", getRadius()); - printf(" velocity:%f,%f,%f\n", _velocity.x, _velocity.y, _velocity.z); - printf(" gravity:%f,%f,%f\n", _gravity.x, _gravity.y, _gravity.z); - printf(" color:%d,%d,%d\n", _color[0], _color[1], _color[2]); + qDebug("Particle id :%u", _id); + qDebug(" age:%f", getAge()); + qDebug(" edited ago:%f", getEditedAgo()); + qDebug(" should die:%s", debug::valueOf(getShouldDie())); + qDebug(" position:%f,%f,%f", _position.x, _position.y, _position.z); + qDebug(" radius:%f", getRadius()); + qDebug(" velocity:%f,%f,%f", _velocity.x, _velocity.y, _velocity.z); + qDebug(" gravity:%f,%f,%f", _gravity.x, _gravity.y, _gravity.z); + qDebug(" color:%d,%d,%d", _color[0], _color[1], _color[2]); } bool Particle::encodeParticleEditMessageDetails(PacketType command, ParticleID id, const ParticleProperties& properties, @@ -732,9 +732,9 @@ bool Particle::encodeParticleEditMessageDetails(PacketType command, ParticleID i bool wantDebugging = false; if (wantDebugging) { - printf("encodeParticleEditMessageDetails()....\n"); - printf("Particle id :%u\n", id.id); - printf(" nextID:%u\n", _nextID); + qDebug("encodeParticleEditMessageDetails()...."); + qDebug("Particle id :%u", id.id); + qDebug(" nextID:%u", _nextID); } // cleanup @@ -844,7 +844,7 @@ void Particle::update(const quint64& now) { // handle damping glm::vec3 dampingResistance = _velocity * _damping; _velocity -= dampingResistance * timeElapsed; - //printf("applying damping to Particle timeElapsed=%f\n",timeElapsed); + //qDebug("applying damping to Particle timeElapsed=%f",timeElapsed); } } diff --git a/libraries/particles/src/ParticleTreeElement.cpp b/libraries/particles/src/ParticleTreeElement.cpp index 19353c427a..d28ccf2f5e 100644 --- a/libraries/particles/src/ParticleTreeElement.cpp +++ b/libraries/particles/src/ParticleTreeElement.cpp @@ -142,7 +142,7 @@ bool ParticleTreeElement::updateParticle(const Particle& particle) { bool localOlder = thisParticle.getLastUpdated() < particle.getLastUpdated(); if (changedOnServer || localOlder) { if (wantDebug) { - printf("local particle [id:%d] %s and %s than server particle by %d, particle.isNewlyCreated()=%s\n", + qDebug("local particle [id:%d] %s and %s than server particle by %d, particle.isNewlyCreated()=%s", particle.getID(), (changedOnServer ? "CHANGED" : "same"), (localOlder ? "OLDER" : "NEWER"), difference, debug::valueOf(particle.isNewlyCreated()) ); @@ -150,8 +150,8 @@ bool ParticleTreeElement::updateParticle(const Particle& particle) { thisParticle.copyChangedProperties(particle); } else { if (wantDebug) { - printf(">>> IGNORING SERVER!!! Would've caused jutter! <<< " - "local particle [id:%d] %s and %s than server particle by %d, particle.isNewlyCreated()=%s\n", + qDebug(">>> IGNORING SERVER!!! Would've caused jutter! <<< " + "local particle [id:%d] %s and %s than server particle by %d, particle.isNewlyCreated()=%s", particle.getID(), (changedOnServer ? "CHANGED" : "same"), (localOlder ? "OLDER" : "NEWER"), difference, debug::valueOf(particle.isNewlyCreated()) ); diff --git a/voxel-edit/src/SceneUtils.cpp b/voxel-edit/src/SceneUtils.cpp index 19e227c71a..937b03cc39 100644 --- a/voxel-edit/src/SceneUtils.cpp +++ b/voxel-edit/src/SceneUtils.cpp @@ -20,7 +20,7 @@ void addCornersAndAxisLines(VoxelTree* tree) { float voxelSize = 0.5f / TREE_SCALE; // Now some more examples... a little more complex - printf("creating corner points...\n"); + qDebug("creating corner points..."); tree->createVoxel(0 , 0 , 0 , voxelSize, 255, 255 ,255); tree->createVoxel(1.0 - voxelSize, 0 , 0 , voxelSize, 255, 0 ,0 ); tree->createVoxel(0 , 1.0 - voxelSize, 0 , voxelSize, 0 , 255 ,0 ); @@ -29,11 +29,11 @@ void addCornersAndAxisLines(VoxelTree* tree) { tree->createVoxel(0 , 1.0 - voxelSize, 1.0 - voxelSize, voxelSize, 0 , 255 ,255); tree->createVoxel(1.0 - voxelSize, 1.0 - voxelSize, 0 , voxelSize, 255, 255 ,0 ); tree->createVoxel(1.0 - voxelSize, 1.0 - voxelSize, 1.0 - voxelSize, voxelSize, 255, 255 ,255); - printf("DONE creating corner points...\n"); + qDebug("DONE creating corner points..."); } void addSurfaceScene(VoxelTree * tree) { - printf("adding surface scene...\n"); + qDebug("adding surface scene..."); float voxelSize = 1.f / (8 * TREE_SCALE); // color 1= blue, color 2=green @@ -57,5 +57,5 @@ void addSurfaceScene(VoxelTree * tree) { } } } - printf("DONE adding surface scene...\n"); + qDebug("DONE adding surface scene..."); } From e55c488964adf79d26283fd4dba33f7c943bc4e0 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Mon, 21 Apr 2014 16:17:59 -0700 Subject: [PATCH 83/97] clean up some old debugging --- assignment-client/src/octree/OctreeServer.cpp | 151 +----------------- assignment-client/src/octree/OctreeServer.h | 3 - 2 files changed, 2 insertions(+), 152 deletions(-) diff --git a/assignment-client/src/octree/OctreeServer.cpp b/assignment-client/src/octree/OctreeServer.cpp index 4f435cd371..04a69ff7e8 100644 --- a/assignment-client/src/octree/OctreeServer.cpp +++ b/assignment-client/src/octree/OctreeServer.cpp @@ -9,7 +9,6 @@ // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // -#include #include #include #include @@ -209,16 +208,11 @@ void OctreeServer::trackProcessWaitTime(float time) { } void OctreeServer::attachQueryNodeToNode(Node* newNode) { - quint64 start = usecTimestampNow(); if (!newNode->getLinkedData() && _instance) { OctreeQueryNode* newQueryNodeData = _instance->createOctreeQueryNode(); newQueryNodeData->init(); newNode->setLinkedData(newQueryNodeData); } - quint64 end = usecTimestampNow(); - if (end - start > 1000) { - qDebug() << "OctreeServer::attachQueryNodeToNode() took:" << (end - start); - } } OctreeServer::OctreeServer(const QByteArray& packet) : @@ -242,7 +236,6 @@ OctreeServer::OctreeServer(const QByteArray& packet) : _started(time(0)), _startedUSecs(usecTimestampNow()) { - //assert(!_instance); // you should only ever have one instance at a time! if (_instance) { qDebug() << "Octree Server starting... while old instance still running _instance=["<<_instance<<"] this=[" << this << "]"; } @@ -252,23 +245,6 @@ OctreeServer::OctreeServer(const QByteArray& packet) : _averageLoopTime.updateAverage(0); qDebug() << "Octree server starting... [" << this << "]"; - - - /* - QTimer* timer = new QTimer(this); - connect(timer, SIGNAL(timeout()), SLOT(doNothing())); - timer->start(0); - */ - -} - -quint64 lastNothing = usecTimestampNow(); -void OctreeServer::doNothing() { - quint64 now = usecTimestampNow(); - if (now - lastNothing > 100) { - qDebug() << "since last doNothing:" << (now - lastNothing); - } - lastNothing = now; } OctreeServer::~OctreeServer() { @@ -299,7 +275,7 @@ OctreeServer::~OctreeServer() { _jurisdiction = NULL; // cleanup our tree here... - qDebug() << qPrintable(_safeServerName) << "server cleaning up octree... [" << this << "]"; + qDebug() << qPrintable(_safeServerName) << "server START cleaning up octree... [" << this << "]"; delete _tree; _tree = NULL; qDebug() << qPrintable(_safeServerName) << "server DONE cleaning up octree... [" << this << "]"; @@ -845,164 +821,41 @@ void OctreeServer::parsePayload() { } } -quint64 lastReadPendingDatagrams = usecTimestampNow(); -quint64 lastProcessNodeData = usecTimestampNow(); - void OctreeServer::readPendingDatagrams() { - //qDebug() << "OctreeServer::readPendingDatagrams()... thread()->eventDispatcher()=" << thread()->eventDispatcher(); - - - quint64 now = usecTimestampNow(); - - // more than 1.1 second is probably a problem - if ((now - lastReadPendingDatagrams) > 1100000) { - qDebug() << "OctreeServer::readPendingDatagrams(): since lastReadPendingDatagrams=" << (now - lastReadPendingDatagrams) << "usecs"; - } - lastReadPendingDatagrams = now; - QByteArray receivedPacket; HifiSockAddr senderSockAddr; NodeList* nodeList = NodeList::getInstance(); - quint64 startReadAvailable = usecTimestampNow(); - int readDataGrams = 0; - - int queryPackets = 0; - int jurisdictionRequests = 0; - int editPackets = 0; - int nodeListPackets = 0; - - quint64 queryElapsed = 0; - quint64 jurisdictionElapsed = 0; - quint64 editElapsed = 0; - quint64 nodeListElapsed = 0; - quint64 versionMatchElapsed = 0; - quint64 matchingElapsed = 0; - - while (readAvailableDatagram(receivedPacket, senderSockAddr)) { - readDataGrams++; - - quint64 versionMatchStart = usecTimestampNow(); - bool matches = nodeList->packetVersionAndHashMatch(receivedPacket); - quint64 versionMatchEnd = usecTimestampNow(); - versionMatchElapsed += (versionMatchEnd - versionMatchStart); - - if (matches) { + if (nodeList->packetVersionAndHashMatch(receivedPacket)) { PacketType packetType = packetTypeForPacket(receivedPacket); - - quint64 startNodeLookup = usecTimestampNow(); SharedNodePointer matchingNode = nodeList->sendingNodeForPacket(receivedPacket); - quint64 endNodeLookup = usecTimestampNow(); - matchingElapsed += (endNodeLookup - startNodeLookup); - - if ((endNodeLookup - startNodeLookup) > 100000) { - qDebug() << "OctreeServer::readPendingDatagrams(): sendingNodeForPacket() took" << (endNodeLookup - startNodeLookup) << "usecs"; - } - if (packetType == getMyQueryMessageType()) { - quint64 queryStart = usecTimestampNow(); - queryPackets++; - // If we got a PacketType_VOXEL_QUERY, then we're talking to an NodeType_t_AVATAR, and we // need to make sure we have it in our nodeList. if (matchingNode) { - quint64 startUpdateNode = usecTimestampNow(); nodeList->updateNodeWithDataFromPacket(matchingNode, receivedPacket); - quint64 endUpdateNode = usecTimestampNow(); - if ((endUpdateNode - startUpdateNode) > 100000) { - qDebug() << "OctreeServer::readPendingDatagrams(): updateNodeWithDataFromPacket() took" << (endUpdateNode - startUpdateNode) << "usecs"; - } - OctreeQueryNode* nodeData = (OctreeQueryNode*) matchingNode->getLinkedData(); if (nodeData && !nodeData->isOctreeSendThreadInitalized()) { SharedAssignmentPointer sharedAssignment = AssignmentClient::getCurrentAssignment(); nodeData->initializeOctreeSendThread(sharedAssignment, matchingNode); } } - quint64 queryEnd = usecTimestampNow(); - queryElapsed += (queryEnd - queryStart); } else if (packetType == PacketTypeJurisdictionRequest) { - quint64 jurisdictionStart = usecTimestampNow(); - jurisdictionRequests++; _jurisdictionSender->queueReceivedPacket(matchingNode, receivedPacket); - quint64 jurisdictionEnd = usecTimestampNow(); - jurisdictionElapsed += (jurisdictionEnd - jurisdictionStart); } else if (_octreeInboundPacketProcessor && getOctree()->handlesEditPacketType(packetType)) { - quint64 editStart = usecTimestampNow(); - editPackets++; _octreeInboundPacketProcessor->queueReceivedPacket(matchingNode, receivedPacket); - quint64 editEnd = usecTimestampNow(); - editElapsed += (editEnd - editStart); } else { - quint64 nodeListStart = usecTimestampNow(); - - nodeListPackets++; - quint64 now = usecTimestampNow(); - - // more than 1.1 second is probably a problem - if ((now - lastProcessNodeData) > 1100000) { - qDebug() << "OctreeServer::readPendingDatagrams(): since lastProcessNodeData=" << (now - lastProcessNodeData) << "usecs"; - } - lastProcessNodeData = now; - // let processNodeData handle it. - quint64 startProcessNodeData = usecTimestampNow(); NodeList::getInstance()->processNodeData(senderSockAddr, receivedPacket); - quint64 endProcessNodeData = usecTimestampNow(); - if ((endProcessNodeData - startProcessNodeData) > 100000) { - qDebug() << "OctreeServer::readPendingDatagrams(): processNodeData() took" << (endProcessNodeData - startProcessNodeData) << "usecs"; - } - - quint64 nodeListEnd = usecTimestampNow(); - nodeListElapsed += (nodeListEnd - nodeListStart); } } } - quint64 endReadAvailable = usecTimestampNow(); - if (endReadAvailable - startReadAvailable > 500000) { - qDebug() << "OctreeServer::readPendingDatagrams(): while(readAvailable) took" << (endReadAvailable - startReadAvailable) << "usecs" - << " readDataGrams=" << readDataGrams - << " nodeListPackets=" << nodeListPackets - << " editPackets=" << editPackets - << " jurisdictionRequests=" << jurisdictionRequests - << " queryPackets=" << queryPackets; - - qDebug() << "OctreeServer::readPendingDatagrams(): while(readAvailable) took" << (endReadAvailable - startReadAvailable) << "usecs" - << " nodeListElapsed=" << nodeListElapsed - << " editElapsed=" << editElapsed - << " jurisdictionElapsed=" << jurisdictionElapsed - << " queryElapsed=" << queryElapsed - << " versionMatchElapsed=" << versionMatchElapsed - << " matchingElapsed=" << matchingElapsed; - } - -} - -void OctreeServer::aboutToBlock() { - const bool wantDebug = false; - if (wantDebug) { - qDebug() << "OctreeServer::aboutToBlock()..."; - } -} - -void OctreeServer::awake() { - const bool wantDebug = false; - if (wantDebug) { - qDebug() << "OctreeServer::awake()..."; - } } void OctreeServer::run() { - - QAbstractEventDispatcher* eventDispatcher = thread()->eventDispatcher(); - qDebug() << "OctreeServer::run()... thread()->eventDispatcher()=" << eventDispatcher; - - connect(eventDispatcher, &QAbstractEventDispatcher::aboutToBlock, this, &OctreeServer::aboutToBlock); - connect(eventDispatcher, &QAbstractEventDispatcher::awake, this, &OctreeServer::awake); - _safeServerName = getMyServerName(); // Before we do anything else, create our tree... diff --git a/assignment-client/src/octree/OctreeServer.h b/assignment-client/src/octree/OctreeServer.h index 1b57f3e63d..d7139b5c3d 100644 --- a/assignment-client/src/octree/OctreeServer.h +++ b/assignment-client/src/octree/OctreeServer.h @@ -126,9 +126,6 @@ public slots: void nodeAdded(SharedNodePointer node); void nodeKilled(SharedNodePointer node); void sendStatsPacket(); - void doNothing(); - void awake(); - void aboutToBlock(); protected: void parsePayload(); From cfc778d10c3c3fddffb6acdaa89b3eb9b6f0185a Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Mon, 21 Apr 2014 16:32:17 -0700 Subject: [PATCH 84/97] Fix regexp fail --- assignment-client/src/octree/OctreeServer.cpp | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/assignment-client/src/octree/OctreeServer.cpp b/assignment-client/src/octree/OctreeServer.cpp index 21762f1534..2e8a354c6a 100644 --- a/assignment-client/src/octree/OctreeServer.cpp +++ b/assignment-client/src/octree/OctreeServer.cpp @@ -486,7 +486,7 @@ bool OctreeServer::handleHTTPRequest(HTTPConnection* connection, const QUrl& url // encode float averageEncodeTime = getAverageEncodeTime(); - statsString += QString().sqDebug(" Average encode time: %9.2f usecs\r", averageEncodeTime); + statsString += QString().sprintf(" Average encode time: %9.2f usecs\r\n", averageEncodeTime); int allEncodeTimes = _noEncode + _shortEncode + _longEncode + _extraLongEncode; @@ -554,9 +554,9 @@ bool OctreeServer::handleHTTPRequest(HTTPConnection* connection, const QUrl& url noVsTotalSend * AS_PERCENT, _noSend); float averageNodeWaitTime = getAverageNodeWaitTime(); - statsString += QString().sqDebug(" Average node lock wait time: %9.2f usecs\r", averageNodeWaitTime); + statsString += QString().sprintf(" Average node lock wait time: %9.2f usecs\r\n", averageNodeWaitTime); - statsString += QString().sqDebug("--------------------------------------------------------------\r"); + statsString += QString().sprintf("--------------------------------------------------------------\r\n"); float encodeToInsidePercent = averageInsideTime == 0.0f ? 0.0f : (averageEncodeTime / averageInsideTime) * AS_PERCENT; statsString += QString().sprintf(" encode ratio: %5.2f%%\r\n", @@ -564,7 +564,7 @@ bool OctreeServer::handleHTTPRequest(HTTPConnection* connection, const QUrl& url float waitToInsidePercent = averageInsideTime == 0.0f ? 0.0f : ((averageTreeWaitTime + averageNodeWaitTime) / averageInsideTime) * AS_PERCENT; - statsString += QString().sqDebug(" waiting ratio: %5.2f%%\r", waitToInsidePercent); + statsString += QString().sprintf(" waiting ratio: %5.2f%%\r\n", waitToInsidePercent); float compressAndWriteToInsidePercent = averageInsideTime == 0.0f ? 0.0f : (averageCompressAndWriteTime / averageInsideTime) * AS_PERCENT; @@ -573,7 +573,7 @@ bool OctreeServer::handleHTTPRequest(HTTPConnection* connection, const QUrl& url float sendingToInsidePercent = averageInsideTime == 0.0f ? 0.0f : (averagePacketSendingTime / averageInsideTime) * AS_PERCENT; - statsString += QString().sqDebug(" sending ratio: %5.2f%%\r", sendingToInsidePercent); + statsString += QString().sprintf(" sending ratio: %5.2f%%\r\n", sendingToInsidePercent); @@ -615,7 +615,7 @@ bool OctreeServer::handleHTTPRequest(HTTPConnection* connection, const QUrl& url .arg(locale.toString((uint)totalPacketsProcessed).rightJustified(COLUMN_WIDTH, ' ')); statsString += QString(" Total Inbound Elements: %1 elements\r\n") .arg(locale.toString((uint)totalElementsProcessed).rightJustified(COLUMN_WIDTH, ' ')); - statsString += QString().sqDebug(" Average Inbound Elements/Packet: %f elements/packet\r", averageElementsPerPacket); + statsString += QString().sprintf(" Average Inbound Elements/Packet: %f elements/packet\r\n", averageElementsPerPacket); statsString += QString(" Average Transit Time/Packet: %1 usecs\r\n") .arg(locale.toString((uint)averageTransitTimePerPacket).rightJustified(COLUMN_WIDTH, ' ')); statsString += QString(" Average Process Time/Packet: %1 usecs\r\n") @@ -671,7 +671,7 @@ bool OctreeServer::handleHTTPRequest(HTTPConnection* connection, const QUrl& url // display memory usage stats statsString += "Current Memory Usage Statistics\r\n"; - statsString += QString().sqDebug("\r\nOctreeElement size... %ld bytes\r", sizeof(OctreeElement)); + statsString += QString().sprintf("\r\nOctreeElement size... %ld bytes\r\n", sizeof(OctreeElement)); statsString += "\r\n"; const char* memoryScaleLabel; @@ -738,8 +738,8 @@ bool OctreeServer::handleHTTPRequest(HTTPConnection* connection, const QUrl& url OctreeElement::getExternalChildrenCount(); statsString += " ----------------\r\n"; - statsString += QString().sqDebug(" Total: %10.llu nodes\r", checkSum); - statsString += QString().sqDebug(" Expected: %10.lu nodes\r", nodeCount); + statsString += QString().sprintf(" Total: %10.llu nodes\r\n", checkSum); + statsString += QString().sprintf(" Expected: %10.lu nodes\r\n", nodeCount); statsString += "\r\n"; statsString += "In other news....\r\n"; From 7d18dbdfb8da3e2c31e5827aab2e025690133eed Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Mon, 21 Apr 2014 16:35:42 -0700 Subject: [PATCH 85/97] more cleanup --- assignment-client/src/octree/OctreeServer.cpp | 24 +++++-------------- .../networking/src/ThreadedAssignment.cpp | 16 ------------- 2 files changed, 6 insertions(+), 34 deletions(-) diff --git a/assignment-client/src/octree/OctreeServer.cpp b/assignment-client/src/octree/OctreeServer.cpp index 04a69ff7e8..2b4a1d620d 100644 --- a/assignment-client/src/octree/OctreeServer.cpp +++ b/assignment-client/src/octree/OctreeServer.cpp @@ -1040,25 +1040,24 @@ void OctreeServer::run() { void OctreeServer::nodeAdded(SharedNodePointer node) { // we might choose to use this notifier to track clients in a pending state - //qDebug() << qPrintable(_safeServerName) << "server added node:" << *node; + qDebug() << qPrintable(_safeServerName) << "server added node:" << *node; } void OctreeServer::nodeKilled(SharedNodePointer node) { quint64 start = usecTimestampNow(); - //qDebug() << qPrintable(_safeServerName) << "server killed node:" << *node; + qDebug() << qPrintable(_safeServerName) << "server killed node:" << *node; OctreeQueryNode* nodeData = static_cast(node->getLinkedData()); if (nodeData) { nodeData->nodeKilled(); // tell our node data and sending threads that we'd like to shut down } else { - //qDebug() << qPrintable(_safeServerName) << "server node missing linked data node:" << *node; + qDebug() << qPrintable(_safeServerName) << "server node missing linked data node:" << *node; } quint64 end = usecTimestampNow(); quint64 usecsElapsed = (end - start); if (usecsElapsed > 1000) { - qDebug() << qPrintable(_safeServerName) << "server nodeKilled() took: " << usecsElapsed << "<<<<<<<<<<<<<<<<<<<<<<<<<<<<<"; - // << " usecs for node:" << *node; + qDebug() << qPrintable(_safeServerName) << "server nodeKilled() took: " << usecsElapsed << " usecs for node:" << *node; } } @@ -1075,8 +1074,8 @@ void OctreeServer::forceNodeShutdown(SharedNodePointer node) { quint64 end = usecTimestampNow(); quint64 usecsElapsed = (end - start); - qDebug() << qPrintable(_safeServerName) << "server forceNodeShutdown() took: " - << usecsElapsed << " usecs for node:" << *node; + qDebug() << qPrintable(_safeServerName) << "server forceNodeShutdown() took: " + << usecsElapsed << " usecs for node:" << *node; } @@ -1189,17 +1188,6 @@ QString OctreeServer::getStatusLink() { } void OctreeServer::sendStatsPacket() { - - /* - quint64 start = usecTimestampNow(); - static QJsonObject statsObject1; - ThreadedAssignment::addPacketStatsAndSendStatsPacket(statsObject1); - quint64 end = usecTimestampNow(); - if (end - start > 1000) { - qDebug() << "OctreeServer::sendStatsPacket() took:" << (end - start); - } - */ - // TODO: we have too many stats to fit in a single MTU... so for now, we break it into multiple JSON objects and // send them separately. What we really should do is change the NodeList::sendStatsToDomainServer() to handle the // the following features: diff --git a/libraries/networking/src/ThreadedAssignment.cpp b/libraries/networking/src/ThreadedAssignment.cpp index ebb1435e63..4b92f8ba38 100644 --- a/libraries/networking/src/ThreadedAssignment.cpp +++ b/libraries/networking/src/ThreadedAssignment.cpp @@ -12,10 +12,8 @@ #include #include #include -#include #include "Logging.h" -#include "SharedUtil.h" #include "ThreadedAssignment.h" ThreadedAssignment::ThreadedAssignment(const QByteArray& packet) : @@ -58,9 +56,6 @@ void ThreadedAssignment::commonInit(const QString& targetName, NodeType_t nodeTy connect(statsTimer, &QTimer::timeout, this, &ThreadedAssignment::sendStatsPacket); statsTimer->start(1000); } - - //qDebug() << "ThreadedAssignment::commonInit()... thread()->eventDispatcher()=" << thread()->eventDispatcher(); - } void ThreadedAssignment::addPacketStatsAndSendStatsPacket(QJsonObject &statsObject) { @@ -81,18 +76,7 @@ void ThreadedAssignment::sendStatsPacket() { addPacketStatsAndSendStatsPacket(statsObject); } -quint64 lastCheckIn = usecTimestampNow(); void ThreadedAssignment::checkInWithDomainServerOrExit() { - - //qDebug() << "ThreadedAssignment::checkInWithDomainServerOrExit()... thread()->eventDispatcher()=" << thread()->eventDispatcher(); - - - quint64 now = usecTimestampNow(); - if ((now - lastCheckIn) > 1100000) { - qDebug() << "ThreadedAssignment::checkInWithDomainServerOrExit(): since lastCheckIn=" << (now - lastCheckIn) << "usecs"; - } - lastCheckIn = now; - if (NodeList::getInstance()->getNumNoReplyDomainCheckIns() == MAX_SILENT_DOMAIN_SERVER_CHECK_INS) { setFinished(true); } else { From a64d3ffc3204901953fb53123adef1bda543e87e Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Mon, 21 Apr 2014 16:38:45 -0700 Subject: [PATCH 86/97] more cleanup --- assignment-client/src/octree/OctreeSendThread.h | 1 - 1 file changed, 1 deletion(-) diff --git a/assignment-client/src/octree/OctreeSendThread.h b/assignment-client/src/octree/OctreeSendThread.h index 470b707fac..d8eed27802 100644 --- a/assignment-client/src/octree/OctreeSendThread.h +++ b/assignment-client/src/octree/OctreeSendThread.h @@ -17,7 +17,6 @@ #include #include #include -#include #include "OctreeQueryNode.h" From 91d8e113930942e61084c027b2a1391372c2e436 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Mon, 21 Apr 2014 17:34:01 -0700 Subject: [PATCH 87/97] return the bytes sent in writeDatagram() and writeUnverifiedDatagram() --- libraries/networking/src/LimitedNodeList.cpp | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/libraries/networking/src/LimitedNodeList.cpp b/libraries/networking/src/LimitedNodeList.cpp index 2c7ab2f5a8..ce78ec2d10 100644 --- a/libraries/networking/src/LimitedNodeList.cpp +++ b/libraries/networking/src/LimitedNodeList.cpp @@ -227,7 +227,7 @@ qint64 LimitedNodeList::writeDatagram(const QByteArray& datagram, const SharedNo } } - writeDatagram(datagram, *destinationSockAddr, destinationNode->getConnectionSecret()); + return writeDatagram(datagram, *destinationSockAddr, destinationNode->getConnectionSecret()); } // didn't have a destinationNode to send to, return 0 @@ -249,9 +249,8 @@ qint64 LimitedNodeList::writeUnverifiedDatagram(const QByteArray& datagram, cons } } - // don't use the node secret! - writeDatagram(datagram, *destinationSockAddr, QUuid()); + return writeDatagram(datagram, *destinationSockAddr, QUuid()); } // didn't have a destinationNode to send to, return 0 From 60b8ab0de5e98c6bb66c45c879603473aa648df0 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Mon, 21 Apr 2014 17:45:38 -0700 Subject: [PATCH 88/97] CR feedback --- assignment-client/src/octree/OctreeServer.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/assignment-client/src/octree/OctreeServer.cpp b/assignment-client/src/octree/OctreeServer.cpp index 2b4a1d620d..bd04dd85d7 100644 --- a/assignment-client/src/octree/OctreeServer.cpp +++ b/assignment-client/src/octree/OctreeServer.cpp @@ -839,6 +839,11 @@ void OctreeServer::readPendingDatagrams() { nodeList->updateNodeWithDataFromPacket(matchingNode, receivedPacket); OctreeQueryNode* nodeData = (OctreeQueryNode*) matchingNode->getLinkedData(); if (nodeData && !nodeData->isOctreeSendThreadInitalized()) { + + // NOTE: this is an important aspect of the proper ref counting. The send threads/node data need to + // know that the OctreeServer/Assignment will not get deleted on it while it's still active. The + // solution is to get the shared pointer for the current assignment. We need to make sure this is the + // same SharedAssignmentPointer that was ref counted by the assignment client. SharedAssignmentPointer sharedAssignment = AssignmentClient::getCurrentAssignment(); nodeData->initializeOctreeSendThread(sharedAssignment, matchingNode); } From 1846036659ae4bd9194351d0430a4ce021cfb926 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Mon, 21 Apr 2014 20:58:43 -0700 Subject: [PATCH 89/97] quite the error messages about faild locks --- interface/src/voxels/VoxelSystem.cpp | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/interface/src/voxels/VoxelSystem.cpp b/interface/src/voxels/VoxelSystem.cpp index 8d59f33674..b93662cd0d 100644 --- a/interface/src/voxels/VoxelSystem.cpp +++ b/interface/src/voxels/VoxelSystem.cpp @@ -938,6 +938,8 @@ void VoxelSystem::copyWrittenDataSegmentToReadArrays(glBufferIndex segmentStart, } void VoxelSystem::copyWrittenDataToReadArrays(bool fullVBOs) { + static unsigned int lockForReadAttempt = 0; + static unsigned int lockForWriteAttempt = 0; PerformanceWarning warn(Menu::getInstance()->isOptionChecked(MenuOption::PipelineWarnings), "copyWrittenDataToReadArrays()"); @@ -946,7 +948,9 @@ void VoxelSystem::copyWrittenDataToReadArrays(bool fullVBOs) { // time around, the only side effect is the VBOs won't be updated this frame const int WAIT_FOR_LOCK_IN_MS = 5; if (_readArraysLock.tryLockForWrite(WAIT_FOR_LOCK_IN_MS)) { + lockForWriteAttempt = 0; if (_writeArraysLock.tryLockForRead(WAIT_FOR_LOCK_IN_MS)) { + lockForReadAttempt = 0; if (_voxelsDirty && _voxelsUpdated) { if (fullVBOs) { copyWrittenDataToReadArraysFullVBOs(); @@ -956,11 +960,19 @@ void VoxelSystem::copyWrittenDataToReadArrays(bool fullVBOs) { } _writeArraysLock.unlock(); } else { - qDebug() << "couldn't get _writeArraysLock.LockForRead()..."; + lockForReadAttempt++; + // only report error of first failure + if (lockForReadAttempt == 1) { + qDebug() << "couldn't get _writeArraysLock.LockForRead()..."; + } } _readArraysLock.unlock(); } else { - qDebug() << "couldn't get _readArraysLock.LockForWrite()..."; + lockForWriteAttempt++; + // only report error of first failure + if (lockForWriteAttempt == 1) { + qDebug() << "couldn't get _readArraysLock.LockForWrite()..."; + } } } From ff7a1bd60fb615c68744cf93c8ee47037a2e4e08 Mon Sep 17 00:00:00 2001 From: matsukaze Date: Tue, 22 Apr 2014 06:53:59 -0400 Subject: [PATCH 90/97] Job #19574. Add audio oscilloscope.' --- interface/src/Application.cpp | 2 + interface/src/Audio.cpp | 174 +++++++++++++++++++++++++++++++++- interface/src/Audio.h | 26 +++++ interface/src/Menu.cpp | 8 ++ interface/src/Menu.h | 3 +- interface/src/ui/InfoView.cpp | 4 +- 6 files changed, 213 insertions(+), 4 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index cd07f21300..a9f4c8eed7 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -2648,6 +2648,8 @@ void Application::displayOverlay() { audioMeterY, Menu::getInstance()->isOptionChecked(MenuOption::Mirror)); + _audio.renderScope(_glWidget->width(), _glWidget->height()); + glBegin(GL_QUADS); if (isClipping) { glColor3f(1, 0, 0); diff --git a/interface/src/Audio.cpp b/interface/src/Audio.cpp index 698a8db725..1e85e77883 100644 --- a/interface/src/Audio.cpp +++ b/interface/src/Audio.cpp @@ -92,7 +92,14 @@ Audio::Audio(int16_t initialJitterBufferSamples, QObject* parent) : _processSpatialAudio(false), _spatialAudioStart(0), _spatialAudioFinish(0), - _spatialAudioRingBuffer(NETWORK_BUFFER_LENGTH_BYTES_PER_CHANNEL, true) // random access mode + _spatialAudioRingBuffer(NETWORK_BUFFER_LENGTH_BYTES_PER_CHANNEL, true), // random access mode + _scopeEnabled(false), + _scopeEnabledPause(false), + _scopeInputOffset(0), + _scopeOutputOffset(0), + _scopeInput(SAMPLES_PER_SCOPE_H * sizeof(int16_t), 0), + _scopeOutputLeft(SAMPLES_PER_SCOPE_H * sizeof(int16_t), 0), + _scopeOutputRight(SAMPLES_PER_SCOPE_H * sizeof(int16_t), 0) { // clear the array of locally injected samples memset(_localProceduralSamples, 0, NETWORK_BUFFER_LENGTH_BYTES_PER_CHANNEL); @@ -575,6 +582,14 @@ void Audio::handleAudioInput() { processProceduralAudio(monoAudioSamples, NETWORK_BUFFER_LENGTH_SAMPLES_PER_CHANNEL); } + if (_scopeEnabled && !_scopeEnabledPause) { + unsigned int numMonoAudioChannels = 1; + unsigned int monoAudioChannel = 0; + addBufferToScope(_scopeInput, _scopeInputOffset, monoAudioSamples, monoAudioChannel, numMonoAudioChannels); + _scopeInputOffset += NETWORK_SAMPLES_PER_FRAME; + _scopeInputOffset %= SAMPLES_PER_SCOPE_H; + } + NodeList* nodeList = NodeList::getInstance(); SharedNodePointer audioMixer = nodeList->soloNodeOfType(NodeType::AudioMixer); @@ -813,6 +828,30 @@ void Audio::processReceivedAudio(const QByteArray& audioByteArray) { if (_outputDevice) { _outputDevice->write(outputBuffer); } + + if (_scopeEnabled && !_scopeEnabledPause) { + unsigned int numAudioChannels = _desiredOutputFormat.channelCount(); + int16_t* samples = ringBufferSamples; + for (int numSamples = numNetworkOutputSamples / numAudioChannels; numSamples > 0; numSamples -= NETWORK_SAMPLES_PER_FRAME) { + + unsigned int audioChannel = 0; + addBufferToScope( + _scopeOutputLeft, + _scopeOutputOffset, + samples, audioChannel, numAudioChannels); + + audioChannel = 1; + addBufferToScope( + _scopeOutputRight, + _scopeOutputOffset, + samples, audioChannel, numAudioChannels); + + _scopeOutputOffset += NETWORK_SAMPLES_PER_FRAME; + _scopeOutputOffset %= SAMPLES_PER_SCOPE_H; + samples += NETWORK_SAMPLES_PER_FRAME * numAudioChannels; + } + } + delete[] ringBufferSamples; } } @@ -1019,6 +1058,139 @@ void Audio::renderToolBox(int x, int y, bool boxed) { glDisable(GL_TEXTURE_2D); } +void Audio::toggleScopePause() { + _scopeEnabledPause = !_scopeEnabledPause; +} + +void Audio::toggleScope() { + _scopeEnabled = !_scopeEnabled; + if (_scopeEnabled) { + static const int width = SAMPLES_PER_SCOPE_H; + _scopeInputOffset = 0; + _scopeOutputOffset = 0; + memset(_scopeInput.data(), 0, width * sizeof(int16_t)); + memset(_scopeOutputLeft.data(), 0, width * sizeof(int16_t)); + memset(_scopeOutputRight.data(), 0, width * sizeof(int16_t)); + } +} + +void Audio::addBufferToScope( + QByteArray& byteArray, unsigned int frameOffset, const int16_t* src, unsigned int srcChannel, unsigned int srcNumChannels) { + + int16_t* tgt = (int16_t*)byteArray.data() + frameOffset; + src += srcChannel; + + for (int i = NETWORK_SAMPLES_PER_FRAME; --i >= 0; src += srcNumChannels) { + float sample = (float)*src; + float multiplier = (float)MULTIPLIER_SCOPE_V / logf(2.0f); + int16_t value; + + if (sample > 0) { + value = (int16_t)(multiplier * logf(sample)); + } else if (sample < 0) { + value = (int16_t)(-multiplier * logf(-sample)); + } else { + value = 0; + } + + *tgt++ = value; + //*tgt++ = sample / 0x7fff * (SAMPLES_PER_SCOPE_V / 2); + } +} + +void Audio::renderScope(int width, int height) { + + if (!_scopeEnabled) + return; + + static const unsigned int backgroundColor = 0x33333399; + static const unsigned int gridColor = 0x44444499; + static const unsigned int inputColor = 0x44aa4499; + static const unsigned int outputLeftColor = 0xaa444499; + static const unsigned int outputRightColor = 0x4444aa99; + static const int gridRows = 2; + static const int gridCols = 5; + + int x = (width - SAMPLES_PER_SCOPE_H) / 2; + int y = (height - SAMPLES_PER_SCOPE_V) / 2; + int w = SAMPLES_PER_SCOPE_H; + int h = SAMPLES_PER_SCOPE_V; + + renderBackground(backgroundColor, x, y, w, h); + renderGrid(gridColor, x, y, w, h, gridRows, gridCols); + renderLineStrip(inputColor, x, y, w, _scopeInputOffset, _scopeInput); + renderLineStrip(outputLeftColor, x, y, w, _scopeOutputOffset, _scopeOutputLeft); + renderLineStrip(outputRightColor, x, y, w, _scopeOutputOffset, _scopeOutputRight); +} + +void Audio::renderBackground(unsigned int rgba, int x, int y, int width, int height) { + glBegin(GL_QUADS); + glColor4f(((rgba >> 24) & 0xff) / 255.0f, + ((rgba >> 16) & 0xff) / 255.0f, + ((rgba >> 8) & 0xff) / 255.0f, + (rgba & 0xff) / 255.0f); + glVertex2i(x, y); + glVertex2i(x + width, y); + glVertex2i(x + width, y + height); + glVertex2i(x , y + height); + glEnd(); + glColor4f(1, 1, 1, 1); +} + +void Audio::renderGrid(unsigned int rgba, int x, int y, int width, int height, int rows, int cols) { + glBegin(GL_LINES); + glColor4f(((rgba >> 24) & 0xff) / 255.0f, + ((rgba >> 16) & 0xff) / 255.0f, + ((rgba >> 8) & 0xff) / 255.0f, + (rgba & 0xff) / 255.0f); + + int dx = width / cols; + int dy = height / rows; + int tx = x; + int ty = y; + + // Draw horizontal grid lines + for (int i = rows + 1; --i >= 0; ) { + glVertex2i(x, ty); + glVertex2i(x + width, ty); + ty += dy; + } + // Draw vertical grid lines + for (int i = cols + 1; --i >= 0; ) { + glVertex2i(tx, y); + glVertex2i(tx, y + height); + tx += dx; + } + glEnd(); + glColor4f(1, 1, 1, 1); +} + +void Audio::renderLineStrip(unsigned int rgba, int x, int y, int n, int offset, const QByteArray& byteArray) { + + glColor4f(((rgba >> 24) & 0xff) / 255.0f, + ((rgba >> 16) & 0xff) / 255.0f, + ((rgba >> 8) & 0xff) / 255.0f, + (rgba & 0xff) / 255.0f); + + glBegin(GL_LINE_STRIP); + + int16_t sample; + int16_t* samples = ((int16_t*) byteArray.data()) + offset; + y += SAMPLES_PER_SCOPE_V / 2; + for (int i = n - offset; --i >= 0; ) { + sample = *samples++; + glVertex2i(x++, y - sample); + } + samples = (int16_t*) byteArray.data(); + for (int i = offset; --i >= 0; ) { + sample = *samples++; + glVertex2i(x++, y - sample); + } + glEnd(); + glColor4f(1, 1, 1, 1); +} + + bool Audio::switchInputToAudioDevice(const QAudioDeviceInfo& inputDeviceInfo) { bool supportedFormat = false; diff --git a/interface/src/Audio.h b/interface/src/Audio.h index 96def43dd2..4d4501c93d 100644 --- a/interface/src/Audio.h +++ b/interface/src/Audio.h @@ -28,6 +28,7 @@ #include #include #include +#include #include #include @@ -67,6 +68,7 @@ public: bool mousePressEvent(int x, int y); void renderToolBox(int x, int y, bool boxed); + void renderScope(int width, int height); int getNetworkSampleRate() { return SAMPLE_RATE; } int getNetworkBufferLengthSamplesPerChannel() { return NETWORK_BUFFER_LENGTH_SAMPLES_PER_CHANNEL; } @@ -83,6 +85,8 @@ public slots: void toggleMute(); void toggleAudioNoiseReduction(); void toggleToneInjection(); + void toggleScope(); + void toggleScopePause(); void toggleAudioSpatialProcessing(); virtual void handleAudioByteArray(const QByteArray& audioByteArray); @@ -196,6 +200,28 @@ private: int calculateNumberOfFrameSamples(int numBytes); float calculateDeviceToNetworkInputRatio(int numBytes); + // Audio scope methods for data acquisition + void addBufferToScope(QByteArray& byteArray, unsigned int frameOffset, const int16_t* src, unsigned int srcChannel, unsigned int srcNumChannels); + + // Audio scope methods for rendering + void renderBackground(unsigned int rgba, int x, int y, int width, int height); + void renderGrid(unsigned int rgba, int x, int y, int width, int height, int rows, int cols); + void renderLineStrip(unsigned int rgba, int x, int y, int n, int offset, const QByteArray& byteArray); + + // Audio scope data + static const unsigned int NETWORK_SAMPLES_PER_FRAME = NETWORK_BUFFER_LENGTH_SAMPLES_PER_CHANNEL; + static const unsigned int FRAMES_PER_SCOPE = 5; + static const unsigned int SAMPLES_PER_SCOPE_H = FRAMES_PER_SCOPE * NETWORK_SAMPLES_PER_FRAME; + static const unsigned int MULTIPLIER_SCOPE_V = 20; + static const unsigned int SAMPLES_PER_SCOPE_V = 2 * 15 * MULTIPLIER_SCOPE_V; + bool _scopeEnabled; + bool _scopeEnabledPause; + int _scopeInputOffset; + int _scopeOutputOffset; + QByteArray _scopeInput; + QByteArray _scopeOutputLeft; + QByteArray _scopeOutputRight; + }; diff --git a/interface/src/Menu.cpp b/interface/src/Menu.cpp index 7cdd72afd5..2e4abaa17d 100644 --- a/interface/src/Menu.cpp +++ b/interface/src/Menu.cpp @@ -259,6 +259,9 @@ Menu::Menu() : addCheckableActionToQMenuAndActionHash(viewMenu, MenuOption::Bandwidth, 0, true); addActionToQMenuAndActionHash(viewMenu, MenuOption::BandwidthDetails, 0, this, SLOT(bandwidthDetails())); addActionToQMenuAndActionHash(viewMenu, MenuOption::OctreeStats, 0, this, SLOT(octreeStatsDetails())); + addCheckableActionToQMenuAndActionHash(viewMenu, MenuOption::AudioScope, 0, false, + appInstance->getAudio(), + SLOT(toggleScope())); QMenu* developerMenu = addMenu("Developer"); @@ -385,6 +388,11 @@ Menu::Menu() : false, appInstance->getAudio(), SLOT(toggleToneInjection())); + addCheckableActionToQMenuAndActionHash(audioDebugMenu, MenuOption::AudioScopePause, + Qt::CTRL | Qt::Key_P, + false, + appInstance->getAudio(), + SLOT(toggleScopePause())); QMenu* spatialAudioMenu = audioDebugMenu->addMenu("Spatial Audio"); diff --git a/interface/src/Menu.h b/interface/src/Menu.h index 597ae4a74b..ddcd0571f8 100644 --- a/interface/src/Menu.h +++ b/interface/src/Menu.h @@ -256,8 +256,9 @@ namespace MenuOption { const QString AmbientOcclusion = "Ambient Occlusion"; const QString Atmosphere = "Atmosphere"; const QString AudioNoiseReduction = "Audio Noise Reduction"; + const QString AudioScope = "Audio Scope"; + const QString AudioScopePause = "Pause Audio Scope"; const QString AudioToneInjection = "Inject Test Tone"; - const QString AudioSpatialProcessing = "Audio Spatial Processing"; const QString AudioSpatialProcessingHeadOriented = "Head Oriented"; const QString AudioSpatialProcessingIncludeOriginal = "Includes Network Original"; diff --git a/interface/src/ui/InfoView.cpp b/interface/src/ui/InfoView.cpp index 06de3fdf2e..99a4f8cb06 100644 --- a/interface/src/ui/InfoView.cpp +++ b/interface/src/ui/InfoView.cpp @@ -28,8 +28,8 @@ InfoView::InfoView(bool forced) : QString absPath = QFileInfo(Application::resourcesPath() + "html/interface-welcome-allsvg.html").absoluteFilePath(); QUrl url = QUrl::fromLocalFile(absPath); - load(url); - connect(this, SIGNAL(loadFinished(bool)), this, SLOT(loaded(bool))); +// load(url); +// connect(this, SIGNAL(loadFinished(bool)), this, SLOT(loaded(bool))); } void InfoView::showFirstTime() { From 6c89521f1d136486fde387c256e85c7c31650701 Mon Sep 17 00:00:00 2001 From: Thijs Wenker Date: Tue, 22 Apr 2014 13:12:21 +0200 Subject: [PATCH 91/97] Style --- interface/src/ScriptHighlighting.cpp | 6 +++--- interface/src/ui/ScriptEditorWidget.cpp | 2 +- interface/src/ui/ScriptEditorWindow.cpp | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/interface/src/ScriptHighlighting.cpp b/interface/src/ScriptHighlighting.cpp index 9b58298b62..3ab1394097 100644 --- a/interface/src/ScriptHighlighting.cpp +++ b/interface/src/ScriptHighlighting.cpp @@ -29,7 +29,7 @@ void ScriptHighlighting::highlightBlock(const QString& text) { this->formatNumbers(text); this->formatTrueFalse(text); this->formatQoutedText(text); - this->formatComments(text); + this->formatComments(text); } void ScriptHighlighting::highlightKeywords(const QString& text) { @@ -54,7 +54,7 @@ void ScriptHighlighting::formatComments(const QString& text) { start = text.indexOf(_multiLineCommentBegin, start + length); if (end == -1) { setCurrentBlockState(BlockStateInMultiComment); - } + } } int index = _singleLineComment.indexIn(text); @@ -92,4 +92,4 @@ void ScriptHighlighting::formatTrueFalse(const QString& text){ setFormat(index, length, *font); index = _truefalseRegex.indexIn(text, index + length); } -} \ No newline at end of file +} diff --git a/interface/src/ui/ScriptEditorWidget.cpp b/interface/src/ui/ScriptEditorWidget.cpp index 74b74e1ad6..1765a5ea1a 100644 --- a/interface/src/ui/ScriptEditorWidget.cpp +++ b/interface/src/ui/ScriptEditorWidget.cpp @@ -155,4 +155,4 @@ void ScriptEditorWidget::onScriptError(const QString& message) { void ScriptEditorWidget::onScriptPrint(const QString& message) { _scriptEditorWidgetUI->debugText->appendPlainText("> " + message); -} \ No newline at end of file +} diff --git a/interface/src/ui/ScriptEditorWindow.cpp b/interface/src/ui/ScriptEditorWindow.cpp index ec63e0341d..0c34959353 100644 --- a/interface/src/ui/ScriptEditorWindow.cpp +++ b/interface/src/ui/ScriptEditorWindow.cpp @@ -197,4 +197,4 @@ void ScriptEditorWindow::updateScriptNameOrStatus() { this->setWindowTitle("Script Editor [New script" + modifiedStar + "]"); } } -} \ No newline at end of file +} From 99cb1da5ec16eaeeda12a9b1a131594859aa6cae Mon Sep 17 00:00:00 2001 From: matsukaze Date: Tue, 22 Apr 2014 07:40:31 -0400 Subject: [PATCH 92/97] Reverting inadvertently committed local changes. --- interface/src/ui/InfoView.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/interface/src/ui/InfoView.cpp b/interface/src/ui/InfoView.cpp index 99a4f8cb06..06de3fdf2e 100644 --- a/interface/src/ui/InfoView.cpp +++ b/interface/src/ui/InfoView.cpp @@ -28,8 +28,8 @@ InfoView::InfoView(bool forced) : QString absPath = QFileInfo(Application::resourcesPath() + "html/interface-welcome-allsvg.html").absoluteFilePath(); QUrl url = QUrl::fromLocalFile(absPath); -// load(url); -// connect(this, SIGNAL(loadFinished(bool)), this, SLOT(loaded(bool))); + load(url); + connect(this, SIGNAL(loadFinished(bool)), this, SLOT(loaded(bool))); } void InfoView::showFirstTime() { From ae443a3136d40a2fb2a4643a2f784e05861f7137 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Tue, 22 Apr 2014 11:27:50 -0700 Subject: [PATCH 93/97] fix headers --- examples/audioReflectorTools.js | 2 ++ examples/testingVoxelViewerRestart.js | 3 ++- interface/src/AudioReflector.h | 3 +++ 3 files changed, 7 insertions(+), 1 deletion(-) diff --git a/examples/audioReflectorTools.js b/examples/audioReflectorTools.js index 76869de578..f299407e54 100644 --- a/examples/audioReflectorTools.js +++ b/examples/audioReflectorTools.js @@ -7,6 +7,8 @@ // // Tools for manipulating the attributes of the AudioReflector behavior // +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // diff --git a/examples/testingVoxelViewerRestart.js b/examples/testingVoxelViewerRestart.js index 4fbdee1223..c4ab67e8ba 100644 --- a/examples/testingVoxelViewerRestart.js +++ b/examples/testingVoxelViewerRestart.js @@ -5,7 +5,8 @@ // Created by Brad Hefta-Gaub on 2/26/14 // Copyright (c) 2014 HighFidelity, Inc. All rights reserved. // -// This is an example script +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // var count = 0; diff --git a/interface/src/AudioReflector.h b/interface/src/AudioReflector.h index 582345e064..1bfb52ea09 100644 --- a/interface/src/AudioReflector.h +++ b/interface/src/AudioReflector.h @@ -5,6 +5,9 @@ // Created by Brad Hefta-Gaub on 4/2/2014 // Copyright (c) 2014 High Fidelity, Inc. All rights reserved. // +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +// #ifndef interface_AudioReflector_h #define interface_AudioReflector_h From 015cbce32217b94801f5ac08ee12e746a7fb2c06 Mon Sep 17 00:00:00 2001 From: matsukaze Date: Tue, 22 Apr 2014 18:57:22 -0400 Subject: [PATCH 94/97] Changed constant names for improved readability. --- interface/src/Audio.cpp | 45 ++++++++++++++++++++++++----------------- interface/src/Audio.h | 6 +++--- 2 files changed, 29 insertions(+), 22 deletions(-) diff --git a/interface/src/Audio.cpp b/interface/src/Audio.cpp index 1e85e77883..5e9d343df6 100644 --- a/interface/src/Audio.cpp +++ b/interface/src/Audio.cpp @@ -97,9 +97,9 @@ Audio::Audio(int16_t initialJitterBufferSamples, QObject* parent) : _scopeEnabledPause(false), _scopeInputOffset(0), _scopeOutputOffset(0), - _scopeInput(SAMPLES_PER_SCOPE_H * sizeof(int16_t), 0), - _scopeOutputLeft(SAMPLES_PER_SCOPE_H * sizeof(int16_t), 0), - _scopeOutputRight(SAMPLES_PER_SCOPE_H * sizeof(int16_t), 0) + _scopeInput(SAMPLES_PER_SCOPE_WIDTH * sizeof(int16_t), 0), + _scopeOutputLeft(SAMPLES_PER_SCOPE_WIDTH * sizeof(int16_t), 0), + _scopeOutputRight(SAMPLES_PER_SCOPE_WIDTH * sizeof(int16_t), 0) { // clear the array of locally injected samples memset(_localProceduralSamples, 0, NETWORK_BUFFER_LENGTH_BYTES_PER_CHANNEL); @@ -587,7 +587,7 @@ void Audio::handleAudioInput() { unsigned int monoAudioChannel = 0; addBufferToScope(_scopeInput, _scopeInputOffset, monoAudioSamples, monoAudioChannel, numMonoAudioChannels); _scopeInputOffset += NETWORK_SAMPLES_PER_FRAME; - _scopeInputOffset %= SAMPLES_PER_SCOPE_H; + _scopeInputOffset %= SAMPLES_PER_SCOPE_WIDTH; } NodeList* nodeList = NodeList::getInstance(); @@ -847,7 +847,7 @@ void Audio::processReceivedAudio(const QByteArray& audioByteArray) { samples, audioChannel, numAudioChannels); _scopeOutputOffset += NETWORK_SAMPLES_PER_FRAME; - _scopeOutputOffset %= SAMPLES_PER_SCOPE_H; + _scopeOutputOffset %= SAMPLES_PER_SCOPE_WIDTH; samples += NETWORK_SAMPLES_PER_FRAME * numAudioChannels; } } @@ -1065,7 +1065,7 @@ void Audio::toggleScopePause() { void Audio::toggleScope() { _scopeEnabled = !_scopeEnabled; if (_scopeEnabled) { - static const int width = SAMPLES_PER_SCOPE_H; + static const int width = SAMPLES_PER_SCOPE_WIDTH; _scopeInputOffset = 0; _scopeOutputOffset = 0; memset(_scopeInput.data(), 0, width * sizeof(int16_t)); @@ -1077,13 +1077,21 @@ void Audio::toggleScope() { void Audio::addBufferToScope( QByteArray& byteArray, unsigned int frameOffset, const int16_t* src, unsigned int srcChannel, unsigned int srcNumChannels) { - int16_t* tgt = (int16_t*)byteArray.data() + frameOffset; - src += srcChannel; + // Constant multiplier to map sample value to vertical size of scope + float multiplier = (float)MULTIPLIER_SCOPE_HEIGHT / logf(2.0f); - for (int i = NETWORK_SAMPLES_PER_FRAME; --i >= 0; src += srcNumChannels) { - float sample = (float)*src; - float multiplier = (float)MULTIPLIER_SCOPE_V / logf(2.0f); - int16_t value; + // Temporary variable receives sample value + float sample; + + // Temporary variable receives mapping of sample value + int16_t value; + + // Short int pointer to mapped samples in byte array + int16_t* tgt = (int16_t*) byteArray.data(); + + for (int i = 0; i < NETWORK_SAMPLES_PER_FRAME; i++) { + + sample = (float)src[i * srcNumChannels + srcChannel]; if (sample > 0) { value = (int16_t)(multiplier * logf(sample)); @@ -1093,8 +1101,7 @@ void Audio::addBufferToScope( value = 0; } - *tgt++ = value; - //*tgt++ = sample / 0x7fff * (SAMPLES_PER_SCOPE_V / 2); + tgt[i + frameOffset] = value; } } @@ -1111,10 +1118,10 @@ void Audio::renderScope(int width, int height) { static const int gridRows = 2; static const int gridCols = 5; - int x = (width - SAMPLES_PER_SCOPE_H) / 2; - int y = (height - SAMPLES_PER_SCOPE_V) / 2; - int w = SAMPLES_PER_SCOPE_H; - int h = SAMPLES_PER_SCOPE_V; + int x = (width - SAMPLES_PER_SCOPE_WIDTH) / 2; + int y = (height - SAMPLES_PER_SCOPE_HEIGHT) / 2; + int w = SAMPLES_PER_SCOPE_WIDTH; + int h = SAMPLES_PER_SCOPE_HEIGHT; renderBackground(backgroundColor, x, y, w, h); renderGrid(gridColor, x, y, w, h, gridRows, gridCols); @@ -1176,7 +1183,7 @@ void Audio::renderLineStrip(unsigned int rgba, int x, int y, int n, int offset, int16_t sample; int16_t* samples = ((int16_t*) byteArray.data()) + offset; - y += SAMPLES_PER_SCOPE_V / 2; + y += SAMPLES_PER_SCOPE_HEIGHT / 2; for (int i = n - offset; --i >= 0; ) { sample = *samples++; glVertex2i(x++, y - sample); diff --git a/interface/src/Audio.h b/interface/src/Audio.h index 4d4501c93d..71030e39e3 100644 --- a/interface/src/Audio.h +++ b/interface/src/Audio.h @@ -211,9 +211,9 @@ private: // Audio scope data static const unsigned int NETWORK_SAMPLES_PER_FRAME = NETWORK_BUFFER_LENGTH_SAMPLES_PER_CHANNEL; static const unsigned int FRAMES_PER_SCOPE = 5; - static const unsigned int SAMPLES_PER_SCOPE_H = FRAMES_PER_SCOPE * NETWORK_SAMPLES_PER_FRAME; - static const unsigned int MULTIPLIER_SCOPE_V = 20; - static const unsigned int SAMPLES_PER_SCOPE_V = 2 * 15 * MULTIPLIER_SCOPE_V; + static const unsigned int SAMPLES_PER_SCOPE_WIDTH = FRAMES_PER_SCOPE * NETWORK_SAMPLES_PER_FRAME; + static const unsigned int MULTIPLIER_SCOPE_HEIGHT = 20; + static const unsigned int SAMPLES_PER_SCOPE_HEIGHT = 2 * 15 * MULTIPLIER_SCOPE_HEIGHT; bool _scopeEnabled; bool _scopeEnabledPause; int _scopeInputOffset; From 1ff3b83644e5eeaeb67ba168f08b78d8b8345af6 Mon Sep 17 00:00:00 2001 From: matsukaze Date: Tue, 22 Apr 2014 19:42:51 -0400 Subject: [PATCH 95/97] Changed const color data and method signatures. Changed constant color data and method signatures from unsigned int to array of float. Changed glColor4f to glColor4fv. --- interface/src/Audio.cpp | 36 +++++++++++++++--------------------- interface/src/Audio.h | 6 +++--- 2 files changed, 18 insertions(+), 24 deletions(-) diff --git a/interface/src/Audio.cpp b/interface/src/Audio.cpp index 5e9d343df6..29aaa3b34b 100644 --- a/interface/src/Audio.cpp +++ b/interface/src/Audio.cpp @@ -1110,11 +1110,11 @@ void Audio::renderScope(int width, int height) { if (!_scopeEnabled) return; - static const unsigned int backgroundColor = 0x33333399; - static const unsigned int gridColor = 0x44444499; - static const unsigned int inputColor = 0x44aa4499; - static const unsigned int outputLeftColor = 0xaa444499; - static const unsigned int outputRightColor = 0x4444aa99; + static const float backgroundColor[4] = { 0.2f, 0.2f, 0.2f, 0.6f }; + static const float gridColor[4] = { 0.3f, 0.3f, 0.3f, 0.6f }; + static const float inputColor[4] = { 0.3f, .7f, 0.3f, 0.6f }; + static const float outputLeftColor[4] = { 0.7f, .3f, 0.3f, 0.6f }; + static const float outputRightColor[4] = { 0.3f, .3f, 0.7f, 0.6f }; static const int gridRows = 2; static const int gridCols = 5; @@ -1130,26 +1130,24 @@ void Audio::renderScope(int width, int height) { renderLineStrip(outputRightColor, x, y, w, _scopeOutputOffset, _scopeOutputRight); } -void Audio::renderBackground(unsigned int rgba, int x, int y, int width, int height) { +void Audio::renderBackground(const float* color, int x, int y, int width, int height) { + + glColor4fv(color); glBegin(GL_QUADS); - glColor4f(((rgba >> 24) & 0xff) / 255.0f, - ((rgba >> 16) & 0xff) / 255.0f, - ((rgba >> 8) & 0xff) / 255.0f, - (rgba & 0xff) / 255.0f); + glVertex2i(x, y); glVertex2i(x + width, y); glVertex2i(x + width, y + height); glVertex2i(x , y + height); + glEnd(); glColor4f(1, 1, 1, 1); } -void Audio::renderGrid(unsigned int rgba, int x, int y, int width, int height, int rows, int cols) { +void Audio::renderGrid(const float* color, int x, int y, int width, int height, int rows, int cols) { + + glColor4fv(color); glBegin(GL_LINES); - glColor4f(((rgba >> 24) & 0xff) / 255.0f, - ((rgba >> 16) & 0xff) / 255.0f, - ((rgba >> 8) & 0xff) / 255.0f, - (rgba & 0xff) / 255.0f); int dx = width / cols; int dy = height / rows; @@ -1172,13 +1170,9 @@ void Audio::renderGrid(unsigned int rgba, int x, int y, int width, int height, i glColor4f(1, 1, 1, 1); } -void Audio::renderLineStrip(unsigned int rgba, int x, int y, int n, int offset, const QByteArray& byteArray) { - - glColor4f(((rgba >> 24) & 0xff) / 255.0f, - ((rgba >> 16) & 0xff) / 255.0f, - ((rgba >> 8) & 0xff) / 255.0f, - (rgba & 0xff) / 255.0f); +void Audio::renderLineStrip(const float* color, int x, int y, int n, int offset, const QByteArray& byteArray) { + glColor4fv(color); glBegin(GL_LINE_STRIP); int16_t sample; diff --git a/interface/src/Audio.h b/interface/src/Audio.h index 71030e39e3..c42b442a81 100644 --- a/interface/src/Audio.h +++ b/interface/src/Audio.h @@ -204,9 +204,9 @@ private: void addBufferToScope(QByteArray& byteArray, unsigned int frameOffset, const int16_t* src, unsigned int srcChannel, unsigned int srcNumChannels); // Audio scope methods for rendering - void renderBackground(unsigned int rgba, int x, int y, int width, int height); - void renderGrid(unsigned int rgba, int x, int y, int width, int height, int rows, int cols); - void renderLineStrip(unsigned int rgba, int x, int y, int n, int offset, const QByteArray& byteArray); + void renderBackground(const float* color, int x, int y, int width, int height); + void renderGrid(const float* color, int x, int y, int width, int height, int rows, int cols); + void renderLineStrip(const float* color, int x, int y, int n, int offset, const QByteArray& byteArray); // Audio scope data static const unsigned int NETWORK_SAMPLES_PER_FRAME = NETWORK_BUFFER_LENGTH_SAMPLES_PER_CHANNEL; From d6e4f217f5adeb7ee26e6e3a05cba405e1a31d43 Mon Sep 17 00:00:00 2001 From: matsukaze Date: Tue, 22 Apr 2014 21:57:41 -0400 Subject: [PATCH 96/97] Expanded variable names. --- interface/src/Audio.cpp | 8 ++++---- interface/src/Audio.h | 3 ++- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/interface/src/Audio.cpp b/interface/src/Audio.cpp index 29aaa3b34b..eb4a751356 100644 --- a/interface/src/Audio.cpp +++ b/interface/src/Audio.cpp @@ -1075,7 +1075,7 @@ void Audio::toggleScope() { } void Audio::addBufferToScope( - QByteArray& byteArray, unsigned int frameOffset, const int16_t* src, unsigned int srcChannel, unsigned int srcNumChannels) { + QByteArray& byteArray, unsigned int frameOffset, const int16_t* source, unsigned int sourceChannel, unsigned int sourceNumberOfChannels) { // Constant multiplier to map sample value to vertical size of scope float multiplier = (float)MULTIPLIER_SCOPE_HEIGHT / logf(2.0f); @@ -1087,11 +1087,11 @@ void Audio::addBufferToScope( int16_t value; // Short int pointer to mapped samples in byte array - int16_t* tgt = (int16_t*) byteArray.data(); + int16_t* destination = (int16_t*) byteArray.data(); for (int i = 0; i < NETWORK_SAMPLES_PER_FRAME; i++) { - sample = (float)src[i * srcNumChannels + srcChannel]; + sample = (float)source[i * sourceNumberOfChannels + sourceChannel]; if (sample > 0) { value = (int16_t)(multiplier * logf(sample)); @@ -1101,7 +1101,7 @@ void Audio::addBufferToScope( value = 0; } - tgt[i + frameOffset] = value; + destination[i + frameOffset] = value; } } diff --git a/interface/src/Audio.h b/interface/src/Audio.h index c42b442a81..ebd7f8612a 100644 --- a/interface/src/Audio.h +++ b/interface/src/Audio.h @@ -201,7 +201,8 @@ private: float calculateDeviceToNetworkInputRatio(int numBytes); // Audio scope methods for data acquisition - void addBufferToScope(QByteArray& byteArray, unsigned int frameOffset, const int16_t* src, unsigned int srcChannel, unsigned int srcNumChannels); + void addBufferToScope( + QByteArray& byteArray, unsigned int frameOffset, const int16_t* source, unsigned int sourceChannel, unsigned int sourceNumberOfChannels); // Audio scope methods for rendering void renderBackground(const float* color, int x, int y, int width, int height); From ebc6f4e78ee4f3444e7e300254daf033daa9d379 Mon Sep 17 00:00:00 2001 From: Thijs Wenker Date: Wed, 23 Apr 2014 14:40:06 +0200 Subject: [PATCH 97/97] Removed UTF-8 new line characters, QT script errors on those lines in Windows. --- examples/clap.js | 2 +- examples/drumStick.js | 2 +- examples/playSound.js | 4 ++-- examples/spaceInvadersExample.js | 7 +++---- examples/toyball.js | 6 +++--- examples/voxelDrumming.js | 2 +- 6 files changed, 11 insertions(+), 12 deletions(-) diff --git a/examples/clap.js b/examples/clap.js index a0efcfab7b..9da36ba094 100644 --- a/examples/clap.js +++ b/examples/clap.js @@ -50,7 +50,7 @@ function maybePlaySound(deltaTime) { const CLAP_DISTANCE = 0.2; if (!clapping[palm] && (distanceBetween < CLAP_DISTANCE) && (speed > CLAP_SPEED)) { - var options = new AudioInjectionOptions();
 + var options = new AudioInjectionOptions(); options.position = palm1Position; options.volume = speed / 2.0; if (options.volume > 1.0) options.volume = 1.0; diff --git a/examples/drumStick.js b/examples/drumStick.js index e9ac54f814..188661b000 100644 --- a/examples/drumStick.js +++ b/examples/drumStick.js @@ -61,7 +61,7 @@ function checkSticks(deltaTime) { // Waiting for change in velocity direction or slowing to trigger drum sound if ((palmVelocity.y > 0.0) || (speed < STOP_SPEED)) { state[palm] = 0; - var options = new AudioInjectionOptions();
 + var options = new AudioInjectionOptions(); options.position = Controller.getSpatialControlPosition(palm * 2 + 1); if (strokeSpeed[palm] > 1.0) { strokeSpeed[palm] = 1.0; } options.volume = strokeSpeed[palm]; diff --git a/examples/playSound.js b/examples/playSound.js index fb589bc9e3..317581ba36 100644 --- a/examples/playSound.js +++ b/examples/playSound.js @@ -9,12 +9,12 @@ // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // First, load the clap sound from a URL -var clap = new Sound("https://s3-us-west-1.amazonaws.com/highfidelity-public/sounds/Animals/bushtit_1.raw"); +var clap = new Sound("https://s3-us-west-1.amazonaws.com/highfidelity-public/sounds/Animals/bushtit_1.raw"); function maybePlaySound(deltaTime) { if (Math.random() < 0.01) { // Set the location and other info for the sound to play - var options = new AudioInjectionOptions();
 + var options = new AudioInjectionOptions(); var palmPosition = Controller.getSpatialControlPosition(0); options.position = palmPosition; options.volume = 0.5; diff --git a/examples/spaceInvadersExample.js b/examples/spaceInvadersExample.js index 5b25fa1236..5d62102d71 100644 --- a/examples/spaceInvadersExample.js +++ b/examples/spaceInvadersExample.js @@ -217,7 +217,7 @@ function update(deltaTime) { if (invaderStepOfCycle % stepsPerSound == 0) { // play the move sound - var options = new AudioInjectionOptions();
 + var options = new AudioInjectionOptions(); if (soundInMyHead) { options.position = { x: MyAvatar.position.x + 0.0, y: MyAvatar.position.y + 0.1, @@ -329,7 +329,7 @@ function fireMissile() { lifetime: 5 }); - var options = new AudioInjectionOptions();
 + var options = new AudioInjectionOptions(); if (soundInMyHead) { options.position = { x: MyAvatar.position.x + 0.0, y: MyAvatar.position.y + 0.1, @@ -379,7 +379,7 @@ function deleteIfInvader(possibleInvaderParticle) { Particles.deleteParticle(myMissile); // play the hit sound - var options = new AudioInjectionOptions();
 + var options = new AudioInjectionOptions(); if (soundInMyHead) { options.position = { x: MyAvatar.position.x + 0.0, y: MyAvatar.position.y + 0.1, @@ -417,4 +417,3 @@ initializeInvaders(); // shut down the game after 1 minute var gameTimer = Script.setTimeout(endGame, itemLifetimes * 1000); - diff --git a/examples/toyball.js b/examples/toyball.js index de68e97357..d312c1bc94 100644 --- a/examples/toyball.js +++ b/examples/toyball.js @@ -111,7 +111,7 @@ function checkControllerSide(whichSide) { velocity : { x: 0, y: 0, z: 0}, inHand: true }; Particles.editParticle(closestParticle, properties); - var options = new AudioInjectionOptions();
 + var options = new AudioInjectionOptions(); options.position = ballPosition; options.volume = 1.0; Audio.playSound(catchSound, options); @@ -152,7 +152,7 @@ function checkControllerSide(whichSide) { } // Play a new ball sound - var options = new AudioInjectionOptions();
 + var options = new AudioInjectionOptions(); options.position = ballPosition; options.volume = 1.0; Audio.playSound(catchSound, options); @@ -201,7 +201,7 @@ function checkControllerSide(whichSide) { rightHandParticle = false; } - var options = new AudioInjectionOptions();
 + var options = new AudioInjectionOptions(); options.position = ballPosition; options.volume = 1.0; Audio.playSound(throwSound, options); diff --git a/examples/voxelDrumming.js b/examples/voxelDrumming.js index 7f3495dea7..1b320ed755 100644 --- a/examples/voxelDrumming.js +++ b/examples/voxelDrumming.js @@ -64,7 +64,7 @@ collisionBubble[1] = Overlays.addOverlay("sphere", visible: false }); -var audioOptions = new AudioInjectionOptions();
 +var audioOptions = new AudioInjectionOptions(); audioOptions.position = { x: MyAvatar.position.x, y: MyAvatar.position.y + 1, z: MyAvatar.position.z }; audioOptions.volume = 1;