abstract-3d 4.1.4 → 4.1.6

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 (68) hide show
  1. package/lib/renderers/dxf/color.d.ts +7 -0
  2. package/lib/renderers/dxf/color.d.ts.map +1 -0
  3. package/lib/renderers/dxf/color.js +311 -0
  4. package/lib/renderers/dxf/color.js.map +1 -0
  5. package/lib/renderers/dxf/dxf-encoding.d.ts +17 -0
  6. package/lib/renderers/dxf/dxf-encoding.d.ts.map +1 -0
  7. package/lib/renderers/dxf/dxf-encoding.js +18467 -0
  8. package/lib/renderers/dxf/dxf-encoding.js.map +1 -0
  9. package/lib/renderers/react/react-camera.d.ts +71 -0
  10. package/lib/renderers/react/react-camera.d.ts.map +1 -0
  11. package/lib/renderers/react/react-camera.js +179 -0
  12. package/lib/renderers/react/react-camera.js.map +1 -0
  13. package/lib/renderers/react/react-dimension.d.ts +16 -0
  14. package/lib/renderers/react/react-dimension.d.ts.map +1 -0
  15. package/lib/renderers/react/react-dimension.js +29 -0
  16. package/lib/renderers/react/react-dimension.js.map +1 -0
  17. package/lib/renderers/react/react-group.d.ts +23 -0
  18. package/lib/renderers/react/react-group.d.ts.map +1 -0
  19. package/lib/renderers/react/react-group.js +68 -0
  20. package/lib/renderers/react/react-group.js.map +1 -0
  21. package/lib/renderers/react/react-hotspot.d.ts +27 -0
  22. package/lib/renderers/react/react-hotspot.d.ts.map +1 -0
  23. package/lib/renderers/react/react-hotspot.js +37 -0
  24. package/lib/renderers/react/react-hotspot.js.map +1 -0
  25. package/lib/renderers/react/react-image-material.d.ts +28 -0
  26. package/lib/renderers/react/react-image-material.d.ts.map +1 -0
  27. package/lib/renderers/react/react-image-material.js +81 -0
  28. package/lib/renderers/react/react-image-material.js.map +1 -0
  29. package/lib/renderers/react/react-material.d.ts +19 -0
  30. package/lib/renderers/react/react-material.d.ts.map +1 -0
  31. package/lib/renderers/react/react-material.js +50 -0
  32. package/lib/renderers/react/react-material.js.map +1 -0
  33. package/lib/renderers/react/react-mesh.d.ts +11 -0
  34. package/lib/renderers/react/react-mesh.d.ts.map +1 -0
  35. package/lib/renderers/react/react-mesh.js +229 -0
  36. package/lib/renderers/react/react-mesh.js.map +1 -0
  37. package/lib/renderers/react/react-scene.d.ts +28 -0
  38. package/lib/renderers/react/react-scene.d.ts.map +1 -0
  39. package/lib/renderers/react/react-scene.js +20 -0
  40. package/lib/renderers/react/react-scene.js.map +1 -0
  41. package/lib/renderers/react/react-types.d.ts +7 -0
  42. package/lib/renderers/react/react-types.d.ts.map +1 -0
  43. package/lib/renderers/react/react-types.js +3 -0
  44. package/lib/renderers/react/react-types.js.map +1 -0
  45. package/lib/renderers/shared.d.ts +30 -0
  46. package/lib/renderers/shared.d.ts.map +1 -0
  47. package/lib/renderers/shared.js +164 -0
  48. package/lib/renderers/shared.js.map +1 -0
  49. package/lib/renderers/three/camera/camera.d.ts +3 -2
  50. package/lib/renderers/three/camera/camera.d.ts.map +1 -1
  51. package/lib/renderers/three/camera/camera.js +12 -0
  52. package/lib/renderers/three/camera/camera.js.map +1 -1
  53. package/lib/renderers/three/camera/gizmo.d.ts +6 -1
  54. package/lib/renderers/three/camera/gizmo.d.ts.map +1 -1
  55. package/lib/renderers/three/camera/gizmo.js +60 -2
  56. package/lib/renderers/three/camera/gizmo.js.map +1 -1
  57. package/lib/renderers/three/viewer/viewer.d.ts +14 -1
  58. package/lib/renderers/three/viewer/viewer.d.ts.map +1 -1
  59. package/lib/renderers/three/viewer/viewer.js +102 -26
  60. package/lib/renderers/three/viewer/viewer.js.map +1 -1
  61. package/package.json +1 -1
  62. package/src/renderers/three/camera/camera.ts +16 -3
  63. package/src/renderers/three/camera/gizmo.ts +67 -2
  64. package/src/renderers/three/viewer/viewer.ts +114 -26
  65. package/lib/renderers/svg/svg-order.d.ts +0 -9
  66. package/lib/renderers/svg/svg-order.d.ts.map +0 -1
  67. package/lib/renderers/svg/svg-order.js +0 -148
  68. package/lib/renderers/svg/svg-order.js.map +0 -1
@@ -0,0 +1,164 @@
1
+ /* eslint-disable @typescript-eslint/no-unused-expressions */
2
+ import { vec3Add, vec3, vec3Sub, vec3Scale, vec3Rot, bounds3FromVec3Array, bounds3ToSize, vec3Zero, } from "../abstract-3d.js";
3
+ export function sizeCenterForCameraPos(size, center, rotation, factor) {
4
+ const half = vec3Scale(size, 0.5);
5
+ const min = vec3Sub(center, half);
6
+ const max = vec3Add(center, half);
7
+ const v1 = vec3Rot(vec3(min.x, min.y, max.z), center, rotation);
8
+ const v2 = vec3Rot(vec3(max.x, min.y, max.z), center, rotation);
9
+ const v3 = vec3Rot(vec3(max.x, max.y, max.z), center, rotation);
10
+ const v4 = vec3Rot(vec3(min.x, max.y, max.z), center, rotation);
11
+ const v5 = vec3Rot(vec3(min.x, min.y, min.z), center, rotation);
12
+ const v6 = vec3Rot(vec3(max.x, min.y, min.z), center, rotation);
13
+ const v7 = vec3Rot(vec3(max.x, max.y, min.z), center, rotation);
14
+ const v8 = vec3Rot(vec3(min.x, max.y, min.z), center, rotation);
15
+ const bounds = bounds3FromVec3Array([v1, v2, v3, v4, v5, v6, v7, v8]);
16
+ return [vec3Scale(bounds3ToSize(bounds), factor), vec3Scale(center, factor)];
17
+ }
18
+ export function rotationForCameraPos(view) {
19
+ switch (view) {
20
+ default:
21
+ case "front":
22
+ return vec3Zero;
23
+ case "back":
24
+ return vec3(-Math.PI, 0, -Math.PI);
25
+ case "top":
26
+ return vec3(Math.PI / 2, 0, 0);
27
+ case "bottom":
28
+ return vec3(-Math.PI / 2, 0, 0);
29
+ case "right":
30
+ return vec3(0, -Math.PI / 2, 0);
31
+ case "left":
32
+ return vec3(0, Math.PI / 2, 0);
33
+ }
34
+ }
35
+ export function parseRgb(color) {
36
+ const parts = color.split("(")[1]?.slice(0, -1).split(",");
37
+ const rgb = { r: Number(parts?.[0] ?? 0), g: Number(parts?.[1] ?? 0), b: Number(parts?.[2] ?? 0) };
38
+ return rgb;
39
+ }
40
+ export function parseColorString(s) {
41
+ if (s.startsWith("#")) {
42
+ if (s.length === 9) {
43
+ return {
44
+ // a: parseInt(s.slice(1, 3), 16),
45
+ r: parseInt(s.slice(3, 5), 16),
46
+ g: parseInt(s.slice(5, 7), 16),
47
+ b: parseInt(s.slice(7, 9), 16),
48
+ };
49
+ }
50
+ return { r: parseInt(s.slice(1, 3), 16), g: parseInt(s.slice(3, 5), 16), b: parseInt(s.slice(5, 7), 16) };
51
+ }
52
+ if (s.startsWith("rgb")) {
53
+ const [r, g, b, _a] = s.split("(")[1]?.split(")")[0]?.split(",") ?? [];
54
+ return { r: Number(r ?? 0), g: Number(g ?? 0), b: Number(b ?? 0) };
55
+ }
56
+ if (s === "white") {
57
+ return white;
58
+ }
59
+ if (s === "black") {
60
+ return black;
61
+ }
62
+ return white;
63
+ }
64
+ const white = { r: 255, g: 255, b: 255 };
65
+ const black = { r: 0, g: 0, b: 0 };
66
+ export function rgbGrayScale(color) {
67
+ const parts = color.split("(")[1]?.slice(0, -1).split(",");
68
+ const c = Number(parts?.[0] ?? 416) * 0.3 + Number(parts?.[1] ?? 212) * 0.587 + Number(parts?.[2] ?? 1100) * 0.114;
69
+ return `rgb(${c},${c},${c})`;
70
+ }
71
+ /**
72
+ * This will take a HEX or RGB web color. pSBC can shade it darker or lighter,
73
+ * or blend it with a second color, and can also pass it right thru but convert
74
+ * from Hex to RGB (Hex2RGB) or RGB to Hex (RGB2Hex).
75
+ * All without you even knowing what color format you are using.
76
+ *
77
+ * @param {number} p - From 0 to 1 Percentage float (Required).
78
+ * @param {string} from - The starting color in HEX or RGB format.
79
+ * @param {string} [to] - The ending color in HEX or RGB format, optional.
80
+ * @returns {string|null} Either Hex or RGB color. Null if invalid color or percentage number.
81
+ */
82
+ export function shade(p, from, to) {
83
+ if (typeof p !== "number" ||
84
+ p < -1 ||
85
+ p > 1 ||
86
+ typeof from !== "string" ||
87
+ (from[0] !== "r" && from[0] !== "#") ||
88
+ (to && typeof to !== "string")) {
89
+ return undefined; // ErrorCheck
90
+ }
91
+ const sbcRip = (d) => {
92
+ const l = d.length;
93
+ const RGB = {};
94
+ if (l > 9) {
95
+ const dArr = d.split(",");
96
+ if (dArr.length < 3 || dArr.length > 4)
97
+ return null; // ErrorCheck
98
+ RGB[0] = i(dArr[0].split("(")[1]);
99
+ RGB[1] = i(dArr[1]);
100
+ RGB[2] = i(dArr[2]);
101
+ RGB[3] = dArr[3] ? parseFloat(dArr[3]) : -1;
102
+ }
103
+ else {
104
+ if (l === 8 || l === 6 || l < 4)
105
+ return null; // ErrorCheck
106
+ if (l < 6) {
107
+ d = "#" + d[1] + d[1] + d[2] + d[2] + d[3] + d[3] + (l > 4 ? String(d[4]) + d[4] : ""); // 3 or 4 digit
108
+ }
109
+ const dInt = i(d.slice(1), 16);
110
+ RGB[0] = (dInt >> 16) & 255;
111
+ RGB[1] = (dInt >> 8) & 255;
112
+ RGB[2] = dInt & 255;
113
+ RGB[3] = -1;
114
+ if (l === 9 || l === 5) {
115
+ RGB[3] = r((RGB[2] / 255) * 10000) / 10000;
116
+ RGB[2] = RGB[1];
117
+ RGB[1] = RGB[0];
118
+ RGB[0] = (dInt >> 24) & 255;
119
+ }
120
+ }
121
+ return RGB;
122
+ };
123
+ const i = parseInt;
124
+ const r = Math.round;
125
+ let h = from.length > 9;
126
+ h = typeof to === "string" ? (to.length > 9 ? true : to === "c" ? !h : false) : h;
127
+ const b = p < 0;
128
+ p = b ? p * -1 : p;
129
+ to = to && to !== "c" ? to : b ? "#000000" : "#FFFFFF";
130
+ const f = sbcRip(from);
131
+ const t = sbcRip(to);
132
+ if (!f || !t) {
133
+ return undefined; // ErrorCheck
134
+ }
135
+ if (h) {
136
+ return ("rgb" +
137
+ (f[3] > -1 || t[3] > -1 ? "a(" : "(") +
138
+ r((t[0] - f[0]) * p + f[0]) +
139
+ "," +
140
+ r((t[1] - f[1]) * p + f[1]) +
141
+ "," +
142
+ r((t[2] - f[2]) * p + f[2]) +
143
+ (f[3] < 0 && t[3] < 0
144
+ ? ")"
145
+ : "," +
146
+ (f[3] > -1 && t[3] > -1 ? r(((t[3] - f[3]) * p + f[3]) * 10000) / 10000 : t[3] < 0 ? f[3] : t[3]) +
147
+ ")"));
148
+ }
149
+ return ("#" +
150
+ (0x100000000 +
151
+ r((t[0] - f[0]) * p + f[0]) * 0x1000000 +
152
+ r((t[1] - f[1]) * p + f[1]) * 0x10000 +
153
+ r((t[2] - f[2]) * p + f[2]) * 0x100 +
154
+ (f[3] > -1 && t[3] > -1
155
+ ? r(((t[3] - f[3]) * p + f[3]) * 255)
156
+ : t[3] > -1
157
+ ? r(t[3] * 255)
158
+ : f[3] > -1
159
+ ? r(f[3] * 255)
160
+ : 255))
161
+ .toString(16)
162
+ .slice(1, f[3] > -1 || t[3] > -1 ? undefined : -2));
163
+ }
164
+ //# sourceMappingURL=shared.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shared.js","sourceRoot":"","sources":["../../src/renderers/shared.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import type { OrthographicCamera, PerspectiveCamera } from "three";
1
+ import type { OrthographicCamera, PerspectiveCamera, Quaternion } from "three";
2
2
  import type { Vec3, View } from "../../../abstract-3d.js";
3
3
  /** Fitting the camera to the scene, inside buffer zones of the canvas that UI covers; the fit math of the r3f renderer's react-camera.tsx */
4
4
  export type CameraOptions = {
@@ -19,7 +19,8 @@ export type BufferZones = {
19
19
  readonly bottom?: number;
20
20
  };
21
21
  export type FitInput = {
22
- readonly view: View;
22
+ /** A view, or the camera's orientation, e.g. one the gizmo turns it to */
23
+ readonly view: View | Quaternion;
23
24
  /** The scene's size */
24
25
  readonly size: Vec3;
25
26
  /** In CSS pixels */
@@ -1 +1 @@
1
- {"version":3,"file":"camera.d.ts","sourceRoot":"","sources":["../../../../src/renderers/three/camera/camera.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,OAAO,CAAC;AAEnE,OAAO,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,yBAAyB,CAAC;AAG1D,6IAA6I;AAE7I,MAAM,MAAM,aAAa,GACrB;IAAE,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC;IAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,GACtG;IAAE,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAC;IAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAErF,+EAA+E;AAC/E,MAAM,MAAM,WAAW,GAAG;IAAE,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAE/H,MAAM,MAAM,QAAQ,GAAG;IACrB,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC;IACpB,uBAAuB;IACvB,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC;IACpB,oBAAoB;IACpB,QAAQ,CAAC,MAAM,EAAE;QAAE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IACrE,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAC;IAClC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B,CAAC;AAEF,uGAAuG;AACvG,MAAM,MAAM,SAAS,GAAG;IAAE,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,SAAS,EAAE,IAAI,CAAA;CAAE,CAAC;AAEhF,sHAAsH;AACtH,wBAAgB,SAAS,CACvB,MAAM,EAAE,iBAAiB,GAAG,kBAAkB,EAC9C,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,UAAU,EAAE,EAAE,QAAQ,GACnE,SAAS,GAAG,SAAS,CAiCvB"}
1
+ {"version":3,"file":"camera.d.ts","sourceRoot":"","sources":["../../../../src/renderers/three/camera/camera.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;AAG/E,OAAO,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,yBAAyB,CAAC;AAG1D,6IAA6I;AAE7I,MAAM,MAAM,aAAa,GACrB;IAAE,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC;IAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,GACtG;IAAE,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAC;IAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAErF,+EAA+E;AAC/E,MAAM,MAAM,WAAW,GAAG;IAAE,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAE/H,MAAM,MAAM,QAAQ,GAAG;IACrB,0EAA0E;IAC1E,QAAQ,CAAC,IAAI,EAAE,IAAI,GAAG,UAAU,CAAC;IACjC,uBAAuB;IACvB,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC;IACpB,oBAAoB;IACpB,QAAQ,CAAC,MAAM,EAAE;QAAE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IACrE,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAC;IAClC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B,CAAC;AAEF,uGAAuG;AACvG,MAAM,MAAM,SAAS,GAAG;IAAE,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,SAAS,EAAE,IAAI,CAAA;CAAE,CAAC;AAEhF,sHAAsH;AACtH,wBAAgB,SAAS,CACvB,MAAM,EAAE,iBAAiB,GAAG,kBAAkB,EAC9C,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,UAAU,EAAE,EAAE,QAAQ,GACnE,SAAS,GAAG,SAAS,CAiCvB"}
@@ -1,3 +1,4 @@
1
+ import { Vector3 } from "three";
1
2
  import { exhaustiveCheck } from "ts-exhaustive-check";
2
3
  import { vec3 } from "../../../abstract-3d.js";
3
4
  /** Sets the camera's projection to fit the scene into the usable area of the canvas, and returns where to place it */
@@ -34,6 +35,17 @@ export function fitCamera(camera, { view, size: sceneSize, canvas, bufferZones,
34
35
  }
35
36
  /** The direction to look from, the scene's size as seen on screen and its aspect */
36
37
  function getViewTransform(view, size) {
38
+ if (typeof view !== "string") {
39
+ // The extent of the scene's box along the camera's right, up and backward axes, which for a view's orientation is the size below
40
+ const orientation = view;
41
+ const extent = (x, y, z) => {
42
+ const axis = new Vector3(x, y, z).applyQuaternion(orientation);
43
+ return Math.abs(axis.x) * size.x + Math.abs(axis.y) * size.y + Math.abs(axis.z) * size.z;
44
+ };
45
+ const back = new Vector3(0, 0, 1).applyQuaternion(orientation);
46
+ const [width, height] = [extent(1, 0, 0), extent(0, 1, 0)];
47
+ return [vec3(back.x, back.y, back.z), vec3(width, height, extent(0, 0, 1)), width / height];
48
+ }
37
49
  switch (view) {
38
50
  case "front":
39
51
  case "back":
@@ -1 +1 @@
1
- {"version":3,"file":"camera.js","sourceRoot":"","sources":["../../../../src/renderers/three/camera/camera.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"camera.js","sourceRoot":"","sources":["../../../../src/renderers/three/camera/camera.ts"],"names":[],"mappings":"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"}
@@ -40,5 +40,10 @@ export type ControlsHelper = ({
40
40
  readonly margin?: readonly [number, number];
41
41
  };
42
42
  };
43
- export declare function createGizmo(camera: PerspectiveCamera | OrthographicCamera, renderer: WebGLRenderer, container: HTMLElement, helper: ControlsHelper): ViewportGizmo;
43
+ export declare function createGizmo(camera: PerspectiveCamera | OrthographicCamera, renderer: WebGLRenderer, container: HTMLElement, helper: ControlsHelper, onHover: () => void): ViewportGizmo;
44
+ /**
45
+ * Its own dispose() frees only every other child, as it removes them while iterating over them, so it's left to detach it from the controls and DOM;
46
+ * the layer from createGizmo is removed with its listeners
47
+ */
48
+ export declare function disposeGizmo(gizmo: ViewportGizmo): void;
44
49
  //# sourceMappingURL=gizmo.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"gizmo.d.ts","sourceRoot":"","sources":["../../../../src/renderers/three/camera/gizmo.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAElF,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAErD;;;GAGG;AAEH,MAAM,MAAM,cAAc,GAAG,GAAG,KAAK,GAAG,QAAQ,GAAG,QAAQ,IAAI,MAAM,GAAG,QAAQ,GAAG,OAAO,EAAE,CAAC;AAE7F,MAAM,MAAM,eAAe,GAAG;IAC5B,iDAAiD;IACjD,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,oDAAoD;IACpD,QAAQ,CAAC,KAAK,CAAC,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;IACvC,mFAAmF;IACnF,QAAQ,CAAC,sBAAsB,CAAC,EAAE,OAAO,CAAC;CAC3C,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG;IACxB,QAAQ,CAAC,UAAU,CAAC,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IACxD,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IACpD,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,gBAAgB,CAAC,EAAE,OAAO,CAAC;IACpC,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,sBAAsB,CAAC,EAAE,OAAO,CAAC;CAC3C,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG,CACzB;IAAE,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,eAAe,CAAA;CAAE,GACvE;IAAE,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,WAAW,CAAA;CAAE,CACtE,GAAG;IACF,iFAAiF;IACjF,QAAQ,CAAC,KAAK,CAAC,EAAE;QAAE,QAAQ,CAAC,SAAS,CAAC,EAAE,cAAc,CAAC;QAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;KAAE,CAAC;CACvG,CAAC;AAKF,wBAAgB,WAAW,CACzB,MAAM,EAAE,iBAAiB,GAAG,kBAAkB,EAC9C,QAAQ,EAAE,aAAa,EACvB,SAAS,EAAE,WAAW,EACtB,MAAM,EAAE,cAAc,GACrB,aAAa,CAgBf"}
1
+ {"version":3,"file":"gizmo.d.ts","sourceRoot":"","sources":["../../../../src/renderers/three/camera/gizmo.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAGlF,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAErD;;;GAGG;AAEH,MAAM,MAAM,cAAc,GAAG,GAAG,KAAK,GAAG,QAAQ,GAAG,QAAQ,IAAI,MAAM,GAAG,QAAQ,GAAG,OAAO,EAAE,CAAC;AAE7F,MAAM,MAAM,eAAe,GAAG;IAC5B,iDAAiD;IACjD,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,oDAAoD;IACpD,QAAQ,CAAC,KAAK,CAAC,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;IACvC,mFAAmF;IACnF,QAAQ,CAAC,sBAAsB,CAAC,EAAE,OAAO,CAAC;CAC3C,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG;IACxB,QAAQ,CAAC,UAAU,CAAC,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IACxD,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IACpD,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,gBAAgB,CAAC,EAAE,OAAO,CAAC;IACpC,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,sBAAsB,CAAC,EAAE,OAAO,CAAC;CAC3C,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG,CACzB;IAAE,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,eAAe,CAAA;CAAE,GACvE;IAAE,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,WAAW,CAAA;CAAE,CACtE,GAAG;IACF,iFAAiF;IACjF,QAAQ,CAAC,KAAK,CAAC,EAAE;QAAE,QAAQ,CAAC,SAAS,CAAC,EAAE,cAAc,CAAC;QAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;KAAE,CAAC;CACvG,CAAC;AAKF,wBAAgB,WAAW,CACzB,MAAM,EAAE,iBAAiB,GAAG,kBAAkB,EAC9C,QAAQ,EAAE,aAAa,EACvB,SAAS,EAAE,WAAW,EACtB,MAAM,EAAE,cAAc,EACtB,OAAO,EAAE,MAAM,IAAI,GAClB,aAAa,CAwBf;AAoCD;;;GAGG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,aAAa,GAAG,IAAI,CAevD"}
@@ -1,23 +1,81 @@
1
+ import { BufferGeometry, Material, MathUtils, Mesh, MeshBasicMaterial, Spherical, Sprite, SpriteMaterial } from "three";
1
2
  import { ViewportGizmo } from "three-viewport-gizmo";
2
3
  const size = 110;
3
4
  const axes = ["x", "nx", "y", "ny", "z", "nz"];
4
- export function createGizmo(camera, renderer, container, helper) {
5
+ export function createGizmo(camera, renderer, container, helper, onHover) {
5
6
  const [mx, my] = helper.props?.margin ?? [80, 80];
6
7
  const options = helper.type === "Viewcube" ? helper.viewcubeProps : helper.viewportProps;
7
8
  // "600 24px Helvetica, Arial" is weight 600 of Helvetica, Arial
8
9
  const [, weight = 600, family = "Helvetica, Arial, sans-serif"] = /^(?:(\S+)\s+)?[\d.]+px\s+(.+)$/.exec(options?.font ?? "") ?? [];
10
+ // Hovering changes its look without a change event, as it's made for a render loop, so its pointer events are caught as they bubble through a
11
+ // parent of its own, which has no box, so it's placed in the container as before
12
+ const layer = Object.assign(document.createElement("div"), { style: "display: contents" });
13
+ ["pointermove", "pointerout"].forEach((type) => layer.addEventListener(type, onHover));
14
+ layer.addEventListener("pointerdown", (event) => dragGizmo(gizmo, event));
15
+ container.append(layer);
9
16
  const gizmo = new ViewportGizmo(camera, renderer, {
10
- container,
17
+ container: layer,
11
18
  size,
12
19
  placement: helper.props?.alignment ?? "bottom-right",
13
20
  offset: { left: mx - size / 2, right: mx - size / 2, top: my - size / 2, bottom: my - size / 2 },
14
21
  // A family without a generic fallback, e.g. a web font, would otherwise fall back to the browser's serif
15
22
  font: { family: `${family}, sans-serif`, weight },
23
+ // A click moves the camera at once, for the viewer to turn it there, eased and also fitting the scene
24
+ animated: false,
16
25
  ...(helper.type === "Viewcube" ? getViewcubeOptions(helper.viewcubeProps ?? {}) : getAxesOptions(helper.viewportProps ?? {})),
17
26
  });
18
27
  gizmo.enabled = !(helper.type === "Viewport" && helper.viewportProps?.disabled);
19
28
  return gizmo;
20
29
  }
30
+ /**
31
+ * Its own drag turns the camera only once the pointer moved 10 pixels away, by all of them at once, so a drag turns it here from the first pixel, the
32
+ * same way, from where it was pressed: the turn is half a revolution per gizmo width. As each move's listener here runs after its own, which it adds
33
+ * when pressed, its drag is overridden; a press that moves less than that is still its click. Its press disables the controls, and only a drag or a
34
+ * click on a side ends it, so a release that starts no turn ends it here, enabling them again
35
+ */
36
+ function dragGizmo(gizmo, press) {
37
+ if (gizmo.enabled && !gizmo.animating) {
38
+ const { camera, target } = gizmo;
39
+ const { theta, phi } = new Spherical().setFromVector3(camera.position.clone().sub(target));
40
+ const listeners = new AbortController();
41
+ const signal = { signal: listeners.signal };
42
+ document.addEventListener("pointermove", (event) => {
43
+ const [x, y] = [((event.clientX - press.clientX) / size) * Math.PI, ((event.clientY - press.clientY) / size) * Math.PI];
44
+ const turned = new Spherical(camera.position.distanceTo(target), MathUtils.clamp(phi - y, 1e-6, Math.PI - 1e-6), theta - x);
45
+ camera.position.setFromSpherical(turned).add(target);
46
+ camera.lookAt(target);
47
+ gizmo.cameraUpdate();
48
+ gizmo.dispatchEvent({ type: "change" });
49
+ }, signal);
50
+ const release = () => {
51
+ listeners.abort();
52
+ if (!gizmo.animating) {
53
+ gizmo.dispatchEvent({ type: "end" });
54
+ }
55
+ };
56
+ ["pointerup", "pointercancel"].forEach((type) => document.addEventListener(type, release, signal));
57
+ }
58
+ }
59
+ /**
60
+ * Its own dispose() frees only every other child, as it removes them while iterating over them, so it's left to detach it from the controls and DOM;
61
+ * the layer from createGizmo is removed with its listeners
62
+ */
63
+ export function disposeGizmo(gizmo) {
64
+ if (gizmo.options.container instanceof HTMLElement) {
65
+ gizmo.options.container.remove();
66
+ }
67
+ gizmo.children.forEach((child) => {
68
+ // Faces, corners, edges and background are meshes, the axes' ends sprites and their lines a Line2 mesh, each with one material
69
+ if ((child instanceof Mesh || child instanceof Sprite) && child.material instanceof Material && child.geometry instanceof BufferGeometry) {
70
+ if (child.material instanceof MeshBasicMaterial || child.material instanceof SpriteMaterial) {
71
+ child.material.map?.dispose();
72
+ }
73
+ child.material.dispose();
74
+ child.geometry.dispose();
75
+ }
76
+ });
77
+ gizmo.clear().dispose();
78
+ }
21
79
  function getViewcubeOptions(options) {
22
80
  const { opacity = 1, color = "#f4f5f7", hoverColor = "#cfe0ff", textColor = "#333", strokeColor = "#9aa0a6" } = options;
23
81
  const labels = options.faces ?? ["Right", "Left", "Top", "Bottom", "Front", "Back"];
@@ -1 +1 @@
1
- {"version":3,"file":"gizmo.js","sourceRoot":"","sources":["../../../../src/renderers/three/camera/gizmo.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"gizmo.js","sourceRoot":"","sources":["../../../../src/renderers/three/camera/gizmo.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { type BufferGeometry, Group, OrthographicCamera, PerspectiveCamera, Scene as ThreeScene, Vector3, WebGLRenderer, type WebGLRenderTarget } from "three";
1
+ import { type BufferGeometry, Group, OrthographicCamera, PerspectiveCamera, type Quaternion, Scene as ThreeScene, Vector3, WebGLRenderer, type WebGLRenderTarget } from "three";
2
2
  import type { ViewportGizmo } from "three-viewport-gizmo";
3
3
  import type { View } from "../../../abstract-3d.js";
4
4
  import type { StructureState } from "../appearance/appearance.js";
@@ -21,6 +21,13 @@ type Hit = {
21
21
  readonly target: number;
22
22
  readonly point: Vector3;
23
23
  };
24
+ /** Where the camera looks from: it looks at the target from the distance, turned by the quaternion */
25
+ type Pose = {
26
+ readonly quaternion: Quaternion;
27
+ readonly target: Vector3;
28
+ readonly distance: number;
29
+ readonly zoom: number;
30
+ };
24
31
  export type Viewer<Content> = {
25
32
  options: ViewerOptions<Content>;
26
33
  readonly container: HTMLElement;
@@ -79,6 +86,12 @@ export type Viewer<Content> = {
79
86
  shadow?: GroundShadow;
80
87
  };
81
88
  gizmo?: ViewportGizmo;
89
+ /** A gizmo click's turn of the camera, from when it was clicked; where it ends is known once the gizmo moved the camera there */
90
+ turn?: {
91
+ readonly from: Pose;
92
+ readonly to?: Pose;
93
+ readonly start: number;
94
+ };
82
95
  shadow?: GroundShadow;
83
96
  /** The key light that casts the solids' shadows on themselves */
84
97
  keyLight?: Group;
@@ -1 +1 @@
1
- {"version":3,"file":"viewer.d.ts","sourceRoot":"","sources":["../../../../src/renderers/three/viewer/viewer.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"viewer.d.ts","sourceRoot":"","sources":["../../../../src/renderers/three/viewer/viewer.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,cAAc,EAEnB,KAAK,EAGL,kBAAkB,EAClB,iBAAiB,EACjB,KAAK,UAAU,EAEf,KAAK,IAAI,UAAU,EAEnB,OAAO,EACP,aAAa,EACb,KAAK,iBAAiB,EACvB,MAAM,OAAO,CAAC;AACf,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,yBAAyB,CAAC;AACpD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAClE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAEpD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAI1D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAGtD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAE3D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAG1D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAExD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAElD,OAAO,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAE1D,OAAO,KAAK,EAAW,YAAY,EAAE,MAAM,eAAe,CAAC;AAG3D;;;;GAIG;AAEH,KAAK,GAAG,GAAG;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAA;CAAE,CAAC;AAEvF,sGAAsG;AACtG,KAAK,IAAI,GAAG;IAAE,QAAQ,CAAC,UAAU,EAAE,UAAU,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAE5H,MAAM,MAAM,MAAM,CAAC,OAAO,IAAI;IAC5B,OAAO,EAAE,aAAa,CAAC,OAAO,CAAC,CAAC;IAChC,QAAQ,CAAC,SAAS,EAAE,WAAW,CAAC;IAChC,QAAQ,CAAC,MAAM,EAAE,iBAAiB,CAAC;IACnC,QAAQ,CAAC,QAAQ,EAAE,aAAa,CAAC;IACjC,wDAAwD;IACxD,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC;IAC3B,QAAQ,CAAC,MAAM,EAAE,KAAK,CAAC;IACvB,QAAQ,CAAC,OAAO,EAAE;QAAE,QAAQ,CAAC,WAAW,EAAE,iBAAiB,CAAC;QAAC,QAAQ,CAAC,YAAY,EAAE,kBAAkB,CAAA;KAAE,CAAC;IACzG,MAAM,EAAE,iBAAiB,GAAG,kBAAkB,CAAC;IAC/C,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;IAC5B,QAAQ,CAAC,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IACjD,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC;IAC3B,QAAQ,CAAC,QAAQ,EAAE,YAAY,CAAC;IAChC,QAAQ,CAAC,QAAQ,EAAE,YAAY,CAAC,OAAO,CAAC,CAAC;IACzC,QAAQ,CAAC,IAAI,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IACjD,QAAQ,CAAC,SAAS,EAAE,eAAe,CAAC;IACpC,QAAQ,CAAC,cAAc,EAAE,cAAc,CAAC;IACxC,QAAQ,CAAC,OAAO,EAAE;QAAE,IAAI,CAAC,EAAE,YAAY,CAAC;QAAC,IAAI,CAAC,EAAE;YAAE,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC;YAAC,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC;QAAC,OAAO,CAAC,EAAE,GAAG,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IAC3H,QAAQ,CAAC,IAAI,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,OAAO,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IACpF,yEAAyE;IACzE,QAAQ,CAAC,OAAO,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAC9B,qHAAqH;IACrH,QAAQ,CAAC,KAAK,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IACxG,SAAS,EAAE,cAAc,CAAC;IAC1B,QAAQ,CAAC,EAAE,aAAa,CAAC;IACzB,KAAK,CAAC,EAAE,UAAU,CAAC;IACnB,2IAA2I;IAC3I,QAAQ,CAAC,OAAO,EAAE;QAAE,KAAK,CAAC,EAAE,UAAU,CAAC;QAAC,MAAM,CAAC,EAAE,YAAY,CAAA;KAAE,CAAC;IAChE,KAAK,CAAC,EAAE,aAAa,CAAC;IACtB,iIAAiI;IACjI,IAAI,CAAC,EAAE;QAAE,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC;QAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC;QAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IAC3E,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,iEAAiE;IACjE,QAAQ,CAAC,EAAE,KAAK,CAAC;IACjB,QAAQ,CAAC,EAAE,YAAY,CAAC;IACxB,sDAAsD;IACtD,QAAQ,CAAC,MAAM,EAAE;QAAE,OAAO,CAAC,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;QAAC,MAAM,CAAC,EAAE,iBAAiB,CAAA;KAAE,CAAC;IAC5E,kDAAkD;IAClD,MAAM,EAAE,OAAO,CAAC;IAChB,MAAM,EAAE,OAAO,CAAC;IAChB,QAAQ,EAAE,OAAO,CAAC;CACnB,CAAC;AAOF,wBAAgB,YAAY,CAAC,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,OAAO,EAAE,aAAa,CAAC,OAAO,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC,CA0D9G;AAED,8HAA8H;AAC9H,wBAAgB,YAAY,CAAC,OAAO,EAAE,CAAC,EAAE,MAAM,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,GAAG,IAAI,CAIxG;AAED,gGAAgG;AAChG,wBAAgB,UAAU,CAAC,OAAO,EAAE,CAAC,EAAE,MAAM,CAAC,OAAO,CAAC,GAAG,IAAI,CAI5D;AAED;;;GAGG;AACH,wBAAgB,OAAO,CAAC,OAAO,EAAE,CAAC,EAAE,MAAM,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,IAAI,GAAG,IAAI,CAKrE;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,CAAC,EAAE,MAAM,CAAC,OAAO,CAAC,GAAG,IAAI,CA4B/D"}
@@ -3,7 +3,7 @@ import { animateScene, buildScene, cullScene, disposeScene, getPickables, getPic
3
3
  import { disposeTextures } from "../build/materials.js";
4
4
  import { fitCamera } from "../camera/camera.js";
5
5
  import { configureControls, createControls, setPose } from "../camera/controls.js";
6
- import { createGizmo } from "../camera/gizmo.js";
6
+ import { createGizmo, disposeGizmo } from "../camera/gizmo.js";
7
7
  import { compileScene } from "../compile/compile.js";
8
8
  import { getPixelRatio, recordFrame } from "../quality/quality.js";
9
9
  import { createKeyLight, disposeKeyLight } from "../shadow/key-light.js";
@@ -13,6 +13,8 @@ import { effects } from "./options.js";
13
13
  import { createOverlayLayer, setOverlays } from "./overlays.js";
14
14
  /** Pointer travel in CSS pixels below which a press and release is a click, not a drag */
15
15
  const clickTolerance = 4;
16
+ /** How long a gizmo click's turn of the camera takes */
17
+ const turnMs = 400;
16
18
  export function createViewer(container, options) {
17
19
  if (getComputedStyle(container).position === "static") {
18
20
  container.style.position = "relative";
@@ -101,7 +103,9 @@ export function disposeViewer(v) {
101
103
  v.listeners.abort();
102
104
  v.resizeObserver.disconnect();
103
105
  v.controls.orbit.dispose();
104
- v.gizmo?.dispose();
106
+ if (v.gizmo) {
107
+ disposeGizmo(v.gizmo);
108
+ }
105
109
  disposeRetired(v);
106
110
  if (v.built) {
107
111
  disposeScene(v.built);
@@ -249,7 +253,12 @@ function renderFrame(v, now) {
249
253
  }
250
254
  const { built, camera, gizmo } = v;
251
255
  renderer.info.reset();
252
- const moving = v.controls.orbit.update(Math.min(interval / 1000, 0.1)) || !!gizmo?.animating;
256
+ if (v.turn?.to) {
257
+ turnCamera(v, v.turn.from, v.turn.to, (now - v.turn.start) / turnMs);
258
+ }
259
+ // Not during a turn, as the controls would look at the target with the world's up instead of the turn's roll, which spins the camera near the
260
+ // top and bottom views and snaps it at their end
261
+ const moving = !!v.turn || v.controls.orbit.update(Math.min(interval / 1000, 0.1));
253
262
  if (moving && loop.wasMoving && v.governor && recordFrame(v.governor, interval)) {
254
263
  renderer.setPixelRatio(getPixelRatio(v.governor.tier, window.devicePixelRatio));
255
264
  }
@@ -307,42 +316,109 @@ function fitPose(v) {
307
316
  v.fitted = true;
308
317
  }
309
318
  }
310
- function fitScene(v) {
311
- const { scene, view = "front", bufferZones = {}, fitPadding = 0 } = v.options;
319
+ function fitScene(v, view = v.options.view ?? "front") {
320
+ const { scene, bufferZones = {}, fitPadding = 0 } = v.options;
312
321
  return scene && fitCamera(v.camera, { view, size: scene.size_deprecated, canvas: v.size, bufferZones, fitPadding });
313
322
  }
314
- function updateGizmo(v) {
315
- v.gizmo?.dispose();
323
+ function updateGizmo(v, fontsLoaded = false) {
324
+ if (v.gizmo) {
325
+ disposeGizmo(v.gizmo);
326
+ }
327
+ // A click's turn that the old gizmo hadn't moved the camera to the end of would never end
328
+ if (v.turn && !v.turn.to) {
329
+ endTurn(v);
330
+ }
316
331
  const { gizmo } = v.options;
317
- v.gizmo = gizmo && createGizmo(v.camera, v.renderer, v.container, gizmo).attachControls(v.controls.orbit);
318
- v.gizmo?.addEventListener("change", () => invalidate(v));
332
+ v.gizmo = gizmo && createGizmo(v.camera, v.renderer, v.container, gizmo, () => invalidate(v)).attachControls(v.controls.orbit);
333
+ v.gizmo?.addEventListener("change", () => onGizmoChange(v));
319
334
  v.gizmo?.addEventListener("start", () => onGizmoStart(v));
320
- // Its labels are drawn once, so ones drawn before the page's web fonts loaded are redrawn when they have
335
+ v.gizmo?.addEventListener("end", () => onGizmoEnd(v));
336
+ // Its labels are drawn into its textures once, so ones drawn before their web font loaded are replaced by a new one once it has, unless replaced
337
+ // or disposed meanwhile; loading starts it if nothing has, and gives no faces for a system font or one that failed. Only once, so a font that
338
+ // never checks as loaded can't replace it again and again. Not by its set(options), which leaves it detached from the controls and keeps every
339
+ // other old label
321
340
  const created = v.gizmo;
322
- if (created && document.fonts.status !== "loaded") {
323
- document.fonts.ready.then(() => redrawGizmo(v, created)).catch(() => undefined);
341
+ const font = created && `${created.options.font?.weight ?? ""} 16px ${created.options.font?.family ?? "sans-serif"}`;
342
+ if (created && font && !fontsLoaded && !document.fonts.check(font)) {
343
+ document.fonts
344
+ .load(font)
345
+ .then((faces) => faces.length > 0 && v.gizmo === created && !v.disposed && replaceGizmo(v))
346
+ .catch(() => undefined);
324
347
  }
325
348
  }
326
- /** Unless the gizmo was replaced or the viewer disposed meanwhile */
327
- function redrawGizmo(v, gizmo) {
328
- if (v.gizmo === gizmo && !v.disposed) {
329
- gizmo.set(gizmo.options);
330
- invalidate(v);
349
+ function replaceGizmo(v) {
350
+ updateGizmo(v, true);
351
+ invalidate(v);
352
+ }
353
+ /** A click starts a turn, from where a turn going on has got to */
354
+ function onGizmoStart(v) {
355
+ if (v.gizmo?.animating) {
356
+ v.turn = { from: getPose(v), start: performance.now() };
331
357
  }
332
358
  }
359
+ /** Dragging the gizmo stops a turn going on; a click's changes come while it's animating, or before the turn knows where it ends */
360
+ function onGizmoChange(v) {
361
+ if (!v.gizmo?.animating && v.turn?.to) {
362
+ v.turn = undefined;
363
+ }
364
+ invalidate(v);
365
+ }
333
366
  /**
334
- * A click turns the camera, which can also move the target back to the scene's center and fit the scene. The gizmo turns around its target at the
335
- * distance it read when pressed, its internal `_distance`, so that's set to the fitted one
367
+ * The gizmo, not animated, moved the camera to the clicked view at once; it's moved back, to turn from there in the next frames, eased, and with the
368
+ * target and distance too, as a click can also move the target back to the scene's center and fit the scene to the view. An orthographic camera's
369
+ * zoom starts at the one that shows as much on the fitted projection as before
336
370
  */
337
- function onGizmoStart(v) {
338
- const { gizmo } = v.options;
339
- const reset = gizmo?.type === "Viewcube" ? gizmo.viewcubeProps?.resetZoomAndPanOnClick : gizmo?.viewportProps?.resetZoomAndPanOnClick;
340
- const placement = v.gizmo?.animating && reset ? fitScene(v) : undefined;
341
- if (placement) {
342
- v.controls.orbit.target.set(0, 0, 0);
343
- Object.assign(v.gizmo, { _distance: placement.distance });
371
+ function onGizmoEnd(v) {
372
+ const { turn, camera } = v;
373
+ if (turn && !turn.to) {
374
+ const { gizmo } = v.options;
375
+ const reset = gizmo?.type === "Viewcube" ? gizmo.viewcubeProps?.resetZoomAndPanOnClick : gizmo?.viewportProps?.resetZoomAndPanOnClick;
376
+ const quaternion = camera.quaternion.clone();
377
+ const height = () => ("isOrthographicCamera" in camera ? camera.top - camera.bottom : 1);
378
+ const before = height();
379
+ const placement = reset ? fitScene(v, quaternion) : undefined;
380
+ const from = { ...turn.from, zoom: (turn.from.zoom * height()) / before };
381
+ const to = placement ? { quaternion, target: new Vector3(), distance: placement.distance, zoom: 1 } : { ...turn.from, quaternion };
382
+ v.turn = { ...turn, from, to };
383
+ setCameraPose(v, from);
384
+ }
385
+ // Its end, also of a press during a turn, enabled the controls, which the turn enables when it ends
386
+ if (v.turn) {
387
+ v.controls.orbit.enabled = false;
388
+ }
389
+ }
390
+ function turnCamera(v, from, to, progress) {
391
+ const t = Math.min(1, progress);
392
+ const eased = t * t * (3 - 2 * t);
393
+ const lerp = (a, b) => a + (b - a) * eased;
394
+ setCameraPose(v, {
395
+ quaternion: from.quaternion.clone().slerp(to.quaternion, eased),
396
+ target: from.target.clone().lerp(to.target, eased),
397
+ distance: lerp(from.distance, to.distance),
398
+ zoom: lerp(from.zoom, to.zoom),
399
+ });
400
+ if (t === 1) {
401
+ endTurn(v);
344
402
  }
345
403
  }
404
+ /** The controls the click disabled are enabled again */
405
+ function endTurn(v) {
406
+ v.turn = undefined;
407
+ v.controls.orbit.enabled = v.controls.current.options.enabled ?? true;
408
+ }
409
+ function getPose({ camera, controls }) {
410
+ const target = controls.orbit.target.clone();
411
+ return { quaternion: camera.quaternion.clone(), target, distance: camera.position.distanceTo(target), zoom: camera.zoom };
412
+ }
413
+ function setCameraPose(v, { quaternion, target, distance, zoom }) {
414
+ const { camera } = v;
415
+ camera.quaternion.copy(quaternion);
416
+ camera.position.set(0, 0, distance).applyQuaternion(quaternion).add(target);
417
+ camera.zoom = zoom;
418
+ camera.updateProjectionMatrix();
419
+ v.controls.orbit.target.copy(target);
420
+ v.gizmo?.cameraUpdate();
421
+ }
346
422
  function onPointerMove(v, event) {
347
423
  v.pointer.last = event;
348
424
  v.pointer.frame ||= requestAnimationFrame(() => hoverAtPointer(v));