288 lines
No EOL
8.7 KiB
JavaScript
288 lines
No EOL
8.7 KiB
JavaScript
|
|
|
|
|
|
//
|
|
// 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);
|
|
}()); |