From 936a319e620d0b32aaeea70e9a4bce34f11a858f Mon Sep 17 00:00:00 2001 From: Cristian Luis Duarte Date: Wed, 9 May 2018 17:15:57 -0300 Subject: [PATCH 1/7] Android - First version of showing up avatars names upon touch. Brought back (transparent) overlays into render forward task. --- .../render-utils/src/RenderForwardTask.cpp | 19 ++- scripts/system/+android/displayNames.js | 160 ++++++++++++++++++ scripts/system/+android/modes.js | 1 + 3 files changed, 179 insertions(+), 1 deletion(-) create mode 100644 scripts/system/+android/displayNames.js diff --git a/libraries/render-utils/src/RenderForwardTask.cpp b/libraries/render-utils/src/RenderForwardTask.cpp index 63370109e0..c45e1dd4eb 100755 --- a/libraries/render-utils/src/RenderForwardTask.cpp +++ b/libraries/render-utils/src/RenderForwardTask.cpp @@ -21,6 +21,9 @@ #include +#include + +#include "AntialiasingEffect.h" #include "StencilMaskPass.h" #include "ZoneRenderer.h" #include "FadeEffect.h" @@ -54,12 +57,15 @@ void RenderForwardTask::build(JobModel& task, const render::Varying& input, rend // const auto& lights = items.get0()[RenderFetchCullSortTask::LIGHT]; const auto& metas = items.get0()[RenderFetchCullSortTask::META]; // const auto& overlayOpaques = items.get0()[RenderFetchCullSortTask::OVERLAY_OPAQUE_SHAPE]; - // const auto& overlayTransparents = items.get0()[RenderFetchCullSortTask::OVERLAY_TRANSPARENT_SHAPE]; + const auto& overlayTransparents = items.get0()[RenderFetchCullSortTask::OVERLAY_TRANSPARENT_SHAPE]; + //const auto& background = items.get0()[RenderFetchCullSortTask::BACKGROUND]; // const auto& spatialSelection = items[1]; fadeEffect->build(task, opaques); + const auto jitter = task.addJob("JitterCam"); + // Prepare objects shared by several jobs const auto deferredFrameTransform = task.addJob("DeferredFrameTransform"); const auto lightingModel = task.addJob("LightingModel"); @@ -75,6 +81,17 @@ void RenderForwardTask::build(JobModel& task, const render::Varying& input, rend // draw a stencil mask in hidden regions of the framebuffer. task.addJob("PrepareStencil", framebuffer); + // Layered Overlays + //const auto filteredOverlaysOpaque = task.addJob("FilterOverlaysLayeredOpaque", overlayOpaques, Item::LAYER_3D_FRONT); + const auto filteredOverlaysTransparent = task.addJob("FilterOverlaysLayeredTransparent", overlayTransparents, Item::LAYER_3D_FRONT); + //const auto overlaysInFrontOpaque = filteredOverlaysOpaque.getN(0); + const auto overlaysInFrontTransparent = filteredOverlaysTransparent.getN(0); + + //const auto overlayInFrontOpaquesInputs = DrawOverlay3D::Inputs(overlaysInFrontOpaque, lightingModel, jitter).asVarying(); + const auto overlayInFrontTransparentsInputs = DrawOverlay3D::Inputs(overlaysInFrontTransparent, lightingModel, jitter).asVarying(); + //task.addJob("DrawOverlayInFrontOpaque", overlayInFrontOpaquesInputs, true); + task.addJob("DrawOverlayInFrontTransparent", overlayInFrontTransparentsInputs, false); + // Draw opaques forward const auto opaqueInputs = DrawForward::Inputs(opaques, lightingModel).asVarying(); task.addJob("DrawOpaques", opaqueInputs, shapePlumber); diff --git a/scripts/system/+android/displayNames.js b/scripts/system/+android/displayNames.js new file mode 100644 index 0000000000..8ed2b35daf --- /dev/null +++ b/scripts/system/+android/displayNames.js @@ -0,0 +1,160 @@ +"use strict"; +// +// displayNames.js +// scripts/system/ +// +// Created by Cristian Duarte & Gabriel Calero on May 3, 2018 +// Copyright 2018 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 +// +(function() { // BEGIN LOCAL_SCOPE + +var MAX_DISTANCE_PX = 20; // Should we use dp instead? +var UNKNOWN_NAME = "Unknown"; +var METERS_ABOVE_HEAD = 0.4; + +var TEXT_LINE_HEIGHT = .1; +var TEXT_MARGIN = 0.025; + +var currentTouchToAnalize = null; +var rayExclusionList = []; + +var currentlyShownAvatar = { + avatarID: null, + avatar: null, + overlay: null +}; + +var logEnabled = false; + +function printd(str) { + if (logEnabled) { + print("[displayNames.js] " + str); + } +} + +function touchedAvatar(avatarID, avatarData) { + printd("[AVATARNAME] touchEnd FOUND " + JSON.stringify(avatarData)); + + // Case: touching an already selected avatar + if (currentlyShownAvatar.avatar && currentlyShownAvatar.avatarID == avatarID) { + currentlyShownAvatar.avatar = null; + if (currentlyShownAvatar.overlay) { + Overlays.editOverlay(currentlyShownAvatar.overlay, {visible: false}); + } + return; + } + + // Save currently selected avatar + currentlyShownAvatar.avatarID = avatarID; + currentlyShownAvatar.avatar = avatarData; + + if (currentlyShownAvatar.overlay == null) { + var over = Overlays.addOverlay("text3d", { + lineHeight: TEXT_LINE_HEIGHT, + color: { red: 255, green: 255, blue: 255}, + backgroundColor: {red: 0, green: 0, blue: 0}, + leftMargin: TEXT_MARGIN, + topMargin: TEXT_MARGIN, + rightMargin: TEXT_MARGIN, + bottomMargin: TEXT_MARGIN, + alpha: 0.6, + solid: true, + isFacingAvatar: true, + visible: false + }); + currentlyShownAvatar.overlay = over; + } + + var nameToShow = avatarData.displayName ? avatarData.displayName : + (avatarData.sessionDisplayName ? avatarData.sessionDisplayName : UNKNOWN_NAME); + var textSize = Overlays.textSize(currentlyShownAvatar.overlay, nameToShow); + + Overlays.editOverlay(currentlyShownAvatar.overlay, { + dimensions: { + x: textSize.width + 2 * TEXT_MARGIN, + y: TEXT_LINE_HEIGHT + 2 * TEXT_MARGIN + }, + localPosition: {x: 0, y: METERS_ABOVE_HEAD, z:0 }, + text: nameToShow, + parentID: avatarData.sessionUUID, + parentJointIndex: avatarData.getJointIndex("Head"), + visible: true + }); +} + +function touchBegin(event) { + var pickRay = Camera.computePickRay(event.x, event.y); + var avatarRay = AvatarManager.findRayIntersection(pickRay, [], rayExclusionList); + if (avatarRay.intersects) { + currentTouchToAnalize = { + touchBegin: event, + avatarRay: avatarRay + }; + printd("[AVATARNAME] touchBegin intersection " + JSON.stringify(currentTouchToAnalize)); + } else { + printd("[AVATARNAME] touchBegin no intersection"); + } +} + +function touchEnd(event) { + if (!currentTouchToAnalize) { + printd("[AVATARNAME] touchEnd no current touch"); + currentTouchToAnalize = null; + return; + } + + // manage touches only if begin an end do: + // - touch/release the same avatar + // - minimal distance (so no apparent movent was intended but a touch/click) + // - (hold or short click don't matter) + + if (Vec3.distance({x: event.x, y: event.y }, {x: currentTouchToAnalize.touchBegin.x, y: currentTouchToAnalize.touchBegin.y}) > MAX_DISTANCE_PX) { + printd("[AVATARNAME] touchEnd moved too much"); + currentTouchToAnalize = null; + return; + } + + var pickRay = Camera.computePickRay(event.x, event.y); + var avatarRay = AvatarManager.findRayIntersection(pickRay, [], rayExclusionList); + + if (avatarRay.intersects && avatarRay.avatarID == currentTouchToAnalize.avatarRay.avatarID) { + touchedAvatar(avatarRay.avatarID, AvatarManager.getAvatar(avatarRay.avatarID)); + } else { + printd("[AVATARNAME] touchEnd released outside the avatar"); + } + + currentTouchToAnalize = null; +} + +function ending() { + Controller.touchBeginEvent.disconnect(touchBegin); + Controller.touchEndEvent.disconnect(touchEnd); + Controller.mousePressEvent.disconnect(touchBegin); + Controller.mouseReleaseEvent.disconnect(touchEnd); + + if (currentlyShownAvatar.overlay) { + Overlays.deleteOverlay(currentlyShownAvatar.overlay); + currentlyShownAvatar.overlay = null; + } + if (currentlyShownAvatar.avatar) { + currentlyShownAvatar.avatar = null; + } +} + +function init() { + Controller.touchBeginEvent.connect(touchBegin); + Controller.touchEndEvent.connect(touchEnd); + Controller.mousePressEvent.connect(touchBegin); + Controller.mouseReleaseEvent.connect(touchEnd); + + Script.scriptEnding.connect(function () { + ending(); + }); +} + +init(); + +}()); // END LOCAL_SCOPE \ No newline at end of file diff --git a/scripts/system/+android/modes.js b/scripts/system/+android/modes.js index f5b3609c26..0b6e98541d 100644 --- a/scripts/system/+android/modes.js +++ b/scripts/system/+android/modes.js @@ -28,6 +28,7 @@ modeLabel[MODE_MY_VIEW]="MY VIEW"; var logEnabled = false; var radar = Script.require('./radar.js'); var uniqueColor = Script.require('./uniqueColor.js'); +var displayNames = Script.require('./displayNames.js'); function printd(str) { if (logEnabled) { From cd3836883bf4d7472bd4303b47e4a25771f8e444 Mon Sep 17 00:00:00 2001 From: Cristian Luis Duarte Date: Wed, 9 May 2018 19:27:03 -0300 Subject: [PATCH 2/7] 10 seconds timeout hides name --- scripts/system/+android/displayNames.js | 26 ++++++++++++++++++++----- 1 file changed, 21 insertions(+), 5 deletions(-) diff --git a/scripts/system/+android/displayNames.js b/scripts/system/+android/displayNames.js index 8ed2b35daf..b65731f5a7 100644 --- a/scripts/system/+android/displayNames.js +++ b/scripts/system/+android/displayNames.js @@ -18,6 +18,8 @@ var METERS_ABOVE_HEAD = 0.4; var TEXT_LINE_HEIGHT = .1; var TEXT_MARGIN = 0.025; +var HIDE_MS = 10000; + var currentTouchToAnalize = null; var rayExclusionList = []; @@ -29,21 +31,31 @@ var currentlyShownAvatar = { var logEnabled = false; +var hideTimer = null; + function printd(str) { if (logEnabled) { print("[displayNames.js] " + str); } } +function clearOverlay() { + currentlyShownAvatar.avatar = null; + if (currentlyShownAvatar.overlay) { + Overlays.editOverlay(currentlyShownAvatar.overlay, {visible: false}); + } +} + function touchedAvatar(avatarID, avatarData) { printd("[AVATARNAME] touchEnd FOUND " + JSON.stringify(avatarData)); + if (hideTimer) { + Script.clearTimeout(hideTimer); + } + // Case: touching an already selected avatar if (currentlyShownAvatar.avatar && currentlyShownAvatar.avatarID == avatarID) { - currentlyShownAvatar.avatar = null; - if (currentlyShownAvatar.overlay) { - Overlays.editOverlay(currentlyShownAvatar.overlay, {visible: false}); - } + clearOverlay(); return; } @@ -77,12 +89,16 @@ function touchedAvatar(avatarID, avatarData) { x: textSize.width + 2 * TEXT_MARGIN, y: TEXT_LINE_HEIGHT + 2 * TEXT_MARGIN }, - localPosition: {x: 0, y: METERS_ABOVE_HEAD, z:0 }, + localPosition: { x: 0, y: METERS_ABOVE_HEAD, z: 0 }, text: nameToShow, parentID: avatarData.sessionUUID, parentJointIndex: avatarData.getJointIndex("Head"), visible: true }); + + hideTimer = Script.setTimeout(function() { + clearOverlay(); + }, HIDE_MS); } function touchBegin(event) { From d39f7f7a581de8449babda0c589cd467f5cc0c0f Mon Sep 17 00:00:00 2001 From: Cristian Luis Duarte Date: Fri, 11 May 2018 21:27:42 -0300 Subject: [PATCH 3/7] Simplified avatar touch code + Fix Typo + Add my avatar to the exclusion list + Explain mouse events --- scripts/system/+android/displayNames.js | 40 ++++++++----------------- 1 file changed, 12 insertions(+), 28 deletions(-) diff --git a/scripts/system/+android/displayNames.js b/scripts/system/+android/displayNames.js index b65731f5a7..2e2e6938ad 100644 --- a/scripts/system/+android/displayNames.js +++ b/scripts/system/+android/displayNames.js @@ -20,8 +20,8 @@ var TEXT_MARGIN = 0.025; var HIDE_MS = 10000; -var currentTouchToAnalize = null; -var rayExclusionList = []; +var currentTouchToAnalyze = null; +var rayExclusionList = []; // Updated at sessionUUID changes var currentlyShownAvatar = { avatarID: null, @@ -102,47 +102,26 @@ function touchedAvatar(avatarID, avatarData) { } function touchBegin(event) { - var pickRay = Camera.computePickRay(event.x, event.y); - var avatarRay = AvatarManager.findRayIntersection(pickRay, [], rayExclusionList); - if (avatarRay.intersects) { - currentTouchToAnalize = { - touchBegin: event, - avatarRay: avatarRay - }; - printd("[AVATARNAME] touchBegin intersection " + JSON.stringify(currentTouchToAnalize)); - } else { - printd("[AVATARNAME] touchBegin no intersection"); - } + currentTouchToAnalyze = event; } function touchEnd(event) { - if (!currentTouchToAnalize) { - printd("[AVATARNAME] touchEnd no current touch"); - currentTouchToAnalize = null; - return; - } - - // manage touches only if begin an end do: - // - touch/release the same avatar - // - minimal distance (so no apparent movent was intended but a touch/click) - // - (hold or short click don't matter) - - if (Vec3.distance({x: event.x, y: event.y }, {x: currentTouchToAnalize.touchBegin.x, y: currentTouchToAnalize.touchBegin.y}) > MAX_DISTANCE_PX) { + if (Vec3.distance({x: event.x, y: event.y }, {x: currentTouchToAnalyze.x, y: currentTouchToAnalyze.y}) > MAX_DISTANCE_PX) { printd("[AVATARNAME] touchEnd moved too much"); - currentTouchToAnalize = null; + currentTouchToAnalyze = null; return; } var pickRay = Camera.computePickRay(event.x, event.y); var avatarRay = AvatarManager.findRayIntersection(pickRay, [], rayExclusionList); - if (avatarRay.intersects && avatarRay.avatarID == currentTouchToAnalize.avatarRay.avatarID) { + if (avatarRay.intersects) { touchedAvatar(avatarRay.avatarID, AvatarManager.getAvatar(avatarRay.avatarID)); } else { printd("[AVATARNAME] touchEnd released outside the avatar"); } - currentTouchToAnalize = null; + currentTouchToAnalyze = null; } function ending() { @@ -169,6 +148,11 @@ function init() { Script.scriptEnding.connect(function () { ending(); }); + + rayExclusionList = [MyAvatar.sessionUUID]; + MyAvatar.sessionUUIDChanged.connect(function() { + rayExclusionList = [MyAvatar.sessionUUID]; + }); } init(); From 9e9e1092d69c6c55c4bb77fdf349e3d934dbf7c3 Mon Sep 17 00:00:00 2001 From: Cristian Luis Duarte Date: Fri, 11 May 2018 21:37:28 -0300 Subject: [PATCH 4/7] Add Opaques tasks into RenderForwardTask --- libraries/render-utils/src/RenderForwardTask.cpp | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/libraries/render-utils/src/RenderForwardTask.cpp b/libraries/render-utils/src/RenderForwardTask.cpp index c45e1dd4eb..b49735a53f 100755 --- a/libraries/render-utils/src/RenderForwardTask.cpp +++ b/libraries/render-utils/src/RenderForwardTask.cpp @@ -23,7 +23,6 @@ #include -#include "AntialiasingEffect.h" #include "StencilMaskPass.h" #include "ZoneRenderer.h" #include "FadeEffect.h" @@ -56,7 +55,7 @@ void RenderForwardTask::build(JobModel& task, const render::Varying& input, rend const auto& transparents = items.get0()[RenderFetchCullSortTask::TRANSPARENT_SHAPE]; // const auto& lights = items.get0()[RenderFetchCullSortTask::LIGHT]; const auto& metas = items.get0()[RenderFetchCullSortTask::META]; - // const auto& overlayOpaques = items.get0()[RenderFetchCullSortTask::OVERLAY_OPAQUE_SHAPE]; + const auto& overlayOpaques = items.get0()[RenderFetchCullSortTask::OVERLAY_OPAQUE_SHAPE]; const auto& overlayTransparents = items.get0()[RenderFetchCullSortTask::OVERLAY_TRANSPARENT_SHAPE]; //const auto& background = items.get0()[RenderFetchCullSortTask::BACKGROUND]; @@ -64,8 +63,6 @@ void RenderForwardTask::build(JobModel& task, const render::Varying& input, rend fadeEffect->build(task, opaques); - const auto jitter = task.addJob("JitterCam"); - // Prepare objects shared by several jobs const auto deferredFrameTransform = task.addJob("DeferredFrameTransform"); const auto lightingModel = task.addJob("LightingModel"); @@ -82,14 +79,14 @@ void RenderForwardTask::build(JobModel& task, const render::Varying& input, rend task.addJob("PrepareStencil", framebuffer); // Layered Overlays - //const auto filteredOverlaysOpaque = task.addJob("FilterOverlaysLayeredOpaque", overlayOpaques, Item::LAYER_3D_FRONT); + const auto filteredOverlaysOpaque = task.addJob("FilterOverlaysLayeredOpaque", overlayOpaques, Item::LAYER_3D_FRONT); const auto filteredOverlaysTransparent = task.addJob("FilterOverlaysLayeredTransparent", overlayTransparents, Item::LAYER_3D_FRONT); - //const auto overlaysInFrontOpaque = filteredOverlaysOpaque.getN(0); + const auto overlaysInFrontOpaque = filteredOverlaysOpaque.getN(0); const auto overlaysInFrontTransparent = filteredOverlaysTransparent.getN(0); - //const auto overlayInFrontOpaquesInputs = DrawOverlay3D::Inputs(overlaysInFrontOpaque, lightingModel, jitter).asVarying(); - const auto overlayInFrontTransparentsInputs = DrawOverlay3D::Inputs(overlaysInFrontTransparent, lightingModel, jitter).asVarying(); - //task.addJob("DrawOverlayInFrontOpaque", overlayInFrontOpaquesInputs, true); + const auto overlayInFrontOpaquesInputs = DrawOverlay3D::Inputs(overlaysInFrontOpaque, lightingModel, nullptr).asVarying(); + const auto overlayInFrontTransparentsInputs = DrawOverlay3D::Inputs(overlaysInFrontTransparent, lightingModel, nullptr).asVarying(); + task.addJob("DrawOverlayInFrontOpaque", overlayInFrontOpaquesInputs, true); task.addJob("DrawOverlayInFrontTransparent", overlayInFrontTransparentsInputs, false); // Draw opaques forward From 3fd8a02375595cc6177a3027f66ec83220435e9a Mon Sep 17 00:00:00 2001 From: Cristian Luis Duarte Date: Fri, 11 May 2018 21:58:12 -0300 Subject: [PATCH 5/7] Prevent this name implementation to appear in radar mode --- scripts/system/+android/displayNames.js | 17 +++++++++++++---- scripts/system/+android/modes.js | 2 ++ 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/scripts/system/+android/displayNames.js b/scripts/system/+android/displayNames.js index 2e2e6938ad..1e9735d205 100644 --- a/scripts/system/+android/displayNames.js +++ b/scripts/system/+android/displayNames.js @@ -124,6 +124,10 @@ function touchEnd(event) { currentTouchToAnalyze = null; } +function excludeMyAvatar() { + rayExclusionList = [MyAvatar.sessionUUID]; +} + function ending() { Controller.touchBeginEvent.disconnect(touchBegin); Controller.touchEndEvent.disconnect(touchEnd); @@ -137,6 +141,8 @@ function ending() { if (currentlyShownAvatar.avatar) { currentlyShownAvatar.avatar = null; } + + MyAvatar.sessionUUIDChanged.disconnect(excludeMyAvatar); } function init() { @@ -150,11 +156,14 @@ function init() { }); rayExclusionList = [MyAvatar.sessionUUID]; - MyAvatar.sessionUUIDChanged.connect(function() { - rayExclusionList = [MyAvatar.sessionUUID]; - }); + MyAvatar.sessionUUIDChanged.connect(excludeMyAvatar); } -init(); +module.exports = { + init: init, + ending: ending +} + +//init(); // Enable to use in desktop as a standalone }()); // END LOCAL_SCOPE \ No newline at end of file diff --git a/scripts/system/+android/modes.js b/scripts/system/+android/modes.js index 0b6e98541d..2c155ae386 100644 --- a/scripts/system/+android/modes.js +++ b/scripts/system/+android/modes.js @@ -88,8 +88,10 @@ function switchToMode(newMode) { if (currentMode == MODE_RADAR) { radar.startRadarMode(); + displayNames.ending(); } else if (currentMode == MODE_MY_VIEW) { // nothing to do yet + displayNames.init(); } else { printd("Unknown view mode " + currentMode); } From aaa6038d282d9362ee3f50347d8520449ec84ee3 Mon Sep 17 00:00:00 2001 From: Cristian Luis Duarte Date: Fri, 11 May 2018 22:27:58 -0300 Subject: [PATCH 6/7] Prevent calling ending on displayNames if was never started --- scripts/system/+android/displayNames.js | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/scripts/system/+android/displayNames.js b/scripts/system/+android/displayNames.js index 1e9735d205..9f226f5ce0 100644 --- a/scripts/system/+android/displayNames.js +++ b/scripts/system/+android/displayNames.js @@ -128,7 +128,13 @@ function excludeMyAvatar() { rayExclusionList = [MyAvatar.sessionUUID]; } +var runAtLeastOnce = false; + function ending() { + if (!runAtLeastOnce) { + return; + } + Controller.touchBeginEvent.disconnect(touchBegin); Controller.touchEndEvent.disconnect(touchEnd); Controller.mousePressEvent.disconnect(touchBegin); @@ -157,6 +163,8 @@ function init() { rayExclusionList = [MyAvatar.sessionUUID]; MyAvatar.sessionUUIDChanged.connect(excludeMyAvatar); + + runAtLeastOnce = true; } module.exports = { From e7abf3c7be64cf53ce6b167a9b74f02456f82f2e Mon Sep 17 00:00:00 2001 From: Cristian Luis Duarte Date: Mon, 14 May 2018 15:26:57 -0300 Subject: [PATCH 7/7] Android - Display Names - Use my avatar uuid directly when finding ray intersection --- scripts/system/+android/displayNames.js | 12 +----------- 1 file changed, 1 insertion(+), 11 deletions(-) diff --git a/scripts/system/+android/displayNames.js b/scripts/system/+android/displayNames.js index 9f226f5ce0..509d85cd2b 100644 --- a/scripts/system/+android/displayNames.js +++ b/scripts/system/+android/displayNames.js @@ -21,7 +21,6 @@ var TEXT_MARGIN = 0.025; var HIDE_MS = 10000; var currentTouchToAnalyze = null; -var rayExclusionList = []; // Updated at sessionUUID changes var currentlyShownAvatar = { avatarID: null, @@ -113,7 +112,7 @@ function touchEnd(event) { } var pickRay = Camera.computePickRay(event.x, event.y); - var avatarRay = AvatarManager.findRayIntersection(pickRay, [], rayExclusionList); + var avatarRay = AvatarManager.findRayIntersection(pickRay, [], [MyAvatar.sessionUUID]) if (avatarRay.intersects) { touchedAvatar(avatarRay.avatarID, AvatarManager.getAvatar(avatarRay.avatarID)); @@ -124,10 +123,6 @@ function touchEnd(event) { currentTouchToAnalyze = null; } -function excludeMyAvatar() { - rayExclusionList = [MyAvatar.sessionUUID]; -} - var runAtLeastOnce = false; function ending() { @@ -147,8 +142,6 @@ function ending() { if (currentlyShownAvatar.avatar) { currentlyShownAvatar.avatar = null; } - - MyAvatar.sessionUUIDChanged.disconnect(excludeMyAvatar); } function init() { @@ -161,9 +154,6 @@ function init() { ending(); }); - rayExclusionList = [MyAvatar.sessionUUID]; - MyAvatar.sessionUUIDChanged.connect(excludeMyAvatar); - runAtLeastOnce = true; }