angular-three-postprocessing 2.0.0-beta.29 → 2.0.0-beta.291
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 +1276 -659
- 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 -74
- package/esm2022/lib/effects/noise/noise.mjs +0 -33
- package/esm2022/lib/effects/pixelation/pixelation.mjs +0 -37
- 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 -217
- 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.1.3", ngImport: i0, type: NgtpEffectBlendMode, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
18
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.1.3", 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.1.3", 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.1.3", ngImport: i0, type: NgtpEffect, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
50
|
+
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "18.1.3", 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.1.3", 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,766 +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.2.3", ngImport: i0, type: NgtpEffectComposer, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
268
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.3", 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.1.3", ngImport: i0, type: NgtpEffectComposer, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
217
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "18.1.3", 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.1.3", 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 = `
|
|
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.1.3", ngImport: i0, type: NgtpASCII, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
334
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "18.1.3", 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.1.3", 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.1.3", ngImport: i0, type: NgtpBloom, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
359
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "18.1.3", 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.1.3", 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.1.3", ngImport: i0, type: NgtpBrightnessContrast, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
392
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "18.1.3", 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.1.3", 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.1.3", ngImport: i0, type: NgtpChromaticAberration, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
424
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "18.1.3", 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.1.3", 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.1.3", ngImport: i0, type: NgtpColorAverage, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
455
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "18.1.3", 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.1.3", 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.1.3", ngImport: i0, type: NgtpColorDepth, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
484
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "18.1.3", 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.1.3", 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.1.3", ngImport: i0, type: NgtpDepth, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
516
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "18.1.3", 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.1.3", 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.1.3", ngImport: i0, type: NgtpDepthOfField, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
572
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "18.1.3", 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.1.3", 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.1.3", ngImport: i0, type: NgtpDotScreen, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
597
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "18.1.3", 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.1.3", 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,
|
|
615
|
+
schemas: [CUSTOM_ELEMENTS_SCHEMA],
|
|
616
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
617
|
+
imports: [NgtArgs, NgtpEffectBlendMode],
|
|
618
|
+
hostDirectives: [NgtpEffectHostDirective],
|
|
619
|
+
}]
|
|
620
|
+
}] });
|
|
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.1.3", ngImport: i0, type: NgtpFXAA, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
629
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "18.1.3", 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.1.3", 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,
|
|
444
647
|
schemas: [CUSTOM_ELEMENTS_SCHEMA],
|
|
648
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
649
|
+
imports: [NgtArgs, NgtpEffectBlendMode],
|
|
650
|
+
hostDirectives: [NgtpEffectHostDirective],
|
|
445
651
|
}]
|
|
446
652
|
}] });
|
|
447
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.1.3", ngImport: i0, type: NgtpGlitch, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
693
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "18.1.3", 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.1.3", 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.1.3", ngImport: i0, type: NgtpGodRays, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
728
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "18.1.3", 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.1.3", 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.1.3", ngImport: i0, type: NgtpGrid, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
765
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "18.1.3", 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.1.3", 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.1.3", ngImport: i0, type: NgtpHueSaturation, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
790
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "18.1.3", 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.1.3", 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: "
|
|
515
|
-
<ngt-primitive *args="[effect()]" [
|
|
516
|
-
`, isInline: true, dependencies: [{ kind: "directive", type: NgtArgs, selector: "ng-template[args]", inputs: ["args"] }] }); }
|
|
982
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.3", ngImport: i0, type: NgtpLensFlare, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
983
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "18.1.3", 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 }); }
|
|
517
986
|
}
|
|
518
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
987
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.3", ngImport: i0, type: NgtpLensFlare, decorators: [{
|
|
519
988
|
type: Component,
|
|
520
989
|
args: [{
|
|
521
|
-
selector: 'ngtp-
|
|
990
|
+
selector: 'ngtp-lens-flare',
|
|
522
991
|
standalone: true,
|
|
523
992
|
template: `
|
|
524
|
-
<ngt-primitive *args="[effect()]" [
|
|
993
|
+
<ngt-primitive *args="[effect()]" [parameters]="{ dispose: null }" />
|
|
525
994
|
`,
|
|
526
995
|
imports: [NgtArgs],
|
|
527
996
|
schemas: [CUSTOM_ELEMENTS_SCHEMA],
|
|
997
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
528
998
|
}]
|
|
529
|
-
}], ctorParameters:
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
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.1.3", ngImport: i0, type: NgtpLUT, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
1028
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "18.1.3", 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.1.3", 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: () => [] });
|
|
541
1045
|
|
|
542
1046
|
extend({ NoiseEffect });
|
|
543
|
-
class NgtpNoise
|
|
1047
|
+
class NgtpNoise {
|
|
544
1048
|
constructor() {
|
|
545
|
-
|
|
546
|
-
this.
|
|
1049
|
+
this.effect = inject(NgtpEffect, { host: true });
|
|
1050
|
+
this.options = input({});
|
|
547
1051
|
}
|
|
548
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
549
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "
|
|
550
|
-
<ngt-noise-effect
|
|
1052
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.3", ngImport: i0, type: NgtpNoise, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
1053
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "18.1.3", 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 />
|
|
551
1056
|
<ng-content />
|
|
552
1057
|
</ngt-noise-effect>
|
|
553
|
-
`, 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 }); }
|
|
554
1059
|
}
|
|
555
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
1060
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.3", ngImport: i0, type: NgtpNoise, decorators: [{
|
|
556
1061
|
type: Component,
|
|
557
1062
|
args: [{
|
|
558
1063
|
selector: 'ngtp-noise',
|
|
559
|
-
standalone: true,
|
|
560
1064
|
template: `
|
|
561
|
-
<ngt-noise-effect
|
|
1065
|
+
<ngt-noise-effect *args="[options()]" [camera]="effect.camera()">
|
|
1066
|
+
<ngtp-effect-blend-mode />
|
|
562
1067
|
<ng-content />
|
|
563
1068
|
</ngt-noise-effect>
|
|
564
1069
|
`,
|
|
565
|
-
|
|
1070
|
+
standalone: true,
|
|
566
1071
|
schemas: [CUSTOM_ELEMENTS_SCHEMA],
|
|
1072
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
1073
|
+
imports: [NgtArgs, NgtpEffectBlendMode],
|
|
1074
|
+
hostDirectives: [NgtpEffectHostDirective],
|
|
1075
|
+
providers: [provideDefaultEffectOptions({ blendFunction: BlendFunction.COLOR_DODGE })],
|
|
567
1076
|
}]
|
|
568
1077
|
}] });
|
|
569
1078
|
|
|
570
|
-
|
|
1079
|
+
const defaultOptions$1 = {
|
|
1080
|
+
selectionLayer: 10,
|
|
1081
|
+
};
|
|
1082
|
+
class NgtpOutline {
|
|
571
1083
|
constructor() {
|
|
572
|
-
this.
|
|
573
|
-
this.
|
|
574
|
-
this.
|
|
575
|
-
this.
|
|
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
|
+
});
|
|
576
1174
|
}
|
|
577
|
-
|
|
578
|
-
|
|
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
|
+
};
|
|
579
1195
|
}
|
|
580
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
581
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "
|
|
582
|
-
<ngt-primitive *args="[effect()]"
|
|
583
|
-
`, isInline: true, dependencies: [{ kind: "directive", type: NgtArgs, selector: "ng-template[args]", inputs: ["args"] }] }); }
|
|
1196
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.3", ngImport: i0, type: NgtpOutline, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
1197
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "18.1.3", 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 }); }
|
|
584
1200
|
}
|
|
585
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
1201
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.3", ngImport: i0, type: NgtpOutline, decorators: [{
|
|
586
1202
|
type: Component,
|
|
587
1203
|
args: [{
|
|
588
|
-
selector: 'ngtp-
|
|
1204
|
+
selector: 'ngtp-outline',
|
|
589
1205
|
standalone: true,
|
|
590
1206
|
template: `
|
|
591
|
-
<ngt-primitive *args="[effect()]"
|
|
1207
|
+
<ngt-primitive *args="[effect()]" />
|
|
592
1208
|
`,
|
|
1209
|
+
schemas: [CUSTOM_ELEMENTS_SCHEMA],
|
|
1210
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
593
1211
|
imports: [NgtArgs],
|
|
1212
|
+
}]
|
|
1213
|
+
}], ctorParameters: () => [] });
|
|
1214
|
+
|
|
1215
|
+
class NgtpPixelation {
|
|
1216
|
+
constructor() {
|
|
1217
|
+
this.options = input({ granularity: 5 }, { transform: mergeInputs({ granularity: 5 }) });
|
|
1218
|
+
this.granularity = pick(this.options, 'granularity');
|
|
1219
|
+
this.effect = computed(() => new PixelationEffect(this.granularity()));
|
|
1220
|
+
}
|
|
1221
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.3", ngImport: i0, type: NgtpPixelation, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
1222
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "18.1.3", 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 }); }
|
|
1225
|
+
}
|
|
1226
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.3", ngImport: i0, type: NgtpPixelation, decorators: [{
|
|
1227
|
+
type: Component,
|
|
1228
|
+
args: [{
|
|
1229
|
+
selector: 'ngtp-pixelation',
|
|
1230
|
+
template: `
|
|
1231
|
+
<ngt-primitive *args="[effect()]" />
|
|
1232
|
+
`,
|
|
1233
|
+
standalone: true,
|
|
1234
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
594
1235
|
schemas: [CUSTOM_ELEMENTS_SCHEMA],
|
|
1236
|
+
imports: [NgtArgs],
|
|
595
1237
|
}]
|
|
596
|
-
}]
|
|
597
|
-
type: Input
|
|
598
|
-
}], _granularity: [{
|
|
599
|
-
type: Input,
|
|
600
|
-
args: [{ alias: 'granularity' }]
|
|
601
|
-
}] } });
|
|
1238
|
+
}] });
|
|
602
1239
|
|
|
603
1240
|
extend({ ScanlineEffect });
|
|
604
|
-
|
|
1241
|
+
const defaultOptions = {
|
|
1242
|
+
density: 1.25,
|
|
1243
|
+
};
|
|
1244
|
+
class NgtpScanline {
|
|
605
1245
|
constructor() {
|
|
606
|
-
|
|
607
|
-
this.
|
|
1246
|
+
this.effect = inject(NgtpEffect, { host: true });
|
|
1247
|
+
this.options = input(defaultOptions, { transform: mergeInputs(defaultOptions) });
|
|
608
1248
|
}
|
|
609
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
610
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "
|
|
611
|
-
<ngt-scanline-effect
|
|
1249
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.3", ngImport: i0, type: NgtpScanline, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
1250
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "18.1.3", 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 />
|
|
612
1253
|
<ng-content />
|
|
613
1254
|
</ngt-scanline-effect>
|
|
614
|
-
`, 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 }); }
|
|
615
1256
|
}
|
|
616
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
1257
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.3", ngImport: i0, type: NgtpScanline, decorators: [{
|
|
617
1258
|
type: Component,
|
|
618
1259
|
args: [{
|
|
619
1260
|
selector: 'ngtp-scanline',
|
|
620
|
-
standalone: true,
|
|
621
1261
|
template: `
|
|
622
|
-
<ngt-scanline-effect
|
|
1262
|
+
<ngt-scanline-effect *args="[options()]" [camera]="effect.camera()">
|
|
1263
|
+
<ngtp-effect-blend-mode />
|
|
623
1264
|
<ng-content />
|
|
624
1265
|
</ngt-scanline-effect>
|
|
625
1266
|
`,
|
|
626
|
-
|
|
1267
|
+
standalone: true,
|
|
627
1268
|
schemas: [CUSTOM_ELEMENTS_SCHEMA],
|
|
1269
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
1270
|
+
imports: [NgtArgs, NgtpEffectBlendMode],
|
|
1271
|
+
hostDirectives: [NgtpEffectHostDirective],
|
|
1272
|
+
providers: [provideDefaultEffectOptions({ blendFunction: BlendFunction.OVERLAY })],
|
|
628
1273
|
}]
|
|
629
1274
|
}] });
|
|
630
1275
|
|
|
631
1276
|
extend({ SepiaEffect });
|
|
632
|
-
class NgtpSepia
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
|
|
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.1.3", ngImport: i0, type: NgtpSepia, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
1283
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "18.1.3", 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 />
|
|
636
1286
|
<ng-content />
|
|
637
1287
|
</ngt-sepia-effect>
|
|
638
|
-
`, 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 }); }
|
|
639
1289
|
}
|
|
640
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
1290
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.3", ngImport: i0, type: NgtpSepia, decorators: [{
|
|
641
1291
|
type: Component,
|
|
642
1292
|
args: [{
|
|
643
1293
|
selector: 'ngtp-sepia',
|
|
644
|
-
standalone: true,
|
|
645
1294
|
template: `
|
|
646
|
-
<ngt-sepia-effect
|
|
1295
|
+
<ngt-sepia-effect *args="[options()]" [camera]="effect.camera()">
|
|
1296
|
+
<ngtp-effect-blend-mode />
|
|
647
1297
|
<ng-content />
|
|
648
1298
|
</ngt-sepia-effect>
|
|
649
1299
|
`,
|
|
650
|
-
|
|
1300
|
+
standalone: true,
|
|
651
1301
|
schemas: [CUSTOM_ELEMENTS_SCHEMA],
|
|
1302
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
1303
|
+
imports: [NgtArgs, NgtpEffectBlendMode],
|
|
1304
|
+
hostDirectives: [NgtpEffectHostDirective],
|
|
652
1305
|
}]
|
|
653
1306
|
}] });
|
|
654
1307
|
|
|
655
1308
|
extend({ ShockWaveEffect });
|
|
656
|
-
class NgtpShockWave
|
|
657
|
-
|
|
658
|
-
|
|
659
|
-
|
|
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.1.3", ngImport: i0, type: NgtpShockWave, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
1315
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "18.1.3", 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 />
|
|
660
1318
|
<ng-content />
|
|
661
1319
|
</ngt-shock-wave-effect>
|
|
662
|
-
`, 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 }); }
|
|
663
1321
|
}
|
|
664
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
1322
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.3", ngImport: i0, type: NgtpShockWave, decorators: [{
|
|
665
1323
|
type: Component,
|
|
666
1324
|
args: [{
|
|
667
1325
|
selector: 'ngtp-shock-wave',
|
|
668
|
-
standalone: true,
|
|
669
1326
|
template: `
|
|
670
|
-
<ngt-shock-wave-effect
|
|
1327
|
+
<ngt-shock-wave-effect *args="[options()]" [camera]="effect.camera()">
|
|
1328
|
+
<ngtp-effect-blend-mode />
|
|
671
1329
|
<ng-content />
|
|
672
1330
|
</ngt-shock-wave-effect>
|
|
673
1331
|
`,
|
|
674
|
-
|
|
1332
|
+
standalone: true,
|
|
675
1333
|
schemas: [CUSTOM_ELEMENTS_SCHEMA],
|
|
1334
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
1335
|
+
imports: [NgtArgs, NgtpEffectBlendMode],
|
|
1336
|
+
hostDirectives: [NgtpEffectHostDirective],
|
|
676
1337
|
}]
|
|
677
1338
|
}] });
|
|
678
1339
|
|
|
679
1340
|
extend({ SMAAEffect });
|
|
680
|
-
class NgtpSMAA
|
|
681
|
-
|
|
682
|
-
|
|
683
|
-
|
|
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.1.3", ngImport: i0, type: NgtpSMAA, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
1347
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "18.1.3", 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 />
|
|
684
1350
|
<ng-content />
|
|
685
|
-
</ngt-
|
|
686
|
-
`, 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 }); }
|
|
687
1353
|
}
|
|
688
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
1354
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.3", ngImport: i0, type: NgtpSMAA, decorators: [{
|
|
689
1355
|
type: Component,
|
|
690
1356
|
args: [{
|
|
691
|
-
selector: 'ngtp-
|
|
692
|
-
standalone: true,
|
|
1357
|
+
selector: 'ngtp-smaa',
|
|
693
1358
|
template: `
|
|
694
|
-
<ngt-
|
|
1359
|
+
<ngt-sMAA-effect *args="[options()]" [camera]="effect.camera()">
|
|
1360
|
+
<ngtp-effect-blend-mode />
|
|
695
1361
|
<ng-content />
|
|
696
|
-
</ngt-
|
|
1362
|
+
</ngt-sMAA-effect>
|
|
697
1363
|
`,
|
|
698
|
-
|
|
1364
|
+
standalone: true,
|
|
699
1365
|
schemas: [CUSTOM_ELEMENTS_SCHEMA],
|
|
1366
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
1367
|
+
imports: [NgtArgs, NgtpEffectBlendMode],
|
|
1368
|
+
hostDirectives: [NgtpEffectHostDirective],
|
|
700
1369
|
}]
|
|
701
1370
|
}] });
|
|
702
1371
|
|
|
703
|
-
|
|
1372
|
+
extend({ TiltShiftEffect });
|
|
1373
|
+
class NgtpTiltShift {
|
|
704
1374
|
constructor() {
|
|
705
|
-
this.
|
|
706
|
-
|
|
707
|
-
samples: 30,
|
|
708
|
-
rings: 4,
|
|
709
|
-
distanceThreshold: 1.0,
|
|
710
|
-
distanceFalloff: 0.0,
|
|
711
|
-
rangeThreshold: 0.5,
|
|
712
|
-
rangeFalloff: 0.1,
|
|
713
|
-
luminanceInfluence: 0.9,
|
|
714
|
-
radius: 20,
|
|
715
|
-
bias: 0.5,
|
|
716
|
-
intensity: 1.0,
|
|
717
|
-
depthAwareUpsampling: true,
|
|
718
|
-
});
|
|
719
|
-
this.effectRef = injectNgtRef();
|
|
720
|
-
this.effectComposerApi = injectNgtpEffectComposerApi();
|
|
721
|
-
this.effect = computed(() => {
|
|
722
|
-
const [state, { camera, normalPass, downSamplingPass, resolutionScale }] = [
|
|
723
|
-
this.inputs.state(),
|
|
724
|
-
this.effectComposerApi(),
|
|
725
|
-
];
|
|
726
|
-
if (normalPass === null && downSamplingPass === null) {
|
|
727
|
-
console.error('Please enable the NormalPass in the NgtpEffectComposer in order to use NgtpSSAO.');
|
|
728
|
-
return null;
|
|
729
|
-
}
|
|
730
|
-
return new SSAOEffect(camera, normalPass && !downSamplingPass ? normalPass.texture : null, {
|
|
731
|
-
...state,
|
|
732
|
-
// @ts-expect-error
|
|
733
|
-
normalDepthBuffer: state.normalDepthBuffer || (downSamplingPass ? downSamplingPass.texture : null),
|
|
734
|
-
resolutionScale: state.resolutionScale || (resolutionScale ?? 1),
|
|
735
|
-
depthAwareUpsampling: state.depthAwareUpsampling ?? true,
|
|
736
|
-
});
|
|
737
|
-
});
|
|
738
|
-
}
|
|
739
|
-
set _blendFunction(blendFunction) {
|
|
740
|
-
this.inputs.set({ blendFunction });
|
|
741
|
-
}
|
|
742
|
-
set _distanceScaling(distanceScaling) {
|
|
743
|
-
this.inputs.set({ distanceScaling });
|
|
744
|
-
}
|
|
745
|
-
set _depthAwareUpsampling(depthAwareUpsampling) {
|
|
746
|
-
this.inputs.set({ depthAwareUpsampling });
|
|
747
|
-
}
|
|
748
|
-
set _normalDepthBuffer(normalDepthBuffer) {
|
|
749
|
-
this.inputs.set({ normalDepthBuffer });
|
|
750
|
-
}
|
|
751
|
-
set _samples(samples) {
|
|
752
|
-
this.inputs.set({ samples });
|
|
753
|
-
}
|
|
754
|
-
set _rings(rings) {
|
|
755
|
-
this.inputs.set({ rings });
|
|
756
|
-
}
|
|
757
|
-
set _worldDistanceThreshold(worldDistanceThreshold) {
|
|
758
|
-
this.inputs.set({ worldDistanceThreshold });
|
|
759
|
-
}
|
|
760
|
-
set _worldDistanceFalloff(worldDistanceFalloff) {
|
|
761
|
-
this.inputs.set({ worldDistanceFalloff });
|
|
762
|
-
}
|
|
763
|
-
set _worldProximityThreshold(worldProximityThreshold) {
|
|
764
|
-
this.inputs.set({ worldProximityThreshold });
|
|
765
|
-
}
|
|
766
|
-
set _worldProximityFalloff(worldProximityFalloff) {
|
|
767
|
-
this.inputs.set({ worldProximityFalloff });
|
|
768
|
-
}
|
|
769
|
-
set _distanceThreshold(distanceThreshold) {
|
|
770
|
-
this.inputs.set({ distanceThreshold });
|
|
771
|
-
}
|
|
772
|
-
set _distanceFalloff(distanceFalloff) {
|
|
773
|
-
this.inputs.set({ distanceFalloff });
|
|
774
|
-
}
|
|
775
|
-
set _rangeThreshold(rangeThreshold) {
|
|
776
|
-
this.inputs.set({ rangeThreshold });
|
|
777
|
-
}
|
|
778
|
-
set _rangeFalloff(rangeFalloff) {
|
|
779
|
-
this.inputs.set({ rangeFalloff });
|
|
780
|
-
}
|
|
781
|
-
set _minRadiusScale(minRadiusScale) {
|
|
782
|
-
this.inputs.set({ minRadiusScale });
|
|
783
|
-
}
|
|
784
|
-
set _luminanceInfluence(luminanceInfluence) {
|
|
785
|
-
this.inputs.set({ luminanceInfluence });
|
|
786
|
-
}
|
|
787
|
-
set _radius(radius) {
|
|
788
|
-
this.inputs.set({ radius });
|
|
789
|
-
}
|
|
790
|
-
set _intensity(intensity) {
|
|
791
|
-
this.inputs.set({ intensity });
|
|
792
|
-
}
|
|
793
|
-
set _bias(bias) {
|
|
794
|
-
this.inputs.set({ bias });
|
|
795
|
-
}
|
|
796
|
-
set _fade(fade) {
|
|
797
|
-
this.inputs.set({ fade });
|
|
798
|
-
}
|
|
799
|
-
set _color(color) {
|
|
800
|
-
this.inputs.set({ color });
|
|
801
|
-
}
|
|
802
|
-
set _resolutionScale(resolutionScale) {
|
|
803
|
-
this.inputs.set({ resolutionScale });
|
|
804
|
-
}
|
|
805
|
-
set _resolutionX(resolutionX) {
|
|
806
|
-
this.inputs.set({ resolutionX });
|
|
807
|
-
}
|
|
808
|
-
set _resolutionY(resolutionY) {
|
|
809
|
-
this.inputs.set({ resolutionY });
|
|
810
|
-
}
|
|
811
|
-
set _width(width) {
|
|
812
|
-
this.inputs.set({ width });
|
|
1375
|
+
this.effect = inject(NgtpEffect, { host: true });
|
|
1376
|
+
this.options = input({});
|
|
813
1377
|
}
|
|
814
|
-
|
|
815
|
-
|
|
816
|
-
|
|
817
|
-
|
|
818
|
-
|
|
819
|
-
|
|
820
|
-
`, isInline: true, dependencies: [{ kind: "directive", type: NgtArgs, selector: "ng-template[args]", inputs: ["args"] }] }); }
|
|
1378
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.3", ngImport: i0, type: NgtpTiltShift, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
1379
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "18.1.3", 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 }); }
|
|
821
1385
|
}
|
|
822
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
1386
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.3", ngImport: i0, type: NgtpTiltShift, decorators: [{
|
|
823
1387
|
type: Component,
|
|
824
1388
|
args: [{
|
|
825
|
-
selector: 'ngtp-
|
|
826
|
-
standalone: true,
|
|
1389
|
+
selector: 'ngtp-tilt-shift',
|
|
827
1390
|
template: `
|
|
828
|
-
<ngt-
|
|
1391
|
+
<ngt-tilt-shift-effect *args="[options()]" [camera]="effect.camera()">
|
|
1392
|
+
<ngtp-effect-blend-mode />
|
|
1393
|
+
<ng-content />
|
|
1394
|
+
</ngt-tilt-shift-effect>
|
|
829
1395
|
`,
|
|
830
|
-
|
|
1396
|
+
standalone: true,
|
|
831
1397
|
schemas: [CUSTOM_ELEMENTS_SCHEMA],
|
|
1398
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
1399
|
+
imports: [NgtArgs, NgtpEffectBlendMode],
|
|
1400
|
+
hostDirectives: [NgtpEffectHostDirective],
|
|
1401
|
+
providers: [provideDefaultEffectOptions({ blendFunction: BlendFunction.ADD })],
|
|
832
1402
|
}]
|
|
833
|
-
}]
|
|
834
|
-
type: Input
|
|
835
|
-
}], _blendFunction: [{
|
|
836
|
-
type: Input,
|
|
837
|
-
args: [{ alias: 'blendFunction' }]
|
|
838
|
-
}], _distanceScaling: [{
|
|
839
|
-
type: Input,
|
|
840
|
-
args: [{ alias: 'distanceScaling' }]
|
|
841
|
-
}], _depthAwareUpsampling: [{
|
|
842
|
-
type: Input,
|
|
843
|
-
args: [{ alias: 'depthAwareUpsampling' }]
|
|
844
|
-
}], _normalDepthBuffer: [{
|
|
845
|
-
type: Input,
|
|
846
|
-
args: [{ alias: 'normalDepthBuffer' }]
|
|
847
|
-
}], _samples: [{
|
|
848
|
-
type: Input,
|
|
849
|
-
args: [{ alias: 'samples' }]
|
|
850
|
-
}], _rings: [{
|
|
851
|
-
type: Input,
|
|
852
|
-
args: [{ alias: 'rings' }]
|
|
853
|
-
}], _worldDistanceThreshold: [{
|
|
854
|
-
type: Input,
|
|
855
|
-
args: [{ alias: 'worldDistanceThreshold' }]
|
|
856
|
-
}], _worldDistanceFalloff: [{
|
|
857
|
-
type: Input,
|
|
858
|
-
args: [{ alias: 'worldDistanceFalloff' }]
|
|
859
|
-
}], _worldProximityThreshold: [{
|
|
860
|
-
type: Input,
|
|
861
|
-
args: [{ alias: 'worldProximityThreshold' }]
|
|
862
|
-
}], _worldProximityFalloff: [{
|
|
863
|
-
type: Input,
|
|
864
|
-
args: [{ alias: 'worldProximityFalloff' }]
|
|
865
|
-
}], _distanceThreshold: [{
|
|
866
|
-
type: Input,
|
|
867
|
-
args: [{ alias: 'distanceThreshold' }]
|
|
868
|
-
}], _distanceFalloff: [{
|
|
869
|
-
type: Input,
|
|
870
|
-
args: [{ alias: 'distanceFalloff' }]
|
|
871
|
-
}], _rangeThreshold: [{
|
|
872
|
-
type: Input,
|
|
873
|
-
args: [{ alias: 'rangeThreshold' }]
|
|
874
|
-
}], _rangeFalloff: [{
|
|
875
|
-
type: Input,
|
|
876
|
-
args: [{ alias: 'rangeFalloff' }]
|
|
877
|
-
}], _minRadiusScale: [{
|
|
878
|
-
type: Input,
|
|
879
|
-
args: [{ alias: 'minRadiusScale' }]
|
|
880
|
-
}], _luminanceInfluence: [{
|
|
881
|
-
type: Input,
|
|
882
|
-
args: [{ alias: 'luminanceInfluence' }]
|
|
883
|
-
}], _radius: [{
|
|
884
|
-
type: Input,
|
|
885
|
-
args: [{ alias: 'radius' }]
|
|
886
|
-
}], _intensity: [{
|
|
887
|
-
type: Input,
|
|
888
|
-
args: [{ alias: 'intensity' }]
|
|
889
|
-
}], _bias: [{
|
|
890
|
-
type: Input,
|
|
891
|
-
args: [{ alias: 'bias' }]
|
|
892
|
-
}], _fade: [{
|
|
893
|
-
type: Input,
|
|
894
|
-
args: [{ alias: 'fade' }]
|
|
895
|
-
}], _color: [{
|
|
896
|
-
type: Input,
|
|
897
|
-
args: [{ alias: 'color' }]
|
|
898
|
-
}], _resolutionScale: [{
|
|
899
|
-
type: Input,
|
|
900
|
-
args: [{ alias: 'resolutionScale' }]
|
|
901
|
-
}], _resolutionX: [{
|
|
902
|
-
type: Input,
|
|
903
|
-
args: [{ alias: 'resolutionX' }]
|
|
904
|
-
}], _resolutionY: [{
|
|
905
|
-
type: Input,
|
|
906
|
-
args: [{ alias: 'resolutionY' }]
|
|
907
|
-
}], _width: [{
|
|
908
|
-
type: Input,
|
|
909
|
-
args: [{ alias: 'width' }]
|
|
910
|
-
}], _height: [{
|
|
911
|
-
type: Input,
|
|
912
|
-
args: [{ alias: 'height' }]
|
|
913
|
-
}] } });
|
|
1403
|
+
}] });
|
|
914
1404
|
|
|
915
|
-
|
|
916
|
-
|
|
1405
|
+
const TiltShiftShader = {
|
|
1406
|
+
fragmentShader: `
|
|
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 {
|
|
917
1488
|
constructor() {
|
|
918
|
-
|
|
919
|
-
this.
|
|
1489
|
+
this.effect = inject(NgtpEffect, { host: true });
|
|
1490
|
+
this.options = input({});
|
|
920
1491
|
}
|
|
921
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
922
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "
|
|
923
|
-
<ngt-tilt-
|
|
1492
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.3", ngImport: i0, type: NgtpTiltShift2, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
1493
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "18.1.3", 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 />
|
|
924
1496
|
<ng-content />
|
|
925
|
-
</ngt-tilt-
|
|
926
|
-
`, 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 }); }
|
|
927
1499
|
}
|
|
928
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
1500
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.3", ngImport: i0, type: NgtpTiltShift2, decorators: [{
|
|
929
1501
|
type: Component,
|
|
930
1502
|
args: [{
|
|
931
|
-
selector: 'ngtp-tilt-
|
|
1503
|
+
selector: 'ngtp-tilt-shift2',
|
|
932
1504
|
standalone: true,
|
|
933
1505
|
template: `
|
|
934
|
-
<ngt-tilt-
|
|
1506
|
+
<ngt-tilt-shift2-effect *args="[options()]" [camera]="effect.camera()">
|
|
1507
|
+
<ngtp-effect-blend-mode />
|
|
935
1508
|
<ng-content />
|
|
936
|
-
</ngt-tilt-
|
|
1509
|
+
</ngt-tilt-shift2-effect>
|
|
937
1510
|
`,
|
|
938
|
-
imports: [NgtArgs],
|
|
939
1511
|
schemas: [CUSTOM_ELEMENTS_SCHEMA],
|
|
1512
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
1513
|
+
imports: [NgtArgs, NgtpEffectBlendMode],
|
|
1514
|
+
hostDirectives: [NgtpEffectHostDirective],
|
|
1515
|
+
providers: [provideDefaultEffectOptions({ blendFunction: BlendFunction.NORMAL })],
|
|
940
1516
|
}]
|
|
941
1517
|
}] });
|
|
942
1518
|
|
|
943
|
-
extend({
|
|
944
|
-
class
|
|
945
|
-
|
|
946
|
-
|
|
947
|
-
|
|
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.1.3", ngImport: i0, type: NgtpVignette, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
1526
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "18.1.3", 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 />
|
|
948
1529
|
<ng-content />
|
|
949
|
-
</ngt-
|
|
950
|
-
`, 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 }); }
|
|
951
1532
|
}
|
|
952
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
1533
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.3", ngImport: i0, type: NgtpVignette, decorators: [{
|
|
953
1534
|
type: Component,
|
|
954
1535
|
args: [{
|
|
955
|
-
selector: 'ngtp-
|
|
956
|
-
standalone: true,
|
|
1536
|
+
selector: 'ngtp-vignette',
|
|
957
1537
|
template: `
|
|
958
|
-
<ngt-
|
|
1538
|
+
<ngt-vignette-effect *args="[options()]" [camera]="effect.camera()">
|
|
1539
|
+
<ngtp-effect-blend-mode />
|
|
959
1540
|
<ng-content />
|
|
960
|
-
</ngt-
|
|
1541
|
+
</ngt-vignette-effect>
|
|
961
1542
|
`,
|
|
962
|
-
|
|
1543
|
+
standalone: true,
|
|
963
1544
|
schemas: [CUSTOM_ELEMENTS_SCHEMA],
|
|
1545
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
1546
|
+
imports: [NgtArgs, NgtpEffectBlendMode],
|
|
1547
|
+
hostDirectives: [NgtpEffectHostDirective],
|
|
964
1548
|
}]
|
|
965
1549
|
}] });
|
|
966
1550
|
|
|
967
|
-
|
|
968
|
-
|
|
969
|
-
|
|
970
|
-
|
|
971
|
-
|
|
1551
|
+
const WaterShader = {
|
|
1552
|
+
fragmentShader: `
|
|
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.1.3", ngImport: i0, type: NgtpWater, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
1582
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "18.1.3", 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 />
|
|
972
1585
|
<ng-content />
|
|
973
|
-
</ngt-
|
|
974
|
-
`, 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 }); }
|
|
975
1588
|
}
|
|
976
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
1589
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.3", ngImport: i0, type: NgtpWater, decorators: [{
|
|
977
1590
|
type: Component,
|
|
978
1591
|
args: [{
|
|
979
|
-
selector: 'ngtp-
|
|
1592
|
+
selector: 'ngtp-water',
|
|
980
1593
|
standalone: true,
|
|
981
1594
|
template: `
|
|
982
|
-
<ngt-
|
|
1595
|
+
<ngt-water-effect *args="[options()]" [camera]="effect.camera()">
|
|
1596
|
+
<ngtp-effect-blend-mode />
|
|
983
1597
|
<ng-content />
|
|
984
|
-
</ngt-
|
|
1598
|
+
</ngt-water-effect>
|
|
985
1599
|
`,
|
|
986
|
-
imports: [NgtArgs],
|
|
987
1600
|
schemas: [CUSTOM_ELEMENTS_SCHEMA],
|
|
1601
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
1602
|
+
imports: [NgtArgs, NgtpEffectBlendMode],
|
|
1603
|
+
hostDirectives: [NgtpEffectHostDirective],
|
|
1604
|
+
providers: [provideDefaultEffectOptions({ blendFunction: BlendFunction.NORMAL })],
|
|
988
1605
|
}]
|
|
989
1606
|
}] });
|
|
990
1607
|
|
|
@@ -992,5 +1609,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.3", ngImpor
|
|
|
992
1609
|
* Generated bundle index. Do not edit.
|
|
993
1610
|
*/
|
|
994
1611
|
|
|
995
|
-
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 };
|
|
996
1613
|
//# sourceMappingURL=angular-three-postprocessing.mjs.map
|