angular-three-postprocessing 2.0.0-beta.25 → 2.0.0-beta.250

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 (95) hide show
  1. package/esm2022/lib/effect-composer.mjs +118 -167
  2. package/esm2022/lib/effect.mjs +43 -71
  3. package/esm2022/lib/effects/ascii.mjs +120 -0
  4. package/esm2022/lib/effects/bloom.mjs +39 -0
  5. package/esm2022/lib/effects/brightness-contrast.mjs +38 -0
  6. package/esm2022/lib/effects/chromatic-abberation.mjs +38 -0
  7. package/esm2022/lib/effects/color-average.mjs +33 -0
  8. package/esm2022/lib/effects/color-depth.mjs +38 -0
  9. package/esm2022/lib/effects/depth-of-field.mjs +56 -0
  10. package/esm2022/lib/effects/depth.mjs +38 -0
  11. package/esm2022/lib/effects/dot-screen.mjs +38 -0
  12. package/esm2022/lib/effects/fxaa.mjs +38 -0
  13. package/esm2022/lib/effects/glitch.mjs +63 -0
  14. package/esm2022/lib/effects/god-rays.mjs +41 -0
  15. package/esm2022/lib/effects/grid.mjs +44 -0
  16. package/esm2022/lib/effects/hue-saturation.mjs +38 -0
  17. package/esm2022/lib/effects/index.mjs +27 -18
  18. package/esm2022/lib/effects/lens-flare.mjs +194 -0
  19. package/esm2022/lib/effects/lut.mjs +50 -0
  20. package/esm2022/lib/effects/noise.mjs +39 -0
  21. package/esm2022/lib/effects/pixelation.mjs +30 -0
  22. package/esm2022/lib/effects/scanline.mjs +43 -0
  23. package/esm2022/lib/effects/sepia.mjs +38 -0
  24. package/esm2022/lib/effects/shock-wave.mjs +38 -0
  25. package/esm2022/lib/effects/smaa.mjs +38 -0
  26. package/esm2022/lib/effects/tilt-shift-2.mjs +121 -0
  27. package/esm2022/lib/effects/tilt-shift.mjs +39 -0
  28. package/esm2022/lib/effects/vignette.mjs +38 -0
  29. package/esm2022/lib/effects/water.mjs +64 -0
  30. package/fesm2022/angular-three-postprocessing.mjs +1147 -654
  31. package/fesm2022/angular-three-postprocessing.mjs.map +1 -1
  32. package/lib/effect-composer.d.ts +63 -66
  33. package/lib/effect.d.ts +54 -25
  34. package/lib/effects/ascii.d.ts +23 -0
  35. package/lib/effects/bloom.d.ts +10 -0
  36. package/lib/effects/brightness-contrast.d.ts +15 -0
  37. package/lib/effects/chromatic-abberation.d.ts +16 -0
  38. package/lib/effects/color-average.d.ts +11 -0
  39. package/lib/effects/color-depth.d.ts +14 -0
  40. package/lib/effects/depth-of-field.d.ts +29 -0
  41. package/lib/effects/depth.d.ts +14 -0
  42. package/lib/effects/dot-screen.d.ts +15 -0
  43. package/lib/effects/fxaa.d.ts +13 -0
  44. package/lib/effects/glitch.d.ts +29 -0
  45. package/lib/effects/god-rays.d.ts +37 -0
  46. package/lib/effects/grid.d.ts +23 -0
  47. package/lib/effects/hue-saturation.d.ts +15 -0
  48. package/lib/effects/index.d.ts +26 -17
  49. package/lib/effects/lens-flare.d.ts +110 -0
  50. package/lib/effects/lut.d.ts +19 -0
  51. package/lib/effects/noise.d.ts +14 -0
  52. package/lib/effects/pixelation.d.ts +16 -0
  53. package/lib/effects/scanline.d.ts +17 -0
  54. package/lib/effects/sepia.d.ts +14 -0
  55. package/lib/effects/shock-wave.d.ts +11 -0
  56. package/lib/effects/smaa.d.ts +15 -0
  57. package/lib/effects/tilt-shift-2.d.ts +35 -0
  58. package/lib/effects/tilt-shift.d.ts +22 -0
  59. package/lib/effects/vignette.d.ts +17 -0
  60. package/lib/effects/water.d.ts +20 -0
  61. package/package.json +13 -6
  62. package/esm2022/lib/effects/bloom/bloom.mjs +0 -33
  63. package/esm2022/lib/effects/brightness-contrast/brightness-contrast.mjs +0 -29
  64. package/esm2022/lib/effects/color-depth/color-depth.mjs +0 -29
  65. package/esm2022/lib/effects/depth/depth.mjs +0 -29
  66. package/esm2022/lib/effects/dot-screen/dot-screen.mjs +0 -29
  67. package/esm2022/lib/effects/hue-saturation/hue-saturation.mjs +0 -29
  68. package/esm2022/lib/effects/lut/lut.mjs +0 -74
  69. package/esm2022/lib/effects/noise/noise.mjs +0 -33
  70. package/esm2022/lib/effects/pixelation/pixelation.mjs +0 -37
  71. package/esm2022/lib/effects/scanline/scanline.mjs +0 -33
  72. package/esm2022/lib/effects/sepia/sepia.mjs +0 -29
  73. package/esm2022/lib/effects/shock-wave/shock-wave.mjs +0 -29
  74. package/esm2022/lib/effects/smaa/smaa.mjs +0 -29
  75. package/esm2022/lib/effects/ssao/ssao.mjs +0 -217
  76. package/esm2022/lib/effects/tilt-shift/tilt-shift.mjs +0 -33
  77. package/esm2022/lib/effects/tone-mapping/tone-mapping.mjs +0 -29
  78. package/esm2022/lib/effects/vignette/vignette.mjs +0 -29
  79. package/lib/effects/bloom/bloom.d.ts +0 -13
  80. package/lib/effects/brightness-contrast/brightness-contrast.d.ts +0 -15
  81. package/lib/effects/color-depth/color-depth.d.ts +0 -14
  82. package/lib/effects/depth/depth.d.ts +0 -14
  83. package/lib/effects/dot-screen/dot-screen.d.ts +0 -15
  84. package/lib/effects/hue-saturation/hue-saturation.d.ts +0 -15
  85. package/lib/effects/lut/lut.d.ts +0 -29
  86. package/lib/effects/noise/noise.d.ts +0 -15
  87. package/lib/effects/pixelation/pixelation.d.ts +0 -20
  88. package/lib/effects/scanline/scanline.d.ts +0 -15
  89. package/lib/effects/sepia/sepia.d.ts +0 -14
  90. package/lib/effects/shock-wave/shock-wave.d.ts +0 -17
  91. package/lib/effects/smaa/smaa.d.ts +0 -16
  92. package/lib/effects/ssao/ssao.d.ts +0 -42
  93. package/lib/effects/tilt-shift/tilt-shift.d.ts +0 -23
  94. package/lib/effects/tone-mapping/tone-mapping.d.ts +0 -22
  95. package/lib/effects/vignette/vignette.d.ts +0 -17
@@ -1,223 +1,203 @@
1
1
  import * as i0 from '@angular/core';
2
- import { computed, effect, Directive, Input, forwardRef, inject, Injector, Component, CUSTOM_ELEMENTS_SCHEMA } from '@angular/core';
3
- import { signalStore, injectNgtRef, injectNgtStore, getLocalState, is, extend, createInjectionToken, injectBeforeRender, NgtArgs } from 'angular-three';
4
- import { BlendFunction, EffectComposer, RenderPass, NormalPass, DepthDownsamplingPass, Effect, EffectPass, Pass, BloomEffect, BrightnessContrastEffect, ColorDepthEffect, DepthEffect, DotScreenEffect, HueSaturationEffect, LUT3DEffect, NoiseEffect, PixelationEffect, ScanlineEffect, SepiaEffect, ShockWaveEffect, SMAAEffect, SSAOEffect, TiltShiftEffect, ToneMappingEffect, VignetteEffect } from 'postprocessing';
5
- import * as THREE from 'three';
6
- import { Group } from 'three';
2
+ import { inject, Component, CUSTOM_ELEMENTS_SCHEMA, ChangeDetectionStrategy, input, Directive, Injector, computed, viewChild, afterNextRender } from '@angular/core';
3
+ import { injectStore, extend, createApiToken, pick, injectBeforeRender, getLocalState, NgtArgs, vector2, is } from 'angular-three';
4
+ import { createNoopInjectionToken } from 'ngxtension/create-injection-token';
5
+ import { injectAutoEffect } from 'ngxtension/auto-effect';
6
+ import { mergeInputs } from 'ngxtension/inject-inputs';
7
+ import { EffectAttribute, EffectComposer, RenderPass, NormalPass, DepthDownsamplingPass, Effect, EffectPass, Pass, BloomEffect, BlendFunction, BrightnessContrastEffect, ChromaticAberrationEffect, ColorAverageEffect, ColorDepthEffect, DepthEffect, DepthOfFieldEffect, MaskFunction, DotScreenEffect, FXAAEffect, GlitchEffect, GlitchMode, GodRaysEffect, GridEffect, HueSaturationEffect, LUT3DEffect, NoiseEffect, PixelationEffect, ScanlineEffect, SepiaEffect, ShockWaveEffect, SMAAEffect, TiltShiftEffect, VignetteEffect } from 'postprocessing';
8
+ import { Group, HalfFloatType, NoToneMapping, Uniform, Texture, Color, CanvasTexture, RepeatWrapping, NearestFilter, Vector3, Vector2, Mesh } from 'three';
7
9
  import { isWebGL2Available } from 'three-stdlib';
10
+ import { easing } from 'maath';
8
11
 
9
- class NgtpEffect {
10
- set _blendFunction(blendFunction) {
11
- this.inputs.set({ blendFunction });
12
- }
13
- set _opacity(opacity) {
14
- this.inputs.set({ opacity });
12
+ const [injectDefaultEffectOptions, provideDefaultEffectOptions] = createNoopInjectionToken('Default Effect options');
13
+ class NgtpEffectBlendMode {
14
+ constructor() {
15
+ this.effect = inject(NgtpEffect, { optional: true });
15
16
  }
17
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: NgtpEffectBlendMode, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
18
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.0.6", type: NgtpEffectBlendMode, isStandalone: true, selector: "ngtp-effect-blend-mode", ngImport: i0, template: `
19
+ @if (effect) {
20
+ <ngt-value [rawValue]="effect.blendFunction()" attach="blendMode.blendFunction" />
21
+ <ngt-value [rawValue]="effect.opacity()" attach="blendMode.opacity.value" />
22
+ }
23
+ `, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
24
+ }
25
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: NgtpEffectBlendMode, decorators: [{
26
+ type: Component,
27
+ args: [{
28
+ selector: 'ngtp-effect-blend-mode',
29
+ standalone: true,
30
+ template: `
31
+ @if (effect) {
32
+ <ngt-value [rawValue]="effect.blendFunction()" attach="blendMode.blendFunction" />
33
+ <ngt-value [rawValue]="effect.opacity()" attach="blendMode.opacity.value" />
34
+ }
35
+ `,
36
+ schemas: [CUSTOM_ELEMENTS_SCHEMA],
37
+ changeDetection: ChangeDetectionStrategy.OnPush,
38
+ }]
39
+ }] });
40
+ class NgtpEffect {
16
41
  constructor() {
17
- this.inputs = signalStore();
18
- this.effectRef = injectNgtRef();
19
- this.defaultBlendFunction = BlendFunction.NORMAL;
20
- this.nativeArgs = () => [];
21
- this.blendFunction = this.inputs.select('blendFunction');
22
- this.opacity = this.inputs.select('opacity');
23
- this.store = injectNgtStore();
42
+ this.defaultEffectOptions = injectDefaultEffectOptions({ optional: true });
43
+ this.blendFunction = input(this.defaultEffectOptions?.blendFunction);
44
+ this.opacity = input(this.defaultEffectOptions?.opacity);
45
+ this.store = injectStore();
24
46
  this.camera = this.store.select('camera');
25
47
  this.invalidate = this.store.select('invalidate');
26
- this.nativeInputs = computed(() => {
27
- const effect = this.effectRef.nativeElement;
28
- if (!effect)
29
- return this.previousInputs || null;
30
- const localState = getLocalState(effect);
31
- if (!localState)
32
- return this.previousInputs || null;
33
- const nativeProps = localState.nativeProps.state();
34
- delete nativeProps['__ngt_dummy_state__'];
35
- if ('camera' in nativeProps) {
36
- delete nativeProps['camera'];
37
- }
38
- if (!Object.keys(nativeProps).length)
39
- return this.previousInputs || null;
40
- return (this.previousInputs = nativeProps);
41
- }, { equal: (a, b) => is.equ(a, b, { objects: 'shallow' }) });
42
- this.args = computed(() => {
43
- const [nativeInputs, nativeArgs] = [this.nativeInputs(), this.nativeArgs()];
44
- if (nativeInputs) {
45
- nativeArgs.push(nativeInputs);
46
- }
47
- return nativeArgs;
48
- });
49
- this.setBlendMode();
50
- }
51
- setBlendMode() {
52
- effect(() => {
53
- const [blendFunction, opacity, effect, invalidate] = [
54
- this.blendFunction(),
55
- this.opacity(),
56
- this.effectRef.nativeElement,
57
- this.invalidate(),
58
- ];
59
- if (!effect)
60
- return;
61
- effect.blendMode.blendFunction =
62
- !blendFunction && blendFunction !== 0 ? this.defaultBlendFunction : blendFunction;
63
- if (opacity !== undefined)
64
- effect.blendMode.opacity.value = opacity;
65
- invalidate();
66
- });
67
48
  }
68
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.2", ngImport: i0, type: NgtpEffect, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
69
- static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.2.2", type: NgtpEffect, inputs: { effectRef: "effectRef", _blendFunction: ["blendFunction", "_blendFunction"], _opacity: ["opacity", "_opacity"] }, ngImport: i0 }); }
70
- }
71
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.2", ngImport: i0, type: NgtpEffect, decorators: [{
72
- type: Directive
73
- }], ctorParameters: function () { return []; }, propDecorators: { effectRef: [{
74
- type: Input
75
- }], _blendFunction: [{
76
- type: Input,
77
- args: [{ alias: 'blendFunction' }]
78
- }], _opacity: [{
79
- type: Input,
80
- args: [{ alias: 'opacity' }]
81
- }] } });
49
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: NgtpEffect, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
50
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "18.0.6", type: NgtpEffect, isStandalone: true, inputs: { blendFunction: { classPropertyName: "blendFunction", publicName: "blendFunction", isSignal: true, isRequired: false, transformFunction: null }, opacity: { classPropertyName: "opacity", publicName: "opacity", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0 }); }
51
+ }
52
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: NgtpEffect, decorators: [{
53
+ type: Directive,
54
+ args: [{ standalone: true }]
55
+ }] });
56
+ const NgtpEffectHostDirective = { directive: NgtpEffect, inputs: ['blendFunction', 'opacity'] };
82
57
 
83
58
  extend({ Group });
84
- const [injectNgtpEffectComposerApi, provideNgtpEffectComposerApi] = createInjectionToken((composer) => composer.api, { isRoot: false, deps: [forwardRef(() => NgtpEffectComposer)] });
59
+ const [injectEffectComposerApi, provideEffectComposerApi] = createApiToken(() => NgtpEffectComposer);
60
+ const defaultOptions$3 = {
61
+ enabled: true,
62
+ renderPriority: 1,
63
+ autoClear: true,
64
+ multisampling: 8,
65
+ frameBufferType: HalfFloatType,
66
+ };
67
+ function isConvolution(effect) {
68
+ return (effect.getAttributes() & EffectAttribute.CONVOLUTION) === EffectAttribute.CONVOLUTION;
69
+ }
85
70
  class NgtpEffectComposer {
86
- set _enabled(enabled) {
87
- this.inputs.set({ enabled });
88
- }
89
- set _depthBuffer(depthBuffer) {
90
- this.inputs.set({ depthBuffer });
91
- }
92
- set _disableNormalPass(disableNormalPass) {
93
- this.inputs.set({ disableNormalPass });
94
- }
95
- set _stencilBuffer(stencilBuffer) {
96
- this.inputs.set({ stencilBuffer });
97
- }
98
- set _autoClear(autoClear) {
99
- this.inputs.set({ autoClear });
100
- }
101
- set _resolutionScale(resolutionScale) {
102
- this.inputs.set({ resolutionScale });
103
- }
104
- set _multisampling(multisampling) {
105
- this.inputs.set({ multisampling });
106
- }
107
- set _frameBufferType(frameBufferType) {
108
- this.inputs.set({ frameBufferType });
109
- }
110
- set _renderPriority(renderPriority) {
111
- this.inputs.set({ renderPriority });
112
- }
113
- set _camera(camera) {
114
- this.inputs.set({ camera });
115
- }
116
- set _scene(scene) {
117
- this.inputs.set({ scene });
118
- }
119
71
  constructor() {
120
- this.inputs = signalStore({
121
- enabled: true,
122
- renderPriority: 1,
123
- autoClear: true,
124
- multisampling: 8,
125
- frameBufferType: THREE.HalfFloatType,
126
- });
127
- this.composerRef = injectNgtRef();
72
+ this.options = input(defaultOptions$3, { transform: mergeInputs(defaultOptions$3) });
128
73
  this.injector = inject(Injector);
129
- this.store = injectNgtStore();
74
+ this.autoEffect = injectAutoEffect();
75
+ this.store = injectStore();
76
+ this.size = this.store.select('size');
130
77
  this.gl = this.store.select('gl');
131
78
  this.defaultScene = this.store.select('scene');
132
79
  this.defaultCamera = this.store.select('camera');
133
- this.size = this.store.select('size');
134
- this.depthBuffer = this.inputs.select('depthBuffer');
135
- this.stencilBuffer = this.inputs.select('stencilBuffer');
136
- this.multisampling = this.inputs.select('multisampling');
137
- this.frameBufferType = this.inputs.select('frameBufferType');
138
- this.scene = this.inputs.select('scene');
139
- this.camera = this.inputs.select('camera');
140
- this.disableNormalPass = this.inputs.select('disableNormalPass');
141
- this.resolutionScale = this.inputs.select('resolutionScale');
142
- this.autoClear = this.inputs.select('autoClear');
143
- this.activeScene = computed(() => this.scene() || this.defaultScene());
144
- this.activeCamera = computed(() => this.camera() || this.defaultCamera());
145
- this.composerEntities = computed(() => {
80
+ this.depthBuffer = pick(this.options, 'depthBuffer');
81
+ this.stencilBuffer = pick(this.options, 'stencilBuffer');
82
+ this.multisampling = pick(this.options, 'multisampling');
83
+ this.frameBufferType = pick(this.options, 'frameBufferType');
84
+ this.scene = computed(() => this.options().scene ?? this.defaultScene());
85
+ this.camera = computed(() => this.options().camera ?? this.defaultCamera());
86
+ this.enableNormalPass = pick(this.options, 'enableNormalPass');
87
+ this.resolutionScale = pick(this.options, 'resolutionScale');
88
+ this.group = viewChild.required('group');
89
+ this.composerData = computed(() => {
146
90
  const webGL2Available = isWebGL2Available();
147
- const [gl, depthBuffer, stencilBuffer, multisampling, frameBufferType, scene, camera, disableNormalPass, resolutionScale,] = [
91
+ const [gl, scene, camera, depthBuffer, stencilBuffer, multisampling, frameBufferType, enableNormalPass, resolutionScale,] = [
148
92
  this.gl(),
93
+ this.scene(),
94
+ this.camera(),
149
95
  this.depthBuffer(),
150
96
  this.stencilBuffer(),
151
97
  this.multisampling(),
152
98
  this.frameBufferType(),
153
- this.activeScene(),
154
- this.activeCamera(),
155
- this.disableNormalPass(),
99
+ this.enableNormalPass(),
156
100
  this.resolutionScale(),
157
101
  ];
158
- // Initialize composer
159
- const effectComposer = new EffectComposer(gl, {
102
+ // initialize composer
103
+ const composer = new EffectComposer(gl, {
160
104
  depthBuffer,
161
105
  stencilBuffer,
162
106
  multisampling: multisampling > 0 && webGL2Available ? multisampling : 0,
163
107
  frameBufferType,
164
108
  });
165
- // Add render pass
166
- effectComposer.addPass(new RenderPass(scene, camera));
167
- // Create normal pass
109
+ // add render pass
110
+ composer.addPass(new RenderPass(scene, camera));
111
+ // create normal pass
168
112
  let downSamplingPass = null;
169
113
  let normalPass = null;
170
- if (!disableNormalPass) {
114
+ if (enableNormalPass) {
171
115
  normalPass = new NormalPass(scene, camera);
172
116
  normalPass.enabled = false;
173
- effectComposer.addPass(normalPass);
117
+ composer.addPass(normalPass);
174
118
  if (resolutionScale !== undefined && webGL2Available) {
175
119
  downSamplingPass = new DepthDownsamplingPass({ normalBuffer: normalPass.texture, resolutionScale });
176
120
  downSamplingPass.enabled = false;
177
- effectComposer.addPass(downSamplingPass);
121
+ composer.addPass(downSamplingPass);
178
122
  }
179
123
  }
180
- return { effectComposer, normalPass, downSamplingPass };
124
+ return { composer, normalPass, downSamplingPass };
181
125
  });
182
- this.composer = computed(() => this.composerEntities().effectComposer);
183
126
  this.api = computed(() => {
184
- const [{ effectComposer: composer, normalPass, downSamplingPass }, resolutionScale, camera, scene] = [
185
- this.composerEntities(),
127
+ const [{ composer, normalPass, downSamplingPass }, camera, scene, resolutionScale] = [
128
+ this.composerData(),
129
+ this.camera(),
130
+ this.scene(),
186
131
  this.resolutionScale(),
187
- this.activeCamera(),
188
- this.activeScene(),
189
132
  ];
190
- return { composer, normalPass, downSamplingPass, resolutionScale, camera, scene };
133
+ return { composer, camera, scene, normalPass, downSamplingPass, resolutionScale };
134
+ });
135
+ afterNextRender(() => {
136
+ this.disableToneMapping();
137
+ this.setComposerSize();
138
+ this.updatePasses();
139
+ injectBeforeRender(({ delta }) => {
140
+ const [{ composer }, { enabled, autoClear, stencilBuffer }, gl] = [
141
+ this.composerData(),
142
+ this.options(),
143
+ this.gl(),
144
+ ];
145
+ if (enabled) {
146
+ const currentAutoClear = gl.autoClear;
147
+ gl.autoClear = autoClear;
148
+ if (stencilBuffer && !autoClear)
149
+ gl.clearStencil();
150
+ composer.render(delta);
151
+ gl.autoClear = currentAutoClear;
152
+ }
153
+ }, { injector: this.injector, priority: this.options().enabled ? this.options().renderPriority : 0 });
191
154
  });
192
- this.setComposerSize();
193
- this.updatePasses();
194
155
  }
195
- ngOnInit() {
196
- this.beforeRender();
156
+ // NOTE: Disable tone mapping because threejs disallows tonemapping on render targets
157
+ disableToneMapping() {
158
+ this.autoEffect(() => {
159
+ const gl = this.gl();
160
+ const currentTonemapping = gl.toneMapping;
161
+ gl.toneMapping = NoToneMapping;
162
+ return () => {
163
+ gl.toneMapping = currentTonemapping;
164
+ };
165
+ });
197
166
  }
198
167
  setComposerSize() {
199
- effect(() => {
200
- const [composer, size] = [this.composer(), this.size()];
201
- composer.setSize(size.width, size.height);
168
+ this.autoEffect(() => {
169
+ const [{ composer }, { width, height }] = [this.composerData(), this.size()];
170
+ if (composer) {
171
+ composer.setSize(width, height);
172
+ }
202
173
  });
203
174
  }
204
175
  updatePasses() {
205
- effect((onCleanup) => {
206
- const [{ effectComposer: composer, normalPass, downSamplingPass }, instance, children, camera] = [
207
- this.composerEntities(),
208
- this.composerRef.nativeElement,
209
- this.composerRef.children('nonObjects')(),
210
- this.activeCamera(),
176
+ this.autoEffect(() => {
177
+ const [group, { composer, normalPass, downSamplingPass }, camera] = [
178
+ this.group(),
179
+ this.composerData(),
180
+ this.camera(),
211
181
  ];
212
182
  const passes = [];
213
- if (instance && composer && children.length) {
183
+ if (group.nativeElement && composer) {
184
+ const localState = getLocalState(group.nativeElement);
185
+ if (!localState)
186
+ return;
187
+ const children = localState.nonObjects();
214
188
  for (let i = 0; i < children.length; i++) {
215
189
  const child = children[i];
216
190
  if (child instanceof Effect) {
217
- const effects = [];
218
- while (children[i] instanceof Effect)
219
- effects.push(children[i++]);
220
- i--;
191
+ const effects = [child];
192
+ if (!isConvolution(child)) {
193
+ let next = null;
194
+ while ((next = children[i + 1]) instanceof Effect) {
195
+ if (isConvolution(next))
196
+ break;
197
+ effects.push(next);
198
+ i++;
199
+ }
200
+ }
221
201
  const pass = new EffectPass(camera, ...effects);
222
202
  passes.push(pass);
223
203
  }
@@ -225,766 +205,1279 @@ class NgtpEffectComposer {
225
205
  passes.push(child);
226
206
  }
227
207
  }
228
- for (const pass of passes)
208
+ for (const pass of passes) {
229
209
  composer.addPass(pass);
210
+ }
230
211
  if (normalPass)
231
212
  normalPass.enabled = true;
232
213
  if (downSamplingPass)
233
214
  downSamplingPass.enabled = true;
234
215
  }
235
- onCleanup(() => {
216
+ return () => {
236
217
  for (const pass of passes)
237
218
  composer?.removePass(pass);
238
219
  if (normalPass)
239
220
  normalPass.enabled = false;
240
221
  if (downSamplingPass)
241
222
  downSamplingPass.enabled = false;
242
- });
223
+ };
243
224
  });
244
225
  }
245
- beforeRender() {
246
- injectBeforeRender(({ delta }) => {
247
- const [enabled, gl, autoClear, stencilBuffer, composer] = [
248
- this.inputs.get('enabled'),
249
- this.gl(),
250
- this.autoClear(),
251
- this.stencilBuffer(),
252
- this.composer(),
253
- ];
254
- if (enabled) {
255
- const currentAutoClear = gl.autoClear;
256
- gl.autoClear = autoClear;
257
- if (stencilBuffer && !autoClear)
258
- gl.clearStencil();
259
- composer.render(delta);
260
- gl.autoClear = currentAutoClear;
261
- }
262
- }, {
263
- injector: this.injector,
264
- priority: this.inputs.get('enabled') ? this.inputs.get('renderPriority') : 0,
265
- });
266
- }
267
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.2", ngImport: i0, type: NgtpEffectComposer, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
268
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.2", type: NgtpEffectComposer, isStandalone: true, selector: "ngtp-effect-composer", inputs: { composerRef: "composerRef", _enabled: ["enabled", "_enabled"], _depthBuffer: ["depthBuffer", "_depthBuffer"], _disableNormalPass: ["disableNormalPass", "_disableNormalPass"], _stencilBuffer: ["stencilBuffer", "_stencilBuffer"], _autoClear: ["autoClear", "_autoClear"], _resolutionScale: ["resolutionScale", "_resolutionScale"], _multisampling: ["multisampling", "_multisampling"], _frameBufferType: ["frameBufferType", "_frameBufferType"], _renderPriority: ["renderPriority", "_renderPriority"], _camera: ["camera", "_camera"], _scene: ["scene", "_scene"] }, providers: [provideNgtpEffectComposerApi()], ngImport: i0, template: `
269
- <ngt-group [ref]="composerRef">
226
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: NgtpEffectComposer, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
227
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "18.0.6", type: NgtpEffectComposer, isStandalone: true, selector: "ngtp-effect-composer", inputs: { options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: false, transformFunction: null } }, providers: [provideEffectComposerApi()], viewQueries: [{ propertyName: "group", first: true, predicate: ["group"], descendants: true, isSignal: true }], ngImport: i0, template: `
228
+ <ngt-group #group>
270
229
  <ng-content />
271
230
  </ngt-group>
272
- `, isInline: true }); }
231
+ `, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
273
232
  }
274
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.2", ngImport: i0, type: NgtpEffectComposer, decorators: [{
233
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: NgtpEffectComposer, decorators: [{
275
234
  type: Component,
276
235
  args: [{
277
236
  selector: 'ngtp-effect-composer',
278
237
  standalone: true,
279
238
  template: `
280
- <ngt-group [ref]="composerRef">
239
+ <ngt-group #group>
281
240
  <ng-content />
282
241
  </ngt-group>
283
242
  `,
284
- providers: [provideNgtpEffectComposerApi()],
243
+ providers: [provideEffectComposerApi()],
285
244
  schemas: [CUSTOM_ELEMENTS_SCHEMA],
245
+ changeDetection: ChangeDetectionStrategy.OnPush,
286
246
  }]
287
- }], ctorParameters: function () { return []; }, propDecorators: { composerRef: [{
288
- type: Input
289
- }], _enabled: [{
290
- type: Input,
291
- args: [{ alias: 'enabled' }]
292
- }], _depthBuffer: [{
293
- type: Input,
294
- args: [{ alias: 'depthBuffer' }]
295
- }], _disableNormalPass: [{
296
- type: Input,
297
- args: [{ alias: 'disableNormalPass' }]
298
- }], _stencilBuffer: [{
299
- type: Input,
300
- args: [{ alias: 'stencilBuffer' }]
301
- }], _autoClear: [{
302
- type: Input,
303
- args: [{ alias: 'autoClear' }]
304
- }], _resolutionScale: [{
305
- type: Input,
306
- args: [{ alias: 'resolutionScale' }]
307
- }], _multisampling: [{
308
- type: Input,
309
- args: [{ alias: 'multisampling' }]
310
- }], _frameBufferType: [{
311
- type: Input,
312
- args: [{ alias: 'frameBufferType' }]
313
- }], _renderPriority: [{
314
- type: Input,
315
- args: [{ alias: 'renderPriority' }]
316
- }], _camera: [{
317
- type: Input,
318
- args: [{ alias: 'camera' }]
319
- }], _scene: [{
320
- type: Input,
321
- args: [{ alias: 'scene' }]
322
- }] } });
247
+ }], ctorParameters: () => [] });
248
+
249
+ const fragment = `
250
+ uniform sampler2D uCharacters;
251
+ uniform float uCharactersCount;
252
+ uniform float uCellSize;
253
+ uniform bool uInvert;
254
+ uniform vec3 uColor;
255
+
256
+ const vec2 SIZE = vec2(16.);
257
+
258
+ vec3 greyscale(vec3 color, float strength) {
259
+ float g = dot(color, vec3(0.299, 0.587, 0.114));
260
+ return mix(color, vec3(g), strength);
261
+ }
262
+
263
+ vec3 greyscale(vec3 color) {
264
+ return greyscale(color, 1.0);
265
+ }
266
+
267
+ void mainImage(const in vec4 inputColor, const in vec2 uv, out vec4 outputColor) {
268
+ vec2 cell = resolution / uCellSize;
269
+ vec2 grid = 1.0 / cell;
270
+ vec2 pixelizedUV = grid * (0.5 + floor(uv / grid));
271
+ vec4 pixelized = texture2D(inputBuffer, pixelizedUV);
272
+ float greyscaled = greyscale(pixelized.rgb).r;
273
+
274
+ if (uInvert) {
275
+ greyscaled = 1.0 - greyscaled;
276
+ }
277
+
278
+ float characterIndex = floor((uCharactersCount - 1.0) * greyscaled);
279
+ vec2 characterPosition = vec2(mod(characterIndex, SIZE.x), floor(characterIndex / SIZE.y));
280
+ vec2 offset = vec2(characterPosition.x, -characterPosition.y) / SIZE;
281
+ vec2 charUV = mod(uv * (cell / SIZE), 1.0 / SIZE) - vec2(0., 1.0 / SIZE) + offset;
282
+ vec4 asciiCharacter = texture2D(uCharacters, charUV);
283
+
284
+ asciiCharacter.rgb = uColor * asciiCharacter.r;
285
+ asciiCharacter.a = pixelized.a;
286
+ outputColor = asciiCharacter;
287
+ }
288
+ `;
289
+ class ASCIIEffect extends Effect {
290
+ constructor({ font = 'arial', characters = ` .:,'-^=*+?!|0#X%WM@`, fontSize = 54, cellSize = 16, color = '#ffffff', invert = false, } = {}) {
291
+ const uniforms = new Map([
292
+ ['uCharacters', new Uniform(new Texture())],
293
+ ['uCellSize', new Uniform(cellSize)],
294
+ ['uCharactersCount', new Uniform(characters.length)],
295
+ ['uColor', new Uniform(new Color(color))],
296
+ ['uInvert', new Uniform(invert)],
297
+ ]);
298
+ super('ASCIIEffect', fragment, { uniforms });
299
+ const charactersTextureUniform = this.uniforms.get('uCharacters');
300
+ if (charactersTextureUniform) {
301
+ charactersTextureUniform.value = this.createCharactersTexture(characters, font, fontSize);
302
+ }
303
+ }
304
+ /** Draws the characters on a Canvas and returns a texture */
305
+ createCharactersTexture(characters, font, fontSize) {
306
+ const canvas = document.createElement('canvas');
307
+ const SIZE = 1024;
308
+ const MAX_PER_ROW = 16;
309
+ const CELL = SIZE / MAX_PER_ROW;
310
+ canvas.width = canvas.height = SIZE;
311
+ const texture = new CanvasTexture(canvas, undefined, RepeatWrapping, RepeatWrapping, NearestFilter, NearestFilter);
312
+ const context = canvas.getContext('2d');
313
+ if (!context) {
314
+ throw new Error('Context not available');
315
+ }
316
+ context.clearRect(0, 0, SIZE, SIZE);
317
+ context.font = `${fontSize}px ${font}`;
318
+ context.textAlign = 'center';
319
+ context.textBaseline = 'middle';
320
+ context.fillStyle = '#fff';
321
+ for (let i = 0; i < characters.length; i++) {
322
+ const char = characters[i];
323
+ const x = i % MAX_PER_ROW;
324
+ const y = Math.floor(i / MAX_PER_ROW);
325
+ context.fillText(char, x * CELL + CELL / 2, y * CELL + CELL / 2);
326
+ }
327
+ texture.needsUpdate = true;
328
+ return texture;
329
+ }
330
+ }
331
+ const defaultOptions$2 = {
332
+ font: 'arial',
333
+ characters: ` .:,'-^=*+?!|0#X%WM@`,
334
+ fontSize: 54,
335
+ cellSize: 16,
336
+ color: '#ffffff',
337
+ invert: false,
338
+ };
339
+ class NgtpASCII {
340
+ constructor() {
341
+ this.options = input(defaultOptions$2, { transform: mergeInputs(defaultOptions$2) });
342
+ this.effect = computed(() => new ASCIIEffect(this.options()));
343
+ }
344
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: NgtpASCII, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
345
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "18.0.6", type: NgtpASCII, isStandalone: true, selector: "ngtp-ascii", inputs: { options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: `
346
+ <ngt-primitive *args="[effect()]" />
347
+ `, isInline: true, dependencies: [{ kind: "directive", type: NgtArgs, selector: "ng-template[args]", inputs: ["args"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
348
+ }
349
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: NgtpASCII, decorators: [{
350
+ type: Component,
351
+ args: [{
352
+ selector: 'ngtp-ascii',
353
+ standalone: true,
354
+ template: `
355
+ <ngt-primitive *args="[effect()]" />
356
+ `,
357
+ imports: [NgtArgs],
358
+ schemas: [CUSTOM_ELEMENTS_SCHEMA],
359
+ changeDetection: ChangeDetectionStrategy.OnPush,
360
+ }]
361
+ }] });
323
362
 
324
363
  extend({ BloomEffect });
325
- class NgtpBloom extends NgtpEffect {
364
+ class NgtpBloom {
326
365
  constructor() {
327
- super(...arguments);
328
- this.defaultBlendFunction = BlendFunction.ADD;
366
+ this.effect = inject(NgtpEffect, { host: true });
367
+ this.options = input({});
329
368
  }
330
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.2", ngImport: i0, type: NgtpBloom, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
331
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.2", type: NgtpBloom, isStandalone: true, selector: "ngtp-bloom", usesInheritance: true, ngImport: i0, template: `
332
- <ngt-bloom-effect ngtCompound *args="args()" [ref]="effectRef" [camera]="camera()">
369
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: NgtpBloom, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
370
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "18.0.6", type: NgtpBloom, isStandalone: true, selector: "ngtp-bloom", inputs: { options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: false, transformFunction: null } }, providers: [provideDefaultEffectOptions({ blendFunction: BlendFunction.ADD })], hostDirectives: [{ directive: NgtpEffect, inputs: ["blendFunction", "blendFunction", "opacity", "opacity"] }], ngImport: i0, template: `
371
+ <ngt-bloom-effect *args="[options()]" [camera]="effect.camera()">
372
+ <ngtp-effect-blend-mode />
333
373
  <ng-content />
334
374
  </ngt-bloom-effect>
335
- `, isInline: true, dependencies: [{ kind: "directive", type: NgtArgs, selector: "ng-template[args]", inputs: ["args"] }] }); }
375
+ `, isInline: true, dependencies: [{ kind: "directive", type: NgtArgs, selector: "ng-template[args]", inputs: ["args"] }, { kind: "component", type: NgtpEffectBlendMode, selector: "ngtp-effect-blend-mode" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
336
376
  }
337
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.2", ngImport: i0, type: NgtpBloom, decorators: [{
377
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: NgtpBloom, decorators: [{
338
378
  type: Component,
339
379
  args: [{
340
380
  selector: 'ngtp-bloom',
341
381
  standalone: true,
342
382
  template: `
343
- <ngt-bloom-effect ngtCompound *args="args()" [ref]="effectRef" [camera]="camera()">
383
+ <ngt-bloom-effect *args="[options()]" [camera]="effect.camera()">
384
+ <ngtp-effect-blend-mode />
344
385
  <ng-content />
345
386
  </ngt-bloom-effect>
346
387
  `,
347
- imports: [NgtArgs],
388
+ imports: [NgtArgs, NgtpEffectBlendMode],
348
389
  schemas: [CUSTOM_ELEMENTS_SCHEMA],
390
+ changeDetection: ChangeDetectionStrategy.OnPush,
391
+ hostDirectives: [NgtpEffectHostDirective],
392
+ providers: [provideDefaultEffectOptions({ blendFunction: BlendFunction.ADD })],
349
393
  }]
350
394
  }] });
351
395
 
352
396
  extend({ BrightnessContrastEffect });
353
- class NgtpBrightnessContrast extends NgtpEffect {
354
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.2", ngImport: i0, type: NgtpBrightnessContrast, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
355
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.2", type: NgtpBrightnessContrast, isStandalone: true, selector: "ngtp-brightness-contrast", usesInheritance: true, ngImport: i0, template: `
356
- <ngt-brightness-contrast-effect ngtCompound *args="args()" [camera]="camera()" [ref]="effectRef">
397
+ class NgtpBrightnessContrast {
398
+ constructor() {
399
+ this.effect = inject(NgtpEffect, { host: true });
400
+ this.options = input({});
401
+ }
402
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: NgtpBrightnessContrast, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
403
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "18.0.6", type: NgtpBrightnessContrast, isStandalone: true, selector: "ngtp-brightness-contrast", inputs: { options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: false, transformFunction: null } }, hostDirectives: [{ directive: NgtpEffect, inputs: ["blendFunction", "blendFunction", "opacity", "opacity"] }], ngImport: i0, template: `
404
+ <ngt-brightness-contrast-effect *args="[options()]" [camera]="effect.camera()">
405
+ <ngtp-effect-blend-mode />
357
406
  <ng-content />
358
407
  </ngt-brightness-contrast-effect>
359
- `, isInline: true, dependencies: [{ kind: "directive", type: NgtArgs, selector: "ng-template[args]", inputs: ["args"] }] }); }
408
+ `, isInline: true, dependencies: [{ kind: "directive", type: NgtArgs, selector: "ng-template[args]", inputs: ["args"] }, { kind: "component", type: NgtpEffectBlendMode, selector: "ngtp-effect-blend-mode" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
360
409
  }
361
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.2", ngImport: i0, type: NgtpBrightnessContrast, decorators: [{
410
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: NgtpBrightnessContrast, decorators: [{
362
411
  type: Component,
363
412
  args: [{
364
413
  selector: 'ngtp-brightness-contrast',
365
414
  standalone: true,
366
415
  template: `
367
- <ngt-brightness-contrast-effect ngtCompound *args="args()" [camera]="camera()" [ref]="effectRef">
416
+ <ngt-brightness-contrast-effect *args="[options()]" [camera]="effect.camera()">
417
+ <ngtp-effect-blend-mode />
368
418
  <ng-content />
369
419
  </ngt-brightness-contrast-effect>
420
+ `,
421
+ imports: [NgtArgs, NgtpEffectBlendMode],
422
+ schemas: [CUSTOM_ELEMENTS_SCHEMA],
423
+ changeDetection: ChangeDetectionStrategy.OnPush,
424
+ hostDirectives: [NgtpEffectHostDirective],
425
+ }]
426
+ }] });
427
+
428
+ extend({ ChromaticAberrationEffect });
429
+ class NgtpChromaticAberration {
430
+ constructor() {
431
+ this.effect = inject(NgtpEffect, { host: true });
432
+ this.options = input({});
433
+ }
434
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: NgtpChromaticAberration, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
435
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "18.0.6", type: NgtpChromaticAberration, isStandalone: true, selector: "ngtp-chromatic-aberration", inputs: { options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: false, transformFunction: null } }, hostDirectives: [{ directive: NgtpEffect, inputs: ["blendFunction", "blendFunction", "opacity", "opacity"] }], ngImport: i0, template: `
436
+ <ngt-chromatic-aberration-effect *args="[options()]" [camera]="effect.camera()">
437
+ <ngtp-effect-blend-mode />
438
+ <ng-content />
439
+ </ngt-chromatic-aberration-effect>
440
+ `, isInline: true, dependencies: [{ kind: "directive", type: NgtArgs, selector: "ng-template[args]", inputs: ["args"] }, { kind: "component", type: NgtpEffectBlendMode, selector: "ngtp-effect-blend-mode" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
441
+ }
442
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: NgtpChromaticAberration, decorators: [{
443
+ type: Component,
444
+ args: [{
445
+ selector: 'ngtp-chromatic-aberration',
446
+ template: `
447
+ <ngt-chromatic-aberration-effect *args="[options()]" [camera]="effect.camera()">
448
+ <ngtp-effect-blend-mode />
449
+ <ng-content />
450
+ </ngt-chromatic-aberration-effect>
451
+ `,
452
+ standalone: true,
453
+ schemas: [CUSTOM_ELEMENTS_SCHEMA],
454
+ changeDetection: ChangeDetectionStrategy.OnPush,
455
+ imports: [NgtArgs, NgtpEffectBlendMode],
456
+ hostDirectives: [NgtpEffectHostDirective],
457
+ }]
458
+ }] });
459
+
460
+ extend({ ColorAverageEffect });
461
+ class NgtpColorAverage {
462
+ constructor() {
463
+ this.options = input({ blendFunction: BlendFunction.NORMAL }, { transform: mergeInputs({ blendFunction: BlendFunction.NORMAL }) });
464
+ }
465
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: NgtpColorAverage, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
466
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "18.0.6", type: NgtpColorAverage, isStandalone: true, selector: "ngtp-color-average", inputs: { options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: `
467
+ <ngt-color-average-effect *args="[options().blendFunction]">
468
+ <ng-content />
469
+ </ngt-color-average-effect>
470
+ `, isInline: true, dependencies: [{ kind: "directive", type: NgtArgs, selector: "ng-template[args]", inputs: ["args"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
471
+ }
472
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: NgtpColorAverage, decorators: [{
473
+ type: Component,
474
+ args: [{
475
+ selector: 'ngtp-color-average',
476
+ standalone: true,
477
+ template: `
478
+ <ngt-color-average-effect *args="[options().blendFunction]">
479
+ <ng-content />
480
+ </ngt-color-average-effect>
370
481
  `,
371
482
  imports: [NgtArgs],
372
483
  schemas: [CUSTOM_ELEMENTS_SCHEMA],
484
+ changeDetection: ChangeDetectionStrategy.OnPush,
373
485
  }]
374
486
  }] });
375
487
 
376
488
  extend({ ColorDepthEffect });
377
- class NgtpColorDepth extends NgtpEffect {
378
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.2", ngImport: i0, type: NgtpColorDepth, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
379
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.2", type: NgtpColorDepth, isStandalone: true, selector: "ngtp-color-depth", usesInheritance: true, ngImport: i0, template: `
380
- <ngt-color-depth-effect ngtCompound *args="args()" [camera]="camera()" [ref]="effectRef">
489
+ class NgtpColorDepth {
490
+ constructor() {
491
+ this.effect = inject(NgtpEffect, { host: true });
492
+ this.options = input({});
493
+ }
494
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: NgtpColorDepth, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
495
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "18.0.6", type: NgtpColorDepth, isStandalone: true, selector: "ngtp-color-depth", inputs: { options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: false, transformFunction: null } }, hostDirectives: [{ directive: NgtpEffect, inputs: ["blendFunction", "blendFunction", "opacity", "opacity"] }], ngImport: i0, template: `
496
+ <ngt-color-depth-effect *args="[options()]" [camera]="effect.camera()">
497
+ <ngtp-effect-blend-mode />
381
498
  <ng-content />
382
499
  </ngt-color-depth-effect>
383
- `, isInline: true, dependencies: [{ kind: "directive", type: NgtArgs, selector: "ng-template[args]", inputs: ["args"] }] }); }
500
+ `, isInline: true, dependencies: [{ kind: "directive", type: NgtArgs, selector: "ng-template[args]", inputs: ["args"] }, { kind: "component", type: NgtpEffectBlendMode, selector: "ngtp-effect-blend-mode" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
384
501
  }
385
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.2", ngImport: i0, type: NgtpColorDepth, decorators: [{
502
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: NgtpColorDepth, decorators: [{
386
503
  type: Component,
387
504
  args: [{
388
505
  selector: 'ngtp-color-depth',
389
- standalone: true,
390
506
  template: `
391
- <ngt-color-depth-effect ngtCompound *args="args()" [camera]="camera()" [ref]="effectRef">
507
+ <ngt-color-depth-effect *args="[options()]" [camera]="effect.camera()">
508
+ <ngtp-effect-blend-mode />
392
509
  <ng-content />
393
510
  </ngt-color-depth-effect>
394
511
  `,
395
- imports: [NgtArgs],
512
+ standalone: true,
396
513
  schemas: [CUSTOM_ELEMENTS_SCHEMA],
514
+ changeDetection: ChangeDetectionStrategy.OnPush,
515
+ imports: [NgtArgs, NgtpEffectBlendMode],
516
+ hostDirectives: [NgtpEffectHostDirective],
397
517
  }]
398
518
  }] });
399
519
 
400
520
  extend({ DepthEffect });
401
- class NgtpDepth extends NgtpEffect {
402
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.2", ngImport: i0, type: NgtpDepth, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
403
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.2", type: NgtpDepth, isStandalone: true, selector: "ngtp-depth", usesInheritance: true, ngImport: i0, template: `
404
- <ngt-depth-effect ngtCompound *args="args()" [camera]="camera()" [ref]="effectRef">
521
+ class NgtpDepth {
522
+ constructor() {
523
+ this.effect = inject(NgtpEffect, { host: true });
524
+ this.options = input({});
525
+ }
526
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: NgtpDepth, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
527
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "18.0.6", type: NgtpDepth, isStandalone: true, selector: "ngtp-depth", inputs: { options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: false, transformFunction: null } }, hostDirectives: [{ directive: NgtpEffect, inputs: ["blendFunction", "blendFunction", "opacity", "opacity"] }], ngImport: i0, template: `
528
+ <ngt-depth-effect *args="[options()]" [camera]="effect.camera()">
529
+ <ngtp-effect-blend-mode />
405
530
  <ng-content />
406
531
  </ngt-depth-effect>
407
- `, isInline: true, dependencies: [{ kind: "directive", type: NgtArgs, selector: "ng-template[args]", inputs: ["args"] }] }); }
532
+ `, isInline: true, dependencies: [{ kind: "directive", type: NgtArgs, selector: "ng-template[args]", inputs: ["args"] }, { kind: "component", type: NgtpEffectBlendMode, selector: "ngtp-effect-blend-mode" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
408
533
  }
409
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.2", ngImport: i0, type: NgtpDepth, decorators: [{
534
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: NgtpDepth, decorators: [{
410
535
  type: Component,
411
536
  args: [{
412
537
  selector: 'ngtp-depth',
413
- standalone: true,
414
538
  template: `
415
- <ngt-depth-effect ngtCompound *args="args()" [camera]="camera()" [ref]="effectRef">
539
+ <ngt-depth-effect *args="[options()]" [camera]="effect.camera()">
540
+ <ngtp-effect-blend-mode />
416
541
  <ng-content />
417
542
  </ngt-depth-effect>
418
543
  `,
419
- imports: [NgtArgs],
544
+ standalone: true,
420
545
  schemas: [CUSTOM_ELEMENTS_SCHEMA],
546
+ changeDetection: ChangeDetectionStrategy.OnPush,
547
+ imports: [NgtArgs, NgtpEffectBlendMode],
548
+ hostDirectives: [NgtpEffectHostDirective],
421
549
  }]
422
550
  }] });
423
551
 
552
+ class NgtpDepthOfField {
553
+ constructor() {
554
+ this.autoEffect = injectAutoEffect();
555
+ this.composerApi = injectEffectComposerApi();
556
+ this.options = input({});
557
+ this.autoFocus = computed(() => this.options().target != null);
558
+ this.effect = computed(() => {
559
+ const [{ camera }, options, autoFocus] = [this.composerApi(), this.options(), this.autoFocus()];
560
+ const effect = new DepthOfFieldEffect(camera, options);
561
+ // Creating a target enables autofocus, R3F will set via props
562
+ if (autoFocus)
563
+ effect.target = new Vector3();
564
+ // Depth texture for depth picking with optional packing strategy
565
+ if (options.depthTexture) {
566
+ effect.setDepthTexture(options.depthTexture.texture, options.depthTexture.packing);
567
+ }
568
+ // Temporary fix that restores DOF 6.21.3 behavior, everything since then lets shapes leak through the blur
569
+ const maskPass = effect.maskPass;
570
+ maskPass.maskFunction = MaskFunction.MULTIPLY_RGB_SET_ALPHA;
571
+ return effect;
572
+ });
573
+ afterNextRender(() => {
574
+ this.autoEffect(() => {
575
+ const effect = this.effect();
576
+ return () => {
577
+ effect.dispose();
578
+ };
579
+ });
580
+ });
581
+ }
582
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: NgtpDepthOfField, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
583
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "18.0.6", type: NgtpDepthOfField, isStandalone: true, selector: "ngtp-depth-of-field", inputs: { options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: `
584
+ <ngt-primitive *args="[effect()]" />
585
+ `, isInline: true, dependencies: [{ kind: "directive", type: NgtArgs, selector: "ng-template[args]", inputs: ["args"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
586
+ }
587
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: NgtpDepthOfField, decorators: [{
588
+ type: Component,
589
+ args: [{
590
+ selector: 'ngtp-depth-of-field',
591
+ standalone: true,
592
+ template: `
593
+ <ngt-primitive *args="[effect()]" />
594
+ `,
595
+ imports: [NgtArgs],
596
+ schemas: [CUSTOM_ELEMENTS_SCHEMA],
597
+ changeDetection: ChangeDetectionStrategy.OnPush,
598
+ }]
599
+ }], ctorParameters: () => [] });
600
+
424
601
  extend({ DotScreenEffect });
425
- class NgtpDotScreen extends NgtpEffect {
426
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.2", ngImport: i0, type: NgtpDotScreen, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
427
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.2", type: NgtpDotScreen, isStandalone: true, selector: "ngtp-dot-screen", usesInheritance: true, ngImport: i0, template: `
428
- <ngt-dot-screen-effect ngtCompound *args="args()" [camera]="camera()" [ref]="effectRef">
602
+ class NgtpDotScreen {
603
+ constructor() {
604
+ this.effect = inject(NgtpEffect, { host: true });
605
+ this.options = input({});
606
+ }
607
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: NgtpDotScreen, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
608
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "18.0.6", type: NgtpDotScreen, isStandalone: true, selector: "ngtp-dot-screen", inputs: { options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: false, transformFunction: null } }, hostDirectives: [{ directive: NgtpEffect, inputs: ["blendFunction", "blendFunction", "opacity", "opacity"] }], ngImport: i0, template: `
609
+ <ngt-dot-screen-effect *args="[options()]" [camera]="effect.camera()">
610
+ <ngtp-effect-blend-mode />
429
611
  <ng-content />
430
612
  </ngt-dot-screen-effect>
431
- `, isInline: true, dependencies: [{ kind: "directive", type: NgtArgs, selector: "ng-template[args]", inputs: ["args"] }] }); }
613
+ `, isInline: true, dependencies: [{ kind: "directive", type: NgtArgs, selector: "ng-template[args]", inputs: ["args"] }, { kind: "component", type: NgtpEffectBlendMode, selector: "ngtp-effect-blend-mode" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
432
614
  }
433
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.2", ngImport: i0, type: NgtpDotScreen, decorators: [{
615
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: NgtpDotScreen, decorators: [{
434
616
  type: Component,
435
617
  args: [{
436
618
  selector: 'ngtp-dot-screen',
437
- standalone: true,
438
619
  template: `
439
- <ngt-dot-screen-effect ngtCompound *args="args()" [camera]="camera()" [ref]="effectRef">
620
+ <ngt-dot-screen-effect *args="[options()]" [camera]="effect.camera()">
621
+ <ngtp-effect-blend-mode />
440
622
  <ng-content />
441
623
  </ngt-dot-screen-effect>
442
624
  `,
443
- imports: [NgtArgs],
625
+ standalone: true,
444
626
  schemas: [CUSTOM_ELEMENTS_SCHEMA],
627
+ changeDetection: ChangeDetectionStrategy.OnPush,
628
+ imports: [NgtArgs, NgtpEffectBlendMode],
629
+ hostDirectives: [NgtpEffectHostDirective],
445
630
  }]
446
631
  }] });
447
632
 
633
+ extend({ FXAAEffect });
634
+ class NgtpFXAA {
635
+ constructor() {
636
+ this.effect = inject(NgtpEffect, { host: true });
637
+ this.options = input({});
638
+ }
639
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: NgtpFXAA, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
640
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "18.0.6", type: NgtpFXAA, isStandalone: true, selector: "ngtp-fxaa", inputs: { options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: false, transformFunction: null } }, hostDirectives: [{ directive: NgtpEffect, inputs: ["blendFunction", "blendFunction", "opacity", "opacity"] }], ngImport: i0, template: `
641
+ <ngt-fXAA-effect *args="[options()]" [camera]="effect.camera()">
642
+ <ngtp-effect-blend-mode />
643
+ <ng-content />
644
+ </ngt-fXAA-effect>
645
+ `, isInline: true, dependencies: [{ kind: "directive", type: NgtArgs, selector: "ng-template[args]", inputs: ["args"] }, { kind: "component", type: NgtpEffectBlendMode, selector: "ngtp-effect-blend-mode" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
646
+ }
647
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: NgtpFXAA, decorators: [{
648
+ type: Component,
649
+ args: [{
650
+ selector: 'ngtp-fxaa',
651
+ template: `
652
+ <ngt-fXAA-effect *args="[options()]" [camera]="effect.camera()">
653
+ <ngtp-effect-blend-mode />
654
+ <ng-content />
655
+ </ngt-fXAA-effect>
656
+ `,
657
+ standalone: true,
658
+ schemas: [CUSTOM_ELEMENTS_SCHEMA],
659
+ changeDetection: ChangeDetectionStrategy.OnPush,
660
+ imports: [NgtArgs, NgtpEffectBlendMode],
661
+ hostDirectives: [NgtpEffectHostDirective],
662
+ }]
663
+ }] });
664
+
665
+ class NgtpGlitch {
666
+ constructor() {
667
+ this.autoEffect = injectAutoEffect();
668
+ this.store = injectStore();
669
+ this.invalidate = this.store.select('invalidate');
670
+ this.options = input({ active: true }, { transform: mergeInputs({ active: true }) });
671
+ this.active = pick(this.options, 'active');
672
+ this.mode = pick(this.options, 'mode');
673
+ this.delay = vector2(this.options, 'delay');
674
+ this.duration = vector2(this.options, 'duration');
675
+ this.chromaticAberrationOffset = vector2(this.options, 'chromaticAberrationOffset');
676
+ this.strength = vector2(this.options, 'strength');
677
+ this.effect = computed(() => {
678
+ const [{ ratio, dtSize, columns, blendFunction, perturbationMap }, delay, duration, chromaticAberrationOffset, strength,] = [this.options(), this.delay(), this.duration(), this.chromaticAberrationOffset(), this.strength()];
679
+ return new GlitchEffect({
680
+ ratio,
681
+ dtSize,
682
+ columns,
683
+ blendFunction,
684
+ perturbationMap,
685
+ delay,
686
+ duration,
687
+ chromaticAberrationOffset,
688
+ strength,
689
+ });
690
+ });
691
+ afterNextRender(() => {
692
+ this.autoEffect(() => {
693
+ const effect = this.effect();
694
+ return () => effect.dispose();
695
+ });
696
+ this.autoEffect(() => {
697
+ const [effect, invalidate, mode, active] = [this.effect(), this.invalidate(), this.mode(), this.active()];
698
+ effect.mode = active ? mode || GlitchMode.SPORADIC : GlitchMode.DISABLED;
699
+ invalidate();
700
+ });
701
+ });
702
+ }
703
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: NgtpGlitch, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
704
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "18.0.6", type: NgtpGlitch, isStandalone: true, selector: "ngtp-glitch", inputs: { options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: `
705
+ <ngt-primitive *args="[effect()]" />
706
+ `, isInline: true, dependencies: [{ kind: "directive", type: NgtArgs, selector: "ng-template[args]", inputs: ["args"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
707
+ }
708
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: NgtpGlitch, decorators: [{
709
+ type: Component,
710
+ args: [{
711
+ selector: 'ngtp-glitch',
712
+ standalone: true,
713
+ template: `
714
+ <ngt-primitive *args="[effect()]" />
715
+ `,
716
+ imports: [NgtArgs],
717
+ schemas: [CUSTOM_ELEMENTS_SCHEMA],
718
+ changeDetection: ChangeDetectionStrategy.OnPush,
719
+ }]
720
+ }], ctorParameters: () => [] });
721
+
722
+ class NgtpGodRays {
723
+ constructor() {
724
+ this.autoEffect = injectAutoEffect();
725
+ this.composerApi = injectEffectComposerApi();
726
+ this.options = input({});
727
+ this.effect = computed(() => {
728
+ const [{ camera }, { sun, ...options }] = [this.composerApi(), this.options()];
729
+ return new GodRaysEffect(camera, is.ref(sun) ? sun.nativeElement : sun, options);
730
+ });
731
+ afterNextRender(() => {
732
+ this.autoEffect(() => {
733
+ const [sun, effect] = [this.options().sun, this.effect()];
734
+ effect.lightSource = is.ref(sun) ? sun.nativeElement : sun;
735
+ });
736
+ });
737
+ }
738
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: NgtpGodRays, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
739
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "18.0.6", type: NgtpGodRays, isStandalone: true, selector: "ngtp-god-rays", inputs: { options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: `
740
+ <ngt-primitive *args="[effect()]" />
741
+ `, isInline: true, dependencies: [{ kind: "directive", type: NgtArgs, selector: "ng-template[args]", inputs: ["args"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
742
+ }
743
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: NgtpGodRays, decorators: [{
744
+ type: Component,
745
+ args: [{
746
+ selector: 'ngtp-god-rays',
747
+ standalone: true,
748
+ template: `
749
+ <ngt-primitive *args="[effect()]" />
750
+ `,
751
+ imports: [NgtArgs],
752
+ changeDetection: ChangeDetectionStrategy.OnPush,
753
+ schemas: [CUSTOM_ELEMENTS_SCHEMA],
754
+ }]
755
+ }], ctorParameters: () => [] });
756
+
757
+ class NgtpGrid {
758
+ constructor() {
759
+ this.autoEffect = injectAutoEffect();
760
+ this.store = injectStore();
761
+ this.invalidate = this.store.select('invalidate');
762
+ this.options = input({});
763
+ this.size = pick(this.options, 'size');
764
+ this.effect = computed(() => {
765
+ const { size: _, ...options } = this.options();
766
+ return new GridEffect(options);
767
+ });
768
+ afterNextRender(() => {
769
+ this.autoEffect(() => {
770
+ const [size, effect] = [this.size(), this.effect()];
771
+ if (size) {
772
+ effect.setSize(size.width, size.height);
773
+ }
774
+ });
775
+ });
776
+ }
777
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: NgtpGrid, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
778
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "18.0.6", type: NgtpGrid, isStandalone: true, selector: "ngtp-grid", inputs: { options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: `
779
+ <ngt-primitive *args="[effect()]" />
780
+ `, isInline: true, dependencies: [{ kind: "directive", type: NgtArgs, selector: "ng-template[args]", inputs: ["args"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
781
+ }
782
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: NgtpGrid, decorators: [{
783
+ type: Component,
784
+ args: [{
785
+ selector: 'ngtp-grid',
786
+ standalone: true,
787
+ template: `
788
+ <ngt-primitive *args="[effect()]" />
789
+ `,
790
+ imports: [NgtArgs],
791
+ changeDetection: ChangeDetectionStrategy.OnPush,
792
+ schemas: [CUSTOM_ELEMENTS_SCHEMA],
793
+ }]
794
+ }], ctorParameters: () => [] });
795
+
448
796
  extend({ HueSaturationEffect });
449
- class NgtpHueSaturation extends NgtpEffect {
450
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.2", ngImport: i0, type: NgtpHueSaturation, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
451
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.2", type: NgtpHueSaturation, isStandalone: true, selector: "ngtp-hue-saturation", usesInheritance: true, ngImport: i0, template: `
452
- <ngt-hue-saturation-effect ngtCompound *args="args()" [camera]="camera()" [ref]="effectRef">
797
+ class NgtpHueSaturation {
798
+ constructor() {
799
+ this.effect = inject(NgtpEffect, { host: true });
800
+ this.options = input({});
801
+ }
802
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: NgtpHueSaturation, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
803
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "18.0.6", type: NgtpHueSaturation, isStandalone: true, selector: "ngtp-hue-saturation", inputs: { options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: false, transformFunction: null } }, hostDirectives: [{ directive: NgtpEffect, inputs: ["blendFunction", "blendFunction", "opacity", "opacity"] }], ngImport: i0, template: `
804
+ <ngt-hue-saturation-effect *args="[options()]" [camera]="effect.camera()">
805
+ <ngtp-effect-blend-mode />
453
806
  <ng-content />
454
807
  </ngt-hue-saturation-effect>
455
- `, isInline: true, dependencies: [{ kind: "directive", type: NgtArgs, selector: "ng-template[args]", inputs: ["args"] }] }); }
808
+ `, isInline: true, dependencies: [{ kind: "directive", type: NgtArgs, selector: "ng-template[args]", inputs: ["args"] }, { kind: "component", type: NgtpEffectBlendMode, selector: "ngtp-effect-blend-mode" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
456
809
  }
457
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.2", ngImport: i0, type: NgtpHueSaturation, decorators: [{
810
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: NgtpHueSaturation, decorators: [{
458
811
  type: Component,
459
812
  args: [{
460
813
  selector: 'ngtp-hue-saturation',
461
- standalone: true,
462
814
  template: `
463
- <ngt-hue-saturation-effect ngtCompound *args="args()" [camera]="camera()" [ref]="effectRef">
815
+ <ngt-hue-saturation-effect *args="[options()]" [camera]="effect.camera()">
816
+ <ngtp-effect-blend-mode />
464
817
  <ng-content />
465
818
  </ngt-hue-saturation-effect>
466
819
  `,
467
- imports: [NgtArgs],
820
+ standalone: true,
468
821
  schemas: [CUSTOM_ELEMENTS_SCHEMA],
822
+ changeDetection: ChangeDetectionStrategy.OnPush,
823
+ imports: [NgtArgs, NgtpEffectBlendMode],
824
+ hostDirectives: [NgtpEffectHostDirective],
469
825
  }]
470
826
  }] });
471
827
 
472
- class NgtpLUT {
473
- set _lut(lut) {
474
- this.inputs.set({ lut });
475
- }
476
- set _blendFunction(blendFunction) {
477
- this.inputs.set({ blendFunction });
828
+ // Created by Anderson Mancini 2023
829
+ // React Three Fiber Ultimate LensFlare
830
+ const LensFlareShader = {
831
+ fragmentShader: /* glsl */ `
832
+
833
+ uniform float iTime;
834
+ uniform vec2 lensPosition;
835
+ uniform vec2 iResolution;
836
+ uniform vec3 colorGain;
837
+ uniform float starPoints;
838
+ uniform float glareSize;
839
+ uniform float flareSize;
840
+ uniform float flareSpeed;
841
+ uniform float flareShape;
842
+ uniform float haloScale;
843
+ uniform float opacity;
844
+ uniform bool animated;
845
+ uniform bool anamorphic;
846
+ uniform bool enabled;
847
+ uniform bool secondaryGhosts;
848
+ uniform bool starBurst;
849
+ uniform float ghostScale;
850
+ uniform bool aditionalStreaks;
851
+ uniform sampler2D lensDirtTexture;
852
+ vec2 vxtC;
853
+
854
+ float rndf(float n){return fract(sin(n) * 43758.5453123);}float niz(float p){float fl = floor(p);float fc = fract(p);return mix(rndf(fl),rndf(fl + 1.0), fc);}
855
+ vec3 hsv2rgb(vec3 c){vec4 k = vec4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0);vec3 p = abs(fract(c.xxx + k.xyz) * 6.0 - k.www);return c.z * mix(k.xxx, clamp(p - k.xxx, 0.0, 1.0), c.y);}
856
+ float satU(float x){return clamp(x, 0.,1.);}vec2 rtU(vec2 naz, float rtn){return vec2(cos(rtn) * naz.x + sin(rtn) * naz.y,cos(rtn) * naz.y - sin(rtn) * naz.x);}
857
+ vec3 drwF(vec2 p, float intensity, float rnd, float speed, int id){float flhos = (1. / 32.) * float(id) * 0.1;float lingrad = distance(vec2(0.), p);float expg = 1. / exp(lingrad * (fract(rnd) * 0.66 + 0.33));vec3 qzTg = hsv2rgb(vec3( fract( (expg * 8.) + speed * flareSpeed + flhos), pow(1.-abs(expg*2.-1.), 0.45), 20.0 * expg * intensity));float internalStarPoints;if(anamorphic){internalStarPoints = 1.0;} else{internalStarPoints = starPoints;}float ams = length(p * flareShape * sin(internalStarPoints * atan(p.x, p.y)));float kJhg = pow(1.-satU(ams), ( anamorphic ? 100. : 12.));kJhg += satU(expg-0.9) * 3.;kJhg = pow(kJhg * expg, 8. + (1.-intensity) * 5.);if(flareSpeed > 0.0){return vec3(kJhg) * qzTg;} else{return vec3(kJhg) * flareSize * 15.;}}
858
+ float ams2(vec3 a, vec3 b) { return abs(a.x - b.x) + abs(a.y - b.y) + abs(a.z - b.z);}vec3 satU(vec3 x){return clamp(x, vec3(0.0), vec3(1.0));}
859
+ float glR(vec2 naz, vec2 pos, float zsi){vec2 mni;if(animated){mni = rtU(naz-pos, iTime * 0.1);} else{mni = naz-pos;}float ang = atan(mni.y, mni.x) * (anamorphic ? 1.0 : starPoints);float ams2 = length(mni);ams2 = pow(ams2, .9);float f0 = 1.0/(length(naz-pos)*(1.0/zsi*16.0)+.2);return f0+f0*(sin((ang))*.2 +.3);}
860
+ float sdHex(vec2 p){p = abs(p);vec2 q = vec2(p.x*2.0*0.5773503, p.y + p.x*0.5773503);return dot(step(q.xy,q.yx), 1.0-q.yx);}float fpow(float x, float k){return x > k ? pow((x-k)/(1.0-k),2.0) : 0.0;}
861
+ vec3 rHx(vec2 naz, vec2 p, float s, vec3 col){naz -= p;if (abs(naz.x) < 0.2*s && abs(naz.y) < 0.2*s){return mix(vec3(0),mix(vec3(0),col,0.1 + fpow(length(naz/s),0.1)*10.0),smoothstep(0.0,0.1,sdHex(naz*20.0/s)));}return vec3(0);}
862
+ vec3 mLs(vec2 naz, vec2 pos){vec2 mni = naz-pos;vec2 zxMp = naz*(length(naz));float ang = atan(mni.x,mni.y);float f0 = .3/(length(naz-pos)*16.0+1.0);f0 = f0*(sin(niz(sin(ang*3.9-(animated ? iTime : 0.0) * 0.3) * starPoints))*.2 );float f1 = max(0.01-pow(length(naz+1.2*pos),1.9),.0)*7.0;float f2 = max(.9/(10.0+32.0*pow(length(zxMp+0.99*pos),2.0)),.0)*0.35;float f22 = max(.9/(11.0+32.0*pow(length(zxMp+0.85*pos),2.0)),.0)*0.23;float f23 = max(.9/(12.0+32.0*pow(length(zxMp+0.95*pos),2.0)),.0)*0.6;vec2 ztX = mix(naz,zxMp, 0.1);float f4 = max(0.01-pow(length(ztX+0.4*pos),2.9),.0)*4.02;float f42 = max(0.0-pow(length(ztX+0.45*pos),2.9),.0)*4.1;float f43 = max(0.01-pow(length(ztX+0.5*pos),2.9),.0)*4.6;ztX = mix(naz,zxMp,-.4);float f5 = max(0.01-pow(length(ztX+0.1*pos),5.5),.0)*2.0;float f52 = max(0.01-pow(length(ztX+0.2*pos),5.5),.0)*2.0;float f53 = max(0.01-pow(length(ztX+0.1*pos),5.5),.0)*2.0;ztX = mix(naz,zxMp, 2.1);float f6 = max(0.01-pow(length(ztX-0.3*pos),1.61),.0)*3.159;float f62 = max(0.01-pow(length(ztX-0.325*pos),1.614),.0)*3.14;float f63 = max(0.01-pow(length(ztX-0.389*pos),1.623),.0)*3.12;vec3 c = vec3(glR(naz,pos, glareSize));vec2 prot;if(animated){prot = rtU(naz - pos, (iTime * 0.1));} else if(anamorphic){prot = rtU(naz - pos, 1.570796);} else {prot = naz - pos;}c += drwF(prot, (anamorphic ? flareSize * 10. : flareSize), 0.1, iTime, 1);c.r+=f1+f2+f4+f5+f6; c.g+=f1+f22+f42+f52+f62; c.b+=f1+f23+f43+f53+f63;c = c*1.3 * vec3(length(zxMp)+.09);c+=vec3(f0);return c;}
863
+ vec3 cc(vec3 clr, float fct,float fct2){float w = clr.x+clr.y+clr.z;return mix(clr,vec3(w)*fct,w*fct2);}float rnd(vec2 p){float f = fract(sin(dot(p, vec2(12.1234, 72.8392) )*45123.2));return f;}float rnd(float w){float f = fract(sin(w)*1000.);return f;}
864
+ float rShp(vec2 p, int N){float f;float a=atan(p.x,p.y)+.2;float b=6.28319/float(N);f=smoothstep(.5,.51, cos(floor(.5+a/b)*b-a)*length(p.xy)* 2.0 -ghostScale);return f;}
865
+ vec3 drC(vec2 p, float zsi, float dCy, vec3 clr, vec3 clr2, float ams2, vec2 esom){float l = length(p + esom*(ams2*2.))+zsi/2.;float l2 = length(p + esom*(ams2*4.))+zsi/3.;float c = max(0.01-pow(length(p + esom*ams2), zsi*ghostScale), 0.0)*10.;float c1 = max(0.001-pow(l-0.3, 1./40.)+sin(l*20.), 0.0)*3.;float c2 = max(0.09/pow(length(p-esom*ams2/.5)*1., .95), 0.0)/20.;float s = max(0.02-pow(rShp(p*5. + esom*ams2*5. + dCy, 6) , 1.), 0.0)*1.5;clr = cos(vec3(0.44, .24, .2)*8. + ams2*4.)*0.5+.5;vec3 f = c*clr;f += c1*clr;f += c2*clr;f += s*clr;return f-0.01;}
866
+ vec4 geLC(float x){return vec4(vec3(mix(mix(mix(mix(mix(mix(mix(mix(mix(mix(mix(mix(mix(mix(mix(vec3(0., 0., 0.),vec3(0., 0., 0.), smoothstep(0.0, 0.063, x)),vec3(0., 0., 0.), smoothstep(0.063, 0.125, x)),vec3(0.0, 0., 0.), smoothstep(0.125, 0.188, x)),vec3(0.188, 0.131, 0.116), smoothstep(0.188, 0.227, x)),vec3(0.31, 0.204, 0.537), smoothstep(0.227, 0.251, x)),vec3(0.192, 0.106, 0.286), smoothstep(0.251, 0.314, x)),vec3(0.102, 0.008, 0.341), smoothstep(0.314, 0.392, x)),vec3(0.086, 0.0, 0.141), smoothstep(0.392, 0.502, x)),vec3(1.0, 0.31, 0.0), smoothstep(0.502, 0.604, x)),vec3(.1, 0.1, 0.1), smoothstep(0.604, 0.643, x)),vec3(1.0, 0.929, 0.0), smoothstep(0.643, 0.761, x)),vec3(1.0, 0.086, 0.424), smoothstep(0.761, 0.847, x)),vec3(1.0, 0.49, 0.0), smoothstep(0.847, 0.89, x)),vec3(0.945, 0.275, 0.475), smoothstep(0.89, 0.941, x)),vec3(0.251, 0.275, 0.796), smoothstep(0.941, 1.0, x))),1.0);}
867
+ float diTN(vec2 p){vec2 f = fract(p);f = (f * f) * (3.0 - (2.0 * f));float n = dot(floor(p), vec2(1.0, 157.0));vec4 a = fract(sin(vec4(n + 0.0, n + 1.0, n + 157.0, n + 158.0)) * 43758.5453123);return mix(mix(a.x, a.y, f.x), mix(a.z, a.w, f.x), f.y);}
868
+ float fbm(vec2 p){const mat2 m = mat2(0.80, -0.60, 0.60, 0.80);float f = 0.0;f += 0.5000*diTN(p); p = m*p*2.02;f += 0.2500*diTN(p); p = m*p*2.03;f += 0.1250*diTN(p); p = m*p*2.01;f += 0.0625*diTN(p);return f/0.9375;}
869
+ vec4 geLS(vec2 p){vec2 pp = (p - vec2(0.5)) * 2.0;float a = atan(pp.y, pp.x);vec4 cp = vec4(sin(a * 1.0), length(pp), sin(a * 13.0), sin(a * 53.0));float d = sin(clamp(pow(length(vec2(0.5) - p) * 0.5 + haloScale /2., 5.0), 0.0, 1.0) * 3.14159);vec3 c = vec3(d) * vec3(fbm(cp.xy * 16.0) * fbm(cp.zw * 9.0) * max(max(max(max(0.5, sin(a * 1.0)), sin(a * 3.0) * 0.8), sin(a * 7.0) * 0.8), sin(a * 9.0) * 10.6));c *= vec3(mix(2.0, (sin(length(pp.xy) * 256.0) * 0.5) + 0.5, sin((clamp((length(pp.xy) - 0.875) / 0.1, 0.0, 1.0) + 0.0) * 2.0 * 3.14159) * 1.5) + 0.5) * 0.3275;return vec4(vec3(c * 1.0), d);}
870
+ vec4 geLD(vec2 p){p.xy += vec2(fbm(p.yx * 3.0), fbm(p.yx * 2.0)) * 0.0825;vec3 o = vec3(mix(0.125, 0.25, max(max(smoothstep(0.1, 0.0, length(p - vec2(0.25))),smoothstep(0.4, 0.0, length(p - vec2(0.75)))),smoothstep(0.8, 0.0, length(p - vec2(0.875, 0.125))))));o += vec3(max(fbm(p * 1.0) - 0.5, 0.0)) * 0.5;o += vec3(max(fbm(p * 2.0) - 0.5, 0.0)) * 0.5;o += vec3(max(fbm(p * 4.0) - 0.5, 0.0)) * 0.25;o += vec3(max(fbm(p * 8.0) - 0.75, 0.0)) * 1.0;o += vec3(max(fbm(p * 16.0) - 0.75, 0.0)) * 0.75;o += vec3(max(fbm(p * 64.0) - 0.75, 0.0)) * 0.5;return vec4(clamp(o, vec3(0.15), vec3(1.0)), 1.0);}
871
+ vec4 txL(sampler2D tex, vec2 xtC){if(((xtC.x < 0.) || (xtC.y < 0.)) || ((xtC.x > 1.) || (xtC.y > 1.))){return vec4(0.0);}else{return texture(tex, xtC); }}
872
+ vec4 txD(sampler2D tex, vec2 xtC, vec2 dir, vec3 ditn) {return vec4(txL(tex, (xtC + (dir * ditn.r))).r,txL(tex, (xtC + (dir * ditn.g))).g,txL(tex, (xtC + (dir * ditn.b))).b,1.0);}
873
+ vec4 strB(){vec2 aspXtc = vec2(1.0) - (((vxtC - vec2(0.5)) * vec2(1.0)) + vec2(0.5)); vec2 xtC = vec2(1.0) - vxtC; vec2 ghvc = (vec2(0.5) - xtC) * 0.3 - lensPosition; vec2 ghNm = normalize(ghvc * vec2(1.0)) * vec2(1.0);vec2 haloVec = normalize(ghvc) * 0.6;vec2 hlNm = ghNm * 0.6;vec2 texelSize = vec2(1.0) / vec2(iResolution.xy);vec3 ditn = vec3(-(texelSize.x * 1.5), 0.2, texelSize.x * 1.5);vec4 c = vec4(0.0);for (int i = 0; i < 8; i++) {vec2 offset = xtC + (ghvc * float(i));c += txD(lensDirtTexture, offset, ghNm, ditn) * pow(max(0.0, 1.0 - (length(vec2(0.5) - offset) / length(vec2(0.5)))), 10.0);}vec2 uyTrz = xtC + hlNm; return (c * geLC((length(vec2(0.5) - aspXtc) / length(vec2(haloScale))))) +(txD(lensDirtTexture, uyTrz, ghNm, ditn) * pow(max(0.0, 1.0 - (length(vec2(0.5) - uyTrz) / length(vec2(0.5)))), 10.0));}
874
+ void mainImage(vec4 v,vec2 r,out vec4 i){vec2 g=r-.5;g.y*=iResolution.y/iResolution.x;vec2 l=lensPosition*.5;l.y*=iResolution.y/iResolution.x;vec3 f=mLs(g,l)*20.*colorGain/256.;if(aditionalStreaks){vec3 o=vec3(.9,.2,.1),p=vec3(.3,.1,.9);for(float n=0.;n<10.;n++)f+=drC(g,pow(rnd(n*2e3)*2.8,.1)+1.41,0.,o+n,p+n,rnd(n*20.)*3.+.2-.5,lensPosition);}if(secondaryGhosts){vec3 n=vec3(0);n+=rHx(g,-lensPosition*.25,ghostScale*1.4,vec3(.25,.35,0));n+=rHx(g,lensPosition*.25,ghostScale*.5,vec3(1,.5,.5));n+=rHx(g,lensPosition*.1,ghostScale*1.6,vec3(1));n+=rHx(g,lensPosition*1.8,ghostScale*2.,vec3(0,.5,.75));n+=rHx(g,lensPosition*1.25,ghostScale*.8,vec3(1,1,.5));n+=rHx(g,-lensPosition*1.25,ghostScale*5.,vec3(.5,.5,.25));n+=fpow(1.-abs(distance(lensPosition*.8,g)-.7),.985)*colorGain/2100.;f+=n;}if(starBurst){vxtC=g+.5;vec4 n=geLD(g);float o=1.-clamp(0.5,0.,.5)*2.;n+=mix(n,pow(n*2.,vec4(2))*.5,o);float s=(g.x+g.y)*(1./6.);vec2 d=mat2(cos(s),-sin(s),sin(s),cos(s))*vxtC;n+=geLS(d)*2.;f+=clamp(n.xyz*strB().xyz,.01,1.);}i=enabled?vec4(mix(f,vec3(0),opacity)+v.xyz,v.w):vec4(v);}
875
+ `,
876
+ };
877
+ class LensFlareEffect extends Effect {
878
+ constructor({ blendFunction = BlendFunction.NORMAL, enabled = true, glareSize = 0.2, lensPosition = [0.01, 0.01], iResolution = [0, 0], starPoints = 6, flareSize = 0.01, flareSpeed = 0.01, flareShape = 0.01, animated = true, anamorphic = false, colorGain = new Color(20, 20, 20), lensDirtTexture = null, haloScale = 0.5, secondaryGhosts = true, aditionalStreaks = true, ghostScale = 0.0, opacity = 1.0, starBurst = false, } = {}) {
879
+ super('LensFlareEffect', LensFlareShader.fragmentShader, {
880
+ blendFunction,
881
+ uniforms: new Map([
882
+ ['enabled', new Uniform(enabled)],
883
+ ['glareSize', new Uniform(glareSize)],
884
+ ['lensPosition', new Uniform(lensPosition)],
885
+ ['iTime', new Uniform(0)],
886
+ ['iResolution', new Uniform(iResolution)],
887
+ ['starPoints', new Uniform(starPoints)],
888
+ ['flareSize', new Uniform(flareSize)],
889
+ ['flareSpeed', new Uniform(flareSpeed)],
890
+ ['flareShape', new Uniform(flareShape)],
891
+ ['animated', new Uniform(animated)],
892
+ ['anamorphic', new Uniform(anamorphic)],
893
+ ['colorGain', new Uniform(colorGain)],
894
+ ['lensDirtTexture', new Uniform(lensDirtTexture)],
895
+ ['haloScale', new Uniform(haloScale)],
896
+ ['secondaryGhosts', new Uniform(secondaryGhosts)],
897
+ ['aditionalStreaks', new Uniform(aditionalStreaks)],
898
+ ['ghostScale', new Uniform(ghostScale)],
899
+ ['starBurst', new Uniform(starBurst)],
900
+ ['opacity', new Uniform(opacity)],
901
+ ]),
902
+ });
478
903
  }
479
- set _tetrahedralInterpolation(tetrahedralInterpolation) {
480
- this.inputs.set({ tetrahedralInterpolation });
904
+ update(_renderer, _inputBuffer, deltaTime) {
905
+ const iTime = this.uniforms.get('iTime');
906
+ if (iTime) {
907
+ iTime.value += deltaTime;
908
+ }
481
909
  }
910
+ }
911
+ const defaultOptions$1 = {
912
+ position: new Vector3(-25, 6, -60),
913
+ followMouse: false,
914
+ smoothTime: 0.7,
915
+ };
916
+ class NgtpLensFlare {
482
917
  constructor() {
483
- this.inputs = signalStore({});
484
- this.effectRef = injectNgtRef();
485
- this.lut = this.inputs.select('lut');
486
- this.tetrahedralInterpolation = this.inputs.select('tetrahedralInterpolation');
487
- this.blendFunction = this.inputs.select('blendFunction');
488
- this.store = injectNgtStore();
489
- this.invalidate = this.store.select('invalidate');
490
- this.effect = computed(() => new LUT3DEffect(this.lut(), {
491
- blendFunction: this.blendFunction(),
492
- tetrahedralInterpolation: this.tetrahedralInterpolation(),
493
- }));
494
- this.setState();
495
- }
496
- setState() {
497
- effect(() => {
498
- const [effect, invalidate, lut, tetrahedralInterpolation] = [
499
- this.effect(),
500
- this.invalidate(),
501
- this.lut(),
502
- this.tetrahedralInterpolation(),
503
- ];
918
+ this.autoEffect = injectAutoEffect();
919
+ this.store = injectStore();
920
+ this.viewport = this.store.select('viewport');
921
+ this.raycaster = this.store.select('raycaster');
922
+ this.pointer = this.store.select('pointer');
923
+ this.composerApi = injectEffectComposerApi();
924
+ this.options = input(defaultOptions$1, { transform: mergeInputs(defaultOptions$1) });
925
+ this.projectedPosition = new Vector3();
926
+ this.mouse2d = new Vector2();
927
+ this.effect = computed(() => {
928
+ const { position: _, followMouse: __, smoothTime: ___, ...options } = this.options();
929
+ return new LensFlareEffect(options);
930
+ });
931
+ afterNextRender(() => {
932
+ this.autoEffect(() => {
933
+ const [effect, viewport] = [this.effect(), this.viewport()];
934
+ const iResolution = effect.uniforms.get('iResolution');
935
+ if (iResolution) {
936
+ iResolution.value.x = viewport.width;
937
+ iResolution.value.y = viewport.height;
938
+ }
939
+ });
940
+ });
941
+ injectBeforeRender(({ delta }) => {
942
+ const [effect] = [this.effect()];
504
943
  if (!effect)
505
944
  return;
506
- if (tetrahedralInterpolation)
507
- effect.tetrahedralInterpolation = tetrahedralInterpolation;
508
- if (lut)
509
- effect.lut = lut;
510
- invalidate();
945
+ const [{ followMouse, position, smoothTime }, pointer, { camera, scene }, raycaster] = [
946
+ this.options(),
947
+ this.pointer(),
948
+ this.composerApi(),
949
+ this.raycaster(),
950
+ ];
951
+ const uLensPosition = effect.uniforms.get('lensPosition');
952
+ const uOpacity = effect.uniforms.get('opacity');
953
+ if (!uLensPosition || !uOpacity)
954
+ return;
955
+ let target = 1;
956
+ if (followMouse) {
957
+ uLensPosition.value.x = pointer.x;
958
+ uLensPosition.value.y = pointer.y;
959
+ target = 0;
960
+ }
961
+ else {
962
+ this.projectedPosition.copy(position).project(camera);
963
+ if (this.projectedPosition.z > 1)
964
+ return;
965
+ uLensPosition.value.x = this.projectedPosition.x;
966
+ uLensPosition.value.y = this.projectedPosition.y;
967
+ this.mouse2d.set(this.projectedPosition.x, this.projectedPosition.y);
968
+ raycaster.setFromCamera(this.mouse2d, camera);
969
+ const intersects = raycaster.intersectObjects(scene.children, true);
970
+ const { object } = intersects[0] ?? {};
971
+ if (object) {
972
+ if (object.userData?.['lensflare'] === 'no-occlusion') {
973
+ target = 0;
974
+ }
975
+ else if (object instanceof Mesh) {
976
+ if (object.material.uniforms?._transmission?.value > 0.2) {
977
+ //Check for MeshTransmissionMaterial
978
+ target = 0.2;
979
+ }
980
+ else if (object.material._transmission && object.material._transmission > 0.2) {
981
+ //Check for MeshPhysicalMaterial with transmission setting
982
+ target = 0.2;
983
+ }
984
+ else if (object.material.transparent) {
985
+ // Check for OtherMaterials with transparent parameter
986
+ target = object.material.opacity;
987
+ }
988
+ }
989
+ }
990
+ }
991
+ easing.damp(uOpacity, 'value', target, smoothTime, delta);
511
992
  });
512
993
  }
513
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.2", ngImport: i0, type: NgtpLUT, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
514
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.2", type: NgtpLUT, isStandalone: true, selector: "ngtp-lut", inputs: { effectRef: "effectRef", _lut: ["lut", "_lut"], _blendFunction: ["blendFunction", "_blendFunction"], _tetrahedralInterpolation: ["tetrahedralInterpolation", "_tetrahedralInterpolation"] }, ngImport: i0, template: `
515
- <ngt-primitive *args="[effect()]" [ref]="effectRef" />
516
- `, isInline: true, dependencies: [{ kind: "directive", type: NgtArgs, selector: "ng-template[args]", inputs: ["args"] }] }); }
994
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: NgtpLensFlare, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
995
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "18.0.6", type: NgtpLensFlare, isStandalone: true, selector: "ngtp-lens-flare", inputs: { options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: `
996
+ <ngt-primitive *args="[effect()]" [dispose]="null" />
997
+ `, isInline: true, dependencies: [{ kind: "directive", type: NgtArgs, selector: "ng-template[args]", inputs: ["args"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
517
998
  }
518
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.2", ngImport: i0, type: NgtpLUT, decorators: [{
999
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: NgtpLensFlare, decorators: [{
519
1000
  type: Component,
520
1001
  args: [{
521
- selector: 'ngtp-lut',
1002
+ selector: 'ngtp-lens-flare',
522
1003
  standalone: true,
523
1004
  template: `
524
- <ngt-primitive *args="[effect()]" [ref]="effectRef" />
1005
+ <ngt-primitive *args="[effect()]" [dispose]="null" />
525
1006
  `,
526
1007
  imports: [NgtArgs],
527
1008
  schemas: [CUSTOM_ELEMENTS_SCHEMA],
1009
+ changeDetection: ChangeDetectionStrategy.OnPush,
528
1010
  }]
529
- }], ctorParameters: function () { return []; }, propDecorators: { effectRef: [{
530
- type: Input
531
- }], _lut: [{
532
- type: Input,
533
- args: [{ required: true, alias: 'lut' }]
534
- }], _blendFunction: [{
535
- type: Input,
536
- args: [{ alias: 'blendFunction' }]
537
- }], _tetrahedralInterpolation: [{
538
- type: Input,
539
- args: [{ alias: 'tetrahedralInterpolation' }]
540
- }] } });
1011
+ }], ctorParameters: () => [] });
1012
+
1013
+ class NgtpLUT {
1014
+ constructor() {
1015
+ this.autoEffect = injectAutoEffect();
1016
+ this.store = injectStore();
1017
+ this.invalidate = this.store.select('invalidate');
1018
+ this.options = input({});
1019
+ this.lut = pick(this.options, 'lut');
1020
+ this.effect = computed(() => {
1021
+ const [lut, { lut: _, ...options }] = [this.lut(), this.options()];
1022
+ return new LUT3DEffect(lut, options);
1023
+ });
1024
+ afterNextRender(() => {
1025
+ this.autoEffect(() => {
1026
+ const [effect, { lut, tetrahedralInterpolation }, invalidate] = [
1027
+ this.effect(),
1028
+ this.options(),
1029
+ this.invalidate(),
1030
+ ];
1031
+ if (tetrahedralInterpolation)
1032
+ effect.tetrahedralInterpolation = tetrahedralInterpolation;
1033
+ if (lut)
1034
+ effect.lut = lut;
1035
+ invalidate();
1036
+ });
1037
+ });
1038
+ }
1039
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: NgtpLUT, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
1040
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "18.0.6", type: NgtpLUT, isStandalone: true, selector: "ngtp-lut", inputs: { options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: `
1041
+ <ngt-primitive *args="[effect()]" [dispose]="null" />
1042
+ `, isInline: true, dependencies: [{ kind: "directive", type: NgtArgs, selector: "ng-template[args]", inputs: ["args"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
1043
+ }
1044
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: NgtpLUT, decorators: [{
1045
+ type: Component,
1046
+ args: [{
1047
+ selector: 'ngtp-lut',
1048
+ template: `
1049
+ <ngt-primitive *args="[effect()]" [dispose]="null" />
1050
+ `,
1051
+ imports: [NgtArgs],
1052
+ standalone: true,
1053
+ schemas: [CUSTOM_ELEMENTS_SCHEMA],
1054
+ changeDetection: ChangeDetectionStrategy.OnPush,
1055
+ }]
1056
+ }], ctorParameters: () => [] });
541
1057
 
542
1058
  extend({ NoiseEffect });
543
- class NgtpNoise extends NgtpEffect {
1059
+ class NgtpNoise {
544
1060
  constructor() {
545
- super(...arguments);
546
- this.defaultBlendFunction = BlendFunction.COLOR_DODGE;
1061
+ this.effect = inject(NgtpEffect, { host: true });
1062
+ this.options = input({});
547
1063
  }
548
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.2", ngImport: i0, type: NgtpNoise, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
549
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.2", type: NgtpNoise, isStandalone: true, selector: "ngtp-noise", usesInheritance: true, ngImport: i0, template: `
550
- <ngt-noise-effect ngtCompound *args="args()" [camera]="camera()" [ref]="effectRef">
1064
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: NgtpNoise, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
1065
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "18.0.6", type: NgtpNoise, isStandalone: true, selector: "ngtp-noise", inputs: { options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: false, transformFunction: null } }, providers: [provideDefaultEffectOptions({ blendFunction: BlendFunction.COLOR_DODGE })], hostDirectives: [{ directive: NgtpEffect, inputs: ["blendFunction", "blendFunction", "opacity", "opacity"] }], ngImport: i0, template: `
1066
+ <ngt-noise-effect *args="[options()]" [camera]="effect.camera()">
1067
+ <ngtp-effect-blend-mode />
551
1068
  <ng-content />
552
1069
  </ngt-noise-effect>
553
- `, isInline: true, dependencies: [{ kind: "directive", type: NgtArgs, selector: "ng-template[args]", inputs: ["args"] }] }); }
1070
+ `, isInline: true, dependencies: [{ kind: "directive", type: NgtArgs, selector: "ng-template[args]", inputs: ["args"] }, { kind: "component", type: NgtpEffectBlendMode, selector: "ngtp-effect-blend-mode" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
554
1071
  }
555
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.2", ngImport: i0, type: NgtpNoise, decorators: [{
1072
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: NgtpNoise, decorators: [{
556
1073
  type: Component,
557
1074
  args: [{
558
1075
  selector: 'ngtp-noise',
559
- standalone: true,
560
1076
  template: `
561
- <ngt-noise-effect ngtCompound *args="args()" [camera]="camera()" [ref]="effectRef">
1077
+ <ngt-noise-effect *args="[options()]" [camera]="effect.camera()">
1078
+ <ngtp-effect-blend-mode />
562
1079
  <ng-content />
563
1080
  </ngt-noise-effect>
564
1081
  `,
565
- imports: [NgtArgs],
1082
+ standalone: true,
566
1083
  schemas: [CUSTOM_ELEMENTS_SCHEMA],
1084
+ changeDetection: ChangeDetectionStrategy.OnPush,
1085
+ imports: [NgtArgs, NgtpEffectBlendMode],
1086
+ hostDirectives: [NgtpEffectHostDirective],
1087
+ providers: [provideDefaultEffectOptions({ blendFunction: BlendFunction.COLOR_DODGE })],
567
1088
  }]
568
1089
  }] });
569
1090
 
570
1091
  class NgtpPixelation {
571
1092
  constructor() {
572
- this.inputs = signalStore({ granularity: 30 });
573
- this.effectRef = injectNgtRef();
574
- this.granularity = this.inputs.select('granularity');
1093
+ this.options = input({ granularity: 5 }, { transform: mergeInputs({ granularity: 5 }) });
1094
+ this.granularity = pick(this.options, 'granularity');
575
1095
  this.effect = computed(() => new PixelationEffect(this.granularity()));
576
1096
  }
577
- set _granularity(granularity) {
578
- this.inputs.set({ granularity });
579
- }
580
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.2", ngImport: i0, type: NgtpPixelation, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
581
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.2", type: NgtpPixelation, isStandalone: true, selector: "ngtp-pixelation", inputs: { effectRef: "effectRef", _granularity: ["granularity", "_granularity"] }, ngImport: i0, template: `
582
- <ngt-primitive *args="[effect()]" [ref]="effectRef" />
583
- `, isInline: true, dependencies: [{ kind: "directive", type: NgtArgs, selector: "ng-template[args]", inputs: ["args"] }] }); }
1097
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: NgtpPixelation, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
1098
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "18.0.6", type: NgtpPixelation, isStandalone: true, selector: "ngtp-pixelation", inputs: { options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: `
1099
+ <ngt-primitive *args="[effect()]" />
1100
+ `, isInline: true, dependencies: [{ kind: "directive", type: NgtArgs, selector: "ng-template[args]", inputs: ["args"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
584
1101
  }
585
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.2", ngImport: i0, type: NgtpPixelation, decorators: [{
1102
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: NgtpPixelation, decorators: [{
586
1103
  type: Component,
587
1104
  args: [{
588
1105
  selector: 'ngtp-pixelation',
589
- standalone: true,
590
1106
  template: `
591
- <ngt-primitive *args="[effect()]" [ref]="effectRef" />
1107
+ <ngt-primitive *args="[effect()]" />
592
1108
  `,
593
- imports: [NgtArgs],
1109
+ standalone: true,
1110
+ changeDetection: ChangeDetectionStrategy.OnPush,
594
1111
  schemas: [CUSTOM_ELEMENTS_SCHEMA],
1112
+ imports: [NgtArgs],
595
1113
  }]
596
- }], propDecorators: { effectRef: [{
597
- type: Input
598
- }], _granularity: [{
599
- type: Input,
600
- args: [{ alias: 'granularity' }]
601
- }] } });
1114
+ }] });
602
1115
 
603
1116
  extend({ ScanlineEffect });
604
- class NgtpScanline extends NgtpEffect {
1117
+ const defaultOptions = {
1118
+ density: 1.25,
1119
+ };
1120
+ class NgtpScanline {
605
1121
  constructor() {
606
- super(...arguments);
607
- this.defaultBlendFunction = BlendFunction.OVERLAY;
1122
+ this.effect = inject(NgtpEffect, { host: true });
1123
+ this.options = input(defaultOptions, { transform: mergeInputs(defaultOptions) });
608
1124
  }
609
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.2", ngImport: i0, type: NgtpScanline, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
610
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.2", type: NgtpScanline, isStandalone: true, selector: "ngtp-scanline", usesInheritance: true, ngImport: i0, template: `
611
- <ngt-scanline-effect ngtCompound *args="args()" [camera]="camera()" [ref]="effectRef">
1125
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: NgtpScanline, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
1126
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "18.0.6", type: NgtpScanline, isStandalone: true, selector: "ngtp-scanline", inputs: { options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: false, transformFunction: null } }, providers: [provideDefaultEffectOptions({ blendFunction: BlendFunction.OVERLAY })], hostDirectives: [{ directive: NgtpEffect, inputs: ["blendFunction", "blendFunction", "opacity", "opacity"] }], ngImport: i0, template: `
1127
+ <ngt-scanline-effect *args="[options()]" [camera]="effect.camera()">
1128
+ <ngtp-effect-blend-mode />
612
1129
  <ng-content />
613
1130
  </ngt-scanline-effect>
614
- `, isInline: true, dependencies: [{ kind: "directive", type: NgtArgs, selector: "ng-template[args]", inputs: ["args"] }] }); }
1131
+ `, isInline: true, dependencies: [{ kind: "directive", type: NgtArgs, selector: "ng-template[args]", inputs: ["args"] }, { kind: "component", type: NgtpEffectBlendMode, selector: "ngtp-effect-blend-mode" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
615
1132
  }
616
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.2", ngImport: i0, type: NgtpScanline, decorators: [{
1133
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: NgtpScanline, decorators: [{
617
1134
  type: Component,
618
1135
  args: [{
619
1136
  selector: 'ngtp-scanline',
620
- standalone: true,
621
1137
  template: `
622
- <ngt-scanline-effect ngtCompound *args="args()" [camera]="camera()" [ref]="effectRef">
1138
+ <ngt-scanline-effect *args="[options()]" [camera]="effect.camera()">
1139
+ <ngtp-effect-blend-mode />
623
1140
  <ng-content />
624
1141
  </ngt-scanline-effect>
625
1142
  `,
626
- imports: [NgtArgs],
1143
+ standalone: true,
627
1144
  schemas: [CUSTOM_ELEMENTS_SCHEMA],
1145
+ changeDetection: ChangeDetectionStrategy.OnPush,
1146
+ imports: [NgtArgs, NgtpEffectBlendMode],
1147
+ hostDirectives: [NgtpEffectHostDirective],
1148
+ providers: [provideDefaultEffectOptions({ blendFunction: BlendFunction.OVERLAY })],
628
1149
  }]
629
1150
  }] });
630
1151
 
631
1152
  extend({ SepiaEffect });
632
- class NgtpSepia extends NgtpEffect {
633
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.2", ngImport: i0, type: NgtpSepia, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
634
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.2", type: NgtpSepia, isStandalone: true, selector: "ngtp-sepia", usesInheritance: true, ngImport: i0, template: `
635
- <ngt-sepia-effect ngtCompound *args="args()" [camera]="camera()" [ref]="effectRef">
1153
+ class NgtpSepia {
1154
+ constructor() {
1155
+ this.effect = inject(NgtpEffect, { host: true });
1156
+ this.options = input({});
1157
+ }
1158
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: NgtpSepia, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
1159
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "18.0.6", type: NgtpSepia, isStandalone: true, selector: "ngtp-sepia", inputs: { options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: false, transformFunction: null } }, hostDirectives: [{ directive: NgtpEffect, inputs: ["blendFunction", "blendFunction", "opacity", "opacity"] }], ngImport: i0, template: `
1160
+ <ngt-sepia-effect *args="[options()]" [camera]="effect.camera()">
1161
+ <ngtp-effect-blend-mode />
636
1162
  <ng-content />
637
1163
  </ngt-sepia-effect>
638
- `, isInline: true, dependencies: [{ kind: "directive", type: NgtArgs, selector: "ng-template[args]", inputs: ["args"] }] }); }
1164
+ `, isInline: true, dependencies: [{ kind: "directive", type: NgtArgs, selector: "ng-template[args]", inputs: ["args"] }, { kind: "component", type: NgtpEffectBlendMode, selector: "ngtp-effect-blend-mode" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
639
1165
  }
640
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.2", ngImport: i0, type: NgtpSepia, decorators: [{
1166
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: NgtpSepia, decorators: [{
641
1167
  type: Component,
642
1168
  args: [{
643
1169
  selector: 'ngtp-sepia',
644
- standalone: true,
645
1170
  template: `
646
- <ngt-sepia-effect ngtCompound *args="args()" [camera]="camera()" [ref]="effectRef">
1171
+ <ngt-sepia-effect *args="[options()]" [camera]="effect.camera()">
1172
+ <ngtp-effect-blend-mode />
647
1173
  <ng-content />
648
1174
  </ngt-sepia-effect>
649
1175
  `,
650
- imports: [NgtArgs],
1176
+ standalone: true,
651
1177
  schemas: [CUSTOM_ELEMENTS_SCHEMA],
1178
+ changeDetection: ChangeDetectionStrategy.OnPush,
1179
+ imports: [NgtArgs, NgtpEffectBlendMode],
1180
+ hostDirectives: [NgtpEffectHostDirective],
652
1181
  }]
653
1182
  }] });
654
1183
 
655
1184
  extend({ ShockWaveEffect });
656
- class NgtpShockWave extends NgtpEffect {
657
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.2", ngImport: i0, type: NgtpShockWave, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
658
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.2", type: NgtpShockWave, isStandalone: true, selector: "ngtp-shock-wave", usesInheritance: true, ngImport: i0, template: `
659
- <ngt-shock-wave-effect ngtCompound *args="args()" [camera]="camera()" [ref]="effectRef">
1185
+ class NgtpShockWave {
1186
+ constructor() {
1187
+ this.effect = inject(NgtpEffect, { host: true });
1188
+ this.options = input({});
1189
+ }
1190
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: NgtpShockWave, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
1191
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "18.0.6", type: NgtpShockWave, isStandalone: true, selector: "ngtp-shock-wave", inputs: { options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: false, transformFunction: null } }, hostDirectives: [{ directive: NgtpEffect, inputs: ["blendFunction", "blendFunction", "opacity", "opacity"] }], ngImport: i0, template: `
1192
+ <ngt-shock-wave-effect *args="[options()]" [camera]="effect.camera()">
1193
+ <ngtp-effect-blend-mode />
660
1194
  <ng-content />
661
1195
  </ngt-shock-wave-effect>
662
- `, isInline: true, dependencies: [{ kind: "directive", type: NgtArgs, selector: "ng-template[args]", inputs: ["args"] }] }); }
1196
+ `, isInline: true, dependencies: [{ kind: "directive", type: NgtArgs, selector: "ng-template[args]", inputs: ["args"] }, { kind: "component", type: NgtpEffectBlendMode, selector: "ngtp-effect-blend-mode" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
663
1197
  }
664
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.2", ngImport: i0, type: NgtpShockWave, decorators: [{
1198
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: NgtpShockWave, decorators: [{
665
1199
  type: Component,
666
1200
  args: [{
667
1201
  selector: 'ngtp-shock-wave',
668
- standalone: true,
669
1202
  template: `
670
- <ngt-shock-wave-effect ngtCompound *args="args()" [camera]="camera()" [ref]="effectRef">
1203
+ <ngt-shock-wave-effect *args="[options()]" [camera]="effect.camera()">
1204
+ <ngtp-effect-blend-mode />
671
1205
  <ng-content />
672
1206
  </ngt-shock-wave-effect>
673
1207
  `,
674
- imports: [NgtArgs],
1208
+ standalone: true,
675
1209
  schemas: [CUSTOM_ELEMENTS_SCHEMA],
1210
+ changeDetection: ChangeDetectionStrategy.OnPush,
1211
+ imports: [NgtArgs, NgtpEffectBlendMode],
1212
+ hostDirectives: [NgtpEffectHostDirective],
676
1213
  }]
677
1214
  }] });
678
1215
 
679
1216
  extend({ SMAAEffect });
680
- class NgtpSMAA extends NgtpEffect {
681
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.2", ngImport: i0, type: NgtpSMAA, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
682
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.2", type: NgtpSMAA, isStandalone: true, selector: "ngtp-SMAA", usesInheritance: true, ngImport: i0, template: `
683
- <ngt-SMAA-effect ngtCompound *args="args()" [camera]="camera()" [ref]="effectRef">
1217
+ class NgtpSMAA {
1218
+ constructor() {
1219
+ this.effect = inject(NgtpEffect, { host: true });
1220
+ this.options = input({});
1221
+ }
1222
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: NgtpSMAA, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
1223
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "18.0.6", type: NgtpSMAA, isStandalone: true, selector: "ngtp-smaa", inputs: { options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: false, transformFunction: null } }, hostDirectives: [{ directive: NgtpEffect, inputs: ["blendFunction", "blendFunction", "opacity", "opacity"] }], ngImport: i0, template: `
1224
+ <ngt-sMAA-effect *args="[options()]" [camera]="effect.camera()">
1225
+ <ngtp-effect-blend-mode />
684
1226
  <ng-content />
685
- </ngt-SMAA-effect>
686
- `, isInline: true, dependencies: [{ kind: "directive", type: NgtArgs, selector: "ng-template[args]", inputs: ["args"] }] }); }
1227
+ </ngt-sMAA-effect>
1228
+ `, isInline: true, dependencies: [{ kind: "directive", type: NgtArgs, selector: "ng-template[args]", inputs: ["args"] }, { kind: "component", type: NgtpEffectBlendMode, selector: "ngtp-effect-blend-mode" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
687
1229
  }
688
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.2", ngImport: i0, type: NgtpSMAA, decorators: [{
1230
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: NgtpSMAA, decorators: [{
689
1231
  type: Component,
690
1232
  args: [{
691
- selector: 'ngtp-SMAA',
692
- standalone: true,
1233
+ selector: 'ngtp-smaa',
693
1234
  template: `
694
- <ngt-SMAA-effect ngtCompound *args="args()" [camera]="camera()" [ref]="effectRef">
1235
+ <ngt-sMAA-effect *args="[options()]" [camera]="effect.camera()">
1236
+ <ngtp-effect-blend-mode />
695
1237
  <ng-content />
696
- </ngt-SMAA-effect>
1238
+ </ngt-sMAA-effect>
697
1239
  `,
698
- imports: [NgtArgs],
1240
+ standalone: true,
699
1241
  schemas: [CUSTOM_ELEMENTS_SCHEMA],
1242
+ changeDetection: ChangeDetectionStrategy.OnPush,
1243
+ imports: [NgtArgs, NgtpEffectBlendMode],
1244
+ hostDirectives: [NgtpEffectHostDirective],
700
1245
  }]
701
1246
  }] });
702
1247
 
703
- class NgtpSSAO {
1248
+ extend({ TiltShiftEffect });
1249
+ class NgtpTiltShift {
704
1250
  constructor() {
705
- this.inputs = signalStore({
706
- blendFunction: BlendFunction.MULTIPLY,
707
- samples: 30,
708
- rings: 4,
709
- distanceThreshold: 1.0,
710
- distanceFalloff: 0.0,
711
- rangeThreshold: 0.5,
712
- rangeFalloff: 0.1,
713
- luminanceInfluence: 0.9,
714
- radius: 20,
715
- bias: 0.5,
716
- intensity: 1.0,
717
- depthAwareUpsampling: true,
718
- });
719
- this.effectRef = injectNgtRef();
720
- this.effectComposerApi = injectNgtpEffectComposerApi();
721
- this.effect = computed(() => {
722
- const [state, { camera, normalPass, downSamplingPass, resolutionScale }] = [
723
- this.inputs.state(),
724
- this.effectComposerApi(),
725
- ];
726
- if (normalPass === null && downSamplingPass === null) {
727
- console.error('Please enable the NormalPass in the NgtpEffectComposer in order to use NgtpSSAO.');
728
- return null;
729
- }
730
- return new SSAOEffect(camera, normalPass && !downSamplingPass ? normalPass.texture : null, {
731
- ...state,
732
- // @ts-expect-error
733
- normalDepthBuffer: state.normalDepthBuffer || (downSamplingPass ? downSamplingPass.texture : null),
734
- resolutionScale: state.resolutionScale || (resolutionScale ?? 1),
735
- depthAwareUpsampling: state.depthAwareUpsampling ?? true,
736
- });
737
- });
738
- }
739
- set _blendFunction(blendFunction) {
740
- this.inputs.set({ blendFunction });
741
- }
742
- set _distanceScaling(distanceScaling) {
743
- this.inputs.set({ distanceScaling });
744
- }
745
- set _depthAwareUpsampling(depthAwareUpsampling) {
746
- this.inputs.set({ depthAwareUpsampling });
747
- }
748
- set _normalDepthBuffer(normalDepthBuffer) {
749
- this.inputs.set({ normalDepthBuffer });
750
- }
751
- set _samples(samples) {
752
- this.inputs.set({ samples });
753
- }
754
- set _rings(rings) {
755
- this.inputs.set({ rings });
756
- }
757
- set _worldDistanceThreshold(worldDistanceThreshold) {
758
- this.inputs.set({ worldDistanceThreshold });
1251
+ this.effect = inject(NgtpEffect, { host: true });
1252
+ this.options = input({});
759
1253
  }
760
- set _worldDistanceFalloff(worldDistanceFalloff) {
761
- this.inputs.set({ worldDistanceFalloff });
762
- }
763
- set _worldProximityThreshold(worldProximityThreshold) {
764
- this.inputs.set({ worldProximityThreshold });
765
- }
766
- set _worldProximityFalloff(worldProximityFalloff) {
767
- this.inputs.set({ worldProximityFalloff });
768
- }
769
- set _distanceThreshold(distanceThreshold) {
770
- this.inputs.set({ distanceThreshold });
771
- }
772
- set _distanceFalloff(distanceFalloff) {
773
- this.inputs.set({ distanceFalloff });
774
- }
775
- set _rangeThreshold(rangeThreshold) {
776
- this.inputs.set({ rangeThreshold });
777
- }
778
- set _rangeFalloff(rangeFalloff) {
779
- this.inputs.set({ rangeFalloff });
780
- }
781
- set _minRadiusScale(minRadiusScale) {
782
- this.inputs.set({ minRadiusScale });
783
- }
784
- set _luminanceInfluence(luminanceInfluence) {
785
- this.inputs.set({ luminanceInfluence });
786
- }
787
- set _radius(radius) {
788
- this.inputs.set({ radius });
789
- }
790
- set _intensity(intensity) {
791
- this.inputs.set({ intensity });
792
- }
793
- set _bias(bias) {
794
- this.inputs.set({ bias });
795
- }
796
- set _fade(fade) {
797
- this.inputs.set({ fade });
798
- }
799
- set _color(color) {
800
- this.inputs.set({ color });
801
- }
802
- set _resolutionScale(resolutionScale) {
803
- this.inputs.set({ resolutionScale });
804
- }
805
- set _resolutionX(resolutionX) {
806
- this.inputs.set({ resolutionX });
807
- }
808
- set _resolutionY(resolutionY) {
809
- this.inputs.set({ resolutionY });
810
- }
811
- set _width(width) {
812
- this.inputs.set({ width });
813
- }
814
- set _height(height) {
815
- this.inputs.set({ height });
816
- }
817
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.2", ngImport: i0, type: NgtpSSAO, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
818
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.2", type: NgtpSSAO, isStandalone: true, selector: "ngtp-SSAO", inputs: { effectRef: "effectRef", _blendFunction: ["blendFunction", "_blendFunction"], _distanceScaling: ["distanceScaling", "_distanceScaling"], _depthAwareUpsampling: ["depthAwareUpsampling", "_depthAwareUpsampling"], _normalDepthBuffer: ["normalDepthBuffer", "_normalDepthBuffer"], _samples: ["samples", "_samples"], _rings: ["rings", "_rings"], _worldDistanceThreshold: ["worldDistanceThreshold", "_worldDistanceThreshold"], _worldDistanceFalloff: ["worldDistanceFalloff", "_worldDistanceFalloff"], _worldProximityThreshold: ["worldProximityThreshold", "_worldProximityThreshold"], _worldProximityFalloff: ["worldProximityFalloff", "_worldProximityFalloff"], _distanceThreshold: ["distanceThreshold", "_distanceThreshold"], _distanceFalloff: ["distanceFalloff", "_distanceFalloff"], _rangeThreshold: ["rangeThreshold", "_rangeThreshold"], _rangeFalloff: ["rangeFalloff", "_rangeFalloff"], _minRadiusScale: ["minRadiusScale", "_minRadiusScale"], _luminanceInfluence: ["luminanceInfluence", "_luminanceInfluence"], _radius: ["radius", "_radius"], _intensity: ["intensity", "_intensity"], _bias: ["bias", "_bias"], _fade: ["fade", "_fade"], _color: ["color", "_color"], _resolutionScale: ["resolutionScale", "_resolutionScale"], _resolutionX: ["resolutionX", "_resolutionX"], _resolutionY: ["resolutionY", "_resolutionY"], _width: ["width", "_width"], _height: ["height", "_height"] }, ngImport: i0, template: `
819
- <ngt-primitive *args="[effect()]" [ref]="effectRef" />
820
- `, isInline: true, dependencies: [{ kind: "directive", type: NgtArgs, selector: "ng-template[args]", inputs: ["args"] }] }); }
1254
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: NgtpTiltShift, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
1255
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "18.0.6", type: NgtpTiltShift, isStandalone: true, selector: "ngtp-tilt-shift", inputs: { options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: false, transformFunction: null } }, providers: [provideDefaultEffectOptions({ blendFunction: BlendFunction.ADD })], hostDirectives: [{ directive: NgtpEffect, inputs: ["blendFunction", "blendFunction", "opacity", "opacity"] }], ngImport: i0, template: `
1256
+ <ngt-tilt-shift-effect *args="[options()]" [camera]="effect.camera()">
1257
+ <ngtp-effect-blend-mode />
1258
+ <ng-content />
1259
+ </ngt-tilt-shift-effect>
1260
+ `, isInline: true, dependencies: [{ kind: "directive", type: NgtArgs, selector: "ng-template[args]", inputs: ["args"] }, { kind: "component", type: NgtpEffectBlendMode, selector: "ngtp-effect-blend-mode" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
821
1261
  }
822
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.2", ngImport: i0, type: NgtpSSAO, decorators: [{
1262
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: NgtpTiltShift, decorators: [{
823
1263
  type: Component,
824
1264
  args: [{
825
- selector: 'ngtp-SSAO',
826
- standalone: true,
1265
+ selector: 'ngtp-tilt-shift',
827
1266
  template: `
828
- <ngt-primitive *args="[effect()]" [ref]="effectRef" />
1267
+ <ngt-tilt-shift-effect *args="[options()]" [camera]="effect.camera()">
1268
+ <ngtp-effect-blend-mode />
1269
+ <ng-content />
1270
+ </ngt-tilt-shift-effect>
829
1271
  `,
830
- imports: [NgtArgs],
1272
+ standalone: true,
831
1273
  schemas: [CUSTOM_ELEMENTS_SCHEMA],
1274
+ changeDetection: ChangeDetectionStrategy.OnPush,
1275
+ imports: [NgtArgs, NgtpEffectBlendMode],
1276
+ hostDirectives: [NgtpEffectHostDirective],
1277
+ providers: [provideDefaultEffectOptions({ blendFunction: BlendFunction.ADD })],
832
1278
  }]
833
- }], propDecorators: { effectRef: [{
834
- type: Input
835
- }], _blendFunction: [{
836
- type: Input,
837
- args: [{ alias: 'blendFunction' }]
838
- }], _distanceScaling: [{
839
- type: Input,
840
- args: [{ alias: 'distanceScaling' }]
841
- }], _depthAwareUpsampling: [{
842
- type: Input,
843
- args: [{ alias: 'depthAwareUpsampling' }]
844
- }], _normalDepthBuffer: [{
845
- type: Input,
846
- args: [{ alias: 'normalDepthBuffer' }]
847
- }], _samples: [{
848
- type: Input,
849
- args: [{ alias: 'samples' }]
850
- }], _rings: [{
851
- type: Input,
852
- args: [{ alias: 'rings' }]
853
- }], _worldDistanceThreshold: [{
854
- type: Input,
855
- args: [{ alias: 'worldDistanceThreshold' }]
856
- }], _worldDistanceFalloff: [{
857
- type: Input,
858
- args: [{ alias: 'worldDistanceFalloff' }]
859
- }], _worldProximityThreshold: [{
860
- type: Input,
861
- args: [{ alias: 'worldProximityThreshold' }]
862
- }], _worldProximityFalloff: [{
863
- type: Input,
864
- args: [{ alias: 'worldProximityFalloff' }]
865
- }], _distanceThreshold: [{
866
- type: Input,
867
- args: [{ alias: 'distanceThreshold' }]
868
- }], _distanceFalloff: [{
869
- type: Input,
870
- args: [{ alias: 'distanceFalloff' }]
871
- }], _rangeThreshold: [{
872
- type: Input,
873
- args: [{ alias: 'rangeThreshold' }]
874
- }], _rangeFalloff: [{
875
- type: Input,
876
- args: [{ alias: 'rangeFalloff' }]
877
- }], _minRadiusScale: [{
878
- type: Input,
879
- args: [{ alias: 'minRadiusScale' }]
880
- }], _luminanceInfluence: [{
881
- type: Input,
882
- args: [{ alias: 'luminanceInfluence' }]
883
- }], _radius: [{
884
- type: Input,
885
- args: [{ alias: 'radius' }]
886
- }], _intensity: [{
887
- type: Input,
888
- args: [{ alias: 'intensity' }]
889
- }], _bias: [{
890
- type: Input,
891
- args: [{ alias: 'bias' }]
892
- }], _fade: [{
893
- type: Input,
894
- args: [{ alias: 'fade' }]
895
- }], _color: [{
896
- type: Input,
897
- args: [{ alias: 'color' }]
898
- }], _resolutionScale: [{
899
- type: Input,
900
- args: [{ alias: 'resolutionScale' }]
901
- }], _resolutionX: [{
902
- type: Input,
903
- args: [{ alias: 'resolutionX' }]
904
- }], _resolutionY: [{
905
- type: Input,
906
- args: [{ alias: 'resolutionY' }]
907
- }], _width: [{
908
- type: Input,
909
- args: [{ alias: 'width' }]
910
- }], _height: [{
911
- type: Input,
912
- args: [{ alias: 'height' }]
913
- }] } });
1279
+ }] });
914
1280
 
915
- extend({ TiltShiftEffect });
916
- class NgtpTiltShift extends NgtpEffect {
1281
+ const TiltShiftShader = {
1282
+ fragmentShader: `
1283
+
1284
+ // original shader by Evan Wallace
1285
+
1286
+ #define MAX_ITERATIONS 100
1287
+
1288
+ uniform float blur;
1289
+ uniform float taper;
1290
+ uniform vec2 start;
1291
+ uniform vec2 end;
1292
+ uniform vec2 direction;
1293
+ uniform int samples;
1294
+
1295
+ float random(vec3 scale, float seed) {
1296
+ /* use the fragment position for a different seed per-pixel */
1297
+ return fract(sin(dot(gl_FragCoord.xyz + seed, scale)) * 43758.5453 + seed);
1298
+ }
1299
+
1300
+ void mainImage(const in vec4 inputColor, const in vec2 uv, out vec4 outputColor) {
1301
+ vec4 color = vec4(0.0);
1302
+ float total = 0.0;
1303
+ vec2 startPixel = vec2(start.x * resolution.x, start.y * resolution.y);
1304
+ vec2 endPixel = vec2(end.x * resolution.x, end.y * resolution.y);
1305
+ float f_samples = float(samples);
1306
+ float half_samples = f_samples / 2.0;
1307
+
1308
+ // use screen diagonal to normalize blur radii
1309
+ float maxScreenDistance = distance(vec2(0.0), resolution); // diagonal distance
1310
+ float gradientRadius = taper * (maxScreenDistance);
1311
+ float blurRadius = blur * (maxScreenDistance / 16.0);
1312
+
1313
+ /* randomize the lookup values to hide the fixed number of samples */
1314
+ float offset = random(vec3(12.9898, 78.233, 151.7182), 0.0);
1315
+ vec2 normal = normalize(vec2(startPixel.y - endPixel.y, endPixel.x - startPixel.x));
1316
+ float radius = smoothstep(0.0, 1.0, abs(dot(uv * resolution - startPixel, normal)) / gradientRadius) * blurRadius;
1317
+
1318
+ #pragma unroll_loop_start
1319
+ for (int i = 0; i <= MAX_ITERATIONS; i++) {
1320
+ if (i >= samples) { break; } // return early if over sample count
1321
+ float f_i = float(i);
1322
+ float s_i = -half_samples + f_i;
1323
+ float percent = (s_i + offset - 0.5) / half_samples;
1324
+ float weight = 1.0 - abs(percent);
1325
+ vec4 sample_i = texture2D(inputBuffer, uv + normalize(direction) / resolution * percent * radius);
1326
+ /* switch to pre-multiplied alpha to correctly blur transparent images */
1327
+ sample_i.rgb *= sample_i.a;
1328
+ color += sample_i * weight;
1329
+ total += weight;
1330
+ }
1331
+ #pragma unroll_loop_end
1332
+
1333
+ outputColor = color / total;
1334
+
1335
+ /* switch back from pre-multiplied alpha */
1336
+ outputColor.rgb /= outputColor.a + 0.00001;
1337
+ }
1338
+ `,
1339
+ };
1340
+ class TiltShift2Effect extends Effect {
1341
+ constructor({ blendFunction = BlendFunction.NORMAL, blur = 0.15, // [0, 1], can go beyond 1 for extra
1342
+ taper = 0.5, // [0, 1], can go beyond 1 for extra
1343
+ start = [0.5, 0.0], // [0,1] percentage x,y of screenspace
1344
+ end = [0.5, 1.0], // [0,1] percentage x,y of screenspace
1345
+ samples = 10.0, // number of blur samples
1346
+ direction = [1, 1], // direction of blur
1347
+ } = {}) {
1348
+ super('TiltShiftEffect', TiltShiftShader.fragmentShader, {
1349
+ blendFunction,
1350
+ attributes: EffectAttribute.CONVOLUTION,
1351
+ uniforms: new Map([
1352
+ ['blur', new Uniform(blur)],
1353
+ ['taper', new Uniform(taper)],
1354
+ ['start', new Uniform(start)],
1355
+ ['end', new Uniform(end)],
1356
+ ['samples', new Uniform(samples)],
1357
+ ['direction', new Uniform(direction)],
1358
+ ]),
1359
+ });
1360
+ }
1361
+ }
1362
+ extend({ TiltShift2Effect });
1363
+ class NgtpTiltShift2 {
917
1364
  constructor() {
918
- super(...arguments);
919
- this.defaultBlendFunction = BlendFunction.ADD;
1365
+ this.effect = inject(NgtpEffect, { host: true });
1366
+ this.options = input({});
920
1367
  }
921
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.2", ngImport: i0, type: NgtpTiltShift, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
922
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.2", type: NgtpTiltShift, isStandalone: true, selector: "ngtp-tilt-shift", usesInheritance: true, ngImport: i0, template: `
923
- <ngt-tilt-shift-effect ngtCompound *args="args()" [camera]="camera()" [ref]="effectRef">
1368
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: NgtpTiltShift2, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
1369
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "18.0.6", type: NgtpTiltShift2, isStandalone: true, selector: "ngtp-tilt-shift2", inputs: { options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: false, transformFunction: null } }, providers: [provideDefaultEffectOptions({ blendFunction: BlendFunction.NORMAL })], hostDirectives: [{ directive: NgtpEffect, inputs: ["blendFunction", "blendFunction", "opacity", "opacity"] }], ngImport: i0, template: `
1370
+ <ngt-tilt-shift2-effect *args="[options()]" [camera]="effect.camera()">
1371
+ <ngtp-effect-blend-mode />
924
1372
  <ng-content />
925
- </ngt-tilt-shift-effect>
926
- `, isInline: true, dependencies: [{ kind: "directive", type: NgtArgs, selector: "ng-template[args]", inputs: ["args"] }] }); }
1373
+ </ngt-tilt-shift2-effect>
1374
+ `, isInline: true, dependencies: [{ kind: "directive", type: NgtArgs, selector: "ng-template[args]", inputs: ["args"] }, { kind: "component", type: NgtpEffectBlendMode, selector: "ngtp-effect-blend-mode" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
927
1375
  }
928
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.2", ngImport: i0, type: NgtpTiltShift, decorators: [{
1376
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: NgtpTiltShift2, decorators: [{
929
1377
  type: Component,
930
1378
  args: [{
931
- selector: 'ngtp-tilt-shift',
1379
+ selector: 'ngtp-tilt-shift2',
932
1380
  standalone: true,
933
1381
  template: `
934
- <ngt-tilt-shift-effect ngtCompound *args="args()" [camera]="camera()" [ref]="effectRef">
1382
+ <ngt-tilt-shift2-effect *args="[options()]" [camera]="effect.camera()">
1383
+ <ngtp-effect-blend-mode />
935
1384
  <ng-content />
936
- </ngt-tilt-shift-effect>
1385
+ </ngt-tilt-shift2-effect>
937
1386
  `,
938
- imports: [NgtArgs],
939
1387
  schemas: [CUSTOM_ELEMENTS_SCHEMA],
1388
+ changeDetection: ChangeDetectionStrategy.OnPush,
1389
+ imports: [NgtArgs, NgtpEffectBlendMode],
1390
+ hostDirectives: [NgtpEffectHostDirective],
1391
+ providers: [provideDefaultEffectOptions({ blendFunction: BlendFunction.NORMAL })],
940
1392
  }]
941
1393
  }] });
942
1394
 
943
- extend({ ToneMappingEffect });
944
- class NgtpToneMapping extends NgtpEffect {
945
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.2", ngImport: i0, type: NgtpToneMapping, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
946
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.2", type: NgtpToneMapping, isStandalone: true, selector: "ngtp-tone-mapping", usesInheritance: true, ngImport: i0, template: `
947
- <ngt-tone-mapping-effect ngtCompound *args="args()" [camera]="camera()" [ref]="effectRef">
1395
+ extend({ VignetteEffect });
1396
+ class NgtpVignette {
1397
+ constructor() {
1398
+ this.effect = inject(NgtpEffect, { host: true });
1399
+ this.options = input({});
1400
+ }
1401
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: NgtpVignette, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
1402
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "18.0.6", type: NgtpVignette, isStandalone: true, selector: "ngtp-vignette", inputs: { options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: false, transformFunction: null } }, hostDirectives: [{ directive: NgtpEffect, inputs: ["blendFunction", "blendFunction", "opacity", "opacity"] }], ngImport: i0, template: `
1403
+ <ngt-vignette-effect *args="[options()]" [camera]="effect.camera()">
1404
+ <ngtp-effect-blend-mode />
948
1405
  <ng-content />
949
- </ngt-tone-mapping-effect>
950
- `, isInline: true, dependencies: [{ kind: "directive", type: NgtArgs, selector: "ng-template[args]", inputs: ["args"] }] }); }
1406
+ </ngt-vignette-effect>
1407
+ `, isInline: true, dependencies: [{ kind: "directive", type: NgtArgs, selector: "ng-template[args]", inputs: ["args"] }, { kind: "component", type: NgtpEffectBlendMode, selector: "ngtp-effect-blend-mode" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
951
1408
  }
952
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.2", ngImport: i0, type: NgtpToneMapping, decorators: [{
1409
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: NgtpVignette, decorators: [{
953
1410
  type: Component,
954
1411
  args: [{
955
- selector: 'ngtp-tone-mapping',
956
- standalone: true,
1412
+ selector: 'ngtp-vignette',
957
1413
  template: `
958
- <ngt-tone-mapping-effect ngtCompound *args="args()" [camera]="camera()" [ref]="effectRef">
1414
+ <ngt-vignette-effect *args="[options()]" [camera]="effect.camera()">
1415
+ <ngtp-effect-blend-mode />
959
1416
  <ng-content />
960
- </ngt-tone-mapping-effect>
1417
+ </ngt-vignette-effect>
961
1418
  `,
962
- imports: [NgtArgs],
1419
+ standalone: true,
963
1420
  schemas: [CUSTOM_ELEMENTS_SCHEMA],
1421
+ changeDetection: ChangeDetectionStrategy.OnPush,
1422
+ imports: [NgtArgs, NgtpEffectBlendMode],
1423
+ hostDirectives: [NgtpEffectHostDirective],
964
1424
  }]
965
1425
  }] });
966
1426
 
967
- extend({ VignetteEffect });
968
- class NgtpVignette extends NgtpEffect {
969
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.2", ngImport: i0, type: NgtpVignette, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
970
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.2", type: NgtpVignette, isStandalone: true, selector: "ngtp-vignette", usesInheritance: true, ngImport: i0, template: `
971
- <ngt-vignette-effect ngtCompound *args="args()" [camera]="camera()" [ref]="effectRef">
1427
+ const WaterShader = {
1428
+ fragmentShader: `
1429
+ uniform float factor;
1430
+ void mainImage(const in vec4 inputColor, const in vec2 uv, out vec4 outputColor) {
1431
+ vec2 vUv = uv;
1432
+ float frequency = 6.0 * factor;
1433
+ float amplitude = 0.015 * factor;
1434
+ float x = vUv.y * frequency + time * .7;
1435
+ float y = vUv.x * frequency + time * .3;
1436
+ vUv.x += cos(x+y) * amplitude * cos(y);
1437
+ vUv.y += sin(x-y) * amplitude * cos(y);
1438
+ vec4 rgba = texture2D(inputBuffer, vUv);
1439
+ outputColor = rgba;
1440
+ }`,
1441
+ };
1442
+ class WaterEffect extends Effect {
1443
+ constructor({ blendFunction = BlendFunction.NORMAL, factor = 0 } = {}) {
1444
+ super('WaterEffect', WaterShader.fragmentShader, {
1445
+ blendFunction,
1446
+ attributes: EffectAttribute.CONVOLUTION,
1447
+ uniforms: new Map([['factor', new Uniform(factor)]]),
1448
+ });
1449
+ }
1450
+ }
1451
+ extend({ WaterEffect });
1452
+ class NgtpWater {
1453
+ constructor() {
1454
+ this.effect = inject(NgtpEffect, { host: true });
1455
+ this.options = input({});
1456
+ }
1457
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: NgtpWater, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
1458
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "18.0.6", type: NgtpWater, isStandalone: true, selector: "ngtp-water", inputs: { options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: false, transformFunction: null } }, providers: [provideDefaultEffectOptions({ blendFunction: BlendFunction.NORMAL })], hostDirectives: [{ directive: NgtpEffect, inputs: ["blendFunction", "blendFunction", "opacity", "opacity"] }], ngImport: i0, template: `
1459
+ <ngt-water-effect *args="[options()]" [camera]="effect.camera()">
1460
+ <ngtp-effect-blend-mode />
972
1461
  <ng-content />
973
- </ngt-vignette-effect>
974
- `, isInline: true, dependencies: [{ kind: "directive", type: NgtArgs, selector: "ng-template[args]", inputs: ["args"] }] }); }
1462
+ </ngt-water-effect>
1463
+ `, isInline: true, dependencies: [{ kind: "directive", type: NgtArgs, selector: "ng-template[args]", inputs: ["args"] }, { kind: "component", type: NgtpEffectBlendMode, selector: "ngtp-effect-blend-mode" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
975
1464
  }
976
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.2", ngImport: i0, type: NgtpVignette, decorators: [{
1465
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: NgtpWater, decorators: [{
977
1466
  type: Component,
978
1467
  args: [{
979
- selector: 'ngtp-vignette',
1468
+ selector: 'ngtp-water',
980
1469
  standalone: true,
981
1470
  template: `
982
- <ngt-vignette-effect ngtCompound *args="args()" [camera]="camera()" [ref]="effectRef">
1471
+ <ngt-water-effect *args="[options()]" [camera]="effect.camera()">
1472
+ <ngtp-effect-blend-mode />
983
1473
  <ng-content />
984
- </ngt-vignette-effect>
1474
+ </ngt-water-effect>
985
1475
  `,
986
- imports: [NgtArgs],
987
1476
  schemas: [CUSTOM_ELEMENTS_SCHEMA],
1477
+ changeDetection: ChangeDetectionStrategy.OnPush,
1478
+ imports: [NgtArgs, NgtpEffectBlendMode],
1479
+ hostDirectives: [NgtpEffectHostDirective],
1480
+ providers: [provideDefaultEffectOptions({ blendFunction: BlendFunction.NORMAL })],
988
1481
  }]
989
1482
  }] });
990
1483
 
@@ -992,5 +1485,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.2", ngImpor
992
1485
  * Generated bundle index. Do not edit.
993
1486
  */
994
1487
 
995
- export { NgtpBloom, NgtpBrightnessContrast, NgtpColorDepth, NgtpDepth, NgtpDotScreen, NgtpEffect, NgtpEffectComposer, NgtpHueSaturation, NgtpLUT, NgtpNoise, NgtpPixelation, NgtpSMAA, NgtpSSAO, NgtpScanline, NgtpSepia, NgtpShockWave, NgtpTiltShift, NgtpToneMapping, NgtpVignette, injectNgtpEffectComposerApi, provideNgtpEffectComposerApi };
1488
+ export { ASCIIEffect, LensFlareEffect, NgtpASCII, NgtpBloom, NgtpBrightnessContrast, NgtpChromaticAberration, NgtpColorAverage, NgtpColorDepth, NgtpDepth, NgtpDepthOfField, NgtpDotScreen, NgtpEffect, NgtpEffectBlendMode, NgtpEffectComposer, NgtpEffectHostDirective, NgtpFXAA, NgtpGlitch, NgtpGodRays, NgtpGrid, NgtpHueSaturation, NgtpLUT, NgtpLensFlare, NgtpNoise, NgtpPixelation, NgtpSMAA, NgtpScanline, NgtpSepia, NgtpShockWave, NgtpTiltShift, NgtpTiltShift2, NgtpVignette, NgtpWater, TiltShift2Effect, WaterEffect, injectDefaultEffectOptions, injectEffectComposerApi, provideDefaultEffectOptions, provideEffectComposerApi };
996
1489
  //# sourceMappingURL=angular-three-postprocessing.mjs.map