427 lines
No EOL
16 KiB
JavaScript
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();
|
|
}
|
|
};
|
|
}); |