diff --git a/src/game-lib-d3-api-particle.js b/src/game-lib-d3-api-particle.js index a604809..7b8807d 100644 --- a/src/game-lib-d3-api-particle.js +++ b/src/game-lib-d3-api-particle.js @@ -6,7 +6,8 @@ * @param elapsed * @param mesh * @param opacityType - * @param opacityFactor + * @param fadeInFactor + * @param fadeOutFactor * @param positionOffsetType * @param positionOffset * @param positionOffsetFn @@ -32,7 +33,8 @@ GameLib.D3.API.Particle = function( elapsed, mesh, opacityType, - opacityFactor, + fadeInFactor, + fadeOutFactor, positionOffsetType, positionOffset, positionOffsetFn, @@ -77,17 +79,22 @@ GameLib.D3.API.Particle = function( this.mesh = mesh; if (GameLib.Utils.UndefinedOrNull(opacityType)) { - opacityType = GameLib.D3.Particle.OPACITY_TYPE_CONSTANT; + opacityType = GameLib.D3.API.Particle.OPACITY_TYPE_CONSTANT; } this.opacityType = opacityType; - if (GameLib.Utils.UndefinedOrNull(opacityFactor)) { - opacityFactor = 0.01; + if (GameLib.Utils.UndefinedOrNull(fadeInFactor)) { + fadeInFactor = 0.01; } - this.opacityFactor = opacityFactor; + this.fadeInFactor = fadeInFactor; + + if (GameLib.Utils.UndefinedOrNull(fadeOutFactor)) { + fadeOutFactor = 0.01; + } + this.fadeOutFactor = fadeOutFactor; if (GameLib.Utils.UndefinedOrNull(positionOffsetType)) { - positionOffsetType = GameLib.D3.Particle.POSITION_OFFSET_TYPE_CONSTANT; + positionOffsetType = GameLib.D3.API.Particle.POSITION_OFFSET_TYPE_CONSTANT; } this.positionOffsetType = positionOffsetType; @@ -102,7 +109,7 @@ GameLib.D3.API.Particle = function( this.positionOffsetFn = positionOffsetFn; if (GameLib.Utils.UndefinedOrNull(directionType)) { - directionType = GameLib.D3.Particle.DIRECTION_TYPE_CONSTANT; + directionType = GameLib.D3.API.Particle.DIRECTION_TYPE_CONSTANT; } this.directionType = directionType; @@ -117,7 +124,7 @@ GameLib.D3.API.Particle = function( this.directionFn = directionFn; if (GameLib.Utils.UndefinedOrNull(speedType)) { - speedType = GameLib.D3.Particle.SPEED_TYPE_CONSTANT; + speedType = GameLib.D3.API.Particle.SPEED_TYPE_CONSTANT; } this.speedType = speedType; @@ -127,7 +134,7 @@ GameLib.D3.API.Particle = function( this.speed = speed; if (GameLib.Utils.UndefinedOrNull(scaleType)) { - scaleType = GameLib.D3.Particle.SCALE_TYPE_CONSTANT; + scaleType = GameLib.D3.API.Particle.SCALE_TYPE_CONSTANT; } this.scaleType = scaleType; @@ -142,7 +149,7 @@ GameLib.D3.API.Particle = function( this.scaleFn = scaleFn; if (GameLib.Utils.UndefinedOrNull(rotationType)) { - rotationType = GameLib.D3.Particle.ROTATION_TYPE_CONSTANT; + rotationType = GameLib.D3.API.Particle.ROTATION_TYPE_CONSTANT; } this.rotationType = rotationType; @@ -171,6 +178,39 @@ GameLib.D3.API.Particle = function( GameLib.D3.API.Particle.prototype = Object.create(GameLib.API.Component.prototype); GameLib.D3.API.Particle.prototype.constructor = GameLib.D3.API.Particle; +GameLib.D3.API.Particle.OPACITY_TYPE_CONSTANT = 0x1; +GameLib.D3.API.Particle.OPACITY_TYPE_FADE_OUT_LINEAR = 0x2; +GameLib.D3.API.Particle.OPACITY_TYPE_FADE_IN_LINEAR = 0x3; +GameLib.D3.API.Particle.OPACITY_TYPE_FADE_IN_OUT_LINEAR = 0x4; + +GameLib.D3.API.Particle.POSITION_OFFSET_TYPE_CONSTANT = 0x1; +GameLib.D3.API.Particle.POSITION_OFFSET_TYPE_RANDOM = 0x2; +GameLib.D3.API.Particle.POSITION_OFFSET_TYPE_FUNCTION = 0x3; + +GameLib.D3.API.Particle.DIRECTION_TYPE_CONSTANT = 0x1; +GameLib.D3.API.Particle.DIRECTION_TYPE_RANDOM = 0x2; +GameLib.D3.API.Particle.DIRECTION_TYPE_RANDOM_NORMALIZED = 0x3; +GameLib.D3.API.Particle.DIRECTION_TYPE_FUNCTION = 0x4; + +GameLib.D3.API.Particle.SCALE_TYPE_CONSTANT = 0x1; +GameLib.D3.API.Particle.SCALE_TYPE_LINEAR = 0x2; +GameLib.D3.API.Particle.SCALE_TYPE_EXPONENTIAL = 0x3; +GameLib.D3.API.Particle.SCALE_TYPE_RANDOM = 0x4; +GameLib.D3.API.Particle.SCALE_TYPE_RANDOM_X_EQUALS_Y = 0x6; +GameLib.D3.API.Particle.SCALE_TYPE_FUNCTION = 0x7; + +GameLib.D3.API.Particle.SPEED_TYPE_CONSTANT = 0x1; +GameLib.D3.API.Particle.SPEED_TYPE_LINEAR = 0x2; +GameLib.D3.API.Particle.SPEED_TYPE_EXPONENTIAL = 0x3; +GameLib.D3.API.Particle.SPEED_TYPE_LOGARITHMIC = 0x4; +GameLib.D3.API.Particle.SPEED_TYPE_ONE_OVER_LOG = 0x5; +GameLib.D3.API.Particle.SPEED_TYPE_EXP = 0x6; +GameLib.D3.API.Particle.SPEED_TYPE_ONE_OVER_EXP = 0x7; + +GameLib.D3.API.Particle.ROTATION_TYPE_CONSTANT = 0x1; +GameLib.D3.API.Particle.ROTATION_TYPE_RANDOM = 0x2; +GameLib.D3.API.Particle.ROTATION_TYPE_FUNCTION = 0x3; + /** * Creates an API Particle from an Object Particle * @param objectParticle @@ -194,7 +234,8 @@ GameLib.D3.API.Particle.FromObject = function(objectParticle) { objectParticle.elapsed, apiMesh, objectParticle.opacityType, - objectParticle.opacityFactor, + objectParticle.fadeInFactor, + objectParticle.fadeOutFactor, objectParticle.positionOffsetType, GameLib.API.Vector3.FromObject(objectParticle.positionOffset), objectParticle.positionOffsetFn, diff --git a/src/game-lib-d3-particle.js b/src/game-lib-d3-particle.js index 5e83462..d3368b0 100644 --- a/src/game-lib-d3-particle.js +++ b/src/game-lib-d3-particle.js @@ -24,7 +24,8 @@ GameLib.D3.Particle = function( apiParticle.elapsed, apiParticle.mesh, apiParticle.opacityType, - apiParticle.opacityFactor, + apiParticle.fadeInFactor, + apiParticle.fadeOutFactor, apiParticle.positionOffsetType, apiParticle.positionOffset, apiParticle.positionOffsetFn, @@ -87,38 +88,6 @@ GameLib.D3.Particle = function( GameLib.D3.Particle.prototype = Object.create(GameLib.Component.prototype); GameLib.D3.Particle.prototype.constructor = GameLib.D3.Particle; -GameLib.D3.Particle.OPACITY_TYPE_CONSTANT = 0x1; -GameLib.D3.Particle.OPACITY_TYPE_DECREASE_LINEAR = 0x2; -GameLib.D3.Particle.OPACITY_TYPE_INCREASE_LINEAR = 0x3; - -GameLib.D3.Particle.POSITION_OFFSET_TYPE_CONSTANT = 0x1; -GameLib.D3.Particle.POSITION_OFFSET_TYPE_RANDOM = 0x2; -GameLib.D3.Particle.POSITION_OFFSET_TYPE_FUNCTION = 0x3; - -GameLib.D3.Particle.DIRECTION_TYPE_CONSTANT = 0x1; -GameLib.D3.Particle.DIRECTION_TYPE_RANDOM = 0x2; -GameLib.D3.Particle.DIRECTION_TYPE_RANDOM_NORMALIZED = 0x3; -GameLib.D3.Particle.DIRECTION_TYPE_FUNCTION = 0x4; - -GameLib.D3.Particle.SCALE_TYPE_CONSTANT = 0x1; -GameLib.D3.Particle.SCALE_TYPE_LINEAR = 0x2; -GameLib.D3.Particle.SCALE_TYPE_EXPONENTIAL = 0x3; -GameLib.D3.Particle.SCALE_TYPE_RANDOM = 0x4; -GameLib.D3.Particle.SCALE_TYPE_RANDOM_X_EQUALS_Y = 0x6; -GameLib.D3.Particle.SCALE_TYPE_FUNCTION = 0x7; - -GameLib.D3.Particle.SPEED_TYPE_CONSTANT = 0x1; -GameLib.D3.Particle.SPEED_TYPE_LINEAR = 0x2; -GameLib.D3.Particle.SPEED_TYPE_EXPONENTIAL = 0x3; -GameLib.D3.Particle.SPEED_TYPE_LOGARITHMIC = 0x4; -GameLib.D3.Particle.SPEED_TYPE_ONE_OVER_LOG = 0x5; -GameLib.D3.Particle.SPEED_TYPE_EXP = 0x6; -GameLib.D3.Particle.SPEED_TYPE_ONE_OVER_EXP = 0x7; - -GameLib.D3.Particle.ROTATION_TYPE_CONSTANT = 0x1; -GameLib.D3.Particle.ROTATION_TYPE_RANDOM = 0x2; -GameLib.D3.Particle.ROTATION_TYPE_FUNCTION = 0x3; - /** * Particle create instance */ @@ -163,6 +132,12 @@ GameLib.D3.Particle.prototype.updateInstance = function(property) { this.rotation.instance.z = this.rotation.z; } + if (property === 'mesh') { + if (this.mesh) { + this.createInstance(); + } + } + }; @@ -184,7 +159,7 @@ GameLib.D3.Particle.prototype.cloneInstance = function() { clone.visible = true; - if (this.positionOffsetType === GameLib.D3.Particle.POSITION_OFFSET_TYPE_CONSTANT) { + if (this.positionOffsetType === GameLib.D3.API.Particle.POSITION_OFFSET_TYPE_CONSTANT) { clone.position.add(this.positionOffset.instance); } @@ -192,7 +167,7 @@ GameLib.D3.Particle.prototype.cloneInstance = function() { var addY = 1; var addZ = 1; - if (this.positionOffsetType === GameLib.D3.Particle.POSITION_OFFSET_TYPE_RANDOM) { + if (this.positionOffsetType === GameLib.D3.API.Particle.POSITION_OFFSET_TYPE_RANDOM) { addX = GameLib.Utils.GetRandomIntInclusive(1,2); addY = GameLib.Utils.GetRandomIntInclusive(1,2); @@ -219,15 +194,15 @@ GameLib.D3.Particle.prototype.cloneInstance = function() { clone.userData.direction = this.direction.clone(); - if (this.directionType === GameLib.D3.Particle.DIRECTION_TYPE_CONSTANT) { + if (this.directionType === GameLib.D3.API.Particle.DIRECTION_TYPE_CONSTANT) { /** * Nothing to do */ } else if ( - this.directionType === GameLib.D3.Particle.DIRECTION_TYPE_RANDOM || - this.directionType === GameLib.D3.Particle.DIRECTION_TYPE_RANDOM_NORMALIZED + this.directionType === GameLib.D3.API.Particle.DIRECTION_TYPE_RANDOM || + this.directionType === GameLib.D3.API.Particle.DIRECTION_TYPE_RANDOM_NORMALIZED ) { addX = GameLib.Utils.GetRandomIntInclusive(1,2); @@ -256,7 +231,7 @@ GameLib.D3.Particle.prototype.cloneInstance = function() { clone.userData.direction.z += Math.random() * this.direction.z; } - if (this.directionType === GameLib.D3.Particle.DIRECTION_TYPE_RANDOM_NORMALIZED) { + if (this.directionType === GameLib.D3.API.Particle.DIRECTION_TYPE_RANDOM_NORMALIZED) { clone.userData.direction.normalize(); } @@ -265,13 +240,13 @@ GameLib.D3.Particle.prototype.cloneInstance = function() { } - if (this.scaleType === GameLib.D3.Particle.SCALE_TYPE_CONSTANT) { + if (this.scaleType === GameLib.D3.API.Particle.SCALE_TYPE_CONSTANT) { clone.scale.x += this.scale.x; clone.scale.y += this.scale.y; clone.scale.z += this.scale.z; } - if (this.scaleType === GameLib.D3.Particle.SCALE_TYPE_RANDOM) { + if (this.scaleType === GameLib.D3.API.Particle.SCALE_TYPE_RANDOM) { add = GameLib.Utils.GetRandomIntInclusive(1,2); @@ -286,7 +261,7 @@ GameLib.D3.Particle.prototype.cloneInstance = function() { } } - if (this.scaleType === GameLib.D3.Particle.SCALE_TYPE_RANDOM_X_EQUALS_Y) { + if (this.scaleType === GameLib.D3.API.Particle.SCALE_TYPE_RANDOM_X_EQUALS_Y) { add = GameLib.Utils.GetRandomIntInclusive(1,2); @@ -303,7 +278,21 @@ GameLib.D3.Particle.prototype.cloneInstance = function() { } } + var fadeIn = true; + if ( + this.opacityType === GameLib.D3.API.Particle.OPACITY_TYPE_FADE_IN_LINEAR || + this.opacityType === GameLib.D3.API.Particle.OPACITY_TYPE_FADE_IN_OUT_LINEAR + ) { + clone.material.opacity = 0; + fadeIn = true; + } + + if (this.opacityType === GameLib.D3.API.Particle.OPACITY_TYPE_FADE_OUT_LINEAR) { + clone.material.opacity = 1; + fadeIn = false; + } + clone.userData.fadeIn = fadeIn; clone.userData.scale = this.scale.clone(); clone.userData.lifeTime = this.lifeTime; clone.userData.speedType = this.speedType; @@ -330,7 +319,8 @@ GameLib.D3.Particle.prototype.toApiObject = function() { this.elapsed, GameLib.Utils.IdOrNull(this.mesh), this.opacityType, - this.opacityFactor, + this.fadeInFactor, + this.fadeOutFactor, this.positionOffsetType, this.positionOffset.toApiObject(), this.positionOffsetFn, diff --git a/src/game-lib-system-gui.js b/src/game-lib-system-gui.js index 6566913..f027664 100644 --- a/src/game-lib-system-gui.js +++ b/src/game-lib-system-gui.js @@ -929,9 +929,10 @@ GameLib.System.GUI.prototype.buildControl = function(folder, componentTemplate, object, property, { - 'constant': GameLib.D3.Particle.OPACITY_TYPE_CONSTANT, - 'decrease': GameLib.D3.Particle.OPACITY_TYPE_DECREASE_LINEAR, - 'increase': GameLib.D3.Particle.OPACITY_TYPE_INCREASE_LINEAR + 'constant': GameLib.D3.API.Particle.OPACITY_TYPE_CONSTANT, + 'fade out': GameLib.D3.API.Particle.OPACITY_TYPE_FADE_OUT_LINEAR, + 'fade in': GameLib.D3.API.Particle.OPACITY_TYPE_FADE_IN_LINEAR, + 'fade in / out': GameLib.D3.API.Particle.OPACITY_TYPE_FADE_IN_OUT_LINEAR } ) ); @@ -941,9 +942,9 @@ GameLib.System.GUI.prototype.buildControl = function(folder, componentTemplate, object, property, { - 'constant': GameLib.D3.Particle.POSITION_OFFSET_TYPE_CONSTANT, - 'random': GameLib.D3.Particle.POSITION_OFFSET_TYPE_RANDOM, - 'function': GameLib.D3.Particle.POSITION_OFFSET_TYPE_FUNCTION + 'constant': GameLib.D3.API.Particle.POSITION_OFFSET_TYPE_CONSTANT, + 'random': GameLib.D3.API.Particle.POSITION_OFFSET_TYPE_RANDOM, + 'function': GameLib.D3.API.Particle.POSITION_OFFSET_TYPE_FUNCTION } ) ); @@ -953,10 +954,10 @@ GameLib.System.GUI.prototype.buildControl = function(folder, componentTemplate, object, property, { - 'constant': GameLib.D3.Particle.DIRECTION_TYPE_CONSTANT, - 'random': GameLib.D3.Particle.DIRECTION_TYPE_RANDOM, - 'random normalized': GameLib.D3.Particle.DIRECTION_TYPE_RANDOM_NORMALIZED, - 'function': GameLib.D3.Particle.DIRECTION_TYPE_FUNCTION + 'constant': GameLib.D3.API.Particle.DIRECTION_TYPE_CONSTANT, + 'random': GameLib.D3.API.Particle.DIRECTION_TYPE_RANDOM, + 'random normalized': GameLib.D3.API.Particle.DIRECTION_TYPE_RANDOM_NORMALIZED, + 'function': GameLib.D3.API.Particle.DIRECTION_TYPE_FUNCTION } ) ); @@ -966,13 +967,13 @@ GameLib.System.GUI.prototype.buildControl = function(folder, componentTemplate, object, property, { - 'constant': GameLib.D3.Particle.SPEED_TYPE_CONSTANT, - 'linear': GameLib.D3.Particle.SPEED_TYPE_LINEAR, - 'exponential': GameLib.D3.Particle.SPEED_TYPE_EXPONENTIAL, - 'logarithmic': GameLib.D3.Particle.SPEED_TYPE_LOGARITHMIC, - '1 / log': GameLib.D3.Particle.SPEED_TYPE_ONE_OVER_LOG, - 'exp' : GameLib.D3.Particle.SPEED_TYPE_EXP, - '1 / exp' : GameLib.D3.Particle.SPEED_TYPE_ONE_OVER_EXP + 'constant': GameLib.D3.API.Particle.SPEED_TYPE_CONSTANT, + 'linear': GameLib.D3.API.Particle.SPEED_TYPE_LINEAR, + 'exponential': GameLib.D3.API.Particle.SPEED_TYPE_EXPONENTIAL, + 'logarithmic': GameLib.D3.API.Particle.SPEED_TYPE_LOGARITHMIC, + '1 / log': GameLib.D3.API.Particle.SPEED_TYPE_ONE_OVER_LOG, + 'exp' : GameLib.D3.API.Particle.SPEED_TYPE_EXP, + '1 / exp' : GameLib.D3.API.Particle.SPEED_TYPE_ONE_OVER_EXP } ) ); @@ -982,12 +983,12 @@ GameLib.System.GUI.prototype.buildControl = function(folder, componentTemplate, object, property, { - 'constant': GameLib.D3.Particle.SCALE_TYPE_CONSTANT, - 'linear': GameLib.D3.Particle.SCALE_TYPE_LINEAR, - 'exponential': GameLib.D3.Particle.SCALE_TYPE_EXPONENTIAL, - 'random': GameLib.D3.Particle.SCALE_TYPE_RANDOM, - 'random (x = y)': GameLib.D3.Particle.SCALE_TYPE_RANDOM_X_EQUALS_Y, - 'function': GameLib.D3.Particle.SCALE_TYPE_FUNCTION + 'constant': GameLib.D3.API.Particle.SCALE_TYPE_CONSTANT, + 'linear': GameLib.D3.API.Particle.SCALE_TYPE_LINEAR, + 'exponential': GameLib.D3.API.Particle.SCALE_TYPE_EXPONENTIAL, + 'random': GameLib.D3.API.Particle.SCALE_TYPE_RANDOM, + 'random (x = y)': GameLib.D3.API.Particle.SCALE_TYPE_RANDOM_X_EQUALS_Y, + 'function': GameLib.D3.API.Particle.SCALE_TYPE_FUNCTION } ) ); @@ -997,9 +998,9 @@ GameLib.System.GUI.prototype.buildControl = function(folder, componentTemplate, object, property, { - 'constant': GameLib.D3.Particle.ROTATION_TYPE_CONSTANT, - 'random': GameLib.D3.Particle.ROTATION_TYPE_RANDOM, - 'function': GameLib.D3.Particle.ROTATION_TYPE_FUNCTION + 'constant': GameLib.D3.API.Particle.ROTATION_TYPE_CONSTANT, + 'random': GameLib.D3.API.Particle.ROTATION_TYPE_RANDOM, + 'function': GameLib.D3.API.Particle.ROTATION_TYPE_FUNCTION } ) ); @@ -1374,7 +1375,8 @@ GameLib.System.GUI.prototype.buildControl = function(folder, componentTemplate, */ if ( property === 'opacity' || - property === 'opacityFactor' || + property === 'fadeInFactor' || + property === 'fadeOutFactor' || property === 'metalness' || property === 'roughness' || property === 'volume' diff --git a/src/game-lib-system-linking.js b/src/game-lib-system-linking.js index d3ec7ec..0d875df 100644 --- a/src/game-lib-system-linking.js +++ b/src/game-lib-system-linking.js @@ -668,18 +668,6 @@ GameLib.System.Linking.prototype.instanceCreated = function(data) { ); } - if ( - data.component.parentParticleEngine && - typeof data.component.parentParticleEngine === 'string' - ) { - GameLib.EntityManager.Instance.queryComponents(GameLib.Component.PARTICLE_ENGINE).map( - function (particleEngine) { - if (data.component.parentParticleEngine === particleEngine.id) { - data.component.parentParticleEngine = particleEngine; - } - } - ); - } /** * Link all meshes diff --git a/src/game-lib-system-particle.js b/src/game-lib-system-particle.js index ebfd87e..bfed8a0 100644 --- a/src/game-lib-system-particle.js +++ b/src/game-lib-system-particle.js @@ -61,8 +61,36 @@ GameLib.System.Particle.prototype.start = function() { * @param data */ GameLib.System.Particle.prototype.instanceCreated = function(data) { + + /** + * If we loaded a ParticleEngine - store a reference to it for later, also link all particles with this as parent + */ if (data.component instanceof GameLib.D3.ParticleEngine) { this.particleEngines.push(data.component); + + /** + * Link parent particle engines of already loaded particles + */ + GameLib.EntityManager.Instance.queryComponents(GameLib.Component.PARTICLE).map( + function(particle){ + if (particle.parentParticleEngine === data.component.id) { + particle.parentParticleEngine = data.component; + } + } + ) + } + + /** + * If we load a Particle, check to see if its engine loaded and link it. + */ + if (data.component instanceof GameLib.D3.Particle) { + GameLib.EntityManager.Instance.queryComponents(GameLib.Component.PARTICLE_ENGINE).map( + function (particleEngine) { + if (data.component.parentParticleEngine === particleEngine.id) { + data.component.parentParticleEngine = particleEngine; + } + } + ); } }; @@ -100,7 +128,6 @@ GameLib.System.Particle.prototype.beforeRender = function(data) { function(particleEngine) { if ( - GameLib.Utils.UndefinedOrNull(particleEngine.camera) || GameLib.Utils.UndefinedOrNull(particleEngine.templateParticle) || GameLib.Utils.UndefinedOrNull(particleEngine.templateParticle.mesh) || GameLib.Utils.UndefinedOrNull(particleEngine.templateParticle.mesh.parentScene) || @@ -116,36 +143,36 @@ GameLib.System.Particle.prototype.beforeRender = function(data) { var speed = particle.userData.speed; - if (particle.userData.speedType === GameLib.D3.Particle.SPEED_TYPE_CONSTANT) { + if (particle.userData.speedType === GameLib.D3.API.Particle.SPEED_TYPE_CONSTANT) { speed = data.delta * particle.userData.speed; } - if (particle.userData.speedType === GameLib.D3.Particle.SPEED_TYPE_LINEAR) { + if (particle.userData.speedType === GameLib.D3.API.Particle.SPEED_TYPE_LINEAR) { speed = data.delta * particle.userData.speed; particle.userData.speed += speed; } - if (particle.userData.speedType === GameLib.D3.Particle.SPEED_TYPE_EXPONENTIAL) { + if (particle.userData.speedType === GameLib.D3.API.Particle.SPEED_TYPE_EXPONENTIAL) { speed = Math.pow(particle.userData.speed, 2) * data.delta; particle.userData.speed += speed; } - if (particle.userData.speedType === GameLib.D3.Particle.SPEED_TYPE_LOGARITHMIC) { + if (particle.userData.speedType === GameLib.D3.API.Particle.SPEED_TYPE_LOGARITHMIC) { speed = Math.log(particle.userData.speed) * data.delta; particle.userData.speed += speed; } - if (particle.userData.speedType === GameLib.D3.Particle.SPEED_TYPE_ONE_OVER_LOG) { + if (particle.userData.speedType === GameLib.D3.API.Particle.SPEED_TYPE_ONE_OVER_LOG) { speed = 1 / Math.log(particle.userData.speed) * data.delta; particle.userData.speed += speed; } - if (particle.userData.speedType === GameLib.D3.Particle.SPEED_TYPE_EXP) { + if (particle.userData.speedType === GameLib.D3.API.Particle.SPEED_TYPE_EXP) { speed = Math.exp(particle.userData.speed) * data.delta; particle.userData.speed += speed; } - if (particle.userData.speedType === GameLib.D3.Particle.SPEED_TYPE_ONE_OVER_EXP) { + if (particle.userData.speedType === GameLib.D3.API.Particle.SPEED_TYPE_ONE_OVER_EXP) { speed = 1 / Math.exp(particle.userData.speed) * data.delta; particle.userData.speed += speed; } @@ -154,7 +181,7 @@ GameLib.System.Particle.prototype.beforeRender = function(data) { particle.position.y += particle.userData.direction.y * speed; particle.position.z += particle.userData.direction.z * speed; - if (particleEngine.templateParticle.scaleType === GameLib.D3.Particle.SCALE_TYPE_CONSTANT) { + if (particleEngine.templateParticle.scaleType === GameLib.D3.API.Particle.SCALE_TYPE_CONSTANT) { /** * Do nothing - scale should already be set */ @@ -164,20 +191,35 @@ GameLib.System.Particle.prototype.beforeRender = function(data) { */ } - if (particleEngine.templateParticle.scaleType === GameLib.D3.Particle.SCALE_TYPE_LINEAR) { + if (particleEngine.templateParticle.scaleType === GameLib.D3.API.Particle.SCALE_TYPE_LINEAR) { particle.scale.x += particle.userData.scale.x * data.delta; particle.scale.y += particle.userData.scale.x * data.delta; particle.scale.z += particle.userData.scale.x * data.delta; } - particle.quaternion.copy(particleEngine.camera.instance.quaternion); - - if (particleEngine.templateParticle.opacityType === GameLib.D3.Particle.OPACITY_TYPE_INCREASE_LINEAR) { - particle.material.opacity += particleEngine.templateParticle.opacityFactor; + if (particleEngine.camera && particleEngine.camera.instance) { + particle.quaternion.copy(particleEngine.camera.instance.quaternion); } - if (particleEngine.templateParticle.opacityType === GameLib.D3.Particle.OPACITY_TYPE_DECREASE_LINEAR) { - particle.material.opacity -= particleEngine.templateParticle.opacityFactor; + if (particleEngine.templateParticle.opacityType === GameLib.D3.API.Particle.OPACITY_TYPE_FADE_IN_LINEAR) { + particle.material.opacity += particleEngine.templateParticle.fadeInFactor; + } + + if (particleEngine.templateParticle.opacityType === GameLib.D3.API.Particle.OPACITY_TYPE_FADE_OUT_LINEAR) { + particle.material.opacity -= particleEngine.templateParticle.fadeOutFactor; + } + + if (particleEngine.templateParticle.opacityType === GameLib.D3.API.Particle.OPACITY_TYPE_FADE_IN_OUT_LINEAR) { + + if (particle.userData.fadeIn) { + particle.material.opacity += particleEngine.templateParticle.fadeInFactor; + } else { + particle.material.opacity -= particleEngine.templateParticle.fadeOutFactor; + } + + if (particle.material.opacity >= 1) { + particle.userData.fadeIn = false; + } } particle.userData.elapsed += data.delta;