@realsee/vreo 0.2.0-alpha.1 → 0.2.0-alpha.4

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.
Files changed (58) hide show
  1. package/README.md +36 -13
  2. package/docs/assets/custom.css +2 -2
  3. package/docs/assets/search.js +1 -1
  4. package/docs/classes/Player.Controller.html +54 -0
  5. package/docs/classes/Player.Player-1.html +9 -9
  6. package/docs/classes/Player.VideoAgentMesh.html +142 -0
  7. package/docs/classes/Player.VideoAgentScene.html +1 -0
  8. package/docs/enums/Player.InfoPanelTypeEnum.html +1 -1
  9. package/docs/enums/Player.PanoEffectEnum.html +2 -2
  10. package/docs/enums/Player.PanoTagEnum.html +1 -1
  11. package/docs/enums/Player.VreoKeyframeEnum.html +13 -13
  12. package/docs/enums/fivePlugins.CameraMovementEffect.html +1 -1
  13. package/docs/enums/fivePlugins.Rotation.html +1 -1
  14. package/docs/index.html +25 -16
  15. package/docs/interfaces/Player.CustomVreoKeyframeProps.html +1 -0
  16. package/docs/interfaces/Player.PlayerConfigs.html +3 -3
  17. package/docs/interfaces/Player.Vertex.html +1 -1
  18. package/docs/interfaces/Player.VideoAgentMeshOptions.html +1 -0
  19. package/docs/interfaces/Player.VreoKeyframe.html +1 -1
  20. package/docs/interfaces/Player.VreoUnit.html +1 -1
  21. package/docs/interfaces/Player.VreoVideo.html +1 -1
  22. package/docs/interfaces/fivePlugins.CameraMovementOptsCallback.html +1 -1
  23. package/docs/interfaces/fivePlugins.CameraMovementPluginExportType.html +3 -3
  24. package/docs/interfaces/fivePlugins.CameraMovementPluginParameterType.html +1 -1
  25. package/docs/interfaces/fivePlugins.ModelTVVideoPluginData.html +1 -1
  26. package/docs/interfaces/fivePlugins.ModelTVVideoPluginExportType.html +1 -1
  27. package/docs/interfaces/fivePlugins.ModelTVVideoPluginParameterType.html +1 -1
  28. package/docs/interfaces/react.VreoActionCallbacks.html +7 -7
  29. package/docs/interfaces/react.VreoProviderProps.html +1 -0
  30. package/docs/modules/Player.html +13 -13
  31. package/docs/modules/custom.html +3 -0
  32. package/docs/modules/fivePlugins.html +2 -2
  33. package/docs/modules/react.html +1 -1
  34. package/docs/modules.html +1 -1
  35. package/lib/Player/custom/SpatialScenePanel/index.d.ts +22 -0
  36. package/lib/Player/custom/SpatialScenePanel/index.js +198 -0
  37. package/lib/Player/index.js +17 -1
  38. package/lib/Player/modules/keyframes/InfoPanel/index.js +31 -21
  39. package/lib/Player/modules/keyframes/PanoTextLabel/index.js +4 -12
  40. package/lib/Player/typings.d.ts +9 -2
  41. package/lib/fivePlugins/CameraMovementPlugin/index.js +9 -6
  42. package/lib/fivePlugins/CameraMovementPlugin/typings.d.ts +2 -2
  43. package/lib/react/index.d.ts +5 -1
  44. package/lib/react/index.js +1 -1
  45. package/lib/typings/VreoUnit.d.ts +2 -1
  46. package/package.json +2 -1
  47. package/resources/Player/App.tsx +1 -1
  48. package/resources/Player/custom/SpatialScenePanel/index.tsx +155 -0
  49. package/resources/Player/index.tsx +13 -1
  50. package/resources/Player/modules/keyframes/InfoPanel/index.tsx +41 -19
  51. package/resources/Player/modules/keyframes/PanoTextLabel/index.tsx +2 -2
  52. package/resources/Player/typings.ts +12 -2
  53. package/resources/fivePlugins/CameraMovementPlugin/index.ts +9 -6
  54. package/resources/fivePlugins/CameraMovementPlugin/typings.ts +2 -2
  55. package/resources/react/index.tsx +7 -2
  56. package/resources/typings/VreoUnit.ts +10 -2
  57. package/stylesheets/custom/SpatialScenePanel.css +303 -0
  58. package/stylesheets/default.css +11 -0
@@ -1,6 +1,10 @@
1
1
  import * as React from 'react';
2
+ import { PlayerConfigs } from '../Player/typings';
2
3
  import { VreoKeyframeEvent, VreoUnit } from '../typings/VreoUnit';
3
- export declare const VreoProvider: React.FC;
4
+ export interface VreoProviderProps {
5
+ configs?: Partial<PlayerConfigs>;
6
+ }
7
+ export declare const VreoProvider: React.FC<VreoProviderProps>;
4
8
  /**
5
9
  * VreoPlayer 命令集合。
6
10
  */
@@ -44,7 +44,7 @@ var VreoProvider = function VreoProvider(props) {
44
44
 
45
45
  var playerRef = React.useRef(null);
46
46
  React.useEffect(function () {
47
- playerRef.current = new _Player.Player(five);
47
+ playerRef.current = new _Player.Player(five, props.configs || {});
48
48
  setPlayer(playerRef.current);
49
49
  return function () {
50
50
  var _playerRef$current;
@@ -97,6 +97,7 @@ export declare type VreoKeyframeEvent = {
97
97
  loaded: (vreoUnit: VreoUnit) => void;
98
98
  paused: () => void;
99
99
  playing: () => void;
100
+ unknownKeyframeType: (keyframe: Record<string, any>) => void;
100
101
  };
101
102
  /**
102
103
  * 相机运动
@@ -215,7 +216,7 @@ export declare enum InfoPanelTypeEnum {
215
216
  export declare type InfoPanelData = {
216
217
  type: InfoPanelTypeEnum;
217
218
  url: string;
218
- tilte?: string;
219
+ title?: string;
219
220
  subTitle?: string;
220
221
  };
221
222
  /**
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@realsee/vreo",
3
- "version": "0.2.0-alpha.1",
3
+ "version": "0.2.0-alpha.4",
4
4
  "description": "Vreo (VR Video 缩写) 是基于如视三维渲染引擎 Five 和 用户界面构建库 React 实现的如视 3D 空间剧本播放器。",
5
5
  "keywords": [
6
6
  "realsee",
@@ -35,6 +35,7 @@
35
35
  "@babel/preset-env": "^7.16.4",
36
36
  "@babel/preset-react": "^7.16.0",
37
37
  "@babel/preset-typescript": "^7.16.0",
38
+ "@realsee/dnalogel": "^0.1.7-alpha.10",
38
39
  "@realsee/five": "^5.0.0-alpha.103",
39
40
  "@types/offscreencanvas": "^2019.6.4",
40
41
  "@types/react": "^17.0.37",
@@ -2,7 +2,7 @@ import * as React from 'react'
2
2
  import classNames from 'classnames'
3
3
  import { observer } from 'mobx-react'
4
4
  import { Controller } from './Controller'
5
- import { useController } from './hooks'
5
+ import { useController, useFiveInstance } from './hooks'
6
6
  import { CameraMovement } from './modules/keyframes/CameraMovement'
7
7
  import { InfoPanel } from './modules/keyframes/InfoPanel'
8
8
  import { ModelVideo } from './modules/keyframes/ModelVideo'
@@ -0,0 +1,155 @@
1
+ import * as React from 'react'
2
+ import ReactDOM from 'react-dom'
3
+ import { Five } from '@realsee/five'
4
+ import { Raycaster, Vector3 } from 'three'
5
+ import { tweenProgress } from '@realsee/dnalogel/shared-utils/animationFrame/BetterTween'
6
+ import { CSS3DRenderPlugin, CSS3DRenderPluginExportType } from '@realsee/dnalogel/plugins/CSS3DRenderPlugin'
7
+
8
+ import { VreoKeyframe, VreoKeyframeEnum } from '../../../typings/VreoUnit'
9
+ import { CustomVreoKeyframeProps } from '../../typings'
10
+
11
+ export interface SpatialScenePanelData {
12
+ customType: 'SpatialScenePanel'
13
+ title: string
14
+ temperature: string
15
+ stateList: {
16
+ text: string
17
+ icon: string
18
+ }[]
19
+ position: { x: number; y: number; z: number }
20
+ quaternion: [number, number, number, number]
21
+ }
22
+
23
+ interface SearchParams {
24
+ five: Five
25
+ // position: Vector3
26
+ // rotation?: Vector3
27
+ // quaternion: [number, number, number, number]
28
+ dom: HTMLDivElement
29
+ }
30
+
31
+ const searchV1 = ({ five, dom }: SearchParams) => {
32
+ const cameraDirection = new Vector3()
33
+ five.camera.getWorldDirection(cameraDirection)
34
+ const cameraPosition = five.camera.position
35
+ const [intersect] = five.model.intersectRaycaster(new Raycaster(cameraPosition, cameraDirection))
36
+ const point = five.project2d(intersect.point)
37
+
38
+ // const width = dom!.clientWidth
39
+ const height = dom!.clientHeight
40
+ dom!.style.left = point!.x + 'px'
41
+ dom!.style.top = point!.y - height / 2 + 'px'
42
+ const rect = dom!.getBoundingClientRect()
43
+ const { left, top, bottom, right } = rect
44
+
45
+ const leftBottom = new Vector3(left, bottom)
46
+ const leftTop = new Vector3(left, top)
47
+ const rightTop = new Vector3(right, top)
48
+ const rightBottom = new Vector3(right, bottom)
49
+
50
+ const points = [leftBottom, rightBottom, rightTop, leftTop].map((point) => {
51
+ point.setX((point.x / window.innerWidth) * 2 - 1)
52
+ point.setY(-(point.y / window.innerHeight) * 2 + 1)
53
+ point.setZ(0.5)
54
+ return point.unproject(five.camera).addScaledVector(cameraDirection, 0.2)
55
+ })
56
+
57
+ // const colors = [0xdc143c, 0xffff00, 0x0000ff, 0x008000]
58
+ // points.forEach((p, index) => five.scene.add(getSphere(p, colors[index])))
59
+
60
+ const ratio = leftBottom.distanceTo(rightBottom) / 160
61
+ return { points, ratio }
62
+ }
63
+
64
+ /**
65
+ * 空间场景面板
66
+ * @returns
67
+ */
68
+ export function SpatialScenePanel(props: CustomVreoKeyframeProps) {
69
+ const ref = React.useRef<HTMLDivElement>(null)
70
+ const panelRef = React.useRef<HTMLDivElement | null>(null)
71
+ const rendererRef = React.useRef<CSS3DRenderPluginExportType>(CSS3DRenderPlugin(props.five))
72
+
73
+ React.useEffect(() => {
74
+
75
+ if (!ref.current) {
76
+ return
77
+ }
78
+
79
+ const callback = (keyframe: VreoKeyframe) => {
80
+ if (keyframe.data.customType !== 'SpatialScenePanel') {
81
+ return
82
+ }
83
+
84
+ const data = keyframe.data as SpatialScenePanelData
85
+
86
+ const { points, ratio } = searchV1({
87
+ five: props.five,
88
+ dom: ref.current!
89
+ })
90
+
91
+ const { container, dispose, css3DObject, render } =
92
+ rendererRef.current.create3DDomContainer(points, { ratio, autoRender: false }) || {}
93
+
94
+ if (!container) return
95
+
96
+
97
+ ReactDOM.render(<Panel ref={(ref) => (panelRef.current = ref)} data={data} />, container)
98
+ const startRotateY = -(Math.PI * 2) / 9
99
+ let lastRotateY = 0
100
+ tweenProgress(1000)
101
+ .onUpdate(({ progress }) => {
102
+ const needRotateY = (Math.PI / 90) * 11 * progress
103
+ const rotateY = needRotateY - lastRotateY
104
+ css3DObject?.rotateY(rotateY)
105
+ lastRotateY = needRotateY
106
+ })
107
+ .onStart(() => {
108
+ css3DObject?.rotateY(startRotateY)
109
+ render!()
110
+ })
111
+ .onDispose(() => {
112
+ panelRef.current?.classList.add('show')
113
+ })
114
+ .play()
115
+ const { start, end } = keyframe
116
+ setTimeout(() => {
117
+ panelRef.current?.classList.add('hide')
118
+ setTimeout(() => dispose?.(), 1500)
119
+ }, end - start)
120
+ }
121
+
122
+ props.subscribe.on(VreoKeyframeEnum.Custom, callback)
123
+
124
+ return () => {
125
+ props.subscribe.off(VreoKeyframeEnum.Custom, callback)
126
+ }
127
+ }, [])
128
+
129
+ return <div className="vreo-SpatialScenePanel" ref={ref}></div>
130
+ }
131
+
132
+ const Panel = React.forwardRef(
133
+ (props: { data: SpatialScenePanelData }, myRef: React.LegacyRef<HTMLDivElement> | undefined) => (
134
+ <div className="SpatialScenePanel" ref={myRef}>
135
+ <div className="SpatialScenePanel-show-area">
136
+ <div className="SpatialScenePanel-bg"></div>
137
+ <div className="SpatialScenePanel-header">
138
+ <div className="SpatialScenePanel-title">{props.data?.title}</div>
139
+ <div className="SpatialScenePanel-temperature">{props.data?.temperature}℃</div>
140
+ </div>
141
+ <div className="SpatialScenePanel-body">
142
+ {props.data?.stateList?.map((state, index) => (
143
+ <div key={`scene-${state.text}`} className={`SpatialScenePanel-item index_${index}`}>
144
+ <img className="SpatialScenePanel-icon" src={state.icon}></img>
145
+ <div className="SpatialScenePanel-text">{state.text}</div>
146
+ <div className="SpatialScenePanel-dot"></div>
147
+ </div>
148
+ ))}
149
+ </div>
150
+ </div>
151
+
152
+ <div className="SpatialScenePanel-disappear-area"></div>
153
+ </div>
154
+ ),
155
+ )
@@ -4,7 +4,7 @@ import { Five, Subscribe } from '@realsee/five'
4
4
 
5
5
  import { App } from './App'
6
6
  import { Controller, ControllerContext } from './Controller'
7
- import { VreoKeyframeEvent, VreoKeyframeConfigMap, VreoUnit } from '../typings/VreoUnit'
7
+ import { VreoKeyframeEvent, VreoUnit } from '../typings/VreoUnit'
8
8
  import { reaction } from 'mobx'
9
9
  import { Drawer } from './modules/Drawer'
10
10
  import { PlayerConfigs } from './typings'
@@ -42,6 +42,18 @@ export class Player extends Subscribe<VreoKeyframeEvent> {
42
42
  <ControllerContext.Provider value={this.controller}>
43
43
  <App></App>
44
44
  <Drawer />
45
+ {this.configs.customKeyframes &&
46
+ this.configs.customKeyframes.map((CustomCmpt, key) => (
47
+ <CustomCmpt
48
+ key={key}
49
+ subscribe={{
50
+ on: (name, callback) => this.on(name, callback),
51
+ once: (name, callback) => this.once(name, callback),
52
+ off: (name, callback) => this.off(name, callback),
53
+ }}
54
+ five={five}
55
+ />
56
+ ))}
45
57
  </ControllerContext.Provider>,
46
58
  configs.containter
47
59
  )
@@ -7,7 +7,7 @@ function InfoPanelImg({ url, children }: { url: string; children?: ReactNode })
7
7
  return (
8
8
  <div className="vreo-infoPanel vreo-infoPanel--img">
9
9
  {children}
10
- <div className="vreo-infoPanelImg" style={{backgroundImage: `url(${url})`}} ></div>
10
+ <div className="vreo-infoPanelImg" style={{ backgroundImage: `url(${url})` }}></div>
11
11
  </div>
12
12
  )
13
13
  }
@@ -16,7 +16,7 @@ function InfoPanelVideo({ url, children }: { url: string; children?: ReactNode }
16
16
  return (
17
17
  <div className="vreo-infoPanel vreo-infoPanel--video">
18
18
  {children}
19
- <video playsInline autoPlay className="vreo-infoPanelVideo" src={url} />
19
+ <div className="vreo-infoPanelWrapper"><video playsInline autoPlay className="vreo-infoPanelVideo" src={url} /></div>
20
20
  </div>
21
21
  )
22
22
  }
@@ -31,10 +31,12 @@ const Title = (props: TitleProps) => {
31
31
  return null
32
32
  }
33
33
 
34
- return <div className="vreo-infoPanel-title">
35
- <div className="vreo-infoPanel-t1">{props.title}</div>
36
- <div className="vreo-infoPanel-t2">{props.subTitle}</div>
37
- </div>
34
+ return (
35
+ <div className="vreo-infoPanel-title">
36
+ <div className="vreo-infoPanel-t1">{props.title}</div>
37
+ <div className="vreo-infoPanel-t2">{props.subTitle}</div>
38
+ </div>
39
+ )
38
40
  }
39
41
 
40
42
  export function InfoPanel() {
@@ -49,27 +51,47 @@ export function InfoPanel() {
49
51
  const { start, end, data } = keyframe
50
52
 
51
53
  const infoPanelData = data as InfoPanelData
52
-
53
-
54
54
 
55
+ const { title, subTitle } = infoPanelData
55
56
  if (infoPanelData.type === InfoPanelTypeEnum.Image) {
56
- controller.openDrawer({ content: <InfoPanelImg url={infoPanelData.url} />, height: '60vh' })
57
+ controller.openDrawer({
58
+ content: (
59
+ <InfoPanelImg url={infoPanelData.url}>
60
+ <Title title={title} subTitle={subTitle} />
61
+ </InfoPanelImg>
62
+ ),
63
+ height: '60vh',
64
+ })
57
65
  } else if (infoPanelData.type === InfoPanelTypeEnum.Video) {
58
- controller.openDrawer({ content: <InfoPanelVideo url={infoPanelData.url} />, height: '60vh' })
66
+ controller.openDrawer({
67
+ content: (
68
+ <InfoPanelVideo url={infoPanelData.url}>
69
+ <Title title={title} subTitle={subTitle} />
70
+ </InfoPanelVideo>
71
+ ),
72
+ height: '60vh',
73
+ })
59
74
  }
60
75
  timeoutRef.current = setTimeout(() => controller.openDrawer(false), end - start)
61
76
  }
62
77
  controller.on(VreoKeyframeEnum.InfoPanel, callback)
63
78
 
64
- Object.assign(window, { $setInfoPanel: () => {
65
- controller.openDrawer({ content: (
66
-
67
- // <InfoPanelImg url='//vrlab-public.ljcdn.com/release/seesay/tools/cat_music___f68fb9bbe1f7cd6d00a16456dd0b09ad.gif'>
68
- <InfoPanelImg url='http://vrlab-public.ljcdn.com/common/images/web/d94e1bd7-0311-4b20-9c41-a1294fe43554.png'>
69
- <Title title="场景联动抓拍图片" subTitle={"2022.02.17 14:00"} />
70
- </InfoPanelImg>
71
- ), height: '60vh' })
72
- }})
79
+ // Object.assign(window, {
80
+ // $setInfoPanel: () => {
81
+ // controller.openDrawer({
82
+ // content: (
83
+ // // <InfoPanelImg url='//vrlab-public.ljcdn.com/release/seesay/tools/cat_music___f68fb9bbe1f7cd6d00a16456dd0b09ad.gif'>
84
+ // // <InfoPanelImg url="http://vrlab-public.ljcdn.com/common/images/web/d94e1bd7-0311-4b20-9c41-a1294fe43554.png">
85
+ // // <Title title="场景联动抓拍图片" subTitle={'2022.02.17 14:00'} />
86
+ // // </InfoPanelImg>
87
+ // <InfoPanelVideo url="//vrlab-public.ljcdn.com/release/seesay/tools/2022011713142___b320f74a5e1b5ad4bb46b4dc69d73ecc.mp4">
88
+ // <Title title="场景联动抓拍图片" subTitle={'2022.02.17 14:00'} />
89
+ // </InfoPanelVideo>
90
+ // ),
91
+ // height: '60vh',
92
+ // })
93
+ // },
94
+ // })
73
95
 
74
96
  return () => {
75
97
  controller.off(VreoKeyframeEnum.InfoPanel, callback)
@@ -30,13 +30,13 @@ export function PanoTextLabel() {
30
30
  if (!res) return
31
31
  const { x: left, y: top } = res
32
32
 
33
- Object.assign(window, { $PanoTextLabel: { setState } })
33
+ // Object.assign(window, { $PanoTextLabel: { setState } })
34
34
  setState({ left, top, text: data.text || '', fontSize: data.fontSize || 16 })
35
35
  timeoutRef.current = setTimeout(() => setState(null), end - start)
36
36
  }
37
37
  controller.on(VreoKeyframeEnum.PanoTextLabel, callback)
38
38
 
39
- Object.assign(window, { $panoTextLabel: { setState } })
39
+ // Object.assign(window, { $panoTextLabel: { setState } })
40
40
  return () => {
41
41
  controller.off(VreoKeyframeEnum.PanoTextLabel, callback)
42
42
  if (timeoutRef.current) {
@@ -1,5 +1,7 @@
1
- import { ReactNode } from 'react';
2
- import { VreoKeyframeConfigMap } from '../typings/VreoUnit'
1
+ import React, { ReactNode } from 'react';
2
+ import { Subscribe, Five } from '@realsee/five';
3
+
4
+ import { VreoKeyframeConfigMap, VreoKeyframeEvent } from '../typings/VreoUnit'
3
5
 
4
6
  export interface PlayerConfigs {
5
7
  containter?: ReactDOM.Container
@@ -17,4 +19,12 @@ export interface PlayerConfigs {
17
19
  * 如果需要在 底部面板添加自定义内容,可以传递个 React 组件。
18
20
  */
19
21
  customPanelChildren?: ReactNode
22
+ customKeyframes?: React.FC<CustomVreoKeyframeProps>[]
23
+ }
24
+
25
+ export type VreoSubscribe = Pick<Subscribe<VreoKeyframeEvent>, 'on' | 'once' | 'off'>
26
+
27
+ export interface CustomVreoKeyframeProps {
28
+ subscribe: VreoSubscribe
29
+ five: Five
20
30
  }
@@ -1,4 +1,4 @@
1
- import { Five } from '@realsee/five'
1
+ import { Five, MovePanoOptions } from '@realsee/five'
2
2
  import type { FivePlugin } from '@realsee/five'
3
3
  import * as TWEEN from '@tweenjs/tween.js'
4
4
 
@@ -97,14 +97,16 @@ export const CameraMovementPlugin: FivePlugin<CameraMovementPluginParameterType,
97
97
  return await new Promise<boolean>((resolve, reject) => {
98
98
  const panoIndex = args.panoIndex !== undefined ? args.panoIndex : five.panoIndex
99
99
  if (panoIndex !== undefined) {
100
+ const movePanoOptions: MovePanoOptions = {
101
+ duration, // 移动耗时
102
+ moveEndCallback: () => resolve(true), // 移动结束
103
+ moveCancelCallback: () => reject(false), // 移动开始
104
+ effect: 'fade',
105
+ }
100
106
  five.moveToPano(
101
107
  panoIndex,
102
108
  Object.assign(
103
- {
104
- duration, // 移动耗时
105
- moveEndCallback: () => resolve(true), // 移动结束
106
- moveCancelCallback: () => reject(false), // 移动开始
107
- },
109
+ movePanoOptions,
108
110
  args,
109
111
  ),
110
112
  )
@@ -154,6 +156,7 @@ export const CameraMovementPlugin: FivePlugin<CameraMovementPluginParameterType,
154
156
  five.moveToPano(args.panoIndex, {
155
157
  moveEndCallback: () => resolve(true), // 移动结束
156
158
  moveCancelCallback: () => reject(false), // 移动开始
159
+ effect: 'fade',
157
160
  })
158
161
  })
159
162
  }
@@ -1,5 +1,5 @@
1
1
  /* eslint-disable prettier/prettier */
2
- import { Mode, Pose } from '@realsee/five'
2
+ import { Mode, MovePanoOptions, Pose } from '@realsee/five'
3
3
 
4
4
  // eslint-disable-next-line @typescript-eslint/no-empty-interface
5
5
  export interface CameraMovementPluginParameterType { }
@@ -39,7 +39,7 @@ export interface CameraMovementOptsCallback {
39
39
  export type MoveArgs = {
40
40
  mode: Mode
41
41
  panoIndex: number
42
- } & Pose
42
+ } & Pose & Pick<MovePanoOptions, 'effect'>
43
43
 
44
44
  export type MoveOpts = {
45
45
  preload?: boolean
@@ -1,18 +1,23 @@
1
1
  import { unsafe__useFiveInstance } from '@realsee/five/react'
2
2
  import * as React from 'react'
3
3
  import { Player } from '../Player'
4
+ import { PlayerConfigs } from '../Player/typings'
4
5
  import { VreoKeyframeEvent, VreoUnit } from '../typings/VreoUnit'
5
6
 
6
7
  const VreoContext = React.createContext<Player | null>(null)
7
8
 
8
- export const VreoProvider: React.FC = (props) => {
9
+ export interface VreoProviderProps {
10
+ configs?: Partial<PlayerConfigs>
11
+ }
12
+
13
+ export const VreoProvider: React.FC<VreoProviderProps> = (props ) => {
9
14
  const five = unsafe__useFiveInstance()
10
15
 
11
16
  const [player, setPlayer] = React.useState<Player | null>(null)
12
17
  const playerRef = React.useRef<Player | null>(null)
13
18
 
14
19
  React.useEffect(() => {
15
- playerRef.current = new Player(five)
20
+ playerRef.current = new Player(five, props.configs || {})
16
21
  setPlayer(playerRef.current)
17
22
 
18
23
  return () => {
@@ -1,4 +1,4 @@
1
- import { Mode, Pose, WorkCubeImage, Work } from '@realsee/five'
1
+ import { Mode, Pose } from '@realsee/five'
2
2
  import { CameraMovementEffect, Rotation } from '../fivePlugins/CameraMovementPlugin/typings'
3
3
 
4
4
  export enum VreoKeyframeEnum {
@@ -101,9 +101,14 @@ export interface VreoUnit {
101
101
  * 剧本事件
102
102
  */
103
103
  export type VreoKeyframeEvent = { [key in VreoKeyframeEnum]: (keyframe: VreoKeyframe) => void } & {
104
+ // 新数据载入完成
104
105
  loaded: (vreoUnit: VreoUnit) => void
106
+ // 语音状态 播放 -> 暂停
105
107
  paused: () => void
108
+ // 语音状态 暂停 -> 播放
106
109
  playing: () => void
110
+ // 未知的 剧本帧类型
111
+ unknownKeyframeType: (keyframe: Record<string, any>) => void
107
112
  }
108
113
 
109
114
  /**
@@ -133,6 +138,7 @@ export type UpdateVRPanoramaData = {
133
138
  allow_hosts: string[]
134
139
  certificate: string
135
140
  expire_at: string
141
+ // 动态场景
136
142
  dynamic_scene?: {
137
143
  images: {
138
144
  index: number
@@ -235,7 +241,9 @@ export enum InfoPanelTypeEnum {
235
241
  export type InfoPanelData = {
236
242
  type: InfoPanelTypeEnum
237
243
  url: string
238
- tilte?: string
244
+ // 标题
245
+ title?: string
246
+ // 副标题
239
247
  subTitle?: string
240
248
  }
241
249