From de6db6f0cd1639ae2e936e7655b17539f08a128c Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Tue, 29 May 2018 16:18:07 -0700 Subject: [PATCH 1/9] remove confusing sandbox content update/backup system --- server-console/src/main.js | 106 ------------------------------------- 1 file changed, 106 deletions(-) diff --git a/server-console/src/main.js b/server-console/src/main.js index b08db6222f..aa0fc8eff6 100644 --- a/server-console/src/main.js +++ b/server-console/src/main.js @@ -436,13 +436,6 @@ var labels = { logWindow.open(); } }, - restoreBackup: { - label: 'Restore Backup Instructions', - click: function() { - var folder = getRootHifiDataDirectory() + "/Server Backup"; - openBackupInstructions(folder); - } - }, share: { label: 'Share', click: function() { @@ -478,7 +471,6 @@ function buildMenuArray(serverState) { menuArray.push(labels.stopServer); menuArray.push(labels.settings); menuArray.push(labels.viewLogs); - menuArray.push(labels.restoreBackup); menuArray.push(separator); menuArray.push(labels.share); menuArray.push(separator); @@ -545,103 +537,6 @@ function backupResourceDirectories(folder) { } } -function openBackupInstructions(folder) { - // Explain user how to restore server - var window = new BrowserWindow({ - icon: appIcon, - width: 800, - height: 520, - }); - window.loadURL('file://' + __dirname + '/content-update.html'); - if (!debug) { - window.setMenu(null); - } - window.show(); - - electron.ipcMain.on('setSize', function(event, obj) { - window.setSize(obj.width, obj.height); - }); - electron.ipcMain.on('ready', function() { - log.debug("got ready"); - window.webContents.send('update', folder); - }); -} -function backupResourceDirectoriesAndRestart() { - homeServer.stop(); - - var folder = getRootHifiDataDirectory() + "/Server Backup - " + Date.now(); - if (backupResourceDirectories(folder)) { - maybeInstallDefaultContentSet(onContentLoaded); - openBackupInstructions(folder); - } else { - dialog.showMessageBox({ - type: 'warning', - buttons: ['Ok'], - title: 'Update Error', - message: 'There was an error updating the content, aborting.' - }, function() {}); - } -} - -function checkNewContent() { - if (argv.noUpdater) { - return; - } - - // Start downloading content set - var req = request.head({ - url: HOME_CONTENT_URL - }, function (error, response, body) { - if (error === null) { - var localContent = Date.parse(userConfig.get('homeContentLastModified')); - var remoteContent = Date.parse(response.headers['last-modified']); - - var shouldUpdate = isNaN(localContent) || (!isNaN(remoteContent) && (remoteContent > localContent)); - - var wantDebug = false; - if (wantDebug) { - log.debug('Last Modified: ' + response.headers['last-modified']); - log.debug(localContent + " " + remoteContent + " " + shouldUpdate + " " + new Date()); - log.debug("Remote content is " + (shouldUpdate ? "newer" : "older") + " that local content."); - } - - if (shouldUpdate) { - dialog.showMessageBox({ - type: 'question', - buttons: ['Yes', 'No'], - defaultId: 1, - cancelId: 1, - title: 'High Fidelity Sandbox', - message: 'A newer version of the home content set is available.\nDo you wish to update?', - noLink: true, - }, function(idx) { - if (idx === 0) { - dialog.showMessageBox({ - type: 'warning', - buttons: ['Yes', 'No'], - defaultId: 1, - cancelId: 1, - title: 'Are you sure?', - message: 'Updating with the new content will remove all your current content and settings and place them in a backup folder.\nAre you sure?', - noLink: true, - }, function(idx) { - if (idx === 0) { - backupResourceDirectoriesAndRestart(); - } - }); - } else { - // They don't want to update, mark content set as current - userConfig.set('homeContentLastModified', new Date()); - userConfig.save(configPath); - } - }); - } else if (fs.existsSync(UPDATER_LOCK_FULL_PATH)) { - backupResourceDirectoriesAndRestart(); - } - } - }); -} - function removeIncompleteUpdate(acResourceDirectory, dsResourceDirectory) { if (fs.existsSync(UPDATER_LOCK_FULL_PATH)) { log.debug('Removing incomplete content update files before copying new update'); @@ -684,7 +579,6 @@ function maybeInstallDefaultContentSet(onComplete) { log.debug("User has existing data, suppressing downloader"); onComplete(); - checkNewContent(); return; } From e7e9ca4b2bfa22f496fd68d178bc8eeefdf14de7 Mon Sep 17 00:00:00 2001 From: Bradley Austin Davis Date: Tue, 5 Jun 2018 14:16:03 -0700 Subject: [PATCH 2/9] Disable chromium distance field text rendering on ATI GPUs --- interface/src/Application.cpp | 92 ++++++++++++++++++++--------------- 1 file changed, 54 insertions(+), 38 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index cbe713127d..1a31234100 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -2614,10 +2614,55 @@ void Application::initializeGL() { _isGLInitialized = true; } - _glWidget->makeCurrent(); - glClearColor(0.2f, 0.2f, 0.2f, 1); - glClear(GL_COLOR_BUFFER_BIT); - _glWidget->swapBuffers(); + if (!_glWidget->makeCurrent()) { + qCWarning(interfaceapp, "Unable to make window context current"); + } + +#if !defined(DISABLE_QML) + // Build a shared canvas / context for the Chromium processes + { + // Disable signed distance field font rendering on ATI/AMD GPUs, due to + // https://highfidelity.manuscript.com/f/cases/13677/Text-showing-up-white-on-Marketplace-app + std::string vendor{ (const char*)glGetString(GL_VENDOR) }; + if ((vendor.find("AMD") != std::string::npos) || (vendor.find("ATI") != std::string::npos)) { + qputenv("QTWEBENGINE_CHROMIUM_FLAGS", QByteArray("--disable-distance-field-text")); + } + + // Chromium rendering uses some GL functions that prevent nSight from capturing + // frames, so we only create the shared context if nsight is NOT active. + if (!nsightActive()) { + _chromiumShareContext = new OffscreenGLCanvas(); + _chromiumShareContext->setObjectName("ChromiumShareContext"); + _chromiumShareContext->create(_glWidget->qglContext()); + if (!_chromiumShareContext->makeCurrent()) { + qCWarning(interfaceapp, "Unable to make chromium shared context current"); + } + qt_gl_set_global_share_context(_chromiumShareContext->getContext()); + _chromiumShareContext->doneCurrent(); + // Restore the GL widget context + if (!_glWidget->makeCurrent()) { + qCWarning(interfaceapp, "Unable to make window context current"); + } + } else { + qCWarning(interfaceapp) << "nSight detected, disabling chrome rendering"; + } + } +#endif + + // Build a shared canvas / context for the QML rendering + { + _qmlShareContext = new OffscreenGLCanvas(); + _qmlShareContext->setObjectName("QmlShareContext"); + _qmlShareContext->create(_glWidget->qglContext()); + if (!_qmlShareContext->makeCurrent()) { + qCWarning(interfaceapp, "Unable to make QML shared context current"); + } + OffscreenQmlSurface::setSharedContext(_qmlShareContext->getContext()); + _qmlShareContext->doneCurrent(); + if (!_glWidget->makeCurrent()) { + qCWarning(interfaceapp, "Unable to make window context current"); + } + } // Build an offscreen GL context for the main thread. _offscreenContext = new OffscreenGLCanvas(); @@ -2629,6 +2674,11 @@ void Application::initializeGL() { _offscreenContext->doneCurrent(); _offscreenContext->setThreadContext(); + _glWidget->makeCurrent(); + glClearColor(0.2f, 0.2f, 0.2f, 1); + glClear(GL_COLOR_BUFFER_BIT); + _glWidget->swapBuffers(); + // Move the GL widget context to the render event handler thread _renderEventHandler = new RenderEventHandler(_glWidget->qglContext()); if (!_offscreenContext->makeCurrent()) { @@ -2751,40 +2801,6 @@ extern void setupPreferences(); static void addDisplayPluginToMenu(const DisplayPluginPointer& displayPlugin, int index, bool active = false); void Application::initializeUi() { - // Build a shared canvas / context for the Chromium processes -#if !defined(DISABLE_QML) - // Chromium rendering uses some GL functions that prevent nSight from capturing - // frames, so we only create the shared context if nsight is NOT active. - if (!nsightActive()) { - _chromiumShareContext = new OffscreenGLCanvas(); - _chromiumShareContext->setObjectName("ChromiumShareContext"); - _chromiumShareContext->create(_offscreenContext->getContext()); - if (!_chromiumShareContext->makeCurrent()) { - qCWarning(interfaceapp, "Unable to make chromium shared context current"); - } - qt_gl_set_global_share_context(_chromiumShareContext->getContext()); - _chromiumShareContext->doneCurrent(); - // Restore the GL widget context - _offscreenContext->makeCurrent(); - } else { - qCWarning(interfaceapp) << "nSIGHT detected, disabling chrome rendering"; - } -#endif - - // Build a shared canvas / context for the QML rendering - _qmlShareContext = new OffscreenGLCanvas(); - _qmlShareContext->setObjectName("QmlShareContext"); - _qmlShareContext->create(_offscreenContext->getContext()); - if (!_qmlShareContext->makeCurrent()) { - qCWarning(interfaceapp, "Unable to make QML shared context current"); - } - OffscreenQmlSurface::setSharedContext(_qmlShareContext->getContext()); - _qmlShareContext->doneCurrent(); - // Restore the GL widget context - _offscreenContext->makeCurrent(); - // Make sure all QML surfaces share the main thread GL context - OffscreenQmlSurface::setSharedContext(_offscreenContext->getContext()); - AddressBarDialog::registerType(); ErrorDialog::registerType(); LoginDialog::registerType(); From df0ecb44a89357858119ba0464da66b35f4512ce Mon Sep 17 00:00:00 2001 From: howard-stearns Date: Thu, 7 Jun 2018 11:49:56 -0700 Subject: [PATCH 3/9] fix crash setting model texture (cherry picked from commit b152bf02af4eb17cf5c169ca9c577154c83901f7) --- libraries/render-utils/src/Model.cpp | 13 ++++++------- libraries/render-utils/src/Model.h | 2 +- 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/libraries/render-utils/src/Model.cpp b/libraries/render-utils/src/Model.cpp index 7cfb1f6bc8..9bf6c31784 100644 --- a/libraries/render-utils/src/Model.cpp +++ b/libraries/render-utils/src/Model.cpp @@ -1074,15 +1074,11 @@ int Model::getLastFreeJointIndex(int jointIndex) const { void Model::setTextures(const QVariantMap& textures) { if (isLoaded()) { - _needsUpdateTextures = true; + _pendingTextures.clear(); _needsFixupInScene = true; _renderGeometry->setTextures(textures); } else { - // FIXME(Huffman): Disconnect previously connected lambdas so we don't set textures multiple - // after the geometry has finished loading. - connect(&_renderWatcher, &GeometryResourceWatcher::finished, this, [this, textures]() { - _renderGeometry->setTextures(textures); - }); + _pendingTextures = textures; } } @@ -1106,7 +1102,8 @@ void Model::setURL(const QUrl& url) { } _needsReload = true; - _needsUpdateTextures = true; + // One might be tempted to _pendingTextures.clear(), thinking that a new URL means an old texture doesn't apply. + // But sometimes, particularly when first setting the values, the texture might be set first. So let's not clear here. _visualGeometryRequestFailed = false; _needsFixupInScene = true; invalidCalculatedMeshBoxes(); @@ -1123,6 +1120,8 @@ void Model::setURL(const QUrl& url) { void Model::loadURLFinished(bool success) { if (!success) { _visualGeometryRequestFailed = true; + } else if (!_pendingTextures.empty()) { + setTextures(_pendingTextures); } emit setURLFinished(success); } diff --git a/libraries/render-utils/src/Model.h b/libraries/render-utils/src/Model.h index 4180288106..67e6d178ea 100644 --- a/libraries/render-utils/src/Model.h +++ b/libraries/render-utils/src/Model.h @@ -457,7 +457,7 @@ protected: bool _needsFixupInScene { true }; // needs to be removed/re-added to scene bool _needsReload { true }; bool _needsUpdateClusterMatrices { true }; - mutable bool _needsUpdateTextures { true }; + QVariantMap _pendingTextures { }; friend class ModelMeshPartPayload; Rig _rig; From 448a522b7047c6a98fdb7efc8ab0cb00b35adb34 Mon Sep 17 00:00:00 2001 From: Zach Fox Date: Thu, 7 Jun 2018 13:29:33 -0700 Subject: [PATCH 4/9] MS15673: Do some experiments on bubble size --- assignment-client/src/audio/AudioMixerClientData.cpp | 3 ++- assignment-client/src/avatars/AvatarMixerSlave.cpp | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/assignment-client/src/audio/AudioMixerClientData.cpp b/assignment-client/src/audio/AudioMixerClientData.cpp index d4d4f847ee..0ac28c5e70 100644 --- a/assignment-client/src/audio/AudioMixerClientData.cpp +++ b/assignment-client/src/audio/AudioMixerClientData.cpp @@ -625,7 +625,8 @@ AudioMixerClientData::IgnoreZone& AudioMixerClientData::IgnoreZoneMemo::get(unsi } // quadruple the scale (this is arbitrary number chosen for comfort) - const float IGNORE_BOX_SCALE_FACTOR = 4.0f; + // For testing purposes, this number isn't 4.0f. + const float IGNORE_BOX_SCALE_FACTOR = 2.4f; scale *= IGNORE_BOX_SCALE_FACTOR; // create the box (we use a box for the zone for convenience) diff --git a/assignment-client/src/avatars/AvatarMixerSlave.cpp b/assignment-client/src/avatars/AvatarMixerSlave.cpp index 984884adb2..00465f9412 100644 --- a/assignment-client/src/avatars/AvatarMixerSlave.cpp +++ b/assignment-client/src/avatars/AvatarMixerSlave.cpp @@ -272,7 +272,7 @@ void AvatarMixerSlave::broadcastAvatarDataToAgent(const SharedNodePointer& node) otherNodeBox.setScaleStayCentered(minBubbleSize); } // Quadruple the scale of both bounding boxes - otherNodeBox.embiggen(4.0f); + otherNodeBox.embiggen(2.4f); // Perform the collision check between the two bounding boxes if (nodeBox.touches(otherNodeBox)) { From f7de3cf218d50eb106179a7d7ee69c4626795731 Mon Sep 17 00:00:00 2001 From: Zach Fox Date: Thu, 7 Jun 2018 14:45:33 -0700 Subject: [PATCH 5/9] Try a value of 1.8 --- assignment-client/src/audio/AudioMixerClientData.cpp | 2 +- assignment-client/src/avatars/AvatarMixerSlave.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/assignment-client/src/audio/AudioMixerClientData.cpp b/assignment-client/src/audio/AudioMixerClientData.cpp index 0ac28c5e70..08bbf5dc55 100644 --- a/assignment-client/src/audio/AudioMixerClientData.cpp +++ b/assignment-client/src/audio/AudioMixerClientData.cpp @@ -626,7 +626,7 @@ AudioMixerClientData::IgnoreZone& AudioMixerClientData::IgnoreZoneMemo::get(unsi // quadruple the scale (this is arbitrary number chosen for comfort) // For testing purposes, this number isn't 4.0f. - const float IGNORE_BOX_SCALE_FACTOR = 2.4f; + const float IGNORE_BOX_SCALE_FACTOR = 1.8f; scale *= IGNORE_BOX_SCALE_FACTOR; // create the box (we use a box for the zone for convenience) diff --git a/assignment-client/src/avatars/AvatarMixerSlave.cpp b/assignment-client/src/avatars/AvatarMixerSlave.cpp index 00465f9412..cadc65edb1 100644 --- a/assignment-client/src/avatars/AvatarMixerSlave.cpp +++ b/assignment-client/src/avatars/AvatarMixerSlave.cpp @@ -272,7 +272,7 @@ void AvatarMixerSlave::broadcastAvatarDataToAgent(const SharedNodePointer& node) otherNodeBox.setScaleStayCentered(minBubbleSize); } // Quadruple the scale of both bounding boxes - otherNodeBox.embiggen(2.4f); + otherNodeBox.embiggen(1.8f); // Perform the collision check between the two bounding boxes if (nodeBox.touches(otherNodeBox)) { From 76b5dae72185bba0f44bf1899b79eb67ebd18356 Mon Sep 17 00:00:00 2001 From: Zach Fox Date: Fri, 8 Jun 2018 10:19:55 -0700 Subject: [PATCH 6/9] Let's try 20% --- assignment-client/src/audio/AudioMixerClientData.cpp | 2 +- assignment-client/src/avatars/AvatarMixerSlave.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/assignment-client/src/audio/AudioMixerClientData.cpp b/assignment-client/src/audio/AudioMixerClientData.cpp index 08bbf5dc55..a552799933 100644 --- a/assignment-client/src/audio/AudioMixerClientData.cpp +++ b/assignment-client/src/audio/AudioMixerClientData.cpp @@ -626,7 +626,7 @@ AudioMixerClientData::IgnoreZone& AudioMixerClientData::IgnoreZoneMemo::get(unsi // quadruple the scale (this is arbitrary number chosen for comfort) // For testing purposes, this number isn't 4.0f. - const float IGNORE_BOX_SCALE_FACTOR = 1.8f; + const float IGNORE_BOX_SCALE_FACTOR = 0.8f; scale *= IGNORE_BOX_SCALE_FACTOR; // create the box (we use a box for the zone for convenience) diff --git a/assignment-client/src/avatars/AvatarMixerSlave.cpp b/assignment-client/src/avatars/AvatarMixerSlave.cpp index cadc65edb1..fa81ceb546 100644 --- a/assignment-client/src/avatars/AvatarMixerSlave.cpp +++ b/assignment-client/src/avatars/AvatarMixerSlave.cpp @@ -272,7 +272,7 @@ void AvatarMixerSlave::broadcastAvatarDataToAgent(const SharedNodePointer& node) otherNodeBox.setScaleStayCentered(minBubbleSize); } // Quadruple the scale of both bounding boxes - otherNodeBox.embiggen(1.8f); + otherNodeBox.embiggen(0.8f); // Perform the collision check between the two bounding boxes if (nodeBox.touches(otherNodeBox)) { From 310e2ee0633c28adaed2622da52ddc7a81fe5b3e Mon Sep 17 00:00:00 2001 From: SamGondelman Date: Fri, 8 Jun 2018 13:56:21 -0700 Subject: [PATCH 7/9] attempt to fix first time model overlay loading --- interface/src/ui/overlays/ModelOverlay.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/interface/src/ui/overlays/ModelOverlay.cpp b/interface/src/ui/overlays/ModelOverlay.cpp index fbb5aae84c..897040d788 100644 --- a/interface/src/ui/overlays/ModelOverlay.cpp +++ b/interface/src/ui/overlays/ModelOverlay.cpp @@ -123,6 +123,9 @@ void ModelOverlay::update(float deltatime) { if (!_texturesLoaded && _model->getGeometry() && _model->getGeometry()->areTexturesLoaded()) { _texturesLoaded = true; + if (!_modelTextures.isEmpty()) { + _model->setTextures(_modelTextures); + } _model->updateRenderItems(); } } @@ -221,8 +224,7 @@ void ModelOverlay::setProperties(const QVariantMap& properties) { if (texturesValue.isValid() && texturesValue.canConvert(QVariant::Map)) { _texturesLoaded = false; QVariantMap textureMap = texturesValue.toMap(); - QMetaObject::invokeMethod(_model.get(), "setTextures", Qt::AutoConnection, - Q_ARG(const QVariantMap&, textureMap)); + _modelTextures = textureMap; } auto groupCulledValue = properties["isGroupCulled"]; From 2dae6136127e8d54cfa465d55319731895f12ef5 Mon Sep 17 00:00:00 2001 From: SamGondelman Date: Fri, 8 Jun 2018 17:58:06 -0700 Subject: [PATCH 8/9] remove conserveResources --- scripts/system/pal.js | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/scripts/system/pal.js b/scripts/system/pal.js index c70c2729f5..65b0ce7db4 100644 --- a/scripts/system/pal.js +++ b/scripts/system/pal.js @@ -40,7 +40,6 @@ var HOVER_TEXTURES = { var UNSELECTED_COLOR = { red: 0x1F, green: 0xC6, blue: 0xA6}; var SELECTED_COLOR = {red: 0xF3, green: 0x91, blue: 0x29}; var HOVER_COLOR = {red: 0xD0, green: 0xD0, blue: 0xD0}; // almost white for now -var conserveResources = true; Script.include("/~/system/libraries/controllers.js"); @@ -429,7 +428,7 @@ function addAvatarNode(id) { alpha: 0.8, color: color(selected, false, 0.0), ignoreRayIntersection: false - }, selected, !conserveResources); + }, selected, true); } // Each open/refresh will capture a stable set of avatarsOfInterest, within the specified filter. var avatarsOfInterest = {}; @@ -494,7 +493,6 @@ function populateNearbyUserList(selectData, oldAudioData) { print('PAL data:', JSON.stringify(avatarPalDatum)); }); getConnectionData(false, location.domainID); // Even admins don't get relationship data in requestUsernameFromID (which is still needed for admin status, which comes from domain). - conserveResources = Object.keys(avatarsOfInterest).length > 20; sendToQml({ method: 'nearbyUsers', params: data }); if (selectData) { selectData[2] = true; @@ -717,7 +715,7 @@ function onTabletScreenChanged(type, url) { ContextOverlay.enabled = false; Users.requestsDomainListData = true; - audioTimer = createAudioInterval(conserveResources ? AUDIO_LEVEL_CONSERVED_UPDATE_INTERVAL_MS : AUDIO_LEVEL_UPDATE_INTERVAL_MS); + audioTimer = createAudioInterval(AUDIO_LEVEL_UPDATE_INTERVAL_MS); tablet.tabletShownChanged.connect(tabletVisibilityChanged); Script.update.connect(updateOverlays); @@ -872,7 +870,6 @@ startup(); var isWired = false; var audioTimer; var AUDIO_LEVEL_UPDATE_INTERVAL_MS = 100; // 10hz for now (change this and change the AVERAGING_RATIO too) -var AUDIO_LEVEL_CONSERVED_UPDATE_INTERVAL_MS = 300; function off() { if (isWired) { Script.update.disconnect(updateOverlays); From 688d82b286cebba8c00c5126f3cd8b15f149f746 Mon Sep 17 00:00:00 2001 From: Zach Fox Date: Mon, 11 Jun 2018 13:23:41 -0700 Subject: [PATCH 9/9] Go back to 60% --- assignment-client/src/audio/AudioMixerClientData.cpp | 5 ++--- assignment-client/src/avatars/AvatarMixerSlave.cpp | 5 +++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/assignment-client/src/audio/AudioMixerClientData.cpp b/assignment-client/src/audio/AudioMixerClientData.cpp index a552799933..bc08c6f24a 100644 --- a/assignment-client/src/audio/AudioMixerClientData.cpp +++ b/assignment-client/src/audio/AudioMixerClientData.cpp @@ -624,9 +624,8 @@ AudioMixerClientData::IgnoreZone& AudioMixerClientData::IgnoreZoneMemo::get(unsi scale = MIN_IGNORE_BOX_SCALE; } - // quadruple the scale (this is arbitrary number chosen for comfort) - // For testing purposes, this number isn't 4.0f. - const float IGNORE_BOX_SCALE_FACTOR = 0.8f; + // (this is arbitrary number determined empirically for comfort) + const float IGNORE_BOX_SCALE_FACTOR = 2.4f; scale *= IGNORE_BOX_SCALE_FACTOR; // create the box (we use a box for the zone for convenience) diff --git a/assignment-client/src/avatars/AvatarMixerSlave.cpp b/assignment-client/src/avatars/AvatarMixerSlave.cpp index fa81ceb546..b6fe765287 100644 --- a/assignment-client/src/avatars/AvatarMixerSlave.cpp +++ b/assignment-client/src/avatars/AvatarMixerSlave.cpp @@ -271,8 +271,9 @@ void AvatarMixerSlave::broadcastAvatarDataToAgent(const SharedNodePointer& node) if (glm::any(glm::lessThan(otherNodeBoxScale, minBubbleSize))) { otherNodeBox.setScaleStayCentered(minBubbleSize); } - // Quadruple the scale of both bounding boxes - otherNodeBox.embiggen(0.8f); + // Change the scale of both bounding boxes + // (This is an arbitrary number determined empirically) + otherNodeBox.embiggen(2.4f); // Perform the collision check between the two bounding boxes if (nodeBox.touches(otherNodeBox)) {