Merge pull request #11967 from ctrlaltdavid/21638

Reduce communications load of making user connection
This commit is contained in:
Ken Cooke 2017-12-12 16:03:28 -08:00 committed by GitHub
commit 55ad42c40b
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -46,25 +46,26 @@
var PARTICLE_EFFECT_PROPS = {
"alpha": 0.8,
"azimuthFinish": Math.PI,
"azimuthStart": -1 * Math.PI,
"azimuthStart": -Math.PI,
"emitRate": 500,
"emitSpeed": 0.0,
"emitterShouldTrail": 1,
"isEmitting": 1,
"lifespan": 3,
"maxParticles": 1000,
"particleRadius": 0.003,
"polarStart": 1,
"polarFinish": 1,
"polarStart": Math.PI / 2,
"polarFinish": Math.PI / 2,
"radiusFinish": 0.008,
"radiusStart": 0.0025,
"speedSpread": 0.025,
"emitSpeed": 0.02,
"speedSpread": 0.015,
"textures": "http://hifi-content.s3.amazonaws.com/alan/dev/Particles/Bokeh-Particle.png",
"color": {"red": 255, "green": 255, "blue": 255},
"colorFinish": {"red": 0, "green": 164, "blue": 255},
"colorStart": {"red": 255, "green": 255, "blue": 255},
"emitOrientation": {"w": -0.71, "x": 0.0, "y": 0.0, "z": 0.71},
"emitAcceleration": {"x": 0.0, "y": 0.0, "z": 0.0},
"emitDimensions": { "x": 0.15, "y": 0.15, "z": 0.01 },
"accelerationSpread": {"x": 0.0, "y": 0.0, "z": 0.0},
"dimensions": {"x": 0.05, "y": 0.05, "z": 0.05},
"type": "ParticleEffect"
@ -111,10 +112,20 @@
var connectingHandJointIndex = -1;
var waitingList = {};
var particleEffect;
var particleRotationAngle = 0.0;
var particleEmitRate;
var PARTICLE_INITIAL_EMIT_RATE = 250;
var PARTICLE_MINIMUM_EMIT_RATE = 50;
var PARTICLE_DECAY_RATE = 0.5;
var particleEffectUpdateTimer = null;
var PARTICLE_EFFECT_UPDATE_INTERVAL = 200;
var makingConnectionParticleEffect;
var makingConnectionEmitRate = 2000;
var particleEmitRate = 500;
var makingConnectionEmitRate;
var isMakingConnectionEmitting;
var MAKING_CONNECTION_INITIAL_EMIT_RATE = 500;
var MAKING_CONNECTION_MINIMUM_EMIT_RATE = 20;
var MAKING_CONNECTION_DECAY_RATE = 0.5;
var makingConnectionUpdateTimer = null;
var MAKING_CONNECTION_UPDATE_INTERVAL = 200;
var handshakeInjector;
var successfulHandshakeInjector;
var handshakeSound;
@ -239,12 +250,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 +276,31 @@
}
}
function calcParticlePos(myHandPosition, otherHandPosition, otherOrientation, reset) {
if (reset) {
particleRotationAngle = 0.0;
function updateMakingConnection() {
makingConnectionEmitRate = Math.max(makingConnectionEmitRate * MAKING_CONNECTION_DECAY_RATE,
MAKING_CONNECTION_MINIMUM_EMIT_RATE);
isMakingConnectionEmitting = true;
Entities.editEntity(makingConnectionParticleEffect, {
emitRate: makingConnectionEmitRate,
isEmitting: true
});
if (makingConnectionEmitRate > MAKING_CONNECTION_MINIMUM_EMIT_RATE) {
makingConnectionUpdateTimer = Script.setTimeout(makingConnectionUpdateTimer, MAKING_CONNECTION_UPDATE_INTERVAL);
} else {
makingConnectionUpdateTimer = null;
}
}
function updateParticleEffect() {
particleEmitRate = Math.max(PARTICLE_MINIMUM_EMIT_RATE, particleEmitRate * PARTICLE_DECAY_RATE);
Entities.editEntity(particleEffect, {
emitRate: particleEmitRate
});
if (particleEmitRate > PARTICLE_MINIMUM_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 +336,37 @@
positionFractionallyTowards(myHandPosition, otherHandPosition, 0.5);
// now manage the rest of the entity
if (!particleEffect) {
particleRotationAngle = 0.0;
particleEmitRate = 500;
particleEmitRate = PARTICLE_INITIAL_EMIT_RATE;
particleProps = PARTICLE_EFFECT_PROPS;
particleProps.isEmitting = 0;
particleProps.position = calcParticlePos(myHandPosition, otherHandPosition, otherOrientation);
particleProps.position = positionFractionallyTowards(myHandPosition, otherHandPosition, 0.5);
particleProps.rotation = Vec3.mix(Quat.getFront(MyAvatar.orientation),
Quat.inverse(Quat.getFront(otherOrientation)), 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 = MAKING_CONNECTION_INITIAL_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 > PARTICLE_MINIMUM_EMIT_RATE) {
particleEffectUpdateTimer = Script.setTimeout(updateParticleEffect, PARTICLE_EFFECT_UPDATE_INTERVAL);
}
break;
default:
debug("unexpected state", state);