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