@realsee/vreo 2.6.5 → 3.0.0-webgpu.10
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/LICENSE-UPDATE.txt +2 -2
- package/README.md +6 -6
- package/lib/PlayController/createHTMLAudioElement.d.ts +1 -0
- package/lib/PlayController/createHTMLAudioElement.d.ts.map +1 -0
- package/lib/PlayController/index.d.ts +14 -24
- package/lib/PlayController/index.d.ts.map +1 -0
- package/lib/PlayController/index.js +74 -220
- package/lib/PlayController/index.js.map +1 -0
- package/lib/Player/App.d.ts +2 -2
- package/lib/Player/App.d.ts.map +1 -0
- package/lib/Player/Controller.d.ts +11 -6
- package/lib/Player/Controller.d.ts.map +1 -0
- package/lib/Player/PlaybackLifecycle.d.ts +1 -0
- package/lib/Player/PlaybackLifecycle.d.ts.map +1 -0
- package/lib/Player/custom/SpatialScenePanel/index.d.ts +2 -2
- package/lib/Player/custom/SpatialScenePanel/index.d.ts.map +1 -0
- package/lib/Player/hooks.d.ts +3 -2
- package/lib/Player/hooks.d.ts.map +1 -0
- package/lib/Player/index.d.ts +3 -2
- package/lib/Player/index.d.ts.map +1 -0
- package/lib/Player/index.js +1770 -437
- package/lib/Player/index.js.map +1 -0
- package/lib/Player/modules/Drawer/index.d.ts +2 -2
- package/lib/Player/modules/Drawer/index.d.ts.map +1 -0
- package/lib/Player/modules/PopUp/index.d.ts +2 -2
- package/lib/Player/modules/PopUp/index.d.ts.map +1 -0
- package/lib/Player/modules/ResizeObserver/index.d.ts +2 -2
- package/lib/Player/modules/ResizeObserver/index.d.ts.map +1 -0
- package/lib/Player/modules/VideoAgent/VideoAgentMesh.d.ts +5 -2
- package/lib/Player/modules/VideoAgent/VideoAgentMesh.d.ts.map +1 -0
- package/lib/Player/modules/VideoAgent/VideoAgentScene.d.ts +8 -5
- package/lib/Player/modules/VideoAgent/VideoAgentScene.d.ts.map +1 -0
- package/lib/Player/modules/VideoAgent/index.d.ts +11 -2
- package/lib/Player/modules/VideoAgent/index.d.ts.map +1 -0
- package/lib/Player/modules/Wave/index.d.ts +2 -2
- package/lib/Player/modules/Wave/index.d.ts.map +1 -0
- package/lib/Player/modules/keyframes/BgMusic/index.d.ts +2 -2
- package/lib/Player/modules/keyframes/BgMusic/index.d.ts.map +1 -0
- package/lib/Player/modules/keyframes/CameraMovement/index.d.ts +2 -2
- package/lib/Player/modules/keyframes/CameraMovement/index.d.ts.map +1 -0
- package/lib/Player/modules/keyframes/InfoPanel/index.d.ts +2 -2
- package/lib/Player/modules/keyframes/InfoPanel/index.d.ts.map +1 -0
- package/lib/Player/modules/keyframes/ModelVideo/index.d.ts +2 -2
- package/lib/Player/modules/keyframes/ModelVideo/index.d.ts.map +1 -0
- package/lib/Player/modules/keyframes/PanoEffect/index.d.ts +2 -2
- package/lib/Player/modules/keyframes/PanoEffect/index.d.ts.map +1 -0
- package/lib/Player/modules/keyframes/PanoEffect/lineAnime.d.ts +3 -2
- package/lib/Player/modules/keyframes/PanoEffect/lineAnime.d.ts.map +1 -0
- package/lib/Player/modules/keyframes/PanoTag/index.d.ts +1 -0
- package/lib/Player/modules/keyframes/PanoTag/index.d.ts.map +1 -0
- package/lib/Player/modules/keyframes/PanoTextLabel/index.d.ts +2 -2
- package/lib/Player/modules/keyframes/PanoTextLabel/index.d.ts.map +1 -0
- package/lib/Player/modules/keyframes/Prompter/index.d.ts +2 -2
- package/lib/Player/modules/keyframes/Prompter/index.d.ts.map +1 -0
- package/lib/Player/modules/keyframes/UpdateVRPanorama/index.d.ts +2 -2
- package/lib/Player/modules/keyframes/UpdateVRPanorama/index.d.ts.map +1 -0
- package/lib/Player/modules/keyframes/VideoEffect/index.d.ts +2 -2
- package/lib/Player/modules/keyframes/VideoEffect/index.d.ts.map +1 -0
- package/lib/Player/playback-types.d.ts +1 -0
- package/lib/Player/playback-types.d.ts.map +1 -0
- package/lib/Player/typings.d.ts +2 -1
- package/lib/Player/typings.d.ts.map +1 -0
- package/lib/chunks/index-BgPSzRSs.js +93 -0
- package/lib/chunks/index-BgPSzRSs.js.map +1 -0
- package/lib/chunks/index-CunyJn6H.js +51 -0
- package/lib/chunks/index-CunyJn6H.js.map +1 -0
- package/lib/fivePlugins/CSS3DRenderPlugin/centerPoint.d.ts +2 -1
- package/lib/fivePlugins/CSS3DRenderPlugin/centerPoint.d.ts.map +1 -0
- package/lib/fivePlugins/CSS3DRenderPlugin/createResizeObserver.d.ts +5 -6
- package/lib/fivePlugins/CSS3DRenderPlugin/createResizeObserver.d.ts.map +1 -0
- package/lib/fivePlugins/CSS3DRenderPlugin/evenNumber.d.ts +1 -0
- package/lib/fivePlugins/CSS3DRenderPlugin/evenNumber.d.ts.map +1 -0
- package/lib/fivePlugins/CSS3DRenderPlugin/index.d.ts +5 -22
- package/lib/fivePlugins/CSS3DRenderPlugin/index.d.ts.map +1 -0
- package/lib/fivePlugins/CSS3DRenderPlugin/transformPositionToVector3.d.ts +2 -1
- package/lib/fivePlugins/CSS3DRenderPlugin/transformPositionToVector3.d.ts.map +1 -0
- package/lib/fivePlugins/CameraMovementPlugin/index.d.ts +2 -1
- package/lib/fivePlugins/CameraMovementPlugin/index.d.ts.map +1 -0
- package/lib/fivePlugins/CameraMovementPlugin/typings.d.ts +2 -1
- package/lib/fivePlugins/CameraMovementPlugin/typings.d.ts.map +1 -0
- package/lib/fivePlugins/ModelTVVideoPlugin/index.d.ts +2 -1
- package/lib/fivePlugins/ModelTVVideoPlugin/index.d.ts.map +1 -0
- package/lib/index.d.ts +3 -0
- package/lib/index.d.ts.map +1 -0
- package/lib/index.js +12 -1
- package/lib/index.js.map +1 -0
- package/lib/plugins/CSS3DRenderPlugin.js +115 -0
- package/lib/plugins/CSS3DRenderPlugin.js.map +1 -0
- package/lib/plugins/CameraMovementPlugin.js +6 -0
- package/lib/plugins/CameraMovementPlugin.js.map +1 -0
- package/lib/plugins/ModelTVVideoPlugin.js +162 -0
- package/lib/plugins/ModelTVVideoPlugin.js.map +1 -0
- package/lib/react/index.d.ts +5 -4
- package/lib/react/index.d.ts.map +1 -0
- package/lib/react/index.js +39 -226
- package/lib/react/index.js.map +1 -0
- package/lib/shared-utils/Audio.d.ts +3 -1
- package/lib/shared-utils/Audio.d.ts.map +1 -0
- package/lib/shared-utils/AudioLike.d.ts +2 -1
- package/lib/shared-utils/AudioLike.d.ts.map +1 -0
- package/lib/shared-utils/Preloader.d.ts +1 -0
- package/lib/shared-utils/Preloader.d.ts.map +1 -0
- package/lib/shared-utils/addResizeListener.d.ts +2 -1
- package/lib/shared-utils/addResizeListener.d.ts.map +1 -0
- package/lib/shared-utils/animationFrame/BetterTween.d.ts +1 -0
- package/lib/shared-utils/animationFrame/BetterTween.d.ts.map +1 -0
- package/lib/shared-utils/animationFrame/index.d.ts +5 -14
- package/lib/shared-utils/animationFrame/index.d.ts.map +1 -0
- package/lib/shared-utils/animationFrame/tween.d.ts +1 -0
- package/lib/shared-utils/animationFrame/tween.d.ts.map +1 -0
- package/lib/shared-utils/createTransMatrix.d.ts +3 -1
- package/lib/shared-utils/createTransMatrix.d.ts.map +1 -0
- package/lib/shared-utils/getFileExpandedName.d.ts +1 -0
- package/lib/shared-utils/getFileExpandedName.d.ts.map +1 -0
- package/lib/shared-utils/getMediaInfo.d.ts +1 -0
- package/lib/shared-utils/getMediaInfo.d.ts.map +1 -0
- package/lib/shared-utils/setElementDataset.d.ts +1 -0
- package/lib/shared-utils/setElementDataset.d.ts.map +1 -0
- package/lib/timeline/index.d.ts +18 -0
- package/lib/timeline/index.d.ts.map +1 -0
- package/lib/types/index.js +10 -0
- package/lib/types/index.js.map +1 -0
- package/lib/typings/VreoUnit.d.ts +2 -1
- package/lib/typings/VreoUnit.d.ts.map +1 -0
- package/lib/typings/index.d.ts +1 -0
- package/lib/typings/index.d.ts.map +1 -0
- package/package.json +50 -70
- package/lib/PlayController/createHTMLAudioElement.js +0 -34
- package/lib/Player/App.js +0 -52
- package/lib/Player/Controller.js +0 -536
- package/lib/Player/PlaybackLifecycle.js +0 -118
- package/lib/Player/custom/SpatialScenePanel/index.js +0 -240
- package/lib/Player/hooks.js +0 -22
- package/lib/Player/modules/Drawer/index.js +0 -40
- package/lib/Player/modules/PopUp/index.js +0 -23
- package/lib/Player/modules/ResizeObserver/index.js +0 -22
- package/lib/Player/modules/VideoAgent/VideoAgentMesh.js +0 -456
- package/lib/Player/modules/VideoAgent/VideoAgentScene.js +0 -53
- package/lib/Player/modules/VideoAgent/index.js +0 -72
- package/lib/Player/modules/Wave/index.js +0 -171
- package/lib/Player/modules/keyframes/BgMusic/index.js +0 -65
- package/lib/Player/modules/keyframes/CameraMovement/index.js +0 -75
- package/lib/Player/modules/keyframes/InfoPanel/index.js +0 -170
- package/lib/Player/modules/keyframes/ModelVideo/index.js +0 -128
- package/lib/Player/modules/keyframes/PanoEffect/index.js +0 -99
- package/lib/Player/modules/keyframes/PanoEffect/lineAnime.js +0 -30
- package/lib/Player/modules/keyframes/PanoTag/index.js +0 -110
- package/lib/Player/modules/keyframes/PanoTextLabel/index.js +0 -122
- package/lib/Player/modules/keyframes/Prompter/index.js +0 -56
- package/lib/Player/modules/keyframes/UpdateVRPanorama/index.js +0 -98
- package/lib/Player/modules/keyframes/VideoEffect/index.js +0 -154
- package/lib/Player/playback-types.js +0 -1
- package/lib/Player/typings.js +0 -1
- package/lib/fivePlugins/CSS3DRenderPlugin/centerPoint.js +0 -4
- package/lib/fivePlugins/CSS3DRenderPlugin/createResizeObserver.js +0 -25
- package/lib/fivePlugins/CSS3DRenderPlugin/evenNumber.js +0 -4
- package/lib/fivePlugins/CSS3DRenderPlugin/index.js +0 -226
- package/lib/fivePlugins/CSS3DRenderPlugin/transformPositionToVector3.js +0 -8
- package/lib/fivePlugins/CameraMovementPlugin/index.js +0 -245
- package/lib/fivePlugins/CameraMovementPlugin/typings.js +0 -15
- package/lib/fivePlugins/ModelTVVideoPlugin/index.js +0 -349
- package/lib/shared-utils/Audio.js +0 -151
- package/lib/shared-utils/AudioLike.js +0 -123
- package/lib/shared-utils/Preloader.js +0 -37
- package/lib/shared-utils/addResizeListener.js +0 -39
- package/lib/shared-utils/animationFrame/BetterTween.js +0 -58
- package/lib/shared-utils/animationFrame/index.js +0 -52
- package/lib/shared-utils/animationFrame/tween.js +0 -58
- package/lib/shared-utils/createTransMatrix.js +0 -12
- package/lib/shared-utils/getFileExpandedName.js +0 -6
- package/lib/shared-utils/getMediaInfo.js +0 -55
- package/lib/shared-utils/setElementDataset.js +0 -16
- package/lib/typings/VreoUnit.js +0 -64
- package/lib/typings/index.js +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../resources/Player/PlaybackLifecycle.ts","../../resources/shared-utils/setElementDataset.ts","../../resources/shared-utils/getFileExpandedName.ts","../../resources/shared-utils/getMediaInfo.ts","../../resources/Player/Controller.ts","../../resources/Player/hooks.ts","../../resources/Player/modules/keyframes/CameraMovement/index.tsx","../../resources/shared-utils/addResizeListener.ts","../../resources/Player/modules/ResizeObserver/index.tsx","../../resources/Player/modules/keyframes/InfoPanel/index.tsx","../../resources/shared-utils/createTransMatrix.ts","../../resources/Player/modules/keyframes/ModelVideo/index.tsx","../../resources/shared-utils/animationFrame/BetterTween.ts","../../resources/Player/modules/keyframes/PanoEffect/lineAnime.ts","../../resources/Player/modules/keyframes/PanoEffect/index.tsx","../../resources/Player/modules/keyframes/PanoTag/index.tsx","../../resources/Player/modules/keyframes/PanoTextLabel/index.tsx","../../resources/Player/modules/keyframes/Prompter/index.tsx","../../resources/Player/modules/keyframes/UpdateVRPanorama/index.tsx","../../resources/Player/modules/keyframes/VideoEffect/index.tsx","../../resources/shared-utils/Preloader.ts","../../resources/shared-utils/AudioLike.ts","../../resources/Player/modules/VideoAgent/VideoAgentMesh.ts","../../resources/Player/modules/VideoAgent/VideoAgentScene.ts","../../resources/Player/modules/VideoAgent/index.tsx","../../resources/shared-utils/Audio.ts","../../resources/Player/modules/keyframes/BgMusic/index.tsx","../../resources/Player/modules/Wave/index.tsx","../../resources/Player/App.tsx","../../resources/Player/modules/Drawer/index.tsx","../../resources/Player/modules/PopUp/index.tsx","../../resources/Player/custom/SpatialScenePanel/index.tsx","../../resources/Player/index.tsx"],"sourcesContent":["import type { MediaOperations, PlaybackController, PlaybackManager, PlaybackSession } from './playback-types'\n\nexport interface PlaybackRun {\n readonly session?: PlaybackSession\n readonly mediaManager?: PlaybackManager\n valid(): boolean\n bind(element: HTMLMediaElement): MediaOperations\n}\n\n/** Local timeline lifetime only. Playback permission is owned by the injected manager. */\nexport class PlaybackLifecycle {\n private controller?: PlaybackController\n private run?: PlaybackRun\n private generation = 0\n private disposed = false\n private members = new Set<() => void>()\n constructor(manager: PlaybackManager | undefined, private onStop: () => void) {\n this.controller = manager?.createController({ label: 'vreo', onCancel: () => this.stop() })\n }\n get active() { return !!this.run?.valid() }\n capture() { return this.run }\n begin(userAction: boolean) {\n if (this.disposed) return false\n if (this.active) return true\n const session = this.controller?.begin({ userAction, audible: true }) ?? undefined\n if (this.controller && !session) return false\n const generation = ++this.generation\n const mediaManager = session?.mediaManager\n this.run = {\n session, mediaManager,\n valid: () => generation === this.generation && !this.disposed && !session?.signal.aborted,\n bind: element => session ? session.bind(element) : element,\n }\n return true\n }\n add(stop: () => void) { this.members.add(stop); return () => { this.members.delete(stop) } }\n private stop() {\n ++this.generation\n this.run = undefined\n const errors: unknown[] = []\n try { this.onStop() } catch (error) { errors.push(error) }\n for (const stop of [...this.members]) { try { stop() } catch (error) { errors.push(error) } }\n if (errors.length) throw errors[0]\n }\n cancel() {\n const generation = this.generation\n this.controller?.cancel()\n if (generation === this.generation) this.stop()\n }\n finish() { const session = this.run?.session; this.stop(); session?.finish() }\n dispose() {\n if (this.disposed) return\n this.disposed = true\n const generation = this.generation\n this.controller?.dispose()\n if (generation === this.generation) this.stop()\n this.members.clear()\n }\n}\n","export default function setElementDataset(element: any, dataset: Record<string, string | number>) {\n if (element) {\n Object.keys(dataset).forEach((key) => {\n \n const value = dataset[key].toString()\n\n if (element instanceof Element) {\n element.setAttribute(`data-${key}`, value)\n } else if (element instanceof Document) {\n element.documentElement.setAttribute(`data-${key}`, value)\n } else if (element instanceof HTMLElement) {\n element.dataset[key] = value\n } else {\n (element as any).setAttribute(`data-${key}`, value)\n }\n })\n}\n}\n","export default function getFileExpandedName(filePath?: string | null) {\n if (!filePath) return ''\n const index = filePath.lastIndexOf('.')\n const ext = filePath.substring(index + 1)\n return ext.toLowerCase()\n}\n","import getFileExpandedName from './getFileExpandedName'\n\nexport default function getMediaInfo(fileUrl: string): Promise<{\n duration?: number | undefined\n type?: 'video' | 'audio' | 'image' | 'unknown' | undefined\n error?: string | undefined\n}> {\n const type = getMediaType(fileUrl)\n if (!type) return Promise.resolve({ error: '未知的文件类型: ' + fileUrl })\n const mediaElement = (() => {\n if (type === 'video') return document.createElement('video')\n if (type === 'audio') return document.createElement('audio')\n })()\n if (!mediaElement) return Promise.resolve({ error: 'Unknown media element' })\n mediaElement.src = fileUrl\n return new Promise<{ duration?: number; type?: 'video' | 'audio' | 'image' | 'unknown'; error?: string }>((resolve) => {\n mediaElement.onerror = () => resolve({ error: 'onerror' })\n mediaElement.onloadedmetadata = () => {\n resolve({ duration: mediaElement.duration * 1000, type }) // s => ms\n }\n })\n}\n\nexport function getMediaType(url?: string) {\n const fileExpandedName = getFileExpandedName(url)\n const type = getMediaTypeByExpandedName(fileExpandedName)\n return type\n}\n\nexport function getMediaTypeByExpandedName(fileExpandedName?: string | null) {\n if (!fileExpandedName) return 'unknown'\n if (/jpg|jpeg|png$/.test(fileExpandedName)) return 'image'\n if (/mp3|wav$/.test(fileExpandedName)) return 'audio'\n if (/avi|wmv|mpeg|mp4|m4v|mov|asf|flv|f4v|rmvb|rm|3gp|vob$/.test(fileExpandedName)) return 'video'\n return 'unknown'\n}\n\nexport function getMediaTypeByUrl(fileUrl?: string | null) {\n if (!fileUrl) return\n const fileExpandedName = getFileExpandedName(fileUrl)\n return getMediaTypeByExpandedName(fileExpandedName)\n}\n\nexport function getFileName(fileUrl?: string) {\n if (!fileUrl) return ''\n const index1 = fileUrl.lastIndexOf('/')\n const index2 = fileUrl.lastIndexOf('\\\\')\n const index3 = fileUrl.lastIndexOf('\\\\\\\\')\n const index = Math.max(index1, index2, index3)\n const ext = fileUrl.substring(index + 1)\n return ext\n}\n","import { PlaybackLifecycle } from './PlaybackLifecycle'\nimport { Five, Subscribe } from '@realsee/five-webgpu'\nimport { action, computed, makeObservable, observable, observableRef, reaction } from 'mobx'\nimport * as React from 'react'\nimport { requestAnimationFrameInterval } from '../shared-utils/animationFrame'\nimport { VreoKeyframe, VreoKeyframeEnum, VreoKeyframeEvent, VreoUnit, VreoVideo } from '../typings/VreoUnit'\nimport { VideoAgentScene } from './modules/VideoAgent/VideoAgentScene'\nimport { Appearance, PlayerConfigs, WaveAppearance } from './typings'\nimport setElementDataset from '../shared-utils/setElementDataset'\nimport { getMediaType } from '../shared-utils/getMediaInfo'\nimport { Timeline } from '../timeline'\n\n/**\n * Vreo 播放器逻辑控制器\n * \n * 负责管理播放器的内部状态、事件处理、UI 控制和剧本执行。\n * 提供播放控制、外观设置、弹窗管理、抽屉控制等功能。\n * \n * @example\n * ```typescript\n * const controller = new Controller({\n * five: fiveInstance,\n * container: document.getElementById('container'),\n * configs: playerConfigs\n * })\n * \n * // 设置播放状态\n * controller.setPlaying(true)\n * \n * // 打开弹窗\n * controller.openPopUp('弹窗内容')\n * \n * // 打开抽屉\n * controller.openDrawer({ content: '抽屉内容', height: 300 })\n * ```\n */\nexport class Controller extends Subscribe<VreoKeyframeEvent> {\n\n five: Five\n configs: PlayerConfigs\n videoAgentScene?: VideoAgentScene\n vreoUnit?: VreoUnit\n stopInterval?: () => void\n playing = false\n ended = false\n loading: boolean | null = false // null 表示加载失败\n containerSize: { width: number, height: number } = { width: 0, height: 0 }\n appSize?: 'S' | 'M' | 'L' | 'XL'\n container: Element\n waveAppearance: WaveAppearance | null = null\n appearance: Appearance = {\n waveStyle: 'wave',\n }\n avatar: VreoVideo['avatar'] = {}\n\n /**\n * 是否正在等待背景音乐加载\n * 当此状态为 true 时,播放流程会暂停,等待音频加载完成\n */\n waitingForBgMusic = false\n\n visible = false\n\n /**\n * 获取当前播放媒体的类型\n * @returns 'video' | 'avatar' | 'none' - 媒体类型\n */\n get agentType() {\n const type = getMediaType(this.videoAgentScene?.videoAgentMesh.videoUrl)\n if (this.avatar?.force) return 'avatar'\n if (type === 'video') return 'video'\n return 'none'\n }\n\n popUp: string | React.ReactElement | null = null\n\n /**\n * 打开或关闭弹窗\n * @param popUp - 弹窗内容,可以是字符串、JSX元素或false(关闭弹窗)\n */\n openPopUp(popUp: string | React.ReactElement | false) {\n if (!popUp) {\n this.popUp = null\n return\n }\n this.popUp = popUp\n }\n\n /**\n * 设置加载状态\n * @param loading - 加载状态:true(加载中)、false(加载完成)、null(加载失败)\n */\n setLoading(loading: boolean | null) {\n this.loading = loading\n }\n\n drawerConfig: {\n content: string | React.ReactElement\n height?: number | string\n } | null = null\n\n /**\n * 设置虚拟形象配置\n * @param avatar - 虚拟形象配置对象\n */\n setAvatar(avatar: VreoVideo['avatar']) {\n this.avatar = avatar\n }\n\n /**\n * 设置容器尺寸\n * @param width - 容器宽度\n * @param height - 容器高度\n */\n setContainerSize(width: number, height: number) {\n this.containerSize = { width, height }\n }\n\n /**\n * 设置播放器可见性\n * @param v - 是否可见\n */\n setVisible(v: boolean) {\n this.visible = v\n }\n\n /**\n * 设置播放状态\n * @param playing - 是否正在播放\n */\n setPlaying(playing: boolean) {\n if (playing && !this.playback.active) return\n this.playing = playing\n if (playing) this.resumeMedia()\n }\n\n /**\n * 设置结束状态\n * @param ended - 是否已结束\n */\n setEnded(ended: boolean) {\n this.ended = ended\n }\n\n /**\n * 设置是否正在等待背景音乐加载\n * @param waiting - 是否正在等待\n */\n setWaitingForBgMusic(waiting: boolean) {\n this.waitingForBgMusic = waiting\n }\n\n /**\n * 设置播放器外观\n * @param appearance - 外观配置对象\n */\n setAppearance(appearance: Appearance) {\n this.appearance = { ...this.appearance, ...appearance }\n }\n\n /**\n * 打开或关闭抽屉\n * @param drawerConfig - 抽屉配置对象,false表示关闭抽屉\n */\n openDrawer(drawerConfig?: false | { content: string | React.ReactElement; height?: number | string }) {\n if (!drawerConfig) {\n this.drawerConfig = {\n content: '',\n height: this.drawerConfig?.height\n }\n return\n }\n\n this.drawerConfig = drawerConfig\n }\n\n /**\n * 创建 Controller 实例\n * @param params - 构造参数对象\n * @param params.five - Five 渲染引擎实例\n * @param params.container - DOM 容器元素\n * @param params.configs - 播放器配置\n */\n private resumeGeneration = 0\n private resuming: number | undefined\n private disposers: (() => void)[] = []\n readonly playback: PlaybackLifecycle\n private readonly timeline = new Timeline<VreoKeyframe>()\n\n constructor({five, container, configs}: { five: Five, container: Element, configs: PlayerConfigs }) {\n super()\n\n this.playback = new PlaybackLifecycle(configs.mediaManager, () => {\n this.resuming = undefined\n ++this.resumeGeneration\n this.setPlaying(false)\n this.videoAgentScene?.videoAgentMesh.stop()\n this.setWaitingForBgMusic(false)\n })\n this.configs = configs\n this.container = container\n this.five = five\n this.appSize = configs.appSize\n this.appearance = { ...this.appearance, ...configs.appearance }\n\n makeObservable(this, {\n visible: observable,\n setVisible: action,\n playing: observable,\n setPlaying: action,\n loading: observable,\n videoAgentScene: observableRef,\n setLoading: action,\n popUp: observableRef,\n openPopUp: action,\n drawerConfig: observableRef,\n openDrawer: action,\n ended: observable,\n waveAppearance: observable,\n avatar: observable,\n containerSize: observable,\n setContainerSize: action,\n appearance: observable,\n setAppearance: action,\n configs: observableRef,\n setEnded: action,\n setAvatar: action,\n waitingForBgMusic: observable,\n setWaitingForBgMusic: action,\n })\n\n this.disposers.push(reaction<[typeof this.appearance.waveStyle, boolean | null], boolean>(\n () => [this.appearance.waveStyle, this.loading], \n ([waveStyle, loading]) => {\n if (loading === null) {\n this.waveAppearance = null\n return\n }\n if (waveStyle === 'wave') {\n switch (loading) {\n case true:\n this.waveAppearance = 'double'\n break\n case false:\n this.waveAppearance = 'solid'\n break\n }\n } else if (waveStyle === 'solid') {\n switch (loading) {\n case true:\n this.waveAppearance = 'swap'\n break\n case false:\n this.waveAppearance = 'expand'\n break\n }\n }\n }, \n { fireImmediately: true }\n ))\n\n if (!this.appSize) {\n this.disposers.push(reaction(\n () => this.containerSize,\n (containerSize) => {\n if (!containerSize?.width) return\n const width = containerSize.width\n const height = containerSize.height\n const size = (() => {\n if (width <= 500) return 'S'\n if (width <= 1024) return 'M'\n if (width <= 2048) return 'L'\n return 'XL'\n })()\n const orientation = (() => {\n if (height > width) return 'portrait'\n return 'landscape'\n })()\n setElementDataset(this.container, { size })\n setElementDataset(this.container, { orientation })\n },\n { fireImmediately: true }\n ))\n } else {\n setElementDataset(this.container, { size: this.appSize })\n }\n\n // 监听播放情况:抛出触发时机\n this.disposers.push(reaction(\n () => this.ended,\n (ended) => {\n if (ended) {\n this.emit('paused', true)\n }\n }\n ))\n\n this.disposers.push(reaction(\n () => this.playing,\n (playing) => {\n if (!this.ended) {\n this.emit(playing ? 'playing' : 'paused')\n }\n }\n ))\n\n }\n\n /**\n * 获取播放器是否准备就绪\n * @returns 是否有可用的视频代理场景\n */\n get ready() {\n return !!this.videoAgentScene\n }\n\n /**\n * 获取当前播放时间(毫秒)\n * @returns 当前播放时间戳\n */\n get currentTime() {\n return this.videoAgentScene?.videoAgentMesh.currentTime || 0\n }\n\n /**\n * 获取当前时间点应该触发的关键帧\n * @returns 当前应该执行的关键帧数组\n */\n loadTimeline(keyframes: readonly VreoKeyframe[]) {\n this.timeline.load(keyframes)\n }\n\n seekTimeline(currentTime: number) {\n this.timeline.seek(currentTime)\n }\n\n resetTimeline(type?: VreoKeyframeEnum) {\n this.timeline.reset(type)\n }\n\n get currentKeyframes() {\n return this.timeline.pendingAt(this.currentTime)\n }\n\n /**\n * 获取当前媒体实例(音频或视频元素)\n * @returns HTML媒体元素实例\n */\n get mediaInstance() {\n return this.videoAgentScene?.videoAgentMesh.mediaInstance\n }\n\n /**\n * 逐帧任务循环处理\n * \n * 在每个动画帧中检查播放状态、处理关键帧触发等\n * @param callback - 关键帧触发时的回调函数\n */\n requestAnimationFrameLoop(callback: (type: VreoKeyframeEnum, keyframe: VreoKeyframe, currentTime: number) => void) {\n // 如果正在等待背景音乐加载,暂停整个播放流程\n if (this.waitingForBgMusic) {\n if (!this.mediaInstance?.paused) {\n this.videoAgentScene?.videoAgentMesh.mediaOperations?.pause()\n }\n return\n }\n\n if (this.mediaInstance?.ended && this.mediaInstance.currentTime !== 0) {\n if (this.ended) return\n this.timeline.reset()\n const media = this.videoAgentScene?.videoAgentMesh.mediaOperations\n media?.pause()\n if (media) media.currentTime = 0\n this.playback.finish()\n this.setEnded(true)\n this.setPlaying(false)\n return\n }\n\n if (!this.playing) {\n if (!this.mediaInstance?.paused) {\n this.videoAgentScene?.videoAgentMesh.mediaOperations?.pause()\n }\n return\n }\n\n this.resumeMedia()\n \n const run = this.playback.capture()\n if (!run?.valid()) return\n const currentTime = this.currentTime\n this.timeline.take(currentTime).forEach((keyframe) => {\n this.emit(keyframe.type, keyframe, currentTime)\n if (run.valid()) callback(keyframe.type, keyframe, currentTime)\n })\n }\n\n private resumeMedia() {\n if (this.waitingForBgMusic) return\n if (this.mediaInstance?.paused && this.playing && !this.resuming) {\n const attempt = ++this.resumeGeneration\n this.resuming = attempt\n const run = this.playback.capture()\n const valid = () => !!run?.valid()\n void this.videoAgentScene?.videoAgentMesh.play().catch(error => {\n if (valid()) { this.playback.cancel(); console.error(error) }\n }).finally(() => { if (this.resuming === attempt) this.resuming = undefined })\n }\n }\n\n /**\n * 开始运行播放器逻辑循环\n * \n * 启动帧循环,持续监听并处理关键帧事件\n * @param callback - 关键帧触发时的回调函数\n */\n run(callback: (type: VreoKeyframeEnum, keyframe: VreoKeyframe) => void) {\n if (this.stopInterval) return\n this.stopInterval = requestAnimationFrameInterval(() => this.requestAnimationFrameLoop(callback))\n }\n\n /**\n * 清理播放器状态\n * \n * 停止播放、重置关键帧状态、清理数据和定时器\n */\n clear() {\n this.setPlaying(false)\n\n this.timeline.reset()\n\n /**\n * 清理掉数据\n */\n this.vreoUnit = undefined\n this.timeline.clear()\n if (this.mediaInstance) {\n this.videoAgentScene?.videoAgentMesh.mediaOperations?.pause()\n if (this.videoAgentScene?.videoAgentMesh.mediaOperations) this.videoAgentScene.videoAgentMesh.mediaOperations.currentTime = 0\n }\n\n this.stopInterval?.()\n this.stopInterval = undefined\n }\n\n /**\n * 销毁控制器实例\n * \n * 清理所有状态和资源,释放内存\n */\n dispose() {\n this.disposers.splice(0).forEach(dispose => dispose())\n this.playback.dispose()\n this.clear()\n }\n}\n\nconst ControllerContext = React.createContext<Controller | null>(null)\n\nexport { ControllerContext }\n","import React from 'react'\nimport { Vector3 } from 'three/webgpu'\nimport { ControllerContext } from './Controller'\n\nexport function useController() {\n const controller = React.useContext(ControllerContext)\n if (!controller) {\n throw new Error('没有找到 \"ControllerContext\"')\n }\n\n return controller\n}\n\nexport function useFiveInstance() {\n const controller = useController()\n if (!controller.five) {\n throw new Error('没有找到 \"five\" 实例')\n }\n\n return controller.five\n}\n\nexport function useFiveProject2d() {\n const five = useFiveInstance()\n return (vector: Vector3) => five.project2d(vector, false)\n}\n","import * as React from 'react'\nimport { CameraMovementPlugin } from '../../../../fivePlugins/CameraMovementPlugin'\nimport { CameraMovementEffect, MoveArgs, RotateArgs } from '../../../../fivePlugins/CameraMovementPlugin/typings'\nimport { CameraMovementData, VreoKeyframe, VreoKeyframeEnum } from '../../../../typings/VreoUnit'\nimport { useController, useFiveInstance } from '../../../hooks'\n\nexport function CameraMovement() {\n const controller = useController()\n const five = useFiveInstance()\n const ref = React.useRef<ReturnType<typeof CameraMovementPlugin> | undefined>(undefined)\n\n React.useEffect(() => {\n const callback = async (keyframe: VreoKeyframe) => {\n if (!ref.current) {\n ref.current = CameraMovementPlugin(five, {})\n }\n const { start, end, data } = keyframe\n const cameraMovementData = data as CameraMovementData\n const effect = cameraMovementData.effect\n if (effect === CameraMovementEffect.Rotate) {\n await ref.current.rotate(data as RotateArgs, end - start)\n } else if (effect === CameraMovementEffect.Move) {\n await ref.current.move(data as MoveArgs, end - start)\n } else if (cameraMovementData.panoIndex !== undefined && cameraMovementData.panoIndex !== five.panoIndex) {\n await ref.current.move(data as MoveArgs, end - start)\n } else {\n await ref.current.rotate(data as RotateArgs, end - start)\n }\n }\n\n controller.on(VreoKeyframeEnum.CameraMovement, callback)\n return () => {\n controller.off(VreoKeyframeEnum.CameraMovement, callback)\n }\n }, [controller])\n return <></>\n}\n","type ResizeHandler = (width: number, height: number) => void\n\nconst resizeObserverCache = new Map<Element, number>()\n\nfunction add(element: Element) {\n resizeObserverCache.set(element, (resizeObserverCache.get(element) ?? 0) + 1)\n}\n\nfunction remove(element: Element) {\n const remaining = (resizeObserverCache.get(element) ?? 1) - 1\n if (remaining > 0) resizeObserverCache.set(element, remaining)\n else resizeObserverCache.delete(element)\n}\n\nexport function addResizeListener(element: Element | undefined | null, resizeHandler: ResizeHandler, immediate = true) {\n if (!element) return () => {}\n if (immediate) resizeHandler(element.clientWidth, element.clientHeight)\n\n let disposed = false\n if (typeof ResizeObserver !== 'undefined') {\n const observer = new ResizeObserver(() => resizeHandler(element.clientWidth, element.clientHeight))\n observer.observe(element)\n add(element)\n return () => {\n if (disposed) return\n disposed = true\n observer.disconnect()\n remove(element)\n }\n }\n\n const iframe = document.createElement('iframe')\n iframe.style.cssText = 'position:absolute;top:0;left:0;width:100%;height:100%;pointer-events:none;opacity:0;visibility:hidden;margin:0;border:0;padding:0;z-index:-1;'\n iframe.classList.add('resize-sensor-iframe')\n element.appendChild(iframe)\n const contentWindow = iframe.contentWindow\n if (!contentWindow) {\n iframe.remove()\n return () => {}\n }\n const onResize = () => resizeHandler(iframe.clientWidth, iframe.clientHeight)\n contentWindow.addEventListener('resize', onResize)\n add(element)\n return () => {\n if (disposed) return\n disposed = true\n contentWindow.removeEventListener('resize', onResize)\n iframe.remove()\n remove(element)\n }\n}\n\nexport function hasResizeListener(element?: Element | null) {\n return !!element && (resizeObserverCache.get(element) ?? 0) > 0\n}\n","import React from 'react'\nimport { addResizeListener, hasResizeListener } from '../../../shared-utils/addResizeListener'\nimport { useController } from '../../hooks'\n\nexport function ResizeObserver() {\n const ref = React.useRef<HTMLDivElement>(null)\n const controller = useController()\n\n React.useEffect(() => {\n if (!ref.current) return\n const resizeElement = controller.container.parentElement\n if (hasResizeListener(resizeElement)) return\n const dispose = addResizeListener(resizeElement, (width, height) => {\n controller.setContainerSize(width, height)\n })\n\n return () => {\n dispose()\n }\n }, [])\n\n return <div className=\"resizeObserver-element\" ref={ref}></div>\n}","import * as React from 'react'\nimport { ReactNode } from 'react'\nimport {\n InfoPanelData,\n InfoPanelStyleEnum,\n InfoPanelTypeEnum,\n VreoKeyframe,\n VreoKeyframeEnum,\n} from '../../../../typings/VreoUnit'\nimport { useController } from '../../../hooks'\n\n\nfunction InfoPanelImg({ url, children }: { url: string; children?: ReactNode }) {\n return (\n <div className=\"vreo-infoPanel-container\">\n <div className=\"vreo-infoPanel\">\n {children}\n <img src={url}></img>\n </div>\n </div>\n )\n}\n\nfunction InfoPanelVideo({ url, children }: { url: string; children?: ReactNode }) {\n const videoWrapperRef = React.useRef<HTMLDivElement>(null)\n const controller = useController()\n\n React.useEffect(() => {\n // if (!isIOSorWX) return\n const video = controller.configs?.videos?.videoPanel || document.createElement('video')\n const run = controller.playback.capture()\n const valid = () => !!run?.valid()\n if (!run?.valid()) return\n const output = run.bind(video)\n let disposed = false\n video.playsInline = true\n output.muted = true\n const stop = () => { disposed = true; output.muted = true; output.pause(); video.removeEventListener('canplaythrough', canplaythrough) }\n if (!videoWrapperRef.current) return\n const remove = controller.playback.add(stop)\n output.src = url\n if (!videoWrapperRef.current.contains(video)) {\n videoWrapperRef.current.appendChild(video)\n }\n\n const canplaythrough = () => {\n video.removeEventListener('canplaythrough', canplaythrough)\n if (disposed || !valid()) return\n output.muted = false\n void output.play().catch(error => { if (valid() && !disposed) { stop(); controller.playback.cancel(); console.error(error) } })\n }\n video.addEventListener('canplaythrough', canplaythrough)\n output.load()\n // output.play()\n\n return () => {\n stop()\n remove()\n if (videoWrapperRef.current?.contains(video)) {\n videoWrapperRef.current.removeChild(video)\n }\n }\n }, [controller, url])\n\n return (\n <div className=\"vreo-infoPanel-container\">\n <div className='vreo-infoPanel'>\n {children}\n <div className='vreo-infoPanel-inner' ref={videoWrapperRef}>\n {/* {!isIOSorWX && <video playsInline webkit-playsinline=\"true\" autoPlay src={url} />} */}\n </div>\n </div>\n </div>\n )\n}\n\ninterface TitleProps {\n title?: string\n subTitle?: string\n}\n\nconst Title = (props: TitleProps) => {\n if (!props.title && !props.subTitle) {\n return null\n }\n\n return (\n <>\n {/* <div className=\"vreo-infoPanel-title-shadow\"></div> */}\n <div className=\"vreo-infoPanel-title\">\n <div className=\"vreo-infoPanel-t1\">{props.title}</div>\n <div className=\"vreo-infoPanel-t2\">{props.subTitle}</div>\n </div>\n </>\n )\n}\n\nexport function InfoPanel() {\n const timeoutRef = React.useRef<NodeJS.Timeout | null>(null)\n const controller = useController()\n\n React.useEffect(() => {\n if (controller.configs?.keyframeMap.InfoPanel === false) {\n return\n }\n\n const callback = (keyframe: VreoKeyframe) => {\n const { start, end, data } = keyframe\n\n const infoPanelData = data as InfoPanelData\n\n const { title, subTitle, style } = infoPanelData\n do {\n if (style === InfoPanelStyleEnum.PopUp) {\n if (infoPanelData.type === InfoPanelTypeEnum.Image) {\n controller.openPopUp(\n <InfoPanelImg url={infoPanelData.url}>\n <Title title={title} subTitle={subTitle} />\n </InfoPanelImg>\n )\n } else if (infoPanelData.type === InfoPanelTypeEnum.Video) {\n controller.openPopUp(\n <InfoPanelVideo url={infoPanelData.url}>\n <Title title={title} subTitle={subTitle} />\n </InfoPanelVideo>\n )\n }\n break\n }\n if (infoPanelData.type === InfoPanelTypeEnum.Image) {\n controller.openDrawer({\n content: (\n <InfoPanelImg url={infoPanelData.url}>\n <Title title={title} subTitle={subTitle} />\n </InfoPanelImg>\n ),\n height: '60vh',\n })\n } else if (infoPanelData.type === InfoPanelTypeEnum.Video) {\n controller.openDrawer({\n content: (\n <InfoPanelVideo url={infoPanelData.url}>\n <Title title={title} subTitle={subTitle} />\n </InfoPanelVideo>\n ),\n height: '60vh',\n })\n }\n } while (false)\n\n timeoutRef.current = setTimeout(() => {\n controller.openDrawer(false)\n controller.openPopUp(false)\n }, end - start)\n }\n controller.on(VreoKeyframeEnum.InfoPanel, callback)\n\n const close = () => {\n if (timeoutRef.current) clearTimeout(timeoutRef.current)\n controller.openDrawer(false)\n controller.openPopUp(false)\n }\n const remove = controller.playback.add(close)\n\n return () => {\n remove()\n close()\n controller.off(VreoKeyframeEnum.InfoPanel, callback)\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current)\n }\n }\n }, [controller])\n\n return <></>\n}\n","import * as THREE from 'three/webgpu'\n\nexport function createTransMatrix(arr1: number[]) {\n const matrix4 = new THREE.Matrix4()\n matrix4.fromArray(arr1)\n\n return (arr2: number[]) => {\n const vector3 = new THREE.Vector3(...arr2)\n vector3.applyMatrix4(matrix4)\n return vector3.toArray()\n }\n}","import * as React from 'react'\nimport * as THREE from 'three/webgpu'\nimport { useController, useFiveInstance } from '../../../hooks'\nimport { ModelTVVideoPlugin } from '../../../../fivePlugins/ModelTVVideoPlugin'\nimport { createTransMatrix } from '../../../../shared-utils/createTransMatrix'\nimport { ModelVideoData, VreoKeyframe, VreoKeyframeEnum } from '../../../../typings/VreoUnit'\n\nexport function ModelVideo() {\n const controller = useController()\n const five = useFiveInstance()\n const ref = React.useRef<ReturnType<typeof ModelTVVideoPlugin> | undefined>(undefined)\n const timeoutRef = React.useRef<NodeJS.Timeout | null>(null)\n\n React.useEffect(() => {\n let generation = 0\n const stop = () => { ++generation; if (timeoutRef.current) clearTimeout(timeoutRef.current); ref.current?.dispose(); ref.current = undefined }\n const remove = controller.playback.add(stop)\n const callback = async (keyframe: VreoKeyframe) => {\n stop()\n const current = generation\n const run = controller.playback.capture()\n const valid = () => !!run?.valid()\n if (!valid()) return\n const plugin = ref.current = ModelTVVideoPlugin(five, { mediaManager: run?.mediaManager })\n const { start, end } = keyframe\n const { videoSrc, videoPosterSrc, vertexs, matrixWorld } = keyframe.data as ModelVideoData\n\n const position = (() => {\n if (vertexs.length < 4) {\n throw new Error('ModelVideo: 顶点数据集合不够,无法组成矩形 ....')\n }\n if (vertexs.length === 4) {\n return vertexs\n }\n\n const box = new THREE.Box3()\n vertexs.forEach((v) => box.expandByPoint(new THREE.Vector3(v.x, v.y, v.z)))\n return [\n new THREE.Vector3(box.min.x, box.max.y, box.max.z),\n new THREE.Vector3(box.min.x, box.min.y, box.max.z),\n new THREE.Vector3(box.max.x, box.min.y, box.max.z),\n new THREE.Vector3(box.max.x, box.max.y, box.max.z),\n ]\n })()\n\n const points = (() => {\n if (matrixWorld) {\n const transMatrix = createTransMatrix(matrixWorld)\n return [\n position.map((p) => {\n const res = transMatrix([p.x, p.y, p.z])\n return { x: res[0], y: res[1], z: res[2] }\n }),\n ]\n }\n return [position]\n })()\n\n plugin.disable()\n try {\n await plugin.load(\n {\n video_src: videoSrc,\n video_poster_src: videoPosterSrc,\n points,\n },\n controller.configs?.videos?.modelTVVideo\n )\n\n } catch (error) {\n if (current === generation && valid()) { controller.playback.cancel(); console.error(error) }\n return\n }\n if (current !== generation || !valid()) return\n plugin.enable()\n timeoutRef.current = setTimeout(stop, end - start)\n }\n\n controller.on(VreoKeyframeEnum.ModelVideo, callback)\n return () => {\n stop()\n remove()\n ref.current?.dispose()\n ref.current = undefined\n controller.off(VreoKeyframeEnum.ModelVideo, callback)\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current)\n }\n }\n }, [controller])\n\n return <></>\n}\n","import * as TWEEN from '@tweenjs/tween.js'\nimport { requestAnimationFrameInterval } from '.'\n\ntype UnknownProps = Record<string, any>\n\nexport class BetterTween<G extends UnknownProps> extends TWEEN.Tween<G> {\n private disposeMethods: (() => void)[] = []\n private animationFrameDisposer?: () => void\n\n public onDispose = (callback: () => void) => {\n this.disposeMethods.push(callback)\n return this\n }\n\n public play = () => {\n this.start()\n this.animationFrameDisposer = requestAnimationFrameInterval(() => this.update())\n return this\n }\n\n public dispose = () => {\n this.stop()\n this.animationFrameDisposer?.()\n this.disposeMethods.forEach((fn) => fn())\n this.disposeMethods = []\n TWEEN.remove(this)\n }\n}\n\nexport function tweenProgress(duration?: number, easing = TWEEN.Easing.Linear.None) {\n const tween = new BetterTween({ progress: 0 }).to({ progress: 1 })\n if (duration !== undefined) tween.duration(duration)\n if (easing !== undefined) tween.easing(easing)\n return tween\n}\n","import * as THREE from 'three/webgpu'\nimport { Line2 } from 'three/addons/lines/webgpu/Line2.js'\nimport { LineGeometry } from 'three/addons/lines/LineGeometry.js'\nimport { Five } from '@realsee/five-webgpu'\nimport { tweenProgress } from '../../../../shared-utils/animationFrame/BetterTween'\n\nexport default function lineAnime(five: Five, startPoint: THREE.Vector3, endPoint: THREE.Vector3) {\n const pointImage = 'data:image/png;base64,' +\n 'iVBORw0KGgoAAAANSUhEUgAAACAAAAAgBAMAAACBVGfHAAAAIVBMVEUAAAD////////////////////////////////////////PIev5AAAACnRSTlMAG/Py2baba05un7UgfgAAAHJJREFUKM9joBpgLHVSCRdA4metAoJlCJHmVWBgAeNzroKCCVCBLpjACqgJVjCBxRBT2FbBQQJYQAohsBAsUIUQWA4WiEIILAULeCEEloAFtBACizAEMLRgGIphLabDMJ2O6TlM72MGECIIMQIZIxqoBQCPvpJ/e9FaAAAAAABJRU5ErkJggg=='\n const pointTexture = new THREE.TextureLoader().load(pointImage)\n const lineGeometry = new LineGeometry()\n const lineMaterial = new THREE.Line2NodeMaterial({ color: 0xffffff, linewidth: 2, depthTest: false })\n const line = new Line2(lineGeometry, lineMaterial)\n const pointGeometry = new THREE.BufferGeometry()\n const pointMaterial = new THREE.PointsNodeMaterial({ color: 0xffffff, map: pointTexture, transparent: true })\n const points = new THREE.Points(pointGeometry, pointMaterial)\n const group = new THREE.Group()\n group.add(line, points)\n const setPoints = (left: THREE.Vector3, right: THREE.Vector3) => {\n const positions = [...left.toArray(), ...right.toArray()]\n lineGeometry.setPositions(positions)\n pointGeometry.setAttribute('position', new THREE.Float32BufferAttribute(positions, 3))\n }\n setPoints(startPoint, endPoint)\n return tweenProgress()\n .onUpdate(({ progress }) => {\n setPoints(startPoint.clone().lerp(endPoint, 0.5 - progress / 2), startPoint.clone().lerp(endPoint, 0.5 + progress / 2))\n five.needsRender = true\n })\n .onStart(() => five.scene.add(group))\n .onDispose(() => {\n five.scene.remove(group)\n lineGeometry.dispose(); lineMaterial.dispose(); pointGeometry.dispose(); pointMaterial.dispose(); pointTexture.dispose()\n five.needsRender = true\n })\n}\n","import * as React from 'react'\nimport { Vector3 } from 'three/webgpu'\nimport classNames from 'classnames'\n\nimport lineAnime from './lineAnime'\nimport { useController, useFiveInstance, useFiveProject2d } from '../../../hooks'\nimport { BetterTween } from '../../../../shared-utils/animationFrame/BetterTween'\nimport { PanoEffectData, VreoKeyframe, VreoKeyframeEnum } from '../../../../typings/VreoUnit'\n\nexport function PanoEffect() {\n const [state, setState] = React.useState<{\n center: Vector3\n distance: number\n } | null>(null)\n\n const five = useFiveInstance()\n const lineRef = React.useRef<BetterTween<{ progress: number }> | null>(null)\n const [pos, setPos] = React.useState<{ left: number; top: number } | null>(null)\n const timeoutRef = React.useRef<NodeJS.Timeout | null>(null)\n\n const controller = useController()\n const project2d = useFiveProject2d()\n\n const delLine = () => {\n if (lineRef.current) {\n lineRef.current.dispose()\n }\n }\n\n React.useEffect(() => {\n const callback = (keyframe: VreoKeyframe) => {\n const { start, end, data } = keyframe\n\n const videoEffectData = data as PanoEffectData\n\n const [v1, v2] = videoEffectData.twoVertexs\n const p1 = new Vector3(v1.x, v1.y, v1.z)\n const p2 = new Vector3(v2.x, v2.y, v2.z)\n\n lineRef.current = lineAnime(five, p1.clone(), p2.clone())\n lineRef.current.play()\n\n const center = p1.lerp(p2, 0.5)\n const distance = p1.distanceTo(p2)\n\n const p = project2d(center)\n if (!p) return\n const { x: left, y: top } = p\n setState({ center, distance })\n setPos({ left, top })\n timeoutRef.current = setTimeout(() => {\n setState(null)\n setPos(null)\n delLine()\n }, end - start)\n }\n\n controller.on(VreoKeyframeEnum.PanoEffect, callback)\n\n return () => {\n controller.off(VreoKeyframeEnum.PanoEffect, callback)\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current)\n }\n delLine()\n }\n }, [controller])\n\n React.useEffect(() => {\n const callback = () => {\n if (!state?.center) return\n const { x, y, z } = state.center\n const res = project2d(new Vector3(x, y, z))\n if (!res) return\n const { x: left, y: top } = res\n setPos({ left, top })\n }\n five.on('currentStateChange', callback)\n return () => {\n five.off('currentStateChange', callback)\n }\n }, [state?.center])\n\n return (\n <>\n <div\n className={classNames('PanoEffect', {\n 'PanoEffect--notHidden': state,\n })}\n style={{\n left: (pos?.left || 0) + 'px',\n top: (pos?.top || 0) + 'px',\n }}\n >\n {state?.distance.toFixed(4) + 'm'}\n </div>\n </>\n )\n}\n","import * as React from 'react'\nimport { useController, useFiveInstance } from '../../../hooks'\nimport { PanoTagData, VreoKeyframe, VreoKeyframeEnum } from '../../../../typings/VreoUnit'\n\nimport { PanoTagPlugin, Tag } from '@realsee/dnalogel/plugins/pano-tag'\n\nexport function PanoTag() {\n const controller = useController()\n const five = useFiveInstance()\n\n React.useEffect(() => {\n if (controller.configs?.keyframeMap.PanoTag === false) {\n return\n }\n\n // This private plugin belongs to this effect's controller, including replay\n // and React's effect teardown/setup cycle.\n const panoTagPlugin = PanoTagPlugin(five as any, {\n config: {\n globalConfig: {\n visibleConfig: { keep: 'visible' },\n unfoldedConfig: { autoUnfold: false, unfoldDistance: { max: 100 } }\n }\n }\n })\n type ActiveTag = { id: string; timer?: ReturnType<typeof setTimeout>; released: boolean; expired: boolean }\n let activeTag: ActiveTag | undefined\n let disposed = false\n let lastTagId = 0\n\n const releaseTag = (entry: ActiveTag) => {\n if (entry.released) return\n entry.released = true\n if (entry.timer !== undefined) clearTimeout(entry.timer)\n if (activeTag === entry) activeTag = undefined\n panoTagPlugin.destroyTagById(entry.id)\n }\n const clearTag = () => {\n if (activeTag) releaseTag(activeTag)\n }\n const removePlaybackCleanup = controller.playback.add(clearTag)\n\n const callback = (keyframe: VreoKeyframe, currentTime = keyframe.start) => {\n const run = controller.playback.capture()\n if (disposed || !run?.valid()) return\n\n clearTag()\n const { end, data } = keyframe\n const panoTagData = data as PanoTagData\n lastTagId = Math.max(Date.now(), lastTagId + 1)\n const id = lastTagId.toString()\n const position = [panoTagData.vertex.x, panoTagData.vertex.y, panoTagData.vertex.z]\n const tag: Tag = panoTagData.imgUrl\n ? { id, position, contentType: 'ImageText', stickType: '2DPoint', data: { title: panoTagData.text, mediaData: [{ type: 'Image', url: panoTagData.imgUrl }] } }\n : { id, position, contentType: 'Text', stickType: '2DPoint', data: { title: panoTagData.text } }\n const entry: ActiveTag = { id, released: false, expired: false }\n activeTag = entry\n\n // Keep the keyframe deadline independent of asynchronous model readiness.\n entry.timer = setTimeout(() => {\n if (entry.released) return\n if (disposed || !run.valid()) return releaseTag(entry)\n entry.expired = true\n panoTagPlugin.getTagById(id)?.fold()\n entry.timer = setTimeout(() => releaseTag(entry), 1500)\n }, Math.max(0, end - currentTime))\n\n void panoTagPlugin.load({ tagList: [tag] }).then(() => {\n if (disposed || entry.released || entry.expired || activeTag !== entry || !run.valid()) {\n releaseTag(entry)\n return\n }\n const tagInstance = panoTagPlugin.getTagById(id)\n if (!tagInstance) return releaseTag(entry)\n tagInstance.setMediaManager(run.mediaManager)\n tagInstance.unfold()\n }).catch(error => {\n releaseTag(entry)\n console.error('Vreo PanoTag failed to load', error)\n })\n }\n\n controller.on(VreoKeyframeEnum.PanoTag, callback)\n\n return () => {\n disposed = true\n controller.off(VreoKeyframeEnum.PanoTag, callback)\n removePlaybackCleanup()\n clearTag()\n panoTagPlugin.dispose()\n }\n }, [controller])\n\n return null\n}\n","import * as React from 'react'\nimport * as THREE from 'three/webgpu'\nimport { createRoot } from 'react-dom/client'\nimport { Vector3, Quaternion } from 'three/webgpu'\n\nimport { useController, useFiveInstance } from '../../../hooks'\nimport { CSS3DRenderPlugin } from '../../../../fivePlugins/CSS3DRenderPlugin'\nimport { PanoTextLabelData, VreoKeyframe, VreoKeyframeEnum } from '../../../../typings/VreoUnit'\n\n/**\n * 通过传入中心点确定矩形框架容器的四个点:\n * 1. 已知矩形长宽和中心点\n * 2. 借助planeGeometry生成垂直相机视角的平面上的四个点\n * 3. 通过向量相加,平行四边形法则获取到移动position后的面上四个点\n */\nconst calcPoints = (\n centerPoint: Vector3,\n normal: THREE.Vector3 | undefined,\n wrapperLength: number,\n wrapperWidth: number\n) => {\n // 375px 对应 1m\n const length = wrapperLength / 375\n const width = wrapperWidth / 375\n\n const geometry = new THREE.PlaneGeometry(length, width)\n if (normal) {\n const lookPoint = new THREE.Vector3(normal.x + centerPoint.x, normal.y + centerPoint.y, normal.z + centerPoint.z)\n geometry.lookAt(lookPoint)\n }\n // const pointgeometry = new THREE.Geometry()\n // pointgeometry.vertices.push(cameraPosition)\n // const pointmaterial = new THREE.PointsMaterial({\n // color: 0xffffff,\n // size: 0.4,\n // })\n // _point = new THREE.Points(pointgeometry, pointmaterial)\n // console.log(cameraPosition)\n\n const positions = geometry.getAttribute('position')\n const point = (index: number) => centerPoint.clone().add(\n new THREE.Vector3().fromBufferAttribute(positions, index),\n )\n // PlaneGeometry positions: 左上、右上、左下、右下。\n return [point(2), point(3), point(1), point(0)]\n}\n\n/**\n * 空间文本标签。\n */\nexport function PanoTextLabel() {\n const controller = useController()\n const five = useFiveInstance()\n const ref = React.useRef<ReturnType<typeof CSS3DRenderPlugin> | undefined>(undefined)\n\n React.useEffect(() => {\n if (controller.configs?.keyframeMap.PanoTextLabel === false) {\n return\n }\n const labels = new Set<() => void>()\n const clearLabels = () => {\n for (const dispose of [...labels]) dispose()\n }\n const removePlaybackCleanup = controller.playback.add(clearLabels)\n const callback = (keyframe: VreoKeyframe, currentTime = keyframe.start) => {\n const { end, data } = keyframe\n const panoTextLabelData = data as PanoTextLabelData\n // 增加无文本情况的判断\n if (data.text === '') return\n\n const { x, y, z } = panoTextLabelData.vertex\n const centerPoint = new Vector3(x, y, z)\n const normal = new Vector3(panoTextLabelData.normal?.x, panoTextLabelData.normal?.y, panoTextLabelData.normal?.z)\n // 生成传入的四个点,将文本框最大宽度定在200px,最高高度在30px\n const wrapperLength = 200\n const wrapperWidth = 30\n const points = calcPoints(centerPoint, panoTextLabelData.normal && normal, wrapperLength, wrapperWidth)\n\n if (!ref.current) ref.current = CSS3DRenderPlugin(five)\n const container = ref.current.create3DDomContainer(points)\n const css3DObject = container?.css3DObject\n // 将获取的mesh进行旋转操作,根据欧拉角去进行mesh的变换\n if (data.quaternion) {\n const quaternion = new Quaternion(data.quaternion.x, data.quaternion.y, data.quaternion.z, data.quaternion.w)\n css3DObject?.quaternion.copy(quaternion)\n }\n if (!container?.container) return\n const root = createRoot(container.container)\n let timeout: ReturnType<typeof setTimeout> | undefined\n let disposed = false\n const dispose = () => {\n if (disposed) return\n disposed = true\n if (timeout !== undefined) clearTimeout(timeout)\n labels.delete(dispose)\n container.dispose()\n // The parent player can unmount this component during its own React\n // cleanup. Release the CSS3D layer now, then unmount this nested root.\n queueMicrotask(() => root.unmount())\n }\n labels.add(dispose)\n root.render(\n <div className=\"PanoTextLabel PanoTextLabel--notHidden\">\n <div className=\"PanoTextLabel-wrapper\">\n <div style={{ fontSize: `${data.fontSize || 16}px` }} className=\"PanoText-innerText\">\n {data.text || ''}\n </div>\n </div>\n </div>\n )\n timeout = setTimeout(dispose, Math.max(0, end - currentTime))\n }\n controller.on(VreoKeyframeEnum.PanoTextLabel, callback)\n\n return () => {\n controller.off(VreoKeyframeEnum.PanoTextLabel, callback)\n removePlaybackCleanup()\n clearLabels()\n ref.current = undefined\n }\n }, [controller])\n\n return <></>\n}\n","import * as React from 'react'\nimport classNames from 'classnames'\nimport { useController } from '../../../hooks'\n\nimport { VreoKeyframe, VreoKeyframeEnum } from '../../../../typings/VreoUnit'\n\nexport function Prompter() {\n const [text, setText] = React.useState<string>('')\n const [hidden, setHidden] = React.useState<boolean>(true)\n const ref = React.useRef<NodeJS.Timeout | null>(null)\n const controller = useController()\n\n React.useEffect(() => {\n if (controller.configs?.keyframeMap.Prompter === false) {\n return\n }\n const stop = () => {\n if (ref.current !== null) clearTimeout(ref.current)\n ref.current = null\n setHidden(true)\n setText('')\n }\n const removePlaybackCleanup = controller.playback.add(stop)\n const callback = (keyframe: VreoKeyframe, currentTime = keyframe.start) => {\n const { end, data } = keyframe\n setText(data.text)\n setHidden(false)\n\n if (ref.current) {\n clearTimeout(ref.current)\n ref.current = null\n }\n\n ref.current = setTimeout(stop, Math.max(0, end - currentTime))\n }\n\n controller.on(VreoKeyframeEnum.Prompter, callback)\n\n return () => {\n controller.off(VreoKeyframeEnum.Prompter, callback)\n removePlaybackCleanup()\n stop()\n }\n }, [controller])\n\n return (\n <div\n className={classNames('vreo-prompter', {\n 'vreo-prompter--hidden': hidden,\n [`vreo-prompter-left--${controller.agentType}`]: true,\n })}\n >\n <div className=\"vreo-prompter-text\">\n <div className=\"vreo-prompter-innerText\">{text}</div>\n </div>\n </div>\n )\n}\n","import * as React from 'react'\nimport { parseWork, Work } from '@realsee/five-webgpu'\nimport { useController, useFiveInstance } from '../../../hooks'\nimport { UpdateVRPanoramaData, VreoKeyframe, VreoKeyframeEnum } from '../../../../typings/VreoUnit'\n\nexport function UpdateVRPanorama() {\n const controller = useController()\n const five = useFiveInstance()\n const deafultWorkRef = React.useRef<string[] | null>(null)\n const updateWorkRef = React.useRef<Work | null>(null)\n\n // 恢复默认 VR\n const restoreCallback = React.useCallback(() => {\n // 先清理掉 之前的 VR 数据备份\n updateWorkRef.current = null\n\n if (deafultWorkRef.current) {\n const work = parseWork(deafultWorkRef.current)\n five.load(work)\n }\n \n }, [])\n\n // 暂停时: 恢复默认 VR \n const pausedCallback = React.useCallback(() => {\n if (deafultWorkRef.current) {\n const work = parseWork(deafultWorkRef.current)\n Object.assign(window, {$rawWork: work})\n five.load(work)\n }\n }, [])\n\n // 播放时:如果暂停前有更新 VR 需要还原\n const playingCallback = React.useCallback(() => {\n if (!updateWorkRef.current) {\n return\n }\n five.load(updateWorkRef.current)\n }, [])\n\n React.useEffect(() => {\n const callback = (keyframe: VreoKeyframe) => {\n if (!deafultWorkRef.current && five.work?.raw?.works) {\n deafultWorkRef.current = five.work.raw.works\n }\n\n const data = keyframe.data as UpdateVRPanoramaData\n\n // 如果数据中有新 work 数据,则直接载入\n if (data.work) {\n updateWorkRef.current = parseWork(data.work)\n five.load(updateWorkRef.current)\n return\n }\n\n const lastRawWork = five.work?.raw?.works?.[0]\n if (!lastRawWork) {\n console.warn('UpdateVRPanorama: 没有可用的 work 数据')\n return\n }\n\n // 动态场景:不提供完成的签名数据,需重新整理\n if (data.dynamic_scene && !data.panorama) {\n const lastWork = JSON.parse(lastRawWork)\n const panorama = lastWork.panorama\n const index = data.dynamic_scene.images.index\n panorama.list[index] = data.dynamic_scene.images\n data.panorama = panorama\n delete data.dynamic_scene\n }\n\n Object.assign(window, {$work1: JSON.parse(lastRawWork), $work2: data, parseWork: parseWork})\n\n updateWorkRef.current = parseWork([lastRawWork, data])\n five.load(updateWorkRef.current)\n }\n\n controller.on(VreoKeyframeEnum.UpdateVRPanorama, callback)\n\n // 离开 将之前的内容清空\n controller.on(VreoKeyframeEnum.Exit, restoreCallback)\n \n // 新载入数据 将之前的内容清空\n controller.on('loaded', restoreCallback)\n\n // 暂停 回到默认状态\n controller.on('paused', pausedCallback)\n // 播放 回归暂停前状态\n controller.on('playing', playingCallback)\n\n return () => {\n // 清理事件监听\n controller.off(VreoKeyframeEnum.UpdateVRPanorama, callback)\n controller.off(VreoKeyframeEnum.Exit, restoreCallback)\n controller.off('loaded', restoreCallback)\n controller.off('paused', pausedCallback)\n controller.off('playing', playingCallback)\n }\n }, [])\n\n return <></>\n}\n","import type { MediaOperations } from '../../../playback-types'\nimport classNames from 'classnames'\nimport * as React from 'react'\n// import { Preloader } from '../../../../shared-utils/Preloader'\nimport { VideoEffectData, VreoKeyframe, VreoKeyframeEnum } from '../../../../typings/VreoUnit'\nimport { useController, useFiveInstance } from '../../../hooks'\n\n// const emptyVideo = '//vr-static.realsee-cdn.cn/release/web/leisure.69fd3522.mov'\nconst PI = Math.PI\nconst PI_2 = PI * 2\n\nexport function VideoEffect() {\n const ref = React.useRef<HTMLDivElement>(null)\n const videoRef = React.useRef<HTMLVideoElement | null>(null)\n const controller = useController()\n const timeoutRef = React.useRef<NodeJS.Timeout | null>(null)\n\n const [visible, setVisible] = React.useState(false)\n const five = useFiveInstance()\n React.useEffect(() => {\n let output: MediaOperations | undefined\n let generation = 0\n let removeCanPlay: (() => void) | undefined\n const callback = async (keyframe: VreoKeyframe) => {\n const { start, end } = keyframe\n const { videoSrc, fov, direction, panoIndex, vector } = keyframe.data as VideoEffectData\n const [longitude, latitude] = (() => {\n if (vector) {\n return [vector.longitude, vector.latitude]\n }\n if (!direction) {\n return [0, 0]\n }\n\n let longitude = -Math.atan2(direction.x, -direction.z)\n longitude = ((longitude % PI_2) + PI_2) % PI_2\n const latitude = -Math.asin(direction.y / 1)\n return [longitude, latitude]\n })()\n\n destroy()\n const currentGeneration = generation\n five.setState({ fov, panoIndex, longitude, latitude }, true)\n\n\n removeCanPlay?.()\n const run = controller.playback.capture()\n const active = () => !!run?.valid()\n const valid = () => currentGeneration === generation && active()\n const video = videoRef.current\n if (!video || !valid()) return\n const media = output = run!.bind(video)\n media.muted = true\n media.src = videoSrc\n const play = () => {\n removeCanPlay?.()\n if (!valid()) return\n media.muted = false\n void media.play().catch(error => { if (valid()) { controller.playback.cancel(); console.error(error) } })\n }\n removeCanPlay = () => video.removeEventListener('canplaythrough', play)\n video.addEventListener('canplaythrough', play)\n media.load()\n setVisible(true)\n\n timeoutRef.current = setTimeout(destroy, Math.max(0, end - start))\n }\n\n controller.on(VreoKeyframeEnum.VideoEffect, callback)\n\n const destroy = () => {\n ++generation\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current)\n }\n removeCanPlay?.()\n if (output) { output.muted = true; output.pause(); output.src = '' }\n output = undefined\n setVisible(false)\n\n }\n\n const remove = controller.playback.add(destroy)\n\n return () => {\n destroy()\n remove()\n controller.off(VreoKeyframeEnum.VideoEffect, callback)\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current)\n }\n }\n }, [controller])\n\n React.useEffect(() => {\n if (!ref.current) return\n const video = controller.configs?.videos?.videoEffect || document.createElement('video')\n // <video playsInline key=\"VideoEffect-video\" className=\"VideoEffect-video\" src={blobSrc} />\n video.setAttribute('playsinline', 'true')\n video.setAttribute('webkit-playsinline', 'true')\n video.autoplay = false\n video.muted = true\n video.setAttribute('key', 'VideoEffect-video')\n video.setAttribute('class', 'VideoEffect-video')\n\n videoRef.current = video\n ref.current.append(videoRef.current)\n return () => { video.muted = true; video.pause(); video.remove() }\n\n }, [])\n\n return (\n <div\n ref={ref}\n className={classNames('VideoEffect', {\n 'VideoEffect--visible': visible,\n })}\n ></div>\n )\n}\n","/**\n * 预载器\n */\nexport const Preloader = {\n blob: (url: string) => {\n const noop = () => null\n return new Promise<string>((resolve, reject) => {\n const xhr = new XMLHttpRequest()\n const clear = () => {\n xhr.ontimeout = noop\n xhr.onreadystatechange = noop\n xhr.onprogress = noop\n xhr.onabort = noop\n }\n xhr.ontimeout = () => {\n reject(new Error('timeout'))\n clear()\n }\n xhr.onreadystatechange = () => {\n if (xhr.readyState !== 4) return\n if (xhr.status === 0 && !xhr.response) return\n if (xhr.status === 200 || xhr.status === 0) {\n resolve(xhr.response)\n clear()\n } else {\n reject(new Error('status:' + xhr.status))\n clear()\n }\n }\n xhr.open('GET', url, true)\n xhr.responseType = 'blob'\n xhr.send(null)\n })\n },\n}\n","import { Subscribe } from '@realsee/five-webgpu'\nimport { requestAnimationFrameInterval } from './animationFrame'\n\n/**\n * 模拟 `<Audio>` 事件。\n */\nexport type AudioLikeEvent = {\n // 播放\n play: () => void\n // 语音状态 播放 -> 暂停\n pause: () => void\n // 语音时间刷新\n timeupdate: () => void\n // 播放\n ended: () => void\n}\n\n\n/**\n * 模拟 `<Audio>` 功能:没有音频,但执行逻辑跟 `<Audio>` 相似。\n */\nexport class AudioLike extends Subscribe<AudioLikeEvent> {\n private $timestamp: number | null = null\n private $currentTime = 0\n private $duration = 0\n private stopInterval?: () => void\n muted = false\n src = ''\n\n setAttribute(name: string, value: string) {\n // nothing todo\n }\n\n constructor({ duration }: { duration?: number } = {}) {\n super()\n if (duration) {\n this.$duration = duration\n }\n }\n\n play() {\n if (this.stopInterval) return\n if (this.$currentTime === this.$duration) {\n this.$currentTime = 0\n }\n if (this.$timestamp === null) {\n this.$timestamp = performance.now()\n }\n this.stopInterval = requestAnimationFrameInterval(() => this.requestAnimationFrameLoop())\n this.emit('play')\n }\n\n pause() {\n if (this.stopInterval) {\n this.stopInterval()\n this.emit('pause')\n this.stopInterval = undefined\n }\n this.$timestamp = null\n }\n\n requestAnimationFrameLoop() {\n if (this.$timestamp === null) return\n const now = performance.now()\n this.$currentTime += (now - this.$timestamp)\n this.$timestamp = now\n this.emit('timeupdate')\n if (this.$currentTime >= this.$duration - 10) {\n this.$currentTime = this.$duration\n this.pause()\n this.emit('ended')\n }\n }\n\n get currentTime() {\n return this.$currentTime / 1000\n }\n\n set currentTime(time: number) {\n this.$currentTime = time * 1000\n }\n\n get duration() {\n return this.$duration\n }\n\n set duration(duration: number) {\n this.$duration = duration\n }\n\n get ended() {\n return this.$currentTime === this.$duration\n }\n\n get paused() {\n return !this.stopInterval\n }\n\n addEventListener(evtName: keyof AudioLikeEvent, callback: () => void, useCapture = false) {\n this.on(evtName, callback)\n }\n\n removeEventListener(evtName: keyof AudioLikeEvent, callback: () => void, useCapture = false) {\n this.off(evtName, callback)\n }\n}\n\nexport default AudioLike\n","import type { PlaybackRun } from '../../PlaybackLifecycle'\nimport type { MediaOperations } from '../../playback-types'\nimport * as THREE from 'three/webgpu'\nimport { float, max, smoothstep, texture, uniform, uv } from 'three/tsl'\nimport { Preloader } from '../../../shared-utils/Preloader'\nimport { makeObservable, observable, observableRef, runInAction } from 'mobx'\nimport AudioLike from '../../../shared-utils/AudioLike'\nimport { getMediaType } from '../../../shared-utils/getMediaInfo'\n\n/**\n * 视频经纪人贴片的配置选项\n */\nexport interface VideoAgentMeshOptions {\n getPlayback?: () => PlaybackRun | undefined\n /**\n * 自定义视频实例。\n */\n videoInstance?: HTMLVideoElement\n /**\n * 自定义音频实例。\n */\n audioInstance?: HTMLAudioElement\n /**\n * 是否开启音频预载能力。**仅对`.mp3`有效**。\n *\n * @description 开启预载能力后会通过 `Fetch/XHR` 方式将音频文件下载转成二进制 [`Blob`](https://developer.mozilla.org/zh-CN/docs/Web/API/Blob) 提供给多媒体实例。这样的好处是 **能够保障音视频播放过程中不卡顿**。 但在部分 iOS 系统中会存在兼容问题——播 25s 之后会静音(`muted` 为 `false`,但是没有声音)。\n */\n preload?: boolean\n}\n\n/**\n * 视频经纪人贴片类\n * \n * 基于 THREE.js 的网格对象,作为 VR 视频播放的核心媒体管理组件。\n * 负责视频和音频的播放控制、时间同步、绿幕抠图渲染等功能。\n * \n * 主要特性:\n * - 支持绿幕抠图渲染(ChromaKey)\n * - 音视频同步播放管理\n * - 媒体预载优化策略\n * - 跨平台播放兼容性\n * \n * @example\n * ```typescript\n * const videoMesh = new VideoAgentMesh(1920, 1080, 32, 18, {\n * preload: true,\n * videoInstance: customVideoElement\n * })\n * \n * // 播放视频\n * await videoMesh.play('https://example.com/video.mp4', 0, 60)\n * \n * // 获取当前时间\n * console.log(videoMesh.currentTime)\n * \n * // 销毁资源\n * videoMesh.dispose()\n * ```\n */\nexport class VideoAgentMesh extends THREE.Mesh<THREE.PlaneGeometry, THREE.MeshBasicNodeMaterial> {\n private videoTexture: THREE.VideoTexture\n private enableNode: ReturnType<typeof uniform>\n /** 配置选项 */\n options: VideoAgentMeshOptions\n /** 当前视频URL */\n videoUrl?: string\n /** 是否冻结状态 */\n freeze: boolean \n /** 是否暂停状态 */\n paused: boolean\n /** 音频实例 */\n private outputs = new Map<HTMLMediaElement, MediaOperations>()\n private operations(run: PlaybackRun | undefined, element: HTMLMediaElement) {\n const operations = run ? run.bind(element) : element\n this.outputs.set(element, operations)\n return operations\n }\n private ownsVideo = false\n private ownsAudio = false\n private generation = 0\n private removeStart?: () => void\n private objectURL?: string\n audioInstance: HTMLAudioElement\n /** AudioLike 实例 */\n audioLikeInstance: AudioLike\n /** 移除事件监听器的函数 */\n $removeEventListener: () => void\n\n /**\n * 获取当前的媒体实例\n * \n * 根据媒体类型自动返回对应的播放实例:\n * - 无媒体时返回 AudioLike 实例\n * - 音频文件返回 HTMLAudioElement\n * - 视频文件返回 HTMLVideoElement\n * \n * @returns 当前活跃的媒体播放实例\n */\n get mediaInstance(): HTMLAudioElement | HTMLVideoElement | AudioLike {\n if (!this.videoUrl) {\n return this.audioLikeInstance\n }\n\n if (getMediaType(this.videoUrl) === 'audio') {\n return this.audioInstance\n }\n\n return this.videoTexture.image as HTMLVideoElement\n }\n\n /**\n * 创建视频经纪人贴片实例\n * \n * @param width - 网格宽度\n * @param height - 网格高度 \n * @param widthSegments - 宽度方向分段数\n * @param heightSegments - 高度方向分段数\n * @param options - 配置选项\n * \n * @example\n * ```typescript\n * const mesh = new VideoAgentMesh(1920, 1080, 32, 18, {\n * preload: true,\n * videoInstance: document.getElementById('video')\n * })\n * ```\n */\n constructor(\n width: number,\n height: number,\n widthSegments: number,\n heightSegments: number,\n options: VideoAgentMeshOptions = {\n preload: true\n },\n ) {\n const ownsVideo = !options.videoInstance\n if (!options.videoInstance) {\n const videoInstance = document.createElement('video')\n videoInstance.style.display = 'none'\n videoInstance.playsInline = true\n videoInstance.muted = true\n document.body.append(videoInstance)\n options.videoInstance = videoInstance\n }\n\n const geometry = new THREE.PlaneGeometry(width, height, widthSegments, heightSegments)\n const videoTexture = new THREE.VideoTexture(options.videoInstance)\n videoTexture.colorSpace = THREE.SRGBColorSpace\n const enableNode = uniform(0)\n const videoNode = texture(videoTexture)\n const sampled = videoNode.sample(uv())\n const chromaMask = float(1).sub(\n smoothstep(0.1, 0.3, sampled.g.sub(max(sampled.r, sampled.b)).add(0.1)),\n )\n const material = new THREE.MeshBasicNodeMaterial({ transparent: true })\n material.colorNode = sampled.rgb\n material.opacityNode = chromaMask.mul(enableNode)\n\n super(geometry, material)\n this.videoTexture = videoTexture\n this.enableNode = enableNode\n this.ownsVideo = ownsVideo\n this.ownsAudio = !options.audioInstance\n this.options = options\n this.freeze = false\n this.paused = true\n\n if (!options.audioInstance) {\n this.audioInstance = document.createElement('audio')\n this.audioInstance.crossOrigin = ''\n this.audioInstance.muted = true\n this.audioInstance.autoplay = false\n } else {\n this.audioInstance = options.audioInstance\n }\n\n this.audioLikeInstance = new AudioLike()\n\n makeObservable(this, { paused: observable, videoUrl: observableRef })\n\n const updatePaused = (paused: boolean) => runInAction(() => (this.paused = paused))\n const onPause = () => updatePaused(true)\n const onPlay = () => updatePaused(false)\n\n this.audioInstance.addEventListener('pause', onPause)\n this.audioInstance.addEventListener('play', onPlay)\n this.options.videoInstance?.addEventListener('pause', onPause)\n this.options.videoInstance?.addEventListener('play', onPlay)\n this.audioLikeInstance.addEventListener('pause', onPause)\n this.audioLikeInstance.addEventListener('play', onPlay)\n\n this.$removeEventListener = () => {\n this.audioInstance.removeEventListener('pause', onPause)\n this.audioInstance.removeEventListener('play', onPlay)\n this.options.videoInstance?.removeEventListener('pause', onPause)\n this.options.videoInstance?.removeEventListener('play', onPlay)\n this.audioLikeInstance.removeEventListener('pause', onPause)\n this.audioLikeInstance.removeEventListener('play', onPlay)\n }\n }\n\n /**\n * 更新媒体资源\n * \n * 内部方法,负责加载新的视频/音频资源,处理预载逻辑和着色器设置\n * @param videoUrl - 媒体文件URL\n * @private\n */\n private async update(videoUrl: string, valid: () => boolean, run?: PlaybackRun) {\n if (this.videoUrl === videoUrl) return\n this.stop()\n this.freeze = true\n const element = getMediaType(videoUrl) === 'audio' ? this.audioInstance : this.options.videoInstance!\n const media = this.operations(run, element)\n media.muted = true\n const src = (this.options.preload !== false || getMediaType(videoUrl) === 'video')\n ? URL.createObjectURL(await Preloader.blob(videoUrl) as unknown as Blob) : videoUrl\n if (!valid()) { if (src !== videoUrl) URL.revokeObjectURL(src); return }\n runInAction(() => { this.videoUrl = videoUrl })\n if (this.objectURL) URL.revokeObjectURL(this.objectURL)\n this.objectURL = src !== videoUrl ? src : undefined\n media.src = src\n element.setAttribute('data-src', videoUrl)\n const onStart = () => {\n if (!valid() || media.currentTime === 0) return\n this.freeze = false\n media.muted = false\n this.enableNode.value = getMediaType(videoUrl) ? 1 : 0\n this.removeStart?.()\n }\n this.removeStart = () => element.removeEventListener('timeupdate', onStart)\n element.addEventListener('timeupdate', onStart)\n }\n\n /**\n * 播放媒体内容\n * \n * 支持多种播放模式:\n * - 播放指定视频/音频文件\n * - 仅设置时长(无媒体文件)\n * - 继续播放当前媒体\n * \n * @param videoUrl - 媒体文件URL,默认为空字符串\n * @param currentTime - 播放起始时间(秒),默认为 0\n * @param duration - 媒体总时长(秒),可选\n * @returns Promise<boolean> 播放是否成功\n * \n * @example\n * ```typescript\n * // 播放视频文件\n * await mesh.play('video.mp4', 10, 120)\n * \n * // 仅设置时长(音频跟踪)\n * await mesh.play('', 0, 60)\n * \n * // 继续播放当前媒体\n * await mesh.play()\n * ```\n */\n async play(videoUrl = '', currentTime = 0, duration?: number) {\n const run = this.options.getPlayback?.()\n if (this.options.getPlayback && !run?.valid()) return false\n // stop() invalidates all earlier loads before the new generation is captured.\n if (videoUrl && videoUrl !== this.videoUrl) this.stop()\n let generation = this.generation\n const valid = () => generation === this.generation && (!this.options.getPlayback || !!run?.valid())\n if (videoUrl && videoUrl !== this.videoUrl) {\n // update's synchronous stop is accounted for before awaiting its load.\n generation++\n await this.update(videoUrl, valid, run)\n }\n if (!valid()) return false\n if (duration && !videoUrl) {\n runInAction(() => { this.videoUrl = '' })\n this.audioLikeInstance.duration = duration\n }\n const media = this.videoUrl ? this.operations(run, this.mediaInstance as HTMLMediaElement) : this.audioLikeInstance\n if (videoUrl || duration) media.currentTime = currentTime\n media.muted = true\n await media.play()\n if (!valid()) return false\n media.muted = false\n return true\n }\n\n get mediaOperations(): MediaOperations | AudioLike | undefined {\n const run = this.options.getPlayback?.()\n if (this.options.getPlayback && !run?.valid()) return undefined\n return this.videoUrl ? this.operations(run, this.mediaInstance as HTMLMediaElement) : this.audioLikeInstance\n }\n\n stop() {\n ++this.generation\n this.removeStart?.()\n this.removeStart = undefined\n for (const output of this.outputs.values()) { output.muted = true; output.pause() }\n this.outputs.clear()\n this.audioLikeInstance.pause()\n }\n\n /**\n * 获取当前播放时间(毫秒)\n * \n * 将媒体实例的秒级时间转换为毫秒,提供更高精度的时间控制\n * @returns 当前播放时间戳(毫秒)\n */\n get currentTime() {\n return this.mediaInstance.currentTime * 1000\n }\n\n /**\n * 销毁视频经纪人贴片实例\n * \n * 清理所有事件监听器、DOM元素和缓存实例,释放内存资源\n * \n * @example\n * ```typescript\n * // 在组件卸载时调用\n * videoMesh.dispose()\n * ```\n */\n dispose() {\n this.stop()\n this.$removeEventListener()\n if (this.ownsVideo) this.options.videoInstance?.remove()\n if (this.ownsAudio) this.audioInstance.remove()\n if (this.objectURL) URL.revokeObjectURL(this.objectURL)\n this.geometry.dispose()\n this.videoTexture.dispose()\n this.material.dispose()\n }\n}\n","import { OrthographicCamera, Scene, WebGPURenderer } from 'three/webgpu'\nimport { addResizeListener } from '../../../shared-utils/addResizeListener'\nimport { VideoAgentMesh, VideoAgentMeshOptions } from './VideoAgentMesh'\n\nexport class VideoAgentScene {\n videoAgentMesh: VideoAgentMesh\n scene = new Scene()\n camera = new OrthographicCamera(-240, 240, 135, -135)\n renderer: WebGPURenderer\n private frame: number | undefined\n private disposed = false\n disposers: (() => void)[] = []\n\n constructor(container?: HTMLElement, options?: VideoAgentMeshOptions, forceWebGL = false) {\n this.renderer = new WebGPURenderer({ alpha: true, forceWebGL })\n this.videoAgentMesh = new VideoAgentMesh(480, 270, 1, 1, options)\n if (!container) return\n\n this.camera.position.set(0, 0, 10)\n this.camera.lookAt(0, 0, 0)\n const domElement = this.renderer.domElement\n domElement.classList.add('VideoAgent-canvas')\n const dispose = addResizeListener(container, (width, height) => {\n this.renderer.setPixelRatio(window.devicePixelRatio)\n this.renderer.setSize(width, height, false)\n domElement.style.width = `${width}px`\n domElement.style.height = `${height}px`\n })\n this.disposers.push(dispose)\n container.append(domElement)\n this.scene.add(this.videoAgentMesh)\n void this.renderer.init().then(() => {\n if (this.disposed) return\n const backend = this.renderer.backend as { isWebGPUBackend?: boolean; isWebGLBackend?: boolean }\n if (!backend.isWebGPUBackend && !backend.isWebGLBackend) {\n throw new Error('VideoAgent renderer initialized with an unsupported backend')\n }\n this.run()\n }).catch(this.fail)\n }\n\n private fail = (error: unknown) => {\n if (this.disposed) return\n this.dispose()\n console.error('VideoAgent renderer initialization failed', error)\n }\n\n run = () => {\n if (this.disposed) return\n if (!(this.videoAgentMesh.paused || this.videoAgentMesh.freeze) && this.videoAgentMesh.currentTime > 1000) {\n this.renderer.render(this.scene, this.camera)\n }\n this.frame = requestAnimationFrame(this.run)\n }\n\n dispose = () => {\n if (this.disposed) return\n this.disposed = true\n if (this.frame !== undefined) cancelAnimationFrame(this.frame)\n this.frame = undefined\n this.disposers.splice(0).forEach(dispose => dispose())\n this.videoAgentMesh.dispose()\n this.renderer.dispose()\n this.renderer.domElement.remove()\n }\n}\n","import * as React from 'react'\nimport { useController } from '../../hooks'\nimport { VideoAgentMeshOptions } from './VideoAgentMesh'\nimport { VideoAgentScene } from './VideoAgentScene'\nimport classNames from 'classnames'\nimport { runInAction } from 'mobx'\nimport { observer } from 'mobx-react-lite'\n\nexport const VideoAgent = observer(function VideoAgent(props: { onClick?: () => void; options?: VideoAgentMeshOptions }) {\n const ref = React.useRef<HTMLDivElement>(null)\n const controller = useController()\n\n const showAvatar = controller.avatar?.url && controller.avatar.force === true\n\n const showVideoAgent = !showAvatar &&\n controller.videoAgentScene?.videoAgentMesh.mediaInstance instanceof HTMLVideoElement\n\n React.useEffect(() => {\n if (!ref.current) throw new Error('React 渲染异常,请稍后重试 ...')\n if (controller.videoAgentScene) {\n console.warn('VideoAgentScene\" 重复初始化,已被过滤')\n return\n }\n const forceWebGL = (controller.five.renderer?.backend as { isWebGLBackend?: boolean } | undefined)?.isWebGLBackend === true\n const videoAgentScene = new VideoAgentScene(ref.current, { ...props.options, getPlayback: () => controller.playback.capture() }, forceWebGL)\n runInAction(() => { controller.videoAgentScene = videoAgentScene })\n\n return () => {\n videoAgentScene.dispose()\n if (controller.videoAgentScene === videoAgentScene) {\n runInAction(() => { controller.videoAgentScene = undefined })\n }\n }\n }, [controller])\n\n return (\n <>\n <div className=\"Avatar\" style={{display: showAvatar ? 'block' : 'none'}}>\n <div className=\"Avatar-wrapper ratio-1-1\">\n <img className=\"Avatar-img\" src={controller.avatar?.url} onClick={() => props.onClick?.()} />\n </div>\n </div>\n <div className={classNames('VideoAgent', { hide: !showVideoAgent })}>\n <div className=\"VideoAgent-container\">\n <div className=\"VideoAgent-wrapper ratio-16-9\">\n <div className=\"VideoAgent-inner\" ref={ref}>\n <div className=\"VideoAgent-play\" onClick={() => props.onClick?.()}></div>\n </div>\n </div>\n </div>\n </div>\n </>\n )\n})\n","const blankAudioSrc = 'data:audio/mpeg;base64,//uQxAAAAAAAAAAAAAAAAAAAAAAASW5mbwAAAA8AAAADAAAGhgBVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVWqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqr///////////////////////////////////////////8AAAA5TEFNRTMuOThyAc0AAAAAAAAAABSAJAiqQgAAgAAABobxtI73AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//uQxAACFEII9ACZ/sJZwWEoEb8w/////N//////JcxjHjf+7/v/H2PzCCFAiDtGeyBCIx7bJJ1mmEEMy6g8mm2c8nrGABB4h2Mkmn//4z/73u773R5qHHu/j/w7Kxkzh5lWRWdsifCkNAnY9Zc1HvDAhjhSHdFkHFzLmabt/AQxSg2wwzLhHIJOBnAWwVY4zrhIYhhc2kvhYDfQ4hDi2Gmh5KyFn8EcGIrHAngNgIwVIEMf5bzbAiTRoAD///8z/KVhkkWEle6IX+d/z4fvH3BShK1e5kmjkCMoxVmXhd4ROlTKo3iipasvTilY21q19ta30/v/0/idPX1v8PNxJL6ramnOVsdvMv2akO0iSYIzdJFirtzWXCZicS9vHqvSKyqm5XJBdqBwPxyfJdykhWTZ0G0ZyTZGpLKxsNwwoRhsx3tZfhwmeOBVISm3impAC/IT/8hP/EKEM1KMdVdVKM2rHV4x7HVXZvbVVKN/qq8CiV9VL9jjH/6l6qf7MBCjZmOqsAibjcP+qqqv0oxqpa/NVW286hPo1nz2L/h8+jXt//uSxCmDU2IK/ECN98KKtE5IYzNoCfbw+u9i5r8PoadUMFPKqWL4LK3T/LCraMSHGkW4bpLXR/E6LlHOVQxmslKVJ8IULktMN06N0FKCpHCoYsjC4F+Z0NVqdNFoGSTjSiyjzLdnZ2fNqTi2eHKONONKLMPMKLONKLMPQRJGlFxZRoKcJFAYEeIFiRQkUWUeYfef//Ko04soswso40UJAgMw8wosososy0EalnZyjQUGBRQGIFggOWUacWUeYmuadrZziQKKEgQsQLAhQkUJAgMQDghltLO1onp0cpkNInSFMqlYeSEJ5AHsqFdOwy1DA2sRmRJKxdKRfLhfLw5BzUxBTUUzLjk4LjJVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUxBTUUzLjk4LjJVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVf/7ksRRA8AAAaQAAAAgAAA0gAAABFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVU='\n// 下面这段空音频居然在11pro和xr上播不出来\n// const blankAudioSrc = 'data:audio/mpeg;base64,//AAAAHGZ0eXBNNEEgAAAAAE00QSBpc29tbXA0MgAAAAFtZGF0AAAAAAAAABwA0AAHANAABwDQAAcAAAM+bW9vdgAAAGxtdmhkAAAAAN+jti7fo7YuAACsRAAADAAAAQAAAQAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAdB0cmFrAAAAXHRraGQAAAAB36O2Lt+jti4AAAABAAAAAAAADAAAAAAAAAAAAAAAAAABAAAAAAEAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAFsbWRpYQAAACBtZGhkAAAAAN+jti7fo7YuAACsRAAADABVxAAAAAAAMWhkbHIAAAAAAAAAAHNvdW4AAAAAAAAAAAAAAABDb3JlIE1lZGlhIEF1ZGlvAAAAARNtaW5mAAAAEHNtaGQAAAAAAAAAAAAAACRkaW5mAAAAHGRyZWYAAAAAAAAAAQAAAAx1cmwgAAAAAQAAANdzdGJsAAAAZ3N0c2QAAAAAAAAAAQAAAFdtcDRhAAAAAAAAAAEAAAAAAAAAAAACABAAAAAArEQAAAAAADNlc2RzAAAAAAOAgIAiAAAABICAgBRAFAAYAAAA+gAAAPoABYCAgAISCAaAgIABAgAAABhzdHRzAAAAAAAAAAEAAAADAAAEAAAAABxzdHNjAAAAAAAAAAEAAAABAAAAAwAAAAEAAAAgc3RzegAAAAAAAAAAAAAAAwAAAAQAAAAEAAAABAAAABRzdGNvAAAAAAAAAAEAAAAsAAAA+nVkdGEAAADybWV0YQAAAAAAAAAiaGRscgAAAAAAAAAAbWRpcgAAAAAAAAAAAAAAAAAAAAAAxGlsc3QAAAC8LS0tLQAAABxtZWFuAAAAAGNvbS5hcHBsZS5pVHVuZXMAAAAUbmFtZQAAAABpVHVuU01QQgAAAIRkYXRhAAAAAQAAAAAgMDAwMDAwMDAgMDAwMDA4NDAgMDAwMDAzQzAgMDAwMDAwMDAwMDAwMDAwMCAwMDAwMDAwMCAwMDAwMDAwMCAwMDAwMDAwMCAwMDAwMDAwMCAwMDAwMDAwMCAwMDAwMDAwMCAwMDAwMDAwMA=='\n\nexport const audioList: IAudio[] = []\n\n// The module is also imported while a host server builds or renders pages.\n// Audio instances are created only in the browser, but the base class must be\n// defined safely when the browser global is absent.\nconst AudioBase = typeof Audio === 'undefined' ? (class {} as typeof Audio) : Audio\n\nexport function getAudio(src?: string) {\n let audio = audioList.find((audio) => {\n return !audio.realSrc || audio.realSrc === blankAudioSrc\n })\n if (!audio) {\n // console.warn('未找到缓存音频,已新建', audioList)\n audio = new IAudio(blankAudioSrc)\n audioList.push(audio)\n }\n if (src) {\n audio.src = src\n }\n return audio\n}\n\nexport async function waitForBlankAudioGenerated(checkInterval = 100, timeout = 2000) {\n console.log('waitForBlankAudioGenerated, needGenerate: ', audioList.some((audio) => !audio.ended && audio.src === blankAudioSrc))\n // while any audioList not ended\n const startTime = Date.now()\n let isTimedOut = false\n while (audioList.some((audio) => !audio.ended && (audio.src === blankAudioSrc)) && !isTimedOut) {\n if (Date.now() - startTime > timeout) {\n isTimedOut = true\n return Promise.resolve()\n }\n await new Promise((resolve) => setTimeout(resolve, checkInterval))\n }\n}\n\nexport function generateBlankAudio(length: number) {\n // 判断一下已经生成几个了,防止重复生成\n const generateLength = length - audioList.length\n if (generateLength <= 0) return\n for (let i = 0; i < generateLength; i++) {\n audioList.push(new IAudio(blankAudioSrc))\n }\n}\n\nfunction initAudio(audio: IAudio) {\n if (audio.inited) return\n if (audio.src) {\n audio.inited = true\n audio.removeDocumentEventListener()\n }\n if (audio.src === blankAudioSrc) {\n audio.play()\n }\n}\n\nclass IAudio extends AudioBase {\n public preload = 'auto' as const\n \n /**\n * 获取音频源 URL\n * @returns {string} 当前音频源 URL\n */\n get src() {\n return this.getAttribute('src') || ''\n }\n \n /**\n * 设置音频源 URL\n * @param paramsSrc - 音频源 URL\n */\n set src(paramsSrc: string) {\n this.muted = true\n if (paramsSrc === '') {\n this.removeAttribute('src')\n this.realSrc = ''\n this.load()\n return\n }\n this.setAttribute('src', paramsSrc)\n this.realSrc = paramsSrc\n }\n\n public realSrc = ''\n\n public inited: boolean = false;\n\n public removeDocumentEventListener: () => void;\n\n public constructor(src?: string) {\n super(src)\n this.realSrc = src ?? ''\n this.muted = true\n\n\n super.addEventListener('ended', () => {\n if (this.src === blankAudioSrc) this.src = ''\n })\n\n const init = () => initAudio(this)\n\n document.addEventListener('click', init)\n document.addEventListener('touchend', init)\n this.removeDocumentEventListener = () => {\n document.removeEventListener('click', init)\n document.removeEventListener('touchend', init)\n }\n\n }\n}\n\n","import * as React from 'react'\nimport { getAudio } from '../../../../shared-utils/Audio'\nimport { VreoKeyframe, VreoKeyframeEnum } from '../../../../typings/VreoUnit'\nimport { useController } from '../../../hooks'\n\nexport function BgMusic() {\n const controller = useController()\n React.useEffect(() => {\n const tracks = new Set<() => void>()\n const callback = (keyframe: VreoKeyframe, currentTime: number) => {\n const run = controller.playback.capture()\n const valid = () => !!run?.valid()\n if (!valid()) return\n const element = getAudio()\n const audio = run!.bind(element)\n let cleaned = false\n const clean = () => {\n if (cleaned) return\n cleaned = true\n element.removeEventListener('canplay', play)\n element.removeEventListener('ended', clean)\n audio.muted = true\n audio.pause()\n audio.src = ''\n remove()\n tracks.delete(clean)\n controller.setWaitingForBgMusic(false)\n }\n const remove = controller.playback.add(clean)\n tracks.add(clean)\n const play = () => {\n element.removeEventListener('canplay', play)\n if (!valid() || cleaned) return\n audio.muted = false\n void audio.play().catch(error => { if (valid() && !cleaned) { clean(); controller.playback.cancel(); console.error(error) } })\n controller.setWaitingForBgMusic(false)\n }\n audio.muted = true\n audio.src = keyframe.data.url\n audio.currentTime = Math.max(0, (currentTime - keyframe.start) / 1000)\n element.addEventListener('ended', clean)\n if (controller.configs.waitForBgMusicLoaded && element.readyState < 3) {\n controller.setWaitingForBgMusic(true)\n element.addEventListener('canplay', play)\n } else play()\n }\n controller.on(VreoKeyframeEnum.BgMusic, callback)\n return () => { controller.off(VreoKeyframeEnum.BgMusic, callback); for (const clean of [...tracks]) clean() }\n }, [controller])\n return <></>\n}\n","import { WaveAppearance } from '../../typings'\nimport React, { FC, useState, useCallback, useRef, useEffect, ReactNode } from 'react';\n\n\nconst defaultPrefix = 'https://vr-public.realsee-cdn.cn/release/static/image/release/'\n\nconst WAVES = {\n single: {\n width: 766,\n height: 60,\n frames: 20,\n hevc: 'vapor/static/wave-single.140d197f4838c130b69e87dfd0705479.mov',\n vp9: 'vapor/static/wave-single.eda65de390a830193fff40d1f1255555.webm',\n png: 'vapor/static/wave-single.f51aade2a6e1c59211698a1a24e6135f.png',\n },\n double: {\n width: 766,\n height: 60,\n frames: 16,\n hevc: 'vapor/static/wave-double.3e6d73050ee6958cc3060b107ebe5f39.mov',\n vp9: '/vapor/static/wave-double.77dfe8548ebcb3f3d336785d4fe9c7b2.webm',\n png: '/vapor/static/wave-double.ab4fe7d8a70395109ca4f759af7bd53f.png',\n },\n solid: {\n width: 1126,\n height: 90,\n frames: 48,\n hevc: 'vapor/static/wave-solid.cf68912a93275d07aa6b5097ea11fdda.mov',\n vp9: 'vapor/static/wave-solid.64438b63cbb346906d066bb7b8dc3e20.webm',\n png: 'vapor/static/wave-solid.6969d7f3f2f44f7ac1ade30e65660cb1.png',\n },\n swap: {\n width: 2250,\n height: 180,\n frames: 41,\n hevc: 'vapor/static/wave-swap.b38f22e2cf84ee21e9be35f7f56c9cfc.mov',\n vp9: 'vapor/static/wave-swap.c02e4b94cf05aecf6e7a0023bc7bb90f.webm',\n png: 'vapor/static/wave-swap.772ba526a7210dcc01567062c6319545.png',\n },\n expand: {\n width: 2250,\n height: 180,\n frames: 45,\n hevc: 'vapor/static/wave-expand.9529956c5954740cd4c9d07d51e32822.mov',\n vp9: 'vapor/static/wave-expand.a0d2a0074001cd3d4fea56818c6d3c38.webm',\n png: 'vapor/static/wave-expand.62fcf27b445533e6eb1b17bab5eafa0d.png',\n }\n} as const;\n\nconst userAgent = typeof navigator !== 'undefined' ? navigator.userAgent : '';\nconst isAppleDevice = /(iPhone|iPad|iPod)/i.test(userAgent);\nconst isSafari = /safari/i.test(userAgent) && !/chrome/i.test(userAgent) && /version/i.test(userAgent);\nconst isMicroMessenger = /microMessenger/i.test(userAgent);\nconst canPlayHevc = isAppleDevice || isSafari;\nconst canPlayVp9 = typeof MediaSource !== 'undefined' && MediaSource.isTypeSupported(\"video/webm; codecs=vp9\");\n\nexport function Wave(props?: { appearance?: WaveAppearance, onClick?: () => void, staticPrefix?: string}) {\n const wave = React.useMemo(() => {\n const appearance = props?.appearance ?? 'solid'\n return WAVES[appearance]\n }, [props?.appearance])\n\n const heightWidthRatio = React.useMemo(() => {\n return wave.height / wave.width\n }, [wave])\n\n let content: ReactNode = null;\n if (isMicroMessenger) {\n content = <KeyframeWaveContent wave={wave} prefix={props?.staticPrefix} />\n } else if (canPlayHevc) {\n content = <VideoWaveContent format=\"hevc\" wave={wave} prefix={props?.staticPrefix} />\n } else if (canPlayVp9) {\n content = <VideoWaveContent format=\"vp9\" wave={wave} prefix={props?.staticPrefix} />\n } else {\n content = <KeyframeWaveContent wave={wave} prefix={props?.staticPrefix} />\n }\n\n return (\n <div className=\"vreo-wave\" onClick={props?.onClick}>\n <div style={{position: 'relative', width: '100%', paddingTop: `${heightWidthRatio * 100}%`}}>\n <div style={{position: 'absolute', width: '100%', height: '100%', left: 0, top: 0}}>\n {content}\n </div>\n </div>\n </div>\n )\n}\n\nconst VideoWaveContent: FC<{ wave: typeof WAVES[keyof typeof WAVES]; format: 'hevc' | 'vp9'; prefix?: string }> = ({\n wave,\n format,\n prefix = defaultPrefix,\n}) => {\n const videoRef = useRef<HTMLVideoElement>(null);\n const [canPlay, setCanPlay] = useState(false);\n const [errored, setErrored] = useState(false);\n const source = prefix + wave[format];\n\n useEffect(() => {\n setCanPlay(false);\n }, [source]);\n\n const canPlayHandler = useCallback(() => {\n if (videoRef.current) {\n videoRef.current.play();\n }\n setCanPlay(true);\n }, []);\n\n const errorHandler = useCallback(() => {\n setErrored(true);\n }, []);\n\n if (errored) {\n return <KeyframeWaveContent wave={wave} prefix={prefix} />;\n }\n\n return <video\n style={{ opacity: canPlay ? 1 : 0 }}\n preload=\"auto\"\n ref={videoRef}\n width=\"100%\"\n height=\"100%\"\n playsInline\n autoPlay\n onCanPlay={canPlayHandler}\n onError={errorHandler}\n muted\n loop\n src={source}\n />;\n};\n\nconst KeyframeWaveContent: FC<{ wave: typeof WAVES[keyof typeof WAVES]; prefix?: string }> = ({\n wave,\n prefix = defaultPrefix,\n}) => {\n const source = prefix + wave.png;\n return <div\n style={{\n width: \"100%\",\n height: \"100%\",\n backgroundImage: `url(${source})`,\n backgroundSize: \"100%\",\n animationName: \"vreo-wave-keyframes\",\n animationTimingFunction: `steps(${wave.frames - 1})`,\n animationDuration: `${wave.frames / 25}s`,\n animationIterationCount: 'infinite',\n }}\n />\n};","import * as React from 'react'\nimport classNames from 'classnames'\nimport { observer } from 'mobx-react-lite'\nimport { Controller } from './Controller'\nimport { useController } from './hooks'\nimport { CameraMovement } from './modules/keyframes/CameraMovement'\nimport { ResizeObserver } from './modules/ResizeObserver'\nimport { InfoPanel } from './modules/keyframes/InfoPanel'\nimport { ModelVideo } from './modules/keyframes/ModelVideo'\nimport { PanoEffect } from './modules/keyframes/PanoEffect'\nimport { PanoTag } from './modules/keyframes/PanoTag'\nimport { PanoTextLabel } from './modules/keyframes/PanoTextLabel'\nimport { Prompter } from './modules/keyframes/Prompter'\nimport { UpdateVRPanorama } from './modules/keyframes/UpdateVRPanorama'\nimport { VideoEffect } from './modules/keyframes/VideoEffect'\nimport { VideoAgent } from './modules/VideoAgent'\nimport { BgMusic } from './modules/keyframes/BgMusic'\nimport { Wave } from './modules/Wave'\n\nconst AppView = observer(({ controller }: { controller: Controller }) => {\n \n return (\n <div\n className={classNames('vreo-panel', {\n 'vreo-panel--hidden': !controller.visible,\n })}\n >\n <div className=\"vreo-panel-inner\">\n <Wave onClick={controller.configs?.onWaveClick} appearance={controller.waveAppearance ?? 'single'} staticPrefix={controller.configs.waveStaticPrefix} />\n <VideoAgent\n onClick={() => {\n if (controller.configs?.onAvatarClick) {\n controller.configs.onAvatarClick()\n return\n }\n if (controller.playing) {\n controller.playback.cancel()\n } else {\n if (controller.playback.begin(true)) controller.setPlaying(true)\n }\n }}\n options={controller.configs?.videoAgentMeshOptions || {}}\n />\n <Prompter />\n {controller.configs?.customPanelChildren}\n </div>\n </div>\n )\n})\n\nexport function App() {\n const controller = useController()\n return (\n <>\n <>\n <ResizeObserver />\n <CameraMovement />\n <ModelVideo />\n <UpdateVRPanorama />\n <VideoEffect />\n <PanoTag />\n <PanoTextLabel />\n <InfoPanel />\n <PanoEffect />\n <BgMusic />\n </>\n <AppView controller={controller} />\n </>\n )\n}\n","import * as React from 'react'\nimport classNames from 'classnames'\nimport { observer } from 'mobx-react-lite'\nimport { Controller } from '../../Controller'\nimport { useController } from '../../hooks'\n\nconst DrawerView = observer(({ controller }: { controller: Controller }) => {\n const maxHeight = '400px'\n const height = (() => {\n const height = controller.drawerConfig?.height\n if (!height) {\n return 'max-content'\n }\n\n if (typeof height === 'number') {\n return height + 'px'\n }\n\n return height\n })()\n\n return (\n <div\n className={classNames('vreo-drawer', {\n 'vreo-drawer-visible': controller.drawerConfig && controller.drawerConfig.content,\n })}\n onClick={() => controller.openDrawer(false)}\n >\n <div className=\"vreo-drawer-inner\" style={{ height, maxHeight }}>\n {controller.drawerConfig?.content || ''}\n </div>\n </div>\n )\n})\n\nexport function Drawer() {\n const controller = useController()\n\n return <DrawerView controller={controller} />\n}\n","import * as React from 'react'\nimport classNames from 'classnames'\nimport { observer } from 'mobx-react-lite'\nimport { Controller } from '../../Controller'\nimport { useController } from '../../hooks'\n\nconst PopUpView = observer(({ controller }: { controller: Controller }) => {\n\n return (\n <div\n className={classNames('vreo-PopUp', {\n 'vreo-PopUp-visible': controller.popUp,\n })}\n onClick={() => controller.openPopUp(false)}\n >\n <div className=\"vreo-PopUp-inner\">\n {controller.popUp || ''}\n </div>\n </div>\n )\n})\n\nexport function PopUp() {\n const controller = useController()\n return <PopUpView controller={controller} />\n}","import * as React from 'react'\nimport { createRoot } from 'react-dom/client'\nimport { Five } from '@realsee/five-webgpu'\nimport { Raycaster, Vector3 } from 'three/webgpu'\nimport { tweenProgress } from '../../../shared-utils/animationFrame/BetterTween'\nimport { CSS3DRenderPlugin, CSS3DRenderPluginExportType } from '../../../fivePlugins/CSS3DRenderPlugin'\n\nimport { VreoKeyframe, VreoKeyframeEnum } from '../../../typings/VreoUnit'\nimport { CustomVreoKeyframeProps } from '../../typings'\n\n// __debug__\n// const mockData: SpatialScenePanelData = {\n// customType: 'SpatialScenePanel',\n// \"stateList\": [\n// {\n// \"icon\": \"http://vrlab-public.ljcdn.com/release/seesay/tools/___fc42f951076607a22fd5c54f005ba553.png\",\n// \"text\": \"窗帘关闭\"\n// },\n// {\n// \"icon\": \"http://vrlab-public.ljcdn.com/release/seesay/tools/___b331e7ad732debc07250a169a3393b13.png\",\n// \"text\": \"摄像头休眠\"\n// },\n// {\n// \"icon\": \"http://vrlab-public.ljcdn.com/release/seesay/tools/___2e425a81ac0ad88232d50d4e52a9abfa.png\",\n// \"text\": \"氛围音乐\"\n// },\n// {\n// \"icon\": \"http://vrlab-public.ljcdn.com/release/seesay/tools/___bff48bb81cde37aa6a319d6f5d56e3a4.png\",\n// \"text\": \"空调打开\"\n// }\n// ],\n// \"temperature\": \"27\",\n// \"title\": \"沉浸式回家\"\n// }\n\nexport interface SpatialScenePanelData {\n customType: 'SpatialScenePanel'\n title: string\n temperature: string\n stateList: {\n text: string\n icon: string\n }[]\n position?: { x: number; y: number; z: number }\n quaternion?: [number, number, number, number]\n}\n\ninterface SearchParams {\n five: Five\n // position: Vector3\n // rotation?: Vector3\n // quaternion: [number, number, number, number]\n dom: HTMLDivElement\n}\n\n// const getSphere = (position: Vector3, color = 0xffff00) => {\n// const geometry = new SphereGeometry(0.05, 32, 16)\n// const material = new MeshBasicMaterial({ color })\n// const sphere = new Mesh(geometry, material)\n// sphere.position.copy(position)\n// return sphere\n// }\n\nconst searchV1 = ({ five, dom }: SearchParams) => {\n const cameraDirection = new Vector3()\n five.camera.getWorldDirection(cameraDirection)\n const cameraPosition = five.camera.position\n const [intersect] = five.model.intersectRaycaster(new Raycaster(cameraPosition, cameraDirection))\n const point = five.project2d(intersect.point)\n\n const widescreen = window.innerWidth > 560 ? true : false\n // const width = dom!.clientWidth\n const height = dom!.clientHeight\n dom!.style.left = point!.x + 'px'\n dom!.style.top = point!.y - height / 2 + 'px'\n const rect = dom!.getBoundingClientRect()\n const { left, top, bottom, right } = rect\n\n const leftBottom = new Vector3(left, bottom)\n const leftTop = new Vector3(left, top)\n const rightTop = new Vector3(right, top)\n const rightBottom = new Vector3(right, bottom)\n\n const points = [leftBottom, rightBottom, rightTop, leftTop].map((point) => {\n point.setX((point.x / window.innerWidth) * 2 - (widescreen ? 1.25: 1.75))\n point.setY(-(point.y / window.innerHeight) * 2 + (widescreen ? 1.35: 1.125))\n point.setZ(0.5)\n return point.unproject(five.camera).addScaledVector(cameraDirection, 0.2)\n })\n\n // __debug__\n // const colors = [0xdc143c, 0xffff00, 0x0000ff, 0x008000]\n // points.forEach((p, index) => five.scene.add(getSphere(p, colors[index])))\n\n // 判断是手机 150\n const ratio = leftBottom.distanceTo(rightBottom) / (widescreen ? 150 : 120)\n return { points, ratio }\n}\n\n/**\n * 空间场景面板\n * @returns\n */\nexport function SpatialScenePanel(props: CustomVreoKeyframeProps) {\n const timeoutRef = React.useRef<NodeJS.Timeout | null>(null)\n const ref = React.useRef<HTMLDivElement>(null)\n const panelRef = React.useRef<HTMLDivElement | null>(null)\n const rendererRef = React.useRef<CSS3DRenderPluginExportType>(CSS3DRenderPlugin(props.five))\n\n React.useEffect(() => {\n if (!ref.current) {\n return\n }\n\n const callback = (keyframe: VreoKeyframe) => {\n if (keyframe.data.customType !== 'SpatialScenePanel') {\n return\n }\n\n const data = keyframe.data as SpatialScenePanelData\n\n // const data = mockData\n const { points, ratio } = searchV1({\n five: props.five,\n dom: ref.current!,\n })\n\n const { container, dispose, css3DObject, render } =\n rendererRef.current.create3DDomContainer(points, { ratio, autoRender: false }) || {}\n\n Object.assign(window, { $css3DObject: css3DObject })\n if (!container) return\n\n const root = createRoot(container)\n root.render(<Panel ref={(ref) => { panelRef.current = ref }} data={data} />)\n const startRotateY = -(Math.PI * 2) / 9\n let lastRotateY = 0\n \n tweenProgress(1000)\n .onUpdate(({ progress }) => {\n const needRotateY = (Math.PI / 90) * 11 * progress\n const rotateY = needRotateY - lastRotateY\n css3DObject?.rotateY(rotateY)\n // css3DObject?.rotateZ\n lastRotateY = needRotateY\n })\n .onStart(() => {\n css3DObject?.rotateY(startRotateY)\n render!()\n })\n .onDispose(() => {\n panelRef.current?.classList.add('show')\n })\n .play()\n\n // Object.assign(window, { $dispose: () => {\n // panelRef.current?.classList.add('hide')\n // setTimeout(() => dispose?.(), 1500)\n // } })\n\n const { start, end } = keyframe\n\n timeoutRef.current = setTimeout(() => {\n panelRef.current?.classList.add('hide')\n timeoutRef.current = setTimeout(() => {\n dispose?.()\n timeoutRef.current = null\n }, 1500)\n }, end - start)\n }\n\n Object.assign(window, { $callback: callback })\n\n // setTimeout(() => {callback()}, 8000)\n props.subscribe.on(VreoKeyframeEnum.Custom, callback)\n\n return () => {\n props.subscribe.off(VreoKeyframeEnum.Custom, callback)\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current)\n }\n }\n }, [])\n\n return <div className=\"vreo-SpatialScenePanel\" ref={ref}></div>\n}\n\n/** 背景动画:控制延迟 */\nfunction SpatialScenePanelBg() {\n const ref = React.useRef<HTMLDivElement>(null)\n const timeoutRef = React.useRef<NodeJS.Timeout | null>(null)\n React.useEffect(() => {\n if (!ref.current) return\n\n const listener = () => {\n ref.current?.setAttribute('class', 'SpatialScenePanel-bg')\n\n timeoutRef.current = setTimeout(() => {\n ref.current?.setAttribute('class', 'SpatialScenePanel-bg SpatialScenePanel-bg--animation')\n timeoutRef.current = null\n }, 3000)\n }\n\n ref.current.addEventListener('animationend', listener)\n\n return () => {\n if (ref.current) ref.current.removeEventListener('animationend', listener)\n if (timeoutRef.current) clearTimeout(timeoutRef.current)\n }\n }, [])\n return <div ref={ref} className=\"SpatialScenePanel-bg SpatialScenePanel-bg--animation\"></div>\n}\n\nconst Panel = React.forwardRef(\n (props: { data: SpatialScenePanelData }, myRef: React.LegacyRef<HTMLDivElement> | undefined) => (\n <div className=\"SpatialScenePanel\" ref={myRef}>\n <div className=\"SpatialScenePanel-show-area\">\n <SpatialScenePanelBg />\n <div className=\"SpatialScenePanel-header\">\n <div className=\"SpatialScenePanel-title\">{props.data?.title}</div>\n <div className=\"SpatialScenePanel-temperature\">{props.data?.temperature}℃</div>\n </div>\n <div className=\"SpatialScenePanel-body\">\n {props.data?.stateList?.map((state, index) => (\n <div key={`scene-${state.text}`} className={`SpatialScenePanel-item index_${index}`}>\n <img className=\"SpatialScenePanel-icon\" src={state.icon} alt={`${state.text}`}></img>\n <div className=\"SpatialScenePanel-text\">{state.text}</div>\n <div className=\"SpatialScenePanel-dot\"></div>\n </div>\n ))}\n </div>\n </div>\n\n <div className=\"SpatialScenePanel-disappear-area\"></div>\n </div>\n )\n)\n\n\n// export function SpatialScenePanel() {\n// // const data = mockData\n\n// return (\n// <div className=\"SpatialScenePanel\" >\n// <div className=\"SpatialScenePanel-show-area\">\n// <SpatialScenePanelBg />\n// <div className=\"SpatialScenePanel-header\">\n// <div className=\"SpatialScenePanel-title\">{data?.title}</div>\n// <div className=\"SpatialScenePanel-temperature\">{data?.temperature}℃</div>\n// </div>\n// <div className=\"SpatialScenePanel-body\">\n// {data?.stateList?.map((state, index) => (\n// <div key={`scene-${state.text}`} className={`SpatialScenePanel-item index_${index}`}>\n// <img className=\"SpatialScenePanel-icon\" src={state.icon}></img>\n// <div className=\"SpatialScenePanel-text\">{state.text}</div>\n// <div className=\"SpatialScenePanel-dot\"></div>\n// </div>\n// ))}\n// </div>\n// </div>\n\n// <div className=\"SpatialScenePanel-disappear-area\"></div>\n// </div>\n// )\n// }\n","// 下面这一行不能删\nimport * as React from 'react'\nimport type { Root } from 'react-dom/client'\n\nimport { createRoot } from 'react-dom/client'\nimport { Five, Subscribe } from '@realsee/five-webgpu'\n\nimport { App } from './App'\nimport { Controller, ControllerContext } from './Controller'\nimport { CameraMovementData, VreoKeyframeEnum, VreoKeyframeEvent, VreoUnit } from '../typings/VreoUnit'\nimport { reaction } from 'mobx'\nimport { Drawer } from './modules/Drawer'\nimport { Appearance, PlayerConfigs, WaveAppearance } from './typings'\nimport { PopUp } from './modules/PopUp'\nimport { generateBlankAudio, waitForBlankAudioGenerated } from '../shared-utils/Audio'\nimport AudioLike from '../shared-utils/AudioLike'\nimport { VreoProvider } from '../react'\n\nconst DefaultAudioCacheLength = 3\n\nconst id = `vreo-app-dhjskadhksahdjskahdjksa`\n\nfunction getAudioCacheLength() {\n if (typeof location === 'undefined') return DefaultAudioCacheLength\n return Number(location.search.match(/audio_cache=(\\d+)/)?.[1] ?? DefaultAudioCacheLength)\n}\n\n/**\n * Vreo 播放器核心类\n * \n * 提供 VR 视频播放、剧本执行、相机运镜等功能的主要接口。\n * 基于 Five 渲染引擎和 React 构建的 3D 空间剧本播放器。\n * \n * @example\n * ```typescript\n * import { Five } from '@realsee/five-webgpu'\n * import { Player } from '@realsee/vreo'\n * \n * const five = new Five({\n * // Five 配置选项\n * })\n * const player = new Player(five, {\n * autoPreload: true,\n * imageOptions: { size: 1024 }\n * })\n * \n * await player.load(vreoUnit)\n * player.play()\n * ```\n */\nexport class Player extends Subscribe<VreoKeyframeEvent> {\n /** Five 渲染引擎实例 */\n $five: Five\n /** 内部控制器 */\n private controller: Controller\n private root: Root\n private disposers: (() => void)[] = []\n private loadGeneration = 0\n private disposed = false\n getMediaManager() { return this.controller.playback.capture()?.mediaManager }\n /** 播放器配置(只读) */\n configs: Readonly<PlayerConfigs>\n\n /**\n * 创建 Vreo 播放器实例\n * \n * @param five - Five 渲染引擎实例\n * @param configs - 播放器配置选项\n */\n constructor(five: Five, configs: Partial<PlayerConfigs> = {}) {\n super()\n this.$five = five\n\n generateBlankAudio(getAudioCacheLength())\n\n if (!configs.container) {\n configs.container = configs.containter\n }\n if (!configs.container) {\n const oldElement = document.getElementById(id)\n if (oldElement) {\n oldElement.remove()\n }\n const container = document.createElement('div')\n container.id = id\n configs.container = container\n const fiveCanvasDomParent = five.getElement()?.parentNode\n if (fiveCanvasDomParent) {\n fiveCanvasDomParent.append(container)\n } else {\n document.body.append(container)\n }\n }\n\n if (!configs.container.classList.contains('vreo-app')) configs.container.classList.add('vreo-app')\n\n this.configs = Object.freeze( Object.assign({ keyframeMap: {} }, configs) )\n\n this.controller = new Controller({five, container:configs.container, configs: this.configs})\n\n\n this.root = createRoot(configs.container)\n this.root.render(\n <ControllerContext.Provider value={this.controller}>\n <App />\n <Drawer />\n <PopUp />\n {this.configs.customKeyframes &&\n this.configs.customKeyframes.map((CustomCmpt, key) => (\n <CustomCmpt\n key={key}\n subscribe={{\n on: (name, callback) => this.on(name as any, callback as any),\n once: (name, callback) => this.once(name as any, callback as any),\n off: (name, callback) => this.off(name as any, callback as any),\n }}\n five={five}\n getMediaManager={() => this.getMediaManager()}\n />\n ))}\n </ControllerContext.Provider>\n )\n\n // 监听播放情况:抛出触发时机\n this.disposers.push(reaction(\n () => this.controller.ended,\n (ended) => {\n if (ended) {\n this.emit('paused', true)\n }\n }\n ))\n\n this.disposers.push(reaction(\n () => this.controller.playing,\n (playing) => {\n if (!this.controller.ended) {\n this.emit(playing ? 'playing' : 'paused')\n }\n }\n ))\n }\n\n /**\n * 加载剧本数据\n * \n * 加载 VreoUnit 剧本数据,准备播放器状态,预载资源,并初始化播放环境。\n * \n * @param vreoUnit - 剧本数据对象,包含视频信息和关键帧序列\n * @param currentTime - 起始播放时间(毫秒),默认为 0\n * @param preload - 是否预载相关资源,默认为 false\n * @param force - 是否强制重新载入(深拷贝数据),默认为 false\n * @returns Promise<boolean> 返回加载是否成功\n * \n * @example\n * ```typescript\n * // 基本加载\n * await player.load(vreoUnit)\n * \n * // 从指定时间开始加载,并预载资源\n * await player.load(vreoUnit, 5000, true)\n * \n * // 强制重新加载\n * await player.load(vreoUnit, 0, false, true)\n * ```\n */\n async load(vreoUnit: VreoUnit, currentTime = 0, preload = false, force = false, userAction = false) {\n const generation = ++this.loadGeneration\n this.controller.playback.cancel()\n if (this.disposed || !this.controller.playback.begin(userAction)) return false\n const run = this.controller.playback.capture()!\n const valid = () => run.valid()\n try {\n this.controller.clear()\n this.controller.setLoading(true)\n if (force) {\n vreoUnit = JSON.parse(JSON.stringify(vreoUnit))\n }\n // if (!this.controller.visible) {\n // this.controller.setVisible(true)\n // // 延迟 500ms 规避跟 DOM 动画冲突\n // await new Promise((resolve) => {\n // setTimeout(() => resolve(true), 500)\n // })\n // }\n\n if (this.controller.stopInterval) {\n this.controller.stopInterval()\n this.controller.stopInterval = undefined\n }\n\n this.controller.vreoUnit = vreoUnit\n this.controller.loadTimeline(vreoUnit.keyframes)\n\n\n this.controller.videoAgentScene?.videoAgentMesh.mediaOperations?.pause()\n \n\n // 预载逻辑\n // 是否降低图片分辨率\n if (\n this.$five.imageOptions.size &&\n this.configs.imageOptions?.size &&\n this.$five.imageOptions.size > this.configs.imageOptions.size\n ) {\n this.$five.imageOptions.size = this.configs.imageOptions.size\n }\n\n // 预载数据中的点位\n if (preload || (preload === undefined && this.configs.autoPreload)) {\n const panoIndexMap = vreoUnit.keyframes\n .filter((vreoKeyframe) => {\n if (vreoKeyframe.type !== VreoKeyframeEnum.CameraMovement) {\n return false\n }\n\n const data = vreoKeyframe.data as CameraMovementData\n if (data.panoIndex === undefined) {\n return false\n }\n return true\n })\n .reduce((accu: Record<number, boolean>, curr) => {\n const panoIndex = curr.data.panoIndex as number\n if (!accu[panoIndex]) {\n accu[panoIndex] = true\n }\n return accu\n }, {})\n\n const panoIndexes = Object.keys(panoIndexMap)\n for (let i = 0; i < panoIndexes.length; i++) {\n await this.$five.preloadPano(Number(panoIndexes[i]))\n if (!valid() || generation !== this.loadGeneration) return false\n }\n }\n\n // 新数据载入就绪\n this.emit('loaded', vreoUnit)\n this.controller.emit('loaded', vreoUnit)\n if (!valid() || generation !== this.loadGeneration) return false\n\n if (this.controller.videoAgentScene?.videoAgentMesh.mediaOperations) {\n this.controller.videoAgentScene.videoAgentMesh.mediaOperations.currentTime = currentTime / 1000\n }\n\n this.controller.setAvatar(vreoUnit.video.avatar)\n\n await waitForBlankAudioGenerated()\n\n if (!valid() || generation !== this.loadGeneration) return false\n await this.controller.videoAgentScene?.videoAgentMesh.play(\n vreoUnit.video.url,\n currentTime / 1000,\n vreoUnit.video.duration\n )\n\n\n if (!valid() || generation !== this.loadGeneration) return false\n this.controller.setEnded(false)\n this.play(undefined, userAction)\n\n this.controller.run((type, keyframe) => this.emit(type, keyframe, this.controller.currentTime))\n this.controller.setLoading(false)\n return true\n } catch (error) {\n if (!valid()) return false\n this.controller.playback.cancel()\n throw error\n } finally {\n if (generation === this.loadGeneration) this.controller.setLoading(false)\n }\n }\n\n /**\n * 获取播放器是否处于暂停状态\n * @returns 是否暂停中\n */\n get paused() {\n return !this.controller.playing\n }\n\n /**\n * 开始播放\n * \n * @param currentTime - 可选的播放起始时间(毫秒)\n * @returns 是否开始播放成功\n * \n * @example\n * ```typescript\n * // 从当前位置播放\n * player.play()\n * \n * // 从指定时间开始播放\n * player.play(10000) // 从10秒处开始\n * ```\n */\n play(currentTime?: number, userAction = false) {\n if (this.disposed || !this.controller.playback.begin(userAction)) return false\n if (currentTime !== undefined) {\n const media = this.controller.videoAgentScene?.videoAgentMesh.mediaOperations\n if (media) media.currentTime = currentTime / 1000\n this.controller.seekTimeline(currentTime)\n }\n if (this.controller.playing) return true\n if (typeof window !== 'undefined') Object.assign(window, { $vreoController: this.controller })\n this.controller.setEnded(false)\n this.controller.setPlaying(true)\n this.controller.vreoUnit?.keyframes.forEach((keyframe) => {\n if (keyframe.type === VreoKeyframeEnum.BgMusic) this.controller.resetTimeline(VreoKeyframeEnum.BgMusic)\n })\n return true\n }\n\n /**\n * 设置播放器外观\n * @param appearance - 外观配置对象\n * \n * @example\n * ```typescript\n * player.setAppearance({\n * waveStyle: 'solid'\n * })\n * ```\n */\n setAppearance(appearance: Appearance) {\n this.controller.setAppearance(appearance)\n }\n\n /**\n * 暂停播放\n */\n pause() {\n ++this.loadGeneration\n this.controller.playback.cancel()\n this.controller.setLoading(false)\n }\n\n /**\n * 显示播放器界面\n */\n show() {\n this.controller.setVisible(true)\n }\n\n /**\n * 隐藏播放器界面\n */\n hide() {\n this.controller.setVisible(false)\n }\n\n /**\n * 获取当前播放时间\n * @returns 当前播放时间(毫秒)\n */\n getCurrentTime() {\n return this.controller.currentTime\n }\n\n /**\n * 销毁播放器实例\n * \n * 清理所有资源、事件监听器和DOM元素\n */\n dispose() {\n if (this.disposed) return\n this.disposed = true\n ++this.loadGeneration\n this.disposers.splice(0).forEach(dispose => dispose())\n this.controller.dispose()\n // A host may dispose Vreo from its own React effect cleanup. Unmounting\n // this nested root in the same commit triggers React's synchronous\n // unmount warning and can race with the host commit.\n queueMicrotask(() => this.root.unmount())\n }\n}\n\n// 导出自定义组件\nexport { SpatialScenePanel } from './custom/SpatialScenePanel'\n\nconsole.log(`\n ┏━━━┓━━━━━━━━━┏┓━━━━━━━━━━━━━\n ┃┏━┓┃━━━━━━━━━┃┃━━━━━━━━━━━━━\n ┃┗━┛┃┏━━┓┏━━┓━┃┃━┏━━┓┏━━┓┏━━┓\n ┃┏┓┏┛┃┏┓┃┗━┓┃━┃┃━┃━━┫┃┏┓┃┃┏┓┃\n ┃┃┃┗┓┃┃━┫┃┗┛┗┓┃┗┓┣━━┃┃┃━┫┃┃━┫\n ┗┛┗━┛┗━━┛┗━━━┛┗━┛┗━━┛┗━━┛┗━━┛\n ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n`)\n"],"names":["PlaybackLifecycle","manager","onStop","__publicField","_a","userAction","session","generation","mediaManager","element","stop","errors","error","setElementDataset","dataset","key","value","getFileExpandedName","filePath","index","getMediaType","url","fileExpandedName","getMediaTypeByExpandedName","Controller","Subscribe","five","container","configs","Timeline","makeObservable","observable","action","observableRef","reaction","waveStyle","loading","containerSize","width","height","size","orientation","ended","playing","type","_b","popUp","avatar","v","waiting","appearance","drawerConfig","keyframes","currentTime","callback","_c","_d","media","_e","_f","_h","_g","run","keyframe","attempt","valid","requestAnimationFrameInterval","dispose","ControllerContext","React","useController","controller","useFiveInstance","useFiveProject2d","vector","CameraMovement","ref","CameraMovementPlugin","start","end","data","cameraMovementData","effect","CameraMovementEffect","VreoKeyframeEnum","jsx","Fragment","resizeObserverCache","add","remove","remaining","addResizeListener","resizeHandler","immediate","disposed","observer","iframe","contentWindow","onResize","hasResizeListener","ResizeObserver","resizeElement","InfoPanelImg","children","jsxs","InfoPanelVideo","videoWrapperRef","video","output","canplaythrough","Title","props","InfoPanel","timeoutRef","infoPanelData","title","subTitle","style","InfoPanelStyleEnum","InfoPanelTypeEnum","close","createTransMatrix","arr1","matrix4","THREE","arr2","vector3","ModelVideo","current","plugin","ModelTVVideoPlugin","videoSrc","videoPosterSrc","vertexs","matrixWorld","position","box","points","transMatrix","p","res","BetterTween","TWEEN","fn","tweenProgress","duration","easing","tween","lineAnime","startPoint","endPoint","pointTexture","lineGeometry","LineGeometry","lineMaterial","line","Line2","pointGeometry","pointMaterial","group","setPoints","left","right","positions","progress","PanoEffect","state","setState","lineRef","pos","setPos","project2d","delLine","videoEffectData","v1","v2","p1","Vector3","p2","center","distance","top","x","y","z","classNames","PanoTag","panoTagPlugin","PanoTagPlugin","activeTag","lastTagId","releaseTag","entry","clearTag","removePlaybackCleanup","panoTagData","id","tag","tagInstance","calcPoints","centerPoint","normal","wrapperLength","wrapperWidth","length","geometry","lookPoint","point","PanoTextLabel","labels","clearLabels","panoTextLabelData","CSS3DRenderPlugin","css3DObject","quaternion","Quaternion","root","createRoot","timeout","Prompter","text","setText","hidden","setHidden","UpdateVRPanorama","deafultWorkRef","updateWorkRef","restoreCallback","work","parseWork","pausedCallback","playingCallback","lastRawWork","panorama","PI","PI_2","VideoEffect","videoRef","visible","setVisible","removeCanPlay","fov","direction","panoIndex","longitude","latitude","destroy","currentGeneration","active","play","Preloader","noop","resolve","reject","xhr","clear","AudioLike","name","now","time","evtName","useCapture","VideoAgentMesh","widthSegments","heightSegments","options","ownsVideo","videoInstance","videoTexture","enableNode","uniform","sampled","texture","uv","chromaMask","float","smoothstep","max","material","updatePaused","paused","runInAction","onPause","onPlay","operations","videoUrl","src","onStart","VideoAgentScene","forceWebGL","Scene","OrthographicCamera","WebGPURenderer","domElement","backend","VideoAgent","showAvatar","showVideoAgent","videoAgentScene","blankAudioSrc","audioList","AudioBase","getAudio","audio","IAudio","waitForBlankAudioGenerated","checkInterval","startTime","isTimedOut","generateBlankAudio","generateLength","i","initAudio","init","paramsSrc","BgMusic","tracks","cleaned","clean","defaultPrefix","WAVES","userAgent","isAppleDevice","isSafari","isMicroMessenger","canPlayHevc","canPlayVp9","Wave","wave","heightWidthRatio","content","KeyframeWaveContent","VideoWaveContent","format","prefix","useRef","canPlay","setCanPlay","useState","errored","setErrored","source","useEffect","canPlayHandler","useCallback","errorHandler","AppView","App","DrawerView","maxHeight","Drawer","PopUpView","PopUp","searchV1","dom","cameraDirection","cameraPosition","intersect","Raycaster","widescreen","rect","bottom","leftBottom","leftTop","rightTop","rightBottom","ratio","SpatialScenePanel","panelRef","rendererRef","render","Panel","startRotateY","lastRotateY","needRotateY","rotateY","SpatialScenePanelBg","listener","myRef","DefaultAudioCacheLength","getAudioCacheLength","Player","oldElement","fiveCanvasDomParent","CustomCmpt","vreoUnit","preload","force","panoIndexMap","vreoKeyframe","accu","curr","panoIndexes"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
export declare function Drawer(): import("react/jsx-runtime").JSX.Element;
|
|
2
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../resources/Player/modules/Drawer/index.tsx"],"names":[],"mappings":"AAmCA,wBAAgB,MAAM,4CAIrB"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
export declare function PopUp(): import("react/jsx-runtime").JSX.Element;
|
|
2
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../resources/Player/modules/PopUp/index.tsx"],"names":[],"mappings":"AAsBA,wBAAgB,KAAK,4CAGpB"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
export declare function ResizeObserver(): import("react/jsx-runtime").JSX.Element;
|
|
2
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../resources/Player/modules/ResizeObserver/index.tsx"],"names":[],"mappings":"AAIA,wBAAgB,cAAc,4CAkB7B"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { PlaybackRun } from '../../PlaybackLifecycle';
|
|
2
2
|
import type { MediaOperations } from '../../playback-types';
|
|
3
|
-
import * as THREE from 'three';
|
|
3
|
+
import * as THREE from 'three/webgpu';
|
|
4
4
|
import AudioLike from '../../../shared-utils/AudioLike';
|
|
5
5
|
/**
|
|
6
6
|
* 视频经纪人贴片的配置选项
|
|
@@ -51,7 +51,9 @@ export interface VideoAgentMeshOptions {
|
|
|
51
51
|
* videoMesh.dispose()
|
|
52
52
|
* ```
|
|
53
53
|
*/
|
|
54
|
-
export declare class VideoAgentMesh extends THREE.Mesh {
|
|
54
|
+
export declare class VideoAgentMesh extends THREE.Mesh<THREE.PlaneGeometry, THREE.MeshBasicNodeMaterial> {
|
|
55
|
+
private videoTexture;
|
|
56
|
+
private enableNode;
|
|
55
57
|
/** 配置选项 */
|
|
56
58
|
options: VideoAgentMeshOptions;
|
|
57
59
|
/** 当前视频URL */
|
|
@@ -158,3 +160,4 @@ export declare class VideoAgentMesh extends THREE.Mesh {
|
|
|
158
160
|
*/
|
|
159
161
|
dispose(): void;
|
|
160
162
|
}
|
|
163
|
+
//# sourceMappingURL=VideoAgentMesh.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"VideoAgentMesh.d.ts","sourceRoot":"","sources":["../../../../resources/Player/modules/VideoAgent/VideoAgentMesh.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAA;AAC1D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA;AAC3D,OAAO,KAAK,KAAK,MAAM,cAAc,CAAA;AAIrC,OAAO,SAAS,MAAM,iCAAiC,CAAA;AAGvD;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,WAAW,CAAC,EAAE,MAAM,WAAW,GAAG,SAAS,CAAA;IAC3C;;OAEG;IACH,aAAa,CAAC,EAAE,gBAAgB,CAAA;IAChC;;OAEG;IACH,aAAa,CAAC,EAAE,gBAAgB,CAAA;IAChC;;;;OAIG;IACH,OAAO,CAAC,EAAE,OAAO,CAAA;CAClB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,qBAAa,cAAe,SAAQ,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,aAAa,EAAE,KAAK,CAAC,qBAAqB,CAAC;IAC9F,OAAO,CAAC,YAAY,CAAoB;IACxC,OAAO,CAAC,UAAU,CAA4B;IAC9C,WAAW;IACX,OAAO,EAAE,qBAAqB,CAAA;IAC9B,cAAc;IACd,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,aAAa;IACb,MAAM,EAAE,OAAO,CAAA;IACf,aAAa;IACb,MAAM,EAAE,OAAO,CAAA;IACf,WAAW;IACX,OAAO,CAAC,OAAO,CAA+C;IAC9D,OAAO,CAAC,UAAU;IAKlB,OAAO,CAAC,SAAS,CAAQ;IACzB,OAAO,CAAC,SAAS,CAAQ;IACzB,OAAO,CAAC,UAAU,CAAI;IACtB,OAAO,CAAC,WAAW,CAAC,CAAY;IAChC,OAAO,CAAC,SAAS,CAAC,CAAQ;IAC1B,aAAa,EAAE,gBAAgB,CAAA;IAC/B,mBAAmB;IACnB,iBAAiB,EAAE,SAAS,CAAA;IAC5B,iBAAiB;IACjB,oBAAoB,EAAE,MAAM,IAAI,CAAA;IAEhC;;;;;;;;;OASG;IACH,IAAI,aAAa,IAAI,gBAAgB,GAAG,gBAAgB,GAAG,SAAS,CAUnE;IAED;;;;;;;;;;;;;;;;OAgBG;gBAED,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,aAAa,EAAE,MAAM,EACrB,cAAc,EAAE,MAAM,EACtB,OAAO,GAAE,qBAER;IAoEH;;;;;;OAMG;YACW,MAAM;IA0BpB;;;;;;;;;;;;;;;;;;;;;;;;OAwBG;IACG,IAAI,CAAC,QAAQ,SAAK,EAAE,WAAW,SAAI,EAAE,QAAQ,CAAC,EAAE,MAAM;IA0B5D,IAAI,eAAe,IAAI,eAAe,GAAG,SAAS,GAAG,SAAS,CAI7D;IAED,IAAI;IASJ;;;;;OAKG;IACH,IAAI,WAAW,WAEd;IAED;;;;;;;;;;OAUG;IACH,OAAO;CAUR"}
|
|
@@ -1,13 +1,16 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { OrthographicCamera, Scene, WebGPURenderer } from 'three/webgpu';
|
|
2
2
|
import { VideoAgentMesh, VideoAgentMeshOptions } from './VideoAgentMesh';
|
|
3
3
|
export declare class VideoAgentScene {
|
|
4
4
|
videoAgentMesh: VideoAgentMesh;
|
|
5
|
-
scene:
|
|
6
|
-
camera:
|
|
7
|
-
renderer:
|
|
5
|
+
scene: Scene;
|
|
6
|
+
camera: OrthographicCamera;
|
|
7
|
+
renderer: WebGPURenderer;
|
|
8
8
|
private frame;
|
|
9
|
+
private disposed;
|
|
9
10
|
disposers: (() => void)[];
|
|
10
|
-
constructor(container?: HTMLElement, options?: VideoAgentMeshOptions);
|
|
11
|
+
constructor(container?: HTMLElement, options?: VideoAgentMeshOptions, forceWebGL?: boolean);
|
|
12
|
+
private fail;
|
|
11
13
|
run: () => void;
|
|
12
14
|
dispose: () => void;
|
|
13
15
|
}
|
|
16
|
+
//# sourceMappingURL=VideoAgentScene.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"VideoAgentScene.d.ts","sourceRoot":"","sources":["../../../../resources/Player/modules/VideoAgent/VideoAgentScene.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAA;AAExE,OAAO,EAAE,cAAc,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAA;AAExE,qBAAa,eAAe;IAC1B,cAAc,EAAE,cAAc,CAAA;IAC9B,KAAK,QAAc;IACnB,MAAM,qBAA+C;IACrD,QAAQ,EAAE,cAAc,CAAA;IACxB,OAAO,CAAC,KAAK,CAAoB;IACjC,OAAO,CAAC,QAAQ,CAAQ;IACxB,SAAS,EAAE,CAAC,MAAM,IAAI,CAAC,EAAE,CAAK;gBAElB,SAAS,CAAC,EAAE,WAAW,EAAE,OAAO,CAAC,EAAE,qBAAqB,EAAE,UAAU,UAAQ;IA4BxF,OAAO,CAAC,IAAI,CAIX;IAED,GAAG,aAMF;IAED,OAAO,aASN;CACF"}
|
|
@@ -1,6 +1,15 @@
|
|
|
1
1
|
import * as React from 'react';
|
|
2
2
|
import { VideoAgentMeshOptions } from './VideoAgentMesh';
|
|
3
|
-
export declare
|
|
3
|
+
export declare const VideoAgent: ((props: {
|
|
4
4
|
onClick?: () => void;
|
|
5
5
|
options?: VideoAgentMeshOptions;
|
|
6
|
-
})
|
|
6
|
+
}) => import("react/jsx-runtime").JSX.Element) & React.NamedExoticComponent<{
|
|
7
|
+
onClick?: () => void;
|
|
8
|
+
options?: VideoAgentMeshOptions;
|
|
9
|
+
}> & {
|
|
10
|
+
readonly type: (props: {
|
|
11
|
+
onClick?: () => void;
|
|
12
|
+
options?: VideoAgentMeshOptions;
|
|
13
|
+
}) => import("react/jsx-runtime").JSX.Element;
|
|
14
|
+
};
|
|
15
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../resources/Player/modules/VideoAgent/index.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAE9B,OAAO,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAA;AAMxD,eAAO,MAAM,UAAU,WAAuC;IAAE,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IAAC,OAAO,CAAC,EAAE,qBAAqB,CAAA;CAAE;cAA7C,MAAM,IAAI;cAAY,qBAAqB;;2BAAvD;QAAE,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;QAAC,OAAO,CAAC,EAAE,qBAAqB,CAAA;KAAE;CA6CrH,CAAA"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { WaveAppearance } from '../../typings';
|
|
2
|
-
import React from 'react';
|
|
3
2
|
export declare function Wave(props?: {
|
|
4
3
|
appearance?: WaveAppearance;
|
|
5
4
|
onClick?: () => void;
|
|
6
5
|
staticPrefix?: string;
|
|
7
|
-
}):
|
|
6
|
+
}): import("react/jsx-runtime").JSX.Element;
|
|
7
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../resources/Player/modules/Wave/index.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAA;AAwD9C,wBAAgB,IAAI,CAAC,KAAK,CAAC,EAAE;IAAE,UAAU,CAAC,EAAE,cAAc,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IAAC,YAAY,CAAC,EAAE,MAAM,CAAA;CAAC,2CA8BvG"}
|