UNPKG

@realsee/dnalogel

Version:
137 lines (136 loc) 6.83 kB
var C = Object.defineProperty, R = Object.defineProperties; var F = Object.getOwnPropertyDescriptors; var b = Object.getOwnPropertySymbols; var D = Object.prototype.hasOwnProperty, S = Object.prototype.propertyIsEnumerable; var m = (r, t, e) => t in r ? C(r, t, { enumerable: !0, configurable: !0, writable: !0, value: e }) : r[t] = e, p = (r, t) => { for (var e in t || (t = {})) D.call(t, e) && m(r, e, t[e]); if (b) for (var e of b(t)) S.call(t, e) && m(r, e, t[e]); return r; }, l = (r, t) => R(r, F(t)); var o = (r, t, e) => (m(r, typeof t != "symbol" ? t + "" : t, e), e); import { CSS3DRender as x } from "./utils/three/CSS3DRender.js"; import O from "./utils/waitFiveModelLoaded.js"; import P from "./utils/generateBehindFiveElement.js"; import "hammerjs"; import "three"; import "@realsee/five"; import "../vendor/@tweenjs/tween/dist/tween.esm.js.js"; import { absoluteUrl as $ } from "../shared-utils/url/absoluteUrl.js"; import "../shared-utils/positionToVector3.js"; import "./utils/three/CSS3DRenderer.js"; import "three/examples/jsm/renderers/CSS3DRenderer"; import "./utils/getAllCSS3DObject.js"; import "../shared-utils/util.js"; import "./utils/createResizeObserver.js"; import "./utils/even.js"; import "../shared-utils/Subscribe.js"; import "./utils/three/CSS3DObject.js"; import "./utils/three/OpacityMesh.js"; import "../shared-utils/three/centerPoint.js"; import "../shared-utils/three/getObjectVisible.js"; import "./utils/three/CSS3DScene.js"; import "./utils/three/CSS3DGroup.js"; const E = "v2.0.1", h = `CSS3DRenderPlugin@${E}`; class Y extends x { constructor(e) { super(); o(this, "five"); o(this, "behindFiveContainer"); o(this, "VERSION", E); o(this, "staticPrefix", "//vr-image-4.realsee-cdn.cn"); /** * @description 根据传入的四个点位创建一个 3d dom容器,可以通过ReactDom.render()的方式将react组件放到容器中 * @param { Vector3Position[] } points 矩形四个点坐标 * @param config 均为可选值 * @config_document `config` 均为可选值 * | key | type | defaultValue | comment | * | - | - | - | - | * | `ratio` | *`number`* | `0.00216` | 1px对应多少米,默认为 0.00216,即1px对应2.16mm | * | ~~`dpr`~~ | ~~*`number`*~~ | ~~`undefined`~~ | ~~**已改名**,请使用~~ `devicePixelRatio` | * | `devicePixelRatio` | *`number`* | `1` | 设备的物理像素分辨率与CSS像素分辨率的比值 | * | `container` | *`HTMLElement`* | `undefined` | 自定义 return 中的 `container` * | `pointerEvents` | *`'none'\|'auto'`* | `'none'` | container 的 css属性:`pointer-events` 的值 | * | `autoRender` | *`boolean`* | `true` | 是否自动渲染,通常为true | * | `mode` | *`'front'\|'behind'`* | `front` | 两种模式:| * | | | | `front` 模式:DOM 处于 five Canvas 上方,所以无法模拟遮挡效果,需要手动检测是否可见去设置显隐 | * | | | | `behind` 模式:DOM 处于 five Canvas 下方,可以模拟真实的遮挡效果,但是 DOM 必须是非透明的 | * | `behindFiveContainer` | *`HTMLElement`* | `undefined` | 如果 mode 为 `behind`,需要传入容器,并确保此容器位five下方,且中间无其他不透明的dom元素遮挡 | * * @return * ```typescript * { * id: string, // id * container: HTMLDIVElement // dom容器 * dispose: () => void // 销毁 * css3DObject: CSS3DObject // THREE.CSS3DObject 实例 * render?: () => void // 渲染函数,当 config.autoRender = true || undefined 时为 undefined * setVisible: (visible: boolean) => void // 设置显隐, 同 setVisibleById(id, visible) * show: () => void // 同 setVisible(true) * hide: () => void // 同 setVisible(false) * setEnabled: (enabled: boolean) => void // 添加/移除 container, 同 setEnabledById(id, enabled) * enable: () => void // 同 setEnabled(true) * disable: () => void // 同 setEnabled(false) * } | void * ``` */ o(this, "create3DDomContainer", (e, i) => { if (this.state.disposed) return; const s = (() => { var f; (i == null ? void 0 : i.dpr) !== void 0 && console.warn(`${h}: please use "config.devicePixelRatio" replace "config.dpr"`); const d = { ratio: 216e-5, devicePixelRatio: (f = i == null ? void 0 : i.dpr) != null ? f : 1, mode: "front", autoRender: !0, wrapperStyle: {} }; return Object.assign(d, i, (i == null ? void 0 : i.mode) === "behind" ? { scene: this.five.scene } : void 0); })(), a = this.five.getElement(); if (!a) { console.error(`${h}: five.getElement() is ${a}`); return; } const { autoRender: v } = s; s.mode === "behind" && s.behindFiveContainer && (this.behindFiveContainer = s.behindFiveContainer); const n = this.create3DElement(this.five.camera, e, l(p({}, s), { autoRender: !1 })); if (!n) return; const u = () => { const d = n.css3DObject.mode === "front" ? a.parentElement : this.getBehindFiveElement(); if (!d) return console.error(`${h}: wrapper is ${d}`); n.appendToElement(d), n.render(); }, c = () => { n.css3DObject.mode === "front" && u(), n.css3DObject.mode === "behind" && O(this.five).then(() => u()); }; return v && c(), l(p({}, n), { render: v ? void 0 : c }); }); this.five = e; } /** @deprecated disposeAll() renamed as dispose() */ disposeAll() { return this.dispose(); } setState(...e) { const i = super.setState(...e); return this.five.needsRender = !0, i; } getBehindFiveElement() { return this.behindFiveContainer ? this.behindFiveContainer : (this.behindFiveContainer = P(this.five), this.behindFiveContainer); } /** * @description: 获取静态资源的url */ absoluteUrl(e) { return $(this.staticPrefix, e); } } export { h as PLUGIN_NAME, Y as default };