diff --git a/examples/libraries/utils.js b/examples/libraries/utils.js index b2b2902cb0..f4a431a657 100644 --- a/examples/libraries/utils.js +++ b/examples/libraries/utils.js @@ -199,7 +199,7 @@ pointInExtents = function(point, minPoint, maxPoint) { * @param Number l The lightness * @return Array The RGB representation */ -hslToRgb = function(hsl, hueOffset) { +hslToRgb = function(hsl) { var r, g, b; if (hsl.s == 0) { r = g = b = hsl.l; // achromatic diff --git a/examples/particle_explorer/particleExplorer.js b/examples/particle_explorer/particleExplorer.js index a3cfd32676..307e361ff1 100644 --- a/examples/particle_explorer/particleExplorer.js +++ b/examples/particle_explorer/particleExplorer.js @@ -43,10 +43,10 @@ var keysToAllow = [ 'emitSpeed', 'speedSpread', 'emitOrientation', - 'emitDimensios', - 'emitRadiusStart', + 'emitDimensions', 'polarStart', 'polarFinish', + 'azimuthStart', 'azimuthFinish', 'emitAcceleration', 'accelerationSpread', diff --git a/examples/playa/fireworks/fireworksLaunchButtonEntityScript.js b/examples/playa/fireworks/fireworksLaunchButtonEntityScript.js new file mode 100644 index 0000000000..63c4f3616e --- /dev/null +++ b/examples/playa/fireworks/fireworksLaunchButtonEntityScript.js @@ -0,0 +1,229 @@ + // + // fireworksLaunchEntityScript.js + // examples/playa/fireworks + // + // Created by Eric Levin on 2/24/16. + // Copyright 2016 High Fidelity, Inc. + // + // Run this script to spawn a big fireworks launch button that a user can press + // + // Distributed under the Apache License, Version 2.0. + // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html + + (function() { + Script.include("../../libraries/utils.js"); + var _this; + Fireworks = function() { + _this = this; + _this.launchSound = SoundCache.getSound("https://s3-us-west-1.amazonaws.com/hifi-content/eric/Sounds/missle+launch.wav"); + _this.explosionSound = SoundCache.getSound("https://s3-us-west-1.amazonaws.com/hifi-content/eric/Sounds/fireworksExplosion.wav"); + _this.timeToExplosionRange = { + min: 2500, + max: 4500 + }; + }; + + Fireworks.prototype = { + + startNearTrigger: function() { + _this.shootFireworks(); + }, + + startFarTrigger: function() { + _this.shootFireworks(); + }, + + clickReleaseOnEntity: function() { + _this.shootFireworks(); + }, + + shootFireworks: function() { + // Get launch position + var launchPosition = getEntityUserData(_this.entityID).launchPosition || _this.position; + + var numMissles = randInt(1, 3); + for(var i = 0; i < numMissles; i++) { + _this.shootMissle(launchPosition); + } + }, + + shootMissle: function(launchPosition) { + Audio.playSound(_this.launchSound, { + position: launchPosition, + volume: 0.5 + }); + + var MODEL_URL = "https://s3-us-west-1.amazonaws.com/hifi-content/eric/models/Rocket-2.fbx"; + var missleDimensions = Vec3.multiply({ + x: 0.24, + y: 0.7, + z: 0.24 + }, randFloat(0.2, 1.5)); + var missleRotation = Quat.fromPitchYawRollDegrees(randInt(-60, 60), 0, randInt(-60, 60)); + var missleVelocity = Vec3.multiply(Quat.getUp(missleRotation), randFloat(2, 4)); + var missleAcceleration = Vec3.multiply(Quat.getUp(missleRotation), randFloat(1, 3)); + var missle = Entities.addEntity({ + type: "Model", + modelURL: MODEL_URL, + position: launchPosition, + rotation: missleRotation, + dimensions: missleDimensions, + damping: 0, + dynamic: true, + lifetime: 20, // Just in case + velocity: missleVelocity, + acceleration: missleAcceleration, + angularVelocity: { + x: 0, + y: randInt(-1, 1), + z: 0 + }, + angularDamping: 0, + visible: false + }); + + var smokeTrailPosition = Vec3.sum(launchPosition, Vec3.multiply(-missleDimensions.y / 2 + 0.1, Quat.getUp(missleRotation))); + var smoke = Entities.addEntity({ + type: "ParticleEffect", + position: smokeTrailPosition, + lifespan: 10, + lifetime: 20, + name: "Smoke Trail", + maxParticles: 3000, + emitRate: 80, + emitSpeed: 0, + speedSpread: 0, + dimensions: { + x: 1000, + y: 1000, + z: 1000 + }, + polarStart: 0, + polarFinish: 0, + azimuthStart: -3.14, + azimuthFinish: 3.14, + emitAcceleration: { + x: 0, + y: 0.01, + z: 0 + }, + accelerationSpread: { + x: 0.01, + y: 0, + z: 0.01 + }, + radiusSpread: 0.03, + particleRadius: 0.3, + radiusStart: 0.06, + radiusFinish: 0.9, + alpha: 0.1, + alphaSpread: 0, + alphaStart: 0.7, + alphaFinish: 0, + textures: "https://hifi-public.s3.amazonaws.com/alan/Particles/Particle-Sprite-Smoke-1.png", + emitterShouldTrail: true, + parentID: missle, + }); + + + Script.setTimeout(function() { + Entities.editEntity(smoke, { + parentID: null, + isEmitting: false + }); + + var explodeBasePosition = Entities.getEntityProperties(missle, "position").position; + + Entities.deleteEntity(missle); + // Explode 1 firework immediately + _this.explodeFirework(explodeBasePosition); + var numAdditionalFireworks = randInt(1, 5); + for (var i = 0; i < numAdditionalFireworks; i++) { + Script.setTimeout(function() { + var explodePosition = Vec3.sum(explodeBasePosition, {x: randFloat(-3, 3), y: randFloat(-3, 3), z: randFloat(-3, 3)}); + _this.explodeFirework(explodePosition); + }, randInt(0, 1000)) + } + }, randFloat(_this.timeToExplosionRange.min, _this.timeToExplosionRange.max)); + + + }, + + explodeFirework: function(explodePosition) { + // We just exploded firework, so stop emitting its fire and smoke + + Audio.playSound(_this.explosionSound, { + position: explodePosition + }); + var firework = Entities.addEntity({ + name: "fireworks emitter", + position: explodePosition, + type: "ParticleEffect", + colorStart: hslToRgb({ + h: Math.random(), + s: 0.5, + l: 0.7 + }), + color: hslToRgb({ + h: Math.random(), + s: 0.5, + l: 0.5 + }), + colorFinish: hslToRgb({ + h: Math.random(), + s: 0.5, + l: 0.7 + }), + maxParticles: 10000, + lifetime: 20, + lifespan: randFloat(1.5, 3), + emitRate: randInt(500, 5000), + emitSpeed: randFloat(0.5, 2), + speedSpread: 0.2, + emitOrientation: Quat.fromPitchYawRollDegrees(randInt(0, 360), randInt(0, 360), randInt(0, 360)), + polarStart: 1, + polarFinish: randFloat(1.2, 3), + azimuthStart: -Math.PI, + azimuthFinish: Math.PI, + emitAcceleration: { + x: 0, + y: randFloat(-1, -0.2), + z: 0 + }, + accelerationSpread: { + x: Math.random(), + y: 0, + z: Math.random() + }, + particleRadius: randFloat(0.001, 0.1), + radiusSpread: Math.random() * 0.1, + radiusStart: randFloat(0.001, 0.1), + radiusFinish: randFloat(0.001, 0.1), + alpha: randFloat(0.8, 1.0), + alphaSpread: randFloat(0.1, 0.2), + alphaStart: randFloat(0.7, 1.0), + alphaFinish: randFloat(0.7, 1.0), + textures: "http://ericrius1.github.io/PlatosCave/assets/star.png", + }); + + + Script.setTimeout(function() { + Entities.editEntity(firework, { + isEmitting: false + }); + }, randInt(500, 1000)); + + }, + + preload: function(entityID) { + _this.entityID = entityID; + _this.position = Entities.getEntityProperties(_this.entityID, "position").position; + print("EBL RELOAD ENTITY SCRIPT!!!"); + + } + + }; + + // entity scripts always need to return a newly constructed object of our type + return new Fireworks(); + }); diff --git a/examples/playa/fireworks/fireworksLaunchButtonSpawner.js b/examples/playa/fireworks/fireworksLaunchButtonSpawner.js new file mode 100644 index 0000000000..20527a7e3a --- /dev/null +++ b/examples/playa/fireworks/fireworksLaunchButtonSpawner.js @@ -0,0 +1,46 @@ + // + // fireworksLaunchButtonSpawner.js + // examples/playa/fireworks + // + // Created by Eric Levina on 2/24/16. + // Copyright 2015 High Fidelity, Inc. + // + // Run this script to spawn a big fireworks launch button that a user can press + // + // Distributed under the Apache License, Version 2.0. + // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html + + var orientation = Camera.getOrientation(); + orientation = Quat.safeEulerAngles(orientation); + orientation.x = 0; + orientation = Quat.fromVec3Degrees(orientation); + var center = Vec3.sum(MyAvatar.position, Vec3.multiply(3, Quat.getFront(orientation))); + + // Math.random ensures no caching of script + var SCRIPT_URL = Script.resolvePath("fireworksLaunchButtonEntityScript.js"); + var MODEL_URL = "https://s3-us-west-1.amazonaws.com/hifi-content/eric/models/Launch-Button.fbx"; + var launchButton = Entities.addEntity({ + type: "Model", + name: "launch pad", + modelURL: MODEL_URL, + position: center, + dimensions: { + x: 0.98, + y: 1.16, + z: 0.98 + }, + script: SCRIPT_URL, + userData: JSON.stringify({ + launchPosition: {x: 1, y: 1.8, z: -20.9}, + grabbableKey: { + wantsTrigger: true + } + }) + }) + + + function cleanup() { + Entities.deleteEntity(launchButton); + } + + Script.scriptEnding.connect(cleanup); \ No newline at end of file