move all particle properties in
parent
0d579f9f13
commit
61d191456d
|
@ -111,6 +111,7 @@ GameLib.Event.MOUSE_DOWN = 0x5d;
|
||||||
GameLib.Event.MOUSE_MOVE = 0x5e;
|
GameLib.Event.MOUSE_MOVE = 0x5e;
|
||||||
GameLib.Event.MOUSE_WHEEL = 0x5f;
|
GameLib.Event.MOUSE_WHEEL = 0x5f;
|
||||||
GameLib.Event.MOUSE_UP = 0x60;
|
GameLib.Event.MOUSE_UP = 0x60;
|
||||||
|
GameLib.Event.PARTICLE_INSTANCE_UPDATED = 0x61;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns string name of event ID
|
* Returns string name of event ID
|
||||||
|
@ -217,6 +218,7 @@ GameLib.Event.GetEventName = function(number) {
|
||||||
case 0x5e : return 'mouse_move';
|
case 0x5e : return 'mouse_move';
|
||||||
case 0x5f : return 'mouse_wheel';
|
case 0x5f : return 'mouse_wheel';
|
||||||
case 0x60 : return 'mouse_up';
|
case 0x60 : return 'mouse_up';
|
||||||
|
case 0x61 : return 'particle_instance_updated';
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -21,10 +21,14 @@
|
||||||
GameLib.D3.API.ParticleEngine = function(
|
GameLib.D3.API.ParticleEngine = function(
|
||||||
id,
|
id,
|
||||||
name,
|
name,
|
||||||
|
meshes,
|
||||||
materials,
|
materials,
|
||||||
position,
|
position,
|
||||||
direction,
|
direction,
|
||||||
|
lookAt,
|
||||||
particlesPerSecond,
|
particlesPerSecond,
|
||||||
|
frequency,
|
||||||
|
elapsed,
|
||||||
distanceType,
|
distanceType,
|
||||||
minDistance,
|
minDistance,
|
||||||
maxDistance,
|
maxDistance,
|
||||||
|
@ -47,6 +51,11 @@ GameLib.D3.API.ParticleEngine = function(
|
||||||
}
|
}
|
||||||
this.name = name;
|
this.name = name;
|
||||||
|
|
||||||
|
if (GameLib.Utils.UndefinedOrNull(meshes)) {
|
||||||
|
meshes = [];
|
||||||
|
}
|
||||||
|
this.meshes = meshes;
|
||||||
|
|
||||||
if (GameLib.Utils.UndefinedOrNull(materials)) {
|
if (GameLib.Utils.UndefinedOrNull(materials)) {
|
||||||
materials = [];
|
materials = [];
|
||||||
}
|
}
|
||||||
|
@ -62,11 +71,26 @@ GameLib.D3.API.ParticleEngine = function(
|
||||||
}
|
}
|
||||||
this.direction = direction;
|
this.direction = direction;
|
||||||
|
|
||||||
|
if (GameLib.Utils.UndefinedOrNull(lookAt)) {
|
||||||
|
lookAt = new GameLib.API.Vector3(0, 0, -1);
|
||||||
|
}
|
||||||
|
this.lookAt = lookAt;
|
||||||
|
|
||||||
if (GameLib.Utils.UndefinedOrNull(particlesPerSecond)) {
|
if (GameLib.Utils.UndefinedOrNull(particlesPerSecond)) {
|
||||||
particlesPerSecond = 1;
|
particlesPerSecond = 1;
|
||||||
}
|
}
|
||||||
this.particlesPerSecond = particlesPerSecond;
|
this.particlesPerSecond = particlesPerSecond;
|
||||||
|
|
||||||
|
if (GameLib.Utils.UndefinedOrNull(frequency)) {
|
||||||
|
frequency = Number(1 / Number(particlesPerSecond));
|
||||||
|
}
|
||||||
|
this.frequency = frequency;
|
||||||
|
|
||||||
|
if (GameLib.Utils.UndefinedOrNull(elapsed)) {
|
||||||
|
elapsed = 0;
|
||||||
|
}
|
||||||
|
this.elapsed = elapsed;
|
||||||
|
|
||||||
if (GameLib.Utils.UndefinedOrNull(distanceType)) {
|
if (GameLib.Utils.UndefinedOrNull(distanceType)) {
|
||||||
distanceType = GameLib.D3.ParticleEngine.DISTANCE_TYPE_CONSTANT;
|
distanceType = GameLib.D3.ParticleEngine.DISTANCE_TYPE_CONSTANT;
|
||||||
}
|
}
|
||||||
|
@ -129,6 +153,19 @@ GameLib.D3.API.ParticleEngine.prototype.constructor = GameLib.D3.API.ParticleEng
|
||||||
*/
|
*/
|
||||||
GameLib.D3.API.ParticleEngine.FromObject = function(objectParticleEngine) {
|
GameLib.D3.API.ParticleEngine.FromObject = function(objectParticleEngine) {
|
||||||
|
|
||||||
|
var apiMeshes = [];
|
||||||
|
if (objectParticleEngine.meshes) {
|
||||||
|
apiMeshes = objectParticleEngine.meshes.map(
|
||||||
|
function (objectMesh) {
|
||||||
|
if (objectMesh instanceof Object) {
|
||||||
|
return GameLib.D3.API.Mesh.FromObject(objectMesh);
|
||||||
|
} else {
|
||||||
|
return objectMesh
|
||||||
|
}
|
||||||
|
}
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
var apiMaterials = [];
|
var apiMaterials = [];
|
||||||
if (objectParticleEngine.materials) {
|
if (objectParticleEngine.materials) {
|
||||||
apiMaterials = objectParticleEngine.materials.map(
|
apiMaterials = objectParticleEngine.materials.map(
|
||||||
|
@ -145,10 +182,14 @@ GameLib.D3.API.ParticleEngine.FromObject = function(objectParticleEngine) {
|
||||||
return new GameLib.D3.API.ParticleEngine(
|
return new GameLib.D3.API.ParticleEngine(
|
||||||
objectParticleEngine.id,
|
objectParticleEngine.id,
|
||||||
objectParticleEngine.name,
|
objectParticleEngine.name,
|
||||||
|
apiMeshes,
|
||||||
apiMaterials,
|
apiMaterials,
|
||||||
GameLib.API.Vector3.FromObject(objectParticleEngine.position),
|
GameLib.API.Vector3.FromObject(objectParticleEngine.position),
|
||||||
GameLib.API.Vector3.FromObject(objectParticleEngine.direction),
|
GameLib.API.Vector3.FromObject(objectParticleEngine.direction),
|
||||||
|
GameLib.API.Vector3.FromObject(objectParticleEngine.lookAt),
|
||||||
objectParticleEngine.particlesPerSecond,
|
objectParticleEngine.particlesPerSecond,
|
||||||
|
objectParticleEngine.frequency,
|
||||||
|
objectParticleEngine.elapsed,
|
||||||
objectParticleEngine.distanceType,
|
objectParticleEngine.distanceType,
|
||||||
objectParticleEngine.minDistance,
|
objectParticleEngine.minDistance,
|
||||||
objectParticleEngine.maxDistance,
|
objectParticleEngine.maxDistance,
|
||||||
|
|
|
@ -24,10 +24,14 @@ GameLib.D3.ParticleEngine = function(
|
||||||
this,
|
this,
|
||||||
apiParticleEngine.id,
|
apiParticleEngine.id,
|
||||||
apiParticleEngine.name,
|
apiParticleEngine.name,
|
||||||
|
apiParticleEngine.meshes,
|
||||||
apiParticleEngine.materials,
|
apiParticleEngine.materials,
|
||||||
apiParticleEngine.position,
|
apiParticleEngine.position,
|
||||||
apiParticleEngine.direction,
|
apiParticleEngine.direction,
|
||||||
|
apiParticleEngine.lookAt,
|
||||||
apiParticleEngine.particlesPerSecond,
|
apiParticleEngine.particlesPerSecond,
|
||||||
|
apiParticleEngine.frequency,
|
||||||
|
apiParticleEngine.elapsed,
|
||||||
apiParticleEngine.distanceType,
|
apiParticleEngine.distanceType,
|
||||||
apiParticleEngine.minDistance,
|
apiParticleEngine.minDistance,
|
||||||
apiParticleEngine.maxDistance,
|
apiParticleEngine.maxDistance,
|
||||||
|
@ -40,6 +44,17 @@ GameLib.D3.ParticleEngine = function(
|
||||||
apiParticleEngine.parentEntity
|
apiParticleEngine.parentEntity
|
||||||
);
|
);
|
||||||
|
|
||||||
|
this.meshes = this.meshes.map(
|
||||||
|
function(mesh) {
|
||||||
|
if (mesh instanceof GameLib.D3.API.Mesh) {
|
||||||
|
return new GameLib.D3.Mesh(
|
||||||
|
graphics,
|
||||||
|
mesh
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
this.materials = this.materials.map(
|
this.materials = this.materials.map(
|
||||||
function(material) {
|
function(material) {
|
||||||
if (material instanceof GameLib.D3.API.Material) {
|
if (material instanceof GameLib.D3.API.Material) {
|
||||||
|
@ -73,11 +88,23 @@ GameLib.D3.ParticleEngine = function(
|
||||||
throw new Error('direction not instance of API.Vector3');
|
throw new Error('direction not instance of API.Vector3');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (this.lookAt instanceof GameLib.API.Vector3) {
|
||||||
|
this.lookAt = new GameLib.Vector3(
|
||||||
|
graphics,
|
||||||
|
this.lookAt,
|
||||||
|
this
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
console.warn('lookAt not instance of API.Vector3');
|
||||||
|
throw new Error('lookAt not instance of API.Vector3');
|
||||||
|
}
|
||||||
|
|
||||||
GameLib.Component.call(
|
GameLib.Component.call(
|
||||||
this,
|
this,
|
||||||
GameLib.Component.COMPONENT_PARTICLE_ENGINE,
|
GameLib.Component.COMPONENT_PARTICLE_ENGINE,
|
||||||
{
|
{
|
||||||
materials : [GameLib.D3.Material]
|
meshes : [GameLib.D3.Mesh],
|
||||||
|
materials : [GameLib.D3.Material]
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
|
@ -95,7 +122,55 @@ GameLib.D3.ParticleEngine.ROTATION_TYPE_CONSTANT = 0x1;
|
||||||
* @returns true
|
* @returns true
|
||||||
*/
|
*/
|
||||||
GameLib.D3.ParticleEngine.prototype.createInstance = function() {
|
GameLib.D3.ParticleEngine.prototype.createInstance = function() {
|
||||||
this.instance = true;
|
|
||||||
|
this.frequency = Number(1 / this.particlesPerSecond);
|
||||||
|
|
||||||
|
for (var i = 0; i < this.frequency; i++) {
|
||||||
|
|
||||||
|
var parentMesh = null;
|
||||||
|
|
||||||
|
if (i !== 0) {
|
||||||
|
parentMesh = this.meshes[0];
|
||||||
|
}
|
||||||
|
|
||||||
|
var apiMesh = new GameLib.D3.API.Mesh(
|
||||||
|
null,
|
||||||
|
GameLib.D3.Mesh.MESH_TYPE_PLANE,
|
||||||
|
'Particle Mesh',
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
this.materials,
|
||||||
|
parentMesh
|
||||||
|
);
|
||||||
|
|
||||||
|
var mesh = new GameLib.D3.Mesh.Plane(
|
||||||
|
this.graphics,
|
||||||
|
apiMesh,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1
|
||||||
|
);
|
||||||
|
|
||||||
|
this.meshes.push(mesh);
|
||||||
|
}
|
||||||
|
|
||||||
|
this.instance = {
|
||||||
|
position : this.position.instance,
|
||||||
|
direction : this.direction.instance,
|
||||||
|
lookAt : this.lookAt.instance,
|
||||||
|
meshes : this.meshes.map(
|
||||||
|
function(mesh) {
|
||||||
|
return mesh.instance
|
||||||
|
}
|
||||||
|
),
|
||||||
|
materials : this.materials.map(
|
||||||
|
function(material) {
|
||||||
|
return material.instance
|
||||||
|
}
|
||||||
|
)
|
||||||
|
};
|
||||||
|
|
||||||
GameLib.Component.prototype.createInstance.call(this);
|
GameLib.Component.prototype.createInstance.call(this);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -103,7 +178,7 @@ GameLib.D3.ParticleEngine.prototype.createInstance = function() {
|
||||||
* Updates the instance with the current state
|
* Updates the instance with the current state
|
||||||
*/
|
*/
|
||||||
GameLib.D3.ParticleEngine.prototype.updateInstance = function() {
|
GameLib.D3.ParticleEngine.prototype.updateInstance = function() {
|
||||||
this.instance = true;
|
GameLib.Event.Emit(GameLib.Event.PARTICLE_INSTANCE_UPDATED, {component:this});
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -116,6 +191,11 @@ GameLib.D3.ParticleEngine.prototype.toApiObject = function() {
|
||||||
|
|
||||||
this.id,
|
this.id,
|
||||||
this.name,
|
this.name,
|
||||||
|
this.meshes.map(
|
||||||
|
function(mesh){
|
||||||
|
return GameLib.Utils.IdOrNull(mesh);
|
||||||
|
}
|
||||||
|
),
|
||||||
this.materials.map(
|
this.materials.map(
|
||||||
function(material){
|
function(material){
|
||||||
return GameLib.Utils.IdOrNull(material);
|
return GameLib.Utils.IdOrNull(material);
|
||||||
|
@ -123,7 +203,10 @@ GameLib.D3.ParticleEngine.prototype.toApiObject = function() {
|
||||||
),
|
),
|
||||||
this.position.toApiObject(),
|
this.position.toApiObject(),
|
||||||
this.direction.toApiObject(),
|
this.direction.toApiObject(),
|
||||||
|
this.lookAt.toApiObject(),
|
||||||
this.particlesPerSecond,
|
this.particlesPerSecond,
|
||||||
|
this.frequency,
|
||||||
|
this.elapsed,
|
||||||
this.distanceType,
|
this.distanceType,
|
||||||
this.minDistance,
|
this.minDistance,
|
||||||
this.maxDistance,
|
this.maxDistance,
|
||||||
|
|
|
@ -23,6 +23,8 @@ GameLib.System.Particle = function(
|
||||||
*/
|
*/
|
||||||
this.engines = [];
|
this.engines = [];
|
||||||
|
|
||||||
|
this.totalTime = 0;
|
||||||
|
|
||||||
this.beforeRenderSubscription = null;
|
this.beforeRenderSubscription = null;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -36,15 +38,18 @@ GameLib.System.Particle.prototype.start = function() {
|
||||||
|
|
||||||
GameLib.System.prototype.start.call(this);
|
GameLib.System.prototype.start.call(this);
|
||||||
|
|
||||||
this.particleObjects = GameLib.EntityManager.Instance.queryComponents(GameLib.D3.ParticleEngine);
|
this.particleEngines = GameLib.EntityManager.Instance.queryComponents(GameLib.D3.ParticleEngine);
|
||||||
|
|
||||||
this.particleObjects.map(this.initialize.bind(this));
|
|
||||||
|
|
||||||
this.instanceCreatedSubscription = GameLib.Event.Subscribe(
|
this.instanceCreatedSubscription = GameLib.Event.Subscribe(
|
||||||
GameLib.Event.INSTANCE_CREATED,
|
GameLib.Event.INSTANCE_CREATED,
|
||||||
this.instanceCreated.bind(this)
|
this.instanceCreated.bind(this)
|
||||||
);
|
);
|
||||||
|
|
||||||
|
this.instanceUpdatedSubscription = GameLib.Event.Subscribe(
|
||||||
|
GameLib.Event.PARTICLE_INSTANCE_UPDATED,
|
||||||
|
this.instanceUpdated.bind(this)
|
||||||
|
);
|
||||||
|
|
||||||
this.removeComponentSubscription = GameLib.Event.Subscribe(
|
this.removeComponentSubscription = GameLib.Event.Subscribe(
|
||||||
GameLib.Event.REMOVE_COMPONENT,
|
GameLib.Event.REMOVE_COMPONENT,
|
||||||
this.removeComponent.bind(this)
|
this.removeComponent.bind(this)
|
||||||
|
@ -57,51 +62,6 @@ GameLib.System.Particle.prototype.start = function() {
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
|
||||||
* This function does alot of work we want do have done, but we don't want to do it during 'before render' - since we
|
|
||||||
* don't want to waste cpu power
|
|
||||||
* @param component
|
|
||||||
*/
|
|
||||||
GameLib.System.Particle.prototype.initialize = function(component) {
|
|
||||||
|
|
||||||
var lookAt = GameLib.EntityManager.Instance.defaultRenderer.camera.lookAt.instance.clone().negate();
|
|
||||||
var frequency = Number(1 / component.particlesPerSecond);
|
|
||||||
|
|
||||||
var meshes = [];
|
|
||||||
for (var i = 0; i < frequency; i++) {
|
|
||||||
|
|
||||||
var apiMesh = new GameLib.D3.API.Mesh(
|
|
||||||
null,
|
|
||||||
GameLib.D3.Mesh.MESH_TYPE_PLANE,
|
|
||||||
'Particle Mesh',
|
|
||||||
null,
|
|
||||||
null,
|
|
||||||
component.materials
|
|
||||||
);
|
|
||||||
|
|
||||||
var mesh = new GameLib.D3.Mesh.Plane(
|
|
||||||
this.graphics,
|
|
||||||
apiMesh,
|
|
||||||
1,
|
|
||||||
1,
|
|
||||||
1,
|
|
||||||
1
|
|
||||||
);
|
|
||||||
|
|
||||||
meshes.push(mesh);
|
|
||||||
}
|
|
||||||
|
|
||||||
var engine = {
|
|
||||||
component : component,
|
|
||||||
elapsed : 0,
|
|
||||||
frequency : frequency,
|
|
||||||
lookAt : lookAt,
|
|
||||||
meshes : meshes
|
|
||||||
};
|
|
||||||
|
|
||||||
this.engines.push(engine);
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* From now on we want to track everything about a component, only from the systems that are active
|
* From now on we want to track everything about a component, only from the systems that are active
|
||||||
* @param data
|
* @param data
|
||||||
|
@ -110,12 +70,25 @@ GameLib.System.Particle.prototype.instanceCreated = function(data) {
|
||||||
|
|
||||||
if (data.component instanceof GameLib.D3.ParticleEngine) {
|
if (data.component instanceof GameLib.D3.ParticleEngine) {
|
||||||
console.log('new particle engine');
|
console.log('new particle engine');
|
||||||
this.particleObjects.push(data.component);
|
this.particleEngines.push(data.component);
|
||||||
this.initialize(data.component);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
GameLib.System.Particle.prototype.instanceUpdated = function(data) {
|
||||||
|
|
||||||
|
//if (data.component instanceof GameLib.D3.ParticleEngine) {
|
||||||
|
|
||||||
|
console.log('particle engine updated : ' + data.component.name);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
//this.particleEngines.push(data.component);
|
||||||
|
//this.initialize(data.component);
|
||||||
|
//}
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Removes a particle engine from this system
|
* Removes a particle engine from this system
|
||||||
* @param data
|
* @param data
|
||||||
|
@ -124,22 +97,13 @@ GameLib.System.Particle.prototype.removeComponent = function(data) {
|
||||||
|
|
||||||
if (data.component instanceof GameLib.D3.ParticleEngine) {
|
if (data.component instanceof GameLib.D3.ParticleEngine) {
|
||||||
|
|
||||||
var index = this.particleObjects.indexOf(data.component);
|
var index = this.particleEngines.indexOf(data.component);
|
||||||
|
|
||||||
if (index !== -1) {
|
if (index !== -1) {
|
||||||
console.log('removing particle engine from system');
|
console.log('removing particle engine from system');
|
||||||
|
|
||||||
this.particleObjects.splice(index, 1);
|
this.particleEngines.splice(index, 1);
|
||||||
|
|
||||||
this.engines = this.engines.reduce(
|
|
||||||
function(result, engine){
|
|
||||||
if (engine.component !== data.component) {
|
|
||||||
result.push(engine);
|
|
||||||
}
|
|
||||||
return result;
|
|
||||||
},
|
|
||||||
[]
|
|
||||||
);
|
|
||||||
} else {
|
} else {
|
||||||
console.log('failed to find the particle engine in the system : ' + data.component.name);
|
console.log('failed to find the particle engine in the system : ' + data.component.name);
|
||||||
}
|
}
|
||||||
|
@ -155,14 +119,14 @@ GameLib.System.Particle.prototype.beforeRender = function(data) {
|
||||||
|
|
||||||
this.totalTime += data.delta;
|
this.totalTime += data.delta;
|
||||||
|
|
||||||
this.engines.map(
|
this.particleEngines.map(
|
||||||
function(engine) {
|
function(particleEngine) {
|
||||||
|
|
||||||
engine.elapsed += data.delta;
|
particleEngine.elapsed += data.delta;
|
||||||
|
|
||||||
if (engine.elapsed > engine.frequency) {
|
if (particleEngine.elapsed > particleEngine.frequency) {
|
||||||
engine.elapsed = 0;
|
particleEngine.elapsed = 0;
|
||||||
console.log('spawn time');
|
console.log('change time');
|
||||||
}
|
}
|
||||||
|
|
||||||
}.bind(this)
|
}.bind(this)
|
||||||
|
@ -179,6 +143,7 @@ GameLib.System.Particle.prototype.stop = function() {
|
||||||
GameLib.System.prototype.stop.call(this);
|
GameLib.System.prototype.stop.call(this);
|
||||||
|
|
||||||
this.instanceCreatedSubscription.remove();
|
this.instanceCreatedSubscription.remove();
|
||||||
|
this.instanceUpdatedSubscription.remove();
|
||||||
this.removeComponentSubscription.remove();
|
this.removeComponentSubscription.remove();
|
||||||
this.beforeRenderSubscription.remove();
|
this.beforeRenderSubscription.remove();
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue