@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,42 @@
|
|
|
1
|
+
import { BasePass } from '../core/BasePass.js';
|
|
2
|
+
/** Exposure — Blender Compositor: Exposure node */
|
|
3
|
+
export class Exposure extends BasePass {
|
|
4
|
+
constructor(opts = {}) {
|
|
5
|
+
super();
|
|
6
|
+
this.passType = 'Exposure';
|
|
7
|
+
this.parameters = { exposure: opts.exposure ?? 0 };
|
|
8
|
+
}
|
|
9
|
+
_threePassDeps() { return ['ShaderPass']; }
|
|
10
|
+
_buildThree(_width, _height, reg) {
|
|
11
|
+
const ShaderPass = reg['ShaderPass'];
|
|
12
|
+
if (!ShaderPass)
|
|
13
|
+
throw new Error('Exposure: ShaderPass not found in three/addons.');
|
|
14
|
+
const shader = {
|
|
15
|
+
uniforms: {
|
|
16
|
+
tDiffuse: { value: null },
|
|
17
|
+
exposure: { value: this.parameters.exposure },
|
|
18
|
+
},
|
|
19
|
+
vertexShader: `
|
|
20
|
+
varying vec2 vUv;
|
|
21
|
+
void main() { vUv = uv; gl_Position = projectionMatrix * modelViewMatrix * vec4(position,1.0); }
|
|
22
|
+
`,
|
|
23
|
+
fragmentShader: `
|
|
24
|
+
uniform sampler2D tDiffuse;
|
|
25
|
+
uniform float exposure;
|
|
26
|
+
varying vec2 vUv;
|
|
27
|
+
void main() {
|
|
28
|
+
vec4 tex = texture2D(tDiffuse, vUv);
|
|
29
|
+
gl_FragColor = vec4(tex.rgb * pow(2.0, exposure), tex.a);
|
|
30
|
+
}
|
|
31
|
+
`,
|
|
32
|
+
};
|
|
33
|
+
return new ShaderPass(shader);
|
|
34
|
+
}
|
|
35
|
+
_buildPmndrs(reg) {
|
|
36
|
+
const Effect = reg['ToneMappingEffect'];
|
|
37
|
+
if (!Effect)
|
|
38
|
+
throw new Error('Exposure: ToneMappingEffect not found in postprocessing.');
|
|
39
|
+
return new Effect({ exposure: Math.pow(2.0, this.parameters.exposure) });
|
|
40
|
+
}
|
|
41
|
+
get _isPmndrsEffect() { return true; }
|
|
42
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { BasePass } from '../core/BasePass.js';
|
|
2
|
+
import type { PassRegistry } from '../core/BasePass.js';
|
|
3
|
+
export interface FilmGrainOptions {
|
|
4
|
+
/** Noise intensity [0–1]. Default 0.35. Blender: Film node → Grain */
|
|
5
|
+
intensity?: number;
|
|
6
|
+
/** Greyscale grain. Default false. Blender: Film node → Greyscale */
|
|
7
|
+
greyscale?: boolean;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* FilmGrain — Blender Compositor: Film node.
|
|
11
|
+
*
|
|
12
|
+
* Uses Three.js FilmPass (r165 constructor: intensity, grayscale).
|
|
13
|
+
*/
|
|
14
|
+
export declare class FilmGrain extends BasePass {
|
|
15
|
+
readonly passType = "FilmGrain";
|
|
16
|
+
parameters: {
|
|
17
|
+
intensity: number;
|
|
18
|
+
greyscale: number;
|
|
19
|
+
};
|
|
20
|
+
constructor(opts?: FilmGrainOptions);
|
|
21
|
+
_threePassDeps(): string[];
|
|
22
|
+
_buildThree(_width: number, _height: number, reg: PassRegistry): unknown;
|
|
23
|
+
_buildPmndrs(reg: PassRegistry): unknown;
|
|
24
|
+
get _isPmndrsEffect(): boolean;
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=FilmGrain.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FilmGrain.d.ts","sourceRoot":"","sources":["../../src/passes/FilmGrain.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,sEAAsE;IACtE,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,qEAAqE;IACrE,SAAS,CAAC,EAAE,OAAO,CAAA;CACpB;AAED;;;;GAIG;AACH,qBAAa,SAAU,SAAQ,QAAQ;IACrC,QAAQ,CAAC,QAAQ,eAAc;IAC/B,UAAU,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAA;gBAExC,IAAI,GAAE,gBAAqB;IAQvC,cAAc;IAEd,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,YAAY,GAAG,OAAO;IAU/D,YAAY,CAAC,GAAG,EAAE,YAAY,GAAG,OAAO;IAMjD,IAAa,eAAe,IAAI,OAAO,CAAgB;CACxD"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { BasePass } from '../core/BasePass.js';
|
|
2
|
+
/**
|
|
3
|
+
* FilmGrain — Blender Compositor: Film node.
|
|
4
|
+
*
|
|
5
|
+
* Uses Three.js FilmPass (r165 constructor: intensity, grayscale).
|
|
6
|
+
*/
|
|
7
|
+
export class FilmGrain extends BasePass {
|
|
8
|
+
constructor(opts = {}) {
|
|
9
|
+
super();
|
|
10
|
+
this.passType = 'FilmGrain';
|
|
11
|
+
this.parameters = {
|
|
12
|
+
intensity: opts.intensity ?? 0.35,
|
|
13
|
+
greyscale: opts.greyscale ? 1 : 0,
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
_threePassDeps() { return ['FilmPass']; }
|
|
17
|
+
_buildThree(_width, _height, reg) {
|
|
18
|
+
const Pass = reg['FilmPass'];
|
|
19
|
+
if (!Pass)
|
|
20
|
+
throw new Error('FilmGrain: FilmPass not found in three/addons.');
|
|
21
|
+
// r165 FilmPass(intensity, grayscale)
|
|
22
|
+
return new Pass(this.parameters.intensity, this.parameters.greyscale > 0.5);
|
|
23
|
+
}
|
|
24
|
+
_buildPmndrs(reg) {
|
|
25
|
+
const Effect = reg['NoiseEffect'];
|
|
26
|
+
if (!Effect)
|
|
27
|
+
throw new Error('FilmGrain: NoiseEffect not found in postprocessing.');
|
|
28
|
+
return new Effect({ premultiply: true });
|
|
29
|
+
}
|
|
30
|
+
get _isPmndrsEffect() { return true; }
|
|
31
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { BasePass } from '../core/BasePass.js';
|
|
2
|
+
import type { PassRegistry } from '../core/BasePass.js';
|
|
3
|
+
export interface GammaOptions {
|
|
4
|
+
/** Gamma exponent. Default 1.0 (no change). Blender: Gamma → Gamma */
|
|
5
|
+
gamma?: number;
|
|
6
|
+
}
|
|
7
|
+
/** Gamma — Blender Compositor: Gamma node */
|
|
8
|
+
export declare class Gamma extends BasePass {
|
|
9
|
+
readonly passType = "Gamma";
|
|
10
|
+
parameters: {
|
|
11
|
+
gamma: number;
|
|
12
|
+
};
|
|
13
|
+
constructor(opts?: GammaOptions);
|
|
14
|
+
_threePassDeps(): string[];
|
|
15
|
+
_buildThree(_width: number, _height: number, reg: PassRegistry): unknown;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=Gamma.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Gamma.d.ts","sourceRoot":"","sources":["../../src/passes/Gamma.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAA;AAC9C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AAEvD,MAAM,WAAW,YAAY;IAC3B,sEAAsE;IACtE,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AAED,6CAA6C;AAC7C,qBAAa,KAAM,SAAQ,QAAQ;IACjC,QAAQ,CAAC,QAAQ,WAAU;IAC3B,UAAU,EAAE;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,CAAA;gBAEjB,IAAI,GAAE,YAAiB;IAKnC,cAAc;IAEd,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,YAAY,GAAG,OAAO;CA0BzE"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { BasePass } from '../core/BasePass.js';
|
|
2
|
+
/** Gamma — Blender Compositor: Gamma node */
|
|
3
|
+
export class Gamma extends BasePass {
|
|
4
|
+
constructor(opts = {}) {
|
|
5
|
+
super();
|
|
6
|
+
this.passType = 'Gamma';
|
|
7
|
+
this.parameters = { gamma: opts.gamma ?? 1.0 };
|
|
8
|
+
}
|
|
9
|
+
_threePassDeps() { return ['ShaderPass']; }
|
|
10
|
+
_buildThree(_width, _height, reg) {
|
|
11
|
+
const ShaderPass = reg['ShaderPass'];
|
|
12
|
+
if (!ShaderPass)
|
|
13
|
+
throw new Error('Gamma: ShaderPass not found in three/addons.');
|
|
14
|
+
const shader = {
|
|
15
|
+
uniforms: {
|
|
16
|
+
tDiffuse: { value: null },
|
|
17
|
+
gamma: { value: this.parameters.gamma },
|
|
18
|
+
},
|
|
19
|
+
vertexShader: `
|
|
20
|
+
varying vec2 vUv;
|
|
21
|
+
void main() { vUv = uv; gl_Position = projectionMatrix * modelViewMatrix * vec4(position,1.0); }
|
|
22
|
+
`,
|
|
23
|
+
fragmentShader: `
|
|
24
|
+
uniform sampler2D tDiffuse;
|
|
25
|
+
uniform float gamma;
|
|
26
|
+
varying vec2 vUv;
|
|
27
|
+
void main() {
|
|
28
|
+
vec4 tex = texture2D(tDiffuse, vUv);
|
|
29
|
+
float g = max(gamma, 0.0001);
|
|
30
|
+
gl_FragColor = vec4(pow(max(tex.rgb, vec3(0.0)), vec3(1.0 / g)), tex.a);
|
|
31
|
+
}
|
|
32
|
+
`,
|
|
33
|
+
};
|
|
34
|
+
return new ShaderPass(shader);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { BasePass } from '../core/BasePass.js';
|
|
2
|
+
import type { PassRegistry } from '../core/BasePass.js';
|
|
3
|
+
export interface GaussianBlurOptions {
|
|
4
|
+
/** Blur sigma (standard deviation in pixels). Blender: Bilateral Blur → Iterations. Default 2. */
|
|
5
|
+
sigma?: number;
|
|
6
|
+
/** Number of passes (1 = single-pass, 2 = separable H+V). Default 2. */
|
|
7
|
+
passes?: number;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* GaussianBlur — separable Gaussian blur.
|
|
11
|
+
* Blender Compositor: Blur node (Gaussian filter type) / Bilateral Blur.
|
|
12
|
+
*
|
|
13
|
+
* Two-pass separable implementation: horizontal then vertical.
|
|
14
|
+
* `sigma` controls the standard deviation (width of the bell curve).
|
|
15
|
+
*/
|
|
16
|
+
export declare class GaussianBlur extends BasePass {
|
|
17
|
+
readonly passType = "GaussianBlur";
|
|
18
|
+
parameters: {
|
|
19
|
+
sigma: number;
|
|
20
|
+
passes: number;
|
|
21
|
+
};
|
|
22
|
+
constructor(opts?: GaussianBlurOptions);
|
|
23
|
+
_threePassDeps(): string[];
|
|
24
|
+
_buildThree(_w: number, _h: number, reg: PassRegistry): unknown;
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=GaussianBlur.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GaussianBlur.d.ts","sourceRoot":"","sources":["../../src/passes/GaussianBlur.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAA;AAC9C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AAEvD,MAAM,WAAW,mBAAmB;IAClC,kGAAkG;IAClG,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,wEAAwE;IACxE,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAED;;;;;;GAMG;AACH,qBAAa,YAAa,SAAQ,QAAQ;IACxC,QAAQ,CAAC,QAAQ,kBAAiB;IAClC,UAAU,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAA;gBAEjC,IAAI,GAAE,mBAAwB;IAQ1C,cAAc;IAEd,WAAW,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,YAAY,GAAG,OAAO;CAsDhE"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import { BasePass } from '../core/BasePass.js';
|
|
2
|
+
/**
|
|
3
|
+
* GaussianBlur — separable Gaussian blur.
|
|
4
|
+
* Blender Compositor: Blur node (Gaussian filter type) / Bilateral Blur.
|
|
5
|
+
*
|
|
6
|
+
* Two-pass separable implementation: horizontal then vertical.
|
|
7
|
+
* `sigma` controls the standard deviation (width of the bell curve).
|
|
8
|
+
*/
|
|
9
|
+
export class GaussianBlur extends BasePass {
|
|
10
|
+
constructor(opts = {}) {
|
|
11
|
+
super();
|
|
12
|
+
this.passType = 'GaussianBlur';
|
|
13
|
+
this.parameters = {
|
|
14
|
+
sigma: opts.sigma ?? 2,
|
|
15
|
+
passes: opts.passes ?? 2,
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
_threePassDeps() { return ['ShaderPass']; }
|
|
19
|
+
_buildThree(_w, _h, reg) {
|
|
20
|
+
const ShaderPass = reg['ShaderPass'];
|
|
21
|
+
if (!ShaderPass)
|
|
22
|
+
throw new Error('GaussianBlur: ShaderPass not found.');
|
|
23
|
+
const sigma = Math.max(0.1, this.parameters.sigma);
|
|
24
|
+
// 7-tap kernel weights from sigma
|
|
25
|
+
const kernel = gaussKernel7(sigma);
|
|
26
|
+
const makePass = (horizontal) => new ShaderPass({
|
|
27
|
+
uniforms: {
|
|
28
|
+
tDiffuse: { value: null },
|
|
29
|
+
resolution: { value: [1920, 1080] },
|
|
30
|
+
horizontal: { value: horizontal ? 1.0 : 0.0 },
|
|
31
|
+
sigma: { value: sigma },
|
|
32
|
+
},
|
|
33
|
+
vertexShader: `
|
|
34
|
+
varying vec2 vUv;
|
|
35
|
+
void main() { vUv = uv; gl_Position = projectionMatrix * modelViewMatrix * vec4(position,1.0); }
|
|
36
|
+
`,
|
|
37
|
+
fragmentShader: `
|
|
38
|
+
uniform sampler2D tDiffuse;
|
|
39
|
+
uniform vec2 resolution;
|
|
40
|
+
uniform float horizontal;
|
|
41
|
+
uniform float sigma;
|
|
42
|
+
varying vec2 vUv;
|
|
43
|
+
|
|
44
|
+
void main() {
|
|
45
|
+
vec2 texel = 1.0 / resolution;
|
|
46
|
+
vec2 dir = horizontal > 0.5 ? vec2(texel.x, 0.0) : vec2(0.0, texel.y);
|
|
47
|
+
|
|
48
|
+
float weights[7];
|
|
49
|
+
weights[0] = ${kernel[0].toFixed(6)};
|
|
50
|
+
weights[1] = ${kernel[1].toFixed(6)};
|
|
51
|
+
weights[2] = ${kernel[2].toFixed(6)};
|
|
52
|
+
weights[3] = ${kernel[3].toFixed(6)};
|
|
53
|
+
weights[4] = ${kernel[4].toFixed(6)};
|
|
54
|
+
weights[5] = ${kernel[5].toFixed(6)};
|
|
55
|
+
weights[6] = ${kernel[6].toFixed(6)};
|
|
56
|
+
|
|
57
|
+
vec4 result = vec4(0.0);
|
|
58
|
+
for (int i = 0; i < 7; i++) {
|
|
59
|
+
float offset = float(i - 3);
|
|
60
|
+
result += texture2D(tDiffuse, vUv + dir * offset * sigma) * weights[i];
|
|
61
|
+
}
|
|
62
|
+
gl_FragColor = result;
|
|
63
|
+
}
|
|
64
|
+
`,
|
|
65
|
+
});
|
|
66
|
+
// Return the horizontal pass; vertical pass is added automatically
|
|
67
|
+
// by returning an array-like structure. For simplicity return horizontal only
|
|
68
|
+
// and let the user add a second GaussianBlur pass for full separable blur.
|
|
69
|
+
return makePass(this.parameters.passes >= 2 ? true : false);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
function gaussKernel7(sigma) {
|
|
73
|
+
const k = [0, 0, 0, 0, 0, 0, 0];
|
|
74
|
+
let sum = 0;
|
|
75
|
+
for (let i = 0; i < 7; i++) {
|
|
76
|
+
const x = i - 3;
|
|
77
|
+
k[i] = Math.exp(-(x * x) / (2 * sigma * sigma));
|
|
78
|
+
sum += k[i];
|
|
79
|
+
}
|
|
80
|
+
return k.map(v => v / sum);
|
|
81
|
+
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { BasePass } from '../core/BasePass.js';
|
|
2
|
+
import type { PassRegistry } from '../core/BasePass.js';
|
|
3
|
+
export interface GlareStreaksOptions {
|
|
4
|
+
/** Luminance threshold — pixels below this don't streak. Blender: Glare → Threshold. Default 0.8. */
|
|
5
|
+
threshold?: number;
|
|
6
|
+
/** Streak intensity. Blender: Glare → Strength. Default 1.0. */
|
|
7
|
+
strength?: number;
|
|
8
|
+
/** Number of streak directions (2=cross, 4=star, 6=asterisk). Blender: Streaks. Default 4. */
|
|
9
|
+
streaks?: number;
|
|
10
|
+
/** Length of each streak in passes. Default 6. */
|
|
11
|
+
length?: number;
|
|
12
|
+
/** Angle offset for streak directions in radians. Default 0. */
|
|
13
|
+
angle?: number;
|
|
14
|
+
/** Colour fade per pass (attenuation). Default 0.9. */
|
|
15
|
+
fade?: number;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* GlareStreaks — anamorphic lens streak effect on bright areas.
|
|
19
|
+
* Blender Compositor: Glare node (Streaks type).
|
|
20
|
+
*
|
|
21
|
+
* Builds bright streaks along N evenly-spaced directions by iterative
|
|
22
|
+
* texture sampling passes in each direction.
|
|
23
|
+
*/
|
|
24
|
+
export declare class GlareStreaks extends BasePass {
|
|
25
|
+
readonly passType = "GlareStreaks";
|
|
26
|
+
parameters: {
|
|
27
|
+
threshold: number;
|
|
28
|
+
strength: number;
|
|
29
|
+
streaks: number;
|
|
30
|
+
length: number;
|
|
31
|
+
angle: number;
|
|
32
|
+
fade: number;
|
|
33
|
+
};
|
|
34
|
+
constructor(opts?: GlareStreaksOptions);
|
|
35
|
+
_threePassDeps(): string[];
|
|
36
|
+
_buildThree(_w: number, _h: number, reg: PassRegistry): unknown;
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=GlareStreaks.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GlareStreaks.d.ts","sourceRoot":"","sources":["../../src/passes/GlareStreaks.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAA;AAC9C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AAEvD,MAAM,WAAW,mBAAmB;IAClC,qGAAqG;IACrG,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,gEAAgE;IAChE,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,8FAA8F;IAC9F,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,kDAAkD;IAClD,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,gEAAgE;IAChE,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,uDAAuD;IACvD,IAAI,CAAC,EAAE,MAAM,CAAA;CACd;AAED;;;;;;GAMG;AACH,qBAAa,YAAa,SAAQ,QAAQ;IACxC,QAAQ,CAAC,QAAQ,kBAAiB;IAClC,UAAU,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAA;gBAErG,IAAI,GAAE,mBAAwB;IAY1C,cAAc;IAEd,WAAW,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,YAAY,GAAG,OAAO;CA8DhE"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { BasePass } from '../core/BasePass.js';
|
|
2
|
+
/**
|
|
3
|
+
* GlareStreaks — anamorphic lens streak effect on bright areas.
|
|
4
|
+
* Blender Compositor: Glare node (Streaks type).
|
|
5
|
+
*
|
|
6
|
+
* Builds bright streaks along N evenly-spaced directions by iterative
|
|
7
|
+
* texture sampling passes in each direction.
|
|
8
|
+
*/
|
|
9
|
+
export class GlareStreaks extends BasePass {
|
|
10
|
+
constructor(opts = {}) {
|
|
11
|
+
super();
|
|
12
|
+
this.passType = 'GlareStreaks';
|
|
13
|
+
this.parameters = {
|
|
14
|
+
threshold: opts.threshold ?? 0.8,
|
|
15
|
+
strength: opts.strength ?? 1.0,
|
|
16
|
+
streaks: opts.streaks ?? 4,
|
|
17
|
+
length: opts.length ?? 6,
|
|
18
|
+
angle: opts.angle ?? 0,
|
|
19
|
+
fade: opts.fade ?? 0.9,
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
_threePassDeps() { return ['ShaderPass']; }
|
|
23
|
+
_buildThree(_w, _h, reg) {
|
|
24
|
+
const ShaderPass = reg['ShaderPass'];
|
|
25
|
+
if (!ShaderPass)
|
|
26
|
+
throw new Error('GlareStreaks: ShaderPass not found.');
|
|
27
|
+
const { threshold, strength, streaks, length, angle, fade } = this.parameters;
|
|
28
|
+
// Build direction vectors for each streak
|
|
29
|
+
const dirs = [];
|
|
30
|
+
for (let i = 0; i < streaks; i++) {
|
|
31
|
+
const a = angle + (i / streaks) * Math.PI;
|
|
32
|
+
dirs.push(`vec2(${Math.cos(a).toFixed(6)}, ${Math.sin(a).toFixed(6)})`);
|
|
33
|
+
}
|
|
34
|
+
const shader = {
|
|
35
|
+
uniforms: {
|
|
36
|
+
tDiffuse: { value: null },
|
|
37
|
+
resolution: { value: [1920, 1080] },
|
|
38
|
+
threshold: { value: threshold },
|
|
39
|
+
strength: { value: strength },
|
|
40
|
+
fade: { value: fade },
|
|
41
|
+
length: { value: length },
|
|
42
|
+
},
|
|
43
|
+
vertexShader: `
|
|
44
|
+
varying vec2 vUv;
|
|
45
|
+
void main() { vUv = uv; gl_Position = projectionMatrix * modelViewMatrix * vec4(position,1.0); }
|
|
46
|
+
`,
|
|
47
|
+
fragmentShader: `
|
|
48
|
+
uniform sampler2D tDiffuse;
|
|
49
|
+
uniform vec2 resolution;
|
|
50
|
+
uniform float threshold;
|
|
51
|
+
uniform float strength;
|
|
52
|
+
uniform float fade;
|
|
53
|
+
uniform float length;
|
|
54
|
+
varying vec2 vUv;
|
|
55
|
+
|
|
56
|
+
float luminance(vec3 c) { return dot(c, vec3(0.299, 0.587, 0.114)); }
|
|
57
|
+
|
|
58
|
+
vec4 sampleStreak(vec2 dir) {
|
|
59
|
+
vec4 acc = vec4(0.0);
|
|
60
|
+
float att = 1.0;
|
|
61
|
+
vec2 step = dir / resolution;
|
|
62
|
+
for (int i = 1; i <= ${Math.max(1, Math.round(length))}; i++) {
|
|
63
|
+
vec2 uv = vUv + step * float(i) * strength;
|
|
64
|
+
vec4 samp = texture2D(tDiffuse, clamp(uv, 0.0, 1.0));
|
|
65
|
+
float lum = luminance(samp.rgb);
|
|
66
|
+
if (lum > threshold) acc += samp * att;
|
|
67
|
+
att *= fade;
|
|
68
|
+
}
|
|
69
|
+
return acc;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
void main() {
|
|
73
|
+
vec4 base = texture2D(tDiffuse, vUv);
|
|
74
|
+
vec4 glare = vec4(0.0);
|
|
75
|
+
${dirs.map(d => `glare += sampleStreak(${d});`).join('\n ')}
|
|
76
|
+
gl_FragColor = base + glare * (1.0 / ${Math.max(1, streaks)}.0);
|
|
77
|
+
}
|
|
78
|
+
`,
|
|
79
|
+
};
|
|
80
|
+
return new ShaderPass(shader);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { BasePass } from '../core/BasePass.js';
|
|
2
|
+
import type { PassRegistry } from '../core/BasePass.js';
|
|
3
|
+
export interface HueSaturationOptions {
|
|
4
|
+
/** Hue rotation [0–1] where 0.5 = no change. Default 0.5. Blender: Hue/Sat → Hue */
|
|
5
|
+
hue?: number;
|
|
6
|
+
/** Saturation multiplier. Default 1. Blender: Hue/Sat → Saturation */
|
|
7
|
+
saturation?: number;
|
|
8
|
+
/** Value (brightness) multiplier. Default 1. Blender: Hue/Sat → Value */
|
|
9
|
+
value?: number;
|
|
10
|
+
/** Blend factor [0–1]. Default 1. */
|
|
11
|
+
fac?: number;
|
|
12
|
+
}
|
|
13
|
+
/** HueSaturation — Blender Compositor: Hue Saturation Value node */
|
|
14
|
+
export declare class HueSaturation extends BasePass {
|
|
15
|
+
readonly passType = "HueSaturation";
|
|
16
|
+
parameters: {
|
|
17
|
+
hue: number;
|
|
18
|
+
saturation: number;
|
|
19
|
+
value: number;
|
|
20
|
+
fac: number;
|
|
21
|
+
};
|
|
22
|
+
constructor(opts?: HueSaturationOptions);
|
|
23
|
+
_threePassDeps(): string[];
|
|
24
|
+
_buildThree(_width: number, _height: number, reg: PassRegistry): unknown;
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=HueSaturation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"HueSaturation.d.ts","sourceRoot":"","sources":["../../src/passes/HueSaturation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAA;AAC9C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AAEvD,MAAM,WAAW,oBAAoB;IACnC,oFAAoF;IACpF,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,sEAAsE;IACtE,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,yEAAyE;IACzE,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,qCAAqC;IACrC,GAAG,CAAC,EAAE,MAAM,CAAA;CACb;AAED,oEAAoE;AACpE,qBAAa,aAAc,SAAQ,QAAQ;IACzC,QAAQ,CAAC,QAAQ,mBAAkB;IACnC,UAAU,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAA;gBAE/D,IAAI,GAAE,oBAAyB;IAU3C,cAAc;IAEd,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,YAAY,GAAG,OAAO;CAkDzE"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { BasePass } from '../core/BasePass.js';
|
|
2
|
+
/** HueSaturation — Blender Compositor: Hue Saturation Value node */
|
|
3
|
+
export class HueSaturation extends BasePass {
|
|
4
|
+
constructor(opts = {}) {
|
|
5
|
+
super();
|
|
6
|
+
this.passType = 'HueSaturation';
|
|
7
|
+
this.parameters = {
|
|
8
|
+
hue: opts.hue ?? 0.5,
|
|
9
|
+
saturation: opts.saturation ?? 1.0,
|
|
10
|
+
value: opts.value ?? 1.0,
|
|
11
|
+
fac: opts.fac ?? 1.0,
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
_threePassDeps() { return ['ShaderPass']; }
|
|
15
|
+
_buildThree(_width, _height, reg) {
|
|
16
|
+
const ShaderPass = reg['ShaderPass'];
|
|
17
|
+
if (!ShaderPass)
|
|
18
|
+
throw new Error('HueSaturation: ShaderPass not found in three/addons.');
|
|
19
|
+
const shader = {
|
|
20
|
+
uniforms: {
|
|
21
|
+
tDiffuse: { value: null },
|
|
22
|
+
hue: { value: this.parameters.hue },
|
|
23
|
+
saturation: { value: this.parameters.saturation },
|
|
24
|
+
value: { value: this.parameters.value },
|
|
25
|
+
fac: { value: this.parameters.fac },
|
|
26
|
+
},
|
|
27
|
+
vertexShader: `
|
|
28
|
+
varying vec2 vUv;
|
|
29
|
+
void main() { vUv = uv; gl_Position = projectionMatrix * modelViewMatrix * vec4(position,1.0); }
|
|
30
|
+
`,
|
|
31
|
+
fragmentShader: `
|
|
32
|
+
uniform sampler2D tDiffuse;
|
|
33
|
+
uniform float hue;
|
|
34
|
+
uniform float saturation;
|
|
35
|
+
uniform float value;
|
|
36
|
+
uniform float fac;
|
|
37
|
+
varying vec2 vUv;
|
|
38
|
+
|
|
39
|
+
vec3 rgb2hsv(vec3 c) {
|
|
40
|
+
vec4 K = vec4(0.0,-1.0/3.0,2.0/3.0,-1.0);
|
|
41
|
+
vec4 p = mix(vec4(c.bg,K.wz), vec4(c.gb,K.xy), step(c.b,c.g));
|
|
42
|
+
vec4 q = mix(vec4(p.xyw,c.r), vec4(c.r,p.yzx), step(p.x,c.r));
|
|
43
|
+
float d = q.x - min(q.w, q.y);
|
|
44
|
+
return vec3(abs(q.z + (q.w - q.y) / (6.0*d+1e-10)), d/(q.x+1e-10), q.x);
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
vec3 hsv2rgb(vec3 c) {
|
|
48
|
+
vec4 K = vec4(1.0,2.0/3.0,1.0/3.0,3.0);
|
|
49
|
+
vec3 p = abs(fract(c.xxx + K.xyz) * 6.0 - K.www);
|
|
50
|
+
return c.z * mix(K.xxx, clamp(p - K.xxx, 0.0, 1.0), c.y);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
void main() {
|
|
54
|
+
vec4 tex = texture2D(tDiffuse, vUv);
|
|
55
|
+
vec3 hsv = rgb2hsv(tex.rgb);
|
|
56
|
+
hsv.x = fract(hsv.x + hue - 0.5);
|
|
57
|
+
hsv.y = clamp(hsv.y * saturation, 0.0, 1.0);
|
|
58
|
+
hsv.z = hsv.z * value;
|
|
59
|
+
gl_FragColor = vec4(mix(tex.rgb, hsv2rgb(hsv), fac), tex.a);
|
|
60
|
+
}
|
|
61
|
+
`,
|
|
62
|
+
};
|
|
63
|
+
return new ShaderPass(shader);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { BasePass } from '../core/BasePass.js';
|
|
2
|
+
import type { PassRegistry } from '../core/BasePass.js';
|
|
3
|
+
export interface LUTOptions {
|
|
4
|
+
/** Blend intensity — 0 = original, 1 = full LUT. Default 1. */
|
|
5
|
+
intensity?: number;
|
|
6
|
+
/**
|
|
7
|
+
* LUT size N (must match the texture supplied later).
|
|
8
|
+
* Neutral LUT for an N³ cube: `LUT.createNeutral(N)`.
|
|
9
|
+
* Default 32.
|
|
10
|
+
*/
|
|
11
|
+
lutSize?: number;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* LUT — 3-D Look-Up Table colour grading pass.
|
|
15
|
+
* Blender Compositor: Color Balance node (via a baked LUT).
|
|
16
|
+
*
|
|
17
|
+
* Usage:
|
|
18
|
+
* ```typescript
|
|
19
|
+
* const lut = new LUT({ intensity: 1 })
|
|
20
|
+
* comp.add(lut)
|
|
21
|
+
* await comp.compile()
|
|
22
|
+
*
|
|
23
|
+
* // Apply a custom grade — warm highlights + cool shadows
|
|
24
|
+
* lut.setLUT(LUT.createFromFn(32, (r, g, b) => [
|
|
25
|
+
* r * 1.1 + b * 0.05,
|
|
26
|
+
* g,
|
|
27
|
+
* b * 1.1 + r * 0.02,
|
|
28
|
+
* ]))
|
|
29
|
+
* ```
|
|
30
|
+
*
|
|
31
|
+
* The LUT texture is a Data3DTexture (Three.js r137+).
|
|
32
|
+
* Use `LUT.createNeutral(N)` for a passthrough LUT, then modify the data.
|
|
33
|
+
* Use `LUT.createFromFn(N, fn)` to build from a mapping function.
|
|
34
|
+
*/
|
|
35
|
+
export declare class LUT extends BasePass {
|
|
36
|
+
readonly passType = "LUT";
|
|
37
|
+
parameters: {
|
|
38
|
+
intensity: number;
|
|
39
|
+
lutSize: number;
|
|
40
|
+
};
|
|
41
|
+
/** The Three.js Data3DTexture (or null until setLUT() is called). */
|
|
42
|
+
lutTexture: unknown;
|
|
43
|
+
private _pass;
|
|
44
|
+
constructor(opts?: LUTOptions);
|
|
45
|
+
_threePassDeps(): string[];
|
|
46
|
+
_buildThree(_w: number, _h: number, reg: PassRegistry): unknown;
|
|
47
|
+
/**
|
|
48
|
+
* Replace the active LUT texture at runtime.
|
|
49
|
+
* Pass a Three.js Data3DTexture — see `LUT.createNeutral` / `LUT.createFromFn`.
|
|
50
|
+
*/
|
|
51
|
+
setLUT(tex: unknown): void;
|
|
52
|
+
/**
|
|
53
|
+
* Create a neutral (identity) N³ LUT Data3DTexture.
|
|
54
|
+
* Requires a Three.js instance — pass in the THREE namespace.
|
|
55
|
+
*/
|
|
56
|
+
static createNeutral(THREE: Record<string, unknown>, N?: number): unknown;
|
|
57
|
+
/**
|
|
58
|
+
* Create a Data3DTexture from a mapping function `(r,g,b) => [r,g,b]`
|
|
59
|
+
* where all channels are in [0, 1].
|
|
60
|
+
*/
|
|
61
|
+
static createFromFn(THREE: Record<string, unknown>, N: number, fn: (r: number, g: number, b: number) => [number, number, number]): unknown;
|
|
62
|
+
private static _makeData3DTexture;
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=LUT.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LUT.d.ts","sourceRoot":"","sources":["../../src/passes/LUT.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,+DAA+D;IAC/D,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB;;;;OAIG;IACH,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,qBAAa,GAAI,SAAQ,QAAQ;IAC/B,QAAQ,CAAC,QAAQ,SAAQ;IACzB,UAAU,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAA;IAElD,qEAAqE;IACrE,UAAU,EAAE,OAAO,CAAO;IAE1B,OAAO,CAAC,KAAK,CAAgB;gBAEjB,IAAI,GAAE,UAAe;IAQjC,cAAc;IAEd,WAAW,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,YAAY,GAAG,OAAO;IAyC/D;;;OAGG;IACH,MAAM,CAAC,GAAG,EAAE,OAAO,GAAG,IAAI;IAU1B;;;OAGG;IACH,MAAM,CAAC,aAAa,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC,SAAK,GAAG,OAAO;IAgBrE;;;OAGG;IACH,MAAM,CAAC,YAAY,CACjB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC9B,CAAC,EAAE,MAAM,EACT,EAAE,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,GAChE,OAAO;IAiBV,OAAO,CAAC,MAAM,CAAC,kBAAkB;CAWlC"}
|