particles can fade in / out now - linking parentParticleEngines properly

beta.r3js.org
-=yb4f310 2018-01-15 08:56:21 +01:00
parent de0cad37ab
commit a09db70d07
5 changed files with 173 additions and 110 deletions

View File

@ -6,7 +6,8 @@
* @param elapsed * @param elapsed
* @param mesh * @param mesh
* @param opacityType * @param opacityType
* @param opacityFactor * @param fadeInFactor
* @param fadeOutFactor
* @param positionOffsetType * @param positionOffsetType
* @param positionOffset * @param positionOffset
* @param positionOffsetFn * @param positionOffsetFn
@ -32,7 +33,8 @@ GameLib.D3.API.Particle = function(
elapsed, elapsed,
mesh, mesh,
opacityType, opacityType,
opacityFactor, fadeInFactor,
fadeOutFactor,
positionOffsetType, positionOffsetType,
positionOffset, positionOffset,
positionOffsetFn, positionOffsetFn,
@ -77,17 +79,22 @@ GameLib.D3.API.Particle = function(
this.mesh = mesh; this.mesh = mesh;
if (GameLib.Utils.UndefinedOrNull(opacityType)) { if (GameLib.Utils.UndefinedOrNull(opacityType)) {
opacityType = GameLib.D3.Particle.OPACITY_TYPE_CONSTANT; opacityType = GameLib.D3.API.Particle.OPACITY_TYPE_CONSTANT;
} }
this.opacityType = opacityType; this.opacityType = opacityType;
if (GameLib.Utils.UndefinedOrNull(opacityFactor)) { if (GameLib.Utils.UndefinedOrNull(fadeInFactor)) {
opacityFactor = 0.01; 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)) { 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; this.positionOffsetType = positionOffsetType;
@ -102,7 +109,7 @@ GameLib.D3.API.Particle = function(
this.positionOffsetFn = positionOffsetFn; this.positionOffsetFn = positionOffsetFn;
if (GameLib.Utils.UndefinedOrNull(directionType)) { if (GameLib.Utils.UndefinedOrNull(directionType)) {
directionType = GameLib.D3.Particle.DIRECTION_TYPE_CONSTANT; directionType = GameLib.D3.API.Particle.DIRECTION_TYPE_CONSTANT;
} }
this.directionType = directionType; this.directionType = directionType;
@ -117,7 +124,7 @@ GameLib.D3.API.Particle = function(
this.directionFn = directionFn; this.directionFn = directionFn;
if (GameLib.Utils.UndefinedOrNull(speedType)) { if (GameLib.Utils.UndefinedOrNull(speedType)) {
speedType = GameLib.D3.Particle.SPEED_TYPE_CONSTANT; speedType = GameLib.D3.API.Particle.SPEED_TYPE_CONSTANT;
} }
this.speedType = speedType; this.speedType = speedType;
@ -127,7 +134,7 @@ GameLib.D3.API.Particle = function(
this.speed = speed; this.speed = speed;
if (GameLib.Utils.UndefinedOrNull(scaleType)) { if (GameLib.Utils.UndefinedOrNull(scaleType)) {
scaleType = GameLib.D3.Particle.SCALE_TYPE_CONSTANT; scaleType = GameLib.D3.API.Particle.SCALE_TYPE_CONSTANT;
} }
this.scaleType = scaleType; this.scaleType = scaleType;
@ -142,7 +149,7 @@ GameLib.D3.API.Particle = function(
this.scaleFn = scaleFn; this.scaleFn = scaleFn;
if (GameLib.Utils.UndefinedOrNull(rotationType)) { if (GameLib.Utils.UndefinedOrNull(rotationType)) {
rotationType = GameLib.D3.Particle.ROTATION_TYPE_CONSTANT; rotationType = GameLib.D3.API.Particle.ROTATION_TYPE_CONSTANT;
} }
this.rotationType = rotationType; 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 = Object.create(GameLib.API.Component.prototype);
GameLib.D3.API.Particle.prototype.constructor = GameLib.D3.API.Particle; 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 * Creates an API Particle from an Object Particle
* @param objectParticle * @param objectParticle
@ -194,7 +234,8 @@ GameLib.D3.API.Particle.FromObject = function(objectParticle) {
objectParticle.elapsed, objectParticle.elapsed,
apiMesh, apiMesh,
objectParticle.opacityType, objectParticle.opacityType,
objectParticle.opacityFactor, objectParticle.fadeInFactor,
objectParticle.fadeOutFactor,
objectParticle.positionOffsetType, objectParticle.positionOffsetType,
GameLib.API.Vector3.FromObject(objectParticle.positionOffset), GameLib.API.Vector3.FromObject(objectParticle.positionOffset),
objectParticle.positionOffsetFn, objectParticle.positionOffsetFn,

View File

@ -24,7 +24,8 @@ GameLib.D3.Particle = function(
apiParticle.elapsed, apiParticle.elapsed,
apiParticle.mesh, apiParticle.mesh,
apiParticle.opacityType, apiParticle.opacityType,
apiParticle.opacityFactor, apiParticle.fadeInFactor,
apiParticle.fadeOutFactor,
apiParticle.positionOffsetType, apiParticle.positionOffsetType,
apiParticle.positionOffset, apiParticle.positionOffset,
apiParticle.positionOffsetFn, apiParticle.positionOffsetFn,
@ -87,38 +88,6 @@ GameLib.D3.Particle = function(
GameLib.D3.Particle.prototype = Object.create(GameLib.Component.prototype); GameLib.D3.Particle.prototype = Object.create(GameLib.Component.prototype);
GameLib.D3.Particle.prototype.constructor = GameLib.D3.Particle; 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 * Particle create instance
*/ */
@ -163,6 +132,12 @@ GameLib.D3.Particle.prototype.updateInstance = function(property) {
this.rotation.instance.z = this.rotation.z; 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; 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); clone.position.add(this.positionOffset.instance);
} }
@ -192,7 +167,7 @@ GameLib.D3.Particle.prototype.cloneInstance = function() {
var addY = 1; var addY = 1;
var addZ = 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); addX = GameLib.Utils.GetRandomIntInclusive(1,2);
addY = 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(); 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 * Nothing to do
*/ */
} else if ( } else if (
this.directionType === GameLib.D3.Particle.DIRECTION_TYPE_RANDOM || this.directionType === GameLib.D3.API.Particle.DIRECTION_TYPE_RANDOM ||
this.directionType === GameLib.D3.Particle.DIRECTION_TYPE_RANDOM_NORMALIZED this.directionType === GameLib.D3.API.Particle.DIRECTION_TYPE_RANDOM_NORMALIZED
) { ) {
addX = GameLib.Utils.GetRandomIntInclusive(1,2); 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; 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(); 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.x += this.scale.x;
clone.scale.y += this.scale.y; clone.scale.y += this.scale.y;
clone.scale.z += this.scale.z; 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); 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); 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.scale = this.scale.clone();
clone.userData.lifeTime = this.lifeTime; clone.userData.lifeTime = this.lifeTime;
clone.userData.speedType = this.speedType; clone.userData.speedType = this.speedType;
@ -330,7 +319,8 @@ GameLib.D3.Particle.prototype.toApiObject = function() {
this.elapsed, this.elapsed,
GameLib.Utils.IdOrNull(this.mesh), GameLib.Utils.IdOrNull(this.mesh),
this.opacityType, this.opacityType,
this.opacityFactor, this.fadeInFactor,
this.fadeOutFactor,
this.positionOffsetType, this.positionOffsetType,
this.positionOffset.toApiObject(), this.positionOffset.toApiObject(),
this.positionOffsetFn, this.positionOffsetFn,

View File

@ -929,9 +929,10 @@ GameLib.System.GUI.prototype.buildControl = function(folder, componentTemplate,
object, object,
property, property,
{ {
'constant': GameLib.D3.Particle.OPACITY_TYPE_CONSTANT, 'constant': GameLib.D3.API.Particle.OPACITY_TYPE_CONSTANT,
'decrease': GameLib.D3.Particle.OPACITY_TYPE_DECREASE_LINEAR, 'fade out': GameLib.D3.API.Particle.OPACITY_TYPE_FADE_OUT_LINEAR,
'increase': GameLib.D3.Particle.OPACITY_TYPE_INCREASE_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, object,
property, property,
{ {
'constant': GameLib.D3.Particle.POSITION_OFFSET_TYPE_CONSTANT, 'constant': GameLib.D3.API.Particle.POSITION_OFFSET_TYPE_CONSTANT,
'random': GameLib.D3.Particle.POSITION_OFFSET_TYPE_RANDOM, 'random': GameLib.D3.API.Particle.POSITION_OFFSET_TYPE_RANDOM,
'function': GameLib.D3.Particle.POSITION_OFFSET_TYPE_FUNCTION 'function': GameLib.D3.API.Particle.POSITION_OFFSET_TYPE_FUNCTION
} }
) )
); );
@ -953,10 +954,10 @@ GameLib.System.GUI.prototype.buildControl = function(folder, componentTemplate,
object, object,
property, property,
{ {
'constant': GameLib.D3.Particle.DIRECTION_TYPE_CONSTANT, 'constant': GameLib.D3.API.Particle.DIRECTION_TYPE_CONSTANT,
'random': GameLib.D3.Particle.DIRECTION_TYPE_RANDOM, 'random': GameLib.D3.API.Particle.DIRECTION_TYPE_RANDOM,
'random normalized': GameLib.D3.Particle.DIRECTION_TYPE_RANDOM_NORMALIZED, 'random normalized': GameLib.D3.API.Particle.DIRECTION_TYPE_RANDOM_NORMALIZED,
'function': GameLib.D3.Particle.DIRECTION_TYPE_FUNCTION 'function': GameLib.D3.API.Particle.DIRECTION_TYPE_FUNCTION
} }
) )
); );
@ -966,13 +967,13 @@ GameLib.System.GUI.prototype.buildControl = function(folder, componentTemplate,
object, object,
property, property,
{ {
'constant': GameLib.D3.Particle.SPEED_TYPE_CONSTANT, 'constant': GameLib.D3.API.Particle.SPEED_TYPE_CONSTANT,
'linear': GameLib.D3.Particle.SPEED_TYPE_LINEAR, 'linear': GameLib.D3.API.Particle.SPEED_TYPE_LINEAR,
'exponential': GameLib.D3.Particle.SPEED_TYPE_EXPONENTIAL, 'exponential': GameLib.D3.API.Particle.SPEED_TYPE_EXPONENTIAL,
'logarithmic': GameLib.D3.Particle.SPEED_TYPE_LOGARITHMIC, 'logarithmic': GameLib.D3.API.Particle.SPEED_TYPE_LOGARITHMIC,
'1 / log': GameLib.D3.Particle.SPEED_TYPE_ONE_OVER_LOG, '1 / log': GameLib.D3.API.Particle.SPEED_TYPE_ONE_OVER_LOG,
'exp' : GameLib.D3.Particle.SPEED_TYPE_EXP, 'exp' : GameLib.D3.API.Particle.SPEED_TYPE_EXP,
'1 / exp' : GameLib.D3.Particle.SPEED_TYPE_ONE_OVER_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, object,
property, property,
{ {
'constant': GameLib.D3.Particle.SCALE_TYPE_CONSTANT, 'constant': GameLib.D3.API.Particle.SCALE_TYPE_CONSTANT,
'linear': GameLib.D3.Particle.SCALE_TYPE_LINEAR, 'linear': GameLib.D3.API.Particle.SCALE_TYPE_LINEAR,
'exponential': GameLib.D3.Particle.SCALE_TYPE_EXPONENTIAL, 'exponential': GameLib.D3.API.Particle.SCALE_TYPE_EXPONENTIAL,
'random': GameLib.D3.Particle.SCALE_TYPE_RANDOM, 'random': GameLib.D3.API.Particle.SCALE_TYPE_RANDOM,
'random (x = y)': GameLib.D3.Particle.SCALE_TYPE_RANDOM_X_EQUALS_Y, 'random (x = y)': GameLib.D3.API.Particle.SCALE_TYPE_RANDOM_X_EQUALS_Y,
'function': GameLib.D3.Particle.SCALE_TYPE_FUNCTION 'function': GameLib.D3.API.Particle.SCALE_TYPE_FUNCTION
} }
) )
); );
@ -997,9 +998,9 @@ GameLib.System.GUI.prototype.buildControl = function(folder, componentTemplate,
object, object,
property, property,
{ {
'constant': GameLib.D3.Particle.ROTATION_TYPE_CONSTANT, 'constant': GameLib.D3.API.Particle.ROTATION_TYPE_CONSTANT,
'random': GameLib.D3.Particle.ROTATION_TYPE_RANDOM, 'random': GameLib.D3.API.Particle.ROTATION_TYPE_RANDOM,
'function': GameLib.D3.Particle.ROTATION_TYPE_FUNCTION 'function': GameLib.D3.API.Particle.ROTATION_TYPE_FUNCTION
} }
) )
); );
@ -1374,7 +1375,8 @@ GameLib.System.GUI.prototype.buildControl = function(folder, componentTemplate,
*/ */
if ( if (
property === 'opacity' || property === 'opacity' ||
property === 'opacityFactor' || property === 'fadeInFactor' ||
property === 'fadeOutFactor' ||
property === 'metalness' || property === 'metalness' ||
property === 'roughness' || property === 'roughness' ||
property === 'volume' property === 'volume'

View File

@ -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 * Link all meshes

View File

@ -61,8 +61,36 @@ GameLib.System.Particle.prototype.start = function() {
* @param data * @param data
*/ */
GameLib.System.Particle.prototype.instanceCreated = function(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) { if (data.component instanceof GameLib.D3.ParticleEngine) {
this.particleEngines.push(data.component); 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) { function(particleEngine) {
if ( if (
GameLib.Utils.UndefinedOrNull(particleEngine.camera) ||
GameLib.Utils.UndefinedOrNull(particleEngine.templateParticle) || GameLib.Utils.UndefinedOrNull(particleEngine.templateParticle) ||
GameLib.Utils.UndefinedOrNull(particleEngine.templateParticle.mesh) || GameLib.Utils.UndefinedOrNull(particleEngine.templateParticle.mesh) ||
GameLib.Utils.UndefinedOrNull(particleEngine.templateParticle.mesh.parentScene) || GameLib.Utils.UndefinedOrNull(particleEngine.templateParticle.mesh.parentScene) ||
@ -116,36 +143,36 @@ GameLib.System.Particle.prototype.beforeRender = function(data) {
var speed = particle.userData.speed; 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; 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; speed = data.delta * particle.userData.speed;
particle.userData.speed += 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; speed = Math.pow(particle.userData.speed, 2) * data.delta;
particle.userData.speed += speed; 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; speed = Math.log(particle.userData.speed) * data.delta;
particle.userData.speed += speed; 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; speed = 1 / Math.log(particle.userData.speed) * data.delta;
particle.userData.speed += speed; 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; speed = Math.exp(particle.userData.speed) * data.delta;
particle.userData.speed += speed; 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; speed = 1 / Math.exp(particle.userData.speed) * data.delta;
particle.userData.speed += speed; 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.y += particle.userData.direction.y * speed;
particle.position.z += particle.userData.direction.z * 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 * 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.x += particle.userData.scale.x * data.delta;
particle.scale.y += 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.scale.z += particle.userData.scale.x * data.delta;
} }
particle.quaternion.copy(particleEngine.camera.instance.quaternion); if (particleEngine.camera && particleEngine.camera.instance) {
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.templateParticle.opacityType === GameLib.D3.Particle.OPACITY_TYPE_DECREASE_LINEAR) { if (particleEngine.templateParticle.opacityType === GameLib.D3.API.Particle.OPACITY_TYPE_FADE_IN_LINEAR) {
particle.material.opacity -= particleEngine.templateParticle.opacityFactor; 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; particle.userData.elapsed += data.delta;