Reduce communications load when making a user connection

This commit is contained in:
David Rowe 2017-12-12 16:39:49 +13:00
parent 0ff91e5926
commit 4327906630

View file

@ -111,10 +111,20 @@
var connectingHandJointIndex = -1;
var waitingList = {};
var particleEffect;
var particleRotationAngle = 0.0;
var particleEmitRate;
var INITIAL_PARTICLE_EMIT_RATE = 500;
var MINIMUM_PARTICLE_EMIT_RATE = 50;
var PARTICLE_DECAY_RATE = 0.5;
var particleEffectUpdateTimer = null;
var PARTICLE_EFFECT_UPDATE_INTERVAL = 50;
var makingConnectionParticleEffect;
var makingConnectionEmitRate = 2000;
var particleEmitRate = 500;
var makingConnectionEmitRate;
var isMakingConnectionEmitting;
var INITIAL_MAKING_CONNECTION_EMIT_RATE = 1000;
var MINIMUM_MAKING_CONNECTION_EMIT_RATE = 20;
var MAKING_CONNECTION_DECAY_RATE = 0.5;
var makingConnectionUpdateTimer = null;
var MAKING_CONNECTION_UPDATE_INTERVAL = 50;
var handshakeInjector;
var successfulHandshakeInjector;
var handshakeSound;
@ -239,12 +249,20 @@
}
function deleteParticleEffect() {
if (particleEffectUpdateTimer) {
Script.clearTimeout(particleEffectUpdateTimer);
particleEffectUpdateTimer = null;
}
if (particleEffect) {
particleEffect = Entities.deleteEntity(particleEffect);
}
}
function deleteMakeConnectionParticleEffect() {
if (makingConnectionUpdateTimer) {
Script.clearTimeout(makingConnectionUpdateTimer);
makingConnectionUpdateTimer = null;
}
if (makingConnectionParticleEffect) {
makingConnectionParticleEffect = Entities.deleteEntity(makingConnectionParticleEffect);
}
@ -257,15 +275,31 @@
}
}
function calcParticlePos(myHandPosition, otherHandPosition, otherOrientation, reset) {
if (reset) {
particleRotationAngle = 0.0;
function updateMakingConnection() {
makingConnectionEmitRate = Math.max(makingConnectionEmitRate * MAKING_CONNECTION_DECAY_RATE,
MINIMUM_MAKING_CONNECTION_EMIT_RATE);
isMakingConnectionEmitting = true;
Entities.editEntity(makingConnectionParticleEffect, {
emitRate: makingConnectionEmitRate,
isEmitting: true
});
if (makingConnectionEmitRate > MINIMUM_MAKING_CONNECTION_EMIT_RATE) {
makingConnectionUpdateTimer = Script.setTimeout(makingConnectionUpdateTimer, MAKING_CONNECTION_UPDATE_INTERVAL);
} else {
makingConnectionUpdateTimer = null;
}
}
function updateParticleEffect() {
particleEmitRate = Math.max(MINIMUM_PARTICLE_EMIT_RATE, particleEmitRate * PARTICLE_DECAY_RATE);
Entities.editEntity(particleEffect, {
emitRate: particleEmitRate
});
if (particleEmitRate > MINIMUM_PARTICLE_EMIT_RATE) {
particleEffectUpdateTimer = Script.setTimeout(updateParticleEffect, PARTICLE_EFFECT_UPDATE_INTERVAL);
} else {
particleEffectUpdateTimer = null;
}
var position = positionFractionallyTowards(myHandPosition, otherHandPosition, 0.5);
particleRotationAngle += PARTICLE_ANGLE_INCREMENT; // about 0.5 hz
var radius = Math.min(PARTICLE_RADIUS, PARTICLE_RADIUS * particleRotationAngle / 360);
var axis = Vec3.mix(Quat.getFront(MyAvatar.orientation), Quat.inverse(Quat.getFront(otherOrientation)), 0.5);
return Vec3.sum(position, Vec3.multiplyQbyV(Quat.angleAxis(particleRotationAngle, axis), {x: 0, y: radius, z: 0}));
}
// this is called frequently, but usually does nothing
@ -301,41 +335,35 @@
positionFractionallyTowards(myHandPosition, otherHandPosition, 0.5);
// now manage the rest of the entity
if (!particleEffect) {
particleRotationAngle = 0.0;
particleEmitRate = 500;
particleEmitRate = INITIAL_PARTICLE_EMIT_RATE;
particleProps = PARTICLE_EFFECT_PROPS;
particleProps.isEmitting = 0;
particleProps.position = calcParticlePos(myHandPosition, otherHandPosition, otherOrientation);
particleProps.position = positionFractionallyTowards(myHandPosition, otherHandPosition, 0.5);
particleProps.parentID = MyAvatar.sessionUUID;
particleEffect = Entities.addEntity(particleProps, true);
} else {
particleProps.position = calcParticlePos(myHandPosition, otherHandPosition, otherOrientation);
particleProps.isEmitting = 1;
Entities.editEntity(particleEffect, particleProps);
}
if (!makingConnectionParticleEffect) {
var props = MAKING_CONNECTION_PARTICLE_PROPS;
props.parentID = MyAvatar.sessionUUID;
makingConnectionEmitRate = 2000;
makingConnectionEmitRate = INITIAL_MAKING_CONNECTION_EMIT_RATE;
props.emitRate = makingConnectionEmitRate;
props.isEmitting = false;
props.position = myHandPosition;
makingConnectionParticleEffect = Entities.addEntity(props, true);
} else {
makingConnectionEmitRate *= 0.5;
Entities.editEntity(makingConnectionParticleEffect, {
emitRate: makingConnectionEmitRate,
position: myHandPosition,
isEmitting: true
});
makingConnectionUpdateTimer = Script.setTimeout(updateMakingConnection, MAKING_CONNECTION_UPDATE_INTERVAL);
}
break;
case STATES.MAKING_CONNECTION:
particleEmitRate = Math.max(50, particleEmitRate * 0.5);
Entities.editEntity(makingConnectionParticleEffect, {emitRate: 0, isEmitting: 0, position: myHandPosition});
Entities.editEntity(particleEffect, {
position: calcParticlePos(myHandPosition, otherHandPosition, otherOrientation),
emitRate: particleEmitRate
});
if (makingConnectionUpdateTimer) {
Script.clearTimeout(makingConnectionUpdateTimer);
makingConnectionUpdateTimer = null;
}
if (isMakingConnectionEmitting) {
Entities.editEntity(makingConnectionParticleEffect, { isEmitting: false });
isMakingConnectionEmitting = false;
}
if (!particleEffectUpdateTimer && particleEmitRate > MINIMUM_PARTICLE_EMIT_RATE) {
particleEffectUpdateTimer = Script.setTimeout(updateParticleEffect, PARTICLE_EFFECT_UPDATE_INTERVAL);
}
break;
default:
debug("unexpected state", state);