@realsee/vreo 3.0.0-webgpu.9 → 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.
- package/CHANGELOG.md +7 -0
- package/README.md +6 -0
- package/lib/PlayController/index.js +74 -75
- package/lib/PlayController/index.js.map +1 -1
- package/lib/Player/App.d.ts +2 -1
- package/lib/Player/App.d.ts.map +1 -1
- package/lib/Player/custom/SpatialScenePanel/index.d.ts +2 -1
- package/lib/Player/custom/SpatialScenePanel/index.d.ts.map +1 -1
- package/lib/Player/hooks.d.ts.map +1 -1
- package/lib/Player/index.js +1 -1808
- package/lib/Player/modules/Drawer/index.d.ts +2 -1
- package/lib/Player/modules/Drawer/index.d.ts.map +1 -1
- package/lib/Player/modules/PopUp/index.d.ts +2 -1
- package/lib/Player/modules/PopUp/index.d.ts.map +1 -1
- package/lib/Player/modules/ResizeObserver/index.d.ts +2 -1
- package/lib/Player/modules/ResizeObserver/index.d.ts.map +1 -1
- package/lib/Player/modules/VideoAgent/index.d.ts +2 -2
- package/lib/Player/modules/Wave/index.d.ts +2 -1
- package/lib/Player/modules/Wave/index.d.ts.map +1 -1
- package/lib/Player/modules/keyframes/BgMusic/index.d.ts +2 -1
- package/lib/Player/modules/keyframes/BgMusic/index.d.ts.map +1 -1
- package/lib/Player/modules/keyframes/CameraMovement/index.d.ts +2 -1
- package/lib/Player/modules/keyframes/CameraMovement/index.d.ts.map +1 -1
- package/lib/Player/modules/keyframes/InfoPanel/index.d.ts +2 -1
- package/lib/Player/modules/keyframes/InfoPanel/index.d.ts.map +1 -1
- package/lib/Player/modules/keyframes/ModelVideo/index.d.ts +2 -1
- package/lib/Player/modules/keyframes/ModelVideo/index.d.ts.map +1 -1
- package/lib/Player/modules/keyframes/PanoEffect/index.d.ts +2 -1
- package/lib/Player/modules/keyframes/PanoEffect/index.d.ts.map +1 -1
- package/lib/Player/modules/keyframes/PanoTextLabel/index.d.ts +2 -1
- package/lib/Player/modules/keyframes/PanoTextLabel/index.d.ts.map +1 -1
- package/lib/Player/modules/keyframes/Prompter/index.d.ts +2 -1
- package/lib/Player/modules/keyframes/Prompter/index.d.ts.map +1 -1
- package/lib/Player/modules/keyframes/UpdateVRPanorama/index.d.ts +2 -1
- package/lib/Player/modules/keyframes/UpdateVRPanorama/index.d.ts.map +1 -1
- package/lib/Player/modules/keyframes/VideoEffect/index.d.ts +2 -1
- package/lib/Player/modules/keyframes/VideoEffect/index.d.ts.map +1 -1
- package/lib/chunks/CSS3DRenderPlugin-CtnLUnu7.js +128 -0
- package/lib/chunks/CSS3DRenderPlugin-CtnLUnu7.js.map +1 -0
- package/lib/chunks/CameraMovementPlugin-YCaScSFU.js +77 -0
- package/lib/chunks/CameraMovementPlugin-YCaScSFU.js.map +1 -0
- package/lib/chunks/Player-BzRqdH4q.js +1581 -0
- package/lib/chunks/Player-BzRqdH4q.js.map +1 -0
- package/lib/chunks/VreoUnit-NhH1hdF1.js +17 -0
- package/lib/chunks/VreoUnit-NhH1hdF1.js.map +1 -0
- package/lib/chunks/timeline-DZs_svT3.js +37 -0
- package/lib/chunks/timeline-DZs_svT3.js.map +1 -0
- package/lib/fivePlugins/CSS3DRenderPlugin/transformPositionToVector3.d.ts.map +1 -1
- package/lib/index.js +4 -12
- package/lib/plugins/CSS3DRenderPlugin.js +1 -115
- package/lib/plugins/CameraMovementPlugin.js +1 -6
- package/lib/plugins/ModelTVVideoPlugin.js +133 -161
- package/lib/plugins/ModelTVVideoPlugin.js.map +1 -1
- package/lib/react/index.js +40 -38
- package/lib/react/index.js.map +1 -1
- package/lib/shared-utils/animationFrame/BetterTween.d.ts.map +1 -1
- package/lib/shared-utils/createTransMatrix.d.ts.map +1 -1
- package/lib/types/index.js +1 -10
- package/package.json +8 -8
- package/lib/Player/index.js.map +0 -1
- package/lib/chunks/index-BgPSzRSs.js +0 -93
- package/lib/chunks/index-BgPSzRSs.js.map +0 -1
- package/lib/chunks/index-CunyJn6H.js +0 -51
- package/lib/chunks/index-CunyJn6H.js.map +0 -1
- package/lib/index.js.map +0 -1
- package/lib/plugins/CSS3DRenderPlugin.js.map +0 -1
- package/lib/plugins/CameraMovementPlugin.js.map +0 -1
- package/lib/types/index.js.map +0 -1
|
@@ -1,115 +1 @@
|
|
|
1
|
-
|
|
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
|
-
|
|
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
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
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
|
-
|
|
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":";;AAmCA,IAAaC,KACX,GACA,EAAE,iBAAc,sBACb;CACH,IAAMC,IAA4B,CAAC,GAC7BC,KAAsB,GAAM,OAChCD,EAAU,WAAW;EAAE,EAAK,IAAIE,GAAMC,CAAQ;CAAE,CAAC,GAC1CC,EAAK,GAAGF,GAAMC,CAAQ,IAE3BE,IAAa,GACbC,IAAW,IACTC,IAAiC;EACrC,aAAa,CAAC;EACd,qBAAqB;EACrB,aAAa;EACb,YAAY,CAAC;EACb,SAAS;EACK;CAChB,GAEIC,GACAC,GACAC,GACEC,UAAa;EAcjB,AAbA,EAAEN,GACFK,IAAc,GACd,IAAc,KAAA,GACVD,MAAU,EAAO,QAAQ,IAAMA,EAAO,MAAM,IAChD,IAAS,KAAA,GACT,IAAU,KAAA,GACV,EAAM,UAAU,IAChBF,EAAM,YAAY,SAAQ,MAAQ;GAGhC,AAFAK,EAAK,SAAS,QAAQ,GACtBA,EAAK,SAAS,QAAQ,GACtBR,EAAK,MAAM,OAAOQ,CAAI;EACxB,CAAC,GACD,EAAM,cAAc,CAAC,GACrB,EAAK,cAAc;CACrB,GACMC,IAAaC,GAAc,iBAAiB;EAAE,OAAO;EAAoB,UAAUH;CAAK,CAAC,GACzFI,KAAQ,GAAqB,MAAqB;EACtD,IAAMC,IAAUT,EAAM,cAAc;EACpC,IAAI,CAACS,GAAS;EACd,IAAMC,IAAOJ,GAAY,MAAM;GAAE;GAAY;EAAQ,CAAC,KAAK,KAAA;EAC3D,IAAI,MAAeI,GAEnB,OADA,IAAUA,GACH,IAASA,IAAOA,EAAK,KAAKD,CAAO,IAAIA;CAC9C,GACME,KAAY,GAAgB,IAAa,OAAU;EACvD,IAAMC,IAAaZ,EAAM,SACnBa,IAASC,IAAiCZ,IAAzBM,EAAKO,GAAY,EAAI;EAC5C,IAAI,CAACF,GAAO;EAEZ,AADA,EAAM,QAAQC,GACVF,KAAc,CAACZ,EAAM,YACvB,EAAM,UAAU,IAChB,EAAM,cAAcgB,EAAsB,GAC1ChB,EAAM,YAAY,SAAQ,MAAQH,EAAK,MAAM,IAAIQ,CAAI,CAAC;EAExD,IAAMY,IAAMhB,GACNiB,IAAUpB;EAChB,AAAIE,EAAM,WAASa,EAAW,KAAK,CAAC,CAAC,OAAM,MAAS;GAAE,AAAIK,MAAYpB,KAAc,CAACmB,GAAK,OAAO,YAAWE,EAAQ,GAAG,QAAQ,MAAMC,CAAK;EAAI,CAAC;CACjJ,GACMC,UAAiBnB,GAAQ,SAAS,IAClCoB,UAAe;EACnB,IAAIvB,KAAYC,EAAM,WAAW,CAACA,EAAM,cAAc;EACtD,IAAMa,IAAQL,EAAK,IAAO,EAAK;EAC/B,IAAI,CAACK,GAAO;EACZ,IAAMK,IAAUpB,GACVmB,IAAMhB,GACNQ,IAAUT,EAAM,aAAa,OAC7BuB,UAAcL,MAAYpB,KAAc,CAACC,KAAYC,EAAM,WAAW,CAACiB,GAAK,OAAO;EAGzF,AAFA,EAAM,UAAU,IAChB,EAAM,cAAcD,EAAsB,GAC1ChB,EAAM,YAAY,SAAQ,MAAQH,EAAK,MAAM,IAAIQ,CAAI,CAAC;EACtD,IAAMmB,UAAmB;GAEvB,AADAf,EAAQ,oBAAoB,cAAce,CAAU,GAC/CD,EAAM,MACX,EAAM,sBAAsB,IAC5BvB,EAAM,YAAY,SAAQ,MAAQ;IAAE,EAAK,SAAS,MAAMA,EAAM;GAAc,CAAC,GAC7E,EAAK,cAAc;EACrB,GACMyB,UAAa;GAEjB,AADA5B,EAAK,IAAI,eAAe4B,CAAI,GACvBF,EAAM,MACXd,EAAQ,iBAAiB,cAAce,CAAU,GACjDX,EAAW,KAAK,CAAC,CAAC,OAAM,MAAS;IAAE,AAAIU,EAAM,MAAKJ,EAAQ,GAAG,QAAQ,MAAMC,CAAK;GAAI,CAAC;EACvF;EAEA,AADA,UAAoB;GAAiC,AAA/BvB,EAAK,IAAI,eAAe4B,CAAI,GAAGhB,EAAQ,oBAAoB,cAAce,CAAU;EAAE,GACvG3B,EAAK,MAAM,SAAQ4B,EAAK,IACvB5B,EAAK,GAAG,eAAe4B,CAAI;CAClC,GACMN,UAAgB;EAAwB,AAAtBb,GAAY,OAAO,GAAGF,EAAK;CAAE,GAE/CY,UACGhB,EAAM,WAAW,KAAK,GAAQ,MAAU;EAC7C,IAAM0B,IAAW,IAAInC,EAAM,eAAe,GAGpCoC,IAA0B,CAAC;EACjC,EAAc,KAAKC,EAAO,EAAE,CAAC,GAAGA,EAAO,EAAE,CAAC,GAAGA,EAAO,EAAE,CAAC,CAAC;EACxD,KAAK,IAAIC,IAAI,GAAGA,IAAI,KAAU,KAC5B,EAAc,KACZD,EAAO,EAAE,CAAC,KAAMA,EAAO,EAAE,CAAC,IAAIA,EAAO,EAAE,CAAC,KAAKC,IAAK,KAClDD,EAAO,EAAE,CAAC,KAAMA,EAAO,EAAE,CAAC,IAAIA,EAAO,EAAE,CAAC,KAAKC,IAAK,KAClDD,EAAO,EAAE,CAAC,KAAMA,EAAO,EAAE,CAAC,IAAIA,EAAO,EAAE,CAAC,KAAKC,IAAK,GACpD;EAGF,AADAF,EAAc,KAAKC,EAAO,EAAE,CAAC,GAAGA,EAAO,EAAE,CAAC,GAAGA,EAAO,EAAE,CAAC,CAAC,GACxDD,EAAc,KAAKC,EAAO,EAAE,CAAC,GAAGA,EAAO,EAAE,CAAC,GAAGA,EAAO,EAAE,CAAC,CAAC;EACxD,KAAK,IAAIC,IAAI,GAAGA,IAAI,KAAU,KAC5B,EAAc,KACZD,EAAO,EAAE,CAAC,KAAMA,EAAO,EAAE,CAAC,IAAIA,EAAO,EAAE,CAAC,KAAKC,IAAK,KAClDD,EAAO,EAAE,CAAC,KAAMA,EAAO,EAAE,CAAC,IAAIA,EAAO,EAAE,CAAC,KAAKC,IAAK,KAClDD,EAAO,EAAE,CAAC,KAAMA,EAAO,EAAE,CAAC,IAAIA,EAAO,EAAE,CAAC,KAAKC,IAAK,GACpD;EAEF,EAAc,KAAKD,EAAO,EAAE,CAAC,GAAGA,EAAO,EAAE,CAAC,GAAGA,EAAO,EAAE,CAAC,CAAC;EAExD,IAAME,IAAoB,CAAC;EAC3B,EAAQ,KAAK,GAAG,CAAC;EACjB,KAAK,IAAID,IAAI,GAAGA,IAAI,KAAU,KAC5B,EAAQ,KAAK,GAAG,IAAIA,IAAI,GAAQ;EAGlC,AADAC,EAAQ,KAAK,GAAG,CAAC,GACjBA,EAAQ,KAAK,GAAG,CAAC;EACjB,KAAK,IAAID,IAAI,GAAGA,IAAI,KAAU,KAC5B,EAAQ,KAAK,GAAGA,IAAI,GAAQ;EAE9B,EAAQ,KAAK,GAAG,CAAC;EAEjB,IAAME,IAAyB,CAAC;EAChC,KAAK,IAAIF,IAAI,GAAGA,IAAI,KAAU,KAC5B,EAAa,KAAKA,GAAGA,IAAI,GAAG,MAAeA,GAAGA,GAAG,MAAeA,GAAG,MAAmBA,CAAC;EAIzF,AAFAH,EAAS,aAAa,YAAY,IAAInC,EAAM,gBAAgB,IAAI,aAAaoC,CAAa,GAAG,CAAC,CAAC,GAC/FD,EAAS,aAAa,MAAM,IAAInC,EAAM,gBAAgB,IAAI,aAAauC,CAAO,GAAG,CAAC,CAAC,GACnFJ,EAAS,SAAS,IAAInC,EAAM,gBAAgB,IAAI,YAAYwC,CAAY,GAAG,CAAC,CAAC;EAC7E,IAAMC,IAAW,IAAIzC,EAAM,sBAAsB;GAC/C,KAAKS,EAAM,sBAAsBA,EAAM,eAAeA,EAAM;GAC5D,MAAMT,EAAM;EACd,CAAC,GACKc,IAAO,IAAId,EAAM,KAAKmC,GAAUM,CAAQ;EAG9C,OAFA,EAAK,cAAc,GACnB,EAAK,OAAO,SAASC,EAAM,GAAG,YAAY,IAAI,KACvC5B;CACT,CAAC,GAGG6B,KAAmB,MAAmB;EAC1C,IAAMC,IAAU,IAAI5C,EAAM,cAAc,CAAC,CAAC,KAAK6C,CAAM;EAGrD,OAFA,EAAQ,YAAY7C,EAAM,cAC1B,EAAQ,YAAYA,EAAM,cACnB4C;CACT,GAEME,KACJ,GACA,GACA,UAAc,OAEP,IAAI,SAAS,GAAS,MAAW;EACtC,IAAMC,IAAM,IAAI,eAAe;EA0B/B,AAzBA,EAAI,2BAA2B;GAC7B,IAAIA,EAAI,cAAc,GAAG;IACvB,IAAI,CAACf,EAAM,GAAG;KAAE,EAAO,IAAI,aAAa,sBAAsB,YAAY,CAAC;KAAG;IAAO;IACrF,IAAIe,EAAI,UAAU,KAAK;KACrB,IAAMC,IAAM,OAAO,OAAO,OAAO;KAOjC,AANA,MAAiB,SAAS,cAAc,OAAO,GAC/C,EAAM,cAAc,aACpB,EAAM,WAAW,IACjB,EAAM,QAAQ,IACd,EAAM,OAAO,IACb,EAAM,cAAc,IACpB,EAAM,MAAMA,EAAI,gBAAgBD,EAAI,QAAQ;KAC5C,IAAMH,IAAU,IAAI5C,EAAM,aAAaiD,CAAK;KAI5C,AAHA,EAAQ,aAAajD,EAAM,gBAC3B,EAAQ,YAAYA,EAAM,cAC1B,EAAQ,YAAYA,EAAM,cAC1BkD,EAAQ,OAAO,OAAON,GAAS,EAAE,aAAaC,EAAO,CAAC,CAAC;IACzD,OACE,EAAO,gBAAI,MAAM,2BAA2BE,EAAI,MAAM,CAAC;GAE3D;EACF,GACA,EAAI,WAAW,MAAUI,EAAOtB,CAAK,GACrCkB,EAAI,KAAK,OAAOF,CAAM,GACtB,EAAI,eAAe,QACnBE,EAAI,KAAK;CACX,CAAC,GAGGK,IAAO,OAAO,GAA8B,MAAoC;EACpF,IAAMzB,IAAU,EAAEpB,GACZ,EAAE,cAAW,qBAAkB,cAAW8C;EAKhD,AAJA,EAAM,cAAcC,GACpB,EAAM,aAAajB,EAAO,KAAK,MAAUkB,EAAM,KAAK,EAAE,MAAG,MAAG,WAAQ,IAAIvD,EAAM,QAAQwD,GAAGC,GAAGC,CAAC,CAAC,CAAC,GAC/F,EAAM,eAAef,EAAgBgB,CAAgB,GAEjDC,MACF,EAAM,eAAeA;EAGvB,IAAMhB,IAAU,MAAME,EAAgBrC,EAAM,aAAaA,EAAM,oBAAoB,CAACD,KAAYmB,MAAYpB,CAAU;EACtH,AAAIC,KAAYmB,MAAYpB,KAC1B,EAAQ,MAAM,QAAQ,IACtBqC,EAAQ,MAAM,MAAM,GACpB,IAAI,gBAAgBA,EAAQ,MAAM,GAAG,GACrCA,EAAQ,QAAQ,MAGdnC,EAAM,iBACRA,EAAM,aAAa,MAAM,MAAM,GAC/B,IAAI,gBAAgBA,EAAM,aAAa,MAAM,GAAG,GAChDA,EAAM,aAAa,QAAQ,IAE7B,EAAM,eAAemC,GAEjBS,EAAK,UAAQtB,EAAO;CAC1B;CA4EA,OA1EA5B,EAAG,oBAAoBiB,EAAS,EAAI,CAAC,GAErCjB,EAAG,oBAAoB,MAAc;EACnC,IAAI,CAACM,EAAM,SAAS;EACpB,IAAM,CAACoD,KAAaC,EAAU,iBAAiBxD,EAAK,MAAM,UAAU,EAAI;EACxE,IAAMuD,KAAa,SAAS,KAAKA,EAAU,OAAO,IAAI,GAEpD,OADIpD,EAAM,gBAAcW,EAAS,CAACX,EAAM,aAAa,MAAM,OAAO,EAAI,GAC/D;CAEX,CAAC,GAEDN,EAAG,qBAAqB;EAEtB,IADI,CAACM,EAAM,WACPqB,EAAS,GAAG;EAChB,IAAMiC,IAAiBzD,EAAK,OAAO;EA+BnC,AA7BgBG,EAAM,WAAW,MAAM,MAAW;GAChD,IAAMuD,IAAe3B,EAAO,QACzB,GAAO,MACN,IAAIrC,EAAM,QACRiE,EAAM,IAAIC,EAAK,IAAI7B,EAAO,QAC1B4B,EAAM,IAAIC,EAAK,IAAI7B,EAAO,QAC1B4B,EAAM,IAAIC,EAAK,IAAI7B,EAAO,MAC5B,GACF,IAAIrC,EAAM,QAAQ,CACpB;GAEA,OACEqC,EACG,KACE,MACC,IAAIrC,EAAM,SACPmE,EAAM,IAAIH,EAAa,KAAK,IAC5BG,EAAM,IAAIH,EAAa,KAAK,IAC5BG,EAAM,IAAIH,EAAa,KAAK,CAC/B,CACJ,CAAC,CACA,QAAQ,MAAW;IAClB,IAASI,EAAO,MAAM,CAAC,CAAC,IAAIL,CAAc,CAAC,CAAC,UAAU;IAEtD,IAAM,CAACF,KAAa,IADE7D,EAAM,UAAU+D,GAAgBK,CAClC,CAAA,CAAU,iBAAiB9D,EAAK,MAAM,UAAU,EAAI;IACxE,OAAO,CAAC,CAACuD,KAAa,SAAS,KAAKA,EAAU,OAAO,IAAI;GAC3D,CAAC,CAAC,CAAC,UAAU;EAEnB,CACK,KAASzC,EAAS,EAAI;CAC7B,CAAC,GAEDjB,EAAG,qBAAqB;EACtB,EAAM,YAAY,SAAS,MAAW;GACpC,AAAIkE,MAEF,EAAO,cAAc;EACzB,CAAC;CACH,CAAC,GAEDlE,EAAG,SAAS,MAAU;EACpB,AAAImE,EAAM,oBACRlB,EAAKkB,EAAM,gBAAgB;CAE/B,CAAC,GAcM;EAAE;EAAQ;EAAS;EAAM,eAZV;GAOpB,AANA,IAAW,IACX,EAAE/D,GACFqB,EAAQ,GACRb,GAAY,QAAQ,GACpBb,EAAU,OAAO,CAAC,CAAC,CAAC,SAAQ,MAAUqE,EAAO,CAAC,GAC9C9D,EAAM,cAAc,QAAQ,GACxBA,EAAM,iBACR,IAAI,gBAAgBA,EAAM,aAAa,MAAM,GAAG,GAChDA,EAAM,aAAa,QAAQ;EAE/B;CACwC;AAC1C"}
|
package/lib/react/index.js
CHANGED
|
@@ -1,44 +1,46 @@
|
|
|
1
|
-
import {
|
|
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 {
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
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
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
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
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
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
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
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
|
|
35
|
-
|
|
36
|
-
|
|
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
|
-
|
|
40
|
-
|
|
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
|