three-stdlib 2.25.1 → 2.26.0
Sign up to get free protection for your applications and to get access to all the features.
- package/controls/OrbitControls.d.ts +1 -0
- package/index.cjs +92 -28
- package/index.js +92 -28
- package/package.json +1 -1
package/index.cjs
CHANGED
@@ -890,7 +890,7 @@ const Visible = 0;
|
|
890
890
|
const Deleted = 1;
|
891
891
|
const _v1$5 = /* @__PURE__ */ new THREE.Vector3();
|
892
892
|
const _line3 = /* @__PURE__ */ new THREE.Line3();
|
893
|
-
const _plane$
|
893
|
+
const _plane$2 = /* @__PURE__ */ new THREE.Plane();
|
894
894
|
const _closestPoint$1 = /* @__PURE__ */ new THREE.Vector3();
|
895
895
|
const _triangle = /* @__PURE__ */ new THREE.Triangle();
|
896
896
|
class ConvexHull {
|
@@ -1127,11 +1127,11 @@ class ConvexHull {
|
|
1127
1127
|
}
|
1128
1128
|
}
|
1129
1129
|
maxDistance = -1;
|
1130
|
-
_plane$
|
1130
|
+
_plane$2.setFromCoplanarPoints(v0.point, v12.point, v2.point);
|
1131
1131
|
for (let i2 = 0, l = this.vertices.length; i2 < l; i2++) {
|
1132
1132
|
const vertex = vertices[i2];
|
1133
1133
|
if (vertex !== v0 && vertex !== v12 && vertex !== v2) {
|
1134
|
-
const distance = Math.abs(_plane$
|
1134
|
+
const distance = Math.abs(_plane$2.distanceToPoint(vertex.point));
|
1135
1135
|
if (distance > maxDistance) {
|
1136
1136
|
maxDistance = distance;
|
1137
1137
|
v3 = vertex;
|
@@ -1139,7 +1139,7 @@ class ConvexHull {
|
|
1139
1139
|
}
|
1140
1140
|
}
|
1141
1141
|
const faces = [];
|
1142
|
-
if (_plane$
|
1142
|
+
if (_plane$2.distanceToPoint(v3.point) < 0) {
|
1143
1143
|
faces.push(Face$1.create(v0, v12, v2), Face$1.create(v3, v12, v0), Face$1.create(v3, v2, v12), Face$1.create(v3, v0, v2));
|
1144
1144
|
for (let i2 = 0; i2 < 3; i2++) {
|
1145
1145
|
const j = (i2 + 1) % 3;
|
@@ -21468,7 +21468,7 @@ class ImprovedNoise {
|
|
21468
21468
|
}
|
21469
21469
|
const _v1$2 = /* @__PURE__ */ new THREE.Vector3();
|
21470
21470
|
const _v2$2 = /* @__PURE__ */ new THREE.Vector3();
|
21471
|
-
const _plane = /* @__PURE__ */ new THREE.Plane();
|
21471
|
+
const _plane$1 = /* @__PURE__ */ new THREE.Plane();
|
21472
21472
|
const _line1 = /* @__PURE__ */ new THREE.Line3();
|
21473
21473
|
const _line2 = /* @__PURE__ */ new THREE.Line3();
|
21474
21474
|
const _sphere$1 = /* @__PURE__ */ new THREE.Sphere();
|
@@ -21555,16 +21555,16 @@ class Octree {
|
|
21555
21555
|
return triangles;
|
21556
21556
|
}
|
21557
21557
|
triangleCapsuleIntersect(capsule, triangle) {
|
21558
|
-
triangle.getPlane(_plane);
|
21559
|
-
const d1 = _plane.distanceToPoint(capsule.start) - capsule.radius;
|
21560
|
-
const d2 = _plane.distanceToPoint(capsule.end) - capsule.radius;
|
21558
|
+
triangle.getPlane(_plane$1);
|
21559
|
+
const d1 = _plane$1.distanceToPoint(capsule.start) - capsule.radius;
|
21560
|
+
const d2 = _plane$1.distanceToPoint(capsule.end) - capsule.radius;
|
21561
21561
|
if (d1 > 0 && d2 > 0 || d1 < -capsule.radius && d2 < -capsule.radius) {
|
21562
21562
|
return false;
|
21563
21563
|
}
|
21564
21564
|
const delta = Math.abs(d1 / (Math.abs(d1) + Math.abs(d2)));
|
21565
21565
|
const intersectPoint = _v1$2.copy(capsule.start).lerp(capsule.end, delta);
|
21566
21566
|
if (triangle.containsPoint(intersectPoint)) {
|
21567
|
-
return { normal: _plane.normal.clone(), point: intersectPoint.clone(), depth: Math.abs(Math.min(d1, d2)) };
|
21567
|
+
return { normal: _plane$1.normal.clone(), point: intersectPoint.clone(), depth: Math.abs(Math.min(d1, d2)) };
|
21568
21568
|
}
|
21569
21569
|
const r2 = capsule.radius * capsule.radius;
|
21570
21570
|
const line1 = _line1.set(capsule.start, capsule.end);
|
@@ -21587,17 +21587,17 @@ class Octree {
|
|
21587
21587
|
return false;
|
21588
21588
|
}
|
21589
21589
|
triangleSphereIntersect(sphere, triangle) {
|
21590
|
-
triangle.getPlane(_plane);
|
21591
|
-
if (!sphere.intersectsPlane(_plane))
|
21590
|
+
triangle.getPlane(_plane$1);
|
21591
|
+
if (!sphere.intersectsPlane(_plane$1))
|
21592
21592
|
return false;
|
21593
|
-
const depth = Math.abs(_plane.distanceToSphere(sphere));
|
21593
|
+
const depth = Math.abs(_plane$1.distanceToSphere(sphere));
|
21594
21594
|
const r2 = sphere.radius * sphere.radius - depth * depth;
|
21595
|
-
const plainPoint = _plane.projectPoint(sphere.center, _v1$2);
|
21595
|
+
const plainPoint = _plane$1.projectPoint(sphere.center, _v1$2);
|
21596
21596
|
if (triangle.containsPoint(sphere.center)) {
|
21597
21597
|
return {
|
21598
|
-
normal: _plane.normal.clone(),
|
21598
|
+
normal: _plane$1.normal.clone(),
|
21599
21599
|
point: plainPoint.clone(),
|
21600
|
-
depth: Math.abs(_plane.distanceToSphere(sphere))
|
21600
|
+
depth: Math.abs(_plane$1.distanceToSphere(sphere))
|
21601
21601
|
};
|
21602
21602
|
}
|
21603
21603
|
const lines = [
|
@@ -24716,6 +24716,9 @@ class TrackballControls extends THREE.EventDispatcher {
|
|
24716
24716
|
this.update();
|
24717
24717
|
}
|
24718
24718
|
}
|
24719
|
+
const _ray$2 = /* @__PURE__ */ new THREE.Ray();
|
24720
|
+
const _plane = /* @__PURE__ */ new THREE.Plane();
|
24721
|
+
const TILT_LIMIT = Math.cos(70 * THREE.MathUtils.DEG2RAD);
|
24719
24722
|
const moduloWrapAround = (offset, capacity) => (offset % capacity + capacity) % capacity;
|
24720
24723
|
class OrbitControls extends THREE.EventDispatcher {
|
24721
24724
|
constructor(object, domElement) {
|
@@ -24762,6 +24765,7 @@ class OrbitControls extends THREE.EventDispatcher {
|
|
24762
24765
|
// if false, pan orthogonal to world-space direction camera.up
|
24763
24766
|
__publicField(this, "keyPanSpeed", 7);
|
24764
24767
|
// pixels moved per arrow key push
|
24768
|
+
__publicField(this, "zoomToCursor", false);
|
24765
24769
|
// Set to true to automatically rotate around the target
|
24766
24770
|
// If auto-rotate is enabled, you must call controls.update() in your animation loop
|
24767
24771
|
__publicField(this, "autoRotate", false);
|
@@ -24910,13 +24914,16 @@ class OrbitControls extends THREE.EventDispatcher {
|
|
24910
24914
|
}
|
24911
24915
|
spherical.phi = Math.max(scope.minPolarAngle, Math.min(scope.maxPolarAngle, spherical.phi));
|
24912
24916
|
spherical.makeSafe();
|
24913
|
-
spherical.radius *= scale;
|
24914
|
-
spherical.radius = Math.max(scope.minDistance, Math.min(scope.maxDistance, spherical.radius));
|
24915
24917
|
if (scope.enableDamping === true) {
|
24916
24918
|
scope.target.addScaledVector(panOffset, scope.dampingFactor);
|
24917
24919
|
} else {
|
24918
24920
|
scope.target.add(panOffset);
|
24919
24921
|
}
|
24922
|
+
if (scope.zoomToCursor && performCursorZoom || scope.object.isOrthographicCamera) {
|
24923
|
+
spherical.radius = clampDistance(spherical.radius);
|
24924
|
+
} else {
|
24925
|
+
spherical.radius = clampDistance(spherical.radius * scale);
|
24926
|
+
}
|
24920
24927
|
offset.setFromSpherical(spherical);
|
24921
24928
|
offset.applyQuaternion(quatInverse);
|
24922
24929
|
position.copy(scope.target).add(offset);
|
@@ -24929,7 +24936,51 @@ class OrbitControls extends THREE.EventDispatcher {
|
|
24929
24936
|
sphericalDelta.set(0, 0, 0);
|
24930
24937
|
panOffset.set(0, 0, 0);
|
24931
24938
|
}
|
24939
|
+
let zoomChanged = false;
|
24940
|
+
if (scope.zoomToCursor && performCursorZoom) {
|
24941
|
+
let newRadius = null;
|
24942
|
+
if (scope.object instanceof THREE.PerspectiveCamera && scope.object.isPerspectiveCamera) {
|
24943
|
+
const prevRadius = offset.length();
|
24944
|
+
newRadius = clampDistance(prevRadius * scale);
|
24945
|
+
const radiusDelta = prevRadius - newRadius;
|
24946
|
+
scope.object.position.addScaledVector(dollyDirection, radiusDelta);
|
24947
|
+
scope.object.updateMatrixWorld();
|
24948
|
+
} else if (scope.object.isOrthographicCamera) {
|
24949
|
+
const mouseBefore = new THREE.Vector3(mouse.x, mouse.y, 0);
|
24950
|
+
mouseBefore.unproject(scope.object);
|
24951
|
+
scope.object.zoom = Math.max(scope.minZoom, Math.min(scope.maxZoom, scope.object.zoom / scale));
|
24952
|
+
scope.object.updateProjectionMatrix();
|
24953
|
+
zoomChanged = true;
|
24954
|
+
const mouseAfter = new THREE.Vector3(mouse.x, mouse.y, 0);
|
24955
|
+
mouseAfter.unproject(scope.object);
|
24956
|
+
scope.object.position.sub(mouseAfter).add(mouseBefore);
|
24957
|
+
scope.object.updateMatrixWorld();
|
24958
|
+
newRadius = offset.length();
|
24959
|
+
} else {
|
24960
|
+
console.warn("WARNING: OrbitControls.js encountered an unknown camera type - zoom to cursor disabled.");
|
24961
|
+
scope.zoomToCursor = false;
|
24962
|
+
}
|
24963
|
+
if (newRadius !== null) {
|
24964
|
+
if (scope.screenSpacePanning) {
|
24965
|
+
scope.target.set(0, 0, -1).transformDirection(scope.object.matrix).multiplyScalar(newRadius).add(scope.object.position);
|
24966
|
+
} else {
|
24967
|
+
_ray$2.origin.copy(scope.object.position);
|
24968
|
+
_ray$2.direction.set(0, 0, -1).transformDirection(scope.object.matrix);
|
24969
|
+
if (Math.abs(scope.object.up.dot(_ray$2.direction)) < TILT_LIMIT) {
|
24970
|
+
object.lookAt(scope.target);
|
24971
|
+
} else {
|
24972
|
+
_plane.setFromNormalAndCoplanarPoint(scope.object.up, scope.target);
|
24973
|
+
_ray$2.intersectPlane(_plane, scope.target);
|
24974
|
+
}
|
24975
|
+
}
|
24976
|
+
}
|
24977
|
+
} else if (scope.object instanceof THREE.OrthographicCamera && scope.object.isOrthographicCamera) {
|
24978
|
+
scope.object.zoom = Math.max(scope.minZoom, Math.min(scope.maxZoom, scope.object.zoom / scale));
|
24979
|
+
scope.object.updateProjectionMatrix();
|
24980
|
+
zoomChanged = true;
|
24981
|
+
}
|
24932
24982
|
scale = 1;
|
24983
|
+
performCursorZoom = false;
|
24933
24984
|
if (zoomChanged || lastPosition.distanceToSquared(scope.object.position) > EPS2 || 8 * (1 - lastQuaternion.dot(scope.object.quaternion)) > EPS2) {
|
24934
24985
|
scope.dispatchEvent(changeEvent);
|
24935
24986
|
lastPosition.copy(scope.object.position);
|
@@ -24985,7 +25036,6 @@ class OrbitControls extends THREE.EventDispatcher {
|
|
24985
25036
|
const sphericalDelta = new THREE.Spherical();
|
24986
25037
|
let scale = 1;
|
24987
25038
|
const panOffset = new THREE.Vector3();
|
24988
|
-
let zoomChanged = false;
|
24989
25039
|
const rotateStart = new THREE.Vector2();
|
24990
25040
|
const rotateEnd = new THREE.Vector2();
|
24991
25041
|
const rotateDelta = new THREE.Vector2();
|
@@ -24995,6 +25045,9 @@ class OrbitControls extends THREE.EventDispatcher {
|
|
24995
25045
|
const dollyStart = new THREE.Vector2();
|
24996
25046
|
const dollyEnd = new THREE.Vector2();
|
24997
25047
|
const dollyDelta = new THREE.Vector2();
|
25048
|
+
const dollyDirection = new THREE.Vector3();
|
25049
|
+
const mouse = new THREE.Vector2();
|
25050
|
+
let performCursorZoom = false;
|
24998
25051
|
const pointers = [];
|
24999
25052
|
const pointerPositions = {};
|
25000
25053
|
function getAutoRotationAngle() {
|
@@ -25065,33 +25118,43 @@ class OrbitControls extends THREE.EventDispatcher {
|
|
25065
25118
|
};
|
25066
25119
|
})();
|
25067
25120
|
function dollyOut(dollyScale) {
|
25068
|
-
if (scope.object instanceof THREE.PerspectiveCamera && scope.object.isPerspectiveCamera) {
|
25121
|
+
if (scope.object instanceof THREE.PerspectiveCamera && scope.object.isPerspectiveCamera || scope.object instanceof THREE.OrthographicCamera && scope.object.isOrthographicCamera) {
|
25069
25122
|
scale /= dollyScale;
|
25070
|
-
} else if (scope.object instanceof THREE.OrthographicCamera && scope.object.isOrthographicCamera) {
|
25071
|
-
scope.object.zoom = Math.max(scope.minZoom, Math.min(scope.maxZoom, scope.object.zoom * dollyScale));
|
25072
|
-
scope.object.updateProjectionMatrix();
|
25073
|
-
zoomChanged = true;
|
25074
25123
|
} else {
|
25075
25124
|
console.warn("WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled.");
|
25076
25125
|
scope.enableZoom = false;
|
25077
25126
|
}
|
25078
25127
|
}
|
25079
25128
|
function dollyIn(dollyScale) {
|
25080
|
-
if (scope.object instanceof THREE.PerspectiveCamera && scope.object.isPerspectiveCamera) {
|
25129
|
+
if (scope.object instanceof THREE.PerspectiveCamera && scope.object.isPerspectiveCamera || scope.object instanceof THREE.OrthographicCamera && scope.object.isOrthographicCamera) {
|
25081
25130
|
scale *= dollyScale;
|
25082
|
-
} else if (scope.object instanceof THREE.OrthographicCamera && scope.object.isOrthographicCamera) {
|
25083
|
-
scope.object.zoom = Math.max(scope.minZoom, Math.min(scope.maxZoom, scope.object.zoom / dollyScale));
|
25084
|
-
scope.object.updateProjectionMatrix();
|
25085
|
-
zoomChanged = true;
|
25086
25131
|
} else {
|
25087
25132
|
console.warn("WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled.");
|
25088
25133
|
scope.enableZoom = false;
|
25089
25134
|
}
|
25090
25135
|
}
|
25136
|
+
function updateMouseParameters(event) {
|
25137
|
+
if (!scope.zoomToCursor || !scope.domElement) {
|
25138
|
+
return;
|
25139
|
+
}
|
25140
|
+
performCursorZoom = true;
|
25141
|
+
const rect = scope.domElement.getBoundingClientRect();
|
25142
|
+
const x = event.clientX - rect.left;
|
25143
|
+
const y = event.clientY - rect.top;
|
25144
|
+
const w = rect.width;
|
25145
|
+
const h = rect.height;
|
25146
|
+
mouse.x = x / w * 2 - 1;
|
25147
|
+
mouse.y = -(y / h) * 2 + 1;
|
25148
|
+
dollyDirection.set(mouse.x, mouse.y, 1).unproject(scope.object).sub(scope.object.position).normalize();
|
25149
|
+
}
|
25150
|
+
function clampDistance(dist) {
|
25151
|
+
return Math.max(scope.minDistance, Math.min(scope.maxDistance, dist));
|
25152
|
+
}
|
25091
25153
|
function handleMouseDownRotate(event) {
|
25092
25154
|
rotateStart.set(event.clientX, event.clientY);
|
25093
25155
|
}
|
25094
25156
|
function handleMouseDownDolly(event) {
|
25157
|
+
updateMouseParameters(event);
|
25095
25158
|
dollyStart.set(event.clientX, event.clientY);
|
25096
25159
|
}
|
25097
25160
|
function handleMouseDownPan(event) {
|
@@ -25127,6 +25190,7 @@ class OrbitControls extends THREE.EventDispatcher {
|
|
25127
25190
|
scope.update();
|
25128
25191
|
}
|
25129
25192
|
function handleMouseWheel(event) {
|
25193
|
+
updateMouseParameters(event);
|
25130
25194
|
if (event.deltaY < 0) {
|
25131
25195
|
dollyIn(getZoomScale());
|
25132
25196
|
} else if (event.deltaY > 0) {
|
package/index.js
CHANGED
@@ -872,7 +872,7 @@ const Visible = 0;
|
|
872
872
|
const Deleted = 1;
|
873
873
|
const _v1$5 = /* @__PURE__ */ new Vector3();
|
874
874
|
const _line3 = /* @__PURE__ */ new Line3();
|
875
|
-
const _plane$
|
875
|
+
const _plane$2 = /* @__PURE__ */ new Plane();
|
876
876
|
const _closestPoint$1 = /* @__PURE__ */ new Vector3();
|
877
877
|
const _triangle = /* @__PURE__ */ new Triangle$1();
|
878
878
|
class ConvexHull {
|
@@ -1109,11 +1109,11 @@ class ConvexHull {
|
|
1109
1109
|
}
|
1110
1110
|
}
|
1111
1111
|
maxDistance = -1;
|
1112
|
-
_plane$
|
1112
|
+
_plane$2.setFromCoplanarPoints(v0.point, v12.point, v2.point);
|
1113
1113
|
for (let i2 = 0, l = this.vertices.length; i2 < l; i2++) {
|
1114
1114
|
const vertex = vertices[i2];
|
1115
1115
|
if (vertex !== v0 && vertex !== v12 && vertex !== v2) {
|
1116
|
-
const distance = Math.abs(_plane$
|
1116
|
+
const distance = Math.abs(_plane$2.distanceToPoint(vertex.point));
|
1117
1117
|
if (distance > maxDistance) {
|
1118
1118
|
maxDistance = distance;
|
1119
1119
|
v3 = vertex;
|
@@ -1121,7 +1121,7 @@ class ConvexHull {
|
|
1121
1121
|
}
|
1122
1122
|
}
|
1123
1123
|
const faces = [];
|
1124
|
-
if (_plane$
|
1124
|
+
if (_plane$2.distanceToPoint(v3.point) < 0) {
|
1125
1125
|
faces.push(Face$1.create(v0, v12, v2), Face$1.create(v3, v12, v0), Face$1.create(v3, v2, v12), Face$1.create(v3, v0, v2));
|
1126
1126
|
for (let i2 = 0; i2 < 3; i2++) {
|
1127
1127
|
const j = (i2 + 1) % 3;
|
@@ -21450,7 +21450,7 @@ class ImprovedNoise {
|
|
21450
21450
|
}
|
21451
21451
|
const _v1$2 = /* @__PURE__ */ new Vector3();
|
21452
21452
|
const _v2$2 = /* @__PURE__ */ new Vector3();
|
21453
|
-
const _plane = /* @__PURE__ */ new Plane();
|
21453
|
+
const _plane$1 = /* @__PURE__ */ new Plane();
|
21454
21454
|
const _line1 = /* @__PURE__ */ new Line3();
|
21455
21455
|
const _line2 = /* @__PURE__ */ new Line3();
|
21456
21456
|
const _sphere$1 = /* @__PURE__ */ new Sphere();
|
@@ -21537,16 +21537,16 @@ class Octree {
|
|
21537
21537
|
return triangles;
|
21538
21538
|
}
|
21539
21539
|
triangleCapsuleIntersect(capsule, triangle) {
|
21540
|
-
triangle.getPlane(_plane);
|
21541
|
-
const d1 = _plane.distanceToPoint(capsule.start) - capsule.radius;
|
21542
|
-
const d2 = _plane.distanceToPoint(capsule.end) - capsule.radius;
|
21540
|
+
triangle.getPlane(_plane$1);
|
21541
|
+
const d1 = _plane$1.distanceToPoint(capsule.start) - capsule.radius;
|
21542
|
+
const d2 = _plane$1.distanceToPoint(capsule.end) - capsule.radius;
|
21543
21543
|
if (d1 > 0 && d2 > 0 || d1 < -capsule.radius && d2 < -capsule.radius) {
|
21544
21544
|
return false;
|
21545
21545
|
}
|
21546
21546
|
const delta = Math.abs(d1 / (Math.abs(d1) + Math.abs(d2)));
|
21547
21547
|
const intersectPoint = _v1$2.copy(capsule.start).lerp(capsule.end, delta);
|
21548
21548
|
if (triangle.containsPoint(intersectPoint)) {
|
21549
|
-
return { normal: _plane.normal.clone(), point: intersectPoint.clone(), depth: Math.abs(Math.min(d1, d2)) };
|
21549
|
+
return { normal: _plane$1.normal.clone(), point: intersectPoint.clone(), depth: Math.abs(Math.min(d1, d2)) };
|
21550
21550
|
}
|
21551
21551
|
const r2 = capsule.radius * capsule.radius;
|
21552
21552
|
const line1 = _line1.set(capsule.start, capsule.end);
|
@@ -21569,17 +21569,17 @@ class Octree {
|
|
21569
21569
|
return false;
|
21570
21570
|
}
|
21571
21571
|
triangleSphereIntersect(sphere, triangle) {
|
21572
|
-
triangle.getPlane(_plane);
|
21573
|
-
if (!sphere.intersectsPlane(_plane))
|
21572
|
+
triangle.getPlane(_plane$1);
|
21573
|
+
if (!sphere.intersectsPlane(_plane$1))
|
21574
21574
|
return false;
|
21575
|
-
const depth = Math.abs(_plane.distanceToSphere(sphere));
|
21575
|
+
const depth = Math.abs(_plane$1.distanceToSphere(sphere));
|
21576
21576
|
const r2 = sphere.radius * sphere.radius - depth * depth;
|
21577
|
-
const plainPoint = _plane.projectPoint(sphere.center, _v1$2);
|
21577
|
+
const plainPoint = _plane$1.projectPoint(sphere.center, _v1$2);
|
21578
21578
|
if (triangle.containsPoint(sphere.center)) {
|
21579
21579
|
return {
|
21580
|
-
normal: _plane.normal.clone(),
|
21580
|
+
normal: _plane$1.normal.clone(),
|
21581
21581
|
point: plainPoint.clone(),
|
21582
|
-
depth: Math.abs(_plane.distanceToSphere(sphere))
|
21582
|
+
depth: Math.abs(_plane$1.distanceToSphere(sphere))
|
21583
21583
|
};
|
21584
21584
|
}
|
21585
21585
|
const lines = [
|
@@ -24698,6 +24698,9 @@ class TrackballControls extends EventDispatcher {
|
|
24698
24698
|
this.update();
|
24699
24699
|
}
|
24700
24700
|
}
|
24701
|
+
const _ray$2 = /* @__PURE__ */ new Ray();
|
24702
|
+
const _plane = /* @__PURE__ */ new Plane();
|
24703
|
+
const TILT_LIMIT = Math.cos(70 * MathUtils.DEG2RAD);
|
24701
24704
|
const moduloWrapAround = (offset, capacity) => (offset % capacity + capacity) % capacity;
|
24702
24705
|
class OrbitControls extends EventDispatcher {
|
24703
24706
|
constructor(object, domElement) {
|
@@ -24744,6 +24747,7 @@ class OrbitControls extends EventDispatcher {
|
|
24744
24747
|
// if false, pan orthogonal to world-space direction camera.up
|
24745
24748
|
__publicField(this, "keyPanSpeed", 7);
|
24746
24749
|
// pixels moved per arrow key push
|
24750
|
+
__publicField(this, "zoomToCursor", false);
|
24747
24751
|
// Set to true to automatically rotate around the target
|
24748
24752
|
// If auto-rotate is enabled, you must call controls.update() in your animation loop
|
24749
24753
|
__publicField(this, "autoRotate", false);
|
@@ -24892,13 +24896,16 @@ class OrbitControls extends EventDispatcher {
|
|
24892
24896
|
}
|
24893
24897
|
spherical.phi = Math.max(scope.minPolarAngle, Math.min(scope.maxPolarAngle, spherical.phi));
|
24894
24898
|
spherical.makeSafe();
|
24895
|
-
spherical.radius *= scale;
|
24896
|
-
spherical.radius = Math.max(scope.minDistance, Math.min(scope.maxDistance, spherical.radius));
|
24897
24899
|
if (scope.enableDamping === true) {
|
24898
24900
|
scope.target.addScaledVector(panOffset, scope.dampingFactor);
|
24899
24901
|
} else {
|
24900
24902
|
scope.target.add(panOffset);
|
24901
24903
|
}
|
24904
|
+
if (scope.zoomToCursor && performCursorZoom || scope.object.isOrthographicCamera) {
|
24905
|
+
spherical.radius = clampDistance(spherical.radius);
|
24906
|
+
} else {
|
24907
|
+
spherical.radius = clampDistance(spherical.radius * scale);
|
24908
|
+
}
|
24902
24909
|
offset.setFromSpherical(spherical);
|
24903
24910
|
offset.applyQuaternion(quatInverse);
|
24904
24911
|
position.copy(scope.target).add(offset);
|
@@ -24911,7 +24918,51 @@ class OrbitControls extends EventDispatcher {
|
|
24911
24918
|
sphericalDelta.set(0, 0, 0);
|
24912
24919
|
panOffset.set(0, 0, 0);
|
24913
24920
|
}
|
24921
|
+
let zoomChanged = false;
|
24922
|
+
if (scope.zoomToCursor && performCursorZoom) {
|
24923
|
+
let newRadius = null;
|
24924
|
+
if (scope.object instanceof PerspectiveCamera && scope.object.isPerspectiveCamera) {
|
24925
|
+
const prevRadius = offset.length();
|
24926
|
+
newRadius = clampDistance(prevRadius * scale);
|
24927
|
+
const radiusDelta = prevRadius - newRadius;
|
24928
|
+
scope.object.position.addScaledVector(dollyDirection, radiusDelta);
|
24929
|
+
scope.object.updateMatrixWorld();
|
24930
|
+
} else if (scope.object.isOrthographicCamera) {
|
24931
|
+
const mouseBefore = new Vector3(mouse.x, mouse.y, 0);
|
24932
|
+
mouseBefore.unproject(scope.object);
|
24933
|
+
scope.object.zoom = Math.max(scope.minZoom, Math.min(scope.maxZoom, scope.object.zoom / scale));
|
24934
|
+
scope.object.updateProjectionMatrix();
|
24935
|
+
zoomChanged = true;
|
24936
|
+
const mouseAfter = new Vector3(mouse.x, mouse.y, 0);
|
24937
|
+
mouseAfter.unproject(scope.object);
|
24938
|
+
scope.object.position.sub(mouseAfter).add(mouseBefore);
|
24939
|
+
scope.object.updateMatrixWorld();
|
24940
|
+
newRadius = offset.length();
|
24941
|
+
} else {
|
24942
|
+
console.warn("WARNING: OrbitControls.js encountered an unknown camera type - zoom to cursor disabled.");
|
24943
|
+
scope.zoomToCursor = false;
|
24944
|
+
}
|
24945
|
+
if (newRadius !== null) {
|
24946
|
+
if (scope.screenSpacePanning) {
|
24947
|
+
scope.target.set(0, 0, -1).transformDirection(scope.object.matrix).multiplyScalar(newRadius).add(scope.object.position);
|
24948
|
+
} else {
|
24949
|
+
_ray$2.origin.copy(scope.object.position);
|
24950
|
+
_ray$2.direction.set(0, 0, -1).transformDirection(scope.object.matrix);
|
24951
|
+
if (Math.abs(scope.object.up.dot(_ray$2.direction)) < TILT_LIMIT) {
|
24952
|
+
object.lookAt(scope.target);
|
24953
|
+
} else {
|
24954
|
+
_plane.setFromNormalAndCoplanarPoint(scope.object.up, scope.target);
|
24955
|
+
_ray$2.intersectPlane(_plane, scope.target);
|
24956
|
+
}
|
24957
|
+
}
|
24958
|
+
}
|
24959
|
+
} else if (scope.object instanceof OrthographicCamera && scope.object.isOrthographicCamera) {
|
24960
|
+
scope.object.zoom = Math.max(scope.minZoom, Math.min(scope.maxZoom, scope.object.zoom / scale));
|
24961
|
+
scope.object.updateProjectionMatrix();
|
24962
|
+
zoomChanged = true;
|
24963
|
+
}
|
24914
24964
|
scale = 1;
|
24965
|
+
performCursorZoom = false;
|
24915
24966
|
if (zoomChanged || lastPosition.distanceToSquared(scope.object.position) > EPS2 || 8 * (1 - lastQuaternion.dot(scope.object.quaternion)) > EPS2) {
|
24916
24967
|
scope.dispatchEvent(changeEvent);
|
24917
24968
|
lastPosition.copy(scope.object.position);
|
@@ -24967,7 +25018,6 @@ class OrbitControls extends EventDispatcher {
|
|
24967
25018
|
const sphericalDelta = new Spherical();
|
24968
25019
|
let scale = 1;
|
24969
25020
|
const panOffset = new Vector3();
|
24970
|
-
let zoomChanged = false;
|
24971
25021
|
const rotateStart = new Vector2();
|
24972
25022
|
const rotateEnd = new Vector2();
|
24973
25023
|
const rotateDelta = new Vector2();
|
@@ -24977,6 +25027,9 @@ class OrbitControls extends EventDispatcher {
|
|
24977
25027
|
const dollyStart = new Vector2();
|
24978
25028
|
const dollyEnd = new Vector2();
|
24979
25029
|
const dollyDelta = new Vector2();
|
25030
|
+
const dollyDirection = new Vector3();
|
25031
|
+
const mouse = new Vector2();
|
25032
|
+
let performCursorZoom = false;
|
24980
25033
|
const pointers = [];
|
24981
25034
|
const pointerPositions = {};
|
24982
25035
|
function getAutoRotationAngle() {
|
@@ -25047,33 +25100,43 @@ class OrbitControls extends EventDispatcher {
|
|
25047
25100
|
};
|
25048
25101
|
})();
|
25049
25102
|
function dollyOut(dollyScale) {
|
25050
|
-
if (scope.object instanceof PerspectiveCamera && scope.object.isPerspectiveCamera) {
|
25103
|
+
if (scope.object instanceof PerspectiveCamera && scope.object.isPerspectiveCamera || scope.object instanceof OrthographicCamera && scope.object.isOrthographicCamera) {
|
25051
25104
|
scale /= dollyScale;
|
25052
|
-
} else if (scope.object instanceof OrthographicCamera && scope.object.isOrthographicCamera) {
|
25053
|
-
scope.object.zoom = Math.max(scope.minZoom, Math.min(scope.maxZoom, scope.object.zoom * dollyScale));
|
25054
|
-
scope.object.updateProjectionMatrix();
|
25055
|
-
zoomChanged = true;
|
25056
25105
|
} else {
|
25057
25106
|
console.warn("WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled.");
|
25058
25107
|
scope.enableZoom = false;
|
25059
25108
|
}
|
25060
25109
|
}
|
25061
25110
|
function dollyIn(dollyScale) {
|
25062
|
-
if (scope.object instanceof PerspectiveCamera && scope.object.isPerspectiveCamera) {
|
25111
|
+
if (scope.object instanceof PerspectiveCamera && scope.object.isPerspectiveCamera || scope.object instanceof OrthographicCamera && scope.object.isOrthographicCamera) {
|
25063
25112
|
scale *= dollyScale;
|
25064
|
-
} else if (scope.object instanceof OrthographicCamera && scope.object.isOrthographicCamera) {
|
25065
|
-
scope.object.zoom = Math.max(scope.minZoom, Math.min(scope.maxZoom, scope.object.zoom / dollyScale));
|
25066
|
-
scope.object.updateProjectionMatrix();
|
25067
|
-
zoomChanged = true;
|
25068
25113
|
} else {
|
25069
25114
|
console.warn("WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled.");
|
25070
25115
|
scope.enableZoom = false;
|
25071
25116
|
}
|
25072
25117
|
}
|
25118
|
+
function updateMouseParameters(event) {
|
25119
|
+
if (!scope.zoomToCursor || !scope.domElement) {
|
25120
|
+
return;
|
25121
|
+
}
|
25122
|
+
performCursorZoom = true;
|
25123
|
+
const rect = scope.domElement.getBoundingClientRect();
|
25124
|
+
const x = event.clientX - rect.left;
|
25125
|
+
const y = event.clientY - rect.top;
|
25126
|
+
const w = rect.width;
|
25127
|
+
const h = rect.height;
|
25128
|
+
mouse.x = x / w * 2 - 1;
|
25129
|
+
mouse.y = -(y / h) * 2 + 1;
|
25130
|
+
dollyDirection.set(mouse.x, mouse.y, 1).unproject(scope.object).sub(scope.object.position).normalize();
|
25131
|
+
}
|
25132
|
+
function clampDistance(dist) {
|
25133
|
+
return Math.max(scope.minDistance, Math.min(scope.maxDistance, dist));
|
25134
|
+
}
|
25073
25135
|
function handleMouseDownRotate(event) {
|
25074
25136
|
rotateStart.set(event.clientX, event.clientY);
|
25075
25137
|
}
|
25076
25138
|
function handleMouseDownDolly(event) {
|
25139
|
+
updateMouseParameters(event);
|
25077
25140
|
dollyStart.set(event.clientX, event.clientY);
|
25078
25141
|
}
|
25079
25142
|
function handleMouseDownPan(event) {
|
@@ -25109,6 +25172,7 @@ class OrbitControls extends EventDispatcher {
|
|
25109
25172
|
scope.update();
|
25110
25173
|
}
|
25111
25174
|
function handleMouseWheel(event) {
|
25175
|
+
updateMouseParameters(event);
|
25112
25176
|
if (event.deltaY < 0) {
|
25113
25177
|
dollyIn(getZoomScale());
|
25114
25178
|
} else if (event.deltaY > 0) {
|