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 { camera } = useThree();
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 || !listener || !buffer) {
176
+ if (!audio || !buffer) {
203
177
  return;
204
178
  }
205
- void listener.context.resume();
206
- if (audio.isPlaying) {
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
- 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] }));
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,
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.88",
4
4
  "description": "high performance 3D game engine built in React",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.js",