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.
- package/lib/renderers/dxf/color.d.ts +7 -0
- package/lib/renderers/dxf/color.d.ts.map +1 -0
- package/lib/renderers/dxf/color.js +311 -0
- package/lib/renderers/dxf/color.js.map +1 -0
- package/lib/renderers/dxf/dxf-encoding.d.ts +17 -0
- package/lib/renderers/dxf/dxf-encoding.d.ts.map +1 -0
- package/lib/renderers/dxf/dxf-encoding.js +18467 -0
- package/lib/renderers/dxf/dxf-encoding.js.map +1 -0
- package/lib/renderers/react/react-camera.d.ts +71 -0
- package/lib/renderers/react/react-camera.d.ts.map +1 -0
- package/lib/renderers/react/react-camera.js +179 -0
- package/lib/renderers/react/react-camera.js.map +1 -0
- package/lib/renderers/react/react-dimension.d.ts +16 -0
- package/lib/renderers/react/react-dimension.d.ts.map +1 -0
- package/lib/renderers/react/react-dimension.js +29 -0
- package/lib/renderers/react/react-dimension.js.map +1 -0
- package/lib/renderers/react/react-group.d.ts +23 -0
- package/lib/renderers/react/react-group.d.ts.map +1 -0
- package/lib/renderers/react/react-group.js +68 -0
- package/lib/renderers/react/react-group.js.map +1 -0
- package/lib/renderers/react/react-hotspot.d.ts +27 -0
- package/lib/renderers/react/react-hotspot.d.ts.map +1 -0
- package/lib/renderers/react/react-hotspot.js +37 -0
- package/lib/renderers/react/react-hotspot.js.map +1 -0
- package/lib/renderers/react/react-image-material.d.ts +28 -0
- package/lib/renderers/react/react-image-material.d.ts.map +1 -0
- package/lib/renderers/react/react-image-material.js +81 -0
- package/lib/renderers/react/react-image-material.js.map +1 -0
- package/lib/renderers/react/react-material.d.ts +19 -0
- package/lib/renderers/react/react-material.d.ts.map +1 -0
- package/lib/renderers/react/react-material.js +50 -0
- package/lib/renderers/react/react-material.js.map +1 -0
- package/lib/renderers/react/react-mesh.d.ts +11 -0
- package/lib/renderers/react/react-mesh.d.ts.map +1 -0
- package/lib/renderers/react/react-mesh.js +229 -0
- package/lib/renderers/react/react-mesh.js.map +1 -0
- package/lib/renderers/react/react-scene.d.ts +28 -0
- package/lib/renderers/react/react-scene.d.ts.map +1 -0
- package/lib/renderers/react/react-scene.js +20 -0
- package/lib/renderers/react/react-scene.js.map +1 -0
- package/lib/renderers/react/react-types.d.ts +7 -0
- package/lib/renderers/react/react-types.d.ts.map +1 -0
- package/lib/renderers/react/react-types.js +3 -0
- package/lib/renderers/react/react-types.js.map +1 -0
- package/lib/renderers/shared.d.ts +30 -0
- package/lib/renderers/shared.d.ts.map +1 -0
- package/lib/renderers/shared.js +164 -0
- package/lib/renderers/shared.js.map +1 -0
- package/lib/renderers/three/camera/camera.d.ts +3 -2
- package/lib/renderers/three/camera/camera.d.ts.map +1 -1
- package/lib/renderers/three/camera/camera.js +12 -0
- package/lib/renderers/three/camera/camera.js.map +1 -1
- package/lib/renderers/three/camera/gizmo.d.ts +6 -1
- package/lib/renderers/three/camera/gizmo.d.ts.map +1 -1
- package/lib/renderers/three/camera/gizmo.js +60 -2
- package/lib/renderers/three/camera/gizmo.js.map +1 -1
- package/lib/renderers/three/viewer/viewer.d.ts +14 -1
- package/lib/renderers/three/viewer/viewer.d.ts.map +1 -1
- package/lib/renderers/three/viewer/viewer.js +102 -26
- package/lib/renderers/three/viewer/viewer.js.map +1 -1
- package/package.json +1 -1
- package/src/renderers/three/camera/camera.ts +16 -3
- package/src/renderers/three/camera/gizmo.ts +67 -2
- package/src/renderers/three/viewer/viewer.ts +114 -26
- package/lib/renderers/svg/svg-order.d.ts +0 -9
- package/lib/renderers/svg/svg-order.d.ts.map +0 -1
- package/lib/renderers/svg/svg-order.js +0 -148
- 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
|
-
|
|
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;
|
|
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":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAEtD,OAAO,EAAE,IAAI,EAAE,MAAM,yBAAyB,CAAC;
|
|
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;
|
|
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":"
|
|
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":"AAAA,OAAO,EACL,KAAK,cAAc,EAEnB,KAAK,EAGL,kBAAkB,EAClB,iBAAiB,
|
|
1
|
+
{"version":3,"file":"viewer.d.ts","sourceRoot":"","sources":["../../../../src/renderers/three/viewer/viewer.ts"],"names":[],"mappings":"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"}
|
|
@@ -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
|
|
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
|
-
|
|
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,
|
|
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
|
|
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", () =>
|
|
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
|
-
|
|
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
|
-
|
|
323
|
-
|
|
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
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
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
|
-
*
|
|
335
|
-
* distance
|
|
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
|
|
338
|
-
const {
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
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));
|