From 3c09ca71cb6915e9fe8460fddbc5c929356b5fa0 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Mon, 8 Dec 2014 18:09:49 -0800 Subject: [PATCH 1/8] move emit of collisions to after done moving entities, so that callbacks can delete entities --- examples/collidingEntities.js | 4 +++- libraries/entities/src/EntityCollisionSystem.cpp | 14 +++++++------- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/examples/collidingEntities.js b/examples/collidingEntities.js index 7edbc9fecc..fff41ab65d 100644 --- a/examples/collidingEntities.js +++ b/examples/collidingEntities.js @@ -22,7 +22,7 @@ var velocity = { y: 0, z: 1 }; -var damping = 0.1; +var damping = 0; var color = { red: 255, @@ -43,6 +43,7 @@ function draw(deltaTime) { var properties = { type: "Sphere", + script: "file:///Users/zappoman/Development/HiFi/hifi/examples/entityScripts/changeColorOnCollision.js", collisionsWillMove: true, position: startPosition, dimensions: {x: largeRadius, y: largeRadius, z: largeRadius}, @@ -84,6 +85,7 @@ function draw(deltaTime) { if (numberEntitiesAdded <= MAX_ENTITIES) { var properties = { type: "Sphere", + script: "file:///Users/zappoman/Development/HiFi/hifi/examples/entityScripts/changeColorOnCollision.js", collisionsWillMove: true, position: center, dimensions: {x: entitySize, y: entitySize, z: entitySize}, diff --git a/libraries/entities/src/EntityCollisionSystem.cpp b/libraries/entities/src/EntityCollisionSystem.cpp index f9a9ec733d..7669f73c7d 100644 --- a/libraries/entities/src/EntityCollisionSystem.cpp +++ b/libraries/entities/src/EntityCollisionSystem.cpp @@ -170,12 +170,6 @@ void EntityCollisionSystem::updateCollisionWithEntities(EntityItem* entityA) { quint64 now = usecTimestampNow(); - Collision collision; - collision.penetration = penetration; - // for now the contactPoint is the average between the the two paricle centers - collision.contactPoint = (0.5f * (float)TREE_SCALE) * (entityA->getPosition() + entityB->getPosition()); - emitGlobalEntityCollisionWithEntity(entityA, entityB, collision); - glm::vec3 axis = glm::normalize(penetration); glm::vec3 axialVelocity = glm::dot(relativeVelocity, axis) * axis; @@ -232,7 +226,13 @@ void EntityCollisionSystem::updateCollisionWithEntities(EntityItem* entityA) { // thereby waking up static non-moving entities. _entityTree->updateEntity(entityB, propertiesB); _packetSender->queueEditEntityMessage(PacketTypeEntityAddOrEdit, idB, propertiesB); - } + } + + // NOTE: Do this after updating the entities so that the callback can delete the entities if they want to + Collision collision; + collision.penetration = penetration; + collision.contactPoint = (0.5f * (float)TREE_SCALE) * (entityA->getPosition() + entityB->getPosition()); + emitGlobalEntityCollisionWithEntity(entityA, entityB, collision); } } } From 343f61044235e6df9e0dd49adbf797369739e353 Mon Sep 17 00:00:00 2001 From: Andrzej Kapolka Date: Mon, 8 Dec 2014 18:45:05 -0800 Subject: [PATCH 2/8] Use the 1450 limit everywhere, in case other places are running into the issue I experienced with metavoxels. --- libraries/metavoxels/src/DatagramSequencer.cpp | 2 +- libraries/networking/src/LimitedNodeList.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/libraries/metavoxels/src/DatagramSequencer.cpp b/libraries/metavoxels/src/DatagramSequencer.cpp index 5c5aee49c2..1aeef8e450 100644 --- a/libraries/metavoxels/src/DatagramSequencer.cpp +++ b/libraries/metavoxels/src/DatagramSequencer.cpp @@ -19,7 +19,7 @@ #include "MetavoxelMessages.h" // in sequencer parlance, a "packet" may consist of multiple datagrams. clarify when we refer to actual datagrams -const int MAX_DATAGRAM_SIZE = 1450; +const int MAX_DATAGRAM_SIZE = MAX_PACKET_SIZE; const int DEFAULT_MAX_PACKET_SIZE = 3000; diff --git a/libraries/networking/src/LimitedNodeList.h b/libraries/networking/src/LimitedNodeList.h index 2fc8751e3f..f367cb93ce 100644 --- a/libraries/networking/src/LimitedNodeList.h +++ b/libraries/networking/src/LimitedNodeList.h @@ -31,7 +31,7 @@ #include "DomainHandler.h" #include "Node.h" -const int MAX_PACKET_SIZE = 1500; +const int MAX_PACKET_SIZE = 1450; const quint64 NODE_SILENCE_THRESHOLD_MSECS = 2 * 1000; From 895e22fcdbe8aa6e24cb5477693df54bfcff2035 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Tue, 9 Dec 2014 12:12:04 -0800 Subject: [PATCH 3/8] removed debug code --- examples/collidingEntities.js | 2 -- 1 file changed, 2 deletions(-) diff --git a/examples/collidingEntities.js b/examples/collidingEntities.js index fff41ab65d..233626df23 100644 --- a/examples/collidingEntities.js +++ b/examples/collidingEntities.js @@ -43,7 +43,6 @@ function draw(deltaTime) { var properties = { type: "Sphere", - script: "file:///Users/zappoman/Development/HiFi/hifi/examples/entityScripts/changeColorOnCollision.js", collisionsWillMove: true, position: startPosition, dimensions: {x: largeRadius, y: largeRadius, z: largeRadius}, @@ -85,7 +84,6 @@ function draw(deltaTime) { if (numberEntitiesAdded <= MAX_ENTITIES) { var properties = { type: "Sphere", - script: "file:///Users/zappoman/Development/HiFi/hifi/examples/entityScripts/changeColorOnCollision.js", collisionsWillMove: true, position: center, dimensions: {x: entitySize, y: entitySize, z: entitySize}, From 5fb9905186ba3ce1042ec7ae67cb50211df119b0 Mon Sep 17 00:00:00 2001 From: Andrzej Kapolka Date: Tue, 9 Dec 2014 12:14:21 -0800 Subject: [PATCH 4/8] Rather than reducing rate on first drop, wait until three consecutive packets have been dropped. --- .../metavoxels/src/DatagramSequencer.cpp | 20 +++++++++++++------ libraries/metavoxels/src/DatagramSequencer.h | 2 ++ 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/libraries/metavoxels/src/DatagramSequencer.cpp b/libraries/metavoxels/src/DatagramSequencer.cpp index 1aeef8e450..65d548ba1c 100644 --- a/libraries/metavoxels/src/DatagramSequencer.cpp +++ b/libraries/metavoxels/src/DatagramSequencer.cpp @@ -45,7 +45,8 @@ DatagramSequencer::DatagramSequencer(const QByteArray& datagramHeader, QObject* _packetsToWrite(0.0f), _slowStartThreshold(DEFAULT_SLOW_START_THRESHOLD), _packetRateIncreasePacketNumber(0), - _packetRateDecreasePacketNumber(0) { + _packetRateDecreasePacketNumber(0), + _packetDropCount(0) { _outgoingPacketStream.setByteOrder(QDataStream::LittleEndian); _incomingDatagramStream.setByteOrder(QDataStream::LittleEndian); @@ -348,11 +349,18 @@ void DatagramSequencer::sendRecordLost(const SendRecord& record) { } } - // halve the rate and remember as threshold - if (record.packetNumber >= _packetRateDecreasePacketNumber) { - _packetsPerGroup = qMax(_packetsPerGroup * 0.5f, 1.0f); - _slowStartThreshold = _packetsPerGroup; - _packetRateDecreasePacketNumber = _outgoingPacketNumber + 1; + // if we've lost three in a row, halve the rate and remember as threshold + if (_packetDropCount == 0 || record.packetNumber == _lastPacketDropped + 1) { + _packetDropCount++; + _lastPacketDropped = record.packetNumber; + const int CONSECUTIVE_DROPS_BEFORE_REDUCTION = 3; + if (_packetDropCount >= CONSECUTIVE_DROPS_BEFORE_REDUCTION && record.packetNumber >= _packetRateDecreasePacketNumber) { + _packetsPerGroup = qMax(_packetsPerGroup * 0.5f, 1.0f); + _slowStartThreshold = _packetsPerGroup; + _packetRateDecreasePacketNumber = _outgoingPacketNumber + 1; + } + } else { + _packetDropCount = 0; } } diff --git a/libraries/metavoxels/src/DatagramSequencer.h b/libraries/metavoxels/src/DatagramSequencer.h index 02fbd0f365..d3d37f2621 100644 --- a/libraries/metavoxels/src/DatagramSequencer.h +++ b/libraries/metavoxels/src/DatagramSequencer.h @@ -238,6 +238,8 @@ private: float _slowStartThreshold; int _packetRateIncreasePacketNumber; int _packetRateDecreasePacketNumber; + int _packetDropCount; + int _lastPacketDropped; QHash _reliableOutputChannels; QHash _reliableInputChannels; From a63d0e77707a87c0aaeac9cda3254a6ec3c7e775 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Tue, 9 Dec 2014 08:58:52 -0800 Subject: [PATCH 5/8] Rename newEditEntities.js to editEntities.js --- examples/{newEditEntities.js => editEntities.js} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename examples/{newEditEntities.js => editEntities.js} (100%) diff --git a/examples/newEditEntities.js b/examples/editEntities.js similarity index 100% rename from examples/newEditEntities.js rename to examples/editEntities.js From ec62c6833cf84eff41d4b79e527cd36e95840f9f Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Tue, 9 Dec 2014 08:59:11 -0800 Subject: [PATCH 6/8] Make editEntities a default script and remove editVoxels.js --- examples/defaultScripts.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/examples/defaultScripts.js b/examples/defaultScripts.js index b655c25b27..dbd8ee18d9 100644 --- a/examples/defaultScripts.js +++ b/examples/defaultScripts.js @@ -9,8 +9,7 @@ // Script.load("lookWithTouch.js"); -Script.load("editVoxels.js"); -Script.load("editModels.js"); +Script.load("editEntities.js"); Script.load("selectAudioDevice.js"); Script.load("hydraMove.js"); Script.load("headMove.js"); From 426517b072322a0fc68d46a956e8224372a91f26 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Tue, 9 Dec 2014 17:11:01 -0800 Subject: [PATCH 7/8] fix a bug in MovingEntitiesOperator that would sometimes leave dangling entities --- libraries/entities/src/EntityItem.h | 3 --- libraries/entities/src/EntitySimulation.cpp | 1 - libraries/entities/src/EntityTree.cpp | 2 -- .../entities/src/MovingEntitiesOperator.cpp | 19 +------------------ .../entities/src/MovingEntitiesOperator.h | 2 -- 5 files changed, 1 insertion(+), 26 deletions(-) diff --git a/libraries/entities/src/EntityItem.h b/libraries/entities/src/EntityItem.h index 915440ee6a..d5a4689657 100644 --- a/libraries/entities/src/EntityItem.h +++ b/libraries/entities/src/EntityItem.h @@ -227,8 +227,6 @@ public: float getSize() const; /// get maximum dimension in domain scale units (0.0 - 1.0) AACube getMaximumAACube() const; AACube getMinimumAACube() const; - AACube getOldMaximumAACube() const { return _oldMaximumAACube; } - void setOldMaximumAACube(const AACube& cube) { _oldMaximumAACube = cube; } AABox getAABox() const; /// axis aligned bounding box in domain scale units (0.0 - 1.0) static const QString DEFAULT_SCRIPT; @@ -347,7 +345,6 @@ protected: void setRadius(float value); AACubeShape _collisionShape; - AACube _oldMaximumAACube; // remember this so we know where the entity used to live in the tree // DirtyFlags are set whenever a property changes that the EntitySimulation needs to know about. uint32_t _dirtyFlags; // things that have changed from EXTERNAL changes (via script or packet) but NOT from simulation diff --git a/libraries/entities/src/EntitySimulation.cpp b/libraries/entities/src/EntitySimulation.cpp index 223df588d5..6d3b81715d 100644 --- a/libraries/entities/src/EntitySimulation.cpp +++ b/libraries/entities/src/EntitySimulation.cpp @@ -106,7 +106,6 @@ void EntitySimulation::sortEntitiesThatMoved() { if (moveOperator.hasMovingEntities()) { PerformanceTimer perfTimer("recurseTreeWithOperator"); _entityTree->recurseTreeWithOperator(&moveOperator); - moveOperator.finish(); } } diff --git a/libraries/entities/src/EntityTree.cpp b/libraries/entities/src/EntityTree.cpp index 48ea2b7c07..17178ccbed 100644 --- a/libraries/entities/src/EntityTree.cpp +++ b/libraries/entities/src/EntityTree.cpp @@ -83,7 +83,6 @@ EntityItem* EntityTree::getOrCreateEntityItem(const EntityItemID& entityID, cons /// Adds a new entity item to the tree void EntityTree::postAddEntity(EntityItem* entity) { assert(entity); - entity->setOldMaximumAACube(entity->getMaximumAACube()); // check to see if we need to simulate this entity.. if (_simulation) { _simulation->addEntity(entity); @@ -138,7 +137,6 @@ bool EntityTree::updateEntityWithElement(EntityItem* entity, const EntityItemPro UpdateEntityOperator theOperator(this, containingElement, entity, properties); recurseTreeWithOperator(&theOperator); - entity->setOldMaximumAACube(entity->getMaximumAACube()); _isDirty = true; if (_simulation && entity->getDirtyFlags() != 0) { diff --git a/libraries/entities/src/MovingEntitiesOperator.cpp b/libraries/entities/src/MovingEntitiesOperator.cpp index 86b8de7b10..1ec67967b6 100644 --- a/libraries/entities/src/MovingEntitiesOperator.cpp +++ b/libraries/entities/src/MovingEntitiesOperator.cpp @@ -52,14 +52,10 @@ MovingEntitiesOperator::~MovingEntitiesOperator() { void MovingEntitiesOperator::addEntityToMoveList(EntityItem* entity, const AACube& newCube) { EntityTreeElement* oldContainingElement = _tree->getContainingElement(entity->getEntityItemID()); AABox newCubeClamped = newCube.clamp(0.0f, 1.0f); - AACube oldCube = entity->getOldMaximumAACube(); - AABox oldCubeClamped = oldCube.clamp(0.0f, 1.0f); if (_wantDebug) { qDebug() << "MovingEntitiesOperator::addEntityToMoveList() -----------------------------"; - qDebug() << " oldCube:" << oldCube; qDebug() << " newCube:" << newCube; - qDebug() << " oldCubeClamped:" << oldCubeClamped; qDebug() << " newCubeClamped:" << newCubeClamped; if (oldContainingElement) { qDebug() << " oldContainingElement:" << oldContainingElement->getAACube(); @@ -86,9 +82,7 @@ void MovingEntitiesOperator::addEntityToMoveList(EntityItem* entity, const AACub details.entity = entity; details.oldFound = false; details.newFound = false; - details.oldCube = oldCube; details.newCube = newCube; - details.oldCubeClamped = oldCubeClamped; details.newCubeClamped = newCubeClamped; _entitiesToMove << details; _lookingCount++; @@ -97,7 +91,6 @@ void MovingEntitiesOperator::addEntityToMoveList(EntityItem* entity, const AACub qDebug() << "MovingEntitiesOperator::addEntityToMoveList() -----------------------------"; qDebug() << " details.entity:" << details.entity->getEntityItemID(); qDebug() << " details.oldContainingElementCube:" << details.oldContainingElementCube; - qDebug() << " details.oldCube:" << details.oldCube; qDebug() << " details.newCube:" << details.newCube; qDebug() << " details.newCubeClamped:" << details.newCubeClamped; qDebug() << " _lookingCount:" << _lookingCount; @@ -130,17 +123,14 @@ bool MovingEntitiesOperator::shouldRecurseSubTree(OctreeElement* element) { qDebug() << " element:" << element->getAACube(); qDebug() << " details.entity:" << details.entity->getEntityItemID(); qDebug() << " details.oldContainingElementCube:" << details.oldContainingElementCube; - qDebug() << " details.oldCube:" << details.oldCube; qDebug() << " details.newCube:" << details.newCube; qDebug() << " details.newCubeClamped:" << details.newCubeClamped; - qDebug() << " elementCube.contains(details.oldCube)" << elementCube.contains(details.oldCube); qDebug() << " elementCube.contains(details.newCube)" << elementCube.contains(details.newCube); - qDebug() << " elementCube.contains(details.oldCubeClamped)" << elementCube.contains(details.oldCubeClamped); qDebug() << " elementCube.contains(details.newCubeClamped)" << elementCube.contains(details.newCubeClamped); qDebug() << "--------------------------------------------------------------------------"; } - if (elementCube.contains(details.oldCubeClamped) || elementCube.contains(details.newCubeClamped)) { + if (elementCube.contains(details.oldContainingElementCube) || elementCube.contains(details.newCubeClamped)) { containsEntity = true; break; // if it contains at least one, we're good to go } @@ -179,7 +169,6 @@ bool MovingEntitiesOperator::preRecursion(OctreeElement* element) { qDebug() << " details.entity:" << details.entity->getEntityItemID(); qDebug() << " details.oldContainingElementCube:" << details.oldContainingElementCube; qDebug() << " entityTreeElement:" << entityTreeElement; - qDebug() << " details.oldCube:" << details.oldCube; qDebug() << " details.newCube:" << details.newCube; qDebug() << " details.newCubeClamped:" << details.newCubeClamped; qDebug() << " _lookingCount:" << _lookingCount; @@ -291,9 +280,3 @@ OctreeElement* MovingEntitiesOperator::possiblyCreateChildAt(OctreeElement* elem } return NULL; } - -void MovingEntitiesOperator::finish() { - foreach(const EntityToMoveDetails& details, _entitiesToMove) { - details.entity->setOldMaximumAACube(details.newCube); - } -} diff --git a/libraries/entities/src/MovingEntitiesOperator.h b/libraries/entities/src/MovingEntitiesOperator.h index bddf5da450..fefda3328e 100644 --- a/libraries/entities/src/MovingEntitiesOperator.h +++ b/libraries/entities/src/MovingEntitiesOperator.h @@ -17,7 +17,6 @@ public: EntityItem* entity; AACube oldCube; AACube newCube; - AABox oldCubeClamped; AABox newCubeClamped; EntityTreeElement* oldContainingElement; AACube oldContainingElementCube; @@ -43,7 +42,6 @@ public: virtual bool postRecursion(OctreeElement* element); virtual OctreeElement* possiblyCreateChildAt(OctreeElement* element, int childIndex); bool hasMovingEntities() const { return _entitiesToMove.size() > 0; } - void finish(); private: EntityTree* _tree; QSet _entitiesToMove; From 96c3a0edbd5455b6709320b14d9efa1091608fda Mon Sep 17 00:00:00 2001 From: Philip Rosedale Date: Tue, 9 Dec 2014 17:39:05 -0800 Subject: [PATCH 8/8] option to suppress lobby text for now, defaults to true --- examples/lobby.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/examples/lobby.js b/examples/lobby.js index 9e454eccc9..4ab2841c0e 100644 --- a/examples/lobby.js +++ b/examples/lobby.js @@ -15,6 +15,7 @@ var panelWall = false; var orbShell = false; var reticle = false; var descriptionText = false; +var showText = false; // used for formating the description text, in meters var textWidth = 4; @@ -312,7 +313,7 @@ function handleLookAt(pickRay) { var actionLocation = locations[panelIndex]; if (actionLocation.description == "") { - Overlays.editOverlay(descriptionText, { text: actionLocation.name, visible: true }); + Overlays.editOverlay(descriptionText, { text: actionLocation.name, visible: showText }); } else { // handle line wrapping var allWords = actionLocation.description.split(" "); @@ -344,7 +345,7 @@ function handleLookAt(pickRay) { } } formatedDescription += currentGoodLine; - Overlays.editOverlay(descriptionText, { text: formatedDescription, visible: true }); + Overlays.editOverlay(descriptionText, { text: formatedDescription, visible: showText }); } } else { Overlays.editOverlay(descriptionText, { text: "", visible: false });