react-three-game 0.0.87 → 0.0.88
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -1,8 +1,6 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
2
|
import { useEffect, useRef } from 'react';
|
|
3
|
-
import { useThree } from '@react-three/fiber';
|
|
4
3
|
import { SoundPicker } from '../../assetviewer/page';
|
|
5
|
-
import { sound as soundManager } from '../../../helpers/SoundManager';
|
|
6
4
|
import { useAssetRuntime, useEntityRuntime } from '../assetRuntime';
|
|
7
5
|
import { gameEvents } from '../GameEvents';
|
|
8
6
|
import { BooleanField, FieldGroup, FieldRenderer, ListEditor, NumberField, SelectField, StringField } from './Input';
|
|
@@ -78,6 +76,17 @@ function payloadMatchesNode(nodeId, payload) {
|
|
|
78
76
|
].filter((value) => typeof value === 'string');
|
|
79
77
|
return relatedNodeIds.length > 0 ? relatedNodeIds.includes(nodeId) : true;
|
|
80
78
|
}
|
|
79
|
+
function playBufferedAudio(audio, buffer, properties) {
|
|
80
|
+
void audio.listener.context.resume();
|
|
81
|
+
if (audio.isPlaying) {
|
|
82
|
+
audio.stop();
|
|
83
|
+
}
|
|
84
|
+
audio.setBuffer(buffer);
|
|
85
|
+
audio.setLoop(Boolean(properties.loop));
|
|
86
|
+
audio.setPlaybackRate(getPitchValue(properties));
|
|
87
|
+
audio.setVolume(getVolumeValue(properties));
|
|
88
|
+
audio.play();
|
|
89
|
+
}
|
|
81
90
|
function SoundComponentEditor({ component, onUpdate, basePath = '' }) {
|
|
82
91
|
const clips = Array.isArray(component.properties.clips)
|
|
83
92
|
? component.properties.clips.map((clip) => typeof clip === 'string' ? clip : '')
|
|
@@ -99,7 +108,7 @@ function SoundComponentEditor({ component, onUpdate, basePath = '' }) {
|
|
|
99
108
|
const removeClip = (index) => {
|
|
100
109
|
setClips(clips.filter((_, clipIndex) => clipIndex !== index));
|
|
101
110
|
};
|
|
102
|
-
return (_jsxs(FieldGroup, { children: [_jsx(StringField, { name: "eventName", label: "Listen Event", values: component.properties, onChange: onUpdate, placeholder: "player:footstep" }), _jsx(FieldRenderer, { fields: [
|
|
111
|
+
return (_jsxs(FieldGroup, { children: [_jsx(StringField, { name: "eventName", label: "Listen Event", values: component.properties, onChange: onUpdate, placeholder: "player:footstep" }), _jsx(BooleanField, { name: "autoplay", label: "Autoplay", values: component.properties, onChange: onUpdate, fallback: false }), _jsx(BooleanField, { name: "loop", label: "Loop", values: component.properties, onChange: onUpdate, fallback: false }), _jsx(FieldRenderer, { fields: [
|
|
103
112
|
{
|
|
104
113
|
name: 'clipMode',
|
|
105
114
|
label: 'Clip Mode',
|
|
@@ -133,8 +142,7 @@ function SoundComponentEditor({ component, onUpdate, basePath = '' }) {
|
|
|
133
142
|
function SoundComponentView({ properties, children }) {
|
|
134
143
|
const { getSound } = useAssetRuntime();
|
|
135
144
|
const { editMode, nodeId } = useEntityRuntime();
|
|
136
|
-
const {
|
|
137
|
-
const { eventName, positional = false, refDistance = 1, maxDistance = 24, rolloffFactor = 1, distanceModel = 'inverse' } = properties;
|
|
145
|
+
const { eventName, autoplay = false, positional = false, refDistance = 1, maxDistance = 24, rolloffFactor = 1, distanceModel = 'inverse' } = properties;
|
|
138
146
|
const sequenceIndexRef = useRef(0);
|
|
139
147
|
const listenerRef = useRef(null);
|
|
140
148
|
const positionalAudioRef = useRef(null);
|
|
@@ -142,35 +150,16 @@ function SoundComponentView({ properties, children }) {
|
|
|
142
150
|
if (!listenerRef.current) {
|
|
143
151
|
listenerRef.current = getSharedAudioListener();
|
|
144
152
|
}
|
|
145
|
-
useEffect(() => {
|
|
146
|
-
var _a;
|
|
147
|
-
if (!positional) {
|
|
148
|
-
return;
|
|
149
|
-
}
|
|
150
|
-
const listener = listenerRef.current;
|
|
151
|
-
if (!listener) {
|
|
152
|
-
return;
|
|
153
|
-
}
|
|
154
|
-
if (listener.parent !== camera) {
|
|
155
|
-
(_a = listener.parent) === null || _a === void 0 ? void 0 : _a.remove(listener);
|
|
156
|
-
camera.add(listener);
|
|
157
|
-
}
|
|
158
|
-
return () => {
|
|
159
|
-
if (listener.parent === camera) {
|
|
160
|
-
camera.remove(listener);
|
|
161
|
-
}
|
|
162
|
-
};
|
|
163
|
-
}, [camera, positional]);
|
|
164
153
|
useEffect(() => {
|
|
165
154
|
const audio = positionalAudioRef.current;
|
|
166
155
|
if (!audio) {
|
|
167
156
|
return;
|
|
168
157
|
}
|
|
169
|
-
audio.setRefDistance(refDistance);
|
|
170
|
-
audio.setMaxDistance(maxDistance);
|
|
171
|
-
audio.setRolloffFactor(rolloffFactor);
|
|
172
|
-
audio.setDistanceModel(distanceModel);
|
|
173
|
-
}, [distanceModel, maxDistance, refDistance, rolloffFactor]);
|
|
158
|
+
audio.setRefDistance(positional ? refDistance : Math.max(refDistance, 1));
|
|
159
|
+
audio.setMaxDistance(positional ? maxDistance : 1000000);
|
|
160
|
+
audio.setRolloffFactor(positional ? rolloffFactor : 0);
|
|
161
|
+
audio.setDistanceModel(positional ? distanceModel : 'inverse');
|
|
162
|
+
}, [distanceModel, maxDistance, positional, refDistance, rolloffFactor]);
|
|
174
163
|
useEffect(() => {
|
|
175
164
|
if (editMode || paths.length === 0 || !eventName) {
|
|
176
165
|
return;
|
|
@@ -182,38 +171,35 @@ function SoundComponentView({ properties, children }) {
|
|
|
182
171
|
const clip = pickClip(paths, mode, sequenceIndexRef);
|
|
183
172
|
if (!clip)
|
|
184
173
|
return;
|
|
185
|
-
const pitch = getPitchValue(properties);
|
|
186
|
-
const volume = getVolumeValue(properties);
|
|
187
|
-
if (!positional) {
|
|
188
|
-
const loadedBuffer = getSound(clip);
|
|
189
|
-
if (loadedBuffer && !soundManager.hasBuffer(clip)) {
|
|
190
|
-
soundManager.setBuffer(clip, loadedBuffer);
|
|
191
|
-
}
|
|
192
|
-
if (soundManager.hasBuffer(clip)) {
|
|
193
|
-
soundManager.playSync(clip, { pitch, volume });
|
|
194
|
-
return;
|
|
195
|
-
}
|
|
196
|
-
void soundManager.play(clip, { pitch, volume });
|
|
197
|
-
return;
|
|
198
|
-
}
|
|
199
174
|
const audio = positionalAudioRef.current;
|
|
200
|
-
const listener = listenerRef.current;
|
|
201
175
|
const buffer = getSound(clip);
|
|
202
|
-
if (!audio || !
|
|
176
|
+
if (!audio || !buffer) {
|
|
203
177
|
return;
|
|
204
178
|
}
|
|
205
|
-
|
|
206
|
-
|
|
179
|
+
playBufferedAudio(audio, buffer, properties);
|
|
180
|
+
});
|
|
181
|
+
}, [editMode, eventName, getSound, mode, nodeId, paths, properties]);
|
|
182
|
+
useEffect(() => {
|
|
183
|
+
if (editMode || !autoplay || paths.length === 0) {
|
|
184
|
+
return;
|
|
185
|
+
}
|
|
186
|
+
const clip = pickClip(paths, mode, sequenceIndexRef);
|
|
187
|
+
if (!clip) {
|
|
188
|
+
return;
|
|
189
|
+
}
|
|
190
|
+
const audio = positionalAudioRef.current;
|
|
191
|
+
const buffer = getSound(clip);
|
|
192
|
+
if (!audio || !buffer) {
|
|
193
|
+
return;
|
|
194
|
+
}
|
|
195
|
+
playBufferedAudio(audio, buffer, properties);
|
|
196
|
+
return () => {
|
|
197
|
+
if (audio === null || audio === void 0 ? void 0 : audio.isPlaying) {
|
|
207
198
|
audio.stop();
|
|
208
199
|
}
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
audio.setVolume(volume);
|
|
213
|
-
audio.play();
|
|
214
|
-
});
|
|
215
|
-
}, [editMode, eventName, getSound, mode, nodeId, paths, positional, properties]);
|
|
216
|
-
return (_jsxs(_Fragment, { children: [positional && listenerRef.current ? _jsx("positionalAudio", { ref: positionalAudioRef, args: [listenerRef.current] }) : null, children] }));
|
|
200
|
+
};
|
|
201
|
+
}, [autoplay, editMode, getSound, mode, paths, properties]);
|
|
202
|
+
return (_jsxs(_Fragment, { children: [listenerRef.current ? _jsx("positionalAudio", { ref: positionalAudioRef, args: [listenerRef.current] }) : null, children] }));
|
|
217
203
|
}
|
|
218
204
|
const SoundComponent = {
|
|
219
205
|
name: 'Sound',
|
|
@@ -221,6 +207,8 @@ const SoundComponent = {
|
|
|
221
207
|
View: SoundComponentView,
|
|
222
208
|
defaultProperties: {
|
|
223
209
|
eventName: '',
|
|
210
|
+
autoplay: false,
|
|
211
|
+
loop: false,
|
|
224
212
|
clips: [],
|
|
225
213
|
clipMode: 'single',
|
|
226
214
|
positional: false,
|