@plasius/gpu-shared 0.1.2 → 0.1.3

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/dist/index.js CHANGED
@@ -18,7 +18,7 @@ async function loadGltfModel(url) {
18
18
  return module.loadGltfModel(url);
19
19
  }
20
20
  async function mountGpuShowcase(options = {}) {
21
- const runtimeLoader = typeof options.__runtimeLoader === "function" ? options.__runtimeLoader : () => import("./showcase-runtime-67CHJBNO.js");
21
+ const runtimeLoader = typeof options.__runtimeLoader === "function" ? options.__runtimeLoader : () => import("./showcase-runtime-V72XV55N.js");
22
22
  const module = await runtimeLoader();
23
23
  if (typeof module.mountGpuShowcase !== "function") {
24
24
  throw new Error("showcase runtime loader must provide mountGpuShowcase.");
@@ -7710,6 +7710,9 @@ function syncTextState(state, shipModel) {
7710
7710
  async function mountGpuShowcase(options = {}) {
7711
7711
  injectStyles();
7712
7712
  const root = options.root ?? document.body;
7713
+ const previousMarkup = root.innerHTML;
7714
+ const previousRenderGameToText = window.render_game_to_text;
7715
+ const previousAdvanceTime = window.advanceTime;
7713
7716
  const focus = options.focus ?? new URLSearchParams(window.location.search).get("focus") ?? "integrated";
7714
7717
  const dom = buildDemoDom(root, {
7715
7718
  packageName: options.packageName ?? "@plasius/gpu-demo-viewer",
@@ -7726,7 +7729,12 @@ async function mountGpuShowcase(options = {}) {
7726
7729
  state.demoDescription = resolveSceneDescription(state, options, shipModel).description;
7727
7730
  syncTextState(state, shipModel);
7728
7731
  const ctx = dom.canvas.getContext("2d");
7732
+ let destroyed = false;
7733
+ let frameHandle = null;
7729
7734
  const renderFrame = (nowMs) => {
7735
+ if (destroyed) {
7736
+ return;
7737
+ }
7730
7738
  if (!state.paused) {
7731
7739
  if (state.lastTimeMs == null) {
7732
7740
  state.lastTimeMs = nowMs;
@@ -7743,27 +7751,53 @@ async function mountGpuShowcase(options = {}) {
7743
7751
  state.demoDescription = resolveSceneDescription(state, options, shipModel).description;
7744
7752
  renderScene(ctx, dom.canvas, state, shipModel, dom);
7745
7753
  syncTextState(state, shipModel);
7746
- requestAnimationFrame(renderFrame);
7754
+ frameHandle = requestAnimationFrame(renderFrame);
7747
7755
  };
7748
- dom.pauseButton.addEventListener("click", () => {
7756
+ const handlePauseClick = () => {
7749
7757
  state.paused = !state.paused;
7750
7758
  dom.pauseButton.textContent = state.paused ? "Resume" : "Pause";
7751
- });
7752
- dom.stressToggle.addEventListener("change", () => {
7759
+ };
7760
+ const handleStressChange = () => {
7753
7761
  state.stress = dom.stressToggle.checked;
7754
- });
7755
- dom.focusMode.addEventListener("change", () => {
7762
+ };
7763
+ const handleFocusChange = () => {
7756
7764
  state.focus = dom.focusMode.value;
7757
7765
  Object.assign(state.camera, {
7758
7766
  ...CAMERA_PRESETS[state.focus],
7759
7767
  target: vec3(...CAMERA_PRESETS[state.focus].target)
7760
7768
  });
7761
- });
7762
- requestAnimationFrame(renderFrame);
7769
+ };
7770
+ dom.pauseButton.addEventListener("click", handlePauseClick);
7771
+ dom.stressToggle.addEventListener("change", handleStressChange);
7772
+ dom.focusMode.addEventListener("change", handleFocusChange);
7773
+ frameHandle = requestAnimationFrame(renderFrame);
7763
7774
  return {
7764
7775
  state,
7765
7776
  shipModel,
7766
- canvas: dom.canvas
7777
+ canvas: dom.canvas,
7778
+ destroy() {
7779
+ if (destroyed) {
7780
+ return;
7781
+ }
7782
+ destroyed = true;
7783
+ if (frameHandle != null) {
7784
+ cancelAnimationFrame(frameHandle);
7785
+ }
7786
+ dom.pauseButton.removeEventListener("click", handlePauseClick);
7787
+ dom.stressToggle.removeEventListener("change", handleStressChange);
7788
+ dom.focusMode.removeEventListener("change", handleFocusChange);
7789
+ root.innerHTML = previousMarkup;
7790
+ if (typeof previousRenderGameToText === "function") {
7791
+ window.render_game_to_text = previousRenderGameToText;
7792
+ } else {
7793
+ delete window.render_game_to_text;
7794
+ }
7795
+ if (typeof previousAdvanceTime === "function") {
7796
+ window.advanceTime = previousAdvanceTime;
7797
+ } else {
7798
+ delete window.advanceTime;
7799
+ }
7800
+ }
7767
7801
  };
7768
7802
  }
7769
7803
  function updatePhysicsSnapshot(state, shipModel) {
@@ -7791,4 +7825,4 @@ export {
7791
7825
  resolveShowcaseAssetUrl,
7792
7826
  showcaseFocusModes
7793
7827
  };
7794
- //# sourceMappingURL=showcase-runtime-67CHJBNO.js.map
7828
+ //# sourceMappingURL=showcase-runtime-V72XV55N.js.map