// // displayNames.js // A Desktop/HMD application for displaying nametags above avatars. // // Author: Cain Kilgore // Modified by Caitlyn Meeks // Copyright High Fidelity 2018 // // Licensed under the Apache 2.0 License // See accompanying license file or http://apache.org/ // // All assets are under CC Attribution Non-Commerical // http://creativecommons.org/licenses/ // (function() { const MODE_OFF = -1; const MODE_ALL = 0; const MODE_SPEAKER = 1; const MODE_CLICK = 2; var tagsState = MODE_ALL; var ROOT = "http://mpassets.highfidelity.com/ef9de7e1-d4a0-4eab-af51-7dfc0de2191b-v1/"; var tablet = Tablet.getTablet("com.highfidelity.interface.tablet.system"); var icon = "http://mpassets.highfidelity.com/ef9de7e1-d4a0-4eab-af51-7dfc0de2191b-v1/noun_1494143_cc2.png"; var appHTML = "http://mpassets.highfidelity.com/ef9de7e1-d4a0-4eab-af51-7dfc0de2191b-v1/mappHTML.html?5"; var button = tablet.addButton({ icon: icon, text: "TAGS" }); var isOpen = false; function onClicked() { //Nothing else here! if (isOpen) { tablet.gotoHomeScreen(); } else { tablet.gotoWebScreen(appHTML, {}); } } function onScreenChanged(type, url) { isOpen = (url === appHTML); } button.clicked.connect(onClicked); tablet.screenChanged.connect(onScreenChanged); function init() { try { tablet.webEventReceived.connect(onWebEventReceived); } catch (e) { print("connectWebHandler: error connecting: " + e); } } function onWebEventReceived(event) { event = JSON.parse(event); print("EVENT "+event.type); if (event.type === "ready") { } if (event.type === "TOGGLEPLATES") { print("Toggleplats"); if (tagsState == MODE_ALL) { tagsState = MODE_OFF; // Hide tags if they are on } else { deleteOverlaysNow = false; tagsState = MODE_ALL; labelAllAvatars(); } } if (event.type === "SPEAKERMODE") { print("Speaker"); deleteOverlaysNow = false; tagsState = MODE_SPEAKER; labelAllAvatars(); } if (event.type === "CLICKMODE") { print("Clickmode"); tagsState = MODE_CLICK; } } function shutdown() { try { tablet.webEventReceived.disconnect(onWebEventReceived); } catch (e) { print("disconnectWebHandler: error disconnecting web handler: " + e); return; } button.clicked.disconnect(onClicked); tablet.screenChanged.disconnect(onScreenChanged); tablet.removeButton(button); } init(); Script.scriptEnding.connect(function () { shutdown(); }); //var showText = "https://dummyimage.com/800x500/000/ffffff.png&text=123"+MyAvatar.sessionDisplayName; var overlaysCreated = []; var avatarsWithOverlays = []; var howLongWillNameTagAppear = 5; // seconds var nameTagProperties = { type: "image3d", //imageURL: showText, visible: true, text: "N/A", lineHeight: 0.1, color: {red:160, blue:160, green:255}, topMargin: 0.05, leftMargin: 0.1, dimensions: { x: 2, y: 0.2, z: 2 }, position: {}, parentID: {}, isFacingAvatar: true, } var pointer = Pointers.createPointer(PickType.Ray, { joint: "Mouse", filter: Picks.PICK_AVATARS, distanceScaleEnd: true, hover: false, enabled: true }); var pointerLeftHand = Pointers.createPointer(PickType.Ray, { joint: "_CAMERA_RELATIVE_CONTROLLER_LEFTHAND", filter: Picks.PICK_AVATARS, distanceScaleEnd: true, hover: false, enabled: true }); var pointerRightHand = Pointers.createPointer(PickType.Ray, { joint: "_CAMERA_RELATIVE_CONTROLLER_RIGHTHAND", filter: Picks.PICK_AVATARS, distanceScaleEnd: true, hover: false, enabled: true }); var mapping_name = "nameTagSelector"; var mapping = Controller.newMapping(mapping_name); mapping.from(Controller.Hardware.Keyboard.LeftMouseButton).to(function(value) { var res = Pointers.getPrevPickResult(pointer); if(typeof res.objectID == "string") { if(!(avatarsWithOverlays.indexOf(res.objectID) != -1)) { clickOnEntity(res.objectID,1000); //clickAllAvatars(); } } }); mapping.from(Controller.Standard.RT).to(function(value) { var res = Pointers.getPrevPickResult(pointerRightHand); if(typeof res.objectID == "string") { if(!(avatarsWithOverlays.indexOf(res.objectID) != -1)) { clickOnEntity(res.objectID,1000); //clickAllAvatars(); } } }); mapping.from(Controller.Standard.LT).to(function(value) { // alert("yay"); var res = Pointers.getPrevPickResult(pointerLeftHand); if(typeof res.objectID == "string") { if(!(avatarsWithOverlays.indexOf(res.objectID) != -1)) { clickOnEntity(res.objectID,1000); //clickAllAvatars(); } } }); function clickOnEntity(entityClicked, showDuration) { deleteOverlaysNow = false; var getAvatarClicked = AvatarList.getAvatar(entityClicked); var entityPosition = getAvatarClicked.position; var displayUsername = getAvatarClicked.sessionDisplayName; nameTagProperties.parentID = entityClicked; nameTagProperties.position = Vec3.sum(entityPosition, { x: 0, y: 1, z: 0 }); nameTagProperties.text = getAvatarClicked.sessionDisplayName; nameTagProperties.dimensions = { x: ((displayUsername.length / 2) * 0.12), y: 0.2, z: 1 }; var createOverlay = overlaysCreated.push(overlaysCreated, Overlays.addOverlay("text3d", nameTagProperties)); avatarsWithOverlays.push(entityClicked); var displayNameSize = Overlays.textSize(overlaysCreated[createOverlay-1], Overlays.getProperty(overlaysCreated[createOverlay-1], "text")); Overlays.editOverlay(overlaysCreated[createOverlay-1], {"backgroundAlpha": 0,"dimensions": { "x": displayNameSize["width"] + 0.2, "y": 0.2, "z": 1 }}); var thisInterval = Script.setInterval(function() { //print("xxxx:"+tagsState); if (tagsState == MODE_OFF) deleteOverlaysNow = true; if (deleteOverlaysNow) { Script.clearInterval(thisInterval); Overlays.deleteOverlay(overlaysCreated[createOverlay-1]); const index = avatarsWithOverlays.indexOf(entityClicked); avatarsWithOverlays.splice(index, 1); return; }; var vol = getAvatarClicked.audioLoudness; var bgCol = {red:255,green:160,blue:160}; if (vol<50) { vol = 0; var bgCol = {red:160,green:255,blue:160}; if (tagsState == MODE_SPEAKER) var textAlpha = 0; // draw white if they're not talking } else { vol=0.5; var textAlpha = 1; } var newPosition = Vec3.sum(getAvatarClicked.position, { x: 0, y: 1, z: 0 }); Overlays.editOverlay(overlaysCreated[createOverlay-1], {"position":newPosition, "color": bgCol, "textAlpha": textAlpha,"dimensions": { "x": displayNameSize["width"] + 0.2, "y": 0.2, "z": 1*vol }}); },300); // Update position and speech every 100 ms // var thisTimeout = Script.setTimeout(function() { // if (deleteOverlaysNow) {Script.clearTimeout(thisTimeout);} // Overlays.deleteOverlay(overlaysCreated[createOverlay-1]); // const index = avatarsWithOverlays.indexOf(entityClicked); // avatarsWithOverlays.splice(index, 1); // }, howLongWillNameTagAppear * showDuration); } var deleteOverlaysNow = false; var showTalkerOnly = false; function scriptFinished() { deleteOverlaysNow = true; Script.clearInterval(mainLoop); for(var i = 0; i < overlaysCreated.length; i++) { Overlays.deleteOverlay(overlaysCreated[i]); } Controller.disableMapping(mapping_name); } function labelAllAvatars(){ var v = AvatarList.getAvatarIdentifiers(); for (x in v) { if (v[x] != null) {clickOnEntity (v[x],2200);} } } // IF YOU TURN THE ON BUTTON var mainLoop = Script.setInterval(function() { //print("&&&&:"+tagsState); //deleteOverlaysNow = true; if (tagsState == MODE_OFF) return; labelAllAvatars(); },5000); // IF YOU TURN THE OFF Button // deleteOverlaysNow = true; // IDENTIFY ADMINS // IDENTIFY FRIENDS /* Script.setTimeout(function() { deleteOverlaysNow=true; }, 1555); */ labelAllAvatars(); Controller.enableMapping(mapping_name); Script.scriptEnding.connect(scriptFinished); }());