particle updates
parent
fb8bff5277
commit
ed82c3d787
|
@ -3,13 +3,14 @@
|
|||
* @param id
|
||||
* @param name
|
||||
* @param position
|
||||
* @param rotation
|
||||
* @param direction
|
||||
* @param scale
|
||||
* @param enabled
|
||||
* @param templateParticle
|
||||
* @param particlesPerSecond
|
||||
* @param frequency
|
||||
* @param elapsed
|
||||
* @param camera
|
||||
* @param parentEntity
|
||||
* @constructor
|
||||
*/
|
||||
|
@ -17,13 +18,14 @@ GameLib.D3.API.ParticleEngine = function(
|
|||
id,
|
||||
name,
|
||||
position,
|
||||
rotation,
|
||||
direction,
|
||||
scale,
|
||||
enabled,
|
||||
templateParticle,
|
||||
particlesPerSecond,
|
||||
frequency,
|
||||
elapsed,
|
||||
camera,
|
||||
parentEntity
|
||||
) {
|
||||
|
||||
|
@ -42,10 +44,10 @@ GameLib.D3.API.ParticleEngine = function(
|
|||
}
|
||||
this.position = position;
|
||||
|
||||
if (GameLib.Utils.UndefinedOrNull(rotation)) {
|
||||
rotation = new GameLib.API.Vector3(0, 0, 0);
|
||||
if (GameLib.Utils.UndefinedOrNull(direction)) {
|
||||
direction = new GameLib.API.Vector3(0, 1, 0);
|
||||
}
|
||||
this.rotation = rotation;
|
||||
this.direction = direction;
|
||||
|
||||
if (GameLib.Utils.UndefinedOrNull(scale)) {
|
||||
scale = new GameLib.API.Vector3(1, 1, 1);
|
||||
|
@ -77,6 +79,11 @@ GameLib.D3.API.ParticleEngine = function(
|
|||
}
|
||||
this.elapsed = elapsed;
|
||||
|
||||
if (GameLib.Utils.UndefinedOrNull(camera)) {
|
||||
camera = null;
|
||||
}
|
||||
this.camera = camera;
|
||||
|
||||
if (GameLib.Utils.UndefinedOrNull(parentEntity)) {
|
||||
parentEntity = null;
|
||||
}
|
||||
|
@ -97,24 +104,40 @@ GameLib.D3.API.ParticleEngine.FromObject = function(objectParticleEngine) {
|
|||
var apiTemplateParticle = null;
|
||||
if (objectParticleEngine.templateParticle) {
|
||||
if (objectParticleEngine.templateParticle instanceof Object) {
|
||||
apiTemplateParticle = GameLib.D3.API.Material.FromObject(objectParticleEngine.templateParticle);
|
||||
apiTemplateParticle = GameLib.D3.API.Particle.FromObject(objectParticleEngine.templateParticle);
|
||||
} else {
|
||||
apiTemplateParticle = objectParticleEngine.templateParticle;
|
||||
}
|
||||
}
|
||||
|
||||
var apiPosition = null;
|
||||
if (objectParticleEngine.position) {
|
||||
apiPosition = GameLib.API.Vector3.FromObject(objectParticleEngine.position);
|
||||
}
|
||||
|
||||
var apiDirection = null;
|
||||
if (objectParticleEngine.direction) {
|
||||
apiDirection = GameLib.API.Vector3.FromObject(objectParticleEngine.direction);
|
||||
}
|
||||
|
||||
var apiScale = null;
|
||||
if (objectParticleEngine.scale) {
|
||||
apiScale = GameLib.API.Vector3.FromObject(objectParticleEngine.scale);
|
||||
}
|
||||
|
||||
return new GameLib.D3.API.ParticleEngine(
|
||||
|
||||
objectParticleEngine.id,
|
||||
objectParticleEngine.name,
|
||||
GameLib.API.Vector3.FromObject(objectParticleEngine.position),
|
||||
GameLib.API.Vector3.FromObject(objectParticleEngine.rotation),
|
||||
GameLib.API.Vector3.FromObject(objectParticleEngine.scale),
|
||||
apiPosition,
|
||||
apiDirection,
|
||||
apiScale,
|
||||
objectParticleEngine.enabled,
|
||||
apiTemplateParticle,
|
||||
objectParticleEngine.particlesPerSecond,
|
||||
objectParticleEngine.frequency,
|
||||
objectParticleEngine.elapsed,
|
||||
objectParticleEngine.camera,
|
||||
objectParticleEngine.parentEntity
|
||||
|
||||
);
|
||||
|
|
|
@ -13,6 +13,7 @@
|
|||
* @param scale
|
||||
* @param direction
|
||||
* @param directionFn
|
||||
* @param speed
|
||||
* @param scaleFn
|
||||
* @param scaleType
|
||||
* @param rotationType
|
||||
|
@ -33,6 +34,7 @@ GameLib.D3.API.Particle = function(
|
|||
directionType,
|
||||
direction,
|
||||
directionFn,
|
||||
speed,
|
||||
scaleType,
|
||||
scale,
|
||||
scaleFn,
|
||||
|
@ -98,6 +100,11 @@ GameLib.D3.API.Particle = function(
|
|||
}
|
||||
this.directionFn = directionFn;
|
||||
|
||||
if (GameLib.Utils.UndefinedOrNull(speed)) {
|
||||
speed = 1;
|
||||
}
|
||||
this.speed = speed;
|
||||
|
||||
if (GameLib.Utils.UndefinedOrNull(scaleType)) {
|
||||
scaleType = GameLib.D3.Particle.SCALE_TYPE_CONSTANT;
|
||||
}
|
||||
|
@ -170,6 +177,7 @@ GameLib.D3.API.Particle.FromObject = function(objectParticle) {
|
|||
objectParticle.directionType,
|
||||
GameLib.API.Vector3.FromObject(objectParticle.direction),
|
||||
objectParticle.directionFn,
|
||||
objectParticle.speed,
|
||||
objectParticle.scaleType,
|
||||
GameLib.API.Vector3.FromObject(objectParticle.scale),
|
||||
objectParticle.scaleFn,
|
||||
|
|
|
@ -25,13 +25,14 @@ GameLib.D3.ParticleEngine = function(
|
|||
apiParticleEngine.id,
|
||||
apiParticleEngine.name,
|
||||
apiParticleEngine.position,
|
||||
apiParticleEngine.rotation,
|
||||
apiParticleEngine.direction,
|
||||
apiParticleEngine.scale,
|
||||
apiParticleEngine.enabled,
|
||||
apiParticleEngine.templateParticle,
|
||||
apiParticleEngine.particlesPerSecond,
|
||||
apiParticleEngine.frequency,
|
||||
apiParticleEngine.elapsed,
|
||||
apiParticleEngine.camera,
|
||||
apiParticleEngine.parentEntity
|
||||
);
|
||||
|
||||
|
@ -46,15 +47,15 @@ GameLib.D3.ParticleEngine = function(
|
|||
throw new Error('position not instance of API.Vector3');
|
||||
}
|
||||
|
||||
if (this.rotation instanceof GameLib.API.Vector3) {
|
||||
this.rotation = new GameLib.Vector3(
|
||||
if (this.direction instanceof GameLib.API.Vector3) {
|
||||
this.direction = new GameLib.Vector3(
|
||||
graphics,
|
||||
this.rotation,
|
||||
this.direction,
|
||||
this
|
||||
);
|
||||
} else {
|
||||
console.warn('rotation not instance of API.Vector3');
|
||||
throw new Error('rotation not instance of API.Vector3');
|
||||
console.warn('direction not instance of API.Vector3');
|
||||
throw new Error('direction not instance of API.Vector3');
|
||||
}
|
||||
|
||||
if (this.scale instanceof GameLib.API.Vector3) {
|
||||
|
@ -68,10 +69,17 @@ GameLib.D3.ParticleEngine = function(
|
|||
throw new Error('scale not instance of API.Vector3');
|
||||
}
|
||||
|
||||
if (this.camera instanceof GameLib.D3.API.Camera) {
|
||||
this.templateParticle = new GameLib.D3.Camera(
|
||||
graphics,
|
||||
this.camera
|
||||
)
|
||||
}
|
||||
|
||||
if (this.templateParticle instanceof GameLib.D3.API.Particle) {
|
||||
this.templateParticle = new GameLib.D3.Particle(
|
||||
graphics,
|
||||
material
|
||||
this.templateParticle
|
||||
)
|
||||
}
|
||||
|
||||
|
@ -81,7 +89,8 @@ GameLib.D3.ParticleEngine = function(
|
|||
this,
|
||||
GameLib.Component.COMPONENT_PARTICLE_ENGINE,
|
||||
{
|
||||
templateParticle : GameLib.D3.Particle
|
||||
templateParticle : GameLib.D3.Particle,
|
||||
camera : GameLib.D3.Camera
|
||||
}
|
||||
);
|
||||
|
||||
|
@ -98,6 +107,17 @@ GameLib.D3.ParticleEngine.prototype.createInstance = function() {
|
|||
|
||||
this.instance = true;
|
||||
|
||||
if (this.templateParticle) {
|
||||
|
||||
this.templateParticle.mesh.position.x = this.position.x;
|
||||
this.templateParticle.mesh.position.y = this.position.y;
|
||||
this.templateParticle.mesh.position.z = this.position.z;
|
||||
|
||||
this.templateParticle.direction.x = this.direction.x;
|
||||
this.templateParticle.direction.y = this.direction.y;
|
||||
this.templateParticle.direction.z = this.direction.z;
|
||||
}
|
||||
|
||||
GameLib.Component.prototype.createInstance.call(this);
|
||||
};
|
||||
|
||||
|
@ -114,34 +134,62 @@ GameLib.D3.ParticleEngine.prototype.updateInstance = function(property) {
|
|||
this.particlesPerSecond = Math.round(1 / this.frequency);
|
||||
}
|
||||
|
||||
if (property === 'templateParticle') {
|
||||
this.templateParticle.mesh.position.x = this.position.x;
|
||||
this.templateParticle.mesh.position.y = this.position.y;
|
||||
this.templateParticle.mesh.position.z = this.position.z;
|
||||
this.templateParticle.direction.x = this.direction.x;
|
||||
this.templateParticle.direction.y = this.direction.y;
|
||||
this.templateParticle.direction.z = this.direction.z;
|
||||
}
|
||||
|
||||
if (property === 'position') {
|
||||
|
||||
this.position.updateInstance('position', true);
|
||||
|
||||
this.templateParticle.mesh.position.x = this.position.x;
|
||||
this.templateParticle.mesh.position.y = this.position.y;
|
||||
this.templateParticle.mesh.position.z = this.position.z;
|
||||
|
||||
this.templateParticle.mesh.updateInstancePosition();
|
||||
}
|
||||
|
||||
if (property === 'direction') {
|
||||
|
||||
this.direction.updateInstance('direction', true);
|
||||
|
||||
this.templateParticle.direction.x = this.direction.x;
|
||||
this.templateParticle.direction.y = this.direction.y;
|
||||
this.templateParticle.direction.z = this.direction.z;
|
||||
}
|
||||
};
|
||||
|
||||
GameLib.D3.ParticleEngine.prototype.processParticles = function(delta) {
|
||||
this.particles = this.particles.reduce(
|
||||
function(result, particle){
|
||||
|
||||
particle.position.x += particle.userData.direction.x * delta;
|
||||
particle.position.y += particle.userData.direction.y * delta;
|
||||
particle.position.z += particle.userData.direction.z * delta;
|
||||
|
||||
particle.userData.elapsed += delta;
|
||||
if (particle.userData.elapsed > particle.userData.lifeTime) {
|
||||
particle.parent.remove(particle);
|
||||
} else {
|
||||
result.push(particle);
|
||||
}
|
||||
|
||||
return result;
|
||||
},
|
||||
[]
|
||||
);
|
||||
// this.particles = this.particles.reduce(
|
||||
// function(result, particle){
|
||||
//
|
||||
// particle.position.x += particle.userData.direction.x * delta;
|
||||
// particle.position.y += particle.userData.direction.y * delta;
|
||||
// particle.position.z += particle.userData.direction.z * delta;
|
||||
//
|
||||
// particle.userData.elapsed += delta;
|
||||
// if (particle.userData.elapsed > particle.userData.lifeTime) {
|
||||
// particle.parent.remove(particle);
|
||||
// } else {
|
||||
// result.push(particle);
|
||||
// }
|
||||
//
|
||||
// return result;
|
||||
// },
|
||||
// []
|
||||
// );
|
||||
};
|
||||
|
||||
GameLib.D3.ParticleEngine.prototype.createNewParticle = function(camera) {
|
||||
|
||||
var particle = this.templateParticle.clone(camera);
|
||||
|
||||
this.particles.push(particle);
|
||||
//
|
||||
// var particle = this.templateParticle.clone(camera);
|
||||
//
|
||||
// this.particles.push(particle);
|
||||
|
||||
};
|
||||
|
||||
|
@ -155,13 +203,14 @@ GameLib.D3.ParticleEngine.prototype.toApiObject = function() {
|
|||
this.id,
|
||||
this.name,
|
||||
this.position.toApiObject(),
|
||||
this.rotation.toApiObject(),
|
||||
this.direction.toApiObject(),
|
||||
this.scale.toApiObject(),
|
||||
this.enabled,
|
||||
GameLib.Utils.IdOrNull(this.templateParticle),
|
||||
this.particlesPerSecond,
|
||||
this.frequency,
|
||||
this.elapsed,
|
||||
GameLib.Utils.IdOrNull(this.camera),
|
||||
GameLib.Utils.IdOrNull(this.parentEntity)
|
||||
);
|
||||
|
||||
|
|
|
@ -33,6 +33,7 @@ GameLib.D3.Particle = function(
|
|||
apiParticle.directionType,
|
||||
apiParticle.direction,
|
||||
apiParticle.directionFn,
|
||||
apiParticle.speed,
|
||||
apiParticle.scaleType,
|
||||
apiParticle.scale,
|
||||
apiParticle.scaleFn,
|
||||
|
@ -191,6 +192,7 @@ GameLib.D3.Particle.prototype.toApiObject = function() {
|
|||
this.directionType,
|
||||
this.direction.toApiObject(),
|
||||
this.directionFn,
|
||||
this.speed,
|
||||
this.scaleType,
|
||||
this.scale.toApiObject(),
|
||||
this.scaleFn,
|
||||
|
|
|
@ -559,11 +559,17 @@ GameLib.System.Linking.prototype.arrayItemAdded = function(data) {
|
|||
};
|
||||
|
||||
GameLib.System.Linking.prototype.instanceCloned = function(data) {
|
||||
if (
|
||||
data.component.parentScene
|
||||
) {
|
||||
// data.component.parentScene.instance.add(data.instance);
|
||||
|
||||
if (data.component instanceof GameLib.D3.Particle) {
|
||||
|
||||
var mesh = data.component.mesh;
|
||||
|
||||
if (mesh.parentScene && mesh.parentScene.instance) {
|
||||
data.instance.userData.scene = mesh.parentScene.instance;
|
||||
mesh.parentScene.instance.add(data.instance);
|
||||
}
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
GameLib.System.Linking.prototype.instanceCreated = function(data) {
|
||||
|
|
|
@ -112,19 +112,25 @@ GameLib.System.Particle.prototype.beforeRender = function(data) {
|
|||
this.particleEngines.map(
|
||||
function(particleEngine) {
|
||||
|
||||
if (GameLib.Utils.UndefinedOrNull(particleEngine.camera)) {
|
||||
return;
|
||||
}
|
||||
|
||||
particleEngine.elapsed += data.delta;
|
||||
|
||||
particleEngine.particles = particleEngine.particles.reduce(
|
||||
|
||||
function(result, particle){
|
||||
|
||||
particle.position.x += particle.userData.direction.x * data.delta;
|
||||
particle.position.y += particle.userData.direction.y * data.delta;
|
||||
particle.position.z += particle.userData.direction.z * data.delta;
|
||||
particle.position.x += particle.userData.direction.x * data.delta * particle.userData.speed;
|
||||
particle.position.y += particle.userData.direction.y * data.delta * particle.userData.speed;
|
||||
particle.position.z += particle.userData.direction.z * data.delta * particle.userData.speed;
|
||||
|
||||
particle.quaternion.copy(particleEngine.camera.instance.quaternion);
|
||||
|
||||
particle.userData.elapsed += data.delta;
|
||||
if (particle.userData.elapsed > particle.userData.lifeTime) {
|
||||
particle.parent.remove(particle);
|
||||
particle.userData.scene.remove(particle);
|
||||
} else {
|
||||
result.push(particle);
|
||||
}
|
||||
|
@ -140,16 +146,16 @@ GameLib.System.Particle.prototype.beforeRender = function(data) {
|
|||
|
||||
particleEngine.elapsed = 0;
|
||||
|
||||
|
||||
var particleInstance = particleEngine.templateParticle.cloneInstance();
|
||||
|
||||
particleEngine.particles.push(particleInstance);
|
||||
//particleEngine.templateParticle.parentScene.instance.add(particleInstance);
|
||||
|
||||
particleEngine.templateParticle.parentScene.instance.add(particleInstance);
|
||||
|
||||
particleInstance.userData.direction = this.direction.instance.clone();
|
||||
particleInstance.userData.direction = particleEngine.direction.instance.clone();
|
||||
particleInstance.userData.elapsed = 0;
|
||||
particleInstance.userData.lifeTime = this.lifeTime;
|
||||
particleInstance.userData.lifeTime = particleEngine.templateParticle.lifeTime;
|
||||
particleInstance.userData.speed = particleEngine.templateParticle.speed;
|
||||
|
||||
particleEngine.particles.push(particleInstance);
|
||||
|
||||
}
|
||||
}
|
||||
|
|
|
@ -586,6 +586,17 @@ GameLib.System.Storage.prototype.loadComponent = function(apiUrl, toProcess, inc
|
|||
|
||||
var toProcess = GameLib.Utils.Difference(loaded.map(function(component){return component.id}), loading);
|
||||
|
||||
if (!runtimeComponent) {
|
||||
/**
|
||||
* Make sure we don't try to download this component again, it failed
|
||||
*/
|
||||
var index = toProcess.indexOf(component.id);
|
||||
|
||||
if (index !== -1) {
|
||||
toProcess.splice(index, 1);
|
||||
}
|
||||
}
|
||||
|
||||
GameLib.Event.Emit(
|
||||
GameLib.Event.LOAD_PROGRESS,
|
||||
{
|
||||
|
|
|
@ -83,13 +83,14 @@ GameLib.Vector3.prototype.createInstance = function() {
|
|||
/**
|
||||
* Updates the instance vector, calls updateInstance on the parent object
|
||||
*/
|
||||
GameLib.Vector3.prototype.updateInstance = function(property) {
|
||||
GameLib.Vector3.prototype.updateInstance = function(property, preventParentUpdate) {
|
||||
|
||||
this.instance.x = this.x;
|
||||
this.instance.y = this.y;
|
||||
this.instance.z = this.z;
|
||||
|
||||
if (this.parentObject &&
|
||||
if (!preventParentUpdate &&
|
||||
this.parentObject &&
|
||||
this.parentObject !== this &&
|
||||
this.parentObject.updateInstance) {
|
||||
this.parentObject.updateInstance(property);
|
||||
|
|
Loading…
Reference in New Issue