// 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(); } }; });