UNPKG

lingo3d

Version:

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

154 lines 4.49 kB
import store, { Reactive, createEffect } from "@lincode/reactivity"; import { AudioListener, PositionalAudio } from "three"; import { audioDefaults, audioSchema } from "../interface/IAudio"; import HelperSprite from "./core/utils/HelperSprite"; import loadAudio from "./utils/loaders/loadAudio"; import { getEditorHelper } from "../states/useEditorHelper"; import MeshAppendable from "./core/MeshAppendable"; import { cameraRenderedPtr } from "../pointers/cameraRenderedPtr"; import { getCameraRendered } from "../states/useCameraRendered"; const audioListener = new AudioListener(); createEffect(() => { const [cam] = cameraRenderedPtr; cam.add(audioListener); return () => { cam.remove(audioListener); }; }, [getCameraRendered]); class Audio extends MeshAppendable { static componentName = "audio"; static defaults = audioDefaults; static schema = audioSchema; constructor() { const sound = new PositionalAudio(audioListener); super(sound); this.createEffect(() => { if (!getEditorHelper || this.$disableSceneGraph) return; const helper = new HelperSprite("audio", this); return () => { helper.dispose(); }; }, [getEditorHelper]); 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 ]); } disposeNode() { super.disposeNode(); this.outerObject3d.buffer && this.outerObject3d.disconnect(); } 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); } } export default Audio; //# sourceMappingURL=Audio.js.map