UNPKG

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
/** * 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) { } }