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 id
* @param name * @param name
* @param position * @param position
* @param rotation * @param direction
* @param scale * @param scale
* @param enabled * @param enabled
* @param templateParticle * @param templateParticle
* @param particlesPerSecond * @param particlesPerSecond
* @param frequency * @param frequency
* @param elapsed * @param elapsed
* @param camera
* @param parentEntity * @param parentEntity
* @constructor * @constructor
*/ */
@ -17,13 +18,14 @@ GameLib.D3.API.ParticleEngine = function(
id, id,
name, name,
position, position,
rotation, direction,
scale, scale,
enabled, enabled,
templateParticle, templateParticle,
particlesPerSecond, particlesPerSecond,
frequency, frequency,
elapsed, elapsed,
camera,
parentEntity parentEntity
) { ) {
@ -42,10 +44,10 @@ GameLib.D3.API.ParticleEngine = function(
} }
this.position = position; this.position = position;
if (GameLib.Utils.UndefinedOrNull(rotation)) { if (GameLib.Utils.UndefinedOrNull(direction)) {
rotation = new GameLib.API.Vector3(0, 0, 0); direction = new GameLib.API.Vector3(0, 1, 0);
} }
this.rotation = rotation; this.direction = direction;
if (GameLib.Utils.UndefinedOrNull(scale)) { if (GameLib.Utils.UndefinedOrNull(scale)) {
scale = new GameLib.API.Vector3(1, 1, 1); scale = new GameLib.API.Vector3(1, 1, 1);
@ -77,6 +79,11 @@ GameLib.D3.API.ParticleEngine = function(
} }
this.elapsed = elapsed; this.elapsed = elapsed;
if (GameLib.Utils.UndefinedOrNull(camera)) {
camera = null;
}
this.camera = camera;
if (GameLib.Utils.UndefinedOrNull(parentEntity)) { if (GameLib.Utils.UndefinedOrNull(parentEntity)) {
parentEntity = null; parentEntity = null;
} }
@ -97,24 +104,40 @@ GameLib.D3.API.ParticleEngine.FromObject = function(objectParticleEngine) {
var apiTemplateParticle = null; var apiTemplateParticle = null;
if (objectParticleEngine.templateParticle) { if (objectParticleEngine.templateParticle) {
if (objectParticleEngine.templateParticle instanceof Object) { if (objectParticleEngine.templateParticle instanceof Object) {
apiTemplateParticle = GameLib.D3.API.Material.FromObject(objectParticleEngine.templateParticle); apiTemplateParticle = GameLib.D3.API.Particle.FromObject(objectParticleEngine.templateParticle);
} else { } else {
apiTemplateParticle = objectParticleEngine.templateParticle; 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( return new GameLib.D3.API.ParticleEngine(
objectParticleEngine.id, objectParticleEngine.id,
objectParticleEngine.name, objectParticleEngine.name,
GameLib.API.Vector3.FromObject(objectParticleEngine.position), apiPosition,
GameLib.API.Vector3.FromObject(objectParticleEngine.rotation), apiDirection,
GameLib.API.Vector3.FromObject(objectParticleEngine.scale), apiScale,
objectParticleEngine.enabled, objectParticleEngine.enabled,
apiTemplateParticle, apiTemplateParticle,
objectParticleEngine.particlesPerSecond, objectParticleEngine.particlesPerSecond,
objectParticleEngine.frequency, objectParticleEngine.frequency,
objectParticleEngine.elapsed, objectParticleEngine.elapsed,
objectParticleEngine.camera,
objectParticleEngine.parentEntity objectParticleEngine.parentEntity
); );

View File

@ -13,6 +13,7 @@
* @param scale * @param scale
* @param direction * @param direction
* @param directionFn * @param directionFn
* @param speed
* @param scaleFn * @param scaleFn
* @param scaleType * @param scaleType
* @param rotationType * @param rotationType
@ -33,6 +34,7 @@ GameLib.D3.API.Particle = function(
directionType, directionType,
direction, direction,
directionFn, directionFn,
speed,
scaleType, scaleType,
scale, scale,
scaleFn, scaleFn,
@ -98,6 +100,11 @@ GameLib.D3.API.Particle = function(
} }
this.directionFn = directionFn; this.directionFn = directionFn;
if (GameLib.Utils.UndefinedOrNull(speed)) {
speed = 1;
}
this.speed = speed;
if (GameLib.Utils.UndefinedOrNull(scaleType)) { if (GameLib.Utils.UndefinedOrNull(scaleType)) {
scaleType = GameLib.D3.Particle.SCALE_TYPE_CONSTANT; scaleType = GameLib.D3.Particle.SCALE_TYPE_CONSTANT;
} }
@ -170,6 +177,7 @@ GameLib.D3.API.Particle.FromObject = function(objectParticle) {
objectParticle.directionType, objectParticle.directionType,
GameLib.API.Vector3.FromObject(objectParticle.direction), GameLib.API.Vector3.FromObject(objectParticle.direction),
objectParticle.directionFn, objectParticle.directionFn,
objectParticle.speed,
objectParticle.scaleType, objectParticle.scaleType,
GameLib.API.Vector3.FromObject(objectParticle.scale), GameLib.API.Vector3.FromObject(objectParticle.scale),
objectParticle.scaleFn, objectParticle.scaleFn,

View File

@ -25,13 +25,14 @@ GameLib.D3.ParticleEngine = function(
apiParticleEngine.id, apiParticleEngine.id,
apiParticleEngine.name, apiParticleEngine.name,
apiParticleEngine.position, apiParticleEngine.position,
apiParticleEngine.rotation, apiParticleEngine.direction,
apiParticleEngine.scale, apiParticleEngine.scale,
apiParticleEngine.enabled, apiParticleEngine.enabled,
apiParticleEngine.templateParticle, apiParticleEngine.templateParticle,
apiParticleEngine.particlesPerSecond, apiParticleEngine.particlesPerSecond,
apiParticleEngine.frequency, apiParticleEngine.frequency,
apiParticleEngine.elapsed, apiParticleEngine.elapsed,
apiParticleEngine.camera,
apiParticleEngine.parentEntity apiParticleEngine.parentEntity
); );
@ -46,15 +47,15 @@ GameLib.D3.ParticleEngine = function(
throw new Error('position not instance of API.Vector3'); throw new Error('position not instance of API.Vector3');
} }
if (this.rotation instanceof GameLib.API.Vector3) { if (this.direction instanceof GameLib.API.Vector3) {
this.rotation = new GameLib.Vector3( this.direction = new GameLib.Vector3(
graphics, graphics,
this.rotation, this.direction,
this this
); );
} else { } else {
console.warn('rotation not instance of API.Vector3'); console.warn('direction not instance of API.Vector3');
throw new Error('rotation not instance of API.Vector3'); throw new Error('direction not instance of API.Vector3');
} }
if (this.scale instanceof GameLib.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'); 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) { if (this.templateParticle instanceof GameLib.D3.API.Particle) {
this.templateParticle = new GameLib.D3.Particle( this.templateParticle = new GameLib.D3.Particle(
graphics, graphics,
material this.templateParticle
) )
} }
@ -81,7 +89,8 @@ GameLib.D3.ParticleEngine = function(
this, this,
GameLib.Component.COMPONENT_PARTICLE_ENGINE, 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; 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); GameLib.Component.prototype.createInstance.call(this);
}; };
@ -114,34 +134,62 @@ GameLib.D3.ParticleEngine.prototype.updateInstance = function(property) {
this.particlesPerSecond = Math.round(1 / this.frequency); 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) { GameLib.D3.ParticleEngine.prototype.processParticles = function(delta) {
this.particles = this.particles.reduce( // this.particles = this.particles.reduce(
function(result, particle){ // function(result, particle){
//
particle.position.x += particle.userData.direction.x * delta; // particle.position.x += particle.userData.direction.x * delta;
particle.position.y += particle.userData.direction.y * delta; // particle.position.y += particle.userData.direction.y * delta;
particle.position.z += particle.userData.direction.z * delta; // particle.position.z += particle.userData.direction.z * delta;
//
particle.userData.elapsed += delta; // particle.userData.elapsed += delta;
if (particle.userData.elapsed > particle.userData.lifeTime) { // if (particle.userData.elapsed > particle.userData.lifeTime) {
particle.parent.remove(particle); // particle.parent.remove(particle);
} else { // } else {
result.push(particle); // result.push(particle);
} // }
//
return result; // return result;
}, // },
[] // []
); // );
}; };
GameLib.D3.ParticleEngine.prototype.createNewParticle = function(camera) { GameLib.D3.ParticleEngine.prototype.createNewParticle = function(camera) {
//
var particle = this.templateParticle.clone(camera); // var particle = this.templateParticle.clone(camera);
//
this.particles.push(particle); // this.particles.push(particle);
}; };
@ -155,13 +203,14 @@ GameLib.D3.ParticleEngine.prototype.toApiObject = function() {
this.id, this.id,
this.name, this.name,
this.position.toApiObject(), this.position.toApiObject(),
this.rotation.toApiObject(), this.direction.toApiObject(),
this.scale.toApiObject(), this.scale.toApiObject(),
this.enabled, this.enabled,
GameLib.Utils.IdOrNull(this.templateParticle), GameLib.Utils.IdOrNull(this.templateParticle),
this.particlesPerSecond, this.particlesPerSecond,
this.frequency, this.frequency,
this.elapsed, this.elapsed,
GameLib.Utils.IdOrNull(this.camera),
GameLib.Utils.IdOrNull(this.parentEntity) GameLib.Utils.IdOrNull(this.parentEntity)
); );

View File

@ -33,6 +33,7 @@ GameLib.D3.Particle = function(
apiParticle.directionType, apiParticle.directionType,
apiParticle.direction, apiParticle.direction,
apiParticle.directionFn, apiParticle.directionFn,
apiParticle.speed,
apiParticle.scaleType, apiParticle.scaleType,
apiParticle.scale, apiParticle.scale,
apiParticle.scaleFn, apiParticle.scaleFn,
@ -191,6 +192,7 @@ GameLib.D3.Particle.prototype.toApiObject = function() {
this.directionType, this.directionType,
this.direction.toApiObject(), this.direction.toApiObject(),
this.directionFn, this.directionFn,
this.speed,
this.scaleType, this.scaleType,
this.scale.toApiObject(), this.scale.toApiObject(),
this.scaleFn, this.scaleFn,

View File

@ -559,11 +559,17 @@ GameLib.System.Linking.prototype.arrayItemAdded = function(data) {
}; };
GameLib.System.Linking.prototype.instanceCloned = function(data) { GameLib.System.Linking.prototype.instanceCloned = function(data) {
if (
data.component.parentScene if (data.component instanceof GameLib.D3.Particle) {
) {
// data.component.parentScene.instance.add(data.instance); 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) { GameLib.System.Linking.prototype.instanceCreated = function(data) {

View File

@ -112,19 +112,25 @@ GameLib.System.Particle.prototype.beforeRender = function(data) {
this.particleEngines.map( this.particleEngines.map(
function(particleEngine) { function(particleEngine) {
if (GameLib.Utils.UndefinedOrNull(particleEngine.camera)) {
return;
}
particleEngine.elapsed += data.delta; particleEngine.elapsed += data.delta;
particleEngine.particles = particleEngine.particles.reduce( particleEngine.particles = particleEngine.particles.reduce(
function(result, particle){ function(result, particle){
particle.position.x += particle.userData.direction.x * data.delta; particle.position.x += particle.userData.direction.x * data.delta * particle.userData.speed;
particle.position.y += particle.userData.direction.y * data.delta; particle.position.y += particle.userData.direction.y * data.delta * particle.userData.speed;
particle.position.z += particle.userData.direction.z * data.delta; particle.position.z += particle.userData.direction.z * data.delta * particle.userData.speed;
particle.quaternion.copy(particleEngine.camera.instance.quaternion);
particle.userData.elapsed += data.delta; particle.userData.elapsed += data.delta;
if (particle.userData.elapsed > particle.userData.lifeTime) { if (particle.userData.elapsed > particle.userData.lifeTime) {
particle.parent.remove(particle); particle.userData.scene.remove(particle);
} else { } else {
result.push(particle); result.push(particle);
} }
@ -140,16 +146,16 @@ GameLib.System.Particle.prototype.beforeRender = function(data) {
particleEngine.elapsed = 0; particleEngine.elapsed = 0;
var particleInstance = particleEngine.templateParticle.cloneInstance(); var particleInstance = particleEngine.templateParticle.cloneInstance();
particleEngine.particles.push(particleInstance); //particleEngine.templateParticle.parentScene.instance.add(particleInstance);
particleEngine.templateParticle.parentScene.instance.add(particleInstance); particleInstance.userData.direction = particleEngine.direction.instance.clone();
particleInstance.userData.direction = this.direction.instance.clone();
particleInstance.userData.elapsed = 0; 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); 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.Emit(
GameLib.Event.LOAD_PROGRESS, 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 * 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.x = this.x;
this.instance.y = this.y; this.instance.y = this.y;
this.instance.z = this.z; this.instance.z = this.z;
if (this.parentObject && if (!preventParentUpdate &&
this.parentObject &&
this.parentObject !== this && this.parentObject !== this &&
this.parentObject.updateInstance) { this.parentObject.updateInstance) {
this.parentObject.updateInstance(property); this.parentObject.updateInstance(property);