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