mirror of
https://github.com/HifiExperiments/overte.git
synced 2025-05-02 19:12:15 +02:00
147 lines
4.1 KiB
JavaScript
147 lines
4.1 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;
|
|
}
|
|
|
|
// 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(
|
|
);
|
|
|
|
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
|