@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.
- package/README.md +36 -13
- package/docs/assets/custom.css +2 -2
- package/docs/assets/search.js +1 -1
- package/docs/classes/Player.Controller.html +54 -0
- package/docs/classes/Player.Player-1.html +9 -9
- package/docs/classes/Player.VideoAgentMesh.html +142 -0
- package/docs/classes/Player.VideoAgentScene.html +1 -0
- package/docs/enums/Player.InfoPanelTypeEnum.html +1 -1
- package/docs/enums/Player.PanoEffectEnum.html +2 -2
- package/docs/enums/Player.PanoTagEnum.html +1 -1
- package/docs/enums/Player.VreoKeyframeEnum.html +13 -13
- package/docs/enums/fivePlugins.CameraMovementEffect.html +1 -1
- package/docs/enums/fivePlugins.Rotation.html +1 -1
- package/docs/index.html +25 -16
- package/docs/interfaces/Player.CustomVreoKeyframeProps.html +1 -0
- package/docs/interfaces/Player.PlayerConfigs.html +3 -3
- package/docs/interfaces/Player.Vertex.html +1 -1
- package/docs/interfaces/Player.VideoAgentMeshOptions.html +1 -0
- package/docs/interfaces/Player.VreoKeyframe.html +1 -1
- package/docs/interfaces/Player.VreoUnit.html +1 -1
- package/docs/interfaces/Player.VreoVideo.html +1 -1
- package/docs/interfaces/fivePlugins.CameraMovementOptsCallback.html +1 -1
- package/docs/interfaces/fivePlugins.CameraMovementPluginExportType.html +3 -3
- package/docs/interfaces/fivePlugins.CameraMovementPluginParameterType.html +1 -1
- package/docs/interfaces/fivePlugins.ModelTVVideoPluginData.html +1 -1
- package/docs/interfaces/fivePlugins.ModelTVVideoPluginExportType.html +1 -1
- package/docs/interfaces/fivePlugins.ModelTVVideoPluginParameterType.html +1 -1
- package/docs/interfaces/react.VreoActionCallbacks.html +7 -7
- package/docs/interfaces/react.VreoProviderProps.html +1 -0
- package/docs/modules/Player.html +13 -13
- package/docs/modules/custom.html +3 -0
- package/docs/modules/fivePlugins.html +2 -2
- package/docs/modules/react.html +1 -1
- package/docs/modules.html +1 -1
- package/lib/Player/custom/SpatialScenePanel/index.d.ts +22 -0
- package/lib/Player/custom/SpatialScenePanel/index.js +198 -0
- package/lib/Player/index.js +17 -1
- package/lib/Player/modules/keyframes/InfoPanel/index.js +31 -21
- package/lib/Player/modules/keyframes/PanoTextLabel/index.js +4 -12
- package/lib/Player/typings.d.ts +9 -2
- package/lib/fivePlugins/CameraMovementPlugin/index.js +9 -6
- package/lib/fivePlugins/CameraMovementPlugin/typings.d.ts +2 -2
- package/lib/react/index.d.ts +5 -1
- package/lib/react/index.js +1 -1
- package/lib/typings/VreoUnit.d.ts +2 -1
- package/package.json +2 -1
- package/resources/Player/App.tsx +1 -1
- package/resources/Player/custom/SpatialScenePanel/index.tsx +155 -0
- package/resources/Player/index.tsx +13 -1
- package/resources/Player/modules/keyframes/InfoPanel/index.tsx +41 -19
- package/resources/Player/modules/keyframes/PanoTextLabel/index.tsx +2 -2
- package/resources/Player/typings.ts +12 -2
- package/resources/fivePlugins/CameraMovementPlugin/index.ts +9 -6
- package/resources/fivePlugins/CameraMovementPlugin/typings.ts +2 -2
- package/resources/react/index.tsx +7 -2
- package/resources/typings/VreoUnit.ts +10 -2
- package/stylesheets/custom/SpatialScenePanel.css +303 -0
- package/stylesheets/default.css +11 -0
package/lib/react/index.d.ts
CHANGED
|
@@ -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
|
|
4
|
+
export interface VreoProviderProps {
|
|
5
|
+
configs?: Partial<PlayerConfigs>;
|
|
6
|
+
}
|
|
7
|
+
export declare const VreoProvider: React.FC<VreoProviderProps>;
|
|
4
8
|
/**
|
|
5
9
|
* VreoPlayer 命令集合。
|
|
6
10
|
*/
|
package/lib/react/index.js
CHANGED
|
@@ -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
|
-
|
|
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.
|
|
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",
|
package/resources/Player/App.tsx
CHANGED
|
@@ -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,
|
|
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})`}}
|
|
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
|
|
35
|
-
<div className="vreo-infoPanel-
|
|
36
|
-
|
|
37
|
-
|
|
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({
|
|
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({
|
|
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, {
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
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 {
|
|
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
|
|
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
|
|
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
|
-
|
|
244
|
+
// 标题
|
|
245
|
+
title?: string
|
|
246
|
+
// 副标题
|
|
239
247
|
subTitle?: string
|
|
240
248
|
}
|
|
241
249
|
|