From 42b2b2154eef3700e86f72a061d25f4b9972a00e Mon Sep 17 00:00:00 2001 From: howard-stearns Date: Tue, 10 Jan 2017 13:08:07 -0800 Subject: [PATCH 1/2] store audio level in overlay data object (so that they gc properly and we have the data to color with). --- scripts/system/pal.js | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/scripts/system/pal.js b/scripts/system/pal.js index c0450a0b94..1f37af63e2 100644 --- a/scripts/system/pal.js +++ b/scripts/system/pal.js @@ -422,7 +422,7 @@ var LOUDNESS_FLOOR = 11.0; var LOUDNESS_SCALE = 2.8 / 5.0; var LOG2 = Math.log(2.0); var AUDIO_LEVEL_UPDATE_INTERVAL_MS = 100; // 10hz for now (change this and change the AVERAGING_RATIO too) -var accumulatedLevels = {}; +var myData = {}; // we're not includied in ExtendedOverlay.get. function getAudioLevel(id) { // the VU meter should work similarly to the one in AvatarInputs: log scale, exponentially averaged @@ -430,13 +430,18 @@ function getAudioLevel(id) { // of updating (the latter for efficiency too). var avatar = AvatarList.getAvatar(id); var audioLevel = 0.0; + var data = id ? ExtendedOverlay.get(id) : myData; + if (!data) { + print('no data for', id); + return audioLevel; + } // we will do exponential moving average by taking some the last loudness and averaging - accumulatedLevels[id] = AVERAGING_RATIO * (accumulatedLevels[id] || 0) + (1 - AVERAGING_RATIO) * (avatar.audioLoudness); + data.accumulatedLevel = AVERAGING_RATIO * (data.accumulatedLevel || 0) + (1 - AVERAGING_RATIO) * (avatar.audioLoudness); // add 1 to insure we don't go log() and hit -infinity. Math.log is // natural log, so to get log base 2, just divide by ln(2). - var logLevel = Math.log(accumulatedLevels[id] + 1) / LOG2; + var logLevel = Math.log(data.accumulatedLevel + 1) / LOG2; if (logLevel <= LOUDNESS_FLOOR) { audioLevel = logLevel / LOUDNESS_FLOOR * LOUDNESS_SCALE; @@ -455,7 +460,7 @@ function getAudioLevel(id) { Script.setInterval(function () { if (pal.visible) { var param = {}; - AvatarList.getAvatarIdentifiers().sort().forEach(function (id) { + AvatarList.getAvatarIdentifiers().forEach(function (id) { var level = getAudioLevel(id); // qml didn't like an object with null/empty string for a key, so... var userId = id || 0; From e67675ac36f7e9dadebe6a8c1f20dbe78041ea9e Mon Sep 17 00:00:00 2001 From: howard-stearns Date: Tue, 10 Jan 2017 13:24:38 -0800 Subject: [PATCH 2/2] color nodes by audio level --- scripts/system/pal.js | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/scripts/system/pal.js b/scripts/system/pal.js index 1f37af63e2..f83b2b6796 100644 --- a/scripts/system/pal.js +++ b/scripts/system/pal.js @@ -58,8 +58,13 @@ ExtendedOverlay.prototype.editOverlay = function (properties) { // change displa Overlays.editOverlay(this.activeOverlay, properties); }; -function color(selected) { - return selected ? SELECTED_COLOR : UNSELECTED_COLOR; +function color(selected, level) { + var base = selected ? SELECTED_COLOR : UNSELECTED_COLOR; + function scale(component) { + var delta = 0xFF - component; + return component + (delta * level); + } + return {red: scale(base.red), green: scale(base.green), blue: scale(base.blue)}; } function textures(selected) { @@ -71,7 +76,7 @@ ExtendedOverlay.prototype.select = function (selected) { return; } - this.editOverlay({color: color(selected)}); + this.editOverlay({color: color(selected, this.audioLevel)}); if (this.model) { this.model.editOverlay({textures: textures(selected)}); } @@ -204,7 +209,7 @@ function addAvatarNode(id) { drawInFront: true, solid: true, alpha: 0.8, - color: color(selected), + color: color(selected, 0.0), ignoreRayIntersection: false}, selected, true); } function populateUserList() { @@ -288,6 +293,7 @@ function updateOverlays() { overlay.ping = pingPong; overlay.editOverlay({ + color: color(ExtendedOverlay.isSelected(id), overlay.audioLevel), position: target, dimensions: 0.032 * distance }); @@ -451,6 +457,7 @@ function getAudioLevel(id) { if (audioLevel > 1.0) { audioLevel = 1; } + data.audioLevel = audioLevel; return audioLevel; }