angular-three-soba 1.3.2 → 1.5.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.
Files changed (57) hide show
  1. package/abstractions/README.md +3 -0
  2. package/abstractions/index.d.ts +10 -0
  3. package/abstractions/lib/billboard/billboard.d.ts +14 -0
  4. package/abstractions/lib/catmull-rom-line/catmull-rom-line.d.ts +15 -0
  5. package/abstractions/lib/cubic-bezier-line/cubic-bezier-line.d.ts +15 -0
  6. package/abstractions/lib/gizmo-helper/gizmo-helper.d.ts +41 -0
  7. package/abstractions/lib/gizmo-helper/gizmo-viewcube/constants.d.ts +12 -0
  8. package/abstractions/lib/gizmo-helper/gizmo-viewcube/gizmo-viewcube-edge.d.ts +16 -0
  9. package/abstractions/lib/gizmo-helper/gizmo-viewcube/gizmo-viewcube-face.d.ts +24 -0
  10. package/abstractions/lib/gizmo-helper/gizmo-viewcube/gizmo-viewcube-inputs.d.ts +14 -0
  11. package/abstractions/lib/gizmo-helper/gizmo-viewcube/gizmo-viewcube.d.ts +15 -0
  12. package/abstractions/lib/gizmo-helper/gizmo-viewport/gizmo-viewport-axis.d.ts +28 -0
  13. package/abstractions/lib/gizmo-helper/gizmo-viewport/gizmo-viewport.d.ts +21 -0
  14. package/abstractions/lib/line/line-input.d.ts +19 -0
  15. package/abstractions/lib/line/line.d.ts +21 -0
  16. package/abstractions/lib/quadratic-bezier-line/quadratic-bezier-line.d.ts +19 -0
  17. package/abstractions/lib/text/text.d.ts +21 -0
  18. package/abstractions/lib/text-3d/text-3d.d.ts +39 -0
  19. package/esm2020/abstractions/angular-three-soba-abstractions.mjs +5 -0
  20. package/esm2020/abstractions/index.mjs +11 -0
  21. package/esm2020/abstractions/lib/billboard/billboard.mjs +73 -0
  22. package/esm2020/abstractions/lib/catmull-rom-line/catmull-rom-line.mjs +119 -0
  23. package/esm2020/abstractions/lib/cubic-bezier-line/cubic-bezier-line.mjs +98 -0
  24. package/esm2020/abstractions/lib/gizmo-helper/gizmo-helper.mjs +206 -0
  25. package/esm2020/abstractions/lib/gizmo-helper/gizmo-viewcube/constants.mjs +31 -0
  26. package/esm2020/abstractions/lib/gizmo-helper/gizmo-viewcube/gizmo-viewcube-edge.mjs +91 -0
  27. package/esm2020/abstractions/lib/gizmo-helper/gizmo-viewcube/gizmo-viewcube-face.mjs +182 -0
  28. package/esm2020/abstractions/lib/gizmo-helper/gizmo-viewcube/gizmo-viewcube-inputs.mjs +45 -0
  29. package/esm2020/abstractions/lib/gizmo-helper/gizmo-viewcube/gizmo-viewcube.mjs +133 -0
  30. package/esm2020/abstractions/lib/gizmo-helper/gizmo-viewport/gizmo-viewport-axis.mjs +193 -0
  31. package/esm2020/abstractions/lib/gizmo-helper/gizmo-viewport/gizmo-viewport.mjs +266 -0
  32. package/esm2020/abstractions/lib/line/line-input.mjs +75 -0
  33. package/esm2020/abstractions/lib/line/line.mjs +147 -0
  34. package/esm2020/abstractions/lib/quadratic-bezier-line/quadratic-bezier-line.mjs +127 -0
  35. package/esm2020/abstractions/lib/text/text.mjs +110 -0
  36. package/esm2020/abstractions/lib/text-3d/text-3d.mjs +144 -0
  37. package/esm2020/cameras/lib/orthographic-camera/orthographic-camera.mjs +5 -5
  38. package/esm2020/staging/index.mjs +3 -1
  39. package/esm2020/staging/lib/camera-shake/camera-shake.mjs +121 -0
  40. package/esm2020/staging/lib/cloud/cloud.mjs +159 -0
  41. package/fesm2015/angular-three-soba-abstractions.mjs +1965 -0
  42. package/fesm2015/angular-three-soba-abstractions.mjs.map +1 -0
  43. package/fesm2015/angular-three-soba-cameras.mjs +4 -4
  44. package/fesm2015/angular-three-soba-cameras.mjs.map +1 -1
  45. package/fesm2015/angular-three-soba-staging.mjs +274 -4
  46. package/fesm2015/angular-three-soba-staging.mjs.map +1 -1
  47. package/fesm2020/angular-three-soba-abstractions.mjs +1962 -0
  48. package/fesm2020/angular-three-soba-abstractions.mjs.map +1 -0
  49. package/fesm2020/angular-three-soba-cameras.mjs +4 -4
  50. package/fesm2020/angular-three-soba-cameras.mjs.map +1 -1
  51. package/fesm2020/angular-three-soba-staging.mjs +274 -4
  52. package/fesm2020/angular-three-soba-staging.mjs.map +1 -1
  53. package/package.json +11 -3
  54. package/plugin/package.json +1 -1
  55. package/staging/index.d.ts +2 -0
  56. package/staging/lib/camera-shake/camera-shake.d.ts +28 -0
  57. package/staging/lib/cloud/cloud.d.ts +23 -0
@@ -0,0 +1,98 @@
1
+ import { NgIf } from '@angular/common';
2
+ import { Component, CUSTOM_ELEMENTS_SCHEMA, Input } from '@angular/core';
3
+ import { injectNgtRef } from 'angular-three';
4
+ import * as THREE from 'three';
5
+ import { NgtsLine } from '../line/line';
6
+ import { NgtsLineInput } from '../line/line-input';
7
+ import * as i0 from "@angular/core";
8
+ export class NgtsCubicBezierLine extends NgtsLineInput {
9
+ constructor() {
10
+ super(...arguments);
11
+ this.lineRef = injectNgtRef();
12
+ }
13
+ set start(start) {
14
+ this.set({ start });
15
+ }
16
+ set end(end) {
17
+ this.set({ end });
18
+ }
19
+ set midA(midA) {
20
+ this.set({ midA });
21
+ }
22
+ set midB(midB) {
23
+ this.set({ midB });
24
+ }
25
+ set segments(segments) {
26
+ this.set({ segments });
27
+ }
28
+ initialize() {
29
+ super.initialize();
30
+ this.set({ segments: 10 });
31
+ this.connect('points', this.select(['start', 'end', 'midA', 'midB', 'segments'], ({ start, end, midA, midB, segments }) => {
32
+ const startV = start instanceof THREE.Vector3 ? start : new THREE.Vector3(...start);
33
+ const endV = end instanceof THREE.Vector3 ? end : new THREE.Vector3(...end);
34
+ const midAV = midA instanceof THREE.Vector3 ? midA : new THREE.Vector3(...midA);
35
+ const midBV = midB instanceof THREE.Vector3 ? midB : new THREE.Vector3(...midB);
36
+ return new THREE.CubicBezierCurve3(startV, midAV, midBV, endV).getPoints(segments);
37
+ }));
38
+ }
39
+ }
40
+ NgtsCubicBezierLine.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.1.3", ngImport: i0, type: NgtsCubicBezierLine, deps: null, target: i0.ɵɵFactoryTarget.Component });
41
+ NgtsCubicBezierLine.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.1.3", type: NgtsCubicBezierLine, isStandalone: true, selector: "ngts-cubic-bezier-line[start][end][midA][midB]", inputs: { lineRef: "lineRef", start: "start", end: "end", midA: "midA", midB: "midB", segments: "segments" }, usesInheritance: true, ngImport: i0, template: `
42
+ <ngts-line
43
+ [lineRef]="lineRef"
44
+ [points]="get('points')"
45
+ [color]="get('color')"
46
+ [vertexColors]="get('vertexColors')"
47
+ [resolution]="get('resolution')"
48
+ [lineWidth]="get('lineWidth')"
49
+ [alphaToCoverage]="get('alphaToCoverage')"
50
+ [dashed]="get('dashed')"
51
+ [dashScale]="get('dashScale')"
52
+ [dashSize]="get('dashSize')"
53
+ [dashOffset]="get('dashOffset')"
54
+ [gapSize]="get('gapSize')"
55
+ [wireframe]="get('wireframe')"
56
+ [worldUnits]="get('worldUnits')"
57
+ />
58
+ `, isInline: true, dependencies: [{ kind: "component", type: NgtsLine, selector: "ngts-line[points]", inputs: ["lineRef", "points", "segments"] }] });
59
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.1.3", ngImport: i0, type: NgtsCubicBezierLine, decorators: [{
60
+ type: Component,
61
+ args: [{
62
+ selector: 'ngts-cubic-bezier-line[start][end][midA][midB]',
63
+ standalone: true,
64
+ template: `
65
+ <ngts-line
66
+ [lineRef]="lineRef"
67
+ [points]="get('points')"
68
+ [color]="get('color')"
69
+ [vertexColors]="get('vertexColors')"
70
+ [resolution]="get('resolution')"
71
+ [lineWidth]="get('lineWidth')"
72
+ [alphaToCoverage]="get('alphaToCoverage')"
73
+ [dashed]="get('dashed')"
74
+ [dashScale]="get('dashScale')"
75
+ [dashSize]="get('dashSize')"
76
+ [dashOffset]="get('dashOffset')"
77
+ [gapSize]="get('gapSize')"
78
+ [wireframe]="get('wireframe')"
79
+ [worldUnits]="get('worldUnits')"
80
+ />
81
+ `,
82
+ imports: [NgtsLine, NgIf],
83
+ schemas: [CUSTOM_ELEMENTS_SCHEMA],
84
+ }]
85
+ }], propDecorators: { lineRef: [{
86
+ type: Input
87
+ }], start: [{
88
+ type: Input
89
+ }], end: [{
90
+ type: Input
91
+ }], midA: [{
92
+ type: Input
93
+ }], midB: [{
94
+ type: Input
95
+ }], segments: [{
96
+ type: Input
97
+ }] } });
98
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3ViaWMtYmV6aWVyLWxpbmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2FuZ3VsYXItdGhyZWUtc29iYS9hYnN0cmFjdGlvbnMvc3JjL2xpYi9jdWJpYy1iZXppZXItbGluZS9jdWJpYy1iZXppZXItbGluZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDdkMsT0FBTyxFQUFFLFNBQVMsRUFBRSxzQkFBc0IsRUFBRSxLQUFLLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDekUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM3QyxPQUFPLEtBQUssS0FBSyxNQUFNLE9BQU8sQ0FBQztBQUUvQixPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ3hDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQzs7QUEwQm5ELE1BQU0sT0FBTyxtQkFBb0IsU0FBUSxhQUFhO0lBeEJ0RDs7UUF5QmEsWUFBTyxHQUFHLFlBQVksRUFBUyxDQUFDO0tBb0M1QztJQWxDRyxJQUFhLEtBQUssQ0FBQyxLQUErQztRQUM5RCxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztJQUN4QixDQUFDO0lBRUQsSUFBYSxHQUFHLENBQUMsR0FBNkM7UUFDMUQsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUM7SUFDdEIsQ0FBQztJQUVELElBQWEsSUFBSSxDQUFDLElBQThDO1FBQzVELElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQ3ZCLENBQUM7SUFFRCxJQUFhLElBQUksQ0FBQyxJQUE4QztRQUM1RCxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUN2QixDQUFDO0lBRUQsSUFBYSxRQUFRLENBQUMsUUFBZ0I7UUFDbEMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUM7SUFDM0IsQ0FBQztJQUVRLFVBQVU7UUFDZixLQUFLLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDbkIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLFFBQVEsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQzNCLElBQUksQ0FBQyxPQUFPLENBQ1IsUUFBUSxFQUNSLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsVUFBVSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsRUFBRSxFQUFFO1lBQy9GLE1BQU0sTUFBTSxHQUFHLEtBQUssWUFBWSxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDO1lBQ3BGLE1BQU0sSUFBSSxHQUFHLEdBQUcsWUFBWSxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDO1lBQzVFLE1BQU0sS0FBSyxHQUFHLElBQUksWUFBWSxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDO1lBQ2hGLE1BQU0sS0FBSyxHQUFHLElBQUksWUFBWSxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDO1lBQ2hGLE9BQU8sSUFBSSxLQUFLLENBQUMsaUJBQWlCLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3ZGLENBQUMsQ0FBQyxDQUNMLENBQUM7SUFDTixDQUFDOztnSEFwQ1EsbUJBQW1CO29HQUFuQixtQkFBbUIsK09BckJsQjs7Ozs7Ozs7Ozs7Ozs7Ozs7S0FpQlQsNERBQ1MsUUFBUTsyRkFHVCxtQkFBbUI7a0JBeEIvQixTQUFTO21CQUFDO29CQUNQLFFBQVEsRUFBRSxnREFBZ0Q7b0JBQzFELFVBQVUsRUFBRSxJQUFJO29CQUNoQixRQUFRLEVBQUU7Ozs7Ozs7Ozs7Ozs7Ozs7O0tBaUJUO29CQUNELE9BQU8sRUFBRSxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUM7b0JBQ3pCLE9BQU8sRUFBRSxDQUFDLHNCQUFzQixDQUFDO2lCQUNwQzs4QkFFWSxPQUFPO3NCQUFmLEtBQUs7Z0JBRU8sS0FBSztzQkFBakIsS0FBSztnQkFJTyxHQUFHO3NCQUFmLEtBQUs7Z0JBSU8sSUFBSTtzQkFBaEIsS0FBSztnQkFJTyxJQUFJO3NCQUFoQixLQUFLO2dCQUlPLFFBQVE7c0JBQXBCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBOZ0lmIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IENvbXBvbmVudCwgQ1VTVE9NX0VMRU1FTlRTX1NDSEVNQSwgSW5wdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IGluamVjdE5ndFJlZiB9IGZyb20gJ2FuZ3VsYXItdGhyZWUnO1xuaW1wb3J0ICogYXMgVEhSRUUgZnJvbSAndGhyZWUnO1xuaW1wb3J0IHsgTGluZTIgfSBmcm9tICd0aHJlZS1zdGRsaWInO1xuaW1wb3J0IHsgTmd0c0xpbmUgfSBmcm9tICcuLi9saW5lL2xpbmUnO1xuaW1wb3J0IHsgTmd0c0xpbmVJbnB1dCB9IGZyb20gJy4uL2xpbmUvbGluZS1pbnB1dCc7XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnbmd0cy1jdWJpYy1iZXppZXItbGluZVtzdGFydF1bZW5kXVttaWRBXVttaWRCXScsXG4gICAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgICB0ZW1wbGF0ZTogYFxuICAgICAgICA8bmd0cy1saW5lXG4gICAgICAgICAgICBbbGluZVJlZl09XCJsaW5lUmVmXCJcbiAgICAgICAgICAgIFtwb2ludHNdPVwiZ2V0KCdwb2ludHMnKVwiXG4gICAgICAgICAgICBbY29sb3JdPVwiZ2V0KCdjb2xvcicpXCJcbiAgICAgICAgICAgIFt2ZXJ0ZXhDb2xvcnNdPVwiZ2V0KCd2ZXJ0ZXhDb2xvcnMnKVwiXG4gICAgICAgICAgICBbcmVzb2x1dGlvbl09XCJnZXQoJ3Jlc29sdXRpb24nKVwiXG4gICAgICAgICAgICBbbGluZVdpZHRoXT1cImdldCgnbGluZVdpZHRoJylcIlxuICAgICAgICAgICAgW2FscGhhVG9Db3ZlcmFnZV09XCJnZXQoJ2FscGhhVG9Db3ZlcmFnZScpXCJcbiAgICAgICAgICAgIFtkYXNoZWRdPVwiZ2V0KCdkYXNoZWQnKVwiXG4gICAgICAgICAgICBbZGFzaFNjYWxlXT1cImdldCgnZGFzaFNjYWxlJylcIlxuICAgICAgICAgICAgW2Rhc2hTaXplXT1cImdldCgnZGFzaFNpemUnKVwiXG4gICAgICAgICAgICBbZGFzaE9mZnNldF09XCJnZXQoJ2Rhc2hPZmZzZXQnKVwiXG4gICAgICAgICAgICBbZ2FwU2l6ZV09XCJnZXQoJ2dhcFNpemUnKVwiXG4gICAgICAgICAgICBbd2lyZWZyYW1lXT1cImdldCgnd2lyZWZyYW1lJylcIlxuICAgICAgICAgICAgW3dvcmxkVW5pdHNdPVwiZ2V0KCd3b3JsZFVuaXRzJylcIlxuICAgICAgICAvPlxuICAgIGAsXG4gICAgaW1wb3J0czogW05ndHNMaW5lLCBOZ0lmXSxcbiAgICBzY2hlbWFzOiBbQ1VTVE9NX0VMRU1FTlRTX1NDSEVNQV0sXG59KVxuZXhwb3J0IGNsYXNzIE5ndHNDdWJpY0JlemllckxpbmUgZXh0ZW5kcyBOZ3RzTGluZUlucHV0IHtcbiAgICBASW5wdXQoKSBsaW5lUmVmID0gaW5qZWN0Tmd0UmVmPExpbmUyPigpO1xuXG4gICAgQElucHV0KCkgc2V0IHN0YXJ0KHN0YXJ0OiBUSFJFRS5WZWN0b3IzIHwgW251bWJlciwgbnVtYmVyLCBudW1iZXJdKSB7XG4gICAgICAgIHRoaXMuc2V0KHsgc3RhcnQgfSk7XG4gICAgfVxuXG4gICAgQElucHV0KCkgc2V0IGVuZChlbmQ6IFRIUkVFLlZlY3RvcjMgfCBbbnVtYmVyLCBudW1iZXIsIG51bWJlcl0pIHtcbiAgICAgICAgdGhpcy5zZXQoeyBlbmQgfSk7XG4gICAgfVxuXG4gICAgQElucHV0KCkgc2V0IG1pZEEobWlkQTogVEhSRUUuVmVjdG9yMyB8IFtudW1iZXIsIG51bWJlciwgbnVtYmVyXSkge1xuICAgICAgICB0aGlzLnNldCh7IG1pZEEgfSk7XG4gICAgfVxuXG4gICAgQElucHV0KCkgc2V0IG1pZEIobWlkQjogVEhSRUUuVmVjdG9yMyB8IFtudW1iZXIsIG51bWJlciwgbnVtYmVyXSkge1xuICAgICAgICB0aGlzLnNldCh7IG1pZEIgfSk7XG4gICAgfVxuXG4gICAgQElucHV0KCkgc2V0IHNlZ21lbnRzKHNlZ21lbnRzOiBudW1iZXIpIHtcbiAgICAgICAgdGhpcy5zZXQoeyBzZWdtZW50cyB9KTtcbiAgICB9XG5cbiAgICBvdmVycmlkZSBpbml0aWFsaXplKCk6IHZvaWQge1xuICAgICAgICBzdXBlci5pbml0aWFsaXplKCk7XG4gICAgICAgIHRoaXMuc2V0KHsgc2VnbWVudHM6IDEwIH0pO1xuICAgICAgICB0aGlzLmNvbm5lY3QoXG4gICAgICAgICAgICAncG9pbnRzJyxcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0KFsnc3RhcnQnLCAnZW5kJywgJ21pZEEnLCAnbWlkQicsICdzZWdtZW50cyddLCAoeyBzdGFydCwgZW5kLCBtaWRBLCBtaWRCLCBzZWdtZW50cyB9KSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc3RhcnRWID0gc3RhcnQgaW5zdGFuY2VvZiBUSFJFRS5WZWN0b3IzID8gc3RhcnQgOiBuZXcgVEhSRUUuVmVjdG9yMyguLi5zdGFydCk7XG4gICAgICAgICAgICAgICAgY29uc3QgZW5kViA9IGVuZCBpbnN0YW5jZW9mIFRIUkVFLlZlY3RvcjMgPyBlbmQgOiBuZXcgVEhSRUUuVmVjdG9yMyguLi5lbmQpO1xuICAgICAgICAgICAgICAgIGNvbnN0IG1pZEFWID0gbWlkQSBpbnN0YW5jZW9mIFRIUkVFLlZlY3RvcjMgPyBtaWRBIDogbmV3IFRIUkVFLlZlY3RvcjMoLi4ubWlkQSk7XG4gICAgICAgICAgICAgICAgY29uc3QgbWlkQlYgPSBtaWRCIGluc3RhbmNlb2YgVEhSRUUuVmVjdG9yMyA/IG1pZEIgOiBuZXcgVEhSRUUuVmVjdG9yMyguLi5taWRCKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFRIUkVFLkN1YmljQmV6aWVyQ3VydmUzKHN0YXJ0ViwgbWlkQVYsIG1pZEJWLCBlbmRWKS5nZXRQb2ludHMoc2VnbWVudHMpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICB9XG59XG4iXX0=
@@ -0,0 +1,206 @@
1
+ import { NgTemplateOutlet } from '@angular/common';
2
+ import { Component, ContentChild, CUSTOM_ELEMENTS_SCHEMA, Directive, EventEmitter, inject, InjectionToken, Input, Output, TemplateRef, } from '@angular/core';
3
+ import { selectSlice } from '@rx-angular/state';
4
+ import { extend, injectNgtRef, NgtPortal, NgtPortalContent, NgtRxStore, NgtStore } from 'angular-three';
5
+ import { NgtsOrthographicCamera } from 'angular-three-soba/cameras';
6
+ import { combineLatest, map } from 'rxjs';
7
+ import { Group, Matrix4, Object3D, Quaternion, Vector3 } from 'three';
8
+ import * as i0 from "@angular/core";
9
+ const isOrbitControls = (controls) => {
10
+ return 'minPolarAngle' in controls;
11
+ };
12
+ export const NGTS_GIZMO_HELPER_API = new InjectionToken('NgtsGizmoHelper API');
13
+ function gizmoHelperApiFactory(gizmo) {
14
+ const store = inject(NgtStore);
15
+ return {
16
+ tweenCamera: (direction) => {
17
+ const { controls, camera, invalidate } = store.get();
18
+ const defaultControls = controls;
19
+ gizmo.animating = true;
20
+ if (defaultControls)
21
+ gizmo.focusPoint = defaultControls.target;
22
+ gizmo.radius = camera.position.distanceTo(gizmo.target);
23
+ // rotate from current camera orientation
24
+ gizmo.q1.copy(camera.quaternion);
25
+ // to new current camera orientation
26
+ gizmo.targetPosition.copy(direction).multiplyScalar(gizmo.radius).add(gizmo.target);
27
+ gizmo.dummy.lookAt(gizmo.targetPosition);
28
+ gizmo.q2.copy(gizmo.dummy.quaternion);
29
+ invalidate();
30
+ },
31
+ };
32
+ }
33
+ extend({ Group });
34
+ export class NgtsGizmoHelperContent {
35
+ }
36
+ NgtsGizmoHelperContent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.1.3", ngImport: i0, type: NgtsGizmoHelperContent, deps: [], target: i0.ɵɵFactoryTarget.Directive });
37
+ NgtsGizmoHelperContent.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.1.3", type: NgtsGizmoHelperContent, isStandalone: true, selector: "ng-template[ngtsGizmoHelperContent]", ngImport: i0 });
38
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.1.3", ngImport: i0, type: NgtsGizmoHelperContent, decorators: [{
39
+ type: Directive,
40
+ args: [{
41
+ selector: 'ng-template[ngtsGizmoHelperContent]',
42
+ standalone: true,
43
+ }]
44
+ }] });
45
+ export class NgtsGizmoHelper extends NgtRxStore {
46
+ constructor() {
47
+ super(...arguments);
48
+ this.store = inject(NgtStore);
49
+ this.gizmoRef = injectNgtRef();
50
+ this.virtualCameraRef = injectNgtRef();
51
+ this.animating = false;
52
+ this.radius = 0;
53
+ this.focusPoint = new Vector3(0, 0, 0);
54
+ this.q1 = new Quaternion();
55
+ this.q2 = new Quaternion();
56
+ this.target = new Vector3();
57
+ this.targetPosition = new Vector3();
58
+ this.dummy = new Object3D();
59
+ this.defaultUp = new Vector3(0, 0, 0);
60
+ this.turnRate = 2 * Math.PI; // turn rate in angles per sec
61
+ this.matrix = new Matrix4();
62
+ this.updated = new EventEmitter();
63
+ }
64
+ set alignment(alignment) {
65
+ this.set({ alignment });
66
+ }
67
+ set margin(margin) {
68
+ this.set({ margin });
69
+ }
70
+ set renderPriority(renderPriority) {
71
+ this.set({ renderPriority });
72
+ }
73
+ set autoClear(autoClear) {
74
+ this.set({ autoClear });
75
+ }
76
+ initialize() {
77
+ super.initialize();
78
+ this.set({ alignment: 'bottom-right', margin: [80, 80], renderPriority: 1 });
79
+ }
80
+ ngOnInit() {
81
+ this.updateDefaultUp();
82
+ this.setGizmoPosition();
83
+ }
84
+ onBeforeRender(delta) {
85
+ if (this.virtualCameraRef.nativeElement && this.gizmoRef.nativeElement) {
86
+ const { controls, camera: mainCamera, invalidate } = this.store.get();
87
+ const defaultControls = controls;
88
+ // Animate step
89
+ if (this.animating) {
90
+ if (this.q1.angleTo(this.q2) < 0.01) {
91
+ this.animating = false;
92
+ // Orbit controls uses UP vector as the orbit axes,
93
+ // so we need to reset it after the animation is done
94
+ // moving it around for the controls to work correctly
95
+ if (isOrbitControls(defaultControls)) {
96
+ mainCamera.up.copy(this.defaultUp);
97
+ }
98
+ }
99
+ else {
100
+ const step = delta * this.turnRate;
101
+ // animate position by doing a slerp and then scaling the position on the unit sphere
102
+ this.q1.rotateTowards(this.q2, step);
103
+ // animate orientation
104
+ mainCamera.position
105
+ .set(0, 0, 1)
106
+ .applyQuaternion(this.q1)
107
+ .multiplyScalar(this.radius)
108
+ .add(this.focusPoint);
109
+ mainCamera.up.set(0, 1, 0).applyQuaternion(this.q1).normalize();
110
+ mainCamera.quaternion.copy(this.q1);
111
+ if (this.updated.observed)
112
+ this.updated.emit();
113
+ else if (defaultControls) {
114
+ defaultControls.update();
115
+ }
116
+ invalidate();
117
+ }
118
+ }
119
+ // Sync Gizmo with main camera orientation
120
+ this.matrix.copy(mainCamera.matrix).invert();
121
+ this.gizmoRef.nativeElement.quaternion.setFromRotationMatrix(this.matrix);
122
+ }
123
+ }
124
+ setGizmoPosition() {
125
+ this.connect('gizmoPosition', combineLatest([this.store.select('size'), this.select(selectSlice(['alignment', 'margin']))]).pipe(map(([size, { alignment, margin }]) => {
126
+ const [marginX, marginY] = margin;
127
+ const x = alignment.endsWith('-center')
128
+ ? 0
129
+ : alignment.endsWith('-left')
130
+ ? -size.width / 2 + marginX
131
+ : size.width / 2 - marginX;
132
+ const y = alignment.startsWith('center-')
133
+ ? 0
134
+ : alignment.startsWith('top-')
135
+ ? size.height / 2 - marginY
136
+ : -size.height / 2 + marginY;
137
+ return [x, y, 0];
138
+ })));
139
+ }
140
+ updateDefaultUp() {
141
+ this.hold(this.store.select('camera'), (camera) => {
142
+ this.defaultUp.copy(camera.up);
143
+ });
144
+ }
145
+ }
146
+ NgtsGizmoHelper.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.1.3", ngImport: i0, type: NgtsGizmoHelper, deps: null, target: i0.ɵɵFactoryTarget.Component });
147
+ NgtsGizmoHelper.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.1.3", type: NgtsGizmoHelper, isStandalone: true, selector: "ngts-gizmo-helper", inputs: { alignment: "alignment", margin: "margin", renderPriority: "renderPriority", autoClear: "autoClear" }, outputs: { updated: "updated" }, providers: [{ provide: NGTS_GIZMO_HELPER_API, useFactory: gizmoHelperApiFactory, deps: [NgtsGizmoHelper] }], queries: [{ propertyName: "gizmoHelperContent", first: true, predicate: NgtsGizmoHelperContent, descendants: true, read: TemplateRef, static: true }], usesInheritance: true, ngImport: i0, template: `
148
+ <ngt-portal [renderPriority]="get('renderPriority')">
149
+ <ng-template ngtPortalContent>
150
+ <ngts-orthographic-camera
151
+ [cameraRef]="virtualCameraRef"
152
+ [makeDefault]="true"
153
+ [position]="[0, 0, 200]"
154
+ />
155
+ <ngt-group
156
+ [ref]="gizmoRef"
157
+ [position]="get('gizmoPosition')"
158
+ (beforeRender)="onBeforeRender($any($event).state.delta)"
159
+ >
160
+ <ng-container *ngTemplateOutlet="gizmoHelperContent" />
161
+ </ngt-group>
162
+ </ng-template>
163
+ </ngt-portal>
164
+ `, isInline: true, dependencies: [{ kind: "component", type: NgtPortal, selector: "ngt-portal", inputs: ["container", "state", "autoRender", "autoRenderPriority"], outputs: ["beforeRender"] }, { kind: "directive", type: NgtPortalContent, selector: "ng-template[ngtPortalContent]" }, { kind: "component", type: NgtsOrthographicCamera, selector: "ngts-orthographic-camera", inputs: ["left", "right", "top", "bottom"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }] });
165
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.1.3", ngImport: i0, type: NgtsGizmoHelper, decorators: [{
166
+ type: Component,
167
+ args: [{
168
+ selector: 'ngts-gizmo-helper',
169
+ standalone: true,
170
+ template: `
171
+ <ngt-portal [renderPriority]="get('renderPriority')">
172
+ <ng-template ngtPortalContent>
173
+ <ngts-orthographic-camera
174
+ [cameraRef]="virtualCameraRef"
175
+ [makeDefault]="true"
176
+ [position]="[0, 0, 200]"
177
+ />
178
+ <ngt-group
179
+ [ref]="gizmoRef"
180
+ [position]="get('gizmoPosition')"
181
+ (beforeRender)="onBeforeRender($any($event).state.delta)"
182
+ >
183
+ <ng-container *ngTemplateOutlet="gizmoHelperContent" />
184
+ </ngt-group>
185
+ </ng-template>
186
+ </ngt-portal>
187
+ `,
188
+ imports: [NgtPortal, NgtPortalContent, NgtsOrthographicCamera, NgTemplateOutlet],
189
+ providers: [{ provide: NGTS_GIZMO_HELPER_API, useFactory: gizmoHelperApiFactory, deps: [NgtsGizmoHelper] }],
190
+ schemas: [CUSTOM_ELEMENTS_SCHEMA],
191
+ }]
192
+ }], propDecorators: { alignment: [{
193
+ type: Input
194
+ }], margin: [{
195
+ type: Input
196
+ }], renderPriority: [{
197
+ type: Input
198
+ }], autoClear: [{
199
+ type: Input
200
+ }], updated: [{
201
+ type: Output
202
+ }], gizmoHelperContent: [{
203
+ type: ContentChild,
204
+ args: [NgtsGizmoHelperContent, { static: true, read: TemplateRef }]
205
+ }] } });
206
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2l6bW8taGVscGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9hbmd1bGFyLXRocmVlLXNvYmEvYWJzdHJhY3Rpb25zL3NyYy9saWIvZ2l6bW8taGVscGVyL2dpem1vLWhlbHBlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNuRCxPQUFPLEVBQ0gsU0FBUyxFQUNULFlBQVksRUFDWixzQkFBc0IsRUFDdEIsU0FBUyxFQUNULFlBQVksRUFDWixNQUFNLEVBQ04sY0FBYyxFQUNkLEtBQUssRUFFTCxNQUFNLEVBQ04sV0FBVyxHQUNkLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNoRCxPQUFPLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUUsZ0JBQWdCLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN4RyxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNwRSxPQUFPLEVBQUUsYUFBYSxFQUFFLEdBQUcsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMxQyxPQUFPLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQXNCLFVBQVUsRUFBRSxPQUFPLEVBQUUsTUFBTSxPQUFPLENBQUM7O0FBSzFGLE1BQU0sZUFBZSxHQUFHLENBQUMsUUFBdUIsRUFBNkIsRUFBRTtJQUMzRSxPQUFPLGVBQWUsSUFBSyxRQUEwQixDQUFDO0FBQzFELENBQUMsQ0FBQztBQU1GLE1BQU0sQ0FBQyxNQUFNLHFCQUFxQixHQUFHLElBQUksY0FBYyxDQUFxQixxQkFBcUIsQ0FBQyxDQUFDO0FBRW5HLFNBQVMscUJBQXFCLENBQUMsS0FBc0I7SUFDakQsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLFFBQVEs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VyxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTmdUZW1wbGF0ZU91dGxldCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge1xuICAgIENvbXBvbmVudCxcbiAgICBDb250ZW50Q2hpbGQsXG4gICAgQ1VTVE9NX0VMRU1FTlRTX1NDSEVNQSxcbiAgICBEaXJlY3RpdmUsXG4gICAgRXZlbnRFbWl0dGVyLFxuICAgIGluamVjdCxcbiAgICBJbmplY3Rpb25Ub2tlbixcbiAgICBJbnB1dCxcbiAgICBPbkluaXQsXG4gICAgT3V0cHV0LFxuICAgIFRlbXBsYXRlUmVmLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IHNlbGVjdFNsaWNlIH0gZnJvbSAnQHJ4LWFuZ3VsYXIvc3RhdGUnO1xuaW1wb3J0IHsgZXh0ZW5kLCBpbmplY3ROZ3RSZWYsIE5ndFBvcnRhbCwgTmd0UG9ydGFsQ29udGVudCwgTmd0UnhTdG9yZSwgTmd0U3RvcmUgfSBmcm9tICdhbmd1bGFyLXRocmVlJztcbmltcG9ydCB7IE5ndHNPcnRob2dyYXBoaWNDYW1lcmEgfSBmcm9tICdhbmd1bGFyLXRocmVlLXNvYmEvY2FtZXJhcyc7XG5pbXBvcnQgeyBjb21iaW5lTGF0ZXN0LCBtYXAgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IEdyb3VwLCBNYXRyaXg0LCBPYmplY3QzRCwgT3J0aG9ncmFwaGljQ2FtZXJhLCBRdWF0ZXJuaW9uLCBWZWN0b3IzIH0gZnJvbSAndGhyZWUnO1xuaW1wb3J0IHsgT3JiaXRDb250cm9scyB9IGZyb20gJ3RocmVlLXN0ZGxpYic7XG5cbnR5cGUgQ29udHJvbHNQcm90byA9IHsgdXBkYXRlKCk6IHZvaWQ7IHRhcmdldDogVEhSRUUuVmVjdG9yMyB9O1xuXG5jb25zdCBpc09yYml0Q29udHJvbHMgPSAoY29udHJvbHM6IENvbnRyb2xzUHJvdG8pOiBjb250cm9scyBpcyBPcmJpdENvbnRyb2xzID0+IHtcbiAgICByZXR1cm4gJ21pblBvbGFyQW5nbGUnIGluIChjb250cm9scyBhcyBPcmJpdENvbnRyb2xzKTtcbn07XG5cbmV4cG9ydCBpbnRlcmZhY2UgTmd0c0dpem1vSGVscGVyQXBpIHtcbiAgICB0d2VlbkNhbWVyYTogKGRpcmVjdGlvbjogVmVjdG9yMykgPT4gdm9pZDtcbn1cblxuZXhwb3J0IGNvbnN0IE5HVFNfR0laTU9fSEVMUEVSX0FQSSA9IG5ldyBJbmplY3Rpb25Ub2tlbjxOZ3RzR2l6bW9IZWxwZXJBcGk+KCdOZ3RzR2l6bW9IZWxwZXIgQVBJJyk7XG5cbmZ1bmN0aW9uIGdpem1vSGVscGVyQXBpRmFjdG9yeShnaXptbzogTmd0c0dpem1vSGVscGVyKSB7XG4gICAgY29uc3Qgc3RvcmUgPSBpbmplY3QoTmd0U3RvcmUpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgdHdlZW5DYW1lcmE6IChkaXJlY3Rpb246IFZlY3RvcjMpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHsgY29udHJvbHMsIGNhbWVyYSwgaW52YWxpZGF0ZSB9ID0gc3RvcmUuZ2V0KCk7XG4gICAgICAgICAgICBjb25zdCBkZWZhdWx0Q29udHJvbHMgPSBjb250cm9scyBhcyB1bmtub3duIGFzIENvbnRyb2xzUHJvdG87XG5cbiAgICAgICAgICAgIGdpem1vLmFuaW1hdGluZyA9IHRydWU7XG4gICAgICAgICAgICBpZiAoZGVmYXVsdENvbnRyb2xzKSBnaXptby5mb2N1c1BvaW50ID0gZGVmYXVsdENvbnRyb2xzLnRhcmdldDtcbiAgICAgICAgICAgIGdpem1vLnJhZGl1cyA9IGNhbWVyYS5wb3NpdGlvbi5kaXN0YW5jZVRvKGdpem1vLnRhcmdldCk7XG4gICAgICAgICAgICAvLyByb3RhdGUgZnJvbSBjdXJyZW50IGNhbWVyYSBvcmllbnRhdGlvblxuICAgICAgICAgICAgZ2l6bW8ucTEuY29weShjYW1lcmEucXVhdGVybmlvbik7XG4gICAgICAgICAgICAvLyB0byBuZXcgY3VycmVudCBjYW1lcmEgb3JpZW50YXRpb25cbiAgICAgICAgICAgIGdpem1vLnRhcmdldFBvc2l0aW9uLmNvcHkoZGlyZWN0aW9uKS5tdWx0aXBseVNjYWxhcihnaXptby5yYWRpdXMpLmFkZChnaXptby50YXJnZXQpO1xuICAgICAgICAgICAgZ2l6bW8uZHVtbXkubG9va0F0KGdpem1vLnRhcmdldFBvc2l0aW9uKTtcbiAgICAgICAgICAgIGdpem1vLnEyLmNvcHkoZ2l6bW8uZHVtbXkucXVhdGVybmlvbik7XG4gICAgICAgICAgICBpbnZhbGlkYXRlKCk7XG4gICAgICAgIH0sXG4gICAgfTtcbn1cblxuZXh0ZW5kKHsgR3JvdXAgfSk7XG5cbkBEaXJlY3RpdmUoe1xuICAgIHNlbGVjdG9yOiAnbmctdGVtcGxhdGVbbmd0c0dpem1vSGVscGVyQ29udGVudF0nLFxuICAgIHN0YW5kYWxvbmU6IHRydWUsXG59KVxuZXhwb3J0IGNsYXNzIE5ndHNHaXptb0hlbHBlckNvbnRlbnQge31cblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICduZ3RzLWdpem1vLWhlbHBlcicsXG4gICAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgICB0ZW1wbGF0ZTogYFxuICAgICAgICA8bmd0LXBvcnRhbCBbcmVuZGVyUHJpb3JpdHldPVwiZ2V0KCdyZW5kZXJQcmlvcml0eScpXCI+XG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgbmd0UG9ydGFsQ29udGVudD5cbiAgICAgICAgICAgICAgICA8bmd0cy1vcnRob2dyYXBoaWMtY2FtZXJhXG4gICAgICAgICAgICAgICAgICAgIFtjYW1lcmFSZWZdPVwidmlydHVhbENhbWVyYVJlZlwiXG4gICAgICAgICAgICAgICAgICAgIFttYWtlRGVmYXVsdF09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgW3Bvc2l0aW9uXT1cIlswLCAwLCAyMDBdXCJcbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgIDxuZ3QtZ3JvdXBcbiAgICAgICAgICAgICAgICAgICAgW3JlZl09XCJnaXptb1JlZlwiXG4gICAgICAgICAgICAgICAgICAgIFtwb3NpdGlvbl09XCJnZXQoJ2dpem1vUG9zaXRpb24nKVwiXG4gICAgICAgICAgICAgICAgICAgIChiZWZvcmVSZW5kZXIpPVwib25CZWZvcmVSZW5kZXIoJGFueSgkZXZlbnQpLnN0YXRlLmRlbHRhKVwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiZ2l6bW9IZWxwZXJDb250ZW50XCIgLz5cbiAgICAgICAgICAgICAgICA8L25ndC1ncm91cD5cbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgIDwvbmd0LXBvcnRhbD5cbiAgICBgLFxuICAgIGltcG9ydHM6IFtOZ3RQb3J0YWwsIE5ndFBvcnRhbENvbnRlbnQsIE5ndHNPcnRob2dyYXBoaWNDYW1lcmEsIE5nVGVtcGxhdGVPdXRsZXRdLFxuICAgIHByb3ZpZGVyczogW3sgcHJvdmlkZTogTkdUU19HSVpNT19IRUxQRVJfQVBJLCB1c2VGYWN0b3J5OiBnaXptb0hlbHBlckFwaUZhY3RvcnksIGRlcHM6IFtOZ3RzR2l6bW9IZWxwZXJdIH1dLFxuICAgIHNjaGVtYXM6IFtDVVNUT01fRUxFTUVOVFNfU0NIRU1BXSxcbn0pXG5leHBvcnQgY2xhc3MgTmd0c0dpem1vSGVscGVyIGV4dGVuZHMgTmd0UnhTdG9yZSBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gICAgcHJpdmF0ZSByZWFkb25seSBzdG9yZSA9IGluamVjdChOZ3RTdG9yZSk7XG5cbiAgICByZWFkb25seSBnaXptb1JlZiA9IGluamVjdE5ndFJlZjxHcm91cD4oKTtcbiAgICByZWFkb25seSB2aXJ0dWFsQ2FtZXJhUmVmID0gaW5qZWN0Tmd0UmVmPE9ydGhvZ3JhcGhpY0NhbWVyYT4oKTtcblxuICAgIGFuaW1hdGluZyA9IGZhbHNlO1xuICAgIHJhZGl1cyA9IDA7XG4gICAgZm9jdXNQb2ludCA9IG5ldyBWZWN0b3IzKDAsIDAsIDApO1xuICAgIHExID0gbmV3IFF1YXRlcm5pb24oKTtcbiAgICBxMiA9IG5ldyBRdWF0ZXJuaW9uKCk7XG5cbiAgICB0YXJnZXQgPSBuZXcgVmVjdG9yMygpO1xuICAgIHRhcmdldFBvc2l0aW9uID0gbmV3IFZlY3RvcjMoKTtcbiAgICBkdW1teSA9IG5ldyBPYmplY3QzRCgpO1xuXG4gICAgcHJpdmF0ZSBkZWZhdWx0VXAgPSBuZXcgVmVjdG9yMygwLCAwLCAwKTtcbiAgICBwcml2YXRlIHR1cm5SYXRlID0gMiAqIE1hdGguUEk7IC8vIHR1cm4gcmF0ZSBpbiBhbmdsZXMgcGVyIHNlY1xuICAgIHByaXZhdGUgbWF0cml4ID0gbmV3IE1hdHJpeDQoKTtcblxuICAgIEBJbnB1dCgpIHNldCBhbGlnbm1lbnQoXG4gICAgICAgIGFsaWdubWVudDpcbiAgICAgICAgICAgIHwgJ3RvcC1sZWZ0J1xuICAgICAgICAgICAgfCAndG9wLXJpZ2h0J1xuICAgICAgICAgICAgfCAnYm90dG9tLXJpZ2h0J1xuICAgICAgICAgICAgfCAnYm90dG9tLWxlZnQnXG4gICAgICAgICAgICB8ICdib3R0b20tY2VudGVyJ1xuICAgICAgICAgICAgfCAnY2VudGVyLXJpZ2h0J1xuICAgICAgICAgICAgfCAnY2VudGVyLWxlZnQnXG4gICAgICAgICAgICB8ICdjZW50ZXItY2VudGVyJ1xuICAgICAgICAgICAgfCAndG9wLWNlbnRlcidcbiAgICApIHtcbiAgICAgICAgdGhpcy5zZXQoeyBhbGlnbm1lbnQgfSk7XG4gICAgfVxuXG4gICAgQElucHV0KCkgc2V0IG1hcmdpbihtYXJnaW46IFtudW1iZXIsIG51bWJlcl0pIHtcbiAgICAgICAgdGhpcy5zZXQoeyBtYXJnaW4gfSk7XG4gICAgfVxuXG4gICAgQElucHV0KCkgc2V0IHJlbmRlclByaW9yaXR5KHJlbmRlclByaW9yaXR5OiBudW1iZXIpIHtcbiAgICAgICAgdGhpcy5zZXQoeyByZW5kZXJQcmlvcml0eSB9KTtcbiAgICB9XG5cbiAgICBASW5wdXQoKSBzZXQgYXV0b0NsZWFyKGF1dG9DbGVhcjogYm9vbGVhbikge1xuICAgICAgICB0aGlzLnNldCh7IGF1dG9DbGVhciB9KTtcbiAgICB9XG5cbiAgICBAT3V0cHV0KCkgdXBkYXRlZCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcblxuICAgIEBDb250ZW50Q2hpbGQoTmd0c0dpem1vSGVscGVyQ29udGVudCwgeyBzdGF0aWM6IHRydWUsIHJlYWQ6IFRlbXBsYXRlUmVmIH0pXG4gICAgZ2l6bW9IZWxwZXJDb250ZW50ITogVGVtcGxhdGVSZWY8dW5rbm93bj47XG5cbiAgICBvdmVycmlkZSBpbml0aWFsaXplKCk6IHZvaWQge1xuICAgICAgICBzdXBlci5pbml0aWFsaXplKCk7XG4gICAgICAgIHRoaXMuc2V0KHsgYWxpZ25tZW50OiAnYm90dG9tLXJpZ2h0JywgbWFyZ2luOiBbODAsIDgwXSwgcmVuZGVyUHJpb3JpdHk6IDEgfSk7XG4gICAgfVxuXG4gICAgbmdPbkluaXQoKSB7XG4gICAgICAgIHRoaXMudXBkYXRlRGVmYXVsdFVwKCk7XG4gICAgICAgIHRoaXMuc2V0R2l6bW9Qb3NpdGlvbigpO1xuICAgIH1cblxuICAgIG9uQmVmb3JlUmVuZGVyKGRlbHRhOiBudW1iZXIpIHtcbiAgICAgICAgaWYgKHRoaXMudmlydHVhbENhbWVyYVJlZi5uYXRpdmVFbGVtZW50ICYmIHRoaXMuZ2l6bW9SZWYubmF0aXZlRWxlbWVudCkge1xuICAgICAgICAgICAgY29uc3QgeyBjb250cm9scywgY2FtZXJhOiBtYWluQ2FtZXJhLCBpbnZhbGlkYXRlIH0gPSB0aGlzLnN0b3JlLmdldCgpO1xuICAgICAgICAgICAgY29uc3QgZGVmYXVsdENvbnRyb2xzID0gY29udHJvbHMgYXMgdW5rbm93biBhcyBDb250cm9sc1Byb3RvO1xuICAgICAgICAgICAgLy8gQW5pbWF0ZSBzdGVwXG4gICAgICAgICAgICBpZiAodGhpcy5hbmltYXRpbmcpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5xMS5hbmdsZVRvKHRoaXMucTIpIDwgMC4wMSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmFuaW1hdGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAvLyBPcmJpdCBjb250cm9scyB1c2VzIFVQIHZlY3RvciBhcyB0aGUgb3JiaXQgYXhlcyxcbiAgICAgICAgICAgICAgICAgICAgLy8gc28gd2UgbmVlZCB0byByZXNldCBpdCBhZnRlciB0aGUgYW5pbWF0aW9uIGlzIGRvbmVcbiAgICAgICAgICAgICAgICAgICAgLy8gbW92aW5nIGl0IGFyb3VuZCBmb3IgdGhlIGNvbnRyb2xzIHRvIHdvcmsgY29ycmVjdGx5XG4gICAgICAgICAgICAgICAgICAgIGlmIChpc09yYml0Q29udHJvbHMoZGVmYXVsdENvbnRyb2xzKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbWFpbkNhbWVyYS51cC5jb3B5KHRoaXMuZGVmYXVsdFVwKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZXAgPSBkZWx0YSAqIHRoaXMudHVyblJhdGU7XG4gICAgICAgICAgICAgICAgICAgIC8vIGFuaW1hdGUgcG9zaXRpb24gYnkgZG9pbmcgYSBzbGVycCBhbmQgdGhlbiBzY2FsaW5nIHRoZSBwb3NpdGlvbiBvbiB0aGUgdW5pdCBzcGhlcmVcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5xMS5yb3RhdGVUb3dhcmRzKHRoaXMucTIsIHN0ZXApO1xuICAgICAgICAgICAgICAgICAgICAvLyBhbmltYXRlIG9yaWVudGF0aW9uXG4gICAgICAgICAgICAgICAgICAgIG1haW5DYW1lcmEucG9zaXRpb25cbiAgICAgICAgICAgICAgICAgICAgICAgIC5zZXQoMCwgMCwgMSlcbiAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBseVF1YXRlcm5pb24odGhpcy5xMSlcbiAgICAgICAgICAgICAgICAgICAgICAgIC5tdWx0aXBseVNjYWxhcih0aGlzLnJhZGl1cylcbiAgICAgICAgICAgICAgICAgICAgICAgIC5hZGQodGhpcy5mb2N1c1BvaW50KTtcbiAgICAgICAgICAgICAgICAgICAgbWFpbkNhbWVyYS51cC5zZXQoMCwgMSwgMCkuYXBwbHlRdWF0ZXJuaW9uKHRoaXMucTEpLm5vcm1hbGl6ZSgpO1xuICAgICAgICAgICAgICAgICAgICBtYWluQ2FtZXJhLnF1YXRlcm5pb24uY29weSh0aGlzLnExKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMudXBkYXRlZC5vYnNlcnZlZCkgdGhpcy51cGRhdGVkLmVtaXQoKTtcbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoZGVmYXVsdENvbnRyb2xzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0Q29udHJvbHMudXBkYXRlKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaW52YWxpZGF0ZSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gU3luYyBHaXptbyB3aXRoIG1haW4gY2FtZXJhIG9yaWVudGF0aW9uXG4gICAgICAgICAgICB0aGlzLm1hdHJpeC5jb3B5KG1haW5DYW1lcmEubWF0cml4KS5pbnZlcnQoKTtcbiAgICAgICAgICAgIHRoaXMuZ2l6bW9SZWYubmF0aXZlRWxlbWVudC5xdWF0ZXJuaW9uLnNldEZyb21Sb3RhdGlvbk1hdHJpeCh0aGlzLm1hdHJpeCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHNldEdpem1vUG9zaXRpb24oKSB7XG4gICAgICAgIHRoaXMuY29ubmVjdChcbiAgICAgICAgICAgICdnaXptb1Bvc2l0aW9uJyxcbiAgICAgICAgICAgIGNvbWJpbmVMYXRlc3QoW3RoaXMuc3RvcmUuc2VsZWN0KCdzaXplJyksIHRoaXMuc2VsZWN0KHNlbGVjdFNsaWNlKFsnYWxpZ25tZW50JywgJ21hcmdpbiddKSldKS5waXBlKFxuICAgICAgICAgICAgICAgIG1hcCgoW3NpemUsIHsgYWxpZ25tZW50LCBtYXJnaW4gfV0pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgW21hcmdpblgsIG1hcmdpblldID0gbWFyZ2luO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB4ID0gYWxpZ25tZW50LmVuZHNXaXRoKCctY2VudGVyJylcbiAgICAgICAgICAgICAgICAgICAgICAgID8gMFxuICAgICAgICAgICAgICAgICAgICAgICAgOiBhbGlnbm1lbnQuZW5kc1dpdGgoJy1sZWZ0JylcbiAgICAgICAgICAgICAgICAgICAgICAgID8gLXNpemUud2lkdGggLyAyICsgbWFyZ2luWFxuICAgICAgICAgICAgICAgICAgICAgICAgOiBzaXplLndpZHRoIC8gMiAtIG1hcmdpblg7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHkgPSBhbGlnbm1lbnQuc3RhcnRzV2l0aCgnY2VudGVyLScpXG4gICAgICAgICAgICAgICAgICAgICAgICA/IDBcbiAgICAgICAgICAgICAgICAgICAgICAgIDogYWxpZ25tZW50LnN0YXJ0c1dpdGgoJ3RvcC0nKVxuICAgICAgICAgICAgICAgICAgICAgICAgPyBzaXplLmhlaWdodCAvIDIgLSBtYXJnaW5ZXG4gICAgICAgICAgICAgICAgICAgICAgICA6IC1zaXplLmhlaWdodCAvIDIgKyBtYXJnaW5ZO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gW3gsIHksIDBdO1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB1cGRhdGVEZWZhdWx0VXAoKSB7XG4gICAgICAgIHRoaXMuaG9sZCh0aGlzLnN0b3JlLnNlbGVjdCgnY2FtZXJhJyksIChjYW1lcmEpID0+IHtcbiAgICAgICAgICAgIHRoaXMuZGVmYXVsdFVwLmNvcHkoY2FtZXJhLnVwKTtcbiAgICAgICAgfSk7XG4gICAgfVxufVxuIl19
@@ -0,0 +1,31 @@
1
+ import * as THREE from 'three';
2
+ export const colors = { bg: '#f0f0f0', hover: '#999', text: 'black', stroke: 'black' };
3
+ export const defaultFaces = ['Right', 'Left', 'Top', 'Bottom', 'Front', 'Back'];
4
+ const makePositionVector = (xyz) => new THREE.Vector3(...xyz).multiplyScalar(0.38);
5
+ export const corners = [
6
+ [1, 1, 1],
7
+ [1, 1, -1],
8
+ [1, -1, 1],
9
+ [1, -1, -1],
10
+ [-1, 1, 1],
11
+ [-1, 1, -1],
12
+ [-1, -1, 1],
13
+ [-1, -1, -1],
14
+ ].map(makePositionVector);
15
+ export const cornerDimensions = [0.25, 0.25, 0.25];
16
+ export const edges = [
17
+ [1, 1, 0],
18
+ [1, 0, 1],
19
+ [1, 0, -1],
20
+ [1, -1, 0],
21
+ [0, 1, 1],
22
+ [0, 1, -1],
23
+ [0, -1, 1],
24
+ [0, -1, -1],
25
+ [-1, 1, 0],
26
+ [-1, 0, 1],
27
+ [-1, 0, -1],
28
+ [-1, -1, 0],
29
+ ].map(makePositionVector);
30
+ export const edgeDimensions = edges.map((edge) => edge.toArray().map((axis) => (axis == 0 ? 0.5 : 0.25)));
31
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uc3RhbnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9hbmd1bGFyLXRocmVlLXNvYmEvYWJzdHJhY3Rpb25zL3NyYy9saWIvZ2l6bW8taGVscGVyL2dpem1vLXZpZXdjdWJlL2NvbnN0YW50cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssS0FBSyxNQUFNLE9BQU8sQ0FBQztBQUUvQixNQUFNLENBQUMsTUFBTSxNQUFNLEdBQUcsRUFBRSxFQUFFLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLENBQUM7QUFDdkYsTUFBTSxDQUFDLE1BQU0sWUFBWSxHQUFHLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxNQUFNLENBQUMsQ0FBQztBQUNoRixNQUFNLGtCQUFrQixHQUFHLENBQUMsR0FBYSxFQUFFLEVBQUUsQ0FBQyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUM7QUFFN0YsTUFBTSxDQUFDLE1BQU0sT0FBTyxHQUFvQjtJQUNwQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ1QsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ1YsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ1YsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDWCxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDVixDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUNYLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ1gsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztDQUNmLENBQUMsR0FBRyxDQUFDLGtCQUFrQixDQUFDLENBQUM7QUFFMUIsTUFBTSxDQUFDLE1BQU0sZ0JBQWdCLEdBQUcsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBNkIsQ0FBQztBQUUvRSxNQUFNLENBQUMsTUFBTSxLQUFLLEdBQW9CO0lBQ2xDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDVCxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ1QsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ1YsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ1YsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUNULENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUNWLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUNWLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ1gsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ1YsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ1YsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDWCxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztDQUNkLENBQUMsR0FBRyxDQUFDLGtCQUFrQixDQUFDLENBQUM7QUFFMUIsTUFBTSxDQUFDLE1BQU0sY0FBYyxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQ25DLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBWSxFQUFVLEVBQUUsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQTZCLENBQy9HLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBUSFJFRSBmcm9tICd0aHJlZSc7XG5cbmV4cG9ydCBjb25zdCBjb2xvcnMgPSB7IGJnOiAnI2YwZjBmMCcsIGhvdmVyOiAnIzk5OScsIHRleHQ6ICdibGFjaycsIHN0cm9rZTogJ2JsYWNrJyB9O1xuZXhwb3J0IGNvbnN0IGRlZmF1bHRGYWNlcyA9IFsnUmlnaHQnLCAnTGVmdCcsICdUb3AnLCAnQm90dG9tJywgJ0Zyb250JywgJ0JhY2snXTtcbmNvbnN0IG1ha2VQb3NpdGlvblZlY3RvciA9ICh4eXo6IG51bWJlcltdKSA9PiBuZXcgVEhSRUUuVmVjdG9yMyguLi54eXopLm11bHRpcGx5U2NhbGFyKDAuMzgpO1xuXG5leHBvcnQgY29uc3QgY29ybmVyczogVEhSRUUuVmVjdG9yM1tdID0gW1xuICAgIFsxLCAxLCAxXSxcbiAgICBbMSwgMSwgLTFdLFxuICAgIFsxLCAtMSwgMV0sXG4gICAgWzEsIC0xLCAtMV0sXG4gICAgWy0xLCAxLCAxXSxcbiAgICBbLTEsIDEsIC0xXSxcbiAgICBbLTEsIC0xLCAxXSxcbiAgICBbLTEsIC0xLCAtMV0sXG5dLm1hcChtYWtlUG9zaXRpb25WZWN0b3IpO1xuXG5leHBvcnQgY29uc3QgY29ybmVyRGltZW5zaW9ucyA9IFswLjI1LCAwLjI1LCAwLjI1XSBhcyBbbnVtYmVyLCBudW1iZXIsIG51bWJlcl07XG5cbmV4cG9ydCBjb25zdCBlZGdlczogVEhSRUUuVmVjdG9yM1tdID0gW1xuICAgIFsxLCAxLCAwXSxcbiAgICBbMSwgMCwgMV0sXG4gICAgWzEsIDAsIC0xXSxcbiAgICBbMSwgLTEsIDBdLFxuICAgIFswLCAxLCAxXSxcbiAgICBbMCwgMSwgLTFdLFxuICAgIFswLCAtMSwgMV0sXG4gICAgWzAsIC0xLCAtMV0sXG4gICAgWy0xLCAxLCAwXSxcbiAgICBbLTEsIDAsIDFdLFxuICAgIFstMSwgMCwgLTFdLFxuICAgIFstMSwgLTEsIDBdLFxuXS5tYXAobWFrZVBvc2l0aW9uVmVjdG9yKTtcblxuZXhwb3J0IGNvbnN0IGVkZ2VEaW1lbnNpb25zID0gZWRnZXMubWFwKFxuICAgIChlZGdlKSA9PiBlZGdlLnRvQXJyYXkoKS5tYXAoKGF4aXM6IG51bWJlcik6IG51bWJlciA9PiAoYXhpcyA9PSAwID8gMC41IDogMC4yNSkpIGFzIFtudW1iZXIsIG51bWJlciwgbnVtYmVyXVxuKTtcbiJdfQ==
@@ -0,0 +1,91 @@
1
+ import { Component, CUSTOM_ELEMENTS_SCHEMA, inject, Input } from '@angular/core';
2
+ import { extend, NgtArgs } from 'angular-three';
3
+ import { BoxGeometry, Mesh, MeshBasicMaterial, Vector3 } from 'three';
4
+ import { NGTS_GIZMO_HELPER_API } from '../gizmo-helper';
5
+ import { colors } from './constants';
6
+ import { NgtsGizmoViewcubeInputs } from './gizmo-viewcube-inputs';
7
+ import * as i0 from "@angular/core";
8
+ extend({ Mesh, BoxGeometry, MeshBasicMaterial });
9
+ export class NgtsGizmoViewcubeEdgeCube extends NgtsGizmoViewcubeInputs {
10
+ constructor() {
11
+ super(...arguments);
12
+ this.gizmoHelperApi = inject(NGTS_GIZMO_HELPER_API);
13
+ this.hover = false;
14
+ }
15
+ set dimensions(dimensions) {
16
+ this.set({ dimensions });
17
+ }
18
+ set position(position) {
19
+ this.set({ position });
20
+ }
21
+ initialize() {
22
+ super.initialize();
23
+ this.set({ hoverColor: colors.hover });
24
+ }
25
+ onPointerMove(event) {
26
+ event.stopPropagation();
27
+ this.hover = true;
28
+ }
29
+ onPointerOut(event) {
30
+ event.stopPropagation();
31
+ this.hover = false;
32
+ }
33
+ onClick(event) {
34
+ if (this.get('clickEmitter')?.observed) {
35
+ this.get('clickEmitter').emit(event);
36
+ }
37
+ else {
38
+ event.stopPropagation();
39
+ this.gizmoHelperApi.tweenCamera(this.get('position'));
40
+ }
41
+ }
42
+ }
43
+ NgtsGizmoViewcubeEdgeCube.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.1.3", ngImport: i0, type: NgtsGizmoViewcubeEdgeCube, deps: null, target: i0.ɵɵFactoryTarget.Component });
44
+ NgtsGizmoViewcubeEdgeCube.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.1.3", type: NgtsGizmoViewcubeEdgeCube, isStandalone: true, selector: "ngts-gizmo-viewcube-edge-cube[dimensions][position]", inputs: { dimensions: "dimensions", position: "position" }, usesInheritance: true, ngImport: i0, template: `
45
+ <ngt-mesh
46
+ [scale]="1.01"
47
+ [position]="get('position')"
48
+ (pointermove)="onPointerMove($any($event))"
49
+ (pointerout)="onPointerOut($any($event))"
50
+ (click)="onClick($any($event))"
51
+ >
52
+ <ngt-box-geometry *args="get('dimensions')" />
53
+ <ngt-mesh-basic-material
54
+ [color]="hover ? get('hoverColor') : 'white'"
55
+ [transparent]="true"
56
+ [opacity]="0.6"
57
+ [visible]="hover"
58
+ />
59
+ </ngt-mesh>
60
+ `, isInline: true, dependencies: [{ kind: "directive", type: NgtArgs, selector: "[args]", inputs: ["args"] }] });
61
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.1.3", ngImport: i0, type: NgtsGizmoViewcubeEdgeCube, decorators: [{
62
+ type: Component,
63
+ args: [{
64
+ selector: 'ngts-gizmo-viewcube-edge-cube[dimensions][position]',
65
+ standalone: true,
66
+ template: `
67
+ <ngt-mesh
68
+ [scale]="1.01"
69
+ [position]="get('position')"
70
+ (pointermove)="onPointerMove($any($event))"
71
+ (pointerout)="onPointerOut($any($event))"
72
+ (click)="onClick($any($event))"
73
+ >
74
+ <ngt-box-geometry *args="get('dimensions')" />
75
+ <ngt-mesh-basic-material
76
+ [color]="hover ? get('hoverColor') : 'white'"
77
+ [transparent]="true"
78
+ [opacity]="0.6"
79
+ [visible]="hover"
80
+ />
81
+ </ngt-mesh>
82
+ `,
83
+ imports: [NgtArgs],
84
+ schemas: [CUSTOM_ELEMENTS_SCHEMA],
85
+ }]
86
+ }], propDecorators: { dimensions: [{
87
+ type: Input
88
+ }], position: [{
89
+ type: Input
90
+ }] } });
91
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2l6bW8tdmlld2N1YmUtZWRnZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvYW5ndWxhci10aHJlZS1zb2JhL2Fic3RyYWN0aW9ucy9zcmMvbGliL2dpem1vLWhlbHBlci9naXptby12aWV3Y3ViZS9naXptby12aWV3Y3ViZS1lZGdlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNqRixPQUFPLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBaUIsTUFBTSxlQUFlLENBQUM7QUFDL0QsT0FBTyxFQUFFLFdBQVcsRUFBRSxJQUFJLEVBQUUsaUJBQWlCLEVBQUUsT0FBTyxFQUFFLE1BQU0sT0FBTyxDQUFDO0FBQ3RFLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3hELE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDckMsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0seUJBQXlCLENBQUM7O0FBRWxFLE1BQU0sQ0FBQyxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsaUJBQWlCLEVBQUUsQ0FBQyxDQUFDO0FBeUJqRCxNQUFNLE9BQU8seUJBQTBCLFNBQVEsdUJBQXVCO0lBdkJ0RTs7UUF3QmEsbUJBQWMsR0FBRyxNQUFNLENBQUMscUJBQXFCLENBQUMsQ0FBQztRQUV4RCxVQUFLLEdBQUcsS0FBSyxDQUFDO0tBaUNqQjtJQS9CRyxJQUFhLFVBQVUsQ0FBQyxVQUFvQztRQUN4RCxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsVUFBVSxFQUFFLENBQUMsQ0FBQztJQUM3QixDQUFDO0lBRUQsSUFBYSxRQUFRLENBQUMsUUFBaUI7UUFDbkMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUM7SUFDM0IsQ0FBQztJQUVRLFVBQVU7UUFDZixLQUFLLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDbkIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLFVBQVUsRUFBRSxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztJQUMzQyxDQUFDO0lBRUQsYUFBYSxDQUFDLEtBQWtDO1FBQzVDLEtBQUssQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUN4QixJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQztJQUN0QixDQUFDO0lBRUQsWUFBWSxDQUFDLEtBQWtDO1FBQzNDLEtBQUssQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUN4QixJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztJQUN2QixDQUFDO0lBRUQsT0FBTyxDQUFDLEtBQWdDO1FBQ3BDLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUMsRUFBRSxRQUFRLEVBQUU7WUFDcEMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7U0FDeEM7YUFBTTtZQUNILEtBQUssQ0FBQyxlQUFlLEVBQUUsQ0FBQztZQUN4QixJQUFJLENBQUMsY0FBYyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7U0FDekQ7SUFDTCxDQUFDOztzSEFuQ1EseUJBQXlCOzBHQUF6Qix5QkFBeUIsa01BcEJ4Qjs7Ozs7Ozs7Ozs7Ozs7OztLQWdCVCw0REFDUyxPQUFPOzJGQUdSLHlCQUF5QjtrQkF2QnJDLFNBQVM7bUJBQUM7b0JBQ1AsUUFBUSxFQUFFLHFEQUFxRDtvQkFDL0QsVUFBVSxFQUFFLElBQUk7b0JBQ2hCLFFBQVEsRUFBRTs7Ozs7Ozs7Ozs7Ozs7OztLQWdCVDtvQkFDRCxPQUFPLEVBQUUsQ0FBQyxPQUFPLENBQUM7b0JBQ2xCLE9BQU8sRUFBRSxDQUFDLHNCQUFzQixDQUFDO2lCQUNwQzs4QkFNZ0IsVUFBVTtzQkFBdEIsS0FBSztnQkFJTyxRQUFRO3NCQUFwQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBDVVNUT01fRUxFTUVOVFNfU0NIRU1BLCBpbmplY3QsIElucHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBleHRlbmQsIE5ndEFyZ3MsIE5ndFRocmVlRXZlbnQgfSBmcm9tICdhbmd1bGFyLXRocmVlJztcbmltcG9ydCB7IEJveEdlb21ldHJ5LCBNZXNoLCBNZXNoQmFzaWNNYXRlcmlhbCwgVmVjdG9yMyB9IGZyb20gJ3RocmVlJztcbmltcG9ydCB7IE5HVFNfR0laTU9fSEVMUEVSX0FQSSB9IGZyb20gJy4uL2dpem1vLWhlbHBlcic7XG5pbXBvcnQgeyBjb2xvcnMgfSBmcm9tICcuL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBOZ3RzR2l6bW9WaWV3Y3ViZUlucHV0cyB9IGZyb20gJy4vZ2l6bW8tdmlld2N1YmUtaW5wdXRzJztcblxuZXh0ZW5kKHsgTWVzaCwgQm94R2VvbWV0cnksIE1lc2hCYXNpY01hdGVyaWFsIH0pO1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ25ndHMtZ2l6bW8tdmlld2N1YmUtZWRnZS1jdWJlW2RpbWVuc2lvbnNdW3Bvc2l0aW9uXScsXG4gICAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgICB0ZW1wbGF0ZTogYFxuICAgICAgICA8bmd0LW1lc2hcbiAgICAgICAgICAgIFtzY2FsZV09XCIxLjAxXCJcbiAgICAgICAgICAgIFtwb3NpdGlvbl09XCJnZXQoJ3Bvc2l0aW9uJylcIlxuICAgICAgICAgICAgKHBvaW50ZXJtb3ZlKT1cIm9uUG9pbnRlck1vdmUoJGFueSgkZXZlbnQpKVwiXG4gICAgICAgICAgICAocG9pbnRlcm91dCk9XCJvblBvaW50ZXJPdXQoJGFueSgkZXZlbnQpKVwiXG4gICAgICAgICAgICAoY2xpY2spPVwib25DbGljaygkYW55KCRldmVudCkpXCJcbiAgICAgICAgPlxuICAgICAgICAgICAgPG5ndC1ib3gtZ2VvbWV0cnkgKmFyZ3M9XCJnZXQoJ2RpbWVuc2lvbnMnKVwiIC8+XG4gICAgICAgICAgICA8bmd0LW1lc2gtYmFzaWMtbWF0ZXJpYWxcbiAgICAgICAgICAgICAgICBbY29sb3JdPVwiaG92ZXIgPyBnZXQoJ2hvdmVyQ29sb3InKSA6ICd3aGl0ZSdcIlxuICAgICAgICAgICAgICAgIFt0cmFuc3BhcmVudF09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICBbb3BhY2l0eV09XCIwLjZcIlxuICAgICAgICAgICAgICAgIFt2aXNpYmxlXT1cImhvdmVyXCJcbiAgICAgICAgICAgIC8+XG4gICAgICAgIDwvbmd0LW1lc2g+XG4gICAgYCxcbiAgICBpbXBvcnRzOiBbTmd0QXJnc10sXG4gICAgc2NoZW1hczogW0NVU1RPTV9FTEVNRU5UU19TQ0hFTUFdLFxufSlcbmV4cG9ydCBjbGFzcyBOZ3RzR2l6bW9WaWV3Y3ViZUVkZ2VDdWJlIGV4dGVuZHMgTmd0c0dpem1vVmlld2N1YmVJbnB1dHMge1xuICAgIHJlYWRvbmx5IGdpem1vSGVscGVyQXBpID0gaW5qZWN0KE5HVFNfR0laTU9fSEVMUEVSX0FQSSk7XG5cbiAgICBob3ZlciA9IGZhbHNlO1xuXG4gICAgQElucHV0KCkgc2V0IGRpbWVuc2lvbnMoZGltZW5zaW9uczogW251bWJlciwgbnVtYmVyLCBudW1iZXJdKSB7XG4gICAgICAgIHRoaXMuc2V0KHsgZGltZW5zaW9ucyB9KTtcbiAgICB9XG5cbiAgICBASW5wdXQoKSBzZXQgcG9zaXRpb24ocG9zaXRpb246IFZlY3RvcjMpIHtcbiAgICAgICAgdGhpcy5zZXQoeyBwb3NpdGlvbiB9KTtcbiAgICB9XG5cbiAgICBvdmVycmlkZSBpbml0aWFsaXplKCk6IHZvaWQge1xuICAgICAgICBzdXBlci5pbml0aWFsaXplKCk7XG4gICAgICAgIHRoaXMuc2V0KHsgaG92ZXJDb2xvcjogY29sb3JzLmhvdmVyIH0pO1xuICAgIH1cblxuICAgIG9uUG9pbnRlck1vdmUoZXZlbnQ6IE5ndFRocmVlRXZlbnQ8UG9pbnRlckV2ZW50Pikge1xuICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgdGhpcy5ob3ZlciA9IHRydWU7XG4gICAgfVxuXG4gICAgb25Qb2ludGVyT3V0KGV2ZW50OiBOZ3RUaHJlZUV2ZW50PFBvaW50ZXJFdmVudD4pIHtcbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIHRoaXMuaG92ZXIgPSBmYWxzZTtcbiAgICB9XG5cbiAgICBvbkNsaWNrKGV2ZW50OiBOZ3RUaHJlZUV2ZW50PE1vdXNlRXZlbnQ+KSB7XG4gICAgICAgIGlmICh0aGlzLmdldCgnY2xpY2tFbWl0dGVyJyk/Lm9ic2VydmVkKSB7XG4gICAgICAgICAgICB0aGlzLmdldCgnY2xpY2tFbWl0dGVyJykuZW1pdChldmVudCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICAgIHRoaXMuZ2l6bW9IZWxwZXJBcGkudHdlZW5DYW1lcmEodGhpcy5nZXQoJ3Bvc2l0aW9uJykpO1xuICAgICAgICB9XG4gICAgfVxufVxuIl19