@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.
- package/CHANGELOG.json +72 -0
- package/README.md +1 -1
- package/dist/index.d.ts +5 -1
- package/dist/index.js +7 -0
- package/dist/render/backend/api.d.ts +17 -11
- package/dist/render/backend/webgl2/glassTintPrograms.d.ts +13 -0
- package/dist/render/backend/webgl2/glassTintPrograms.js +38 -0
- package/dist/render/backend/webgl2/renderer.d.ts +82 -8
- package/dist/render/backend/webgl2/renderer.js +373 -105
- package/dist/render/backend/webgpu/buffers.d.ts +19 -1
- package/dist/render/backend/webgpu/buffers.js +27 -1
- package/dist/render/backend/webgpu/depthPass.d.ts +1 -1
- package/dist/render/backend/webgpu/depthPass.js +2 -1
- package/dist/render/backend/webgpu/flatPass.d.ts +2 -0
- package/dist/render/backend/webgpu/flatPass.js +20 -1
- package/dist/render/backend/webgpu/glassTintPass.d.ts +28 -0
- package/dist/render/backend/webgpu/glassTintPass.js +205 -0
- package/dist/render/backend/webgpu/gpuDrivenPass.d.ts +60 -1
- package/dist/render/backend/webgpu/gpuDrivenPass.js +305 -5
- package/dist/render/backend/webgpu/instanced.d.ts +12 -1
- package/dist/render/backend/webgpu/instanced.js +20 -1
- package/dist/render/backend/webgpu/latePass.d.ts +26 -0
- package/dist/render/backend/webgpu/latePass.js +133 -0
- package/dist/render/backend/webgpu/lightVolumePass.js +5 -1
- package/dist/render/backend/webgpu/motionPass.d.ts +95 -0
- package/dist/render/backend/webgpu/motionPass.js +491 -0
- package/dist/render/backend/webgpu/pipelineCache.d.ts +10 -1
- package/dist/render/backend/webgpu/pipelineCache.js +11 -1
- package/dist/render/backend/webgpu/pointGlassTintPass.d.ts +32 -0
- package/dist/render/backend/webgpu/pointGlassTintPass.js +193 -0
- package/dist/render/backend/webgpu/pointShadowPass.d.ts +35 -6
- package/dist/render/backend/webgpu/pointShadowPass.js +105 -20
- package/dist/render/backend/webgpu/postPass.d.ts +21 -15
- package/dist/render/backend/webgpu/postPass.js +17 -4
- package/dist/render/backend/webgpu/renderer.d.ts +181 -54
- package/dist/render/backend/webgpu/renderer.js +1011 -394
- package/dist/render/backend/webgpu/scatterPass.js +2 -1
- package/dist/render/backend/webgpu/skinPaletteRing.d.ts +4 -0
- package/dist/render/backend/webgpu/skinPaletteRing.js +4 -0
- package/dist/render/backend/webgpu/snapshotMips.d.ts +29 -0
- package/dist/render/backend/webgpu/snapshotMips.js +52 -0
- package/dist/render/backend/webgpu/surfaceTexturePass.d.ts +5 -0
- package/dist/render/backend/webgpu/surfaceTexturePass.js +1 -1
- package/dist/render/flameLight.js +15 -2
- package/dist/render/glass.d.ts +45 -0
- package/dist/render/glass.js +39 -0
- package/dist/render/glassCasters.d.ts +40 -0
- package/dist/render/glassCasters.js +84 -0
- package/dist/render/glassShadow.d.ts +78 -0
- package/dist/render/glassShadow.js +125 -0
- package/dist/render/globalMediumPass.d.ts +2 -3
- package/dist/render/globalMediumPass.js +2 -8
- package/dist/render/gpudriven/lit.d.ts +12 -0
- package/dist/render/gpudriven/lit.js +23 -0
- package/dist/render/gpudriven/materialTable.d.ts +15 -5
- package/dist/render/gpudriven/materialTable.js +26 -6
- package/dist/render/gpudriven/pipeline.d.ts +1 -1
- package/dist/render/gpudriven/pipeline.js +4 -3
- package/dist/render/gpudriven/sunGlass.d.ts +35 -0
- package/dist/render/gpudriven/sunGlass.js +89 -0
- package/dist/render/lightBudget.d.ts +17 -5
- package/dist/render/lightBudget.js +17 -5
- package/dist/render/pointGlassTint.d.ts +59 -0
- package/dist/render/pointGlassTint.js +198 -0
- package/dist/render/pointShadowArray.d.ts +56 -3
- package/dist/render/pointShadowArray.js +127 -16
- package/dist/render/pointShadowBudget.js +51 -41
- package/dist/render/pointShadowMap.d.ts +23 -1
- package/dist/render/pointShadowMap.js +27 -1
- package/dist/render/recon/changeFrames.d.ts +15 -0
- package/dist/render/recon/changeFrames.js +21 -0
- package/dist/render/recon/disocclusion.d.ts +36 -3
- package/dist/render/recon/disocclusion.js +56 -4
- package/dist/render/recon/lateRouting.d.ts +14 -0
- package/dist/render/recon/lateRouting.js +18 -0
- package/dist/render/recon/mover.d.ts +57 -0
- package/dist/render/recon/mover.js +86 -0
- package/dist/render/recon/resolve.js +95 -12
- package/dist/render/renderQuality.d.ts +35 -0
- package/dist/render/renderQuality.js +7 -0
- package/dist/render/rendererHarness.js +12 -0
- package/dist/render/sceneTarget.d.ts +9 -1
- package/dist/render/sceneTarget.js +59 -13
- package/dist/render/shaders/depth.d.ts +16 -1
- package/dist/render/shaders/depth.js +85 -9
- package/dist/render/shaders/flat/directionalShadow.js +91 -6
- package/dist/render/shaders/flat/glassTint.d.ts +6 -0
- package/dist/render/shaders/flat/glassTint.js +25 -0
- package/dist/render/shaders/flat/index.d.ts +13 -0
- package/dist/render/shaders/flat/index.js +4 -0
- package/dist/render/shaders/flat/lampGlass.d.ts +1 -0
- package/dist/render/shaders/flat/lampGlass.js +183 -0
- package/dist/render/shaders/flat/main.d.ts +1 -1
- package/dist/render/shaders/flat/main.js +115 -15
- package/dist/render/shaders/flat/pointShadow.d.ts +1 -1
- package/dist/render/shaders/flat/pointShadow.js +2 -0
- package/dist/render/shaders/flat/preamble.js +21 -6
- package/dist/render/shaders/generated/depth.wgsl.d.ts +227 -4
- package/dist/render/shaders/generated/depth.wgsl.js +227 -4
- package/dist/render/shaders/generated/flat.wgsl.d.ts +360 -312
- package/dist/render/shaders/generated/flat.wgsl.js +376 -328
- package/dist/render/shaders/generated/globalMedium.wgsl.d.ts +3 -13
- package/dist/render/shaders/generated/globalMedium.wgsl.js +3 -13
- package/dist/render/shaders/generated/lightVolume.wgsl.d.ts +3 -13
- package/dist/render/shaders/generated/lightVolume.wgsl.js +4 -14
- package/dist/render/shaders/generated/octahedralResolve.wgsl.d.ts +29 -0
- package/dist/render/shaders/generated/octahedralResolve.wgsl.js +29 -0
- package/dist/render/shaders/generated/temporalResolve.wgsl.d.ts +31 -6
- package/dist/render/shaders/generated/temporalResolve.wgsl.js +31 -6
- package/dist/render/shaders/globalMedium.js +6 -6
- package/dist/render/shaders/gpudriven/blendRaster.wgsl.d.ts +7 -0
- package/dist/render/shaders/gpudriven/blendRaster.wgsl.js +86 -1
- package/dist/render/shaders/gpudriven/cull.wgsl.d.ts +1 -1
- package/dist/render/shaders/gpudriven/cull.wgsl.js +11 -2
- package/dist/render/shaders/gpudriven/materialTable.wgsl.d.ts +1 -1
- package/dist/render/shaders/gpudriven/materialTable.wgsl.js +3 -1
- package/dist/render/shaders/gpudriven/shade.wgsl.js +50 -1
- package/dist/render/shaders/gpudriven/sunGlass.wgsl.d.ts +9 -0
- package/dist/render/shaders/gpudriven/sunGlass.wgsl.js +133 -0
- package/dist/render/shaders/lightVolume.js +6 -6
- package/dist/render/shaders/octahedralResolve.d.ts +8 -0
- package/dist/render/shaders/octahedralResolve.js +48 -17
- package/dist/render/shaders/recon/lateDepth.wgsl.d.ts +1 -0
- package/dist/render/shaders/recon/lateDepth.wgsl.js +44 -0
- package/dist/render/shaders/recon/motion.wgsl.d.ts +1 -1
- package/dist/render/shaders/recon/motion.wgsl.js +84 -0
- package/dist/render/shaders/recon/resolve.wgsl.d.ts +1 -1
- package/dist/render/shaders/recon/resolve.wgsl.js +112 -8
- package/dist/render/shaders/temporalResolve.js +133 -5
- package/dist/render/shadowCasters.d.ts +20 -1
- package/dist/render/shadowCasters.js +15 -1
- package/dist/render/shadowMap.d.ts +54 -5
- package/dist/render/shadowMap.js +190 -36
- package/dist/render/sunGlassTint.d.ts +25 -0
- package/dist/render/sunGlassTint.js +79 -0
- package/dist/render/temporalAa.d.ts +145 -0
- package/dist/render/temporalAa.js +190 -0
- package/dist/render/temporalPass.d.ts +16 -14
- package/dist/render/temporalPass.js +59 -14
- package/dist/render/translucentQueue.d.ts +6 -0
- package/dist/render/translucentQueue.js +15 -1
- package/package.json +6 -6
- package/src/index.ts +10 -0
- package/src/render/backend/api.ts +15 -9
- package/src/render/backend/webgl2/glassTintPrograms.ts +58 -0
- package/src/render/backend/webgl2/renderer.ts +422 -109
- package/src/render/backend/webgpu/buffers.ts +50 -2
- package/src/render/backend/webgpu/depthPass.ts +2 -1
- package/src/render/backend/webgpu/flatPass.ts +22 -1
- package/src/render/backend/webgpu/glassTintPass.ts +244 -0
- package/src/render/backend/webgpu/gpuDrivenPass.ts +349 -5
- package/src/render/backend/webgpu/instanced.ts +21 -1
- package/src/render/backend/webgpu/latePass.ts +152 -0
- package/src/render/backend/webgpu/lightVolumePass.ts +5 -1
- package/src/render/backend/webgpu/motionPass.ts +535 -0
- package/src/render/backend/webgpu/pipelineCache.ts +12 -1
- package/src/render/backend/webgpu/pointGlassTintPass.ts +233 -0
- package/src/render/backend/webgpu/pointShadowPass.ts +158 -26
- package/src/render/backend/webgpu/postPass.ts +34 -4
- package/src/render/backend/webgpu/renderer.ts +1178 -425
- package/src/render/backend/webgpu/scatterPass.ts +2 -1
- package/src/render/backend/webgpu/skinPaletteRing.ts +4 -0
- package/src/render/backend/webgpu/snapshotMips.ts +80 -0
- package/src/render/backend/webgpu/surfaceTexturePass.ts +1 -1
- package/src/render/flameLight.ts +15 -2
- package/src/render/glass.ts +74 -0
- package/src/render/glassCasters.ts +164 -0
- package/src/render/glassShadow.ts +153 -0
- package/src/render/globalMediumPass.ts +4 -11
- package/src/render/gpudriven/lit.ts +31 -0
- package/src/render/gpudriven/materialTable.ts +28 -6
- package/src/render/gpudriven/pipeline.ts +4 -3
- package/src/render/gpudriven/sunGlass.ts +117 -0
- package/src/render/lightBudget.ts +19 -5
- package/src/render/pointGlassTint.ts +250 -0
- package/src/render/pointShadowArray.ts +188 -22
- package/src/render/pointShadowBudget.ts +49 -39
- package/src/render/pointShadowMap.ts +41 -0
- package/src/render/recon/changeFrames.ts +24 -0
- package/src/render/recon/disocclusion.ts +54 -3
- package/src/render/recon/lateRouting.ts +29 -0
- package/src/render/recon/mover.ts +118 -0
- package/src/render/recon/resolve.ts +137 -10
- package/src/render/renderQuality.ts +47 -0
- package/src/render/rendererHarness.ts +12 -0
- package/src/render/sceneTarget.ts +66 -12
- package/src/render/shaders/depth.ts +109 -9
- package/src/render/shaders/flat/directionalShadow.ts +97 -6
- package/src/render/shaders/flat/glassTint.ts +25 -0
- package/src/render/shaders/flat/index.ts +17 -0
- package/src/render/shaders/flat/lampGlass.ts +185 -0
- package/src/render/shaders/flat/main.ts +115 -15
- package/src/render/shaders/flat/pointShadow.ts +2 -0
- package/src/render/shaders/flat/preamble.ts +21 -6
- package/src/render/shaders/generated/depth.wgsl.ts +234 -4
- package/src/render/shaders/generated/flat.wgsl.ts +376 -328
- package/src/render/shaders/generated/globalMedium.wgsl.ts +3 -13
- package/src/render/shaders/generated/lightVolume.wgsl.ts +4 -14
- package/src/render/shaders/generated/octahedralResolve.wgsl.ts +30 -0
- package/src/render/shaders/generated/temporalResolve.wgsl.ts +31 -6
- package/src/render/shaders/globalMedium.ts +6 -6
- package/src/render/shaders/gpudriven/blendRaster.wgsl.ts +88 -1
- package/src/render/shaders/gpudriven/cull.wgsl.ts +11 -2
- package/src/render/shaders/gpudriven/materialTable.wgsl.ts +3 -1
- package/src/render/shaders/gpudriven/shade.wgsl.ts +50 -1
- package/src/render/shaders/gpudriven/sunGlass.wgsl.ts +139 -0
- package/src/render/shaders/lightVolume.ts +6 -6
- package/src/render/shaders/octahedralResolve.ts +50 -17
- package/src/render/shaders/recon/lateDepth.wgsl.ts +47 -0
- package/src/render/shaders/recon/motion.wgsl.ts +84 -0
- package/src/render/shaders/recon/resolve.wgsl.ts +112 -8
- package/src/render/shaders/temporalResolve.ts +141 -5
- package/src/render/shadowCasters.ts +28 -1
- package/src/render/shadowMap.ts +231 -37
- package/src/render/sunGlassTint.ts +86 -0
- package/src/render/temporalAa.ts +227 -0
- package/src/render/temporalPass.ts +88 -12
- 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
|
-
|
|
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.
|
|
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.
|
|
33
|
-
"@driftengine/physics": "4.
|
|
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.
|
|
67
|
-
"@driftengine/network": "4.
|
|
68
|
-
"@driftengine/texture": "4.
|
|
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
|
-
* **
|
|
773
|
-
*
|
|
774
|
-
*
|
|
775
|
-
*
|
|
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
|
-
*
|
|
778
|
-
*
|
|
779
|
-
*
|
|
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
|
+
}
|