angular-three-postprocessing 2.13.0 → 3.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/fesm2022/angular-three-postprocessing-n8ao.mjs +3 -4
- package/fesm2022/angular-three-postprocessing-n8ao.mjs.map +1 -1
- package/fesm2022/angular-three-postprocessing.mjs +93 -121
- package/fesm2022/angular-three-postprocessing.mjs.map +1 -1
- package/package.json +4 -8
- package/esm2022/angular-three-postprocessing.mjs +0 -5
- package/esm2022/index.mjs +0 -4
- package/esm2022/lib/effect-composer.mjs +0 -187
- package/esm2022/lib/effect.mjs +0 -49
- package/esm2022/lib/effects/ascii.mjs +0 -124
- package/esm2022/lib/effects/bloom.mjs +0 -39
- package/esm2022/lib/effects/brightness-contrast.mjs +0 -38
- package/esm2022/lib/effects/chromatic-abberation.mjs +0 -38
- package/esm2022/lib/effects/color-average.mjs +0 -33
- package/esm2022/lib/effects/color-depth.mjs +0 -38
- package/esm2022/lib/effects/depth-of-field.mjs +0 -50
- package/esm2022/lib/effects/depth.mjs +0 -38
- package/esm2022/lib/effects/dot-screen.mjs +0 -38
- package/esm2022/lib/effects/fxaa.mjs +0 -38
- package/esm2022/lib/effects/glitch.mjs +0 -59
- package/esm2022/lib/effects/god-rays.mjs +0 -41
- package/esm2022/lib/effects/grid.mjs +0 -42
- package/esm2022/lib/effects/hue-saturation.mjs +0 -38
- package/esm2022/lib/effects/index.mjs +0 -29
- package/esm2022/lib/effects/lens-flare.mjs +0 -195
- package/esm2022/lib/effects/lut.mjs +0 -50
- package/esm2022/lib/effects/noise.mjs +0 -39
- package/esm2022/lib/effects/outline.mjs +0 -146
- package/esm2022/lib/effects/pixelation.mjs +0 -34
- package/esm2022/lib/effects/scanline.mjs +0 -43
- package/esm2022/lib/effects/sepia.mjs +0 -38
- package/esm2022/lib/effects/shock-wave.mjs +0 -38
- package/esm2022/lib/effects/smaa.mjs +0 -38
- package/esm2022/lib/effects/tilt-shift-2.mjs +0 -121
- package/esm2022/lib/effects/tilt-shift.mjs +0 -39
- package/esm2022/lib/effects/tone-mapping.mjs +0 -81
- package/esm2022/lib/effects/vignette.mjs +0 -38
- package/esm2022/lib/effects/water.mjs +0 -64
- package/esm2022/n8ao/angular-three-postprocessing-n8ao.mjs +0 -5
- package/esm2022/n8ao/index.mjs +0 -2
- package/esm2022/n8ao/lib/n8ao.mjs +0 -82
|
@@ -1,195 +0,0 @@
|
|
|
1
|
-
// Created by Anderson Mancini 2023
|
|
2
|
-
// React Three Fiber Ultimate LensFlare
|
|
3
|
-
import { CUSTOM_ELEMENTS_SCHEMA, ChangeDetectionStrategy, Component, computed, effect, inject, input, } from '@angular/core';
|
|
4
|
-
import { NgtArgs, injectBeforeRender, injectStore } from 'angular-three';
|
|
5
|
-
import { easing } from 'maath';
|
|
6
|
-
import { mergeInputs } from 'ngxtension/inject-inputs';
|
|
7
|
-
import { BlendFunction, Effect } from 'postprocessing';
|
|
8
|
-
import { Color, Mesh, Uniform, Vector2, Vector3 } from 'three';
|
|
9
|
-
import { NgtpEffectComposer } from '../effect-composer';
|
|
10
|
-
import * as i0 from "@angular/core";
|
|
11
|
-
const LensFlareShader = {
|
|
12
|
-
fragmentShader: /* language=glsl glsl */ `
|
|
13
|
-
|
|
14
|
-
uniform float iTime;
|
|
15
|
-
uniform vec2 lensPosition;
|
|
16
|
-
uniform vec2 iResolution;
|
|
17
|
-
uniform vec3 colorGain;
|
|
18
|
-
uniform float starPoints;
|
|
19
|
-
uniform float glareSize;
|
|
20
|
-
uniform float flareSize;
|
|
21
|
-
uniform float flareSpeed;
|
|
22
|
-
uniform float flareShape;
|
|
23
|
-
uniform float haloScale;
|
|
24
|
-
uniform float opacity;
|
|
25
|
-
uniform bool animated;
|
|
26
|
-
uniform bool anamorphic;
|
|
27
|
-
uniform bool enabled;
|
|
28
|
-
uniform bool secondaryGhosts;
|
|
29
|
-
uniform bool starBurst;
|
|
30
|
-
uniform float ghostScale;
|
|
31
|
-
uniform bool aditionalStreaks;
|
|
32
|
-
uniform sampler2D lensDirtTexture;
|
|
33
|
-
vec2 vxtC;
|
|
34
|
-
|
|
35
|
-
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);}
|
|
36
|
-
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);}
|
|
37
|
-
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);}
|
|
38
|
-
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.;}}
|
|
39
|
-
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));}
|
|
40
|
-
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);}
|
|
41
|
-
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;}
|
|
42
|
-
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);}
|
|
43
|
-
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;}
|
|
44
|
-
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;}
|
|
45
|
-
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;}
|
|
46
|
-
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;}
|
|
47
|
-
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);}
|
|
48
|
-
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);}
|
|
49
|
-
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;}
|
|
50
|
-
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);}
|
|
51
|
-
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);}
|
|
52
|
-
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); }}
|
|
53
|
-
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);}
|
|
54
|
-
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));}
|
|
55
|
-
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);}
|
|
56
|
-
`,
|
|
57
|
-
};
|
|
58
|
-
export class LensFlareEffect extends Effect {
|
|
59
|
-
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, } = {}) {
|
|
60
|
-
super('LensFlareEffect', LensFlareShader.fragmentShader, {
|
|
61
|
-
blendFunction,
|
|
62
|
-
uniforms: new Map([
|
|
63
|
-
['enabled', new Uniform(enabled)],
|
|
64
|
-
['glareSize', new Uniform(glareSize)],
|
|
65
|
-
['lensPosition', new Uniform(lensPosition)],
|
|
66
|
-
['iTime', new Uniform(0)],
|
|
67
|
-
['iResolution', new Uniform(iResolution)],
|
|
68
|
-
['starPoints', new Uniform(starPoints)],
|
|
69
|
-
['flareSize', new Uniform(flareSize)],
|
|
70
|
-
['flareSpeed', new Uniform(flareSpeed)],
|
|
71
|
-
['flareShape', new Uniform(flareShape)],
|
|
72
|
-
['animated', new Uniform(animated)],
|
|
73
|
-
['anamorphic', new Uniform(anamorphic)],
|
|
74
|
-
['colorGain', new Uniform(colorGain)],
|
|
75
|
-
['lensDirtTexture', new Uniform(lensDirtTexture)],
|
|
76
|
-
['haloScale', new Uniform(haloScale)],
|
|
77
|
-
['secondaryGhosts', new Uniform(secondaryGhosts)],
|
|
78
|
-
['aditionalStreaks', new Uniform(aditionalStreaks)],
|
|
79
|
-
['ghostScale', new Uniform(ghostScale)],
|
|
80
|
-
['starBurst', new Uniform(starBurst)],
|
|
81
|
-
['opacity', new Uniform(opacity)],
|
|
82
|
-
]),
|
|
83
|
-
});
|
|
84
|
-
}
|
|
85
|
-
update(_renderer, _inputBuffer, deltaTime) {
|
|
86
|
-
const iTime = this.uniforms.get('iTime');
|
|
87
|
-
if (iTime) {
|
|
88
|
-
iTime.value += deltaTime;
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
const defaultOptions = {
|
|
93
|
-
position: new Vector3(-25, 6, -60),
|
|
94
|
-
followMouse: false,
|
|
95
|
-
smoothTime: 0.7,
|
|
96
|
-
};
|
|
97
|
-
export class NgtpLensFlare {
|
|
98
|
-
constructor() {
|
|
99
|
-
this.options = input(defaultOptions, { transform: mergeInputs(defaultOptions) });
|
|
100
|
-
this.store = injectStore();
|
|
101
|
-
this.viewport = this.store.select('viewport');
|
|
102
|
-
this.raycaster = this.store.select('raycaster');
|
|
103
|
-
this.pointer = this.store.select('pointer');
|
|
104
|
-
this.effectComposer = inject(NgtpEffectComposer);
|
|
105
|
-
this.projectedPosition = new Vector3();
|
|
106
|
-
this.mouse2d = new Vector2();
|
|
107
|
-
this.effect = computed(() => {
|
|
108
|
-
const { position: _, followMouse: __, smoothTime: ___, ...options } = this.options();
|
|
109
|
-
return new LensFlareEffect(options);
|
|
110
|
-
});
|
|
111
|
-
effect(() => {
|
|
112
|
-
const [lensFlareEffect, viewport] = [this.effect(), this.viewport()];
|
|
113
|
-
const iResolution = lensFlareEffect.uniforms.get('iResolution');
|
|
114
|
-
if (iResolution) {
|
|
115
|
-
iResolution.value.x = viewport.width;
|
|
116
|
-
iResolution.value.y = viewport.height;
|
|
117
|
-
}
|
|
118
|
-
});
|
|
119
|
-
effect((onCleanup) => {
|
|
120
|
-
const effect = this.effect();
|
|
121
|
-
onCleanup(() => effect.dispose());
|
|
122
|
-
});
|
|
123
|
-
injectBeforeRender(({ delta }) => {
|
|
124
|
-
const [effect] = [this.effect()];
|
|
125
|
-
if (!effect)
|
|
126
|
-
return;
|
|
127
|
-
const [{ followMouse, position, smoothTime }, pointer, camera, scene, raycaster] = [
|
|
128
|
-
this.options(),
|
|
129
|
-
this.pointer(),
|
|
130
|
-
this.effectComposer.camera(),
|
|
131
|
-
this.effectComposer.scene(),
|
|
132
|
-
this.raycaster(),
|
|
133
|
-
];
|
|
134
|
-
const uLensPosition = effect.uniforms.get('lensPosition');
|
|
135
|
-
const uOpacity = effect.uniforms.get('opacity');
|
|
136
|
-
if (!uLensPosition || !uOpacity)
|
|
137
|
-
return;
|
|
138
|
-
let target = 1;
|
|
139
|
-
if (followMouse) {
|
|
140
|
-
uLensPosition.value.x = pointer.x;
|
|
141
|
-
uLensPosition.value.y = pointer.y;
|
|
142
|
-
target = 0;
|
|
143
|
-
}
|
|
144
|
-
else {
|
|
145
|
-
this.projectedPosition.copy(position).project(camera);
|
|
146
|
-
if (this.projectedPosition.z > 1)
|
|
147
|
-
return;
|
|
148
|
-
uLensPosition.value.x = this.projectedPosition.x;
|
|
149
|
-
uLensPosition.value.y = this.projectedPosition.y;
|
|
150
|
-
this.mouse2d.set(this.projectedPosition.x, this.projectedPosition.y);
|
|
151
|
-
raycaster.setFromCamera(this.mouse2d, camera);
|
|
152
|
-
const intersects = raycaster.intersectObjects(scene.children, true);
|
|
153
|
-
const { object } = intersects[0] ?? {};
|
|
154
|
-
if (object) {
|
|
155
|
-
if (object.userData?.['lensflare'] === 'no-occlusion') {
|
|
156
|
-
target = 0;
|
|
157
|
-
}
|
|
158
|
-
else if (object instanceof Mesh) {
|
|
159
|
-
if (object.material.uniforms?._transmission?.value > 0.2) {
|
|
160
|
-
//Check for MeshTransmissionMaterial
|
|
161
|
-
target = 0.2;
|
|
162
|
-
}
|
|
163
|
-
else if (object.material._transmission && object.material._transmission > 0.2) {
|
|
164
|
-
//Check for MeshPhysicalMaterial with transmission setting
|
|
165
|
-
target = 0.2;
|
|
166
|
-
}
|
|
167
|
-
else if (object.material.transparent) {
|
|
168
|
-
// Check for OtherMaterials with transparent parameter
|
|
169
|
-
target = object.material.opacity;
|
|
170
|
-
}
|
|
171
|
-
}
|
|
172
|
-
}
|
|
173
|
-
}
|
|
174
|
-
easing.damp(uOpacity, 'value', target, smoothTime, delta);
|
|
175
|
-
});
|
|
176
|
-
}
|
|
177
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.11", ngImport: i0, type: NgtpLensFlare, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
178
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "18.2.11", type: NgtpLensFlare, isStandalone: true, selector: "ngtp-lens-flare", inputs: { options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: `
|
|
179
|
-
<ngt-primitive *args="[effect()]" [parameters]="{ dispose: null }" />
|
|
180
|
-
`, isInline: true, dependencies: [{ kind: "directive", type: NgtArgs, selector: "ng-template[args]", inputs: ["args"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
181
|
-
}
|
|
182
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.11", ngImport: i0, type: NgtpLensFlare, decorators: [{
|
|
183
|
-
type: Component,
|
|
184
|
-
args: [{
|
|
185
|
-
selector: 'ngtp-lens-flare',
|
|
186
|
-
standalone: true,
|
|
187
|
-
template: `
|
|
188
|
-
<ngt-primitive *args="[effect()]" [parameters]="{ dispose: null }" />
|
|
189
|
-
`,
|
|
190
|
-
imports: [NgtArgs],
|
|
191
|
-
schemas: [CUSTOM_ELEMENTS_SCHEMA],
|
|
192
|
-
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
193
|
-
}]
|
|
194
|
-
}], ctorParameters: () => [] });
|
|
195
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGVucy1mbGFyZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvcG9zdHByb2Nlc3Npbmcvc3JjL2xpYi9lZmZlY3RzL2xlbnMtZmxhcmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsbUNBQW1DO0FBQ25DLHVDQUF1QztBQUV2QyxPQUFPLEVBQ04sc0JBQXNCLEVBQ3RCLHVCQUF1QixFQUN2QixTQUFTLEVBQ1QsUUFBUSxFQUNSLE1BQU0sRUFDTixNQUFNLEVBQ04sS0FBSyxHQUNMLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsV0FBVyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3pFLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxPQUFPLENBQUM7QUFDL0IsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDdkQsT0FBTyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQVcsT0FBTyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQW9DLE1BQU0sT0FBTyxDQUFDO0FBQzFHLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLG9CQUFvQixDQUFDOztBQUV4RCxNQUFNLGVBQWUsR0FBRztJQUN2QixjQUFjLEVBQUUsd0JBQXdCLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0NBNEN6QztDQUNBLENBQUM7QUFFRixNQUFNLE9BQU8sZUFBZ0IsU0FBUSxNQUFNO0lBQzFDLFlBQVksRUFDWCxhQUFhLEdBQUcsYUFBYSxDQUFDLE1BQU0sRUFDcEMsT0FBTyxHQUFHLElBQUksRUFDZCxTQUFTLEdBQUcsR0FBRyxFQUNmLFlBQVksR0FBRyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsRUFDM0IsV0FBVyxHQUFHLENBQUMs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bmNpbmkgMjAyM1xuLy8gUmVhY3QgVGhyZWUgRmliZXIgVWx0aW1hdGUgTGVuc0ZsYXJlXG5cbmltcG9ydCB7XG5cdENVU1RPTV9FTEVNRU5UU19TQ0hFTUEsXG5cdENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuXHRDb21wb25lbnQsXG5cdGNvbXB1dGVkLFxuXHRlZmZlY3QsXG5cdGluamVjdCxcblx0aW5wdXQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTmd0QXJncywgaW5qZWN0QmVmb3JlUmVuZGVyLCBpbmplY3RTdG9yZSB9IGZyb20gJ2FuZ3VsYXItdGhyZWUnO1xuaW1wb3J0IHsgZWFzaW5nIH0gZnJvbSAnbWFhdGgnO1xuaW1wb3J0IHsgbWVyZ2VJbnB1dHMgfSBmcm9tICduZ3h0ZW5zaW9uL2luamVjdC1pbnB1dHMnO1xuaW1wb3J0IHsgQmxlbmRGdW5jdGlvbiwgRWZmZWN0IH0gZnJvbSAncG9zdHByb2Nlc3NpbmcnO1xuaW1wb3J0IHsgQ29sb3IsIE1lc2gsIFRleHR1cmUsIFVuaWZvcm0sIFZlY3RvcjIsIFZlY3RvcjMsIFdlYkdMUmVuZGVyVGFyZ2V0LCBXZWJHTFJlbmRlcmVyIH0gZnJvbSAndGhyZWUnO1xuaW1wb3J0IHsgTmd0cEVmZmVjdENvbXBvc2VyIH0gZnJvbSAnLi4vZWZmZWN0LWNvbXBvc2VyJztcblxuY29uc3QgTGVuc0ZsYXJlU2hhZGVyID0ge1xuXHRmcmFnbWVudFNoYWRlcjogLyogbGFuZ3VhZ2U9Z2xzbCBnbHNsICovIGBcblxuICB1bmlmb3JtIGZsb2F0IGlUaW1lO1xuICB1bmlmb3JtIHZlYzIgbGVuc1Bvc2l0aW9uO1xuICB1bmlmb3JtIHZlYzIgaVJlc29sdXRpb247XG4gIHVuaWZvcm0gdmVjMyBjb2xvckdhaW47XG4gIHVuaWZvcm0gZmxvYXQgc3RhclBvaW50cztcbiAgdW5pZm9ybSBmbG9hdCBnbGFyZVNpemU7XG4gIHVuaWZvcm0gZmxvYXQgZmxhcmVTaXplO1xuICB1bmlmb3JtIGZsb2F0IGZsYXJlU3BlZWQ7XG4gIHVuaWZvcm0gZmxvYXQgZmxhcmVTaGFwZTtcbiAgdW5pZm9ybSBmbG9hdCBoYWxvU2NhbGU7XG4gIHVuaWZvcm0gZmxvYXQgb3BhY2l0eTtcbiAgdW5pZm9ybSBib29sIGFuaW1hdGVkO1xuICB1bmlmb3JtIGJvb2wgYW5hbW9ycGhpYztcbiAgdW5pZm9ybSBib29sIGVuYWJsZWQ7XG4gIHVuaWZvcm0gYm9vbCBzZWNvbmRhcnlHaG9zdHM7XG4gIHVuaWZvcm0gYm9vbCBzdGFyQnVyc3Q7XG4gIHVuaWZvcm0gZmxvYXQgZ2hvc3RTY2FsZTtcbiAgdW5pZm9ybSBib29sIGFkaXRpb25hbFN0cmVha3M7XG4gIHVuaWZvcm0gc2FtcGxlcjJEIGxlbnNEaXJ0VGV4dHVyZTtcbiAgdmVjMiB2eHRDO1xuXG4gIGZsb2F0IHJuZGYoZmxvYXQgbil7cmV0dXJuIGZyYWN0KHNpbihuKSAqIDQzNzU4LjU0NTMxMjMpO31mbG9hdCBuaXooZmxvYXQgcCl7ZmxvYXQgZmwgPSBmbG9vcihwKTtmbG9hdCBmYyA9IGZyYWN0KHApO3JldHVybiBtaXgocm5kZihmbCkscm5kZihmbCArIDEuMCksIGZjKTt9XG4gIHZlYzMgaHN2MnJnYih2ZWMzIGMpe3ZlYzQgayA9IHZlYzQoMS4wLCAyLjAgLyAzLjAsIDEuMCAvIDMuMCwgMy4wKTt2ZWMzIHAgPSBhYnMoZnJhY3QoYy54eHggKyBrLnh5eikgKiA2LjAgLSBrLnd3dyk7cmV0dXJuIGMueiAqIG1peChrLnh4eCwgY2xhbXAocCAtIGsueHh4LCAwLjAsIDEuMCksIGMueSk7fVxuICBmbG9hdCBzYXRVKGZsb2F0IHgpe3JldHVybiBjbGFtcCh4LCAwLiwxLik7fXZlYzIgcnRVKHZlYzIgbmF6LCBmbG9hdCBydG4pe3JldHVybiB2ZWMyKGNvcyhydG4pICogbmF6LnggKyBzaW4ocnRuKSAqIG5hei55LGNvcyhydG4pICogbmF6LnkgLSBzaW4ocnRuKSAqIG5hei54KTt9XG4gIHZlYzMgZHJ3Rih2ZWMyIHAsIGZsb2F0IGludGVuc2l0eSwgZmxvYXQgcm5kLCBmbG9hdCBzcGVlZCwgaW50IGlkKXtmbG9hdCBmbGhvcyA9ICgxLiAvIDMyLikgKiBmbG9hdChpZCkgKiAwLjE7ZmxvYXQgbGluZ3JhZCA9IGRpc3RhbmNlKHZlYzIoMC4pLCBwKTtmbG9hdCBleHBnID0gMS4gLyBleHAobGluZ3JhZCAqIChmcmFjdChybmQpICogMC42NiArIDAuMzMpKTt2ZWMzIHF6VGcgPSBoc3YycmdiKHZlYzMoIGZyYWN0KCAoZXhwZyAqIDguKSArIHNwZWVkICogZmxhcmVTcGVlZCArIGZsaG9zKSwgcG93KDEuLWFicyhleHBnKjIuLTEuKSwgMC40NSksIDIwLjAgKiBleHBnICogaW50ZW5zaXR5KSk7ZmxvYXQgaW50ZXJuYWxTdGFyUG9pbnRzO2lmKGFuYW1vcnBoaWMpe2ludGVybmFsU3RhclBvaW50cyA9IDEuMDt9IGVsc2V7aW50ZXJuYWxTdGFyUG9pbnRzID0gc3RhclBvaW50czt9ZmxvYXQgYW1zID0gbGVuZ3RoKHAgKiBmbGFyZVNoYXBlICogc2luKGludGVybmFsU3RhclBvaW50cyAqIGF0YW4ocC54LCBwLnkpKSk7ZmxvYXQga0poZyA9IHBvdygxLi1zYXRVKGFtcyksICggYW5hbW9ycGhpYyA/IDEwMC4gOiAxMi4pKTtrSmhnICs9IHNhdFUoZXhwZy0wLjkpICogMy47a0poZyA9IHBvdyhrSmhnICogZXhwZywgOC4gKyAoMS4taW50ZW5zaXR5KSAqIDUuKTtpZihmbGFyZVNwZWVkID4gMC4wKXtyZXR1cm4gdmVjMyhrSmhnKSAqIHF6VGc7fSBlbHNle3JldHVybiB2ZWMzKGtKaGcpICogZmxhcmVTaXplICogMTUuO319XG4gIGZsb2F0IGFtczIodmVjMyBhLCB2ZWMzIGIpIHsgcmV0dXJuIGFicyhhLnggLSBiLngpICsgYWJzKGEueSAtIGIueSkgKyBhYnMoYS56IC0gYi56KTt9dmVjMyBzYXRVKHZlYzMgeCl7cmV0dXJuIGNsYW1wKHgsIHZlYzMoMC4wKSwgdmVjMygxLjApKTt9XG4gIGZsb2F0IGdsUih2ZWMyIG5heiwgdmVjMiBwb3MsIGZsb2F0IHpzaSl7dmVjMiBtbmk7aWYoYW5pbWF0ZWQpe21uaSA9IHJ0VShuYXotcG9zLCBpVGltZSAqIDAuMSk7fSBlbHNle21uaSA9IG5hei1wb3M7fWZsb2F0IGFuZyA9IGF0YW4obW5pLnksIG1uaS54KSAqIChhbmFtb3JwaGljID8gMS4wIDogc3RhclBvaW50cyk7ZmxvYXQgYW1zMiA9IGxlbmd0aChtbmkpO2FtczIgPSBwb3coYW1zMiwgLjkpO2Zsb2F0IGYwID0gMS4wLyhsZW5ndGgobmF6LXBvcykqKDEuMC96c2kqMTYuMCkrLjIpO3JldHVybiBmMCtmMCooc2luKChhbmcpKSouMiArLjMpO31cbiAgZmxvYXQgc2RIZXgodmVjMiBwKXtwID0gYWJzKHApO3ZlYzIgcSA9IHZlYzIocC54KjIuMCowLjU3NzM1MDMsIHAueSArIHAueCowLjU3NzM1MDMpO3JldHVybiBkb3Qoc3RlcChxLnh5LHEueXgpLCAxLjAtcS55eCk7fWZsb2F0IGZwb3coZmxvYXQgeCwgZmxvYXQgayl7cmV0dXJuIHggPiBrID8gcG93KCh4LWspLygxLjAtayksMi4wKSA6IDAuMDt9XG4gIHZlYzMgckh4KHZlYzIgbmF6LCB2ZWMyIHAsIGZsb2F0IHMsIHZlYzMgY29sKXtuYXogLT0gcDtpZiAoYWJzKG5hei54KSA8IDAuMipzICYmIGFicyhuYXoueSkgPCAwLjIqcyl7cmV0dXJuIG1peCh2ZWMzKDApLG1peCh2ZWMzKDApLGNvbCwwLjEgKyBmcG93KGxlbmd0aChuYXovcyksMC4xKSoxMC4wKSxzbW9vdGhzdGVwKDAuMCwwLjEsc2RIZXgobmF6KjIwLjAvcykpKTt9cmV0dXJuIHZlYzMoMCk7fVxuICB2ZWMzIG1Mcyh2ZWMyIG5heiwgdmVjMiBwb3Mpe3ZlYzIgbW5pID0gbmF6LXBvczt2ZWMyIHp4TXAgPSBuYXoqKGxlbmd0aChuYXopKTtmbG9hdCBhbmcgPSBhdGFuKG1uaS54LG1uaS55KTtmbG9hdCBmMCA9IC4zLyhsZW5ndGgobmF6LXBvcykqMTYuMCsxLjApO2YwID0gZjAqKHNpbihuaXooc2luKGFuZyozLjktKGFuaW1hdGVkID8gaVRpbWUgOiAwLjApICogMC4zKSAqIHN0YXJQb2ludHMpKSouMiApO2Zsb2F0IGYxID0gbWF4KDAuMDEtcG93KGxlbmd0aChuYXorMS4yKnBvcyksMS45KSwuMCkqNy4wO2Zsb2F0IGYyID0gbWF4KC45LygxMC4wKzMyLjAqcG93KGxlbmd0aCh6eE1wKzAuOTkqcG9zKSwyLjApKSwuMCkqMC4zNTtmbG9hdCBmMjIgPSBtYXgoLjkvKDExLjArMzIuMCpwb3cobGVuZ3RoKHp4TXArMC44NSpwb3MpLDIuMCkpLC4wKSowLjIzO2Zsb2F0IGYyMyA9IG1heCguOS8oMTIuMCszMi4wKnBvdyhsZW5ndGgoenhNcCswLjk1KnBvcyksMi4wKSksLjApKjAuNjt2ZWMyIHp0WCA9IG1peChuYXosenhNcCwgMC4xKTtmbG9hdCBmNCA9IG1heCgwLjAxLXBvdyhsZW5ndGgoenRYKzAuNCpwb3MpLDIuOSksLjApKjQuMDI7ZmxvYXQgZjQyID0gbWF4KDAuMC1wb3cobGVuZ3RoKHp0WCswLjQ1KnBvcyksMi45KSwuMCkqNC4xO2Zsb2F0IGY0MyA9IG1heCgwLjAxLXBvdyhsZW5ndGgoenRYKzAuNSpwb3MpLDIuOSksLjApKjQuNjt6dFggPSBtaXgobmF6LHp4TXAsLS40KTtmbG9hdCBmNSA9IG1heCgwLjAxLXBvdyhsZW5ndGgoenRYKzAuMSpwb3MpLDUuNSksLjApKjIuMDtmbG9hdCBmNTIgPSBtYXgoMC4wMS1wb3cobGVuZ3RoKHp0WCswLjIqcG9zKSw1LjUpLC4wKSoyLjA7ZmxvYXQgZjUzID0gbWF4KDAuMDEtcG93KGxlbmd0aCh6dFgrMC4xKnBvcyksNS41KSwuMCkqMi4wO3p0WCA9IG1peChuYXosenhNcCwgMi4xKTtmbG9hdCBmNiA9IG1heCgwLjAxLXBvdyhsZW5ndGgoenRYLTAuMypwb3MpLDEuNjEpLC4wKSozLjE1OTtmbG9hdCBmNjIgPSBtYXgoMC4wMS1wb3cobGVuZ3RoKHp0WC0wLjMyNSpwb3MpLDEuNjE0KSwuMCkqMy4xNDtmbG9hdCBmNjMgPSBtYXgoMC4wMS1wb3cobGVuZ3RoKHp0WC0wLjM4OSpwb3MpLDEuNjIzKSwuMCkqMy4xMjt2ZWMzIGMgPSB2ZWMzKGdsUihuYXoscG9zLCBnbGFyZVNpemUpKTt2ZWMyIHByb3Q7aWYoYW5pbWF0ZWQpe3Byb3QgPSBydFUobmF6IC0gcG9zLCAoaVRpbWUgKiAwLjEpKTt9IGVsc2UgaWYoYW5hbW9ycGhpYyl7cHJvdCA9IHJ0VShuYXogLSBwb3MsIDEuNTcwNzk2KTt9IGVsc2Uge3Byb3QgPSBuYXogLSBwb3M7fWMgKz0gZHJ3Rihwcm90LCAoYW5hbW9ycGhpYyA/IGZsYXJlU2l6ZSAqIDEwLiA6IGZsYXJlU2l6ZSksIDAuMSwgaVRpbWUsIDEpO2Mucis9ZjErZjIrZjQrZjUrZjY7IGMuZys9ZjErZjIyK2Y0MitmNTIrZjYyOyBjLmIrPWYxK2YyMytmNDMrZjUzK2Y2MztjID0gYyoxLjMgKiB2ZWMzKGxlbmd0aCh6eE1wKSsuMDkpO2MrPXZlYzMoZjApO3JldHVybiBjO31cbiAgdmVjMyBjYyh2ZWMzIGNsciwgZmxvYXQgZmN0LGZsb2F0IGZjdDIpe2Zsb2F0IHcgPSBjbHIueCtjbHIueStjbHIuejtyZXR1cm4gbWl4KGNscix2ZWMzKHcpKmZjdCx3KmZjdDIpO31mbG9hdCBybmQodmVjMiBwKXtmbG9hdCBmID0gZnJhY3Qoc2luKGRvdChwLCB2ZWMyKDEyLjEyMzQsIDcyLjgzOTIpICkqNDUxMjMuMikpO3JldHVybiBmO31mbG9hdCBybmQoZmxvYXQgdyl7ZmxvYXQgZiA9IGZyYWN0KHNpbih3KSoxMDAwLik7cmV0dXJuIGY7fVxuICBmbG9hdCByU2hwKHZlYzIgcCwgaW50IE4pe2Zsb2F0IGY7ZmxvYXQgYT1hdGFuKHAueCxwLnkpKy4yO2Zsb2F0IGI9Ni4yODMxOS9mbG9hdChOKTtmPXNtb290aHN0ZXAoLjUsLjUxLCBjb3MoZmxvb3IoLjUrYS9iKSpiLWEpKmxlbmd0aChwLnh5KSogMi4wICAtZ2hvc3RTY2FsZSk7cmV0dXJuIGY7fVxuICB2ZWMzIGRyQyh2ZWMyIHAsIGZsb2F0IHpzaSwgZmxvYXQgZEN5LCB2ZWMzIGNsciwgdmVjMyBjbHIyLCBmbG9hdCBhbXMyLCB2ZWMyIGVzb20pe2Zsb2F0IGwgPSBsZW5ndGgocCArIGVzb20qKGFtczIqMi4pKSt6c2kvMi47ZmxvYXQgbDIgPSBsZW5ndGgocCArIGVzb20qKGFtczIqNC4pKSt6c2kvMy47ZmxvYXQgYyA9IG1heCgwLjAxLXBvdyhsZW5ndGgocCArIGVzb20qYW1zMiksIHpzaSpnaG9zdFNjYWxlKSwgMC4wKSoxMC47ZmxvYXQgYzEgPSBtYXgoMC4wMDEtcG93KGwtMC4zLCAxLi80MC4pK3NpbihsKjIwLiksIDAuMCkqMy47ZmxvYXQgYzIgPSAgbWF4KDAuMDkvcG93KGxlbmd0aChwLWVzb20qYW1zMi8uNSkqMS4sIC45NSksIDAuMCkvMjAuO2Zsb2F0IHMgPSBtYXgoMC4wMi1wb3coclNocChwKjUuICsgZXNvbSphbXMyKjUuICsgZEN5LCA2KSAsIDEuKSwgMC4wKSoxLjU7Y2xyID0gY29zKHZlYzMoMC40NCwgLjI0LCAuMikqOC4gKyBhbXMyKjQuKSowLjUrLjU7dmVjMyBmID0gYypjbHI7ZiArPSBjMSpjbHI7ZiArPSBjMipjbHI7ZiArPSAgcypjbHI7cmV0dXJuIGYtMC4wMTt9XG4gIHZlYzQgZ2VMQyhmbG9hdCB4KXtyZXR1cm4gdmVjNCh2ZWMzKG1peChtaXgobWl4KG1peChtaXgobWl4KG1peChtaXgobWl4KG1peChtaXgobWl4KG1peChtaXgobWl4KHZlYzMoMC4sIDAuLCAwLiksdmVjMygwLiwgMC4sIDAuKSwgc21vb3Roc3RlcCgwLjAsIDAuMDYzLCB4KSksdmVjMygwLiwgMC4sIDAuKSwgc21vb3Roc3RlcCgwLjA2MywgMC4xMjUsIHgpKSx2ZWMzKDAuMCwgMC4sIDAuKSwgc21vb3Roc3RlcCgwLjEyNSwgMC4xODgsIHgpKSx2ZWMzKDAuMTg4LCAwLjEzMSwgMC4xMTYpLCBzbW9vdGhzdGVwKDAuMTg4LCAwLjIyNywgeCkpLHZlYzMoMC4zMSwgMC4yMDQsIDAuNTM3KSwgc21vb3Roc3RlcCgwLjIyNywgMC4yNTEsIHgpKSx2ZWMzKDAuMTkyLCAwLjEwNiwgMC4yODYpLCBzbW9vdGhzdGVwKDAuMjUxLCAwLjMxNCwgeCkpLHZlYzMoMC4xMDIsIDAuMDA4LCAwLjM0MSksIHNtb290aHN0ZXAoMC4zMTQsIDAuMzkyLCB4KSksdmVjMygwLjA4NiwgMC4wLCAwLjE0MSksIHNtb290aHN0ZXAoMC4zOTIsIDAuNTAyLCB4KSksdmVjMygxLjAsIDAuMzEsIDAuMCksIHNtb290aHN0ZXAoMC41MDIsIDAuNjA0LCB4KSksdmVjMyguMSwgMC4xLCAwLjEpLCBzbW9vdGhzdGVwKDAuNjA0LCAwLjY0MywgeCkpLHZlYzMoMS4wLCAwLjkyOSwgMC4wKSwgc21vb3Roc3RlcCgwLjY0MywgMC43NjEsIHgpKSx2ZWMzKDEuMCwgMC4wODYsIDAuNDI0KSwgc21vb3Roc3RlcCgwLjc2MSwgMC44NDcsIHgpKSx2ZWMzKDEuMCwgMC40OSwgMC4wKSwgc21vb3Roc3RlcCgwLjg0NywgMC44OSwgeCkpLHZlYzMoMC45NDUsIDAuMjc1LCAwLjQ3NSksIHNtb290aHN0ZXAoMC44OSwgMC45NDEsIHgpKSx2ZWMzKDAuMjUxLCAwLjI3NSwgMC43OTYpLCBzbW9vdGhzdGVwKDAuOTQxLCAxLjAsIHgpKSksMS4wKTt9XG4gIGZsb2F0IGRpVE4odmVjMiBwKXt2ZWMyIGYgPSBmcmFjdChwKTtmID0gKGYgKiBmKSAqICgzLjAgLSAoMi4wICogZikpO2Zsb2F0IG4gPSBkb3QoZmxvb3IocCksIHZlYzIoMS4wLCAxNTcuMCkpO3ZlYzQgYSA9IGZyYWN0KHNpbih2ZWM0KG4gKyAwLjAsIG4gKyAxLjAsIG4gKyAxNTcuMCwgbiArIDE1OC4wKSkgKiA0Mzc1OC41NDUzMTIzKTtyZXR1cm4gbWl4KG1peChhLngsIGEueSwgZi54KSwgbWl4KGEueiwgYS53LCBmLngpLCBmLnkpO31cbiAgZmxvYXQgZmJtKHZlYzIgcCl7Y29uc3QgbWF0MiBtID0gbWF0MigwLjgwLCAtMC42MCwgMC42MCwgMC44MCk7ZmxvYXQgZiA9IDAuMDtmICs9IDAuNTAwMCpkaVROKHApOyBwID0gbSpwKjIuMDI7ZiArPSAwLjI1MDAqZGlUTihwKTsgcCA9IG0qcCoyLjAzO2YgKz0gMC4xMjUwKmRpVE4ocCk7IHAgPSBtKnAqMi4wMTtmICs9IDAuMDYyNSpkaVROKHApO3JldHVybiBmLzAuOTM3NTt9XG4gIHZlYzQgZ2VMUyh2ZWMyIHApe3ZlYzIgcHAgPSAocCAtIHZlYzIoMC41KSkgKiAyLjA7ZmxvYXQgYSA9IGF0YW4ocHAueSwgcHAueCk7dmVjNCBjcCA9IHZlYzQoc2luKGEgKiAxLjApLCBsZW5ndGgocHApLCBzaW4oYSAqIDEzLjApLCBzaW4oYSAqIDUzLjApKTtmbG9hdCBkID0gc2luKGNsYW1wKHBvdyhsZW5ndGgodmVjMigwLjUpIC0gcCkgKiAwLjUgKyBoYWxvU2NhbGUgLzIuLCA1LjApLCAwLjAsIDEuMCkgKiAzLjE0MTU5KTt2ZWMzIGMgPSB2ZWMzKGQpICogdmVjMyhmYm0oY3AueHkgKiAxNi4wKSAqIGZibShjcC56dyAqIDkuMCkgKiBtYXgobWF4KG1heChtYXgoMC41LCBzaW4oYSAqIDEuMCkpLCBzaW4oYSAqIDMuMCkgKiAwLjgpLCBzaW4oYSAqIDcuMCkgKiAwLjgpLCBzaW4oYSAqIDkuMCkgKiAxMC42KSk7YyAqPSB2ZWMzKG1peCgyLjAsIChzaW4obGVuZ3RoKHBwLnh5KSAqIDI1Ni4wKSAqIDAuNSkgKyAwLjUsIHNpbigoY2xhbXAoKGxlbmd0aChwcC54eSkgLSAwLjg3NSkgLyAwLjEsIDAuMCwgMS4wKSArIDAuMCkgKiAyLjAgKiAzLjE0MTU5KSAqIDEuNSkgKyAwLjUpICogMC4zMjc1O3JldHVybiB2ZWM0KHZlYzMoYyAqIDEuMCksIGQpO31cbiAgdmVjNCBnZUxEKHZlYzIgcCl7cC54eSArPSB2ZWMyKGZibShwLnl4ICogMy4wKSwgZmJtKHAueXggKiAyLjApKSAqIDAuMDgyNTt2ZWMzIG8gPSB2ZWMzKG1peCgwLjEyNSwgMC4yNSwgbWF4KG1heChzbW9vdGhzdGVwKDAuMSwgMC4wLCBsZW5ndGgocCAtIHZlYzIoMC4yNSkpKSxzbW9vdGhzdGVwKDAuNCwgMC4wLCBsZW5ndGgocCAtIHZlYzIoMC43NSkpKSksc21vb3Roc3RlcCgwLjgsIDAuMCwgbGVuZ3RoKHAgLSB2ZWMyKDAuODc1LCAwLjEyNSkpKSkpKTtvICs9IHZlYzMobWF4KGZibShwICogMS4wKSAtIDAuNSwgMC4wKSkgKiAwLjU7byArPSB2ZWMzKG1heChmYm0ocCAqIDIuMCkgLSAwLjUsIDAuMCkpICogMC41O28gKz0gdmVjMyhtYXgoZmJtKHAgKiA0LjApIC0gMC41LCAwLjApKSAqIDAuMjU7byArPSB2ZWMzKG1heChmYm0ocCAqIDguMCkgLSAwLjc1LCAwLjApKSAqIDEuMDtvICs9IHZlYzMobWF4KGZibShwICogMTYuMCkgLSAwLjc1LCAwLjApKSAqIDAuNzU7byArPSB2ZWMzKG1heChmYm0ocCAqIDY0LjApIC0gMC43NSwgMC4wKSkgKiAwLjU7cmV0dXJuIHZlYzQoY2xhbXAobywgdmVjMygwLjE1KSwgdmVjMygxLjApKSwgMS4wKTt9XG4gIHZlYzQgdHhMKHNhbXBsZXIyRCB0ZXgsIHZlYzIgeHRDKXtpZigoKHh0Qy54IDwgMC4pIHx8ICh4dEMueSA8IDAuKSkgfHwgKCh4dEMueCA+IDEuKSB8fCAoeHRDLnkgPiAxLikpKXtyZXR1cm4gdmVjNCgwLjApO31lbHNle3JldHVybiB0ZXh0dXJlKHRleCwgeHRDKTsgfX1cbiAgdmVjNCB0eEQoc2FtcGxlcjJEIHRleCwgdmVjMiB4dEMsIHZlYzIgZGlyLCB2ZWMzIGRpdG4pIHtyZXR1cm4gdmVjNCh0eEwodGV4LCAoeHRDICsgKGRpciAqIGRpdG4ucikpKS5yLHR4TCh0ZXgsICh4dEMgKyAoZGlyICogZGl0bi5nKSkpLmcsdHhMKHRleCwgKHh0QyArIChkaXIgKiBkaXRuLmIpKSkuYiwxLjApO31cbiAgdmVjNCBzdHJCKCl7dmVjMiBhc3BYdGMgPSB2ZWMyKDEuMCkgLSAoKCh2eHRDIC0gdmVjMigwLjUpKSAqIHZlYzIoMS4wKSkgKyB2ZWMyKDAuNSkpOyB2ZWMyIHh0QyA9IHZlYzIoMS4wKSAtIHZ4dEM7IHZlYzIgZ2h2YyA9ICh2ZWMyKDAuNSkgLSB4dEMpICogMC4zIC0gbGVuc1Bvc2l0aW9uOyB2ZWMyIGdoTm0gPSBub3JtYWxpemUoZ2h2YyAqIHZlYzIoMS4wKSkgKiB2ZWMyKDEuMCk7dmVjMiBoYWxvVmVjID0gbm9ybWFsaXplKGdodmMpICogMC42O3ZlYzIgaGxObSA9IGdoTm0gKiAwLjY7dmVjMiB0ZXhlbFNpemUgPSB2ZWMyKDEuMCkgLyB2ZWMyKGlSZXNvbHV0aW9uLnh5KTt2ZWMzIGRpdG4gPSB2ZWMzKC0odGV4ZWxTaXplLnggKiAxLjUpLCAwLjIsIHRleGVsU2l6ZS54ICogMS41KTt2ZWM0IGMgPSB2ZWM0KDAuMCk7Zm9yIChpbnQgaSA9IDA7IGkgPCA4OyBpKyspIHt2ZWMyIG9mZnNldCA9IHh0QyArIChnaHZjICogZmxvYXQoaSkpO2MgKz0gdHhEKGxlbnNEaXJ0VGV4dHVyZSwgb2Zmc2V0LCBnaE5tLCBkaXRuKSAqIHBvdyhtYXgoMC4wLCAxLjAgLSAobGVuZ3RoKHZlYzIoMC41KSAtIG9mZnNldCkgLyBsZW5ndGgodmVjMigwLjUpKSkpLCAxMC4wKTt9dmVjMiB1eVRyeiA9IHh0QyArIGhsTm07IHJldHVybiAoYyAqIGdlTEMoKGxlbmd0aCh2ZWMyKDAuNSkgLSBhc3BYdGMpIC8gbGVuZ3RoKHZlYzIoaGFsb1NjYWxlKSkpKSkgKyh0eEQobGVuc0RpcnRUZXh0dXJlLCB1eVRyeiwgZ2hObSwgZGl0bikgKiBwb3cobWF4KDAuMCwgMS4wIC0gKGxlbmd0aCh2ZWMyKDAuNSkgLSB1eVRyeikgLyBsZW5ndGgodmVjMigwLjUpKSkpLCAxMC4wKSk7fVxuICB2b2lkIG1haW5JbWFnZSh2ZWM0IHYsdmVjMiByLG91dCB2ZWM0IGkpe3ZlYzIgZz1yLS41O2cueSo9aVJlc29sdXRpb24ueS9pUmVzb2x1dGlvbi54O3ZlYzIgbD1sZW5zUG9zaXRpb24qLjU7bC55Kj1pUmVzb2x1dGlvbi55L2lSZXNvbHV0aW9uLng7dmVjMyBmPW1McyhnLGwpKjIwLipjb2xvckdhaW4vMjU2LjtpZihhZGl0aW9uYWxTdHJlYWtzKXt2ZWMzIG89dmVjMyguOSwuMiwuMSkscD12ZWMzKC4zLC4xLC45KTtmb3IoZmxvYXQgbj0wLjtuPDEwLjtuKyspZis9ZHJDKGcscG93KHJuZChuKjJlMykqMi44LC4xKSsxLjQxLDAuLG8rbixwK24scm5kKG4qMjAuKSozLisuMi0uNSxsZW5zUG9zaXRpb24pO31pZihzZWNvbmRhcnlHaG9zdHMpe3ZlYzMgbj12ZWMzKDApO24rPXJIeChnLC1sZW5zUG9zaXRpb24qLjI1LGdob3N0U2NhbGUqMS40LHZlYzMoLjI1LC4zNSwwKSk7bis9ckh4KGcsbGVuc1Bvc2l0aW9uKi4yNSxnaG9zdFNjYWxlKi41LHZlYzMoMSwuNSwuNSkpO24rPXJIeChnLGxlbnNQb3NpdGlvbiouMSxnaG9zdFNjYWxlKjEuNix2ZWMzKDEpKTtuKz1ySHgoZyxsZW5zUG9zaXRpb24qMS44LGdob3N0U2NhbGUqMi4sdmVjMygwLC41LC43NSkpO24rPXJIeChnLGxlbnNQb3NpdGlvbioxLjI1LGdob3N0U2NhbGUqLjgsdmVjMygxLDEsLjUpKTtuKz1ySHgoZywtbGVuc1Bvc2l0aW9uKjEuMjUsZ2hvc3RTY2FsZSo1Lix2ZWMzKC41LC41LC4yNSkpO24rPWZwb3coMS4tYWJzKGRpc3RhbmNlKGxlbnNQb3NpdGlvbiouOCxnKS0uNyksLjk4NSkqY29sb3JHYWluLzIxMDAuO2YrPW47fWlmKHN0YXJCdXJzdCl7dnh0Qz1nKy41O3ZlYzQgbj1nZUxEKGcpO2Zsb2F0IG89MS4tY2xhbXAoMC41LDAuLC41KSoyLjtuKz1taXgobixwb3cobioyLix2ZWM0KDIpKSouNSxvKTtmbG9hdCBzPShnLngrZy55KSooMS4vNi4pO3ZlYzIgZD1tYXQyKGNvcyhzKSwtc2luKHMpLHNpbihzKSxjb3MocykpKnZ4dEM7bis9Z2VMUyhkKSoyLjtmKz1jbGFtcChuLnh5eipzdHJCKCkueHl6LC4wMSwxLik7fWk9ZW5hYmxlZD92ZWM0KG1peChmLHZlYzMoMCksb3BhY2l0eSkrdi54eXosdi53KTp2ZWM0KHYpO31cbmAsXG59O1xuXG5leHBvcnQgY2xhc3MgTGVuc0ZsYXJlRWZmZWN0IGV4dGVuZHMgRWZmZWN0IHtcblx0Y29uc3RydWN0b3Ioe1xuXHRcdGJsZW5kRnVuY3Rpb24gPSBCbGVuZEZ1bmN0aW9uLk5PUk1BTCxcblx0XHRlbmFibGVkID0gdHJ1ZSxcblx0XHRnbGFyZVNpemUgPSAwLjIsXG5cdFx0bGVuc1Bvc2l0aW9uID0gWzAuMDEsIDAuMDFdLFxuXHRcdGlSZXNvbHV0aW9uID0gWzAsIDBdLFxuXHRcdHN0YXJQb2ludHMgPSA2LFxuXHRcdGZsYXJlU2l6ZSA9IDAuMDEsXG5cdFx0ZmxhcmVTcGVlZCA9IDAuMDEsXG5cdFx0ZmxhcmVTaGFwZSA9IDAuMDEsXG5cdFx0YW5pbWF0ZWQgPSB0cnVlLFxuXHRcdGFuYW1vcnBoaWMgPSBmYWxzZSxcblx0XHRjb2xvckdhaW4gPSBuZXcgQ29sb3IoMjAsIDIwLCAyMCksXG5cdFx0bGVuc0RpcnRUZXh0dXJlID0gbnVsbCBhcyBUZXh0dXJlIHwgbnVsbCxcblx0XHRoYWxvU2NhbGUgPSAwLjUsXG5cdFx0c2Vjb25kYXJ5R2hvc3RzID0gdHJ1ZSxcblx0XHRhZGl0aW9uYWxTdHJlYWtzID0gdHJ1ZSxcblx0XHRnaG9zdFNjYWxlID0gMC4wLFxuXHRcdG9wYWNpdHkgPSAxLjAsXG5cdFx0c3RhckJ1cnN0ID0gZmFsc2UsXG5cdH0gPSB7fSkge1xuXHRcdHN1cGVyKCdMZW5zRmxhcmVFZmZlY3QnLCBMZW5zRmxhcmVTaGFkZXIuZnJhZ21lbnRTaGFkZXIsIHtcblx0XHRcdGJsZW5kRnVuY3Rpb24sXG5cdFx0XHR1bmlmb3JtczogbmV3IE1hcDxzdHJpbmcsIFVuaWZvcm0+KFtcblx0XHRcdFx0WydlbmFibGVkJywgbmV3IFVuaWZvcm0oZW5hYmxlZCldLFxuXHRcdFx0XHRbJ2dsYXJlU2l6ZScsIG5ldyBVbmlmb3JtKGdsYXJlU2l6ZSldLFxuXHRcdFx0XHRbJ2xlbnNQb3NpdGlvbicsIG5ldyBVbmlmb3JtKGxlbnNQb3NpdGlvbildLFxuXHRcdFx0XHRbJ2lUaW1lJywgbmV3IFVuaWZvcm0oMCldLFxuXHRcdFx0XHRbJ2lSZXNvbHV0aW9uJywgbmV3IFVuaWZvcm0oaVJlc29sdXRpb24pXSxcblx0XHRcdFx0WydzdGFyUG9pbnRzJywgbmV3IFVuaWZvcm0oc3RhclBvaW50cyldLFxuXHRcdFx0XHRbJ2ZsYXJlU2l6ZScsIG5ldyBVbmlmb3JtKGZsYXJlU2l6ZSldLFxuXHRcdFx0XHRbJ2ZsYXJlU3BlZWQnLCBuZXcgVW5pZm9ybShmbGFyZVNwZWVkKV0sXG5cdFx0XHRcdFsnZmxhcmVTaGFwZScsIG5ldyBVbmlmb3JtKGZsYXJlU2hhcGUpXSxcblx0XHRcdFx0WydhbmltYXRlZCcsIG5ldyBVbmlmb3JtKGFuaW1hdGVkKV0sXG5cdFx0XHRcdFsnYW5hbW9ycGhpYycsIG5ldyBVbmlmb3JtKGFuYW1vcnBoaWMpXSxcblx0XHRcdFx0Wydjb2xvckdhaW4nLCBuZXcgVW5pZm9ybShjb2xvckdhaW4pXSxcblx0XHRcdFx0WydsZW5zRGlydFRleHR1cmUnLCBuZXcgVW5pZm9ybShsZW5zRGlydFRleHR1cmUpXSxcblx0XHRcdFx0WydoYWxvU2NhbGUnLCBuZXcgVW5pZm9ybShoYWxvU2NhbGUpXSxcblx0XHRcdFx0WydzZWNvbmRhcnlHaG9zdHMnLCBuZXcgVW5pZm9ybShzZWNvbmRhcnlHaG9zdHMpXSxcblx0XHRcdFx0WydhZGl0aW9uYWxTdHJlYWtzJywgbmV3IFVuaWZvcm0oYWRpdGlvbmFsU3RyZWFrcyldLFxuXHRcdFx0XHRbJ2dob3N0U2NhbGUnLCBuZXcgVW5pZm9ybShnaG9zdFNjYWxlKV0sXG5cdFx0XHRcdFsnc3RhckJ1cnN0JywgbmV3IFVuaWZvcm0oc3RhckJ1cnN0KV0sXG5cdFx0XHRcdFsnb3BhY2l0eScsIG5ldyBVbmlmb3JtKG9wYWNpdHkpXSxcblx0XHRcdF0pLFxuXHRcdH0pO1xuXHR9XG5cblx0b3ZlcnJpZGUgdXBkYXRlKF9yZW5kZXJlcjogV2ViR0xSZW5kZXJlciwgX2lucHV0QnVmZmVyOiBXZWJHTFJlbmRlclRhcmdldCwgZGVsdGFUaW1lOiBudW1iZXIpIHtcblx0XHRjb25zdCBpVGltZSA9IHRoaXMudW5pZm9ybXMuZ2V0KCdpVGltZScpO1xuXHRcdGlmIChpVGltZSkge1xuXHRcdFx0aVRpbWUudmFsdWUgKz0gZGVsdGFUaW1lO1xuXHRcdH1cblx0fVxufVxuXG5leHBvcnQgdHlwZSBMZW5zRmxhcmVPcHRpb25zID0gQ29uc3RydWN0b3JQYXJhbWV0ZXJzPHR5cGVvZiBMZW5zRmxhcmVFZmZlY3Q+WzBdICYge1xuXHRwb3NpdGlvbjogVmVjdG9yMztcblx0Zm9sbG93TW91c2U6IGJvb2xlYW47XG5cdHNtb290aFRpbWU6IG51bWJlcjtcbn07XG5cbmNvbnN0IGRlZmF1bHRPcHRpb25zOiBMZW5zRmxhcmVPcHRpb25zID0ge1xuXHRwb3NpdGlvbjogbmV3IFZlY3RvcjMoLTI1LCA2LCAtNjApLFxuXHRmb2xsb3dNb3VzZTogZmFsc2UsXG5cdHNtb290aFRpbWU6IDAuNyxcbn07XG5cbkBDb21wb25lbnQoe1xuXHRzZWxlY3RvcjogJ25ndHAtbGVucy1mbGFyZScsXG5cdHN0YW5kYWxvbmU6IHRydWUsXG5cdHRlbXBsYXRlOiBgXG5cdFx0PG5ndC1wcmltaXRpdmUgKmFyZ3M9XCJbZWZmZWN0KCldXCIgW3BhcmFtZXRlcnNdPVwieyBkaXNwb3NlOiBudWxsIH1cIiAvPlxuXHRgLFxuXHRpbXBvcnRzOiBbTmd0QXJnc10sXG5cdHNjaGVtYXM6IFtDVVNUT01fRUxFTUVOVFNfU0NIRU1BXSxcblx0Y2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIE5ndHBMZW5zRmxhcmUge1xuXHRvcHRpb25zID0gaW5wdXQoZGVmYXVsdE9wdGlvbnMsIHsgdHJhbnNmb3JtOiBtZXJnZUlucHV0cyhkZWZhdWx0T3B0aW9ucykgfSk7XG5cblx0cHJpdmF0ZSBzdG9yZSA9IGluamVjdFN0b3JlKCk7XG5cdHByaXZhdGUgdmlld3BvcnQgPSB0aGlzLnN0b3JlLnNlbGVjdCgndmlld3BvcnQnKTtcblx0cHJpdmF0ZSByYXljYXN0ZXIgPSB0aGlzLnN0b3JlLnNlbGVjdCgncmF5Y2FzdGVyJyk7XG5cdHByaXZhdGUgcG9pbnRlciA9IHRoaXMuc3RvcmUuc2VsZWN0KCdwb2ludGVyJyk7XG5cblx0cHJpdmF0ZSBlZmZlY3RDb21wb3NlciA9IGluamVjdChOZ3RwRWZmZWN0Q29tcG9zZXIpO1xuXG5cdHByaXZhdGUgcHJvamVjdGVkUG9zaXRpb24gPSBuZXcgVmVjdG9yMygpO1xuXHRwcml2YXRlIG1vdXNlMmQgPSBuZXcgVmVjdG9yMigpO1xuXG5cdGVmZmVjdCA9IGNvbXB1dGVkKCgpID0+IHtcblx0XHRjb25zdCB7IHBvc2l0aW9uOiBfLCBmb2xsb3dNb3VzZTogX18sIHNtb290aFRpbWU6IF9fXywgLi4ub3B0aW9ucyB9ID0gdGhpcy5vcHRpb25zKCk7XG5cdFx0cmV0dXJuIG5ldyBMZW5zRmxhcmVFZmZlY3Qob3B0aW9ucyk7XG5cdH0pO1xuXG5cdGNvbnN0cnVjdG9yKCkge1xuXHRcdGVmZmVjdCgoKSA9PiB7XG5cdFx0XHRjb25zdCBbbGVuc0ZsYXJlRWZmZWN0LCB2aWV3cG9ydF0gPSBbdGhpcy5lZmZlY3QoKSwgdGhpcy52aWV3cG9ydCgpXTtcblx0XHRcdGNvbnN0IGlSZXNvbHV0aW9uID0gbGVuc0ZsYXJlRWZmZWN0LnVuaWZvcm1zLmdldCgnaVJlc29sdXRpb24nKTtcblx0XHRcdGlmIChpUmVzb2x1dGlvbikge1xuXHRcdFx0XHRpUmVzb2x1dGlvbi52YWx1ZS54ID0gdmlld3BvcnQud2lkdGg7XG5cdFx0XHRcdGlSZXNvbHV0aW9uLnZhbHVlLnkgPSB2aWV3cG9ydC5oZWlnaHQ7XG5cdFx0XHR9XG5cdFx0fSk7XG5cblx0XHRlZmZlY3QoKG9uQ2xlYW51cCkgPT4ge1xuXHRcdFx0Y29uc3QgZWZmZWN0ID0gdGhpcy5lZmZlY3QoKTtcblx0XHRcdG9uQ2xlYW51cCgoKSA9PiBlZmZlY3QuZGlzcG9zZSgpKTtcblx0XHR9KTtcblxuXHRcdGluamVjdEJlZm9yZVJlbmRlcigoeyBkZWx0YSB9KSA9PiB7XG5cdFx0XHRjb25zdCBbZWZmZWN0XSA9IFt0aGlzLmVmZmVjdCgpXTtcblx0XHRcdGlmICghZWZmZWN0KSByZXR1cm47XG5cblx0XHRcdGNvbnN0IFt7IGZvbGxvd01vdXNlLCBwb3NpdGlvbiwgc21vb3RoVGltZSB9LCBwb2ludGVyLCBjYW1lcmEsIHNjZW5lLCByYXljYXN0ZXJdID0gW1xuXHRcdFx0XHR0aGlzLm9wdGlvbnMoKSxcblx0XHRcdFx0dGhpcy5wb2ludGVyKCksXG5cdFx0XHRcdHRoaXMuZWZmZWN0Q29tcG9zZXIuY2FtZXJhKCksXG5cdFx0XHRcdHRoaXMuZWZmZWN0Q29tcG9zZXIuc2NlbmUoKSxcblx0XHRcdFx0dGhpcy5yYXljYXN0ZXIoKSxcblx0XHRcdF07XG5cblx0XHRcdGNvbnN0IHVMZW5zUG9zaXRpb24gPSBlZmZlY3QudW5pZm9ybXMuZ2V0KCdsZW5zUG9zaXRpb24nKTtcblx0XHRcdGNvbnN0IHVPcGFjaXR5ID0gZWZmZWN0LnVuaWZvcm1zLmdldCgnb3BhY2l0eScpO1xuXHRcdFx0aWYgKCF1TGVuc1Bvc2l0aW9uIHx8ICF1T3BhY2l0eSkgcmV0dXJuO1xuXG5cdFx0XHRsZXQgdGFyZ2V0ID0gMTtcblxuXHRcdFx0aWYgKGZvbGxvd01vdXNlKSB7XG5cdFx0XHRcdHVMZW5zUG9zaXRpb24udmFsdWUueCA9IHBvaW50ZXIueDtcblx0XHRcdFx0dUxlbnNQb3NpdGlvbi52YWx1ZS55ID0gcG9pbnRlci55O1xuXHRcdFx0XHR0YXJnZXQgPSAwO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dGhpcy5wcm9qZWN0ZWRQb3NpdGlvbi5jb3B5KHBvc2l0aW9uKS5wcm9qZWN0KGNhbWVyYSk7XG5cdFx0XHRcdGlmICh0aGlzLnByb2plY3RlZFBvc2l0aW9uLnogPiAxKSByZXR1cm47XG5cblx0XHRcdFx0dUxlbnNQb3NpdGlvbi52YWx1ZS54ID0gdGhpcy5wcm9qZWN0ZWRQb3NpdGlvbi54O1xuXHRcdFx0XHR1TGVuc1Bvc2l0aW9uLnZhbHVlLnkgPSB0aGlzLnByb2plY3RlZFBvc2l0aW9uLnk7XG5cblx0XHRcdFx0dGhpcy5tb3VzZTJkLnNldCh0aGlzLnByb2plY3RlZFBvc2l0aW9uLngsIHRoaXMucHJvamVjdGVkUG9zaXRpb24ueSk7XG5cdFx0XHRcdHJheWNhc3Rlci5zZXRGcm9tQ2FtZXJhKHRoaXMubW91c2UyZCwgY2FtZXJhKTtcblx0XHRcdFx0Y29uc3QgaW50ZXJzZWN0cyA9IHJheWNhc3Rlci5pbnRlcnNlY3RPYmplY3RzKHNjZW5lLmNoaWxkcmVuLCB0cnVlKTtcblx0XHRcdFx0Y29uc3QgeyBvYmplY3QgfSA9IGludGVyc2VjdHNbMF0gPz8ge307XG5cdFx0XHRcdGlmIChvYmplY3QpIHtcblx0XHRcdFx0XHRpZiAob2JqZWN0LnVzZXJEYXRhPy5bJ2xlbnNmbGFyZSddID09PSAnbm8tb2NjbHVzaW9uJykge1xuXHRcdFx0XHRcdFx0dGFyZ2V0ID0gMDtcblx0XHRcdFx0XHR9IGVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIE1lc2gpIHtcblx0XHRcdFx0XHRcdGlmIChvYmplY3QubWF0ZXJpYWwudW5pZm9ybXM/Ll90cmFuc21pc3Npb24/LnZhbHVlID4gMC4yKSB7XG5cdFx0XHRcdFx0XHRcdC8vQ2hlY2sgZm9yIE1lc2hUcmFuc21pc3Npb25NYXRlcmlhbFxuXHRcdFx0XHRcdFx0XHR0YXJnZXQgPSAwLjI7XG5cdFx0XHRcdFx0XHR9IGVsc2UgaWYgKG9iamVjdC5tYXRlcmlhbC5fdHJhbnNtaXNzaW9uICYmIG9iamVjdC5tYXRlcmlhbC5fdHJhbnNtaXNzaW9uID4gMC4yKSB7XG5cdFx0XHRcdFx0XHRcdC8vQ2hlY2sgZm9yIE1lc2hQaHlzaWNhbE1hdGVyaWFsIHdpdGggdHJhbnNtaXNzaW9uIHNldHRpbmdcblx0XHRcdFx0XHRcdFx0dGFyZ2V0ID0gMC4yO1xuXHRcdFx0XHRcdFx0fSBlbHNlIGlmIChvYmplY3QubWF0ZXJpYWwudHJhbnNwYXJlbnQpIHtcblx0XHRcdFx0XHRcdFx0Ly8gQ2hlY2sgZm9yIE90aGVyTWF0ZXJpYWxzIHdpdGggdHJhbnNwYXJlbnQgcGFyYW1ldGVyXG5cdFx0XHRcdFx0XHRcdHRhcmdldCA9IG9iamVjdC5tYXRlcmlhbC5vcGFjaXR5O1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRlYXNpbmcuZGFtcCh1T3BhY2l0eSwgJ3ZhbHVlJywgdGFyZ2V0LCBzbW9vdGhUaW1lLCBkZWx0YSk7XG5cdFx0fSk7XG5cdH1cbn1cbiJdfQ==
|
|
@@ -1,50 +0,0 @@
|
|
|
1
|
-
import { CUSTOM_ELEMENTS_SCHEMA, ChangeDetectionStrategy, Component, computed, effect, input } from '@angular/core';
|
|
2
|
-
import { NgtArgs, injectStore, pick } from 'angular-three';
|
|
3
|
-
import { LUT3DEffect } from 'postprocessing';
|
|
4
|
-
import * as i0 from "@angular/core";
|
|
5
|
-
export class NgtpLUT {
|
|
6
|
-
constructor() {
|
|
7
|
-
this.options = input({});
|
|
8
|
-
this.lut = pick(this.options, 'lut');
|
|
9
|
-
this.store = injectStore();
|
|
10
|
-
this.invalidate = this.store.select('invalidate');
|
|
11
|
-
this.effect = computed(() => {
|
|
12
|
-
const [lut, { lut: _, ...options }] = [this.lut(), this.options()];
|
|
13
|
-
return new LUT3DEffect(lut, options);
|
|
14
|
-
});
|
|
15
|
-
effect(() => {
|
|
16
|
-
const [effect, { lut, tetrahedralInterpolation }, invalidate] = [
|
|
17
|
-
this.effect(),
|
|
18
|
-
this.options(),
|
|
19
|
-
this.invalidate(),
|
|
20
|
-
];
|
|
21
|
-
if (tetrahedralInterpolation)
|
|
22
|
-
effect.tetrahedralInterpolation = tetrahedralInterpolation;
|
|
23
|
-
if (lut)
|
|
24
|
-
effect.lut = lut;
|
|
25
|
-
invalidate();
|
|
26
|
-
});
|
|
27
|
-
effect((onCleanup) => {
|
|
28
|
-
const effect = this.effect();
|
|
29
|
-
onCleanup(() => effect.dispose());
|
|
30
|
-
});
|
|
31
|
-
}
|
|
32
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.11", ngImport: i0, type: NgtpLUT, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
33
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "18.2.11", type: NgtpLUT, isStandalone: true, selector: "ngtp-lut", inputs: { options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: `
|
|
34
|
-
<ngt-primitive *args="[effect()]" [dispose]="null" />
|
|
35
|
-
`, isInline: true, dependencies: [{ kind: "directive", type: NgtArgs, selector: "ng-template[args]", inputs: ["args"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
36
|
-
}
|
|
37
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.11", ngImport: i0, type: NgtpLUT, decorators: [{
|
|
38
|
-
type: Component,
|
|
39
|
-
args: [{
|
|
40
|
-
selector: 'ngtp-lut',
|
|
41
|
-
template: `
|
|
42
|
-
<ngt-primitive *args="[effect()]" [dispose]="null" />
|
|
43
|
-
`,
|
|
44
|
-
imports: [NgtArgs],
|
|
45
|
-
standalone: true,
|
|
46
|
-
schemas: [CUSTOM_ELEMENTS_SCHEMA],
|
|
47
|
-
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
48
|
-
}]
|
|
49
|
-
}], ctorParameters: () => [] });
|
|
50
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibHV0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9wb3N0cHJvY2Vzc2luZy9zcmMvbGliL2VmZmVjdHMvbHV0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSx1QkFBdUIsRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDcEgsT0FBTyxFQUFFLE9BQU8sRUFBRSxXQUFXLEVBQUUsSUFBSSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNELE9BQU8sRUFBaUIsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7O0FBbUI1RCxNQUFNLE9BQU8sT0FBTztJQVluQjtRQVhBLFlBQU8sR0FBRyxLQUFLLENBQUMsRUFBZ0IsQ0FBQyxDQUFDO1FBQzFCLFFBQUcsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUMsQ0FBQztRQUVoQyxVQUFLLEdBQUcsV0FBVyxFQUFFLENBQUM7UUFDdEIsZUFBVSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBRXJELFdBQU0sR0FBRyxRQUFRLENBQUMsR0FBRyxFQUFFO1lBQ3RCLE1BQU0sQ0FBQyxHQUFHLEVBQUUsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEdBQUcsT0FBTyxFQUFFLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsRUFBRSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztZQUNuRSxPQUFPLElBQUksV0FBVyxDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUN0QyxDQUFDLENBQUMsQ0FBQztRQUdGLE1BQU0sQ0FBQyxHQUFHLEVBQUU7WUFDWCxNQUFNLENBQUMsTUFBTSxFQUFFLEVBQUUsR0FBRyxFQUFFLHdCQUF3QixFQUFFLEVBQUUsVUFBVSxDQUFDLEdBQUc7Z0JBQy9ELElBQUksQ0FBQyxNQUFNLEVBQUU7Z0JBQ2IsSUFBSSxDQUFDLE9BQU8sRUFBRTtnQkFDZCxJQUFJLENBQUMsVUFBVSxFQUFFO2FBQ2pCLENBQUM7WUFFRixJQUFJLHdCQUF3QjtnQkFBRSxNQUFNLENBQUMsd0JBQXdCLEdBQUcsd0JBQXdCLENBQUM7WUFDekYsSUFBSSxHQUFHO2dCQUFFLE1BQU0sQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDO1lBQzFCLFVBQVUsRUFBRSxDQUFDO1FBQ2QsQ0FBQyxDQUFDLENBQUM7UUFFSCxNQUFNLENBQUMsQ0FBQyxTQUFTLEVBQUUsRUFBRTtZQUNwQixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDN0IsU0FBUyxDQUFDLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO1FBQ25DLENBQUMsQ0FBQyxDQUFDO0lBQ0osQ0FBQzsrR0E3QlcsT0FBTzttR0FBUCxPQUFPLDhNQVJUOztFQUVULDREQUNTLE9BQU87OzRGQUtMLE9BQU87a0JBVm5CLFNBQVM7bUJBQUM7b0JBQ1YsUUFBUSxFQUFFLFVBQVU7b0JBQ3BCLFFBQVEsRUFBRTs7RUFFVDtvQkFDRCxPQUFPLEVBQUUsQ0FBQyxPQUFPLENBQUM7b0JBQ2xCLFVBQVUsRUFBRSxJQUFJO29CQUNoQixPQUFPLEVBQUUsQ0FBQyxzQkFBc0IsQ0FBQztvQkFDakMsZUFBZSxFQUFFLHVCQUF1QixDQUFDLE1BQU07aUJBQy9DIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ1VTVE9NX0VMRU1FTlRTX1NDSEVNQSwgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENvbXBvbmVudCwgY29tcHV0ZWQsIGVmZmVjdCwgaW5wdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE5ndEFyZ3MsIGluamVjdFN0b3JlLCBwaWNrIH0gZnJvbSAnYW5ndWxhci10aHJlZSc7XG5pbXBvcnQgeyBCbGVuZEZ1bmN0aW9uLCBMVVQzREVmZmVjdCB9IGZyb20gJ3Bvc3Rwcm9jZXNzaW5nJztcbmltcG9ydCB7IFRleHR1cmUgfSBmcm9tICd0aHJlZSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgTFVUT3B0aW9ucyB7XG5cdGx1dDogVGV4dHVyZTtcblx0YmxlbmRGdW5jdGlvbj86IEJsZW5kRnVuY3Rpb247XG5cdHRldHJhaGVkcmFsSW50ZXJwb2xhdGlvbj86IGJvb2xlYW47XG59XG5cbkBDb21wb25lbnQoe1xuXHRzZWxlY3RvcjogJ25ndHAtbHV0Jyxcblx0dGVtcGxhdGU6IGBcblx0XHQ8bmd0LXByaW1pdGl2ZSAqYXJncz1cIltlZmZlY3QoKV1cIiBbZGlzcG9zZV09XCJudWxsXCIgLz5cblx0YCxcblx0aW1wb3J0czogW05ndEFyZ3NdLFxuXHRzdGFuZGFsb25lOiB0cnVlLFxuXHRzY2hlbWFzOiBbQ1VTVE9NX0VMRU1FTlRTX1NDSEVNQV0sXG5cdGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBOZ3RwTFVUIHtcblx0b3B0aW9ucyA9IGlucHV0KHt9IGFzIExVVE9wdGlvbnMpO1xuXHRwcml2YXRlIGx1dCA9IHBpY2sodGhpcy5vcHRpb25zLCAnbHV0Jyk7XG5cblx0cHJpdmF0ZSBzdG9yZSA9IGluamVjdFN0b3JlKCk7XG5cdHByaXZhdGUgaW52YWxpZGF0ZSA9IHRoaXMuc3RvcmUuc2VsZWN0KCdpbnZhbGlkYXRlJyk7XG5cblx0ZWZmZWN0ID0gY29tcHV0ZWQoKCkgPT4ge1xuXHRcdGNvbnN0IFtsdXQsIHsgbHV0OiBfLCAuLi5vcHRpb25zIH1dID0gW3RoaXMubHV0KCksIHRoaXMub3B0aW9ucygpXTtcblx0XHRyZXR1cm4gbmV3IExVVDNERWZmZWN0KGx1dCwgb3B0aW9ucyk7XG5cdH0pO1xuXG5cdGNvbnN0cnVjdG9yKCkge1xuXHRcdGVmZmVjdCgoKSA9PiB7XG5cdFx0XHRjb25zdCBbZWZmZWN0LCB7IGx1dCwgdGV0cmFoZWRyYWxJbnRlcnBvbGF0aW9uIH0sIGludmFsaWRhdGVdID0gW1xuXHRcdFx0XHR0aGlzLmVmZmVjdCgpLFxuXHRcdFx0XHR0aGlzLm9wdGlvbnMoKSxcblx0XHRcdFx0dGhpcy5pbnZhbGlkYXRlKCksXG5cdFx0XHRdO1xuXG5cdFx0XHRpZiAodGV0cmFoZWRyYWxJbnRlcnBvbGF0aW9uKSBlZmZlY3QudGV0cmFoZWRyYWxJbnRlcnBvbGF0aW9uID0gdGV0cmFoZWRyYWxJbnRlcnBvbGF0aW9uO1xuXHRcdFx0aWYgKGx1dCkgZWZmZWN0Lmx1dCA9IGx1dDtcblx0XHRcdGludmFsaWRhdGUoKTtcblx0XHR9KTtcblxuXHRcdGVmZmVjdCgob25DbGVhbnVwKSA9PiB7XG5cdFx0XHRjb25zdCBlZmZlY3QgPSB0aGlzLmVmZmVjdCgpO1xuXHRcdFx0b25DbGVhbnVwKCgpID0+IGVmZmVjdC5kaXNwb3NlKCkpO1xuXHRcdH0pO1xuXHR9XG59XG4iXX0=
|
|
@@ -1,39 +0,0 @@
|
|
|
1
|
-
import { CUSTOM_ELEMENTS_SCHEMA, ChangeDetectionStrategy, Component, inject, input } from '@angular/core';
|
|
2
|
-
import { NgtArgs, extend } from 'angular-three';
|
|
3
|
-
import { BlendFunction, NoiseEffect } from 'postprocessing';
|
|
4
|
-
import { NgtpEffect, NgtpEffectBlendMode, provideDefaultEffectOptions } from '../effect';
|
|
5
|
-
import * as i0 from "@angular/core";
|
|
6
|
-
import * as i1 from "../effect";
|
|
7
|
-
extend({ NoiseEffect });
|
|
8
|
-
export class NgtpNoise {
|
|
9
|
-
constructor() {
|
|
10
|
-
this.effect = inject(NgtpEffect, { host: true });
|
|
11
|
-
this.options = input({});
|
|
12
|
-
}
|
|
13
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.11", ngImport: i0, type: NgtpNoise, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
14
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "18.2.11", 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: i1.NgtpEffect, inputs: ["blendFunction", "blendFunction", "opacity", "opacity"] }], ngImport: i0, template: `
|
|
15
|
-
<ngt-noise-effect *args="[options()]" [camera]="effect.camera()">
|
|
16
|
-
<ngtp-effect-blend-mode />
|
|
17
|
-
<ng-content />
|
|
18
|
-
</ngt-noise-effect>
|
|
19
|
-
`, 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 }); }
|
|
20
|
-
}
|
|
21
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.11", ngImport: i0, type: NgtpNoise, decorators: [{
|
|
22
|
-
type: Component,
|
|
23
|
-
args: [{
|
|
24
|
-
selector: 'ngtp-noise',
|
|
25
|
-
template: `
|
|
26
|
-
<ngt-noise-effect *args="[options()]" [camera]="effect.camera()">
|
|
27
|
-
<ngtp-effect-blend-mode />
|
|
28
|
-
<ng-content />
|
|
29
|
-
</ngt-noise-effect>
|
|
30
|
-
`,
|
|
31
|
-
standalone: true,
|
|
32
|
-
schemas: [CUSTOM_ELEMENTS_SCHEMA],
|
|
33
|
-
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
34
|
-
imports: [NgtArgs, NgtpEffectBlendMode],
|
|
35
|
-
hostDirectives: [{ directive: NgtpEffect, inputs: ['blendFunction', 'opacity'] }],
|
|
36
|
-
providers: [provideDefaultEffectOptions({ blendFunction: BlendFunction.COLOR_DODGE })],
|
|
37
|
-
}]
|
|
38
|
-
}] });
|
|
39
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9pc2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9saWJzL3Bvc3Rwcm9jZXNzaW5nL3NyYy9saWIvZWZmZWN0cy9ub2lzZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsdUJBQXVCLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDMUcsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDaEQsT0FBTyxFQUFFLGFBQWEsRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM1RCxPQUFPLEVBQUUsVUFBVSxFQUFFLG1CQUFtQixFQUFFLDJCQUEyQixFQUFFLE1BQU0sV0FBVyxDQUFDOzs7QUFFekYsTUFBTSxDQUFDLEVBQUUsV0FBVyxFQUFFLENBQUMsQ0FBQztBQW1CeEIsTUFBTSxPQUFPLFNBQVM7SUFmdEI7UUFnQkMsV0FBTSxHQUFHLE1BQU0sQ0FBQyxVQUFVLEVBQUUsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUM1QyxZQUFPLEdBQUcsS0FBSyxDQUFDLEVBQStDLENBQUMsQ0FBQztLQUNqRTsrR0FIWSxTQUFTO21HQUFULFNBQVMsbU1BRlYsQ0FBQywyQkFBMkIsQ0FBQyxFQUFFLGFBQWEsRUFBRSxhQUFhLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyw0SUFYNUU7Ozs7O0VBS1QsNERBSVMsT0FBTyxnRkFBRSxtQkFBbUI7OzRGQUkxQixTQUFTO2tCQWZyQixTQUFTO21CQUFDO29CQUNWLFFBQVEsRUFBRSxZQUFZO29CQUN0QixRQUFRLEVBQUU7Ozs7O0VBS1Q7b0JBQ0QsVUFBVSxFQUFFLElBQUk7b0JBQ2hCLE9BQU8sRUFBRSxDQUFDLHNCQUFzQixDQUFDO29CQUNqQyxlQUFlLEVBQUUsdUJBQXVCLENBQUMsTUFBTTtvQkFDL0MsT0FBTyxFQUFFLENBQUMsT0FBTyxFQUFFLG1CQUFtQixDQUFDO29CQUN2QyxjQUFjLEVBQUUsQ0FBQyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLENBQUMsZUFBZSxFQUFFLFNBQVMsQ0FBQyxFQUFFLENBQUM7b0JBQ2pGLFNBQVMsRUFBRSxDQUFDLDJCQUEyQixDQUFDLEVBQUUsYUFBYSxFQUFFLGFBQWEsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDO2lCQUN0RiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENVU1RPTV9FTEVNRU5UU19TQ0hFTUEsIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIGluamVjdCwgaW5wdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE5ndEFyZ3MsIGV4dGVuZCB9IGZyb20gJ2FuZ3VsYXItdGhyZWUnO1xuaW1wb3J0IHsgQmxlbmRGdW5jdGlvbiwgTm9pc2VFZmZlY3QgfSBmcm9tICdwb3N0cHJvY2Vzc2luZyc7XG5pbXBvcnQgeyBOZ3RwRWZmZWN0LCBOZ3RwRWZmZWN0QmxlbmRNb2RlLCBwcm92aWRlRGVmYXVsdEVmZmVjdE9wdGlvbnMgfSBmcm9tICcuLi9lZmZlY3QnO1xuXG5leHRlbmQoeyBOb2lzZUVmZmVjdCB9KTtcblxuZXhwb3J0IHR5cGUgTm9pc2VFZmZlY3RPcHRpb25zID0gUGFydGlhbDxOb25OdWxsYWJsZTxDb25zdHJ1Y3RvclBhcmFtZXRlcnM8dHlwZW9mIE5vaXNlRWZmZWN0PlswXT4+O1xuXG5AQ29tcG9uZW50KHtcblx0c2VsZWN0b3I6ICduZ3RwLW5vaXNlJyxcblx0dGVtcGxhdGU6IGBcblx0XHQ8bmd0LW5vaXNlLWVmZmVjdCAqYXJncz1cIltvcHRpb25zKCldXCIgW2NhbWVyYV09XCJlZmZlY3QuY2FtZXJhKClcIj5cblx0XHRcdDxuZ3RwLWVmZmVjdC1ibGVuZC1tb2RlIC8+XG5cdFx0XHQ8bmctY29udGVudCAvPlxuXHRcdDwvbmd0LW5vaXNlLWVmZmVjdD5cblx0YCxcblx0c3RhbmRhbG9uZTogdHJ1ZSxcblx0c2NoZW1hczogW0NVU1RPTV9FTEVNRU5UU19TQ0hFTUFdLFxuXHRjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcblx0aW1wb3J0czogW05ndEFyZ3MsIE5ndHBFZmZlY3RCbGVuZE1vZGVdLFxuXHRob3N0RGlyZWN0aXZlczogW3sgZGlyZWN0aXZlOiBOZ3RwRWZmZWN0LCBpbnB1dHM6IFsnYmxlbmRGdW5jdGlvbicsICdvcGFjaXR5J10gfV0sXG5cdHByb3ZpZGVyczogW3Byb3ZpZGVEZWZhdWx0RWZmZWN0T3B0aW9ucyh7IGJsZW5kRnVuY3Rpb246IEJsZW5kRnVuY3Rpb24uQ09MT1JfRE9ER0UgfSldLFxufSlcbmV4cG9ydCBjbGFzcyBOZ3RwTm9pc2Uge1xuXHRlZmZlY3QgPSBpbmplY3QoTmd0cEVmZmVjdCwgeyBob3N0OiB0cnVlIH0pO1xuXHRvcHRpb25zID0gaW5wdXQoe30gYXMgT21pdDxOb2lzZUVmZmVjdE9wdGlvbnMsICdibGVuZEZ1bmN0aW9uJz4pO1xufVxuIl19
|
|
@@ -1,146 +0,0 @@
|
|
|
1
|
-
import { ChangeDetectionStrategy, Component, computed, CUSTOM_ELEMENTS_SCHEMA, effect, inject, input, untracked, } from '@angular/core';
|
|
2
|
-
import { injectStore, NgtArgs, NgtSelection, omit, pick, resolveRef } from 'angular-three';
|
|
3
|
-
import { mergeInputs } from 'ngxtension/inject-inputs';
|
|
4
|
-
import { OutlineEffect } from 'postprocessing';
|
|
5
|
-
import { NgtpEffectComposer } from '../effect-composer';
|
|
6
|
-
import * as i0 from "@angular/core";
|
|
7
|
-
const defaultOptions = {
|
|
8
|
-
selectionLayer: 10,
|
|
9
|
-
};
|
|
10
|
-
export class NgtpOutline {
|
|
11
|
-
constructor() {
|
|
12
|
-
this.options = input(defaultOptions, { transform: mergeInputs(defaultOptions) });
|
|
13
|
-
this.ngtSelection = inject(NgtSelection, { optional: true });
|
|
14
|
-
this.effectComposer = inject(NgtpEffectComposer);
|
|
15
|
-
this.store = injectStore();
|
|
16
|
-
this.invalidate = this.store.select('invalidate');
|
|
17
|
-
this.selection = pick(this.options, 'selection');
|
|
18
|
-
this.selectionLayer = pick(this.options, 'selectionLayer');
|
|
19
|
-
this.blendFunction = pick(this.options, 'blendFunction');
|
|
20
|
-
this.patternTexture = pick(this.options, 'patternTexture');
|
|
21
|
-
this.edgeStrength = pick(this.options, 'edgeStrength');
|
|
22
|
-
this.pulseSpeed = pick(this.options, 'pulseSpeed');
|
|
23
|
-
this.visibleEdgeColor = pick(this.options, 'visibleEdgeColor');
|
|
24
|
-
this.hiddenEdgeColor = pick(this.options, 'hiddenEdgeColor');
|
|
25
|
-
this.width = pick(this.options, 'width');
|
|
26
|
-
this.height = pick(this.options, 'height');
|
|
27
|
-
this.kernelSize = pick(this.options, 'kernelSize');
|
|
28
|
-
this.blur = pick(this.options, 'blur');
|
|
29
|
-
this.xRay = pick(this.options, 'xRay');
|
|
30
|
-
this.restOptions = omit(this.options, [
|
|
31
|
-
'blendFunction',
|
|
32
|
-
'patternTexture',
|
|
33
|
-
'edgeStrength',
|
|
34
|
-
'pulseSpeed',
|
|
35
|
-
'visibleEdgeColor',
|
|
36
|
-
'hiddenEdgeColor',
|
|
37
|
-
'width',
|
|
38
|
-
'height',
|
|
39
|
-
'kernelSize',
|
|
40
|
-
'blur',
|
|
41
|
-
'xRay',
|
|
42
|
-
]);
|
|
43
|
-
this.effect = computed(() => {
|
|
44
|
-
const [scene, camera, blendFunction, patternTexture, edgeStrength, pulseSpeed, visibleEdgeColor, hiddenEdgeColor, width, height, kernelSize, blur, xRay, restOptions,] = [
|
|
45
|
-
this.effectComposer.scene(),
|
|
46
|
-
this.effectComposer.camera(),
|
|
47
|
-
this.blendFunction(),
|
|
48
|
-
this.patternTexture(),
|
|
49
|
-
this.edgeStrength(),
|
|
50
|
-
this.pulseSpeed(),
|
|
51
|
-
this.visibleEdgeColor(),
|
|
52
|
-
this.hiddenEdgeColor(),
|
|
53
|
-
this.width(),
|
|
54
|
-
this.height(),
|
|
55
|
-
this.kernelSize(),
|
|
56
|
-
this.blur(),
|
|
57
|
-
this.xRay(),
|
|
58
|
-
untracked(this.restOptions),
|
|
59
|
-
];
|
|
60
|
-
return new OutlineEffect(scene, camera, {
|
|
61
|
-
blendFunction,
|
|
62
|
-
patternTexture,
|
|
63
|
-
edgeStrength,
|
|
64
|
-
pulseSpeed,
|
|
65
|
-
visibleEdgeColor,
|
|
66
|
-
hiddenEdgeColor,
|
|
67
|
-
width,
|
|
68
|
-
height,
|
|
69
|
-
kernelSize,
|
|
70
|
-
blur,
|
|
71
|
-
xRay,
|
|
72
|
-
...restOptions,
|
|
73
|
-
});
|
|
74
|
-
});
|
|
75
|
-
effect((onCleanup) => {
|
|
76
|
-
const effect = this.effect();
|
|
77
|
-
onCleanup(() => effect.dispose());
|
|
78
|
-
});
|
|
79
|
-
effect(() => {
|
|
80
|
-
const [effect, invalidate, selectionLayer] = [this.effect(), this.invalidate(), this.selectionLayer()];
|
|
81
|
-
effect.selectionLayer = selectionLayer;
|
|
82
|
-
invalidate();
|
|
83
|
-
});
|
|
84
|
-
effect((onCleanup) => {
|
|
85
|
-
// NOTE: we run this effect if declarative NgtSelection is not enabled
|
|
86
|
-
if (!this.ngtSelection) {
|
|
87
|
-
// NOTE: if NgtSelection is not used and selection is not provided, we throw
|
|
88
|
-
if (this.selection() === undefined) {
|
|
89
|
-
throw new Error('[NGT PostProcessing]: ngtp-outline requires selection input or use NgtSelection');
|
|
90
|
-
}
|
|
91
|
-
const cleanup = this.handleSelectionChangeEffect(this.selection, this.effect, this.invalidate);
|
|
92
|
-
onCleanup(() => {
|
|
93
|
-
cleanup?.();
|
|
94
|
-
});
|
|
95
|
-
return;
|
|
96
|
-
}
|
|
97
|
-
// NOTE: we run this effect if declarative NgtSelection is enabled
|
|
98
|
-
const selectionEnabled = this.ngtSelection.enabled();
|
|
99
|
-
if (!selectionEnabled)
|
|
100
|
-
return;
|
|
101
|
-
const cleanup = this.handleSelectionChangeEffect(this.ngtSelection.selected, this.effect, this.invalidate);
|
|
102
|
-
onCleanup(() => {
|
|
103
|
-
cleanup?.();
|
|
104
|
-
});
|
|
105
|
-
});
|
|
106
|
-
}
|
|
107
|
-
handleSelectionChangeEffect(selected, _effect, _invalidate) {
|
|
108
|
-
const selection = selected();
|
|
109
|
-
if (!selection || selection.length === 0)
|
|
110
|
-
return;
|
|
111
|
-
const [effect, invalidate] = [_effect(), _invalidate()];
|
|
112
|
-
const objects = [];
|
|
113
|
-
for (const el of selection) {
|
|
114
|
-
const obj = resolveRef(el);
|
|
115
|
-
if (!obj)
|
|
116
|
-
continue;
|
|
117
|
-
objects.push(obj);
|
|
118
|
-
}
|
|
119
|
-
if (objects.length === 0)
|
|
120
|
-
return;
|
|
121
|
-
effect.selection.set(objects);
|
|
122
|
-
invalidate();
|
|
123
|
-
return () => {
|
|
124
|
-
effect.selection.clear();
|
|
125
|
-
invalidate();
|
|
126
|
-
};
|
|
127
|
-
}
|
|
128
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.11", ngImport: i0, type: NgtpOutline, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
129
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "18.2.11", type: NgtpOutline, isStandalone: true, selector: "ngtp-outline", inputs: { options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: `
|
|
130
|
-
<ngt-primitive *args="[effect()]" />
|
|
131
|
-
`, isInline: true, dependencies: [{ kind: "directive", type: NgtArgs, selector: "ng-template[args]", inputs: ["args"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
132
|
-
}
|
|
133
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.11", ngImport: i0, type: NgtpOutline, decorators: [{
|
|
134
|
-
type: Component,
|
|
135
|
-
args: [{
|
|
136
|
-
selector: 'ngtp-outline',
|
|
137
|
-
standalone: true,
|
|
138
|
-
template: `
|
|
139
|
-
<ngt-primitive *args="[effect()]" />
|
|
140
|
-
`,
|
|
141
|
-
schemas: [CUSTOM_ELEMENTS_SCHEMA],
|
|
142
|
-
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
143
|
-
imports: [NgtArgs],
|
|
144
|
-
}]
|
|
145
|
-
}], ctorParameters: () => [] });
|
|
146
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3V0bGluZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvcG9zdHByb2Nlc3Npbmcvc3JjL2xpYi9lZmZlY3RzL291dGxpbmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNOLHVCQUF1QixFQUN2QixTQUFTLEVBQ1QsUUFBUSxFQUNSLHNCQUFzQixFQUN0QixNQUFNLEVBRU4sTUFBTSxFQUNOLEtBQUssRUFDTCxTQUFTLEdBQ1QsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFdBQVcsRUFBRSxPQUFPLEVBQUUsWUFBWSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNGLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUN2RCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFL0MsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sb0JBQW9CLENBQUM7O0FBT3hELE1BQU0sY0FBYyxHQUF1QjtJQUMxQyxjQUFjLEVBQUUsRUFBRTtDQUNsQixDQUFDO0FBWUYsTUFBTSxPQUFPLFdBQVc7SUFxRnZCO1FBcEZBLFlBQU8sR0FBRyxLQUFLLENBQUMsY0FBYyxFQUFFLEVBQUUsU0FBUyxFQUFFLFdBQVcsQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDLENBQUM7UUFFcEUsaUJBQVksR0FBRyxNQUFNLENBQUMsWUFBWSxFQUFFLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7UUFDeEQsbUJBQWMsR0FBRyxNQUFNLENBQUMsa0JBQWtCLENBQUMsQ0FBQztRQUM1QyxVQUFLLEdBQUcsV0FBVyxFQUFFLENBQUM7UUFDdEIsZUFBVSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBRTdDLGNBQVMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFD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QVcsa05BUGI7O0VBRVQsNERBR1MsT0FBTzs7NEZBRUwsV0FBVztrQkFWdkIsU0FBUzttQkFBQztvQkFDVixRQUFRLEVBQUUsY0FBYztvQkFDeEIsVUFBVSxFQUFFLElBQUk7b0JBQ2hCLFFBQVEsRUFBRTs7RUFFVDtvQkFDRCxPQUFPLEVBQUUsQ0FBQyxzQkFBc0IsQ0FBQztvQkFDakMsZUFBZSxFQUFFLHVCQUF1QixDQUFDLE1BQU07b0JBQy9DLE9BQU8sRUFBRSxDQUFDLE9BQU8sQ0FBQztpQkFDbEIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuXHRDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcblx0Q29tcG9uZW50LFxuXHRjb21wdXRlZCxcblx0Q1VTVE9NX0VMRU1FTlRTX1NDSEVNQSxcblx0ZWZmZWN0LFxuXHRFbGVtZW50UmVmLFxuXHRpbmplY3QsXG5cdGlucHV0LFxuXHR1bnRyYWNrZWQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgaW5qZWN0U3RvcmUsIE5ndEFyZ3MsIE5ndFNlbGVjdGlvbiwgb21pdCwgcGljaywgcmVzb2x2ZVJlZiB9IGZyb20gJ2FuZ3VsYXItdGhyZWUnO1xuaW1wb3J0IHsgbWVyZ2VJbnB1dHMgfSBmcm9tICduZ3h0ZW5zaW9uL2luamVjdC1pbnB1dHMnO1xuaW1wb3J0IHsgT3V0bGluZUVmZmVjdCB9IGZyb20gJ3Bvc3Rwcm9jZXNzaW5nJztcbmltcG9ydCB7IE9iamVjdDNEIH0gZnJvbSAndGhyZWUnO1xuaW1wb3J0IHsgTmd0cEVmZmVjdENvbXBvc2VyIH0gZnJvbSAnLi4vZWZmZWN0LWNvbXBvc2VyJztcblxuZXhwb3J0IHR5cGUgTmd0cE91dGxpbmVPcHRpb25zID0gQ29uc3RydWN0b3JQYXJhbWV0ZXJzPHR5cGVvZiBPdXRsaW5lRWZmZWN0PlsyXSAmIHtcblx0c2VsZWN0aW9uPzogQXJyYXk8T2JqZWN0M0QgfCBFbGVtZW50UmVmPE9iamVjdDNEPj47XG5cdHNlbGVjdGlvbkxheWVyOiBudW1iZXI7XG59O1xuXG5jb25zdCBkZWZhdWx0T3B0aW9uczogTmd0cE91dGxpbmVPcHRpb25zID0ge1xuXHRzZWxlY3Rpb25MYXllcjogMTAsXG59O1xuXG5AQ29tcG9uZW50KHtcblx0c2VsZWN0b3I6ICduZ3RwLW91dGxpbmUnLFxuXHRzdGFuZGFsb25lOiB0cnVlLFxuXHR0ZW1wbGF0ZTogYFxuXHRcdDxuZ3QtcHJpbWl0aXZlICphcmdzPVwiW2VmZmVjdCgpXVwiIC8+XG5cdGAsXG5cdHNjaGVtYXM6IFtDVVNUT01fRUxFTUVOVFNfU0NIRU1BXSxcblx0Y2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG5cdGltcG9ydHM6IFtOZ3RBcmdzXSxcbn0pXG5leHBvcnQgY2xhc3MgTmd0cE91dGxpbmUge1xuXHRvcHRpb25zID0gaW5wdXQoZGVmYXVsdE9wdGlvbnMsIHsgdHJhbnNmb3JtOiBtZXJnZUlucHV0cyhkZWZhdWx0T3B0aW9ucykgfSk7XG5cblx0cHJpdmF0ZSBuZ3RTZWxlY3Rpb24gPSBpbmplY3QoTmd0U2VsZWN0aW9uLCB7IG9wdGlvbmFsOiB0cnVlIH0pO1xuXHRwcml2YXRlIGVmZmVjdENvbXBvc2VyID0gaW5qZWN0KE5ndHBFZmZlY3RDb21wb3Nlcik7XG5cdHByaXZhdGUgc3RvcmUgPSBpbmplY3RTdG9yZSgpO1xuXHRwcml2YXRlIGludmFsaWRhdGUgPSB0aGlzLnN0b3JlLnNlbGVjdCgnaW52YWxpZGF0ZScpO1xuXG5cdHByaXZhdGUgc2VsZWN0aW9uID0gcGljayh0aGlzLm9wdGlvbnMsICdzZWxlY3Rpb24nKTtcblx0cHJpdmF0ZSBzZWxlY3Rpb25MYXllciA9IHBpY2sodGhpcy5vcHRpb25zLCAnc2VsZWN0aW9uTGF5ZXInKTtcblxuXHRwcml2YXRlIGJsZW5kRnVuY3Rpb24gPSBwaWNrKHRoaXMub3B0aW9ucywgJ2JsZW5kRnVuY3Rpb24nKTtcblx0cHJpdmF0ZSBwYXR0ZXJuVGV4dHVyZSA9IHBpY2sodGhpcy5vcHRpb25zLCAncGF0dGVyblRleHR1cmUnKTtcblx0cHJpdmF0ZSBlZGdlU3RyZW5ndGggPSBwaWNrKHRoaXMub3B0aW9ucywgJ2VkZ2VTdHJlbmd0aCcpO1xuXHRwcml2YXRlIHB1bHNlU3BlZWQgPSBwaWNrKHRoaXMub3B0aW9ucywgJ3B1bHNlU3BlZWQnKTtcblx0cHJpdmF0ZSB2aXNpYmxlRWRnZUNvbG9yID0gcGljayh0aGlzLm9wdGlvbnMsICd2aXNpYmxlRWRnZUNvbG9yJyk7XG5cdHByaXZhdGUgaGlkZGVuRWRnZUNvbG9yID0gcGljayh0aGlzLm9wdGlvbnMsICdoaWRkZW5FZGdlQ29sb3InKTtcblx0cHJpdmF0ZSB3aWR0aCA9IHBpY2sodGhpcy5vcHRpb25zLCAnd2lkdGgnKTtcblx0cHJpdmF0ZSBoZWlnaHQgPSBwaWNrKHRoaXMub3B0aW9ucywgJ2hlaWdodCcpO1xuXHRwcml2YXRlIGtlcm5lbFNpemUgPSBwaWNrKHRoaXMub3B0aW9ucywgJ2tlcm5lbFNpemUnKTtcblx0cHJpdmF0ZSBibHVyID0gcGljayh0aGlzLm9wdGlvbnMsICdibHVyJyk7XG5cdHByaXZhdGUgeFJheSA9IHBpY2sodGhpcy5vcHRpb25zLCAneFJheScpO1xuXHRwcml2YXRlIHJlc3RPcHRpb25zID0gb21pdCh0aGlzLm9wdGlvbnMsIFtcblx0XHQnYmxlbmRGdW5jdGlvbicsXG5cdFx0J3BhdHRlcm5UZXh0dXJlJyxcblx0XHQnZWRnZVN0cmVuZ3RoJyxcblx0XHQncHVsc2VTcGVlZCcsXG5cdFx0J3Zpc2libGVFZGdlQ29sb3InLFxuXHRcdCdoaWRkZW5FZGdlQ29sb3InLFxuXHRcdCd3aWR0aCcsXG5cdFx0J2hlaWdodCcsXG5cdFx0J2tlcm5lbFNpemUnLFxuXHRcdCdibHVyJyxcblx0XHQneFJheScsXG5cdF0pO1xuXG5cdGVmZmVjdCA9IGNvbXB1dGVkKCgpID0+IHtcblx0XHRjb25zdCBbXG5cdFx0XHRzY2VuZSxcblx0XHRcdGNhbWVyYSxcblx0XHRcdGJsZW5kRnVuY3Rpb24sXG5cdFx0XHRwYXR0ZXJuVGV4dHVyZSxcblx0XHRcdGVkZ2VTdHJlbmd0aCxcblx0XHRcdHB1bHNlU3BlZWQsXG5cdFx0XHR2aXNpYmxlRWRnZUNvbG9yLFxuXHRcdFx0aGlkZGVuRWRnZUNvbG9yLFxuXHRcdFx0d2lkdGgsXG5cdFx0XHRoZWlnaHQsXG5cdFx0XHRrZXJuZWxTaXplLFxuXHRcdFx0Ymx1cixcblx0XHRcdHhSYXksXG5cdFx0XHRyZXN0T3B0aW9ucyxcblx0XHRdID0gW1xuXHRcdFx0dGhpcy5lZmZlY3RDb21wb3Nlci5zY2VuZSgpLFxuXHRcdFx0dGhpcy5lZmZlY3RDb21wb3Nlci5jYW1lcmEoKSxcblx0XHRcdHRoaXMuYmxlbmRGdW5jdGlvbigpLFxuXHRcdFx0dGhpcy5wYXR0ZXJuVGV4dHVyZSgpLFxuXHRcdFx0dGhpcy5lZGdlU3RyZW5ndGgoKSxcblx0XHRcdHRoaXMucHVsc2VTcGVlZCgpLFxuXHRcdFx0dGhpcy52aXNpYmxlRWRnZUNvbG9yKCksXG5cdFx0XHR0aGlzLmhpZGRlbkVkZ2VDb2xvcigpLFxuXHRcdFx0dGhpcy53aWR0aCgpLFxuXHRcdFx0dGhpcy5oZWlnaHQoKSxcblx0XHRcdHRoaXMua2VybmVsU2l6ZSgpLFxuXHRcdFx0dGhpcy5ibHVyKCksXG5cdFx0XHR0aGlzLnhSYXkoKSxcblx0XHRcdHVudHJhY2tlZCh0aGlzLnJlc3RPcHRpb25zKSxcblx0XHRdO1xuXG5cdFx0cmV0dXJuIG5ldyBPdXRsaW5lRWZmZWN0KHNjZW5lLCBjYW1lcmEsIHtcblx0XHRcdGJsZW5kRnVuY3Rpb24sXG5cdFx0XHRwYXR0ZXJuVGV4dHVyZSxcblx0XHRcdGVkZ2VTdHJlbmd0aCxcblx0XHRcdHB1bHNlU3BlZWQsXG5cdFx0XHR2aXNpYmxlRWRnZUNvbG9yLFxuXHRcdFx0aGlkZGVuRWRnZUNvbG9yLFxuXHRcdFx0d2lkdGgsXG5cdFx0XHRoZWlnaHQsXG5cdFx0XHRrZXJuZWxTaXplLFxuXHRcdFx0Ymx1cixcblx0XHRcdHhSYXksXG5cdFx0XHQuLi5yZXN0T3B0aW9ucyxcblx0XHR9KTtcblx0fSk7XG5cblx0Y29uc3RydWN0b3IoKSB7XG5cdFx0ZWZmZWN0KChvbkNsZWFudXApID0+IHtcblx0XHRcdGNvbnN0IGVmZmVjdCA9IHRoaXMuZWZmZWN0KCk7XG5cdFx0XHRvbkNsZWFudXAoKCkgPT4gZWZmZWN0LmRpc3Bvc2UoKSk7XG5cdFx0fSk7XG5cblx0XHRlZmZlY3QoKCkgPT4ge1xuXHRcdFx0Y29uc3QgW2VmZmVjdCwgaW52YWxpZGF0ZSwgc2VsZWN0aW9uTGF5ZXJdID0gW3RoaXMuZWZmZWN0KCksIHRoaXMuaW52YWxpZGF0ZSgpLCB0aGlzLnNlbGVjdGlvbkxheWVyKCldO1xuXHRcdFx0ZWZmZWN0LnNlbGVjdGlvbkxheWVyID0gc2VsZWN0aW9uTGF5ZXI7XG5cdFx0XHRpbnZhbGlkYXRlKCk7XG5cdFx0fSk7XG5cblx0XHRlZmZlY3QoKG9uQ2xlYW51cCkgPT4ge1xuXHRcdFx0Ly8gTk9URTogd2UgcnVuIHRoaXMgZWZmZWN0IGlmIGRlY2xhcmF0aXZlIE5ndFNlbGVjdGlvbiBpcyBub3QgZW5hYmxlZFxuXHRcdFx0aWYgKCF0aGlzLm5ndFNlbGVjdGlvbikge1xuXHRcdFx0XHQvLyBOT1RFOiBpZiBOZ3RTZWxlY3Rpb24gaXMgbm90IHVzZWQgYW5kIHNlbGVjdGlvbiBpcyBub3QgcHJvdmlkZWQsIHdlIHRocm93XG5cdFx0XHRcdGlmICh0aGlzLnNlbGVjdGlvbigpID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoJ1tOR1QgUG9zdFByb2Nlc3NpbmddOiBuZ3RwLW91dGxpbmUgcmVxdWlyZXMgc2VsZWN0aW9uIGlucHV0IG9yIHVzZSBOZ3RTZWxlY3Rpb24nKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRjb25zdCBjbGVhbnVwID0gdGhpcy5oYW5kbGVTZWxlY3Rpb25DaGFuZ2VFZmZlY3QodGhpcy5zZWxlY3Rpb24sIHRoaXMuZWZmZWN0LCB0aGlzLmludmFsaWRhdGUpO1xuXG5cdFx0XHRcdG9uQ2xlYW51cCgoKSA9PiB7XG5cdFx0XHRcdFx0Y2xlYW51cD8uKCk7XG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdC8vIE5PVEU6IHdlIHJ1biB0aGlzIGVmZmVjdCBpZiBkZWNsYXJhdGl2ZSBOZ3RTZWxlY3Rpb24gaXMgZW5hYmxlZFxuXHRcdFx0Y29uc3Qgc2VsZWN0aW9uRW5hYmxlZCA9IHRoaXMubmd0U2VsZWN0aW9uLmVuYWJsZWQoKTtcblx0XHRcdGlmICghc2VsZWN0aW9uRW5hYmxlZCkgcmV0dXJuO1xuXHRcdFx0Y29uc3QgY2xlYW51cCA9IHRoaXMuaGFuZGxlU2VsZWN0aW9uQ2hhbmdlRWZmZWN0KHRoaXMubmd0U2VsZWN0aW9uLnNlbGVjdGVkLCB0aGlzLmVmZmVjdCwgdGhpcy5pbnZhbGlkYXRlKTtcblx0XHRcdG9uQ2xlYW51cCgoKSA9PiB7XG5cdFx0XHRcdGNsZWFudXA/LigpO1xuXHRcdFx0fSk7XG5cdFx0fSk7XG5cdH1cblxuXHRwcml2YXRlIGhhbmRsZVNlbGVjdGlvbkNoYW5nZUVmZmVjdChcblx0XHRzZWxlY3RlZDogKCkgPT4gQXJyYXk8T2JqZWN0M0QgfCBFbGVtZW50UmVmPE9iamVjdDNEPj4gfCB1bmRlZmluZWQsXG5cdFx0X2VmZmVjdDogKCkgPT4gT3V0bGluZUVmZmVjdCxcblx0XHRfaW52YWxpZGF0ZTogKCkgPT4gKCkgPT4gdm9pZCxcblx0KSB7XG5cdFx0Y29uc3Qgc2VsZWN0aW9uID0gc2VsZWN0ZWQoKTtcblx0XHRpZiAoIXNlbGVjdGlvbiB8fCBzZWxlY3Rpb24ubGVuZ3RoID09PSAwKSByZXR1cm47XG5cblx0XHRjb25zdCBbZWZmZWN0LCBpbnZhbGlkYXRlXSA9IFtfZWZmZWN0KCksIF9pbnZhbGlkYXRlKCldO1xuXG5cdFx0Y29uc3Qgb2JqZWN0czogT2JqZWN0M0RbXSA9IFtdO1xuXHRcdGZvciAoY29uc3QgZWwgb2Ygc2VsZWN0aW9uKSB7XG5cdFx0XHRjb25zdCBvYmogPSByZXNvbHZlUmVmKGVsKTtcblx0XHRcdGlmICghb2JqKSBjb250aW51ZTtcblx0XHRcdG9iamVjdHMucHVzaChvYmopO1xuXHRcdH1cblxuXHRcdGlmIChvYmplY3RzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG5cdFx0ZWZmZWN0LnNlbGVjdGlvbi5zZXQob2JqZWN0cyk7XG5cdFx0aW52YWxpZGF0ZSgpO1xuXG5cdFx0cmV0dXJuICgpID0+IHtcblx0XHRcdGVmZmVjdC5zZWxlY3Rpb24uY2xlYXIoKTtcblx0XHRcdGludmFsaWRhdGUoKTtcblx0XHR9O1xuXHR9XG59XG4iXX0=
|
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
import { CUSTOM_ELEMENTS_SCHEMA, ChangeDetectionStrategy, Component, computed, effect, input } from '@angular/core';
|
|
2
|
-
import { NgtArgs, pick } from 'angular-three';
|
|
3
|
-
import { mergeInputs } from 'ngxtension/inject-inputs';
|
|
4
|
-
import { PixelationEffect } from 'postprocessing';
|
|
5
|
-
import * as i0 from "@angular/core";
|
|
6
|
-
export class NgtpPixelation {
|
|
7
|
-
constructor() {
|
|
8
|
-
this.options = input({ granularity: 5 }, { transform: mergeInputs({ granularity: 5 }) });
|
|
9
|
-
this.granularity = pick(this.options, 'granularity');
|
|
10
|
-
this.effect = computed(() => new PixelationEffect(this.granularity()));
|
|
11
|
-
effect((onCleanup) => {
|
|
12
|
-
const effect = this.effect();
|
|
13
|
-
onCleanup(() => effect.dispose());
|
|
14
|
-
});
|
|
15
|
-
}
|
|
16
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.11", ngImport: i0, type: NgtpPixelation, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
17
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "18.2.11", type: NgtpPixelation, isStandalone: true, selector: "ngtp-pixelation", inputs: { options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: `
|
|
18
|
-
<ngt-primitive *args="[effect()]" />
|
|
19
|
-
`, isInline: true, dependencies: [{ kind: "directive", type: NgtArgs, selector: "ng-template[args]", inputs: ["args"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
20
|
-
}
|
|
21
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.11", ngImport: i0, type: NgtpPixelation, decorators: [{
|
|
22
|
-
type: Component,
|
|
23
|
-
args: [{
|
|
24
|
-
selector: 'ngtp-pixelation',
|
|
25
|
-
template: `
|
|
26
|
-
<ngt-primitive *args="[effect()]" />
|
|
27
|
-
`,
|
|
28
|
-
standalone: true,
|
|
29
|
-
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
30
|
-
schemas: [CUSTOM_ELEMENTS_SCHEMA],
|
|
31
|
-
imports: [NgtArgs],
|
|
32
|
-
}]
|
|
33
|
-
}], ctorParameters: () => [] });
|
|
34
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGl4ZWxhdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvcG9zdHByb2Nlc3Npbmcvc3JjL2xpYi9lZmZlY3RzL3BpeGVsYXRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLHNCQUFzQixFQUFFLHVCQUF1QixFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNwSCxPQUFPLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM5QyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDdkQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7O0FBZWxELE1BQU0sT0FBTyxjQUFjO0lBTTFCO1FBTEEsWUFBTyxHQUFHLEtBQUssQ0FBQyxFQUFFLFdBQVcsRUFBRSxDQUFDLEVBQXVCLEVBQUUsRUFBRSxTQUFTLEVBQUUsV0FBVyxDQUFDLEVBQUUsV0FBVyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ2pHLGdCQUFXLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsYUFBYSxDQUFDLENBQUM7UUFFeEQsV0FBTSxHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLGdCQUFnQixDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFHakUsTUFBTSxDQUFDLENBQUMsU0FBUyxFQUFFLEVBQUU7WUFDcEIsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQzdCLFNBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztRQUNuQyxDQUFDLENBQUMsQ0FBQztJQUNKLENBQUM7K0dBWFcsY0FBYzttR0FBZCxjQUFjLHFOQVJoQjs7RUFFVCw0REFJUyxPQUFPOzs0RkFFTCxjQUFjO2tCQVYxQixTQUFTO21CQUFDO29CQUNWLFFBQVEsRUFBRSxpQkFBaUI7b0JBQzNCLFFBQVEsRUFBRTs7RUFFVDtvQkFDRCxVQUFVLEVBQUUsSUFBSTtvQkFDaEIsZUFBZSxFQUFFLHVCQUF1QixDQUFDLE1BQU07b0JBQy9DLE9BQU8sRUFBRSxDQUFDLHNCQUFzQixDQUFDO29CQUNqQyxPQUFPLEVBQUUsQ0FBQyxPQUFPLENBQUM7aUJBQ2xCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ1VTVE9NX0VMRU1FTlRTX1NDSEVNQSwgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENvbXBvbmVudCwgY29tcHV0ZWQsIGVmZmVjdCwgaW5wdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE5ndEFyZ3MsIHBpY2sgfSBmcm9tICdhbmd1bGFyLXRocmVlJztcbmltcG9ydCB7IG1lcmdlSW5wdXRzIH0gZnJvbSAnbmd4dGVuc2lvbi9pbmplY3QtaW5wdXRzJztcbmltcG9ydCB7IFBpeGVsYXRpb25FZmZlY3QgfSBmcm9tICdwb3N0cHJvY2Vzc2luZyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGl4ZWxhdGlvbk9wdGlvbnMge1xuXHRncmFudWxhcml0eTogbnVtYmVyO1xufVxuQENvbXBvbmVudCh7XG5cdHNlbGVjdG9yOiAnbmd0cC1waXhlbGF0aW9uJyxcblx0dGVtcGxhdGU6IGBcblx0XHQ8bmd0LXByaW1pdGl2ZSAqYXJncz1cIltlZmZlY3QoKV1cIiAvPlxuXHRgLFxuXHRzdGFuZGFsb25lOiB0cnVlLFxuXHRjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcblx0c2NoZW1hczogW0NVU1RPTV9FTEVNRU5UU19TQ0hFTUFdLFxuXHRpbXBvcnRzOiBbTmd0QXJnc10sXG59KVxuZXhwb3J0IGNsYXNzIE5ndHBQaXhlbGF0aW9uIHtcblx0b3B0aW9ucyA9IGlucHV0KHsgZ3JhbnVsYXJpdHk6IDUgfSBhcyBQaXhlbGF0aW9uT3B0aW9ucywgeyB0cmFuc2Zvcm06IG1lcmdlSW5wdXRzKHsgZ3JhbnVsYXJpdHk6IDUgfSkgfSk7XG5cdHByaXZhdGUgZ3JhbnVsYXJpdHkgPSBwaWNrKHRoaXMub3B0aW9ucywgJ2dyYW51bGFyaXR5Jyk7XG5cblx0ZWZmZWN0ID0gY29tcHV0ZWQoKCkgPT4gbmV3IFBpeGVsYXRpb25FZmZlY3QodGhpcy5ncmFudWxhcml0eSgpKSk7XG5cblx0Y29uc3RydWN0b3IoKSB7XG5cdFx0ZWZmZWN0KChvbkNsZWFudXApID0+IHtcblx0XHRcdGNvbnN0IGVmZmVjdCA9IHRoaXMuZWZmZWN0KCk7XG5cdFx0XHRvbkNsZWFudXAoKCkgPT4gZWZmZWN0LmRpc3Bvc2UoKSk7XG5cdFx0fSk7XG5cdH1cbn1cbiJdfQ==
|