diff --git a/scripts/system/makeUserConnection.js b/scripts/system/makeUserConnection.js index 7dddd46562..392ff3c0b5 100644 --- a/scripts/system/makeUserConnection.js +++ b/scripts/system/makeUserConnection.js @@ -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);