overte-Armored-Dragon/scripts/system/audioMuteOverlay.js
Triplelexx 8a39ce16bd add simple easing function
dodgy add push
2017-03-14 16:57:45 +00:00

154 lines
4.3 KiB
JavaScript

"use strict";
/* jslint vars: true, plusplus: true, forin: true*/
/* globals Tablet, Script, AvatarList, Users, Entities, MyAvatar, Camera, Overlays, Vec3, Quat, Controller, print, getControllerWorldLocation */
/* eslint indent: ["error", 4, { "outerIIFEBody": 0 }] */
//
// audioMuteOverlay.js
//
// client script that creates an overlay to provide mute feedback
//
// Created by Triplelexx on 17/03/09
// Copyright 2017 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
//
(function() { // BEGIN LOCAL_SCOPE
var TWEEN_SPEED = 0.025;
var LERP_AMOUNT = 0.25;
var overlayPosition = Vec3.ZERO;
var tweenPosition = 0;
// colors are in HSV, h needs to be a value from 0-1
var startColor = {
h: 0,
s: 0,
v: 0.67
};
var endColor = {
h: 0,
s: 1,
v: 1
};
var overlayID;
AudioDevice.muteToggled.connect(onMuteToggled);
Script.update.connect(update);
Script.scriptEnding.connect(cleanup);
function update(dt) {
if (!AudioDevice.getMuted()) {
if (overlayID) {
deleteOverlay();
}
return;
}
updateOverlay();
}
function lerp(a, b, val) {
return (1 - val) * a + val * b;
}
function easeIn(t) {
return Math.pow(t / 1, 5);
}
// hsv conversion expects 0-1 values
function hsvToRgb(h, s, v) {
var r, g, b;
var i = Math.floor(h * 6);
var f = h * 6 - i;
var p = v * (1 - s);
var q = v * (1 - f * s);
var t = v * (1 - (1 - f) * s);
switch (i % 6) {
case 0: r = v, g = t, b = p; break;
case 1: r = q, g = v, b = p; break;
case 2: r = p, g = v, b = t; break;
case 3: r = p, g = q, b = v; break;
case 4: r = t, g = p, b = v; break;
case 5: r = v, g = p, b = q; break;
}
return {
red: r * 255,
green: g * 255,
blue: b * 255
}
}
function getOffsetPosition() {
return Vec3.sum(Camera.position, Quat.getFront(Camera.orientation));
}
function onMuteToggled() {
if (AudioDevice.getMuted()) {
createOverlay();
} else {
deleteOverlay();
}
}
function createOverlay() {
overlayPosition = getOffsetPosition();
overlayID = Overlays.addOverlay("sphere", {
position: overlayPosition,
rotation: Camera.orientation,
alpha: 0.9,
dimensions: 0.1,
solid: true,
ignoreRayIntersection: true
});
}
function updateOverlay() {
// increase by TWEEN_SPEED until completion
if (tweenPosition < 1) {
tweenPosition += TWEEN_SPEED;
} else {
// after tween completion reset to zero and flip values to ping pong
tweenPosition = 0;
for (var color in startColor) {
var storedColor = startColor[color];
startColor[color] = endColor[color];
endColor[color] = storedColor;
}
}
// update position based on LERP_AMOUNT
var offsetPosition = getOffsetPosition();
overlayPosition.x = lerp(overlayPosition.x, offsetPosition.x, LERP_AMOUNT);
overlayPosition.y = lerp(overlayPosition.y, offsetPosition.y, LERP_AMOUNT);
overlayPosition.z = lerp(overlayPosition.z, offsetPosition.z, LERP_AMOUNT);
var rgbColor = hsvToRgb(
lerp(startColor.h, endColor.h, easeIn(tweenPosition)),
lerp(startColor.s, endColor.s, easeIn(tweenPosition)),
lerp(startColor.v, endColor.v, easeIn(tweenPosition))
);
Overlays.editOverlay(overlayID, {
color: {
red: rgbColor.red,
green: rgbColor.green,
blue: rgbColor.blue
},
position: overlayPosition,
rotation: Camera.orientation
});
}
function deleteOverlay() {
Overlays.deleteOverlay(overlayID);
}
function cleanup() {
deleteOverlay();
AudioDevice.muteToggled.disconnect(onMuteToggled);
Script.update.disconnect(update);
}
}()); // END LOCAL_SCOPE