@realsee/vreo 3.0.0-webgpu.10 → 4.0.0-react19.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (70) hide show
  1. package/CHANGELOG.md +7 -0
  2. package/LICENSE +21 -119
  3. package/README.md +6 -0
  4. package/lib/PlayController/index.js +74 -75
  5. package/lib/PlayController/index.js.map +1 -1
  6. package/lib/Player/App.d.ts +2 -1
  7. package/lib/Player/App.d.ts.map +1 -1
  8. package/lib/Player/custom/SpatialScenePanel/index.d.ts +2 -1
  9. package/lib/Player/custom/SpatialScenePanel/index.d.ts.map +1 -1
  10. package/lib/Player/hooks.d.ts.map +1 -1
  11. package/lib/Player/index.js +1 -1808
  12. package/lib/Player/modules/Drawer/index.d.ts +2 -1
  13. package/lib/Player/modules/Drawer/index.d.ts.map +1 -1
  14. package/lib/Player/modules/PopUp/index.d.ts +2 -1
  15. package/lib/Player/modules/PopUp/index.d.ts.map +1 -1
  16. package/lib/Player/modules/ResizeObserver/index.d.ts +2 -1
  17. package/lib/Player/modules/ResizeObserver/index.d.ts.map +1 -1
  18. package/lib/Player/modules/VideoAgent/index.d.ts +2 -2
  19. package/lib/Player/modules/Wave/index.d.ts +2 -1
  20. package/lib/Player/modules/Wave/index.d.ts.map +1 -1
  21. package/lib/Player/modules/keyframes/BgMusic/index.d.ts +2 -1
  22. package/lib/Player/modules/keyframes/BgMusic/index.d.ts.map +1 -1
  23. package/lib/Player/modules/keyframes/CameraMovement/index.d.ts +2 -1
  24. package/lib/Player/modules/keyframes/CameraMovement/index.d.ts.map +1 -1
  25. package/lib/Player/modules/keyframes/InfoPanel/index.d.ts +2 -1
  26. package/lib/Player/modules/keyframes/InfoPanel/index.d.ts.map +1 -1
  27. package/lib/Player/modules/keyframes/ModelVideo/index.d.ts +2 -1
  28. package/lib/Player/modules/keyframes/ModelVideo/index.d.ts.map +1 -1
  29. package/lib/Player/modules/keyframes/PanoEffect/index.d.ts +2 -1
  30. package/lib/Player/modules/keyframes/PanoEffect/index.d.ts.map +1 -1
  31. package/lib/Player/modules/keyframes/PanoTextLabel/index.d.ts +2 -1
  32. package/lib/Player/modules/keyframes/PanoTextLabel/index.d.ts.map +1 -1
  33. package/lib/Player/modules/keyframes/Prompter/index.d.ts +2 -1
  34. package/lib/Player/modules/keyframes/Prompter/index.d.ts.map +1 -1
  35. package/lib/Player/modules/keyframes/UpdateVRPanorama/index.d.ts +2 -1
  36. package/lib/Player/modules/keyframes/UpdateVRPanorama/index.d.ts.map +1 -1
  37. package/lib/Player/modules/keyframes/VideoEffect/index.d.ts +2 -1
  38. package/lib/Player/modules/keyframes/VideoEffect/index.d.ts.map +1 -1
  39. package/lib/chunks/CSS3DRenderPlugin-CtnLUnu7.js +128 -0
  40. package/lib/chunks/CSS3DRenderPlugin-CtnLUnu7.js.map +1 -0
  41. package/lib/chunks/CameraMovementPlugin-YCaScSFU.js +77 -0
  42. package/lib/chunks/CameraMovementPlugin-YCaScSFU.js.map +1 -0
  43. package/lib/chunks/Player-BzRqdH4q.js +1581 -0
  44. package/lib/chunks/Player-BzRqdH4q.js.map +1 -0
  45. package/lib/chunks/VreoUnit-NhH1hdF1.js +17 -0
  46. package/lib/chunks/VreoUnit-NhH1hdF1.js.map +1 -0
  47. package/lib/chunks/timeline-DZs_svT3.js +37 -0
  48. package/lib/chunks/timeline-DZs_svT3.js.map +1 -0
  49. package/lib/fivePlugins/CSS3DRenderPlugin/transformPositionToVector3.d.ts.map +1 -1
  50. package/lib/index.js +4 -12
  51. package/lib/plugins/CSS3DRenderPlugin.js +1 -115
  52. package/lib/plugins/CameraMovementPlugin.js +1 -6
  53. package/lib/plugins/ModelTVVideoPlugin.js +133 -161
  54. package/lib/plugins/ModelTVVideoPlugin.js.map +1 -1
  55. package/lib/react/index.js +40 -38
  56. package/lib/react/index.js.map +1 -1
  57. package/lib/shared-utils/animationFrame/BetterTween.d.ts.map +1 -1
  58. package/lib/shared-utils/createTransMatrix.d.ts.map +1 -1
  59. package/lib/types/index.js +1 -10
  60. package/package.json +8 -8
  61. package/LICENSE-UPDATE.txt +0 -5
  62. package/lib/Player/index.js.map +0 -1
  63. package/lib/chunks/index-BgPSzRSs.js +0 -93
  64. package/lib/chunks/index-BgPSzRSs.js.map +0 -1
  65. package/lib/chunks/index-CunyJn6H.js +0 -51
  66. package/lib/chunks/index-CunyJn6H.js.map +0 -1
  67. package/lib/index.js.map +0 -1
  68. package/lib/plugins/CSS3DRenderPlugin.js.map +0 -1
  69. package/lib/plugins/CameraMovementPlugin.js.map +0 -1
  70. package/lib/types/index.js.map +0 -1
@@ -1,115 +1 @@
1
- import * as D from "three/webgpu";
2
- import { Vector3 as l, Scene as T } from "three/webgpu";
3
- import { CSS3DObject as W, CSS3DRenderer as L } from "three/addons/renderers/CSS3DRenderer.js";
4
- function g(s, t) {
5
- const r = Math.round(s);
6
- return r % 2 === 0 ? r : r + (t != null && t.smaller ? -1 : 1);
7
- }
8
- function j(s, t) {
9
- return new l((s.x + t.x) / 2, (s.y + t.y) / 2, (s.z + t.z) / 2);
10
- }
11
- const H = ({ x: s, y: t, z: r }) => new l(s, t, r);
12
- function M(s, t) {
13
- let r = !1;
14
- if (!t || typeof ResizeObserver > "u")
15
- return {
16
- observe() {
17
- r || (r = !0, window.addEventListener("resize", s));
18
- },
19
- unobserve() {
20
- r && (r = !1, window.removeEventListener("resize", s));
21
- },
22
- disconnect() {
23
- r && (r = !1, window.removeEventListener("resize", s));
24
- }
25
- };
26
- const E = new ResizeObserver(s);
27
- return {
28
- observe() {
29
- r || (r = !0, E.observe(t));
30
- },
31
- unobserve() {
32
- r && (r = !1, E.unobserve(t));
33
- },
34
- disconnect() {
35
- r = !1, E.disconnect();
36
- }
37
- };
38
- }
39
- const q = (s) => {
40
- const t = { disposers: /* @__PURE__ */ new Set() }, r = (i, p) => {
41
- const e = new T(), d = new L(), u = () => d.setSize(
42
- g(p.clientWidth, { smaller: !0 }),
43
- g(p.clientHeight, { smaller: !0 })
44
- );
45
- u();
46
- const v = M(u, p);
47
- d.domElement.style.position = "absolute", d.domElement.style.top = "0", d.domElement.style.userSelect = "none", d.domElement.style.pointerEvents = "none", i.appendChild(d.domElement);
48
- let a = !1, m;
49
- const f = {
50
- scene: e,
51
- renderer: d,
52
- entries: /* @__PURE__ */ new Set(),
53
- start() {
54
- if (a) return;
55
- a = !0, v.observe();
56
- const b = () => {
57
- a && (d.render(e, s.camera), m = requestAnimationFrame(b));
58
- };
59
- b();
60
- },
61
- stop() {
62
- a && (a = !1, m !== void 0 && cancelAnimationFrame(m), m = void 0, v.unobserve());
63
- },
64
- dispose() {
65
- f.stop(), v.disconnect(), d.domElement.remove();
66
- }
67
- };
68
- return f;
69
- }, E = (...i) => {
70
- const p = i[0].map((h) => h instanceof l ? h : H(h)), e = i[1];
71
- if (p.length < 4) return console.error("points must be equal or greater than 4");
72
- if (!s.model.loaded) return console.error("five.model.loaded is false");
73
- const d = s.getElement();
74
- if (!d) return console.error("five.getElement() is empty");
75
- const u = (e == null ? void 0 : e.ratio) ?? 216e-5;
76
- u <= 215e-5 && console.warn("if you need click css3DElement on safari, ratio must be greater than 0.00215");
77
- const v = (e == null ? void 0 : e.dpr) ?? 1, a = (e == null ? void 0 : e.mode) ?? "front", m = (e == null ? void 0 : e.autoRender) ?? !0, f = (e == null ? void 0 : e.container) ?? document.createElement("div");
78
- f.classList.add("__Dnalogel-plugin--CSS3DRenderPlugin");
79
- const { css3DObject: b, mesh: n } = O(p, { ratio: u, dpr: v, container: f, mode: a });
80
- let o = a === "behind" ? t.behind : t.front;
81
- if (!o) {
82
- const h = a === "behind" ? (e == null ? void 0 : e.behindFiveContainer) ?? d.parentElement ?? document.body : d.parentElement ?? document.body;
83
- o = r(h, d), a === "behind" ? t.behind = o : t.front = o;
84
- }
85
- const c = {};
86
- o.entries.add(c);
87
- let y = !1, z = !1;
88
- const x = () => {
89
- z || y || (y = !0, o.scene.add(b), n && s.scene.add(n), o.start());
90
- }, S = () => {
91
- z || (z = !0, t.disposers.delete(S), o.entries.delete(c), y && (o.scene.remove(b), n && s.scene.remove(n)), n == null || n.geometry.dispose(), n == null || n.material.dispose(), o.scene.children.length === 0 && o.stop(), o.entries.size === 0 && (o.dispose(), a === "behind" && t.behind === o && (t.behind = void 0), a === "front" && t.front === o && (t.front = void 0)));
92
- };
93
- return t.disposers.add(S), m && x(), { container: f, dispose: S, css3DObject: b, render: m ? void 0 : x };
94
- }, O = (i, p) => {
95
- const { ratio: e, dpr: d, container: u, mode: v } = p, a = i[0].distanceTo(i[1]), m = i[1].distanceTo(i[2]), f = g(a / e * d), b = g(m / e * d), n = new W(u);
96
- n.scale.set(e, e, e), u.style.width = f + "px", u.style.height = b + "px", u.style.pointerEvents = "none";
97
- const o = j(i[0], i[2]), c = i[1].clone().sub(i[0]), y = i[2].clone().sub(i[1]), z = new l(0, 1, 0).angleTo(new l(0, y.y, y.z)), x = new l(1, 0, 0).angleTo(new l(c.x, 0, c.z)), S = c.angleTo(new l(c.x, 0, c.z)), h = (y.z > 0 ? -1 : 1) * z, R = (c.z < 0 ? 1 : -1) * x, A = (c.x > 0 && c.y < 0 || c.x < 0 && c.y > 0 ? -1 : 1) * S;
98
- n.rotateOnWorldAxis(new l(1, 0, 0), h), n.rotateOnWorldAxis(new l(0, 1, 0), R), n.rotateOnWorldAxis(new l(0, 0, 1), A), n.position.set(o.x, o.y, o.z);
99
- let w;
100
- if (v === "behind") {
101
- const P = new D.MeshBasicNodeMaterial({ opacity: 0, transparent: !1, side: D.DoubleSide }), C = new D.PlaneGeometry(f, b);
102
- w = new D.Mesh(C, P), w.name = "CSS3DRenderPlugin-mesh", w.position.copy(n.position), w.rotation.copy(n.rotation), w.scale.copy(n.scale);
103
- }
104
- return { css3DObject: n, mesh: w };
105
- };
106
- return {
107
- create3DDomContainer: E,
108
- disposeAll: () => [...t.disposers].forEach((i) => i())
109
- };
110
- };
111
- export {
112
- q as CSS3DRenderPlugin,
113
- q as default
114
- };
115
- //# sourceMappingURL=CSS3DRenderPlugin.js.map
1
+ export { t as CSS3DRenderPlugin, t as default } from "../chunks/CSS3DRenderPlugin-CtnLUnu7.js";
@@ -1,6 +1 @@
1
- import "@realsee/five-webgpu";
2
- import { C as r } from "../chunks/index-BgPSzRSs.js";
3
- export {
4
- r as CameraMovementPlugin
5
- };
6
- //# sourceMappingURL=CameraMovementPlugin.js.map
1
+ export { t as CameraMovementPlugin } from "../chunks/CameraMovementPlugin-YCaScSFU.js";
@@ -1,162 +1,134 @@
1
- import * as u from "three/webgpu";
2
- const j = (c, { videoElement: A, mediaManager: w }) => {
3
- const E = [], b = (e, n) => (E.push(() => {
4
- c.off(e, n);
5
- }), c.on(e, n));
6
- let f = 0, h = !1;
7
- const t = {
8
- videoMeshes: [],
9
- videoTextureEnabled: !1,
10
- videoSource: "",
11
- rectPoints: [],
12
- enabled: !1,
13
- videoElement: A
14
- };
15
- let T, x, v;
16
- const L = () => {
17
- ++f, v == null || v(), v = void 0, x && (x.muted = !0, x.pause()), x = void 0, T = void 0, t.enabled = !1, t.videoMeshes.forEach((e) => {
18
- e.geometry.dispose(), e.material.dispose(), c.scene.remove(e);
19
- }), t.videoMeshes = [], c.needsRender = !0;
20
- }, m = w == null ? void 0 : w.createController({ label: "vreo-model-video", onCancel: L }), z = (e, n) => {
21
- var o;
22
- const d = (o = t.videoTexture) == null ? void 0 : o.image;
23
- if (!d) return;
24
- const r = (m == null ? void 0 : m.begin({ userAction: e, audible: n })) ?? void 0;
25
- if (!(m && !r))
26
- return T = r, x = r ? r.bind(d) : d;
27
- }, p = (e, n = !1) => {
28
- const d = t.enabled, r = e ? x : z(n, !0);
29
- if (!r) return;
30
- r.muted = e, d && !t.enabled && (t.enabled = !0, t.videoMeshes = V(), t.videoMeshes.forEach((i) => c.scene.add(i)));
31
- const o = T, s = f;
32
- t.enabled && r.play().catch((i) => {
33
- s === f && !(o != null && o.signal.aborted) && (g(), console.error(i));
34
- });
35
- }, F = () => (x == null ? void 0 : x.muted) ?? !0, R = () => {
36
- if (h || t.enabled || !t.videoTexture) return;
37
- const e = z(!1, !1);
38
- if (!e) return;
39
- const n = f, d = T, r = t.videoTexture.image, o = () => n === f && !h && t.enabled && !(d != null && d.signal.aborted);
40
- t.enabled = !0, t.videoMeshes = V(), t.videoMeshes.forEach((l) => c.scene.add(l));
41
- const s = () => {
42
- r.removeEventListener("timeupdate", s), o() && (t.videoTextureEnabled = !0, t.videoMeshes.forEach((l) => {
43
- l.material.map = t.videoTexture;
44
- }), c.needsRender = !0);
45
- }, i = () => {
46
- c.off("modelLoaded", i), o() && (r.addEventListener("timeupdate", s), e.play().catch((l) => {
47
- o() && (g(), console.error(l));
48
- }));
49
- };
50
- v = () => {
51
- c.off("modelLoaded", i), r.removeEventListener("timeupdate", s);
52
- }, c.model.loaded ? i() : c.on("modelLoaded", i);
53
- }, g = () => {
54
- m == null || m.cancel(), L();
55
- }, V = () => t.rectPoints.map((e, n) => {
56
- const d = new u.BufferGeometry(), r = 128, o = [];
57
- o.push(e[0].x, e[0].y, e[0].z);
58
- for (let a = 1; a < r; a++)
59
- o.push(
60
- e[0].x + (e[1].x - e[0].x) * a / r,
61
- e[0].y + (e[1].y - e[0].y) * a / r,
62
- e[0].z + (e[1].z - e[0].z) * a / r
63
- );
64
- o.push(e[1].x, e[1].y, e[1].z), o.push(e[2].x, e[2].y, e[2].z);
65
- for (let a = 1; a < r; a++)
66
- o.push(
67
- e[2].x + (e[3].x - e[2].x) * a / r,
68
- e[2].y + (e[3].y - e[2].y) * a / r,
69
- e[2].z + (e[3].z - e[2].z) * a / r
70
- );
71
- o.push(e[3].x, e[3].y, e[3].z);
72
- const s = [];
73
- s.push(0, 1);
74
- for (let a = 1; a < r; a++)
75
- s.push(0, 1 - a / r);
76
- s.push(0, 0), s.push(1, 0);
77
- for (let a = 1; a < r; a++)
78
- s.push(1, a / r);
79
- s.push(1, 1);
80
- const i = [];
81
- for (let a = 0; a < r; a++)
82
- i.push(a, a + 1, r * 2 - a, a, r * 2 - a, r * 2 + 1 - a);
83
- d.setAttribute("position", new u.BufferAttribute(new Float32Array(o), 3)), d.setAttribute("uv", new u.BufferAttribute(new Float32Array(s), 2)), d.setIndex(new u.BufferAttribute(new Uint32Array(i), 1));
84
- const l = new u.MeshBasicNodeMaterial({
85
- map: t.videoTextureEnabled ? t.videoTexture : t.imageTexture,
86
- side: u.DoubleSide
87
- }), y = new u.Mesh(d, l);
88
- return y.renderOrder = 1, y.name = `video-${n}-${performance.now()}`, y;
89
- }), O = (e) => {
90
- const n = new u.TextureLoader().load(e);
91
- return n.minFilter = u.LinearFilter, n.magFilter = u.LinearFilter, n;
92
- }, U = (e, n, d = () => !0) => new Promise((r, o) => {
93
- const s = new XMLHttpRequest();
94
- s.onreadystatechange = () => {
95
- if (s.readyState == 4) {
96
- if (!d()) {
97
- o(new DOMException("Playback cancelled", "AbortError"));
98
- return;
99
- }
100
- if (s.status == 200) {
101
- const i = window.URL || window.webkitURL;
102
- n = n || document.createElement("video"), n.crossOrigin = "anonymous", n.autoplay = !1, n.muted = !0, n.loop = !0, n.playsInline = !0, n.src = i.createObjectURL(s.response);
103
- const l = new u.VideoTexture(n);
104
- l.colorSpace = u.SRGBColorSpace, l.minFilter = u.LinearFilter, l.magFilter = u.LinearFilter, r(Object.assign(l, { videoSource: e }));
105
- } else
106
- o(new Error("Video download Error: " + s.status));
107
- }
108
- }, s.onerror = (i) => o(i), s.open("GET", e), s.responseType = "blob", s.send();
109
- }), M = async (e, n) => {
110
- const d = ++f, { video_src: r, video_poster_src: o, points: s } = e;
111
- t.videoSource = r, t.rectPoints = s.map((l) => l.map(({ x: y, y: a, z: P }) => new u.Vector3(y, a, P))), t.imageTexture = O(o), n && (t.videoElement = n);
112
- const i = await U(t.videoSource, t.videoElement, () => !h && d === f);
113
- if (h || d !== f) {
114
- i.image.muted = !0, i.image.pause(), URL.revokeObjectURL(i.image.src), i.dispose();
115
- return;
116
- }
117
- t.videoTexture && (t.videoTexture.image.pause(), URL.revokeObjectURL(t.videoTexture.image.src), t.videoTexture.dispose()), t.videoTexture = i, e.enable && R();
118
- };
119
- return b("modeChange", () => p(!0)), b("wantsTapGesture", (e) => {
120
- if (!t.enabled) return;
121
- const [n] = e.intersectObjects(c.scene.children, !0);
122
- if (n && /^video/.test(n.object.name))
123
- return t.videoTexture && p(!t.videoTexture.image.muted, !0), !1;
124
- }), b("panoArrived", () => {
125
- if (!t.enabled || F()) return;
126
- const e = c.camera.position;
127
- t.rectPoints.find((d) => {
128
- const r = d.reduce(
129
- (o, s) => new u.Vector3(
130
- o.x + s.x / d.length,
131
- o.y + s.y / d.length,
132
- o.z + s.z / d.length
133
- ),
134
- new u.Vector3()
135
- );
136
- return d.map(
137
- (o) => new u.Vector3(
138
- (o.x + r.x) / 2,
139
- (o.y + r.y) / 2,
140
- (o.z + r.z) / 2
141
- )
142
- ).filter((o) => {
143
- o = o.clone().sub(e).normalize();
144
- const s = new u.Raycaster(e, o), [i] = s.intersectObjects(c.scene.children, !0);
145
- return !!i && /^video/.test(i.object.name);
146
- }).length >= 2;
147
- }) || p(!0);
148
- }), b("renderFrame", () => {
149
- t.videoMeshes.forEach((e) => {
150
- e && (e.needsRender = !0);
151
- });
152
- }), b("load", (e) => {
153
- e.modelTVVideoData && M(e.modelTVVideoData);
154
- }), { enable: R, disable: g, load: M, dispose: () => {
155
- var e;
156
- h = !0, ++f, g(), m == null || m.dispose(), E.splice(0).forEach((n) => n()), (e = t.imageTexture) == null || e.dispose(), t.videoTexture && (URL.revokeObjectURL(t.videoTexture.image.src), t.videoTexture.dispose());
157
- } };
1
+ import * as e from "three/webgpu";
2
+ // resources/fivePlugins/ModelTVVideoPlugin/index.ts
3
+ var t = (t, { videoElement: n, mediaManager: r }) => {
4
+ let i = [], a = (e, n) => (i.push(() => {
5
+ t.off(e, n);
6
+ }), t.on(e, n)), o = 0, s = !1, c = {
7
+ videoMeshes: [],
8
+ videoTextureEnabled: !1,
9
+ videoSource: "",
10
+ rectPoints: [],
11
+ enabled: !1,
12
+ videoElement: n
13
+ }, l, u, d, f = () => {
14
+ ++o, d?.(), d = void 0, u && (u.muted = !0, u.pause()), u = void 0, l = void 0, c.enabled = !1, c.videoMeshes.forEach((e) => {
15
+ e.geometry.dispose(), e.material.dispose(), t.scene.remove(e);
16
+ }), c.videoMeshes = [], t.needsRender = !0;
17
+ }, p = r?.createController({
18
+ label: "vreo-model-video",
19
+ onCancel: f
20
+ }), m = (e, t) => {
21
+ let n = c.videoTexture?.image;
22
+ if (!n) return;
23
+ let r = p?.begin({
24
+ userAction: e,
25
+ audible: t
26
+ }) ?? void 0;
27
+ if (!p || r) return l = r, u = r ? r.bind(n) : n;
28
+ }, h = (e, n = !1) => {
29
+ let r = c.enabled, i = e ? u : m(n, !0);
30
+ if (!i) return;
31
+ i.muted = e, r && !c.enabled && (c.enabled = !0, c.videoMeshes = y(), c.videoMeshes.forEach((e) => t.scene.add(e)));
32
+ let a = l, s = o;
33
+ c.enabled && i.play().catch((e) => {
34
+ s === o && !a?.signal.aborted && (v(), console.error(e));
35
+ });
36
+ }, g = () => u?.muted ?? !0, _ = () => {
37
+ if (s || c.enabled || !c.videoTexture) return;
38
+ let e = m(!1, !1);
39
+ if (!e) return;
40
+ let n = o, r = l, i = c.videoTexture.image, a = () => n === o && !s && c.enabled && !r?.signal.aborted;
41
+ c.enabled = !0, c.videoMeshes = y(), c.videoMeshes.forEach((e) => t.scene.add(e));
42
+ let u = () => {
43
+ i.removeEventListener("timeupdate", u), a() && (c.videoTextureEnabled = !0, c.videoMeshes.forEach((e) => {
44
+ e.material.map = c.videoTexture;
45
+ }), t.needsRender = !0);
46
+ }, f = () => {
47
+ t.off("modelLoaded", f), a() && (i.addEventListener("timeupdate", u), e.play().catch((e) => {
48
+ a() && (v(), console.error(e));
49
+ }));
50
+ };
51
+ d = () => {
52
+ t.off("modelLoaded", f), i.removeEventListener("timeupdate", u);
53
+ }, t.model.loaded ? f() : t.on("modelLoaded", f);
54
+ }, v = () => {
55
+ p?.cancel(), f();
56
+ }, y = () => c.rectPoints.map((t, n) => {
57
+ let r = new e.BufferGeometry(), i = [];
58
+ i.push(t[0].x, t[0].y, t[0].z);
59
+ for (let e = 1; e < 128; e++) i.push(t[0].x + (t[1].x - t[0].x) * e / 128, t[0].y + (t[1].y - t[0].y) * e / 128, t[0].z + (t[1].z - t[0].z) * e / 128);
60
+ i.push(t[1].x, t[1].y, t[1].z), i.push(t[2].x, t[2].y, t[2].z);
61
+ for (let e = 1; e < 128; e++) i.push(t[2].x + (t[3].x - t[2].x) * e / 128, t[2].y + (t[3].y - t[2].y) * e / 128, t[2].z + (t[3].z - t[2].z) * e / 128);
62
+ i.push(t[3].x, t[3].y, t[3].z);
63
+ let a = [];
64
+ a.push(0, 1);
65
+ for (let e = 1; e < 128; e++) a.push(0, 1 - e / 128);
66
+ a.push(0, 0), a.push(1, 0);
67
+ for (let e = 1; e < 128; e++) a.push(1, e / 128);
68
+ a.push(1, 1);
69
+ let o = [];
70
+ for (let e = 0; e < 128; e++) o.push(e, e + 1, 256 - e, e, 256 - e, 257 - e);
71
+ r.setAttribute("position", new e.BufferAttribute(new Float32Array(i), 3)), r.setAttribute("uv", new e.BufferAttribute(new Float32Array(a), 2)), r.setIndex(new e.BufferAttribute(new Uint32Array(o), 1));
72
+ let s = new e.MeshBasicNodeMaterial({
73
+ map: c.videoTextureEnabled ? c.videoTexture : c.imageTexture,
74
+ side: e.DoubleSide
75
+ }), l = new e.Mesh(r, s);
76
+ return l.renderOrder = 1, l.name = `video-${n}-${performance.now()}`, l;
77
+ }), b = (t) => {
78
+ let n = new e.TextureLoader().load(t);
79
+ return n.minFilter = e.LinearFilter, n.magFilter = e.LinearFilter, n;
80
+ }, x = (t, n, r = () => !0) => new Promise((i, a) => {
81
+ let o = new XMLHttpRequest();
82
+ o.onreadystatechange = () => {
83
+ if (o.readyState == 4) {
84
+ if (!r()) {
85
+ a(new DOMException("Playback cancelled", "AbortError"));
86
+ return;
87
+ }
88
+ if (o.status == 200) {
89
+ let r = window.URL || window.webkitURL;
90
+ n ||= document.createElement("video"), n.crossOrigin = "anonymous", n.autoplay = !1, n.muted = !0, n.loop = !0, n.playsInline = !0, n.src = r.createObjectURL(o.response);
91
+ let a = new e.VideoTexture(n);
92
+ a.colorSpace = e.SRGBColorSpace, a.minFilter = e.LinearFilter, a.magFilter = e.LinearFilter, i(Object.assign(a, { videoSource: t }));
93
+ } else a(/* @__PURE__ */ Error("Video download Error: " + o.status));
94
+ }
95
+ }, o.onerror = (e) => a(e), o.open("GET", t), o.responseType = "blob", o.send();
96
+ }), S = async (t, n) => {
97
+ let r = ++o, { video_src: i, video_poster_src: a, points: l } = t;
98
+ c.videoSource = i, c.rectPoints = l.map((t) => t.map(({ x: t, y: n, z: r }) => new e.Vector3(t, n, r))), c.imageTexture = b(a), n && (c.videoElement = n);
99
+ let u = await x(c.videoSource, c.videoElement, () => !s && r === o);
100
+ s || r !== o ? (u.image.muted = !0, u.image.pause(), URL.revokeObjectURL(u.image.src), u.dispose()) : (c.videoTexture && (c.videoTexture.image.pause(), URL.revokeObjectURL(c.videoTexture.image.src), c.videoTexture.dispose()), c.videoTexture = u, t.enable && _());
101
+ };
102
+ return a("modeChange", () => h(!0)), a("wantsTapGesture", (e) => {
103
+ if (!c.enabled) return;
104
+ let [n] = e.intersectObjects(t.scene.children, !0);
105
+ if (n && /^video/.test(n.object.name)) return c.videoTexture && h(!c.videoTexture.image.muted, !0), !1;
106
+ }), a("panoArrived", () => {
107
+ if (!c.enabled || g()) return;
108
+ let n = t.camera.position;
109
+ c.rectPoints.find((r) => {
110
+ let i = r.reduce((t, n) => new e.Vector3(t.x + n.x / r.length, t.y + n.y / r.length, t.z + n.z / r.length), new e.Vector3());
111
+ return r.map((t) => new e.Vector3((t.x + i.x) / 2, (t.y + i.y) / 2, (t.z + i.z) / 2)).filter((r) => {
112
+ r = r.clone().sub(n).normalize();
113
+ let [i] = new e.Raycaster(n, r).intersectObjects(t.scene.children, !0);
114
+ return !!i && /^video/.test(i.object.name);
115
+ }).length >= 2;
116
+ }) || h(!0);
117
+ }), a("renderFrame", () => {
118
+ c.videoMeshes.forEach((e) => {
119
+ e && (e.needsRender = !0);
120
+ });
121
+ }), a("load", (e) => {
122
+ e.modelTVVideoData && S(e.modelTVVideoData);
123
+ }), {
124
+ enable: _,
125
+ disable: v,
126
+ load: S,
127
+ dispose: () => {
128
+ s = !0, ++o, v(), p?.dispose(), i.splice(0).forEach((e) => e()), c.imageTexture?.dispose(), c.videoTexture && (URL.revokeObjectURL(c.videoTexture.image.src), c.videoTexture.dispose());
129
+ }
130
+ };
158
131
  };
159
- export {
160
- j as ModelTVVideoPlugin
161
- };
162
- //# sourceMappingURL=ModelTVVideoPlugin.js.map
132
+ export { t as ModelTVVideoPlugin };
133
+
134
+ //# sourceMappingURL=ModelTVVideoPlugin.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ModelTVVideoPlugin.js","sources":["../../resources/fivePlugins/ModelTVVideoPlugin/index.ts"],"sourcesContent":["import * as THREE from 'three/webgpu'\nimport type { FivePlugin } from '@realsee/five-webgpu'\nimport type { PlaybackManager, PlaybackSession, MediaOperations } from '../../Player/playback-types'\n\nexport interface ModelTVVideoPluginData {\n enable?: boolean\n video_src: string\n video_poster_src: string\n points: { x: number; y: number; z: number }[][]\n}\n\nexport interface ModelTVVideoPluginParameterType {\n videoElement?: HTMLVideoElement\n mediaManager?: PlaybackManager\n}\nexport interface ModelTVVideoPluginExportType {\n enable: () => void\n disable: () => void\n dispose: () => void\n load: (data: ModelTVVideoPluginData, videoElement?: HTMLVideoElement) => Promise<void>\n}\n\ntype ModelTVVideoPluginPoints = THREE.Vector3[][]\n\ntype ModelTVVideoPluginState = {\n videoMeshes: THREE.Mesh<THREE.BufferGeometry, THREE.MeshBasicNodeMaterial>[]\n videoTextureEnabled: boolean\n videoSource: string\n rectPoints: ModelTVVideoPluginPoints\n enabled: boolean\n imageTexture?: THREE.Texture\n videoTexture?: THREE.VideoTexture\n videoElement?: HTMLVideoElement\n}\n\nexport const ModelTVVideoPlugin: FivePlugin<ModelTVVideoPluginParameterType, ModelTVVideoPluginExportType> = (\n five,\n { videoElement, mediaManager },\n) => {\n const listeners: (() => void)[] = []\n const on: typeof five.on = (name, callback) => {\n listeners.push(() => { five.off(name, callback) })\n return five.on(name, callback)\n }\n let generation = 0\n let disposed = false\n const state: ModelTVVideoPluginState = {\n videoMeshes: [],\n videoTextureEnabled: false,\n videoSource: '',\n rectPoints: [],\n enabled: false,\n videoElement: videoElement,\n }\n\n let session: PlaybackSession | undefined\n let output: MediaOperations | undefined\n let removeReady: (() => void) | undefined\n const stop = () => {\n ++generation\n removeReady?.()\n removeReady = undefined\n if (output) { output.muted = true; output.pause() }\n output = undefined\n session = undefined\n state.enabled = false\n state.videoMeshes.forEach(mesh => {\n mesh.geometry.dispose()\n mesh.material.dispose()\n five.scene.remove(mesh)\n })\n state.videoMeshes = []\n five.needsRender = true\n }\n const controller = mediaManager?.createController({ label: 'vreo-model-video', onCancel: stop })\n const bind = (userAction: boolean, audible: boolean) => {\n const element = state.videoTexture?.image as HTMLVideoElement | undefined\n if (!element) return undefined\n const next = controller?.begin({ userAction, audible }) ?? undefined\n if (controller && !next) return undefined\n session = next\n return output = next ? next.bind(element) : element\n }\n const setMuted = (muted: boolean, userAction = false) => {\n const wasEnabled = state.enabled\n const media = !muted ? bind(userAction, true) : output\n if (!media) return\n media.muted = muted\n if (wasEnabled && !state.enabled) {\n state.enabled = true\n state.videoMeshes = createPanoVideoMeshes()\n state.videoMeshes.forEach(mesh => five.scene.add(mesh))\n }\n const run = session\n const current = generation\n if (state.enabled) void media.play().catch(error => { if (current === generation && !run?.signal.aborted) { disable(); console.error(error) } })\n }\n const getMuted = () => output?.muted ?? true\n const enable = () => {\n if (disposed || state.enabled || !state.videoTexture) return\n const media = bind(false, false)\n if (!media) return\n const current = generation\n const run = session\n const element = state.videoTexture.image as HTMLVideoElement\n const valid = () => current === generation && !disposed && state.enabled && !run?.signal.aborted\n state.enabled = true\n state.videoMeshes = createPanoVideoMeshes()\n state.videoMeshes.forEach(mesh => five.scene.add(mesh))\n const timeupdate = () => {\n element.removeEventListener('timeupdate', timeupdate)\n if (!valid()) return\n state.videoTextureEnabled = true\n state.videoMeshes.forEach(mesh => { mesh.material.map = state.videoTexture! })\n five.needsRender = true\n }\n const play = () => {\n five.off('modelLoaded', play)\n if (!valid()) return\n element.addEventListener('timeupdate', timeupdate)\n void media.play().catch(error => { if (valid()) { disable(); console.error(error) } })\n }\n removeReady = () => { five.off('modelLoaded', play); element.removeEventListener('timeupdate', timeupdate) }\n if (five.model.loaded) play()\n else five.on('modelLoaded', play)\n }\n const disable = () => { controller?.cancel(); stop() }\n\n const createPanoVideoMeshes = () => {\n return state.rectPoints.map((points, index) => {\n const geometry = new THREE.BufferGeometry()\n const segments = 128\n\n const verticesArray: number[] = []\n verticesArray.push(points[0].x, points[0].y, points[0].z)\n for (let i = 1; i < segments; i++) {\n verticesArray.push(\n points[0].x + ((points[1].x - points[0].x) * i) / segments,\n points[0].y + ((points[1].y - points[0].y) * i) / segments,\n points[0].z + ((points[1].z - points[0].z) * i) / segments,\n )\n }\n verticesArray.push(points[1].x, points[1].y, points[1].z)\n verticesArray.push(points[2].x, points[2].y, points[2].z)\n for (let i = 1; i < segments; i++) {\n verticesArray.push(\n points[2].x + ((points[3].x - points[2].x) * i) / segments,\n points[2].y + ((points[3].y - points[2].y) * i) / segments,\n points[2].z + ((points[3].z - points[2].z) * i) / segments,\n )\n }\n verticesArray.push(points[3].x, points[3].y, points[3].z)\n\n const uvArray: number[] = []\n uvArray.push(0, 1)\n for (let i = 1; i < segments; i++) {\n uvArray.push(0, 1 - i / segments)\n }\n uvArray.push(0, 0)\n uvArray.push(1, 0)\n for (let i = 1; i < segments; i++) {\n uvArray.push(1, i / segments)\n }\n uvArray.push(1, 1)\n\n const indicesArray: number[] = []\n for (let i = 0; i < segments; i++) {\n indicesArray.push(i, i + 1, segments * 2 - i, i, segments * 2 - i, segments * 2 + 1 - i)\n }\n geometry.setAttribute('position', new THREE.BufferAttribute(new Float32Array(verticesArray), 3))\n geometry.setAttribute('uv', new THREE.BufferAttribute(new Float32Array(uvArray), 2))\n geometry.setIndex(new THREE.BufferAttribute(new Uint32Array(indicesArray), 1))\n const material = new THREE.MeshBasicNodeMaterial({\n map: state.videoTextureEnabled ? state.videoTexture : state.imageTexture,\n side: THREE.DoubleSide,\n })\n const mesh = new THREE.Mesh(geometry, material)\n mesh.renderOrder = 1\n mesh.name = `video-${index}-${performance.now()}`\n return mesh\n })\n }\n\n const getImageTexture = (source: string) => {\n const texture = new THREE.TextureLoader().load(source)\n texture.minFilter = THREE.LinearFilter\n texture.magFilter = THREE.LinearFilter\n return texture\n }\n\n const getVideoTexture = (\n source: string,\n video?: HTMLVideoElement,\n valid = () => true,\n ): Promise<THREE.VideoTexture & { videoSource: string }> => {\n return new Promise((resolve, reject) => {\n const xhr = new XMLHttpRequest()\n xhr.onreadystatechange = () => {\n if (xhr.readyState == 4) {\n if (!valid()) { reject(new DOMException('Playback cancelled', 'AbortError')); return }\n if (xhr.status == 200) {\n const url = window.URL || window.webkitURL\n video = video || document.createElement('video')\n video.crossOrigin = 'anonymous'\n video.autoplay = false\n video.muted = true\n video.loop = true\n video.playsInline = true\n video.src = url.createObjectURL(xhr.response)\n const texture = new THREE.VideoTexture(video)\n texture.colorSpace = THREE.SRGBColorSpace\n texture.minFilter = THREE.LinearFilter\n texture.magFilter = THREE.LinearFilter\n resolve(Object.assign(texture, { videoSource: source }))\n } else {\n reject(new Error('Video download Error: ' + xhr.status))\n }\n }\n }\n xhr.onerror = (error) => reject(error)\n xhr.open('GET', source)\n xhr.responseType = 'blob'\n xhr.send()\n })\n }\n\n const load = async (data: ModelTVVideoPluginData, videoElement?: HTMLVideoElement) => {\n const current = ++generation\n const { video_src, video_poster_src, points } = data\n state.videoSource = video_src\n state.rectPoints = points.map((items) => items.map(({ x, y, z }) => new THREE.Vector3(x, y, z)))\n state.imageTexture = getImageTexture(video_poster_src)\n\n if (videoElement) {\n state.videoElement = videoElement\n }\n\n const texture = await getVideoTexture(state.videoSource, state.videoElement, () => !disposed && current === generation)\n if (disposed || current !== generation) {\n texture.image.muted = true\n texture.image.pause()\n URL.revokeObjectURL(texture.image.src)\n texture.dispose()\n return\n }\n if (state.videoTexture) {\n state.videoTexture.image.pause()\n URL.revokeObjectURL(state.videoTexture.image.src)\n state.videoTexture.dispose()\n }\n state.videoTexture = texture\n\n if (data.enable) enable()\n }\n\n on('modeChange', () => setMuted(true))\n\n on('wantsTapGesture', (raycaster) => {\n if (!state.enabled) return\n const [intersect] = raycaster.intersectObjects(five.scene.children, true)\n if (!!intersect && /^video/.test(intersect.object.name)) {\n if (state.videoTexture) setMuted(!state.videoTexture.image.muted, true)\n return false\n }\n })\n\n on('panoArrived', () => {\n if (!state.enabled) return\n if (getMuted()) return\n const cameraPosition = five.camera.position\n\n const visible = state.rectPoints.find((points) => {\n const centerVector = points.reduce(\n (total, curr) =>\n new THREE.Vector3(\n total.x + curr.x / points.length,\n total.y + curr.y / points.length,\n total.z + curr.z / points.length,\n ),\n new THREE.Vector3(),\n )\n\n return (\n points\n .map(\n (point) =>\n new THREE.Vector3(\n (point.x + centerVector.x) / 2,\n (point.y + centerVector.y) / 2,\n (point.z + centerVector.z) / 2,\n ),\n )\n .filter((vector) => {\n vector = vector.clone().sub(cameraPosition).normalize()\n const raycaster = new THREE.Raycaster(cameraPosition, vector)\n const [intersect] = raycaster.intersectObjects(five.scene.children, true)\n return !!intersect && /^video/.test(intersect.object.name)\n }).length >= 2\n )\n })\n if (!visible) setMuted(true)\n })\n\n on('renderFrame', () => {\n state.videoMeshes.forEach((meshes) => {\n if (meshes)\n //@ts-ignore\n meshes.needsRender = true\n })\n })\n\n on('load', (input) => {\n if (input.modelTVVideoData) {\n load(input.modelTVVideoData)\n }\n })\n\n const dispose = () => {\n disposed = true\n ++generation\n disable()\n controller?.dispose()\n listeners.splice(0).forEach(remove => remove())\n state.imageTexture?.dispose()\n if (state.videoTexture) {\n URL.revokeObjectURL(state.videoTexture.image.src)\n state.videoTexture.dispose()\n }\n }\n return { enable, disable, load, dispose }\n}\n"],"names":["ModelTVVideoPlugin","five","videoElement","mediaManager","listeners","on","name","callback","generation","disposed","state","session","output","removeReady","stop","mesh","controller","bind","userAction","audible","element","_a","next","setMuted","muted","wasEnabled","media","createPanoVideoMeshes","run","current","error","disable","getMuted","enable","valid","timeupdate","play","points","index","geometry","THREE","segments","verticesArray","i","uvArray","indicesArray","material","getImageTexture","source","texture","getVideoTexture","video","resolve","reject","xhr","url","load","data","video_src","video_poster_src","items","x","y","z","raycaster","intersect","cameraPosition","centerVector","total","curr","point","vector","meshes","input","remove"],"mappings":"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"}
1
+ {"version":3,"file":"ModelTVVideoPlugin.js","names":["THREE","ModelTVVideoPlugin","listeners","on","name","callback","five","generation","disposed","state","session","output","removeReady","stop","mesh","controller","mediaManager","bind","element","next","setMuted","wasEnabled","media","muted","userAction","createPanoVideoMeshes","run","current","disable","error","getMuted","enable","valid","timeupdate","play","geometry","verticesArray","points","i","uvArray","indicesArray","material","index","getImageTexture","texture","source","getVideoTexture","xhr","url","video","resolve","reject","load","data","video_src","items","x","y","z","video_poster_src","videoElement","intersect","raycaster","cameraPosition","centerVector","total","curr","point","vector","meshes","input","remove"],"sources":["../../resources/fivePlugins/ModelTVVideoPlugin/index.ts"],"sourcesContent":["import * as THREE from 'three/webgpu'\nimport type { FivePlugin } from '@realsee/five-webgpu'\nimport type { PlaybackManager, PlaybackSession, MediaOperations } from '../../Player/playback-types'\n\nexport interface ModelTVVideoPluginData {\n enable?: boolean\n video_src: string\n video_poster_src: string\n points: { x: number; y: number; z: number }[][]\n}\n\nexport interface ModelTVVideoPluginParameterType {\n videoElement?: HTMLVideoElement\n mediaManager?: PlaybackManager\n}\nexport interface ModelTVVideoPluginExportType {\n enable: () => void\n disable: () => void\n dispose: () => void\n load: (data: ModelTVVideoPluginData, videoElement?: HTMLVideoElement) => Promise<void>\n}\n\ntype ModelTVVideoPluginPoints = THREE.Vector3[][]\n\ntype ModelTVVideoPluginState = {\n videoMeshes: THREE.Mesh<THREE.BufferGeometry, THREE.MeshBasicNodeMaterial>[]\n videoTextureEnabled: boolean\n videoSource: string\n rectPoints: ModelTVVideoPluginPoints\n enabled: boolean\n imageTexture?: THREE.Texture\n videoTexture?: THREE.VideoTexture\n videoElement?: HTMLVideoElement\n}\n\nexport const ModelTVVideoPlugin: FivePlugin<ModelTVVideoPluginParameterType, ModelTVVideoPluginExportType> = (\n five,\n { videoElement, mediaManager },\n) => {\n const listeners: (() => void)[] = []\n const on: typeof five.on = (name, callback) => {\n listeners.push(() => { five.off(name, callback) })\n return five.on(name, callback)\n }\n let generation = 0\n let disposed = false\n const state: ModelTVVideoPluginState = {\n videoMeshes: [],\n videoTextureEnabled: false,\n videoSource: '',\n rectPoints: [],\n enabled: false,\n videoElement: videoElement,\n }\n\n let session: PlaybackSession | undefined\n let output: MediaOperations | undefined\n let removeReady: (() => void) | undefined\n const stop = () => {\n ++generation\n removeReady?.()\n removeReady = undefined\n if (output) { output.muted = true; output.pause() }\n output = undefined\n session = undefined\n state.enabled = false\n state.videoMeshes.forEach(mesh => {\n mesh.geometry.dispose()\n mesh.material.dispose()\n five.scene.remove(mesh)\n })\n state.videoMeshes = []\n five.needsRender = true\n }\n const controller = mediaManager?.createController({ label: 'vreo-model-video', onCancel: stop })\n const bind = (userAction: boolean, audible: boolean) => {\n const element = state.videoTexture?.image as HTMLVideoElement | undefined\n if (!element) return undefined\n const next = controller?.begin({ userAction, audible }) ?? undefined\n if (controller && !next) return undefined\n session = next\n return output = next ? next.bind(element) : element\n }\n const setMuted = (muted: boolean, userAction = false) => {\n const wasEnabled = state.enabled\n const media = !muted ? bind(userAction, true) : output\n if (!media) return\n media.muted = muted\n if (wasEnabled && !state.enabled) {\n state.enabled = true\n state.videoMeshes = createPanoVideoMeshes()\n state.videoMeshes.forEach(mesh => five.scene.add(mesh))\n }\n const run = session\n const current = generation\n if (state.enabled) void media.play().catch(error => { if (current === generation && !run?.signal.aborted) { disable(); console.error(error) } })\n }\n const getMuted = () => output?.muted ?? true\n const enable = () => {\n if (disposed || state.enabled || !state.videoTexture) return\n const media = bind(false, false)\n if (!media) return\n const current = generation\n const run = session\n const element = state.videoTexture.image as HTMLVideoElement\n const valid = () => current === generation && !disposed && state.enabled && !run?.signal.aborted\n state.enabled = true\n state.videoMeshes = createPanoVideoMeshes()\n state.videoMeshes.forEach(mesh => five.scene.add(mesh))\n const timeupdate = () => {\n element.removeEventListener('timeupdate', timeupdate)\n if (!valid()) return\n state.videoTextureEnabled = true\n state.videoMeshes.forEach(mesh => { mesh.material.map = state.videoTexture! })\n five.needsRender = true\n }\n const play = () => {\n five.off('modelLoaded', play)\n if (!valid()) return\n element.addEventListener('timeupdate', timeupdate)\n void media.play().catch(error => { if (valid()) { disable(); console.error(error) } })\n }\n removeReady = () => { five.off('modelLoaded', play); element.removeEventListener('timeupdate', timeupdate) }\n if (five.model.loaded) play()\n else five.on('modelLoaded', play)\n }\n const disable = () => { controller?.cancel(); stop() }\n\n const createPanoVideoMeshes = () => {\n return state.rectPoints.map((points, index) => {\n const geometry = new THREE.BufferGeometry()\n const segments = 128\n\n const verticesArray: number[] = []\n verticesArray.push(points[0].x, points[0].y, points[0].z)\n for (let i = 1; i < segments; i++) {\n verticesArray.push(\n points[0].x + ((points[1].x - points[0].x) * i) / segments,\n points[0].y + ((points[1].y - points[0].y) * i) / segments,\n points[0].z + ((points[1].z - points[0].z) * i) / segments,\n )\n }\n verticesArray.push(points[1].x, points[1].y, points[1].z)\n verticesArray.push(points[2].x, points[2].y, points[2].z)\n for (let i = 1; i < segments; i++) {\n verticesArray.push(\n points[2].x + ((points[3].x - points[2].x) * i) / segments,\n points[2].y + ((points[3].y - points[2].y) * i) / segments,\n points[2].z + ((points[3].z - points[2].z) * i) / segments,\n )\n }\n verticesArray.push(points[3].x, points[3].y, points[3].z)\n\n const uvArray: number[] = []\n uvArray.push(0, 1)\n for (let i = 1; i < segments; i++) {\n uvArray.push(0, 1 - i / segments)\n }\n uvArray.push(0, 0)\n uvArray.push(1, 0)\n for (let i = 1; i < segments; i++) {\n uvArray.push(1, i / segments)\n }\n uvArray.push(1, 1)\n\n const indicesArray: number[] = []\n for (let i = 0; i < segments; i++) {\n indicesArray.push(i, i + 1, segments * 2 - i, i, segments * 2 - i, segments * 2 + 1 - i)\n }\n geometry.setAttribute('position', new THREE.BufferAttribute(new Float32Array(verticesArray), 3))\n geometry.setAttribute('uv', new THREE.BufferAttribute(new Float32Array(uvArray), 2))\n geometry.setIndex(new THREE.BufferAttribute(new Uint32Array(indicesArray), 1))\n const material = new THREE.MeshBasicNodeMaterial({\n map: state.videoTextureEnabled ? state.videoTexture : state.imageTexture,\n side: THREE.DoubleSide,\n })\n const mesh = new THREE.Mesh(geometry, material)\n mesh.renderOrder = 1\n mesh.name = `video-${index}-${performance.now()}`\n return mesh\n })\n }\n\n const getImageTexture = (source: string) => {\n const texture = new THREE.TextureLoader().load(source)\n texture.minFilter = THREE.LinearFilter\n texture.magFilter = THREE.LinearFilter\n return texture\n }\n\n const getVideoTexture = (\n source: string,\n video?: HTMLVideoElement,\n valid = () => true,\n ): Promise<THREE.VideoTexture & { videoSource: string }> => {\n return new Promise((resolve, reject) => {\n const xhr = new XMLHttpRequest()\n xhr.onreadystatechange = () => {\n if (xhr.readyState == 4) {\n if (!valid()) { reject(new DOMException('Playback cancelled', 'AbortError')); return }\n if (xhr.status == 200) {\n const url = window.URL || window.webkitURL\n video = video || document.createElement('video')\n video.crossOrigin = 'anonymous'\n video.autoplay = false\n video.muted = true\n video.loop = true\n video.playsInline = true\n video.src = url.createObjectURL(xhr.response)\n const texture = new THREE.VideoTexture(video)\n texture.colorSpace = THREE.SRGBColorSpace\n texture.minFilter = THREE.LinearFilter\n texture.magFilter = THREE.LinearFilter\n resolve(Object.assign(texture, { videoSource: source }))\n } else {\n reject(new Error('Video download Error: ' + xhr.status))\n }\n }\n }\n xhr.onerror = (error) => reject(error)\n xhr.open('GET', source)\n xhr.responseType = 'blob'\n xhr.send()\n })\n }\n\n const load = async (data: ModelTVVideoPluginData, videoElement?: HTMLVideoElement) => {\n const current = ++generation\n const { video_src, video_poster_src, points } = data\n state.videoSource = video_src\n state.rectPoints = points.map((items) => items.map(({ x, y, z }) => new THREE.Vector3(x, y, z)))\n state.imageTexture = getImageTexture(video_poster_src)\n\n if (videoElement) {\n state.videoElement = videoElement\n }\n\n const texture = await getVideoTexture(state.videoSource, state.videoElement, () => !disposed && current === generation)\n if (disposed || current !== generation) {\n texture.image.muted = true\n texture.image.pause()\n URL.revokeObjectURL(texture.image.src)\n texture.dispose()\n return\n }\n if (state.videoTexture) {\n state.videoTexture.image.pause()\n URL.revokeObjectURL(state.videoTexture.image.src)\n state.videoTexture.dispose()\n }\n state.videoTexture = texture\n\n if (data.enable) enable()\n }\n\n on('modeChange', () => setMuted(true))\n\n on('wantsTapGesture', (raycaster) => {\n if (!state.enabled) return\n const [intersect] = raycaster.intersectObjects(five.scene.children, true)\n if (!!intersect && /^video/.test(intersect.object.name)) {\n if (state.videoTexture) setMuted(!state.videoTexture.image.muted, true)\n return false\n }\n })\n\n on('panoArrived', () => {\n if (!state.enabled) return\n if (getMuted()) return\n const cameraPosition = five.camera.position\n\n const visible = state.rectPoints.find((points) => {\n const centerVector = points.reduce(\n (total, curr) =>\n new THREE.Vector3(\n total.x + curr.x / points.length,\n total.y + curr.y / points.length,\n total.z + curr.z / points.length,\n ),\n new THREE.Vector3(),\n )\n\n return (\n points\n .map(\n (point) =>\n new THREE.Vector3(\n (point.x + centerVector.x) / 2,\n (point.y + centerVector.y) / 2,\n (point.z + centerVector.z) / 2,\n ),\n )\n .filter((vector) => {\n vector = vector.clone().sub(cameraPosition).normalize()\n const raycaster = new THREE.Raycaster(cameraPosition, vector)\n const [intersect] = raycaster.intersectObjects(five.scene.children, true)\n return !!intersect && /^video/.test(intersect.object.name)\n }).length >= 2\n )\n })\n if (!visible) setMuted(true)\n })\n\n on('renderFrame', () => {\n state.videoMeshes.forEach((meshes) => {\n if (meshes)\n //@ts-ignore\n meshes.needsRender = true\n })\n })\n\n on('load', (input) => {\n if (input.modelTVVideoData) {\n load(input.modelTVVideoData)\n }\n })\n\n const dispose = () => {\n disposed = true\n ++generation\n disable()\n controller?.dispose()\n listeners.splice(0).forEach(remove => remove())\n state.imageTexture?.dispose()\n if (state.videoTexture) {\n URL.revokeObjectURL(state.videoTexture.image.src)\n state.videoTexture.dispose()\n }\n }\n return { enable, disable, load, dispose }\n}\n"],"mappings":"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"}
@@ -1,44 +1,46 @@
1
- import { jsx as f, Fragment as h } from "react/jsx-runtime";
2
- import { unsafe__useFiveInstance as m } from "@realsee/five-webgpu/react";
1
+ import { t as e } from "../chunks/Player-BzRqdH4q.js";
3
2
  import * as t from "react";
4
- import { Player as x } from "../Player/index.js";
5
- const p = t.createContext(null), k = (e) => {
6
- const o = m(), [n, s] = t.useState(null), r = t.useRef(null), c = t.useRef(e.configs ?? {});
7
- return t.useEffect(() => {
8
- const u = new x(o, c.current);
9
- return r.current = u, s(u), () => {
10
- r.current === u && (r.current = null), u.dispose();
11
- };
12
- }, [o]), n ? /* @__PURE__ */ f(p.Provider, { value: n, children: e.children }) : /* @__PURE__ */ f(h, {});
3
+ import { Fragment as n, jsx as r } from "react/jsx-runtime";
4
+ import { unsafe__useFiveInstance as i } from "@realsee/five-webgpu/react";
5
+ // resources/react/index.tsx
6
+ var a = t.createContext(null), o = (o) => {
7
+ let s = i(), [c, l] = t.useState(null), u = t.useRef(null), d = t.useRef(o.configs ?? {});
8
+ return t.useEffect(() => {
9
+ let t = new e(s, d.current);
10
+ return u.current = t, l(t), () => {
11
+ u.current === t && (u.current = null), t.dispose();
12
+ };
13
+ }, [s]), c ? /* @__PURE__ */ r(a.Provider, {
14
+ value: c,
15
+ children: o.children
16
+ }) : /* @__PURE__ */ r(n, {});
13
17
  };
14
- function i() {
15
- const e = t.useContext(p);
16
- if (!e)
17
- throw new Error("VreoProvider never found.");
18
- return e;
18
+ function s() {
19
+ let e = t.useContext(a);
20
+ if (!e) throw Error("VreoProvider never found.");
21
+ return e;
19
22
  }
20
- function w() {
21
- const e = i(), o = t.useCallback(
22
- (a, l, y, C, v) => e.load(a, l, y, C, v),
23
- [e]
24
- ), n = t.useCallback((a, l) => e.play(a, l), [e]), s = t.useCallback(() => e.pause(), [e]), r = t.useCallback(() => e.show(), [e]), c = t.useCallback(() => e.hide(), [e]), u = t.useCallback(() => e.dispose(), [e]);
25
- return { load: o, pause: s, show: r, play: n, hide: c, dispose: u };
23
+ function c() {
24
+ let e = s(), n = t.useCallback((t, n, r, i, a) => e.load(t, n, r, i, a), [e]), r = t.useCallback((t, n) => e.play(t, n), [e]);
25
+ return {
26
+ load: n,
27
+ pause: t.useCallback(() => e.pause(), [e]),
28
+ show: t.useCallback(() => e.show(), [e]),
29
+ play: r,
30
+ hide: t.useCallback(() => e.hide(), [e]),
31
+ dispose: t.useCallback(() => e.dispose(), [e])
32
+ };
26
33
  }
27
- function d(e, o, n) {
28
- const s = i();
29
- let r = [s, e];
30
- n !== void 0 && (r = r.concat(n)), t.useEffect(() => (s.on(e, o), () => {
31
- s.off(e, o);
32
- }), r);
34
+ function l(e, n, r) {
35
+ let i = s(), a = [i, e];
36
+ r !== void 0 && (a = a.concat(r)), t.useEffect(() => (i.on(e, n), () => {
37
+ i.off(e, n);
38
+ }), a);
33
39
  }
34
- function g() {
35
- const e = i(), [o, n] = t.useState(e.paused);
36
- return d("paused", () => n(!0)), d("playing", () => n(!1)), o;
40
+ function u() {
41
+ let e = s(), [n, r] = t.useState(e.paused);
42
+ return l("paused", () => r(!0)), l("playing", () => r(!1)), n;
37
43
  }
38
- export {
39
- k as VreoProvider,
40
- w as useVreoAction,
41
- d as useVreoEventCallback,
42
- g as useVreoPausedState
43
- };
44
- //# sourceMappingURL=index.js.map
44
+ export { o as VreoProvider, c as useVreoAction, l as useVreoEventCallback, u as useVreoPausedState };
45
+
46
+ //# sourceMappingURL=index.js.map