diff --git a/src/game-lib-d3-api-particle-engine.js b/src/game-lib-d3-api-particle-engine.js index fe51539..12318e0 100644 --- a/src/game-lib-d3-api-particle-engine.js +++ b/src/game-lib-d3-api-particle-engine.js @@ -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 ); diff --git a/src/game-lib-d3-api-particle.js b/src/game-lib-d3-api-particle.js index 6d606cb..df9fbee 100644 --- a/src/game-lib-d3-api-particle.js +++ b/src/game-lib-d3-api-particle.js @@ -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, diff --git a/src/game-lib-d3-particle-engine.js b/src/game-lib-d3-particle-engine.js index e56a8ea..75fc8e1 100644 --- a/src/game-lib-d3-particle-engine.js +++ b/src/game-lib-d3-particle-engine.js @@ -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) ); diff --git a/src/game-lib-d3-particle.js b/src/game-lib-d3-particle.js index 4fecbd0e..59703af 100644 --- a/src/game-lib-d3-particle.js +++ b/src/game-lib-d3-particle.js @@ -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, diff --git a/src/game-lib-system-linking.js b/src/game-lib-system-linking.js index a3d7ebe..2d9ca43 100644 --- a/src/game-lib-system-linking.js +++ b/src/game-lib-system-linking.js @@ -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) { diff --git a/src/game-lib-system-particle.js b/src/game-lib-system-particle.js index eb10058..2bfba7d 100644 --- a/src/game-lib-system-particle.js +++ b/src/game-lib-system-particle.js @@ -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); } } diff --git a/src/game-lib-system-storage.js b/src/game-lib-system-storage.js index ea8b9ae..377628c 100644 --- a/src/game-lib-system-storage.js +++ b/src/game-lib-system-storage.js @@ -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, { diff --git a/src/game-lib-vector3.js b/src/game-lib-vector3.js index 8f19a78..0ebe888 100644 --- a/src/game-lib-vector3.js +++ b/src/game-lib-vector3.js @@ -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);