content/hifi-content/caitlyn/scratch/trinkettsNameplates.js
2022-02-13 22:19:19 +01:00

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);
}());