angular-three-postprocessing 2.0.0-beta.7 → 2.0.0-beta.8

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 (90) hide show
  1. package/esm2022/index.mjs +4 -3
  2. package/esm2022/lib/effect-composer.mjs +248 -0
  3. package/esm2022/lib/effect.mjs +78 -0
  4. package/esm2022/lib/effects/bloom/bloom.mjs +33 -0
  5. package/esm2022/lib/effects/brightness-contrast/brightness-contrast.mjs +29 -0
  6. package/esm2022/lib/effects/color-depth/color-depth.mjs +29 -0
  7. package/esm2022/lib/effects/depth/depth.mjs +29 -0
  8. package/esm2022/lib/effects/dot-screen/dot-screen.mjs +29 -0
  9. package/esm2022/lib/effects/hue-saturation/hue-saturation.mjs +29 -0
  10. package/esm2022/lib/effects/index.mjs +18 -0
  11. package/esm2022/lib/effects/lut/lut.mjs +70 -0
  12. package/esm2022/lib/effects/noise/noise.mjs +33 -0
  13. package/esm2022/lib/effects/pixelation/pixelation.mjs +33 -0
  14. package/esm2022/lib/effects/scanline/scanline.mjs +33 -0
  15. package/esm2022/lib/effects/sepia/sepia.mjs +29 -0
  16. package/esm2022/lib/effects/shock-wave/shock-wave.mjs +29 -0
  17. package/esm2022/lib/effects/smaa/smaa.mjs +29 -0
  18. package/esm2022/lib/effects/ssao/ssao.mjs +213 -0
  19. package/esm2022/lib/effects/tilt-shift/tilt-shift.mjs +33 -0
  20. package/esm2022/lib/effects/tone-mapping/tone-mapping.mjs +29 -0
  21. package/esm2022/lib/effects/vignette/vignette.mjs +29 -0
  22. package/fesm2022/angular-three-postprocessing.mjs +868 -206
  23. package/fesm2022/angular-three-postprocessing.mjs.map +1 -1
  24. package/index.d.ts +3 -2
  25. package/lib/effect-composer.d.ts +100 -0
  26. package/lib/effect.d.ts +27 -0
  27. package/{effects → lib/effects}/bloom/bloom.d.ts +7 -2
  28. package/{effects → lib/effects}/brightness-contrast/brightness-contrast.d.ts +9 -1
  29. package/{effects → lib/effects}/color-depth/color-depth.d.ts +8 -1
  30. package/{effects → lib/effects}/depth/depth.d.ts +8 -1
  31. package/{effects → lib/effects}/dot-screen/dot-screen.d.ts +9 -1
  32. package/{effects → lib/effects}/hue-saturation/hue-saturation.d.ts +9 -1
  33. package/{effects → lib/effects}/index.d.ts +1 -0
  34. package/lib/effects/lut/lut.d.ts +29 -0
  35. package/{effects → lib/effects}/noise/noise.d.ts +8 -1
  36. package/lib/effects/pixelation/pixelation.d.ts +20 -0
  37. package/{effects → lib/effects}/scanline/scanline.d.ts +8 -1
  38. package/{effects → lib/effects}/sepia/sepia.d.ts +8 -1
  39. package/lib/effects/shock-wave/shock-wave.d.ts +17 -0
  40. package/lib/effects/smaa/smaa.d.ts +16 -0
  41. package/lib/effects/ssao/ssao.d.ts +42 -0
  42. package/lib/effects/tilt-shift/tilt-shift.d.ts +23 -0
  43. package/lib/effects/tone-mapping/tone-mapping.d.ts +22 -0
  44. package/lib/effects/vignette/vignette.d.ts +17 -0
  45. package/package.json +3 -14
  46. package/effect-composer.d.ts +0 -53
  47. package/effect.d.ts +0 -24
  48. package/effects/README.md +0 -3
  49. package/effects/lut/lut.d.ts +0 -19
  50. package/effects/shock-wave/shock-wave.d.ts +0 -7
  51. package/effects/smaa/smaa.d.ts +0 -7
  52. package/effects/ssao/ssao.d.ts +0 -38
  53. package/effects/tilt-shift/tilt-shift.d.ts +0 -8
  54. package/effects/tone-mapping/tone-mapping.d.ts +0 -7
  55. package/effects/vignette/vignette.d.ts +0 -7
  56. package/esm2022/effect-composer.mjs +0 -242
  57. package/esm2022/effect.mjs +0 -79
  58. package/esm2022/effects/angular-three-postprocessing-effects.mjs +0 -5
  59. package/esm2022/effects/bloom/bloom.mjs +0 -34
  60. package/esm2022/effects/brightness-contrast/brightness-contrast.mjs +0 -30
  61. package/esm2022/effects/color-depth/color-depth.mjs +0 -30
  62. package/esm2022/effects/depth/depth.mjs +0 -30
  63. package/esm2022/effects/dot-screen/dot-screen.mjs +0 -30
  64. package/esm2022/effects/hue-saturation/hue-saturation.mjs +0 -30
  65. package/esm2022/effects/index.mjs +0 -17
  66. package/esm2022/effects/lut/lut.mjs +0 -77
  67. package/esm2022/effects/noise/noise.mjs +0 -34
  68. package/esm2022/effects/scanline/scanline.mjs +0 -34
  69. package/esm2022/effects/sepia/sepia.mjs +0 -30
  70. package/esm2022/effects/shock-wave/shock-wave.mjs +0 -30
  71. package/esm2022/effects/smaa/smaa.mjs +0 -30
  72. package/esm2022/effects/ssao/ssao.mjs +0 -187
  73. package/esm2022/effects/tilt-shift/tilt-shift.mjs +0 -34
  74. package/esm2022/effects/tone-mapping/tone-mapping.mjs +0 -30
  75. package/esm2022/effects/vignette/vignette.mjs +0 -30
  76. package/fesm2022/angular-three-postprocessing-effects.mjs +0 -617
  77. package/fesm2022/angular-three-postprocessing-effects.mjs.map +0 -1
  78. package/plugin/README.md +0 -11
  79. package/plugin/generators.json +0 -19
  80. package/plugin/package.json +0 -9
  81. package/plugin/src/generators/init/compat.d.ts +0 -2
  82. package/plugin/src/generators/init/compat.js +0 -6
  83. package/plugin/src/generators/init/compat.js.map +0 -1
  84. package/plugin/src/generators/init/init.d.ts +0 -4
  85. package/plugin/src/generators/init/init.js +0 -22
  86. package/plugin/src/generators/init/init.js.map +0 -1
  87. package/plugin/src/generators/init/schema.json +0 -6
  88. package/plugin/src/index.d.ts +0 -1
  89. package/plugin/src/index.js +0 -6
  90. package/plugin/src/index.js.map +0 -1
@@ -0,0 +1,42 @@
1
+ import { BlendFunction, SSAOEffect } from 'postprocessing';
2
+ import * as i0 from "@angular/core";
3
+ export type NgtpSSAOState = NonNullable<ConstructorParameters<typeof SSAOEffect>[2]>;
4
+ declare global {
5
+ interface HTMLElementTagNameMap {
6
+ 'ngtp-SSAO': NgtpSSAOState;
7
+ }
8
+ }
9
+ export declare class NgtpSSAO {
10
+ private inputs;
11
+ effectRef: import("angular-three").NgtInjectedRef<SSAOEffect>;
12
+ set _blendFunction(blendFunction: BlendFunction);
13
+ set _distanceScaling(distanceScaling: boolean);
14
+ set _depthAwareUpsampling(depthAwareUpsampling: boolean);
15
+ set _normalDepthBuffer(normalDepthBuffer: THREE.Texture);
16
+ set _samples(samples: number);
17
+ set _rings(rings: number);
18
+ set _worldDistanceThreshold(worldDistanceThreshold: number);
19
+ set _worldDistanceFalloff(worldDistanceFalloff: number);
20
+ set _worldProximityThreshold(worldProximityThreshold: number);
21
+ set _worldProximityFalloff(worldProximityFalloff: number);
22
+ set _distanceThreshold(distanceThreshold: number);
23
+ set _distanceFalloff(distanceFalloff: number);
24
+ set _rangeThreshold(rangeThreshold: number);
25
+ set _rangeFalloff(rangeFalloff: number);
26
+ set _minRadiusScale(minRadiusScale: number);
27
+ set _luminanceInfluence(luminanceInfluence: number);
28
+ set _radius(radius: number);
29
+ set _intensity(intensity: number);
30
+ set _bias(bias: number);
31
+ set _fade(fade: number);
32
+ set _color(color: THREE.Color);
33
+ set _resolutionScale(resolutionScale: number);
34
+ set _resolutionX(resolutionX: number);
35
+ set _resolutionY(resolutionY: number);
36
+ set _width(width: number);
37
+ set _height(height: number);
38
+ private effectComposerApi;
39
+ effect: import("@angular/core").Signal<SSAOEffect | null>;
40
+ static ɵfac: i0.ɵɵFactoryDeclaration<NgtpSSAO, never>;
41
+ 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>;
42
+ }
@@ -0,0 +1,23 @@
1
+ import { BlendFunction, KernelSize, TiltShiftEffect } from 'postprocessing';
2
+ import { NgtpEffect, type NgtpEffectState } from '../../effect';
3
+ import * as i0 from "@angular/core";
4
+ declare global {
5
+ interface HTMLElementTagNameMap {
6
+ 'ngtp-tilt-shift': {
7
+ offset?: number;
8
+ rotation?: number;
9
+ focusArea?: number;
10
+ feather?: number;
11
+ bias?: number;
12
+ kernelSize?: KernelSize;
13
+ resolutionScale?: number;
14
+ resolutionX?: number;
15
+ resolutionY?: number;
16
+ } & NgtpEffectState;
17
+ }
18
+ }
19
+ export declare class NgtpTiltShift extends NgtpEffect<TiltShiftEffect> {
20
+ defaultBlendFunction: BlendFunction;
21
+ static ɵfac: i0.ɵɵFactoryDeclaration<NgtpTiltShift, never>;
22
+ static ɵcmp: i0.ɵɵComponentDeclaration<NgtpTiltShift, "ngtp-tilt-shift", never, {}, {}, never, ["*"], true, never>;
23
+ }
@@ -0,0 +1,22 @@
1
+ import { ToneMappingEffect, ToneMappingMode } from 'postprocessing';
2
+ import { NgtpEffect, type NgtpEffectState } from '../../effect';
3
+ import * as i0 from "@angular/core";
4
+ declare global {
5
+ interface HTMLElementTagNameMap {
6
+ 'ngtp-tone-mapping': {
7
+ adaptive?: boolean;
8
+ mode?: ToneMappingMode;
9
+ resolution?: number;
10
+ maxLuminance?: number;
11
+ whitePoint?: number;
12
+ middleGrey?: number;
13
+ minLuminance?: number;
14
+ averageLuminance?: number;
15
+ adaptationRate?: number;
16
+ } & NgtpEffectState;
17
+ }
18
+ }
19
+ export declare class NgtpToneMapping extends NgtpEffect<ToneMappingEffect> {
20
+ static ɵfac: i0.ɵɵFactoryDeclaration<NgtpToneMapping, never>;
21
+ static ɵcmp: i0.ɵɵComponentDeclaration<NgtpToneMapping, "ngtp-tone-mapping", never, {}, {}, never, ["*"], true, never>;
22
+ }
@@ -0,0 +1,17 @@
1
+ import { VignetteEffect, VignetteTechnique } from 'postprocessing';
2
+ import { NgtpEffect, type NgtpEffectState } from '../../effect';
3
+ import * as i0 from "@angular/core";
4
+ declare global {
5
+ interface HTMLElementTagNameMap {
6
+ 'ngtp-vignette': {
7
+ technique?: VignetteTechnique;
8
+ eskil?: boolean;
9
+ offset?: number;
10
+ darkness?: number;
11
+ } & NgtpEffectState;
12
+ }
13
+ }
14
+ export declare class NgtpVignette extends NgtpEffect<VignetteEffect> {
15
+ static ɵfac: i0.ɵɵFactoryDeclaration<NgtpVignette, never>;
16
+ static ɵcmp: i0.ɵɵComponentDeclaration<NgtpVignette, "ngtp-vignette", never, {}, {}, never, ["*"], true, never>;
17
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "angular-three-postprocessing",
3
- "version": "2.0.0-beta.7",
3
+ "version": "2.0.0-beta.8",
4
4
  "publishConfig": {
5
5
  "access": "public"
6
6
  },
@@ -26,17 +26,12 @@
26
26
  "@angular/core": " ^16.0.0",
27
27
  "angular-three": "^2.0.0",
28
28
  "postprocessing": "^6.0.0",
29
- "three": "^0.148.0 || ^0.149.0 || ^0.150.0 || ^0.151.0 || ^0.152.0",
30
- "three-stdlib": "2.23.4"
29
+ "three": ">=0.148.0"
31
30
  },
32
31
  "dependencies": {
33
- "tslib": "^2.3.0",
34
- "@nx/devkit": "^16.0.0",
35
- "nx": "^16.0.0"
32
+ "tslib": "^2.3.0"
36
33
  },
37
34
  "sideEffects": false,
38
- "generators": "./plugin/generators.json",
39
- "schematics": "./plugin/generators.json",
40
35
  "module": "fesm2022/angular-three-postprocessing.mjs",
41
36
  "typings": "index.d.ts",
42
37
  "exports": {
@@ -48,12 +43,6 @@
48
43
  "esm2022": "./esm2022/angular-three-postprocessing.mjs",
49
44
  "esm": "./esm2022/angular-three-postprocessing.mjs",
50
45
  "default": "./fesm2022/angular-three-postprocessing.mjs"
51
- },
52
- "./effects": {
53
- "types": "./effects/index.d.ts",
54
- "esm2022": "./esm2022/effects/angular-three-postprocessing-effects.mjs",
55
- "esm": "./esm2022/effects/angular-three-postprocessing-effects.mjs",
56
- "default": "./fesm2022/angular-three-postprocessing-effects.mjs"
57
46
  }
58
47
  }
59
48
  }
@@ -1,53 +0,0 @@
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 DELETED
@@ -1,24 +0,0 @@
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
- }
package/effects/README.md DELETED
@@ -1,3 +0,0 @@
1
- # angular-three-postprocessing/effects
2
-
3
- Secondary entry point of `angular-three-postprocessing`. It can be used by importing from `angular-three-postprocessing/effects`.
@@ -1,19 +0,0 @@
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
- }
@@ -1,7 +0,0 @@
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
- }
@@ -1,7 +0,0 @@
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
- }
@@ -1,38 +0,0 @@
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
- }
@@ -1,8 +0,0 @@
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
- }
@@ -1,7 +0,0 @@
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
- }
@@ -1,7 +0,0 @@
1
- import { NgtpEffect } from 'angular-three-postprocessing';
2
- import { VignetteEffect } from 'postprocessing';
3
- import * as i0 from "@angular/core";
4
- export declare class NgtpVignette extends NgtpEffect<VignetteEffect> {
5
- static ɵfac: i0.ɵɵFactoryDeclaration<NgtpVignette, never>;
6
- static ɵcmp: i0.ɵɵComponentDeclaration<NgtpVignette, "ngtp-vignette", never, {}, {}, never, ["*"], true, never>;
7
- }
@@ -1,242 +0,0 @@
1
- import { CUSTOM_ELEMENTS_SCHEMA, Component, InjectionToken, Input, computed, effect, inject, } from '@angular/core';
2
- import { NgtSignalStore, NgtStore, extend, injectBeforeRender, injectNgtRef, requestAnimationFrameInInjectionContext, } 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
- requestAnimationFrameInInjectionContext(() => {
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.3", ngImport: i0, type: NgtpEffectComposer, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
187
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.0.3", 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.3", 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWZmZWN0LWNvbXBvc2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vbGlicy9wb3N0cHJvY2Vzc2luZy9zcmMvZWZmZWN0LWNvbXBvc2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDSCxzQkFBc0IsRUFDdEIsU0FBUyxFQUNULGNBQWMsRUFDZCxLQUFLLEVBRUwsUUFBUSxFQUNSLE1BQU0sRUFDTixNQUFNLEdBQ1QsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUNILGNBQWMsRUFDZCxRQUFRLEVBQ1IsTUFBTSxFQUNOLGtCQUFrQixFQUNsQixZQUFZLEVBQ1osdUNBQXVDLEdBQzFDLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxjQUFjLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMzRyxPQUFPLEtBQUssS0FBSyxNQUFNLE9BQU8sQ0FBQztBQUMvQixPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sT0FBTyxDQUFDO0FBQzlCLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGNBQWMsQ0FBQzs7QUFFakQsTUFBTSxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztBQXlCbEIsTUFBTSxDQUFDLE1BQU0sd0JBQXdCLEdBQUcsSUFBSSxjQUFjLENBQWdDLHdCQUF3QixDQUFDLENBQUM7QUFFcEgsTUFpQmEsa0JBQW1CLFNBQVEsY0FBdUM7SUFHM0UsSUFBYSxPQUFPLENBQUMsT0FBZ0I7UUFDakMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUM7SUFDMUIsQ0FBQztJQUVELElBQWEsV0FBVyxDQUFDLFdBQW9CO1FBQ3pDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxXQUFXLEVBQUUsQ0FBQyxDQUFDO0lBQzlCLENBQUM7SUFFRCxJQUFhLGlCQUFpQixDQUFDLGlCQUEwQjtR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RSxDQUFDLHNCQUFzQixDQUFDO2lCQUNwQzswRUFJZ0IsT0FBTztzQkFBbkIsS0FBSztnQkFJTyxXQUFXO3NCQUF2QixLQUFLO2dCQUlPLGlCQUFpQjtzQkFBN0IsS0FBSztnQkFJTyxhQUFhO3NCQUF6QixLQUFLO2dCQUlPLFNBQVM7c0JBQXJCLEtBQUs7Z0JBSU8sZUFBZTtzQkFBM0IsS0FBSztnQkFJTyxhQUFhO3NCQUF6QixLQUFLO2dCQUlPLGVBQWU7c0JBQTNCLEtBQUs7Z0JBSU8sY0FBYztzQkFBMUIsS0FBSztnQkFJTyxNQUFNO3NCQUFsQixLQUFLO2dCQUlPLEtBQUs7c0JBQWpCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICAgIENVU1RPTV9FTEVNRU5UU19TQ0hFTUEsXG4gICAgQ29tcG9uZW50LFxuICAgIEluamVjdGlvblRva2VuLFxuICAgIElucHV0LFxuICAgIFNpZ25hbCxcbiAgICBjb21wdXRlZCxcbiAgICBlZmZlY3QsXG4gICAgaW5qZWN0LFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gICAgTmd0U2lnbmFsU3RvcmUsXG4gICAgTmd0U3RvcmUsXG4gICAgZXh0ZW5kLFxuICAgIGluamVjdEJlZm9yZVJlbmRlcixcbiAgICBpbmplY3ROZ3RSZWYsXG4gICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lSW5JbmplY3Rpb25Db250ZXh0LFxufSBmcm9tICdhbmd1bGFyLXRocmVlJztcbmltcG9ydCB7IERlcHRoRG93bnNhbXBsaW5nUGFzcywgRWZmZWN0Q29tcG9zZXIsIEVmZmVjdFBhc3MsIE5vcm1hbFBhc3MsIFJlbmRlclBhc3MgfSBmcm9tICdwb3N0cHJvY2Vzc2luZyc7XG5pbXBvcnQgKiBhcyBUSFJFRSBmcm9tICd0aHJlZSc7XG5pbXBvcnQgeyBHcm91cCB9IGZyb20gJ3RocmVlJztcbmltcG9ydCB7IGlzV2ViR0wyQXZhaWxhYmxlIH0gZnJvbSAndGhyZWUtc3RkbGliJztcblxuZXh0ZW5kKHsgR3JvdXAgfSk7XG5cbmV4cG9ydCBpbnRlcmZhY2UgTmd0cEVmZmVjdENvbXBvc2VyU3RhdGUge1xuICAgIGVuYWJsZWQ6IGJvb2xlYW47XG4gICAgZGVwdGhCdWZmZXI/OiBib29sZWFuO1xuICAgIGRpc2FibGVOb3JtYWxQYXNzPzogYm9vbGVhbjtcbiAgICBzdGVuY2lsQnVmZmVyPzogYm9vbGVhbjtcbiAgICBhdXRvQ2xlYXI6IGJvb2xlYW47XG4gICAgcmVzb2x1dGlvblNjYWxlPzogbnVtYmVyO1xuICAgIG11bHRpc2FtcGxpbmc6IG51bWJlcjtcbiAgICBmcmFtZUJ1ZmZlclR5cGU6IFRIUkVFLlRleHR1cmVEYXRhVHlwZTtcbiAgICByZW5kZXJQcmlvcml0eTogbnVtYmVyO1xuICAgIGNhbWVyYT86IFRIUkVFLkNhbWVyYTtcbiAgICBzY2VuZT86IFRIUkVFLlNjZW5lO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE5ndHBFZmZlY3RDb21wb3NlckFwaSB7XG4gICAgY29tcG9zZXI6IEVmZmVjdENvbXBvc2VyO1xuICAgIG5vcm1hbFBhc3M6IE5vcm1hbFBhc3MgfCBudWxsO1xuICAgIGRvd25TYW1wbGluZ1Bhc3M6IERlcHRoRG93bnNhbXBsaW5nUGFzcyB8IG51bGw7XG4gICAgY2FtZXJhOiBUSFJFRS5DYW1lcmE7XG4gICAgc2NlbmU6IFRIUkVFLlNjZW5lO1xuICAgIHJlc29sdXRpb25TY2FsZT86IG51bWJlcjtcbn1cblxuZXhwb3J0IGNvbnN0IE5HVFBfRUZGRUNUX0NPTVBPU0VSX0FQSSA9IG5ldyBJbmplY3Rpb25Ub2tlbjxTaWduYWw8Tmd0cEVmZmVjdENvbXBvc2VyQXBpPj4oJ05ndHBFZmZlY3RDb21wb3NlciBBUEknKTtcblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICduZ3RwLWVmZmVjdC1jb21wb3NlcicsXG4gICAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgICB0ZW1wbGF0ZTogYFxuICAgICAgICA8bmd0LWdyb3VwIFtyZWZdPVwiY29tcG9zZXJSZWZcIj5cbiAgICAgICAgICAgIDxuZy1jb250ZW50IC8+XG4gICAgICAgIDwvbmd0LWdyb3VwPlxuICAgIGAsXG4gICAgcHJvdmlkZXJzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICAgIHByb3ZpZGU6IE5HVFBfRUZGRUNUX0NPTVBPU0VSX0FQSSxcbiAgICAgICAgICAgIHVzZUZhY3Rvcnk6IChjb21wb3NlcjogTmd0cEVmZmVjdENvbXBvc2VyKSA9PiBjb21wb3Nlci5hcGksXG4gICAgICAgICAgICBkZXBzOiBbTmd0cEVmZmVjdENvbXBvc2VyXSxcbiAgICAgICAgfSxcbiAgICBdLFxuICAgIHNjaGVtYXM6IFtDVVNUT01fRUxFTUVOVFNfU0NIRU1BXSxcbn0pXG5leHBvcnQgY2xhc3MgTmd0cEVmZmVjdENvbXBvc2VyIGV4dGVuZHMgTmd0U2lnbmFsU3RvcmU8Tmd0cEVmZmVjdENvbXBvc2VyU3RhdGU+IHtcbiAgICByZWFkb25seSBjb21wb3NlclJlZiA9IGluamVjdE5ndFJlZjxUSFJFRS5Hcm91cD4oKTtcblxuICAgIEBJbnB1dCgpIHNldCBlbmFibGVkKGVuYWJsZWQ6IGJvb2xlYW4pIHtcbiAgICAgICAgdGhpcy5zZXQoeyBlbmFibGVkIH0pO1xuICAgIH1cblxuICAgIEBJbnB1dCgpIHNldCBkZXB0aEJ1ZmZlcihkZXB0aEJ1ZmZlcjogYm9vbGVhbikge1xuICAgICAgICB0aGlzLnNldCh7IGRlcHRoQnVmZmVyIH0pO1xuICAgIH1cblxuICAgIEBJbnB1dCgpIHNldCBkaXNhYmxlTm9ybWFsUGFzcyhkaXNhYmxlTm9ybWFsUGFzczogYm9vbGVhbikge1xuICAgICAgICB0aGlzLnNldCh7IGRpc2FibGVOb3JtYWxQYXNzIH0pO1xuICAgIH1cblxuICAgIEBJbnB1dCgpIHNldCBzdGVuY2lsQnVmZmVyKHN0ZW5jaWxCdWZmZXI6IGJvb2xlYW4pIHtcbiAgICAgICAgdGhpcy5zZXQoeyBzdGVuY2lsQnVmZmVyIH0pO1xuICAgIH1cblxuICAgIEBJbnB1dCgpIHNldCBhdXRvQ2xlYXIoYXV0b0NsZWFyOiBib29sZWFuKSB7XG4gICAgICAgIHRoaXMuc2V0KHsgYXV0b0NsZWFyIH0pO1xuICAgIH1cblxuICAgIEBJbnB1dCgpIHNldCByZXNvbHV0aW9uU2NhbGUocmVzb2x1dGlvblNjYWxlOiBudW1iZXIpIHtcbiAgICAgICAgdGhpcy5zZXQoeyByZXNvbHV0aW9uU2NhbGUgfSk7XG4gICAgfVxuXG4gICAgQElucHV0KCkgc2V0IG11bHRpc2FtcGxpbmcobXVsdGlzYW1wbGluZzogbnVtYmVyKSB7XG4gICAgICAgIHRoaXMuc2V0KHsgbXVsdGlzYW1wbGluZyB9KTtcbiAgICB9XG5cbiAgICBASW5wdXQoKSBzZXQgZnJhbWVCdWZmZXJUeXBlKGZyYW1lQnVmZmVyVHlwZTogVEhSRUUuVGV4dHVyZURhdGFUeXBlKSB7XG4gICAgICAgIHRoaXMuc2V0KHsgZnJhbWVCdWZmZXJUeXBlIH0pO1xuICAgIH1cblxuICAgIEBJbnB1dCgpIHNldCByZW5kZXJQcmlvcml0eShyZW5kZXJQcmlvcml0eTogbnVtYmVyKSB7XG4gICAgICAgIHRoaXMuc2V0KHsgcmVuZGVyUHJpb3JpdHkgfSk7XG4gICAgfVxuXG4gICAgQElucHV0KCkgc2V0IGNhbWVyYShjYW1lcmE6IFRIUkVFLkNhbWVyYSkge1xuICAgICAgICB0aGlzLnNldCh7IGNhbWVyYSB9KTtcbiAgICB9XG5cbiAgICBASW5wdXQoKSBzZXQgc2NlbmUoc2NlbmU6IFRIUkVFLlNjZW5lKSB7XG4gICAgICAgIHRoaXMuc2V0KHsgc2NlbmUgfSk7XG4gICAgfVxuXG4gICAgcmVhZG9ubHkgI3N0b3JlID0gaW5qZWN0KE5ndFN0b3JlKTtcbiAgICByZWFkb25seSAjZ2wgPSB0aGlzLiNzdG9yZS5zZWxlY3QoJ2dsJyk7XG4gICAgcmVhZG9ubHkgI3NpemUgPSB0aGlzLiNzdG9yZS5zZWxlY3QoJ3NpemUnKTtcbiAgICByZWFkb25seSAjZGVmYXVsdFNjZW5lID0gdGhpcy4jc3RvcmUuc2VsZWN0KCdzY2VuZScpO1xuICAgIHJlYWRvbmx5ICNkZWZhdWx0Q2FtZXJhID0gdGhpcy4jc3RvcmUuc2VsZWN0KCdjYW1lcmEnKTtcblxuICAgIHJlYWRvbmx5ICNzY2VuZSA9IHRoaXMuc2VsZWN0KCdzY2VuZScpO1xuICAgIHJlYWRvbmx5ICNjYW1lcmEgPSB0aGlzLnNlbGVjdCgnY2FtZXJhJyk7XG5cbiAgICByZWFkb25seSAjZGVwdGhCdWZmZXIgPSB0aGlzLnNlbGVjdCgnZGVwdGhCdWZmZXInKTtcbiAgICByZWFkb25seSAjc3RlbmNpbEJ1ZmZlciA9IHRoaXMuc2VsZWN0KCdzdGVuY2lsQnVmZmVyJyk7XG4gICAgcmVhZG9ubHkgI211bHRpc2FtcGxpbmcgPSB0aGlzLnNlbGVjdCgnbXVsdGlzYW1wbGluZycpO1xuICAgIHJlYWRvbmx5ICNmcmFtZUJ1ZmZlclR5cGUgPSB0aGlzLnNlbGVjdCgnZnJhbWVCdWZmZXJUeXBlJyk7XG4gICAgcmVhZG9ubHkgI2Rpc2FibGVOb3JtYWxQYXNzID0gdGhpcy5zZWxlY3QoJ2Rpc2FibGVOb3JtYWxQYXNzJyk7XG4gICAgcmVhZG9ubHkgI3Jlc29sdXRpb25TY2FsZSA9IHRoaXMuc2VsZWN0KCdyZXNvbHV0aW9uU2NhbGUnKTtcblxuICAgIHJlYWRvbmx5ICNhY3RpdmVTY2VuZSA9IGNvbXB1dGVkKCgpID0+IHRoaXMuI3NjZW5lKCkgfHwgdGhpcy4jZGVmYXVsdFNjZW5lKCkpO1xuICAgIHJlYWRvbmx5ICNhY3RpdmVDYW1lcmEgPSBjb21wdXRlZCgoKSA9PiB0aGlzLiNjYW1lcmEoKSB8fCB0aGlzLiNkZWZhdWx0Q2FtZXJhKCkpO1xuXG4gICAgcmVhZG9ubHkgI2NvbXBvc2VyRW50aXRpZXMgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICAgIGNvbnN0IGdsID0gdGhpcy4jZ2woKTtcbiAgICAgICAgY29uc3QgY2FtZXJhID0gdGhpcy4jYWN0aXZlQ2FtZXJhKCk7XG4gICAgICAgIGNvbnN0IHNjZW5lID0gdGhpcy4jYWN0aXZlU2NlbmUoKTtcbiAgICAgICAgY29uc3QgZGVwdGhCdWZmZXIgPSB0aGlzLiNkZXB0aEJ1ZmZlcigpO1xuICAgICAgICBjb25zdCBzdGVuY2lsQnVmZmVyID0gdGhpcy4jc3RlbmNpbEJ1ZmZlcigpO1xuICAgICAgICBjb25zdCBtdWx0aXNhbXBsaW5nID0gdGhpcy4jbXVsdGlzYW1wbGluZygpO1xuICAgICAgICBjb25zdCBmcmFtZUJ1ZmZlclR5cGUgPSB0aGlzLiNmcmFtZUJ1ZmZlclR5cGUoKTtcbiAgICAgICAgY29uc3QgZGlzYWJsZU5vcm1hbFBhc3MgPSB0aGlzLiNkaXNhYmxlTm9ybWFsUGFzcygpO1xuICAgICAgICBjb25zdCByZXNvbHV0aW9uU2NhbGUgPSB0aGlzLiNyZXNvbHV0aW9uU2NhbGUoKTtcblxuICAgICAgICBjb25zdCB3ZWJHTDJBdmFpbGFibGUgPSBpc1dlYkdMMkF2YWlsYWJsZSgpO1xuICAgICAgICAvLyBJbml0aWFsaXplIGNvbXBvc2VyXG4gICAgICAgIGNvbnN0IGVmZmVjdENvbXBvc2VyID0gbmV3IEVmZmVjdENvbXBvc2VyKGdsLCB7XG4gICAgICAgICAgICBkZXB0aEJ1ZmZlcixcbiAgICAgICAgICAgIHN0ZW5jaWxCdWZmZXIsXG4gICAgICAgICAgICBtdWx0aXNhbXBsaW5nOiBtdWx0aXNhbXBsaW5nID4gMCAmJiB3ZWJHTDJBdmFpbGFibGUgPyBtdWx0aXNhbXBsaW5nIDogMCxcbiAgICAgICAgICAgIGZyYW1lQnVmZmVyVHlwZSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gQWRkIHJlbmRlciBwYXNzXG4gICAgICAgIGVmZmVjdENvbXBvc2VyLmFkZFBhc3MobmV3IFJlbmRlclBhc3Moc2NlbmUsIGNhbWVyYSkpO1xuXG4gICAgICAgIC8vIENyZWF0ZSBub3JtYWwgcGFzc1xuICAgICAgICBsZXQgZG93blNhbXBsaW5nUGFzcyA9IG51bGw7XG4gICAgICAgIGxldCBub3JtYWxQYXNzID0gbnVsbDtcbiAgICAgICAgaWYgKCFkaXNhYmxlTm9ybWFsUGFzcykge1xuICAgICAgICAgICAgbm9ybWFsUGFzcyA9IG5ldyBOb3JtYWxQYXNzKHNjZW5lLCBjYW1lcmEpO1xuICAgICAgICAgICAgbm9ybWFsUGFzcy5lbmFibGVkID0gZmFsc2U7XG4gICAgICAgICAgICBlZmZlY3RDb21wb3Nlci5hZGRQYXNzKG5vcm1hbFBhc3MpO1xuICAgICAgICAgICAgaWYgKHJlc29sdXRpb25TY2FsZSAhPT0gdW5kZWZpbmVkICYmIHdlYkdMMkF2YWlsYWJsZSkge1xuICAgICAgICAgICAgICAgIGRvd25TYW1wbGluZ1Bhc3MgPSBuZXcgRGVwdGhEb3duc2FtcGxpbmdQYXNzKHsgbm9ybWFsQnVmZmVyOiBub3JtYWxQYXNzLnRleHR1cmUsIHJlc29sdXRpb25TY2FsZSB9KTtcbiAgICAgICAgICAgICAgICBkb3duU2FtcGxpbmdQYXNzLmVuYWJsZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBlZmZlY3RDb21wb3Nlci5hZGRQYXNzKGRvd25TYW1wbGluZ1Bhc3MpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHsgZWZmZWN0Q29tcG9zZXIsIG5vcm1hbFBhc3MsIGRvd25TYW1wbGluZ1Bhc3MgfTtcbiAgICB9KTtcblxuICAgIHJlYWRvbmx5IGFwaSA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAgICAgY29uc3QgeyBlZmZlY3RDb21wb3Nlciwgbm9ybWFsUGFzcywgZG93blNhbXBsaW5nUGFzcyB9ID0gdGhpcy4jY29tcG9zZXJFbnRpdGllcygpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY29tcG9zZXI6IGVmZmVjdENvbXBvc2VyLFxuICAgICAgICAgICAgbm9ybWFsUGFzcyxcbiAgICAgICAgICAgIGRvd25TYW1wbGluZ1Bhc3MsXG4gICAgICAgICAgICByZXNvbHV0aW9uU2NhbGU6IHRoaXMuI3Jlc29sdXRpb25TY2FsZSgpLFxuICAgICAgICAgICAgY2FtZXJhOiB0aGlzLiNhY3RpdmVDYW1lcmEoKSxcbiAgICAgICAgICAgIHNjZW5lOiB0aGlzLiNhY3RpdmVTY2VuZSgpLFxuICAgICAgICB9O1xuICAgIH0pO1xuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKHtcbiAgICAgICAgICAgIGVuYWJsZWQ6IHRydWUsXG4gICAgICAgICAgICByZW5kZXJQcmlvcml0eTogMSxcbiAgICAgICAgICAgIGF1dG9DbGVhcjogdHJ1ZSxcbiAgICAgICAgICAgIG11bHRpc2FtcGxpbmc6IDgsXG4gICAgICAgICAgICBmcmFtZUJ1ZmZlclR5cGU6IFRIUkVFLkhhbGZGbG9hdFR5cGUsXG4gICAgICAgIH0pO1xuICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWVJbkluamVjdGlvbkNvbnRleHQoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy4jc2V0Q29tcG9zZXJTaXplKCk7XG4gICAgICAgICAgICB0aGlzLiN1cGRhdGVFZmZlY3RQYXNzZXMoKTtcbiAgICAgICAgICAgIHRoaXMuI3NldEJlZm9yZVJlbmRlcigpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAjc2V0Q29tcG9zZXJTaXplKCkge1xuICAgICAgICBjb25zdCB0cmlnZ2VyID0gY29tcHV0ZWQoKCkgPT4gKHsgY29tcG9zZXI6IHRoaXMuI2NvbXBvc2VyRW50aXRpZXMoKS5lZmZlY3RDb21wb3Nlciwgc2l6ZTogdGhpcy4jc2l6ZSgpIH0pKTtcbiAgICAgICAgZWZmZWN0KCgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHsgY29tcG9zZXIsIHNpemUgfSA9IHRyaWdnZXIoKTtcbiAgICAgICAgICAgIGlmICghY29tcG9zZXIpIHJldHVybjtcbiAgICAgICAgICAgIGNvbXBvc2VyLnNldFNpemUoc2l6ZS53aWR0aCwgc2l6ZS5oZWlnaHQpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAjdXBkYXRlRWZmZWN0UGFzc2VzKCkge1xuICAgICAgICBjb25zdCB0cmlnZ2VyID0gY29tcHV0ZWQoKCkgPT4gKHtcbiAgICAgICAgICAgIGNvbXBvc2VyRW50aXRpZXM6IHRoaXMuI2NvbXBvc2VyRW50aXRpZXMoKSxcbiAgICAgICAgICAgIGluc3RhbmNlOiB0aGlzLmNvbXBvc2VyUmVmLm5hdGl2ZUVsZW1lbnQsXG4gICAgICAgICAgICBjaGlsZHJlbjogdGhpcy5jb21wb3NlclJlZi5jaGlsZHJlbignbm9uT2JqZWN0cycpKCksXG4gICAgICAgICAgICBjYW1lcmE6IHRoaXMuI2FjdGl2ZUNhbWVyYSgpLFxuICAgICAgICB9KSk7XG4gICAgICAgIGVmZmVjdCgob25DbGVhbnVwKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICAgICAgY29tcG9zZXJFbnRpdGllczogeyBlZmZlY3RDb21wb3Nlciwgbm9ybWFsUGFzcywgZG93blNhbXBsaW5nUGFzcyB9LFxuICAgICAgICAgICAgICAgIGluc3RhbmNlLFxuICAgICAgICAgICAgICAgIGNoaWxkcmVuLFxuICAgICAgICAgICAgICAgIGNhbWVyYSxcbiAgICAgICAgICAgIH0gPSB0cmlnZ2VyKCk7XG5cbiAgICAgICAgICAgIGxldCBlZmZlY3RQYXNzOiBFZmZlY3RQYXNzO1xuICAgICAgICAgICAgaWYgKGluc3RhbmNlICYmIGNoaWxkcmVuLmxlbmd0aCAmJiBlZmZlY3RDb21wb3Nlcikge1xuICAgICAgICAgICAgICAgIGVmZmVjdFBhc3MgPSBuZXcgRWZmZWN0UGFzcyhjYW1lcmEsIC4uLmNoaWxkcmVuKTtcbiAgICAgICAgICAgICAgICBlZmZlY3RQYXNzLnJlbmRlclRvU2NyZWVuID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBlZmZlY3RDb21wb3Nlci5hZGRQYXNzKGVmZmVjdFBhc3MpO1xuICAgICAgICAgICAgICAgIGlmIChub3JtYWxQYXNzKSBub3JtYWxQYXNzLmVuYWJsZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGlmIChkb3duU2FtcGxpbmdQYXNzKSBkb3duU2FtcGxpbmdQYXNzLmVuYWJsZWQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBvbkNsZWFudXAoKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChlZmZlY3RQYXNzKSBlZmZlY3RDb21wb3Nlcj8ucmVtb3ZlUGFzcyhlZmZlY3RQYXNzKTtcbiAgICAgICAgICAgICAgICBpZiAobm9ybWFsUGFzcykgbm9ybWFsUGFzcy5lbmFibGVkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgaWYgKGRvd25TYW1wbGluZ1Bhc3MpIGRvd25TYW1wbGluZ1Bhc3MuZW5hYmxlZCA9IGZhbHNlO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgICNzZXRCZWZvcmVSZW5kZXIoKSB7XG4gICAgICAgIGluamVjdEJlZm9yZVJlbmRlcihcbiAgICAgICAgICAgICh7IGRlbHRhIH0pID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBlbmFibGVkID0gdGhpcy5nZXQoJ2VuYWJsZWQnKTtcbiAgICAgICAgICAgICAgICBjb25zdCBhdXRvQ2xlYXIgPSB0aGlzLmdldCgnYXV0b0NsZWFyJyk7XG4gICAgICAgICAgICAgICAgY29uc3QgZ2wgPSB0aGlzLiNzdG9yZS5nZXQoJ2dsJyk7XG4gICAgICAgICAgICAgICAgY29uc3QgeyBlZmZlY3RDb21wb3NlciB9ID0gdGhpcy4jY29tcG9zZXJFbnRpdGllcygpO1xuICAgICAgICAgICAgICAgIGlmIChlbmFibGVkICYmIGVmZmVjdENvbXBvc2VyKSB7XG4gICAgICAgICAgICAgICAgICAgIGdsLmF1dG9DbGVhciA9IGF1dG9DbGVhcjtcbiAgICAgICAgICAgICAgICAgICAgZWZmZWN0Q29tcG9zZXIucmVuZGVyKGRlbHRhKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgeyBwcmlvcml0eTogdGhpcy5nZXQoJ2VuYWJsZWQnKSA/IHRoaXMuZ2V0KCdyZW5kZXJQcmlvcml0eScpIDogMCB9XG4gICAgICAgICk7XG4gICAgfVxufVxuIl19