diff --git a/assignment-client/src/Agent.cpp b/assignment-client/src/Agent.cpp index 9b4f22679a..184083b28e 100644 --- a/assignment-client/src/Agent.cpp +++ b/assignment-client/src/Agent.cpp @@ -35,6 +35,7 @@ Agent::Agent(const QByteArray& packet) : ThreadedAssignment(packet), _voxelEditSender(), _particleEditSender(), + _modelEditSender(), _receivedAudioBuffer(NETWORK_BUFFER_LENGTH_SAMPLES_STEREO), _avatarHashMap() { @@ -43,6 +44,7 @@ Agent::Agent(const QByteArray& packet) : _scriptEngine.getVoxelsScriptingInterface()->setPacketSender(&_voxelEditSender); _scriptEngine.getParticlesScriptingInterface()->setPacketSender(&_particleEditSender); + _scriptEngine.getModelsScriptingInterface()->setPacketSender(&_modelEditSender); } void Agent::readPendingDatagrams() { @@ -88,6 +90,17 @@ void Agent::readPendingDatagrams() { SharedNodePointer sourceNode = nodeList->sendingNodeForPacket(receivedPacket); sourceNode->setLastHeardMicrostamp(usecTimestampNow()); + } else if (datagramPacketType == PacketTypeModelAddResponse) { + // this will keep creatorTokenIDs to IDs mapped correctly + ModelItem::handleAddModelResponse(receivedPacket); + + // also give our local particle tree a chance to remap any internal locally created particles + _modelViewer.getTree()->handleAddModelResponse(receivedPacket); + + // Make sure our Node and NodeList knows we've heard from this node. + SharedNodePointer sourceNode = nodeList->sendingNodeForPacket(receivedPacket); + sourceNode->setLastHeardMicrostamp(usecTimestampNow()); + } else if (datagramPacketType == PacketTypeParticleData || datagramPacketType == PacketTypeParticleErase || datagramPacketType == PacketTypeOctreeStats diff --git a/assignment-client/src/Agent.h b/assignment-client/src/Agent.h index 6b874a03a8..9af95e757c 100644 --- a/assignment-client/src/Agent.h +++ b/assignment-client/src/Agent.h @@ -64,6 +64,7 @@ private: ScriptEngine _scriptEngine; VoxelEditPacketSender _voxelEditSender; ParticleEditPacketSender _particleEditSender; + ModelEditPacketSender _modelEditSender; ParticleTreeHeadlessViewer _particleViewer; VoxelTreeHeadlessViewer _voxelViewer; diff --git a/assignment-client/src/models/ModelServer.h b/assignment-client/src/models/ModelServer.h index da51137385..c2ca6d1f5b 100644 --- a/assignment-client/src/models/ModelServer.h +++ b/assignment-client/src/models/ModelServer.h @@ -28,7 +28,7 @@ public: // Subclasses must implement these methods virtual OctreeQueryNode* createOctreeQueryNode(); virtual Octree* createTree(); - virtual unsigned char getMyNodeType() const { return NodeType::ModelServer; } + virtual char getMyNodeType() const { return NodeType::ModelServer; } virtual PacketType getMyQueryMessageType() const { return PacketTypeModelQuery; } virtual const char* getMyServerName() const { return MODEL_SERVER_NAME; } virtual const char* getMyLoggingServerTargetName() const { return MODEL_SERVER_LOGGING_TARGET_NAME; } diff --git a/assignment-client/src/octree/OctreeServer.h b/assignment-client/src/octree/OctreeServer.h index d7139b5c3d..ff62561c58 100644 --- a/assignment-client/src/octree/OctreeServer.h +++ b/assignment-client/src/octree/OctreeServer.h @@ -63,7 +63,7 @@ public: // Subclasses must implement these methods virtual OctreeQueryNode* createOctreeQueryNode() = 0; virtual Octree* createTree() = 0; - virtual unsigned char getMyNodeType() const = 0; + virtual char getMyNodeType() const = 0; virtual PacketType getMyQueryMessageType() const = 0; virtual const char* getMyServerName() const = 0; virtual const char* getMyLoggingServerTargetName() const = 0; diff --git a/assignment-client/src/particles/ParticleServer.h b/assignment-client/src/particles/ParticleServer.h index 495fc02c68..1e0bb1b967 100644 --- a/assignment-client/src/particles/ParticleServer.h +++ b/assignment-client/src/particles/ParticleServer.h @@ -28,7 +28,7 @@ public: // Subclasses must implement these methods virtual OctreeQueryNode* createOctreeQueryNode(); virtual Octree* createTree(); - virtual unsigned char getMyNodeType() const { return NodeType::ParticleServer; } + virtual char getMyNodeType() const { return NodeType::ParticleServer; } virtual PacketType getMyQueryMessageType() const { return PacketTypeParticleQuery; } virtual const char* getMyServerName() const { return PARTICLE_SERVER_NAME; } virtual const char* getMyLoggingServerTargetName() const { return PARTICLE_SERVER_LOGGING_TARGET_NAME; } diff --git a/assignment-client/src/voxels/VoxelServer.h b/assignment-client/src/voxels/VoxelServer.h index e81c16fc38..bec60cadfe 100644 --- a/assignment-client/src/voxels/VoxelServer.h +++ b/assignment-client/src/voxels/VoxelServer.h @@ -37,7 +37,7 @@ public: // Subclasses must implement these methods virtual OctreeQueryNode* createOctreeQueryNode(); virtual Octree* createTree(); - virtual unsigned char getMyNodeType() const { return NodeType::VoxelServer; } + virtual char getMyNodeType() const { return NodeType::VoxelServer; } virtual PacketType getMyQueryMessageType() const { return PacketTypeVoxelQuery; } virtual const char* getMyServerName() const { return VOXEL_SERVER_NAME; } virtual const char* getMyLoggingServerTargetName() const { return VOXEL_SERVER_LOGGING_TARGET_NAME; } diff --git a/examples/editModelExample.js b/examples/editModelExample.js index 24f29d1d88..dbea1419ba 100644 --- a/examples/editModelExample.js +++ b/examples/editModelExample.js @@ -35,7 +35,8 @@ var originalProperties = { //modelURL: "http://highfidelity-public.s3-us-west-1.amazonaws.com/meshes/birarda/birarda_head.fbx", //modelURL: "http://highfidelity-public.s3-us-west-1.amazonaws.com/meshes/pug.fbx", //modelURL: "http://highfidelity-public.s3-us-west-1.amazonaws.com/meshes/newInvader16x16-large-purple.svo", - modelURL: "http://highfidelity-public.s3-us-west-1.amazonaws.com/meshes/minotaur/mino_full.fbx", + //modelURL: "http://highfidelity-public.s3-us-west-1.amazonaws.com/meshes/minotaur/mino_full.fbx", + modelURL: "http://highfidelity-public.s3-us-west-1.amazonaws.com/meshes/Combat_tank_V01.FBX", modelRotation: rotation }; @@ -64,10 +65,10 @@ function moveModel(deltaTime) { return; // break early } - print("count =" + count); + //print("count =" + count); count++; - print("modelID.creatorTokenID = " + modelID.creatorTokenID); + //print("modelID.creatorTokenID = " + modelID.creatorTokenID); var newProperties = { position: { @@ -81,7 +82,7 @@ function moveModel(deltaTime) { //print("modelID = " + modelID); - print("newProperties.position = " + newProperties.position.x + "," + newProperties.position.y+ "," + newProperties.position.z); + //print("newProperties.position = " + newProperties.position.x + "," + newProperties.position.y+ "," + newProperties.position.z); Models.editModel(modelID, newProperties); } diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index e47d1c11ef..b87c536364 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -273,6 +273,7 @@ Application::Application(int& argc, char** argv, QElapsedTimer &startup_time) : // connect to the packet sent signal of the _voxelEditSender and the _particleEditSender connect(&_voxelEditSender, &VoxelEditPacketSender::packetSent, this, &Application::packetSent); connect(&_particleEditSender, &ParticleEditPacketSender::packetSent, this, &Application::packetSent); + connect(&_modelEditSender, &ModelEditPacketSender::packetSent, this, &Application::packetSent); // move the silentNodeTimer to the _nodeThread QTimer* silentNodeTimer = new QTimer(); @@ -316,6 +317,7 @@ Application::Application(int& argc, char** argv, QElapsedTimer &startup_time) : // Tell our voxel edit sender about our known jurisdictions _voxelEditSender.setVoxelServerJurisdictions(&_voxelServerJurisdictions); _particleEditSender.setServerJurisdictions(&_particleServerJurisdictions); + _modelEditSender.setServerJurisdictions(&_modelServerJurisdictions); Particle::setVoxelEditPacketSender(&_voxelEditSender); Particle::setParticleEditPacketSender(&_particleEditSender); @@ -327,6 +329,7 @@ Application::Application(int& argc, char** argv, QElapsedTimer &startup_time) : // probably not the right long term solution. But for now, we're going to do this to // allow you to move a particle around in your hand _particleEditSender.setPacketsPerSecond(3000); // super high!! + _modelEditSender.setPacketsPerSecond(3000); // super high!! // Set the sixense filtering _sixenseManager.setFilter(Menu::getInstance()->isOptionChecked(MenuOption::FilterSixense)); @@ -397,6 +400,7 @@ Application::~Application() { _voxelHideShowThread.terminate(); _voxelEditSender.terminate(); _particleEditSender.terminate(); + _modelEditSender.terminate(); storeSizeAndPosition(); saveScripts(); @@ -497,6 +501,8 @@ void Application::initializeGL() { _voxelEditSender.initialize(_enableProcessVoxelsThread); _voxelHideShowThread.initialize(_enableProcessVoxelsThread); _particleEditSender.initialize(_enableProcessVoxelsThread); + _modelEditSender.initialize(_enableProcessVoxelsThread); + if (_enableProcessVoxelsThread) { qDebug("Voxel parsing thread created."); } @@ -1883,6 +1889,7 @@ void Application::updateThreads(float deltaTime) { _voxelHideShowThread.threadRoutine(); _voxelEditSender.threadRoutine(); _particleEditSender.threadRoutine(); + _modelEditSender.threadRoutine(); } } @@ -3202,6 +3209,9 @@ void Application::nodeKilled(SharedNodePointer node) { _octreeSceneStatsLock.unlock(); } else if (node->getType() == NodeType::ModelServer) { + +qDebug()<< "nodeKilled... NodeType::ModelServer"; + QUuid nodeUUID = node->getUUID(); // see if this is the first we've heard of this node... if (_modelServerJurisdictions.find(nodeUUID) != _modelServerJurisdictions.end()) { @@ -3255,7 +3265,6 @@ void Application::trackIncomingVoxelPacket(const QByteArray& packet, const Share } int Application::parseOctreeStats(const QByteArray& packet, const SharedNodePointer& sendingNode) { - // But, also identify the sender, and keep track of the contained jurisdiction root for this server // parse the incoming stats datas stick it in a temporary object for now, while we @@ -3282,18 +3291,21 @@ int Application::parseOctreeStats(const QByteArray& packet, const SharedNodePoin // see if this is the first we've heard of this node... NodeToJurisdictionMap* jurisdiction = NULL; + QString serverType; if (sendingNode->getType() == NodeType::VoxelServer) { jurisdiction = &_voxelServerJurisdictions; + serverType = "Voxel"; } else if (sendingNode->getType() == NodeType::ParticleServer) { jurisdiction = &_particleServerJurisdictions; + serverType = "Particle"; } else { jurisdiction = &_modelServerJurisdictions; + serverType = "Model"; } - if (jurisdiction->find(nodeUUID) == jurisdiction->end()) { - qDebug("stats from new server... v[%f, %f, %f, %f]", - rootDetails.x, rootDetails.y, rootDetails.z, rootDetails.s); + qDebug("stats from new %s server... [%f, %f, %f, %f]", + qPrintable(serverType), rootDetails.x, rootDetails.y, rootDetails.z, rootDetails.s); // Add the jurisditionDetails object to the list of "fade outs" if (!Menu::getInstance()->isOptionChecked(MenuOption::DontFadeOnVoxelServerChanges)) { diff --git a/interface/src/Application.h b/interface/src/Application.h index 6859db80f5..96b472e553 100644 --- a/interface/src/Application.h +++ b/interface/src/Application.h @@ -179,6 +179,7 @@ public: VoxelTree* getVoxelTree() { return _voxels.getTree(); } ParticleTreeRenderer* getParticles() { return &_particles; } MetavoxelSystem* getMetavoxels() { return &_metavoxels; } + ModelTreeRenderer* getModels() { return &_models; } bool getImportSucceded() { return _importSucceded; } VoxelSystem* getSharedVoxelSystem() { return &_sharedVoxelSystem; } VoxelTree* getClipboard() { return &_clipboard; } diff --git a/interface/src/DatagramProcessor.cpp b/interface/src/DatagramProcessor.cpp index 6525e79cf2..ebccde39f2 100644 --- a/interface/src/DatagramProcessor.cpp +++ b/interface/src/DatagramProcessor.cpp @@ -56,9 +56,18 @@ void DatagramProcessor::processDatagrams() { Particle::handleAddParticleResponse(incomingPacket); application->getParticles()->getTree()->handleAddParticleResponse(incomingPacket); break; + + case PacketTypeModelAddResponse: +qDebug() << ">>>>>>>>> got PacketTypeModelAddResponse..."; + // this will keep creatorTokenIDs to IDs mapped correctly + ModelItem::handleAddModelResponse(incomingPacket); + application->getModels()->getTree()->handleAddModelResponse(incomingPacket); + break; case PacketTypeParticleData: case PacketTypeParticleErase: + case PacketTypeModelData: + case PacketTypeModelErase: case PacketTypeVoxelData: case PacketTypeVoxelErase: case PacketTypeOctreeStats: diff --git a/interface/src/models/ModelTreeRenderer.h b/interface/src/models/ModelTreeRenderer.h index 6c66350d8f..a85c408a7b 100644 --- a/interface/src/models/ModelTreeRenderer.h +++ b/interface/src/models/ModelTreeRenderer.h @@ -32,7 +32,7 @@ public: virtual ~ModelTreeRenderer(); virtual Octree* createTree() { return new ModelTree(true); } - virtual NodeType_t getMyNodeType() const { return NodeType::ModelServer; } + virtual char getMyNodeType() const { return NodeType::ModelServer; } virtual PacketType getMyQueryMessageType() const { return PacketTypeModelQuery; } virtual PacketType getExpectedPacketType() const { return PacketTypeModelData; } virtual void renderElement(OctreeElement* element, RenderArgs* args); diff --git a/interface/src/particles/ParticleTreeRenderer.h b/interface/src/particles/ParticleTreeRenderer.h index 7dc866c731..ea52df3932 100644 --- a/interface/src/particles/ParticleTreeRenderer.h +++ b/interface/src/particles/ParticleTreeRenderer.h @@ -31,7 +31,7 @@ public: virtual ~ParticleTreeRenderer(); virtual Octree* createTree() { return new ParticleTree(true); } - virtual NodeType_t getMyNodeType() const { return NodeType::ParticleServer; } + virtual char getMyNodeType() const { return NodeType::ParticleServer; } virtual PacketType getMyQueryMessageType() const { return PacketTypeParticleQuery; } virtual PacketType getExpectedPacketType() const { return PacketTypeParticleData; } virtual void renderElement(OctreeElement* element, RenderArgs* args); diff --git a/interface/src/voxels/VoxelPacketProcessor.cpp b/interface/src/voxels/VoxelPacketProcessor.cpp index d9d001b644..8576f14b16 100644 --- a/interface/src/voxels/VoxelPacketProcessor.cpp +++ b/interface/src/voxels/VoxelPacketProcessor.cpp @@ -44,7 +44,6 @@ void VoxelPacketProcessor::processPacket(const SharedNodePointer& sendingNode, c // immediately following them inside the same packet. So, we process the PacketType_OCTREE_STATS first // then process any remaining bytes as if it was another packet if (voxelPacketType == PacketTypeOctreeStats) { - int statsMessageLength = app->parseOctreeStats(mutablePacket, sendingNode); wasStatsPacket = true; if (messageLength > statsMessageLength) { @@ -77,6 +76,14 @@ void VoxelPacketProcessor::processPacket(const SharedNodePointer& sendingNode, c app->_particles.processDatagram(mutablePacket, sendingNode); } break; + case PacketTypeModelErase: { + app->_models.processEraseMessage(mutablePacket, sendingNode); + } break; + + case PacketTypeModelData: { + app->_models.processDatagram(mutablePacket, sendingNode); + } break; + case PacketTypeEnvironmentData: { app->_environment.parseData(*sendingNode->getActiveSocket(), mutablePacket); } break; diff --git a/libraries/models/src/ModelEditPacketSender.h b/libraries/models/src/ModelEditPacketSender.h index 287d6982a0..198c9a3be2 100644 --- a/libraries/models/src/ModelEditPacketSender.h +++ b/libraries/models/src/ModelEditPacketSender.h @@ -31,7 +31,7 @@ public: void queueModelEditMessage(PacketType type, ModelItemID modelID, const ModelItemProperties& properties); // My server type is the model server - virtual unsigned char getMyNodeType() const { return NodeType::ModelServer; } + virtual char getMyNodeType() const { return NodeType::ModelServer; } virtual void adjustEditPacketForClockSkew(unsigned char* codeColorBuffer, ssize_t length, int clockSkew); }; #endif // hifi_ModelEditPacketSender_h diff --git a/libraries/models/src/ModelTree.cpp b/libraries/models/src/ModelTree.cpp index 236138e2a8..9224a04650 100644 --- a/libraries/models/src/ModelTree.cpp +++ b/libraries/models/src/ModelTree.cpp @@ -211,7 +211,7 @@ void ModelTree::handleAddModelResponse(const QByteArray& packet) { getIsViewing() }; - const bool wantDebug = false; + const bool wantDebug = true; if (wantDebug) { qDebug() << "looking for creatorTokenID=" << creatorTokenID << " modelID=" << modelID << " getIsViewing()=" << getIsViewing(); diff --git a/libraries/models/src/ModelTreeHeadlessViewer.h b/libraries/models/src/ModelTreeHeadlessViewer.h index 0b5cde473d..9bd766153f 100644 --- a/libraries/models/src/ModelTreeHeadlessViewer.h +++ b/libraries/models/src/ModelTreeHeadlessViewer.h @@ -29,7 +29,7 @@ public: virtual ~ModelTreeHeadlessViewer(); virtual Octree* createTree() { return new ModelTree(true); } - virtual NodeType_t getMyNodeType() const { return NodeType::ModelServer; } + virtual char getMyNodeType() const { return NodeType::ModelServer; } virtual PacketType getMyQueryMessageType() const { return PacketTypeModelQuery; } virtual PacketType getExpectedPacketType() const { return PacketTypeModelData; } diff --git a/libraries/networking/src/PacketSender.cpp b/libraries/networking/src/PacketSender.cpp index 5f7502a738..dcb7932536 100644 --- a/libraries/networking/src/PacketSender.cpp +++ b/libraries/networking/src/PacketSender.cpp @@ -42,6 +42,7 @@ PacketSender::PacketSender(int packetsPerSecond) : _totalPacketsQueued(0), _totalBytesQueued(0) { + qDebug() << "PacketSender::PacketSender() this=" << this; } PacketSender::~PacketSender() { @@ -49,6 +50,7 @@ PacketSender::~PacketSender() { void PacketSender::queuePacketForSending(const SharedNodePointer& destinationNode, const QByteArray& packet) { + qDebug() << "PacketSender::queuePacketForSending() this=" << this << "packet.size()=" << packet.size(); NetworkPacket networkPacket(destinationNode, packet); lock(); _packets.push_back(networkPacket); @@ -77,6 +79,8 @@ void PacketSender::terminating() { } bool PacketSender::threadedProcess() { + qDebug() << "PacketSender::threadedProcess() this=" << this; + bool hasSlept = false; if (_lastSendTime == 0) { @@ -104,6 +108,7 @@ bool PacketSender::threadedProcess() { if (usecToSleep > MAX_SLEEP_INTERVAL) { usecToSleep = MAX_SLEEP_INTERVAL; } + qDebug() << "PacketSender::threadedProcess() this=" << this << "calling usleep() usecToSleep=" << usecToSleep; usleep(usecToSleep); hasSlept = true; } @@ -140,6 +145,7 @@ bool PacketSender::threadedProcess() { // We also keep a running total of packets sent over multiple calls to process() so that we can adjust up or down for // possible rounding error that would occur if we only considered whole integer packet counts per call to process bool PacketSender::nonThreadedProcess() { + qDebug() << "PacketSender::nonThreadedProcess() this=" << this; quint64 now = usecTimestampNow(); if (_lastProcessCallTime == 0) { @@ -246,6 +252,8 @@ bool PacketSender::nonThreadedProcess() { packetsToSendThisCall -= adjust; } + qDebug() << "PacketSender::nonThreadedProcess() this=" << this << "packetsToSendThisCall=" << packetsToSendThisCall; + // now, do we want to reset the check interval? don't want to completely reset, because we would still have // a rounding error. instead, we check to see that we've passed the reset interval (which is much larger than // the check interval), and on those reset intervals we take the second half average and keep that for the next @@ -261,6 +269,8 @@ bool PacketSender::nonThreadedProcess() { int packetsLeft = _packets.size(); + qDebug() << "PacketSender::nonThreadedProcess() this=" << this << "packetsLeft=" << packetsLeft; + // Now that we know how many packets to send this call to process, just send them. while ((packetsSentThisCall < packetsToSendThisCall) && (packetsLeft > 0)) { lock(); @@ -271,6 +281,7 @@ bool PacketSender::nonThreadedProcess() { unlock(); // send the packet through the NodeList... + qDebug() << "PacketSender::nonThreadedProcess() this=" << this << "calling writeDatagram()..."; NodeList::getInstance()->writeDatagram(temporary.getByteArray(), temporary.getDestinationNode()); packetsSentThisCall++; _packetsOverCheckInterval++; diff --git a/libraries/octree/src/OctreeEditPacketSender.cpp b/libraries/octree/src/OctreeEditPacketSender.cpp index 7e59b3ae7f..6239c7faea 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) { - //qDebug("OctreeEditPacketSender::OctreeEditPacketSender() [%p] created... ", this); + qDebug() << "OctreeEditPacketSender::OctreeEditPacketSender() this=" << this; } OctreeEditPacketSender::~OctreeEditPacketSender() { @@ -59,45 +59,59 @@ OctreeEditPacketSender::~OctreeEditPacketSender() { bool OctreeEditPacketSender::serversExist() const { bool hasServers = false; - bool atLeastOnJurisdictionMissing = false; // assume the best + bool atLeastOneJurisdictionMissing = false; // assume the best NodeList* nodeList = NodeList::getInstance(); foreach (const SharedNodePointer& node, nodeList->getNodeHash()) { + // only send to the NodeTypes that are getMyNodeType() - if (node->getType() == getMyNodeType() && node->getActiveSocket()) { + if (node->getType() == getMyNodeType() && node->getActiveSocket()) { + QUuid nodeUUID = node->getUUID(); // If we've got Jurisdictions set, then check to see if we know the jurisdiction for this server if (_serverJurisdictions) { // lookup our nodeUUID in the jurisdiction map, if it's missing then we're // missing at least one jurisdiction if ((*_serverJurisdictions).find(nodeUUID) == (*_serverJurisdictions).end()) { - atLeastOnJurisdictionMissing = true; + atLeastOneJurisdictionMissing = true; } } hasServers = true; } - if (atLeastOnJurisdictionMissing) { + if (atLeastOneJurisdictionMissing) { break; // no point in looking further... } } - return (hasServers && !atLeastOnJurisdictionMissing); + return (hasServers && !atLeastOneJurisdictionMissing); } // This method is called when the edit packet layer has determined that it has a fully formed packet destined for // a known nodeID. void OctreeEditPacketSender::queuePacketToNode(const QUuid& nodeUUID, unsigned char* buffer, ssize_t length) { +qDebug() << "OctreeEditPacketSender::queuePacketToNode() this=" << this; + NodeList* nodeList = NodeList::getInstance(); foreach (const SharedNodePointer& node, nodeList->getNodeHash()) { + +qDebug() << "OctreeEditPacketSender::queuePacketToNode() this=" << this << "node->getType()=" << node->getType(); +qDebug() << "OctreeEditPacketSender::queuePacketToNode() this=" << this << "getMyNodeType()=" << getMyNodeType(); +qDebug() << "OctreeEditPacketSender::queuePacketToNode() this=" << this << "node->getUUID()=" << node->getUUID(); +qDebug() << "OctreeEditPacketSender::queuePacketToNode() this=" << this << " nodeUUID=" << nodeUUID; +qDebug() << "OctreeEditPacketSender::queuePacketToNode() this=" << this << "nodeUUID.isNull=" << nodeUUID.isNull(); +qDebug() << "OctreeEditPacketSender::queuePacketToNode() this=" << this << "node->getActiveSocket()=" << node->getActiveSocket(); + // only send to the NodeTypes that are getMyNodeType() if (node->getType() == getMyNodeType() && ((node->getUUID() == nodeUUID) || (nodeUUID.isNull()))) { if (node->getActiveSocket()) { + +qDebug() << "OctreeEditPacketSender::queuePacketToNode() this=" << this << "calling queuePacketForSending()..."; queuePacketForSending(node, QByteArray(reinterpret_cast(buffer), length)); // debugging output... - bool wantDebugging = false; + bool wantDebugging = true; if (wantDebugging) { int numBytesPacketHeader = numBytesForPacketHeader(reinterpret_cast(buffer)); unsigned short int sequence = (*((unsigned short int*)(buffer + numBytesPacketHeader))); @@ -164,6 +178,7 @@ void OctreeEditPacketSender::queuePendingPacketToNodes(PacketType type, unsigned void OctreeEditPacketSender::queuePacketToNodes(unsigned char* buffer, ssize_t length) { if (!_shouldSend) { +qDebug() << "OctreeEditPacketSender::queuePacketToNodes()... this=" << this << "bail early!"; return; // bail early } @@ -197,13 +212,17 @@ void OctreeEditPacketSender::queuePacketToNodes(unsigned char* buffer, ssize_t l // NOTE: codeColorBuffer - is JUST the octcode/color and does not contain the packet header! void OctreeEditPacketSender::queueOctreeEditMessage(PacketType type, unsigned char* codeColorBuffer, ssize_t length) { +//qDebug() << "OctreeEditPacketSender::queueOctreeEditMessage()... this=" << this; + if (!_shouldSend) { +//qDebug() << "OctreeEditPacketSender::queueOctreeEditMessage()... this=" << this << "bail early! _shouldSend=" << _shouldSend; return; // bail early } // If we don't have jurisdictions, then we will simply queue up all of these packets and wait till we have // jurisdictions for processing if (!serversExist()) { +//qDebug() << "OctreeEditPacketSender::queueOctreeEditMessage()... !serversExist()"; if (_maxPendingMessages > 0) { EditPacketBuffer* packet = new EditPacketBuffer(type, codeColorBuffer, length); _pendingPacketsLock.lock(); @@ -217,7 +236,8 @@ void OctreeEditPacketSender::queueOctreeEditMessage(PacketType type, unsigned ch _preServerPackets.erase(_preServerPackets.begin()); } _pendingPacketsLock.unlock(); - } + } +//qDebug() << "OctreeEditPacketSender::queueOctreeEditMessage()... this=" << this << "bail early!... !serversExist()"; return; // bail early } @@ -274,6 +294,7 @@ void OctreeEditPacketSender::queueOctreeEditMessage(PacketType type, unsigned ch } void OctreeEditPacketSender::releaseQueuedMessages() { +qDebug() << "OctreeEditPacketSender::releaseQueuedMessages() this=" << this; // if we don't yet have jurisdictions then we can't actually release messages yet because we don't // know where to send them to. Instead, just remember this request and when we eventually get jurisdictions // call release again at that time. @@ -281,6 +302,7 @@ void OctreeEditPacketSender::releaseQueuedMessages() { _releaseQueuedMessagesPending = true; } else { for (std::map::iterator i = _pendingEditPackets.begin(); i != _pendingEditPackets.end(); i++) { +qDebug() << "OctreeEditPacketSender::releaseQueuedMessages()... releaseQueuedPacket()... this=" << this; releaseQueuedPacket(i->second); } } @@ -313,12 +335,15 @@ void OctreeEditPacketSender::initializePacket(EditPacketBuffer& packetBuffer, Pa } bool OctreeEditPacketSender::process() { + qDebug() << "OctreeEditPacketSender::process() this=" << this; // if we have server jurisdiction details, and we have pending pre-jurisdiction packets, then process those // before doing our normal process step. This processPreJurisdictionPackets() if (serversExist() && (!_preServerPackets.empty() || !_preServerSingleMessagePackets.empty() )) { + qDebug() << "OctreeEditPacketSender::process() this=" << this << "calling processPreServerExistsPackets()"; processPreServerExistsPackets(); } // base class does most of the work. + qDebug() << "OctreeEditPacketSender::process() this=" << this << "calling PacketSender::process()"; return PacketSender::process(); } diff --git a/libraries/octree/src/OctreeEditPacketSender.h b/libraries/octree/src/OctreeEditPacketSender.h index f9326b6ed3..0dc628c433 100644 --- a/libraries/octree/src/OctreeEditPacketSender.h +++ b/libraries/octree/src/OctreeEditPacketSender.h @@ -87,7 +87,7 @@ public: int getMaxPacketSize() const { return _maxPacketSize; } // you must override these... - virtual unsigned char getMyNodeType() const = 0; + virtual char getMyNodeType() const = 0; virtual void adjustEditPacketForClockSkew(unsigned char* codeColorBuffer, ssize_t length, int clockSkew) { }; protected: diff --git a/libraries/octree/src/OctreeHeadlessViewer.cpp b/libraries/octree/src/OctreeHeadlessViewer.cpp index 5574b376cb..7f19b170b9 100644 --- a/libraries/octree/src/OctreeHeadlessViewer.cpp +++ b/libraries/octree/src/OctreeHeadlessViewer.cpp @@ -34,7 +34,7 @@ void OctreeHeadlessViewer::init() { } void OctreeHeadlessViewer::queryOctree() { - NodeType_t serverType = getMyNodeType(); + char serverType = getMyNodeType(); PacketType packetType = getMyQueryMessageType(); NodeToJurisdictionMap& jurisdictions = *_jurisdictionListener->getJurisdictions(); diff --git a/libraries/octree/src/OctreeRenderer.cpp b/libraries/octree/src/OctreeRenderer.cpp index cde1f0923d..f86c016d5e 100644 --- a/libraries/octree/src/OctreeRenderer.cpp +++ b/libraries/octree/src/OctreeRenderer.cpp @@ -158,6 +158,7 @@ void OctreeRenderer::render() { _tree->recurseTreeWithOperation(renderOperation, &args); _tree->unlock(); } + //qDebug() << "rendered items:" << args._renderedItems; } void OctreeRenderer::clear() { diff --git a/libraries/octree/src/OctreeRenderer.h b/libraries/octree/src/OctreeRenderer.h index fbd82fad8f..0337086831 100644 --- a/libraries/octree/src/OctreeRenderer.h +++ b/libraries/octree/src/OctreeRenderer.h @@ -42,7 +42,7 @@ public: virtual ~OctreeRenderer(); virtual Octree* createTree() = 0; - virtual NodeType_t getMyNodeType() const = 0; + virtual char getMyNodeType() const = 0; virtual PacketType getMyQueryMessageType() const = 0; virtual PacketType getExpectedPacketType() const = 0; virtual void renderElement(OctreeElement* element, RenderArgs* args) = 0; diff --git a/libraries/particles/src/ParticleEditPacketSender.h b/libraries/particles/src/ParticleEditPacketSender.h index 15e3196785..5a367347ea 100644 --- a/libraries/particles/src/ParticleEditPacketSender.h +++ b/libraries/particles/src/ParticleEditPacketSender.h @@ -30,7 +30,7 @@ public: void queueParticleEditMessage(PacketType type, ParticleID particleID, const ParticleProperties& properties); // My server type is the particle server - virtual unsigned char getMyNodeType() const { return NodeType::ParticleServer; } + virtual char getMyNodeType() const { return NodeType::ParticleServer; } virtual void adjustEditPacketForClockSkew(unsigned char* codeColorBuffer, ssize_t length, int clockSkew); }; #endif // hifi_ParticleEditPacketSender_h diff --git a/libraries/particles/src/ParticleTreeHeadlessViewer.h b/libraries/particles/src/ParticleTreeHeadlessViewer.h index 1d539bd46f..119c46e202 100644 --- a/libraries/particles/src/ParticleTreeHeadlessViewer.h +++ b/libraries/particles/src/ParticleTreeHeadlessViewer.h @@ -28,7 +28,7 @@ public: virtual ~ParticleTreeHeadlessViewer(); virtual Octree* createTree() { return new ParticleTree(true); } - virtual NodeType_t getMyNodeType() const { return NodeType::ParticleServer; } + virtual char getMyNodeType() const { return NodeType::ParticleServer; } virtual PacketType getMyQueryMessageType() const { return PacketTypeParticleQuery; } virtual PacketType getExpectedPacketType() const { return PacketTypeParticleData; } diff --git a/libraries/particles/src/ParticlesScriptingInterface.cpp b/libraries/particles/src/ParticlesScriptingInterface.cpp index 4adfed358e..a154dc80df 100644 --- a/libraries/particles/src/ParticlesScriptingInterface.cpp +++ b/libraries/particles/src/ParticlesScriptingInterface.cpp @@ -89,6 +89,7 @@ ParticleID ParticlesScriptingInterface::editParticle(ParticleID particleID, cons // if the particle is unknown, attempt to look it up if (!particleID.isKnownID) { actualID = Particle::getIDfromCreatorTokenID(particleID.creatorTokenID); +qDebug() << "ParticlesScriptingInterface::editModel()... actualID=" << actualID; } // if at this point, we know the id, send the update to the particle server diff --git a/libraries/script-engine/src/ScriptEngine.cpp b/libraries/script-engine/src/ScriptEngine.cpp index 68233985c5..f76ea0ee18 100644 --- a/libraries/script-engine/src/ScriptEngine.cpp +++ b/libraries/script-engine/src/ScriptEngine.cpp @@ -364,6 +364,16 @@ void ScriptEngine::run() { } } + if (_modelsScriptingInterface.getModelPacketSender()->serversExist()) { + // release the queue of edit voxel messages. + _modelsScriptingInterface.getModelPacketSender()->releaseQueuedMessages(); + + // since we're in non-threaded mode, call process so that the packets are sent + if (!_modelsScriptingInterface.getModelPacketSender()->isThreaded()) { + _modelsScriptingInterface.getModelPacketSender()->process(); + } + } + if (_isAvatar && _avatarData) { const int SCRIPT_AUDIO_BUFFER_SAMPLES = floor(((SCRIPT_DATA_CALLBACK_USECS * SAMPLE_RATE) / (1000 * 1000)) + 0.5); @@ -475,6 +485,22 @@ void ScriptEngine::run() { } } +qDebug() << "ScriptEngine::run()... checking for model server... _modelsScriptingInterface.getModelPacketSender()=" << _modelsScriptingInterface.getModelPacketSender(); +qDebug() << "ScriptEngine::run()... checking for model server... _modelsScriptingInterface.getModelPacketSender()->serversExist()=" << _modelsScriptingInterface.getModelPacketSender()->serversExist(); + + if (_modelsScriptingInterface.getModelPacketSender()->serversExist()) { + +qDebug() << "ScriptEngine::run()... calling _modelsScriptingInterface.getModelPacketSender()->releaseQueuedMessages();"; + + // release the queue of edit voxel messages. + _modelsScriptingInterface.getModelPacketSender()->releaseQueuedMessages(); + + // since we're in non-threaded mode, call process so that the packets are sent + if (!_modelsScriptingInterface.getModelPacketSender()->isThreaded()) { + _modelsScriptingInterface.getModelPacketSender()->process(); + } + } + // If we were on a thread, then wait till it's done if (thread()) { thread()->quit(); diff --git a/libraries/voxels/src/VoxelEditPacketSender.h b/libraries/voxels/src/VoxelEditPacketSender.h index ff72e5704a..3ef257de6c 100644 --- a/libraries/voxels/src/VoxelEditPacketSender.h +++ b/libraries/voxels/src/VoxelEditPacketSender.h @@ -48,6 +48,6 @@ public: bool voxelServersExist() const { return serversExist(); } // My server type is the voxel server - virtual unsigned char getMyNodeType() const { return NodeType::VoxelServer; } + virtual char getMyNodeType() const { return NodeType::VoxelServer; } }; #endif // hifi_VoxelEditPacketSender_h diff --git a/libraries/voxels/src/VoxelTreeHeadlessViewer.h b/libraries/voxels/src/VoxelTreeHeadlessViewer.h index 3a9f00d754..4acd5aa52d 100644 --- a/libraries/voxels/src/VoxelTreeHeadlessViewer.h +++ b/libraries/voxels/src/VoxelTreeHeadlessViewer.h @@ -28,7 +28,7 @@ public: virtual ~VoxelTreeHeadlessViewer(); virtual Octree* createTree() { return new VoxelTree(true); } - virtual NodeType_t getMyNodeType() const { return NodeType::VoxelServer; } + virtual char getMyNodeType() const { return NodeType::VoxelServer; } virtual PacketType getMyQueryMessageType() const { return PacketTypeVoxelQuery; } virtual PacketType getExpectedPacketType() const { return PacketTypeVoxelData; }