@tonybfox/threejs-tools 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +321 -0
- package/dist/asset-loader/index.cjs +376 -0
- package/dist/asset-loader/index.cjs.map +1 -0
- package/dist/asset-loader/index.d.mts +101 -0
- package/dist/asset-loader/index.d.ts +101 -0
- package/dist/asset-loader/index.mjs +7 -0
- package/dist/asset-loader/index.mjs.map +1 -0
- package/dist/camera/index.cjs +313 -0
- package/dist/camera/index.cjs.map +1 -0
- package/dist/camera/index.d.mts +82 -0
- package/dist/camera/index.d.ts +82 -0
- package/dist/camera/index.mjs +7 -0
- package/dist/camera/index.mjs.map +1 -0
- package/dist/chunk-5DP6WDB3.mjs +1161 -0
- package/dist/chunk-5DP6WDB3.mjs.map +1 -0
- package/dist/chunk-BJKSICFA.mjs +1579 -0
- package/dist/chunk-BJKSICFA.mjs.map +1 -0
- package/dist/chunk-BYRZCHE7.mjs +277 -0
- package/dist/chunk-BYRZCHE7.mjs.map +1 -0
- package/dist/chunk-EIROAPF7.mjs +387 -0
- package/dist/chunk-EIROAPF7.mjs.map +1 -0
- package/dist/chunk-EQDOX34V.mjs +164 -0
- package/dist/chunk-EQDOX34V.mjs.map +1 -0
- package/dist/chunk-IIAZ2WJJ.mjs +405 -0
- package/dist/chunk-IIAZ2WJJ.mjs.map +1 -0
- package/dist/chunk-L4VIIJZD.mjs +340 -0
- package/dist/chunk-L4VIIJZD.mjs.map +1 -0
- package/dist/chunk-P35QJCOG.mjs +339 -0
- package/dist/chunk-P35QJCOG.mjs.map +1 -0
- package/dist/chunk-R64RVBRM.mjs +394 -0
- package/dist/chunk-R64RVBRM.mjs.map +1 -0
- package/dist/compass/index.cjs +375 -0
- package/dist/compass/index.cjs.map +1 -0
- package/dist/compass/index.d.mts +58 -0
- package/dist/compass/index.d.ts +58 -0
- package/dist/compass/index.mjs +7 -0
- package/dist/compass/index.mjs.map +1 -0
- package/dist/grid/index.cjs +200 -0
- package/dist/grid/index.cjs.map +1 -0
- package/dist/grid/index.d.mts +43 -0
- package/dist/grid/index.d.ts +43 -0
- package/dist/grid/index.mjs +7 -0
- package/dist/grid/index.mjs.map +1 -0
- package/dist/index.cjs +5049 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.mts +13 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.mjs +47 -0
- package/dist/index.mjs.map +1 -0
- package/dist/measurements/index.cjs +1198 -0
- package/dist/measurements/index.cjs.map +1 -0
- package/dist/measurements/index.d.mts +449 -0
- package/dist/measurements/index.d.ts +449 -0
- package/dist/measurements/index.mjs +9 -0
- package/dist/measurements/index.mjs.map +1 -0
- package/dist/sunlight/index.cjs +441 -0
- package/dist/sunlight/index.cjs.map +1 -0
- package/dist/sunlight/index.d.mts +92 -0
- package/dist/sunlight/index.d.ts +92 -0
- package/dist/sunlight/index.mjs +7 -0
- package/dist/sunlight/index.mjs.map +1 -0
- package/dist/terrain/index.cjs +423 -0
- package/dist/terrain/index.cjs.map +1 -0
- package/dist/terrain/index.d.mts +219 -0
- package/dist/terrain/index.d.ts +219 -0
- package/dist/terrain/index.mjs +7 -0
- package/dist/terrain/index.mjs.map +1 -0
- package/dist/transform-controls/index.cjs +1587 -0
- package/dist/transform-controls/index.cjs.map +1 -0
- package/dist/transform-controls/index.d.mts +162 -0
- package/dist/transform-controls/index.d.ts +162 -0
- package/dist/transform-controls/index.mjs +13 -0
- package/dist/transform-controls/index.mjs.map +1 -0
- package/dist/view-helper/index.cjs +430 -0
- package/dist/view-helper/index.cjs.map +1 -0
- package/dist/view-helper/index.d.mts +75 -0
- package/dist/view-helper/index.d.ts +75 -0
- package/dist/view-helper/index.mjs +7 -0
- package/dist/view-helper/index.mjs.map +1 -0
- package/package.json +124 -0
|
@@ -0,0 +1,430 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __create = Object.create;
|
|
3
|
+
var __defProp = Object.defineProperty;
|
|
4
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
5
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
7
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
8
|
+
var __export = (target, all) => {
|
|
9
|
+
for (var name in all)
|
|
10
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
11
|
+
};
|
|
12
|
+
var __copyProps = (to, from, except, desc) => {
|
|
13
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
14
|
+
for (let key of __getOwnPropNames(from))
|
|
15
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
16
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
17
|
+
}
|
|
18
|
+
return to;
|
|
19
|
+
};
|
|
20
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
21
|
+
// If the importer is in node compatibility mode or this is not an ESM
|
|
22
|
+
// file that has been converted to a CommonJS file using a Babel-
|
|
23
|
+
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
24
|
+
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
25
|
+
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
26
|
+
mod
|
|
27
|
+
));
|
|
28
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
29
|
+
|
|
30
|
+
// packages/view-helper/src/index.ts
|
|
31
|
+
var src_exports = {};
|
|
32
|
+
__export(src_exports, {
|
|
33
|
+
ViewHelper: () => ViewHelper
|
|
34
|
+
});
|
|
35
|
+
module.exports = __toCommonJS(src_exports);
|
|
36
|
+
|
|
37
|
+
// packages/view-helper/src/ViewHelper.ts
|
|
38
|
+
var THREE = __toESM(require("three"));
|
|
39
|
+
var AXIS_COLORS = {
|
|
40
|
+
x: "#ed4358",
|
|
41
|
+
y: "#82cc19",
|
|
42
|
+
z: "#3185eb"
|
|
43
|
+
};
|
|
44
|
+
var ViewHelper = class extends THREE.EventDispatcher {
|
|
45
|
+
constructor(camera, domElement, options = {}) {
|
|
46
|
+
super();
|
|
47
|
+
this.viewport = new THREE.Vector4();
|
|
48
|
+
// Animation properties
|
|
49
|
+
this.animating = false;
|
|
50
|
+
this.targetPosition = new THREE.Vector3();
|
|
51
|
+
this.targetQuaternion = new THREE.Quaternion();
|
|
52
|
+
this.q1 = new THREE.Quaternion();
|
|
53
|
+
this.q2 = new THREE.Quaternion();
|
|
54
|
+
this.dummy = new THREE.Object3D();
|
|
55
|
+
this.radius = 0;
|
|
56
|
+
this.turnRate = 2 * Math.PI;
|
|
57
|
+
// turn rate in angles per second
|
|
58
|
+
this.tempVecA = new THREE.Vector3();
|
|
59
|
+
// Interactive elements
|
|
60
|
+
this.interactiveObjects = [];
|
|
61
|
+
this.raycaster = new THREE.Raycaster();
|
|
62
|
+
this.mouse = new THREE.Vector2();
|
|
63
|
+
this.controls = options.controls;
|
|
64
|
+
this.camera = this.controls?.camera ?? camera;
|
|
65
|
+
this.domElement = domElement || document.body;
|
|
66
|
+
const defaultCenter = options.center ?? (this.controls ? this.controls.getTarget(new THREE.Vector3()) : new THREE.Vector3());
|
|
67
|
+
this.options = {
|
|
68
|
+
container: options.container || document.body,
|
|
69
|
+
size: options.size || 128,
|
|
70
|
+
position: options.position || "bottom-right",
|
|
71
|
+
offset: options.offset || { x: 20, y: 20 },
|
|
72
|
+
center: defaultCenter.clone(),
|
|
73
|
+
labels: {
|
|
74
|
+
x: options.labels?.x || "",
|
|
75
|
+
y: options.labels?.y || "",
|
|
76
|
+
z: options.labels?.z || "",
|
|
77
|
+
...options.labels
|
|
78
|
+
}
|
|
79
|
+
};
|
|
80
|
+
this.center = this.options.center.clone();
|
|
81
|
+
this.scene = new THREE.Scene();
|
|
82
|
+
this.scene.background = null;
|
|
83
|
+
this.orthoCamera = new THREE.OrthographicCamera(-2, 2, 2, -2, 0, 4);
|
|
84
|
+
this.orthoCamera.position.set(0, 0, 2);
|
|
85
|
+
this.createAxes();
|
|
86
|
+
this.createSprites();
|
|
87
|
+
this.setupEventListeners();
|
|
88
|
+
}
|
|
89
|
+
syncActiveCamera() {
|
|
90
|
+
if (this.controls) {
|
|
91
|
+
this.camera = this.controls.camera;
|
|
92
|
+
}
|
|
93
|
+
return this.camera;
|
|
94
|
+
}
|
|
95
|
+
getCameraPosition(target) {
|
|
96
|
+
if (this.controls) {
|
|
97
|
+
return this.controls.getPosition(target);
|
|
98
|
+
}
|
|
99
|
+
return target.copy(this.camera.position);
|
|
100
|
+
}
|
|
101
|
+
createAxes() {
|
|
102
|
+
const geometry = new THREE.CylinderGeometry(0.04, 0.04, 0.8, 5).rotateZ(-Math.PI / 2).translate(0.4, 0, 0);
|
|
103
|
+
const xAxisMaterial = new THREE.MeshBasicMaterial({
|
|
104
|
+
color: AXIS_COLORS.x,
|
|
105
|
+
toneMapped: false
|
|
106
|
+
});
|
|
107
|
+
const yAxisMaterial = new THREE.MeshBasicMaterial({
|
|
108
|
+
color: AXIS_COLORS.y,
|
|
109
|
+
toneMapped: false
|
|
110
|
+
});
|
|
111
|
+
const zAxisMaterial = new THREE.MeshBasicMaterial({
|
|
112
|
+
color: AXIS_COLORS.z,
|
|
113
|
+
toneMapped: false
|
|
114
|
+
});
|
|
115
|
+
this.axes = {
|
|
116
|
+
x: new THREE.Mesh(geometry.clone(), xAxisMaterial),
|
|
117
|
+
y: new THREE.Mesh(geometry.clone(), yAxisMaterial),
|
|
118
|
+
z: new THREE.Mesh(geometry.clone(), zAxisMaterial)
|
|
119
|
+
};
|
|
120
|
+
this.axes.y.rotation.z = Math.PI / 2;
|
|
121
|
+
this.axes.z.rotation.y = -Math.PI / 2;
|
|
122
|
+
this.scene.add(this.axes.x);
|
|
123
|
+
this.scene.add(this.axes.y);
|
|
124
|
+
this.scene.add(this.axes.z);
|
|
125
|
+
}
|
|
126
|
+
createSprites() {
|
|
127
|
+
const posXSprite = this.createSprite(AXIS_COLORS.x, this.options.labels.x);
|
|
128
|
+
const posYSprite = this.createSprite(AXIS_COLORS.y, this.options.labels.y);
|
|
129
|
+
const posZSprite = this.createSprite(AXIS_COLORS.z, this.options.labels.z);
|
|
130
|
+
const negXSprite = this.createSprite(AXIS_COLORS.x);
|
|
131
|
+
const negYSprite = this.createSprite(AXIS_COLORS.y);
|
|
132
|
+
const negZSprite = this.createSprite(AXIS_COLORS.z);
|
|
133
|
+
this.sprites = {
|
|
134
|
+
posX: posXSprite,
|
|
135
|
+
posY: posYSprite,
|
|
136
|
+
posZ: posZSprite,
|
|
137
|
+
negX: negXSprite,
|
|
138
|
+
negY: negYSprite,
|
|
139
|
+
negZ: negZSprite
|
|
140
|
+
};
|
|
141
|
+
this.sprites.posX.position.set(1, 0, 0);
|
|
142
|
+
this.sprites.posY.position.set(0, 1, 0);
|
|
143
|
+
this.sprites.posZ.position.set(0, 0, 1);
|
|
144
|
+
this.sprites.negX.position.set(-1, 0, 0);
|
|
145
|
+
this.sprites.negY.position.set(0, -1, 0);
|
|
146
|
+
this.sprites.negZ.position.set(0, 0, -1);
|
|
147
|
+
this.sprites.negX.material.opacity = 0.2;
|
|
148
|
+
this.sprites.negY.material.opacity = 0.2;
|
|
149
|
+
this.sprites.negZ.material.opacity = 0.2;
|
|
150
|
+
this.sprites.posX.userData.type = "posX";
|
|
151
|
+
this.sprites.posY.userData.type = "posY";
|
|
152
|
+
this.sprites.posZ.userData.type = "posZ";
|
|
153
|
+
this.sprites.negX.userData.type = "negX";
|
|
154
|
+
this.sprites.negY.userData.type = "negY";
|
|
155
|
+
this.sprites.negZ.userData.type = "negZ";
|
|
156
|
+
Object.values(this.sprites).forEach((sprite) => {
|
|
157
|
+
this.scene.add(sprite);
|
|
158
|
+
this.interactiveObjects.push(sprite);
|
|
159
|
+
});
|
|
160
|
+
}
|
|
161
|
+
createSprite(color, text) {
|
|
162
|
+
const pixelRatio = window.devicePixelRatio || 1;
|
|
163
|
+
const size = 128 * pixelRatio;
|
|
164
|
+
const radius = 28 * pixelRatio;
|
|
165
|
+
const canvas = document.createElement("canvas");
|
|
166
|
+
canvas.width = size;
|
|
167
|
+
canvas.height = size;
|
|
168
|
+
const context = canvas.getContext("2d");
|
|
169
|
+
context.imageSmoothingEnabled = true;
|
|
170
|
+
context.imageSmoothingQuality = "high";
|
|
171
|
+
context.scale(pixelRatio, pixelRatio);
|
|
172
|
+
const center = size / (2 * pixelRatio);
|
|
173
|
+
const actualRadius = radius / pixelRatio;
|
|
174
|
+
context.beginPath();
|
|
175
|
+
context.arc(center, center, actualRadius, 0, 2 * Math.PI);
|
|
176
|
+
context.closePath();
|
|
177
|
+
context.fillStyle = color;
|
|
178
|
+
context.fill();
|
|
179
|
+
if (text) {
|
|
180
|
+
context.font = "bold 48px Arial, sans-serif";
|
|
181
|
+
context.textAlign = "center";
|
|
182
|
+
context.textBaseline = "middle";
|
|
183
|
+
context.fillStyle = "#ffffff";
|
|
184
|
+
context.strokeStyle = "#000000";
|
|
185
|
+
context.lineWidth = 2;
|
|
186
|
+
context.strokeText(text, center, center);
|
|
187
|
+
context.fillText(text, center, center);
|
|
188
|
+
}
|
|
189
|
+
const texture = new THREE.CanvasTexture(canvas);
|
|
190
|
+
texture.colorSpace = THREE.SRGBColorSpace;
|
|
191
|
+
texture.generateMipmaps = false;
|
|
192
|
+
texture.minFilter = THREE.LinearFilter;
|
|
193
|
+
texture.magFilter = THREE.LinearFilter;
|
|
194
|
+
return new THREE.Sprite(
|
|
195
|
+
new THREE.SpriteMaterial({
|
|
196
|
+
map: texture,
|
|
197
|
+
toneMapped: false,
|
|
198
|
+
alphaTest: 0.1
|
|
199
|
+
})
|
|
200
|
+
);
|
|
201
|
+
}
|
|
202
|
+
setupEventListeners() {
|
|
203
|
+
this.pointerDownHandler = (event) => {
|
|
204
|
+
this.handleClick(event);
|
|
205
|
+
};
|
|
206
|
+
this.domElement.addEventListener("pointerdown", this.pointerDownHandler);
|
|
207
|
+
}
|
|
208
|
+
render(renderer) {
|
|
209
|
+
this.renderer = renderer;
|
|
210
|
+
const activeCamera = this.syncActiveCamera();
|
|
211
|
+
this.scene.quaternion.copy(activeCamera.quaternion).invert();
|
|
212
|
+
this.scene.updateMatrixWorld();
|
|
213
|
+
const size = this.options.size;
|
|
214
|
+
const canvasWidth = renderer.domElement.width / renderer.getPixelRatio();
|
|
215
|
+
const canvasHeight = renderer.domElement.height / renderer.getPixelRatio();
|
|
216
|
+
let x, y;
|
|
217
|
+
switch (this.options.position) {
|
|
218
|
+
case "top-left":
|
|
219
|
+
x = this.options.offset.x;
|
|
220
|
+
y = canvasHeight - size - this.options.offset.y;
|
|
221
|
+
break;
|
|
222
|
+
case "top-right":
|
|
223
|
+
x = canvasWidth - size - this.options.offset.x;
|
|
224
|
+
y = canvasHeight - size - this.options.offset.y;
|
|
225
|
+
break;
|
|
226
|
+
case "bottom-left":
|
|
227
|
+
x = this.options.offset.x;
|
|
228
|
+
y = this.options.offset.y;
|
|
229
|
+
break;
|
|
230
|
+
case "bottom-right":
|
|
231
|
+
default:
|
|
232
|
+
x = canvasWidth - size - this.options.offset.x;
|
|
233
|
+
y = this.options.offset.y;
|
|
234
|
+
break;
|
|
235
|
+
}
|
|
236
|
+
renderer.getViewport(this.viewport);
|
|
237
|
+
const autoClear = renderer.autoClear;
|
|
238
|
+
renderer.setViewport(x, y, size, size);
|
|
239
|
+
renderer.autoClear = false;
|
|
240
|
+
renderer.setScissorTest(true);
|
|
241
|
+
renderer.setScissor(x, y, size, size);
|
|
242
|
+
renderer.clear(false, false, true);
|
|
243
|
+
renderer.render(this.scene, this.orthoCamera);
|
|
244
|
+
renderer.setScissorTest(false);
|
|
245
|
+
renderer.autoClear = autoClear;
|
|
246
|
+
renderer.setViewport(
|
|
247
|
+
this.viewport.x,
|
|
248
|
+
this.viewport.y,
|
|
249
|
+
this.viewport.z,
|
|
250
|
+
this.viewport.w
|
|
251
|
+
);
|
|
252
|
+
}
|
|
253
|
+
handleClick(event) {
|
|
254
|
+
if (this.animating || !this.renderer) return false;
|
|
255
|
+
this.syncActiveCamera();
|
|
256
|
+
const rect = this.domElement.getBoundingClientRect();
|
|
257
|
+
const size = this.options.size;
|
|
258
|
+
let offsetX, offsetY;
|
|
259
|
+
switch (this.options.position) {
|
|
260
|
+
case "top-left":
|
|
261
|
+
offsetX = rect.left + this.options.offset.x;
|
|
262
|
+
offsetY = rect.top + this.options.offset.y;
|
|
263
|
+
break;
|
|
264
|
+
case "top-right":
|
|
265
|
+
offsetX = rect.left + rect.width - size - this.options.offset.x;
|
|
266
|
+
offsetY = rect.top + this.options.offset.y;
|
|
267
|
+
break;
|
|
268
|
+
case "bottom-left":
|
|
269
|
+
offsetX = rect.left + this.options.offset.x;
|
|
270
|
+
offsetY = rect.top + rect.height - size - this.options.offset.y;
|
|
271
|
+
break;
|
|
272
|
+
case "bottom-right":
|
|
273
|
+
default:
|
|
274
|
+
offsetX = rect.left + rect.width - size - this.options.offset.x;
|
|
275
|
+
offsetY = rect.top + rect.height - size - this.options.offset.y;
|
|
276
|
+
break;
|
|
277
|
+
}
|
|
278
|
+
this.mouse.x = (event.clientX - offsetX) / size * 2 - 1;
|
|
279
|
+
this.mouse.y = -((event.clientY - offsetY) / size) * 2 + 1;
|
|
280
|
+
if (this.mouse.x < -1 || this.mouse.x > 1 || this.mouse.y < -1 || this.mouse.y > 1) {
|
|
281
|
+
return false;
|
|
282
|
+
}
|
|
283
|
+
this.raycaster.setFromCamera(this.mouse, this.orthoCamera);
|
|
284
|
+
const intersects = this.raycaster.intersectObjects(this.interactiveObjects);
|
|
285
|
+
if (intersects.length > 0) {
|
|
286
|
+
const intersection = intersects[0];
|
|
287
|
+
const object = intersection.object;
|
|
288
|
+
this.prepareAnimationData(object, this.center);
|
|
289
|
+
if (this.controls) {
|
|
290
|
+
this.startControlsAnimation(this.center);
|
|
291
|
+
} else {
|
|
292
|
+
this.animating = true;
|
|
293
|
+
this.dispatchEvent({ type: "animationStart" });
|
|
294
|
+
}
|
|
295
|
+
return true;
|
|
296
|
+
}
|
|
297
|
+
return false;
|
|
298
|
+
}
|
|
299
|
+
prepareAnimationData(object, focusPoint) {
|
|
300
|
+
switch (object.userData.type) {
|
|
301
|
+
case "posX":
|
|
302
|
+
this.targetPosition.set(1, 0, 0);
|
|
303
|
+
this.targetQuaternion.setFromEuler(new THREE.Euler(0, Math.PI * 0.5, 0));
|
|
304
|
+
break;
|
|
305
|
+
case "posY":
|
|
306
|
+
this.targetPosition.set(0, 1, 0);
|
|
307
|
+
this.targetQuaternion.setFromEuler(
|
|
308
|
+
new THREE.Euler(-Math.PI * 0.5, 0, 0)
|
|
309
|
+
);
|
|
310
|
+
break;
|
|
311
|
+
case "posZ":
|
|
312
|
+
this.targetPosition.set(0, 0, 1);
|
|
313
|
+
this.targetQuaternion.setFromEuler(new THREE.Euler());
|
|
314
|
+
break;
|
|
315
|
+
case "negX":
|
|
316
|
+
this.targetPosition.set(-1, 0, 0);
|
|
317
|
+
this.targetQuaternion.setFromEuler(
|
|
318
|
+
new THREE.Euler(0, -Math.PI * 0.5, 0)
|
|
319
|
+
);
|
|
320
|
+
break;
|
|
321
|
+
case "negY":
|
|
322
|
+
this.targetPosition.set(0, -1, 0);
|
|
323
|
+
this.targetQuaternion.setFromEuler(new THREE.Euler(Math.PI * 0.5, 0, 0));
|
|
324
|
+
break;
|
|
325
|
+
case "negZ":
|
|
326
|
+
this.targetPosition.set(0, 0, -1);
|
|
327
|
+
this.targetQuaternion.setFromEuler(new THREE.Euler(0, Math.PI, 0));
|
|
328
|
+
break;
|
|
329
|
+
default:
|
|
330
|
+
console.error("ViewHelper: Invalid axis.");
|
|
331
|
+
return;
|
|
332
|
+
}
|
|
333
|
+
const cameraPosition = this.getCameraPosition(this.tempVecA);
|
|
334
|
+
this.radius = cameraPosition.distanceTo(focusPoint);
|
|
335
|
+
this.targetPosition.multiplyScalar(this.radius).add(focusPoint);
|
|
336
|
+
this.dummy.position.copy(focusPoint);
|
|
337
|
+
this.dummy.lookAt(cameraPosition);
|
|
338
|
+
this.q1.copy(this.dummy.quaternion);
|
|
339
|
+
this.dummy.lookAt(this.targetPosition);
|
|
340
|
+
this.q2.copy(this.dummy.quaternion);
|
|
341
|
+
}
|
|
342
|
+
startControlsAnimation(focusPoint) {
|
|
343
|
+
const controls = this.controls;
|
|
344
|
+
if (!controls) {
|
|
345
|
+
return;
|
|
346
|
+
}
|
|
347
|
+
controls.stop?.();
|
|
348
|
+
this.animating = true;
|
|
349
|
+
this.dispatchEvent({ type: "animationStart" });
|
|
350
|
+
const applyLookAt = () => controls.setLookAt(
|
|
351
|
+
this.targetPosition.x,
|
|
352
|
+
this.targetPosition.y,
|
|
353
|
+
this.targetPosition.z,
|
|
354
|
+
focusPoint.x,
|
|
355
|
+
focusPoint.y,
|
|
356
|
+
focusPoint.z,
|
|
357
|
+
true
|
|
358
|
+
);
|
|
359
|
+
try {
|
|
360
|
+
void Promise.resolve(applyLookAt()).catch((error) => {
|
|
361
|
+
console.warn("ViewHelper: Unable to set camera look-at.", error);
|
|
362
|
+
}).finally(() => {
|
|
363
|
+
this.animating = false;
|
|
364
|
+
this.dispatchEvent({ type: "animationEnd" });
|
|
365
|
+
});
|
|
366
|
+
} catch (error) {
|
|
367
|
+
console.warn("ViewHelper: Unable to set camera look-at.", error);
|
|
368
|
+
this.animating = false;
|
|
369
|
+
this.dispatchEvent({ type: "animationEnd" });
|
|
370
|
+
}
|
|
371
|
+
}
|
|
372
|
+
update(delta) {
|
|
373
|
+
this.syncActiveCamera();
|
|
374
|
+
if (this.controls) {
|
|
375
|
+
return;
|
|
376
|
+
}
|
|
377
|
+
if (!this.animating) return;
|
|
378
|
+
const step = delta * this.turnRate;
|
|
379
|
+
this.q1.rotateTowards(this.q2, step);
|
|
380
|
+
this.camera.position.set(0, 0, 1).applyQuaternion(this.q1).multiplyScalar(this.radius).add(this.center);
|
|
381
|
+
this.camera.quaternion.rotateTowards(this.targetQuaternion, step);
|
|
382
|
+
if (this.q1.angleTo(this.q2) === 0) {
|
|
383
|
+
this.animating = false;
|
|
384
|
+
this.dispatchEvent({ type: "animationEnd" });
|
|
385
|
+
}
|
|
386
|
+
}
|
|
387
|
+
setLabels(labelX, labelY, labelZ) {
|
|
388
|
+
if (labelX !== void 0) this.options.labels.x = labelX;
|
|
389
|
+
if (labelY !== void 0) this.options.labels.y = labelY;
|
|
390
|
+
if (labelZ !== void 0) this.options.labels.z = labelZ;
|
|
391
|
+
this.updateLabels();
|
|
392
|
+
}
|
|
393
|
+
updateLabels() {
|
|
394
|
+
this.sprites.posX.material.map?.dispose();
|
|
395
|
+
this.sprites.posY.material.map?.dispose();
|
|
396
|
+
this.sprites.posZ.material.map?.dispose();
|
|
397
|
+
this.sprites.posX.material.dispose();
|
|
398
|
+
this.sprites.posY.material.dispose();
|
|
399
|
+
this.sprites.posZ.material.dispose();
|
|
400
|
+
const newPosX = this.createSprite(AXIS_COLORS.x, this.options.labels.x);
|
|
401
|
+
const newPosY = this.createSprite(AXIS_COLORS.y, this.options.labels.y);
|
|
402
|
+
const newPosZ = this.createSprite(AXIS_COLORS.z, this.options.labels.z);
|
|
403
|
+
this.sprites.posX.material = newPosX.material;
|
|
404
|
+
this.sprites.posY.material = newPosY.material;
|
|
405
|
+
this.sprites.posZ.material = newPosZ.material;
|
|
406
|
+
}
|
|
407
|
+
dispose() {
|
|
408
|
+
this.axes.x.geometry.dispose();
|
|
409
|
+
this.axes.y.geometry.dispose();
|
|
410
|
+
this.axes.z.geometry.dispose();
|
|
411
|
+
this.axes.x.material.dispose();
|
|
412
|
+
this.axes.y.material.dispose();
|
|
413
|
+
this.axes.z.material.dispose();
|
|
414
|
+
Object.values(this.sprites).forEach((sprite) => {
|
|
415
|
+
sprite.material.map?.dispose();
|
|
416
|
+
sprite.material.dispose();
|
|
417
|
+
});
|
|
418
|
+
if (this.pointerDownHandler) {
|
|
419
|
+
this.domElement.removeEventListener(
|
|
420
|
+
"pointerdown",
|
|
421
|
+
this.pointerDownHandler
|
|
422
|
+
);
|
|
423
|
+
}
|
|
424
|
+
}
|
|
425
|
+
};
|
|
426
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
427
|
+
0 && (module.exports = {
|
|
428
|
+
ViewHelper
|
|
429
|
+
});
|
|
430
|
+
//# sourceMappingURL=index.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../packages/view-helper/src/index.ts","../../packages/view-helper/src/ViewHelper.ts"],"sourcesContent":["export { ViewHelper } from './ViewHelper'\nexport type {\n ViewHelperOptions,\n ViewHelperEvent,\n ViewHelperCameraController,\n} from './ViewHelper'\n","import * as THREE from 'three'\n\n// Hard-coded axis colors matching TransformControls\nconst AXIS_COLORS = {\n x: '#ed4358',\n y: '#82cc19',\n z: '#3185eb',\n} as const\n\nexport interface ViewHelperCameraController {\n camera: THREE.Camera\n getPosition(target: THREE.Vector3): THREE.Vector3\n getTarget(target: THREE.Vector3): THREE.Vector3\n setLookAt(\n positionX: number,\n positionY: number,\n positionZ: number,\n targetX: number,\n targetY: number,\n targetZ: number,\n enableTransition?: boolean\n ): Promise<void> | void\n stop?(): void\n}\n\nexport interface ViewHelperOptions {\n container?: HTMLElement\n size?: number\n position?: 'top-left' | 'top-right' | 'bottom-left' | 'bottom-right'\n offset?: { x: number; y: number }\n center?: THREE.Vector3\n labels?: {\n x?: string\n y?: string\n z?: string\n }\n controls?: ViewHelperCameraController\n}\n\n// Define event types for the view helper\ninterface ViewHelperEventMap {\n animationStart: {}\n animationEnd: {}\n}\n\nexport interface ViewHelperEvent {\n type: 'animationStart' | 'animationEnd'\n}\n\nexport class ViewHelper extends THREE.EventDispatcher<ViewHelperEventMap> {\n private camera: THREE.Camera\n private domElement: HTMLElement\n private options: Required<Omit<ViewHelperOptions, 'controls'>>\n private scene: THREE.Scene\n private orthoCamera: THREE.OrthographicCamera\n private renderer?: THREE.WebGLRenderer\n private viewport: THREE.Vector4 = new THREE.Vector4()\n private controls?: ViewHelperCameraController\n private pointerDownHandler!: (event: PointerEvent) => void\n\n // Animation properties\n public animating: boolean = false\n public center: THREE.Vector3\n private targetPosition: THREE.Vector3 = new THREE.Vector3()\n private targetQuaternion: THREE.Quaternion = new THREE.Quaternion()\n private q1: THREE.Quaternion = new THREE.Quaternion()\n private q2: THREE.Quaternion = new THREE.Quaternion()\n private dummy: THREE.Object3D = new THREE.Object3D()\n private radius: number = 0\n private turnRate: number = 2 * Math.PI // turn rate in angles per second\n private tempVecA: THREE.Vector3 = new THREE.Vector3()\n\n // Interactive elements\n private interactiveObjects: THREE.Object3D[] = []\n private raycaster: THREE.Raycaster = new THREE.Raycaster()\n private mouse: THREE.Vector2 = new THREE.Vector2()\n\n // Helper objects\n private axes!: {\n x: THREE.Mesh\n y: THREE.Mesh\n z: THREE.Mesh\n }\n private sprites!: {\n posX: THREE.Sprite\n posY: THREE.Sprite\n posZ: THREE.Sprite\n negX: THREE.Sprite\n negY: THREE.Sprite\n negZ: THREE.Sprite\n }\n\n constructor(\n camera: THREE.Camera,\n domElement?: HTMLElement,\n options: ViewHelperOptions = {}\n ) {\n super()\n this.controls = options.controls\n this.camera = this.controls?.camera ?? camera\n this.domElement = domElement || document.body\n\n const defaultCenter =\n options.center ??\n (this.controls\n ? this.controls.getTarget(new THREE.Vector3())\n : new THREE.Vector3())\n\n // Set default options\n this.options = {\n container: options.container || document.body,\n size: options.size || 128,\n position: options.position || 'bottom-right',\n offset: options.offset || { x: 20, y: 20 },\n center: defaultCenter.clone(),\n labels: {\n x: options.labels?.x || '',\n y: options.labels?.y || '',\n z: options.labels?.z || '',\n ...options.labels,\n },\n }\n\n this.center = this.options.center.clone()\n\n this.scene = new THREE.Scene()\n this.scene.background = null // Make background transparent\n this.orthoCamera = new THREE.OrthographicCamera(-2, 2, 2, -2, 0, 4)\n this.orthoCamera.position.set(0, 0, 2)\n\n this.createAxes()\n this.createSprites()\n this.setupEventListeners()\n }\n\n private syncActiveCamera(): THREE.Camera {\n if (this.controls) {\n this.camera = this.controls.camera\n }\n return this.camera\n }\n\n private getCameraPosition(target: THREE.Vector3): THREE.Vector3 {\n if (this.controls) {\n return this.controls.getPosition(target)\n }\n return target.copy(this.camera.position)\n }\n\n private createAxes(): void {\n const geometry = new THREE.CylinderGeometry(0.04, 0.04, 0.8, 5)\n .rotateZ(-Math.PI / 2)\n .translate(0.4, 0, 0)\n\n const xAxisMaterial = new THREE.MeshBasicMaterial({\n color: AXIS_COLORS.x,\n toneMapped: false,\n })\n const yAxisMaterial = new THREE.MeshBasicMaterial({\n color: AXIS_COLORS.y,\n toneMapped: false,\n })\n const zAxisMaterial = new THREE.MeshBasicMaterial({\n color: AXIS_COLORS.z,\n toneMapped: false,\n })\n\n this.axes = {\n x: new THREE.Mesh(geometry.clone(), xAxisMaterial),\n y: new THREE.Mesh(geometry.clone(), yAxisMaterial),\n z: new THREE.Mesh(geometry.clone(), zAxisMaterial),\n }\n\n this.axes.y.rotation.z = Math.PI / 2\n this.axes.z.rotation.y = -Math.PI / 2\n\n this.scene.add(this.axes.x)\n this.scene.add(this.axes.y)\n this.scene.add(this.axes.z)\n }\n\n private createSprites(): void {\n const posXSprite = this.createSprite(AXIS_COLORS.x, this.options.labels.x)\n const posYSprite = this.createSprite(AXIS_COLORS.y, this.options.labels.y)\n const posZSprite = this.createSprite(AXIS_COLORS.z, this.options.labels.z)\n // Use faded versions of the axis colors for negative axes\n const negXSprite = this.createSprite(AXIS_COLORS.x)\n const negYSprite = this.createSprite(AXIS_COLORS.y)\n const negZSprite = this.createSprite(AXIS_COLORS.z)\n\n this.sprites = {\n posX: posXSprite,\n posY: posYSprite,\n posZ: posZSprite,\n negX: negXSprite,\n negY: negYSprite,\n negZ: negZSprite,\n }\n\n // Position sprites\n this.sprites.posX.position.set(1, 0, 0)\n this.sprites.posY.position.set(0, 1, 0)\n this.sprites.posZ.position.set(0, 0, 1)\n this.sprites.negX.position.set(-1, 0, 0)\n this.sprites.negY.position.set(0, -1, 0)\n this.sprites.negZ.position.set(0, 0, -1)\n\n // Set opacity for negative axes\n this.sprites.negX.material.opacity = 0.2\n this.sprites.negY.material.opacity = 0.2\n this.sprites.negZ.material.opacity = 0.2\n\n // Set user data for interaction\n this.sprites.posX.userData.type = 'posX'\n this.sprites.posY.userData.type = 'posY'\n this.sprites.posZ.userData.type = 'posZ'\n this.sprites.negX.userData.type = 'negX'\n this.sprites.negY.userData.type = 'negY'\n this.sprites.negZ.userData.type = 'negZ'\n\n // Add to scene and interactive objects\n Object.values(this.sprites).forEach((sprite) => {\n this.scene.add(sprite)\n this.interactiveObjects.push(sprite)\n })\n }\n\n private createSprite(color: string, text?: string): THREE.Sprite {\n // Use higher resolution for crisp rendering\n const pixelRatio = window.devicePixelRatio || 1\n const size = 128 * pixelRatio\n const radius = 28 * pixelRatio\n\n const canvas = document.createElement('canvas')\n canvas.width = size\n canvas.height = size\n\n const context = canvas.getContext('2d')!\n\n // Enable high-quality rendering\n context.imageSmoothingEnabled = true\n context.imageSmoothingQuality = 'high'\n\n // Scale for device pixel ratio\n context.scale(pixelRatio, pixelRatio)\n\n const center = size / (2 * pixelRatio)\n const actualRadius = radius / pixelRatio\n\n // Draw circle background\n context.beginPath()\n context.arc(center, center, actualRadius, 0, 2 * Math.PI)\n context.closePath()\n context.fillStyle = color\n context.fill()\n\n if (text) {\n context.font = 'bold 48px Arial, sans-serif'\n context.textAlign = 'center'\n context.textBaseline = 'middle'\n context.fillStyle = '#ffffff'\n\n // Add text stroke for better visibility\n context.strokeStyle = '#000000'\n context.lineWidth = 2\n context.strokeText(text, center, center)\n context.fillText(text, center, center)\n }\n\n const texture = new THREE.CanvasTexture(canvas)\n texture.colorSpace = THREE.SRGBColorSpace\n texture.generateMipmaps = false\n texture.minFilter = THREE.LinearFilter\n texture.magFilter = THREE.LinearFilter\n\n return new THREE.Sprite(\n new THREE.SpriteMaterial({\n map: texture,\n toneMapped: false,\n alphaTest: 0.1,\n })\n )\n }\n\n private setupEventListeners(): void {\n this.pointerDownHandler = (event: PointerEvent) => {\n this.handleClick(event)\n }\n this.domElement.addEventListener('pointerdown', this.pointerDownHandler)\n }\n\n public render(renderer: THREE.WebGLRenderer): void {\n this.renderer = renderer\n\n const activeCamera = this.syncActiveCamera()\n\n // Update helper orientation to match camera\n this.scene.quaternion.copy(activeCamera.quaternion).invert()\n this.scene.updateMatrixWorld()\n\n const size = this.options.size\n const canvasWidth = renderer.domElement.width / renderer.getPixelRatio()\n const canvasHeight = renderer.domElement.height / renderer.getPixelRatio()\n\n let x: number, y: number\n\n switch (this.options.position) {\n case 'top-left':\n x = this.options.offset.x\n y = canvasHeight - size - this.options.offset.y\n break\n case 'top-right':\n x = canvasWidth - size - this.options.offset.x\n y = canvasHeight - size - this.options.offset.y\n break\n case 'bottom-left':\n x = this.options.offset.x\n y = this.options.offset.y\n break\n case 'bottom-right':\n default:\n x = canvasWidth - size - this.options.offset.x\n y = this.options.offset.y\n break\n }\n\n // Store current viewport and autoClear setting\n renderer.getViewport(this.viewport)\n const autoClear = renderer.autoClear\n\n // Set viewport for helper and disable autoClear\n renderer.setViewport(x, y, size, size)\n renderer.autoClear = false\n\n // Clear only depth buffer in the helper area\n renderer.setScissorTest(true)\n renderer.setScissor(x, y, size, size)\n renderer.clear(false, false, true) // clear depth only\n\n // Render helper\n renderer.render(this.scene, this.orthoCamera)\n\n // Restore settings\n renderer.setScissorTest(false)\n renderer.autoClear = autoClear\n renderer.setViewport(\n this.viewport.x,\n this.viewport.y,\n this.viewport.z,\n this.viewport.w\n )\n }\n\n public handleClick(event: PointerEvent): boolean {\n if (this.animating || !this.renderer) return false\n\n this.syncActiveCamera()\n\n const rect = this.domElement.getBoundingClientRect()\n const size = this.options.size // Use logical size for click detection\n\n // Calculate helper viewport bounds\n let offsetX: number, offsetY: number\n\n switch (this.options.position) {\n case 'top-left':\n offsetX = rect.left + this.options.offset.x\n offsetY = rect.top + this.options.offset.y\n break\n case 'top-right':\n offsetX = rect.left + rect.width - size - this.options.offset.x\n offsetY = rect.top + this.options.offset.y\n break\n case 'bottom-left':\n offsetX = rect.left + this.options.offset.x\n offsetY = rect.top + rect.height - size - this.options.offset.y\n break\n case 'bottom-right':\n default:\n offsetX = rect.left + rect.width - size - this.options.offset.x\n offsetY = rect.top + rect.height - size - this.options.offset.y\n break\n }\n\n // Convert click coordinates to helper-relative coordinates\n this.mouse.x = ((event.clientX - offsetX) / size) * 2 - 1\n this.mouse.y = -((event.clientY - offsetY) / size) * 2 + 1\n\n // Check if click is within helper bounds\n if (\n this.mouse.x < -1 ||\n this.mouse.x > 1 ||\n this.mouse.y < -1 ||\n this.mouse.y > 1\n ) {\n return false\n }\n\n this.raycaster.setFromCamera(this.mouse, this.orthoCamera)\n const intersects = this.raycaster.intersectObjects(this.interactiveObjects)\n\n if (intersects.length > 0) {\n const intersection = intersects[0]\n const object = intersection.object\n this.prepareAnimationData(object, this.center)\n if (this.controls) {\n this.startControlsAnimation(this.center)\n } else {\n this.animating = true\n this.dispatchEvent({ type: 'animationStart' })\n }\n return true\n }\n\n return false\n }\n\n private prepareAnimationData(\n object: THREE.Object3D,\n focusPoint: THREE.Vector3\n ): void {\n switch (object.userData.type) {\n case 'posX':\n this.targetPosition.set(1, 0, 0)\n this.targetQuaternion.setFromEuler(new THREE.Euler(0, Math.PI * 0.5, 0))\n break\n case 'posY':\n this.targetPosition.set(0, 1, 0)\n this.targetQuaternion.setFromEuler(\n new THREE.Euler(-Math.PI * 0.5, 0, 0)\n )\n break\n case 'posZ':\n this.targetPosition.set(0, 0, 1)\n this.targetQuaternion.setFromEuler(new THREE.Euler())\n break\n case 'negX':\n this.targetPosition.set(-1, 0, 0)\n this.targetQuaternion.setFromEuler(\n new THREE.Euler(0, -Math.PI * 0.5, 0)\n )\n break\n case 'negY':\n this.targetPosition.set(0, -1, 0)\n this.targetQuaternion.setFromEuler(new THREE.Euler(Math.PI * 0.5, 0, 0))\n break\n case 'negZ':\n this.targetPosition.set(0, 0, -1)\n this.targetQuaternion.setFromEuler(new THREE.Euler(0, Math.PI, 0))\n break\n default:\n console.error('ViewHelper: Invalid axis.')\n return\n }\n\n const cameraPosition = this.getCameraPosition(this.tempVecA)\n this.radius = cameraPosition.distanceTo(focusPoint)\n this.targetPosition.multiplyScalar(this.radius).add(focusPoint)\n\n this.dummy.position.copy(focusPoint)\n this.dummy.lookAt(cameraPosition)\n this.q1.copy(this.dummy.quaternion)\n\n this.dummy.lookAt(this.targetPosition)\n this.q2.copy(this.dummy.quaternion)\n }\n\n private startControlsAnimation(focusPoint: THREE.Vector3): void {\n const controls = this.controls\n if (!controls) {\n return\n }\n\n controls.stop?.()\n this.animating = true\n this.dispatchEvent({ type: 'animationStart' })\n\n const applyLookAt = () =>\n controls.setLookAt(\n this.targetPosition.x,\n this.targetPosition.y,\n this.targetPosition.z,\n focusPoint.x,\n focusPoint.y,\n focusPoint.z,\n true\n )\n\n try {\n void Promise.resolve(applyLookAt())\n .catch((error) => {\n console.warn('ViewHelper: Unable to set camera look-at.', error)\n })\n .finally(() => {\n this.animating = false\n this.dispatchEvent({ type: 'animationEnd' })\n })\n } catch (error) {\n console.warn('ViewHelper: Unable to set camera look-at.', error)\n this.animating = false\n this.dispatchEvent({ type: 'animationEnd' })\n }\n }\n\n public update(delta: number): void {\n this.syncActiveCamera()\n\n if (this.controls) {\n return\n }\n\n if (!this.animating) return\n\n const step = delta * this.turnRate\n\n // Animate position by doing a slerp and then scaling the position on the unit sphere\n this.q1.rotateTowards(this.q2, step)\n this.camera.position\n .set(0, 0, 1)\n .applyQuaternion(this.q1)\n .multiplyScalar(this.radius)\n .add(this.center)\n\n // Animate orientation\n this.camera.quaternion.rotateTowards(this.targetQuaternion, step)\n\n if (this.q1.angleTo(this.q2) === 0) {\n this.animating = false\n this.dispatchEvent({ type: 'animationEnd' })\n }\n }\n\n public setLabels(labelX?: string, labelY?: string, labelZ?: string): void {\n if (labelX !== undefined) this.options.labels.x = labelX\n if (labelY !== undefined) this.options.labels.y = labelY\n if (labelZ !== undefined) this.options.labels.z = labelZ\n\n this.updateLabels()\n }\n\n private updateLabels(): void {\n // Dispose old materials\n this.sprites.posX.material.map?.dispose()\n this.sprites.posY.material.map?.dispose()\n this.sprites.posZ.material.map?.dispose()\n this.sprites.posX.material.dispose()\n this.sprites.posY.material.dispose()\n this.sprites.posZ.material.dispose()\n\n // Create new sprites with updated labels\n const newPosX = this.createSprite(AXIS_COLORS.x, this.options.labels.x)\n const newPosY = this.createSprite(AXIS_COLORS.y, this.options.labels.y)\n const newPosZ = this.createSprite(AXIS_COLORS.z, this.options.labels.z)\n\n // Update sprites\n this.sprites.posX.material = newPosX.material\n this.sprites.posY.material = newPosY.material\n this.sprites.posZ.material = newPosZ.material\n }\n\n public dispose(): void {\n // Dispose geometries\n this.axes.x.geometry.dispose()\n this.axes.y.geometry.dispose()\n this.axes.z.geometry.dispose()\n\n // Dispose materials\n ;(this.axes.x.material as THREE.Material).dispose()\n ;(this.axes.y.material as THREE.Material).dispose()\n ;(this.axes.z.material as THREE.Material).dispose()\n\n // Dispose sprite materials and textures\n Object.values(this.sprites).forEach((sprite) => {\n sprite.material.map?.dispose()\n sprite.material.dispose()\n })\n\n // Remove event listeners\n if (this.pointerDownHandler) {\n this.domElement.removeEventListener(\n 'pointerdown',\n this.pointerDownHandler\n )\n }\n }\n}\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import * as THREE from 'three';
|
|
2
|
+
|
|
3
|
+
interface ViewHelperCameraController {
|
|
4
|
+
camera: THREE.Camera;
|
|
5
|
+
getPosition(target: THREE.Vector3): THREE.Vector3;
|
|
6
|
+
getTarget(target: THREE.Vector3): THREE.Vector3;
|
|
7
|
+
setLookAt(positionX: number, positionY: number, positionZ: number, targetX: number, targetY: number, targetZ: number, enableTransition?: boolean): Promise<void> | void;
|
|
8
|
+
stop?(): void;
|
|
9
|
+
}
|
|
10
|
+
interface ViewHelperOptions {
|
|
11
|
+
container?: HTMLElement;
|
|
12
|
+
size?: number;
|
|
13
|
+
position?: 'top-left' | 'top-right' | 'bottom-left' | 'bottom-right';
|
|
14
|
+
offset?: {
|
|
15
|
+
x: number;
|
|
16
|
+
y: number;
|
|
17
|
+
};
|
|
18
|
+
center?: THREE.Vector3;
|
|
19
|
+
labels?: {
|
|
20
|
+
x?: string;
|
|
21
|
+
y?: string;
|
|
22
|
+
z?: string;
|
|
23
|
+
};
|
|
24
|
+
controls?: ViewHelperCameraController;
|
|
25
|
+
}
|
|
26
|
+
interface ViewHelperEventMap {
|
|
27
|
+
animationStart: {};
|
|
28
|
+
animationEnd: {};
|
|
29
|
+
}
|
|
30
|
+
interface ViewHelperEvent {
|
|
31
|
+
type: 'animationStart' | 'animationEnd';
|
|
32
|
+
}
|
|
33
|
+
declare class ViewHelper extends THREE.EventDispatcher<ViewHelperEventMap> {
|
|
34
|
+
private camera;
|
|
35
|
+
private domElement;
|
|
36
|
+
private options;
|
|
37
|
+
private scene;
|
|
38
|
+
private orthoCamera;
|
|
39
|
+
private renderer?;
|
|
40
|
+
private viewport;
|
|
41
|
+
private controls?;
|
|
42
|
+
private pointerDownHandler;
|
|
43
|
+
animating: boolean;
|
|
44
|
+
center: THREE.Vector3;
|
|
45
|
+
private targetPosition;
|
|
46
|
+
private targetQuaternion;
|
|
47
|
+
private q1;
|
|
48
|
+
private q2;
|
|
49
|
+
private dummy;
|
|
50
|
+
private radius;
|
|
51
|
+
private turnRate;
|
|
52
|
+
private tempVecA;
|
|
53
|
+
private interactiveObjects;
|
|
54
|
+
private raycaster;
|
|
55
|
+
private mouse;
|
|
56
|
+
private axes;
|
|
57
|
+
private sprites;
|
|
58
|
+
constructor(camera: THREE.Camera, domElement?: HTMLElement, options?: ViewHelperOptions);
|
|
59
|
+
private syncActiveCamera;
|
|
60
|
+
private getCameraPosition;
|
|
61
|
+
private createAxes;
|
|
62
|
+
private createSprites;
|
|
63
|
+
private createSprite;
|
|
64
|
+
private setupEventListeners;
|
|
65
|
+
render(renderer: THREE.WebGLRenderer): void;
|
|
66
|
+
handleClick(event: PointerEvent): boolean;
|
|
67
|
+
private prepareAnimationData;
|
|
68
|
+
private startControlsAnimation;
|
|
69
|
+
update(delta: number): void;
|
|
70
|
+
setLabels(labelX?: string, labelY?: string, labelZ?: string): void;
|
|
71
|
+
private updateLabels;
|
|
72
|
+
dispose(): void;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
export { ViewHelper, type ViewHelperCameraController, type ViewHelperEvent, type ViewHelperOptions };
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import * as THREE from 'three';
|
|
2
|
+
|
|
3
|
+
interface ViewHelperCameraController {
|
|
4
|
+
camera: THREE.Camera;
|
|
5
|
+
getPosition(target: THREE.Vector3): THREE.Vector3;
|
|
6
|
+
getTarget(target: THREE.Vector3): THREE.Vector3;
|
|
7
|
+
setLookAt(positionX: number, positionY: number, positionZ: number, targetX: number, targetY: number, targetZ: number, enableTransition?: boolean): Promise<void> | void;
|
|
8
|
+
stop?(): void;
|
|
9
|
+
}
|
|
10
|
+
interface ViewHelperOptions {
|
|
11
|
+
container?: HTMLElement;
|
|
12
|
+
size?: number;
|
|
13
|
+
position?: 'top-left' | 'top-right' | 'bottom-left' | 'bottom-right';
|
|
14
|
+
offset?: {
|
|
15
|
+
x: number;
|
|
16
|
+
y: number;
|
|
17
|
+
};
|
|
18
|
+
center?: THREE.Vector3;
|
|
19
|
+
labels?: {
|
|
20
|
+
x?: string;
|
|
21
|
+
y?: string;
|
|
22
|
+
z?: string;
|
|
23
|
+
};
|
|
24
|
+
controls?: ViewHelperCameraController;
|
|
25
|
+
}
|
|
26
|
+
interface ViewHelperEventMap {
|
|
27
|
+
animationStart: {};
|
|
28
|
+
animationEnd: {};
|
|
29
|
+
}
|
|
30
|
+
interface ViewHelperEvent {
|
|
31
|
+
type: 'animationStart' | 'animationEnd';
|
|
32
|
+
}
|
|
33
|
+
declare class ViewHelper extends THREE.EventDispatcher<ViewHelperEventMap> {
|
|
34
|
+
private camera;
|
|
35
|
+
private domElement;
|
|
36
|
+
private options;
|
|
37
|
+
private scene;
|
|
38
|
+
private orthoCamera;
|
|
39
|
+
private renderer?;
|
|
40
|
+
private viewport;
|
|
41
|
+
private controls?;
|
|
42
|
+
private pointerDownHandler;
|
|
43
|
+
animating: boolean;
|
|
44
|
+
center: THREE.Vector3;
|
|
45
|
+
private targetPosition;
|
|
46
|
+
private targetQuaternion;
|
|
47
|
+
private q1;
|
|
48
|
+
private q2;
|
|
49
|
+
private dummy;
|
|
50
|
+
private radius;
|
|
51
|
+
private turnRate;
|
|
52
|
+
private tempVecA;
|
|
53
|
+
private interactiveObjects;
|
|
54
|
+
private raycaster;
|
|
55
|
+
private mouse;
|
|
56
|
+
private axes;
|
|
57
|
+
private sprites;
|
|
58
|
+
constructor(camera: THREE.Camera, domElement?: HTMLElement, options?: ViewHelperOptions);
|
|
59
|
+
private syncActiveCamera;
|
|
60
|
+
private getCameraPosition;
|
|
61
|
+
private createAxes;
|
|
62
|
+
private createSprites;
|
|
63
|
+
private createSprite;
|
|
64
|
+
private setupEventListeners;
|
|
65
|
+
render(renderer: THREE.WebGLRenderer): void;
|
|
66
|
+
handleClick(event: PointerEvent): boolean;
|
|
67
|
+
private prepareAnimationData;
|
|
68
|
+
private startControlsAnimation;
|
|
69
|
+
update(delta: number): void;
|
|
70
|
+
setLabels(labelX?: string, labelY?: string, labelZ?: string): void;
|
|
71
|
+
private updateLabels;
|
|
72
|
+
dispose(): void;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
export { ViewHelper, type ViewHelperCameraController, type ViewHelperEvent, type ViewHelperOptions };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|