@xrift/world-components 0.47.0 → 0.50.0
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.
- package/dist/components/BillboardY/hooks.d.ts +1 -1
- package/dist/components/BillboardY/hooks.d.ts.map +1 -1
- package/dist/components/BillboardY/index.d.ts +1 -1
- package/dist/components/BillboardY/index.d.ts.map +1 -1
- package/dist/components/DevEnvironment/components/ControlsHelp.d.ts +1 -1
- package/dist/components/DevEnvironment/components/ControlsHelp.d.ts.map +1 -1
- package/dist/components/DevEnvironment/components/Crosshair.d.ts +1 -1
- package/dist/components/DevEnvironment/components/Crosshair.d.ts.map +1 -1
- package/dist/components/DevEnvironment/components/GrabSystem/index.d.ts +1 -1
- package/dist/components/DevEnvironment/components/GrabSystem/index.d.ts.map +1 -1
- package/dist/components/DevEnvironment/components/PhysicsPlayer.d.ts +1 -1
- package/dist/components/DevEnvironment/components/PhysicsPlayer.d.ts.map +1 -1
- package/dist/components/DevEnvironment/components/PointerLockStatus.d.ts +1 -1
- package/dist/components/DevEnvironment/components/PointerLockStatus.d.ts.map +1 -1
- package/dist/components/DevEnvironment/index.d.ts +1 -1
- package/dist/components/DevEnvironment/index.d.ts.map +1 -1
- package/dist/components/EntryLogBoard/components/AvatarIcon.d.ts +1 -1
- package/dist/components/EntryLogBoard/components/AvatarIcon.d.ts.map +1 -1
- package/dist/components/EntryLogBoard/components/LogRow.d.ts +1 -1
- package/dist/components/EntryLogBoard/components/LogRow.d.ts.map +1 -1
- package/dist/components/EntryLogBoard/index.d.ts +1 -1
- package/dist/components/EntryLogBoard/index.d.ts.map +1 -1
- package/dist/components/LiveVideoPlayer/components/ControlPanel/index.d.ts +1 -1
- package/dist/components/LiveVideoPlayer/components/ControlPanel/index.d.ts.map +1 -1
- package/dist/components/LiveVideoPlayer/components/LiveVideoTexture.d.ts +1 -1
- package/dist/components/LiveVideoPlayer/components/LiveVideoTexture.d.ts.map +1 -1
- package/dist/components/LiveVideoPlayer/index.d.ts +1 -1
- package/dist/components/LiveVideoPlayer/index.d.ts.map +1 -1
- package/dist/components/Mirror/index.d.ts +1 -1
- package/dist/components/Mirror/index.d.ts.map +1 -1
- package/dist/components/Portal/components/PortalGlow/index.d.ts +1 -1
- package/dist/components/Portal/components/PortalGlow/index.d.ts.map +1 -1
- package/dist/components/Portal/components/PortalParticles/index.d.ts +1 -1
- package/dist/components/Portal/components/PortalParticles/index.d.ts.map +1 -1
- package/dist/components/Portal/components/PortalPedestal/index.d.ts +1 -1
- package/dist/components/Portal/components/PortalPedestal/index.d.ts.map +1 -1
- package/dist/components/Portal/components/PortalThumbnail/index.d.ts +1 -1
- package/dist/components/Portal/components/PortalThumbnail/index.d.ts.map +1 -1
- package/dist/components/Portal/components/PortalVortex/index.d.ts +1 -1
- package/dist/components/Portal/components/PortalVortex/index.d.ts.map +1 -1
- package/dist/components/Portal/index.d.ts +1 -1
- package/dist/components/Portal/index.d.ts.map +1 -1
- package/dist/components/ScreenShareDisplay/index.d.ts +1 -1
- package/dist/components/ScreenShareDisplay/index.d.ts.map +1 -1
- package/dist/components/Seat/constants.d.ts +8 -0
- package/dist/components/Seat/constants.d.ts.map +1 -0
- package/dist/components/Seat/constants.js +7 -0
- package/dist/components/Seat/constants.js.map +1 -0
- package/dist/components/Seat/index.d.ts +15 -0
- package/dist/components/Seat/index.d.ts.map +1 -0
- package/dist/components/Seat/index.js +45 -0
- package/dist/components/Seat/index.js.map +1 -0
- package/dist/components/Seat/types.d.ts +39 -0
- package/dist/components/Seat/types.d.ts.map +1 -0
- package/dist/components/Seat/types.js.map +1 -0
- package/dist/components/Seat/utils.d.ts +24 -0
- package/dist/components/Seat/utils.d.ts.map +1 -0
- package/dist/components/Seat/utils.js +50 -0
- package/dist/components/Seat/utils.js.map +1 -0
- package/dist/components/Skybox/index.d.ts +1 -1
- package/dist/components/Skybox/index.d.ts.map +1 -1
- package/dist/components/TagBoard/components/TagChip.d.ts +1 -1
- package/dist/components/TagBoard/components/TagChip.d.ts.map +1 -1
- package/dist/components/TagBoard/components/TagDisplay/index.d.ts +1 -1
- package/dist/components/TagBoard/components/TagDisplay/index.d.ts.map +1 -1
- package/dist/components/TagBoard/components/TagSelector/components/ActionButton.d.ts +1 -1
- package/dist/components/TagBoard/components/TagSelector/components/ActionButton.d.ts.map +1 -1
- package/dist/components/TagBoard/components/TagSelector/components/TagButton.d.ts +1 -1
- package/dist/components/TagBoard/components/TagSelector/components/TagButton.d.ts.map +1 -1
- package/dist/components/TagBoard/components/TagSelector/index.d.ts +1 -1
- package/dist/components/TagBoard/components/TagSelector/index.d.ts.map +1 -1
- package/dist/components/TagBoard/index.d.ts +1 -1
- package/dist/components/TagBoard/index.d.ts.map +1 -1
- package/dist/components/Video180Sphere/EyeView.d.ts +1 -1
- package/dist/components/Video180Sphere/EyeView.d.ts.map +1 -1
- package/dist/components/Video180Sphere/index.d.ts +1 -1
- package/dist/components/Video180Sphere/index.d.ts.map +1 -1
- package/dist/components/VideoPlayer/components/ControlPanel.d.ts +1 -1
- package/dist/components/VideoPlayer/components/ControlPanel.d.ts.map +1 -1
- package/dist/components/VideoPlayer/index.d.ts +1 -1
- package/dist/components/VideoPlayer/index.d.ts.map +1 -1
- package/dist/components/VideoScreen/constants.d.ts +27 -0
- package/dist/components/VideoScreen/constants.d.ts.map +1 -0
- package/dist/components/VideoScreen/constants.js +27 -0
- package/dist/components/VideoScreen/constants.js.map +1 -0
- package/dist/components/VideoScreen/hooks.d.ts +19 -0
- package/dist/components/VideoScreen/hooks.d.ts.map +1 -0
- package/dist/components/VideoScreen/hooks.js +69 -0
- package/dist/components/VideoScreen/hooks.js.map +1 -0
- package/dist/components/VideoScreen/index.d.ts +1 -1
- package/dist/components/VideoScreen/index.d.ts.map +1 -1
- package/dist/components/VideoScreen/index.js +22 -17
- package/dist/components/VideoScreen/index.js.map +1 -1
- package/dist/components/VideoScreen/types.d.ts +14 -4
- package/dist/components/VideoScreen/types.d.ts.map +1 -1
- package/dist/components/VideoScreen/utils.d.ts +73 -0
- package/dist/components/VideoScreen/utils.d.ts.map +1 -0
- package/dist/components/VideoScreen/utils.js +74 -0
- package/dist/components/VideoScreen/utils.js.map +1 -0
- package/dist/components/commons/IconButton/index.d.ts +1 -1
- package/dist/components/commons/IconButton/index.d.ts.map +1 -1
- package/dist/components/commons/PlaceholderScreen/index.d.ts +1 -1
- package/dist/components/commons/PlaceholderScreen/index.d.ts.map +1 -1
- package/dist/components/commons/VideoMesh/index.d.ts +1 -1
- package/dist/components/commons/VideoMesh/index.d.ts.map +1 -1
- package/dist/components/commons/VolumeControl/index.d.ts +1 -1
- package/dist/components/commons/VolumeControl/index.d.ts.map +1 -1
- package/dist/contexts/AudioVolumeContext.d.ts +2 -2
- package/dist/contexts/AudioVolumeContext.d.ts.map +1 -1
- package/dist/contexts/ConfirmContext.d.ts +1 -1
- package/dist/contexts/ConfirmContext.d.ts.map +1 -1
- package/dist/contexts/FileInputContext.d.ts +1 -1
- package/dist/contexts/FileInputContext.d.ts.map +1 -1
- package/dist/contexts/GrabbableContext.d.ts +1 -1
- package/dist/contexts/GrabbableContext.d.ts.map +1 -1
- package/dist/contexts/InstanceContext.d.ts +1 -1
- package/dist/contexts/InstanceContext.d.ts.map +1 -1
- package/dist/contexts/InstanceEventContext.d.ts +1 -1
- package/dist/contexts/InstanceEventContext.d.ts.map +1 -1
- package/dist/contexts/InstanceStateContext.d.ts +1 -1
- package/dist/contexts/InstanceStateContext.d.ts.map +1 -1
- package/dist/contexts/ItemContext.d.ts +23 -3
- package/dist/contexts/ItemContext.d.ts.map +1 -1
- package/dist/contexts/ItemContext.js +7 -3
- package/dist/contexts/ItemContext.js.map +1 -1
- package/dist/contexts/PlacementStateContext.d.ts +1 -1
- package/dist/contexts/PlacementStateContext.d.ts.map +1 -1
- package/dist/contexts/ScreenShareContext.d.ts +1 -1
- package/dist/contexts/ScreenShareContext.d.ts.map +1 -1
- package/dist/contexts/SeatContext.d.ts +77 -0
- package/dist/contexts/SeatContext.d.ts.map +1 -0
- package/dist/contexts/SeatContext.js +33 -0
- package/dist/contexts/SeatContext.js.map +1 -0
- package/dist/contexts/ServerClockContext.d.ts +1 -1
- package/dist/contexts/ServerClockContext.d.ts.map +1 -1
- package/dist/contexts/SharedFileContext.d.ts +1 -1
- package/dist/contexts/SharedFileContext.d.ts.map +1 -1
- package/dist/contexts/SpawnPointContext.d.ts +1 -1
- package/dist/contexts/SpawnPointContext.d.ts.map +1 -1
- package/dist/contexts/TeleportContext.d.ts +1 -1
- package/dist/contexts/TeleportContext.d.ts.map +1 -1
- package/dist/contexts/TextInputContext.d.ts +1 -1
- package/dist/contexts/TextInputContext.d.ts.map +1 -1
- package/dist/contexts/UsersContext.d.ts +1 -1
- package/dist/contexts/UsersContext.d.ts.map +1 -1
- package/dist/contexts/WorldContext.d.ts +1 -1
- package/dist/contexts/WorldContext.d.ts.map +1 -1
- package/dist/contexts/WorldStorageContext.d.ts +1 -1
- package/dist/contexts/WorldStorageContext.d.ts.map +1 -1
- package/dist/contexts/XRiftContext.d.ts +7 -1
- package/dist/contexts/XRiftContext.d.ts.map +1 -1
- package/dist/contexts/XRiftContext.js +3 -1
- package/dist/contexts/XRiftContext.js.map +1 -1
- package/dist/index.d.ts +5 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -1
- package/package.json +7 -5
- package/dist/components/BillboardY/__tests__/utils.test.d.ts +0 -2
- package/dist/components/BillboardY/__tests__/utils.test.d.ts.map +0 -1
- package/dist/components/BillboardY/__tests__/utils.test.js +0 -45
- package/dist/components/BillboardY/__tests__/utils.test.js.map +0 -1
- package/dist/components/DevEnvironment/__tests__/utils.test.d.ts +0 -2
- package/dist/components/DevEnvironment/__tests__/utils.test.d.ts.map +0 -1
- package/dist/components/DevEnvironment/__tests__/utils.test.js +0 -24
- package/dist/components/DevEnvironment/__tests__/utils.test.js.map +0 -1
- package/dist/components/DevEnvironment/components/GrabSystem/__tests__/store.test.d.ts +0 -2
- package/dist/components/DevEnvironment/components/GrabSystem/__tests__/store.test.d.ts.map +0 -1
- package/dist/components/DevEnvironment/components/GrabSystem/__tests__/store.test.js +0 -114
- package/dist/components/DevEnvironment/components/GrabSystem/__tests__/store.test.js.map +0 -1
- package/dist/components/DevEnvironment/components/GrabSystem/__tests__/utils.test.d.ts +0 -2
- package/dist/components/DevEnvironment/components/GrabSystem/__tests__/utils.test.d.ts.map +0 -1
- package/dist/components/DevEnvironment/components/GrabSystem/__tests__/utils.test.js +0 -103
- package/dist/components/DevEnvironment/components/GrabSystem/__tests__/utils.test.js.map +0 -1
- package/dist/components/EntryLogBoard/__tests__/utils.test.d.ts +0 -2
- package/dist/components/EntryLogBoard/__tests__/utils.test.d.ts.map +0 -1
- package/dist/components/EntryLogBoard/__tests__/utils.test.js +0 -231
- package/dist/components/EntryLogBoard/__tests__/utils.test.js.map +0 -1
- package/dist/components/Grabbable/__tests__/utils.test.d.ts +0 -2
- package/dist/components/Grabbable/__tests__/utils.test.d.ts.map +0 -1
- package/dist/components/Grabbable/__tests__/utils.test.js +0 -59
- package/dist/components/Grabbable/__tests__/utils.test.js.map +0 -1
- package/dist/components/LiveVideoPlayer/components/ControlPanel/LiveIndicator.d.ts +0 -8
- package/dist/components/LiveVideoPlayer/components/ControlPanel/LiveIndicator.d.ts.map +0 -1
- package/dist/components/LiveVideoPlayer/components/ControlPanel/LiveIndicator.js +0 -11
- package/dist/components/LiveVideoPlayer/components/ControlPanel/LiveIndicator.js.map +0 -1
- package/dist/components/LiveVideoPlayer/components/index.d.ts +0 -3
- package/dist/components/LiveVideoPlayer/components/index.d.ts.map +0 -1
- package/dist/components/LiveVideoPlayer/components/index.js +0 -3
- package/dist/components/LiveVideoPlayer/components/index.js.map +0 -1
- package/dist/components/LiveVideoPlayer/hooks/useHlsVideo/__tests__/utils.test.d.ts +0 -2
- package/dist/components/LiveVideoPlayer/hooks/useHlsVideo/__tests__/utils.test.d.ts.map +0 -1
- package/dist/components/LiveVideoPlayer/hooks/useHlsVideo/__tests__/utils.test.js +0 -196
- package/dist/components/LiveVideoPlayer/hooks/useHlsVideo/__tests__/utils.test.js.map +0 -1
- package/dist/components/LiveVideoPlayer/hooks/useHlsVideo/classes/__tests__/HlsJsPlayer.test.d.ts +0 -2
- package/dist/components/LiveVideoPlayer/hooks/useHlsVideo/classes/__tests__/HlsJsPlayer.test.d.ts.map +0 -1
- package/dist/components/LiveVideoPlayer/hooks/useHlsVideo/classes/__tests__/HlsJsPlayer.test.js +0 -146
- package/dist/components/LiveVideoPlayer/hooks/useHlsVideo/classes/__tests__/HlsJsPlayer.test.js.map +0 -1
- package/dist/components/LiveVideoPlayer/hooks/useHlsVideo/classes/__tests__/NativeHlsPlayer.test.d.ts +0 -2
- package/dist/components/LiveVideoPlayer/hooks/useHlsVideo/classes/__tests__/NativeHlsPlayer.test.d.ts.map +0 -1
- package/dist/components/LiveVideoPlayer/hooks/useHlsVideo/classes/__tests__/NativeHlsPlayer.test.js +0 -94
- package/dist/components/LiveVideoPlayer/hooks/useHlsVideo/classes/__tests__/NativeHlsPlayer.test.js.map +0 -1
- package/dist/components/LiveVideoPlayer/hooks/useHlsVideo/classes/__tests__/RecoveryTracker.test.d.ts +0 -2
- package/dist/components/LiveVideoPlayer/hooks/useHlsVideo/classes/__tests__/RecoveryTracker.test.d.ts.map +0 -1
- package/dist/components/LiveVideoPlayer/hooks/useHlsVideo/classes/__tests__/RecoveryTracker.test.js +0 -74
- package/dist/components/LiveVideoPlayer/hooks/useHlsVideo/classes/__tests__/RecoveryTracker.test.js.map +0 -1
- package/dist/components/LiveVideoPlayer/hooks/useLiveVideoPlayer/index.d.ts +0 -25
- package/dist/components/LiveVideoPlayer/hooks/useLiveVideoPlayer/index.d.ts.map +0 -1
- package/dist/components/LiveVideoPlayer/hooks/useLiveVideoPlayer/index.js +0 -97
- package/dist/components/LiveVideoPlayer/hooks/useLiveVideoPlayer/index.js.map +0 -1
- package/dist/components/Mirror/__tests__/utils.test.d.ts +0 -2
- package/dist/components/Mirror/__tests__/utils.test.d.ts.map +0 -1
- package/dist/components/Mirror/__tests__/utils.test.js +0 -42
- package/dist/components/Mirror/__tests__/utils.test.js.map +0 -1
- package/dist/components/MsdfText/index.d.ts +0 -24
- package/dist/components/MsdfText/index.d.ts.map +0 -1
- package/dist/components/MsdfText/index.js +0 -24
- package/dist/components/MsdfText/index.js.map +0 -1
- package/dist/components/Portal/__tests__/utils.test.d.ts +0 -2
- package/dist/components/Portal/__tests__/utils.test.d.ts.map +0 -1
- package/dist/components/Portal/__tests__/utils.test.js +0 -56
- package/dist/components/Portal/__tests__/utils.test.js.map +0 -1
- package/dist/components/ScreenShareDisplay/__tests__/utils.test.d.ts +0 -2
- package/dist/components/ScreenShareDisplay/__tests__/utils.test.d.ts.map +0 -1
- package/dist/components/ScreenShareDisplay/__tests__/utils.test.js +0 -47
- package/dist/components/ScreenShareDisplay/__tests__/utils.test.js.map +0 -1
- package/dist/components/TroikaText/index.d.ts +0 -4
- package/dist/components/TroikaText/index.d.ts.map +0 -1
- package/dist/components/TroikaText/index.js +0 -50
- package/dist/components/TroikaText/index.js.map +0 -1
- package/dist/components/TroikaText/types.d.ts +0 -19
- package/dist/components/TroikaText/types.d.ts.map +0 -1
- package/dist/components/TroikaText/types.js.map +0 -1
- package/dist/components/VideoPlayer/ControlPanel.d.ts +0 -3
- package/dist/components/VideoPlayer/ControlPanel.d.ts.map +0 -1
- package/dist/components/VideoPlayer/ControlPanel.js +0 -34
- package/dist/components/VideoPlayer/ControlPanel.js.map +0 -1
- package/dist/components/VideoPlayer/ProgressBar.d.ts +0 -3
- package/dist/components/VideoPlayer/ProgressBar.d.ts.map +0 -1
- package/dist/components/VideoPlayer/ProgressBar.js +0 -21
- package/dist/components/VideoPlayer/ProgressBar.js.map +0 -1
- package/dist/components/VideoPlayer/__tests__/utils.test.d.ts +0 -2
- package/dist/components/VideoPlayer/__tests__/utils.test.d.ts.map +0 -1
- package/dist/components/VideoPlayer/__tests__/utils.test.js +0 -23
- package/dist/components/VideoPlayer/__tests__/utils.test.js.map +0 -1
- package/dist/components/VideoPlayer/components/ProgressBar.d.ts +0 -12
- package/dist/components/VideoPlayer/components/ProgressBar.d.ts.map +0 -1
- package/dist/components/VideoPlayer/components/ProgressBar.js +0 -21
- package/dist/components/VideoPlayer/components/ProgressBar.js.map +0 -1
- package/dist/components/VideoPlayer/components/index.d.ts +0 -3
- package/dist/components/VideoPlayer/components/index.d.ts.map +0 -1
- package/dist/components/VideoPlayer/components/index.js +0 -3
- package/dist/components/VideoPlayer/components/index.js.map +0 -1
- package/dist/components/VideoPlayer/types.d.ts +0 -44
- package/dist/components/VideoPlayer/types.d.ts.map +0 -1
- package/dist/components/VideoPlayer/types.js +0 -2
- package/dist/components/VideoPlayer/types.js.map +0 -1
- package/dist/components/VideoPlayer/utils.test.d.ts +0 -2
- package/dist/components/VideoPlayer/utils.test.d.ts.map +0 -1
- package/dist/components/VideoPlayer/utils.test.js +0 -23
- package/dist/components/VideoPlayer/utils.test.js.map +0 -1
- package/dist/components/commons/utils.test.d.ts +0 -2
- package/dist/components/commons/utils.test.d.ts.map +0 -1
- package/dist/components/commons/utils.test.js +0 -79
- package/dist/components/commons/utils.test.js.map +0 -1
- package/dist/contexts/FontContext.d.ts +0 -17
- package/dist/contexts/FontContext.d.ts.map +0 -1
- package/dist/contexts/FontContext.js +0 -25
- package/dist/contexts/FontContext.js.map +0 -1
- package/dist/contexts/InstanceInfoContext.d.ts +0 -39
- package/dist/contexts/InstanceInfoContext.d.ts.map +0 -1
- package/dist/contexts/InstanceInfoContext.js +0 -42
- package/dist/contexts/InstanceInfoContext.js.map +0 -1
- package/dist/contexts/PortalContext.d.ts +0 -39
- package/dist/contexts/PortalContext.d.ts.map +0 -1
- package/dist/contexts/PortalContext.js +0 -42
- package/dist/contexts/PortalContext.js.map +0 -1
- package/dist/contexts/WorldEventContext.d.ts +0 -32
- package/dist/contexts/WorldEventContext.d.ts.map +0 -1
- package/dist/contexts/WorldEventContext.js +0 -54
- package/dist/contexts/WorldEventContext.js.map +0 -1
- package/dist/contexts/__tests__/ServerClockContext.test.d.ts +0 -2
- package/dist/contexts/__tests__/ServerClockContext.test.d.ts.map +0 -1
- package/dist/contexts/__tests__/ServerClockContext.test.js +0 -43
- package/dist/contexts/__tests__/ServerClockContext.test.js.map +0 -1
- package/dist/contexts/__tests__/WorldStorageContext.test.d.ts +0 -2
- package/dist/contexts/__tests__/WorldStorageContext.test.d.ts.map +0 -1
- package/dist/contexts/__tests__/WorldStorageContext.test.js +0 -120
- package/dist/contexts/__tests__/WorldStorageContext.test.js.map +0 -1
- package/dist/fonts/FontContext.d.ts +0 -9
- package/dist/fonts/FontContext.d.ts.map +0 -1
- package/dist/fonts/FontContext.js +0 -5
- package/dist/fonts/FontContext.js.map +0 -1
- package/dist/fonts/FontProvider.d.ts +0 -31
- package/dist/fonts/FontProvider.d.ts.map +0 -1
- package/dist/fonts/FontProvider.js +0 -40
- package/dist/fonts/FontProvider.js.map +0 -1
- package/dist/fonts/FontReadyContainer.d.ts +0 -35
- package/dist/fonts/FontReadyContainer.d.ts.map +0 -1
- package/dist/fonts/FontReadyContainer.js +0 -40
- package/dist/fonts/FontReadyContainer.js.map +0 -1
- package/dist/fonts/constants.d.ts +0 -5
- package/dist/fonts/constants.d.ts.map +0 -1
- package/dist/fonts/constants.js +0 -5
- package/dist/fonts/constants.js.map +0 -1
- package/dist/fonts/loadTTF.d.ts +0 -18
- package/dist/fonts/loadTTF.d.ts.map +0 -1
- package/dist/fonts/loadTTF.js +0 -36
- package/dist/fonts/loadTTF.js.map +0 -1
- package/dist/fonts/useTTF.d.ts +0 -7
- package/dist/fonts/useTTF.d.ts.map +0 -1
- package/dist/fonts/useTTF.js +0 -9
- package/dist/fonts/useTTF.js.map +0 -1
- package/dist/hooks/useJapaneseFont.d.ts +0 -7
- package/dist/hooks/useJapaneseFont.d.ts.map +0 -1
- package/dist/hooks/useJapaneseFont.js +0 -25
- package/dist/hooks/useJapaneseFont.js.map +0 -1
- package/dist/hooks/useMsdfFont.d.ts +0 -11
- package/dist/hooks/useMsdfFont.d.ts.map +0 -1
- package/dist/hooks/useMsdfFont.js +0 -19
- package/dist/hooks/useMsdfFont.js.map +0 -1
- package/dist/hooks/usePortalNavigation.d.ts +0 -10
- package/dist/hooks/usePortalNavigation.d.ts.map +0 -1
- package/dist/hooks/usePortalNavigation.js +0 -46
- package/dist/hooks/usePortalNavigation.js.map +0 -1
- package/dist/hooks/useWorldEvent.d.ts +0 -25
- package/dist/hooks/useWorldEvent.d.ts.map +0 -1
- package/dist/hooks/useWorldEvent.js +0 -45
- package/dist/hooks/useWorldEvent.js.map +0 -1
- /package/dist/components/{TroikaText → Seat}/types.js +0 -0
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
import { type TagDisplayProps } from "../../types";
|
|
2
|
-
export declare const TagDisplay: ({ userId, getMovement, getAvatarHeight, tags, visible, instanceStateKey, }: TagDisplayProps) => import("react
|
|
2
|
+
export declare const TagDisplay: ({ userId, getMovement, getAvatarHeight, tags, visible, instanceStateKey, }: TagDisplayProps) => import("react").JSX.Element | null;
|
|
3
3
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/components/TagBoard/components/TagDisplay/index.tsx"],"names":[],"mappings":"AAoBA,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,aAAa,CAAC;AAanD,eAAO,MAAM,UAAU,GAAI,4EAOxB,eAAe,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/components/TagBoard/components/TagDisplay/index.tsx"],"names":[],"mappings":"AAoBA,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,aAAa,CAAC;AAanD,eAAO,MAAM,UAAU,GAAI,4EAOxB,eAAe,uCAkGjB,CAAC"}
|
|
@@ -9,5 +9,5 @@ export interface ActionButtonProps {
|
|
|
9
9
|
onInteract: () => void;
|
|
10
10
|
interactionText: string;
|
|
11
11
|
}
|
|
12
|
-
export declare const ActionButton: ({ id, label, color, width, height, scale, position, onInteract, interactionText, }: ActionButtonProps) => import("react
|
|
12
|
+
export declare const ActionButton: ({ id, label, color, width, height, scale, position, onInteract, interactionText, }: ActionButtonProps) => import("react").JSX.Element;
|
|
13
13
|
//# sourceMappingURL=ActionButton.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ActionButton.d.ts","sourceRoot":"","sources":["../../../../../../src/components/TagBoard/components/TagSelector/components/ActionButton.tsx"],"names":[],"mappings":"AASA,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IACnC,UAAU,EAAE,MAAM,IAAI,CAAC;IACvB,eAAe,EAAE,MAAM,CAAC;CACzB;AAED,eAAO,MAAM,YAAY,GAAI,oFAU1B,iBAAiB,
|
|
1
|
+
{"version":3,"file":"ActionButton.d.ts","sourceRoot":"","sources":["../../../../../../src/components/TagBoard/components/TagSelector/components/ActionButton.tsx"],"names":[],"mappings":"AASA,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IACnC,UAAU,EAAE,MAAM,IAAI,CAAC;IACvB,eAAe,EAAE,MAAM,CAAC;CACzB;AAED,eAAO,MAAM,YAAY,GAAI,oFAU1B,iBAAiB,gCAoBnB,CAAC"}
|
|
@@ -8,5 +8,5 @@ export interface TagButtonProps {
|
|
|
8
8
|
isSelected: boolean;
|
|
9
9
|
onInteract: () => void;
|
|
10
10
|
}
|
|
11
|
-
export declare const TagButton: ({ tag, width, height, scale, position, isSelected, onInteract, }: TagButtonProps) => import("react
|
|
11
|
+
export declare const TagButton: ({ tag, width, height, scale, position, isSelected, onInteract, }: TagButtonProps) => import("react").JSX.Element;
|
|
12
12
|
//# sourceMappingURL=TagButton.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TagButton.d.ts","sourceRoot":"","sources":["../../../../../../src/components/TagBoard/components/TagSelector/components/TagButton.tsx"],"names":[],"mappings":"AASA,OAAO,EAAE,KAAK,GAAG,EAAE,MAAM,gBAAgB,CAAC;AAE1C,MAAM,WAAW,cAAc;IAC7B,GAAG,EAAE,GAAG,CAAC;IACT,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IACnC,UAAU,EAAE,OAAO,CAAC;IACpB,UAAU,EAAE,MAAM,IAAI,CAAC;CACxB;AAED,eAAO,MAAM,SAAS,GAAI,kEAQvB,cAAc,
|
|
1
|
+
{"version":3,"file":"TagButton.d.ts","sourceRoot":"","sources":["../../../../../../src/components/TagBoard/components/TagSelector/components/TagButton.tsx"],"names":[],"mappings":"AASA,OAAO,EAAE,KAAK,GAAG,EAAE,MAAM,gBAAgB,CAAC;AAE1C,MAAM,WAAW,cAAc;IAC7B,GAAG,EAAE,GAAG,CAAC;IACT,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IACnC,UAAU,EAAE,OAAO,CAAC;IACpB,UAAU,EAAE,MAAM,IAAI,CAAC;CACxB;AAED,eAAO,MAAM,SAAS,GAAI,kEAQvB,cAAc,gCA+BhB,CAAC"}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
import { type TagSelectorProps } from "../../types";
|
|
2
|
-
export declare const TagSelector: ({ tags, title, instanceStateKey, position, rotation, scale, tagsVisible, onTagsVisibleChange, }: TagSelectorProps) => import("react
|
|
2
|
+
export declare const TagSelector: ({ tags, title, instanceStateKey, position, rotation, scale, tagsVisible, onTagsVisibleChange, }: TagSelectorProps) => import("react").JSX.Element;
|
|
3
3
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/components/TagBoard/components/TagSelector/index.tsx"],"names":[],"mappings":"AAmBA,OAAO,EAAE,KAAK,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAKpD,eAAO,MAAM,WAAW,GAAI,iGASzB,gBAAgB,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/components/TagBoard/components/TagSelector/index.tsx"],"names":[],"mappings":"AAmBA,OAAO,EAAE,KAAK,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAKpD,eAAO,MAAM,WAAW,GAAI,iGASzB,gBAAgB,gCAyGlB,CAAC"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
import { type TagBoardProps } from "./types";
|
|
2
2
|
export { type TagBoardProps, type Tag } from "./types";
|
|
3
|
-
export declare const TagBoard: ({ tags, columns, title, instanceStateKey, position, rotation, scale, }: TagBoardProps) => import("react
|
|
3
|
+
export declare const TagBoard: ({ tags, columns, title, instanceStateKey, position, rotation, scale, }: TagBoardProps) => import("react").JSX.Element;
|
|
4
4
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/TagBoard/index.tsx"],"names":[],"mappings":"AAgBA,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,SAAS,CAAC;AAG7C,OAAO,EAAE,KAAK,aAAa,EAAE,KAAK,GAAG,EAAE,MAAM,SAAS,CAAC;AAEvD,eAAO,MAAM,QAAQ,GAAI,wEAQtB,aAAa,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/TagBoard/index.tsx"],"names":[],"mappings":"AAgBA,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,SAAS,CAAC;AAG7C,OAAO,EAAE,KAAK,aAAa,EAAE,KAAK,GAAG,EAAE,MAAM,SAAS,CAAC;AAEvD,eAAO,MAAM,QAAQ,GAAI,wEAQtB,aAAa,gCAiDf,CAAC"}
|
|
@@ -9,6 +9,6 @@ interface EyeViewProps {
|
|
|
9
9
|
* 各目用のビューを表示する内部コンポーネント
|
|
10
10
|
* Three.jsのlayersを使用してVR時に左右の目に適切な映像を表示
|
|
11
11
|
*/
|
|
12
|
-
export declare const EyeView: ({ video, eye, radius, segments, placeholderColor }: EyeViewProps) => import("react
|
|
12
|
+
export declare const EyeView: ({ video, eye, radius, segments, placeholderColor }: EyeViewProps) => import("react").JSX.Element;
|
|
13
13
|
export {};
|
|
14
14
|
//# sourceMappingURL=EyeView.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EyeView.d.ts","sourceRoot":"","sources":["../../../src/components/Video180Sphere/EyeView.tsx"],"names":[],"mappings":"AAGA,UAAU,YAAY;IACpB,KAAK,EAAE,gBAAgB,CAAA;IACvB,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;IACrB,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,MAAM,CAAA;IAChB,gBAAgB,EAAE,MAAM,CAAA;CACzB;AAED;;;GAGG;AACH,eAAO,MAAM,OAAO,GAAI,oDAAoD,YAAY,
|
|
1
|
+
{"version":3,"file":"EyeView.d.ts","sourceRoot":"","sources":["../../../src/components/Video180Sphere/EyeView.tsx"],"names":[],"mappings":"AAGA,UAAU,YAAY;IACpB,KAAK,EAAE,gBAAgB,CAAA;IACvB,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;IACrB,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,MAAM,CAAA;IAChB,gBAAgB,EAAE,MAAM,CAAA;CACzB;AAED;;;GAGG;AACH,eAAO,MAAM,OAAO,GAAI,oDAAoD,YAAY,gCAiFvF,CAAA"}
|
|
@@ -15,5 +15,5 @@ export type { Video180SphereProps } from './types';
|
|
|
15
15
|
* />
|
|
16
16
|
* ```
|
|
17
17
|
*/
|
|
18
|
-
export declare const Video180Sphere: import("react").MemoExoticComponent<({ url, position, rotation, scale, playing, muted, volume, radius, segments, loop, placeholderColor, onEnded, onLoadedMetadata, onProgress, }: Video180SphereProps) => import("react
|
|
18
|
+
export declare const Video180Sphere: import("react").MemoExoticComponent<({ url, position, rotation, scale, playing, muted, volume, radius, segments, loop, placeholderColor, onEnded, onLoadedMetadata, onProgress, }: Video180SphereProps) => import("react").JSX.Element>;
|
|
19
19
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/Video180Sphere/index.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,SAAS,CAAA;AAElD,YAAY,EAAE,mBAAmB,EAAE,MAAM,SAAS,CAAA;AAKlD;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,cAAc,qLAgBtB,mBAAmB,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/Video180Sphere/index.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,SAAS,CAAA;AAElD,YAAY,EAAE,mBAAmB,EAAE,MAAM,SAAS,CAAA;AAKlD;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,cAAc,qLAgBtB,mBAAmB,iCAkFvB,CAAA"}
|
|
@@ -15,6 +15,6 @@ interface Props {
|
|
|
15
15
|
onUrlChange: (url: string) => void;
|
|
16
16
|
onToggleVisible: () => void;
|
|
17
17
|
}
|
|
18
|
-
export declare const ControlPanel: import("react").MemoExoticComponent<({ id, width, screenHeight, playing, progress, duration, volume, url, visible, onPlayPause, onStop, onSeek, onVolumeChange, onUrlChange, onToggleVisible, }: Props) => import("react
|
|
18
|
+
export declare const ControlPanel: import("react").MemoExoticComponent<({ id, width, screenHeight, playing, progress, duration, volume, url, visible, onPlayPause, onStop, onSeek, onVolumeChange, onUrlChange, onToggleVisible, }: Props) => import("react").JSX.Element>;
|
|
19
19
|
export {};
|
|
20
20
|
//# sourceMappingURL=ControlPanel.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ControlPanel.d.ts","sourceRoot":"","sources":["../../../../src/components/VideoPlayer/components/ControlPanel.tsx"],"names":[],"mappings":"AAKA,UAAU,KAAK;IACb,EAAE,EAAE,MAAM,CAAA;IACV,KAAK,EAAE,MAAM,CAAA;IACb,YAAY,EAAE,MAAM,CAAA;IACpB,OAAO,EAAE,OAAO,CAAA;IAChB,QAAQ,EAAE,MAAM,CAAA;IAChB,QAAQ,EAAE,MAAM,CAAA;IAChB,MAAM,EAAE,MAAM,CAAA;IACd,GAAG,EAAE,MAAM,CAAA;IACX,OAAO,EAAE,OAAO,CAAA;IAChB,WAAW,EAAE,MAAM,IAAI,CAAA;IACvB,MAAM,EAAE,MAAM,IAAI,CAAA;IAClB,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;IAC9B,cAAc,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAA;IACxC,WAAW,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAA;IAClC,eAAe,EAAE,MAAM,IAAI,CAAA;CAC5B;AA8CD,eAAO,MAAM,YAAY,mMAiBpB,KAAK,
|
|
1
|
+
{"version":3,"file":"ControlPanel.d.ts","sourceRoot":"","sources":["../../../../src/components/VideoPlayer/components/ControlPanel.tsx"],"names":[],"mappings":"AAKA,UAAU,KAAK;IACb,EAAE,EAAE,MAAM,CAAA;IACV,KAAK,EAAE,MAAM,CAAA;IACb,YAAY,EAAE,MAAM,CAAA;IACpB,OAAO,EAAE,OAAO,CAAA;IAChB,QAAQ,EAAE,MAAM,CAAA;IAChB,QAAQ,EAAE,MAAM,CAAA;IAChB,MAAM,EAAE,MAAM,CAAA;IACd,GAAG,EAAE,MAAM,CAAA;IACX,OAAO,EAAE,OAAO,CAAA;IAChB,WAAW,EAAE,MAAM,IAAI,CAAA;IACvB,MAAM,EAAE,MAAM,IAAI,CAAA;IAClB,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;IAC9B,cAAc,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAA;IACxC,WAAW,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAA;IAClC,eAAe,EAAE,MAAM,IAAI,CAAA;CAC5B;AA8CD,eAAO,MAAM,YAAY,mMAiBpB,KAAK,iCAsKT,CAAA"}
|
|
@@ -16,6 +16,6 @@ interface Props {
|
|
|
16
16
|
}
|
|
17
17
|
/** @public */
|
|
18
18
|
export type VideoPlayerProps = Props;
|
|
19
|
-
export declare const VideoPlayer: import("react").MemoExoticComponent<({ id, position, rotation, width, url: initialUrl, playing: initialPlaying, volume: initialVolume, }: Props) => import("react
|
|
19
|
+
export declare const VideoPlayer: import("react").MemoExoticComponent<({ id, position, rotation, width, url: initialUrl, playing: initialPlaying, volume: initialVolume, }: Props) => import("react").JSX.Element>;
|
|
20
20
|
export {};
|
|
21
21
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/VideoPlayer/index.tsx"],"names":[],"mappings":"AAWA,UAAU,KAAK;IACb,sBAAsB;IACtB,EAAE,EAAE,MAAM,CAAA;IACV,eAAe;IACf,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;IACnC,eAAe;IACf,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;IACnC,qCAAqC;IACrC,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,aAAa;IACb,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,0BAA0B;IAC1B,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,yBAAyB;IACzB,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAED,cAAc;AACd,MAAM,MAAM,gBAAgB,GAAG,KAAK,CAAA;AAmEpC,eAAO,MAAM,WAAW,4IASnB,KAAK,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/VideoPlayer/index.tsx"],"names":[],"mappings":"AAWA,UAAU,KAAK;IACb,sBAAsB;IACtB,EAAE,EAAE,MAAM,CAAA;IACV,eAAe;IACf,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;IACnC,eAAe;IACf,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;IACnC,qCAAqC;IACrC,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,aAAa;IACb,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,0BAA0B;IAC1B,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,yBAAyB;IACzB,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAED,cAAc;AACd,MAAM,MAAM,gBAAgB,GAAG,KAAK,CAAA;AAmEpC,eAAO,MAAM,WAAW,4IASnB,KAAK,iCAmJT,CAAA"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 補正しない誤差(秒)
|
|
3
|
+
*
|
|
4
|
+
* この範囲なら合っているとみなす。狭くすると補正が止まらなくなる。
|
|
5
|
+
* 共有時計の実効精度(Quest で 18ms 程度)よりはるかに大きく取ってあるのは、
|
|
6
|
+
* ブラウザが `video.currentTime` の設定を要求位置ぴったりに着地させないため。
|
|
7
|
+
*/
|
|
8
|
+
export declare const SYNC_DEAD_BAND = 0.3;
|
|
9
|
+
/**
|
|
10
|
+
* 再生速度で吸収する誤差の上限(秒)
|
|
11
|
+
*
|
|
12
|
+
* これを超える誤差は速度調整では現実的な時間で吸収できないのでシークを検討する。
|
|
13
|
+
*/
|
|
14
|
+
export declare const SYNC_RATE_LIMIT = 5;
|
|
15
|
+
/**
|
|
16
|
+
* 再生速度の補正幅(±5%)
|
|
17
|
+
*
|
|
18
|
+
* 大きくすると音程の変化が耳につく。5% なら 1 秒の遅れを 20 秒で吸収できる。
|
|
19
|
+
*/
|
|
20
|
+
export declare const SYNC_RATE_ADJUSTMENT = 0.05;
|
|
21
|
+
/**
|
|
22
|
+
* シーク先がバッファ内かを判定するときの余裕(秒)
|
|
23
|
+
*
|
|
24
|
+
* バッファの端ぎりぎりへシークすると、着地した直後に再生が止まる。
|
|
25
|
+
*/
|
|
26
|
+
export declare const SYNC_BUFFER_MARGIN = 1;
|
|
27
|
+
//# sourceMappingURL=constants.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../../src/components/VideoScreen/constants.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,eAAO,MAAM,cAAc,MAAM,CAAA;AAEjC;;;;GAIG;AACH,eAAO,MAAM,eAAe,IAAI,CAAA;AAEhC;;;;GAIG;AACH,eAAO,MAAM,oBAAoB,OAAO,CAAA;AAExC;;;;GAIG;AACH,eAAO,MAAM,kBAAkB,IAAI,CAAA"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 補正しない誤差(秒)
|
|
3
|
+
*
|
|
4
|
+
* この範囲なら合っているとみなす。狭くすると補正が止まらなくなる。
|
|
5
|
+
* 共有時計の実効精度(Quest で 18ms 程度)よりはるかに大きく取ってあるのは、
|
|
6
|
+
* ブラウザが `video.currentTime` の設定を要求位置ぴったりに着地させないため。
|
|
7
|
+
*/
|
|
8
|
+
export const SYNC_DEAD_BAND = 0.3;
|
|
9
|
+
/**
|
|
10
|
+
* 再生速度で吸収する誤差の上限(秒)
|
|
11
|
+
*
|
|
12
|
+
* これを超える誤差は速度調整では現実的な時間で吸収できないのでシークを検討する。
|
|
13
|
+
*/
|
|
14
|
+
export const SYNC_RATE_LIMIT = 5;
|
|
15
|
+
/**
|
|
16
|
+
* 再生速度の補正幅(±5%)
|
|
17
|
+
*
|
|
18
|
+
* 大きくすると音程の変化が耳につく。5% なら 1 秒の遅れを 20 秒で吸収できる。
|
|
19
|
+
*/
|
|
20
|
+
export const SYNC_RATE_ADJUSTMENT = 0.05;
|
|
21
|
+
/**
|
|
22
|
+
* シーク先がバッファ内かを判定するときの余裕(秒)
|
|
23
|
+
*
|
|
24
|
+
* バッファの端ぎりぎりへシークすると、着地した直後に再生が止まる。
|
|
25
|
+
*/
|
|
26
|
+
export const SYNC_BUFFER_MARGIN = 1;
|
|
27
|
+
//# sourceMappingURL=constants.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../../src/components/VideoScreen/constants.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,GAAG,CAAA;AAEjC;;;;GAIG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,CAAA;AAEhC;;;;GAIG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG,IAAI,CAAA;AAExC;;;;GAIG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,CAAA"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 共有時計のアンカーに合わせて再生位置を追従させる(issue xrift-frontend#1464 Phase 4)
|
|
3
|
+
*
|
|
4
|
+
* アンカー = 「サーバ時刻 `anchorServerTime` のとき再生位置は `anchorMediaTime` だった」。
|
|
5
|
+
* 各クライアントが自分で目標位置を計算するので、**後から入った人も通信ゼロで追いつける**。
|
|
6
|
+
*
|
|
7
|
+
* `useFrame` ではなく `setInterval` で回している。補正は 0.5 秒に一度で十分なうえ、
|
|
8
|
+
* `useFrame` はタブが非表示になると完全に停止してしまうため。
|
|
9
|
+
*/
|
|
10
|
+
export declare const useVideoTimeSync: (params: {
|
|
11
|
+
video: HTMLVideoElement | null;
|
|
12
|
+
anchorMediaTime: number;
|
|
13
|
+
anchorServerTime: number;
|
|
14
|
+
isPlaying: boolean;
|
|
15
|
+
loop: boolean;
|
|
16
|
+
/** false のときは追従しない(sync='local' など) */
|
|
17
|
+
enabled: boolean;
|
|
18
|
+
}) => void;
|
|
19
|
+
//# sourceMappingURL=hooks.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../../../src/components/VideoScreen/hooks.ts"],"names":[],"mappings":"AAOA;;;;;;;;GAQG;AACH,eAAO,MAAM,gBAAgB,GAAI,QAAQ;IACvC,KAAK,EAAE,gBAAgB,GAAG,IAAI,CAAA;IAC9B,eAAe,EAAE,MAAM,CAAA;IACvB,gBAAgB,EAAE,MAAM,CAAA;IACxB,SAAS,EAAE,OAAO,CAAA;IAClB,IAAI,EAAE,OAAO,CAAA;IACb,uCAAuC;IACvC,OAAO,EAAE,OAAO,CAAA;CACjB,KAAG,IA4DH,CAAA"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { useEffect, useRef } from 'react';
|
|
2
|
+
import { useServerClock } from '../../hooks/useServerClock';
|
|
3
|
+
import { computeTargetTime, decideVideoSyncAction, toBufferedRanges } from './utils';
|
|
4
|
+
/** 補正を検討する間隔(ms)。毎フレームやる必要はない */
|
|
5
|
+
const SYNC_CHECK_INTERVAL = 500;
|
|
6
|
+
/**
|
|
7
|
+
* 共有時計のアンカーに合わせて再生位置を追従させる(issue xrift-frontend#1464 Phase 4)
|
|
8
|
+
*
|
|
9
|
+
* アンカー = 「サーバ時刻 `anchorServerTime` のとき再生位置は `anchorMediaTime` だった」。
|
|
10
|
+
* 各クライアントが自分で目標位置を計算するので、**後から入った人も通信ゼロで追いつける**。
|
|
11
|
+
*
|
|
12
|
+
* `useFrame` ではなく `setInterval` で回している。補正は 0.5 秒に一度で十分なうえ、
|
|
13
|
+
* `useFrame` はタブが非表示になると完全に停止してしまうため。
|
|
14
|
+
*/
|
|
15
|
+
export const useVideoTimeSync = (params) => {
|
|
16
|
+
const { video, anchorMediaTime, anchorServerTime, isPlaying, loop, enabled } = params;
|
|
17
|
+
const clock = useServerClock({ require: 'media' });
|
|
18
|
+
// 入室直後の一度だけ、バッファを待たずにシークして追いつく
|
|
19
|
+
const positionedRef = useRef(false);
|
|
20
|
+
// アンカーが変わったら位置合わせをやり直す(別の動画・シーク操作)
|
|
21
|
+
useEffect(() => {
|
|
22
|
+
positionedRef.current = false;
|
|
23
|
+
}, [anchorServerTime]);
|
|
24
|
+
// 時計が飛んだら目標が不連続に変わる。次の判定で追いつくため位置合わせからやり直す
|
|
25
|
+
useEffect(() => {
|
|
26
|
+
positionedRef.current = false;
|
|
27
|
+
}, [clock.timeJumpCount]);
|
|
28
|
+
// クロージャの陳腐化を避けつつ、interval を張り直さないための ref
|
|
29
|
+
const stateRef = useRef({ anchorMediaTime, anchorServerTime, isPlaying, loop, clock });
|
|
30
|
+
stateRef.current = { anchorMediaTime, anchorServerTime, isPlaying, loop, clock };
|
|
31
|
+
useEffect(() => {
|
|
32
|
+
if (!video || !enabled)
|
|
33
|
+
return;
|
|
34
|
+
const syncOnce = () => {
|
|
35
|
+
const state = stateRef.current;
|
|
36
|
+
const targetTime = computeTargetTime({
|
|
37
|
+
anchorMediaTime: state.anchorMediaTime,
|
|
38
|
+
anchorServerTime: state.anchorServerTime,
|
|
39
|
+
serverNow: state.clock.now(),
|
|
40
|
+
isPlaying: state.isPlaying,
|
|
41
|
+
duration: video.duration,
|
|
42
|
+
loop: state.loop,
|
|
43
|
+
});
|
|
44
|
+
const action = decideVideoSyncAction({
|
|
45
|
+
targetTime,
|
|
46
|
+
currentTime: video.currentTime,
|
|
47
|
+
buffered: toBufferedRanges(video.buffered),
|
|
48
|
+
trustworthy: state.clock.trustworthy,
|
|
49
|
+
positioned: positionedRef.current,
|
|
50
|
+
});
|
|
51
|
+
// 速度は毎回明示的に戻す(戻し忘れると反対側へ突き抜けて振動し続ける)
|
|
52
|
+
if (video.playbackRate !== action.playbackRate) {
|
|
53
|
+
video.playbackRate = action.playbackRate;
|
|
54
|
+
}
|
|
55
|
+
if (action.type !== 'seek')
|
|
56
|
+
return;
|
|
57
|
+
video.currentTime = action.seekTo;
|
|
58
|
+
positionedRef.current = true;
|
|
59
|
+
};
|
|
60
|
+
syncOnce();
|
|
61
|
+
const interval = setInterval(syncOnce, SYNC_CHECK_INTERVAL);
|
|
62
|
+
return () => {
|
|
63
|
+
clearInterval(interval);
|
|
64
|
+
// 補正をやめるときは速度を戻す
|
|
65
|
+
video.playbackRate = 1;
|
|
66
|
+
};
|
|
67
|
+
}, [video, enabled]);
|
|
68
|
+
};
|
|
69
|
+
//# sourceMappingURL=hooks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hooks.js","sourceRoot":"","sources":["../../../src/components/VideoScreen/hooks.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,5 +4,5 @@ export type { VideoScreenProps, VideoState } from './types';
|
|
|
4
4
|
* VideoScreenコンポーネント
|
|
5
5
|
* Suspenseでラップして使用する
|
|
6
6
|
*/
|
|
7
|
-
export declare function VideoScreen(props: VideoScreenProps): import("react
|
|
7
|
+
export declare function VideoScreen(props: VideoScreenProps): import("react").JSX.Element;
|
|
8
8
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/VideoScreen/index.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/VideoScreen/index.tsx"],"names":[],"mappings":"AAOA,OAAO,EAAE,gBAAgB,EAAc,MAAM,SAAS,CAAA;AAEtD,YAAY,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AA2H3D;;;GAGG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,gBAAgB,+BA8BlD"}
|
|
@@ -3,25 +3,29 @@ import { Suspense, useEffect, useRef, useState } from 'react';
|
|
|
3
3
|
import { FrontSide } from 'three';
|
|
4
4
|
import { useVideoTexture } from '@react-three/drei';
|
|
5
5
|
import { useInstanceState } from '../../hooks/useInstanceState';
|
|
6
|
+
import { useServerClock } from '../../hooks/useServerClock';
|
|
6
7
|
import { useWebAudioVolume } from '../../hooks/useWebAudioVolume';
|
|
8
|
+
import { useVideoTimeSync } from './hooks';
|
|
7
9
|
/**
|
|
8
10
|
* 動画を表示する内部コンポーネント
|
|
9
11
|
* useVideoTextureを使用するためSuspense内で使用する必要がある
|
|
10
12
|
*/
|
|
11
13
|
function VideoScreenInner({ id, position = [0, 2, -5], rotation = [0, 0, 0], scale = [16 / 9 * 3, 3], url = '', playing = true, currentTime = 0, sync = 'global', muted = false, volume = 1, }) {
|
|
14
|
+
// 共有時計。アンカーの打刻に使う(端末の Date.now() は互いに 0.1〜数秒ずれている)
|
|
15
|
+
const clock = useServerClock({ require: 'media' });
|
|
12
16
|
// グローバル同期用の状態
|
|
13
17
|
const [globalState, setGlobalState] = useInstanceState(`video-${id}`, {
|
|
14
18
|
url: url,
|
|
15
19
|
isPlaying: playing,
|
|
16
20
|
currentTime: currentTime,
|
|
17
|
-
serverTime:
|
|
21
|
+
serverTime: clock.now(),
|
|
18
22
|
});
|
|
19
23
|
// ローカル専用の状態
|
|
20
24
|
const [localState, setLocalState] = useState({
|
|
21
25
|
url: url,
|
|
22
26
|
isPlaying: playing,
|
|
23
27
|
currentTime: currentTime,
|
|
24
|
-
serverTime:
|
|
28
|
+
serverTime: clock.now(),
|
|
25
29
|
});
|
|
26
30
|
// sync modeに応じて使用する状態を切り替え
|
|
27
31
|
const videoState = sync === 'global' ? globalState : localState;
|
|
@@ -32,14 +36,16 @@ function VideoScreenInner({ id, position = [0, 2, -5], rotation = [0, 0, 0], sca
|
|
|
32
36
|
if (videoState.url !== url ||
|
|
33
37
|
videoState.isPlaying !== playing ||
|
|
34
38
|
videoState.currentTime !== currentTime) {
|
|
39
|
+
// props が変わったらアンカーを打ち直す。
|
|
40
|
+
// 「いまサーバ時刻 X で、再生位置は currentTime である」と宣言する
|
|
35
41
|
setVideoState({
|
|
36
42
|
url: url,
|
|
37
43
|
isPlaying: playing,
|
|
38
44
|
currentTime: currentTime,
|
|
39
|
-
serverTime:
|
|
45
|
+
serverTime: clock.now(),
|
|
40
46
|
});
|
|
41
47
|
}
|
|
42
|
-
}, [url, playing, currentTime, videoState, setVideoState]);
|
|
48
|
+
}, [url, playing, currentTime, videoState, setVideoState, clock]);
|
|
43
49
|
// useVideoTextureで動画テクスチャを取得
|
|
44
50
|
const texture = useVideoTexture(url || '', {
|
|
45
51
|
muted,
|
|
@@ -63,19 +69,18 @@ function VideoScreenInner({ id, position = [0, 2, -5], rotation = [0, 0, 0], sca
|
|
|
63
69
|
}, [playing, texture]);
|
|
64
70
|
// Web Audio API を使用した音量制御(iOS対応)
|
|
65
71
|
useWebAudioVolume(texture.image, volume);
|
|
66
|
-
//
|
|
67
|
-
//
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
}, [currentTime, texture]);
|
|
72
|
+
// 再生位置の追従(アンカー方式)
|
|
73
|
+
// 状態のアンカーと共有時計から目標位置を計算し、穏やかに寄せる。
|
|
74
|
+
// 後から入った人はここで一度シークして追いつく
|
|
75
|
+
useVideoTimeSync({
|
|
76
|
+
video: texture.image,
|
|
77
|
+
anchorMediaTime: videoState.currentTime,
|
|
78
|
+
anchorServerTime: videoState.serverTime,
|
|
79
|
+
isPlaying: videoState.isPlaying,
|
|
80
|
+
loop: true,
|
|
81
|
+
// ローカル再生は合わせる相手がいないので追従しない
|
|
82
|
+
enabled: sync === 'global',
|
|
83
|
+
});
|
|
79
84
|
// アンマウント時に動画を停止
|
|
80
85
|
useEffect(() => {
|
|
81
86
|
const video = texture.image;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/components/VideoScreen/index.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AAC7D,OAAO,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AACjC,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAA;AACnD,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAA;AAC/D,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAA;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/components/VideoScreen/index.tsx"],"names":[],"mappings":"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"}
|
|
@@ -21,17 +21,27 @@ export interface VideoScreenProps {
|
|
|
21
21
|
volume?: number;
|
|
22
22
|
}
|
|
23
23
|
/**
|
|
24
|
-
* VideoScreen
|
|
25
|
-
*
|
|
24
|
+
* VideoScreenの状態(useInstanceStateで同期される)
|
|
25
|
+
*
|
|
26
|
+
* `currentTime` と `serverTime` は**アンカー**として使う。
|
|
27
|
+
* 「サーバ時刻 `serverTime` のとき再生位置は `currentTime` だった」という意味で、
|
|
28
|
+
* 各クライアントはここから自分で現在の目標位置を計算する。
|
|
29
|
+
* 「いまの再生位置」を配ると受け取った瞬間には既に古いが、アンカーなら
|
|
30
|
+
* **後から入った人も通信ゼロで正しい位置に追いつける**。
|
|
26
31
|
*/
|
|
27
32
|
export interface VideoState {
|
|
28
33
|
/** 動画のURL */
|
|
29
34
|
url: string;
|
|
30
35
|
/** 再生中かどうか */
|
|
31
36
|
isPlaying: boolean;
|
|
32
|
-
/**
|
|
37
|
+
/** アンカーの再生位置(秒) */
|
|
33
38
|
currentTime: number;
|
|
34
|
-
/**
|
|
39
|
+
/**
|
|
40
|
+
* アンカーのサーバ時刻(ms)
|
|
41
|
+
*
|
|
42
|
+
* 共有時計(`useServerClock`)の値。端末の `Date.now()` は互いに 0.1〜数秒
|
|
43
|
+
* ずれているため、ここに入れてはいけない(実測で 0.66 秒ずれた端末がある)
|
|
44
|
+
*/
|
|
35
45
|
serverTime: number;
|
|
36
46
|
}
|
|
37
47
|
//# sourceMappingURL=types.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/components/VideoScreen/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,gBAAgB;IAC/B,wCAAwC;IACxC,EAAE,EAAE,MAAM,CAAA;IACV,eAAe;IACf,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;IACnC,eAAe;IACf,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;IACnC,wBAAwB;IACxB,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IACxB,aAAa;IACb,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,2BAA2B;IAC3B,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,cAAc;IACd,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,uEAAuE;IACvE,IAAI,CAAC,EAAE,QAAQ,GAAG,OAAO,CAAA;IACzB,yEAAyE;IACzE,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,uBAAuB;IACvB,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAED
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/components/VideoScreen/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,gBAAgB;IAC/B,wCAAwC;IACxC,EAAE,EAAE,MAAM,CAAA;IACV,eAAe;IACf,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;IACnC,eAAe;IACf,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;IACnC,wBAAwB;IACxB,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IACxB,aAAa;IACb,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,2BAA2B;IAC3B,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,cAAc;IACd,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,uEAAuE;IACvE,IAAI,CAAC,EAAE,QAAQ,GAAG,OAAO,CAAA;IACzB,yEAAyE;IACzE,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,uBAAuB;IACvB,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAED;;;;;;;;GAQG;AACH,MAAM,WAAW,UAAU;IACzB,aAAa;IACb,GAAG,EAAE,MAAM,CAAA;IACX,cAAc;IACd,SAAS,EAAE,OAAO,CAAA;IAClB,mBAAmB;IACnB,WAAW,EAAE,MAAM,CAAA;IACnB;;;;;OAKG;IACH,UAAU,EAAE,MAAM,CAAA;CACnB"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* アンカー(「サーバ時刻 T のとき再生位置は M だった」)から、
|
|
3
|
+
* いまの再生位置の目標値を求める
|
|
4
|
+
*
|
|
5
|
+
* 状態に「いまの再生位置」を持たせると、受け取った瞬間には既に古い。
|
|
6
|
+
* アンカーで持てば**後から入った人も自分で正しい位置を計算できる**(通信ゼロ)。
|
|
7
|
+
*
|
|
8
|
+
* @param duration 動画の長さ(秒)。ループ再生の折り返しに使う。
|
|
9
|
+
* メタデータ未読み込みで NaN / 0 のときは折り返さない
|
|
10
|
+
*/
|
|
11
|
+
export declare function computeTargetTime(params: {
|
|
12
|
+
/** アンカーの再生位置(秒) */
|
|
13
|
+
anchorMediaTime: number;
|
|
14
|
+
/** アンカーのサーバ時刻(ms) */
|
|
15
|
+
anchorServerTime: number;
|
|
16
|
+
/** いまのサーバ時刻(ms) */
|
|
17
|
+
serverNow: number;
|
|
18
|
+
isPlaying: boolean;
|
|
19
|
+
duration: number;
|
|
20
|
+
loop: boolean;
|
|
21
|
+
}): number;
|
|
22
|
+
/** 再生位置がバッファ済みの範囲に入っているか(端の余裕を見る) */
|
|
23
|
+
export declare function isTimeBuffered(buffered: Array<{
|
|
24
|
+
start: number;
|
|
25
|
+
end: number;
|
|
26
|
+
}>, time: number): boolean;
|
|
27
|
+
/** 同期のためにこのフレームで何をするか */
|
|
28
|
+
export type VideoSyncAction =
|
|
29
|
+
/** 何もしない(合っている / 補正のコストが誤差より大きい) */
|
|
30
|
+
{
|
|
31
|
+
type: 'none';
|
|
32
|
+
playbackRate: 1;
|
|
33
|
+
}
|
|
34
|
+
/** 再生速度で穏やかに寄せる */
|
|
35
|
+
| {
|
|
36
|
+
type: 'rate';
|
|
37
|
+
playbackRate: number;
|
|
38
|
+
}
|
|
39
|
+
/** シークで一気に合わせる */
|
|
40
|
+
| {
|
|
41
|
+
type: 'seek';
|
|
42
|
+
seekTo: number;
|
|
43
|
+
playbackRate: 1;
|
|
44
|
+
};
|
|
45
|
+
/**
|
|
46
|
+
* 目標位置と現在位置から、取るべき補正を決める
|
|
47
|
+
*
|
|
48
|
+
* **原則: 補正のコストが誤差より大きいなら補正しない。**
|
|
49
|
+
* ズレを直すためにシークしてバッファが切れるくらいなら、ズレたまま再生を続けるほうが
|
|
50
|
+
* 体験は良い。これを守らないと「ズレる → シーク → バッファ切れ → さらにズレる」の
|
|
51
|
+
* 無限ループになる(VR180 プレイヤーで実際に起きた)。
|
|
52
|
+
*
|
|
53
|
+
* @param positioned 一度でも位置合わせが済んでいるか。
|
|
54
|
+
* 入室直後(false)はバッファが無いのが当たり前なので、
|
|
55
|
+
* バッファ判定を待たずにシークする(これが late-join の追いつき)
|
|
56
|
+
*/
|
|
57
|
+
export declare function decideVideoSyncAction(params: {
|
|
58
|
+
targetTime: number;
|
|
59
|
+
currentTime: number;
|
|
60
|
+
buffered: Array<{
|
|
61
|
+
start: number;
|
|
62
|
+
end: number;
|
|
63
|
+
}>;
|
|
64
|
+
/** 共有時計が用途に足る精度か。false なら合わせにいかない */
|
|
65
|
+
trustworthy: boolean;
|
|
66
|
+
positioned: boolean;
|
|
67
|
+
}): VideoSyncAction;
|
|
68
|
+
/** `TimeRanges` を素の配列にする(テストしやすくするため) */
|
|
69
|
+
export declare function toBufferedRanges(ranges: TimeRanges | null): Array<{
|
|
70
|
+
start: number;
|
|
71
|
+
end: number;
|
|
72
|
+
}>;
|
|
73
|
+
//# sourceMappingURL=utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/components/VideoScreen/utils.ts"],"names":[],"mappings":"AAOA;;;;;;;;;GASG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE;IACxC,mBAAmB;IACnB,eAAe,EAAE,MAAM,CAAA;IACvB,qBAAqB;IACrB,gBAAgB,EAAE,MAAM,CAAA;IACxB,mBAAmB;IACnB,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,OAAO,CAAA;IAClB,QAAQ,EAAE,MAAM,CAAA;IAChB,IAAI,EAAE,OAAO,CAAA;CACd,GAAG,MAAM,CAaT;AAED,qCAAqC;AACrC,wBAAgB,cAAc,CAC5B,QAAQ,EAAE,KAAK,CAAC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CAAC,EAC/C,IAAI,EAAE,MAAM,GACX,OAAO,CAIT;AAED,yBAAyB;AACzB,MAAM,MAAM,eAAe;AACzB,oCAAoC;AAClC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,CAAC,CAAA;CAAE;AACnC,mBAAmB;GACjB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAA;CAAE;AACxC,kBAAkB;GAChB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,CAAC,CAAA;CAAE,CAAA;AAErD;;;;;;;;;;;GAWG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE;IAC5C,UAAU,EAAE,MAAM,CAAA;IAClB,WAAW,EAAE,MAAM,CAAA;IACnB,QAAQ,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IAC/C,qCAAqC;IACrC,WAAW,EAAE,OAAO,CAAA;IACpB,UAAU,EAAE,OAAO,CAAA;CACpB,GAAG,eAAe,CA2BlB;AAED,yCAAyC;AACzC,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,UAAU,GAAG,IAAI,GAAG,KAAK,CAAC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CAAC,CAOjG"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { SYNC_BUFFER_MARGIN, SYNC_DEAD_BAND, SYNC_RATE_ADJUSTMENT, SYNC_RATE_LIMIT, } from './constants';
|
|
2
|
+
/**
|
|
3
|
+
* アンカー(「サーバ時刻 T のとき再生位置は M だった」)から、
|
|
4
|
+
* いまの再生位置の目標値を求める
|
|
5
|
+
*
|
|
6
|
+
* 状態に「いまの再生位置」を持たせると、受け取った瞬間には既に古い。
|
|
7
|
+
* アンカーで持てば**後から入った人も自分で正しい位置を計算できる**(通信ゼロ)。
|
|
8
|
+
*
|
|
9
|
+
* @param duration 動画の長さ(秒)。ループ再生の折り返しに使う。
|
|
10
|
+
* メタデータ未読み込みで NaN / 0 のときは折り返さない
|
|
11
|
+
*/
|
|
12
|
+
export function computeTargetTime(params) {
|
|
13
|
+
const { anchorMediaTime, anchorServerTime, serverNow, isPlaying, duration, loop } = params;
|
|
14
|
+
// 停止中は時間が進まないので、アンカーの位置がそのまま目標
|
|
15
|
+
if (!isPlaying)
|
|
16
|
+
return Math.max(0, anchorMediaTime);
|
|
17
|
+
const elapsed = (serverNow - anchorServerTime) / 1000;
|
|
18
|
+
const target = anchorMediaTime + elapsed;
|
|
19
|
+
if (!loop || !Number.isFinite(duration) || duration <= 0)
|
|
20
|
+
return Math.max(0, target);
|
|
21
|
+
// ループ再生では長さで折り返す。負にもなり得る(アンカーが未来の場合)ので剰余を正規化する
|
|
22
|
+
return ((target % duration) + duration) % duration;
|
|
23
|
+
}
|
|
24
|
+
/** 再生位置がバッファ済みの範囲に入っているか(端の余裕を見る) */
|
|
25
|
+
export function isTimeBuffered(buffered, time) {
|
|
26
|
+
return buffered.some((range) => time >= range.start && time <= range.end - SYNC_BUFFER_MARGIN);
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* 目標位置と現在位置から、取るべき補正を決める
|
|
30
|
+
*
|
|
31
|
+
* **原則: 補正のコストが誤差より大きいなら補正しない。**
|
|
32
|
+
* ズレを直すためにシークしてバッファが切れるくらいなら、ズレたまま再生を続けるほうが
|
|
33
|
+
* 体験は良い。これを守らないと「ズレる → シーク → バッファ切れ → さらにズレる」の
|
|
34
|
+
* 無限ループになる(VR180 プレイヤーで実際に起きた)。
|
|
35
|
+
*
|
|
36
|
+
* @param positioned 一度でも位置合わせが済んでいるか。
|
|
37
|
+
* 入室直後(false)はバッファが無いのが当たり前なので、
|
|
38
|
+
* バッファ判定を待たずにシークする(これが late-join の追いつき)
|
|
39
|
+
*/
|
|
40
|
+
export function decideVideoSyncAction(params) {
|
|
41
|
+
const { targetTime, currentTime, buffered, trustworthy, positioned } = params;
|
|
42
|
+
// 時計が信用できないなら同期を諦める。精度が出ていないのに合わせにいくと体験を壊す
|
|
43
|
+
if (!trustworthy)
|
|
44
|
+
return { type: 'none', playbackRate: 1 };
|
|
45
|
+
// 入室直後は一度だけ無条件にシークして追いつく(バッファはこれから作られる)
|
|
46
|
+
if (!positioned)
|
|
47
|
+
return { type: 'seek', seekTo: targetTime, playbackRate: 1 };
|
|
48
|
+
const diff = targetTime - currentTime;
|
|
49
|
+
const distance = Math.abs(diff);
|
|
50
|
+
// 合っている。速度を戻すのを忘れると反対側へ突き抜けて振動し続ける
|
|
51
|
+
if (distance < SYNC_DEAD_BAND)
|
|
52
|
+
return { type: 'none', playbackRate: 1 };
|
|
53
|
+
// 速度で吸収できる範囲は穏やかに寄せる(シークより体験が良い)
|
|
54
|
+
if (distance < SYNC_RATE_LIMIT) {
|
|
55
|
+
return { type: 'rate', playbackRate: 1 + Math.sign(diff) * SYNC_RATE_ADJUSTMENT };
|
|
56
|
+
}
|
|
57
|
+
// 目標がバッファ内にあるときだけシークする。
|
|
58
|
+
// バッファ外へのシークは再生が止まるので、ズレたまま再生を続けるほうがまし
|
|
59
|
+
if (isTimeBuffered(buffered, targetTime)) {
|
|
60
|
+
return { type: 'seek', seekTo: targetTime, playbackRate: 1 };
|
|
61
|
+
}
|
|
62
|
+
return { type: 'none', playbackRate: 1 };
|
|
63
|
+
}
|
|
64
|
+
/** `TimeRanges` を素の配列にする(テストしやすくするため) */
|
|
65
|
+
export function toBufferedRanges(ranges) {
|
|
66
|
+
if (!ranges)
|
|
67
|
+
return [];
|
|
68
|
+
const result = [];
|
|
69
|
+
for (let index = 0; index < ranges.length; index++) {
|
|
70
|
+
result.push({ start: ranges.start(index), end: ranges.end(index) });
|
|
71
|
+
}
|
|
72
|
+
return result;
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../src/components/VideoScreen/utils.ts"],"names":[],"mappings":"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"}
|