Krpano.js 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. import { __awaiter, __rest } from "tslib";
  2. import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
  3. import { useCallback, useEffect, useState } from "react";
  4. import { KrpanoActionProxy } from "../models";
  5. import { useMounted, useEventCallback } from "../hooks";
  6. import { CurrentSceneContext, KrpanoRendererContext } from "../contexts";
  7. import { buildKrpanoAction } from "../utils";
  8. import { WebVR } from "./WebVR";
  9. import { Action } from "./Action";
  10. import { Layer } from "./Layer";
  11. import { Events } from "./Events";
  12. export const Krpano = (_a) => {
  13. var { className, style, children, currentScene, target = "krpano", webvrUrl, webvrConfig, littlePlanetIntro, onReady } = _a, rest = __rest(_a, ["className", "style", "children", "currentScene", "target", "webvrUrl", "webvrConfig", "littlePlanetIntro", "onReady"]);
  14. const [renderer, setRenderer] = useState(null);
  15. const onReadyRef = useEventCallback(onReady);
  16. const onReadyCallback = useCallback((obj) => __awaiter(void 0, void 0, void 0, function* () {
  17. const krpano = new KrpanoActionProxy(obj);
  18. window[krpano.name] = krpano;
  19. krpano.littlePlanetIntro = littlePlanetIntro !== null && littlePlanetIntro !== void 0 ? littlePlanetIntro : false;
  20. setRenderer(krpano);
  21. if (onReadyRef.current) {
  22. onReadyRef.current(krpano);
  23. }
  24. }), [onReadyRef]);
  25. useEffect(() => {
  26. if (!renderer || !currentScene)
  27. return;
  28. renderer.tagAction.waitIncludeLoaded(true).then(() => {
  29. renderer.loadScene(currentScene);
  30. renderer.littlePlanetIntro &&
  31. renderer.call("skin_setup_littleplanetintro()");
  32. renderer.littlePlanetIntro = false;
  33. });
  34. }, [renderer, currentScene]);
  35. useEffect(() => {
  36. if (!renderer)
  37. return;
  38. reloadXML(renderer);
  39. }, [renderer]);
  40. const reloadXML = (krpano) => __awaiter(void 0, void 0, void 0, function* () {
  41. if (krpano.tagAction.syncTagStack.length) {
  42. // krpano 1.21 版本以下不支持动态插入 include,只能在文本中插入后重新加载
  43. const updateXmlString = new XMLSerializer().serializeToString(yield krpano.tagAction.createSyncTags());
  44. krpano.call(buildKrpanoAction("loadxml", updateXmlString));
  45. }
  46. krpano.tagAction.syncTagsLoaded = true;
  47. krpano.tagAction.queue.flushResolve(true);
  48. });
  49. const initKrpano = () => {
  50. const defaultConfig = {
  51. html5: "auto",
  52. xml: null,
  53. mobilescale: 1,
  54. };
  55. if (typeof window.embedpano === "function") {
  56. window.embedpano(Object.assign(Object.assign(Object.assign({}, defaultConfig), { target, onready: onReadyCallback }), rest));
  57. }
  58. else {
  59. throw new Error("Krpano required");
  60. }
  61. };
  62. const handleNewPano = () => {
  63. renderer === null || renderer === void 0 ? void 0 : renderer.set("layer[skin_loadingtext].visible", true);
  64. };
  65. const handleRemovePano = () => {
  66. renderer === null || renderer === void 0 ? void 0 : renderer.set("layer[skin_loadingtext].visible", true);
  67. };
  68. const handleLoadComplete = () => {
  69. setTimeout(() => {
  70. renderer === null || renderer === void 0 ? void 0 : renderer.set("layer[skin_loadingtext].visible", false);
  71. }, 200);
  72. };
  73. useMounted(() => {
  74. initKrpano();
  75. });
  76. return (_jsx(KrpanoRendererContext.Provider, { value: renderer, children: _jsxs(CurrentSceneContext.Provider, { value: currentScene || null, children: [webvrUrl && _jsx(WebVR, Object.assign({ url: webvrUrl }, webvrConfig)), _jsx("div", { id: target, className: className, style: style, children: renderer ? children : null }), _jsx(Events, { onNewPano: handleNewPano, onRemovePano: handleRemovePano, onLoadComplete: handleLoadComplete }), _jsx(Layer, { name: "skin_loadingtext", type: "text", align: "center", x: 5, y: -5, keep: true, html: "\u52A0\u8F7D\u4E2D...", visible: false, background: false, border: false, enabled: false, css: "color:#FFFFFF; font-family:Arial; text-align:center; font-style:italic; font-size:22px;" }), _jsx(Action, { name: "skin_setup_littleplanetintro", content: `
  77. copy(lp_scene, xml.scene);
  78. copy(lp_hlookat, view.hlookat);
  79. copy(lp_vlookat, view.vlookat);
  80. copy(lp_fov, view.fov);
  81. copy(lp_fovmax, view.fovmax);
  82. copy(lp_limitview, view.limitview);
  83. copy(lp_usercontrol, control.usercontrol);
  84. set(view.fovmax, 170);
  85. set(view.limitview, lookto);
  86. set(view.vlookatmin, 90);
  87. set(view.vlookatmax, 90);
  88. lookat(calc(lp_hlookat - 180), 90, 150, 1, 0, 0);
  89. set(events[lp_events].onloadcomplete,
  90. delayedcall(0.5,
  91. if(lp_scene === xml.scene,
  92. set(control.usercontrol, off);
  93. copy(view.limitview, lp_limitview);
  94. set(view.vlookatmin, null);
  95. set(view.vlookatmax, null);
  96. tween(view.hlookat|view.vlookat|view.fov|view.distortion, calc('' + lp_hlookat + '|' + lp_vlookat + '|' + lp_fov + '|' + 0.0),
  97. 3.0, easeOutQuad,
  98. set(control.usercontrol, get(lp_usercontrol));
  99. tween(view.fovmax, get(lp_fovmax));
  100. );
  101. );
  102. );
  103. );
  104. ` }), _jsx(Action, { name: "draggable_hotspot", content: `
  105. asyncloop(pressed, screentosphere(mouse.stagex, mouse.stagey, ath, atv); js(draggbleHotspotEvent(get(ath), get(atv))));
  106. ` })] }) }));
  107. };