mdx-m3-viewer
Version:
A browser WebGL model viewer. Mainly focused on models of the games Warcraft 3 and Starcraft 2.
68 lines (56 loc) • 2.6 kB
text/typescript
import ParticleEmitter from '../../../parsers/mdlx/particleemitter';
import MdxModel from './model';
import GenericObject from './genericobject';
/**
* An MDX particle emitter.
*/
export default class ParticleEmitterObject extends GenericObject {
internalModel: MdxModel;
speed: number;
latitude: number;
longitude: number;
lifeSpan: number;
gravity: number;
emissionRate: number;
/**
* No need to create instances of the internal model if it didn't load.
*
* Such instances won't actually render, and who knows if the model will ever load?
*/
ok: boolean = false;
constructor(model: MdxModel, emitter: ParticleEmitter, index: number) {
super(model, emitter, index);
this.internalModel = <MdxModel>model.viewer.load(emitter.path.replace(/\\/g, '/').toLowerCase().replace('.mdl', '.mdx'), model.pathSolver, model.solverParams);
this.speed = emitter.speed;
this.latitude = emitter.latitude;
this.longitude = emitter.longitude;
this.lifeSpan = emitter.lifeSpan;
this.gravity = emitter.gravity;
this.emissionRate = emitter.emissionRate;
// Activate emitters based on this emitter object only when and if the internal model loads successfully.
this.internalModel.whenLoaded(() => {
this.ok = this.internalModel.ok;
});
}
getSpeed(out: Float32Array, sequence: number, frame: number, counter: number) {
return this.getScalarValue(out, 'KPES', sequence, frame, counter, this.speed);
}
getLatitude(out: Float32Array, sequence: number, frame: number, counter: number) {
return this.getScalarValue(out, 'KPLTV', sequence, frame, counter, this.latitude);
}
getLongitude(out: Float32Array, sequence: number, frame: number, counter: number) {
return this.getScalarValue(out, 'KPLN', sequence, frame, counter, this.longitude);
}
getLifeSpan(out: Float32Array, sequence: number, frame: number, counter: number) {
return this.getScalarValue(out, 'KPEL', sequence, frame, counter, this.lifeSpan);
}
getGravity(out: Float32Array, sequence: number, frame: number, counter: number) {
return this.getScalarValue(out, 'KPEG', sequence, frame, counter, this.gravity);
}
getEmissionRate(out: Float32Array, sequence: number, frame: number, counter: number) {
return this.getScalarValue(out, 'KPEE', sequence, frame, counter, this.emissionRate);
}
getVisibility(out: Float32Array, sequence: number, frame: number, counter: number) {
return this.getScalarValue(out, 'KPEV', sequence, frame, counter, 1);
}
}