Merge pull request #15792 from MiladNazeri/nametagFixes

Bugz-504: more stable nametag updates
This commit is contained in:
Shannon Romano 2019-06-19 14:07:19 -07:00 committed by GitHub
commit 3d72370d1a
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 71 additions and 44 deletions

View file

@ -9,16 +9,17 @@
//
// Helps manage the list of avatars added to the nametag list
//
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 EntityMaker = Script.require('./entityMaker.js');
var entityProps = Script.require('./defaultLocalEntityProps.js');
var textHelper = new (Script.require('./textHelper.js'));
var X = 0;
var Y = 1;
var Z = 2;
var HALF = 0.5;
var CLEAR_ENTITY_EDIT_PROPS = true;
var MILISECONDS_IN_SECOND = 1000;
var SECONDS_IN_MINUTE = 60;
var ALWAYS_ON_MAX_LIFETIME_IN_SECONDS = 20 * SECONDS_IN_MINUTE; // Delete after 20 minutes in case a nametag is hanging around in on mode
// *************************************
// START UTILTY
@ -58,8 +59,6 @@ var distanceScaler = DISTANCE_SCALER_ON;
var userScaler = 1.0;
var DEFAULT_LINE_HEIGHT = entityProps.lineHeight;
function calculateInitialProperties(uuid) {
var avatar = _this.avatars[uuid];
var adjustedScaler = null;
var distance = null;
var dimensions = null;
@ -97,19 +96,6 @@ function calculateInitialProperties(uuid) {
}
// 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) {
@ -168,6 +154,18 @@ function getDistance(uuid, checkAvatar, shouldSave) {
}
// Quick check for distance from avatar
function quickDistanceCheckForNonSelectedAvatars(uuid) {
var source = MyAvatar.position;
var target = AvatarManager.getAvatar(uuid).position;
var avatarDistance = Vec3.distance(target, source);
return avatarDistance;
}
// 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() {
@ -197,7 +195,9 @@ function toggleInterval() {
}
// handle turning the peristenet mode on
// Handle checking to see if we should add or delete nametags in persistent mode
var alwaysOnAvatarDistanceCheck = false;
var DISTANCE_CHECK_INTERVAL_MS = 1000;
function handleAlwaysOnMode(shouldTurnOnAlwaysOnMode) {
_this.reset();
if (shouldTurnOnAlwaysOnMode) {
@ -205,9 +205,23 @@ function handleAlwaysOnMode(shouldTurnOnAlwaysOnMode) {
.getAvatarIdentifiers()
.forEach(function (avatar) {
if (avatar) {
add(avatar);
var avatarDistance = quickDistanceCheckForNonSelectedAvatars(avatar);
if (avatarDistance < MAX_RADIUS_IGNORE_METERS) {
add(avatar);
}
}
});
maybeClearAlwaysOnAvatarDistanceCheck();
alwaysOnAvatarDistanceCheck = Script.setInterval(maybeAddOrRemoveIntervalCheck, DISTANCE_CHECK_INTERVAL_MS);
}
}
// Check to see if we need to clear the distance check in persistent mode
function maybeClearAlwaysOnAvatarDistanceCheck() {
if (alwaysOnAvatarDistanceCheck) {
Script.clearInterval(alwaysOnAvatarDistanceCheck);
alwaysOnAvatarDistanceCheck = false;
}
}
@ -313,12 +327,6 @@ function makeNameTag(uuid) {
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)
@ -328,7 +336,6 @@ function makeNameTag(uuid) {
.add("dimensions", scaledDimensions)
.add("parentID", parentID)
.add("localPosition", localPosition)
.add("visible", visible)
.create(CLEAR_ENTITY_EDIT_PROPS);
Script.setTimeout(function () {
@ -341,33 +348,45 @@ function makeNameTag(uuid) {
var MAX_RADIUS_IGNORE_METERS = 22;
var MAX_ON_MODE_DISTANCE = 35;
var CHECK_AVATAR = true;
var MIN_DISTANCE = 0.2;
var MIN_DISTANCE_FOR_REDRAW_METERS = 0.1;
function maybeRedraw(uuid) {
var avatar = _this.avatars[uuid];
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");
}
var distanceDelta = Math.abs(avatar.currentDistance - avatar.previousDistance);
var name = getCorrectName(uuid);
if (avatar.previousName !== name) {
updateName(uuid, name);
} else {
} else if (distanceDelta > MIN_DISTANCE_FOR_REDRAW_METERS) {
redraw(uuid);
}
}
// Check to see if we need to add or remove this avatar during always on mode
function maybeAddOrRemoveIntervalCheck() {
AvatarManager
.getAvatarIdentifiers()
.forEach(function (avatar) {
if (avatar) {
var avatarDistance = quickDistanceCheckForNonSelectedAvatars(avatar);
if (avatar && avatarNametagMode === "alwaysOn" && !(avatar in _this.avatars) && avatarDistance < MAX_RADIUS_IGNORE_METERS) {
add(avatar);
return;
}
if (avatarDistance > MAX_RADIUS_IGNORE_METERS) {
maybeRemove(avatar);
}
}
});
}
// Handle redrawing if needed
var MIN_DISTANCE = 0.1;
function redraw(uuid) {
var avatar = _this.avatars[uuid];
@ -447,7 +466,7 @@ function add(uuid) {
_this.selectedAvatars[uuid] = true;
if (avatarNametagMode === "alwaysOn") {
entityProps.lifetime = -1;
entityProps.lifetime = ALWAYS_ON_MAX_LIFETIME_IN_SECONDS;
} else {
entityProps.lifetime = DEFAULT_LIFETIME;
}
@ -521,16 +540,20 @@ function removeNametag(uuid) {
// #region API
// Create the manager and hook up username signal
// Create the manager.
function create() {
if (avatarNametagMode === "alwaysOn") {
handleAvatarNametagMode("alwaysOn");
}
return _this;
}
// Destory the manager and disconnect from username signal
// Destroy the manager
function destroy() {
_this.reset();
return _this;
}
@ -601,7 +624,9 @@ function maybeRemove(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)) {
var avatarDistance = quickDistanceCheckForNonSelectedAvatars(uuid);
if (uuid && avatarNametagMode === "alwaysOn" && !(uuid in _this.avatars) && avatarDistance < MAX_RADIUS_IGNORE_METERS) {
add(uuid);
}
}
@ -628,6 +653,7 @@ function reset() {
removeAllNametags();
_this.avatars = {};
shouldToggleInterval();
maybeClearAlwaysOnAvatarDistanceCheck();
return _this;
}

View file

@ -8,8 +8,8 @@
//
// 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 = Script.require('./resources/modules/pickRayController.js');
var NameTagListManager = Script.require('./resources/modules/nameTagListManager.js');
var pickRayController = new PickRayController();
var nameTagListManager = new NameTagListManager();
@ -31,6 +31,7 @@ function selectAvatar(uuid, intersection) {
// Handles reset of list if you change domains
function onDomainChange() {
nameTagListManager.reset();
nameTagListManager.handleAvatarNametagMode(avatarNametagMode);
}