react-three-game 0.0.87 → 0.0.89

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.
@@ -2,7 +2,6 @@ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-run
2
2
  import { useEffect, useRef } from 'react';
3
3
  import { useThree } from '@react-three/fiber';
4
4
  import { SoundPicker } from '../../assetviewer/page';
5
- import { sound as soundManager } from '../../../helpers/SoundManager';
6
5
  import { useAssetRuntime, useEntityRuntime } from '../assetRuntime';
7
6
  import { gameEvents } from '../GameEvents';
8
7
  import { BooleanField, FieldGroup, FieldRenderer, ListEditor, NumberField, SelectField, StringField } from './Input';
@@ -78,6 +77,17 @@ function payloadMatchesNode(nodeId, payload) {
78
77
  ].filter((value) => typeof value === 'string');
79
78
  return relatedNodeIds.length > 0 ? relatedNodeIds.includes(nodeId) : true;
80
79
  }
80
+ function playBufferedAudio(audio, buffer, properties) {
81
+ void audio.listener.context.resume();
82
+ if (audio.isPlaying) {
83
+ audio.stop();
84
+ }
85
+ audio.setBuffer(buffer);
86
+ audio.setLoop(Boolean(properties.loop));
87
+ audio.setPlaybackRate(getPitchValue(properties));
88
+ audio.setVolume(getVolumeValue(properties));
89
+ audio.play();
90
+ }
81
91
  function SoundComponentEditor({ component, onUpdate, basePath = '' }) {
82
92
  const clips = Array.isArray(component.properties.clips)
83
93
  ? component.properties.clips.map((clip) => typeof clip === 'string' ? clip : '')
@@ -99,7 +109,7 @@ function SoundComponentEditor({ component, onUpdate, basePath = '' }) {
99
109
  const removeClip = (index) => {
100
110
  setClips(clips.filter((_, clipIndex) => clipIndex !== index));
101
111
  };
102
- return (_jsxs(FieldGroup, { children: [_jsx(StringField, { name: "eventName", label: "Listen Event", values: component.properties, onChange: onUpdate, placeholder: "player:footstep" }), _jsx(FieldRenderer, { fields: [
112
+ 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
113
  {
104
114
  name: 'clipMode',
105
115
  label: 'Clip Mode',
@@ -134,7 +144,7 @@ function SoundComponentView({ properties, children }) {
134
144
  const { getSound } = useAssetRuntime();
135
145
  const { editMode, nodeId } = useEntityRuntime();
136
146
  const { camera } = useThree();
137
- const { eventName, positional = false, refDistance = 1, maxDistance = 24, rolloffFactor = 1, distanceModel = 'inverse' } = properties;
147
+ const { eventName, autoplay = false, positional = false, refDistance = 1, maxDistance = 24, rolloffFactor = 1, distanceModel = 'inverse' } = properties;
138
148
  const sequenceIndexRef = useRef(0);
139
149
  const listenerRef = useRef(null);
140
150
  const positionalAudioRef = useRef(null);
@@ -144,9 +154,6 @@ function SoundComponentView({ properties, children }) {
144
154
  }
145
155
  useEffect(() => {
146
156
  var _a;
147
- if (!positional) {
148
- return;
149
- }
150
157
  const listener = listenerRef.current;
151
158
  if (!listener) {
152
159
  return;
@@ -160,17 +167,17 @@ function SoundComponentView({ properties, children }) {
160
167
  camera.remove(listener);
161
168
  }
162
169
  };
163
- }, [camera, positional]);
170
+ }, [camera]);
164
171
  useEffect(() => {
165
172
  const audio = positionalAudioRef.current;
166
173
  if (!audio) {
167
174
  return;
168
175
  }
169
- audio.setRefDistance(refDistance);
170
- audio.setMaxDistance(maxDistance);
171
- audio.setRolloffFactor(rolloffFactor);
172
- audio.setDistanceModel(distanceModel);
173
- }, [distanceModel, maxDistance, refDistance, rolloffFactor]);
176
+ audio.setRefDistance(positional ? refDistance : Math.max(refDistance, 1));
177
+ audio.setMaxDistance(positional ? maxDistance : 1000000);
178
+ audio.setRolloffFactor(positional ? rolloffFactor : 0);
179
+ audio.setDistanceModel(positional ? distanceModel : 'inverse');
180
+ }, [distanceModel, maxDistance, positional, refDistance, rolloffFactor]);
174
181
  useEffect(() => {
175
182
  if (editMode || paths.length === 0 || !eventName) {
176
183
  return;
@@ -182,38 +189,35 @@ function SoundComponentView({ properties, children }) {
182
189
  const clip = pickClip(paths, mode, sequenceIndexRef);
183
190
  if (!clip)
184
191
  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
192
  const audio = positionalAudioRef.current;
200
- const listener = listenerRef.current;
201
193
  const buffer = getSound(clip);
202
- if (!audio || !listener || !buffer) {
194
+ if (!audio || !buffer) {
203
195
  return;
204
196
  }
205
- void listener.context.resume();
206
- if (audio.isPlaying) {
197
+ playBufferedAudio(audio, buffer, properties);
198
+ });
199
+ }, [editMode, eventName, getSound, mode, nodeId, paths, properties]);
200
+ useEffect(() => {
201
+ if (editMode || !autoplay || paths.length === 0) {
202
+ return;
203
+ }
204
+ const clip = pickClip(paths, mode, sequenceIndexRef);
205
+ if (!clip) {
206
+ return;
207
+ }
208
+ const audio = positionalAudioRef.current;
209
+ const buffer = getSound(clip);
210
+ if (!audio || !buffer) {
211
+ return;
212
+ }
213
+ playBufferedAudio(audio, buffer, properties);
214
+ return () => {
215
+ if (audio === null || audio === void 0 ? void 0 : audio.isPlaying) {
207
216
  audio.stop();
208
217
  }
209
- audio.setBuffer(buffer);
210
- audio.setLoop(false);
211
- audio.setPlaybackRate(pitch);
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] }));
218
+ };
219
+ }, [autoplay, editMode, getSound, mode, paths, properties]);
220
+ return (_jsxs(_Fragment, { children: [listenerRef.current ? _jsx("positionalAudio", { ref: positionalAudioRef, args: [listenerRef.current] }) : null, children] }));
217
221
  }
218
222
  const SoundComponent = {
219
223
  name: 'Sound',
@@ -221,6 +225,8 @@ const SoundComponent = {
221
225
  View: SoundComponentView,
222
226
  defaultProperties: {
223
227
  eventName: '',
228
+ autoplay: false,
229
+ loop: false,
224
230
  clips: [],
225
231
  clipMode: 'single',
226
232
  positional: false,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "react-three-game",
3
- "version": "0.0.87",
3
+ "version": "0.0.89",
4
4
  "description": "high performance 3D game engine built in React",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.js",