@realsee/vreo 0.2.0-alpha.13 → 0.2.0-alpha.16

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 (82) hide show
  1. package/README.md +13 -2
  2. package/docs/assets/search.js +1 -1
  3. package/docs/classes/Player.AudioLike.html +2 -2
  4. package/docs/classes/Player.Controller.html +3 -3
  5. package/docs/classes/Player.Player-1.html +3 -3
  6. package/docs/classes/Player.VideoAgentMesh.html +11 -11
  7. package/docs/classes/Player.VideoAgentScene.html +1 -1
  8. package/docs/demo/assets/{AppReact.388465e9.js → AppReact.2978a2aa.js} +1 -1
  9. package/docs/demo/assets/default.0c3b245d.js +64 -0
  10. package/docs/demo/assets/{default.0350c336.css → default.70243c83.css} +1 -1
  11. package/docs/demo/assets/dynamic.37c058ac.js +1 -0
  12. package/docs/demo/assets/{examples.02abaf01.js → examples.4104efd4.js} +2 -2
  13. package/docs/demo/assets/{index.485f13f7.js → index.863d264e.js} +1 -1
  14. package/docs/demo/assets/{main.0b6b41ab.js → main.f8c52f62.js} +1 -1
  15. package/docs/demo/assets/{react.b14dadc7.js → react.98c8f46f.js} +2 -2
  16. package/docs/demo/assets/{vendor.d3e0753c.js → vendor.f4c5cb32.js} +67 -68
  17. package/docs/demo/examples.html +4 -4
  18. package/docs/demo/index-react-dynamic.html +6 -6
  19. package/docs/demo/index-react.html +6 -6
  20. package/docs/demo/index.html +5 -5
  21. package/docs/enums/Player.InfoPanelStyleEnum.html +1 -1
  22. package/docs/enums/Player.InfoPanelTypeEnum.html +1 -1
  23. package/docs/enums/Player.PanoEffectEnum.html +1 -1
  24. package/docs/enums/Player.PanoTagEnum.html +1 -1
  25. package/docs/enums/Player.PanoTagStyleEnum.html +2 -2
  26. package/docs/enums/Player.VreoKeyframeEnum.html +12 -12
  27. package/docs/enums/fivePlugins.CameraMovementEffect.html +1 -1
  28. package/docs/enums/fivePlugins.Rotation.html +1 -1
  29. package/docs/index.html +10 -3
  30. package/docs/interfaces/Player.CustomVreoKeyframeProps.html +1 -1
  31. package/docs/interfaces/Player.PlayerConfigs.html +2 -2
  32. package/docs/interfaces/Player.Vertex.html +1 -1
  33. package/docs/interfaces/Player.VideoAgentMeshOptions.html +8 -1
  34. package/docs/interfaces/Player.VreoKeyframe.html +1 -1
  35. package/docs/interfaces/Player.VreoUnit.html +1 -1
  36. package/docs/interfaces/Player.VreoVideo.html +1 -1
  37. package/docs/interfaces/fivePlugins.CSS3DRenderPluginExportType.html +4 -0
  38. package/docs/interfaces/fivePlugins.CameraMovementOptsCallback.html +1 -1
  39. package/docs/interfaces/fivePlugins.CameraMovementPluginExportType.html +2 -2
  40. package/docs/interfaces/fivePlugins.ModelTVVideoPluginData.html +1 -1
  41. package/docs/interfaces/fivePlugins.ModelTVVideoPluginExportType.html +1 -1
  42. package/docs/interfaces/fivePlugins.ModelTVVideoPluginParameterType.html +1 -1
  43. package/docs/interfaces/fivePlugins.Vector3Position.html +3 -0
  44. package/docs/interfaces/react.VreoActionCallbacks.html +6 -6
  45. package/docs/interfaces/react.VreoProviderProps.html +1 -1
  46. package/docs/modules/Player.html +17 -15
  47. package/docs/modules/custom.html +1 -1
  48. package/docs/modules/fivePlugins.html +5 -2
  49. package/docs/modules/react.html +1 -1
  50. package/lib/Player/custom/SpatialScenePanel/index.js +2 -2
  51. package/lib/Player/modules/VideoAgent/VideoAgentMesh.d.ts +12 -0
  52. package/lib/Player/modules/VideoAgent/VideoAgentMesh.js +26 -10
  53. package/lib/Player/modules/VideoAgent/VideoAgentScene.d.ts +1 -0
  54. package/lib/Player/modules/VideoAgent/VideoAgentScene.js +1 -2
  55. package/lib/Player/modules/keyframes/PanoTextLabel/index.d.ts +3 -0
  56. package/lib/Player/modules/keyframes/PanoTextLabel/index.js +96 -43
  57. package/lib/fivePlugins/CSS3DRenderPlugin/centerPoint.d.ts +2 -0
  58. package/lib/fivePlugins/CSS3DRenderPlugin/centerPoint.js +12 -0
  59. package/lib/fivePlugins/CSS3DRenderPlugin/createResizeObserver.d.ts +7 -0
  60. package/lib/fivePlugins/CSS3DRenderPlugin/createResizeObserver.js +32 -0
  61. package/lib/fivePlugins/CSS3DRenderPlugin/evenNumber.d.ts +3 -0
  62. package/lib/fivePlugins/CSS3DRenderPlugin/evenNumber.js +11 -0
  63. package/lib/fivePlugins/CSS3DRenderPlugin/index.d.ts +56 -0
  64. package/lib/fivePlugins/CSS3DRenderPlugin/index.js +275 -0
  65. package/lib/fivePlugins/CSS3DRenderPlugin/transformPositionToVector3.d.ts +7 -0
  66. package/lib/fivePlugins/CSS3DRenderPlugin/transformPositionToVector3.js +18 -0
  67. package/lib/typings/VreoUnit.d.ts +11 -0
  68. package/package.json +1 -1
  69. package/resources/Player/custom/SpatialScenePanel/index.tsx +4 -4
  70. package/resources/Player/index.tsx +1 -1
  71. package/resources/Player/modules/VideoAgent/VideoAgentMesh.ts +17 -2
  72. package/resources/Player/modules/VideoAgent/VideoAgentScene.ts +2 -4
  73. package/resources/Player/modules/keyframes/PanoTextLabel/index.tsx +87 -34
  74. package/resources/fivePlugins/CSS3DRenderPlugin/centerPoint.ts +5 -0
  75. package/resources/fivePlugins/CSS3DRenderPlugin/createResizeObserver.ts +17 -0
  76. package/resources/fivePlugins/CSS3DRenderPlugin/evenNumber.ts +4 -0
  77. package/resources/fivePlugins/CSS3DRenderPlugin/index.ts +254 -0
  78. package/resources/fivePlugins/CSS3DRenderPlugin/transformPositionToVector3.ts +5 -0
  79. package/resources/typings/VreoUnit.ts +13 -1
  80. package/stylesheets/default.css +5 -1
  81. package/docs/demo/assets/default.f03f1cdd.js +0 -64
  82. package/docs/demo/assets/dynamic.3f7479e4.js +0 -1
@@ -7,22 +7,24 @@ Object.defineProperty(exports, "__esModule", {
7
7
  });
8
8
  exports.PanoTextLabel = PanoTextLabel;
9
9
 
10
- var _classnames = _interopRequireDefault(require("classnames"));
11
-
12
10
  var React = _interopRequireWildcard(require("react"));
13
11
 
14
- var _three = require("three");
12
+ var THREE = _interopRequireWildcard(require("three"));
15
13
 
16
- var _VreoUnit = require("../../../../typings/VreoUnit");
14
+ var _reactDom = _interopRequireDefault(require("react-dom"));
17
15
 
18
16
  var _hooks = require("../../../hooks");
19
17
 
20
- function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
18
+ var _CSS3DRenderPlugin = require("../../../../fivePlugins/CSS3DRenderPlugin");
21
19
 
22
- function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
20
+ var _VreoUnit = require("../../../../typings/VreoUnit");
23
21
 
24
22
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
25
23
 
24
+ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
25
+
26
+ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
27
+
26
28
  function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
27
29
 
28
30
  function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
@@ -35,15 +37,62 @@ function _iterableToArrayLimit(arr, i) { var _i = arr == null ? null : typeof Sy
35
37
 
36
38
  function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
37
39
 
38
- function PanoTextLabel() {
39
- var _React$useState = React.useState(null),
40
- _React$useState2 = _slicedToArray(_React$useState, 2),
41
- state = _React$useState2[0],
42
- setState = _React$useState2[1];
40
+ /**
41
+ * 通过传入中心点确定矩形框架容器的四个点:
42
+ * 1. 已知矩形长宽和中心点
43
+ * 2. 借助planeGeometry生成垂直相机视角的平面上的四个点
44
+ * 3. 通过向量相加,平行四边形法则获取到移动position后的面上四个点
45
+ */
46
+ var calcPoints = function calcPoints(centerPoint, normal, wrapperLength, wrapperWidth) {
47
+ // 375px 对应 1m
48
+ var length = wrapperLength / 375;
49
+ var width = wrapperWidth / 375;
50
+ var geometry = new THREE.PlaneGeometry(length, width);
51
+
52
+ if (normal) {
53
+ var lookPoint = new THREE.Vector3(normal.x + centerPoint.x, normal.y + centerPoint.y, normal.z + centerPoint.z);
54
+ geometry.lookAt(lookPoint);
55
+ } // const pointgeometry = new THREE.Geometry()
56
+ // pointgeometry.vertices.push(cameraPosition)
57
+ // const pointmaterial = new THREE.PointsMaterial({
58
+ // color: 0xffffff,
59
+ // size: 0.4,
60
+ // })
61
+ // _point = new THREE.Points(pointgeometry, pointmaterial)
62
+ // console.log(cameraPosition)
63
+
64
+
65
+ var material = new THREE.MeshBasicMaterial({
66
+ color: 0xffff00,
67
+ side: THREE.DoubleSide
68
+ });
69
+ var plane = new THREE.Mesh(geometry, material);
70
+ var v0 = centerPoint.clone();
71
+ plane.position.copy(v0); // 计算传入的四个点的坐标
72
+
73
+ var _plane$geometry$verti = _slicedToArray(plane.geometry.vertices, 4),
74
+ v1 = _plane$geometry$verti[0],
75
+ v2 = _plane$geometry$verti[1],
76
+ v3 = _plane$geometry$verti[2],
77
+ v4 = _plane$geometry$verti[3];
78
+
79
+ var downLeft = v0.clone().add(v4);
80
+ var downRight = v0.clone().add(v3);
81
+ var upLeft = v0.clone().add(v2);
82
+ var upRight = v0.clone().add(v1); // 插件使用要求:矩形四个点位数据,顺序为**必须**为左下、右下、右上、左上
83
+
84
+ return [downLeft, downRight, upRight, upLeft];
85
+ };
86
+ /**
87
+ * 空间文本标签。
88
+ */
43
89
 
90
+
91
+ function PanoTextLabel() {
44
92
  var timeoutRef = React.useRef();
45
93
  var controller = (0, _hooks.useController)();
46
- var project2d = (0, _hooks.useFiveProject2d)();
94
+ var five = (0, _hooks.useFiveInstance)();
95
+ var ref = React.useRef();
47
96
  React.useEffect(function () {
48
97
  var _controller$configs;
49
98
 
@@ -52,32 +101,51 @@ function PanoTextLabel() {
52
101
  }
53
102
 
54
103
  var callback = function callback(keyframe) {
104
+ var _panoTextLabelData$no, _panoTextLabelData$no2, _panoTextLabelData$no3;
105
+
55
106
  var start = keyframe.start,
56
107
  end = keyframe.end,
57
108
  data = keyframe.data;
58
- var panoTextLabelData = data;
109
+ var panoTextLabelData = data; // 增加无文本情况的判断
110
+
111
+ if (data.text === '') return;
59
112
  var _panoTextLabelData$ve = panoTextLabelData.vertex,
60
113
  x = _panoTextLabelData$ve.x,
61
114
  y = _panoTextLabelData$ve.y,
62
115
  z = _panoTextLabelData$ve.z;
63
- var res = project2d(new _three.Vector3(x, y, z));
64
- if (!res) return;
65
- var left = res.x,
66
- top = res.y; // Object.assign(window, { $PanoTextLabel: { setState } })
67
-
68
- setState({
69
- left: left,
70
- top: top,
71
- text: data.text || '',
72
- fontSize: data.fontSize || 16
73
- });
116
+ var centerPoint = new THREE.Vector3(x, y, z);
117
+ var normal = new THREE.Vector3((_panoTextLabelData$no = panoTextLabelData.normal) === null || _panoTextLabelData$no === void 0 ? void 0 : _panoTextLabelData$no.x, (_panoTextLabelData$no2 = panoTextLabelData.normal) === null || _panoTextLabelData$no2 === void 0 ? void 0 : _panoTextLabelData$no2.y, (_panoTextLabelData$no3 = panoTextLabelData.normal) === null || _panoTextLabelData$no3 === void 0 ? void 0 : _panoTextLabelData$no3.z); // 生成传入的四个点,将文本框最大宽度定在200px,最高高度在30px
118
+
119
+ var wrapperLength = 200;
120
+ var wrapperWidth = 30;
121
+ var points = calcPoints(centerPoint, panoTextLabelData.normal && normal, wrapperLength, wrapperWidth);
122
+ if (!ref.current) ref.current = (0, _CSS3DRenderPlugin.CSS3DRenderPlugin)(five);
123
+ var container = ref.current.create3DDomContainer(points);
124
+ var css3DObject = container === null || container === void 0 ? void 0 : container.css3DObject; // 将获取的mesh进行旋转操作,根据欧拉角去进行mesh的变换
125
+
126
+ if (data.quaternion) {
127
+ var quaternion = new THREE.Quaternion(data.quaternion.x, data.quaternion.y, data.quaternion.z, data.quaternion.w);
128
+ css3DObject === null || css3DObject === void 0 ? void 0 : css3DObject.quaternion.copy(quaternion);
129
+ }
130
+
131
+ if (container !== null && container !== void 0 && container.container) _reactDom["default"].render( /*#__PURE__*/React.createElement("div", {
132
+ className: "PanoTextLabel PanoTextLabel--notHidden"
133
+ }, /*#__PURE__*/React.createElement("div", {
134
+ className: "PanoTextLabel-wrapper"
135
+ }, /*#__PURE__*/React.createElement("div", {
136
+ style: {
137
+ fontSize: "".concat(data.fontSize || 16, "px")
138
+ },
139
+ className: "PanoText-innerText"
140
+ }, data.text || ''))), container === null || container === void 0 ? void 0 : container.container);
74
141
  timeoutRef.current = setTimeout(function () {
75
- return setState(null);
142
+ var _ref$current;
143
+
144
+ (_ref$current = ref.current) === null || _ref$current === void 0 ? void 0 : _ref$current.disposeAll();
76
145
  }, end - start);
77
146
  };
78
147
 
79
- controller.on(_VreoUnit.VreoKeyframeEnum.PanoTextLabel, callback); // Object.assign(window, { $panoTextLabel: { setState } })
80
-
148
+ controller.on(_VreoUnit.VreoKeyframeEnum.PanoTextLabel, callback);
81
149
  return function () {
82
150
  controller.off(_VreoUnit.VreoKeyframeEnum.PanoTextLabel, callback);
83
151
 
@@ -86,20 +154,5 @@ function PanoTextLabel() {
86
154
  }
87
155
  };
88
156
  }, [controller]);
89
- return /*#__PURE__*/React.createElement("div", {
90
- className: (0, _classnames["default"])('PanoTextLabel', {
91
- 'PanoTextLabel--notHidden': state
92
- }),
93
- style: {
94
- left: ((state === null || state === void 0 ? void 0 : state.left) || 0) + 'px',
95
- top: ((state === null || state === void 0 ? void 0 : state.top) || 0) + 'px'
96
- }
97
- }, /*#__PURE__*/React.createElement("div", {
98
- className: "PanoTextLabel-wrapper"
99
- }, /*#__PURE__*/React.createElement("div", {
100
- style: {
101
- fontSize: "".concat((state === null || state === void 0 ? void 0 : state.fontSize) || 16, "px")
102
- },
103
- className: "PanoText-innerText"
104
- }, (state === null || state === void 0 ? void 0 : state.text) || '')));
157
+ return /*#__PURE__*/React.createElement(React.Fragment, null);
105
158
  }
@@ -0,0 +1,2 @@
1
+ import { Vector3 } from 'three';
2
+ export default function centerPoint(point1: Vector3, point2: Vector3): Vector3;
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports["default"] = centerPoint;
7
+
8
+ var _three = require("three");
9
+
10
+ function centerPoint(point1, point2) {
11
+ return new _three.Vector3((point1.x + point2.x) / 2, (point1.y + point2.y) / 2, (point1.z + point2.z) / 2);
12
+ }
@@ -0,0 +1,7 @@
1
+ /**
2
+ * @description: 简陋的 ResizeObserver polyfill
3
+ */
4
+ export default function createResizeObserver(func: () => any, element?: HTMLElement): {
5
+ observe: () => void;
6
+ unobserve: () => void;
7
+ };
@@ -0,0 +1,32 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports["default"] = createResizeObserver;
7
+
8
+ /**
9
+ * @description: 简陋的 ResizeObserver polyfill
10
+ */
11
+ function createResizeObserver(func, element) {
12
+ if (!element || typeof ResizeObserver === 'undefined') {
13
+ return {
14
+ observe: function observe() {
15
+ return window.addEventListener('resize', func);
16
+ },
17
+ unobserve: function unobserve() {
18
+ return window.removeEventListener('resize', func);
19
+ }
20
+ };
21
+ } else {
22
+ var observer = new ResizeObserver(func);
23
+ return {
24
+ observe: function observe() {
25
+ return observer.observe(element);
26
+ },
27
+ unobserve: function unobserve() {
28
+ return observer.unobserve(element);
29
+ }
30
+ };
31
+ }
32
+ }
@@ -0,0 +1,3 @@
1
+ export default function evenNumber(num: number, config?: {
2
+ smaller?: boolean;
3
+ }): number;
@@ -0,0 +1,11 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports["default"] = evenNumber;
7
+
8
+ function evenNumber(num, config) {
9
+ var roundNum = Math.round(num);
10
+ return roundNum % 2 === 0 ? roundNum : roundNum + Number(config !== null && config !== void 0 && config.smaller ? -1 : 1);
11
+ }
@@ -0,0 +1,56 @@
1
+ import { FivePlugin } from '@realsee/five';
2
+ import { Vector3 } from 'three';
3
+ import { CSS3DObject } from 'three/examples/jsm/renderers/CSS3DRenderer';
4
+ /**
5
+ * 三维向量
6
+ */
7
+ export interface Vector3Position {
8
+ x: number;
9
+ y: number;
10
+ z: number;
11
+ }
12
+ export declare type CSS3DRenderPluginParameterType = undefined;
13
+ export interface CSS3DRenderPluginExportType {
14
+ /**
15
+ * @description: 根据传入的四个点位创建一个3d dom容器,可以通过ReactDom.render()的方式将react组件放到容器中
16
+ * @param {Five} five
17
+ * @param {Vector3[] | Vector3Position[]} points: 矩形四个点坐标
18
+ * @param {number} config.ratio: 1px对应多少米,默认为 0.002,即1px对应2mm
19
+ * @param {number} config.dpr: dpr, 默认为1
20
+ * @param {HTMLElement} config.container: HTMLElement
21
+ * @param {number} config.autoRender: 默认为true,如果需要手动render则传false
22
+ * @param {'front' | 'behind'} config.mode: 两种模式
23
+ * @param {HTMLElement} config.behindFiveContainer: 如果config.mode为'behind',需要传入容器,并确保此容器位five下方,且中间没有其他dom元素遮挡
24
+ * @return {{ container: HTMLElement; dispose: () => void }}: container: dom容器, dispose: 清理函数
25
+ */
26
+ create3DDomContainer: (points: Vector3[] | Vector3Position[], config?: {
27
+ ratio?: number;
28
+ dpr?: number;
29
+ autoRender?: boolean;
30
+ container?: HTMLElement;
31
+ [key: string]: any;
32
+ } & ({
33
+ mode?: 'front';
34
+ } | {
35
+ mode: 'behind';
36
+ behindFiveContainer: HTMLElement;
37
+ })) => {
38
+ container: HTMLElement;
39
+ dispose: () => void;
40
+ css3DObject: CSS3DObject;
41
+ render?: () => void;
42
+ } | void;
43
+ /**
44
+ * @description: 销毁所有的渲染内容
45
+ * @return {void}
46
+ */
47
+ disposeAll: () => void;
48
+ }
49
+ /**
50
+ * **CSS3DRenderPlugin** 提供矩形区域(三维空间四个坐标点),你可以在此矩形区域中渲染 DOM 内容。
51
+ * 实现原理参考[CSS3DRenderer](https://threejs.org/docs/index.html?q=CSS3D#examples/en/renderers/CSS3DRenderer)。
52
+ *
53
+ * @returns
54
+ */
55
+ export declare const CSS3DRenderPlugin: FivePlugin<CSS3DRenderPluginParameterType, CSS3DRenderPluginExportType>;
56
+ export default CSS3DRenderPlugin;
@@ -0,0 +1,275 @@
1
+ "use strict";
2
+
3
+ function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
4
+
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports["default"] = exports.CSS3DRenderPlugin = void 0;
9
+
10
+ var THREE = _interopRequireWildcard(require("three"));
11
+
12
+ var _CSS3DRenderer = require("three/examples/jsm/renderers/CSS3DRenderer");
13
+
14
+ var _evenNumber = _interopRequireDefault(require("./evenNumber"));
15
+
16
+ var _centerPoint = _interopRequireDefault(require("./centerPoint"));
17
+
18
+ var _transformPositionToVector = _interopRequireDefault(require("./transformPositionToVector3"));
19
+
20
+ var _createResizeObserver = _interopRequireDefault(require("./createResizeObserver"));
21
+
22
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
23
+
24
+ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
25
+
26
+ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
27
+
28
+ /**
29
+ * **CSS3DRenderPlugin** 提供矩形区域(三维空间四个坐标点),你可以在此矩形区域中渲染 DOM 内容。
30
+ * 实现原理参考[CSS3DRenderer](https://threejs.org/docs/index.html?q=CSS3D#examples/en/renderers/CSS3DRenderer)。
31
+ *
32
+ * @returns
33
+ */
34
+ var CSS3DRenderPlugin = function CSS3DRenderPlugin(five) {
35
+ var state = {
36
+ disposeCallbacks: []
37
+ };
38
+
39
+ var create3DDomContainer = function create3DDomContainer() {
40
+ var _five$model, _five$model2, _config$autoRender;
41
+
42
+ for (var _len = arguments.length, params = new Array(_len), _key = 0; _key < _len; _key++) {
43
+ params[_key] = arguments[_key];
44
+ }
45
+
46
+ var points = params[0].map(function (point) {
47
+ return point instanceof THREE.Vector3 ? point : (0, _transformPositionToVector["default"])(point);
48
+ });
49
+ var config = params[1];
50
+ if ((points === null || points === void 0 ? void 0 : points.length) < 4) return console.error('points must be equal or greater than than 4');
51
+ if (!(five !== null && five !== void 0 && (_five$model = five.model) !== null && _five$model !== void 0 && _five$model.loaded)) return console.error('five.model.loaded is: ', five === null || five === void 0 ? void 0 : (_five$model2 = five.model) === null || _five$model2 === void 0 ? void 0 : _five$model2.loaded);
52
+ var fiveElement = five.getElement();
53
+ if (!fiveElement) return console.error('five.getElement() is ' + fiveElement);
54
+ var disposers = [];
55
+ var ratio = (config === null || config === void 0 ? void 0 : config.ratio) || 0.00216;
56
+ if (ratio <= 0.00215) console.warn('if you need click css3DElement on safari, ratio must be greater than 0.00215');
57
+ var dpr = (config === null || config === void 0 ? void 0 : config.dpr) || 1;
58
+ var mode = (config === null || config === void 0 ? void 0 : config.mode) || 'front';
59
+ var autoRender = (_config$autoRender = config === null || config === void 0 ? void 0 : config.autoRender) !== null && _config$autoRender !== void 0 ? _config$autoRender : true;
60
+ var behindFiveContainer = (config === null || config === void 0 ? void 0 : config.behindFiveContainer) || fiveElement.parentElement || document.body;
61
+ var container = (config === null || config === void 0 ? void 0 : config.container) || document.createElement('div');
62
+ container.classList.add('__Dnalogel-plugin--CSS3DRenderPlugin'); // 获取css3DObject, 如果mode为behind的话,一起获取mesh
63
+
64
+ var _createObject = createObject(points, {
65
+ ratio: ratio,
66
+ dpr: dpr,
67
+ container: container,
68
+ mode: mode
69
+ }),
70
+ css3DObject = _createObject.css3DObject,
71
+ mesh = _createObject.mesh; // ======= INIT START =======
72
+
73
+
74
+ var resizeObserver;
75
+ var frontModeUnInited = mode === 'front' && !state.frontMode;
76
+ var behindModeUnInited = mode === 'behind' && !state.behindMode;
77
+ var inited = !(frontModeUnInited || behindModeUnInited);
78
+ var stopRenderFlag = false;
79
+ var requestAnimationFrameId = null;
80
+
81
+ if (behindModeUnInited) {
82
+ state.behindMode = {
83
+ scene: new THREE.Scene(),
84
+ css3DRenderer: new _CSS3DRenderer.CSS3DRenderer()
85
+ };
86
+ }
87
+
88
+ if (frontModeUnInited) {
89
+ state.frontMode = {
90
+ scene: new THREE.Scene(),
91
+ css3DRenderer: new _CSS3DRenderer.CSS3DRenderer()
92
+ };
93
+ }
94
+
95
+ var _ref = mode === 'behind' ? state.behindMode : state.frontMode,
96
+ scene = _ref.scene,
97
+ css3DRenderer = _ref.css3DRenderer;
98
+
99
+ var render = function () {
100
+ if (!inited) {
101
+ var css3DRendererSetSize = function css3DRendererSetSize() {
102
+ // 这里evenNumber策略是遇到奇数会加1,不知道为啥会触发滚动条显示,导致fiveElement变小,fiveElement变小又触发了这里的resize,宽高变小,滚动条消失,然后又触发resize。。。无限循环
103
+ // 为了规避上面这种情况,evenNumber设置了一个参数,遇到奇数可选择减一
104
+ var rendererWidth = (0, _evenNumber["default"])(fiveElement.clientWidth, {
105
+ smaller: true
106
+ });
107
+ var rendererHeight = (0, _evenNumber["default"])(fiveElement.clientHeight, {
108
+ smaller: true
109
+ });
110
+ css3DRenderer.setSize(rendererWidth, rendererHeight);
111
+ };
112
+
113
+ css3DRendererSetSize();
114
+ resizeObserver = (0, _createResizeObserver["default"])(css3DRendererSetSize, fiveElement);
115
+ css3DRenderer.domElement.style.position = 'absolute';
116
+ css3DRenderer.domElement.style.top = '0';
117
+ css3DRenderer.domElement.style.userSelect = 'none';
118
+ css3DRenderer.domElement.style.pointerEvents = 'none';
119
+
120
+ var renderEveryFrame = function renderEveryFrame() {
121
+ if (stopRenderFlag) return;
122
+ requestAnimationFrameId = requestAnimationFrame(renderEveryFrame);
123
+ css3DRenderer.render(scene, five.camera);
124
+ };
125
+
126
+ return function () {
127
+ var _resizeObserver, _resizeObserver$obser;
128
+
129
+ scene.add(css3DObject);
130
+ (_resizeObserver = resizeObserver) === null || _resizeObserver === void 0 ? void 0 : (_resizeObserver$obser = _resizeObserver.observe) === null || _resizeObserver$obser === void 0 ? void 0 : _resizeObserver$obser.call(_resizeObserver);
131
+ renderEveryFrame();
132
+
133
+ if (mode === 'behind' && mesh) {
134
+ five.scene.add(mesh);
135
+ disposers.push(function () {
136
+ return mesh && five.scene.remove(mesh);
137
+ });
138
+ }
139
+ };
140
+ } else {
141
+ return function () {
142
+ scene.add(css3DObject);
143
+ };
144
+ }
145
+ }();
146
+
147
+ if (frontModeUnInited) {
148
+ var wrapper = fiveElement.parentElement || document.body;
149
+ wrapper.appendChild(css3DRenderer.domElement);
150
+ }
151
+
152
+ if (behindModeUnInited) {
153
+ var _wrapper = behindFiveContainer;
154
+
155
+ _wrapper.appendChild(css3DRenderer.domElement);
156
+ } // ======= INIT END =======
157
+
158
+
159
+ var dispose = function dispose() {
160
+ stopRenderFlag = true;
161
+ disposers.forEach(function (d) {
162
+ return d === null || d === void 0 ? void 0 : d();
163
+ });
164
+ scene.remove(css3DObject);
165
+ if (typeof requestAnimationFrameId === 'number') cancelAnimationFrame(requestAnimationFrameId);
166
+
167
+ if (scene.children.length === 0) {
168
+ css3DRenderer.domElement.remove();
169
+ if (mode === 'front') state.frontMode = undefined;
170
+ if (mode === 'behind') state.behindMode = undefined;
171
+
172
+ if (!state.behindMode && !state.frontMode) {
173
+ var _resizeObserver2, _resizeObserver2$unob;
174
+
175
+ (_resizeObserver2 = resizeObserver) === null || _resizeObserver2 === void 0 ? void 0 : (_resizeObserver2$unob = _resizeObserver2.unobserve) === null || _resizeObserver2$unob === void 0 ? void 0 : _resizeObserver2$unob.call(_resizeObserver2);
176
+ }
177
+ }
178
+
179
+ return true;
180
+ };
181
+
182
+ var idx = state.disposeCallbacks.findIndex(function (item) {
183
+ return item === dispose;
184
+ });
185
+
186
+ if (idx !== -1) {
187
+ state.disposeCallbacks.splice(idx, 1);
188
+ } else {
189
+ state.disposeCallbacks.push(dispose);
190
+ }
191
+
192
+ if (autoRender) render();
193
+ return {
194
+ container: container,
195
+ dispose: dispose,
196
+ css3DObject: css3DObject,
197
+ render: autoRender ? undefined : render
198
+ };
199
+ };
200
+
201
+ var createObject = function createObject(points, config) {
202
+ var ratio = config.ratio,
203
+ dpr = config.dpr,
204
+ element = config.container,
205
+ mode = config.mode;
206
+ var planeWidth = points[0].distanceTo(points[1]);
207
+ var planeHeight = points[1].distanceTo(points[2]);
208
+ var domWidthPx = (0, _evenNumber["default"])(planeWidth / ratio * dpr);
209
+ var domHeightPx = (0, _evenNumber["default"])(planeHeight / ratio * dpr);
210
+ var css3DObject = new _CSS3DRenderer.CSS3DObject(element);
211
+ css3DObject.scale.set(ratio, ratio, ratio);
212
+ element.style.width = domWidthPx + 'px';
213
+ element.style.height = domHeightPx + 'px';
214
+ element.style.pointerEvents = 'none';
215
+ var centerPosition = (0, _centerPoint["default"])(points[0], points[2]);
216
+ var vector01 = points[1].clone().sub(points[0]); // 点0 -> 点1 的向量
217
+
218
+ var vector12 = points[2].clone().sub(points[1]); // 点1 -> 点2 的向量
219
+ // 旋转
220
+
221
+ var rotateXAngle = new THREE.Vector3(0, 1, 0).angleTo(new THREE.Vector3(0, vector12.y, vector12.z));
222
+ var rotateYAngle = new THREE.Vector3(1, 0, 0).angleTo(new THREE.Vector3(vector01.x, 0, vector01.z));
223
+ var rotateZAngle = vector01.angleTo(new THREE.Vector3(vector01.x, 0, vector01.z));
224
+ /**
225
+ * [0,1,0] => [0,0,1] 为rolate Worldx正方向
226
+ * [0,0,1] => [0,1,0] 为rolate Worldy正方向
227
+ * [0,1,1] => [-1,0,0] 为rolate Worldz正方向
228
+ */
229
+
230
+ var rotateX = (vector12.z > 0 ? -1 : 1) * rotateXAngle;
231
+ var rotateY = (vector01.z < 0 ? 1 : -1) * rotateYAngle;
232
+ var rotateZ = (vector01.x > 0 && vector01.y < 0 || vector01.x < 0 && vector01.y > 0 ? -1 : 1) * rotateZAngle;
233
+ css3DObject.rotateOnWorldAxis(new THREE.Vector3(1, 0, 0), rotateX); // x
234
+
235
+ css3DObject.rotateOnWorldAxis(new THREE.Vector3(0, 1, 0), rotateY); // y
236
+
237
+ css3DObject.rotateOnWorldAxis(new THREE.Vector3(0, 0, 1), rotateZ); // z
238
+
239
+ css3DObject.position.set(centerPosition.x, centerPosition.y, centerPosition.z);
240
+ var mesh;
241
+
242
+ if (mode === 'behind') {
243
+ var material = new THREE.MeshBasicMaterial({
244
+ opacity: 0,
245
+ transparent: false,
246
+ side: THREE.DoubleSide
247
+ });
248
+ var geometry = new THREE.PlaneGeometry(domWidthPx, domHeightPx);
249
+ mesh = new THREE.Mesh(geometry, material);
250
+ mesh.name = 'CSS3DRenderPlugin-mesh';
251
+ mesh.position.copy(css3DObject.position);
252
+ mesh.rotation.copy(css3DObject.rotation);
253
+ mesh.scale.copy(css3DObject.scale);
254
+ }
255
+
256
+ return {
257
+ css3DObject: css3DObject,
258
+ mesh: mesh
259
+ };
260
+ };
261
+
262
+ return {
263
+ create3DDomContainer: create3DDomContainer,
264
+ disposeAll: function disposeAll() {
265
+ state.disposeCallbacks.forEach(function (d) {
266
+ return d === null || d === void 0 ? void 0 : d();
267
+ });
268
+ state.disposeCallbacks = [];
269
+ }
270
+ };
271
+ };
272
+
273
+ exports.CSS3DRenderPlugin = CSS3DRenderPlugin;
274
+ var _default = CSS3DRenderPlugin;
275
+ exports["default"] = _default;
@@ -0,0 +1,7 @@
1
+ import { Vector3 } from 'three';
2
+ declare const transformPositionToVector3: ({ x, y, z }: {
3
+ x: number;
4
+ y: number;
5
+ z: number;
6
+ }) => Vector3;
7
+ export default transformPositionToVector3;
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports["default"] = void 0;
7
+
8
+ var _three = require("three");
9
+
10
+ var transformPositionToVector3 = function transformPositionToVector3(_ref) {
11
+ var x = _ref.x,
12
+ y = _ref.y,
13
+ z = _ref.z;
14
+ return new _three.Vector3(x, y, z);
15
+ };
16
+
17
+ var _default = transformPositionToVector3;
18
+ exports["default"] = _default;
@@ -172,12 +172,23 @@ export declare type ModelVideoData = {
172
172
  vertexs: QuadrangleVertexs | Vertexs;
173
173
  matrixWorld?: number[];
174
174
  };
175
+ /**
176
+ * 四元数
177
+ */
178
+ export declare type Quaternion = {
179
+ x: number;
180
+ y: number;
181
+ z: number;
182
+ w: number;
183
+ };
175
184
  /**
176
185
  * 全景文本标签
177
186
  */
178
187
  export declare type PanoTextLabelData = {
179
188
  text: string;
180
189
  vertex: Vertex;
190
+ normal?: Vertex;
191
+ quaternion?: Quaternion;
181
192
  fontSize?: number;
182
193
  };
183
194
  /**
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@realsee/vreo",
3
- "version": "0.2.0-alpha.13",
3
+ "version": "0.2.0-alpha.16",
4
4
  "description": "Vreo (VR Video 缩写) 是基于如视三维渲染引擎 Five 和 用户界面构建库 React 实现的如视 3D 空间剧本播放器。",
5
5
  "keywords": [
6
6
  "realsee",