@cocorof/graphier 1.4.3 → 1.4.4

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/dist/index.js CHANGED
@@ -2229,6 +2229,7 @@ function createScene(container, backgroundColor, style, rendererConfig) {
2229
2229
  controls.zoomSpeed = 1.2;
2230
2230
  controls.minDistance = 10;
2231
2231
  controls.maxDistance = 3e4;
2232
+ controls.screenSpacePanning = true;
2232
2233
  scene.add(new THREE.AmbientLight(16777215, 0.8));
2233
2234
  const stars = createStarField(4e3, 8e3);
2234
2235
  stars.visible = style.starField;
@@ -2242,26 +2243,34 @@ function createScene(container, backgroundColor, style, rendererConfig) {
2242
2243
  controls.enableZoom = false;
2243
2244
  const flags = {
2244
2245
  is2D: false,
2245
- keyboardMode3D: cameraMode
2246
+ keyboardMode3D: cameraMode,
2247
+ rotateButton: null
2246
2248
  };
2247
- const _wheelDir = new THREE.Vector3();
2249
+ const _wheelOffset = new THREE.Vector3();
2248
2250
  const onWheel = (e) => {
2249
2251
  if (flags.is2D) return;
2250
2252
  e.preventDefault();
2251
2253
  let delta = -e.deltaY;
2252
2254
  if (e.deltaMode === 1) delta *= 40;
2253
2255
  if (e.deltaMode === 2) delta *= 800;
2254
- camera.getWorldDirection(_wheelDir);
2255
- const dist = camera.position.distanceTo(controls.target);
2256
+ const target = controls.target;
2257
+ _wheelOffset.copy(camera.position).sub(target);
2258
+ const dist = _wheelOffset.length();
2256
2259
  const moveAmount = delta * 2e-3 * Math.max(dist * 0.1, 1);
2257
- camera.position.addScaledVector(_wheelDir, moveAmount);
2258
- controls.target.addScaledVector(_wheelDir, moveAmount);
2260
+ const newDist = Math.min(
2261
+ Math.max(dist - moveAmount, controls.minDistance),
2262
+ controls.maxDistance
2263
+ );
2264
+ _wheelOffset.setLength(newDist);
2265
+ camera.position.copy(target).add(_wheelOffset);
2259
2266
  };
2260
2267
  canvas.addEventListener("wheel", onWheel, { passive: false });
2268
+ const trackballCleanup = setupTrackballRotation(canvas, camera, controls, flags);
2261
2269
  const scrollCleanup = () => {
2262
2270
  canvas.removeEventListener("wheel", onWheel);
2263
2271
  canvas.removeEventListener("dragstart", onDragStart);
2264
2272
  canvas.removeEventListener("selectstart", onSelectStart);
2273
+ trackballCleanup();
2265
2274
  };
2266
2275
  return {
2267
2276
  scene,
@@ -2278,24 +2287,80 @@ function createScene(container, backgroundColor, style, rendererConfig) {
2278
2287
  flags
2279
2288
  };
2280
2289
  }
2281
- const MOUSE_ACTION = {
2282
- rotate: THREE.MOUSE.ROTATE,
2283
- pan: THREE.MOUSE.PAN
2284
- };
2290
+ const TRACKBALL_SPEED = 4e-3;
2291
+ function setupTrackballRotation(canvas, camera, controls, flags) {
2292
+ let rotating = false;
2293
+ let lastX = 0;
2294
+ let lastY = 0;
2295
+ const _offset2 = new THREE.Vector3();
2296
+ const _right2 = new THREE.Vector3();
2297
+ const _upAxis = new THREE.Vector3();
2298
+ const _q2 = new THREE.Quaternion();
2299
+ const _qPitch = new THREE.Quaternion();
2300
+ function onDown(e) {
2301
+ if (flags.rotateButton == null || e.button !== flags.rotateButton) return;
2302
+ rotating = true;
2303
+ lastX = e.clientX;
2304
+ lastY = e.clientY;
2305
+ try {
2306
+ canvas.setPointerCapture(e.pointerId);
2307
+ } catch {
2308
+ }
2309
+ }
2310
+ function onMove(e) {
2311
+ if (!rotating) return;
2312
+ const dx = e.clientX - lastX;
2313
+ const dy = e.clientY - lastY;
2314
+ lastX = e.clientX;
2315
+ lastY = e.clientY;
2316
+ if (!dx && !dy) return;
2317
+ const target = controls.target;
2318
+ _offset2.copy(camera.position).sub(target);
2319
+ _right2.setFromMatrixColumn(camera.matrix, 0);
2320
+ _upAxis.setFromMatrixColumn(camera.matrix, 1);
2321
+ _q2.setFromAxisAngle(_upAxis, -dx * TRACKBALL_SPEED);
2322
+ _qPitch.setFromAxisAngle(_right2, -dy * TRACKBALL_SPEED);
2323
+ _q2.multiply(_qPitch);
2324
+ _offset2.applyQuaternion(_q2);
2325
+ camera.up.applyQuaternion(_q2).normalize();
2326
+ camera.position.copy(target).add(_offset2);
2327
+ camera.lookAt(target);
2328
+ }
2329
+ function onUp(e) {
2330
+ if (!rotating) return;
2331
+ rotating = false;
2332
+ try {
2333
+ canvas.releasePointerCapture(e.pointerId);
2334
+ } catch {
2335
+ }
2336
+ }
2337
+ canvas.addEventListener("pointerdown", onDown);
2338
+ canvas.addEventListener("pointermove", onMove);
2339
+ canvas.addEventListener("pointerup", onUp);
2340
+ canvas.addEventListener("pointercancel", onUp);
2341
+ return () => {
2342
+ canvas.removeEventListener("pointerdown", onDown);
2343
+ canvas.removeEventListener("pointermove", onMove);
2344
+ canvas.removeEventListener("pointerup", onUp);
2345
+ canvas.removeEventListener("pointercancel", onUp);
2346
+ };
2347
+ }
2285
2348
  function applyNavigationMode(state, is2D, nav) {
2286
2349
  const { controls, camera, keyboard } = state;
2287
2350
  state.flags.is2D = is2D;
2288
2351
  const left = (nav == null ? void 0 : nav.leftButton) ?? (is2D ? "pan" : "rotate");
2289
2352
  const right = (nav == null ? void 0 : nav.rightButton) ?? (is2D ? "rotate" : "pan");
2353
+ const NONE = -1;
2290
2354
  controls.mouseButtons = {
2291
- LEFT: MOUSE_ACTION[left],
2355
+ LEFT: left === "pan" ? THREE.MOUSE.PAN : NONE,
2292
2356
  MIDDLE: THREE.MOUSE.DOLLY,
2293
- RIGHT: MOUSE_ACTION[right]
2357
+ RIGHT: right === "pan" ? THREE.MOUSE.PAN : NONE
2294
2358
  };
2295
- controls.enableRotate = left === "rotate" || right === "rotate";
2359
+ controls.enableRotate = false;
2360
+ state.flags.rotateButton = left === "rotate" ? 0 : right === "rotate" ? 2 : null;
2296
2361
  controls.touches = left === "pan" ? { ONE: THREE.TOUCH.PAN, TWO: THREE.TOUCH.DOLLY_PAN } : { ONE: THREE.TOUCH.ROTATE, TWO: THREE.TOUCH.DOLLY_PAN };
2297
2362
  controls.enableZoom = is2D;
2298
- controls.screenSpacePanning = is2D;
2363
+ controls.screenSpacePanning = true;
2299
2364
  const kb = (nav == null ? void 0 : nav.keyboard) ?? (is2D ? "pan" : state.flags.keyboardMode3D);
2300
2365
  if (kb === "off") {
2301
2366
  keyboard.setEnabled(false);
@@ -2631,6 +2696,7 @@ function animateCamera(camera, controls, targetPos, targetLookAt, duration) {
2631
2696
  function zoomToFitPositions(camera, controls, positions, duration, padding) {
2632
2697
  const count = positions.length / 3;
2633
2698
  if (count === 0) return;
2699
+ camera.up.set(0, 1, 0);
2634
2700
  let cx = 0, cy = 0, cz = 0;
2635
2701
  for (let i = 0; i < count; i++) {
2636
2702
  cx += positions[i * 3];
@@ -2875,8 +2941,8 @@ function setupInteraction(canvas, camera, controls, getNodesMesh, getNodes, call
2875
2941
  }
2876
2942
  }
2877
2943
  function onContextMenu2(e) {
2878
- if (!callbacks.onContextMenu) return;
2879
2944
  e.preventDefault();
2945
+ if (!callbacks.onContextMenu) return;
2880
2946
  const nodesMesh = getNodesMesh();
2881
2947
  if (!nodesMesh) return;
2882
2948
  const rect = canvas.getBoundingClientRect();