diff --git a/examples/entityScripts/lighteningEntity.js b/examples/entityScripts/lighteningEntity.js index 67cc6c8ea6..40c5364a6a 100644 --- a/examples/entityScripts/lighteningEntity.js +++ b/examples/entityScripts/lighteningEntity.js @@ -1,11 +1,11 @@ // -// lighteningEntity.js +// lightningEntity.js // examples/entityScripts // // Created by Brad Hefta-Gaub on 3/1/16. // Copyright 2016 High Fidelity, Inc. // -// This is an example of an entity script which will randomly create a flash of lightening and a thunder sound +// This is an example of an entity script which will randomly create a flash of lightning and a thunder sound // effect, as well as a background rain sound effect. It can be applied to any entity, although it works best // on a zone entity. // @@ -21,31 +21,31 @@ // // You can change these values to change some of the various effects of the rain storm. // These values can also be controlled by setting user properties on the entity that you've attached this script to. - // add a "lightening" section to a JSON encoded portion of the user data... for example: + // add a "lightning" section to a JSON encoded portion of the user data... for example: // { - // "lightening": { + // "lightning": { // "flashMax": 20, // "flashMin": 0, // "flashMaxRandomness": 10, // "flashIntensityStepRandomeness": 2, // "averageLighteningStrikeGap": 120, - // "extraRandomRangeLighteningStrikeGap": 10, + // "extraRandomRangeLightningStrikeGap": 10, // "thunderURL": "atp:1336efe995398f5e0d46b37585785de8ba872fe9a9b718264db03748cd41c758.wav", // "thunderVolume": 0.1, // "rainURL": "atp:e0cc7438aca776636f6e6f731685781d9999b961c945e4e5760d937be5beecdd.wav", // "rainVolume": 0.05 // } - // // NOTE: you can have other user data here as well, so long as it's JSON encoded, it won't impact the lightening script + // // NOTE: you can have other user data here as well, so long as it's JSON encoded, it won't impact the lightning script // } // //////////////////////////////////////////////////////////////////////////////////////////////////////////// - var MAX_FLASH_INTENSITY = 20; // this controls how bright the lightening effect appears - var MIN_FLASH_INTENSITY = 0; // this is probably best at 0, but it could be higher, which will make the lightening not fade completely to darkness before going away. - var MAX_FLASH_INTENSITY_RANDOMNESS = 10; // this will add some randomness to the max brightness of the lightening - var FLASH_INTENSITY_STEP_RANDOMNESS = 2; // as the lightening goes from min to max back to min, this will make it more random in it's brightness - var AVERAGE_LIGHTENING_STRIKE_GAP_IN_SECONDS = 120; // how long on average between lighting - var EXTRA_RANDOM_RANGE_LIGHTENING_STRIKE_GAP_IN_SECONDS = 10; // some randomness to the lightening gap + var MAX_FLASH_INTENSITY = 20; // this controls how bright the lightning effect appears + var MIN_FLASH_INTENSITY = 0; // this is probably best at 0, but it could be higher, which will make the lightning not fade completely to darkness before going away. + var MAX_FLASH_INTENSITY_RANDOMNESS = 10; // this will add some randomness to the max brightness of the lightning + var FLASH_INTENSITY_STEP_RANDOMNESS = 2; // as the lightning goes from min to max back to min, this will make it more random in it's brightness + var AVERAGE_LIGHTNING_STRIKE_GAP_IN_SECONDS = 120; // how long on average between lighting + var EXTRA_RANDOM_RANGE_LIGHTNING_STRIKE_GAP_IN_SECONDS = 10; // some randomness to the lightning gap var THUNDER_SOUND_URL = "https://s3.amazonaws.com/hifi-public/brad/rainstorm/thunder-48k.wav"; // thunder sound effect, must be 48k 16bit PCM var THUNDER_VOLUME = 1; // adjust the volume of the thunder sound effect var RAIN_SOUND_URL = "https://s3.amazonaws.com/hifi-public/brad/rainstorm/rain.wav"; // the background rain, this will loop @@ -84,7 +84,7 @@ } // the "constructor" for our class. pretty simple, it just sets our _this, so we can access it later. - function Lightening() { + function Lightning() { _this = this; } @@ -94,7 +94,7 @@ // This is the class definition/prototype for our class. Funtions declared here will be accessible // via the instance of the entity // - Lightening.prototype = { + Lightning.prototype = { // preload() // This is called by every viewer/interface instance that "sees" the entity you've attached this script to. @@ -110,8 +110,8 @@ _this.lastStrike = now; // some of our other state related items - _this.lighteningID = false; // this will be the entityID for any lightening that we create - _this.lighteningActive = false; // are we actively managing lightening + _this.lightningID = false; // this will be the entityID for any lightning that we create + _this.lightningActive = false; // are we actively managing lightning // Get the entities userData property, to see if someone has overridden any of our default settings var userDataText = Entities.getEntityProperties(entityID, ["userData"]).userData; @@ -119,21 +119,21 @@ if (userDataText !== "") { userData = JSON.parse(userDataText); } - var lighteningUserData = valueOrDefault(userData.lightening, {}); - _this.flashIntensityStepRandomeness = valueOrDefault(lighteningUserData.flashIntensityStepRandomness, FLASH_INTENSITY_STEP_RANDOMNESS); - _this.flashMax = valueOrDefault(lighteningUserData.flashMax, MAX_FLASH_INTENSITY); - _this.flashMin = valueOrDefault(lighteningUserData.flashMin, MIN_FLASH_INTENSITY); - _this.flashMaxRandomness = valueOrDefault(lighteningUserData.flashMaxRandomness, MAX_FLASH_INTENSITY_RANDOMNESS); - _this.averageLighteningStrikeGap = valueOrDefault(lighteningUserData.averageLighteningStrikeGap, AVERAGE_LIGHTENING_STRIKE_GAP_IN_SECONDS); - _this.extraRandomRangeLighteningStrikeGap = valueOrDefault(lighteningUserData.extraRandomRangeLighteningStrikeGap, EXTRA_RANDOM_RANGE_LIGHTENING_STRIKE_GAP_IN_SECONDS); + var lightningUserData = valueOrDefault(userData.lightning, {}); + _this.flashIntensityStepRandomeness = valueOrDefault(lightningUserData.flashIntensityStepRandomness, FLASH_INTENSITY_STEP_RANDOMNESS); + _this.flashMax = valueOrDefault(lightningUserData.flashMax, MAX_FLASH_INTENSITY); + _this.flashMin = valueOrDefault(lightningUserData.flashMin, MIN_FLASH_INTENSITY); + _this.flashMaxRandomness = valueOrDefault(lightningUserData.flashMaxRandomness, MAX_FLASH_INTENSITY_RANDOMNESS); + _this.averageLightningStrikeGap = valueOrDefault(lightningUserData.averageLightningStrikeGap, AVERAGE_LIGHTNING_STRIKE_GAP_IN_SECONDS); + _this.extraRandomRangeLightningStrikeGap = valueOrDefault(lightningUserData.extraRandomRangeLightningStrikeGap, EXTRA_RANDOM_RANGE_LIGHTNING_STRIKE_GAP_IN_SECONDS); - var thunderURL = valueOrDefault(lighteningUserData.thunderURL, THUNDER_SOUND_URL); + var thunderURL = valueOrDefault(lightningUserData.thunderURL, THUNDER_SOUND_URL); _this.thunderSound = SoundCache.getSound(thunderURL); // start downloading the thunder into the cache in case we need it later - _this.thunderVolume = valueOrDefault(lighteningUserData.thunderVolume, THUNDER_VOLUME); + _this.thunderVolume = valueOrDefault(lightningUserData.thunderVolume, THUNDER_VOLUME); - var rainURL = valueOrDefault(lighteningUserData.rainURL, RAIN_SOUND_URL); + var rainURL = valueOrDefault(lightningUserData.rainURL, RAIN_SOUND_URL); _this.rainSound = SoundCache.getSound(rainURL); // start downloading the rain, we will be using it for sure - _this.rainVolume = valueOrDefault(lighteningUserData.rainVolume, RAIN_VOLUME); + _this.rainVolume = valueOrDefault(lightningUserData.rainVolume, RAIN_VOLUME); _this.rainPlaying = false; Script.update.connect(_this.onUpdate); // connect our onUpdate to a regular update signal from the interface @@ -167,17 +167,17 @@ _this.rainPlaying = true; }, - // this handles a single "step" of the lightening flash effect. It assumes a light entity has already been created, + // this handles a single "step" of the lightning flash effect. It assumes a light entity has already been created, // and all it really does is change the intensity of the light based on the settings that are part of this entity's // userData. - flashLightening: function (lighteningID) { - var lighteningProperties = Entities.getEntityProperties(lighteningID, ["userData", "intensity"]); - var lighteningParameters = JSON.parse(lighteningProperties.userData); - var currentIntensity = lighteningProperties.intensity; - var flashDirection = lighteningParameters.flashDirection; - var flashMax = lighteningParameters.flashMax; - var flashMin = lighteningParameters.flashMin; - var flashIntensityStepRandomeness = lighteningParameters.flashIntensityStepRandomeness; + flashLightning: function (lightningID) { + var lightningProperties = Entities.getEntityProperties(lightningID, ["userData", "intensity"]); + var lightningParameters = JSON.parse(lightningProperties.userData); + var currentIntensity = lightningProperties.intensity; + var flashDirection = lightningParameters.flashDirection; + var flashMax = lightningParameters.flashMax; + var flashMin = lightningParameters.flashMin; + var flashIntensityStepRandomeness = lightningParameters.flashIntensityStepRandomeness; var newIntensity = currentIntensity + flashDirection + randFloat(-flashIntensityStepRandomeness, flashIntensityStepRandomeness); if (flashDirection > 0) { @@ -194,14 +194,14 @@ // if we reached 0 intensity, then we're done with this strike... if (newIntensity === 0) { - _this.lighteningActive = false; - Entities.deleteEntity(lighteningID); + _this.lightningActive = false; + Entities.deleteEntity(lightningID); } // FIXME - we probably don't need to re-edit the userData of the light... we're only // changing direction, the rest are the same... we could just store direction in our // own local variable state - var newLighteningParameters = JSON.stringify({ + var newLightningParameters = JSON.stringify({ flashDirection: flashDirection, flashIntensityStepRandomeness: flashIntensityStepRandomeness, flashMax: flashMax, @@ -209,31 +209,31 @@ }); // this is what actually creates the effect, changing the intensity of the light - Entities.editEntity(lighteningID, {intensity: newIntensity, userData: newLighteningParameters}); + Entities.editEntity(lightningID, {intensity: newIntensity, userData: newLightningParameters}); }, - // findMyLightening() is designed to make the script more robust. Since we're an open editable platform - // it's possible that from the time that we started the lightening effect until "now" when we're attempting + // findMyLightning() is designed to make the script more robust. Since we're an open editable platform + // it's possible that from the time that we started the lightning effect until "now" when we're attempting // to change the light, some other client might have deleted our light. Before we proceed in editing // the light, we check to see if it exists. - findMyLightening: function () { - if (_this.lighteningID !== false) { - var lighteningName = Entities.getEntityProperties(_this.lighteningID, "name").name; - if (lighteningName !== undefined) { - return _this.lighteningID; + findMyLightning: function () { + if (_this.lightningID !== false) { + var lightningName = Entities.getEntityProperties(_this.lightningID, "name").name; + if (lightningName !== undefined) { + return _this.lightningID; } } return false; }, - // findOtherLightening() is designed to allow this script to work in a "multi-user" environment, which we + // findOtherLightning() is designed to allow this script to work in a "multi-user" environment, which we // must assume we are in. Since every user/viewer/client that connect to the domain and "sees" our entity - // is going to run this script, any of them could be in charge of flashing the lightening. So before we - // start to flash the lightening, we will first check to see if someone else already is. + // is going to run this script, any of them could be in charge of flashing the lightning. So before we + // start to flash the lightning, we will first check to see if someone else already is. // - // returns true if some other lightening exists... likely because some other viewer is flashing it - // returns false if no other lightening exists... - findOtherLightening: function () { + // returns true if some other lightning exists... likely because some other viewer is flashing it + // returns false if no other lightning exists... + findOtherLightning: function () { var myPosition = Entities.getEntityProperties(_this.entityID, "position").position; // find all entities near me... @@ -245,20 +245,20 @@ checkEntityID = entities[entity]; checkProperties = Entities.getEntityProperties(checkEntityID, ["name", "type"]); - // check to see if they are lightening - if (checkProperties.type === "Light" && checkProperties.name === "lightening for creator:" + _this.entityID) { + // check to see if they are lightning + if (checkProperties.type === "Light" && checkProperties.name === "lightning for creator:" + _this.entityID) { return true; } } return false; }, - // createNewLightening() actually creates new lightening and plays the thunder sound - createNewLightening: function () { + // createNewLightning() actually creates new lightning and plays the thunder sound + createNewLightning: function () { var myPosition = Entities.getEntityProperties(_this.entityID, "position").position; - _this.lighteningID = Entities.addEntity({ + _this.lightningID = Entities.addEntity({ type: "Light", - name: "lightening for creator:" + _this.entityID, + name: "lightning for creator:" + _this.entityID, userData: JSON.stringify({ flashDirection: 1, flashIntensityStepRandomeness: _this.flashIntensityStepRandomeness, @@ -271,7 +271,7 @@ collisionless: true, dimensions: {x: 1000, y: 1000, z: 1000}, color: {red: 255, green: 255, blue: 255}, - lifetime: 10 // lightening only lasts 10 seconds.... + lifetime: 10 // lightning only lasts 10 seconds.... }); // play the thunder... @@ -280,11 +280,11 @@ volume: _this.thunderVolume }); - return _this.lighteningID; + return _this.lightningID; }, // onUpdate() this will be called regularly, approximately every frame of the simulation. We will use - // it to determine if we need to do a lightening/thunder strike + // it to determine if we need to do a lightning/thunder strike onUpdate: function () { var now = Date.now(); @@ -293,40 +293,40 @@ _this.playLocalRain(); } - // NOTE: _this.lighteningActive will only be TRUE if we are the one who created - // the lightening and we are in charge of flashing it... - if (_this.lighteningActive) { - var lighteningID = _this.findMyLightening(); - // if for some reason our lightening is gone... then just return to non-active state - if (lighteningID === false) { - _this.lighteningActive = false; - _this.lighteningID = false; + // NOTE: _this.lightningActive will only be TRUE if we are the one who created + // the lightning and we are in charge of flashing it... + if (_this.lightningActive) { + var lightningID = _this.findMyLightning(); + // if for some reason our lightning is gone... then just return to non-active state + if (lightningID === false) { + _this.lightningActive = false; + _this.lightningID = false; } else { - // otherwise, flash our lightening... - _this.flashLightening(lighteningID); + // otherwise, flash our lightning... + _this.flashLightning(lightningID); } } else { // whether or not it's time for us to strike, we always keep an eye out for anyone else // striking... and if we see someone else striking, we will reset our lastStrike time - if (_this.findOtherLightening()) { + if (_this.findOtherLightning()) { _this.lastStrike = now; } var sinceLastStrike = now - _this.lastStrike; - var nextRandomStrikeTime = _this.averageLighteningStrikeGap - + randFloat(-_this.extraRandomRangeLighteningStrikeGap, - _this.extraRandomRangeLighteningStrikeGap); + var nextRandomStrikeTime = _this.averageLightningStrikeGap + + randFloat(-_this.extraRandomRangeLightningStrikeGap, + _this.extraRandomRangeLightningStrikeGap); if (sinceLastStrike > nextRandomStrikeTime * MSECS_PER_SECOND) { - // so it's time for a strike... let's see if someone else has lightening... - // if no one else is flashing lightening... then we create it... - if (_this.findOtherLightening()) { - _this.lighteningActive = false; - _this.lighteningID = false; + // so it's time for a strike... let's see if someone else has lightning... + // if no one else is flashing lightning... then we create it... + if (_this.findOtherLightning()) { + _this.lightningActive = false; + _this.lightningID = false; } else { - _this.createNewLightening(); - _this.lighteningActive = true; + _this.createNewLightning(); + _this.lightningActive = true; } _this.lastStrike = now; @@ -335,5 +335,5 @@ } }; - return new Lightening(); + return new Lightning(); }); \ No newline at end of file diff --git a/examples/shaders/rainyDayNightSkybox.fs b/examples/shaders/rainyDayNightSkybox.fs index 359bfb1653..a7bcc4b74b 100644 --- a/examples/shaders/rainyDayNightSkybox.fs +++ b/examples/shaders/rainyDayNightSkybox.fs @@ -2,7 +2,7 @@ // Turbulence and Day/Night cycle added by Michael Olson - OMGparticles/2015 // rain effect adapted from Rainy London by David Hoskins. - https://www.shadertoy.com/view/XdSGDc // License Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License. -#line 5 +#line 6 const float PI = 3.14159; uniform float rotationSpeed = 0.005; uniform float gridLevel = 0.0; @@ -96,11 +96,10 @@ vec4 render( in vec3 ro, in vec3 rd ) // stars float fStarContrib = clamp((fSunHeight - fDayHeight) * (-fInverseHL), 0.0, 1.0); - - vec3 vStarDir = rd; - - col = mix(col, stars3(vStarDir), fStarContrib); - col += stars3(vStarDir) * fStarContrib; + if (fStarContrib > 0.0) { + vec3 vStarDir = rd; + col = mix(col, stars3(vStarDir), fStarContrib); + } // Ten layers of rain sheets... float rainBrightness = 0.15; @@ -118,7 +117,7 @@ vec4 render( in vec3 ro, in vec3 rd ) dis += 3.5; } - return vec4( col, 1.0 ); + return vec4(clamp(col,0.0,1.0), 1.0 ); } vec3 getSkyboxColor() { diff --git a/examples/zones/RainyDayNightZone.json b/examples/zones/RainyDayNightZone.json index dc69ca22ac..1efe87c9fb 100644 --- a/examples/zones/RainyDayNightZone.json +++ b/examples/zones/RainyDayNightZone.json @@ -3,9 +3,9 @@ { "backgroundMode": "skybox", "dimensions": { - "x": 30000, - "y": 30000, - "z": 30000 + "x": 10000, + "y": 10000, + "z": 10000 }, "name": "Rainy Day/Night Cycle", "rotation": { @@ -14,13 +14,13 @@ "y": 0, "z": 0 }, - "script": "https://s3.amazonaws.com/hifi-public/brad/rainstorm/lighteningEntity.js", + "script": "https://s3.amazonaws.com/hifi-public/brad/rainstorm/lightningEntity.js", "shapeType": "box", "skybox": { "url": "https://hifi-public.s3.amazonaws.com/images/SkyboxTextures/CloudyDay1.jpg" }, "type": "Zone", - "userData":"{\n\"ProceduralEntity\":{\n\"version\":2,\n\"shaderUrl\":\"https://s3.amazonaws.com/hifi-public/brad/rainstorm/rainyDayNightSkybox.fs\",\n\"channels\":[\n\"https://hifi-public.s3.amazonaws.com/austin/assets/images/skybox/starmap_8k.jpg\",\n\"https://hifi-public.s3.amazonaws.com/austin/assets/images/skybox/celestial_grid.jpg\",\n\"https://s3.amazonaws.com/hifi-public/brad/rainstorm/noise.jpg\",\n\"https://s3.amazonaws.com/hifi-public/brad/noise.jpg\"\n],\n\"uniforms\":{\n\"rotationSpeed\":0.001,\n\"uDayColor\":[0.4,0.3,0.3],\n\"constellationLevel\":0.0,\n\"constellationBoundaryLevel\":0.00,\n\"gridLevel\":0.0\n}\n},\n\"lightening\":{\n\"flashMax\":20,\n\"flashMin\":0,\n\"flashIntensityStepRandomeness\":2,\n\"flashMaxRandomness\":10,\n\"averageLighteningStrikeGap\":120,\n\"extraRandomRangeLighteningStrikeGap\":5,\n\"thunderURL\":\"https://s3.amazonaws.com/hifi-public/brad/rainstorm/thunder-48k.wav\",\n\"thunderVolume\":0.1,\n\"rainURL\":\"https://s3.amazonaws.com/hifi-public/brad/rainstorm/rain.wav\",\n\"rainVolume\":0.05\n}\n}" + "userData":"{\n\"ProceduralEntity\":{\n\"version\":2,\n\"shaderUrl\":\"https://s3.amazonaws.com/hifi-public/brad/rainstorm/rainyDayNightSkybox.fs\",\n\"channels\":[\n\"https://hifi-public.s3.amazonaws.com/austin/assets/images/skybox/starmap_8k.jpg\",\n\"https://hifi-public.s3.amazonaws.com/austin/assets/images/skybox/celestial_grid.jpg\",\n\"https://s3.amazonaws.com/hifi-public/brad/rainstorm/noise.jpg\",\n\"https://s3.amazonaws.com/hifi-public/brad/noise.jpg\"\n],\n\"uniforms\":{\n\"rotationSpeed\":0.001,\n\"uDayColor\":[0.4,0.3,0.3],\n\"constellationLevel\":0.0,\n\"constellationBoundaryLevel\":0.00,\n\"gridLevel\":0.0\n}\n},\n\"lightning\":{\n\"flashMax\":20,\n\"flashMin\":0,\n\"flashIntensityStepRandomeness\":2,\n\"flashMaxRandomness\":10,\n\"averageLightningStrikeGap\":120,\n\"extraRandomRangeLightningStrikeGap\":5,\n\"thunderURL\":\"https://s3.amazonaws.com/hifi-public/brad/rainstorm/thunder-48k.wav\",\n\"thunderVolume\":0.1,\n\"rainURL\":\"https://s3.amazonaws.com/hifi-public/brad/rainstorm/rain.wav\",\n\"rainVolume\":0.05\n}\n}" } ], "Version": 57