particle updates

beta.r3js.org
-=yb4f310 2017-11-13 08:39:07 +01:00
parent fb8bff5277
commit ed82c3d787
8 changed files with 162 additions and 56 deletions

View File

@ -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
);

View File

@ -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,

View File

@ -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)
);

View File

@ -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,

View File

@ -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) {

View File

@ -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);
}
}

View File

@ -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,
{

View File

@ -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);