@triforge/compositor-core 0.1.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/dist/core/BasePass.d.ts +49 -0
- package/dist/core/BasePass.d.ts.map +1 -0
- package/dist/core/BasePass.js +36 -0
- package/dist/core/CompositorBackend.d.ts +12 -0
- package/dist/core/CompositorBackend.d.ts.map +1 -0
- package/dist/core/CompositorBackend.js +1 -0
- package/dist/core/CompositorOutput.d.ts +73 -0
- package/dist/core/CompositorOutput.d.ts.map +1 -0
- package/dist/core/CompositorOutput.js +201 -0
- package/dist/index.d.ts +62 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +32 -0
- package/dist/passes/AlphaOver.d.ts +32 -0
- package/dist/passes/AlphaOver.d.ts.map +1 -0
- package/dist/passes/AlphaOver.js +59 -0
- package/dist/passes/Bloom.d.ts +25 -0
- package/dist/passes/Bloom.d.ts.map +1 -0
- package/dist/passes/Bloom.js +32 -0
- package/dist/passes/Blur.d.ts +23 -0
- package/dist/passes/Blur.d.ts.map +1 -0
- package/dist/passes/Blur.js +54 -0
- package/dist/passes/BrightnessContrast.d.ts +20 -0
- package/dist/passes/BrightnessContrast.d.ts.map +1 -0
- package/dist/passes/BrightnessContrast.js +42 -0
- package/dist/passes/ChromaticAberration.d.ts +22 -0
- package/dist/passes/ChromaticAberration.d.ts.map +1 -0
- package/dist/passes/ChromaticAberration.js +53 -0
- package/dist/passes/ColorBalance.d.ts +38 -0
- package/dist/passes/ColorBalance.d.ts.map +1 -0
- package/dist/passes/ColorBalance.js +50 -0
- package/dist/passes/CombineRGBA.d.ts +35 -0
- package/dist/passes/CombineRGBA.d.ts.map +1 -0
- package/dist/passes/CombineRGBA.js +49 -0
- package/dist/passes/DepthOfField.d.ts +27 -0
- package/dist/passes/DepthOfField.d.ts.map +1 -0
- package/dist/passes/DepthOfField.js +47 -0
- package/dist/passes/EdgeDetect.d.ts +31 -0
- package/dist/passes/EdgeDetect.d.ts.map +1 -0
- package/dist/passes/EdgeDetect.js +69 -0
- package/dist/passes/Exposure.d.ts +19 -0
- package/dist/passes/Exposure.d.ts.map +1 -0
- package/dist/passes/Exposure.js +42 -0
- package/dist/passes/FilmGrain.d.ts +26 -0
- package/dist/passes/FilmGrain.d.ts.map +1 -0
- package/dist/passes/FilmGrain.js +31 -0
- package/dist/passes/Gamma.d.ts +17 -0
- package/dist/passes/Gamma.d.ts.map +1 -0
- package/dist/passes/Gamma.js +36 -0
- package/dist/passes/GaussianBlur.d.ts +26 -0
- package/dist/passes/GaussianBlur.d.ts.map +1 -0
- package/dist/passes/GaussianBlur.js +81 -0
- package/dist/passes/GlareStreaks.d.ts +38 -0
- package/dist/passes/GlareStreaks.d.ts.map +1 -0
- package/dist/passes/GlareStreaks.js +82 -0
- package/dist/passes/HueSaturation.d.ts +26 -0
- package/dist/passes/HueSaturation.d.ts.map +1 -0
- package/dist/passes/HueSaturation.js +65 -0
- package/dist/passes/LUT.d.ts +64 -0
- package/dist/passes/LUT.d.ts.map +1 -0
- package/dist/passes/LUT.js +140 -0
- package/dist/passes/LensFlare.d.ts +34 -0
- package/dist/passes/LensFlare.d.ts.map +1 -0
- package/dist/passes/LensFlare.js +92 -0
- package/dist/passes/Mix.d.ts +23 -0
- package/dist/passes/Mix.d.ts.map +1 -0
- package/dist/passes/Mix.js +41 -0
- package/dist/passes/MotionBlur.d.ts +37 -0
- package/dist/passes/MotionBlur.d.ts.map +1 -0
- package/dist/passes/MotionBlur.js +65 -0
- package/dist/passes/Pixelate.d.ts +19 -0
- package/dist/passes/Pixelate.d.ts.map +1 -0
- package/dist/passes/Pixelate.js +45 -0
- package/dist/passes/RenderLayers.d.ts +31 -0
- package/dist/passes/RenderLayers.d.ts.map +1 -0
- package/dist/passes/RenderLayers.js +45 -0
- package/dist/passes/SSAO.d.ts +34 -0
- package/dist/passes/SSAO.d.ts.map +1 -0
- package/dist/passes/SSAO.js +42 -0
- package/dist/passes/SSR.d.ts +32 -0
- package/dist/passes/SSR.d.ts.map +1 -0
- package/dist/passes/SSR.js +44 -0
- package/dist/passes/SeparateRGBA.d.ts +29 -0
- package/dist/passes/SeparateRGBA.d.ts.map +1 -0
- package/dist/passes/SeparateRGBA.js +45 -0
- package/dist/passes/SetAlpha.d.ts +21 -0
- package/dist/passes/SetAlpha.d.ts.map +1 -0
- package/dist/passes/SetAlpha.js +36 -0
- package/dist/passes/Sharpen.d.ts +17 -0
- package/dist/passes/Sharpen.d.ts.map +1 -0
- package/dist/passes/Sharpen.js +42 -0
- package/dist/passes/Vignette.d.ts +22 -0
- package/dist/passes/Vignette.d.ts.map +1 -0
- package/dist/passes/Vignette.js +49 -0
- package/dist/passes/ZCombine.d.ts +34 -0
- package/dist/passes/ZCombine.d.ts.map +1 -0
- package/dist/passes/ZCombine.js +50 -0
- package/package.json +48 -0
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
import { BasePass } from '../core/BasePass.js';
|
|
2
|
+
/**
|
|
3
|
+
* LUT — 3-D Look-Up Table colour grading pass.
|
|
4
|
+
* Blender Compositor: Color Balance node (via a baked LUT).
|
|
5
|
+
*
|
|
6
|
+
* Usage:
|
|
7
|
+
* ```typescript
|
|
8
|
+
* const lut = new LUT({ intensity: 1 })
|
|
9
|
+
* comp.add(lut)
|
|
10
|
+
* await comp.compile()
|
|
11
|
+
*
|
|
12
|
+
* // Apply a custom grade — warm highlights + cool shadows
|
|
13
|
+
* lut.setLUT(LUT.createFromFn(32, (r, g, b) => [
|
|
14
|
+
* r * 1.1 + b * 0.05,
|
|
15
|
+
* g,
|
|
16
|
+
* b * 1.1 + r * 0.02,
|
|
17
|
+
* ]))
|
|
18
|
+
* ```
|
|
19
|
+
*
|
|
20
|
+
* The LUT texture is a Data3DTexture (Three.js r137+).
|
|
21
|
+
* Use `LUT.createNeutral(N)` for a passthrough LUT, then modify the data.
|
|
22
|
+
* Use `LUT.createFromFn(N, fn)` to build from a mapping function.
|
|
23
|
+
*/
|
|
24
|
+
export class LUT extends BasePass {
|
|
25
|
+
constructor(opts = {}) {
|
|
26
|
+
super();
|
|
27
|
+
this.passType = 'LUT';
|
|
28
|
+
/** The Three.js Data3DTexture (or null until setLUT() is called). */
|
|
29
|
+
this.lutTexture = null;
|
|
30
|
+
this._pass = null;
|
|
31
|
+
this.parameters = {
|
|
32
|
+
intensity: opts.intensity ?? 1,
|
|
33
|
+
lutSize: opts.lutSize ?? 32,
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
_threePassDeps() { return ['ShaderPass']; }
|
|
37
|
+
_buildThree(_w, _h, reg) {
|
|
38
|
+
const ShaderPass = reg['ShaderPass'];
|
|
39
|
+
if (!ShaderPass)
|
|
40
|
+
throw new Error('LUT: ShaderPass not found.');
|
|
41
|
+
const shader = {
|
|
42
|
+
uniforms: {
|
|
43
|
+
tDiffuse: { value: null },
|
|
44
|
+
lut3d: { value: this.lutTexture ?? null },
|
|
45
|
+
intensity: { value: this.parameters.intensity },
|
|
46
|
+
lutSize: { value: this.parameters.lutSize },
|
|
47
|
+
},
|
|
48
|
+
vertexShader: `
|
|
49
|
+
varying vec2 vUv;
|
|
50
|
+
void main() { vUv = uv; gl_Position = projectionMatrix * modelViewMatrix * vec4(position,1.0); }
|
|
51
|
+
`,
|
|
52
|
+
fragmentShader: `
|
|
53
|
+
precision highp float;
|
|
54
|
+
precision highp sampler3D;
|
|
55
|
+
uniform sampler2D tDiffuse;
|
|
56
|
+
uniform sampler3D lut3d;
|
|
57
|
+
uniform float intensity;
|
|
58
|
+
uniform float lutSize;
|
|
59
|
+
varying vec2 vUv;
|
|
60
|
+
|
|
61
|
+
void main() {
|
|
62
|
+
vec4 base = texture2D(tDiffuse, vUv);
|
|
63
|
+
if (intensity < 0.001 || lutSize < 2.0) { gl_FragColor = base; return; }
|
|
64
|
+
// Scale to [0.5/N, 1-0.5/N] to hit texel centres
|
|
65
|
+
float scale = (lutSize - 1.0) / lutSize;
|
|
66
|
+
float offset = 0.5 / lutSize;
|
|
67
|
+
vec3 coord = clamp(base.rgb, 0.0, 1.0) * scale + offset;
|
|
68
|
+
vec4 graded = texture(lut3d, coord);
|
|
69
|
+
gl_FragColor = vec4(mix(base.rgb, graded.rgb, intensity), base.a);
|
|
70
|
+
}
|
|
71
|
+
`,
|
|
72
|
+
};
|
|
73
|
+
this._pass = new ShaderPass(shader);
|
|
74
|
+
return this._pass;
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Replace the active LUT texture at runtime.
|
|
78
|
+
* Pass a Three.js Data3DTexture — see `LUT.createNeutral` / `LUT.createFromFn`.
|
|
79
|
+
*/
|
|
80
|
+
setLUT(tex) {
|
|
81
|
+
this.lutTexture = tex;
|
|
82
|
+
if (this._pass) {
|
|
83
|
+
const uniforms = this._pass['uniforms'];
|
|
84
|
+
if (uniforms?.['lut3d'])
|
|
85
|
+
uniforms['lut3d'].value = tex;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
// ── Static helpers ────────────────────────────────────────────────────────
|
|
89
|
+
/**
|
|
90
|
+
* Create a neutral (identity) N³ LUT Data3DTexture.
|
|
91
|
+
* Requires a Three.js instance — pass in the THREE namespace.
|
|
92
|
+
*/
|
|
93
|
+
static createNeutral(THREE, N = 32) {
|
|
94
|
+
const data = new Uint8Array(N * N * N * 4);
|
|
95
|
+
for (let b = 0; b < N; b++) {
|
|
96
|
+
for (let g = 0; g < N; g++) {
|
|
97
|
+
for (let r = 0; r < N; r++) {
|
|
98
|
+
const i = (b * N * N + g * N + r) * 4;
|
|
99
|
+
data[i] = Math.round(r / (N - 1) * 255);
|
|
100
|
+
data[i + 1] = Math.round(g / (N - 1) * 255);
|
|
101
|
+
data[i + 2] = Math.round(b / (N - 1) * 255);
|
|
102
|
+
data[i + 3] = 255;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
return LUT._makeData3DTexture(THREE, data, N);
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Create a Data3DTexture from a mapping function `(r,g,b) => [r,g,b]`
|
|
110
|
+
* where all channels are in [0, 1].
|
|
111
|
+
*/
|
|
112
|
+
static createFromFn(THREE, N, fn) {
|
|
113
|
+
const data = new Uint8Array(N * N * N * 4);
|
|
114
|
+
for (let b = 0; b < N; b++) {
|
|
115
|
+
for (let g = 0; g < N; g++) {
|
|
116
|
+
for (let r = 0; r < N; r++) {
|
|
117
|
+
const [or, og, ob] = fn(r / (N - 1), g / (N - 1), b / (N - 1));
|
|
118
|
+
const i = (b * N * N + g * N + r) * 4;
|
|
119
|
+
data[i] = Math.round(Math.max(0, Math.min(1, or)) * 255);
|
|
120
|
+
data[i + 1] = Math.round(Math.max(0, Math.min(1, og)) * 255);
|
|
121
|
+
data[i + 2] = Math.round(Math.max(0, Math.min(1, ob)) * 255);
|
|
122
|
+
data[i + 3] = 255;
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
return LUT._makeData3DTexture(THREE, data, N);
|
|
127
|
+
}
|
|
128
|
+
static _makeData3DTexture(THREE, data, N) {
|
|
129
|
+
const Cls = THREE['Data3DTexture'];
|
|
130
|
+
if (!Cls)
|
|
131
|
+
throw new Error('LUT: THREE.Data3DTexture not available (requires Three.js r137+).');
|
|
132
|
+
const tex = new Cls(data, N, N, N);
|
|
133
|
+
const texObj = tex;
|
|
134
|
+
texObj['minFilter'] = 1006; // LinearFilter
|
|
135
|
+
texObj['magFilter'] = 1006;
|
|
136
|
+
texObj['unpackAlignment'] = 1;
|
|
137
|
+
texObj['needsUpdate'] = true;
|
|
138
|
+
return tex;
|
|
139
|
+
}
|
|
140
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { BasePass } from '../core/BasePass.js';
|
|
2
|
+
import type { PassRegistry } from '../core/BasePass.js';
|
|
3
|
+
export interface LensFlareOptions {
|
|
4
|
+
/** Number of flare ghosts. Default 6. */
|
|
5
|
+
ghosts?: number;
|
|
6
|
+
/** Overall flare intensity. Default 0.5. */
|
|
7
|
+
strength?: number;
|
|
8
|
+
/** Luminance threshold — only bright pixels generate flares. Default 0.9. */
|
|
9
|
+
threshold?: number;
|
|
10
|
+
/** Halo size as fraction of screen width. Default 0.4. */
|
|
11
|
+
haloWidth?: number;
|
|
12
|
+
/** Chromatic dispersion amount for ghost colouring [0–1]. Default 0.5. */
|
|
13
|
+
chromatic?: number;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* LensFlare — Blender Compositor: Lens Flare / Glare node (lens reflections type).
|
|
17
|
+
*
|
|
18
|
+
* Simulates camera lens flare: bright highlight ghosts reflected along the
|
|
19
|
+
* screen diagonal and a halo ring around bright sources.
|
|
20
|
+
*/
|
|
21
|
+
export declare class LensFlare extends BasePass {
|
|
22
|
+
readonly passType = "LensFlare";
|
|
23
|
+
parameters: {
|
|
24
|
+
ghosts: number;
|
|
25
|
+
strength: number;
|
|
26
|
+
threshold: number;
|
|
27
|
+
haloWidth: number;
|
|
28
|
+
chromatic: number;
|
|
29
|
+
};
|
|
30
|
+
constructor(opts?: LensFlareOptions);
|
|
31
|
+
_threePassDeps(): string[];
|
|
32
|
+
_buildThree(_w: number, _h: number, reg: PassRegistry): unknown;
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=LensFlare.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LensFlare.d.ts","sourceRoot":"","sources":["../../src/passes/LensFlare.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAA;AAC9C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AAEvD,MAAM,WAAW,gBAAgB;IAC/B,yCAAyC;IACzC,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,4CAA4C;IAC5C,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,6EAA6E;IAC7E,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,0DAA0D;IAC1D,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,0EAA0E;IAC1E,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED;;;;;GAKG;AACH,qBAAa,SAAU,SAAQ,QAAQ;IACrC,QAAQ,CAAC,QAAQ,eAAc;IAC/B,UAAU,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAA;gBAE7F,IAAI,GAAE,gBAAqB;IAWvC,cAAc;IAEd,WAAW,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,YAAY,GAAG,OAAO;CAyEhE"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import { BasePass } from '../core/BasePass.js';
|
|
2
|
+
/**
|
|
3
|
+
* LensFlare — Blender Compositor: Lens Flare / Glare node (lens reflections type).
|
|
4
|
+
*
|
|
5
|
+
* Simulates camera lens flare: bright highlight ghosts reflected along the
|
|
6
|
+
* screen diagonal and a halo ring around bright sources.
|
|
7
|
+
*/
|
|
8
|
+
export class LensFlare extends BasePass {
|
|
9
|
+
constructor(opts = {}) {
|
|
10
|
+
super();
|
|
11
|
+
this.passType = 'LensFlare';
|
|
12
|
+
this.parameters = {
|
|
13
|
+
ghosts: opts.ghosts ?? 6,
|
|
14
|
+
strength: opts.strength ?? 0.5,
|
|
15
|
+
threshold: opts.threshold ?? 0.9,
|
|
16
|
+
haloWidth: opts.haloWidth ?? 0.4,
|
|
17
|
+
chromatic: opts.chromatic ?? 0.5,
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
_threePassDeps() { return ['ShaderPass']; }
|
|
21
|
+
_buildThree(_w, _h, reg) {
|
|
22
|
+
const ShaderPass = reg['ShaderPass'];
|
|
23
|
+
if (!ShaderPass)
|
|
24
|
+
throw new Error('LensFlare: ShaderPass not found.');
|
|
25
|
+
const { ghosts, strength, threshold, haloWidth, chromatic } = this.parameters;
|
|
26
|
+
const n = Math.max(1, Math.round(ghosts));
|
|
27
|
+
const shader = {
|
|
28
|
+
uniforms: {
|
|
29
|
+
tDiffuse: { value: null },
|
|
30
|
+
strength: { value: strength },
|
|
31
|
+
threshold: { value: threshold },
|
|
32
|
+
haloWidth: { value: haloWidth },
|
|
33
|
+
chromatic: { value: chromatic },
|
|
34
|
+
},
|
|
35
|
+
vertexShader: `
|
|
36
|
+
varying vec2 vUv;
|
|
37
|
+
void main() { vUv = uv; gl_Position = projectionMatrix * modelViewMatrix * vec4(position,1.0); }
|
|
38
|
+
`,
|
|
39
|
+
fragmentShader: `
|
|
40
|
+
uniform sampler2D tDiffuse;
|
|
41
|
+
uniform float strength;
|
|
42
|
+
uniform float threshold;
|
|
43
|
+
uniform float haloWidth;
|
|
44
|
+
uniform float chromatic;
|
|
45
|
+
varying vec2 vUv;
|
|
46
|
+
|
|
47
|
+
float luminance(vec3 c) { return dot(c, vec3(0.299, 0.587, 0.114)); }
|
|
48
|
+
|
|
49
|
+
vec3 sampleChromatic(vec2 uv, vec2 offset) {
|
|
50
|
+
vec2 r = clamp(uv + offset * (1.0 + chromatic * 0.1), 0.0, 1.0);
|
|
51
|
+
vec2 b = clamp(uv + offset * (1.0 - chromatic * 0.1), 0.0, 1.0);
|
|
52
|
+
return vec3(
|
|
53
|
+
texture2D(tDiffuse, r).r,
|
|
54
|
+
texture2D(tDiffuse, clamp(uv + offset, 0.0, 1.0)).g,
|
|
55
|
+
texture2D(tDiffuse, b).b
|
|
56
|
+
);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
void main() {
|
|
60
|
+
vec4 base = texture2D(tDiffuse, vUv);
|
|
61
|
+
vec3 flare = vec3(0.0);
|
|
62
|
+
vec2 ghost = vec2(0.5) - vUv; // vector to screen centre
|
|
63
|
+
|
|
64
|
+
// Ghost reflections along the screen diagonal
|
|
65
|
+
for (int i = 1; i <= ${n}; i++) {
|
|
66
|
+
float fi = float(i);
|
|
67
|
+
float disp = 0.3 + fi * 0.25;
|
|
68
|
+
vec2 guv = vUv + ghost * disp;
|
|
69
|
+
vec3 samp = sampleChromatic(guv, ghost * 0.01 * fi);
|
|
70
|
+
float lum = luminance(samp);
|
|
71
|
+
if (lum > threshold) {
|
|
72
|
+
vec3 tint = mix(vec3(1.0, 0.8, 0.6), vec3(0.6, 0.8, 1.0), fract(fi * 0.37));
|
|
73
|
+
flare += samp * tint * (lum - threshold) * strength / fi;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
// Halo ring
|
|
78
|
+
float dist = length(ghost);
|
|
79
|
+
float haloBias = abs(dist - haloWidth);
|
|
80
|
+
float halo = smoothstep(0.05, 0.0, haloBias) * strength * 0.5;
|
|
81
|
+
vec4 haloCentre = texture2D(tDiffuse, clamp(vec2(0.5) + normalize(-ghost) * haloWidth, 0.0, 1.0));
|
|
82
|
+
if (luminance(haloCentre.rgb) > threshold) {
|
|
83
|
+
flare += haloCentre.rgb * halo;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
gl_FragColor = vec4(base.rgb + flare, base.a);
|
|
87
|
+
}
|
|
88
|
+
`,
|
|
89
|
+
};
|
|
90
|
+
return new ShaderPass(shader);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { BasePass } from '../core/BasePass.js';
|
|
2
|
+
import type { PassRegistry } from '../core/BasePass.js';
|
|
3
|
+
export interface MixOptions {
|
|
4
|
+
/** Blend factor [0–1]. 0 = pass A only, 1 = pass B only. Default 0.5. Blender: Mix → Fac */
|
|
5
|
+
fac?: number;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Mix — Blender Compositor: Mix node.
|
|
9
|
+
*
|
|
10
|
+
* Blends the current compositor output with a saved texture snapshot.
|
|
11
|
+
* In practice this wraps a simple alpha-blend shader over the render target.
|
|
12
|
+
* For full A/B compositing, use two separate CompositorOutput chains.
|
|
13
|
+
*/
|
|
14
|
+
export declare class Mix extends BasePass {
|
|
15
|
+
readonly passType = "Mix";
|
|
16
|
+
parameters: {
|
|
17
|
+
fac: number;
|
|
18
|
+
};
|
|
19
|
+
constructor(opts?: MixOptions);
|
|
20
|
+
_threePassDeps(): string[];
|
|
21
|
+
_buildThree(_width: number, _height: number, reg: PassRegistry): unknown;
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=Mix.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Mix.d.ts","sourceRoot":"","sources":["../../src/passes/Mix.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAA;AAC9C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AAEvD,MAAM,WAAW,UAAU;IACzB,4FAA4F;IAC5F,GAAG,CAAC,EAAE,MAAM,CAAA;CACb;AAED;;;;;;GAMG;AACH,qBAAa,GAAI,SAAQ,QAAQ;IAC/B,QAAQ,CAAC,QAAQ,SAAQ;IACzB,UAAU,EAAE;QAAE,GAAG,EAAE,MAAM,CAAA;KAAE,CAAA;gBAEf,IAAI,GAAE,UAAe;IAKjC,cAAc;IAEd,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,YAAY,GAAG,OAAO;CAyBzE"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { BasePass } from '../core/BasePass.js';
|
|
2
|
+
/**
|
|
3
|
+
* Mix — Blender Compositor: Mix node.
|
|
4
|
+
*
|
|
5
|
+
* Blends the current compositor output with a saved texture snapshot.
|
|
6
|
+
* In practice this wraps a simple alpha-blend shader over the render target.
|
|
7
|
+
* For full A/B compositing, use two separate CompositorOutput chains.
|
|
8
|
+
*/
|
|
9
|
+
export class Mix extends BasePass {
|
|
10
|
+
constructor(opts = {}) {
|
|
11
|
+
super();
|
|
12
|
+
this.passType = 'Mix';
|
|
13
|
+
this.parameters = { fac: opts.fac ?? 0.5 };
|
|
14
|
+
}
|
|
15
|
+
_threePassDeps() { return ['ShaderPass']; }
|
|
16
|
+
_buildThree(_width, _height, reg) {
|
|
17
|
+
const ShaderPass = reg['ShaderPass'];
|
|
18
|
+
if (!ShaderPass)
|
|
19
|
+
throw new Error('Mix: ShaderPass not found in three/addons.');
|
|
20
|
+
const shader = {
|
|
21
|
+
uniforms: {
|
|
22
|
+
tDiffuse: { value: null },
|
|
23
|
+
fac: { value: this.parameters.fac },
|
|
24
|
+
},
|
|
25
|
+
vertexShader: `
|
|
26
|
+
varying vec2 vUv;
|
|
27
|
+
void main() { vUv = uv; gl_Position = projectionMatrix * modelViewMatrix * vec4(position,1.0); }
|
|
28
|
+
`,
|
|
29
|
+
fragmentShader: `
|
|
30
|
+
uniform sampler2D tDiffuse;
|
|
31
|
+
uniform float fac;
|
|
32
|
+
varying vec2 vUv;
|
|
33
|
+
void main() {
|
|
34
|
+
vec4 col = texture2D(tDiffuse, vUv);
|
|
35
|
+
gl_FragColor = vec4(col.rgb, col.a * (1.0 - fac) + fac);
|
|
36
|
+
}
|
|
37
|
+
`,
|
|
38
|
+
};
|
|
39
|
+
return new ShaderPass(shader);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { BasePass } from '../core/BasePass.js';
|
|
2
|
+
import type { PassRegistry } from '../core/BasePass.js';
|
|
3
|
+
export interface MotionBlurOptions {
|
|
4
|
+
/** Number of accumulation samples. Higher = smoother but slower. Default 8. */
|
|
5
|
+
samples?: number;
|
|
6
|
+
/**
|
|
7
|
+
* Velocity scale — how far samples are spread from the velocity vector.
|
|
8
|
+
* Blender: Vector Blur → Speed. Default 1.0.
|
|
9
|
+
*/
|
|
10
|
+
velocityScale?: number;
|
|
11
|
+
/**
|
|
12
|
+
* Maximum blur radius in pixels. Clamps per-pixel blur length.
|
|
13
|
+
* Default 20.
|
|
14
|
+
*/
|
|
15
|
+
maxRadius?: number;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* MotionBlur — screen-space radial/directional motion blur.
|
|
19
|
+
* Blender Compositor: Vector Blur node.
|
|
20
|
+
*
|
|
21
|
+
* Screen-space approximation: samples radially from screen centre,
|
|
22
|
+
* simulating camera shake / fast-pan motion blur.
|
|
23
|
+
* For true per-object motion blur, a velocity buffer is required
|
|
24
|
+
* (beyond single-pass EffectComposer scope — this is a visual approximation).
|
|
25
|
+
*/
|
|
26
|
+
export declare class MotionBlur extends BasePass {
|
|
27
|
+
readonly passType = "MotionBlur";
|
|
28
|
+
parameters: {
|
|
29
|
+
samples: number;
|
|
30
|
+
velocityScale: number;
|
|
31
|
+
maxRadius: number;
|
|
32
|
+
};
|
|
33
|
+
constructor(opts?: MotionBlurOptions);
|
|
34
|
+
_threePassDeps(): string[];
|
|
35
|
+
_buildThree(_w: number, _h: number, reg: PassRegistry): unknown;
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=MotionBlur.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MotionBlur.d.ts","sourceRoot":"","sources":["../../src/passes/MotionBlur.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAA;AAC9C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AAEvD,MAAM,WAAW,iBAAiB;IAChC,+EAA+E;IAC/E,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB;;;OAGG;IACH,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED;;;;;;;;GAQG;AACH,qBAAa,UAAW,SAAQ,QAAQ;IACtC,QAAQ,CAAC,QAAQ,gBAAe;IAChC,UAAU,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAA;gBAE7D,IAAI,GAAE,iBAAsB;IASxC,cAAc;IAEd,WAAW,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,YAAY,GAAG,OAAO;CA6ChE"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { BasePass } from '../core/BasePass.js';
|
|
2
|
+
/**
|
|
3
|
+
* MotionBlur — screen-space radial/directional motion blur.
|
|
4
|
+
* Blender Compositor: Vector Blur node.
|
|
5
|
+
*
|
|
6
|
+
* Screen-space approximation: samples radially from screen centre,
|
|
7
|
+
* simulating camera shake / fast-pan motion blur.
|
|
8
|
+
* For true per-object motion blur, a velocity buffer is required
|
|
9
|
+
* (beyond single-pass EffectComposer scope — this is a visual approximation).
|
|
10
|
+
*/
|
|
11
|
+
export class MotionBlur extends BasePass {
|
|
12
|
+
constructor(opts = {}) {
|
|
13
|
+
super();
|
|
14
|
+
this.passType = 'MotionBlur';
|
|
15
|
+
this.parameters = {
|
|
16
|
+
samples: opts.samples ?? 8,
|
|
17
|
+
velocityScale: opts.velocityScale ?? 1.0,
|
|
18
|
+
maxRadius: opts.maxRadius ?? 20,
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
_threePassDeps() { return ['ShaderPass']; }
|
|
22
|
+
_buildThree(_w, _h, reg) {
|
|
23
|
+
const ShaderPass = reg['ShaderPass'];
|
|
24
|
+
if (!ShaderPass)
|
|
25
|
+
throw new Error('MotionBlur: ShaderPass not found.');
|
|
26
|
+
const { samples, velocityScale, maxRadius } = this.parameters;
|
|
27
|
+
const n = Math.max(1, Math.round(samples));
|
|
28
|
+
const shader = {
|
|
29
|
+
uniforms: {
|
|
30
|
+
tDiffuse: { value: null },
|
|
31
|
+
resolution: { value: [1920, 1080] },
|
|
32
|
+
velocityScale: { value: velocityScale },
|
|
33
|
+
maxRadius: { value: maxRadius },
|
|
34
|
+
},
|
|
35
|
+
vertexShader: `
|
|
36
|
+
varying vec2 vUv;
|
|
37
|
+
void main() { vUv = uv; gl_Position = projectionMatrix * modelViewMatrix * vec4(position,1.0); }
|
|
38
|
+
`,
|
|
39
|
+
fragmentShader: `
|
|
40
|
+
uniform sampler2D tDiffuse;
|
|
41
|
+
uniform vec2 resolution;
|
|
42
|
+
uniform float velocityScale;
|
|
43
|
+
uniform float maxRadius;
|
|
44
|
+
varying vec2 vUv;
|
|
45
|
+
|
|
46
|
+
void main() {
|
|
47
|
+
// Screen-space radial blur toward centre
|
|
48
|
+
vec2 centre = vec2(0.5);
|
|
49
|
+
vec2 vel = (centre - vUv) * velocityScale;
|
|
50
|
+
float len = length(vel * resolution);
|
|
51
|
+
if (len > maxRadius) vel = vel * (maxRadius / max(len, 0.001));
|
|
52
|
+
|
|
53
|
+
vec4 acc = vec4(0.0);
|
|
54
|
+
for (int i = 0; i < ${n}; i++) {
|
|
55
|
+
float t = float(i) / float(${n - 1});
|
|
56
|
+
vec2 uv = clamp(vUv + vel * t / resolution, 0.0, 1.0);
|
|
57
|
+
acc += texture2D(tDiffuse, uv);
|
|
58
|
+
}
|
|
59
|
+
gl_FragColor = acc / float(${n});
|
|
60
|
+
}
|
|
61
|
+
`,
|
|
62
|
+
};
|
|
63
|
+
return new ShaderPass(shader);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { BasePass } from '../core/BasePass.js';
|
|
2
|
+
import type { PassRegistry } from '../core/BasePass.js';
|
|
3
|
+
export interface PixelateOptions {
|
|
4
|
+
/** Pixel block size in screen pixels. Default 8. Blender: Pixelate node */
|
|
5
|
+
pixelSize?: number;
|
|
6
|
+
}
|
|
7
|
+
/** Pixelate — Blender Compositor: Pixelate node */
|
|
8
|
+
export declare class Pixelate extends BasePass {
|
|
9
|
+
readonly passType = "Pixelate";
|
|
10
|
+
parameters: {
|
|
11
|
+
pixelSize: number;
|
|
12
|
+
};
|
|
13
|
+
constructor(opts?: PixelateOptions);
|
|
14
|
+
_threePassDeps(): string[];
|
|
15
|
+
_buildThree(_width: number, _height: number, reg: PassRegistry): unknown;
|
|
16
|
+
_buildPmndrs(reg: PassRegistry): unknown;
|
|
17
|
+
get _isPmndrsEffect(): boolean;
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=Pixelate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Pixelate.d.ts","sourceRoot":"","sources":["../../src/passes/Pixelate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAA;AAC9C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AAEvD,MAAM,WAAW,eAAe;IAC9B,2EAA2E;IAC3E,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED,mDAAmD;AACnD,qBAAa,QAAS,SAAQ,QAAQ;IACpC,QAAQ,CAAC,QAAQ,cAAa;IAC9B,UAAU,EAAE;QAAE,SAAS,EAAE,MAAM,CAAA;KAAE,CAAA;gBAErB,IAAI,GAAE,eAAoB;IAKtC,cAAc;IAEd,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,YAAY,GAAG,OAAO;IA6B/D,YAAY,CAAC,GAAG,EAAE,YAAY,GAAG,OAAO;IAMjD,IAAa,eAAe,IAAI,OAAO,CAAgB;CACxD"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { BasePass } from '../core/BasePass.js';
|
|
2
|
+
/** Pixelate — Blender Compositor: Pixelate node */
|
|
3
|
+
export class Pixelate extends BasePass {
|
|
4
|
+
constructor(opts = {}) {
|
|
5
|
+
super();
|
|
6
|
+
this.passType = 'Pixelate';
|
|
7
|
+
this.parameters = { pixelSize: opts.pixelSize ?? 8 };
|
|
8
|
+
}
|
|
9
|
+
_threePassDeps() { return ['ShaderPass']; }
|
|
10
|
+
_buildThree(_width, _height, reg) {
|
|
11
|
+
const ShaderPass = reg['ShaderPass'];
|
|
12
|
+
if (!ShaderPass)
|
|
13
|
+
throw new Error('Pixelate: ShaderPass not found in three/addons.');
|
|
14
|
+
const shader = {
|
|
15
|
+
uniforms: {
|
|
16
|
+
tDiffuse: { value: null },
|
|
17
|
+
resolution: { value: [_width, _height] },
|
|
18
|
+
pixelSize: { value: this.parameters.pixelSize },
|
|
19
|
+
},
|
|
20
|
+
vertexShader: `
|
|
21
|
+
varying vec2 vUv;
|
|
22
|
+
void main() { vUv = uv; gl_Position = projectionMatrix * modelViewMatrix * vec4(position,1.0); }
|
|
23
|
+
`,
|
|
24
|
+
fragmentShader: `
|
|
25
|
+
uniform sampler2D tDiffuse;
|
|
26
|
+
uniform vec2 resolution;
|
|
27
|
+
uniform float pixelSize;
|
|
28
|
+
varying vec2 vUv;
|
|
29
|
+
void main() {
|
|
30
|
+
vec2 dxy = pixelSize / resolution;
|
|
31
|
+
vec2 uv = dxy * floor(vUv / dxy);
|
|
32
|
+
gl_FragColor = texture2D(tDiffuse, uv);
|
|
33
|
+
}
|
|
34
|
+
`,
|
|
35
|
+
};
|
|
36
|
+
return new ShaderPass(shader);
|
|
37
|
+
}
|
|
38
|
+
_buildPmndrs(reg) {
|
|
39
|
+
const Effect = reg['PixelationEffect'];
|
|
40
|
+
if (!Effect)
|
|
41
|
+
throw new Error('Pixelate: PixelationEffect not found in postprocessing.');
|
|
42
|
+
return new Effect(this.parameters.pixelSize);
|
|
43
|
+
}
|
|
44
|
+
get _isPmndrsEffect() { return true; }
|
|
45
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { BasePass } from '../core/BasePass.js';
|
|
2
|
+
import type { PassRegistry } from '../core/BasePass.js';
|
|
3
|
+
export interface RenderLayersOptions {
|
|
4
|
+
/** Three.js layer mask to render. Default 0xffffffff (all layers). */
|
|
5
|
+
layerMask?: number;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* RenderLayers — render a specific Three.js layer mask into the buffer.
|
|
9
|
+
* Blender Compositor: Render Layers node.
|
|
10
|
+
*
|
|
11
|
+
* Replaces the default RenderPass with one that temporarily sets
|
|
12
|
+
* camera.layers to the given mask, then restores it.
|
|
13
|
+
*
|
|
14
|
+
* Usage:
|
|
15
|
+
* // Render only layer 1
|
|
16
|
+
* comp.add(new RenderLayers({ layerMask: 2 }))
|
|
17
|
+
*
|
|
18
|
+
* Note: because EffectComposer always prepends its own RenderPass,
|
|
19
|
+
* this pass renders an additional layer-filtered pass on top.
|
|
20
|
+
* For full control, set layerMask = 0xffffffff to render all layers.
|
|
21
|
+
*/
|
|
22
|
+
export declare class RenderLayers extends BasePass {
|
|
23
|
+
readonly passType = "RenderLayers";
|
|
24
|
+
parameters: {
|
|
25
|
+
layerMask: number;
|
|
26
|
+
};
|
|
27
|
+
constructor(opts?: RenderLayersOptions);
|
|
28
|
+
_threePassDeps(): string[];
|
|
29
|
+
_buildThree(_width: number, _height: number, reg: PassRegistry): unknown;
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=RenderLayers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RenderLayers.d.ts","sourceRoot":"","sources":["../../src/passes/RenderLayers.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAA;AAC9C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AAEvD,MAAM,WAAW,mBAAmB;IAClC,sEAAsE;IACtE,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED;;;;;;;;;;;;;;GAcG;AACH,qBAAa,YAAa,SAAQ,QAAQ;IACxC,QAAQ,CAAC,QAAQ,kBAAiB;IAClC,UAAU,EAAE;QAAE,SAAS,EAAE,MAAM,CAAA;KAAE,CAAA;gBAErB,IAAI,GAAE,mBAAwB;IAK1C,cAAc;IAEd,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,YAAY,GAAG,OAAO;CA8BzE"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { BasePass } from '../core/BasePass.js';
|
|
2
|
+
/**
|
|
3
|
+
* RenderLayers — render a specific Three.js layer mask into the buffer.
|
|
4
|
+
* Blender Compositor: Render Layers node.
|
|
5
|
+
*
|
|
6
|
+
* Replaces the default RenderPass with one that temporarily sets
|
|
7
|
+
* camera.layers to the given mask, then restores it.
|
|
8
|
+
*
|
|
9
|
+
* Usage:
|
|
10
|
+
* // Render only layer 1
|
|
11
|
+
* comp.add(new RenderLayers({ layerMask: 2 }))
|
|
12
|
+
*
|
|
13
|
+
* Note: because EffectComposer always prepends its own RenderPass,
|
|
14
|
+
* this pass renders an additional layer-filtered pass on top.
|
|
15
|
+
* For full control, set layerMask = 0xffffffff to render all layers.
|
|
16
|
+
*/
|
|
17
|
+
export class RenderLayers extends BasePass {
|
|
18
|
+
constructor(opts = {}) {
|
|
19
|
+
super();
|
|
20
|
+
this.passType = 'RenderLayers';
|
|
21
|
+
this.parameters = { layerMask: opts.layerMask ?? 0xffffffff };
|
|
22
|
+
}
|
|
23
|
+
_threePassDeps() { return ['RenderPass']; }
|
|
24
|
+
_buildThree(_width, _height, reg) {
|
|
25
|
+
const RenderPass = reg['RenderPass'];
|
|
26
|
+
if (!RenderPass)
|
|
27
|
+
throw new Error('RenderLayers: RenderPass not found in three/addons.');
|
|
28
|
+
const scene = reg['_scene'];
|
|
29
|
+
const camera = reg['_camera'];
|
|
30
|
+
if (!scene || !camera)
|
|
31
|
+
throw new Error('RenderLayers: scene/camera not injected into registry.');
|
|
32
|
+
const mask = this.parameters.layerMask;
|
|
33
|
+
// Build a custom RenderPass wrapper that applies the layer mask
|
|
34
|
+
const pass = new RenderPass(scene, camera);
|
|
35
|
+
const origRender = pass['render'];
|
|
36
|
+
pass['render'] = function (renderer, writeBuffer, readBuffer, ...rest) {
|
|
37
|
+
const layers = camera['layers'];
|
|
38
|
+
const savedMask = layers.mask;
|
|
39
|
+
layers.mask = mask;
|
|
40
|
+
origRender.call(this, renderer, writeBuffer, readBuffer, ...rest);
|
|
41
|
+
layers.mask = savedMask;
|
|
42
|
+
};
|
|
43
|
+
return pass;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { BasePass } from '../core/BasePass.js';
|
|
2
|
+
import type { PassRegistry } from '../core/BasePass.js';
|
|
3
|
+
export interface SSAOOptions {
|
|
4
|
+
/** AO sample radius in world units. Default 0.5. Blender: Ambient Occlusion → Distance */
|
|
5
|
+
radius?: number;
|
|
6
|
+
/** Minimum depth difference to generate occlusion. Default 0.005. */
|
|
7
|
+
minDistance?: number;
|
|
8
|
+
/** Maximum depth difference to generate occlusion. Default 0.1. */
|
|
9
|
+
maxDistance?: number;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* SSAO — Screen Space Ambient Occlusion.
|
|
13
|
+
* Blender Compositor: Ambient Occlusion pass.
|
|
14
|
+
*
|
|
15
|
+
* Wraps Three.js SSAOPass from three/addons.
|
|
16
|
+
* Requires scene and camera — injected automatically by CompositorOutput.
|
|
17
|
+
*
|
|
18
|
+
* Post-compile injection needed:
|
|
19
|
+
* ```typescript
|
|
20
|
+
* comp.compile(renderer, scene, camera)
|
|
21
|
+
* ```
|
|
22
|
+
*/
|
|
23
|
+
export declare class SSAO extends BasePass {
|
|
24
|
+
readonly passType = "SSAO";
|
|
25
|
+
parameters: {
|
|
26
|
+
radius: number;
|
|
27
|
+
minDistance: number;
|
|
28
|
+
maxDistance: number;
|
|
29
|
+
};
|
|
30
|
+
constructor(opts?: SSAOOptions);
|
|
31
|
+
_threePassDeps(): string[];
|
|
32
|
+
_buildThree(width: number, height: number, reg: PassRegistry): unknown;
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=SSAO.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SSAO.d.ts","sourceRoot":"","sources":["../../src/passes/SSAO.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAA;AAC9C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AAEvD,MAAM,WAAW,WAAW;IAC1B,0FAA0F;IAC1F,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,qEAAqE;IACrE,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,mEAAmE;IACnE,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB;AAED;;;;;;;;;;;GAWG;AACH,qBAAa,IAAK,SAAQ,QAAQ;IAChC,QAAQ,CAAC,QAAQ,UAAS;IAC1B,UAAU,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAA;gBAE5D,IAAI,GAAE,WAAgB;IASlC,cAAc;IAEd,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,YAAY,GAAG,OAAO;CAcvE"}
|