layershift 0.2.1 → 0.3.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.
Files changed (38) hide show
  1. package/README.md +14 -0
  2. package/dist/components/layershift.js +1782 -653
  3. package/dist/npm/layershift.es.js +5212 -2583
  4. package/dist/types/components/layershift/layershift-element.d.ts +10 -8
  5. package/dist/types/components/layershift/layershift-element.d.ts.map +1 -1
  6. package/dist/types/components/layershift/lifecycle.d.ts +77 -0
  7. package/dist/types/components/layershift/lifecycle.d.ts.map +1 -0
  8. package/dist/types/components/layershift/portal-element.d.ts +10 -8
  9. package/dist/types/components/layershift/portal-element.d.ts.map +1 -1
  10. package/dist/types/components/layershift/types.d.ts +8 -0
  11. package/dist/types/components/layershift/types.d.ts.map +1 -1
  12. package/dist/types/gpu-backend.d.ts +37 -0
  13. package/dist/types/gpu-backend.d.ts.map +1 -0
  14. package/dist/types/jfa-distance-field.d.ts +78 -0
  15. package/dist/types/jfa-distance-field.d.ts.map +1 -0
  16. package/dist/types/parallax-renderer-webgpu.d.ts +103 -0
  17. package/dist/types/parallax-renderer-webgpu.d.ts.map +1 -0
  18. package/dist/types/parallax-renderer.d.ts +54 -91
  19. package/dist/types/parallax-renderer.d.ts.map +1 -1
  20. package/dist/types/portal-renderer-webgpu.d.ts +199 -0
  21. package/dist/types/portal-renderer-webgpu.d.ts.map +1 -0
  22. package/dist/types/portal-renderer.d.ts +64 -65
  23. package/dist/types/portal-renderer.d.ts.map +1 -1
  24. package/dist/types/precomputed-depth.d.ts +9 -51
  25. package/dist/types/precomputed-depth.d.ts.map +1 -1
  26. package/dist/types/quality.d.ts +95 -0
  27. package/dist/types/quality.d.ts.map +1 -0
  28. package/dist/types/render-pass-webgpu.d.ts +76 -0
  29. package/dist/types/render-pass-webgpu.d.ts.map +1 -0
  30. package/dist/types/render-pass.d.ts +171 -0
  31. package/dist/types/render-pass.d.ts.map +1 -0
  32. package/dist/types/renderer-base.d.ts +124 -0
  33. package/dist/types/renderer-base.d.ts.map +1 -0
  34. package/dist/types/webgl-utils.d.ts +29 -0
  35. package/dist/types/webgl-utils.d.ts.map +1 -0
  36. package/dist/types/webgpu-utils.d.ts +42 -0
  37. package/dist/types/webgpu-utils.d.ts.map +1 -0
  38. package/package.json +38 -4
@@ -12,18 +12,18 @@
12
12
  * depth-meta="depth-meta.json"
13
13
  * ></layershift-parallax>
14
14
  */
15
- export declare class LayershiftElement extends HTMLElement {
15
+ import type { ManagedElement } from './lifecycle';
16
+ export declare class LayershiftElement extends HTMLElement implements ManagedElement {
16
17
  static readonly TAG_NAME = "layershift-parallax";
17
18
  static get observedAttributes(): string[];
19
+ readonly reinitAttributes: string[];
18
20
  private shadow;
19
21
  private container;
20
22
  private renderer;
21
23
  private inputHandler;
22
- private depthWorker;
23
24
  private video;
24
- private initialized;
25
- private abortController;
26
25
  private loopCount;
26
+ private readonly lifecycle;
27
27
  constructor();
28
28
  private getAttrFloat;
29
29
  private getAttrBool;
@@ -31,6 +31,8 @@ export declare class LayershiftElement extends HTMLElement {
31
31
  private get parallaxY();
32
32
  private get parallaxMax();
33
33
  private get overscan();
34
+ private get quality();
35
+ private get gpuBackend();
34
36
  private get shouldAutoplay();
35
37
  private get shouldLoop();
36
38
  private get shouldMute();
@@ -47,10 +49,10 @@ export declare class LayershiftElement extends HTMLElement {
47
49
  private attachVideoEventListeners;
48
50
  connectedCallback(): void;
49
51
  disconnectedCallback(): void;
50
- attributeChangedCallback(_name: string, _oldVal: string | null, _newVal: string | null): void;
51
- private setupShadowDOM;
52
- private init;
52
+ attributeChangedCallback(name: string, oldVal: string | null, newVal: string | null): void;
53
+ setupShadowDOM(): void;
54
+ doInit(signal: AbortSignal): Promise<void>;
53
55
  private createVideoElement;
54
- private dispose;
56
+ doDispose(): void;
55
57
  }
56
58
  //# sourceMappingURL=layershift-element.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"layershift-element.d.ts","sourceRoot":"","sources":["../../../../src/components/layershift/layershift-element.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAoLH,qBAAa,iBAAkB,SAAQ,WAAW;IAChD,MAAM,CAAC,QAAQ,CAAC,QAAQ,yBAAyB;IAEjD,MAAM,KAAK,kBAAkB,IAAI,MAAM,EAAE,CAOxC;IAED,OAAO,CAAC,MAAM,CAAa;IAC3B,OAAO,CAAC,SAAS,CAA+B;IAChD,OAAO,CAAC,QAAQ,CAAiC;IACjD,OAAO,CAAC,YAAY,CAAsC;IAC1D,OAAO,CAAC,WAAW,CAAwC;IAC3D,OAAO,CAAC,KAAK,CAAiC;IAC9C,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,eAAe,CAAgC;IACvD,OAAO,CAAC,SAAS,CAAK;;IAStB,OAAO,CAAC,YAAY;IAOpB,OAAO,CAAC,WAAW;IASnB,OAAO,KAAK,SAAS,GAA0E;IAC/F,OAAO,KAAK,SAAS,GAA0E;IAC/F,OAAO,KAAK,WAAW,GAA8E;IACrG,OAAO,KAAK,QAAQ,GAAuE;IAC3F,OAAO,KAAK,cAAc,GAAuE;IACjG,OAAO,KAAK,UAAU,GAA+D;IACrF,OAAO,KAAK,UAAU,GAAiE;IAIvF;;;;OAIG;IACH,OAAO,CAAC,IAAI;IAUZ;;;OAGG;IACH,OAAO,CAAC,yBAAyB;IA2BjC,iBAAiB,IAAI,IAAI;IAKzB,oBAAoB,IAAI,IAAI;IAI5B,wBAAwB,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI;IAgB7F,OAAO,CAAC,cAAc;YAkCR,IAAI;YAsJJ,kBAAkB;IAuChC,OAAO,CAAC,OAAO;CAyBhB"}
1
+ {"version":3,"file":"layershift-element.d.ts","sourceRoot":"","sources":["../../../../src/components/layershift/layershift-element.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAoBH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAkKlD,qBAAa,iBAAkB,SAAQ,WAAY,YAAW,cAAc;IAC1E,MAAM,CAAC,QAAQ,CAAC,QAAQ,yBAAyB;IAEjD,MAAM,KAAK,kBAAkB,IAAI,MAAM,EAAE,CAOxC;IAED,QAAQ,CAAC,gBAAgB,WAAsC;IAE/D,OAAO,CAAC,MAAM,CAAa;IAC3B,OAAO,CAAC,SAAS,CAA+B;IAChD,OAAO,CAAC,QAAQ,CAA0D;IAC1E,OAAO,CAAC,YAAY,CAAsC;IAC1D,OAAO,CAAC,KAAK,CAAiC;IAC9C,OAAO,CAAC,SAAS,CAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAmB;;IAU7C,OAAO,CAAC,YAAY;IAOpB,OAAO,CAAC,WAAW;IASnB,OAAO,KAAK,SAAS,GAA0E;IAC/F,OAAO,KAAK,SAAS,GAA0E;IAC/F,OAAO,KAAK,WAAW,GAA8E;IACrG,OAAO,KAAK,QAAQ,GAAuE;IAC3F,OAAO,KAAK,OAAO,GAIlB;IACD,OAAO,KAAK,UAAU,GAIrB;IACD,OAAO,KAAK,cAAc,GAAuE;IACjG,OAAO,KAAK,UAAU,GAA+D;IACrF,OAAO,KAAK,UAAU,GAAiE;IAIvF;;;;OAIG;IACH,OAAO,CAAC,IAAI;IAUZ;;;OAGG;IACH,OAAO,CAAC,yBAAyB;IA2BjC,iBAAiB,IAAI,IAAI;IAIzB,oBAAoB,IAAI,IAAI;IAI5B,wBAAwB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI;IAM1F,cAAc,IAAI,IAAI;IAkChB,MAAM,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;YA6IlC,kBAAkB;IAuChC,SAAS,IAAI,IAAI;CAmBlB"}
@@ -0,0 +1,77 @@
1
+ /**
2
+ * Shared lifecycle management for Layershift Web Components.
3
+ *
4
+ * Solves the fundamental tension between Custom Element lifecycle callbacks
5
+ * (synchronous, DOM-driven) and React 19's rendering model (asynchronous
6
+ * attribute setting via useEffect, Strict Mode double-invoke).
7
+ *
8
+ * ## Problems solved:
9
+ *
10
+ * 1. **Premature init**: `connectedCallback` fires before React sets attrs
11
+ * via `useEffect`. The element must NOT init until all required attrs exist.
12
+ *
13
+ * 2. **Concurrent inits**: Multiple `attributeChangedCallback` calls during
14
+ * a single React render cycle can each trigger `init()`. Without a guard,
15
+ * multiple async inits run concurrently, each creating WebGL contexts.
16
+ *
17
+ * 3. **Stale abort controller**: React Strict Mode unmount calls `dispose()`,
18
+ * nulling the abort controller. But the first init's Promise.all is still
19
+ * in flight. When it resumes, it checks `this.abortController` which now
20
+ * points to a NEW controller from the second init — the check passes
21
+ * incorrectly. Fix: per-invocation abort tokens.
22
+ *
23
+ * 4. **WebGL context leaks**: Renderers create WebGL contexts but `dispose()`
24
+ * never explicitly releases them. Orphaned contexts accumulate until the
25
+ * browser forcibly evicts the oldest, causing GL_INVALID_FRAMEBUFFER errors.
26
+ * Fix: explicit `WEBGL_lose_context.loseContext()` + canvas removal.
27
+ *
28
+ * 5. **Duplicate init on same-value setAttribute**: React Strict Mode
29
+ * remount sets the same attribute values, triggering `attributeChangedCallback`
30
+ * even though nothing changed. Fix: early return when oldVal === newVal.
31
+ */
32
+ /**
33
+ * Interface that Layershift elements must implement to use the lifecycle
34
+ * manager. The lifecycle manager calls these methods at the right time.
35
+ */
36
+ export interface ManagedElement {
37
+ /** The attributes that trigger re-initialization when changed. */
38
+ readonly reinitAttributes: string[];
39
+ /** Set up the Shadow DOM structure (style + container). */
40
+ setupShadowDOM(): void;
41
+ /**
42
+ * The actual initialization logic. Receives a per-invocation AbortSignal
43
+ * that the element MUST check after every async operation. If the signal
44
+ * is aborted, clean up partial state and return.
45
+ */
46
+ doInit(signal: AbortSignal): Promise<void>;
47
+ /**
48
+ * Clean up all resources: renderers, workers, video elements, etc.
49
+ * Called by the lifecycle manager before re-init and on disconnect.
50
+ * Does NOT need to handle the abort controller — the manager owns that.
51
+ */
52
+ doDispose(): void;
53
+ }
54
+ /**
55
+ * Lifecycle state managed on behalf of the element. Attached as a private
56
+ * field on each element instance.
57
+ */
58
+ export declare class LifecycleManager {
59
+ private abortController;
60
+ private initialized;
61
+ private initializing;
62
+ private element;
63
+ constructor(element: HTMLElement & ManagedElement);
64
+ onConnected(): void;
65
+ onDisconnected(): void;
66
+ onAttributeChanged(name: string, oldVal: string | null, newVal: string | null): void;
67
+ get isInitialized(): boolean;
68
+ markInitialized(): void;
69
+ private tryInit;
70
+ private cancelInit;
71
+ }
72
+ /**
73
+ * Release a WebGL context explicitly to free GPU resources.
74
+ * Call this in renderer dispose() methods.
75
+ */
76
+ export declare function releaseWebGLContext(gl: WebGL2RenderingContext | WebGLRenderingContext | null): void;
77
+ //# sourceMappingURL=lifecycle.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lifecycle.d.ts","sourceRoot":"","sources":["../../../../src/components/layershift/lifecycle.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AAEH;;;GAGG;AACH,MAAM,WAAW,cAAc;IAC7B,kEAAkE;IAClE,QAAQ,CAAC,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAEpC,2DAA2D;IAC3D,cAAc,IAAI,IAAI,CAAC;IAEvB;;;;OAIG;IACH,MAAM,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAE3C;;;;OAIG;IACH,SAAS,IAAI,IAAI,CAAC;CACnB;AAED;;;GAGG;AACH,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,eAAe,CAAgC;IACvD,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,OAAO,CAA+B;gBAElC,OAAO,EAAE,WAAW,GAAG,cAAc;IAMjD,WAAW,IAAI,IAAI;IAKnB,cAAc,IAAI,IAAI;IAMtB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI;IAepF,IAAI,aAAa,IAAI,OAAO,CAE3B;IAED,eAAe,IAAI,IAAI;YAOT,OAAO;IA4BrB,OAAO,CAAC,UAAU;CAKnB;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,EAAE,EAAE,sBAAsB,GAAG,qBAAqB,GAAG,IAAI,GAAG,IAAI,CAInG"}
@@ -14,19 +14,19 @@
14
14
  * logo-src="logo.svg"
15
15
  * ></layershift-portal>
16
16
  */
17
- export declare class LayershiftPortalElement extends HTMLElement {
17
+ import type { ManagedElement } from './lifecycle';
18
+ export declare class LayershiftPortalElement extends HTMLElement implements ManagedElement {
18
19
  static readonly TAG_NAME = "layershift-portal";
19
20
  static get observedAttributes(): string[];
21
+ readonly reinitAttributes: string[];
20
22
  private shadow;
21
23
  private container;
22
24
  private renderer;
23
25
  private inputHandler;
24
- private depthWorker;
25
26
  private video;
26
27
  private mesh;
27
- private initialized;
28
- private abortController;
29
28
  private loopCount;
29
+ private readonly lifecycle;
30
30
  constructor();
31
31
  private getAttrFloat;
32
32
  private getAttrBool;
@@ -37,6 +37,8 @@ export declare class LayershiftPortalElement extends HTMLElement {
37
37
  private get parallaxMax();
38
38
  private get overscan();
39
39
  private get pomSteps();
40
+ private get quality();
41
+ private get gpuBackend();
40
42
  private get rimIntensity();
41
43
  private get rimWidth();
42
44
  private get rimColor();
@@ -79,10 +81,10 @@ export declare class LayershiftPortalElement extends HTMLElement {
79
81
  private attachVideoEventListeners;
80
82
  connectedCallback(): void;
81
83
  disconnectedCallback(): void;
82
- attributeChangedCallback(_name: string, _oldVal: string | null, _newVal: string | null): void;
83
- private setupShadowDOM;
84
- private init;
84
+ attributeChangedCallback(name: string, oldVal: string | null, newVal: string | null): void;
85
+ setupShadowDOM(): void;
86
+ doInit(signal: AbortSignal): Promise<void>;
85
87
  private createVideoElement;
86
- private dispose;
88
+ doDispose(): void;
87
89
  }
88
90
  //# sourceMappingURL=portal-element.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"portal-element.d.ts","sourceRoot":"","sources":["../../../../src/components/layershift/portal-element.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAqNH,qBAAa,uBAAwB,SAAQ,WAAW;IACtD,MAAM,CAAC,QAAQ,CAAC,QAAQ,uBAAuB;IAE/C,MAAM,KAAK,kBAAkB,IAAI,MAAM,EAAE,CAmBxC;IAED,OAAO,CAAC,MAAM,CAAa;IAC3B,OAAO,CAAC,SAAS,CAA+B;IAChD,OAAO,CAAC,QAAQ,CAA+B;IAC/C,OAAO,CAAC,YAAY,CAAsC;IAC1D,OAAO,CAAC,WAAW,CAAwC;IAC3D,OAAO,CAAC,KAAK,CAAiC;IAC9C,OAAO,CAAC,IAAI,CAA0B;IACtC,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,eAAe,CAAgC;IACvD,OAAO,CAAC,SAAS,CAAK;;IAStB,OAAO,CAAC,YAAY;IAOpB,OAAO,CAAC,WAAW;IAOnB,OAAO,CAAC,YAAY;IAKpB,OAAO,CAAC,WAAW;IAUnB,OAAO,KAAK,SAAS,GAA0E;IAC/F,OAAO,KAAK,SAAS,GAA0E;IAC/F,OAAO,KAAK,WAAW,GAA8E;IACrG,OAAO,KAAK,QAAQ,GAAuE;IAC3F,OAAO,KAAK,QAAQ,GAAwE;IAE5F,OAAO,KAAK,YAAY,GAAgF;IACxG,OAAO,KAAK,QAAQ,GAAwE;IAC5F,OAAO,KAAK,QAAQ,GAA0F;IAC9G,OAAO,KAAK,kBAAkB,GAA4F;IAC1H,OAAO,KAAK,iBAAiB,GAA0F;IACvH,OAAO,KAAK,kBAAkB,GAA4F;IAE1H,OAAO,KAAK,UAAU,GAA4E;IAClG,OAAO,KAAK,UAAU,GAA4E;IAClG,OAAO,KAAK,SAAS,GAA0E;IAE/F,OAAO,KAAK,UAAU,GAA4E;IAClG,OAAO,KAAK,QAAQ,GAA0F;IAC9G,OAAO,KAAK,UAAU,GAA4E;IAClG,OAAO,KAAK,cAAc,GAAoF;IAE9G,OAAO,KAAK,WAAW,GAA8E;IACrG,OAAO,KAAK,YAAY,GAAgF;IACxG,OAAO,KAAK,iBAAiB,GAA0F;IACvH,OAAO,KAAK,QAAQ,GAAwE;IAC5F,OAAO,KAAK,WAAW,GAA8E;IAErG,OAAO,KAAK,cAAc,GAAoF;IAC9G,OAAO,KAAK,UAAU,GAA4E;IAClG,OAAO,KAAK,cAAc,GAAoF;IAC9G,OAAO,KAAK,iBAAiB,GAA0F;IACvH,OAAO,KAAK,eAAe,GAAuF;IAElH,OAAO,KAAK,aAAa,GAAkF;IAC3G,OAAO,KAAK,YAAY,GAAgF;IACxG,OAAO,KAAK,SAAS,GAA4F;IAEjH,OAAO,KAAK,YAAY,GAAgF;IACxG,OAAO,KAAK,YAAY,GAAgF;IACxG,OAAO,KAAK,YAAY,GAAkG;IAC1H,OAAO,KAAK,cAAc,GAAoF;IAC9G,OAAO,KAAK,eAAe,GAAsF;IACjH,OAAO,KAAK,gBAAgB,GAAwF;IAEpH,OAAO,KAAK,kBAAkB,GAA6F;IAC3H,OAAO,KAAK,qBAAqB,GAAmG;IACpI,OAAO,KAAK,eAAe,GAAqG;IAChI,OAAO,KAAK,cAAc,GAAuE;IACjG,OAAO,KAAK,UAAU,GAA+D;IACrF,OAAO,KAAK,UAAU,GAAiE;IAIvF,OAAO,CAAC,IAAI;IAUZ,OAAO,CAAC,yBAAyB;IAyBjC,iBAAiB,IAAI,IAAI;IAKzB,oBAAoB,IAAI,IAAI;IAI5B,wBAAwB,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI;IAqB7F,OAAO,CAAC,cAAc;YAkCR,IAAI;YAiKJ,kBAAkB;IAsChC,OAAO,CAAC,OAAO;CA0BhB"}
1
+ {"version":3,"file":"portal-element.d.ts","sourceRoot":"","sources":["../../../../src/components/layershift/portal-element.ts"],"names":[],"mappings":"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"}
@@ -7,6 +7,10 @@ export interface LayershiftProps {
7
7
  parallaxMax?: number;
8
8
  layers?: number;
9
9
  overscan?: number;
10
+ /** Adaptive quality tier ('auto' | 'high' | 'medium' | 'low'). */
11
+ quality?: 'auto' | 'high' | 'medium' | 'low';
12
+ /** GPU backend preference ('auto' | 'webgpu' | 'webgl2'). Default: 'auto'. */
13
+ gpuBackend?: 'auto' | 'webgpu' | 'webgl2';
10
14
  autoplay?: boolean;
11
15
  loop?: boolean;
12
16
  muted?: boolean;
@@ -74,6 +78,10 @@ export interface LayershiftPortalProps {
74
78
  overscan?: number;
75
79
  /** POM ray-march step count for interior displacement. */
76
80
  pomSteps?: number;
81
+ /** Adaptive quality tier ('auto' | 'high' | 'medium' | 'low'). */
82
+ quality?: 'auto' | 'high' | 'medium' | 'low';
83
+ /** GPU backend preference ('auto' | 'webgpu' | 'webgl2'). Default: 'auto'. */
84
+ gpuBackend?: 'auto' | 'webgpu' | 'webgl2';
77
85
  rimIntensity?: number;
78
86
  rimColor?: string;
79
87
  rimWidth?: number;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/components/layershift/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/components/layershift/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,eAAe;IAC9B,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,kEAAkE;IAClE,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;IAC7C,8EAA8E;IAC9E,UAAU,CAAC,EAAE,MAAM,GAAG,QAAQ,GAAG,QAAQ,CAAC;IAC1C,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAChC;AAMD,8DAA8D;AAC9D,MAAM,WAAW,qBAAqB;IACpC,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,qEAAqE;IACrE,YAAY,CAAC,EAAE,OAAO,sBAAsB,EAAE,YAAY,CAAC;IAC3D,qFAAqF;IACrF,aAAa,CAAC,EAAE,OAAO,sBAAsB,EAAE,qBAAqB,CAAC;CACtE;AAED,uCAAuC;AACvC,MAAM,WAAW,oBAAoB;IACnC,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,+BAA+B;AAC/B,MAAM,WAAW,qBAAqB;IACpC,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,4CAA4C;AAC5C,MAAM,WAAW,oBAAoB;IACnC,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,oFAAoF;AACpF,MAAM,WAAW,qBAAqB;IACpC,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,sCAAsC;AACtC,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;;;;;;;;GASG;AACH,MAAM,WAAW,kBAAkB;IACjC,2BAA2B,EAAE,WAAW,CAAC,qBAAqB,CAAC,CAAC;IAChE,0BAA0B,EAAE,WAAW,CAAC,oBAAoB,CAAC,CAAC;IAC9D,2BAA2B,EAAE,WAAW,CAAC,qBAAqB,CAAC,CAAC;IAChE,0BAA0B,EAAE,WAAW,CAAC,oBAAoB,CAAC,CAAC;IAC9D,2BAA2B,EAAE,WAAW,CAAC,qBAAqB,CAAC,CAAC;IAChE,2BAA2B,EAAE,WAAW,CAAC,qBAAqB,CAAC,CAAC;CACjE;AAMD,uDAAuD;AACvD,MAAM,WAAW,qBAAqB;IACpC,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAEhB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,0DAA0D;IAC1D,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,kEAAkE;IAClE,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;IAC7C,8EAA8E;IAC9E,UAAU,CAAC,EAAE,MAAM,GAAG,QAAQ,GAAG,QAAQ,CAAC;IAE1C,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,sCAAsC;IACtC,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,iCAAiC;IACjC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,sCAAsC;IACtC,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAE5B,2CAA2C;IAC3C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,gCAAgC;IAChC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,yCAAyC;IACzC,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB,4BAA4B;IAC5B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,uCAAuC;IACvC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,qCAAqC;IACrC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,kCAAkC;IAClC,cAAc,CAAC,EAAE,MAAM,CAAC;IAExB,gCAAgC;IAChC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,iCAAiC;IACjC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,0CAA0C;IAC1C,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,qCAAqC;IACrC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,oCAAoC;IACpC,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB,+BAA+B;IAC/B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,kDAAkD;IAClD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,+BAA+B;IAC/B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,kCAAkC;IAClC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,wCAAwC;IACxC,eAAe,CAAC,EAAE,MAAM,CAAC;IAEzB,sCAAsC;IACtC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,oCAAoC;IACpC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,yCAAyC;IACzC,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB,gEAAgE;IAChE,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,8DAA8D;IAC9D,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,uCAAuC;IACvC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,mCAAmC;IACnC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,4CAA4C;IAC5C,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,6CAA6C;IAC7C,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAE1B,iCAAiC;IACjC,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,oDAAoD;IACpD,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,4CAA4C;IAC5C,cAAc,CAAC,EAAE,MAAM,CAAC;IAExB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAChC;AAMD,qEAAqE;AACrE,MAAM,WAAW,2BAA2B;IAC1C,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,8CAA8C;AAC9C,MAAM,WAAW,0BAA0B;IACzC,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,sCAAsC;AACtC,MAAM,WAAW,2BAA2B;IAC1C,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,mDAAmD;AACnD,MAAM,WAAW,0BAA0B;IACzC,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,4CAA4C;AAC5C,MAAM,WAAW,2BAA2B;IAC1C,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,6CAA6C;AAC7C,MAAM,WAAW,2BAA2B;IAC1C,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;;;;;;;;GASG;AACH,MAAM,WAAW,wBAAwB;IACvC,yBAAyB,EAAE,WAAW,CAAC,2BAA2B,CAAC,CAAC;IACpE,wBAAwB,EAAE,WAAW,CAAC,0BAA0B,CAAC,CAAC;IAClE,yBAAyB,EAAE,WAAW,CAAC,2BAA2B,CAAC,CAAC;IACpE,wBAAwB,EAAE,WAAW,CAAC,0BAA0B,CAAC,CAAC;IAClE,yBAAyB,EAAE,WAAW,CAAC,2BAA2B,CAAC,CAAC;IACpE,yBAAyB,EAAE,WAAW,CAAC,2BAA2B,CAAC,CAAC;CACrE"}
@@ -0,0 +1,37 @@
1
+ /**
2
+ * GPU Backend Detection — WebGPU / WebGL2 feature detection and selection.
3
+ *
4
+ * Provides async detection with a timeout to gracefully fall back to WebGL2
5
+ * when WebGPU is unavailable or adapter request hangs.
6
+ *
7
+ * Default behavior: auto-detect. WebGPU is used when available, WebGL2 fallback.
8
+ * The `gpu-backend` attribute on Web Components is an optional escape hatch.
9
+ */
10
+ export type GPUBackendType = 'webgpu' | 'webgl2';
11
+ export interface GPUBackendInfo {
12
+ readonly type: GPUBackendType;
13
+ /** Present only when type === 'webgpu'. */
14
+ readonly adapter?: GPUAdapter;
15
+ /** Present only when type === 'webgpu'. */
16
+ readonly device?: GPUDevice;
17
+ }
18
+ /**
19
+ * Synchronous check for WebGPU API availability.
20
+ *
21
+ * Returns true if `navigator.gpu` exists. Does NOT request an adapter,
22
+ * so this cannot confirm actual WebGPU support — use `detectGPUBackend()`
23
+ * for a definitive answer.
24
+ */
25
+ export declare function isWebGPUAvailable(): boolean;
26
+ /**
27
+ * Detect the best available GPU backend.
28
+ *
29
+ * 1. If `preference` is 'webgl2', returns WebGL2 immediately.
30
+ * 2. If `preference` is 'webgpu', attempts WebGPU and throws on failure.
31
+ * 3. If `preference` is 'auto' (default), tries WebGPU with a timeout
32
+ * and falls back to WebGL2 silently on any failure.
33
+ *
34
+ * @param preference - 'webgpu' | 'webgl2' | 'auto' (default: 'auto')
35
+ */
36
+ export declare function detectGPUBackend(preference?: 'webgpu' | 'webgl2' | 'auto'): Promise<GPUBackendInfo>;
37
+ //# sourceMappingURL=gpu-backend.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gpu-backend.d.ts","sourceRoot":"","sources":["../../src/gpu-backend.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAMH,MAAM,MAAM,cAAc,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAEjD,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAC;IAC9B,2CAA2C;IAC3C,QAAQ,CAAC,OAAO,CAAC,EAAE,UAAU,CAAC;IAC9B,2CAA2C;IAC3C,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,CAAC;CAC7B;AAaD;;;;;;GAMG;AACH,wBAAgB,iBAAiB,IAAI,OAAO,CAE3C;AAMD;;;;;;;;;GASG;AACH,wBAAsB,gBAAgB,CACpC,UAAU,GAAE,QAAQ,GAAG,QAAQ,GAAG,MAAe,GAChD,OAAO,CAAC,cAAc,CAAC,CAqCzB"}
@@ -0,0 +1,78 @@
1
+ /**
2
+ * JFA Distance Field — Jump Flood Algorithm for screen-space distance fields.
3
+ *
4
+ * Computes a distance field from a binary mask (e.g., logo silhouette) using:
5
+ * 1. Edge seed extraction from the mask
6
+ * 2. Jump Flood iterations to propagate nearest-seed info
7
+ * 3. Distance conversion to a normalized scalar field
8
+ *
9
+ * Extracted from PortalRenderer to share orchestration logic between
10
+ * WebGL2 and WebGPU backends.
11
+ */
12
+ import type { RenderPass } from './render-pass';
13
+ /** Parameters for computing the distance field each frame. */
14
+ export interface JFAComputeParams {
15
+ /** Mask shader pass (renders logo mesh to binary mask). */
16
+ maskPass: RenderPass;
17
+ /** JFA seed extraction pass. */
18
+ seedPass: RenderPass;
19
+ /** JFA flood iteration pass. */
20
+ floodPass: RenderPass;
21
+ /** JFA distance conversion pass. */
22
+ distPass: RenderPass;
23
+ /** VAO for the logo mesh (used in mask rendering). */
24
+ maskVao: WebGLVertexArrayObject;
25
+ /** Fullscreen quad VAO (used for seed/flood/dist passes). */
26
+ quadVao: WebGLVertexArrayObject;
27
+ /** Mesh scale X in NDC. */
28
+ meshScaleX: number;
29
+ /** Mesh scale Y in NDC. */
30
+ meshScaleY: number;
31
+ /** Number of triangulated indices in the logo mesh. */
32
+ stencilIndexCount: number;
33
+ /** Maximum distance range for normalization (max of bevelWidth, edgeOcclusionWidth). */
34
+ distRange: number;
35
+ }
36
+ export declare class JFADistanceField {
37
+ private readonly gl;
38
+ private readonly hasColorBufferFloat;
39
+ private maskFbo;
40
+ private maskTex;
41
+ private pingFbo;
42
+ private pingTex;
43
+ private pongFbo;
44
+ private pongTex;
45
+ private distFbo;
46
+ private distTex;
47
+ private _width;
48
+ private _height;
49
+ private _dirty;
50
+ constructor(gl: WebGL2RenderingContext, hasColorBufferFloat: boolean);
51
+ get width(): number;
52
+ get height(): number;
53
+ get isDirty(): boolean;
54
+ get distanceTexture(): WebGLTexture | null;
55
+ get maskTexture(): WebGLTexture | null;
56
+ markDirty(): void;
57
+ /**
58
+ * Create (or recreate) all JFA FBO/texture resources at the given canvas
59
+ * dimensions, divided by the quality tier's JFA divisor.
60
+ */
61
+ createResources(canvasWidth: number, canvasHeight: number, jfaDivisor: number): void;
62
+ /**
63
+ * Compute the distance field from the logo mask.
64
+ *
65
+ * Pipeline: mask render → seed extraction → JFA flood → distance conversion.
66
+ * After completion, `distanceTexture` holds the result and `isDirty` is false.
67
+ *
68
+ * The caller is responsible for restoring the viewport after this call.
69
+ */
70
+ compute(params: JFAComputeParams): void;
71
+ /**
72
+ * Compute the sequence of JFA step sizes for the given resolution.
73
+ * Steps halve from ceil(maxDim/2) down to 1.
74
+ */
75
+ static computeFloodIterations(width: number, height: number): number[];
76
+ dispose(): void;
77
+ }
78
+ //# sourceMappingURL=jfa-distance-field.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jfa-distance-field.d.ts","sourceRoot":"","sources":["../../src/jfa-distance-field.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAMhD,8DAA8D;AAC9D,MAAM,WAAW,gBAAgB;IAC/B,2DAA2D;IAC3D,QAAQ,EAAE,UAAU,CAAC;IACrB,gCAAgC;IAChC,QAAQ,EAAE,UAAU,CAAC;IACrB,gCAAgC;IAChC,SAAS,EAAE,UAAU,CAAC;IACtB,oCAAoC;IACpC,QAAQ,EAAE,UAAU,CAAC;IACrB,sDAAsD;IACtD,OAAO,EAAE,sBAAsB,CAAC;IAChC,6DAA6D;IAC7D,OAAO,EAAE,sBAAsB,CAAC;IAChC,2BAA2B;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,2BAA2B;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,uDAAuD;IACvD,iBAAiB,EAAE,MAAM,CAAC;IAC1B,wFAAwF;IACxF,SAAS,EAAE,MAAM,CAAC;CACnB;AAMD,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAyB;IAC5C,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAU;IAG9C,OAAO,CAAC,OAAO,CAAiC;IAChD,OAAO,CAAC,OAAO,CAA6B;IAC5C,OAAO,CAAC,OAAO,CAAiC;IAChD,OAAO,CAAC,OAAO,CAA6B;IAC5C,OAAO,CAAC,OAAO,CAAiC;IAChD,OAAO,CAAC,OAAO,CAA6B;IAC5C,OAAO,CAAC,OAAO,CAAiC;IAChD,OAAO,CAAC,OAAO,CAA6B;IAG5C,OAAO,CAAC,MAAM,CAAK;IACnB,OAAO,CAAC,OAAO,CAAK;IACpB,OAAO,CAAC,MAAM,CAAQ;gBAEV,EAAE,EAAE,sBAAsB,EAAE,mBAAmB,EAAE,OAAO;IAOpE,IAAI,KAAK,IAAI,MAAM,CAAwB;IAC3C,IAAI,MAAM,IAAI,MAAM,CAAyB;IAC7C,IAAI,OAAO,IAAI,OAAO,CAAwB;IAC9C,IAAI,eAAe,IAAI,YAAY,GAAG,IAAI,CAAyB;IACnE,IAAI,WAAW,IAAI,YAAY,GAAG,IAAI,CAAyB;IAE/D,SAAS,IAAI,IAAI;IAMjB;;;OAGG;IACH,eAAe,CAAC,WAAW,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI;IA6CpF;;;;;;;OAOG;IACH,OAAO,CAAC,MAAM,EAAE,gBAAgB,GAAG,IAAI;IAoGvC;;;OAGG;IACH,MAAM,CAAC,sBAAsB,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE;IAetE,OAAO,IAAI,IAAI;CAchB"}
@@ -0,0 +1,103 @@
1
+ /**
2
+ * Parallax Renderer (WebGPU) — GPU-accelerated depth-aware video parallax.
3
+ *
4
+ * WebGPU counterpart to `parallax-renderer.ts` (WebGL2). Shares the same
5
+ * `RendererBase` abstract base class and `ParallaxRendererConfig` interface.
6
+ *
7
+ * ## Pipeline
8
+ *
9
+ * 1. **Bilateral filter pass** — edge-preserving depth smoothing.
10
+ * Reads raw depth, writes filtered depth to offscreen r8unorm texture.
11
+ * Runs at RVFC rate (~5fps, only when depth data changes).
12
+ *
13
+ * 2. **Parallax pass** — per-pixel depth-based displacement.
14
+ * Reads video + filtered depth, renders to canvas swap chain texture.
15
+ * Runs at RAF rate (60-120fps).
16
+ *
17
+ * ## Key differences from WebGL2 version
18
+ *
19
+ * - Pipeline state objects bake all config at creation time
20
+ * - Bind groups replace individual uniform calls
21
+ * - Override constants replace #define injection
22
+ * - `copyExternalImageToTexture` for zero-copy video frame import
23
+ * - `writeTexture` for depth data upload
24
+ */
25
+ import { RendererBase } from './renderer-base';
26
+ import type { ParallaxRendererConfig } from './parallax-renderer';
27
+ export declare class ParallaxRendererWebGPU extends RendererBase {
28
+ private device;
29
+ private context;
30
+ private canvasFormat;
31
+ private readonly config;
32
+ private quadBuffer;
33
+ private linearSampler;
34
+ private bilateralPipeline;
35
+ private bilateralBindGroupLayout;
36
+ private bilateralUniformBuffer;
37
+ private bilateralBindGroup;
38
+ private rawDepthTexture;
39
+ private rawDepthView;
40
+ private filteredDepthTexture;
41
+ private filteredDepthView;
42
+ private parallaxPipeline;
43
+ private parallaxBindGroupLayout;
44
+ private vertexUniformBuffer;
45
+ private fragmentUniformBuffer;
46
+ private parallaxBindGroup;
47
+ private videoTexture;
48
+ private videoTextureView;
49
+ private readonly offsetData;
50
+ private depthFlipBuffer;
51
+ constructor(parent: HTMLElement, config: ParallaxRendererConfig, device: GPUDevice, adapterInfo: GPUAdapterInfo);
52
+ /**
53
+ * Set up textures, write static uniforms, and build bind groups.
54
+ *
55
+ * Call this once after the video element and depth data are loaded.
56
+ */
57
+ initialize(video: HTMLVideoElement, depthWidth: number, depthHeight: number): void;
58
+ private createBilateralPipeline;
59
+ private createParallaxPipeline;
60
+ private rebuildBilateralBindGroup;
61
+ private rebuildParallaxBindGroup;
62
+ /** Write all static (non per-frame) fragment uniforms. */
63
+ private writeStaticFragmentUniforms;
64
+ /**
65
+ * Flip depth data vertically to match video orientation.
66
+ *
67
+ * WebGPU `writeTexture` has no equivalent to WebGL's `UNPACK_FLIP_Y_WEBGL`.
68
+ * Video frames are imported with `flipY: true` via `copyExternalImageToTexture`,
69
+ * so depth data must also be flipped to maintain spatial alignment.
70
+ */
71
+ private flipDepthY;
72
+ /**
73
+ * Main render loop — called every animation frame at display refresh rate.
74
+ *
75
+ * 1. Upload current video frame to GPU texture.
76
+ * 2. Update parallax offset from input (buttery smooth at RAF rate).
77
+ * 3. Render fullscreen quad with parallax shader to canvas.
78
+ */
79
+ protected onRenderFrame(): void;
80
+ /**
81
+ * Upload raw depth data and run the bilateral filter pass.
82
+ *
83
+ * Runs at RVFC rate (~5fps) when supported, or every RAF frame otherwise.
84
+ */
85
+ protected onDepthUpdate(timeSec: number): void;
86
+ /**
87
+ * Recalculate canvas size and UV transform to match current container.
88
+ */
89
+ protected recalculateViewportLayout(): void;
90
+ /** Release all GPU resources. */
91
+ protected disposeRenderer(): void;
92
+ /**
93
+ * WebGPU device loss recovery.
94
+ *
95
+ * Device loss is handled via the `device.lost` promise (set in constructor).
96
+ * Full recovery requires re-requesting adapter + device, which is managed
97
+ * at the Web Component level by re-creating the renderer.
98
+ */
99
+ protected onContextRestored(): void;
100
+ /** Destroy all textures and clear bind groups that reference them. */
101
+ private disposeTextures;
102
+ }
103
+ //# sourceMappingURL=parallax-renderer-webgpu.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parallax-renderer-webgpu.d.ts","sourceRoot":"","sources":["../../src/parallax-renderer-webgpu.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAgFlE,qBAAa,sBAAuB,SAAQ,YAAY;IAEtD,OAAO,CAAC,MAAM,CAAY;IAC1B,OAAO,CAAC,OAAO,CAAiC;IAChD,OAAO,CAAC,YAAY,CAAmB;IAGvC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAiB;IAGxC,OAAO,CAAC,UAAU,CAA0B;IAC5C,OAAO,CAAC,aAAa,CAA2B;IAGhD,OAAO,CAAC,iBAAiB,CAAkC;IAC3D,OAAO,CAAC,wBAAwB,CAAmC;IACnE,OAAO,CAAC,sBAAsB,CAA0B;IACxD,OAAO,CAAC,kBAAkB,CAA6B;IACvD,OAAO,CAAC,eAAe,CAA2B;IAClD,OAAO,CAAC,YAAY,CAA+B;IAGnD,OAAO,CAAC,oBAAoB,CAA2B;IACvD,OAAO,CAAC,iBAAiB,CAA+B;IAGxD,OAAO,CAAC,gBAAgB,CAAkC;IAC1D,OAAO,CAAC,uBAAuB,CAAmC;IAClE,OAAO,CAAC,mBAAmB,CAA0B;IACrD,OAAO,CAAC,qBAAqB,CAA0B;IACvD,OAAO,CAAC,iBAAiB,CAA6B;IACtD,OAAO,CAAC,YAAY,CAA2B;IAC/C,OAAO,CAAC,gBAAgB,CAA+B;IAGvD,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAuB;IAGlD,OAAO,CAAC,eAAe,CAA2B;gBAGhD,MAAM,EAAE,WAAW,EACnB,MAAM,EAAE,sBAAsB,EAC9B,MAAM,EAAE,SAAS,EACjB,WAAW,EAAE,cAAc;IAwD7B;;;;OAIG;IACH,UAAU,CACR,KAAK,EAAE,gBAAgB,EACvB,UAAU,EAAE,MAAM,EAClB,WAAW,EAAE,MAAM,GAClB,IAAI;IAgEP,OAAO,CAAC,uBAAuB;IAkC/B,OAAO,CAAC,sBAAsB;IA+C9B,OAAO,CAAC,yBAAyB;IAkBjC,OAAO,CAAC,wBAAwB;IA2BhC,0DAA0D;IAC1D,OAAO,CAAC,2BAA2B;IA2BnC;;;;;;OAMG;IACH,OAAO,CAAC,UAAU;IAgBlB;;;;;;OAMG;IACH,SAAS,CAAC,aAAa,IAAI,IAAI;IAoD/B;;;;OAIG;IACH,SAAS,CAAC,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IA2C9C;;OAEG;IACH,SAAS,CAAC,yBAAyB,IAAI,IAAI;IA8B3C,iCAAiC;IACjC,SAAS,CAAC,eAAe,IAAI,IAAI;IAiCjC;;;;;;OAMG;IACH,SAAS,CAAC,iBAAiB,IAAI,IAAI;IAQnC,sEAAsE;IACtE,OAAO,CAAC,eAAe;CAiBxB"}