angular-three-postprocessing 1.6.0 → 2.0.0-beta.3

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 (87) hide show
  1. package/README.md +4 -12
  2. package/effect-composer.d.ts +53 -0
  3. package/effect.d.ts +24 -0
  4. package/effects/bloom/bloom.d.ts +8 -0
  5. package/effects/{lib/brightness-contrast → brightness-contrast}/brightness-contrast.d.ts +1 -2
  6. package/effects/{lib/color-depth → color-depth}/color-depth.d.ts +1 -2
  7. package/effects/{lib/depth → depth}/depth.d.ts +1 -2
  8. package/effects/{lib/dot-screen → dot-screen}/dot-screen.d.ts +1 -2
  9. package/effects/{lib/hue-saturation → hue-saturation}/hue-saturation.d.ts +1 -2
  10. package/effects/index.d.ts +16 -14
  11. package/effects/lut/lut.d.ts +19 -0
  12. package/effects/{lib/noise → noise}/noise.d.ts +2 -3
  13. package/effects/{lib/scanline → scanline}/scanline.d.ts +2 -3
  14. package/effects/{lib/sepia → sepia}/sepia.d.ts +1 -2
  15. package/effects/shock-wave/shock-wave.d.ts +7 -0
  16. package/effects/smaa/smaa.d.ts +7 -0
  17. package/effects/ssao/ssao.d.ts +38 -0
  18. package/effects/tilt-shift/tilt-shift.d.ts +8 -0
  19. package/effects/tone-mapping/tone-mapping.d.ts +7 -0
  20. package/effects/{lib/vignette → vignette}/vignette.d.ts +1 -2
  21. package/esm2022/angular-three-postprocessing.mjs +1 -1
  22. package/esm2022/effect-composer.mjs +242 -0
  23. package/esm2022/effect.mjs +79 -0
  24. package/esm2022/effects/angular-three-postprocessing-effects.mjs +1 -1
  25. package/esm2022/effects/bloom/bloom.mjs +34 -0
  26. package/esm2022/effects/brightness-contrast/brightness-contrast.mjs +30 -0
  27. package/esm2022/effects/color-depth/color-depth.mjs +30 -0
  28. package/esm2022/effects/depth/depth.mjs +30 -0
  29. package/esm2022/effects/dot-screen/dot-screen.mjs +30 -0
  30. package/esm2022/effects/hue-saturation/hue-saturation.mjs +30 -0
  31. package/esm2022/effects/index.mjs +17 -15
  32. package/esm2022/effects/lut/lut.mjs +77 -0
  33. package/esm2022/effects/noise/noise.mjs +34 -0
  34. package/esm2022/effects/scanline/scanline.mjs +34 -0
  35. package/esm2022/effects/sepia/sepia.mjs +30 -0
  36. package/esm2022/effects/shock-wave/shock-wave.mjs +30 -0
  37. package/esm2022/effects/smaa/smaa.mjs +30 -0
  38. package/esm2022/effects/ssao/ssao.mjs +189 -0
  39. package/esm2022/effects/tilt-shift/tilt-shift.mjs +34 -0
  40. package/esm2022/effects/tone-mapping/tone-mapping.mjs +30 -0
  41. package/esm2022/effects/vignette/vignette.mjs +30 -0
  42. package/esm2022/index.mjs +3 -3
  43. package/fesm2022/angular-three-postprocessing-effects.mjs +359 -224
  44. package/fesm2022/angular-three-postprocessing-effects.mjs.map +1 -1
  45. package/fesm2022/angular-three-postprocessing.mjs +163 -162
  46. package/fesm2022/angular-three-postprocessing.mjs.map +1 -1
  47. package/index.d.ts +2 -2
  48. package/package.json +6 -14
  49. package/plugin/package.json +1 -1
  50. package/plugin/src/generators/init/compat.js.map +1 -1
  51. package/plugin/src/generators/init/init.d.ts +1 -1
  52. package/plugin/src/generators/init/init.js +14 -18
  53. package/plugin/src/generators/init/init.js.map +1 -1
  54. package/plugin/src/index.js.map +1 -1
  55. package/effects/lib/bloom/bloom.d.ts +0 -9
  56. package/effects/lib/lut/lut.d.ts +0 -13
  57. package/effects/lib/ssao/ssao.d.ts +0 -13
  58. package/effects/lib/tilt-shift/tilt-shift.d.ts +0 -9
  59. package/effects/lib/tone-mapping/tone-mapping.d.ts +0 -8
  60. package/esm2022/effects/lib/bloom/bloom.mjs +0 -44
  61. package/esm2022/effects/lib/brightness-contrast/brightness-contrast.mjs +0 -29
  62. package/esm2022/effects/lib/color-depth/color-depth.mjs +0 -29
  63. package/esm2022/effects/lib/depth/depth.mjs +0 -29
  64. package/esm2022/effects/lib/dot-screen/dot-screen.mjs +0 -29
  65. package/esm2022/effects/lib/hue-saturation/hue-saturation.mjs +0 -29
  66. package/esm2022/effects/lib/lut/lut.mjs +0 -60
  67. package/esm2022/effects/lib/noise/noise.mjs +0 -33
  68. package/esm2022/effects/lib/scanline/scanline.mjs +0 -33
  69. package/esm2022/effects/lib/sepia/sepia.mjs +0 -29
  70. package/esm2022/effects/lib/ssao/ssao.mjs +0 -102
  71. package/esm2022/effects/lib/tilt-shift/tilt-shift.mjs +0 -43
  72. package/esm2022/effects/lib/tone-mapping/tone-mapping.mjs +0 -39
  73. package/esm2022/effects/lib/vignette/vignette.mjs +0 -29
  74. package/esm2022/lib/effect-composer.mjs +0 -241
  75. package/esm2022/lib/effect.mjs +0 -80
  76. package/esm2022/selection/angular-three-postprocessing-selection.mjs +0 -5
  77. package/esm2022/selection/index.mjs +0 -3
  78. package/esm2022/selection/lib/select.mjs +0 -69
  79. package/esm2022/selection/lib/selection.mjs +0 -44
  80. package/fesm2022/angular-three-postprocessing-selection.mjs +0 -114
  81. package/fesm2022/angular-three-postprocessing-selection.mjs.map +0 -1
  82. package/lib/effect-composer.d.ts +0 -39
  83. package/lib/effect.d.ts +0 -22
  84. package/selection/README.md +0 -3
  85. package/selection/index.d.ts +0 -2
  86. package/selection/lib/select.d.ts +0 -14
  87. package/selection/lib/selection.d.ts +0 -18
package/README.md CHANGED
@@ -1,15 +1,7 @@
1
- # Postprocessing for Angular Three using postprocessing
1
+ # postprocessing
2
2
 
3
- ## Installation
3
+ This library was generated with [Nx](https://nx.dev).
4
4
 
5
- ```shell
6
- ng add angular-three-postprocessing
7
- ```
5
+ ## Running unit tests
8
6
 
9
- ## Documentations
10
-
11
- Read more about Angular Three Postprocessing usages in [TBD: Documentations](#)
12
-
13
- ## Contributions
14
-
15
- Contributions are welcomed
7
+ Run `nx test postprocessing` to execute the unit tests.
@@ -0,0 +1,53 @@
1
+ import { InjectionToken, Signal } from '@angular/core';
2
+ import { NgtSignalStore } from 'angular-three';
3
+ import { DepthDownsamplingPass, EffectComposer, NormalPass } from 'postprocessing';
4
+ import * as THREE from 'three';
5
+ import * as i0 from "@angular/core";
6
+ export interface NgtpEffectComposerState {
7
+ enabled: boolean;
8
+ depthBuffer?: boolean;
9
+ disableNormalPass?: boolean;
10
+ stencilBuffer?: boolean;
11
+ autoClear: boolean;
12
+ resolutionScale?: number;
13
+ multisampling: number;
14
+ frameBufferType: THREE.TextureDataType;
15
+ renderPriority: number;
16
+ camera?: THREE.Camera;
17
+ scene?: THREE.Scene;
18
+ }
19
+ export interface NgtpEffectComposerApi {
20
+ composer: EffectComposer;
21
+ normalPass: NormalPass | null;
22
+ downSamplingPass: DepthDownsamplingPass | null;
23
+ camera: THREE.Camera;
24
+ scene: THREE.Scene;
25
+ resolutionScale?: number;
26
+ }
27
+ export declare const NGTP_EFFECT_COMPOSER_API: InjectionToken<Signal<NgtpEffectComposerApi>>;
28
+ export declare class NgtpEffectComposer extends NgtSignalStore<NgtpEffectComposerState> {
29
+ #private;
30
+ readonly composerRef: import("angular-three").NgtInjectedRef<THREE.Group>;
31
+ set enabled(enabled: boolean);
32
+ set depthBuffer(depthBuffer: boolean);
33
+ set disableNormalPass(disableNormalPass: boolean);
34
+ set stencilBuffer(stencilBuffer: boolean);
35
+ set autoClear(autoClear: boolean);
36
+ set resolutionScale(resolutionScale: number);
37
+ set multisampling(multisampling: number);
38
+ set frameBufferType(frameBufferType: THREE.TextureDataType);
39
+ set renderPriority(renderPriority: number);
40
+ set camera(camera: THREE.Camera);
41
+ set scene(scene: THREE.Scene);
42
+ readonly api: Signal<{
43
+ composer: EffectComposer;
44
+ normalPass: NormalPass | null;
45
+ downSamplingPass: DepthDownsamplingPass | null;
46
+ resolutionScale: number | undefined;
47
+ camera: THREE.Camera;
48
+ scene: THREE.Scene;
49
+ }>;
50
+ constructor();
51
+ static ɵfac: i0.ɵɵFactoryDeclaration<NgtpEffectComposer, never>;
52
+ static ɵcmp: i0.ɵɵComponentDeclaration<NgtpEffectComposer, "ngtp-effect-composer", never, { "enabled": { "alias": "enabled"; "required": false; }; "depthBuffer": { "alias": "depthBuffer"; "required": false; }; "disableNormalPass": { "alias": "disableNormalPass"; "required": false; }; "stencilBuffer": { "alias": "stencilBuffer"; "required": false; }; "autoClear": { "alias": "autoClear"; "required": false; }; "resolutionScale": { "alias": "resolutionScale"; "required": false; }; "multisampling": { "alias": "multisampling"; "required": false; }; "frameBufferType": { "alias": "frameBufferType"; "required": false; }; "renderPriority": { "alias": "renderPriority"; "required": false; }; "camera": { "alias": "camera"; "required": false; }; "scene": { "alias": "scene"; "required": false; }; }, {}, never, ["*"], true, never>;
53
+ }
package/effect.d.ts ADDED
@@ -0,0 +1,24 @@
1
+ import { NgtSignalStore, NgtStore } from 'angular-three';
2
+ import { BlendFunction, Effect } from 'postprocessing';
3
+ import * as i0 from "@angular/core";
4
+ export declare abstract class NgtpEffect<T extends Effect> extends NgtSignalStore<{
5
+ blendFunction?: BlendFunction;
6
+ opacity?: number;
7
+ }> {
8
+ #private;
9
+ effectRef: import("angular-three").NgtInjectedRef<T>;
10
+ set blendFunction(blendFunction: BlendFunction);
11
+ set opacity(opacity: number);
12
+ protected defaultBlendFunction: BlendFunction;
13
+ protected nativeArgs: () => never[];
14
+ readonly effectBlendFunction: import("@angular/core").Signal<BlendFunction | undefined>;
15
+ readonly effectOpacity: import("@angular/core").Signal<number | undefined>;
16
+ protected readonly store: NgtStore;
17
+ protected readonly camera: import("@angular/core").Signal<import("angular-three").NgtCameraManual>;
18
+ protected readonly args: import("@angular/core").Signal<{
19
+ [x: string]: any;
20
+ }[]>;
21
+ constructor();
22
+ static ɵfac: i0.ɵɵFactoryDeclaration<NgtpEffect<any>, never>;
23
+ static ɵdir: i0.ɵɵDirectiveDeclaration<NgtpEffect<any>, never, never, { "effectRef": { "alias": "effectRef"; "required": false; }; "blendFunction": { "alias": "blendFunction"; "required": false; }; "opacity": { "alias": "opacity"; "required": false; }; }, {}, never, never, false, never>;
24
+ }
@@ -0,0 +1,8 @@
1
+ import { NgtpEffect } from 'angular-three-postprocessing';
2
+ import { BlendFunction, BloomEffect } from 'postprocessing';
3
+ import * as i0 from "@angular/core";
4
+ export declare class NgtpBloom extends NgtpEffect<BloomEffect> {
5
+ defaultBlendFunction: BlendFunction;
6
+ static ɵfac: i0.ɵɵFactoryDeclaration<NgtpBloom, never>;
7
+ static ɵcmp: i0.ɵɵComponentDeclaration<NgtpBloom, "ngtp-bloom", never, {}, {}, never, ["*"], true, never>;
8
+ }
@@ -2,7 +2,6 @@ import { NgtpEffect } from 'angular-three-postprocessing';
2
2
  import { BrightnessContrastEffect } from 'postprocessing';
3
3
  import * as i0 from "@angular/core";
4
4
  export declare class NgtpBrightnessContrast extends NgtpEffect<BrightnessContrastEffect> {
5
- get effectConstructor(): typeof BrightnessContrastEffect;
6
5
  static ɵfac: i0.ɵɵFactoryDeclaration<NgtpBrightnessContrast, never>;
7
- static ɵcmp: i0.ɵɵComponentDeclaration<NgtpBrightnessContrast, "ngtp-brightness-contrast", never, { "brightness": { "alias": "brightness"; "required": false; }; "contrast": { "alias": "contrast"; "required": false; }; }, {}, never, never, true, never>;
6
+ static ɵcmp: i0.ɵɵComponentDeclaration<NgtpBrightnessContrast, "ngtp-brightness-contrast", never, {}, {}, never, ["*"], true, never>;
8
7
  }
@@ -2,7 +2,6 @@ import { NgtpEffect } from 'angular-three-postprocessing';
2
2
  import { ColorDepthEffect } from 'postprocessing';
3
3
  import * as i0 from "@angular/core";
4
4
  export declare class NgtpColorDepth extends NgtpEffect<ColorDepthEffect> {
5
- get effectConstructor(): typeof ColorDepthEffect;
6
5
  static ɵfac: i0.ɵɵFactoryDeclaration<NgtpColorDepth, never>;
7
- static ɵcmp: i0.ɵɵComponentDeclaration<NgtpColorDepth, "ngtp-color-depth", never, { "bits": { "alias": "bits"; "required": false; }; }, {}, never, never, true, never>;
6
+ static ɵcmp: i0.ɵɵComponentDeclaration<NgtpColorDepth, "ngtp-color-depth", never, {}, {}, never, ["*"], true, never>;
8
7
  }
@@ -2,7 +2,6 @@ import { NgtpEffect } from 'angular-three-postprocessing';
2
2
  import { DepthEffect } from 'postprocessing';
3
3
  import * as i0 from "@angular/core";
4
4
  export declare class NgtpDepth extends NgtpEffect<DepthEffect> {
5
- get effectConstructor(): typeof DepthEffect;
6
5
  static ɵfac: i0.ɵɵFactoryDeclaration<NgtpDepth, never>;
7
- static ɵcmp: i0.ɵɵComponentDeclaration<NgtpDepth, "ngtp-depth", never, { "inverted": { "alias": "inverted"; "required": false; }; }, {}, never, never, true, never>;
6
+ static ɵcmp: i0.ɵɵComponentDeclaration<NgtpDepth, "ngtp-depth", never, {}, {}, never, ["*"], true, never>;
8
7
  }
@@ -2,7 +2,6 @@ import { NgtpEffect } from 'angular-three-postprocessing';
2
2
  import { DotScreenEffect } from 'postprocessing';
3
3
  import * as i0 from "@angular/core";
4
4
  export declare class NgtpDotScreen extends NgtpEffect<DotScreenEffect> {
5
- get effectConstructor(): typeof DotScreenEffect;
6
5
  static ɵfac: i0.ɵɵFactoryDeclaration<NgtpDotScreen, never>;
7
- static ɵcmp: i0.ɵɵComponentDeclaration<NgtpDotScreen, "ngtp-dot-screen", never, { "angle": { "alias": "angle"; "required": false; }; "scale": { "alias": "scale"; "required": false; }; }, {}, never, never, true, never>;
6
+ static ɵcmp: i0.ɵɵComponentDeclaration<NgtpDotScreen, "ngtp-dot-screen", never, {}, {}, never, ["*"], true, never>;
8
7
  }
@@ -2,7 +2,6 @@ import { NgtpEffect } from 'angular-three-postprocessing';
2
2
  import { HueSaturationEffect } from 'postprocessing';
3
3
  import * as i0 from "@angular/core";
4
4
  export declare class NgtpHueSaturation extends NgtpEffect<HueSaturationEffect> {
5
- get effectConstructor(): typeof HueSaturationEffect;
6
5
  static ɵfac: i0.ɵɵFactoryDeclaration<NgtpHueSaturation, never>;
7
- static ɵcmp: i0.ɵɵComponentDeclaration<NgtpHueSaturation, "ngtp-hue-saturation", never, { "hue": { "alias": "hue"; "required": false; }; "saturation": { "alias": "saturation"; "required": false; }; }, {}, never, never, true, never>;
6
+ static ɵcmp: i0.ɵɵComponentDeclaration<NgtpHueSaturation, "ngtp-hue-saturation", never, {}, {}, never, ["*"], true, never>;
8
7
  }
@@ -1,14 +1,16 @@
1
- export * from './lib/bloom/bloom';
2
- export * from './lib/brightness-contrast/brightness-contrast';
3
- export * from './lib/color-depth/color-depth';
4
- export * from './lib/depth/depth';
5
- export * from './lib/dot-screen/dot-screen';
6
- export * from './lib/hue-saturation/hue-saturation';
7
- export * from './lib/lut/lut';
8
- export * from './lib/noise/noise';
9
- export * from './lib/scanline/scanline';
10
- export * from './lib/sepia/sepia';
11
- export * from './lib/ssao/ssao';
12
- export * from './lib/tilt-shift/tilt-shift';
13
- export * from './lib/tone-mapping/tone-mapping';
14
- export * from './lib/vignette/vignette';
1
+ export * from './bloom/bloom';
2
+ export * from './brightness-contrast/brightness-contrast';
3
+ export * from './color-depth/color-depth';
4
+ export * from './depth/depth';
5
+ export * from './dot-screen/dot-screen';
6
+ export * from './hue-saturation/hue-saturation';
7
+ export * from './lut/lut';
8
+ export * from './noise/noise';
9
+ export * from './scanline/scanline';
10
+ export * from './sepia/sepia';
11
+ export * from './shock-wave/shock-wave';
12
+ export * from './smaa/smaa';
13
+ export * from './ssao/ssao';
14
+ export * from './tilt-shift/tilt-shift';
15
+ export * from './tone-mapping/tone-mapping';
16
+ export * from './vignette/vignette';
@@ -0,0 +1,19 @@
1
+ import { NgtSignalStore } from 'angular-three';
2
+ import { BlendFunction, LUT3DEffect } from 'postprocessing';
3
+ import * as i0 from "@angular/core";
4
+ export interface NgtpLUTState {
5
+ lut: THREE.Texture;
6
+ blendFunction?: BlendFunction;
7
+ tetrahedralInterpolation?: boolean;
8
+ }
9
+ export declare class NgtpLUT extends NgtSignalStore<NgtpLUTState> {
10
+ #private;
11
+ effectRef: import("angular-three").NgtInjectedRef<LUT3DEffect>;
12
+ set lut(lut: THREE.Texture);
13
+ set blendFunction(blendFunction: BlendFunction);
14
+ set tetrahedralInterpolation(tetrahedralInterpolation: boolean);
15
+ readonly effect: import("@angular/core").Signal<LUT3DEffect>;
16
+ constructor();
17
+ static ɵfac: i0.ɵɵFactoryDeclaration<NgtpLUT, never>;
18
+ static ɵcmp: i0.ɵɵComponentDeclaration<NgtpLUT, "ngtp-lut", never, { "effectRef": { "alias": "effectRef"; "required": false; }; "lut": { "alias": "lut"; "required": true; }; "blendFunction": { "alias": "blendFunction"; "required": false; }; "tetrahedralInterpolation": { "alias": "tetrahedralInterpolation"; "required": false; }; }, {}, never, never, true, never>;
19
+ }
@@ -2,8 +2,7 @@ import { NgtpEffect } from 'angular-three-postprocessing';
2
2
  import { BlendFunction, NoiseEffect } from 'postprocessing';
3
3
  import * as i0 from "@angular/core";
4
4
  export declare class NgtpNoise extends NgtpEffect<NoiseEffect> {
5
- get effectConstructor(): typeof NoiseEffect;
6
- defaultBlendMode: BlendFunction;
5
+ defaultBlendFunction: BlendFunction;
7
6
  static ɵfac: i0.ɵɵFactoryDeclaration<NgtpNoise, never>;
8
- static ɵcmp: i0.ɵɵComponentDeclaration<NgtpNoise, "ngtp-noise", never, { "premultiply": { "alias": "premultiply"; "required": false; }; }, {}, never, never, true, never>;
7
+ static ɵcmp: i0.ɵɵComponentDeclaration<NgtpNoise, "ngtp-noise", never, {}, {}, never, ["*"], true, never>;
9
8
  }
@@ -2,8 +2,7 @@ import { NgtpEffect } from 'angular-three-postprocessing';
2
2
  import { BlendFunction, ScanlineEffect } from 'postprocessing';
3
3
  import * as i0 from "@angular/core";
4
4
  export declare class NgtpScanline extends NgtpEffect<ScanlineEffect> {
5
- get effectConstructor(): typeof ScanlineEffect;
6
- defaultBlendMode: BlendFunction;
5
+ defaultBlendFunction: BlendFunction;
7
6
  static ɵfac: i0.ɵɵFactoryDeclaration<NgtpScanline, never>;
8
- static ɵcmp: i0.ɵɵComponentDeclaration<NgtpScanline, "ngtp-scanline", never, { "density": { "alias": "density"; "required": false; }; }, {}, never, never, true, never>;
7
+ static ɵcmp: i0.ɵɵComponentDeclaration<NgtpScanline, "ngtp-scanline", never, {}, {}, never, ["*"], true, never>;
9
8
  }
@@ -2,7 +2,6 @@ import { NgtpEffect } from 'angular-three-postprocessing';
2
2
  import { SepiaEffect } from 'postprocessing';
3
3
  import * as i0 from "@angular/core";
4
4
  export declare class NgtpSepia extends NgtpEffect<SepiaEffect> {
5
- get effectConstructor(): typeof SepiaEffect;
6
5
  static ɵfac: i0.ɵɵFactoryDeclaration<NgtpSepia, never>;
7
- static ɵcmp: i0.ɵɵComponentDeclaration<NgtpSepia, "ngtp-sepia", never, { "intensity": { "alias": "intensity"; "required": false; }; }, {}, never, never, true, never>;
6
+ static ɵcmp: i0.ɵɵComponentDeclaration<NgtpSepia, "ngtp-sepia", never, {}, {}, never, ["*"], true, never>;
8
7
  }
@@ -0,0 +1,7 @@
1
+ import { NgtpEffect } from 'angular-three-postprocessing';
2
+ import { ShockWaveEffect } from 'postprocessing';
3
+ import * as i0 from "@angular/core";
4
+ export declare class NgtpShockWave extends NgtpEffect<ShockWaveEffect> {
5
+ static ɵfac: i0.ɵɵFactoryDeclaration<NgtpShockWave, never>;
6
+ static ɵcmp: i0.ɵɵComponentDeclaration<NgtpShockWave, "ngtp-noise", never, {}, {}, never, ["*"], true, never>;
7
+ }
@@ -0,0 +1,7 @@
1
+ import { NgtpEffect } from 'angular-three-postprocessing';
2
+ import { SMAAEffect } from 'postprocessing';
3
+ import * as i0 from "@angular/core";
4
+ export declare class NgtpSMAA extends NgtpEffect<SMAAEffect> {
5
+ static ɵfac: i0.ɵɵFactoryDeclaration<NgtpSMAA, never>;
6
+ static ɵcmp: i0.ɵɵComponentDeclaration<NgtpSMAA, "ngtp-SMAA", never, {}, {}, never, ["*"], true, never>;
7
+ }
@@ -0,0 +1,38 @@
1
+ import { NgtSignalStore } from 'angular-three';
2
+ import { BlendFunction, SSAOEffect } from 'postprocessing';
3
+ import * as i0 from "@angular/core";
4
+ export type NgtpSSAOState = NonNullable<ConstructorParameters<typeof SSAOEffect>[2]>;
5
+ export declare class NgtpSSAO extends NgtSignalStore<NgtpSSAOState> {
6
+ #private;
7
+ effectRef: import("angular-three").NgtInjectedRef<SSAOEffect>;
8
+ set blendFunction(blendFunction: BlendFunction);
9
+ set distanceScaling(distanceScaling: boolean);
10
+ set depthAwareUpsampling(depthAwareUpsampling: boolean);
11
+ set normalDepthBuffer(normalDepthBuffer: THREE.Texture);
12
+ set samples(samples: number);
13
+ set rings(rings: number);
14
+ set worldDistanceThreshold(worldDistanceThreshold: number);
15
+ set worldDistanceFalloff(worldDistanceFalloff: number);
16
+ set worldProximityThreshold(worldProximityThreshold: number);
17
+ set worldProximityFalloff(worldProximityFalloff: number);
18
+ set distanceThreshold(distanceThreshold: number);
19
+ set distanceFalloff(distanceFalloff: number);
20
+ set rangeThreshold(rangeThreshold: number);
21
+ set rangeFalloff(rangeFalloff: number);
22
+ set minRadiusScale(minRadiusScale: number);
23
+ set luminanceInfluence(luminanceInfluence: number);
24
+ set radius(radius: number);
25
+ set intensity(intensity: number);
26
+ set bias(bias: number);
27
+ set fade(fade: number);
28
+ set color(color: THREE.Color);
29
+ set resolutionScale(resolutionScale: number);
30
+ set resolutionX(resolutionX: number);
31
+ set resolutionY(resolutionY: number);
32
+ set width(width: number);
33
+ set height(height: number);
34
+ readonly effect: import("@angular/core").Signal<{}>;
35
+ constructor();
36
+ static ɵfac: i0.ɵɵFactoryDeclaration<NgtpSSAO, never>;
37
+ static ɵcmp: i0.ɵɵComponentDeclaration<NgtpSSAO, "ngtp-SSAO", never, { "effectRef": { "alias": "effectRef"; "required": false; }; "blendFunction": { "alias": "blendFunction"; "required": false; }; "distanceScaling": { "alias": "distanceScaling"; "required": false; }; "depthAwareUpsampling": { "alias": "depthAwareUpsampling"; "required": false; }; "normalDepthBuffer": { "alias": "normalDepthBuffer"; "required": false; }; "samples": { "alias": "samples"; "required": false; }; "rings": { "alias": "rings"; "required": false; }; "worldDistanceThreshold": { "alias": "worldDistanceThreshold"; "required": false; }; "worldDistanceFalloff": { "alias": "worldDistanceFalloff"; "required": false; }; "worldProximityThreshold": { "alias": "worldProximityThreshold"; "required": false; }; "worldProximityFalloff": { "alias": "worldProximityFalloff"; "required": false; }; "distanceThreshold": { "alias": "distanceThreshold"; "required": false; }; "distanceFalloff": { "alias": "distanceFalloff"; "required": false; }; "rangeThreshold": { "alias": "rangeThreshold"; "required": false; }; "rangeFalloff": { "alias": "rangeFalloff"; "required": false; }; "minRadiusScale": { "alias": "minRadiusScale"; "required": false; }; "luminanceInfluence": { "alias": "luminanceInfluence"; "required": false; }; "radius": { "alias": "radius"; "required": false; }; "intensity": { "alias": "intensity"; "required": false; }; "bias": { "alias": "bias"; "required": false; }; "fade": { "alias": "fade"; "required": false; }; "color": { "alias": "color"; "required": false; }; "resolutionScale": { "alias": "resolutionScale"; "required": false; }; "resolutionX": { "alias": "resolutionX"; "required": false; }; "resolutionY": { "alias": "resolutionY"; "required": false; }; "width": { "alias": "width"; "required": false; }; "height": { "alias": "height"; "required": false; }; }, {}, never, never, true, never>;
38
+ }
@@ -0,0 +1,8 @@
1
+ import { NgtpEffect } from 'angular-three-postprocessing';
2
+ import { BlendFunction, TiltShiftEffect } from 'postprocessing';
3
+ import * as i0 from "@angular/core";
4
+ export declare class NgtpTiltShift extends NgtpEffect<TiltShiftEffect> {
5
+ defaultBlendFunction: BlendFunction;
6
+ static ɵfac: i0.ɵɵFactoryDeclaration<NgtpTiltShift, never>;
7
+ static ɵcmp: i0.ɵɵComponentDeclaration<NgtpTiltShift, "ngtp-tilt-shift", never, {}, {}, never, ["*"], true, never>;
8
+ }
@@ -0,0 +1,7 @@
1
+ import { NgtpEffect } from 'angular-three-postprocessing';
2
+ import { ToneMappingEffect } from 'postprocessing';
3
+ import * as i0 from "@angular/core";
4
+ export declare class NgtpToneMapping extends NgtpEffect<ToneMappingEffect> {
5
+ static ɵfac: i0.ɵɵFactoryDeclaration<NgtpToneMapping, never>;
6
+ static ɵcmp: i0.ɵɵComponentDeclaration<NgtpToneMapping, "ngtp-tone-mapping", never, {}, {}, never, ["*"], true, never>;
7
+ }
@@ -2,7 +2,6 @@ import { NgtpEffect } from 'angular-three-postprocessing';
2
2
  import { VignetteEffect } from 'postprocessing';
3
3
  import * as i0 from "@angular/core";
4
4
  export declare class NgtpVignette extends NgtpEffect<VignetteEffect> {
5
- get effectConstructor(): typeof VignetteEffect;
6
5
  static ɵfac: i0.ɵɵFactoryDeclaration<NgtpVignette, never>;
7
- static ɵcmp: i0.ɵɵComponentDeclaration<NgtpVignette, "ngtp-vignette", never, { "technique": { "alias": "technique"; "required": false; }; "eskil": { "alias": "eskil"; "required": false; }; "offset": { "alias": "offset"; "required": false; }; "darkness": { "alias": "darkness"; "required": false; }; }, {}, never, never, true, never>;
6
+ static ɵcmp: i0.ɵɵComponentDeclaration<NgtpVignette, "ngtp-vignette", never, {}, {}, never, ["*"], true, never>;
8
7
  }
@@ -2,4 +2,4 @@
2
2
  * Generated bundle index. Do not edit.
3
3
  */
4
4
  export * from './index';
5
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5ndWxhci10aHJlZS1wb3N0cHJvY2Vzc2luZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2xpYnMvYW5ndWxhci10aHJlZS1wb3N0cHJvY2Vzc2luZy9zcmMvYW5ndWxhci10aHJlZS1wb3N0cHJvY2Vzc2luZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUVILGNBQWMsU0FBUyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBHZW5lcmF0ZWQgYnVuZGxlIGluZGV4LiBEbyBub3QgZWRpdC5cbiAqL1xuXG5leHBvcnQgKiBmcm9tICcuL2luZGV4JztcbiJdfQ==
5
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5ndWxhci10aHJlZS1wb3N0cHJvY2Vzc2luZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2xpYnMvcG9zdHByb2Nlc3Npbmcvc3JjL2FuZ3VsYXItdGhyZWUtcG9zdHByb2Nlc3NpbmcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFFSCxjQUFjLFNBQVMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogR2VuZXJhdGVkIGJ1bmRsZSBpbmRleC4gRG8gbm90IGVkaXQuXG4gKi9cblxuZXhwb3J0ICogZnJvbSAnLi9pbmRleCc7XG4iXX0=
@@ -0,0 +1,242 @@
1
+ import { CUSTOM_ELEMENTS_SCHEMA, Component, InjectionToken, Input, computed, effect, inject, } from '@angular/core';
2
+ import { NgtSignalStore, NgtStore, extend, injectBeforeRender, injectNgtRef, requestAnimationInInjectionContext, } from 'angular-three';
3
+ import { DepthDownsamplingPass, EffectComposer, EffectPass, NormalPass, RenderPass } from 'postprocessing';
4
+ import * as THREE from 'three';
5
+ import { Group } from 'three';
6
+ import { isWebGL2Available } from 'three-stdlib';
7
+ import * as i0 from "@angular/core";
8
+ extend({ Group });
9
+ export const NGTP_EFFECT_COMPOSER_API = new InjectionToken('NgtpEffectComposer API');
10
+ class NgtpEffectComposer extends NgtSignalStore {
11
+ set enabled(enabled) {
12
+ this.set({ enabled });
13
+ }
14
+ set depthBuffer(depthBuffer) {
15
+ this.set({ depthBuffer });
16
+ }
17
+ set disableNormalPass(disableNormalPass) {
18
+ this.set({ disableNormalPass });
19
+ }
20
+ set stencilBuffer(stencilBuffer) {
21
+ this.set({ stencilBuffer });
22
+ }
23
+ set autoClear(autoClear) {
24
+ this.set({ autoClear });
25
+ }
26
+ set resolutionScale(resolutionScale) {
27
+ this.set({ resolutionScale });
28
+ }
29
+ set multisampling(multisampling) {
30
+ this.set({ multisampling });
31
+ }
32
+ set frameBufferType(frameBufferType) {
33
+ this.set({ frameBufferType });
34
+ }
35
+ set renderPriority(renderPriority) {
36
+ this.set({ renderPriority });
37
+ }
38
+ set camera(camera) {
39
+ this.set({ camera });
40
+ }
41
+ set scene(scene) {
42
+ this.set({ scene });
43
+ }
44
+ #store;
45
+ #gl;
46
+ #size;
47
+ #defaultScene;
48
+ #defaultCamera;
49
+ #scene;
50
+ #camera;
51
+ #depthBuffer;
52
+ #stencilBuffer;
53
+ #multisampling;
54
+ #frameBufferType;
55
+ #disableNormalPass;
56
+ #resolutionScale;
57
+ #activeScene;
58
+ #activeCamera;
59
+ #composerEntities;
60
+ constructor() {
61
+ super({
62
+ enabled: true,
63
+ renderPriority: 1,
64
+ autoClear: true,
65
+ multisampling: 8,
66
+ frameBufferType: THREE.HalfFloatType,
67
+ });
68
+ this.composerRef = injectNgtRef();
69
+ this.#store = inject(NgtStore);
70
+ this.#gl = this.#store.select('gl');
71
+ this.#size = this.#store.select('size');
72
+ this.#defaultScene = this.#store.select('scene');
73
+ this.#defaultCamera = this.#store.select('camera');
74
+ this.#scene = this.select('scene');
75
+ this.#camera = this.select('camera');
76
+ this.#depthBuffer = this.select('depthBuffer');
77
+ this.#stencilBuffer = this.select('stencilBuffer');
78
+ this.#multisampling = this.select('multisampling');
79
+ this.#frameBufferType = this.select('frameBufferType');
80
+ this.#disableNormalPass = this.select('disableNormalPass');
81
+ this.#resolutionScale = this.select('resolutionScale');
82
+ this.#activeScene = computed(() => this.#scene() || this.#defaultScene());
83
+ this.#activeCamera = computed(() => this.#camera() || this.#defaultCamera());
84
+ this.#composerEntities = computed(() => {
85
+ const gl = this.#gl();
86
+ const camera = this.#activeCamera();
87
+ const scene = this.#activeScene();
88
+ const depthBuffer = this.#depthBuffer();
89
+ const stencilBuffer = this.#stencilBuffer();
90
+ const multisampling = this.#multisampling();
91
+ const frameBufferType = this.#frameBufferType();
92
+ const disableNormalPass = this.#disableNormalPass();
93
+ const resolutionScale = this.#resolutionScale();
94
+ const webGL2Available = isWebGL2Available();
95
+ // Initialize composer
96
+ const effectComposer = new EffectComposer(gl, {
97
+ depthBuffer,
98
+ stencilBuffer,
99
+ multisampling: multisampling > 0 && webGL2Available ? multisampling : 0,
100
+ frameBufferType,
101
+ });
102
+ // Add render pass
103
+ effectComposer.addPass(new RenderPass(scene, camera));
104
+ // Create normal pass
105
+ let downSamplingPass = null;
106
+ let normalPass = null;
107
+ if (!disableNormalPass) {
108
+ normalPass = new NormalPass(scene, camera);
109
+ normalPass.enabled = false;
110
+ effectComposer.addPass(normalPass);
111
+ if (resolutionScale !== undefined && webGL2Available) {
112
+ downSamplingPass = new DepthDownsamplingPass({ normalBuffer: normalPass.texture, resolutionScale });
113
+ downSamplingPass.enabled = false;
114
+ effectComposer.addPass(downSamplingPass);
115
+ }
116
+ }
117
+ return { effectComposer, normalPass, downSamplingPass };
118
+ });
119
+ this.api = computed(() => {
120
+ const { effectComposer, normalPass, downSamplingPass } = this.#composerEntities();
121
+ return {
122
+ composer: effectComposer,
123
+ normalPass,
124
+ downSamplingPass,
125
+ resolutionScale: this.#resolutionScale(),
126
+ camera: this.#activeCamera(),
127
+ scene: this.#activeScene(),
128
+ };
129
+ });
130
+ requestAnimationInInjectionContext(() => {
131
+ this.#setComposerSize();
132
+ this.#updateEffectPasses();
133
+ this.#setBeforeRender();
134
+ });
135
+ }
136
+ #setComposerSize() {
137
+ const trigger = computed(() => ({ composer: this.#composerEntities().effectComposer, size: this.#size() }));
138
+ effect(() => {
139
+ const { composer, size } = trigger();
140
+ if (!composer)
141
+ return;
142
+ composer.setSize(size.width, size.height);
143
+ });
144
+ }
145
+ #updateEffectPasses() {
146
+ const trigger = computed(() => ({
147
+ composerEntities: this.#composerEntities(),
148
+ instance: this.composerRef.nativeElement,
149
+ children: this.composerRef.children('nonObjects')(),
150
+ camera: this.#activeCamera(),
151
+ }));
152
+ effect((onCleanup) => {
153
+ const { composerEntities: { effectComposer, normalPass, downSamplingPass }, instance, children, camera, } = trigger();
154
+ let effectPass;
155
+ if (instance && children.length && effectComposer) {
156
+ effectPass = new EffectPass(camera, ...children);
157
+ effectPass.renderToScreen = true;
158
+ effectComposer.addPass(effectPass);
159
+ if (normalPass)
160
+ normalPass.enabled = true;
161
+ if (downSamplingPass)
162
+ downSamplingPass.enabled = true;
163
+ }
164
+ onCleanup(() => {
165
+ if (effectPass)
166
+ effectComposer?.removePass(effectPass);
167
+ if (normalPass)
168
+ normalPass.enabled = false;
169
+ if (downSamplingPass)
170
+ downSamplingPass.enabled = false;
171
+ });
172
+ });
173
+ }
174
+ #setBeforeRender() {
175
+ injectBeforeRender(({ delta }) => {
176
+ const enabled = this.get('enabled');
177
+ const autoClear = this.get('autoClear');
178
+ const gl = this.#store.get('gl');
179
+ const { effectComposer } = this.#composerEntities();
180
+ if (enabled && effectComposer) {
181
+ gl.autoClear = autoClear;
182
+ effectComposer.render(delta);
183
+ }
184
+ }, { priority: this.get('enabled') ? this.get('renderPriority') : 0 });
185
+ }
186
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: NgtpEffectComposer, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
187
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.0.0", type: NgtpEffectComposer, isStandalone: true, selector: "ngtp-effect-composer", inputs: { enabled: "enabled", depthBuffer: "depthBuffer", disableNormalPass: "disableNormalPass", stencilBuffer: "stencilBuffer", autoClear: "autoClear", resolutionScale: "resolutionScale", multisampling: "multisampling", frameBufferType: "frameBufferType", renderPriority: "renderPriority", camera: "camera", scene: "scene" }, providers: [
188
+ {
189
+ provide: NGTP_EFFECT_COMPOSER_API,
190
+ useFactory: (composer) => composer.api,
191
+ deps: [NgtpEffectComposer],
192
+ },
193
+ ], usesInheritance: true, ngImport: i0, template: `
194
+ <ngt-group [ref]="composerRef">
195
+ <ng-content />
196
+ </ngt-group>
197
+ `, isInline: true }); }
198
+ }
199
+ export { NgtpEffectComposer };
200
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: NgtpEffectComposer, decorators: [{
201
+ type: Component,
202
+ args: [{
203
+ selector: 'ngtp-effect-composer',
204
+ standalone: true,
205
+ template: `
206
+ <ngt-group [ref]="composerRef">
207
+ <ng-content />
208
+ </ngt-group>
209
+ `,
210
+ providers: [
211
+ {
212
+ provide: NGTP_EFFECT_COMPOSER_API,
213
+ useFactory: (composer) => composer.api,
214
+ deps: [NgtpEffectComposer],
215
+ },
216
+ ],
217
+ schemas: [CUSTOM_ELEMENTS_SCHEMA],
218
+ }]
219
+ }], ctorParameters: function () { return []; }, propDecorators: { enabled: [{
220
+ type: Input
221
+ }], depthBuffer: [{
222
+ type: Input
223
+ }], disableNormalPass: [{
224
+ type: Input
225
+ }], stencilBuffer: [{
226
+ type: Input
227
+ }], autoClear: [{
228
+ type: Input
229
+ }], resolutionScale: [{
230
+ type: Input
231
+ }], multisampling: [{
232
+ type: Input
233
+ }], frameBufferType: [{
234
+ type: Input
235
+ }], renderPriority: [{
236
+ type: Input
237
+ }], camera: [{
238
+ type: Input
239
+ }], scene: [{
240
+ type: Input
241
+ }] } });
242
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWZmZWN0LWNvbXBvc2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vbGlicy9wb3N0cHJvY2Vzc2luZy9zcmMvZWZmZWN0LWNvbXBvc2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDSCxzQkFBc0IsRUFDdEIsU0FBUyxFQUNULGNBQWMsRUFDZCxLQUFLLEVBRUwsUUFBUSxFQUNSLE1BQU0sRUFDTixNQUFNLEdBQ1QsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUNILGNBQWMsRUFDZCxRQUFRLEVBQ1IsTUFBTSxFQUNOLGtCQUFrQixFQUNsQixZQUFZLEVBQ1osa0NBQWtDLEdBQ3JDLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxjQUFjLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMzRyxPQUFPLEtBQUssS0FBSyxNQUFNLE9BQU8sQ0FBQztBQUMvQixPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sT0FBTyxDQUFDO0FBQzlCLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGNBQWMsQ0FBQzs7QUFFakQsTUFBTSxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztBQXlCbEIsTUFBTSxDQUFDLE1BQU0sd0JBQXdCLEdBQUcsSUFBSSxjQUFjLENBQWdDLHdCQUF3QixDQUFDLENBQUM7QUFFcEgsTUFpQmEsa0JBQW1CLFNBQVEsY0FBdUM7SUFHM0UsSUFBYSxPQUFPLENBQUMsT0FBZ0I7UUFDakMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUM7SUFDMUIsQ0FBQztJQUVELElBQWEsV0FBVyxDQUFDLFdBQW9CO1FBQ3pDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxXQUFXLEVBQUUsQ0FBQyxDQUFDO0lBQzlCLENBQUM7SUFFRCxJQUFhLGlCQUFpQixDQUFDLGlCQUEwQjtR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RSxDQUFDLHNCQUFzQixDQUFDO2lCQUNwQzswRUFJZ0IsT0FBTztzQkFBbkIsS0FBSztnQkFJTyxXQUFXO3NCQUF2QixLQUFLO2dCQUlPLGlCQUFpQjtzQkFBN0IsS0FBSztnQkFJTyxhQUFhO3NCQUF6QixLQUFLO2dCQUlPLFNBQVM7c0JBQXJCLEtBQUs7Z0JBSU8sZUFBZTtzQkFBM0IsS0FBSztnQkFJTyxhQUFhO3NCQUF6QixLQUFLO2dCQUlPLGVBQWU7c0JBQTNCLEtBQUs7Z0JBSU8sY0FBYztzQkFBMUIsS0FBSztnQkFJTyxNQUFNO3NCQUFsQixLQUFLO2dCQUlPLEtBQUs7c0JBQWpCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICAgIENVU1RPTV9FTEVNRU5UU19TQ0hFTUEsXG4gICAgQ29tcG9uZW50LFxuICAgIEluamVjdGlvblRva2VuLFxuICAgIElucHV0LFxuICAgIFNpZ25hbCxcbiAgICBjb21wdXRlZCxcbiAgICBlZmZlY3QsXG4gICAgaW5qZWN0LFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gICAgTmd0U2lnbmFsU3RvcmUsXG4gICAgTmd0U3RvcmUsXG4gICAgZXh0ZW5kLFxuICAgIGluamVjdEJlZm9yZVJlbmRlcixcbiAgICBpbmplY3ROZ3RSZWYsXG4gICAgcmVxdWVzdEFuaW1hdGlvbkluSW5qZWN0aW9uQ29udGV4dCxcbn0gZnJvbSAnYW5ndWxhci10aHJlZSc7XG5pbXBvcnQgeyBEZXB0aERvd25zYW1wbGluZ1Bhc3MsIEVmZmVjdENvbXBvc2VyLCBFZmZlY3RQYXNzLCBOb3JtYWxQYXNzLCBSZW5kZXJQYXNzIH0gZnJvbSAncG9zdHByb2Nlc3NpbmcnO1xuaW1wb3J0ICogYXMgVEhSRUUgZnJvbSAndGhyZWUnO1xuaW1wb3J0IHsgR3JvdXAgfSBmcm9tICd0aHJlZSc7XG5pbXBvcnQgeyBpc1dlYkdMMkF2YWlsYWJsZSB9IGZyb20gJ3RocmVlLXN0ZGxpYic7XG5cbmV4dGVuZCh7IEdyb3VwIH0pO1xuXG5leHBvcnQgaW50ZXJmYWNlIE5ndHBFZmZlY3RDb21wb3NlclN0YXRlIHtcbiAgICBlbmFibGVkOiBib29sZWFuO1xuICAgIGRlcHRoQnVmZmVyPzogYm9vbGVhbjtcbiAgICBkaXNhYmxlTm9ybWFsUGFzcz86IGJvb2xlYW47XG4gICAgc3RlbmNpbEJ1ZmZlcj86IGJvb2xlYW47XG4gICAgYXV0b0NsZWFyOiBib29sZWFuO1xuICAgIHJlc29sdXRpb25TY2FsZT86IG51bWJlcjtcbiAgICBtdWx0aXNhbXBsaW5nOiBudW1iZXI7XG4gICAgZnJhbWVCdWZmZXJUeXBlOiBUSFJFRS5UZXh0dXJlRGF0YVR5cGU7XG4gICAgcmVuZGVyUHJpb3JpdHk6IG51bWJlcjtcbiAgICBjYW1lcmE/OiBUSFJFRS5DYW1lcmE7XG4gICAgc2NlbmU/OiBUSFJFRS5TY2VuZTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBOZ3RwRWZmZWN0Q29tcG9zZXJBcGkge1xuICAgIGNvbXBvc2VyOiBFZmZlY3RDb21wb3NlcjtcbiAgICBub3JtYWxQYXNzOiBOb3JtYWxQYXNzIHwgbnVsbDtcbiAgICBkb3duU2FtcGxpbmdQYXNzOiBEZXB0aERvd25zYW1wbGluZ1Bhc3MgfCBudWxsO1xuICAgIGNhbWVyYTogVEhSRUUuQ2FtZXJhO1xuICAgIHNjZW5lOiBUSFJFRS5TY2VuZTtcbiAgICByZXNvbHV0aW9uU2NhbGU/OiBudW1iZXI7XG59XG5cbmV4cG9ydCBjb25zdCBOR1RQX0VGRkVDVF9DT01QT1NFUl9BUEkgPSBuZXcgSW5qZWN0aW9uVG9rZW48U2lnbmFsPE5ndHBFZmZlY3RDb21wb3NlckFwaT4+KCdOZ3RwRWZmZWN0Q29tcG9zZXIgQVBJJyk7XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnbmd0cC1lZmZlY3QtY29tcG9zZXInLFxuICAgIHN0YW5kYWxvbmU6IHRydWUsXG4gICAgdGVtcGxhdGU6IGBcbiAgICAgICAgPG5ndC1ncm91cCBbcmVmXT1cImNvbXBvc2VyUmVmXCI+XG4gICAgICAgICAgICA8bmctY29udGVudCAvPlxuICAgICAgICA8L25ndC1ncm91cD5cbiAgICBgLFxuICAgIHByb3ZpZGVyczogW1xuICAgICAgICB7XG4gICAgICAgICAgICBwcm92aWRlOiBOR1RQX0VGRkVDVF9DT01QT1NFUl9BUEksXG4gICAgICAgICAgICB1c2VGYWN0b3J5OiAoY29tcG9zZXI6IE5ndHBFZmZlY3RDb21wb3NlcikgPT4gY29tcG9zZXIuYXBpLFxuICAgICAgICAgICAgZGVwczogW05ndHBFZmZlY3RDb21wb3Nlcl0sXG4gICAgICAgIH0sXG4gICAgXSxcbiAgICBzY2hlbWFzOiBbQ1VTVE9NX0VMRU1FTlRTX1NDSEVNQV0sXG59KVxuZXhwb3J0IGNsYXNzIE5ndHBFZmZlY3RDb21wb3NlciBleHRlbmRzIE5ndFNpZ25hbFN0b3JlPE5ndHBFZmZlY3RDb21wb3NlclN0YXRlPiB7XG4gICAgcmVhZG9ubHkgY29tcG9zZXJSZWYgPSBpbmplY3ROZ3RSZWY8VEhSRUUuR3JvdXA+KCk7XG5cbiAgICBASW5wdXQoKSBzZXQgZW5hYmxlZChlbmFibGVkOiBib29sZWFuKSB7XG4gICAgICAgIHRoaXMuc2V0KHsgZW5hYmxlZCB9KTtcbiAgICB9XG5cbiAgICBASW5wdXQoKSBzZXQgZGVwdGhCdWZmZXIoZGVwdGhCdWZmZXI6IGJvb2xlYW4pIHtcbiAgICAgICAgdGhpcy5zZXQoeyBkZXB0aEJ1ZmZlciB9KTtcbiAgICB9XG5cbiAgICBASW5wdXQoKSBzZXQgZGlzYWJsZU5vcm1hbFBhc3MoZGlzYWJsZU5vcm1hbFBhc3M6IGJvb2xlYW4pIHtcbiAgICAgICAgdGhpcy5zZXQoeyBkaXNhYmxlTm9ybWFsUGFzcyB9KTtcbiAgICB9XG5cbiAgICBASW5wdXQoKSBzZXQgc3RlbmNpbEJ1ZmZlcihzdGVuY2lsQnVmZmVyOiBib29sZWFuKSB7XG4gICAgICAgIHRoaXMuc2V0KHsgc3RlbmNpbEJ1ZmZlciB9KTtcbiAgICB9XG5cbiAgICBASW5wdXQoKSBzZXQgYXV0b0NsZWFyKGF1dG9DbGVhcjogYm9vbGVhbikge1xuICAgICAgICB0aGlzLnNldCh7IGF1dG9DbGVhciB9KTtcbiAgICB9XG5cbiAgICBASW5wdXQoKSBzZXQgcmVzb2x1dGlvblNjYWxlKHJlc29sdXRpb25TY2FsZTogbnVtYmVyKSB7XG4gICAgICAgIHRoaXMuc2V0KHsgcmVzb2x1dGlvblNjYWxlIH0pO1xuICAgIH1cblxuICAgIEBJbnB1dCgpIHNldCBtdWx0aXNhbXBsaW5nKG11bHRpc2FtcGxpbmc6IG51bWJlcikge1xuICAgICAgICB0aGlzLnNldCh7IG11bHRpc2FtcGxpbmcgfSk7XG4gICAgfVxuXG4gICAgQElucHV0KCkgc2V0IGZyYW1lQnVmZmVyVHlwZShmcmFtZUJ1ZmZlclR5cGU6IFRIUkVFLlRleHR1cmVEYXRhVHlwZSkge1xuICAgICAgICB0aGlzLnNldCh7IGZyYW1lQnVmZmVyVHlwZSB9KTtcbiAgICB9XG5cbiAgICBASW5wdXQoKSBzZXQgcmVuZGVyUHJpb3JpdHkocmVuZGVyUHJpb3JpdHk6IG51bWJlcikge1xuICAgICAgICB0aGlzLnNldCh7IHJlbmRlclByaW9yaXR5IH0pO1xuICAgIH1cblxuICAgIEBJbnB1dCgpIHNldCBjYW1lcmEoY2FtZXJhOiBUSFJFRS5DYW1lcmEpIHtcbiAgICAgICAgdGhpcy5zZXQoeyBjYW1lcmEgfSk7XG4gICAgfVxuXG4gICAgQElucHV0KCkgc2V0IHNjZW5lKHNjZW5lOiBUSFJFRS5TY2VuZSkge1xuICAgICAgICB0aGlzLnNldCh7IHNjZW5lIH0pO1xuICAgIH1cblxuICAgIHJlYWRvbmx5ICNzdG9yZSA9IGluamVjdChOZ3RTdG9yZSk7XG4gICAgcmVhZG9ubHkgI2dsID0gdGhpcy4jc3RvcmUuc2VsZWN0KCdnbCcpO1xuICAgIHJlYWRvbmx5ICNzaXplID0gdGhpcy4jc3RvcmUuc2VsZWN0KCdzaXplJyk7XG4gICAgcmVhZG9ubHkgI2RlZmF1bHRTY2VuZSA9IHRoaXMuI3N0b3JlLnNlbGVjdCgnc2NlbmUnKTtcbiAgICByZWFkb25seSAjZGVmYXVsdENhbWVyYSA9IHRoaXMuI3N0b3JlLnNlbGVjdCgnY2FtZXJhJyk7XG5cbiAgICByZWFkb25seSAjc2NlbmUgPSB0aGlzLnNlbGVjdCgnc2NlbmUnKTtcbiAgICByZWFkb25seSAjY2FtZXJhID0gdGhpcy5zZWxlY3QoJ2NhbWVyYScpO1xuXG4gICAgcmVhZG9ubHkgI2RlcHRoQnVmZmVyID0gdGhpcy5zZWxlY3QoJ2RlcHRoQnVmZmVyJyk7XG4gICAgcmVhZG9ubHkgI3N0ZW5jaWxCdWZmZXIgPSB0aGlzLnNlbGVjdCgnc3RlbmNpbEJ1ZmZlcicpO1xuICAgIHJlYWRvbmx5ICNtdWx0aXNhbXBsaW5nID0gdGhpcy5zZWxlY3QoJ211bHRpc2FtcGxpbmcnKTtcbiAgICByZWFkb25seSAjZnJhbWVCdWZmZXJUeXBlID0gdGhpcy5zZWxlY3QoJ2ZyYW1lQnVmZmVyVHlwZScpO1xuICAgIHJlYWRvbmx5ICNkaXNhYmxlTm9ybWFsUGFzcyA9IHRoaXMuc2VsZWN0KCdkaXNhYmxlTm9ybWFsUGFzcycpO1xuICAgIHJlYWRvbmx5ICNyZXNvbHV0aW9uU2NhbGUgPSB0aGlzLnNlbGVjdCgncmVzb2x1dGlvblNjYWxlJyk7XG5cbiAgICByZWFkb25seSAjYWN0aXZlU2NlbmUgPSBjb21wdXRlZCgoKSA9PiB0aGlzLiNzY2VuZSgpIHx8IHRoaXMuI2RlZmF1bHRTY2VuZSgpKTtcbiAgICByZWFkb25seSAjYWN0aXZlQ2FtZXJhID0gY29tcHV0ZWQoKCkgPT4gdGhpcy4jY2FtZXJhKCkgfHwgdGhpcy4jZGVmYXVsdENhbWVyYSgpKTtcblxuICAgIHJlYWRvbmx5ICNjb21wb3NlckVudGl0aWVzID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgICBjb25zdCBnbCA9IHRoaXMuI2dsKCk7XG4gICAgICAgIGNvbnN0IGNhbWVyYSA9IHRoaXMuI2FjdGl2ZUNhbWVyYSgpO1xuICAgICAgICBjb25zdCBzY2VuZSA9IHRoaXMuI2FjdGl2ZVNjZW5lKCk7XG4gICAgICAgIGNvbnN0IGRlcHRoQnVmZmVyID0gdGhpcy4jZGVwdGhCdWZmZXIoKTtcbiAgICAgICAgY29uc3Qgc3RlbmNpbEJ1ZmZlciA9IHRoaXMuI3N0ZW5jaWxCdWZmZXIoKTtcbiAgICAgICAgY29uc3QgbXVsdGlzYW1wbGluZyA9IHRoaXMuI211bHRpc2FtcGxpbmcoKTtcbiAgICAgICAgY29uc3QgZnJhbWVCdWZmZXJUeXBlID0gdGhpcy4jZnJhbWVCdWZmZXJUeXBlKCk7XG4gICAgICAgIGNvbnN0IGRpc2FibGVOb3JtYWxQYXNzID0gdGhpcy4jZGlzYWJsZU5vcm1hbFBhc3MoKTtcbiAgICAgICAgY29uc3QgcmVzb2x1dGlvblNjYWxlID0gdGhpcy4jcmVzb2x1dGlvblNjYWxlKCk7XG5cbiAgICAgICAgY29uc3Qgd2ViR0wyQXZhaWxhYmxlID0gaXNXZWJHTDJBdmFpbGFibGUoKTtcbiAgICAgICAgLy8gSW5pdGlhbGl6ZSBjb21wb3NlclxuICAgICAgICBjb25zdCBlZmZlY3RDb21wb3NlciA9IG5ldyBFZmZlY3RDb21wb3NlcihnbCwge1xuICAgICAgICAgICAgZGVwdGhCdWZmZXIsXG4gICAgICAgICAgICBzdGVuY2lsQnVmZmVyLFxuICAgICAgICAgICAgbXVsdGlzYW1wbGluZzogbXVsdGlzYW1wbGluZyA+IDAgJiYgd2ViR0wyQXZhaWxhYmxlID8gbXVsdGlzYW1wbGluZyA6IDAsXG4gICAgICAgICAgICBmcmFtZUJ1ZmZlclR5cGUsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIEFkZCByZW5kZXIgcGFzc1xuICAgICAgICBlZmZlY3RDb21wb3Nlci5hZGRQYXNzKG5ldyBSZW5kZXJQYXNzKHNjZW5lLCBjYW1lcmEpKTtcblxuICAgICAgICAvLyBDcmVhdGUgbm9ybWFsIHBhc3NcbiAgICAgICAgbGV0IGRvd25TYW1wbGluZ1Bhc3MgPSBudWxsO1xuICAgICAgICBsZXQgbm9ybWFsUGFzcyA9IG51bGw7XG4gICAgICAgIGlmICghZGlzYWJsZU5vcm1hbFBhc3MpIHtcbiAgICAgICAgICAgIG5vcm1hbFBhc3MgPSBuZXcgTm9ybWFsUGFzcyhzY2VuZSwgY2FtZXJhKTtcbiAgICAgICAgICAgIG5vcm1hbFBhc3MuZW5hYmxlZCA9IGZhbHNlO1xuICAgICAgICAgICAgZWZmZWN0Q29tcG9zZXIuYWRkUGFzcyhub3JtYWxQYXNzKTtcbiAgICAgICAgICAgIGlmIChyZXNvbHV0aW9uU2NhbGUgIT09IHVuZGVmaW5lZCAmJiB3ZWJHTDJBdmFpbGFibGUpIHtcbiAgICAgICAgICAgICAgICBkb3duU2FtcGxpbmdQYXNzID0gbmV3IERlcHRoRG93bnNhbXBsaW5nUGFzcyh7IG5vcm1hbEJ1ZmZlcjogbm9ybWFsUGFzcy50ZXh0dXJlLCByZXNvbHV0aW9uU2NhbGUgfSk7XG4gICAgICAgICAgICAgICAgZG93blNhbXBsaW5nUGFzcy5lbmFibGVkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgZWZmZWN0Q29tcG9zZXIuYWRkUGFzcyhkb3duU2FtcGxpbmdQYXNzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7IGVmZmVjdENvbXBvc2VyLCBub3JtYWxQYXNzLCBkb3duU2FtcGxpbmdQYXNzIH07XG4gICAgfSk7XG5cbiAgICByZWFkb25seSBhcGkgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICAgIGNvbnN0IHsgZWZmZWN0Q29tcG9zZXIsIG5vcm1hbFBhc3MsIGRvd25TYW1wbGluZ1Bhc3MgfSA9IHRoaXMuI2NvbXBvc2VyRW50aXRpZXMoKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNvbXBvc2VyOiBlZmZlY3RDb21wb3NlcixcbiAgICAgICAgICAgIG5vcm1hbFBhc3MsXG4gICAgICAgICAgICBkb3duU2FtcGxpbmdQYXNzLFxuICAgICAgICAgICAgcmVzb2x1dGlvblNjYWxlOiB0aGlzLiNyZXNvbHV0aW9uU2NhbGUoKSxcbiAgICAgICAgICAgIGNhbWVyYTogdGhpcy4jYWN0aXZlQ2FtZXJhKCksXG4gICAgICAgICAgICBzY2VuZTogdGhpcy4jYWN0aXZlU2NlbmUoKSxcbiAgICAgICAgfTtcbiAgICB9KTtcblxuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlcih7XG4gICAgICAgICAgICBlbmFibGVkOiB0cnVlLFxuICAgICAgICAgICAgcmVuZGVyUHJpb3JpdHk6IDEsXG4gICAgICAgICAgICBhdXRvQ2xlYXI6IHRydWUsXG4gICAgICAgICAgICBtdWx0aXNhbXBsaW5nOiA4LFxuICAgICAgICAgICAgZnJhbWVCdWZmZXJUeXBlOiBUSFJFRS5IYWxmRmxvYXRUeXBlLFxuICAgICAgICB9KTtcbiAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkluSW5qZWN0aW9uQ29udGV4dCgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLiNzZXRDb21wb3NlclNpemUoKTtcbiAgICAgICAgICAgIHRoaXMuI3VwZGF0ZUVmZmVjdFBhc3NlcygpO1xuICAgICAgICAgICAgdGhpcy4jc2V0QmVmb3JlUmVuZGVyKCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgICNzZXRDb21wb3NlclNpemUoKSB7XG4gICAgICAgIGNvbnN0IHRyaWdnZXIgPSBjb21wdXRlZCgoKSA9PiAoeyBjb21wb3NlcjogdGhpcy4jY29tcG9zZXJFbnRpdGllcygpLmVmZmVjdENvbXBvc2VyLCBzaXplOiB0aGlzLiNzaXplKCkgfSkpO1xuICAgICAgICBlZmZlY3QoKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgeyBjb21wb3Nlciwgc2l6ZSB9ID0gdHJpZ2dlcigpO1xuICAgICAgICAgICAgaWYgKCFjb21wb3NlcikgcmV0dXJuO1xuICAgICAgICAgICAgY29tcG9zZXIuc2V0U2l6ZShzaXplLndpZHRoLCBzaXplLmhlaWdodCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgICN1cGRhdGVFZmZlY3RQYXNzZXMoKSB7XG4gICAgICAgIGNvbnN0IHRyaWdnZXIgPSBjb21wdXRlZCgoKSA9PiAoe1xuICAgICAgICAgICAgY29tcG9zZXJFbnRpdGllczogdGhpcy4jY29tcG9zZXJFbnRpdGllcygpLFxuICAgICAgICAgICAgaW5zdGFuY2U6IHRoaXMuY29tcG9zZXJSZWYubmF0aXZlRWxlbWVudCxcbiAgICAgICAgICAgIGNoaWxkcmVuOiB0aGlzLmNvbXBvc2VyUmVmLmNoaWxkcmVuKCdub25PYmplY3RzJykoKSxcbiAgICAgICAgICAgIGNhbWVyYTogdGhpcy4jYWN0aXZlQ2FtZXJhKCksXG4gICAgICAgIH0pKTtcbiAgICAgICAgZWZmZWN0KChvbkNsZWFudXApID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgICAgICBjb21wb3NlckVudGl0aWVzOiB7IGVmZmVjdENvbXBvc2VyLCBub3JtYWxQYXNzLCBkb3duU2FtcGxpbmdQYXNzIH0sXG4gICAgICAgICAgICAgICAgaW5zdGFuY2UsXG4gICAgICAgICAgICAgICAgY2hpbGRyZW4sXG4gICAgICAgICAgICAgICAgY2FtZXJhLFxuICAgICAgICAgICAgfSA9IHRyaWdnZXIoKTtcblxuICAgICAgICAgICAgbGV0IGVmZmVjdFBhc3M6IEVmZmVjdFBhc3M7XG4gICAgICAgICAgICBpZiAoaW5zdGFuY2UgJiYgY2hpbGRyZW4ubGVuZ3RoICYmIGVmZmVjdENvbXBvc2VyKSB7XG4gICAgICAgICAgICAgICAgZWZmZWN0UGFzcyA9IG5ldyBFZmZlY3RQYXNzKGNhbWVyYSwgLi4uY2hpbGRyZW4pO1xuICAgICAgICAgICAgICAgIGVmZmVjdFBhc3MucmVuZGVyVG9TY3JlZW4gPSB0cnVlO1xuICAgICAgICAgICAgICAgIGVmZmVjdENvbXBvc2VyLmFkZFBhc3MoZWZmZWN0UGFzcyk7XG4gICAgICAgICAgICAgICAgaWYgKG5vcm1hbFBhc3MpIG5vcm1hbFBhc3MuZW5hYmxlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgaWYgKGRvd25TYW1wbGluZ1Bhc3MpIGRvd25TYW1wbGluZ1Bhc3MuZW5hYmxlZCA9IHRydWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIG9uQ2xlYW51cCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGVmZmVjdFBhc3MpIGVmZmVjdENvbXBvc2VyPy5yZW1vdmVQYXNzKGVmZmVjdFBhc3MpO1xuICAgICAgICAgICAgICAgIGlmIChub3JtYWxQYXNzKSBub3JtYWxQYXNzLmVuYWJsZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBpZiAoZG93blNhbXBsaW5nUGFzcykgZG93blNhbXBsaW5nUGFzcy5lbmFibGVkID0gZmFsc2U7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgI3NldEJlZm9yZVJlbmRlcigpIHtcbiAgICAgICAgaW5qZWN0QmVmb3JlUmVuZGVyKFxuICAgICAgICAgICAgKHsgZGVsdGEgfSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGVuYWJsZWQgPSB0aGlzLmdldCgnZW5hYmxlZCcpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGF1dG9DbGVhciA9IHRoaXMuZ2V0KCdhdXRvQ2xlYXInKTtcbiAgICAgICAgICAgICAgICBjb25zdCBnbCA9IHRoaXMuI3N0b3JlLmdldCgnZ2wnKTtcbiAgICAgICAgICAgICAgICBjb25zdCB7IGVmZmVjdENvbXBvc2VyIH0gPSB0aGlzLiNjb21wb3NlckVudGl0aWVzKCk7XG4gICAgICAgICAgICAgICAgaWYgKGVuYWJsZWQgJiYgZWZmZWN0Q29tcG9zZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgZ2wuYXV0b0NsZWFyID0gYXV0b0NsZWFyO1xuICAgICAgICAgICAgICAgICAgICBlZmZlY3RDb21wb3Nlci5yZW5kZXIoZGVsdGEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7IHByaW9yaXR5OiB0aGlzLmdldCgnZW5hYmxlZCcpID8gdGhpcy5nZXQoJ3JlbmRlclByaW9yaXR5JykgOiAwIH1cbiAgICAgICAgKTtcbiAgICB9XG59XG4iXX0=