lingo3d
Version:
Lingo3D is a React/Vue 3d game development framework that ships with a complete visual editor
154 lines • 4.49 kB
JavaScript
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