mirror of
https://github.com/overte-org/overte.git
synced 2025-08-09 12:08:54 +02:00
Updated Nametag to use the sessionDisplayName or the displayName as default
This commit is contained in:
parent
83171a7cde
commit
27c4841887
8 changed files with 27 additions and 1528 deletions
|
@ -10,15 +10,7 @@
|
||||||
// Helps manage the list of avatars added to the nametag list
|
// Helps manage the list of avatars added to the nametag list
|
||||||
//
|
//
|
||||||
|
|
||||||
var ON = 'ON';
|
console.log("\nm\n\n\n\n\n\n\n\n\nTEST!!!\n\n\n\n\n\n")
|
||||||
var OFF = 'OFF';
|
|
||||||
var DEBUG_ON = true;
|
|
||||||
var DEBUG_OFF = false;
|
|
||||||
var log = Script.require(
|
|
||||||
'https://hifi-content.s3.amazonaws.com/milad/ROLC/d/ROLC_High-Fidelity/02_Organize/O_Projects/Repos/hifi-content/developerTools/sharedLibraries/easyLog/easyLog.js?'
|
|
||||||
+ Date.now())(DEBUG_OFF, 'nameTagListManager.js');
|
|
||||||
|
|
||||||
|
|
||||||
var EntityMaker = Script.require('./entityMaker.js?' + Date.now());
|
var EntityMaker = Script.require('./entityMaker.js?' + Date.now());
|
||||||
var entityProps = Script.require('./defaultLocalEntityProps.js?' + Date.now());
|
var entityProps = Script.require('./defaultLocalEntityProps.js?' + Date.now());
|
||||||
var textHelper = new (Script.require('./textHelper.js?' + Date.now()));
|
var textHelper = new (Script.require('./textHelper.js?' + Date.now()));
|
||||||
|
@ -68,7 +60,6 @@ var userScaler = 1.0;
|
||||||
var DEFAULT_LINE_HEIGHT = entityProps.lineHeight;
|
var DEFAULT_LINE_HEIGHT = entityProps.lineHeight;
|
||||||
function calculateInitialProperties(uuid) {
|
function calculateInitialProperties(uuid) {
|
||||||
var avatar = _this.avatars[uuid];
|
var avatar = _this.avatars[uuid];
|
||||||
var avatarInfo = avatar.avatarInfo;
|
|
||||||
|
|
||||||
var adjustedScaler = null;
|
var adjustedScaler = null;
|
||||||
var distance = null;
|
var distance = null;
|
||||||
|
@ -78,7 +69,7 @@ function calculateInitialProperties(uuid) {
|
||||||
var name = null;
|
var name = null;
|
||||||
|
|
||||||
// Handle if we are asking for the main or sub properties
|
// Handle if we are asking for the main or sub properties
|
||||||
name = avatarInfo.displayName;
|
name = getCorrectName(uuid);
|
||||||
|
|
||||||
// Use the text helper to calculate what our dimensions for the text box should be
|
// Use the text helper to calculate what our dimensions for the text box should be
|
||||||
textHelper
|
textHelper
|
||||||
|
@ -242,6 +233,22 @@ function nameTagListManager() {
|
||||||
_this.redrawTimeout = null;
|
_this.redrawTimeout = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Get the correct display name
|
||||||
|
function getCorrectName(uuid) {
|
||||||
|
var avatar = _this.avatars[uuid];
|
||||||
|
var avatarInfo = avatar.avatarInfo;
|
||||||
|
|
||||||
|
var displayNameToUse = avatarInfo.sessionDisplayName;
|
||||||
|
if (displayNameToUse === "") {
|
||||||
|
displayNameToUse = avatarInfo.displayName;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
displayNameToUse= displayNameToUse === "" ? "anonymous" : displayNameToUse.trim();
|
||||||
|
|
||||||
|
return displayNameToUse;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// Create or make visible either the sub or the main tag.
|
// Create or make visible either the sub or the main tag.
|
||||||
var REDRAW_TIMEOUT_AMOUNT_MS = 500;
|
var REDRAW_TIMEOUT_AMOUNT_MS = 500;
|
||||||
|
@ -257,13 +264,12 @@ var onModeScalar = 0.55;
|
||||||
var alwaysOnModeScalar = -0.75;
|
var alwaysOnModeScalar = -0.75;
|
||||||
function makeNameTag(uuid) {
|
function makeNameTag(uuid) {
|
||||||
var avatar = _this.avatars[uuid];
|
var avatar = _this.avatars[uuid];
|
||||||
var avatarInfo = avatar.avatarInfo;
|
|
||||||
var nametag = avatar.nametag;
|
var nametag = avatar.nametag;
|
||||||
|
|
||||||
// Make sure an anonymous name is covered before sending to calculate
|
// Get the correct name for the nametag
|
||||||
|
var name = getCorrectName(uuid);
|
||||||
avatarInfo.displayName = avatarInfo.displayName === "" ? "anonymous" : avatarInfo.displayName.trim();
|
avatar.previousName = name;
|
||||||
avatar.previousName = avatarInfo.displayName;
|
nametag.add("text", name);
|
||||||
|
|
||||||
// Returns back the properties we need based on what we are looking for and the distance from the avatar
|
// Returns back the properties we need based on what we are looking for and the distance from the avatar
|
||||||
var calculatedProps = calculateInitialProperties(uuid);
|
var calculatedProps = calculateInitialProperties(uuid);
|
||||||
|
@ -271,14 +277,12 @@ function makeNameTag(uuid) {
|
||||||
var scaledDimensions = calculatedProps.scaledDimensions;
|
var scaledDimensions = calculatedProps.scaledDimensions;
|
||||||
var lineHeight = calculatedProps.lineHeight;
|
var lineHeight = calculatedProps.lineHeight;
|
||||||
|
|
||||||
// Capture the inital dimensions, distance, and displayName in case we need to redraw
|
// Capture the inital dimensions and distance in case we need to redraw
|
||||||
avatar.previousDisplayName = avatarInfo.displayName;
|
|
||||||
avatar.initialDimensions = scaledDimensions;
|
avatar.initialDimensions = scaledDimensions;
|
||||||
avatar.initialDistance = distance;
|
avatar.initialDistance = distance;
|
||||||
var name = avatarInfo.displayName;
|
|
||||||
var parentID = uuid;
|
var parentID = uuid;
|
||||||
|
|
||||||
nametag.add("text", name);
|
|
||||||
|
|
||||||
// Multiply the new dimensions and line height with the user selected scaler
|
// Multiply the new dimensions and line height with the user selected scaler
|
||||||
scaledDimensions = Vec3.multiply(scaledDimensions, userScaler);
|
scaledDimensions = Vec3.multiply(scaledDimensions, userScaler);
|
||||||
|
@ -338,7 +342,6 @@ var CHECK_AVATAR = true;
|
||||||
var MIN_DISTANCE = 0.2;
|
var MIN_DISTANCE = 0.2;
|
||||||
function maybeRedraw(uuid) {
|
function maybeRedraw(uuid) {
|
||||||
var avatar = _this.avatars[uuid];
|
var avatar = _this.avatars[uuid];
|
||||||
var avatarInfo = avatar.avatarInfo;
|
|
||||||
getAvatarData(uuid);
|
getAvatarData(uuid);
|
||||||
|
|
||||||
getDistance(uuid);
|
getDistance(uuid);
|
||||||
|
@ -351,10 +354,10 @@ function maybeRedraw(uuid) {
|
||||||
showHide(uuid, "show");
|
showHide(uuid, "show");
|
||||||
}
|
}
|
||||||
|
|
||||||
avatarInfo.displayName = avatarInfo.displayName === "" ? "anonymous" : avatarInfo.displayName.trim();
|
var name = getCorrectName(uuid);
|
||||||
|
|
||||||
if (avatar.previousName !== avatarInfo.displayName) {
|
if (avatar.previousName !== name) {
|
||||||
updateName(uuid, avatarInfo.displayName);
|
updateName(uuid, name);
|
||||||
} else {
|
} else {
|
||||||
redraw(uuid);
|
redraw(uuid);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,26 +0,0 @@
|
||||||
//
|
|
||||||
// Simplified Nametag
|
|
||||||
// defaultLocalEntityProps.js
|
|
||||||
// Created by Milad Nazeri on 2019-03-09
|
|
||||||
// Copyright 2019 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
|
|
||||||
//
|
|
||||||
// Base properties for the Local Entities
|
|
||||||
//
|
|
||||||
|
|
||||||
var localEntityProps = {
|
|
||||||
dimensions: [1, 0.1, 0],
|
|
||||||
type: "Text",
|
|
||||||
lineHeight: 0.1,
|
|
||||||
textColor: "#ffffff",
|
|
||||||
textAlpha: 1.0,
|
|
||||||
backgroundColor: "#2d2d2d",
|
|
||||||
backgroundAlpha: 0.6,
|
|
||||||
billboardMode: "full",
|
|
||||||
lifetime: 3,
|
|
||||||
canCastShadow: true
|
|
||||||
};
|
|
||||||
|
|
||||||
module.exports = localEntityProps;
|
|
|
@ -1,154 +0,0 @@
|
||||||
//
|
|
||||||
// Simplified Nametag
|
|
||||||
// entityMaker.js
|
|
||||||
// Created by Milad Nazeri on 2019-02-19
|
|
||||||
// Copyright 2019 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
|
|
||||||
//
|
|
||||||
// A helper library to make entities
|
|
||||||
//
|
|
||||||
|
|
||||||
|
|
||||||
Script.require('./objectAssign.js');
|
|
||||||
|
|
||||||
function EntityMaker(type) {
|
|
||||||
this.properties = {};
|
|
||||||
this.cache = {};
|
|
||||||
this.id = null;
|
|
||||||
this.created = null;
|
|
||||||
this.type = type;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// *************************************
|
|
||||||
// START API
|
|
||||||
// *************************************
|
|
||||||
// #region API
|
|
||||||
|
|
||||||
|
|
||||||
// Add properties to the cache / temporary storage
|
|
||||||
function add(props){
|
|
||||||
// You can either add an object of props or 2 arguments as key and value
|
|
||||||
if (arguments.length === 2) {
|
|
||||||
var property = arguments[0];
|
|
||||||
var value = arguments[1];
|
|
||||||
props = {};
|
|
||||||
props[property] = value;
|
|
||||||
}
|
|
||||||
|
|
||||||
this.properties = Object.assign({}, this.properties, props);
|
|
||||||
this.cache = Object.assign({}, this.cache, this.properties);
|
|
||||||
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Sends the current temporary stroage to edit the entity
|
|
||||||
function sync(){
|
|
||||||
Entities.editEntity(this.id, this.properties);
|
|
||||||
this.properties = {};
|
|
||||||
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Immediately edit the entity with the properties given
|
|
||||||
function edit(props){
|
|
||||||
if (arguments.length === 2) {
|
|
||||||
var property = arguments[0];
|
|
||||||
var value = arguments[1];
|
|
||||||
props = {};
|
|
||||||
props[property] = value;
|
|
||||||
}
|
|
||||||
this.properties = Object.assign({}, this.properties, props);
|
|
||||||
this.cache = Object.assign({}, this.cache, this.properties);
|
|
||||||
this.sync();
|
|
||||||
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Get a property either from the cache or by querying the entity directly
|
|
||||||
function get(propertyKeys, queryEntity){
|
|
||||||
if (queryEntity && typeof propertyKeys === 'string') {
|
|
||||||
var propertyValue = Entities.getEntityProperties(this.id, propertyKeys)[propertyKeys];
|
|
||||||
this.properties[propertyKeys] = propertyValue;
|
|
||||||
this.cache = Object.assign({}, this.cache, this.properties);
|
|
||||||
return propertyValue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (queryEntity && Array.isArray(propertyKeys)) {
|
|
||||||
var entityProps = Entities.getEntityProperties(this.id, propertyKeys);
|
|
||||||
for (var prop in entityProps) {
|
|
||||||
if (propertyKeys.indexOf(prop) === -1) {
|
|
||||||
delete entityProps[prop];
|
|
||||||
} else {
|
|
||||||
this.properties[prop] = entityProps[prop];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return entityProps;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (Array.isArray(propertyKeys)) {
|
|
||||||
var recombinedProps = {};
|
|
||||||
propertyKeys.forEach(function (prop) {
|
|
||||||
recombinedProps[prop] = this.cache[prop];
|
|
||||||
}, this);
|
|
||||||
return recombinedProps;
|
|
||||||
}
|
|
||||||
|
|
||||||
return this.cache[propertyKeys];
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Show the entity
|
|
||||||
function show(){
|
|
||||||
this.edit({ visible: true });
|
|
||||||
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Hide the enity
|
|
||||||
function hide(){
|
|
||||||
this.edit({ visible: false });
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Add an entity if it isn't created
|
|
||||||
function create(clearPropertiesAfter){
|
|
||||||
this.id = Entities.addEntity(this.properties, this.type);
|
|
||||||
if (clearPropertiesAfter) {
|
|
||||||
this.properties = {};
|
|
||||||
}
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Delete the entity
|
|
||||||
function destroy(){
|
|
||||||
Entities.deleteEntity(this.id);
|
|
||||||
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// #endregion
|
|
||||||
// *************************************
|
|
||||||
// END API
|
|
||||||
// *************************************
|
|
||||||
|
|
||||||
EntityMaker.prototype = {
|
|
||||||
add: add,
|
|
||||||
sync: sync,
|
|
||||||
edit: edit,
|
|
||||||
get: get,
|
|
||||||
show: show,
|
|
||||||
hide: hide,
|
|
||||||
create: create,
|
|
||||||
destroy: destroy
|
|
||||||
};
|
|
||||||
|
|
||||||
module.exports = EntityMaker;
|
|
|
@ -1,668 +0,0 @@
|
||||||
//
|
|
||||||
// Simplified Nametag
|
|
||||||
// nameTagListManager.js
|
|
||||||
// Created by Milad Nazeri on 2019-03-09
|
|
||||||
// Copyright 2019 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
|
|
||||||
//
|
|
||||||
// Helps manage the list of avatars added to the nametag list
|
|
||||||
//
|
|
||||||
|
|
||||||
var ON = 'ON';
|
|
||||||
var OFF = 'OFF';
|
|
||||||
var DEBUG_ON = true;
|
|
||||||
var DEBUG_OFF = false;
|
|
||||||
var log = Script.require(
|
|
||||||
'https://hifi-content.s3.amazonaws.com/milad/ROLC/d/ROLC_High-Fidelity/02_Organize/O_Projects/Repos/hifi-content/developerTools/sharedLibraries/easyLog/easyLog.js?'
|
|
||||||
+ Date.now())(DEBUG_OFF, 'nameTagListManager.js');
|
|
||||||
|
|
||||||
|
|
||||||
var EntityMaker = Script.require('./entityMaker.js?' + Date.now());
|
|
||||||
var entityProps = Script.require('./defaultLocalEntityProps.js?' + Date.now());
|
|
||||||
var textHelper = new (Script.require('./textHelper.js?' + Date.now()));
|
|
||||||
var X = 0;
|
|
||||||
var Y = 1;
|
|
||||||
var Z = 2;
|
|
||||||
var HALF = 0.5;
|
|
||||||
var CLEAR_ENTITY_EDIT_PROPS = true;
|
|
||||||
var MILISECONDS_IN_SECOND = 1000;
|
|
||||||
|
|
||||||
// *************************************
|
|
||||||
// START UTILTY
|
|
||||||
// *************************************
|
|
||||||
// #region UTILTY
|
|
||||||
|
|
||||||
|
|
||||||
// Properties to give new avatars added to the list
|
|
||||||
function NewAvatarProps() {
|
|
||||||
return {
|
|
||||||
avatarInfo: null,
|
|
||||||
previousDistance: null,
|
|
||||||
currentDistance: null,
|
|
||||||
initialDistance: null,
|
|
||||||
initialDimensions: null,
|
|
||||||
previousName: null,
|
|
||||||
timeoutStarted: false
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Makes sure clear interval exists before changing
|
|
||||||
function maybeClearInterval() {
|
|
||||||
if (_this.redrawTimeout) {
|
|
||||||
Script.clearInterval(_this.redrawTimeout);
|
|
||||||
_this.redrawTimeout = null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Calculate our initial properties for the nametag
|
|
||||||
var Z_SIZE = 0.01;
|
|
||||||
var LINE_HEIGHT_SCALER = 0.99;
|
|
||||||
var DISTANCE_SCALER_ON = 0.35;
|
|
||||||
var DISTANCE_SCALER_ALWAYS_ON = 0.50;
|
|
||||||
var distanceScaler = DISTANCE_SCALER_ON;
|
|
||||||
var userScaler = 1.0;
|
|
||||||
var DEFAULT_LINE_HEIGHT = entityProps.lineHeight;
|
|
||||||
function calculateInitialProperties(uuid) {
|
|
||||||
var avatar = _this.avatars[uuid];
|
|
||||||
var avatarInfo = avatar.avatarInfo;
|
|
||||||
|
|
||||||
var adjustedScaler = null;
|
|
||||||
var distance = null;
|
|
||||||
var dimensions = null;
|
|
||||||
var lineHeight = null;
|
|
||||||
var scaledDimensions = null;
|
|
||||||
var name = null;
|
|
||||||
|
|
||||||
// Handle if we are asking for the main or sub properties
|
|
||||||
name = avatarInfo.displayName;
|
|
||||||
|
|
||||||
// Use the text helper to calculate what our dimensions for the text box should be
|
|
||||||
textHelper
|
|
||||||
.setText(name)
|
|
||||||
.setLineHeight(DEFAULT_LINE_HEIGHT);
|
|
||||||
|
|
||||||
// Calculate the distance from the camera to the target avatar
|
|
||||||
distance = getDistance(uuid);
|
|
||||||
|
|
||||||
// Adjust the distance by the distance scaler
|
|
||||||
distanceScaler = avatarNametagMode === "on" ? DISTANCE_SCALER_ON : DISTANCE_SCALER_ALWAYS_ON;
|
|
||||||
adjustedScaler = distance * distanceScaler;
|
|
||||||
// Get the new dimensions from the text helper
|
|
||||||
dimensions = [textHelper.getTotalTextLength(), DEFAULT_LINE_HEIGHT, Z_SIZE];
|
|
||||||
// Adjust the dimensions by the modified distance scaler
|
|
||||||
scaledDimensions = Vec3.multiply(dimensions, adjustedScaler);
|
|
||||||
|
|
||||||
// Adjust the lineheight to be the new scaled dimensions Y
|
|
||||||
lineHeight = scaledDimensions[Y] * LINE_HEIGHT_SCALER;
|
|
||||||
|
|
||||||
return {
|
|
||||||
distance: distance,
|
|
||||||
scaledDimensions: scaledDimensions,
|
|
||||||
lineHeight: lineHeight
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Used in alwaysOn mode to show or hide if they reached the max radius
|
|
||||||
function showHide(uuid, type) {
|
|
||||||
var avatar = _this.avatars[uuid];
|
|
||||||
var nametag = avatar.nametag;
|
|
||||||
|
|
||||||
if (type === "show") {
|
|
||||||
nametag.show();
|
|
||||||
} else {
|
|
||||||
nametag.hide();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Go through the selected avatar list and see if any of the avatars need a redraw
|
|
||||||
function checkAllSelectedForRedraw() {
|
|
||||||
for (var avatar in _this.selectedAvatars) {
|
|
||||||
maybeRedraw(avatar);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Remake the nametags if the display name changes
|
|
||||||
function updateName(uuid) {
|
|
||||||
var avatar = _this.avatars[uuid];
|
|
||||||
avatar.nametag.destroy();
|
|
||||||
|
|
||||||
avatar.nametag = new EntityMaker('local').add(entityProps);
|
|
||||||
|
|
||||||
makeNameTag(uuid);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Get the current data for an avatar.
|
|
||||||
function getAvatarData(uuid) {
|
|
||||||
var avatar = _this.avatars[uuid];
|
|
||||||
var avatarInfo = avatar.avatarInfo;
|
|
||||||
|
|
||||||
var newAvatarInfo = AvatarManager.getAvatar(uuid);
|
|
||||||
// Save the username so it doesn't get overwritten when grabbing new avatarData
|
|
||||||
var combinedAvatarInfo = Object.assign({}, newAvatarInfo, {
|
|
||||||
username: avatarInfo === null ? null : avatarInfo.username
|
|
||||||
});
|
|
||||||
|
|
||||||
// Now combine that avatar data with the main avatar object
|
|
||||||
_this.avatars[uuid] = Object.assign({}, avatar, { avatarInfo: combinedAvatarInfo });
|
|
||||||
|
|
||||||
return _this;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Calculate the distance between the camera and the target avatar
|
|
||||||
function getDistance(uuid, checkAvatar, shouldSave) {
|
|
||||||
checkAvatar = checkAvatar || false;
|
|
||||||
shouldSave = shouldSave || true;
|
|
||||||
var eye = checkAvatar ? MyAvatar.position : Camera.position;
|
|
||||||
var avatar = _this.avatars[uuid];
|
|
||||||
var avatarInfo = avatar.avatarInfo;
|
|
||||||
|
|
||||||
var target = avatarInfo.position;
|
|
||||||
|
|
||||||
var currentDistance = Vec3.distance(target, eye);
|
|
||||||
|
|
||||||
if (!checkAvatar && shouldSave) {
|
|
||||||
avatar.previousDistance = avatar.currentDistance;
|
|
||||||
avatar.currentDistance = currentDistance;
|
|
||||||
}
|
|
||||||
|
|
||||||
return currentDistance;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Check to see if we need to toggle our interval check because we went to 0 avatars
|
|
||||||
// or if we got our first avatar in the select list
|
|
||||||
function shouldToggleInterval() {
|
|
||||||
var currentNumberOfAvatarsSelected = Object.keys(_this.selectedAvatars).length;
|
|
||||||
|
|
||||||
if (currentNumberOfAvatarsSelected === 0 && _this.redrawTimeout) {
|
|
||||||
toggleInterval();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (currentNumberOfAvatarsSelected > 0 && !_this.redrawTimeout) {
|
|
||||||
toggleInterval();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Turn off and on the redraw check
|
|
||||||
var INTERVAL_CHECK_MS = 30;
|
|
||||||
function toggleInterval() {
|
|
||||||
if (_this.redrawTimeout) {
|
|
||||||
maybeClearInterval();
|
|
||||||
} else {
|
|
||||||
_this.redrawTimeout =
|
|
||||||
Script.setInterval(checkAllSelectedForRedraw, INTERVAL_CHECK_MS);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// handle turning the peristenet mode on
|
|
||||||
function handleAlwaysOnMode(shouldTurnOnAlwaysOnMode) {
|
|
||||||
_this.reset();
|
|
||||||
if (shouldTurnOnAlwaysOnMode) {
|
|
||||||
AvatarManager
|
|
||||||
.getAvatarIdentifiers()
|
|
||||||
.forEach(function (avatar) {
|
|
||||||
if (avatar) {
|
|
||||||
add(avatar);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// #endregion
|
|
||||||
// *************************************
|
|
||||||
// END UTILTY
|
|
||||||
// *************************************
|
|
||||||
|
|
||||||
// *************************************
|
|
||||||
// START Nametag
|
|
||||||
// *************************************
|
|
||||||
// #region Nametag
|
|
||||||
|
|
||||||
|
|
||||||
var _this = null;
|
|
||||||
function nameTagListManager() {
|
|
||||||
_this = this;
|
|
||||||
|
|
||||||
_this.avatars = {};
|
|
||||||
_this.selectedAvatars = {};
|
|
||||||
_this.redrawTimeout = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Create or make visible either the sub or the main tag.
|
|
||||||
var REDRAW_TIMEOUT_AMOUNT_MS = 500;
|
|
||||||
var LEFT_MARGIN_SCALER = 0.15;
|
|
||||||
var RIGHT_MARGIN_SCALER = 0.10;
|
|
||||||
var TOP_MARGIN_SCALER = 0.07;
|
|
||||||
var BOTTOM_MARGIN_SCALER = 0.03;
|
|
||||||
var ABOVE_HEAD_OFFSET = 0.30;
|
|
||||||
var DISTANCE_SCALER_INTERPOLATION_OFFSET_ALWAYSON = 5;
|
|
||||||
var DISTANCE_SCALER_INTERPOLATION_OFFSET_ON = 10;
|
|
||||||
var maxDistance = MAX_RADIUS_IGNORE_METERS;
|
|
||||||
var onModeScalar = 0.55;
|
|
||||||
var alwaysOnModeScalar = -0.55;
|
|
||||||
function makeNameTag(uuid) {
|
|
||||||
var avatar = _this.avatars[uuid];
|
|
||||||
var avatarInfo = avatar.avatarInfo;
|
|
||||||
var nametag = avatar.nametag;
|
|
||||||
|
|
||||||
// Make sure an anonymous name is covered before sending to calculate
|
|
||||||
|
|
||||||
avatarInfo.displayName = avatarInfo.displayName === "" ? "anonymous" : avatarInfo.displayName.trim();
|
|
||||||
avatar.previousName = avatarInfo.displayName;
|
|
||||||
|
|
||||||
// Returns back the properties we need based on what we are looking for and the distance from the avatar
|
|
||||||
var calculatedProps = calculateInitialProperties(uuid);
|
|
||||||
var distance = calculatedProps.distance;
|
|
||||||
var scaledDimensions = calculatedProps.scaledDimensions;
|
|
||||||
var lineHeight = calculatedProps.lineHeight;
|
|
||||||
|
|
||||||
// Capture the inital dimensions, distance, and displayName in case we need to redraw
|
|
||||||
avatar.previousDisplayName = avatarInfo.displayName;
|
|
||||||
avatar.initialDimensions = scaledDimensions;
|
|
||||||
avatar.initialDistance = distance;
|
|
||||||
var name = avatarInfo.displayName;
|
|
||||||
var parentID = uuid;
|
|
||||||
|
|
||||||
nametag.add("text", name);
|
|
||||||
|
|
||||||
// Multiply the new dimensions and line height with the user selected scaler
|
|
||||||
scaledDimensions = Vec3.multiply(scaledDimensions, userScaler);
|
|
||||||
|
|
||||||
maxDistance = avatarNametagMode === "on"
|
|
||||||
? MAX_ON_MODE_DISTANCE + DISTANCE_SCALER_INTERPOLATION_OFFSET_ON
|
|
||||||
: MAX_RADIUS_IGNORE_METERS + DISTANCE_SCALER_INTERPOLATION_OFFSET_ALWAYSON;
|
|
||||||
var finalScaler = (distance - maxDistance) / (MIN_DISTANCE - maxDistance);
|
|
||||||
|
|
||||||
var remainder = 1 - finalScaler;
|
|
||||||
var multipliedRemainderOn = remainder * onModeScalar;
|
|
||||||
var multipliedRemainderAlwaysOn = remainder * alwaysOnModeScalar;
|
|
||||||
finalScaler = avatarNametagMode === "on" ? finalScaler + multipliedRemainderOn : finalScaler + multipliedRemainderAlwaysOn;
|
|
||||||
|
|
||||||
scaledDimensions = Vec3.multiply(scaledDimensions, finalScaler);
|
|
||||||
|
|
||||||
lineHeight = scaledDimensions[Y] * LINE_HEIGHT_SCALER;
|
|
||||||
// Add some room for the margin by using lineHeight as a reference
|
|
||||||
scaledDimensions[X] += (lineHeight * LEFT_MARGIN_SCALER) + (lineHeight * RIGHT_MARGIN_SCALER);
|
|
||||||
scaledDimensions[Y] += (lineHeight * TOP_MARGIN_SCALER) + (lineHeight * BOTTOM_MARGIN_SCALER);
|
|
||||||
|
|
||||||
var scaledDimenionsYHalf = scaledDimensions[Y] * HALF;
|
|
||||||
var AvatarData = AvatarManager.getAvatar(uuid);
|
|
||||||
var headJointIndex = AvatarData.getJointIndex("Head");
|
|
||||||
var jointInObjectFrame = AvatarData.getAbsoluteJointTranslationInObjectFrame(headJointIndex);
|
|
||||||
var nameTagPosition = jointInObjectFrame.y + scaledDimenionsYHalf + ABOVE_HEAD_OFFSET;
|
|
||||||
var localPosition = [0, nameTagPosition, 0];
|
|
||||||
|
|
||||||
var visible = true;
|
|
||||||
if (avatarNametagMode === "alwaysOn") {
|
|
||||||
var currentDistance = getDistance(uuid, CHECK_AVATAR, false);
|
|
||||||
visible = currentDistance > MAX_RADIUS_IGNORE_METERS ? false : true;
|
|
||||||
}
|
|
||||||
|
|
||||||
nametag
|
|
||||||
.add("leftMargin", lineHeight * LEFT_MARGIN_SCALER)
|
|
||||||
.add("rightMargin", lineHeight * RIGHT_MARGIN_SCALER)
|
|
||||||
.add("topMargin", lineHeight * TOP_MARGIN_SCALER)
|
|
||||||
.add("bottomMargin", lineHeight * BOTTOM_MARGIN_SCALER)
|
|
||||||
.add("lineHeight", lineHeight)
|
|
||||||
.add("dimensions", scaledDimensions)
|
|
||||||
.add("parentID", parentID)
|
|
||||||
.add("localPosition", localPosition)
|
|
||||||
.add("visible", visible)
|
|
||||||
.create(CLEAR_ENTITY_EDIT_PROPS);
|
|
||||||
|
|
||||||
Script.setTimeout(function () {
|
|
||||||
nametag.edit("visible", true);
|
|
||||||
}, REDRAW_TIMEOUT_AMOUNT_MS);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Check to see if the display named changed or if the distance is big enough to need a redraw.
|
|
||||||
var MAX_RADIUS_IGNORE_METERS = 22;
|
|
||||||
var MAX_ON_MODE_DISTANCE = 30;
|
|
||||||
var CHECK_AVATAR = true;
|
|
||||||
var MIN_DISTANCE = 0.2;
|
|
||||||
function maybeRedraw(uuid) {
|
|
||||||
var avatar = _this.avatars[uuid];
|
|
||||||
var avatarInfo = avatar.avatarInfo;
|
|
||||||
getAvatarData(uuid);
|
|
||||||
|
|
||||||
getDistance(uuid);
|
|
||||||
var avatarDistance = getDistance(uuid, CHECK_AVATAR, false);
|
|
||||||
if (avatarNametagMode === "alwaysOn" && avatarDistance > MAX_RADIUS_IGNORE_METERS) {
|
|
||||||
showHide(uuid, "hide");
|
|
||||||
}
|
|
||||||
|
|
||||||
if (avatarNametagMode === "alwaysOn" && avatarDistance < MAX_RADIUS_IGNORE_METERS) {
|
|
||||||
showHide(uuid, "show");
|
|
||||||
}
|
|
||||||
|
|
||||||
avatarInfo.displayName = avatarInfo.displayName === "" ? "anonymous" : avatarInfo.displayName.trim();
|
|
||||||
|
|
||||||
if (avatar.previousName !== avatarInfo.displayName) {
|
|
||||||
updateName(uuid, avatarInfo.displayName);
|
|
||||||
} else {
|
|
||||||
redraw(uuid);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Handle redrawing if needed
|
|
||||||
function redraw(uuid) {
|
|
||||||
var avatar = _this.avatars[uuid];
|
|
||||||
|
|
||||||
var nametag = avatar.nametag;
|
|
||||||
var initialDimensions = null;
|
|
||||||
var initialDistance = null;
|
|
||||||
var currentDistance = null;
|
|
||||||
var newDimensions = null;
|
|
||||||
var lineHeight = null;
|
|
||||||
|
|
||||||
initialDistance = avatar.initialDistance;
|
|
||||||
currentDistance = avatar.currentDistance;
|
|
||||||
|
|
||||||
initialDimensions = avatar.initialDimensions;
|
|
||||||
|
|
||||||
// Find our new dimensions from the new distance
|
|
||||||
newDimensions = [
|
|
||||||
(initialDimensions[X] / initialDistance) * currentDistance,
|
|
||||||
(initialDimensions[Y] / initialDistance) * currentDistance,
|
|
||||||
(initialDimensions[Z] / initialDistance) * currentDistance
|
|
||||||
];
|
|
||||||
|
|
||||||
// Multiply the new dimensions and line height with the user selected scaler
|
|
||||||
newDimensions = Vec3.multiply(newDimensions, userScaler);
|
|
||||||
|
|
||||||
var distance = getDistance(uuid, false, false);
|
|
||||||
|
|
||||||
maxDistance = avatarNametagMode === "on"
|
|
||||||
? MAX_ON_MODE_DISTANCE + DISTANCE_SCALER_INTERPOLATION_OFFSET_ON
|
|
||||||
: MAX_RADIUS_IGNORE_METERS + DISTANCE_SCALER_INTERPOLATION_OFFSET_ALWAYSON;
|
|
||||||
var finalScaler = (distance - maxDistance) / (MIN_DISTANCE - maxDistance);
|
|
||||||
var remainder = 1 - finalScaler;
|
|
||||||
var multipliedRemainderOn = remainder * onModeScalar;
|
|
||||||
var multipliedRemainderAlwaysOn = remainder * alwaysOnModeScalar;
|
|
||||||
finalScaler = avatarNametagMode === "on" ? finalScaler + multipliedRemainderOn : finalScaler + multipliedRemainderAlwaysOn;
|
|
||||||
|
|
||||||
newDimensions = Vec3.multiply(newDimensions, finalScaler);
|
|
||||||
|
|
||||||
lineHeight = newDimensions[Y] * LINE_HEIGHT_SCALER;
|
|
||||||
|
|
||||||
// Add some room for the margin by using lineHeight as a reference
|
|
||||||
newDimensions[X] += (lineHeight * LEFT_MARGIN_SCALER) + (lineHeight * RIGHT_MARGIN_SCALER);
|
|
||||||
newDimensions[Y] += (lineHeight * TOP_MARGIN_SCALER) + (lineHeight * BOTTOM_MARGIN_SCALER);
|
|
||||||
|
|
||||||
// We can generalize some of the processes that are similar in makeNameTag() and redraw() if we wanted to reduce some code
|
|
||||||
var newDimenionsYHalf = newDimensions[Y] * HALF;
|
|
||||||
var AvatarData = AvatarManager.getAvatar(uuid);
|
|
||||||
var headJointIndex = AvatarData.getJointIndex("Head");
|
|
||||||
var jointInObjectFrame = AvatarData.getAbsoluteJointTranslationInObjectFrame(headJointIndex);
|
|
||||||
var nameTagPosition = jointInObjectFrame.y + newDimenionsYHalf + ABOVE_HEAD_OFFSET;
|
|
||||||
var localPosition = [0, nameTagPosition, 0];
|
|
||||||
|
|
||||||
nametag
|
|
||||||
.add("leftMargin", lineHeight * LEFT_MARGIN_SCALER)
|
|
||||||
.add("rightMargin", lineHeight * RIGHT_MARGIN_SCALER)
|
|
||||||
.add("topMargin", lineHeight * TOP_MARGIN_SCALER)
|
|
||||||
.add("bottomMargin", lineHeight * BOTTOM_MARGIN_SCALER)
|
|
||||||
.add("lineHeight", lineHeight)
|
|
||||||
.add("dimensions", newDimensions)
|
|
||||||
.add("localPosition", localPosition)
|
|
||||||
.sync();
|
|
||||||
}
|
|
||||||
|
|
||||||
// Add a user to the list.
|
|
||||||
var DEFAULT_LIFETIME = entityProps.lifetime;
|
|
||||||
|
|
||||||
|
|
||||||
// add a user to our current selections
|
|
||||||
function add(uuid) {
|
|
||||||
// User Doesn't exist so give them new props and save in the cache, and get their current avatar info.
|
|
||||||
if (!_this.avatars[uuid]) {
|
|
||||||
_this.avatars[uuid] = new NewAvatarProps();
|
|
||||||
getAvatarData(uuid);
|
|
||||||
}
|
|
||||||
|
|
||||||
var avatar = _this.avatars[uuid];
|
|
||||||
|
|
||||||
_this.selectedAvatars[uuid] = true;
|
|
||||||
if (avatarNametagMode === "alwaysOn") {
|
|
||||||
entityProps.lifetime = -1;
|
|
||||||
} else {
|
|
||||||
entityProps.lifetime = DEFAULT_LIFETIME;
|
|
||||||
}
|
|
||||||
|
|
||||||
avatar.nametag = new EntityMaker('local').add(entityProps);
|
|
||||||
|
|
||||||
// When the user clicks someone, we create their nametag
|
|
||||||
makeNameTag(uuid);
|
|
||||||
var deleteEnttyInMiliseconds = entityProps.lifetime * MILISECONDS_IN_SECOND;
|
|
||||||
|
|
||||||
// Remove from list after lifetime is over
|
|
||||||
if (avatarNametagMode === "on") {
|
|
||||||
avatar.timeoutStarted = Script.setTimeout(function () {
|
|
||||||
removeNametag(uuid);
|
|
||||||
}, deleteEnttyInMiliseconds);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Check to see if anyone is in the selected list now to see if we need to start the interval checking
|
|
||||||
shouldToggleInterval();
|
|
||||||
|
|
||||||
return _this;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Remove the avatar from the list.
|
|
||||||
function remove(uuid) {
|
|
||||||
if (_this.selectedAvatars[uuid]) {
|
|
||||||
delete _this.selectedAvatars[uuid];
|
|
||||||
}
|
|
||||||
|
|
||||||
removeNametag(uuid);
|
|
||||||
|
|
||||||
shouldToggleInterval();
|
|
||||||
delete _this.avatars[uuid];
|
|
||||||
|
|
||||||
return _this;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Remove all the current nametags.
|
|
||||||
function removeAllNametags() {
|
|
||||||
for (var uuid in _this.selectedAvatars) {
|
|
||||||
removeNametag(uuid);
|
|
||||||
}
|
|
||||||
|
|
||||||
return _this;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Remove a single Nametag.
|
|
||||||
function removeNametag(uuid) {
|
|
||||||
var avatar = _this.avatars[uuid];
|
|
||||||
|
|
||||||
if (avatar) {
|
|
||||||
avatar.nametag.destroy();
|
|
||||||
delete _this.selectedAvatars[uuid];
|
|
||||||
return _this;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// #endregion
|
|
||||||
// *************************************
|
|
||||||
// END Nametag
|
|
||||||
// *************************************
|
|
||||||
|
|
||||||
// *************************************
|
|
||||||
// START API
|
|
||||||
// *************************************
|
|
||||||
// #region API
|
|
||||||
|
|
||||||
|
|
||||||
// Create the manager and hook up username signal
|
|
||||||
function create() {
|
|
||||||
|
|
||||||
return _this;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Destory the manager and disconnect from username signal
|
|
||||||
function destroy() {
|
|
||||||
_this.reset();
|
|
||||||
return _this;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Check to see if we need to delete any close by nametags
|
|
||||||
var MAX_DELETE_RANGE = 4;
|
|
||||||
function checkIfAnyAreClose(target) {
|
|
||||||
var targetPosition = AvatarManager.getAvatar(target).position;
|
|
||||||
for (var uuid in _this.selectedAvatars) {
|
|
||||||
var position = AvatarManager.getAvatar(uuid).position;
|
|
||||||
var distance = Vec3.distance(position, targetPosition);
|
|
||||||
if (distance <= MAX_DELETE_RANGE) {
|
|
||||||
var timeoutStarted = _this.avatars[uuid].timeoutStarted;
|
|
||||||
if (timeoutStarted) {
|
|
||||||
Script.clearTimeout(timeoutStarted);
|
|
||||||
timeoutStarted = null;
|
|
||||||
}
|
|
||||||
removeNametag(uuid);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Handles what happens when an avatar gets triggered on
|
|
||||||
function handleSelect(uuid) {
|
|
||||||
if (avatarNametagMode === "off" || avatarNametagMode === "alwaysOn") {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
var inSelected = uuid in _this.selectedAvatars;
|
|
||||||
|
|
||||||
if (inSelected) {
|
|
||||||
if (avatarNametagMode === "on") {
|
|
||||||
var timeoutStarted = _this.avatars[uuid].timeoutStarted;
|
|
||||||
if (timeoutStarted) {
|
|
||||||
Script.clearTimeout(timeoutStarted);
|
|
||||||
timeoutStarted = null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
removeNametag(uuid);
|
|
||||||
|
|
||||||
} else {
|
|
||||||
checkIfAnyAreClose(uuid);
|
|
||||||
add(uuid);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Check to see if we need to clear timeouts for avatars
|
|
||||||
function maybeClearAllTimeouts() {
|
|
||||||
for (var uuid in _this.selectedAvatars) {
|
|
||||||
var timeoutStarted = _this.avatars[uuid].timeoutStarted;
|
|
||||||
if (timeoutStarted) {
|
|
||||||
Script.clearTimeout(timeoutStarted);
|
|
||||||
timeoutStarted = null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Check to see if the uuid is in the avatars list before removing
|
|
||||||
function maybeRemove(uuid) {
|
|
||||||
if (uuid in _this.avatars) {
|
|
||||||
remove(uuid);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Check to see if we need to add this user to our list
|
|
||||||
function maybeAdd(uuid) {
|
|
||||||
if (uuid && avatarNametagMode === "alwaysOn" && !(uuid in _this.avatars)) {
|
|
||||||
add(uuid);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Register the beggining scaler in case it was saved from a previous session
|
|
||||||
function registerInitialScaler(initalScaler) {
|
|
||||||
userScaler = initalScaler;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Handle the user updating scale
|
|
||||||
function updateUserScaler(newUSerScaler) {
|
|
||||||
userScaler = newUSerScaler;
|
|
||||||
for (var avatar in _this.selectedAvatars) {
|
|
||||||
redraw(avatar);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Reset the avatar list
|
|
||||||
function reset() {
|
|
||||||
maybeClearAllTimeouts();
|
|
||||||
removeAllNametags();
|
|
||||||
_this.avatars = {};
|
|
||||||
shouldToggleInterval();
|
|
||||||
|
|
||||||
return _this;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Update the nametag display mode
|
|
||||||
var avatarNametagMode = "on";
|
|
||||||
function handleAvatarNametagMode(newAvatarNametagMode) {
|
|
||||||
if (avatarNametagMode === "alwaysOn") {
|
|
||||||
handleAlwaysOnMode(false);
|
|
||||||
}
|
|
||||||
|
|
||||||
avatarNametagMode = newAvatarNametagMode;
|
|
||||||
if (avatarNametagMode === "alwaysOn") {
|
|
||||||
handleAlwaysOnMode(true);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (avatarNametagMode === "off" || avatarNametagMode === "on") {
|
|
||||||
reset();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// #endregion
|
|
||||||
// *************************************
|
|
||||||
// END API
|
|
||||||
// *************************************
|
|
||||||
|
|
||||||
|
|
||||||
nameTagListManager.prototype = {
|
|
||||||
create: create,
|
|
||||||
destroy: destroy,
|
|
||||||
handleSelect: handleSelect,
|
|
||||||
maybeRemove: maybeRemove,
|
|
||||||
maybeAdd: maybeAdd,
|
|
||||||
registerInitialScaler: registerInitialScaler,
|
|
||||||
updateUserScaler: updateUserScaler,
|
|
||||||
handleAvatarNametagMode: handleAvatarNametagMode,
|
|
||||||
reset: reset
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
module.exports = nameTagListManager;
|
|
|
@ -1,32 +0,0 @@
|
||||||
// taken from https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/assign
|
|
||||||
|
|
||||||
if (typeof Object.assign != 'function') {
|
|
||||||
// Must be writable: true, enumerable: false, configurable: true
|
|
||||||
Object.defineProperty(Object, "assign", {
|
|
||||||
value: function assign(target, varArgs) { // .length of function is 2
|
|
||||||
'use strict';
|
|
||||||
if (target == null) { // TypeError if undefined or null
|
|
||||||
throw new TypeError('Cannot convert undefined or null to object');
|
|
||||||
}
|
|
||||||
|
|
||||||
var to = Object(target);
|
|
||||||
|
|
||||||
for (var index = 1; index < arguments.length; index++) {
|
|
||||||
var nextSource = arguments[index];
|
|
||||||
|
|
||||||
if (nextSource != null) { // Skip over if undefined or null
|
|
||||||
for (var nextKey in nextSource) {
|
|
||||||
// Avoid bugs when hasOwnProperty is shadowed
|
|
||||||
if (Object.prototype.hasOwnProperty.call(nextSource, nextKey)) {
|
|
||||||
to[nextKey] = nextSource[nextKey];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return to;
|
|
||||||
},
|
|
||||||
writable: true,
|
|
||||||
configurable: true
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,305 +0,0 @@
|
||||||
//
|
|
||||||
// Simplified Nametag
|
|
||||||
// pickRayController.js
|
|
||||||
// Created by Milad Nazeri on 2019-03-08
|
|
||||||
// Copyright 2019 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
|
|
||||||
//
|
|
||||||
// Easy pickray controllers for Entities, Overlays, and Avatars
|
|
||||||
//
|
|
||||||
|
|
||||||
|
|
||||||
var _this;
|
|
||||||
function PickRayController(){
|
|
||||||
_this = this;
|
|
||||||
|
|
||||||
_this.rayType = null;
|
|
||||||
_this.eventHandler = null;
|
|
||||||
_this.intersection = null;
|
|
||||||
_this.lastPick = null;
|
|
||||||
_this.currentPick = null;
|
|
||||||
_this.mappingName = null;
|
|
||||||
_this.mapping = null;
|
|
||||||
_this._boundMousePressHandler = null;
|
|
||||||
_this.shouldDoublePress = null;
|
|
||||||
_this.controllEnabled = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// *************************************
|
|
||||||
// START UTILITY
|
|
||||||
// *************************************
|
|
||||||
// #region UTILITY
|
|
||||||
|
|
||||||
|
|
||||||
// Returns the right UUID based on hand triggered
|
|
||||||
function getUUIDFromLaser(hand) {
|
|
||||||
hand = hand === Controller.Standard.LeftHand
|
|
||||||
? Controller.Standard.LeftHand
|
|
||||||
: Controller.Standard.RightHand;
|
|
||||||
|
|
||||||
var pose = getControllerWorldLocation(hand);
|
|
||||||
var start = pose.position;
|
|
||||||
// Get the direction that the hand is facing in the world
|
|
||||||
var direction = Vec3.multiplyQbyV(pose.orientation, [0, 1, 0]);
|
|
||||||
|
|
||||||
pickRayTypeHandler(start, direction);
|
|
||||||
|
|
||||||
if (_this.currentPick) {
|
|
||||||
_this.eventHandler(_this.currentPick, _this.intersection);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// The following two functions are a modified version of what's found in scripts/system/libraries/controllers.js
|
|
||||||
|
|
||||||
// Utility function for the ControllerWorldLocation offset
|
|
||||||
function getGrabPointSphereOffset(handController) {
|
|
||||||
// These values must match what's in scripts/system/libraries/controllers.js
|
|
||||||
// x = upward, y = forward, z = lateral
|
|
||||||
var GRAB_POINT_SPHERE_OFFSET = { x: 0.04, y: 0.13, z: 0.039 };
|
|
||||||
var offset = GRAB_POINT_SPHERE_OFFSET;
|
|
||||||
if (handController === Controller.Standard.LeftHand) {
|
|
||||||
offset = {
|
|
||||||
x: -GRAB_POINT_SPHERE_OFFSET.x,
|
|
||||||
y: GRAB_POINT_SPHERE_OFFSET.y,
|
|
||||||
z: GRAB_POINT_SPHERE_OFFSET.z
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
return Vec3.multiply(MyAvatar.sensorToWorldScale, offset);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// controllerWorldLocation is where the controller would be, in-world, with an added offset
|
|
||||||
function getControllerWorldLocation(handController, doOffset) {
|
|
||||||
var orientation;
|
|
||||||
var position;
|
|
||||||
var valid = false;
|
|
||||||
|
|
||||||
if (handController >= 0) {
|
|
||||||
var pose = Controller.getPoseValue(handController);
|
|
||||||
valid = pose.valid;
|
|
||||||
var controllerJointIndex;
|
|
||||||
if (pose.valid) {
|
|
||||||
if (handController === Controller.Standard.RightHand) {
|
|
||||||
controllerJointIndex = MyAvatar.getJointIndex("_CAMERA_RELATIVE_CONTROLLER_RIGHTHAND");
|
|
||||||
} else {
|
|
||||||
controllerJointIndex = MyAvatar.getJointIndex("_CAMERA_RELATIVE_CONTROLLER_LEFTHAND");
|
|
||||||
}
|
|
||||||
orientation = Quat.multiply(MyAvatar.orientation, MyAvatar.getAbsoluteJointRotationInObjectFrame(controllerJointIndex));
|
|
||||||
position = Vec3.sum(MyAvatar.position, Vec3.multiplyQbyV(MyAvatar.orientation, MyAvatar.getAbsoluteJointTranslationInObjectFrame(controllerJointIndex)));
|
|
||||||
|
|
||||||
// add to the real position so the grab-point is out in front of the hand, a bit
|
|
||||||
if (doOffset) {
|
|
||||||
var offset = getGrabPointSphereOffset(handController);
|
|
||||||
position = Vec3.sum(position, Vec3.multiplyQbyV(orientation, offset));
|
|
||||||
}
|
|
||||||
|
|
||||||
} else if (!HMD.isHandControllerAvailable()) {
|
|
||||||
// NOTE: keep _this offset in sync with scripts/system/controllers/handControllerPointer.js:493
|
|
||||||
var VERTICAL_HEAD_LASER_OFFSET = 0.1 * MyAvatar.sensorToWorldScale;
|
|
||||||
position = Vec3.sum(Camera.position, Vec3.multiplyQbyV(Camera.orientation, { x: 0, y: VERTICAL_HEAD_LASER_OFFSET, z: 0 }));
|
|
||||||
orientation = Quat.multiply(Camera.orientation, Quat.angleAxis(-90, { x: 1, y: 0, z: 0 }));
|
|
||||||
valid = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return {
|
|
||||||
position: position,
|
|
||||||
translation: position,
|
|
||||||
orientation: orientation,
|
|
||||||
rotation: orientation,
|
|
||||||
valid: valid
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Handle if the uuid picked on is new or different
|
|
||||||
function handleUUID(uuid){
|
|
||||||
if (!_this.lastPick && !_this.currentPick) {
|
|
||||||
_this.currentPick = uuid;
|
|
||||||
_this.lastPick = uuid;
|
|
||||||
} else {
|
|
||||||
_this.lastPick = _this.currentPick;
|
|
||||||
_this.currentPick = uuid;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
function pickRayTypeHandler(pickRay){
|
|
||||||
// Handle if pickray is system generated or user generated
|
|
||||||
if (arguments.length === 2) {
|
|
||||||
pickRay = { origin: arguments[0], direction: arguments[1] };
|
|
||||||
}
|
|
||||||
|
|
||||||
// Each different ray pick type needs a different findRayIntersection function
|
|
||||||
switch (_this.rayType) {
|
|
||||||
case 'avatar':
|
|
||||||
var avatarIntersection = AvatarList.findRayIntersection(pickRay, [], [MyAvatar.sessionUUID], false);
|
|
||||||
_this.intersection = avatarIntersection;
|
|
||||||
handleUUID(avatarIntersection.avatarID);
|
|
||||||
break;
|
|
||||||
case 'local':
|
|
||||||
var overlayIntersection = Overlays.findRayIntersection(pickRay, [], []);
|
|
||||||
_this.intersection = overlayIntersection;
|
|
||||||
handleUUID(overlayIntersection.overlayID);
|
|
||||||
break;
|
|
||||||
case 'entity':
|
|
||||||
var entityIntersection = Entities.findRayIntersection(pickRay, [], []);
|
|
||||||
_this.intersection = entityIntersection;
|
|
||||||
handleUUID(entityIntersection.avatarID);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
console.log("ray type not handled");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Handle the interaction when in desktop and a mouse is pressed
|
|
||||||
function mousePressHandler(event) {
|
|
||||||
if (HMD.active || !event.isLeftButton) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
var pickRay = Camera.computePickRay(event.x, event.y);
|
|
||||||
pickRayTypeHandler(pickRay);
|
|
||||||
if (_this.currentPick) {
|
|
||||||
_this.eventHandler(_this.currentPick, _this.intersection);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Function to call when double press is singled
|
|
||||||
function doublePressHandler(event) {
|
|
||||||
mousePressHandler(event);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// #endregion
|
|
||||||
// *************************************
|
|
||||||
// END UTILITY
|
|
||||||
// *************************************
|
|
||||||
|
|
||||||
// *************************************
|
|
||||||
// START API
|
|
||||||
// *************************************
|
|
||||||
// #region API
|
|
||||||
|
|
||||||
|
|
||||||
// After setup is given, this gets the Controller ready to be enabled
|
|
||||||
function create(){
|
|
||||||
_this.mapping = Controller.newMapping(_this.mappingName);
|
|
||||||
|
|
||||||
_this.mapping.from(Controller.Standard.LTClick).to(function (value) {
|
|
||||||
if (value === 0) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
getUUIDFromLaser(Controller.Standard.LeftHand);
|
|
||||||
});
|
|
||||||
|
|
||||||
|
|
||||||
_this.mapping.from(Controller.Standard.RTClick).to(function (value) {
|
|
||||||
if (value === 0) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
getUUIDFromLaser(Controller.Standard.RightHand);
|
|
||||||
});
|
|
||||||
|
|
||||||
return _this;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Set type of raypick for what kind of uuids to return
|
|
||||||
function setType(type){
|
|
||||||
_this.rayType = type;
|
|
||||||
|
|
||||||
return _this;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Set if double presses should register as well
|
|
||||||
function setShouldDoublePress(shouldDoublePress){
|
|
||||||
_this.shouldDoublePress = shouldDoublePress;
|
|
||||||
|
|
||||||
return _this;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Set the mapping name for the controller
|
|
||||||
function setMapName(name) {
|
|
||||||
_this.mappingName = name;
|
|
||||||
|
|
||||||
return _this;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Enables mouse press and trigger events
|
|
||||||
function enable(){
|
|
||||||
if (!_this.controllEnabled) {
|
|
||||||
Controller.mousePressEvent.connect(mousePressHandler);
|
|
||||||
if (_this.shouldDoublePress) {
|
|
||||||
Controller.mouseDoublePressEvent.connect(doublePressHandler);
|
|
||||||
}
|
|
||||||
Controller.enableMapping(_this.mappingName);
|
|
||||||
_this.controllEnabled = true;
|
|
||||||
|
|
||||||
return _this;
|
|
||||||
}
|
|
||||||
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Disable the controller and mouse press
|
|
||||||
function disable(){
|
|
||||||
if (_this.controllEnabled) {
|
|
||||||
Controller.mousePressEvent.disconnect(mousePressHandler);
|
|
||||||
if (_this.shouldDoublePress){
|
|
||||||
Controller.mouseDoublePressEvent.disconnect(doublePressHandler);
|
|
||||||
}
|
|
||||||
Controller.disableMapping(_this.mappingName);
|
|
||||||
_this.controllEnabled = false;
|
|
||||||
|
|
||||||
return _this;
|
|
||||||
}
|
|
||||||
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Synonym for disable
|
|
||||||
function destroy(){
|
|
||||||
_this.disable();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Register the function to be called on a click
|
|
||||||
function registerEventHandler(fn){
|
|
||||||
_this.eventHandler = fn;
|
|
||||||
|
|
||||||
return _this;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// #endregion
|
|
||||||
// *************************************
|
|
||||||
// END API
|
|
||||||
// *************************************
|
|
||||||
|
|
||||||
PickRayController.prototype = {
|
|
||||||
create: create,
|
|
||||||
setType: setType,
|
|
||||||
setShouldDoublePress: setShouldDoublePress,
|
|
||||||
setMapName: setMapName,
|
|
||||||
enable: enable,
|
|
||||||
disable: disable,
|
|
||||||
destroy: destroy,
|
|
||||||
registerEventHandler: registerEventHandler
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
module.exports = PickRayController;
|
|
|
@ -1,224 +0,0 @@
|
||||||
//
|
|
||||||
// Simplified Nametag
|
|
||||||
// textHelper.js
|
|
||||||
// Created by Milad Nazeri on 2019-03-08
|
|
||||||
// Copyright 2019 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
|
|
||||||
//
|
|
||||||
// Module to help calculate text size
|
|
||||||
//
|
|
||||||
|
|
||||||
|
|
||||||
// *************************************
|
|
||||||
// START MAPS
|
|
||||||
// *************************************
|
|
||||||
// #region MAPS
|
|
||||||
|
|
||||||
|
|
||||||
var charMap = {
|
|
||||||
a: 0.05,
|
|
||||||
b: 0.051,
|
|
||||||
c: 0.05,
|
|
||||||
d: 0.051,
|
|
||||||
e: 0.05,
|
|
||||||
f: 0.035,
|
|
||||||
g: 0.051,
|
|
||||||
h: 0.051,
|
|
||||||
i: 0.025,
|
|
||||||
j: 0.025,
|
|
||||||
k: 0.05,
|
|
||||||
l: 0.025,
|
|
||||||
m: 0.0775,
|
|
||||||
n: 0.051,
|
|
||||||
o: 0.051,
|
|
||||||
p: 0.051,
|
|
||||||
q: 0.051,
|
|
||||||
r: 0.035,
|
|
||||||
s: 0.05,
|
|
||||||
t: 0.035,
|
|
||||||
u: 0.051,
|
|
||||||
v: 0.05,
|
|
||||||
w: 0.07,
|
|
||||||
x: 0.05,
|
|
||||||
y: 0.05,
|
|
||||||
z: 0.05,
|
|
||||||
A: 0.06,
|
|
||||||
B: 0.06,
|
|
||||||
C: 0.06,
|
|
||||||
D: 0.06,
|
|
||||||
E: 0.05,
|
|
||||||
F: 0.05,
|
|
||||||
G: 0.06,
|
|
||||||
H: 0.0625,
|
|
||||||
I: 0.0275,
|
|
||||||
J: 0.05,
|
|
||||||
K: 0.06,
|
|
||||||
L: 0.05,
|
|
||||||
M: 0.075,
|
|
||||||
N: 0.0625,
|
|
||||||
O: 0.0625,
|
|
||||||
P: 0.06,
|
|
||||||
Q: 0.0625,
|
|
||||||
R: 0.06,
|
|
||||||
S: 0.06,
|
|
||||||
T: 0.06,
|
|
||||||
U: 0.06,
|
|
||||||
V: 0.06,
|
|
||||||
W: 0.075,
|
|
||||||
X: 0.06,
|
|
||||||
Y: 0.06,
|
|
||||||
Z: 0.06
|
|
||||||
};
|
|
||||||
|
|
||||||
var symbolMap = {
|
|
||||||
"!": 0.025,
|
|
||||||
"@": 0.08,
|
|
||||||
"#": 0.07,
|
|
||||||
"$": 0.058,
|
|
||||||
"%": 0.07,
|
|
||||||
"^": 0.04,
|
|
||||||
"&": 0.06,
|
|
||||||
"*": 0.04,
|
|
||||||
"(": 0.04,
|
|
||||||
")": 0.04,
|
|
||||||
"_": 0.041,
|
|
||||||
"{": 0.034,
|
|
||||||
"}": 0.034,
|
|
||||||
"/": 0.04,
|
|
||||||
"|": 0.02,
|
|
||||||
"<": 0.049,
|
|
||||||
">": 0.049,
|
|
||||||
"[": 0.0300,
|
|
||||||
"]": 0.0300,
|
|
||||||
".": 0.0260,
|
|
||||||
",": 0.0260,
|
|
||||||
"?": 0.048,
|
|
||||||
"~": 0.0610,
|
|
||||||
"`": 0.0310,
|
|
||||||
"+": 0.0510,
|
|
||||||
"=": 0.0510
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
// #endregion
|
|
||||||
// *************************************
|
|
||||||
// END MAPS
|
|
||||||
// *************************************
|
|
||||||
|
|
||||||
var _this = null;
|
|
||||||
function TextHelper(){
|
|
||||||
_this = this;
|
|
||||||
|
|
||||||
this.text = "";
|
|
||||||
this.textArray = "";
|
|
||||||
this.lineHeight = 0;
|
|
||||||
this.totalTextLength = 0;
|
|
||||||
this.scaler = 1.0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// *************************************
|
|
||||||
// START UTILITY
|
|
||||||
// *************************************
|
|
||||||
// #region UTILITY
|
|
||||||
|
|
||||||
|
|
||||||
// Split the string into a text array to be operated on
|
|
||||||
function createTextArray(){
|
|
||||||
_this.textArray = _this.text.split("");
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Account for the text length
|
|
||||||
function adjustForScale(defaultTextLength){
|
|
||||||
_this.totalTextLength = defaultTextLength * _this.scaler;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// #endregion
|
|
||||||
// *************************************
|
|
||||||
// END UTILITY
|
|
||||||
// *************************************
|
|
||||||
|
|
||||||
// #endregion
|
|
||||||
// *************************************
|
|
||||||
// END name
|
|
||||||
// *************************************
|
|
||||||
|
|
||||||
// *************************************
|
|
||||||
// START API
|
|
||||||
// *************************************
|
|
||||||
// #region API
|
|
||||||
|
|
||||||
|
|
||||||
// Set the text that needs to be calculated on
|
|
||||||
function setText(newText){
|
|
||||||
_this.text = newText;
|
|
||||||
createTextArray();
|
|
||||||
|
|
||||||
return _this;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Set the line height which helps calculate the font size
|
|
||||||
var DEFAULT_LINE_HEIGHT = 0.1;
|
|
||||||
function setLineHeight(newLineHeight){
|
|
||||||
_this.lineHeight = newLineHeight;
|
|
||||||
_this.scaler = _this.lineHeight / DEFAULT_LINE_HEIGHT;
|
|
||||||
|
|
||||||
return _this;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Calculate the sign dimensions
|
|
||||||
var DEFAULT_CHAR_SIZE = 0.025;
|
|
||||||
var NUMBER = 0.05;
|
|
||||||
var DIGIT_REGEX = /\d/g;
|
|
||||||
var WHITE_SPACE_REGEX = /[ ]/g;
|
|
||||||
var SPACE = 0.018;
|
|
||||||
function getTotalTextLength(){
|
|
||||||
// Map the string array to it's sizes
|
|
||||||
var lengthArray = _this.textArray.map(function(letter){
|
|
||||||
if (charMap[letter]){
|
|
||||||
return charMap[letter];
|
|
||||||
} else if (letter.match(DIGIT_REGEX)){
|
|
||||||
return NUMBER;
|
|
||||||
} else if (symbolMap[letter]) {
|
|
||||||
return symbolMap[letter];
|
|
||||||
} else if (letter.match(WHITE_SPACE_REGEX)) {
|
|
||||||
return SPACE;
|
|
||||||
} else {
|
|
||||||
return DEFAULT_CHAR_SIZE;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
// add up all the values in the array
|
|
||||||
var defaultTextLength = lengthArray.reduce(function(prev, curr){
|
|
||||||
return prev + curr;
|
|
||||||
}, 0);
|
|
||||||
|
|
||||||
adjustForScale(defaultTextLength);
|
|
||||||
|
|
||||||
return _this.totalTextLength;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// #endregion
|
|
||||||
// *************************************
|
|
||||||
// END API
|
|
||||||
// *************************************
|
|
||||||
|
|
||||||
TextHelper.prototype = {
|
|
||||||
setText: setText,
|
|
||||||
setLineHeight: setLineHeight,
|
|
||||||
getTotalTextLength: getTotalTextLength
|
|
||||||
};
|
|
||||||
|
|
||||||
module.exports = TextHelper;
|
|
||||||
|
|
||||||
// var text = new TextHelper();
|
|
||||||
// text.setText("lowbar");
|
|
||||||
// text.setLineHeight("0.1");
|
|
||||||
// text.getTotalTextLength();
|
|
|
@ -1,95 +0,0 @@
|
||||||
//
|
|
||||||
// Simplified Nametag
|
|
||||||
// Created by Milad Nazeri on 2019-02-16
|
|
||||||
// Copyright 2019 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
|
|
||||||
//
|
|
||||||
// Click on someone to get a nametag for them
|
|
||||||
//
|
|
||||||
var PickRayController = Script.require('./resources/modules/pickRayController.js?' + Date.now());
|
|
||||||
var NameTagListManager = Script.require('./resources/modules/nameTagListManager.js?' + Date.now());
|
|
||||||
var pickRayController = new PickRayController();
|
|
||||||
var nameTagListManager = new NameTagListManager();
|
|
||||||
|
|
||||||
// Handles avatar being solo'd
|
|
||||||
pickRayController
|
|
||||||
.registerEventHandler(selectAvatar)
|
|
||||||
.setType("avatar")
|
|
||||||
.setMapName("hifi_simplifiedNametag")
|
|
||||||
.setShouldDoublePress(true)
|
|
||||||
.create()
|
|
||||||
.enable();
|
|
||||||
|
|
||||||
|
|
||||||
function selectAvatar(uuid, intersection) {
|
|
||||||
nameTagListManager.handleSelect(uuid, intersection);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Handles reset of list if you change domains
|
|
||||||
function onDomainChange() {
|
|
||||||
nameTagListManager.reset();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Handles removing an avatar from the list if they leave the domain
|
|
||||||
function onAvatarRemoved(uuid) {
|
|
||||||
nameTagListManager.maybeRemove(uuid);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Automatically add an avatar if they come into the domain. Mainly used for alwaysOn mode.
|
|
||||||
function onAvatarAdded(uuid) {
|
|
||||||
nameTagListManager.maybeAdd(uuid);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Called on init
|
|
||||||
var avatarNametagMode;
|
|
||||||
function create() {
|
|
||||||
nameTagListManager.create();
|
|
||||||
handleAvatarNametagMode(Settings.getValue("simplifiedNametag/avatarNametagMode", "on"));
|
|
||||||
|
|
||||||
Window.domainChanged.connect(onDomainChange);
|
|
||||||
AvatarManager.avatarRemovedEvent.connect(onAvatarRemoved);
|
|
||||||
AvatarManager.avatarAddedEvent.connect(onAvatarAdded);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Called when the script is closing
|
|
||||||
function destroy() {
|
|
||||||
nameTagListManager.destroy();
|
|
||||||
pickRayController.destroy();
|
|
||||||
Window.domainChanged.disconnect(onDomainChange);
|
|
||||||
AvatarManager.avatarRemovedEvent.disconnect(onAvatarRemoved);
|
|
||||||
AvatarManager.avatarAddedEvent.disconnect(onAvatarAdded);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// chose which mode you want the nametags in. On, off, or alwaysOn.
|
|
||||||
function handleAvatarNametagMode(newAvatarNameTagMode) {
|
|
||||||
avatarNametagMode = newAvatarNameTagMode;
|
|
||||||
nameTagListManager.handleAvatarNametagMode(avatarNametagMode);
|
|
||||||
Settings.setValue("simplifiedNametag/avatarNametagMode", avatarNametagMode);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// *************************************
|
|
||||||
// START api
|
|
||||||
// *************************************
|
|
||||||
// #region api
|
|
||||||
|
|
||||||
|
|
||||||
module.exports = {
|
|
||||||
create: create,
|
|
||||||
destroy: destroy,
|
|
||||||
handleAvatarNametagMode: handleAvatarNametagMode
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
// #endregion
|
|
||||||
// *************************************
|
|
||||||
// END api
|
|
||||||
// *************************************
|
|
Loading…
Reference in a new issue