@colijnit/configurator 1.0.17 → 1.0.19
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/app/builder.d.ts +53 -53
- package/app/components/answers/answer/answer.component.d.ts +11 -11
- package/app/components/answers/answers.component.d.ts +8 -8
- package/app/components/answers/answers.module.d.ts +2 -2
- package/app/components/selections/selections.component.d.ts +22 -22
- package/app/components/selections/selections.module.d.ts +2 -2
- package/app/components/shared/loader/loader.component.d.ts +2 -2
- package/app/components/shared/shared.module.d.ts +2 -2
- package/app/directives/visibility-observer-master.directive.d.ts +9 -9
- package/app/directives/visibility-observer.directive.d.ts +13 -13
- package/app/services/configurator.service.d.ts +22 -22
- package/app/services/image-cache.service.d.ts +10 -10
- package/app/services/locator.service.d.ts +4 -4
- package/bundles/colijnit-configurator.umd.js +2455 -2455
- package/bundles/colijnit-configurator.umd.js.map +1 -1
- package/bundles/colijnit-configurator.umd.min.js +1 -1
- package/bundles/colijnit-configurator.umd.min.js.map +1 -1
- package/colijnit-configurator.d.ts +10 -10
- package/colijnit-configurator.metadata.json +1 -1
- package/esm2015/app/builder.js +477 -477
- package/esm2015/app/components/answers/answer/answer.component.js +51 -51
- package/esm2015/app/components/answers/answers.component.js +25 -25
- package/esm2015/app/components/answers/answers.module.js +28 -28
- package/esm2015/app/components/selections/selections.component.js +85 -85
- package/esm2015/app/components/selections/selections.module.js +22 -22
- package/esm2015/app/components/shared/loader/loader.component.js +12 -12
- package/esm2015/app/components/shared/shared.module.js +20 -20
- package/esm2015/app/directives/visibility-observer-master.directive.js +50 -50
- package/esm2015/app/directives/visibility-observer.directive.js +56 -56
- package/esm2015/app/services/configurator.service.js +94 -94
- package/esm2015/app/services/image-cache.service.js +66 -66
- package/esm2015/app/services/locator.service.js +9 -9
- package/esm2015/colijnit-configurator.js +10 -10
- package/esm2015/helper/variation-helper.js +215 -215
- package/esm2015/model/material.js +10 -10
- package/esm2015/model/variation-settings.js +5 -5
- package/esm2015/model/variation.js +2 -2
- package/esm2015/public_api.js +6 -6
- package/esm2015/utils/asset.utils.js +73 -73
- package/esm2015/utils/file.utils.js +138 -138
- package/esm2015/utils/image.utils.js +51 -51
- package/esm2015/utils/object.utils.js +48 -48
- package/esm2015/utils/scene-utils.js +93 -93
- package/esm2015/utils/threed.utils.js +221 -221
- package/esm2015/utils/variation-utils.js +223 -223
- package/esm5/app/builder.js +591 -591
- package/esm5/app/components/answers/answer/answer.component.js +63 -63
- package/esm5/app/components/answers/answers.component.js +26 -26
- package/esm5/app/components/answers/answers.module.js +31 -31
- package/esm5/app/components/selections/selections.component.js +103 -103
- package/esm5/app/components/selections/selections.module.js +25 -25
- package/esm5/app/components/shared/loader/loader.component.js +15 -15
- package/esm5/app/components/shared/shared.module.js +23 -23
- package/esm5/app/directives/visibility-observer-master.directive.js +63 -63
- package/esm5/app/directives/visibility-observer.directive.js +58 -58
- package/esm5/app/services/configurator.service.js +160 -160
- package/esm5/app/services/image-cache.service.js +69 -69
- package/esm5/app/services/locator.service.js +12 -12
- package/esm5/colijnit-configurator.js +10 -10
- package/esm5/helper/variation-helper.js +267 -267
- package/esm5/model/material.js +12 -12
- package/esm5/model/variation-settings.js +7 -7
- package/esm5/model/variation.js +6 -6
- package/esm5/public_api.js +6 -6
- package/esm5/utils/asset.utils.js +105 -105
- package/esm5/utils/file.utils.js +150 -150
- package/esm5/utils/image.utils.js +55 -55
- package/esm5/utils/object.utils.js +55 -55
- package/esm5/utils/scene-utils.js +97 -97
- package/esm5/utils/threed.utils.js +278 -278
- package/esm5/utils/variation-utils.js +326 -326
- package/fesm2015/colijnit-configurator.js +1946 -1946
- package/fesm2015/colijnit-configurator.js.map +1 -1
- package/fesm5/colijnit-configurator.js +2457 -2457
- package/fesm5/colijnit-configurator.js.map +1 -1
- package/helper/variation-helper.d.ts +14 -14
- package/model/material.d.ts +17 -17
- package/model/variation-settings.d.ts +14 -14
- package/model/variation.d.ts +10 -10
- package/package.json +3 -2
- package/public_api.d.ts +6 -6
- package/utils/asset.utils.d.ts +13 -13
- package/utils/file.utils.d.ts +27 -27
- package/utils/image.utils.d.ts +8 -8
- package/utils/object.utils.d.ts +7 -7
- package/utils/scene-utils.d.ts +7 -7
- package/utils/threed.utils.d.ts +16 -16
- package/utils/variation-utils.d.ts +12 -12
|
@@ -1,49 +1,49 @@
|
|
|
1
|
-
import { Mesh } from "three";
|
|
2
|
-
export class ObjectUtils {
|
|
3
|
-
static DisposeMaterial(material) {
|
|
4
|
-
if (!material) {
|
|
5
|
-
return;
|
|
6
|
-
}
|
|
7
|
-
if (Array.isArray(material)) {
|
|
8
|
-
material.forEach(mtrl => {
|
|
9
|
-
this.materialProps
|
|
10
|
-
.filter(mapType => mtrl[mapType])
|
|
11
|
-
.forEach(mapType => mtrl[mapType].dispose());
|
|
12
|
-
mtrl.dispose();
|
|
13
|
-
});
|
|
14
|
-
}
|
|
15
|
-
else {
|
|
16
|
-
this.materialProps
|
|
17
|
-
.filter(mapType => material[mapType] && material[mapType].dispose)
|
|
18
|
-
.forEach(mapType => material[mapType].dispose());
|
|
19
|
-
if (material.dispose) {
|
|
20
|
-
material.dispose();
|
|
21
|
-
}
|
|
22
|
-
}
|
|
23
|
-
}
|
|
24
|
-
static DisposeObject(object) {
|
|
25
|
-
if (!object) {
|
|
26
|
-
return;
|
|
27
|
-
}
|
|
28
|
-
if (object.children.length) {
|
|
29
|
-
object.children.forEach(child => this.DisposeObject(child));
|
|
30
|
-
}
|
|
31
|
-
this.DisposeNode(object);
|
|
32
|
-
}
|
|
33
|
-
static DisposeNode(node) {
|
|
34
|
-
node.traverse((obj) => {
|
|
35
|
-
if (obj instanceof Mesh) {
|
|
36
|
-
if (obj.geometry) {
|
|
37
|
-
obj.geometry.dispose();
|
|
38
|
-
}
|
|
39
|
-
this.DisposeMaterial(obj.material);
|
|
40
|
-
}
|
|
41
|
-
if (typeof obj.dispose === 'function') {
|
|
42
|
-
// @ts-ignore
|
|
43
|
-
obj.dispose();
|
|
44
|
-
}
|
|
45
|
-
});
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
ObjectUtils.materialProps = ['map', 'lightMap', 'bumpMap', 'normalMap', 'specularMap', 'envMap', 'aoMap', 'roughnessMap', 'metalnessMap'];
|
|
1
|
+
import { Mesh } from "three";
|
|
2
|
+
export class ObjectUtils {
|
|
3
|
+
static DisposeMaterial(material) {
|
|
4
|
+
if (!material) {
|
|
5
|
+
return;
|
|
6
|
+
}
|
|
7
|
+
if (Array.isArray(material)) {
|
|
8
|
+
material.forEach(mtrl => {
|
|
9
|
+
this.materialProps
|
|
10
|
+
.filter(mapType => mtrl[mapType])
|
|
11
|
+
.forEach(mapType => mtrl[mapType].dispose());
|
|
12
|
+
mtrl.dispose();
|
|
13
|
+
});
|
|
14
|
+
}
|
|
15
|
+
else {
|
|
16
|
+
this.materialProps
|
|
17
|
+
.filter(mapType => material[mapType] && material[mapType].dispose)
|
|
18
|
+
.forEach(mapType => material[mapType].dispose());
|
|
19
|
+
if (material.dispose) {
|
|
20
|
+
material.dispose();
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
static DisposeObject(object) {
|
|
25
|
+
if (!object) {
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
if (object.children.length) {
|
|
29
|
+
object.children.forEach(child => this.DisposeObject(child));
|
|
30
|
+
}
|
|
31
|
+
this.DisposeNode(object);
|
|
32
|
+
}
|
|
33
|
+
static DisposeNode(node) {
|
|
34
|
+
node.traverse((obj) => {
|
|
35
|
+
if (obj instanceof Mesh) {
|
|
36
|
+
if (obj.geometry) {
|
|
37
|
+
obj.geometry.dispose();
|
|
38
|
+
}
|
|
39
|
+
this.DisposeMaterial(obj.material);
|
|
40
|
+
}
|
|
41
|
+
if (typeof obj.dispose === 'function') {
|
|
42
|
+
// @ts-ignore
|
|
43
|
+
obj.dispose();
|
|
44
|
+
}
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
ObjectUtils.materialProps = ['map', 'lightMap', 'bumpMap', 'normalMap', 'specularMap', 'envMap', 'aoMap', 'roughnessMap', 'metalnessMap'];
|
|
49
49
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib2JqZWN0LnV0aWxzLmpzIiwic291cmNlUm9vdCI6Im5nOi8vQGNvbGlqbml0L2NvbmZpZ3VyYXRvci8iLCJzb3VyY2VzIjpbInV0aWxzL29iamVjdC51dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQVcsSUFBSSxFQUFXLE1BQU0sT0FBTyxDQUFDO0FBRS9DLE1BQU0sT0FBTyxXQUFXO0lBR2IsTUFBTSxDQUFDLGVBQWUsQ0FBQyxRQUErQjtRQUN6RCxJQUFJLENBQUMsUUFBUSxFQUFFO1lBQ1gsT0FBTztTQUNWO1FBQ0QsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxFQUFFO1lBQ3pCLFFBQVEsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUU7Z0JBQ3BCLElBQUksQ0FBQyxhQUFhO3FCQUNiLE1BQU0sQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztxQkFDaEMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7Z0JBQ2pELElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNuQixDQUFDLENBQUMsQ0FBQztTQUNOO2FBQU07WUFDSCxJQUFJLENBQUMsYUFBYTtpQkFDYixNQUFNLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLElBQUksUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQU8sQ0FBQztpQkFDakUsT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7WUFDckQsSUFBSSxRQUFRLENBQUMsT0FBTyxFQUFFO2dCQUNsQixRQUFRLENBQUMsT0FBTyxFQUFFLENBQUM7YUFDdEI7U0FDSjtJQUNMLENBQUM7SUFFTSxNQUFNLENBQUMsYUFBYSxDQUFDLE1BQXVCO1FBQy9DLElBQUksQ0FBQyxNQUFNLEVBQUU7WUFDVCxPQUFPO1NBQ1Y7UUFDRCxJQUFJLE1BQU0sQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFO1lBQ3hCLE1BQU0sQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1NBQy9EO1FBQ0QsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUM3QixDQUFDO0lBRU8sTUFBTSxDQUFDLFdBQVcsQ0FBQyxJQUFxQjtRQUM1QyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsR0FBYSxFQUFFLEVBQUU7WUFDNUIsSUFBSSxHQUFHLFlBQVksSUFBSSxFQUFFO2dCQUNyQixJQUFJLEdBQUcsQ0FBQyxRQUFRLEVBQUU7b0JBQ2QsR0FBRyxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsQ0FBQztpQkFDMUI7Z0JBQ0QsSUFBSSxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7YUFDdEM7WUFDRCxJQUFJLE9BQVEsR0FBVyxDQUFDLE9BQU8sS0FBSyxVQUFVLEVBQUU7Z0JBQzVDLGFBQWE7Z0JBQ2IsR0FBRyxDQUFDLE9BQU8sRUFBRSxDQUFDO2FBQ2pCO1FBQ0wsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDOztBQTlDTSx5QkFBYSxHQUFHLENBQUMsS0FBSyxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsV0FBVyxFQUFFLGFBQWEsRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLGNBQWMsRUFBRSxjQUFjLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7TWF0ZXJpYWwsIE1lc2gsIE9iamVjdDNEfSBmcm9tIFwidGhyZWVcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBPYmplY3RVdGlscyB7XHJcbiAgICBzdGF0aWMgbWF0ZXJpYWxQcm9wcyA9IFsnbWFwJywgJ2xpZ2h0TWFwJywgJ2J1bXBNYXAnLCAnbm9ybWFsTWFwJywgJ3NwZWN1bGFyTWFwJywgJ2Vudk1hcCcsICdhb01hcCcsICdyb3VnaG5lc3NNYXAnLCAnbWV0YWxuZXNzTWFwJ107XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBEaXNwb3NlTWF0ZXJpYWwobWF0ZXJpYWw6IE1hdGVyaWFsIHwgTWF0ZXJpYWxbXSk6IHZvaWQge1xyXG4gICAgICAgIGlmICghbWF0ZXJpYWwpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShtYXRlcmlhbCkpIHtcclxuICAgICAgICAgICAgbWF0ZXJpYWwuZm9yRWFjaChtdHJsID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMubWF0ZXJpYWxQcm9wc1xyXG4gICAgICAgICAgICAgICAgICAgIC5maWx0ZXIobWFwVHlwZSA9PiBtdHJsW21hcFR5cGVdKVxyXG4gICAgICAgICAgICAgICAgICAgIC5mb3JFYWNoKG1hcFR5cGUgPT4gbXRybFttYXBUeXBlXS5kaXNwb3NlKCkpO1xyXG4gICAgICAgICAgICAgICAgbXRybC5kaXNwb3NlKCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMubWF0ZXJpYWxQcm9wc1xyXG4gICAgICAgICAgICAgICAgLmZpbHRlcihtYXBUeXBlID0+IG1hdGVyaWFsW21hcFR5cGVdICYmIG1hdGVyaWFsW21hcFR5cGVdLmRpc3Bvc2UpXHJcbiAgICAgICAgICAgICAgICAuZm9yRWFjaChtYXBUeXBlID0+IG1hdGVyaWFsW21hcFR5cGVdLmRpc3Bvc2UoKSk7XHJcbiAgICAgICAgICAgIGlmIChtYXRlcmlhbC5kaXNwb3NlKSB7XHJcbiAgICAgICAgICAgICAgICBtYXRlcmlhbC5kaXNwb3NlKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBEaXNwb3NlT2JqZWN0KG9iamVjdDogT2JqZWN0M0QgfCBNZXNoKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKCFvYmplY3QpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAob2JqZWN0LmNoaWxkcmVuLmxlbmd0aCkge1xyXG4gICAgICAgICAgICBvYmplY3QuY2hpbGRyZW4uZm9yRWFjaChjaGlsZCA9PiB0aGlzLkRpc3Bvc2VPYmplY3QoY2hpbGQpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5EaXNwb3NlTm9kZShvYmplY3QpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgc3RhdGljIERpc3Bvc2VOb2RlKG5vZGU6IE9iamVjdDNEIHwgTWVzaCk6IHZvaWQge1xyXG4gICAgICAgIG5vZGUudHJhdmVyc2UoKG9iajogT2JqZWN0M0QpID0+IHtcclxuICAgICAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIE1lc2gpIHtcclxuICAgICAgICAgICAgICAgIGlmIChvYmouZ2VvbWV0cnkpIHtcclxuICAgICAgICAgICAgICAgICAgICBvYmouZ2VvbWV0cnkuZGlzcG9zZSgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdGhpcy5EaXNwb3NlTWF0ZXJpYWwob2JqLm1hdGVyaWFsKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAodHlwZW9mIChvYmogYXMgYW55KS5kaXNwb3NlID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXHJcbiAgICAgICAgICAgICAgICBvYmouZGlzcG9zZSgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG59XHJcbiJdfQ==
|
|
@@ -1,94 +1,94 @@
|
|
|
1
|
-
import * as THREE from 'three';
|
|
2
|
-
export class SceneUtils {
|
|
3
|
-
static TrySelectorConnection(scene, parent, part1, part2, createAddableFn) {
|
|
4
|
-
let addable;
|
|
5
|
-
if (createAddableFn) {
|
|
6
|
-
addable = part2;
|
|
7
|
-
part2 = createAddableFn(addable);
|
|
8
|
-
}
|
|
9
|
-
for (let i = 0; i < part1.children.length; i++) {
|
|
10
|
-
for (let ii = 0; ii < part2.children.length; ii++) {
|
|
11
|
-
const con1 = part1.children[i];
|
|
12
|
-
const con2 = part2.children[ii];
|
|
13
|
-
// if these connectors can connect connect them
|
|
14
|
-
if (!con1['connected'] && !con2['connected'] && this.CanSelectorConnect(con1, con2)) {
|
|
15
|
-
// if addable, continue this loop with a new addable
|
|
16
|
-
if (addable) {
|
|
17
|
-
const newPart2 = createAddableFn(addable, part2, part1);
|
|
18
|
-
// reference of part2 changed, so refresh con2
|
|
19
|
-
this.SelectorConnect(scene, parent, con1, newPart2.children[ii]);
|
|
20
|
-
}
|
|
21
|
-
else {
|
|
22
|
-
return this.SelectorConnect(scene, parent, con1, con2);
|
|
23
|
-
}
|
|
24
|
-
}
|
|
25
|
-
}
|
|
26
|
-
}
|
|
27
|
-
return false;
|
|
28
|
-
}
|
|
29
|
-
static Convert3DPointToScreenPoint(point, camera, width, height) {
|
|
30
|
-
if (!point) {
|
|
31
|
-
return new THREE.Vector2();
|
|
32
|
-
}
|
|
33
|
-
const vector = point.clone().project(camera);
|
|
34
|
-
vector.x = (vector.x + 1) / 2 * width;
|
|
35
|
-
vector.y = -(vector.y - 1) / 2 * height;
|
|
36
|
-
return new THREE.Vector2(vector.x, vector.y);
|
|
37
|
-
}
|
|
38
|
-
static CanSelectorConnect(con1, con2) {
|
|
39
|
-
const con1Name = con1 instanceof THREE.Object3D ? con1.name : con1.connector;
|
|
40
|
-
const con2Name = con2 instanceof THREE.Object3D ? con2.name : con2.connector;
|
|
41
|
-
const sameParent = con1 instanceof THREE.Object3D && con2 instanceof THREE.Object3D ? con1.parent === con2.parent : false;
|
|
42
|
-
const parts1 = con1Name.toUpperCase().split('_'), parts2 = con2Name.toUpperCase().split('_');
|
|
43
|
-
if (parts1.length >= 3 && parts2.length >= 3 && !sameParent) {
|
|
44
|
-
const connectable = parts1[0] === 'C' && parts2[0] === 'C' &&
|
|
45
|
-
parts1[1] === parts2[1] && parts1[2] !== parts2[2];
|
|
46
|
-
return connectable;
|
|
47
|
-
}
|
|
48
|
-
return false;
|
|
49
|
-
}
|
|
50
|
-
static SelectorConnect(scene, parent, con1, con2) {
|
|
51
|
-
if (!scene || !parent) {
|
|
52
|
-
return false;
|
|
53
|
-
}
|
|
54
|
-
con1['connectedTo'] = con2.parent.name;
|
|
55
|
-
con2['connectedTo'] = con1.parent.name;
|
|
56
|
-
const motherRotation = new THREE.Euler(0, 0, 0);
|
|
57
|
-
const motherPosition = new THREE.Vector3(0, 0, 0);
|
|
58
|
-
scene.updateMatrixWorld(true);
|
|
59
|
-
motherRotation.copy(parent.rotation);
|
|
60
|
-
parent.getWorldPosition(motherPosition);
|
|
61
|
-
parent.rotation.set(0, 0, 0);
|
|
62
|
-
parent.position.set(0, 0, 0);
|
|
63
|
-
const con1Quat = new THREE.Quaternion();
|
|
64
|
-
con1.getWorldQuaternion(con1Quat);
|
|
65
|
-
const con2Quat = new THREE.Quaternion();
|
|
66
|
-
con2.getWorldQuaternion(con2Quat);
|
|
67
|
-
const con1QuatParent = new THREE.Quaternion();
|
|
68
|
-
con1.parent.getWorldQuaternion(con1QuatParent);
|
|
69
|
-
const con2QuatParent = new THREE.Quaternion();
|
|
70
|
-
con2.parent.getWorldQuaternion(con2QuatParent);
|
|
71
|
-
const rotation = new THREE.Quaternion().multiplyQuaternions(con1Quat.invert(), con2Quat).multiply(new THREE.Quaternion().multiplyQuaternions(con1QuatParent, con1QuatParent));
|
|
72
|
-
con2.parent.quaternion.copy(rotation);
|
|
73
|
-
// Update because the matrix has been tempered with
|
|
74
|
-
scene.updateMatrixWorld(true);
|
|
75
|
-
// Move the connectors towards eachother
|
|
76
|
-
const con1Pos = new THREE.Vector3();
|
|
77
|
-
con1.getWorldPosition(con1Pos);
|
|
78
|
-
const con2Pos = new THREE.Vector3();
|
|
79
|
-
con2.getWorldPosition(con2Pos);
|
|
80
|
-
const move = con1Pos.sub(con2Pos);
|
|
81
|
-
con2.parent.position.x += move.x;
|
|
82
|
-
con2.parent.position.y += move.y;
|
|
83
|
-
con2.parent.position.z += move.z;
|
|
84
|
-
// reset parent's objects rotation and position
|
|
85
|
-
parent.rotation.copy(motherRotation);
|
|
86
|
-
parent.position.copy(motherPosition);
|
|
87
|
-
scene.updateMatrixWorld(true);
|
|
88
|
-
// Set the connected flag
|
|
89
|
-
con1['connected'] = true;
|
|
90
|
-
con2['connected'] = true;
|
|
91
|
-
return true;
|
|
92
|
-
}
|
|
93
|
-
}
|
|
1
|
+
import * as THREE from 'three';
|
|
2
|
+
export class SceneUtils {
|
|
3
|
+
static TrySelectorConnection(scene, parent, part1, part2, createAddableFn) {
|
|
4
|
+
let addable;
|
|
5
|
+
if (createAddableFn) {
|
|
6
|
+
addable = part2;
|
|
7
|
+
part2 = createAddableFn(addable);
|
|
8
|
+
}
|
|
9
|
+
for (let i = 0; i < part1.children.length; i++) {
|
|
10
|
+
for (let ii = 0; ii < part2.children.length; ii++) {
|
|
11
|
+
const con1 = part1.children[i];
|
|
12
|
+
const con2 = part2.children[ii];
|
|
13
|
+
// if these connectors can connect connect them
|
|
14
|
+
if (!con1['connected'] && !con2['connected'] && this.CanSelectorConnect(con1, con2)) {
|
|
15
|
+
// if addable, continue this loop with a new addable
|
|
16
|
+
if (addable) {
|
|
17
|
+
const newPart2 = createAddableFn(addable, part2, part1);
|
|
18
|
+
// reference of part2 changed, so refresh con2
|
|
19
|
+
this.SelectorConnect(scene, parent, con1, newPart2.children[ii]);
|
|
20
|
+
}
|
|
21
|
+
else {
|
|
22
|
+
return this.SelectorConnect(scene, parent, con1, con2);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
return false;
|
|
28
|
+
}
|
|
29
|
+
static Convert3DPointToScreenPoint(point, camera, width, height) {
|
|
30
|
+
if (!point) {
|
|
31
|
+
return new THREE.Vector2();
|
|
32
|
+
}
|
|
33
|
+
const vector = point.clone().project(camera);
|
|
34
|
+
vector.x = (vector.x + 1) / 2 * width;
|
|
35
|
+
vector.y = -(vector.y - 1) / 2 * height;
|
|
36
|
+
return new THREE.Vector2(vector.x, vector.y);
|
|
37
|
+
}
|
|
38
|
+
static CanSelectorConnect(con1, con2) {
|
|
39
|
+
const con1Name = con1 instanceof THREE.Object3D ? con1.name : con1.connector;
|
|
40
|
+
const con2Name = con2 instanceof THREE.Object3D ? con2.name : con2.connector;
|
|
41
|
+
const sameParent = con1 instanceof THREE.Object3D && con2 instanceof THREE.Object3D ? con1.parent === con2.parent : false;
|
|
42
|
+
const parts1 = con1Name.toUpperCase().split('_'), parts2 = con2Name.toUpperCase().split('_');
|
|
43
|
+
if (parts1.length >= 3 && parts2.length >= 3 && !sameParent) {
|
|
44
|
+
const connectable = parts1[0] === 'C' && parts2[0] === 'C' &&
|
|
45
|
+
parts1[1] === parts2[1] && parts1[2] !== parts2[2];
|
|
46
|
+
return connectable;
|
|
47
|
+
}
|
|
48
|
+
return false;
|
|
49
|
+
}
|
|
50
|
+
static SelectorConnect(scene, parent, con1, con2) {
|
|
51
|
+
if (!scene || !parent) {
|
|
52
|
+
return false;
|
|
53
|
+
}
|
|
54
|
+
con1['connectedTo'] = con2.parent.name;
|
|
55
|
+
con2['connectedTo'] = con1.parent.name;
|
|
56
|
+
const motherRotation = new THREE.Euler(0, 0, 0);
|
|
57
|
+
const motherPosition = new THREE.Vector3(0, 0, 0);
|
|
58
|
+
scene.updateMatrixWorld(true);
|
|
59
|
+
motherRotation.copy(parent.rotation);
|
|
60
|
+
parent.getWorldPosition(motherPosition);
|
|
61
|
+
parent.rotation.set(0, 0, 0);
|
|
62
|
+
parent.position.set(0, 0, 0);
|
|
63
|
+
const con1Quat = new THREE.Quaternion();
|
|
64
|
+
con1.getWorldQuaternion(con1Quat);
|
|
65
|
+
const con2Quat = new THREE.Quaternion();
|
|
66
|
+
con2.getWorldQuaternion(con2Quat);
|
|
67
|
+
const con1QuatParent = new THREE.Quaternion();
|
|
68
|
+
con1.parent.getWorldQuaternion(con1QuatParent);
|
|
69
|
+
const con2QuatParent = new THREE.Quaternion();
|
|
70
|
+
con2.parent.getWorldQuaternion(con2QuatParent);
|
|
71
|
+
const rotation = new THREE.Quaternion().multiplyQuaternions(con1Quat.invert(), con2Quat).multiply(new THREE.Quaternion().multiplyQuaternions(con1QuatParent, con1QuatParent));
|
|
72
|
+
con2.parent.quaternion.copy(rotation);
|
|
73
|
+
// Update because the matrix has been tempered with
|
|
74
|
+
scene.updateMatrixWorld(true);
|
|
75
|
+
// Move the connectors towards eachother
|
|
76
|
+
const con1Pos = new THREE.Vector3();
|
|
77
|
+
con1.getWorldPosition(con1Pos);
|
|
78
|
+
const con2Pos = new THREE.Vector3();
|
|
79
|
+
con2.getWorldPosition(con2Pos);
|
|
80
|
+
const move = con1Pos.sub(con2Pos);
|
|
81
|
+
con2.parent.position.x += move.x;
|
|
82
|
+
con2.parent.position.y += move.y;
|
|
83
|
+
con2.parent.position.z += move.z;
|
|
84
|
+
// reset parent's objects rotation and position
|
|
85
|
+
parent.rotation.copy(motherRotation);
|
|
86
|
+
parent.position.copy(motherPosition);
|
|
87
|
+
scene.updateMatrixWorld(true);
|
|
88
|
+
// Set the connected flag
|
|
89
|
+
con1['connected'] = true;
|
|
90
|
+
con2['connected'] = true;
|
|
91
|
+
return true;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
94
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NlbmUtdXRpbHMuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AY29saWpuaXQvY29uZmlndXJhdG9yLyIsInNvdXJjZXMiOlsidXRpbHMvc2NlbmUtdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLEtBQUssTUFBTSxPQUFPLENBQUM7QUFFL0IsTUFBTSxPQUFPLFVBQVU7SUFFWixNQUFNLENBQUMscUJBQXFCLENBQUMsS0FBa0IsRUFBRSxNQUFzQixFQUMxRSxLQUFVLEVBQUUsS0FBVSxFQUFFLGVBQTBCO1FBQ2xELElBQUksT0FBWSxDQUFDO1FBQ2pCLElBQUksZUFBZSxFQUFFO1lBQ2pCLE9BQU8sR0FBRyxLQUFLLENBQUM7WUFDaEIsS0FBSyxHQUFHLGVBQWUsQ0FBQyxPQUFPLENBQUMsQ0FBQztTQUNwQztRQUNELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUM1QyxLQUFLLElBQUksRUFBRSxHQUFHLENBQUMsRUFBRSxFQUFFLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsRUFBRSxFQUFFLEVBQUU7Z0JBQy9DLE1BQU0sSUFBSSxHQUFtQixLQUFLLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUMvQyxNQUFNLElBQUksR0FBbUIsS0FBSyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQztnQkFDaEQsK0NBQStDO2dCQUMvQyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLEVBQUU7b0JBQ2pGLG9EQUFvRDtvQkFDcEQsSUFBSSxPQUFPLEVBQUU7d0JBQ1QsTUFBTSxRQUFRLEdBQW1CLGVBQWUsQ0FBQyxPQUFPLEVBQUUsS0FBSyxF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Q0FBQyxDQUFDO1FBRXJDLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUU5Qix5QkFBeUI7UUFDekIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLElBQUksQ0FBQztRQUN6QixJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsSUFBSSxDQUFDO1FBQ3pCLE9BQU8sSUFBSSxDQUFDO0lBQ2hCLENBQUM7Q0FFSiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIFRIUkVFIGZyb20gJ3RocmVlJztcclxuXHJcbmV4cG9ydCBjbGFzcyBTY2VuZVV0aWxzIHtcclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIFRyeVNlbGVjdG9yQ29ubmVjdGlvbihzY2VuZTogVEhSRUUuU2NlbmUsIHBhcmVudDogVEhSRUUuT2JqZWN0M0QsXHJcbiAgICAgICAgcGFydDE6IGFueSwgcGFydDI6IGFueSwgY3JlYXRlQWRkYWJsZUZuPzogRnVuY3Rpb24pOiBib29sZWFuIHtcclxuICAgICAgICBsZXQgYWRkYWJsZTogYW55O1xyXG4gICAgICAgIGlmIChjcmVhdGVBZGRhYmxlRm4pIHtcclxuICAgICAgICAgICAgYWRkYWJsZSA9IHBhcnQyO1xyXG4gICAgICAgICAgICBwYXJ0MiA9IGNyZWF0ZUFkZGFibGVGbihhZGRhYmxlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXJ0MS5jaGlsZHJlbi5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBmb3IgKGxldCBpaSA9IDA7IGlpIDwgcGFydDIuY2hpbGRyZW4ubGVuZ3RoOyBpaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBjb24xOiBUSFJFRS5PYmplY3QzRCA9IHBhcnQxLmNoaWxkcmVuW2ldO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgY29uMjogVEhSRUUuT2JqZWN0M0QgPSBwYXJ0Mi5jaGlsZHJlbltpaV07XHJcbiAgICAgICAgICAgICAgICAvLyBpZiB0aGVzZSBjb25uZWN0b3JzIGNhbiBjb25uZWN0IGNvbm5lY3QgdGhlbVxyXG4gICAgICAgICAgICAgICAgaWYgKCFjb24xWydjb25uZWN0ZWQnXSAmJiAhY29uMlsnY29ubmVjdGVkJ10gJiYgdGhpcy5DYW5TZWxlY3RvckNvbm5lY3QoY29uMSwgY29uMikpIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBpZiBhZGRhYmxlLCBjb250aW51ZSB0aGlzIGxvb3Agd2l0aCBhIG5ldyBhZGRhYmxlXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGFkZGFibGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV3UGFydDI6IFRIUkVFLk9iamVjdDNEID0gY3JlYXRlQWRkYWJsZUZuKGFkZGFibGUsIHBhcnQyLCBwYXJ0MSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlZmVyZW5jZSBvZiBwYXJ0MiBjaGFuZ2VkLCBzbyByZWZyZXNoIGNvbjJcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5TZWxlY3RvckNvbm5lY3Qoc2NlbmUsIHBhcmVudCwgY29uMSwgbmV3UGFydDIuY2hpbGRyZW5baWldKTtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5TZWxlY3RvckNvbm5lY3Qoc2NlbmUsIHBhcmVudCwgY29uMSwgY29uMik7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIENvbnZlcnQzRFBvaW50VG9TY3JlZW5Qb2ludChwb2ludDogVEhSRUUuVmVjdG9yMywgY2FtZXJhOiBUSFJFRS5DYW1lcmEsIHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyKTogVEhSRUUuVmVjdG9yMiB7XHJcbiAgICAgICAgaWYgKCFwb2ludCkge1xyXG4gICAgICAgICAgICByZXR1cm4gbmV3IFRIUkVFLlZlY3RvcjIoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgdmVjdG9yOiBUSFJFRS5WZWN0b3IzID0gcG9pbnQuY2xvbmUoKS5wcm9qZWN0KGNhbWVyYSk7XHJcbiAgICAgICAgdmVjdG9yLnggPSAodmVjdG9yLnggKyAxKSAvIDIgKiB3aWR0aDtcclxuICAgICAgICB2ZWN0b3IueSA9IC0odmVjdG9yLnkgLSAxKSAvIDIgKiBoZWlnaHQ7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBUSFJFRS5WZWN0b3IyKHZlY3Rvci54LCB2ZWN0b3IueSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBDYW5TZWxlY3RvckNvbm5lY3QoY29uMTogVEhSRUUuT2JqZWN0M0QgfCBhbnksIGNvbjI6IFRIUkVFLk9iamVjdDNEIHwgYW55KTogYm9vbGVhbiB7XHJcbiAgICAgICAgY29uc3QgY29uMU5hbWU6IHN0cmluZyA9IGNvbjEgaW5zdGFuY2VvZiBUSFJFRS5PYmplY3QzRCA/IGNvbjEubmFtZSA6IGNvbjEuY29ubmVjdG9yO1xyXG4gICAgICAgIGNvbnN0IGNvbjJOYW1lOiBzdHJpbmcgPSBjb24yIGluc3RhbmNlb2YgVEhSRUUuT2JqZWN0M0QgPyBjb24yLm5hbWUgOiBjb24yLmNvbm5lY3RvcjtcclxuICAgICAgICBjb25zdCBzYW1lUGFyZW50OiBib29sZWFuID0gY29uMSBpbnN0YW5jZW9mIFRIUkVFLk9iamVjdDNEICYmIGNvbjIgaW5zdGFuY2VvZiBUSFJFRS5PYmplY3QzRCA/IGNvbjEucGFyZW50ID09PSBjb24yLnBhcmVudCA6IGZhbHNlO1xyXG4gICAgICAgIGNvbnN0IHBhcnRzMTogc3RyaW5nW10gPSBjb24xTmFtZS50b1VwcGVyQ2FzZSgpLnNwbGl0KCdfJyksXHJcbiAgICAgICAgICAgIHBhcnRzMjogc3RyaW5nW10gPSBjb24yTmFtZS50b1VwcGVyQ2FzZSgpLnNwbGl0KCdfJyk7XHJcbiAgICAgICAgaWYgKHBhcnRzMS5sZW5ndGggPj0gMyAmJiBwYXJ0czIubGVuZ3RoID49IDMgJiYgIXNhbWVQYXJlbnQpIHtcclxuICAgICAgICAgICAgY29uc3QgY29ubmVjdGFibGU6IGJvb2xlYW4gPSBwYXJ0czFbMF0gPT09ICdDJyAmJiBwYXJ0czJbMF0gPT09ICdDJyAmJlxyXG4gICAgICAgICAgICAgICAgcGFydHMxWzFdID09PSBwYXJ0czJbMV0gJiYgcGFydHMxWzJdICE9PSBwYXJ0czJbMl07XHJcbiAgICAgICAgICAgIHJldHVybiBjb25uZWN0YWJsZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgc3RhdGljIFNlbGVjdG9yQ29ubmVjdChzY2VuZTogVEhSRUUuU2NlbmUsIHBhcmVudDogVEhSRUUuT2JqZWN0M0QsIGNvbjE6IFRIUkVFLk9iamVjdDNELCBjb24yOiBUSFJFRS5PYmplY3QzRCk6IGJvb2xlYW4ge1xyXG4gICAgICAgIGlmICghc2NlbmUgfHwgIXBhcmVudCkge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbjFbJ2Nvbm5lY3RlZFRvJ10gPSBjb24yLnBhcmVudC5uYW1lO1xyXG4gICAgICAgIGNvbjJbJ2Nvbm5lY3RlZFRvJ10gPSBjb24xLnBhcmVudC5uYW1lO1xyXG5cclxuICAgICAgICBjb25zdCBtb3RoZXJSb3RhdGlvbjogVEhSRUUuRXVsZXIgPSBuZXcgVEhSRUUuRXVsZXIoMCwgMCwgMCk7XHJcbiAgICAgICAgY29uc3QgbW90aGVyUG9zaXRpb246IFRIUkVFLlZlY3RvcjMgPSBuZXcgVEhSRUUuVmVjdG9yMygwLCAwLCAwKTtcclxuXHJcbiAgICAgICAgc2NlbmUudXBkYXRlTWF0cml4V29ybGQodHJ1ZSk7XHJcbiAgICAgICAgbW90aGVyUm90YXRpb24uY29weShwYXJlbnQucm90YXRpb24pO1xyXG4gICAgICAgIHBhcmVudC5nZXRXb3JsZFBvc2l0aW9uKG1vdGhlclBvc2l0aW9uKTtcclxuXHJcbiAgICAgICAgcGFyZW50LnJvdGF0aW9uLnNldCgwLCAwLCAwKTtcclxuICAgICAgICBwYXJlbnQucG9zaXRpb24uc2V0KDAsIDAsIDApO1xyXG5cclxuICAgICAgICBjb25zdCBjb24xUXVhdDogVEhSRUUuUXVhdGVybmlvbiA9IG5ldyBUSFJFRS5RdWF0ZXJuaW9uKCk7XHJcbiAgICAgICAgY29uMS5nZXRXb3JsZFF1YXRlcm5pb24oY29uMVF1YXQpO1xyXG4gICAgICAgIGNvbnN0IGNvbjJRdWF0OiBUSFJFRS5RdWF0ZXJuaW9uID0gbmV3IFRIUkVFLlF1YXRlcm5pb24oKTtcclxuICAgICAgICBjb24yLmdldFdvcmxkUXVhdGVybmlvbihjb24yUXVhdCk7XHJcbiAgICAgICAgY29uc3QgY29uMVF1YXRQYXJlbnQ6IFRIUkVFLlF1YXRlcm5pb24gPSBuZXcgVEhSRUUuUXVhdGVybmlvbigpO1xyXG4gICAgICAgIGNvbjEucGFyZW50LmdldFdvcmxkUXVhdGVybmlvbihjb24xUXVhdFBhcmVudCk7XHJcbiAgICAgICAgY29uc3QgY29uMlF1YXRQYXJlbnQ6IFRIUkVFLlF1YXRlcm5pb24gPSBuZXcgVEhSRUUuUXVhdGVybmlvbigpO1xyXG4gICAgICAgIGNvbjIucGFyZW50LmdldFdvcmxkUXVhdGVybmlvbihjb24yUXVhdFBhcmVudCk7XHJcblxyXG4gICAgICAgIGNvbnN0IHJvdGF0aW9uOiBUSFJFRS5RdWF0ZXJuaW9uID0gbmV3IFRIUkVFLlF1YXRlcm5pb24oKS5tdWx0aXBseVF1YXRlcm5pb25zKFxyXG4gICAgICAgICAgICBjb24xUXVhdC5pbnZlcnQoKSxcclxuICAgICAgICAgICAgY29uMlF1YXRcclxuICAgICAgICApLm11bHRpcGx5KFxyXG4gICAgICAgICAgICBuZXcgVEhSRUUuUXVhdGVybmlvbigpLm11bHRpcGx5UXVhdGVybmlvbnMoXHJcbiAgICAgICAgICAgICAgICBjb24xUXVhdFBhcmVudCxcclxuICAgICAgICAgICAgICAgIGNvbjFRdWF0UGFyZW50XHJcbiAgICAgICAgICAgIClcclxuICAgICAgICApO1xyXG5cclxuICAgICAgICBjb24yLnBhcmVudC5xdWF0ZXJuaW9uLmNvcHkocm90YXRpb24pO1xyXG4gICAgICAgIC8vIFVwZGF0ZSBiZWNhdXNlIHRoZSBtYXRyaXggaGFzIGJlZW4gdGVtcGVyZWQgd2l0aFxyXG4gICAgICAgIHNjZW5lLnVwZGF0ZU1hdHJpeFdvcmxkKHRydWUpO1xyXG5cclxuICAgICAgICAvLyBNb3ZlIHRoZSBjb25uZWN0b3JzIHRvd2FyZHMgZWFjaG90aGVyXHJcbiAgICAgICAgY29uc3QgY29uMVBvczogVEhSRUUuVmVjdG9yMyA9IG5ldyBUSFJFRS5WZWN0b3IzKCk7XHJcbiAgICAgICAgY29uMS5nZXRXb3JsZFBvc2l0aW9uKGNvbjFQb3MpO1xyXG4gICAgICAgIGNvbnN0IGNvbjJQb3M6IFRIUkVFLlZlY3RvcjMgPSBuZXcgVEhSRUUuVmVjdG9yMygpO1xyXG4gICAgICAgIGNvbjIuZ2V0V29ybGRQb3NpdGlvbihjb24yUG9zKTtcclxuXHJcbiAgICAgICAgY29uc3QgbW92ZTogVEhSRUUuVmVjdG9yMyA9IGNvbjFQb3Muc3ViKGNvbjJQb3MpO1xyXG4gICAgICAgIGNvbjIucGFyZW50LnBvc2l0aW9uLnggKz0gbW92ZS54O1xyXG4gICAgICAgIGNvbjIucGFyZW50LnBvc2l0aW9uLnkgKz0gbW92ZS55O1xyXG4gICAgICAgIGNvbjIucGFyZW50LnBvc2l0aW9uLnogKz0gbW92ZS56O1xyXG5cclxuICAgICAgICAvLyByZXNldCBwYXJlbnQncyBvYmplY3RzIHJvdGF0aW9uIGFuZCBwb3NpdGlvblxyXG4gICAgICAgIHBhcmVudC5yb3RhdGlvbi5jb3B5KG1vdGhlclJvdGF0aW9uKTtcclxuICAgICAgICBwYXJlbnQucG9zaXRpb24uY29weShtb3RoZXJQb3NpdGlvbik7XHJcblxyXG4gICAgICAgIHNjZW5lLnVwZGF0ZU1hdHJpeFdvcmxkKHRydWUpO1xyXG5cclxuICAgICAgICAvLyBTZXQgdGhlIGNvbm5lY3RlZCBmbGFnXHJcbiAgICAgICAgY29uMVsnY29ubmVjdGVkJ10gPSB0cnVlO1xyXG4gICAgICAgIGNvbjJbJ2Nvbm5lY3RlZCddID0gdHJ1ZTtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuXHJcbn1cclxuIl19
|