content/hifi-content/brosche/Hackathon/2018/lightControlServer.js
2022-02-13 21:50:01 +01:00

427 lines
No EOL
16 KiB
JavaScript

// lightControl.js
// Created by Mark Brosche on 10-26-2018
// Copyright 2018 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
//
/* global EventBridge Users AccountServices Agent Avatar Script */
(function(){
var AUDIO_VOLUME = 0.1;
var _entityID,
injector,
switchSound,
on = false,
searchRadius = 0.5,
lampProperties,
userData,
lampBulb,
bulbLight = [],
bulbColor,
bulbMat,
bulbAlbedo,
bulbAlbedoMap,
bulbOpacityMap,
bulbNormalMap,
bulbEmissiveMap,
bulbScattering,
bulbOpacity,
lampShade,
shadeMat,
shadeLight = [],
shadeColor,
shadeAlbedo,
shadeAlbedoMap = "",
shadeOpacityMap,
shadeNormalMap,
shadeEmissiveMap,
shadeSpecularMap,
shadeScattering,
shadeOpacity,
shadeRoughness,
shadeMetallic,
lampFilament,
filamentMat,
filamentLight = [],
filamentAlbedo,
filamentScattering = 1,
filamentOpacity = 1,
filamentRoughness = 1,
filamentMetallic = 1,
filamentColor;
this.remotelyCallable = [
"togglePower"
];
var that = this;
this.preload = function (entityID) {
_entityID = entityID;
Script.setTimeout(function(){
that.getEntityData();
},500);
};
this.getEntityData = function() {
lampProperties = Entities.getEntityProperties(_entityID, ["position", "userData"]);
if (!lampProperties.userData || lampProperties.userData === "{}") {
print("spawner ", _entityID, " is missing user data.");
return;
}
try {
userData = JSON.parse(lampProperties.userData);
if (userData.searchRadius !== ""){
searchRadius = userData.searchRadius;
}
switchSound = SoundCache.getSound(userData.switchSoundURL);
shadeOpacityMap = userData.shadeOpacityMapURL;
shadeNormalMap = userData.shadeNormalMapURL;
shadeEmissiveMap = userData.shadeEmissiveMapURL;
shadeSpecularMap = userData.shadeSpecularMapURL;
shadeScattering = userData.shadeScattering;
shadeOpacity = userData.shadeOpacity;
shadeRoughness = userData.shadeRoughness;
shadeMetallic = userData.shadeMetallic;
shadeAlbedo = userData.shadeAlbedo;
shadeAlbedoMap = userData.shadeTextureURL;
shadeMat = Entities.findEntitiesByName(userData.shadeMaterialName, lampProperties.position, searchRadius);
shadeLight = Entities.findEntitiesByName(userData.shadeLightName, lampProperties.position, searchRadius);
bulbOpacityMap = userData.bulbOpacityMapURL;
bulbNormalMap = userData.bulbNormalMapURL;
bulbEmissiveMap = userData.bulbEmissiveMapURL;
bulbScattering = userData.bulbScattering;
bulbOpacity = userData.bulbOpacity;
bulbAlbedo = userData.bulbAlbedo;
bulbAlbedoMap = userData.bulbTextureURL;
bulbMat = Entities.findEntitiesByName(userData.bulbMaterialName, lampProperties.position, searchRadius);
bulbLight = Entities.findEntitiesByName(userData.bulbLightName, lampProperties.position, searchRadius);
filamentLight = Entities.findEntitiesByName(userData.filamentLightName, lampProperties.position, searchRadius);
filamentAlbedo = userData.filamentAlbedo;
filamentMat = Entities.findEntitiesByName(userData.filamentMaterialName, lampProperties.position, searchRadius);
} catch (e) {
print("Error in retrieving entity Data");
return;
}
};
this.playSound = function(sound, position, localOnly) {
if (sound.downloaded) {
if (injector) {
injector.stop();
}
injector = Audio.playSound(sound, {
position: position,
volume: AUDIO_VOLUME,
localOnly: localOnly
});
}
};
this.lampShade = function (onOff) {
switch (shadeAlbedo){
case "white":
shadeAlbedo = [0.5, 0.5, 0.5];
shadeColor = {"red": 0.5*255, "green": 0.5*255, "blue": 0.5*255}
break;
case "red":
shadeAlbedo = [0.5, 0, 0];
shadeColor = {"red": 0.5*255, "green": 0, "blue": 0}
break;
case "blue":
shadeAlbedo = [0, 0, 0.5];
shadeColor = {"red": 0, "green": 0, "blue": 0.5*255}
break;
case "green":
shadeAlbedo = [0, 0.5, 0];
shadeColor = {"red": 0, "green": 0.5*255, "blue": 0}
break;
case "yellow":
shadeAlbedo = [0.5, 0.5, 0];
shadeColor = {"red": 0.5*255, "green": 0.5*255, "blue": 0}
break;
case "cyan":
shadeAlbedo = [0, 0.5, 0.5];
shadeColor = {"red": 0, "green": 0.5*255, "blue": 0.5*255}
break;
case "magenta":
shadeAlbedo = [0.5, 0, 0.5];
shadeColor = {"red": 0.5*255, "green": 0, "blue": 0.5*255}
break;
};
if (onOff == true){
var materials = {
model: "hifi_pbr",
opacity: shadeOpacity,
albedo: shadeAlbedo,
emissive: shadeAlbedo,
scattering: shadeScattering,
roughness: shadeRoughness,
metallic: shadeMetallic
};
if (shadeAlbedoMap !== ""){
materials.albedoMap = shadeAlbedoMap;
materials.emissiveMap = shadeAlbedoMap;
}
if (shadeOpacityMap !== ""){
materials.opacityMap = shadeOpacityMap;
}
if (shadeNormalMap !== ""){
materials.normalMap = shadeNormalMap;
}
if (shadeEmissiveMap !== ""){
materials.emissiveMap = shadeEmissiveMap;
}
if (shadeSpecularMap !== ""){
materials.specularMap = shadeSpecularMap;
}
return {
materialURL: "materialData",
materialData: JSON.stringify({
materialVersion: 1,
materials: materials
})
};
} else {
var materials = {
model: "hifi_pbr",
opacity: shadeOpacity,
albedo: shadeAlbedo,
emissive: [0,0,0],
scattering: shadeScattering,
roughness: shadeRoughness,
metallic: shadeMetallic
};
if (shadeAlbedoMap !== ""){
materials.albedoMap = shadeAlbedoMap;
}
if (shadeOpacityMap !== ""){
materials.opacityMap = shadeOpacityMap;
}
if (shadeNormalMap !== ""){
materials.normalMap = shadeNormalMap;
}
if (shadeSpecularMap !== ""){
materials.specularMap = shadeSpecularMap;
}
return {
materialURL: "materialData",
materialData: JSON.stringify({
materialVersion: 1,
materials: materials
})
};
}
};
this.lampBulb = function (onOff) {
switch (bulbAlbedo){
case "clear":
bulbAlbedo = [0, 0, 0];
bulbColor = {"red": 0, "green": 0, "blue": 0}
break;
case "white":
bulbAlbedo = [0.5, 0.5, 0.5];
bulbColor = {"red": 0.5*255, "green": 0.5*255, "blue": 0.5*255}
break;
case "red":
bulbAlbedo = [0.5, 0, 0];
bulbColor = {"red": 0.5*255, "green": 0, "blue": 0}
break;
case "blue":
bulbAlbedo = [0, 0, 0.5];
bulbColor = {"red": 0, "green": 0, "blue": 0.5*255}
break;
case "green":
bulbAlbedo = [0, 0.5, 0];
bulbColor = {"red": 0, "green": 0.5*255, "blue": 0}
break;
case "yellow":
bulbAlbedo = [0.5, 0.5, 0];
bulbColor = {"red": 0.5*255, "green": 0.5*255, "blue": 0}
break;
case "cyan":
bulbAlbedo = [0, 0.5, 0.5];
bulbColor = {"red": 0, "green": 0.5*255, "blue": 0.5*255}
break;
case "magenta":
bulbAlbedo = [0.5, 0, 0.5];
shadeColor = {"red": 0.5*255, "green": 0, "blue": 0.5*255}
break;
};
if (onOff == true){
var materials = {
model: "hifi_pbr",
opacity: bulbOpacity,
albedo: bulbAlbedo,
emissive: bulbAlbedo,
scattering: bulbScattering,
roughness: 0,
metallic: 0
};
if (bulbAlbedoMap !== ""){
materials.albedoMap = shadeAlbedoMap;
materials.emissiveMap = shadeAlbedoMap;
}
if (bulbOpacityMap !== ""){
materials.opacityMap = bulbOpacityMap;
}
if (bulbNormalMap !== ""){
materials.normalMap = bulbNormalMap;
}
if (bulbEmissiveMap !== ""){
materials.emissiveMap = bulbEmissiveMap;
}
return {
materialURL: "materialData",
materialData: JSON.stringify({
materialVersion: 1,
materials: materials
})
};
} else {
var materials = {
model: "hifi_pbr",
opacity: bulbOpacity,
albedo: bulbAlbedo,
emissive: [0,0,0],
scattering: bulbScattering,
roughness: 0,
metallic: 0
};
if (bulbAlbedoMap !== ""){
materials.albedoMap = bulbAlbedoMap;
}
if (bulbOpacityMap !== ""){
materials.opacityMap = bulbOpacityMap;
}
if (bulbNormalMap !== ""){
materials.normalMap = bulbNormalMap;
}
return {
materialURL: "materialData",
materialData: JSON.stringify({
materialVersion: 1,
materials: materials
})
};
}
};
this.lampFilament = function (onOff) {
switch (filamentAlbedo){
case "incandescent":
filamentAlbedo = [0.8,0.7,0.5];
filamentColor = {"red": 255, "green": 72, "blue": 0}
break;
case "white":
filamentAlbedo = [0.5, 0.5, 0.5];
filamentColor = {"red": 0.5*255, "green": 0.5*255, "blue": 0.5*255}
break;
case "red":
filamentAlbedo = [0.5, 0, 0];
filamentColor = {"red": 0.5*255, "green": 0, "blue": 0}
break;
case "blue":
filamentAlbedo = [0, 0, 0.5];
filamentColor = {"red": 0, "green": 0, "blue": 0.5*255}
break;
case "green":
filamentAlbedo = [0, 0.5, 0];
filamentColor = {"red": 0, "green": 0.5*255, "blue": 0}
break;
case "yellow":
filamentAlbedo = [0.5, 0.5, 0];
filamentColor = {"red": 0.5*255, "green": 0.5*255, "blue": 0}
break;
case "cyan":
filamentAlbedo = [0, 0.5, 0.5];
filamentColor = {"red": 0, "green": 0.5*255, "blue": 0.5*255}
break;
case "magenta":
filamentAlbedo = [0.5, 0, 0.5];
filamentColor = {"red": 0.5*255, "green": 0, "blue": 0.5*255}
break;
};
if (onOff == true){
var materials = {
model: "hifi_pbr",
opacity: filamentOpacity,
albedo: filamentAlbedo,
emissive: filamentAlbedo,
scattering: filamentScattering,
roughness: filamentRoughness,
metallic: filamentMetallic
};
return {
materialURL: "materialData",
materialData: JSON.stringify({
materialVersion: 1,
materials: materials
})
};
} else {
var materials = {
model: "hifi_pbr",
opacity: filamentOpacity,
albedo: filamentAlbedo,
emissive: [0,0,0],
scattering: filamentScattering,
roughness: filamentRoughness,
metallic: filamentMetallic
};
return {
materialURL: "materialData",
materialData: JSON.stringify({
materialVersion: 1,
materials: materials
})
};
}
};
this.togglePower = function () {
var position = Entities.getEntityProperties(_entityID, ["position"]);
this.playSound(switchSound, position.position, false);
if (!on) {
on = true;
lampShade = that.lampShade(on);
lampFilament = that.lampFilament(on);
lampBulb = that.lampBulb(on);
for ( var i = 0; i < bulbLight.length; i++) {
Entities.editEntity(bulbLight[i], {visible: true, color: bulbColor});
}
Entities.editEntity(shadeLight[0], {visible: true, color: shadeColor});
Entities.editEntity(filamentLight[0], {visible: true, color: filamentColor});
Entities.editEntity(shadeMat[0], lampShade);
Entities.editEntity(filamentMat[0], lampFilament);
Entities.editEntity(bulbMat[0], lampBulb);
} else {
on = false;
lampShade = that.lampShade(on);
lampFilament = that.lampFilament(on);
lampBulb = that.lampBulb(on);
for ( var i = 0; i < bulbLight.length; i++) {
Entities.editEntity(bulbLight[i], {visible: false});
}
Entities.editEntity(shadeLight[0], {visible: false});
Entities.editEntity(filamentLight[0], {visible: false});
Entities.editEntity(shadeMat[0], lampShade);
Entities.editEntity(filamentMat[0], lampFilament);
Entities.editEntity(bulbMat[0], lampBulb);
}
};
this.unload = function () {
if (injector) {
injector.stop();
}
};
});