@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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@plasius/gpu-shared",
3
- "version": "0.1.2",
3
+ "version": "0.1.3",
4
4
  "description": "Shared browser-safe demo runtime and asset helpers for the Plasius gpu-* package family.",
5
5
  "type": "module",
6
6
  "sideEffects": false,
package/src/index.d.ts CHANGED
@@ -40,6 +40,7 @@ export interface MountGpuShowcaseResult {
40
40
  readonly state: Record<string, unknown>;
41
41
  readonly shipModel: GltfModel;
42
42
  readonly canvas: HTMLCanvasElement;
43
+ destroy(): void;
43
44
  }
44
45
 
45
46
  export const showcaseFocusModes: readonly ShowcaseFocusMode[];
@@ -1794,6 +1794,9 @@ function syncTextState(state, shipModel) {
1794
1794
  export async function mountGpuShowcase(options = {}) {
1795
1795
  injectStyles();
1796
1796
  const root = options.root ?? document.body;
1797
+ const previousMarkup = root.innerHTML;
1798
+ const previousRenderGameToText = window.render_game_to_text;
1799
+ const previousAdvanceTime = window.advanceTime;
1797
1800
  const focus = options.focus ?? new URLSearchParams(window.location.search).get("focus") ?? "integrated";
1798
1801
  const dom = buildDemoDom(root, {
1799
1802
  packageName: options.packageName ?? "@plasius/gpu-demo-viewer",
@@ -1813,7 +1816,14 @@ export async function mountGpuShowcase(options = {}) {
1813
1816
  syncTextState(state, shipModel);
1814
1817
 
1815
1818
  const ctx = dom.canvas.getContext("2d");
1819
+ let destroyed = false;
1820
+ let frameHandle = null;
1821
+
1816
1822
  const renderFrame = (nowMs) => {
1823
+ if (destroyed) {
1824
+ return;
1825
+ }
1826
+
1817
1827
  if (!state.paused) {
1818
1828
  if (state.lastTimeMs == null) {
1819
1829
  state.lastTimeMs = nowMs;
@@ -1831,29 +1841,59 @@ export async function mountGpuShowcase(options = {}) {
1831
1841
  state.demoDescription = resolveSceneDescription(state, options, shipModel).description;
1832
1842
  renderScene(ctx, dom.canvas, state, shipModel, dom);
1833
1843
  syncTextState(state, shipModel);
1834
- requestAnimationFrame(renderFrame);
1844
+ frameHandle = requestAnimationFrame(renderFrame);
1835
1845
  };
1836
1846
 
1837
- dom.pauseButton.addEventListener("click", () => {
1847
+ const handlePauseClick = () => {
1838
1848
  state.paused = !state.paused;
1839
1849
  dom.pauseButton.textContent = state.paused ? "Resume" : "Pause";
1840
- });
1841
- dom.stressToggle.addEventListener("change", () => {
1850
+ };
1851
+ const handleStressChange = () => {
1842
1852
  state.stress = dom.stressToggle.checked;
1843
- });
1844
- dom.focusMode.addEventListener("change", () => {
1853
+ };
1854
+ const handleFocusChange = () => {
1845
1855
  state.focus = dom.focusMode.value;
1846
1856
  Object.assign(state.camera, {
1847
1857
  ...CAMERA_PRESETS[state.focus],
1848
1858
  target: vec3(...CAMERA_PRESETS[state.focus].target),
1849
1859
  });
1850
- });
1860
+ };
1861
+
1862
+ dom.pauseButton.addEventListener("click", handlePauseClick);
1863
+ dom.stressToggle.addEventListener("change", handleStressChange);
1864
+ dom.focusMode.addEventListener("change", handleFocusChange);
1851
1865
 
1852
- requestAnimationFrame(renderFrame);
1866
+ frameHandle = requestAnimationFrame(renderFrame);
1853
1867
  return {
1854
1868
  state,
1855
1869
  shipModel,
1856
1870
  canvas: dom.canvas,
1871
+ destroy() {
1872
+ if (destroyed) {
1873
+ return;
1874
+ }
1875
+
1876
+ destroyed = true;
1877
+ if (frameHandle != null) {
1878
+ cancelAnimationFrame(frameHandle);
1879
+ }
1880
+ dom.pauseButton.removeEventListener("click", handlePauseClick);
1881
+ dom.stressToggle.removeEventListener("change", handleStressChange);
1882
+ dom.focusMode.removeEventListener("change", handleFocusChange);
1883
+ root.innerHTML = previousMarkup;
1884
+
1885
+ if (typeof previousRenderGameToText === "function") {
1886
+ window.render_game_to_text = previousRenderGameToText;
1887
+ } else {
1888
+ delete window.render_game_to_text;
1889
+ }
1890
+
1891
+ if (typeof previousAdvanceTime === "function") {
1892
+ window.advanceTime = previousAdvanceTime;
1893
+ } else {
1894
+ delete window.advanceTime;
1895
+ }
1896
+ },
1857
1897
  };
1858
1898
  }
1859
1899