From 5addacddf07af696bc42cc9834468350eae79227 Mon Sep 17 00:00:00 2001 From: Nick Winter Date: Thu, 29 Jan 2015 16:11:13 -0800 Subject: [PATCH 1/5] First draft of ParticleMan particle emitters for showing hidden levels in CampaignView. --- app/assets/images/common/particles/bullet.png | Bin 0 -> 662 bytes .../images/common/particles/bullet2.png | Bin 0 -> 1800 bytes app/assets/images/common/particles/cloud.png | Bin 0 -> 113120 bytes .../images/common/particles/cloud_small.png | Bin 0 -> 11119 bytes app/assets/images/common/particles/smoke.png | Bin 0 -> 15427 bytes app/assets/images/common/particles/star.png | Bin 0 -> 8018 bytes app/core/ParticleMan.coffee | 156 +++ app/styles/common/common.sass | 7 + app/views/play/CampaignView.coffee | 12 + bower.json | 3 +- config.coffee | 3 +- vendor/scripts/ShaderParticles.js | 1179 +++++++++++++++++ 12 files changed, 1358 insertions(+), 2 deletions(-) create mode 100644 app/assets/images/common/particles/bullet.png create mode 100644 app/assets/images/common/particles/bullet2.png create mode 100644 app/assets/images/common/particles/cloud.png create mode 100644 app/assets/images/common/particles/cloud_small.png create mode 100644 app/assets/images/common/particles/smoke.png create mode 100644 app/assets/images/common/particles/star.png create mode 100644 app/core/ParticleMan.coffee create mode 100644 vendor/scripts/ShaderParticles.js diff --git a/app/assets/images/common/particles/bullet.png b/app/assets/images/common/particles/bullet.png new file mode 100644 index 0000000000000000000000000000000000000000..8310ac5b911b86feae2e3445f08033e5a19924bb GIT binary patch literal 662 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%0A*(L5nOHI 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 pKZeD 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 Ml2Mkfku(PX4>Ny4?EnA( literal 0 HcmV?d00001 diff --git a/app/assets/images/common/particles/smoke.png b/app/assets/images/common/particles/smoke.png new file mode 100644 index 0000000000000000000000000000000000000000..7bad8c685f636179ff1ce401869188bae2d2225a GIT binary patch literal 15427 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 literal 0 HcmV?d00001 diff --git a/app/assets/images/common/particles/star.png b/app/assets/images/common/particles/star.png new file mode 100644 index 0000000000000000000000000000000000000000..8eeda12f7dc5313dd5a64473c5f83d07f17f0d27 GIT binary patch literal 8018 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 + return @unsupported = true unless Modernizr.webgl + @renderer = new THREE.WebGLRenderer alpha: true + $(@renderer.domElement).addClass 'particle-man' + @scene = new THREE.Scene() + @clock = new THREE.Clock() + @particleGroups = [] + + destroy: -> + @detach() + # TODO: figure out how to dispose everything + # scene.remove(mesh) + # mesh.dispose() + # geometry.dispose() + # material.dispose() + # texture.dispose() + super() + + attach: (@$el) -> + return if @unsupported + width = @$el.innerWidth() + height = @$el.innerHeight() + @aspectRatio = width / height + @renderer.setSize(width, height) + @$el.append @renderer.domElement + @camera = camera = new THREE.OrthographicCamera( + 100 * -0.5, # Left + 100 * 0.5, # Right + 100 * 0.5 * @aspectRatio, # Top + 100 * -0.5 * @aspectRatio, # Bottom + 0, # Near + 1000 # Far + ) + @camera.position.set(0, 0, 100) + #@camera.position.set(0, 0, 0) + #@camera.lookAt particleGroup.mesh.position + @camera.up = new THREE.Vector3(0, 1, 0) # this might help? http://stackoverflow.com/questions/14271672/moving-the-camera-lookat-and-rotations-in-three-js + @camera.lookAt new THREE.Vector3(0, 0, 0) + unless @started + @started = true + @render() + + detach: -> + return if @unsupported + @renderer.domElement.remove() + @started = false + + render: => + return if @unsupported + return if @destroyed + return unless @started + @renderer.render @scene, @camera + dt = @clock.getDelta() + for group in @particleGroups + group.tick dt + requestAnimationFrame @render + #@countFPS() + + countFPS: -> + @framesRendered ?= 0 + ++@framesRendered + @lastFPS ?= new Date() + now = new Date() + if now - @lastFPS > 1000 + console.log @framesRendered, 'fps with', @particleGroups.length, 'particle groups.' + @framesRendered = 0 + @lastFPS = now + + addEmitter: (x, y, kind="star-fountain") -> + return if @unsupported + options = $.extend true, {}, particleKinds[kind] + options.group.texture = THREE.ImageUtils.loadTexture "/images/common/particles/#{options.group.texture}.png" + scale = 100 + aspectRatio = @$el + group = new SPE.Group options.group + group.mesh.position.x = scale * (-0.5 + x) + group.mesh.position.y = scale * (-0.5 + y) * @aspectRatio + emitter = new SPE.Emitter options.emitter + group.addEmitter emitter + @particleGroups.push group + @scene.add group.mesh + group + + removeEmitter: (group) -> + return if @unsupported + @scene.remove group.mesh + @particleGroups = _.without @particleGroups, group + + removeEmitters: -> + return if @unsupported + @removeEmitter group for group in @particleGroups.slice() + + #addTestCube: -> + #geometry = new THREE.BoxGeometry 5, 5, 5 + #material = new THREE.MeshLambertMaterial color: 0xFF0000 + #mesh = new THREE.Mesh geometry, material + #@scene.add mesh + #light = new THREE.PointLight 0xFFFF00 + #light.position.set 10, 0, 20 + #@scene.add light + + +particleKinds = + 'star-fountain': + group: + texture: 'star' + maxAge: 4 + hasPerspective: 1 + colorize: 1 + transparent: 1 + alphaTest: 0.5 + depthWrite: false + depthTest: true + blending: THREE.NormalBlending + emitter: + type: "cube" + particleCount: 60 + position: new THREE.Vector3(0, 0, 0) + #positionSpread: new THREE.Vector3(2, 2, 0) + positionSpread: new THREE.Vector3(1, 0, 1) + acceleration: new THREE.Vector3(0, -1, 0) + accelerationSpread: new THREE.Vector3(0, 0, 0) + velocity: new THREE.Vector3(0, 4, 0) + velocitySpread: new THREE.Vector3(2, 2, 2) + sizeStart: 8 + sizeStartSpread: 0 + sizeMiddle: 4 + sizeMiddleSpread: 0 + sizeEnd: 1 + sizeEndSpread: 0 + angleStart: 0 + angleStartSpread: 0 + angleMiddle: 0 + angleMiddleSpread: 0 + angleEnd: 0 + angleEndSpread: 0 + angleAlignVelocity: false + colorStart: new THREE.Color(0xb9c5ff) + colorStartSpread: new THREE.Vector3(0, 0, 0) + colorMiddle: new THREE.Color(0x535eff) + colorMiddleSpread: new THREE.Vector3(0, 0, 0) + colorEnd: new THREE.Color(0x0000c4) + colorEndSpread: new THREE.Vector3(0, 0, 0) + opacityStart: 1 + opacityStartSpread: 0 + opacityMiddle: 0.5 + opacityMiddleSpread: 0 + opacityEnd: 0 + opacityEndSpread: 0 + duration: null + alive: 1 + isStatic: 0 diff --git a/app/styles/common/common.sass b/app/styles/common/common.sass index 6fc7281bf..98f9ffee6 100644 --- a/app/styles/common/common.sass +++ b/app/styles/common/common.sass @@ -383,3 +383,10 @@ body > iframe[src^="https://apis.google.com"] @include scale(1.25) width: auto margin: 8px 15px 8px 15px + +.particle-man + position: absolute + z-index: 100 + top: 0 + left: 0 + pointer-events: none diff --git a/app/views/play/CampaignView.coffee b/app/views/play/CampaignView.coffee index 12137f5a9..4c64378b7 100644 --- a/app/views/play/CampaignView.coffee +++ b/app/views/play/CampaignView.coffee @@ -13,6 +13,8 @@ AuthModal = require 'views/core/AuthModal' SubscribeModal = require 'views/core/SubscribeModal' Level = require 'models/Level' utils = require 'core/utils' +require 'vendor/three' +ParticleMan = require 'core/ParticleMan' trackedHourOfCode = false @@ -202,6 +204,7 @@ module.exports = class CampaignView extends RootView if nextLevel = _.find(@campaign.renderedLevels, original: nextLevelOriginal) @createLine level.position, nextLevel.position @applyCampaignStyles() + @testParticles() afterInsert: -> super() @@ -253,6 +256,14 @@ module.exports = class CampaignView extends RootView @$el.find(".#{pos}-gradient").css 'background-image', "linear-gradient(to #{pos}, #{backgroundColorTransparent} 0%, #{backgroundColor} 100%)" @playAmbientSound() + testParticles: -> + return unless me.isAdmin() + @particleMan ?= new ParticleMan() + @particleMan.removeEmitters() + @particleMan.attach @$el.find('.map') + for levelID, level of @campaign.renderedLevels ? {} when level.hidden + @particleMan.addEmitter level.position.x / 100, level.position.y / 100 + onSessionsLoaded: (e) -> return if @editorMode for session in @sessions.models @@ -363,6 +374,7 @@ module.exports = class CampaignView extends RootView resultingMarginX = (pageWidth - resultingWidth) / 2 resultingMarginY = (pageHeight - resultingHeight) / 2 @$el.find('.map').css(width: resultingWidth, height: resultingHeight, 'margin-left': resultingMarginX, 'margin-top': resultingMarginY) + @testParticles() if @particleMan playAmbientSound: -> return if @ambientSound diff --git a/bower.json b/bower.json index f718fa065..7b51ba77b 100644 --- a/bower.json +++ b/bower.json @@ -46,7 +46,8 @@ "zatanna": "https://github.com/differentmatt/zatanna.git#master", "modernizr": "~2.8.3", "backfire": "~0.3.0", - "fastclick": "~1.0.3" + "fastclick": "~1.0.3", + "three.js": "*" }, "overrides": { "backbone": { diff --git a/config.coffee b/config.coffee index 3f520ee87..b173c3c46 100644 --- a/config.coffee +++ b/config.coffee @@ -81,7 +81,7 @@ exports.config = #- vendor.js, all the vendor libraries 'javascripts/vendor.js': [ regJoin('^vendor/scripts/(?!(Box2d|coffeescript|difflib|diffview|jasmine))') - regJoin('^bower_components/(?!(aether|d3|treema))') + regJoin('^bower_components/(?!(aether|d3|treema|three.js))') 'bower_components/treema/treema-utils.js' ] 'javascripts/whole-vendor.js': if TRAVIS then [ @@ -112,6 +112,7 @@ exports.config = 'javascripts/app/vendor/treema.js': 'bower_components/treema/treema.js' 'javascripts/app/vendor/jasmine-bundle.js': regJoin('^vendor/scripts/jasmine') 'javascripts/app/vendor/jasmine-mock-ajax.js': 'vendor/scripts/jasmine-mock-ajax.js' + 'javascripts/app/vendor/three.js': 'bower_components/three.js/three.min.js' #- test, demo libraries 'javascripts/app/tests.js': regJoin('^test/app/') diff --git a/vendor/scripts/ShaderParticles.js b/vendor/scripts/ShaderParticles.js new file mode 100644 index 000000000..0897535f3 --- /dev/null +++ b/vendor/scripts/ShaderParticles.js @@ -0,0 +1,1179 @@ +// ShaderParticleUtils 0.7.8 +// +// (c) 2014 Luke Moody (http://www.github.com/squarefeet) +// & Lee Stemkoski (http://www.adelphi.edu/~stemkoski/) +// +// Based on Lee Stemkoski's original work: +// (https://github.com/stemkoski/stemkoski.github.com/blob/master/Three.js/js/ParticleEngine.js). +// +// ShaderParticleGroup may be freely distributed under the MIT license (See LICENSE.txt) + +var SPE = SPE || {}; + +SPE.utils = { + + /** + * Given a base vector and a spread range vector, create + * a new THREE.Vector3 instance with randomised values. + * + * @private + * + * @param {THREE.Vector3} base + * @param {THREE.Vector3} spread + * @return {THREE.Vector3} + */ + randomVector3: function( base, spread ) { + var v = new THREE.Vector3(); + + v.copy( base ); + + v.x += Math.random() * spread.x - (spread.x/2); + v.y += Math.random() * spread.y - (spread.y/2); + v.z += Math.random() * spread.z - (spread.z/2); + + return v; + }, + + /** + * Create a new THREE.Color instance and given a base vector and + * spread range vector, assign random values. + * + * Note that THREE.Color RGB values are in the range of 0 - 1, not 0 - 255. + * + * @private + * + * @param {THREE.Vector3} base + * @param {THREE.Vector3} spread + * @return {THREE.Color} + */ + randomColor: function( base, spread ) { + var v = new THREE.Color(); + + v.copy( base ); + + v.r += (Math.random() * spread.x) - (spread.x/2); + v.g += (Math.random() * spread.y) - (spread.y/2); + v.b += (Math.random() * spread.z) - (spread.z/2); + + v.r = Math.max( 0, Math.min( v.r, 1 ) ); + v.g = Math.max( 0, Math.min( v.g, 1 ) ); + v.b = Math.max( 0, Math.min( v.b, 1 ) ); + + return v; + }, + + /** + * Create a random Number value based on an initial value and + * a spread range + * + * @private + * + * @param {Number} base + * @param {Number} spread + * @return {Number} + */ + randomFloat: function( base, spread ) { + return base + spread * (Math.random() - 0.5); + }, + + /** + * Create a new THREE.Vector3 instance and project it onto a random point + * on a sphere with randomized radius. + * + * @param {THREE.Vector3} base + * @param {Number} radius + * @param {THREE.Vector3} radiusSpread + * @param {THREE.Vector3} radiusScale + * + * @private + * + * @return {THREE.Vector3} + */ + randomVector3OnSphere: function( base, radius, radiusSpread, radiusScale, radiusSpreadClamp ) { + var z = 2 * Math.random() - 1; + var t = 6.2832 * Math.random(); + var r = Math.sqrt( 1 - z*z ); + var vec = new THREE.Vector3( r * Math.cos(t), r * Math.sin(t), z ); + + var rand = this._randomFloat( radius, radiusSpread ); + + if( radiusSpreadClamp ) { + rand = Math.round( rand / radiusSpreadClamp ) * radiusSpreadClamp; + } + + vec.multiplyScalar( rand ); + + if( radiusScale ) { + vec.multiply( radiusScale ); + } + + vec.add( base ); + + return vec; + }, + + /** + * Create a new THREE.Vector3 instance and project it onto a random point + * on a disk (in the XY-plane) centered at `base` and with randomized radius. + * + * @param {THREE.Vector3} base + * @param {Number} radius + * @param {THREE.Vector3} radiusSpread + * @param {THREE.Vector3} radiusScale + * + * @private + * + * @return {THREE.Vector3} + */ + randomVector3OnDisk: function( base, radius, radiusSpread, radiusScale, radiusSpreadClamp ) { + var t = 6.2832 * Math.random(); + var rand = this._randomFloat( radius, radiusSpread ); + + if( radiusSpreadClamp ) { + rand = Math.round( rand / radiusSpreadClamp ) * radiusSpreadClamp; + } + + var vec = new THREE.Vector3( Math.cos(t), Math.sin(t), 0 ).multiplyScalar( rand ); + + if ( radiusScale ) { + vec.multiply( radiusScale ); + } + + vec.add( base ); + + return vec ; + }, + + + /** + * Create a new THREE.Vector3 instance, and given a sphere with center `base` and + * point `position` on sphere, set direction away from sphere center with random magnitude. + * + * @param {THREE.Vector3} base + * @param {THREE.Vector3} position + * @param {Number} speed + * @param {Number} speedSpread + * @param {THREE.Vector3} scale + * + * @private + * + * @return {THREE.Vector3} + */ + randomVelocityVector3OnSphere: function( base, position, speed, speedSpread, scale ) { + var direction = new THREE.Vector3().subVectors( base, position ); + + direction.normalize().multiplyScalar( Math.abs( this._randomFloat( speed, speedSpread ) ) ); + + if( scale ) { + direction.multiply( scale ); + } + + return direction; + }, + + + + /** + * Given a base vector and a spread vector, randomise the given vector + * accordingly. + * + * @param {THREE.Vector3} vector + * @param {THREE.Vector3} base + * @param {THREE.Vector3} spread + * + * @private + * + * @return {[type]} + */ + randomizeExistingVector3: function( v, base, spread ) { + v.copy( base ); + + v.x += Math.random() * spread.x - (spread.x/2); + v.y += Math.random() * spread.y - (spread.y/2); + v.z += Math.random() * spread.z - (spread.z/2); + }, + + + /** + * Randomize a THREE.Color instance and given a base vector and + * spread range vector, assign random values. + * + * Note that THREE.Color RGB values are in the range of 0 - 1, not 0 - 255. + * + * @private + * + * @param {THREE.Vector3} base + * @param {THREE.Vector3} spread + * @return {THREE.Color} + */ + randomizeExistingColor: function( v, base, spread ) { + v.copy( base ); + + v.r += (Math.random() * spread.x) - (spread.x/2); + v.g += (Math.random() * spread.y) - (spread.y/2); + v.b += (Math.random() * spread.z) - (spread.z/2); + + v.r = Math.max( 0, Math.min( v.r, 1 ) ); + v.g = Math.max( 0, Math.min( v.g, 1 ) ); + v.b = Math.max( 0, Math.min( v.b, 1 ) ); + }, + + /** + * Given an existing particle vector, project it onto a random point on a + * sphere with radius `radius` and position `base`. + * + * @private + * + * @param {THREE.Vector3} v + * @param {THREE.Vector3} base + * @param {Number} radius + */ + randomizeExistingVector3OnSphere: function( v, base, radius, radiusSpread, radiusScale, radiusSpreadClamp ) { + var z = 2 * Math.random() - 1, + t = 6.2832 * Math.random(), + r = Math.sqrt( 1 - z*z ), + rand = this._randomFloat( radius, radiusSpread ); + + if( radiusSpreadClamp ) { + rand = Math.round( rand / radiusSpreadClamp ) * radiusSpreadClamp; + } + + v.set( + (r * Math.cos(t)) * rand, + (r * Math.sin(t)) * rand, + z * rand + ).multiply( radiusScale ); + + v.add( base ); + }, + + + /** + * Given an existing particle vector, project it onto a random point + * on a disk (in the XY-plane) centered at `base` and with radius `radius`. + * + * @private + * + * @param {THREE.Vector3} v + * @param {THREE.Vector3} base + * @param {Number} radius + */ + randomizeExistingVector3OnDisk: function( v, base, radius, radiusSpread, radiusScale, radiusSpreadClamp ) { + var t = 6.2832 * Math.random(), + rand = Math.abs( this._randomFloat( radius, radiusSpread ) ); + + if( radiusSpreadClamp ) { + rand = Math.round( rand / radiusSpreadClamp ) * radiusSpreadClamp; + } + + v.set( + Math.cos( t ), + Math.sin( t ), + 0 + ).multiplyScalar( rand ); + + if ( radiusScale ) { + v.multiply( radiusScale ); + } + + v.add( base ); + }, + + randomizeExistingVelocityVector3OnSphere: function( v, base, position, speed, speedSpread ) { + v.copy(position) + .sub(base) + .normalize() + .multiplyScalar( Math.abs( this._randomFloat( speed, speedSpread ) ) ); + }, + + generateID: function() { + var str = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'; + + str = str.replace(/[xy]/g, function(c) { + var rand = Math.random(); + var r = rand*16|0%16, v = c === 'x' ? r : (r&0x3|0x8); + + return v.toString(16); + }); + + return str; + } +};; + +// ShaderParticleGroup 0.7.8 +// +// (c) 2014 Luke Moody (http://www.github.com/squarefeet) +// & Lee Stemkoski (http://www.adelphi.edu/~stemkoski/) +// +// Based on Lee Stemkoski's original work: +// (https://github.com/stemkoski/stemkoski.github.com/blob/master/Three.js/js/ParticleEngine.js). +// +// ShaderParticleGroup may be freely distributed under the MIT license (See LICENSE.txt) + +var SPE = SPE || {}; + +SPE.Group = function( options ) { + var that = this; + + that.fixedTimeStep = parseFloat( typeof options.fixedTimeStep === 'number' ? options.fixedTimeStep : 0.016 ); + + // Uniform properties ( applied to all particles ) + that.maxAge = parseFloat( options.maxAge || 3 ); + that.texture = options.texture || null; + that.hasPerspective = parseInt( typeof options.hasPerspective === 'number' ? options.hasPerspective : 1, 10 ); + that.colorize = parseInt( typeof options.colorize === 'number' ? options.colorize : 1, 10 ); + + // Material properties + that.blending = typeof options.blending === 'number' ? options.blending : THREE.AdditiveBlending; + that.transparent = typeof options.transparent === 'number' ? options.transparent : 1; + that.alphaTest = typeof options.alphaTest === 'number' ? options.alphaTest : 0.5; + that.depthWrite = options.depthWrite || false; + that.depthTest = options.depthTest || true; + + // Create uniforms + that.uniforms = { + duration: { type: 'f', value: that.maxAge }, + texture: { type: 't', value: that.texture }, + hasPerspective: { type: 'i', value: that.hasPerspective }, + colorize: { type: 'i', value: that.colorize } + }; + + // Create a map of attributes that will hold values for each particle in this group. + that.attributes = { + acceleration: { type: 'v3', value: [] }, + velocity: { type: 'v3', value: [] }, + + alive: { type: 'f', value: [] }, + age: { type: 'f', value: [] }, + + size: { type: 'v3', value: [] }, + angle: { type: 'v4', value: [] }, + + colorStart: { type: 'c', value: [] }, + colorMiddle: { type: 'c', value: [] }, + colorEnd: { type: 'c', value: [] }, + + opacity: { type: 'v3', value: [] } + }; + + // Emitters (that aren't static) will be added to this array for + // processing during the `tick()` function. + that.emitters = []; + + // Create properties for use by the emitter pooling functions. + that._pool = []; + that._poolCreationSettings = null; + that._createNewWhenPoolEmpty = 0; + that.maxAgeMilliseconds = that.maxAge * 1000; + + // Create an empty geometry to hold the particles. + // Each particle is a vertex pushed into this geometry's + // vertices array. + that.geometry = new THREE.Geometry(); + + // Create the shader material using the properties we set above. + that.material = new THREE.ShaderMaterial({ + uniforms: that.uniforms, + attributes: that.attributes, + vertexShader: SPE.shaders.vertex, + fragmentShader: SPE.shaders.fragment, + blending: that.blending, + transparent: that.transparent, + alphaTest: that.alphaTest, + depthWrite: that.depthWrite, + depthTest: that.depthTest + }); + + // And finally create the ParticleSystem. It's got its `dynamic` property + // set so that THREE.js knows to update it on each frame. + that.mesh = new THREE.PointCloud( that.geometry, that.material ); + that.mesh.dynamic = true; +}; + +SPE.Group.prototype = { + + /** + * Tells the age and alive attributes (and the geometry vertices) + * that they need updating by THREE.js's internal tick functions. + * + * @private + * + * @return {this} + */ + _flagUpdate: function() { + var that = this; + + // Set flags to update (causes less garbage than + // ```ParticleSystem.sortParticles = true``` in THREE.r58 at least) + that.attributes.age.needsUpdate = true; + that.attributes.alive.needsUpdate = true; + that.attributes.angle.needsUpdate = true; + // that.attributes.angleAlignVelocity.needsUpdate = true; + that.attributes.velocity.needsUpdate = true; + that.attributes.acceleration.needsUpdate = true; + that.geometry.verticesNeedUpdate = true; + + return that; + }, + + /** + * Add an emitter to this particle group. Once added, an emitter will be automatically + * updated when SPE.Group#tick() is called. + * + * @param {SPE.Emitter} emitter + * @return {this} + */ + addEmitter: function( emitter ) { + var that = this; + + if( emitter.duration ) { + emitter.particlesPerSecond = emitter.particleCount / (that.maxAge < emitter.duration ? that.maxAge : emitter.duration) | 0; + } + else { + emitter.particlesPerSecond = emitter.particleCount / that.maxAge | 0 + } + + var vertices = that.geometry.vertices, + start = vertices.length, + end = emitter.particleCount + start, + a = that.attributes, + acceleration = a.acceleration.value, + velocity = a.velocity.value, + alive = a.alive.value, + age = a.age.value, + size = a.size.value, + angle = a.angle.value, + colorStart = a.colorStart.value, + colorMiddle = a.colorMiddle.value, + colorEnd = a.colorEnd.value, + opacity = a.opacity.value; + + emitter.particleIndex = parseFloat( start ); + + // Create the values + for( var i = start; i < end; ++i ) { + + if( emitter.type === 'sphere' ) { + vertices[i] = that._randomVector3OnSphere( emitter.position, emitter.radius, emitter.radiusSpread, emitter.radiusScale, emitter.radiusSpreadClamp ); + velocity[i] = that._randomVelocityVector3OnSphere( vertices[i], emitter.position, emitter.speed, emitter.speedSpread ); + } + else if( emitter.type === 'disk' ) { + vertices[i] = that._randomVector3OnDisk( emitter.position, emitter.radius, emitter.radiusSpread, emitter.radiusScale, emitter.radiusSpreadClamp ); + velocity[i] = that._randomVelocityVector3OnSphere( vertices[i], emitter.position, emitter.speed, emitter.speedSpread ); + } + else { + vertices[i] = that._randomVector3( emitter.position, emitter.positionSpread ); + velocity[i] = that._randomVector3( emitter.velocity, emitter.velocitySpread ); + } + + acceleration[i] = that._randomVector3( emitter.acceleration, emitter.accelerationSpread ); + + size[i] = new THREE.Vector3( + Math.abs( that._randomFloat( emitter.sizeStart, emitter.sizeStartSpread ) ), + Math.abs( that._randomFloat( emitter.sizeMiddle, emitter.sizeMiddleSpread ) ), + Math.abs( that._randomFloat( emitter.sizeEnd, emitter.sizeEndSpread ) ) + ); + + angle[i] = new THREE.Vector4( + that._randomFloat( emitter.angleStart, emitter.angleStartSpread ), + that._randomFloat( emitter.angleMiddle, emitter.angleMiddleSpread ), + that._randomFloat( emitter.angleEnd, emitter.angleEndSpread ), + emitter.angleAlignVelocity ? 1.0 : 0.0 + ); + + age[i] = 0.0; + alive[i] = emitter.isStatic ? 1.0 : 0.0; + + colorStart[i] = that._randomColor( emitter.colorStart, emitter.colorStartSpread ); + colorMiddle[i] = that._randomColor( emitter.colorMiddle, emitter.colorMiddleSpread ); + colorEnd[i] = that._randomColor( emitter.colorEnd, emitter.colorEndSpread ); + + opacity[i] = new THREE.Vector3( + Math.abs( that._randomFloat( emitter.opacityStart, emitter.opacityStartSpread ) ), + Math.abs( that._randomFloat( emitter.opacityMiddle, emitter.opacityMiddleSpread ) ), + Math.abs( that._randomFloat( emitter.opacityEnd, emitter.opacityEndSpread ) ) + ); + } + + // Cache properties on the emitter so we can access + // them from its tick function. + emitter.verticesIndex = parseFloat( start ); + emitter.attributes = a; + emitter.vertices = that.geometry.vertices; + emitter.maxAge = that.maxAge; + + // Assign a unique ID to this emitter + emitter.__id = that._generateID(); + + // Save this emitter in an array for processing during this.tick() + if( !emitter.isStatic ) { + that.emitters.push( emitter ); + } + + return that; + }, + + + removeEmitter: function( emitter ) { + var id, + emitters = this.emitters; + + if( emitter instanceof SPE.Emitter ) { + id = emitter.__id; + } + else if( typeof emitter === 'string' ) { + id = emitter; + } + else { + console.warn('Invalid emitter or emitter ID passed to SPE.Group#removeEmitter.' ); + return; + } + + for( var i = 0, il = emitters.length; i < il; ++i ) { + if( emitters[i].__id === id ) { + emitters.splice(i, 1); + break; + } + } + }, + + + /** + * The main particle group update function. Call this once per frame. + * + * @param {Number} dt + * @return {this} + */ + tick: function( dt ) { + var that = this, + emitters = that.emitters, + numEmitters = emitters.length; + + dt = dt || that.fixedTimeStep; + + if( numEmitters === 0 ) { + return; + } + + for( var i = 0; i < numEmitters; ++i ) { + emitters[i].tick( dt ); + } + + that._flagUpdate(); + return that; + }, + + + /** + * Fetch a single emitter instance from the pool. + * If there are no objects in the pool, a new emitter will be + * created if specified. + * + * @return {ShaderParticleEmitter | null} + */ + getFromPool: function() { + var that = this, + pool = that._pool, + createNew = that._createNewWhenPoolEmpty; + + if( pool.length ) { + return pool.pop(); + } + else if( createNew ) { + return new SPE.Emitter( that._poolCreationSettings ); + } + + return null; + }, + + + /** + * Release an emitter into the pool. + * + * @param {ShaderParticleEmitter} emitter + * @return {this} + */ + releaseIntoPool: function( emitter ) { + if( !(emitter instanceof SPE.Emitter) ) { + console.error( 'Will not add non-emitter to particle group pool:', emitter ); + return; + } + + emitter.reset(); + this._pool.unshift( emitter ); + + return this; + }, + + + /** + * Get the pool array + * + * @return {Array} + */ + getPool: function() { + return this._pool; + }, + + + /** + * Add a pool of emitters to this particle group + * + * @param {Number} numEmitters The number of emitters to add to the pool. + * @param {Object} emitterSettings An object describing the settings to pass to each emitter. + * @param {Boolean} createNew Should a new emitter be created if the pool runs out? + * @return {this} + */ + addPool: function( numEmitters, emitterSettings, createNew ) { + var that = this, + emitter; + + // Save relevant settings and flags. + that._poolCreationSettings = emitterSettings; + that._createNewWhenPoolEmpty = !!createNew; + + // Create the emitters, add them to this group and the pool. + for( var i = 0; i < numEmitters; ++i ) { + emitter = new SPE.Emitter( emitterSettings ); + that.addEmitter( emitter ); + that.releaseIntoPool( emitter ); + } + + return that; + }, + + + /** + * Internal method. Sets a single emitter to be alive + * + * @private + * + * @param {THREE.Vector3} pos + * @return {this} + */ + _triggerSingleEmitter: function( pos ) { + var that = this, + emitter = that.getFromPool(); + + if( emitter === null ) { + console.log('SPE.Group pool ran out.'); + return; + } + + // TODO: Should an instanceof check happen here? Or maybe at least a typeof? + if( pos ) { + emitter.position.copy( pos ); + } + + emitter.enable(); + + setTimeout( function() { + emitter.disable(); + that.releaseIntoPool( emitter ); + }, that.maxAgeMilliseconds ); + + return that; + }, + + + /** + * Set a given number of emitters as alive, with an optional position + * vector3 to move them to. + * + * @param {Number} numEmitters + * @param {THREE.Vector3} position + * @return {this} + */ + triggerPoolEmitter: function( numEmitters, position ) { + var that = this; + + if( typeof numEmitters === 'number' && numEmitters > 1) { + for( var i = 0; i < numEmitters; ++i ) { + that._triggerSingleEmitter( position ); + } + } + else { + that._triggerSingleEmitter( position ); + } + + return that; + } +}; + + +// Extend ShaderParticleGroup's prototype with functions from utils object. +for( var i in SPE.utils ) { + SPE.Group.prototype[ '_' + i ] = SPE.utils[i]; +} + + +// The all-important shaders +SPE.shaders = { + vertex: [ + 'uniform float duration;', + 'uniform int hasPerspective;', + + 'attribute vec3 colorStart;', + 'attribute vec3 colorMiddle;', + 'attribute vec3 colorEnd;', + 'attribute vec3 opacity;', + + 'attribute vec3 acceleration;', + 'attribute vec3 velocity;', + 'attribute float alive;', + 'attribute float age;', + + 'attribute vec3 size;', + 'attribute vec4 angle;', + + // values to be passed to the fragment shader + 'varying vec4 vColor;', + 'varying float vAngle;', + + + // Integrate acceleration into velocity and apply it to the particle's position + 'vec4 GetPos() {', + 'vec3 newPos = vec3( position );', + + // Move acceleration & velocity vectors to the value they + // should be at the current age + 'vec3 a = acceleration * age;', + 'vec3 v = velocity * age;', + + // Move velocity vector to correct values at this age + 'v = v + (a * age);', + + // Add velocity vector to the newPos vector + 'newPos = newPos + v;', + + // Convert the newPos vector into world-space + 'vec4 mvPosition = modelViewMatrix * vec4( newPos, 1.0 );', + + 'return mvPosition;', + '}', + + + 'void main() {', + + 'float positionInTime = (age / duration);', + + 'float lerpAmount1 = (age / (0.5 * duration));', // percentage during first half + 'float lerpAmount2 = ((age - 0.5 * duration) / (0.5 * duration));', // percentage during second half + 'float halfDuration = duration / 2.0;', + 'float pointSize = 0.0;', + + 'vAngle = 0.0;', + + 'if( alive > 0.5 ) {', + + // lerp the color and opacity + 'if( positionInTime < 0.5 ) {', + 'vColor = vec4( mix(colorStart, colorMiddle, lerpAmount1), mix(opacity.x, opacity.y, lerpAmount1) );', + '}', + 'else {', + 'vColor = vec4( mix(colorMiddle, colorEnd, lerpAmount2), mix(opacity.y, opacity.z, lerpAmount2) );', + '}', + + + // Get the position of this particle so we can use it + // when we calculate any perspective that might be required. + 'vec4 pos = GetPos();', + + + // Determine the angle we should use for this particle. + 'if( angle[3] == 1.0 ) {', + 'vAngle = -atan(pos.y, pos.x);', + '}', + 'else if( positionInTime < 0.5 ) {', + 'vAngle = mix( angle.x, angle.y, lerpAmount1 );', + '}', + 'else {', + 'vAngle = mix( angle.y, angle.z, lerpAmount2 );', + '}', + + // Determine point size. + 'if( positionInTime < 0.5) {', + 'pointSize = mix( size.x, size.y, lerpAmount1 );', + '}', + 'else {', + 'pointSize = mix( size.y, size.z, lerpAmount2 );', + '}', + + + 'if( hasPerspective == 1 ) {', + 'pointSize = pointSize * ( 300.0 / length( pos.xyz ) );', + '}', + + // Set particle size and position + 'gl_PointSize = pointSize;', + 'gl_Position = projectionMatrix * pos;', + '}', + + 'else {', + // Hide particle and set its position to the (maybe) glsl + // equivalent of Number.POSITIVE_INFINITY + 'vColor = vec4( 0.0, 0.0, 0.0, 0.0 );', + 'gl_Position = vec4(1000000000.0, 1000000000.0, 1000000000.0, 0.0);', + '}', + '}', + ].join('\n'), + + fragment: [ + 'uniform sampler2D texture;', + 'uniform int colorize;', + + 'varying vec4 vColor;', + 'varying float vAngle;', + + 'void main() {', + 'float c = cos(vAngle);', + 'float s = sin(vAngle);', + + 'vec2 rotatedUV = vec2(c * (gl_PointCoord.x - 0.5) + s * (gl_PointCoord.y - 0.5) + 0.5,', + 'c * (gl_PointCoord.y - 0.5) - s * (gl_PointCoord.x - 0.5) + 0.5);', + + 'vec4 rotatedTexture = texture2D( texture, rotatedUV );', + + 'if( colorize == 1 ) {', + 'gl_FragColor = vColor * rotatedTexture;', + '}', + 'else {', + 'gl_FragColor = rotatedTexture;', + '}', + '}' + ].join('\n') +}; +; + +// ShaderParticleEmitter 0.7.8 +// +// (c) 2014 Luke Moody (http://www.github.com/squarefeet) +// & Lee Stemkoski (http://www.adelphi.edu/~stemkoski/) +// +// Based on Lee Stemkoski's original work: +// (https://github.com/stemkoski/stemkoski.github.com/blob/master/Three.js/js/ParticleEngine.js). +// +// ShaderParticleEmitter may be freely distributed under the MIT license (See LICENSE.txt) + +var SPE = SPE || {}; + +SPE.Emitter = function( options ) { + // If no options are provided, fallback to an empty object. + options = options || {}; + + // Helps with minification. Not as easy to read the following code, + // but should still be readable enough! + var that = this; + + + that.particleCount = typeof options.particleCount === 'number' ? options.particleCount : 100; + that.type = (options.type === 'cube' || options.type === 'sphere' || options.type === 'disk') ? options.type : 'cube'; + + that.position = options.position instanceof THREE.Vector3 ? options.position : new THREE.Vector3(); + that.positionSpread = options.positionSpread instanceof THREE.Vector3 ? options.positionSpread : new THREE.Vector3(); + + // These two properties are only used when this.type === 'sphere' or 'disk' + that.radius = typeof options.radius === 'number' ? options.radius : 10; + that.radiusSpread = typeof options.radiusSpread === 'number' ? options.radiusSpread : 0; + that.radiusScale = options.radiusScale instanceof THREE.Vector3 ? options.radiusScale : new THREE.Vector3(1, 1, 1); + that.radiusSpreadClamp = typeof options.radiusSpreadClamp === 'number' ? options.radiusSpreadClamp : 0; + + that.acceleration = options.acceleration instanceof THREE.Vector3 ? options.acceleration : new THREE.Vector3(); + that.accelerationSpread = options.accelerationSpread instanceof THREE.Vector3 ? options.accelerationSpread : new THREE.Vector3(); + + that.velocity = options.velocity instanceof THREE.Vector3 ? options.velocity : new THREE.Vector3(); + that.velocitySpread = options.velocitySpread instanceof THREE.Vector3 ? options.velocitySpread : new THREE.Vector3(); + + + // And again here; only used when this.type === 'sphere' or 'disk' + that.speed = parseFloat( typeof options.speed === 'number' ? options.speed : 0.0 ); + that.speedSpread = parseFloat( typeof options.speedSpread === 'number' ? options.speedSpread : 0.0 ); + + + // Sizes + that.sizeStart = parseFloat( typeof options.sizeStart === 'number' ? options.sizeStart : 1.0 ); + that.sizeStartSpread = parseFloat( typeof options.sizeStartSpread === 'number' ? options.sizeStartSpread : 0.0 ); + + that.sizeEnd = parseFloat( typeof options.sizeEnd === 'number' ? options.sizeEnd : that.sizeStart ); + that.sizeEndSpread = parseFloat( typeof options.sizeEndSpread === 'number' ? options.sizeEndSpread : 0.0 ); + + that.sizeMiddle = parseFloat( + typeof options.sizeMiddle !== 'undefined' ? + options.sizeMiddle : + Math.abs(that.sizeEnd + that.sizeStart) / 2 + ); + that.sizeMiddleSpread = parseFloat( typeof options.sizeMiddleSpread === 'number' ? options.sizeMiddleSpread : 0 ); + + + // Angles + that.angleStart = parseFloat( typeof options.angleStart === 'number' ? options.angleStart : 0 ); + that.angleStartSpread = parseFloat( typeof options.angleStartSpread === 'number' ? options.angleStartSpread : 0 ); + + that.angleEnd = parseFloat( typeof options.angleEnd === 'number' ? options.angleEnd : 0 ); + that.angleEndSpread = parseFloat( typeof options.angleEndSpread === 'number' ? options.angleEndSpread : 0 ); + + that.angleMiddle = parseFloat( + typeof options.angleMiddle !== 'undefined' ? + options.angleMiddle : + Math.abs(that.angleEnd + that.angleStart) / 2 + ); + that.angleMiddleSpread = parseFloat( typeof options.angleMiddleSpread === 'number' ? options.angleMiddleSpread : 0 ); + + that.angleAlignVelocity = options.angleAlignVelocity || false; + + + // Colors + that.colorStart = options.colorStart instanceof THREE.Color ? options.colorStart : new THREE.Color( 'white' ); + that.colorStartSpread = options.colorStartSpread instanceof THREE.Vector3 ? options.colorStartSpread : new THREE.Vector3(); + + that.colorEnd = options.colorEnd instanceof THREE.Color ? options.colorEnd : that.colorStart.clone(); + that.colorEndSpread = options.colorEndSpread instanceof THREE.Vector3 ? options.colorEndSpread : new THREE.Vector3(); + + that.colorMiddle = + options.colorMiddle instanceof THREE.Color ? + options.colorMiddle : + new THREE.Color().addColors( that.colorStart, that.colorEnd ).multiplyScalar( 0.5 ); + that.colorMiddleSpread = options.colorMiddleSpread instanceof THREE.Vector3 ? options.colorMiddleSpread : new THREE.Vector3(); + + + + // Opacities + that.opacityStart = parseFloat( typeof options.opacityStart !== 'undefined' ? options.opacityStart : 1 ); + that.opacityStartSpread = parseFloat( typeof options.opacityStartSpread !== 'undefined' ? options.opacityStartSpread : 0 ); + + that.opacityEnd = parseFloat( typeof options.opacityEnd === 'number' ? options.opacityEnd : 0 ); + that.opacityEndSpread = parseFloat( typeof options.opacityEndSpread !== 'undefined' ? options.opacityEndSpread : 0 ); + + that.opacityMiddle = parseFloat( + typeof options.opacityMiddle !== 'undefined' ? + options.opacityMiddle : + Math.abs(that.opacityEnd + that.opacityStart) / 2 + ); + that.opacityMiddleSpread = parseFloat( typeof options.opacityMiddleSpread === 'number' ? options.opacityMiddleSpread : 0 ); + + + // Generic + that.duration = typeof options.duration === 'number' ? options.duration : null; + that.alive = parseFloat( typeof options.alive === 'number' ? options.alive : 1.0 ); + that.isStatic = typeof options.isStatic === 'number' ? options.isStatic : 0; + + // The following properties are used internally, and mostly set when this emitter + // is added to a particle group. + that.particlesPerSecond = 0; + that.attributes = null; + that.vertices = null; + that.verticesIndex = 0; + that.age = 0.0; + that.maxAge = 0.0; + + that.particleIndex = 0.0; + + that.__id = null; + + that.userData = {}; +}; + +SPE.Emitter.prototype = { + + /** + * Reset a particle's position. Accounts for emitter type and spreads. + * + * @private + * + * @param {THREE.Vector3} p + */ + _resetParticle: function( i ) { + var that = this, + type = that.type, + spread = that.positionSpread, + particlePosition = that.vertices[i], + a = that.attributes, + particleVelocity = a.velocity.value[i], + + vSpread = that.velocitySpread, + aSpread = that.accelerationSpread; + + // Optimise for no position spread or radius + if( + ( type === 'cube' && spread.x === 0 && spread.y === 0 && spread.z === 0 ) || + ( type === 'sphere' && that.radius === 0 ) || + ( type === 'disk' && that.radius === 0 ) + ) { + particlePosition.copy( that.position ); + that._randomizeExistingVector3( particleVelocity, that.velocity, vSpread ); + + if( type === 'cube' ) { + that._randomizeExistingVector3( that.attributes.acceleration.value[i], that.acceleration, aSpread ); + } + } + + // If there is a position spread, then get a new position based on this spread. + else if( type === 'cube' ) { + that._randomizeExistingVector3( particlePosition, that.position, spread ); + that._randomizeExistingVector3( particleVelocity, that.velocity, vSpread ); + that._randomizeExistingVector3( that.attributes.acceleration.value[i], that.acceleration, aSpread ); + } + + else if( type === 'sphere') { + that._randomizeExistingVector3OnSphere( particlePosition, that.position, that.radius, that.radiusSpread, that.radiusScale, that.radiusSpreadClamp ); + that._randomizeExistingVelocityVector3OnSphere( particleVelocity, that.position, particlePosition, that.speed, that.speedSpread ); + } + + else if( type === 'disk') { + that._randomizeExistingVector3OnDisk( particlePosition, that.position, that.radius, that.radiusSpread, that.radiusScale, that.radiusSpreadClamp ); + that._randomizeExistingVelocityVector3OnSphere( particleVelocity, that.position, particlePosition, that.speed, that.speedSpread ); + } + }, + + /** + * Update this emitter's particle's positions. Called by the SPE.Group + * that this emitter belongs to. + * + * @param {Number} dt + */ + tick: function( dt ) { + + if( this.isStatic ) { + return; + } + + // Cache some values for quicker access in loops. + var that = this, + a = that.attributes, + alive = a.alive.value, + age = a.age.value, + start = that.verticesIndex, + particleCount = that.particleCount, + end = start + particleCount, + pps = that.particlesPerSecond * that.alive, + ppsdt = pps * dt, + m = that.maxAge, + emitterAge = that.age, + duration = that.duration, + pIndex = that.particleIndex; + + // Loop through all the particles in this emitter and + // determine whether they're still alive and need advancing + // or if they should be dead and therefore marked as such. + for( var i = start; i < end; ++i ) { + if( alive[ i ] === 1.0 ) { + age[ i ] += dt; + } + + if( age[ i ] >= m ) { + age[ i ] = 0.0; + alive[ i ] = 0.0; + } + } + + // If the emitter is dead, reset any particles that are in + // the recycled vertices array and reset the age of the + // emitter to zero ready to go again if required, then + // exit this function. + if( that.alive === 0.0 ) { + that.age = 0.0; + return; + } + + // If the emitter has a specified lifetime and we've exceeded it, + // mark the emitter as dead and exit this function. + if( typeof duration === 'number' && emitterAge > duration ) { + that.alive = 0.0; + that.age = 0.0; + return; + } + + + + var n = Math.max( Math.min( end, pIndex + ppsdt ), 0), + count = 0, + index = 0, + pIndexFloor = pIndex | 0, + dtInc; + + for( i = pIndexFloor; i < n; ++i ) { + if( alive[ i ] !== 1.0 ) { + ++count; + } + } + + if( count !== 0 ) { + dtInc = dt / count; + + for( i = pIndexFloor; i < n; ++i, ++index ) { + if( alive[ i ] !== 1.0 ) { + alive[ i ] = 1.0; + age[ i ] = dtInc * index; + that._resetParticle( i ); + } + } + } + + that.particleIndex += ppsdt; + + if( that.particleIndex < 0.0 ) { + that.particleIndex = 0.0; + } + + if( pIndex >= start + particleCount ) { + that.particleIndex = parseFloat( start ); + } + + // Add the delta time value to the age of the emitter. + that.age += dt; + + if( that.age < 0.0 ) { + that.age = 0.0; + } + }, + + /** + * Reset this emitter back to its starting position. + * If `force` is truthy, then reset all particles in this + * emitter as well, even if they're currently alive. + * + * @param {Boolean} force + * @return {this} + */ + reset: function( force ) { + var that = this; + + that.age = 0.0; + that.alive = 0; + + if( force ) { + var start = that.verticesIndex, + end = that.verticesIndex + that.particleCount, + a = that.attributes, + alive = a.alive.value, + age = a.age.value; + + for( var i = start; i < end; ++i ) { + alive[ i ] = 0.0; + age[ i ] = 0.0; + } + } + + return that; + }, + + + /** + * Enable this emitter. + */ + enable: function() { + this.alive = 1; + }, + + /** + * Disable this emitter. + */ + disable: function() { + this.alive = 0; + } +}; + +// Extend SPE.Emitter's prototype with functions from utils object. +for( var i in SPE.utils ) { + SPE.Emitter.prototype[ '_' + i ] = SPE.utils[i]; +} From 92f070eccaae62dce2ac597e452933e83dd75247 Mon Sep 17 00:00:00 2001 From: Matt Lott Date: Thu, 29 Jan 2015 16:45:15 -0800 Subject: [PATCH 2/5] Fix help video events Removing the protocol broke the video player event hooks. --- app/views/play/menu/GuideView.coffee | 17 ++++++----------- 1 file changed, 6 insertions(+), 11 deletions(-) diff --git a/app/views/play/menu/GuideView.coffee b/app/views/play/menu/GuideView.coffee index 335d06628..fd447045f 100644 --- a/app/views/play/menu/GuideView.coffee +++ b/app/views/play/menu/GuideView.coffee @@ -94,18 +94,13 @@ module.exports = class LevelGuideView extends CocoView window.tracker?.trackEvent 'Finish help video', level: @levelID, ls: @sessionID, style: @helpVideos[@helpVideosIndex].style @trackedHelpVideoFinish = true - # we wan't to always use the same scheme (HTTP/HTTPS) as the page was loaded with, but don't want to require Artisans to have to remember - # not to include a scheme in help video url - fixupUri = (uri) -> - n = uri.indexOf('/') - if n < 1 - return uri - return uri.slice(n) - setupVideoPlayer: () -> - return unless @helpVideos.length > 0 - helpVideoURL = fixupUri(@helpVideos[@helpVideosIndex].url) - @setupVimeoVideoPlayer helpVideoURL + return unless @helpVideos?.length > 0 + return unless url = @helpVideos[@helpVideosIndex]?.url + # Always use HTTPS + # TODO: Not specifying the protocol should work based on Vimeo docs, but breaks postMessage/eventing in practice. + url = "https:" + url.substr url.indexOf '/' + @setupVimeoVideoPlayer url setupVimeoVideoPlayer: (helpVideoURL) -> # Setup Vimeo player From fd0e7a8c4460e5a35586de58fedd1102f29600d4 Mon Sep 17 00:00:00 2001 From: Nick Winter Date: Thu, 29 Jan 2015 18:18:55 -0800 Subject: [PATCH 3/5] Picked some slightly less awful particle colors for different terrains and level types. Enabled for half the players. --- app/assets/images/common/particles/star.png | Bin 8018 -> 5622 bytes app/core/ParticleMan.coffee | 208 +++++++++++++++----- app/models/User.coffee | 10 + app/views/play/CampaignView.coffee | 11 +- 4 files changed, 172 insertions(+), 57 deletions(-) diff --git a/app/assets/images/common/particles/star.png b/app/assets/images/common/particles/star.png index 8eeda12f7dc5313dd5a64473c5f83d07f17f0d27..5e6f2a12fa9d8c8c3e190130accec0d9c4cf6bd6 100644 GIT binary patch literal 5622 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 literal 8018 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 + addEmitter: (x, y, kind="level-dungeon-premium") -> return if @unsupported + console.log 'adding kind', kind options = $.extend true, {}, particleKinds[kind] options.group.texture = THREE.ImageUtils.loadTexture "/images/common/particles/#{options.group.texture}.png" scale = 100 @@ -104,53 +104,153 @@ module.exports = ParticleMan = class ParticleMan extends CocoClass #@scene.add light +hsl = (hue, saturation, lightness) -> + new THREE.Color utils.hslToHex([hue, saturation, lightness]) +vec = (x, y, z) -> + new THREE.Vector3 x, y, z + +defaults = + group: + texture: 'star' + maxAge: 4 + hasPerspective: 1 + colorize: 1 + transparent: 1 + alphaTest: 0.5 + depthWrite: false + depthTest: true + blending: THREE.NormalBlending + emitter: + type: "cube" + particleCount: 60 + position: vec 0, 0, 0 + positionSpread: vec 1, 0, 1 + acceleration: vec 0, -1, 0 + accelerationSpread: vec 0, 0, 0 + velocity: vec 0, 4, 0 + velocitySpread: vec 2, 2, 2 + sizeStart: 6 + sizeStartSpread: 0 + sizeMiddle: 4 + sizeMiddleSpread: 0 + sizeEnd: 2 + sizeEndSpread: 0 + angleStart: 0 + angleStartSpread: 0 + angleMiddle: 0 + angleMiddleSpread: 0 + angleEnd: 0 + angleEndSpread: 0 + angleAlignVelocity: false + colorStart: hsl 0.55, 0.75, 0.75 + colorStartSpread: vec 0.3, 0.3, 0.3 + colorMiddle: hsl 0.55, 0.6, 0.5 + colorMiddleSpread: vec 0.2, 0.2, 0.2 + colorEnd: hsl 0.55, 0.5, 0.25 + colorEndSpread: vec 0.1, 0.1, 0.1 + opacityStart: 1 + opacityStartSpread: 0 + opacityMiddle: 0.75 + opacityMiddleSpread: 0 + opacityEnd: 0.25 + opacityEndSpread: 0 + duration: null + alive: 1 + isStatic: 0 + +ext = (d, options) -> + $.extend true, {}, d, options ? {} + particleKinds = - 'star-fountain': - group: - texture: 'star' - maxAge: 4 - hasPerspective: 1 - colorize: 1 - transparent: 1 - alphaTest: 0.5 - depthWrite: false - depthTest: true - blending: THREE.NormalBlending + 'level-dungeon-premium': ext defaults + 'level-forest-premium': ext defaults, emitter: - type: "cube" - particleCount: 60 - position: new THREE.Vector3(0, 0, 0) - #positionSpread: new THREE.Vector3(2, 2, 0) - positionSpread: new THREE.Vector3(1, 0, 1) - acceleration: new THREE.Vector3(0, -1, 0) - accelerationSpread: new THREE.Vector3(0, 0, 0) - velocity: new THREE.Vector3(0, 4, 0) - velocitySpread: new THREE.Vector3(2, 2, 2) - sizeStart: 8 - sizeStartSpread: 0 - sizeMiddle: 4 - sizeMiddleSpread: 0 - sizeEnd: 1 - sizeEndSpread: 0 - angleStart: 0 - angleStartSpread: 0 - angleMiddle: 0 - angleMiddleSpread: 0 - angleEnd: 0 - angleEndSpread: 0 - angleAlignVelocity: false - colorStart: new THREE.Color(0xb9c5ff) - colorStartSpread: new THREE.Vector3(0, 0, 0) - colorMiddle: new THREE.Color(0x535eff) - colorMiddleSpread: new THREE.Vector3(0, 0, 0) - colorEnd: new THREE.Color(0x0000c4) - colorEndSpread: new THREE.Vector3(0, 0, 0) - opacityStart: 1 - opacityStartSpread: 0 - opacityMiddle: 0.5 - opacityMiddleSpread: 0 - opacityEnd: 0 - opacityEndSpread: 0 - duration: null - alive: 1 - isStatic: 0 + colorStart: hsl 0.56, 0.97, 0.5 + colorMiddle: hsl 0.56, 0.57, 0.5 + colorEnd: hsl 0.56, 0.17, 0.5 + 'level-desert-premium': ext defaults, + emitter: + colorStart: hsl 0.56, 0.97, 0.5 + colorMiddle: hsl 0.56, 0.57, 0.5 + colorEnd: hsl 0.56, 0.17, 0.5 + 'level-mountain-premium': ext defaults, + emitter: + colorStart: hsl 0.56, 0.97, 0.5 + colorMiddle: hsl 0.56, 0.57, 0.5 + colorEnd: hsl 0.56, 0.17, 0.5 + +particleKinds['level-dungeon-gate'] = ext particleKinds['level-dungeon-premium'], + emitter: + particleCount: 120 + velocity: vec 0, 6, 0 + colorStart: hsl 0.5, 0.75, 0.9 + colorMiddle: hsl 0.5, 0.75, 0.7 + colorEnd: hsl 0.5, 0.75, 0.3 + colorStartSpread: vec 1, 1, 1 + colorMiddleSpread: vec 1.5, 1.5, 1.5 + colorEndSpread: vec 2.5, 2.5, 2.5 + +particleKinds['level-dungeon-hero-ladder'] = ext particleKinds['level-dungeon-premium'], + emitter: + particleCount: 90 + velocity: vec 0, 4, 0 + colorStart: hsl 0, 0.75, 0.7 + colorMiddle: hsl 0, 0.75, 0.5 + colorEnd: hsl 0, 0.75, 0.3 + +particleKinds['level-forest-gate'] = ext particleKinds['level-forest-premium'], + emitter: + particleCount: 120 + velocity: vec 0, 8, 0 + colorStart: hsl 0.56, 0.97, 0.3 + colorMiddle: hsl 0.56, 0.57, 0.3 + colorEnd: hsl 0.56, 0.17, 0.3 + colorStartSpread: vec 1, 1, 1 + colorMiddleSpread: vec 1.5, 1.5, 1.5 + colorEndSpread: vec 2.5, 2.5, 2.5 + +particleKinds['level-forest-hero-ladder'] = ext particleKinds['level-forest-premium'], + emitter: + particleCount: 90 + velocity: vec 0, 4, 0 + colorStart: hsl 0, 0.95, 0.3 + colorMiddle: hsl 0, 1, 0.5 + colorEnd: hsl 0, 0.75, 0.1 + +particleKinds['level-desert-gate'] = ext particleKinds['level-desert-premium'], + emitter: + particleCount: 120 + velocity: vec 0, 8, 0 + colorStart: hsl 0.56, 0.97, 0.3 + colorMiddle: hsl 0.56, 0.57, 0.3 + colorEnd: hsl 0.56, 0.17, 0.3 + colorStartSpread: vec 1, 1, 1 + colorMiddleSpread: vec 1.5, 1.5, 1.5 + colorEndSpread: vec 2.5, 2.5, 2.5 + +particleKinds['level-desert-hero-ladder'] = ext particleKinds['level-desert-premium'], + emitter: + particleCount: 90 + velocity: vec 0, 4, 0 + colorStart: hsl 0, 0.95, 0.3 + colorMiddle: hsl 0, 1, 0.5 + colorEnd: hsl 0, 0.75, 0.1 + +particleKinds['level-dungeon-gate'] = ext particleKinds['level-dungeon-premium'], + emitter: + particleCount: 120 + velocity: vec 0, 8, 0 + colorStart: hsl 0.56, 0.97, 0.3 + colorMiddle: hsl 0.56, 0.57, 0.3 + colorEnd: hsl 0.56, 0.17, 0.3 + colorStartSpread: vec 1, 1, 1 + colorMiddleSpread: vec 1.5, 1.5, 1.5 + colorEndSpread: vec 2.5, 2.5, 2.5 + +particleKinds['level-dungeon-hero-ladder'] = ext particleKinds['level-dungeon-premium'], + emitter: + particleCount: 90 + velocity: vec 0, 4, 0 + colorStart: hsl 0, 0.95, 0.3 + colorMiddle: hsl 0, 1, 0.5 + colorEnd: hsl 0, 0.75, 0.1 diff --git a/app/models/User.coffee b/app/models/User.coffee index dbc84e732..ee537e1ae 100644 --- a/app/models/User.coffee +++ b/app/models/User.coffee @@ -123,6 +123,16 @@ module.exports = class User extends CocoModel application.tracker.identify gemPromptGroup: @gemPromptGroup unless me.isAdmin() @gemPromptGroup + getForeshadowsLevels: -> + return @foreshadowsLevels if @foreshadowsLevels? + group = me.get('testGroupNumber') % 16 + @foreshadowsLevels = switch group + when 0, 1, 2, 3, 4, 5, 6, 7 then true + when 8, 9, 10, 11, 12, 13, 14, 15 then false + @foreshadowsLevels = true if me.isAdmin() + application.tracker.identify foreshadowsLevels: @foreshadowsLevels unless me.isAdmin() + @foreshadowsLevels + getVideoTutorialStylesIndex: (numVideos=0)-> # A/B Testing video tutorial styles # Not a constant number of videos available (e.g. could be 0, 1, 3, or 4 currently) diff --git a/app/views/play/CampaignView.coffee b/app/views/play/CampaignView.coffee index 4c64378b7..7a7e1d6f1 100644 --- a/app/views/play/CampaignView.coffee +++ b/app/views/play/CampaignView.coffee @@ -257,12 +257,17 @@ module.exports = class CampaignView extends RootView @playAmbientSound() testParticles: -> - return unless me.isAdmin() + return unless @campaign.loaded and me.getForeshadowsLevels() @particleMan ?= new ParticleMan() @particleMan.removeEmitters() @particleMan.attach @$el.find('.map') - for levelID, level of @campaign.renderedLevels ? {} when level.hidden - @particleMan.addEmitter level.position.x / 100, level.position.y / 100 + for level in @campaign.renderedLevels ? {} when level.hidden + particleKey = ['level', @terrain] + particleKey.push level.type if level.type and level.type isnt 'hero' + particleKey.push 'premium' if level.requiresSubscription + particleKey.push 'gate' if level.slug in ['kithgard-gates', 'siege-of-stonehold', 'clash-of-clones'] + continue if particleKey.length is 2 # Don't show basic levels + @particleMan.addEmitter level.position.x / 100, level.position.y / 100, particleKey.join('-') onSessionsLoaded: (e) -> return if @editorMode From 1630b303515cb9323590eaed37185e47009db37a Mon Sep 17 00:00:00 2001 From: Nick Winter Date: Thu, 29 Jan 2015 19:05:30 -0800 Subject: [PATCH 4/5] Fixed showing hero unlock portraits on world map. Showing them now even before their levels are unlocked, and showing until you purchase, not just unlock them. --- app/styles/play/campaign-view.sass | 23 +++++++++++++++++------ app/templates/play/campaign-view.jade | 6 ++++-- app/views/play/CampaignView.coffee | 4 +++- 3 files changed, 24 insertions(+), 9 deletions(-) diff --git a/app/styles/play/campaign-view.sass b/app/styles/play/campaign-view.sass index ad1158ea5..915da4bd8 100644 --- a/app/styles/play/campaign-view.sass +++ b/app/styles/play/campaign-view.sass @@ -66,7 +66,7 @@ $gameControlMargin: 30px .level, .level-shadow position: absolute - border-radius: 100% + border-radius: 50% -webkit-transform: scaleY(0.75) transform: scaleY(0.75) @@ -130,16 +130,24 @@ $gameControlMargin: 30px &.started .glyphicon-star left: 0.5px - + img.hero-portrait width: 120% - position: absolute + height: auto bottom: 75% left: 75% - border: 1px solid black - border-radius: 100% - background: white + margin-left: 0 + margin-bottom: 0 + img.hero-portrait + position: absolute + border: 1px solid black + border-radius: 50% + background: white + width: $levelDotWidth * 1.5 + height: $levelDotHeight * 1.5 + margin-left: -0.5 * $levelDotWidth * 1.5 + margin-bottom: -$levelDotHeight / 3 * 1.5 .level-shadow z-index: 1 @@ -425,6 +433,9 @@ $gameControlMargin: 30px vertical-align: bottom margin: -20px 0 -6px 5px + .particle-man + z-index: 2 + body:not(.ipad) #campaign-view .level-info-container diff --git a/app/templates/play/campaign-view.jade b/app/templates/play/campaign-view.jade index 36568e89c..931595e09 100644 --- a/app/templates/play/campaign-view.jade +++ b/app/templates/play/campaign-view.jade @@ -8,8 +8,8 @@ each level in levels if !level.hidden div(style="left: #{level.position.x}%; bottom: #{level.position.y}%; background-color: #{level.color}", class="level" + (level.next ? " next" : "") + (level.disabled ? " disabled" : "") + (level.locked ? " locked" : "") + " " + levelStatusMap[level.slug] || "", data-level-slug=level.slug, data-level-original=level.original, title=i18n(level, 'name') + (level.disabled ? ' (Coming Soon to Adventurers)' : '')) - if level.unlocksHero && !level.unlockedHero - img.hero-portrait(src=level.unlocksHero.img) + if level.unlocksHero && !level.purchasedHero + img.hero-portrait(src="/file/db/thang.type/#{level.unlocksHero}/portrait.png") a(href=level.type == 'hero' ? '#' : level.disabled ? "/play" : "/play/#{level.levelPath || 'level'}/#{level.slug}", disabled=level.disabled, data-level-slug=level.slug, data-level-path=level.levelPath || 'level', data-level-name=level.name) if level.requiresSubscription img.star(src="/images/pages/play/star.png") @@ -40,6 +40,8 @@ if isIPadApp && !level.disabled && !level.locked button.btn.btn-success.btn-lg.start-level(data-i18n="common.play") Play + else if level.unlocksHero && !level.purchasedHero + img.hero-portrait(src="/file/db/thang.type/#{level.unlocksHero}/portrait.png", style="left: #{level.position.x}%; bottom: #{level.position.y}%;") for adjacentCampaign in adjacentCampaigns a(href=(editorMode ? "/editor/campaign/" : "/play/") + adjacentCampaign.slug) diff --git a/app/views/play/CampaignView.coffee b/app/views/play/CampaignView.coffee index 7a7e1d6f1..5866e59b7 100644 --- a/app/views/play/CampaignView.coffee +++ b/app/views/play/CampaignView.coffee @@ -146,8 +146,10 @@ module.exports = class CampaignView extends RootView level.color = 'rgb(255, 80, 60)' if level.requiresSubscription level.color = 'rgb(80, 130, 200)' + if unlocksHero = _.find(level.rewards, 'hero')?.hero + level.unlocksHero = unlocksHero if level.unlocksHero - level.unlockedHero = level.unlocksHero.originalID in (me.get('earned')?.heroes or []) + level.purchasedHero = level.unlocksHero in (me.get('purchased')?.heroes or []) level.hidden = level.locked unless level.disabled ++context.levelsTotal From 39ad9b8e35482bbc962aadcee6850cfbb50dfdaf Mon Sep 17 00:00:00 2001 From: Nick Winter Date: Thu, 29 Jan 2015 19:29:37 -0800 Subject: [PATCH 5/5] Show hero unlocks in campaign editor, too. --- app/templates/play/campaign-view.jade | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/templates/play/campaign-view.jade b/app/templates/play/campaign-view.jade index 931595e09..dc522cc25 100644 --- a/app/templates/play/campaign-view.jade +++ b/app/templates/play/campaign-view.jade @@ -8,7 +8,7 @@ each level in levels if !level.hidden div(style="left: #{level.position.x}%; bottom: #{level.position.y}%; background-color: #{level.color}", class="level" + (level.next ? " next" : "") + (level.disabled ? " disabled" : "") + (level.locked ? " locked" : "") + " " + levelStatusMap[level.slug] || "", data-level-slug=level.slug, data-level-original=level.original, title=i18n(level, 'name') + (level.disabled ? ' (Coming Soon to Adventurers)' : '')) - if level.unlocksHero && !level.purchasedHero + if level.unlocksHero && (!level.purchasedHero || editorMode) img.hero-portrait(src="/file/db/thang.type/#{level.unlocksHero}/portrait.png") a(href=level.type == 'hero' ? '#' : level.disabled ? "/play" : "/play/#{level.levelPath || 'level'}/#{level.slug}", disabled=level.disabled, data-level-slug=level.slug, data-level-path=level.levelPath || 'level', data-level-name=level.name) if level.requiresSubscription