UNPKG

mylingo3d

Version:

Lingo3D is a React/Vue 3d game development framework that ships with a complete visual editor

167 lines 5.2 kB
import store, { createEffect, Reactive } from "@lincode/reactivity"; import { AudioListener, PositionalAudio } from "three"; import PositionedItem from "../api/core/PositionedItem"; import mainCamera from "../engine/mainCamera"; import scene from "../engine/scene"; import { onSelectionTarget, emitSelectionTarget } from "../events/onSelectionTarget"; import { audioDefaults, audioSchema } from "../interface/IAudio"; import { getCameraRendered } from "../states/useCameraRendered"; import makeAudioSprite from "./core/utils/makeAudioSprite"; import loadAudio from "./utils/loaders/loadAudio"; const [setAudioListener, getAudioListener] = store(undefined); createEffect(() => { const audioListener = getAudioListener(); if (!audioListener) return; const cam = getCameraRendered(); cam.add(audioListener); return () => { cam.remove(audioListener); }; }, [getCameraRendered, getAudioListener]); export default class Audio extends PositionedItem { static componentName = "audio"; static defaults = audioDefaults; static schema = audioSchema; constructor() { !getAudioListener() && setAudioListener(new AudioListener()); const sound = new PositionalAudio(getAudioListener()); super(sound); scene.add(sound); this.createEffect(() => { if (getCameraRendered() !== mainCamera) return; const sprite = makeAudioSprite(); this.outerObject3d.add(sprite.outerObject3d); const handle = onSelectionTarget(({ target }) => { target === sprite && emitSelectionTarget(this); }); return () => { sprite.dispose(); handle.cancel(); }; }, [getCameraRendered]); const [setReady, getReady] = store(false); this.createEffect(() => { const src = this.srcState.get(); if (!src) return; let proceed = true; loadAudio(src).then((buffer) => { if (!proceed) return; sound.setBuffer(buffer); setReady(true); }); return () => { proceed = false; setReady(false); }; }, [this.srcState.get]); this.createEffect(() => { if (!getReady() || !this.autoplayState.get() || this.pausedState.get() || this.stoppedState.get()) return; sound.play(); return () => { this.stoppedState.get() ? sound.stop() : sound.pause(); }; }, [ getReady, this.autoplayState.get, this.pausedState.get, this.stoppedState.get ]); } dispose() { if (this.done) return this; super.dispose(); this.outerObject3d.buffer && this.outerObject3d.disconnect(); return this; } play() { this.autoplay = true; this.paused = false; this.stopped = false; } pause() { this.paused = true; } stop() { this.stopped = true; } srcState = new Reactive(undefined); get src() { return this.srcState.get(); } set src(val) { this.srcState.set(val); } autoplayState = new Reactive(false); get autoplay() { return this.autoplayState.get(); } set autoplay(val) { this.autoplayState.set(val); } pausedState = new Reactive(false); get paused() { return this.pausedState.get(); } set paused(val) { this.pausedState.set(val); } stoppedState = new Reactive(false); get stopped() { return this.stoppedState.get(); } set stopped(val) { this.stoppedState.set(val); } get loop() { return this.outerObject3d.loop; } set loop(val) { this.outerObject3d.loop = val; } get volume() { return this.outerObject3d.getVolume(); } set volume(val) { this.outerObject3d.setVolume(val); } get playbackRate() { return this.outerObject3d.playbackRate; } set playbackRate(val) { this.outerObject3d.playbackRate = val; } get distance() { return this.outerObject3d.getRefDistance(); } set distance(val) { this.outerObject3d.setRefDistance(val); } get distanceModel() { return this.outerObject3d.getDistanceModel(); } set distanceModel(val) { this.outerObject3d.setDistanceModel(val); } get maxDistance() { return this.outerObject3d.getMaxDistance(); } set maxDistance(val) { this.outerObject3d.setMaxDistance(val); } get rolloffFactor() { return this.outerObject3d.getRolloffFactor(); } set rolloffFactor(val) { this.outerObject3d.setRolloffFactor(val); } } //# sourceMappingURL=Audio.js.map