@driftengine/core 4.4.1 → 4.5.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 (218) hide show
  1. package/CHANGELOG.json +72 -0
  2. package/README.md +1 -1
  3. package/dist/index.d.ts +5 -1
  4. package/dist/index.js +7 -0
  5. package/dist/render/backend/api.d.ts +17 -11
  6. package/dist/render/backend/webgl2/glassTintPrograms.d.ts +13 -0
  7. package/dist/render/backend/webgl2/glassTintPrograms.js +38 -0
  8. package/dist/render/backend/webgl2/renderer.d.ts +82 -8
  9. package/dist/render/backend/webgl2/renderer.js +373 -105
  10. package/dist/render/backend/webgpu/buffers.d.ts +19 -1
  11. package/dist/render/backend/webgpu/buffers.js +27 -1
  12. package/dist/render/backend/webgpu/depthPass.d.ts +1 -1
  13. package/dist/render/backend/webgpu/depthPass.js +2 -1
  14. package/dist/render/backend/webgpu/flatPass.d.ts +2 -0
  15. package/dist/render/backend/webgpu/flatPass.js +20 -1
  16. package/dist/render/backend/webgpu/glassTintPass.d.ts +28 -0
  17. package/dist/render/backend/webgpu/glassTintPass.js +205 -0
  18. package/dist/render/backend/webgpu/gpuDrivenPass.d.ts +60 -1
  19. package/dist/render/backend/webgpu/gpuDrivenPass.js +305 -5
  20. package/dist/render/backend/webgpu/instanced.d.ts +12 -1
  21. package/dist/render/backend/webgpu/instanced.js +20 -1
  22. package/dist/render/backend/webgpu/latePass.d.ts +26 -0
  23. package/dist/render/backend/webgpu/latePass.js +133 -0
  24. package/dist/render/backend/webgpu/lightVolumePass.js +5 -1
  25. package/dist/render/backend/webgpu/motionPass.d.ts +95 -0
  26. package/dist/render/backend/webgpu/motionPass.js +491 -0
  27. package/dist/render/backend/webgpu/pipelineCache.d.ts +10 -1
  28. package/dist/render/backend/webgpu/pipelineCache.js +11 -1
  29. package/dist/render/backend/webgpu/pointGlassTintPass.d.ts +32 -0
  30. package/dist/render/backend/webgpu/pointGlassTintPass.js +193 -0
  31. package/dist/render/backend/webgpu/pointShadowPass.d.ts +35 -6
  32. package/dist/render/backend/webgpu/pointShadowPass.js +105 -20
  33. package/dist/render/backend/webgpu/postPass.d.ts +21 -15
  34. package/dist/render/backend/webgpu/postPass.js +17 -4
  35. package/dist/render/backend/webgpu/renderer.d.ts +181 -54
  36. package/dist/render/backend/webgpu/renderer.js +1011 -394
  37. package/dist/render/backend/webgpu/scatterPass.js +2 -1
  38. package/dist/render/backend/webgpu/skinPaletteRing.d.ts +4 -0
  39. package/dist/render/backend/webgpu/skinPaletteRing.js +4 -0
  40. package/dist/render/backend/webgpu/snapshotMips.d.ts +29 -0
  41. package/dist/render/backend/webgpu/snapshotMips.js +52 -0
  42. package/dist/render/backend/webgpu/surfaceTexturePass.d.ts +5 -0
  43. package/dist/render/backend/webgpu/surfaceTexturePass.js +1 -1
  44. package/dist/render/flameLight.js +15 -2
  45. package/dist/render/glass.d.ts +45 -0
  46. package/dist/render/glass.js +39 -0
  47. package/dist/render/glassCasters.d.ts +40 -0
  48. package/dist/render/glassCasters.js +84 -0
  49. package/dist/render/glassShadow.d.ts +78 -0
  50. package/dist/render/glassShadow.js +125 -0
  51. package/dist/render/globalMediumPass.d.ts +2 -3
  52. package/dist/render/globalMediumPass.js +2 -8
  53. package/dist/render/gpudriven/lit.d.ts +12 -0
  54. package/dist/render/gpudriven/lit.js +23 -0
  55. package/dist/render/gpudriven/materialTable.d.ts +15 -5
  56. package/dist/render/gpudriven/materialTable.js +26 -6
  57. package/dist/render/gpudriven/pipeline.d.ts +1 -1
  58. package/dist/render/gpudriven/pipeline.js +4 -3
  59. package/dist/render/gpudriven/sunGlass.d.ts +35 -0
  60. package/dist/render/gpudriven/sunGlass.js +89 -0
  61. package/dist/render/lightBudget.d.ts +17 -5
  62. package/dist/render/lightBudget.js +17 -5
  63. package/dist/render/pointGlassTint.d.ts +59 -0
  64. package/dist/render/pointGlassTint.js +198 -0
  65. package/dist/render/pointShadowArray.d.ts +56 -3
  66. package/dist/render/pointShadowArray.js +127 -16
  67. package/dist/render/pointShadowBudget.js +51 -41
  68. package/dist/render/pointShadowMap.d.ts +23 -1
  69. package/dist/render/pointShadowMap.js +27 -1
  70. package/dist/render/recon/changeFrames.d.ts +15 -0
  71. package/dist/render/recon/changeFrames.js +21 -0
  72. package/dist/render/recon/disocclusion.d.ts +36 -3
  73. package/dist/render/recon/disocclusion.js +56 -4
  74. package/dist/render/recon/lateRouting.d.ts +14 -0
  75. package/dist/render/recon/lateRouting.js +18 -0
  76. package/dist/render/recon/mover.d.ts +57 -0
  77. package/dist/render/recon/mover.js +86 -0
  78. package/dist/render/recon/resolve.js +95 -12
  79. package/dist/render/renderQuality.d.ts +35 -0
  80. package/dist/render/renderQuality.js +7 -0
  81. package/dist/render/rendererHarness.js +12 -0
  82. package/dist/render/sceneTarget.d.ts +9 -1
  83. package/dist/render/sceneTarget.js +59 -13
  84. package/dist/render/shaders/depth.d.ts +16 -1
  85. package/dist/render/shaders/depth.js +85 -9
  86. package/dist/render/shaders/flat/directionalShadow.js +91 -6
  87. package/dist/render/shaders/flat/glassTint.d.ts +6 -0
  88. package/dist/render/shaders/flat/glassTint.js +25 -0
  89. package/dist/render/shaders/flat/index.d.ts +13 -0
  90. package/dist/render/shaders/flat/index.js +4 -0
  91. package/dist/render/shaders/flat/lampGlass.d.ts +1 -0
  92. package/dist/render/shaders/flat/lampGlass.js +183 -0
  93. package/dist/render/shaders/flat/main.d.ts +1 -1
  94. package/dist/render/shaders/flat/main.js +115 -15
  95. package/dist/render/shaders/flat/pointShadow.d.ts +1 -1
  96. package/dist/render/shaders/flat/pointShadow.js +2 -0
  97. package/dist/render/shaders/flat/preamble.js +21 -6
  98. package/dist/render/shaders/generated/depth.wgsl.d.ts +227 -4
  99. package/dist/render/shaders/generated/depth.wgsl.js +227 -4
  100. package/dist/render/shaders/generated/flat.wgsl.d.ts +360 -312
  101. package/dist/render/shaders/generated/flat.wgsl.js +376 -328
  102. package/dist/render/shaders/generated/globalMedium.wgsl.d.ts +3 -13
  103. package/dist/render/shaders/generated/globalMedium.wgsl.js +3 -13
  104. package/dist/render/shaders/generated/lightVolume.wgsl.d.ts +3 -13
  105. package/dist/render/shaders/generated/lightVolume.wgsl.js +4 -14
  106. package/dist/render/shaders/generated/octahedralResolve.wgsl.d.ts +29 -0
  107. package/dist/render/shaders/generated/octahedralResolve.wgsl.js +29 -0
  108. package/dist/render/shaders/generated/temporalResolve.wgsl.d.ts +31 -6
  109. package/dist/render/shaders/generated/temporalResolve.wgsl.js +31 -6
  110. package/dist/render/shaders/globalMedium.js +6 -6
  111. package/dist/render/shaders/gpudriven/blendRaster.wgsl.d.ts +7 -0
  112. package/dist/render/shaders/gpudriven/blendRaster.wgsl.js +86 -1
  113. package/dist/render/shaders/gpudriven/cull.wgsl.d.ts +1 -1
  114. package/dist/render/shaders/gpudriven/cull.wgsl.js +11 -2
  115. package/dist/render/shaders/gpudriven/materialTable.wgsl.d.ts +1 -1
  116. package/dist/render/shaders/gpudriven/materialTable.wgsl.js +3 -1
  117. package/dist/render/shaders/gpudriven/shade.wgsl.js +50 -1
  118. package/dist/render/shaders/gpudriven/sunGlass.wgsl.d.ts +9 -0
  119. package/dist/render/shaders/gpudriven/sunGlass.wgsl.js +133 -0
  120. package/dist/render/shaders/lightVolume.js +6 -6
  121. package/dist/render/shaders/octahedralResolve.d.ts +8 -0
  122. package/dist/render/shaders/octahedralResolve.js +48 -17
  123. package/dist/render/shaders/recon/lateDepth.wgsl.d.ts +1 -0
  124. package/dist/render/shaders/recon/lateDepth.wgsl.js +44 -0
  125. package/dist/render/shaders/recon/motion.wgsl.d.ts +1 -1
  126. package/dist/render/shaders/recon/motion.wgsl.js +84 -0
  127. package/dist/render/shaders/recon/resolve.wgsl.d.ts +1 -1
  128. package/dist/render/shaders/recon/resolve.wgsl.js +112 -8
  129. package/dist/render/shaders/temporalResolve.js +133 -5
  130. package/dist/render/shadowCasters.d.ts +20 -1
  131. package/dist/render/shadowCasters.js +15 -1
  132. package/dist/render/shadowMap.d.ts +54 -5
  133. package/dist/render/shadowMap.js +190 -36
  134. package/dist/render/sunGlassTint.d.ts +25 -0
  135. package/dist/render/sunGlassTint.js +79 -0
  136. package/dist/render/temporalAa.d.ts +145 -0
  137. package/dist/render/temporalAa.js +190 -0
  138. package/dist/render/temporalPass.d.ts +16 -14
  139. package/dist/render/temporalPass.js +59 -14
  140. package/dist/render/translucentQueue.d.ts +6 -0
  141. package/dist/render/translucentQueue.js +15 -1
  142. package/package.json +6 -6
  143. package/src/index.ts +10 -0
  144. package/src/render/backend/api.ts +15 -9
  145. package/src/render/backend/webgl2/glassTintPrograms.ts +58 -0
  146. package/src/render/backend/webgl2/renderer.ts +422 -109
  147. package/src/render/backend/webgpu/buffers.ts +50 -2
  148. package/src/render/backend/webgpu/depthPass.ts +2 -1
  149. package/src/render/backend/webgpu/flatPass.ts +22 -1
  150. package/src/render/backend/webgpu/glassTintPass.ts +244 -0
  151. package/src/render/backend/webgpu/gpuDrivenPass.ts +349 -5
  152. package/src/render/backend/webgpu/instanced.ts +21 -1
  153. package/src/render/backend/webgpu/latePass.ts +152 -0
  154. package/src/render/backend/webgpu/lightVolumePass.ts +5 -1
  155. package/src/render/backend/webgpu/motionPass.ts +535 -0
  156. package/src/render/backend/webgpu/pipelineCache.ts +12 -1
  157. package/src/render/backend/webgpu/pointGlassTintPass.ts +233 -0
  158. package/src/render/backend/webgpu/pointShadowPass.ts +158 -26
  159. package/src/render/backend/webgpu/postPass.ts +34 -4
  160. package/src/render/backend/webgpu/renderer.ts +1178 -425
  161. package/src/render/backend/webgpu/scatterPass.ts +2 -1
  162. package/src/render/backend/webgpu/skinPaletteRing.ts +4 -0
  163. package/src/render/backend/webgpu/snapshotMips.ts +80 -0
  164. package/src/render/backend/webgpu/surfaceTexturePass.ts +1 -1
  165. package/src/render/flameLight.ts +15 -2
  166. package/src/render/glass.ts +74 -0
  167. package/src/render/glassCasters.ts +164 -0
  168. package/src/render/glassShadow.ts +153 -0
  169. package/src/render/globalMediumPass.ts +4 -11
  170. package/src/render/gpudriven/lit.ts +31 -0
  171. package/src/render/gpudriven/materialTable.ts +28 -6
  172. package/src/render/gpudriven/pipeline.ts +4 -3
  173. package/src/render/gpudriven/sunGlass.ts +117 -0
  174. package/src/render/lightBudget.ts +19 -5
  175. package/src/render/pointGlassTint.ts +250 -0
  176. package/src/render/pointShadowArray.ts +188 -22
  177. package/src/render/pointShadowBudget.ts +49 -39
  178. package/src/render/pointShadowMap.ts +41 -0
  179. package/src/render/recon/changeFrames.ts +24 -0
  180. package/src/render/recon/disocclusion.ts +54 -3
  181. package/src/render/recon/lateRouting.ts +29 -0
  182. package/src/render/recon/mover.ts +118 -0
  183. package/src/render/recon/resolve.ts +137 -10
  184. package/src/render/renderQuality.ts +47 -0
  185. package/src/render/rendererHarness.ts +12 -0
  186. package/src/render/sceneTarget.ts +66 -12
  187. package/src/render/shaders/depth.ts +109 -9
  188. package/src/render/shaders/flat/directionalShadow.ts +97 -6
  189. package/src/render/shaders/flat/glassTint.ts +25 -0
  190. package/src/render/shaders/flat/index.ts +17 -0
  191. package/src/render/shaders/flat/lampGlass.ts +185 -0
  192. package/src/render/shaders/flat/main.ts +115 -15
  193. package/src/render/shaders/flat/pointShadow.ts +2 -0
  194. package/src/render/shaders/flat/preamble.ts +21 -6
  195. package/src/render/shaders/generated/depth.wgsl.ts +234 -4
  196. package/src/render/shaders/generated/flat.wgsl.ts +376 -328
  197. package/src/render/shaders/generated/globalMedium.wgsl.ts +3 -13
  198. package/src/render/shaders/generated/lightVolume.wgsl.ts +4 -14
  199. package/src/render/shaders/generated/octahedralResolve.wgsl.ts +30 -0
  200. package/src/render/shaders/generated/temporalResolve.wgsl.ts +31 -6
  201. package/src/render/shaders/globalMedium.ts +6 -6
  202. package/src/render/shaders/gpudriven/blendRaster.wgsl.ts +88 -1
  203. package/src/render/shaders/gpudriven/cull.wgsl.ts +11 -2
  204. package/src/render/shaders/gpudriven/materialTable.wgsl.ts +3 -1
  205. package/src/render/shaders/gpudriven/shade.wgsl.ts +50 -1
  206. package/src/render/shaders/gpudriven/sunGlass.wgsl.ts +139 -0
  207. package/src/render/shaders/lightVolume.ts +6 -6
  208. package/src/render/shaders/octahedralResolve.ts +50 -17
  209. package/src/render/shaders/recon/lateDepth.wgsl.ts +47 -0
  210. package/src/render/shaders/recon/motion.wgsl.ts +84 -0
  211. package/src/render/shaders/recon/resolve.wgsl.ts +112 -8
  212. package/src/render/shaders/temporalResolve.ts +141 -5
  213. package/src/render/shadowCasters.ts +28 -1
  214. package/src/render/shadowMap.ts +231 -37
  215. package/src/render/sunGlassTint.ts +86 -0
  216. package/src/render/temporalAa.ts +227 -0
  217. package/src/render/temporalPass.ts +88 -12
  218. package/src/render/translucentQueue.ts +20 -1
@@ -1,3 +1,4 @@
1
+ import { resolveGlass } from './glass.js';
1
2
  function newRecord() {
2
3
  return {
3
4
  mesh: null,
@@ -14,12 +15,15 @@ function newRecord() {
14
15
  refractTint: null,
15
16
  thicknessM: 0,
16
17
  refractTintStore: new Float32Array(3),
18
+ glass: null,
19
+ glassStore: { transmission: 0, frost: 0, tint: [1, 1, 1] },
17
20
  };
18
21
  }
19
22
  export class TranslucentQueue {
20
23
  pool = [];
21
24
  count = 0;
22
25
  refracting = 0;
26
+ glassing = 0;
23
27
  /** How many draws this frame has recorded. */
24
28
  get length() {
25
29
  return this.count;
@@ -31,6 +35,10 @@ export class TranslucentQueue {
31
35
  get refracts() {
32
36
  return this.refracting > 0;
33
37
  }
38
+ /** Whether anything recorded this frame is glass, so the copy it reads needs its mip chain. */
39
+ get glassy() {
40
+ return this.glassing > 0;
41
+ }
34
42
  /** How many records are pooled, which a test uses to assert a steady scene stops allocating. */
35
43
  get capacity() {
36
44
  return this.pool.length;
@@ -65,7 +73,12 @@ export class TranslucentQueue {
65
73
  record.tint = record.tintStore;
66
74
  }
67
75
  record.refraction = options.refraction ?? 0;
68
- if (record.refraction > 0)
76
+ /* Glass reads the copy too, whether or not it bends: see `glass.ts`. */
77
+ const glassy = resolveGlass(options.glass, record.glassStore);
78
+ record.glass = glassy ? record.glassStore : null;
79
+ if (glassy)
80
+ this.glassing++;
81
+ if (record.refraction > 0 || glassy)
69
82
  this.refracting++;
70
83
  record.thicknessM = options.thicknessM ?? 0;
71
84
  const refractTint = options.refractTint ?? null;
@@ -97,5 +110,6 @@ export class TranslucentQueue {
97
110
  reset() {
98
111
  this.count = 0;
99
112
  this.refracting = 0;
113
+ this.glassing = 0;
100
114
  }
101
115
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@driftengine/core",
3
- "version": "4.4.1",
3
+ "version": "4.5.0",
4
4
  "description": "DriftEngine reusable browser 3D runtime",
5
5
  "license": "Apache-2.0",
6
6
  "type": "module",
@@ -29,8 +29,8 @@
29
29
  ],
30
30
  "sideEffects": false,
31
31
  "dependencies": {
32
- "@driftengine/drft": "4.4.1",
33
- "@driftengine/physics": "4.4.1",
32
+ "@driftengine/drft": "4.5.0",
33
+ "@driftengine/physics": "4.5.0",
34
34
  "gl-matrix": "^3.4.3"
35
35
  },
36
36
  "author": "Drift Technologies",
@@ -63,8 +63,8 @@
63
63
  "prepack": "node ../../scripts/build.mjs @driftengine/core"
64
64
  },
65
65
  "devDependencies": {
66
- "@driftengine/nav": "4.4.1",
67
- "@driftengine/network": "4.4.1",
68
- "@driftengine/texture": "4.4.1"
66
+ "@driftengine/nav": "4.5.0",
67
+ "@driftengine/network": "4.5.0",
68
+ "@driftengine/texture": "4.5.0"
69
69
  }
70
70
  }
package/src/index.ts CHANGED
@@ -202,6 +202,15 @@ export { createPassAttachment } from './render/passTarget.ts';
202
202
  * resolve finds its geometry where the renderer's own verbs put theirs.
203
203
  */
204
204
  export { jitterClip } from './render/recon/jitter.ts';
205
+ /*
206
+ * Which object a draw is, for a reconstruction that has to find where it was last frame. See
207
+ * `RendererApi.drawMesh`.
208
+ */
209
+ /* Glass: a pane that shows what is behind it, clear or frosted. See `TranslucentMeshOptions.glass`. */
210
+ export { resolveGlass } from './render/glass.ts';
211
+ export type { GlassOptions, ResolvedGlass } from './render/glass.ts';
212
+ export { createMover } from './render/recon/mover.ts';
213
+ export type { Mover } from './render/recon/mover.ts';
205
214
  export type { FrameResource } from './render/frame/index.ts';
206
215
  /*
207
216
  * Occlusion culling, which is arithmetic rather than a GPU feature — so the class is public and a
@@ -568,6 +577,7 @@ export type { PrefilterQuality } from './render/prefilterEnvMap.ts';
568
577
  export type { ProbeBakeOptions } from './render/reflectionProbe.ts';
569
578
  export type {
570
579
  DirectionalShadowDepthLayers,
580
+ GlassShadows,
571
581
  OutputTransform,
572
582
  RenderQuality,
573
583
  RenderQualityOptions,
@@ -10,6 +10,7 @@ import type { TextStyle } from '../textLayout.ts';
10
10
  import type { SdfFont } from '../sdfFont.ts';
11
11
  import type { SdfTextStyle } from '../sdfTextLayout.ts';
12
12
  import type { FrameTimer } from './timer.ts';
13
+ import type { Mover } from '../recon/mover.ts';
13
14
 
14
15
  /**
15
16
  * Geometry on the device, as something a consumer holds and hands back.
@@ -767,18 +768,23 @@ export type RendererApi = Omit<
767
768
  depthLayer?: number,
768
769
  tint?: Vec3 | null,
769
770
  /**
770
- * Where this mesh's surface was last frame, for a reconstruction's motion target.
771
+ * Where this mesh's surface was last frame, for a reconstruction's motion target: a `Mover`,
772
+ * or last frame's model matrix.
771
773
  *
772
- * **Only a reconstruction reads it**, and only on WebGPU: it is what turns a moving object's
773
- * stale history from a smear into a reprojection. A draw that says nothing gets the camera's
774
- * motion, derived from the depth, which is exactly right for anything that did not move and
775
- * wrong in proportion to how far a mover moved. Null and omitted mean the same thing.
774
+ * **A `Mover` is the ordinary answer.** Make one per moving object with `createMover()` and pass
775
+ * it with every draw of that object; the renderer keeps last frame's model and, for a skinned
776
+ * draw, last frame's palette. A matrix still works exactly as it always has: the *model* matrix
777
+ * this mesh was drawn with last frame, not a velocity, so a rotation and a scale are as correct
778
+ * as a translation. Null and omitted mean the same thing: the camera's motion, derived from the
779
+ * depth, which is exactly right for anything that did not move and wrong in proportion to how
780
+ * far a mover moved.
776
781
  *
777
- * It is the *model* matrix this mesh was drawn with last frame, not a velocity: the pass
778
- * transforms each vertex twice and lets the perspective divide do the rest, so a rotation and a
779
- * scale are as correct as a translation.
782
+ * **Only a reconstruction reads it**, and only on WebGPU. A mover drawn twice in one frame is
783
+ * two objects wearing one identity: the second draw is warned about once and records no motion.
784
+ * Instanced batches and meshes rewritten with `updateMesh` need none — the batch and the mesh
785
+ * are their own identity.
780
786
  */
781
- previousModel?: ReadonlyMat4 | null,
787
+ previousModel?: ReadonlyMat4 | Mover | null,
782
788
  ): void;
783
789
 
784
790
  /** Release the geometry behind a handle. */
@@ -0,0 +1,58 @@
1
+ /**
2
+ * The five programs a pane casts its colour through, one per way a caster is drawn, compiled the
3
+ * first time glass casts — so a scene with no glass compiles none of them.
4
+ *
5
+ * The vertex stages are the depth pass's with the world position handed on (`depth.ts`), so a
6
+ * pane's colour lands exactly where its depth does; the fragment is `paneTexel` for the device.
7
+ */
8
+ import { compileProgram, uniformLocations } from '../../shader.ts';
9
+ import {
10
+ GLASS_TINT_CUTOUT_FRAG,
11
+ GLASS_TINT_CUTOUT_VERT,
12
+ GLASS_TINT_FRAG,
13
+ GLASS_TINT_INSTANCED_CUTOUT_VERT,
14
+ GLASS_TINT_INSTANCED_VERT,
15
+ GLASS_TINT_SKINNED_VERT,
16
+ GLASS_TINT_VERT,
17
+ } from '../../shaders/depth.ts';
18
+
19
+ export interface GlassTintProgram {
20
+ readonly program: WebGLProgram;
21
+ readonly uniforms: Record<string, WebGLUniformLocation>;
22
+ }
23
+
24
+ export class GlassTintPrograms {
25
+ readonly rigid: GlassTintProgram;
26
+ readonly instanced: GlassTintProgram;
27
+ readonly skinned: GlassTintProgram;
28
+ readonly cutout: GlassTintProgram;
29
+ readonly instancedCutout: GlassTintProgram;
30
+
31
+ constructor(gl: WebGL2RenderingContext) {
32
+ const build = (vert: string, frag: string, label: string): GlassTintProgram => {
33
+ const program = compileProgram(gl, vert, frag, label);
34
+ return { program, uniforms: uniformLocations(gl, program, label) };
35
+ };
36
+ this.rigid = build(GLASS_TINT_VERT, GLASS_TINT_FRAG, 'glassTint');
37
+ this.instanced = build(GLASS_TINT_INSTANCED_VERT, GLASS_TINT_FRAG, 'glassTint.instanced');
38
+ this.skinned = build(GLASS_TINT_SKINNED_VERT, GLASS_TINT_FRAG, 'glassTint.skinned');
39
+ this.cutout = build(GLASS_TINT_CUTOUT_VERT, GLASS_TINT_CUTOUT_FRAG, 'glassTint.cutout');
40
+ this.instancedCutout = build(
41
+ GLASS_TINT_INSTANCED_CUTOUT_VERT,
42
+ GLASS_TINT_CUTOUT_FRAG,
43
+ 'glassTint.instancedCutout',
44
+ );
45
+ }
46
+
47
+ dispose(gl: WebGL2RenderingContext): void {
48
+ for (const { program } of [
49
+ this.rigid,
50
+ this.instanced,
51
+ this.skinned,
52
+ this.cutout,
53
+ this.instancedCutout,
54
+ ]) {
55
+ gl.deleteProgram(program);
56
+ }
57
+ }
58
+ }