mdx-m3-viewer
Version:
A browser WebGL model viewer. Mainly focused on models of the games Warcraft 3 and Starcraft 2.
94 lines (79 loc) • 2.08 kB
JavaScript
/**
* An MDX sound emitter.
*/
export default class EventObjectSndEmitter {
/**
* @param {EventEmitter} modelObject
*/
constructor(modelObject) {
this.modelObject = modelObject;
/**
* Does nothing.
* Defined to stay compatible with Emitter.
*
* @member {number}
*/
this.alive = 0;
}
/**
* @param {*} emitterView
*/
fill(emitterView) {
let emission = emitterView.currentEmission;
if (emission >= 1) {
for (let i = 0; i < emission; i += 1, emitterView.currentEmission--) {
this.emit(emitterView);
}
}
}
/**
* @param {EventObjectEmitterView} emitterView
*/
emit(emitterView) {
if (this.modelObject.ok) {
let viewer = this.modelObject.model.viewer;
let scene = emitterView.instance.scene;
// Is audio enabled both viewer-wide and in this scene?
if (viewer.enableAudio && scene.audioEnabled) {
let audioContext = scene.audioContext;
let emitter = emitterView.emitter;
let decodedBuffers = emitter.decodedBuffers;
let panner = audioContext.createPanner();
let source = audioContext.createBufferSource();
// Panner settings.
panner.setPosition(...emitterView.instance.nodes[emitter.objectId].worldLocation);
panner.maxDistance = emitter.distanceCutoff;
panner.refDistance = emitter.minDistance;
panner.connect(audioContext.destination);
// Source.
source.buffer = decodedBuffers[(Math.random() * decodedBuffers.length) | 0];
source.connect(panner);
// Make a sound.
source.start(0);
}
}
}
/**
* Does nothing.
* Defined to stay compatible with Emitter.
*/
update() {
}
/**
* Does nothing.
* Defined to stay compatible with Emitter.
*
* @param {ModelView} modelView
* @param {ShaderProgram} shader
*/
render(modelView, shader) {
}
/**
* Does nothing.
* Defined to stay compatible with Emitter.
*
* @param {ModelInstance} owner
*/
clear(owner) {
}
}