angular-three-soba 2.14.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/abstractions/lib/catmull-rom-line.d.ts +117 -117
- package/abstractions/lib/edges.d.ts +126 -126
- package/abstractions/lib/grid.d.ts +15 -15
- package/abstractions/lib/line.d.ts +1 -1
- package/abstractions/lib/prism-geometry.d.ts +4 -4
- package/abstractions/lib/rounded-box.d.ts +1 -1
- package/abstractions/lib/text-3d.d.ts +22 -22
- package/abstractions/lib/text.d.ts +1 -1
- package/cameras/lib/cube-camera.d.ts +1 -1
- package/cameras/lib/orthographic-camera.d.ts +1 -1
- package/cameras/lib/perspective-camera.d.ts +1 -1
- package/controls/index.d.ts +0 -9
- package/controls/lib/camera-controls.d.ts +1 -1
- package/controls/lib/orbit-controls.d.ts +1 -1
- package/fesm2022/angular-three-soba-abstractions.mjs +41 -52
- package/fesm2022/angular-three-soba-abstractions.mjs.map +1 -1
- package/fesm2022/angular-three-soba-cameras.mjs +12 -15
- package/fesm2022/angular-three-soba-cameras.mjs.map +1 -1
- package/fesm2022/angular-three-soba-controls.mjs +16 -24
- package/fesm2022/angular-three-soba-controls.mjs.map +1 -1
- package/fesm2022/angular-three-soba-gizmos.mjs +59 -60
- package/fesm2022/angular-three-soba-gizmos.mjs.map +1 -1
- package/fesm2022/angular-three-soba-loaders.mjs +3 -3
- package/fesm2022/angular-three-soba-loaders.mjs.map +1 -1
- package/fesm2022/angular-three-soba-materials.mjs +27 -35
- package/fesm2022/angular-three-soba-materials.mjs.map +1 -1
- package/fesm2022/angular-three-soba-misc.mjs +27 -29
- package/fesm2022/angular-three-soba-misc.mjs.map +1 -1
- package/fesm2022/angular-three-soba-performances.mjs +31 -34
- package/fesm2022/angular-three-soba-performances.mjs.map +1 -1
- package/fesm2022/angular-three-soba-shaders.mjs.map +1 -1
- package/fesm2022/angular-three-soba-staging.mjs +91 -105
- package/fesm2022/angular-three-soba-staging.mjs.map +1 -1
- package/fesm2022/angular-three-soba-stats.mjs +3 -3
- package/fesm2022/angular-three-soba-stats.mjs.map +1 -1
- package/gizmos/lib/gizmo-helper/gizmo-viewport.d.ts +1 -1
- package/gizmos/lib/pivot-controls/axis-arrow.d.ts +1 -1
- package/gizmos/lib/pivot-controls/axis-rotator.d.ts +1 -1
- package/gizmos/lib/pivot-controls/pivot-controls.d.ts +1 -1
- package/gizmos/lib/pivot-controls/plane-slider.d.ts +1 -1
- package/gizmos/lib/pivot-controls/scaling-sphere.d.ts +1 -1
- package/gizmos/lib/transform-controls.d.ts +2 -2
- package/materials/lib/custom-shader-material.d.ts +2 -2
- package/materials/lib/mesh-portal-material.d.ts +9 -9
- package/materials/lib/mesh-refraction-material.d.ts +2 -2
- package/materials/lib/mesh-transmission-material.d.ts +1 -1
- package/misc/lib/computed-attribute.d.ts +6 -6
- package/misc/lib/decal.d.ts +1 -1
- package/misc/lib/html/html.d.ts +2 -2
- package/misc/lib/sampler.d.ts +1 -1
- package/package.json +11 -37
- package/performances/lib/instances/instances.d.ts +5 -5
- package/performances/lib/points/points.d.ts +10 -10
- package/performances/lib/segments/segments.d.ts +4 -4
- package/shaders/lib/mesh-refraction-material.d.ts +2 -2
- package/staging/lib/caustics.d.ts +1 -1
- package/staging/lib/center.d.ts +2 -2
- package/staging/lib/contact-shadows.d.ts +1 -1
- package/staging/lib/lightformer.d.ts +1 -1
- package/staging/lib/mask.d.ts +1 -1
- package/staging/lib/render-texture.d.ts +1 -1
- package/staging/lib/spot-light.d.ts +2 -2
- package/esm2022/abstractions/angular-three-soba-abstractions.mjs +0 -5
- package/esm2022/abstractions/index.mjs +0 -14
- package/esm2022/abstractions/lib/billboard.mjs +0 -69
- package/esm2022/abstractions/lib/catmull-rom-line.mjs +0 -76
- package/esm2022/abstractions/lib/cubic-bezier-line.mjs +0 -51
- package/esm2022/abstractions/lib/edges.mjs +0 -66
- package/esm2022/abstractions/lib/gradient-texture.mjs +0 -91
- package/esm2022/abstractions/lib/grid.mjs +0 -103
- package/esm2022/abstractions/lib/helper.mjs +0 -74
- package/esm2022/abstractions/lib/line.mjs +0 -123
- package/esm2022/abstractions/lib/prism-geometry.mjs +0 -46
- package/esm2022/abstractions/lib/quadratic-bezier-line.mjs +0 -73
- package/esm2022/abstractions/lib/rounded-box.mjs +0 -131
- package/esm2022/abstractions/lib/text-3d.mjs +0 -100
- package/esm2022/abstractions/lib/text.mjs +0 -86
- package/esm2022/angular-three-soba.mjs +0 -5
- package/esm2022/cameras/angular-three-soba-cameras.mjs +0 -5
- package/esm2022/cameras/index.mjs +0 -5
- package/esm2022/cameras/lib/camera-content.mjs +0 -14
- package/esm2022/cameras/lib/cube-camera.mjs +0 -102
- package/esm2022/cameras/lib/orthographic-camera.mjs +0 -131
- package/esm2022/cameras/lib/perspective-camera.mjs +0 -105
- package/esm2022/controls/angular-three-soba-controls.mjs +0 -5
- package/esm2022/controls/index.mjs +0 -9
- package/esm2022/controls/lib/camera-controls.mjs +0 -126
- package/esm2022/controls/lib/orbit-controls.mjs +0 -114
- package/esm2022/controls/lib/scroll-controls.mjs +0 -261
- package/esm2022/gizmos/angular-three-soba-gizmos.mjs +0 -5
- package/esm2022/gizmos/index.mjs +0 -6
- package/esm2022/gizmos/lib/gizmo-helper/gizmo-helper.mjs +0 -191
- package/esm2022/gizmos/lib/gizmo-helper/gizmo-viewcube.mjs +0 -304
- package/esm2022/gizmos/lib/gizmo-helper/gizmo-viewport.mjs +0 -348
- package/esm2022/gizmos/lib/pivot-controls/axis-arrow.mjs +0 -265
- package/esm2022/gizmos/lib/pivot-controls/axis-rotator.mjs +0 -264
- package/esm2022/gizmos/lib/pivot-controls/pivot-controls.mjs +0 -349
- package/esm2022/gizmos/lib/pivot-controls/plane-slider.mjs +0 -266
- package/esm2022/gizmos/lib/pivot-controls/scaling-sphere.mjs +0 -232
- package/esm2022/gizmos/lib/transform-controls.mjs +0 -177
- package/esm2022/index.mjs +0 -2
- package/esm2022/loaders/angular-three-soba-loaders.mjs +0 -5
- package/esm2022/loaders/index.mjs +0 -7
- package/esm2022/loaders/lib/fbx-loader.mjs +0 -13
- package/esm2022/loaders/lib/font-loader.mjs +0 -49
- package/esm2022/loaders/lib/gltf-loader.mjs +0 -51
- package/esm2022/loaders/lib/loader.mjs +0 -103
- package/esm2022/loaders/lib/progress.mjs +0 -51
- package/esm2022/loaders/lib/texture-loader.mjs +0 -32
- package/esm2022/materials/angular-three-soba-materials.mjs +0 -5
- package/esm2022/materials/index.mjs +0 -9
- package/esm2022/materials/lib/custom-shader-material.mjs +0 -67
- package/esm2022/materials/lib/mesh-distort-material.mjs +0 -43
- package/esm2022/materials/lib/mesh-portal-material.mjs +0 -294
- package/esm2022/materials/lib/mesh-reflector-material.mjs +0 -274
- package/esm2022/materials/lib/mesh-refraction-material.mjs +0 -140
- package/esm2022/materials/lib/mesh-transmission-material.mjs +0 -188
- package/esm2022/materials/lib/mesh-wobble-material.mjs +0 -43
- package/esm2022/materials/lib/point-material.mjs +0 -34
- package/esm2022/misc/angular-three-soba-misc.mjs +0 -5
- package/esm2022/misc/index.mjs +0 -15
- package/esm2022/misc/lib/animations.mjs +0 -71
- package/esm2022/misc/lib/bake-shadows.mjs +0 -24
- package/esm2022/misc/lib/computed-attribute.mjs +0 -51
- package/esm2022/misc/lib/constants.mjs +0 -5
- package/esm2022/misc/lib/decal.mjs +0 -142
- package/esm2022/misc/lib/deprecated.mjs +0 -15
- package/esm2022/misc/lib/depth-buffer.mjs +0 -35
- package/esm2022/misc/lib/fbo.mjs +0 -86
- package/esm2022/misc/lib/html/html-content.mjs +0 -322
- package/esm2022/misc/lib/html/html.mjs +0 -129
- package/esm2022/misc/lib/html/utils.mjs +0 -74
- package/esm2022/misc/lib/intersect.mjs +0 -49
- package/esm2022/misc/lib/preload.mjs +0 -58
- package/esm2022/misc/lib/sampler.mjs +0 -122
- package/esm2022/misc/lib/scale-factor.mjs +0 -29
- package/esm2022/performances/angular-three-soba-performances.mjs +0 -5
- package/esm2022/performances/index.mjs +0 -7
- package/esm2022/performances/lib/adaptive-dpr.mjs +0 -46
- package/esm2022/performances/lib/adaptive-events.mjs +0 -24
- package/esm2022/performances/lib/detailed.mjs +0 -53
- package/esm2022/performances/lib/instances/instances.mjs +0 -177
- package/esm2022/performances/lib/instances/position-mesh.mjs +0 -51
- package/esm2022/performances/lib/points/points.mjs +0 -272
- package/esm2022/performances/lib/points/position-point.mjs +0 -53
- package/esm2022/performances/lib/segments/segment-object.mjs +0 -9
- package/esm2022/performances/lib/segments/segments.mjs +0 -126
- package/esm2022/shaders/angular-three-soba-shaders.mjs +0 -5
- package/esm2022/shaders/index.mjs +0 -4
- package/esm2022/shaders/lib/grid-material.mjs +0 -81
- package/esm2022/shaders/lib/mesh-refraction-material.mjs +0 -163
- package/esm2022/shaders/lib/point-material.mjs +0 -24
- package/esm2022/staging/angular-three-soba-staging.mjs +0 -5
- package/esm2022/staging/index.mjs +0 -21
- package/esm2022/staging/lib/accumulative-shadows.mjs +0 -180
- package/esm2022/staging/lib/backdrop.mjs +0 -69
- package/esm2022/staging/lib/bb-anchor.mjs +0 -58
- package/esm2022/staging/lib/bounds.mjs +0 -282
- package/esm2022/staging/lib/camera-shake.mjs +0 -65
- package/esm2022/staging/lib/caustics.mjs +0 -184
- package/esm2022/staging/lib/center.mjs +0 -114
- package/esm2022/staging/lib/contact-shadows.mjs +0 -214
- package/esm2022/staging/lib/environment/environment.mjs +0 -344
- package/esm2022/staging/lib/environment/inject-environment.mjs +0 -184
- package/esm2022/staging/lib/float.mjs +0 -70
- package/esm2022/staging/lib/lightformer.mjs +0 -103
- package/esm2022/staging/lib/mask.mjs +0 -74
- package/esm2022/staging/lib/matcap-texture.mjs +0 -79
- package/esm2022/staging/lib/normal-texture.mjs +0 -79
- package/esm2022/staging/lib/randomized-lights.mjs +0 -100
- package/esm2022/staging/lib/render-texture.mjs +0 -202
- package/esm2022/staging/lib/sky.mjs +0 -86
- package/esm2022/staging/lib/spot-light.mjs +0 -445
- package/esm2022/staging/lib/stage.mjs +0 -232
- package/esm2022/stats/angular-three-soba-stats.mjs +0 -5
- package/esm2022/stats/index.mjs +0 -2
- package/esm2022/stats/lib/stats.mjs +0 -57
- package/esm2022/vanilla-exports/angular-three-soba-vanilla-exports.mjs +0 -5
- package/esm2022/vanilla-exports/index.mjs +0 -3
|
@@ -1,274 +0,0 @@
|
|
|
1
|
-
import { ChangeDetectionStrategy, Component, computed, CUSTOM_ELEMENTS_SCHEMA, DestroyRef, effect, inject, input, untracked, viewChild, } from '@angular/core';
|
|
2
|
-
import { applyProps, getLocalState, injectBeforeRender, injectStore, NgtArgs, omit, pick, } from 'angular-three';
|
|
3
|
-
import { BlurPass, MeshReflectorMaterial } from 'angular-three-soba/vanilla-exports';
|
|
4
|
-
import { mergeInputs } from 'ngxtension/inject-inputs';
|
|
5
|
-
import { DepthFormat, DepthTexture, HalfFloatType, LinearFilter, Matrix4, PerspectiveCamera, Plane, UnsignedShortType, Vector3, Vector4, WebGLRenderTarget, } from 'three';
|
|
6
|
-
import * as i0 from "@angular/core";
|
|
7
|
-
const defaultOptions = {
|
|
8
|
-
mixBlur: 0,
|
|
9
|
-
mixStrength: 1,
|
|
10
|
-
resolution: 256,
|
|
11
|
-
blur: [0, 0],
|
|
12
|
-
minDepthThreshold: 0.9,
|
|
13
|
-
maxDepthThreshold: 1,
|
|
14
|
-
depthScale: 0,
|
|
15
|
-
depthToBlurRatioBias: 0.25,
|
|
16
|
-
mirror: 0,
|
|
17
|
-
distortion: 1,
|
|
18
|
-
mixContrast: 1,
|
|
19
|
-
reflectorOffset: 0,
|
|
20
|
-
};
|
|
21
|
-
export class NgtsMeshReflectorMaterial {
|
|
22
|
-
constructor() {
|
|
23
|
-
this.attach = input('material');
|
|
24
|
-
this.options = input(defaultOptions, { transform: mergeInputs(defaultOptions) });
|
|
25
|
-
this.parameters = omit(this.options, [
|
|
26
|
-
'distortionMap',
|
|
27
|
-
'resolution',
|
|
28
|
-
'mixBlur',
|
|
29
|
-
'mixStrength',
|
|
30
|
-
'blur',
|
|
31
|
-
'minDepthThreshold',
|
|
32
|
-
'maxDepthThreshold',
|
|
33
|
-
'depthScale',
|
|
34
|
-
'depthToBlurRatioBias',
|
|
35
|
-
'mirror',
|
|
36
|
-
'distortion',
|
|
37
|
-
'mixContrast',
|
|
38
|
-
'reflectorOffset',
|
|
39
|
-
]);
|
|
40
|
-
this.store = injectStore();
|
|
41
|
-
this.gl = this.store.select('gl');
|
|
42
|
-
this.materialRef = viewChild('material');
|
|
43
|
-
this.reflectOptions = pick(this.options, [
|
|
44
|
-
'distortionMap',
|
|
45
|
-
'resolution',
|
|
46
|
-
'mixBlur',
|
|
47
|
-
'mixStrength',
|
|
48
|
-
'blur',
|
|
49
|
-
'minDepthThreshold',
|
|
50
|
-
'maxDepthThreshold',
|
|
51
|
-
'depthScale',
|
|
52
|
-
'depthToBlurRatioBias',
|
|
53
|
-
'mirror',
|
|
54
|
-
'distortion',
|
|
55
|
-
'mixContrast',
|
|
56
|
-
'reflectorOffset',
|
|
57
|
-
]);
|
|
58
|
-
this.blur = pick(this.reflectOptions, 'blur');
|
|
59
|
-
this.normalizedBlur = computed(() => {
|
|
60
|
-
const blur = this.blur();
|
|
61
|
-
return Array.isArray(blur) ? blur : [blur, blur];
|
|
62
|
-
});
|
|
63
|
-
this.hasBlur = computed(() => this.normalizedBlur()[0] + this.normalizedBlur()[1] > 0);
|
|
64
|
-
this.reflectorPlane = new Plane();
|
|
65
|
-
this.normal = new Vector3();
|
|
66
|
-
this.reflectorWorldPosition = new Vector3();
|
|
67
|
-
this.cameraWorldPosition = new Vector3();
|
|
68
|
-
this.rotationMatrix = new Matrix4();
|
|
69
|
-
this.lookAtPosition = new Vector3(0, 0, -1);
|
|
70
|
-
this.clipPlane = new Vector4();
|
|
71
|
-
this.view = new Vector3();
|
|
72
|
-
this.target = new Vector3();
|
|
73
|
-
this.q = new Vector4();
|
|
74
|
-
this.textureMatrix = new Matrix4();
|
|
75
|
-
this.virtualCamera = new PerspectiveCamera();
|
|
76
|
-
this.reflectState = computed(() => {
|
|
77
|
-
const [gl, { resolution, minDepthThreshold, maxDepthThreshold, depthScale, depthToBlurRatioBias, mirror, mixBlur, mixStrength, distortion, distortionMap, mixContrast, }, blur, hasBlur,] = [this.gl(), this.reflectOptions(), this.normalizedBlur(), this.hasBlur()];
|
|
78
|
-
const renderTargetParameters = {
|
|
79
|
-
minFilter: LinearFilter,
|
|
80
|
-
magFilter: LinearFilter,
|
|
81
|
-
type: HalfFloatType,
|
|
82
|
-
};
|
|
83
|
-
const fbo1 = new WebGLRenderTarget(resolution, resolution, renderTargetParameters);
|
|
84
|
-
fbo1.depthBuffer = true;
|
|
85
|
-
fbo1.depthTexture = new DepthTexture(resolution, resolution);
|
|
86
|
-
fbo1.depthTexture.format = DepthFormat;
|
|
87
|
-
fbo1.depthTexture.type = UnsignedShortType;
|
|
88
|
-
const fbo2 = new WebGLRenderTarget(resolution, resolution, renderTargetParameters);
|
|
89
|
-
const blurPass = new BlurPass({
|
|
90
|
-
gl,
|
|
91
|
-
resolution,
|
|
92
|
-
width: blur[0],
|
|
93
|
-
height: blur[1],
|
|
94
|
-
minDepthThreshold,
|
|
95
|
-
maxDepthThreshold,
|
|
96
|
-
depthScale,
|
|
97
|
-
depthToBlurRatioBias,
|
|
98
|
-
});
|
|
99
|
-
const defines = {};
|
|
100
|
-
if (hasBlur) {
|
|
101
|
-
defines['USE_BLUR'] = '';
|
|
102
|
-
}
|
|
103
|
-
if (depthScale > 0) {
|
|
104
|
-
defines['USE_DEPTH'] = '';
|
|
105
|
-
}
|
|
106
|
-
if (distortionMap) {
|
|
107
|
-
defines['USE_DISTORTION'] = '';
|
|
108
|
-
}
|
|
109
|
-
const reflectorParameters = {
|
|
110
|
-
mirror,
|
|
111
|
-
textureMatrix: this.textureMatrix,
|
|
112
|
-
mixBlur,
|
|
113
|
-
tDiffuse: fbo1.texture,
|
|
114
|
-
tDepth: fbo1.depthTexture,
|
|
115
|
-
tDiffuseBlur: fbo2.texture,
|
|
116
|
-
hasBlur,
|
|
117
|
-
mixStrength,
|
|
118
|
-
minDepthThreshold,
|
|
119
|
-
maxDepthThreshold,
|
|
120
|
-
depthScale,
|
|
121
|
-
depthToBlurRatioBias,
|
|
122
|
-
distortion,
|
|
123
|
-
distortionMap,
|
|
124
|
-
mixContrast,
|
|
125
|
-
defines,
|
|
126
|
-
};
|
|
127
|
-
return { fbo1, fbo2, blurPass, reflectorParameters };
|
|
128
|
-
});
|
|
129
|
-
this.definesKey = computed(() => {
|
|
130
|
-
const defines = this.reflectState().reflectorParameters.defines;
|
|
131
|
-
return Object.entries(defines).reduce((acc, [key, value]) => (value != null ? `${acc} ${key}` : acc), '');
|
|
132
|
-
});
|
|
133
|
-
this.material = computed(() => {
|
|
134
|
-
const prevMaterial = untracked(this.materialRef)?.nativeElement;
|
|
135
|
-
if (prevMaterial) {
|
|
136
|
-
prevMaterial.dispose();
|
|
137
|
-
delete prevMaterial['__ngt__'];
|
|
138
|
-
delete prevMaterial['__ngt_renderer__'];
|
|
139
|
-
}
|
|
140
|
-
// tracking defines key so that the material is recreated when the defines change
|
|
141
|
-
this.definesKey();
|
|
142
|
-
return new MeshReflectorMaterial();
|
|
143
|
-
});
|
|
144
|
-
effect(() => {
|
|
145
|
-
const material = this.materialRef()?.nativeElement;
|
|
146
|
-
if (!material)
|
|
147
|
-
return;
|
|
148
|
-
const { reflectorParameters } = this.reflectState();
|
|
149
|
-
applyProps(material, { ...reflectorParameters, ...this.parameters() });
|
|
150
|
-
});
|
|
151
|
-
inject(DestroyRef).onDestroy(() => {
|
|
152
|
-
const material = this.materialRef()?.nativeElement;
|
|
153
|
-
if (material) {
|
|
154
|
-
material.dispose();
|
|
155
|
-
delete material['__ngt__'];
|
|
156
|
-
delete material['__ngt_renderer__'];
|
|
157
|
-
}
|
|
158
|
-
});
|
|
159
|
-
injectBeforeRender(({ gl, scene }) => {
|
|
160
|
-
const material = this.materialRef()?.nativeElement;
|
|
161
|
-
if (!material)
|
|
162
|
-
return;
|
|
163
|
-
const localState = getLocalState(material);
|
|
164
|
-
if (!localState)
|
|
165
|
-
return;
|
|
166
|
-
const parent = Reflect.get(material, 'parent') ?? untracked(localState.parent);
|
|
167
|
-
if (!parent)
|
|
168
|
-
return;
|
|
169
|
-
const { fbo1, fbo2, blurPass } = this.reflectState();
|
|
170
|
-
const hasBlur = this.hasBlur();
|
|
171
|
-
parent.visible = false;
|
|
172
|
-
const currentXrEnabled = gl.xr.enabled;
|
|
173
|
-
const currentShadowAutoUpdate = gl.shadowMap.autoUpdate;
|
|
174
|
-
this.beforeRender();
|
|
175
|
-
gl.xr.enabled = false;
|
|
176
|
-
gl.shadowMap.autoUpdate = false;
|
|
177
|
-
gl.setRenderTarget(fbo1);
|
|
178
|
-
gl.state.buffers.depth.setMask(true);
|
|
179
|
-
if (!gl.autoClear)
|
|
180
|
-
gl.clear();
|
|
181
|
-
gl.render(scene, this.virtualCamera);
|
|
182
|
-
if (hasBlur)
|
|
183
|
-
blurPass.render(gl, fbo1, fbo2);
|
|
184
|
-
gl.xr.enabled = currentXrEnabled;
|
|
185
|
-
gl.shadowMap.autoUpdate = currentShadowAutoUpdate;
|
|
186
|
-
parent.visible = true;
|
|
187
|
-
gl.setRenderTarget(null);
|
|
188
|
-
});
|
|
189
|
-
}
|
|
190
|
-
beforeRender() {
|
|
191
|
-
const material = this.materialRef()?.nativeElement;
|
|
192
|
-
if (!material)
|
|
193
|
-
return;
|
|
194
|
-
const localState = getLocalState(material);
|
|
195
|
-
if (!localState)
|
|
196
|
-
return;
|
|
197
|
-
const parent = Reflect.get(material, 'parent') ?? untracked(localState.parent);
|
|
198
|
-
if (!parent)
|
|
199
|
-
return;
|
|
200
|
-
const { camera } = this.store.snapshot;
|
|
201
|
-
const { reflectorOffset } = untracked(this.reflectOptions);
|
|
202
|
-
this.reflectorWorldPosition.setFromMatrixPosition(parent.matrixWorld);
|
|
203
|
-
this.cameraWorldPosition.setFromMatrixPosition(camera.matrixWorld);
|
|
204
|
-
this.rotationMatrix.extractRotation(parent.matrixWorld);
|
|
205
|
-
this.normal.set(0, 0, 1);
|
|
206
|
-
this.normal.applyMatrix4(this.rotationMatrix);
|
|
207
|
-
this.reflectorWorldPosition.addScaledVector(this.normal, reflectorOffset);
|
|
208
|
-
this.view.subVectors(this.reflectorWorldPosition, this.cameraWorldPosition);
|
|
209
|
-
// Avoid rendering when reflector is facing away
|
|
210
|
-
if (this.view.dot(this.normal) > 0)
|
|
211
|
-
return;
|
|
212
|
-
this.view.reflect(this.normal).negate();
|
|
213
|
-
this.view.add(this.reflectorWorldPosition);
|
|
214
|
-
this.rotationMatrix.extractRotation(camera.matrixWorld);
|
|
215
|
-
this.lookAtPosition.set(0, 0, -1);
|
|
216
|
-
this.lookAtPosition.applyMatrix4(this.rotationMatrix);
|
|
217
|
-
this.lookAtPosition.add(this.cameraWorldPosition);
|
|
218
|
-
this.target.subVectors(this.reflectorWorldPosition, this.lookAtPosition);
|
|
219
|
-
this.target.reflect(this.normal).negate();
|
|
220
|
-
this.target.add(this.reflectorWorldPosition);
|
|
221
|
-
this.virtualCamera.position.copy(this.view);
|
|
222
|
-
this.virtualCamera.up.set(0, 1, 0);
|
|
223
|
-
this.virtualCamera.up.applyMatrix4(this.rotationMatrix);
|
|
224
|
-
this.virtualCamera.up.reflect(this.normal);
|
|
225
|
-
this.virtualCamera.lookAt(this.target);
|
|
226
|
-
this.virtualCamera.far = camera.far; // Used in WebGLBackground
|
|
227
|
-
this.virtualCamera.updateMatrixWorld();
|
|
228
|
-
this.virtualCamera.projectionMatrix.copy(camera.projectionMatrix);
|
|
229
|
-
// Update the texture matrix
|
|
230
|
-
this.textureMatrix.set(0.5, 0.0, 0.0, 0.5, 0.0, 0.5, 0.0, 0.5, 0.0, 0.0, 0.5, 0.5, 0.0, 0.0, 0.0, 1.0);
|
|
231
|
-
this.textureMatrix.multiply(this.virtualCamera.projectionMatrix);
|
|
232
|
-
this.textureMatrix.multiply(this.virtualCamera.matrixWorldInverse);
|
|
233
|
-
this.textureMatrix.multiply(parent.matrixWorld);
|
|
234
|
-
// Now update projection matrix with new clip plane, implementing code from: http://www.terathon.com/code/oblique.html
|
|
235
|
-
// Paper explaining this technique: http://www.terathon.com/lengyel/Lengyel-Oblique.pdf
|
|
236
|
-
this.reflectorPlane.setFromNormalAndCoplanarPoint(this.normal, this.reflectorWorldPosition);
|
|
237
|
-
this.reflectorPlane.applyMatrix4(this.virtualCamera.matrixWorldInverse);
|
|
238
|
-
this.clipPlane.set(this.reflectorPlane.normal.x, this.reflectorPlane.normal.y, this.reflectorPlane.normal.z, this.reflectorPlane.constant);
|
|
239
|
-
const projectionMatrix = this.virtualCamera.projectionMatrix;
|
|
240
|
-
this.q.x = (Math.sign(this.clipPlane.x) + projectionMatrix.elements[8]) / projectionMatrix.elements[0];
|
|
241
|
-
this.q.y = (Math.sign(this.clipPlane.y) + projectionMatrix.elements[9]) / projectionMatrix.elements[5];
|
|
242
|
-
this.q.z = -1.0;
|
|
243
|
-
this.q.w = (1.0 + projectionMatrix.elements[10]) / projectionMatrix.elements[14];
|
|
244
|
-
// Calculate the scaled plane vector
|
|
245
|
-
this.clipPlane.multiplyScalar(2.0 / this.clipPlane.dot(this.q));
|
|
246
|
-
// Replacing the third row of the projection matrix
|
|
247
|
-
projectionMatrix.elements[2] = this.clipPlane.x;
|
|
248
|
-
projectionMatrix.elements[6] = this.clipPlane.y;
|
|
249
|
-
projectionMatrix.elements[10] = this.clipPlane.z + 1.0;
|
|
250
|
-
projectionMatrix.elements[14] = this.clipPlane.w;
|
|
251
|
-
}
|
|
252
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.11", ngImport: i0, type: NgtsMeshReflectorMaterial, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
253
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "18.2.11", type: NgtsMeshReflectorMaterial, isStandalone: true, selector: "ngts-mesh-reflector-material", inputs: { attach: { classPropertyName: "attach", publicName: "attach", isSignal: true, isRequired: false, transformFunction: null }, options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: false, transformFunction: null } }, viewQueries: [{ propertyName: "materialRef", first: true, predicate: ["material"], descendants: true, isSignal: true }], ngImport: i0, template: `
|
|
254
|
-
<ngt-primitive #material *args="[material()]" [attach]="attach()">
|
|
255
|
-
<ng-content />
|
|
256
|
-
</ngt-primitive>
|
|
257
|
-
`, isInline: true, dependencies: [{ kind: "directive", type: NgtArgs, selector: "ng-template[args]", inputs: ["args"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
258
|
-
}
|
|
259
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.11", ngImport: i0, type: NgtsMeshReflectorMaterial, decorators: [{
|
|
260
|
-
type: Component,
|
|
261
|
-
args: [{
|
|
262
|
-
selector: 'ngts-mesh-reflector-material',
|
|
263
|
-
standalone: true,
|
|
264
|
-
template: `
|
|
265
|
-
<ngt-primitive #material *args="[material()]" [attach]="attach()">
|
|
266
|
-
<ng-content />
|
|
267
|
-
</ngt-primitive>
|
|
268
|
-
`,
|
|
269
|
-
schemas: [CUSTOM_ELEMENTS_SCHEMA],
|
|
270
|
-
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
271
|
-
imports: [NgtArgs],
|
|
272
|
-
}]
|
|
273
|
-
}], ctorParameters: () => [] });
|
|
274
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVzaC1yZWZsZWN0b3ItbWF0ZXJpYWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9saWJzL3NvYmEvbWF0ZXJpYWxzL3NyYy9saWIvbWVzaC1yZWZsZWN0b3ItbWF0ZXJpYWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNOLHVCQUF1QixFQUN2QixTQUFTLEVBQ1QsUUFBUSxFQUNSLHNCQUFzQixFQUN0QixVQUFVLEVBQ1YsTUFBTSxFQUVOLE1BQU0sRUFDTixLQUFLLEVBQ0wsU0FBUyxFQUNULFNBQVMsR0FDVCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQ04sVUFBVSxFQUNWLGFBQWEsRUFDYixrQkFBa0IsRUFDbEIsV0FBVyxFQUVYLE9BQU8sRUFHUCxJQUFJLEVBQ0osSUFBSSxHQUNKLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxRQUFRLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUNyRixPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDdkQsT0FBTyxFQUNOLFdBQVcsRUFDWCxZQUFZLEVBQ1osYUFBYSxFQUNiLFlBQVksRUFDWixPQUFPLEVBQ1AsaUJBQWlCLEVBQ2pCLEtBQUssRUFFTCxpQkFBaUIsRUFDakIsT0FBTyxFQUNQLE9BQU8sRUFDUCxpQkFBaUIsR0FDakIsTUFBTSxPQUFPLENBQUM7O0FBa0JmLE1BQU0sY0FBYyxHQUFxQztJQUN4RCxPQUFPLEVBQUUsQ0FBQztJQUNWLFdBQVcsRUFBRSxDQUFDO0lBQ2QsVUFBVSxFQUFFLEdBQUc7SUFDZixJQUFJLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ1osaUJBQWlCLEVBQUUsR0FBRztJQUN0QixpQkFBaUIsRUFBRSxDQUFDO0lBQ3BCLFVBQVUsRUFBRSxDQUFDO0lBQ2Isb0JBQW9CLEVBQUUsSUFBSTtJQUMxQixNQUFNLEVBQUUsQ0FBQztJQUNU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LEVBQUUsSUFBSTtvQkFDaEIsUUFBUSxFQUFFOzs7O0VBSVQ7b0JBQ0QsT0FBTyxFQUFFLENBQUMsc0JBQXNCLENBQUM7b0JBQ2pDLGVBQWUsRUFBRSx1QkFBdUIsQ0FBQyxNQUFNO29CQUMvQyxPQUFPLEVBQUUsQ0FBQyxPQUFPLENBQUM7aUJBQ2xCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcblx0Q2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG5cdENvbXBvbmVudCxcblx0Y29tcHV0ZWQsXG5cdENVU1RPTV9FTEVNRU5UU19TQ0hFTUEsXG5cdERlc3Ryb3lSZWYsXG5cdGVmZmVjdCxcblx0RWxlbWVudFJlZixcblx0aW5qZWN0LFxuXHRpbnB1dCxcblx0dW50cmFja2VkLFxuXHR2aWV3Q2hpbGQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcblx0YXBwbHlQcm9wcyxcblx0Z2V0TG9jYWxTdGF0ZSxcblx0aW5qZWN0QmVmb3JlUmVuZGVyLFxuXHRpbmplY3RTdG9yZSxcblx0Tmd0QW55UmVjb3JkLFxuXHROZ3RBcmdzLFxuXHROZ3RBdHRhY2hhYmxlLFxuXHROZ3RNZXNoU3RhbmRhcmRNYXRlcmlhbCxcblx0b21pdCxcblx0cGljayxcbn0gZnJvbSAnYW5ndWxhci10aHJlZSc7XG5pbXBvcnQgeyBCbHVyUGFzcywgTWVzaFJlZmxlY3Rvck1hdGVyaWFsIH0gZnJvbSAnYW5ndWxhci10aHJlZS1zb2JhL3ZhbmlsbGEtZXhwb3J0cyc7XG5pbXBvcnQgeyBtZXJnZUlucHV0cyB9IGZyb20gJ25neHRlbnNpb24vaW5qZWN0LWlucHV0cyc7XG5pbXBvcnQge1xuXHREZXB0aEZvcm1hdCxcblx0RGVwdGhUZXh0dXJlLFxuXHRIYWxmRmxvYXRUeXBlLFxuXHRMaW5lYXJGaWx0ZXIsXG5cdE1hdHJpeDQsXG5cdFBlcnNwZWN0aXZlQ2FtZXJhLFxuXHRQbGFuZSxcblx0VGV4dHVyZSxcblx0VW5zaWduZWRTaG9ydFR5cGUsXG5cdFZlY3RvcjMsXG5cdFZlY3RvcjQsXG5cdFdlYkdMUmVuZGVyVGFyZ2V0LFxufSBmcm9tICd0aHJlZSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgTmd0c01lc2hSZWZsZWN0b3JNYXRlcmlhbE9wdGlvbnMgZXh0ZW5kcyBQYXJ0aWFsPE5ndE1lc2hTdGFuZGFyZE1hdGVyaWFsPiB7XG5cdHJlc29sdXRpb246IG51bWJlcjtcblx0bWl4Qmx1cjogbnVtYmVyO1xuXHRtaXhTdHJlbmd0aDogbnVtYmVyO1xuXHRibHVyOiBbbnVtYmVyLCBudW1iZXJdIHwgbnVtYmVyO1xuXHRtaXJyb3I6IG51bWJlcjtcblx0bWluRGVwdGhUaHJlc2hvbGQ6IG51bWJlcjtcblx0bWF4RGVwdGhUaHJlc2hvbGQ6IG51bWJlcjtcblx0ZGVwdGhTY2FsZTogbnVtYmVyO1xuXHRkZXB0aFRvQmx1clJhdGlvQmlhczogbnVtYmVyO1xuXHRkaXN0b3J0aW9uOiBudW1iZXI7XG5cdG1peENvbnRyYXN0OiBudW1iZXI7XG5cdHJlZmxlY3Rvck9mZnNldDogbnVtYmVyO1xuXHRkaXN0b3J0aW9uTWFwPzogVGV4dHVyZTtcbn1cblxuY29uc3QgZGVmYXVsdE9wdGlvbnM6IE5ndHNNZXNoUmVmbGVjdG9yTWF0ZXJpYWxPcHRpb25zID0ge1xuXHRtaXhCbHVyOiAwLFxuXHRtaXhTdHJlbmd0aDogMSxcblx0cmVzb2x1dGlvbjogMjU2LFxuXHRibHVyOiBbMCwgMF0sXG5cdG1pbkRlcHRoVGhyZXNob2xkOiAwLjksXG5cdG1heERlcHRoVGhyZXNob2xkOiAxLFxuXHRkZXB0aFNjYWxlOiAwLFxuXHRkZXB0aFRvQmx1clJhdGlvQmlhczogMC4yNSxcblx0bWlycm9yOiAwLFxuXHRkaXN0b3J0aW9uOiAxLFxuXHRtaXhDb250cmFzdDogMSxcblx0cmVmbGVjdG9yT2Zmc2V0OiAwLFxufTtcblxuQENvbXBvbmVudCh7XG5cdHNlbGVjdG9yOiAnbmd0cy1tZXNoLXJlZmxlY3Rvci1tYXRlcmlhbCcsXG5cdHN0YW5kYWxvbmU6IHRydWUsXG5cdHRlbXBsYXRlOiBgXG5cdFx0PG5ndC1wcmltaXRpdmUgI21hdGVyaWFsICphcmdzPVwiW21hdGVyaWFsKCldXCIgW2F0dGFjaF09XCJhdHRhY2goKVwiPlxuXHRcdFx0PG5nLWNvbnRlbnQgLz5cblx0XHQ8L25ndC1wcmltaXRpdmU+XG5cdGAsXG5cdHNjaGVtYXM6IFtDVVNUT01fRUxFTUVOVFNfU0NIRU1BXSxcblx0Y2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG5cdGltcG9ydHM6IFtOZ3RBcmdzXSxcbn0pXG5leHBvcnQgY2xhc3MgTmd0c01lc2hSZWZsZWN0b3JNYXRlcmlhbCB7XG5cdGF0dGFjaCA9IGlucHV0PE5ndEF0dGFjaGFibGU+KCdtYXRlcmlhbCcpO1xuXHRvcHRpb25zID0gaW5wdXQoZGVmYXVsdE9wdGlvbnMsIHsgdHJhbnNmb3JtOiBtZXJnZUlucHV0cyhkZWZhdWx0T3B0aW9ucykgfSk7XG5cdHByaXZhdGUgcGFyYW1ldGVycyA9IG9taXQodGhpcy5vcHRpb25zLCBbXG5cdFx0J2Rpc3RvcnRpb25NYXAnLFxuXHRcdCdyZXNvbHV0aW9uJyxcblx0XHQnbWl4Qmx1cicsXG5cdFx0J21peFN0cmVuZ3RoJyxcblx0XHQnYmx1cicsXG5cdFx0J21pbkRlcHRoVGhyZXNob2xkJyxcblx0XHQnbWF4RGVwdGhUaHJlc2hvbGQnLFxuXHRcdCdkZXB0aFNjYWxlJyxcblx0XHQnZGVwdGhUb0JsdXJSYXRpb0JpYXMnLFxuXHRcdCdtaXJyb3InLFxuXHRcdCdkaXN0b3J0aW9uJyxcblx0XHQnbWl4Q29udHJhc3QnLFxuXHRcdCdyZWZsZWN0b3JPZmZzZXQnLFxuXHRdKTtcblxuXHRwcml2YXRlIHN0b3JlID0gaW5qZWN0U3RvcmUoKTtcblx0cHJpdmF0ZSBnbCA9IHRoaXMuc3RvcmUuc2VsZWN0KCdnbCcpO1xuXG5cdG1hdGVyaWFsUmVmID0gdmlld0NoaWxkPEVsZW1lbnRSZWY8TWVzaFJlZmxlY3Rvck1hdGVyaWFsPj4oJ21hdGVyaWFsJyk7XG5cblx0cHJpdmF0ZSByZWZsZWN0T3B0aW9ucyA9IHBpY2sodGhpcy5vcHRpb25zLCBbXG5cdFx0J2Rpc3RvcnRpb25NYXAnLFxuXHRcdCdyZXNvbHV0aW9uJyxcblx0XHQnbWl4Qmx1cicsXG5cdFx0J21peFN0cmVuZ3RoJyxcblx0XHQnYmx1cicsXG5cdFx0J21pbkRlcHRoVGhyZXNob2xkJyxcblx0XHQnbWF4RGVwdGhUaHJlc2hvbGQnLFxuXHRcdCdkZXB0aFNjYWxlJyxcblx0XHQnZGVwdGhUb0JsdXJSYXRpb0JpYXMnLFxuXHRcdCdtaXJyb3InLFxuXHRcdCdkaXN0b3J0aW9uJyxcblx0XHQnbWl4Q29udHJhc3QnLFxuXHRcdCdyZWZsZWN0b3JPZmZzZXQnLFxuXHRdKTtcblxuXHRwcml2YXRlIGJsdXIgPSBwaWNrKHRoaXMucmVmbGVjdE9wdGlvbnMsICdibHVyJyk7XG5cblx0cHJpdmF0ZSBub3JtYWxpemVkQmx1ciA9IGNvbXB1dGVkKCgpID0+IHtcblx0XHRjb25zdCBibHVyID0gdGhpcy5ibHVyKCk7XG5cdFx0cmV0dXJuIEFycmF5LmlzQXJyYXkoYmx1cikgPyBibHVyIDogW2JsdXIsIGJsdXJdO1xuXHR9KTtcblx0cHJpdmF0ZSBoYXNCbHVyID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5ub3JtYWxpemVkQmx1cigpWzBdICsgdGhpcy5ub3JtYWxpemVkQmx1cigpWzFdID4gMCk7XG5cblx0cHJpdmF0ZSByZWZsZWN0b3JQbGFuZSA9IG5ldyBQbGFuZSgpO1xuXHRwcml2YXRlIG5vcm1hbCA9IG5ldyBWZWN0b3IzKCk7XG5cdHByaXZhdGUgcmVmbGVjdG9yV29ybGRQb3NpdGlvbiA9IG5ldyBWZWN0b3IzKCk7XG5cdHByaXZhdGUgY2FtZXJhV29ybGRQb3NpdGlvbiA9IG5ldyBWZWN0b3IzKCk7XG5cdHByaXZhdGUgcm90YXRpb25NYXRyaXggPSBuZXcgTWF0cml4NCgpO1xuXHRwcml2YXRlIGxvb2tBdFBvc2l0aW9uID0gbmV3IFZlY3RvcjMoMCwgMCwgLTEpO1xuXHRwcml2YXRlIGNsaXBQbGFuZSA9IG5ldyBWZWN0b3I0KCk7XG5cdHByaXZhdGUgdmlldyA9IG5ldyBWZWN0b3IzKCk7XG5cdHByaXZhdGUgdGFyZ2V0ID0gbmV3IFZlY3RvcjMoKTtcblx0cHJpdmF0ZSBxID0gbmV3IFZlY3RvcjQoKTtcblx0cHJpdmF0ZSB0ZXh0dXJlTWF0cml4ID0gbmV3IE1hdHJpeDQoKTtcblx0cHJpdmF0ZSB2aXJ0dWFsQ2FtZXJhID0gbmV3IFBlcnNwZWN0aXZlQ2FtZXJhKCk7XG5cblx0cHJpdmF0ZSByZWZsZWN0U3RhdGUgPSBjb21wdXRlZCgoKSA9PiB7XG5cdFx0Y29uc3QgW1xuXHRcdFx0Z2wsXG5cdFx0XHR7XG5cdFx0XHRcdHJlc29sdXRpb24sXG5cdFx0XHRcdG1pbkRlcHRoVGhyZXNob2xkLFxuXHRcdFx0XHRtYXhEZXB0aFRocmVzaG9sZCxcblx0XHRcdFx0ZGVwdGhTY2FsZSxcblx0XHRcdFx0ZGVwdGhUb0JsdXJSYXRpb0JpYXMsXG5cdFx0XHRcdG1pcnJvcixcblx0XHRcdFx0bWl4Qmx1cixcblx0XHRcdFx0bWl4U3RyZW5ndGgsXG5cdFx0XHRcdGRpc3RvcnRpb24sXG5cdFx0XHRcdGRpc3RvcnRpb25NYXAsXG5cdFx0XHRcdG1peENvbnRyYXN0LFxuXHRcdFx0fSxcblx0XHRcdGJsdXIsXG5cdFx0XHRoYXNCbHVyLFxuXHRcdF0gPSBbdGhpcy5nbCgpLCB0aGlzLnJlZmxlY3RPcHRpb25zKCksIHRoaXMubm9ybWFsaXplZEJsdXIoKSwgdGhpcy5oYXNCbHVyKCldO1xuXG5cdFx0Y29uc3QgcmVuZGVyVGFyZ2V0UGFyYW1ldGVycyA9IHtcblx0XHRcdG1pbkZpbHRlcjogTGluZWFyRmlsdGVyLFxuXHRcdFx0bWFnRmlsdGVyOiBMaW5lYXJGaWx0ZXIsXG5cdFx0XHR0eXBlOiBIYWxmRmxvYXRUeXBlLFxuXHRcdH07XG5cblx0XHRjb25zdCBmYm8xID0gbmV3IFdlYkdMUmVuZGVyVGFyZ2V0KHJlc29sdXRpb24sIHJlc29sdXRpb24sIHJlbmRlclRhcmdldFBhcmFtZXRlcnMpO1xuXHRcdGZibzEuZGVwdGhCdWZmZXIgPSB0cnVlO1xuXHRcdGZibzEuZGVwdGhUZXh0dXJlID0gbmV3IERlcHRoVGV4dHVyZShyZXNvbHV0aW9uLCByZXNvbHV0aW9uKTtcblx0XHRmYm8xLmRlcHRoVGV4dHVyZS5mb3JtYXQgPSBEZXB0aEZvcm1hdDtcblx0XHRmYm8xLmRlcHRoVGV4dHVyZS50eXBlID0gVW5zaWduZWRTaG9ydFR5cGU7XG5cdFx0Y29uc3QgZmJvMiA9IG5ldyBXZWJHTFJlbmRlclRhcmdldChyZXNvbHV0aW9uLCByZXNvbHV0aW9uLCByZW5kZXJUYXJnZXRQYXJhbWV0ZXJzKTtcblxuXHRcdGNvbnN0IGJsdXJQYXNzID0gbmV3IEJsdXJQYXNzKHtcblx0XHRcdGdsLFxuXHRcdFx0cmVzb2x1dGlvbixcblx0XHRcdHdpZHRoOiBibHVyWzBdLFxuXHRcdFx0aGVpZ2h0OiBibHVyWzFdLFxuXHRcdFx0bWluRGVwdGhUaHJlc2hvbGQsXG5cdFx0XHRtYXhEZXB0aFRocmVzaG9sZCxcblx0XHRcdGRlcHRoU2NhbGUsXG5cdFx0XHRkZXB0aFRvQmx1clJhdGlvQmlhcyxcblx0XHR9KTtcblxuXHRcdGNvbnN0IGRlZmluZXM6IE5ndEFueVJlY29yZCA9IHt9O1xuXG5cdFx0aWYgKGhhc0JsdXIpIHtcblx0XHRcdGRlZmluZXNbJ1VTRV9CTFVSJ10gPSAnJztcblx0XHR9XG5cblx0XHRpZiAoZGVwdGhTY2FsZSA+IDApIHtcblx0XHRcdGRlZmluZXNbJ1VTRV9ERVBUSCddID0gJyc7XG5cdFx0fVxuXG5cdFx0aWYgKGRpc3RvcnRpb25NYXApIHtcblx0XHRcdGRlZmluZXNbJ1VTRV9ESVNUT1JUSU9OJ10gPSAnJztcblx0XHR9XG5cblx0XHRjb25zdCByZWZsZWN0b3JQYXJhbWV0ZXJzID0ge1xuXHRcdFx0bWlycm9yLFxuXHRcdFx0dGV4dHVyZU1hdHJpeDogdGhpcy50ZXh0dXJlTWF0cml4LFxuXHRcdFx0bWl4Qmx1cixcblx0XHRcdHREaWZmdXNlOiBmYm8xLnRleHR1cmUsXG5cdFx0XHR0RGVwdGg6IGZibzEuZGVwdGhUZXh0dXJlLFxuXHRcdFx0dERpZmZ1c2VCbHVyOiBmYm8yLnRleHR1cmUsXG5cdFx0XHRoYXNCbHVyLFxuXHRcdFx0bWl4U3RyZW5ndGgsXG5cdFx0XHRtaW5EZXB0aFRocmVzaG9sZCxcblx0XHRcdG1heERlcHRoVGhyZXNob2xkLFxuXHRcdFx0ZGVwdGhTY2FsZSxcblx0XHRcdGRlcHRoVG9CbHVyUmF0aW9CaWFzLFxuXHRcdFx0ZGlzdG9ydGlvbixcblx0XHRcdGRpc3RvcnRpb25NYXAsXG5cdFx0XHRtaXhDb250cmFzdCxcblx0XHRcdGRlZmluZXMsXG5cdFx0fTtcblxuXHRcdHJldHVybiB7IGZibzEsIGZibzIsIGJsdXJQYXNzLCByZWZsZWN0b3JQYXJhbWV0ZXJzIH07XG5cdH0pO1xuXG5cdHByaXZhdGUgZGVmaW5lc0tleSA9IGNvbXB1dGVkKCgpID0+IHtcblx0XHRjb25zdCBkZWZpbmVzID0gdGhpcy5yZWZsZWN0U3RhdGUoKS5yZWZsZWN0b3JQYXJhbWV0ZXJzLmRlZmluZXM7XG5cdFx0cmV0dXJuIE9iamVjdC5lbnRyaWVzKGRlZmluZXMpLnJlZHVjZSgoYWNjLCBba2V5LCB2YWx1ZV0pID0+ICh2YWx1ZSAhPSBudWxsID8gYCR7YWNjfSAke2tleX1gIDogYWNjKSwgJycpO1xuXHR9KTtcblxuXHRtYXRlcmlhbCA9IGNvbXB1dGVkKCgpID0+IHtcblx0XHRjb25zdCBwcmV2TWF0ZXJpYWwgPSB1bnRyYWNrZWQodGhpcy5tYXRlcmlhbFJlZik/Lm5hdGl2ZUVsZW1lbnQ7XG5cblx0XHRpZiAocHJldk1hdGVyaWFsKSB7XG5cdFx0XHRwcmV2TWF0ZXJpYWwuZGlzcG9zZSgpO1xuXHRcdFx0ZGVsZXRlIChwcmV2TWF0ZXJpYWwgYXMgTmd0QW55UmVjb3JkKVsnX19uZ3RfXyddO1xuXHRcdFx0ZGVsZXRlIChwcmV2TWF0ZXJpYWwgYXMgTmd0QW55UmVjb3JkKVsnX19uZ3RfcmVuZGVyZXJfXyddO1xuXHRcdH1cblxuXHRcdC8vIHRyYWNraW5nIGRlZmluZXMga2V5IHNvIHRoYXQgdGhlIG1hdGVyaWFsIGlzIHJlY3JlYXRlZCB3aGVuIHRoZSBkZWZpbmVzIGNoYW5nZVxuXHRcdHRoaXMuZGVmaW5lc0tleSgpO1xuXHRcdHJldHVybiBuZXcgTWVzaFJlZmxlY3Rvck1hdGVyaWFsKCk7XG5cdH0pO1xuXG5cdGNvbnN0cnVjdG9yKCkge1xuXHRcdGVmZmVjdCgoKSA9PiB7XG5cdFx0XHRjb25zdCBtYXRlcmlhbCA9IHRoaXMubWF0ZXJpYWxSZWYoKT8ubmF0aXZlRWxlbWVudDtcblx0XHRcdGlmICghbWF0ZXJpYWwpIHJldHVybjtcblx0XHRcdGNvbnN0IHsgcmVmbGVjdG9yUGFyYW1ldGVycyB9ID0gdGhpcy5yZWZsZWN0U3RhdGUoKTtcblx0XHRcdGFwcGx5UHJvcHMobWF0ZXJpYWwsIHsgLi4ucmVmbGVjdG9yUGFyYW1ldGVycywgLi4udGhpcy5wYXJhbWV0ZXJzKCkgfSk7XG5cdFx0fSk7XG5cblx0XHRpbmplY3QoRGVzdHJveVJlZikub25EZXN0cm95KCgpID0+IHtcblx0XHRcdGNvbnN0IG1hdGVyaWFsID0gdGhpcy5tYXRlcmlhbFJlZigpPy5uYXRpdmVFbGVtZW50O1xuXHRcdFx0aWYgKG1hdGVyaWFsKSB7XG5cdFx0XHRcdG1hdGVyaWFsLmRpc3Bvc2UoKTtcblx0XHRcdFx0ZGVsZXRlIChtYXRlcmlhbCBhcyBOZ3RBbnlSZWNvcmQpWydfX25ndF9fJ107XG5cdFx0XHRcdGRlbGV0ZSAobWF0ZXJpYWwgYXMgTmd0QW55UmVjb3JkKVsnX19uZ3RfcmVuZGVyZXJfXyddO1xuXHRcdFx0fVxuXHRcdH0pO1xuXG5cdFx0aW5qZWN0QmVmb3JlUmVuZGVyKCh7IGdsLCBzY2VuZSB9KSA9PiB7XG5cdFx0XHRjb25zdCBtYXRlcmlhbCA9IHRoaXMubWF0ZXJpYWxSZWYoKT8ubmF0aXZlRWxlbWVudDtcblx0XHRcdGlmICghbWF0ZXJpYWwpIHJldHVybjtcblxuXHRcdFx0Y29uc3QgbG9jYWxTdGF0ZSA9IGdldExvY2FsU3RhdGUobWF0ZXJpYWwpO1xuXHRcdFx0aWYgKCFsb2NhbFN0YXRlKSByZXR1cm47XG5cblx0XHRcdGNvbnN0IHBhcmVudCA9IFJlZmxlY3QuZ2V0KG1hdGVyaWFsLCAncGFyZW50JykgPz8gdW50cmFja2VkKGxvY2FsU3RhdGUucGFyZW50KTtcblx0XHRcdGlmICghcGFyZW50KSByZXR1cm47XG5cblx0XHRcdGNvbnN0IHsgZmJvMSwgZmJvMiwgYmx1clBhc3MgfSA9IHRoaXMucmVmbGVjdFN0YXRlKCk7XG5cdFx0XHRjb25zdCBoYXNCbHVyID0gdGhpcy5oYXNCbHVyKCk7XG5cblx0XHRcdHBhcmVudC52aXNpYmxlID0gZmFsc2U7XG5cdFx0XHRjb25zdCBjdXJyZW50WHJFbmFibGVkID0gZ2wueHIuZW5hYmxlZDtcblx0XHRcdGNvbnN0IGN1cnJlbnRTaGFkb3dBdXRvVXBkYXRlID0gZ2wuc2hhZG93TWFwLmF1dG9VcGRhdGU7XG5cdFx0XHR0aGlzLmJlZm9yZVJlbmRlcigpO1xuXHRcdFx0Z2wueHIuZW5hYmxlZCA9IGZhbHNlO1xuXHRcdFx0Z2wuc2hhZG93TWFwLmF1dG9VcGRhdGUgPSBmYWxzZTtcblx0XHRcdGdsLnNldFJlbmRlclRhcmdldChmYm8xKTtcblx0XHRcdGdsLnN0YXRlLmJ1ZmZlcnMuZGVwdGguc2V0TWFzayh0cnVlKTtcblx0XHRcdGlmICghZ2wuYXV0b0NsZWFyKSBnbC5jbGVhcigpO1xuXHRcdFx0Z2wucmVuZGVyKHNjZW5lLCB0aGlzLnZpcnR1YWxDYW1lcmEpO1xuXHRcdFx0aWYgKGhhc0JsdXIpIGJsdXJQYXNzLnJlbmRlcihnbCwgZmJvMSwgZmJvMik7XG5cdFx0XHRnbC54ci5lbmFibGVkID0gY3VycmVudFhyRW5hYmxlZDtcblx0XHRcdGdsLnNoYWRvd01hcC5hdXRvVXBkYXRlID0gY3VycmVudFNoYWRvd0F1dG9VcGRhdGU7XG5cdFx0XHRwYXJlbnQudmlzaWJsZSA9IHRydWU7XG5cdFx0XHRnbC5zZXRSZW5kZXJUYXJnZXQobnVsbCk7XG5cdFx0fSk7XG5cdH1cblxuXHRwcml2YXRlIGJlZm9yZVJlbmRlcigpIHtcblx0XHRjb25zdCBtYXRlcmlhbCA9IHRoaXMubWF0ZXJpYWxSZWYoKT8ubmF0aXZlRWxlbWVudDtcblx0XHRpZiAoIW1hdGVyaWFsKSByZXR1cm47XG5cblx0XHRjb25zdCBsb2NhbFN0YXRlID0gZ2V0TG9jYWxTdGF0ZShtYXRlcmlhbCk7XG5cdFx0aWYgKCFsb2NhbFN0YXRlKSByZXR1cm47XG5cblx0XHRjb25zdCBwYXJlbnQgPSBSZWZsZWN0LmdldChtYXRlcmlhbCwgJ3BhcmVudCcpID8/IHVudHJhY2tlZChsb2NhbFN0YXRlLnBhcmVudCk7XG5cdFx0aWYgKCFwYXJlbnQpIHJldHVybjtcblxuXHRcdGNvbnN0IHsgY2FtZXJhIH0gPSB0aGlzLnN0b3JlLnNuYXBzaG90O1xuXHRcdGNvbnN0IHsgcmVmbGVjdG9yT2Zmc2V0IH0gPSB1bnRyYWNrZWQodGhpcy5yZWZsZWN0T3B0aW9ucyk7XG5cblx0XHR0aGlzLnJlZmxlY3RvcldvcmxkUG9zaXRpb24uc2V0RnJvbU1hdHJpeFBvc2l0aW9uKHBhcmVudC5tYXRyaXhXb3JsZCk7XG5cdFx0dGhpcy5jYW1lcmFXb3JsZFBvc2l0aW9uLnNldEZyb21NYXRyaXhQb3NpdGlvbihjYW1lcmEubWF0cml4V29ybGQpO1xuXHRcdHRoaXMucm90YXRpb25NYXRyaXguZXh0cmFjdFJvdGF0aW9uKHBhcmVudC5tYXRyaXhXb3JsZCk7XG5cdFx0dGhpcy5ub3JtYWwuc2V0KDAsIDAsIDEpO1xuXHRcdHRoaXMubm9ybWFsLmFwcGx5TWF0cml4NCh0aGlzLnJvdGF0aW9uTWF0cml4KTtcblx0XHR0aGlzLnJlZmxlY3RvcldvcmxkUG9zaXRpb24uYWRkU2NhbGVkVmVjdG9yKHRoaXMubm9ybWFsLCByZWZsZWN0b3JPZmZzZXQpO1xuXHRcdHRoaXMudmlldy5zdWJWZWN0b3JzKHRoaXMucmVmbGVjdG9yV29ybGRQb3NpdGlvbiwgdGhpcy5jYW1lcmFXb3JsZFBvc2l0aW9uKTtcblx0XHQvLyBBdm9pZCByZW5kZXJpbmcgd2hlbiByZWZsZWN0b3IgaXMgZmFjaW5nIGF3YXlcblx0XHRpZiAodGhpcy52aWV3LmRvdCh0aGlzLm5vcm1hbCkgPiAwKSByZXR1cm47XG5cdFx0dGhpcy52aWV3LnJlZmxlY3QodGhpcy5ub3JtYWwpLm5lZ2F0ZSgpO1xuXHRcdHRoaXMudmlldy5hZGQodGhpcy5yZWZsZWN0b3JXb3JsZFBvc2l0aW9uKTtcblx0XHR0aGlzLnJvdGF0aW9uTWF0cml4LmV4dHJhY3RSb3RhdGlvbihjYW1lcmEubWF0cml4V29ybGQpO1xuXHRcdHRoaXMubG9va0F0UG9zaXRpb24uc2V0KDAsIDAsIC0xKTtcblx0XHR0aGlzLmxvb2tBdFBvc2l0aW9uLmFwcGx5TWF0cml4NCh0aGlzLnJvdGF0aW9uTWF0cml4KTtcblx0XHR0aGlzLmxvb2tBdFBvc2l0aW9uLmFkZCh0aGlzLmNhbWVyYVdvcmxkUG9zaXRpb24pO1xuXHRcdHRoaXMudGFyZ2V0LnN1YlZlY3RvcnModGhpcy5yZWZsZWN0b3JXb3JsZFBvc2l0aW9uLCB0aGlzLmxvb2tBdFBvc2l0aW9uKTtcblx0XHR0aGlzLnRhcmdldC5yZWZsZWN0KHRoaXMubm9ybWFsKS5uZWdhdGUoKTtcblx0XHR0aGlzLnRhcmdldC5hZGQodGhpcy5yZWZsZWN0b3JXb3JsZFBvc2l0aW9uKTtcblx0XHR0aGlzLnZpcnR1YWxDYW1lcmEucG9zaXRpb24uY29weSh0aGlzLnZpZXcpO1xuXHRcdHRoaXMudmlydHVhbENhbWVyYS51cC5zZXQoMCwgMSwgMCk7XG5cdFx0dGhpcy52aXJ0dWFsQ2FtZXJhLnVwLmFwcGx5TWF0cml4NCh0aGlzLnJvdGF0aW9uTWF0cml4KTtcblx0XHR0aGlzLnZpcnR1YWxDYW1lcmEudXAucmVmbGVjdCh0aGlzLm5vcm1hbCk7XG5cdFx0dGhpcy52aXJ0dWFsQ2FtZXJhLmxvb2tBdCh0aGlzLnRhcmdldCk7XG5cdFx0dGhpcy52aXJ0dWFsQ2FtZXJhLmZhciA9IGNhbWVyYS5mYXI7IC8vIFVzZWQgaW4gV2ViR0xCYWNrZ3JvdW5kXG5cdFx0dGhpcy52aXJ0dWFsQ2FtZXJhLnVwZGF0ZU1hdHJpeFdvcmxkKCk7XG5cdFx0dGhpcy52aXJ0dWFsQ2FtZXJhLnByb2plY3Rpb25NYXRyaXguY29weShjYW1lcmEucHJvamVjdGlvbk1hdHJpeCk7XG5cdFx0Ly8gVXBkYXRlIHRoZSB0ZXh0dXJlIG1hdHJpeFxuXHRcdHRoaXMudGV4dHVyZU1hdHJpeC5zZXQoMC41LCAwLjAsIDAuMCwgMC41LCAwLjAsIDAuNSwgMC4wLCAwLjUsIDAuMCwgMC4wLCAwLjUsIDAuNSwgMC4wLCAwLjAsIDAuMCwgMS4wKTtcblx0XHR0aGlzLnRleHR1cmVNYXRyaXgubXVsdGlwbHkodGhpcy52aXJ0dWFsQ2FtZXJhLnByb2plY3Rpb25NYXRyaXgpO1xuXHRcdHRoaXMudGV4dHVyZU1hdHJpeC5tdWx0aXBseSh0aGlzLnZpcnR1YWxDYW1lcmEubWF0cml4V29ybGRJbnZlcnNlKTtcblx0XHR0aGlzLnRleHR1cmVNYXRyaXgubXVsdGlwbHkocGFyZW50Lm1hdHJpeFdvcmxkKTtcblx0XHQvLyBOb3cgdXBkYXRlIHByb2plY3Rpb24gbWF0cml4IHdpdGggbmV3IGNsaXAgcGxhbmUsIGltcGxlbWVudGluZyBjb2RlIGZyb206IGh0dHA6Ly93d3cudGVyYXRob24uY29tL2NvZGUvb2JsaXF1ZS5odG1sXG5cdFx0Ly8gUGFwZXIgZXhwbGFpbmluZyB0aGlzIHRlY2huaXF1ZTogaHR0cDovL3d3dy50ZXJhdGhvbi5jb20vbGVuZ3llbC9MZW5neWVsLU9ibGlxdWUucGRmXG5cdFx0dGhpcy5yZWZsZWN0b3JQbGFuZS5zZXRGcm9tTm9ybWFsQW5kQ29wbGFuYXJQb2ludCh0aGlzLm5vcm1hbCwgdGhpcy5yZWZsZWN0b3JXb3JsZFBvc2l0aW9uKTtcblx0XHR0aGlzLnJlZmxlY3RvclBsYW5lLmFwcGx5TWF0cml4NCh0aGlzLnZpcnR1YWxDYW1lcmEubWF0cml4V29ybGRJbnZlcnNlKTtcblx0XHR0aGlzLmNsaXBQbGFuZS5zZXQoXG5cdFx0XHR0aGlzLnJlZmxlY3RvclBsYW5lLm5vcm1hbC54LFxuXHRcdFx0dGhpcy5yZWZsZWN0b3JQbGFuZS5ub3JtYWwueSxcblx0XHRcdHRoaXMucmVmbGVjdG9yUGxhbmUubm9ybWFsLnosXG5cdFx0XHR0aGlzLnJlZmxlY3RvclBsYW5lLmNvbnN0YW50LFxuXHRcdCk7XG5cdFx0Y29uc3QgcHJvamVjdGlvbk1hdHJpeCA9IHRoaXMudmlydHVhbENhbWVyYS5wcm9qZWN0aW9uTWF0cml4O1xuXHRcdHRoaXMucS54ID0gKE1hdGguc2lnbih0aGlzLmNsaXBQbGFuZS54KSArIHByb2plY3Rpb25NYXRyaXguZWxlbWVudHNbOF0pIC8gcHJvamVjdGlvbk1hdHJpeC5lbGVtZW50c1swXTtcblx0XHR0aGlzLnEueSA9IChNYXRoLnNpZ24odGhpcy5jbGlwUGxhbmUueSkgKyBwcm9qZWN0aW9uTWF0cml4LmVsZW1lbnRzWzldKSAvIHByb2plY3Rpb25NYXRyaXguZWxlbWVudHNbNV07XG5cdFx0dGhpcy5xLnogPSAtMS4wO1xuXHRcdHRoaXMucS53ID0gKDEuMCArIHByb2plY3Rpb25NYXRyaXguZWxlbWVudHNbMTBdKSAvIHByb2plY3Rpb25NYXRyaXguZWxlbWVudHNbMTRdO1xuXHRcdC8vIENhbGN1bGF0ZSB0aGUgc2NhbGVkIHBsYW5lIHZlY3RvclxuXHRcdHRoaXMuY2xpcFBsYW5lLm11bHRpcGx5U2NhbGFyKDIuMCAvIHRoaXMuY2xpcFBsYW5lLmRvdCh0aGlzLnEpKTtcblx0XHQvLyBSZXBsYWNpbmcgdGhlIHRoaXJkIHJvdyBvZiB0aGUgcHJvamVjdGlvbiBtYXRyaXhcblx0XHRwcm9qZWN0aW9uTWF0cml4LmVsZW1lbnRzWzJdID0gdGhpcy5jbGlwUGxhbmUueDtcblx0XHRwcm9qZWN0aW9uTWF0cml4LmVsZW1lbnRzWzZdID0gdGhpcy5jbGlwUGxhbmUueTtcblx0XHRwcm9qZWN0aW9uTWF0cml4LmVsZW1lbnRzWzEwXSA9IHRoaXMuY2xpcFBsYW5lLnogKyAxLjA7XG5cdFx0cHJvamVjdGlvbk1hdHJpeC5lbGVtZW50c1sxNF0gPSB0aGlzLmNsaXBQbGFuZS53O1xuXHR9XG59XG4iXX0=
|
|
@@ -1,140 +0,0 @@
|
|
|
1
|
-
import { ChangeDetectionStrategy, Component, computed, CUSTOM_ELEMENTS_SCHEMA, DestroyRef, effect, inject, input, untracked, viewChild, } from '@angular/core';
|
|
2
|
-
import { getLocalState, injectBeforeRender, injectStore, NgtArgs, omit, pick, } from 'angular-three';
|
|
3
|
-
import { MeshRefractionMaterial } from 'angular-three-soba/shaders';
|
|
4
|
-
import { mergeInputs } from 'ngxtension/inject-inputs';
|
|
5
|
-
import { MeshBVH, MeshBVHUniformStruct, SAH } from 'three-mesh-bvh';
|
|
6
|
-
import * as i0 from "@angular/core";
|
|
7
|
-
const defaultOptions = {
|
|
8
|
-
bounces: 2,
|
|
9
|
-
ior: 2.4,
|
|
10
|
-
fresnel: 0,
|
|
11
|
-
aberrationStrength: 0,
|
|
12
|
-
color: 'white',
|
|
13
|
-
fastChroma: true,
|
|
14
|
-
};
|
|
15
|
-
function isCubeTexture(def) {
|
|
16
|
-
return def && def.isCubeTexture;
|
|
17
|
-
}
|
|
18
|
-
export class NgtsMeshRefractionMaterial {
|
|
19
|
-
constructor() {
|
|
20
|
-
this.envMap = input.required();
|
|
21
|
-
this.attach = input('material');
|
|
22
|
-
this.options = input(defaultOptions, { transform: mergeInputs(defaultOptions) });
|
|
23
|
-
this.parameters = omit(this.options, ['fastChroma', 'aberrationStrength']);
|
|
24
|
-
this.fastChroma = pick(this.options, 'fastChroma');
|
|
25
|
-
this.aberrationStrength = pick(this.options, 'aberrationStrength');
|
|
26
|
-
this.materialRef = viewChild('material');
|
|
27
|
-
this.store = injectStore();
|
|
28
|
-
this.size = this.store.select('size');
|
|
29
|
-
this.resolution = computed(() => [this.size().width, this.size().height]);
|
|
30
|
-
this.defines = computed(() => {
|
|
31
|
-
const _defines = {};
|
|
32
|
-
const [envMap, aberrationStrength, fastChroma] = [
|
|
33
|
-
untracked(this.envMap),
|
|
34
|
-
this.aberrationStrength(),
|
|
35
|
-
this.fastChroma(),
|
|
36
|
-
];
|
|
37
|
-
const isCubeMap = isCubeTexture(envMap);
|
|
38
|
-
const w = (isCubeMap ? envMap.image[0]?.width : envMap.image.width) ?? 1024;
|
|
39
|
-
const cubeSize = w / 4;
|
|
40
|
-
const _lodMax = Math.floor(Math.log2(cubeSize));
|
|
41
|
-
const _cubeSize = Math.pow(2, _lodMax);
|
|
42
|
-
const width = 3 * Math.max(_cubeSize, 16 * 7);
|
|
43
|
-
const height = 4 * _cubeSize;
|
|
44
|
-
if (isCubeMap)
|
|
45
|
-
_defines['ENVMAP_TYPE_CUBEM'] = '';
|
|
46
|
-
_defines['CUBEUV_TEXEL_WIDTH'] = `${1.0 / width}`;
|
|
47
|
-
_defines['CUBEUV_TEXEL_HEIGHT'] = `${1.0 / height}`;
|
|
48
|
-
_defines['CUBEUV_MAX_MIP'] = `${_lodMax}.0`;
|
|
49
|
-
// Add defines from chromatic aberration
|
|
50
|
-
if (aberrationStrength > 0)
|
|
51
|
-
_defines['CHROMATIC_ABERRATIONS'] = '';
|
|
52
|
-
if (fastChroma)
|
|
53
|
-
_defines['FAST_CHROMA'] = '';
|
|
54
|
-
return _defines;
|
|
55
|
-
});
|
|
56
|
-
this.defineKeys = computed(() => {
|
|
57
|
-
return Object.keys(this.defines()).join(' ');
|
|
58
|
-
});
|
|
59
|
-
this.material = computed(() => {
|
|
60
|
-
const prevMaterial = untracked(this.materialRef)?.nativeElement;
|
|
61
|
-
if (prevMaterial) {
|
|
62
|
-
prevMaterial.dispose();
|
|
63
|
-
delete prevMaterial['__ngt__'];
|
|
64
|
-
delete prevMaterial['__ngt_renderer__'];
|
|
65
|
-
}
|
|
66
|
-
// track by this.defineKeys
|
|
67
|
-
this.defineKeys();
|
|
68
|
-
return new MeshRefractionMaterial();
|
|
69
|
-
});
|
|
70
|
-
effect(() => {
|
|
71
|
-
const material = this.materialRef()?.nativeElement;
|
|
72
|
-
if (!material)
|
|
73
|
-
return;
|
|
74
|
-
const localState = getLocalState(material);
|
|
75
|
-
if (!localState)
|
|
76
|
-
return;
|
|
77
|
-
const parent = untracked(localState.parent);
|
|
78
|
-
const geometry = parent.geometry;
|
|
79
|
-
if (geometry) {
|
|
80
|
-
material.bvh = new MeshBVHUniformStruct();
|
|
81
|
-
material.bvh.updateFrom(new MeshBVH(geometry.clone().toNonIndexed(), { strategy: SAH }));
|
|
82
|
-
}
|
|
83
|
-
});
|
|
84
|
-
injectBeforeRender(({ camera }) => {
|
|
85
|
-
const material = this.materialRef()?.nativeElement;
|
|
86
|
-
if (material) {
|
|
87
|
-
material.viewMatrixInverse = camera.matrixWorld;
|
|
88
|
-
material.projectionMatrixInverse = camera.projectionMatrixInverse;
|
|
89
|
-
}
|
|
90
|
-
});
|
|
91
|
-
inject(DestroyRef).onDestroy(() => {
|
|
92
|
-
const material = this.materialRef()?.nativeElement;
|
|
93
|
-
if (material) {
|
|
94
|
-
material.dispose();
|
|
95
|
-
delete material['__ngt__'];
|
|
96
|
-
delete material['__ngt_renderer__'];
|
|
97
|
-
}
|
|
98
|
-
});
|
|
99
|
-
}
|
|
100
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.11", ngImport: i0, type: NgtsMeshRefractionMaterial, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
101
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "18.2.11", type: NgtsMeshRefractionMaterial, isStandalone: true, selector: "ngts-mesh-refraction-material", inputs: { envMap: { classPropertyName: "envMap", publicName: "envMap", isSignal: true, isRequired: true, transformFunction: null }, attach: { classPropertyName: "attach", publicName: "attach", isSignal: true, isRequired: false, transformFunction: null }, options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: false, transformFunction: null } }, viewQueries: [{ propertyName: "materialRef", first: true, predicate: ["material"], descendants: true, isSignal: true }], ngImport: i0, template: `
|
|
102
|
-
<ngt-primitive
|
|
103
|
-
*args="[material()]"
|
|
104
|
-
#material
|
|
105
|
-
[attach]="attach()"
|
|
106
|
-
[parameters]="parameters()"
|
|
107
|
-
[envMap]="envMap()"
|
|
108
|
-
[aberrationStrength]="aberrationStrength()"
|
|
109
|
-
[resolution]="resolution()"
|
|
110
|
-
[defines]="defines()"
|
|
111
|
-
>
|
|
112
|
-
<ng-content />
|
|
113
|
-
</ngt-primitive>
|
|
114
|
-
`, isInline: true, dependencies: [{ kind: "directive", type: NgtArgs, selector: "ng-template[args]", inputs: ["args"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
115
|
-
}
|
|
116
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.11", ngImport: i0, type: NgtsMeshRefractionMaterial, decorators: [{
|
|
117
|
-
type: Component,
|
|
118
|
-
args: [{
|
|
119
|
-
selector: 'ngts-mesh-refraction-material',
|
|
120
|
-
standalone: true,
|
|
121
|
-
template: `
|
|
122
|
-
<ngt-primitive
|
|
123
|
-
*args="[material()]"
|
|
124
|
-
#material
|
|
125
|
-
[attach]="attach()"
|
|
126
|
-
[parameters]="parameters()"
|
|
127
|
-
[envMap]="envMap()"
|
|
128
|
-
[aberrationStrength]="aberrationStrength()"
|
|
129
|
-
[resolution]="resolution()"
|
|
130
|
-
[defines]="defines()"
|
|
131
|
-
>
|
|
132
|
-
<ng-content />
|
|
133
|
-
</ngt-primitive>
|
|
134
|
-
`,
|
|
135
|
-
schemas: [CUSTOM_ELEMENTS_SCHEMA],
|
|
136
|
-
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
137
|
-
imports: [NgtArgs],
|
|
138
|
-
}]
|
|
139
|
-
}], ctorParameters: () => [] });
|
|
140
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVzaC1yZWZyYWN0aW9uLW1hdGVyaWFsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9zb2JhL21hdGVyaWFscy9zcmMvbGliL21lc2gtcmVmcmFjdGlvbi1tYXRlcmlhbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ04sdUJBQXVCLEVBQ3ZCLFNBQVMsRUFDVCxRQUFRLEVBQ1Isc0JBQXNCLEVBQ3RCLFVBQVUsRUFDVixNQUFNLEVBRU4sTUFBTSxFQUNOLEtBQUssRUFDTCxTQUFTLEVBQ1QsU0FBUyxHQUNULE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFDTixhQUFhLEVBQ2Isa0JBQWtCLEVBQ2xCLFdBQVcsRUFFWCxPQUFPLEVBR1AsSUFBSSxFQUNKLElBQUksR0FDSixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNwRSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFFdkQsT0FBTyxFQUFFLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7QUFpQnBFLE1BQU0sY0FBYyxHQUFzQztJQUN6RCxPQUFPLEVBQUUsQ0FBQztJQUNWLEdBQUcsRUFBRSxHQUFHO0lBQ1IsT0FBTyxFQUFFLENBQUM7SUFDVixrQkFBa0IsRUFBRSxDQUFDO0lBQ3JCLEtBQUssRUFBRSxPQUFPO0lBQ2QsVUFBVSxFQUFFLElBQUk7Q0FDaEIsQ0FBQztBQUVGLFNBQVMsYUFBYSxDQUFDLEdBQTBCO0lBQ2hELE9BQU8sR0FBRyxJQUFLLEdBQW1CLENBQUMsYUFBYSxDQUFDO0FBQ2xELENBQUM7QUF1QkQsTUFBTSxPQUFPLDBCQUEwQjtJQTZEdEM7UUE1REEsV0FBTSxHQUFHLEtBQUssQ0FBQyxRQUFRLEVBQXlCLENBQUM7UUFDakQsV0FBTSxHQUFHLEtBQUssQ0FBZ0IsVUFB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ZWN0aW9uU3RyYXRlZ3ksXG5cdENvbXBvbmVudCxcblx0Y29tcHV0ZWQsXG5cdENVU1RPTV9FTEVNRU5UU19TQ0hFTUEsXG5cdERlc3Ryb3lSZWYsXG5cdGVmZmVjdCxcblx0RWxlbWVudFJlZixcblx0aW5qZWN0LFxuXHRpbnB1dCxcblx0dW50cmFja2VkLFxuXHR2aWV3Q2hpbGQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcblx0Z2V0TG9jYWxTdGF0ZSxcblx0aW5qZWN0QmVmb3JlUmVuZGVyLFxuXHRpbmplY3RTdG9yZSxcblx0Tmd0QW55UmVjb3JkLFxuXHROZ3RBcmdzLFxuXHROZ3RBdHRhY2hhYmxlLFxuXHROZ3RTaGFkZXJNYXRlcmlhbCxcblx0b21pdCxcblx0cGljayxcbn0gZnJvbSAnYW5ndWxhci10aHJlZSc7XG5pbXBvcnQgeyBNZXNoUmVmcmFjdGlvbk1hdGVyaWFsIH0gZnJvbSAnYW5ndWxhci10aHJlZS1zb2JhL3NoYWRlcnMnO1xuaW1wb3J0IHsgbWVyZ2VJbnB1dHMgfSBmcm9tICduZ3h0ZW5zaW9uL2luamVjdC1pbnB1dHMnO1xuaW1wb3J0IHsgQ29sb3JSZXByZXNlbnRhdGlvbiwgQ3ViZVRleHR1cmUsIE1lc2gsIFRleHR1cmUgfSBmcm9tICd0aHJlZSc7XG5pbXBvcnQgeyBNZXNoQlZILCBNZXNoQlZIVW5pZm9ybVN0cnVjdCwgU0FIIH0gZnJvbSAndGhyZWUtbWVzaC1idmgnO1xuXG5leHBvcnQgaW50ZXJmYWNlIE5ndHNNZXNoUmVmcmFjdGlvbk1hdGVyaWFsT3B0aW9ucyBleHRlbmRzIFBhcnRpYWw8Tmd0U2hhZGVyTWF0ZXJpYWw+IHtcblx0LyoqIE51bWJlciBvZiByYXktY2FzdCBib3VuY2VzLCBpdCBjYW4gYmUgZXhwZW5zaXZlIHRvIGhhdmUgdG9vIG1hbnksIDIgKi9cblx0Ym91bmNlczogbnVtYmVyO1xuXHQvKiogUmVmcmFjdGlvbiBpbmRleCwgMi40ICovXG5cdGlvcjogbnVtYmVyO1xuXHQvKiogRnJlc25lbCAoc3RyaXAgbGlnaHQpLCAwICovXG5cdGZyZXNuZWw6IG51bWJlcjtcblx0LyoqIFJHQiBzaGlmdCBpbnRlbnNpdHksIGNhbiBiZSBleHBlbnNpdmUsIDAgKi9cblx0YWJlcnJhdGlvblN0cmVuZ3RoOiBudW1iZXI7XG5cdC8qKiBDb2xvciwgd2hpdGUgKi9cblx0Y29sb3I6IENvbG9yUmVwcmVzZW50YXRpb247XG5cdC8qKiBJZiB0aGlzIGlzIG9uIGl0IHVzZXMgZmV3ZXIgcmF5IGNhc3RzIGZvciB0aGUgUkdCIHNoaWZ0IHNhY3JpZmljaW5nIHBoeXNpY2FsIGFjY3VyYWN5LCB0cnVlICovXG5cdGZhc3RDaHJvbWE6IGJvb2xlYW47XG59XG5cbmNvbnN0IGRlZmF1bHRPcHRpb25zOiBOZ3RzTWVzaFJlZnJhY3Rpb25NYXRlcmlhbE9wdGlvbnMgPSB7XG5cdGJvdW5jZXM6IDIsXG5cdGlvcjogMi40LFxuXHRmcmVzbmVsOiAwLFxuXHRhYmVycmF0aW9uU3RyZW5ndGg6IDAsXG5cdGNvbG9yOiAnd2hpdGUnLFxuXHRmYXN0Q2hyb21hOiB0cnVlLFxufTtcblxuZnVuY3Rpb24gaXNDdWJlVGV4dHVyZShkZWY6IEN1YmVUZXh0dXJlIHwgVGV4dHVyZSk6IGRlZiBpcyBDdWJlVGV4dHVyZSB7XG5cdHJldHVybiBkZWYgJiYgKGRlZiBhcyBDdWJlVGV4dHVyZSkuaXNDdWJlVGV4dHVyZTtcbn1cblxuQENvbXBvbmVudCh7XG5cdHNlbGVjdG9yOiAnbmd0cy1tZXNoLXJlZnJhY3Rpb24tbWF0ZXJpYWwnLFxuXHRzdGFuZGFsb25lOiB0cnVlLFxuXHR0ZW1wbGF0ZTogYFxuXHRcdDxuZ3QtcHJpbWl0aXZlXG5cdFx0XHQqYXJncz1cIlttYXRlcmlhbCgpXVwiXG5cdFx0XHQjbWF0ZXJpYWxcblx0XHRcdFthdHRhY2hdPVwiYXR0YWNoKClcIlxuXHRcdFx0W3BhcmFtZXRlcnNdPVwicGFyYW1ldGVycygpXCJcblx0XHRcdFtlbnZNYXBdPVwiZW52TWFwKClcIlxuXHRcdFx0W2FiZXJyYXRpb25TdHJlbmd0aF09XCJhYmVycmF0aW9uU3RyZW5ndGgoKVwiXG5cdFx0XHRbcmVzb2x1dGlvbl09XCJyZXNvbHV0aW9uKClcIlxuXHRcdFx0W2RlZmluZXNdPVwiZGVmaW5lcygpXCJcblx0XHQ+XG5cdFx0XHQ8bmctY29udGVudCAvPlxuXHRcdDwvbmd0LXByaW1pdGl2ZT5cblx0YCxcblx0c2NoZW1hczogW0NVU1RPTV9FTEVNRU5UU19TQ0hFTUFdLFxuXHRjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcblx0aW1wb3J0czogW05ndEFyZ3NdLFxufSlcbmV4cG9ydCBjbGFzcyBOZ3RzTWVzaFJlZnJhY3Rpb25NYXRlcmlhbCB7XG5cdGVudk1hcCA9IGlucHV0LnJlcXVpcmVkPEN1YmVUZXh0dXJlIHwgVGV4dHVyZT4oKTtcblx0YXR0YWNoID0gaW5wdXQ8Tmd0QXR0YWNoYWJsZT4oJ21hdGVyaWFsJyk7XG5cdG9wdGlvbnMgPSBpbnB1dChkZWZhdWx0T3B0aW9ucywgeyB0cmFuc2Zvcm06IG1lcmdlSW5wdXRzKGRlZmF1bHRPcHRpb25zKSB9KTtcblx0cGFyYW1ldGVycyA9IG9taXQodGhpcy5vcHRpb25zLCBbJ2Zhc3RDaHJvbWEnLCAnYWJlcnJhdGlvblN0cmVuZ3RoJ10pO1xuXG5cdHByaXZhdGUgZmFzdENocm9tYSA9IHBpY2sodGhpcy5vcHRpb25zLCAnZmFzdENocm9tYScpO1xuXHRhYmVycmF0aW9uU3RyZW5ndGggPSBwaWNrKHRoaXMub3B0aW9ucywgJ2FiZXJyYXRpb25TdHJlbmd0aCcpO1xuXG5cdG1hdGVyaWFsUmVmID0gdmlld0NoaWxkPEVsZW1lbnRSZWY8SW5zdGFuY2VUeXBlPHR5cGVvZiBNZXNoUmVmcmFjdGlvbk1hdGVyaWFsPj4+KCdtYXRlcmlhbCcpO1xuXG5cdHByaXZhdGUgc3RvcmUgPSBpbmplY3RTdG9yZSgpO1xuXHRwcml2YXRlIHNpemUgPSB0aGlzLnN0b3JlLnNlbGVjdCgnc2l6ZScpO1xuXG5cdHJlc29sdXRpb24gPSBjb21wdXRlZCgoKSA9PiBbdGhpcy5zaXplKCkud2lkdGgsIHRoaXMuc2l6ZSgpLmhlaWdodF0pO1xuXHRkZWZpbmVzID0gY29tcHV0ZWQoKCkgPT4ge1xuXHRcdGNvbnN0IF9kZWZpbmVzID0ge30gYXMgeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfTtcblx0XHRjb25zdCBbZW52TWFwLCBhYmVycmF0aW9uU3RyZW5ndGgsIGZhc3RDaHJvbWFdID0gW1xuXHRcdFx0dW50cmFja2VkKHRoaXMuZW52TWFwKSxcblx0XHRcdHRoaXMuYWJlcnJhdGlvblN0cmVuZ3RoKCksXG5cdFx0XHR0aGlzLmZhc3RDaHJvbWEoKSxcblx0XHRdO1xuXHRcdGNvbnN0IGlzQ3ViZU1hcCA9IGlzQ3ViZVRleHR1cmUoZW52TWFwKTtcblxuXHRcdGNvbnN0IHcgPSAoaXNDdWJlTWFwID8gZW52TWFwLmltYWdlWzBdPy53aWR0aCA6IGVudk1hcC5pbWFnZS53aWR0aCkgPz8gMTAyNDtcblx0XHRjb25zdCBjdWJlU2l6ZSA9IHcgLyA0O1xuXHRcdGNvbnN0IF9sb2RNYXggPSBNYXRoLmZsb29yKE1hdGgubG9nMihjdWJlU2l6ZSkpO1xuXHRcdGNvbnN0IF9jdWJlU2l6ZSA9IE1hdGgucG93KDIsIF9sb2RNYXgpO1xuXHRcdGNvbnN0IHdpZHRoID0gMyAqIE1hdGgubWF4KF9jdWJlU2l6ZSwgMTYgKiA3KTtcblx0XHRjb25zdCBoZWlnaHQgPSA0ICogX2N1YmVTaXplO1xuXG5cdFx0aWYgKGlzQ3ViZU1hcCkgX2RlZmluZXNbJ0VOVk1BUF9UWVBFX0NVQkVNJ10gPSAnJztcblx0XHRfZGVmaW5lc1snQ1VCRVVWX1RFWEVMX1dJRFRIJ10gPSBgJHsxLjAgLyB3aWR0aH1gO1xuXHRcdF9kZWZpbmVzWydDVUJFVVZfVEVYRUxfSEVJR0hUJ10gPSBgJHsxLjAgLyBoZWlnaHR9YDtcblx0XHRfZGVmaW5lc1snQ1VCRVVWX01BWF9NSVAnXSA9IGAke19sb2RNYXh9LjBgO1xuXG5cdFx0Ly8gQWRkIGRlZmluZXMgZnJvbSBjaHJvbWF0aWMgYWJlcnJhdGlvblxuXHRcdGlmIChhYmVycmF0aW9uU3RyZW5ndGggPiAwKSBfZGVmaW5lc1snQ0hST01BVElDX0FCRVJSQVRJT05TJ10gPSAnJztcblx0XHRpZiAoZmFzdENocm9tYSkgX2RlZmluZXNbJ0ZBU1RfQ0hST01BJ10gPSAnJztcblxuXHRcdHJldHVybiBfZGVmaW5lcztcblx0fSk7XG5cblx0cHJpdmF0ZSBkZWZpbmVLZXlzID0gY29tcHV0ZWQoKCkgPT4ge1xuXHRcdHJldHVybiBPYmplY3Qua2V5cyh0aGlzLmRlZmluZXMoKSkuam9pbignICcpO1xuXHR9KTtcblxuXHRtYXRlcmlhbCA9IGNvbXB1dGVkKCgpID0+IHtcblx0XHRjb25zdCBwcmV2TWF0ZXJpYWwgPSB1bnRyYWNrZWQodGhpcy5tYXRlcmlhbFJlZik/Lm5hdGl2ZUVsZW1lbnQ7XG5cblx0XHRpZiAocHJldk1hdGVyaWFsKSB7XG5cdFx0XHRwcmV2TWF0ZXJpYWwuZGlzcG9zZSgpO1xuXHRcdFx0ZGVsZXRlIChwcmV2TWF0ZXJpYWwgYXMgTmd0QW55UmVjb3JkKVsnX19uZ3RfXyddO1xuXHRcdFx0ZGVsZXRlIChwcmV2TWF0ZXJpYWwgYXMgTmd0QW55UmVjb3JkKVsnX19uZ3RfcmVuZGVyZXJfXyddO1xuXHRcdH1cblxuXHRcdC8vIHRyYWNrIGJ5IHRoaXMuZGVmaW5lS2V5c1xuXHRcdHRoaXMuZGVmaW5lS2V5cygpO1xuXHRcdHJldHVybiBuZXcgTWVzaFJlZnJhY3Rpb25NYXRlcmlhbCgpO1xuXHR9KTtcblxuXHRjb25zdHJ1Y3RvcigpIHtcblx0XHRlZmZlY3QoKCkgPT4ge1xuXHRcdFx0Y29uc3QgbWF0ZXJpYWwgPSB0aGlzLm1hdGVyaWFsUmVmKCk/Lm5hdGl2ZUVsZW1lbnQ7XG5cdFx0XHRpZiAoIW1hdGVyaWFsKSByZXR1cm47XG5cblx0XHRcdGNvbnN0IGxvY2FsU3RhdGUgPSBnZXRMb2NhbFN0YXRlKG1hdGVyaWFsKTtcblx0XHRcdGlmICghbG9jYWxTdGF0ZSkgcmV0dXJuO1xuXG5cdFx0XHRjb25zdCBwYXJlbnQgPSB1bnRyYWNrZWQobG9jYWxTdGF0ZS5wYXJlbnQpO1xuXHRcdFx0Y29uc3QgZ2VvbWV0cnkgPSAocGFyZW50IGFzIE1lc2gpLmdlb21ldHJ5O1xuXHRcdFx0aWYgKGdlb21ldHJ5KSB7XG5cdFx0XHRcdChtYXRlcmlhbCBhcyBhbnkpLmJ2aCA9IG5ldyBNZXNoQlZIVW5pZm9ybVN0cnVjdCgpO1xuXHRcdFx0XHQobWF0ZXJpYWwgYXMgYW55KS5idmgudXBkYXRlRnJvbShuZXcgTWVzaEJWSChnZW9tZXRyeS5jbG9uZSgpLnRvTm9uSW5kZXhlZCgpLCB7IHN0cmF0ZWd5OiBTQUggfSkpO1xuXHRcdFx0fVxuXHRcdH0pO1xuXG5cdFx0aW5qZWN0QmVmb3JlUmVuZGVyKCh7IGNhbWVyYSB9KSA9PiB7XG5cdFx0XHRjb25zdCBtYXRlcmlhbCA9IHRoaXMubWF0ZXJpYWxSZWYoKT8ubmF0aXZlRWxlbWVudDtcblx0XHRcdGlmIChtYXRlcmlhbCkge1xuXHRcdFx0XHQobWF0ZXJpYWwgYXMgYW55KS52aWV3TWF0cml4SW52ZXJzZSA9IGNhbWVyYS5tYXRyaXhXb3JsZDtcblx0XHRcdFx0KG1hdGVyaWFsIGFzIGFueSkucHJvamVjdGlvbk1hdHJpeEludmVyc2UgPSBjYW1lcmEucHJvamVjdGlvbk1hdHJpeEludmVyc2U7XG5cdFx0XHR9XG5cdFx0fSk7XG5cblx0XHRpbmplY3QoRGVzdHJveVJlZikub25EZXN0cm95KCgpID0+IHtcblx0XHRcdGNvbnN0IG1hdGVyaWFsID0gdGhpcy5tYXRlcmlhbFJlZigpPy5uYXRpdmVFbGVtZW50O1xuXHRcdFx0aWYgKG1hdGVyaWFsKSB7XG5cdFx0XHRcdG1hdGVyaWFsLmRpc3Bvc2UoKTtcblx0XHRcdFx0ZGVsZXRlIChtYXRlcmlhbCBhcyBOZ3RBbnlSZWNvcmQpWydfX25ndF9fJ107XG5cdFx0XHRcdGRlbGV0ZSAobWF0ZXJpYWwgYXMgTmd0QW55UmVjb3JkKVsnX19uZ3RfcmVuZGVyZXJfXyddO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHR9XG59XG4iXX0=
|