@math.gl/culling 3.6.0-alpha.1 → 3.6.0-alpha.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/es5/constants.js +1 -1
- package/dist/es5/index.js +12 -12
- package/dist/es5/lib/algorithms/bounding-box-from-points.js +123 -72
- package/dist/es5/lib/algorithms/bounding-box-from-points.js.map +1 -1
- package/dist/es5/lib/algorithms/bounding-sphere-from-points.js +109 -81
- package/dist/es5/lib/algorithms/bounding-sphere-from-points.js.map +1 -1
- package/dist/es5/lib/algorithms/compute-eigen-decomposition.js +37 -36
- package/dist/es5/lib/algorithms/compute-eigen-decomposition.js.map +1 -1
- package/dist/es5/lib/bounding-volumes/axis-aligned-bounding-box.js +75 -63
- package/dist/es5/lib/bounding-volumes/axis-aligned-bounding-box.js.map +1 -1
- package/dist/es5/lib/bounding-volumes/bounding-sphere.js +111 -90
- package/dist/es5/lib/bounding-volumes/bounding-sphere.js.map +1 -1
- package/dist/es5/lib/bounding-volumes/oriented-bounding-box.js +212 -187
- package/dist/es5/lib/bounding-volumes/oriented-bounding-box.js.map +1 -1
- package/dist/es5/lib/culling-volume.js +111 -74
- package/dist/es5/lib/culling-volume.js.map +1 -1
- package/dist/es5/lib/perspective-frustum.js +78 -57
- package/dist/es5/lib/perspective-frustum.js.map +1 -1
- package/dist/es5/lib/perspective-off-center-frustum.js +113 -98
- package/dist/es5/lib/perspective-off-center-frustum.js.map +1 -1
- package/dist/es5/lib/plane.js +70 -52
- package/dist/es5/lib/plane.js.map +1 -1
- package/dist/esm/lib/algorithms/bounding-sphere-from-points.js.map +1 -1
- package/dist/lib/algorithms/bounding-sphere-from-points.d.ts.map +1 -1
- package/dist/lib/algorithms/bounding-sphere-from-points.js +0 -2
- package/package.json +4 -4
- package/src/lib/algorithms/bounding-sphere-from-points.ts +0 -2
|
@@ -2,11 +2,17 @@
|
|
|
2
2
|
|
|
3
3
|
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
4
|
|
|
5
|
+
var _typeof = require("@babel/runtime/helpers/typeof");
|
|
6
|
+
|
|
5
7
|
Object.defineProperty(exports, "__esModule", {
|
|
6
8
|
value: true
|
|
7
9
|
});
|
|
8
10
|
exports.default = void 0;
|
|
9
11
|
|
|
12
|
+
var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
|
|
13
|
+
|
|
14
|
+
var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
|
|
15
|
+
|
|
10
16
|
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
|
11
17
|
|
|
12
18
|
var _core = require("@math.gl/core");
|
|
@@ -15,15 +21,18 @@ var mat4 = _interopRequireWildcard(require("gl-matrix/mat4"));
|
|
|
15
21
|
|
|
16
22
|
var _constants = require("../../constants");
|
|
17
23
|
|
|
18
|
-
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
|
|
24
|
+
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
|
|
19
25
|
|
|
20
|
-
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null ||
|
|
26
|
+
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
|
|
21
27
|
|
|
22
|
-
|
|
23
|
-
|
|
28
|
+
var scratchVector = new _core.Vector3();
|
|
29
|
+
var scratchVector2 = new _core.Vector3();
|
|
24
30
|
|
|
25
|
-
|
|
26
|
-
|
|
31
|
+
var BoundingSphere = function () {
|
|
32
|
+
function BoundingSphere() {
|
|
33
|
+
var center = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [0, 0, 0];
|
|
34
|
+
var radius = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0.0;
|
|
35
|
+
(0, _classCallCheck2.default)(this, BoundingSphere);
|
|
27
36
|
(0, _defineProperty2.default)(this, "center", void 0);
|
|
28
37
|
(0, _defineProperty2.default)(this, "radius", void 0);
|
|
29
38
|
this.radius = -0;
|
|
@@ -31,97 +40,109 @@ class BoundingSphere {
|
|
|
31
40
|
this.fromCenterRadius(center, radius);
|
|
32
41
|
}
|
|
33
42
|
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
fromCornerPoints(corner, oppositeCorner) {
|
|
41
|
-
oppositeCorner = scratchVector.from(oppositeCorner);
|
|
42
|
-
this.center = new _core.Vector3().from(corner).add(oppositeCorner).scale(0.5);
|
|
43
|
-
this.radius = this.center.distance(oppositeCorner);
|
|
44
|
-
return this;
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
equals(right) {
|
|
48
|
-
return this === right || Boolean(right) && this.center.equals(right.center) && this.radius === right.radius;
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
clone() {
|
|
52
|
-
return new BoundingSphere(this.center, this.radius);
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
union(boundingSphere) {
|
|
56
|
-
const leftCenter = this.center;
|
|
57
|
-
const leftRadius = this.radius;
|
|
58
|
-
const rightCenter = boundingSphere.center;
|
|
59
|
-
const rightRadius = boundingSphere.radius;
|
|
60
|
-
const toRightCenter = scratchVector.copy(rightCenter).subtract(leftCenter);
|
|
61
|
-
const centerSeparation = toRightCenter.magnitude();
|
|
62
|
-
|
|
63
|
-
if (leftRadius >= centerSeparation + rightRadius) {
|
|
64
|
-
return this.clone();
|
|
43
|
+
(0, _createClass2.default)(BoundingSphere, [{
|
|
44
|
+
key: "fromCenterRadius",
|
|
45
|
+
value: function fromCenterRadius(center, radius) {
|
|
46
|
+
this.center.from(center);
|
|
47
|
+
this.radius = radius;
|
|
48
|
+
return this;
|
|
65
49
|
}
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
50
|
+
}, {
|
|
51
|
+
key: "fromCornerPoints",
|
|
52
|
+
value: function fromCornerPoints(corner, oppositeCorner) {
|
|
53
|
+
oppositeCorner = scratchVector.from(oppositeCorner);
|
|
54
|
+
this.center = new _core.Vector3().from(corner).add(oppositeCorner).scale(0.5);
|
|
55
|
+
this.radius = this.center.distance(oppositeCorner);
|
|
56
|
+
return this;
|
|
69
57
|
}
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
this.radius = halfDistanceBetweenTangentPoints;
|
|
75
|
-
return this;
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
expand(point) {
|
|
79
|
-
const scratchPoint = scratchVector.from(point);
|
|
80
|
-
const radius = scratchPoint.subtract(this.center).magnitude();
|
|
81
|
-
|
|
82
|
-
if (radius > this.radius) {
|
|
83
|
-
this.radius = radius;
|
|
58
|
+
}, {
|
|
59
|
+
key: "equals",
|
|
60
|
+
value: function equals(right) {
|
|
61
|
+
return this === right || Boolean(right) && this.center.equals(right.center) && this.radius === right.radius;
|
|
84
62
|
}
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
transform(transform) {
|
|
90
|
-
this.center.transform(transform);
|
|
91
|
-
const scale = mat4.getScaling(scratchVector, transform);
|
|
92
|
-
this.radius = Math.max(scale[0], Math.max(scale[1], scale[2])) * this.radius;
|
|
93
|
-
return this;
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
distanceSquaredTo(point) {
|
|
97
|
-
const d = this.distanceTo(point);
|
|
98
|
-
return d * d;
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
distanceTo(point) {
|
|
102
|
-
const scratchPoint = scratchVector.from(point);
|
|
103
|
-
const delta = scratchPoint.subtract(this.center);
|
|
104
|
-
return Math.max(0, delta.len() - this.radius);
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
intersectPlane(plane) {
|
|
108
|
-
const center = this.center;
|
|
109
|
-
const radius = this.radius;
|
|
110
|
-
const normal = plane.normal;
|
|
111
|
-
const distanceToPlane = normal.dot(center) + plane.distance;
|
|
112
|
-
|
|
113
|
-
if (distanceToPlane < -radius) {
|
|
114
|
-
return _constants.INTERSECTION.OUTSIDE;
|
|
63
|
+
}, {
|
|
64
|
+
key: "clone",
|
|
65
|
+
value: function clone() {
|
|
66
|
+
return new BoundingSphere(this.center, this.radius);
|
|
115
67
|
}
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
68
|
+
}, {
|
|
69
|
+
key: "union",
|
|
70
|
+
value: function union(boundingSphere) {
|
|
71
|
+
var leftCenter = this.center;
|
|
72
|
+
var leftRadius = this.radius;
|
|
73
|
+
var rightCenter = boundingSphere.center;
|
|
74
|
+
var rightRadius = boundingSphere.radius;
|
|
75
|
+
var toRightCenter = scratchVector.copy(rightCenter).subtract(leftCenter);
|
|
76
|
+
var centerSeparation = toRightCenter.magnitude();
|
|
77
|
+
|
|
78
|
+
if (leftRadius >= centerSeparation + rightRadius) {
|
|
79
|
+
return this.clone();
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
if (rightRadius >= centerSeparation + leftRadius) {
|
|
83
|
+
return boundingSphere.clone();
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
var halfDistanceBetweenTangentPoints = (leftRadius + centerSeparation + rightRadius) * 0.5;
|
|
87
|
+
scratchVector2.copy(toRightCenter).scale((-leftRadius + halfDistanceBetweenTangentPoints) / centerSeparation).add(leftCenter);
|
|
88
|
+
this.center.copy(scratchVector2);
|
|
89
|
+
this.radius = halfDistanceBetweenTangentPoints;
|
|
90
|
+
return this;
|
|
119
91
|
}
|
|
92
|
+
}, {
|
|
93
|
+
key: "expand",
|
|
94
|
+
value: function expand(point) {
|
|
95
|
+
var scratchPoint = scratchVector.from(point);
|
|
96
|
+
var radius = scratchPoint.subtract(this.center).magnitude();
|
|
120
97
|
|
|
121
|
-
|
|
122
|
-
|
|
98
|
+
if (radius > this.radius) {
|
|
99
|
+
this.radius = radius;
|
|
100
|
+
}
|
|
123
101
|
|
|
124
|
-
|
|
102
|
+
return this;
|
|
103
|
+
}
|
|
104
|
+
}, {
|
|
105
|
+
key: "transform",
|
|
106
|
+
value: function transform(_transform) {
|
|
107
|
+
this.center.transform(_transform);
|
|
108
|
+
var scale = mat4.getScaling(scratchVector, _transform);
|
|
109
|
+
this.radius = Math.max(scale[0], Math.max(scale[1], scale[2])) * this.radius;
|
|
110
|
+
return this;
|
|
111
|
+
}
|
|
112
|
+
}, {
|
|
113
|
+
key: "distanceSquaredTo",
|
|
114
|
+
value: function distanceSquaredTo(point) {
|
|
115
|
+
var d = this.distanceTo(point);
|
|
116
|
+
return d * d;
|
|
117
|
+
}
|
|
118
|
+
}, {
|
|
119
|
+
key: "distanceTo",
|
|
120
|
+
value: function distanceTo(point) {
|
|
121
|
+
var scratchPoint = scratchVector.from(point);
|
|
122
|
+
var delta = scratchPoint.subtract(this.center);
|
|
123
|
+
return Math.max(0, delta.len() - this.radius);
|
|
124
|
+
}
|
|
125
|
+
}, {
|
|
126
|
+
key: "intersectPlane",
|
|
127
|
+
value: function intersectPlane(plane) {
|
|
128
|
+
var center = this.center;
|
|
129
|
+
var radius = this.radius;
|
|
130
|
+
var normal = plane.normal;
|
|
131
|
+
var distanceToPlane = normal.dot(center) + plane.distance;
|
|
132
|
+
|
|
133
|
+
if (distanceToPlane < -radius) {
|
|
134
|
+
return _constants.INTERSECTION.OUTSIDE;
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
if (distanceToPlane < radius) {
|
|
138
|
+
return _constants.INTERSECTION.INTERSECTING;
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
return _constants.INTERSECTION.INSIDE;
|
|
142
|
+
}
|
|
143
|
+
}]);
|
|
144
|
+
return BoundingSphere;
|
|
145
|
+
}();
|
|
125
146
|
|
|
126
147
|
exports.default = BoundingSphere;
|
|
127
148
|
//# sourceMappingURL=bounding-sphere.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/lib/bounding-volumes/bounding-sphere.ts"],"names":["scratchVector","Vector3","scratchVector2","BoundingSphere","
|
|
1
|
+
{"version":3,"sources":["../../../../src/lib/bounding-volumes/bounding-sphere.ts"],"names":["scratchVector","Vector3","scratchVector2","BoundingSphere","center","radius","fromCenterRadius","from","corner","oppositeCorner","add","scale","distance","right","Boolean","equals","boundingSphere","leftCenter","leftRadius","rightCenter","rightRadius","toRightCenter","copy","subtract","centerSeparation","magnitude","clone","halfDistanceBetweenTangentPoints","point","scratchPoint","transform","mat4","getScaling","Math","max","d","distanceTo","delta","len","plane","normal","distanceToPlane","dot","INTERSECTION","OUTSIDE","INTERSECTING","INSIDE"],"mappings":"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","sourcesContent":["// This file is derived from the Cesium math library under Apache 2 license\n// See LICENSE.md and https://github.com/AnalyticalGraphicsInc/cesium/blob/master/LICENSE.md\n\nimport {NumericArray, Vector3} from '@math.gl/core';\nimport * as mat4 from 'gl-matrix/mat4';\nimport {INTERSECTION} from '../../constants';\nimport {BoundingVolume} from './bounding-volume';\nimport Plane from '../plane';\n\nconst scratchVector = new Vector3();\nconst scratchVector2 = new Vector3();\n\n/** A BoundingSphere */\nexport default class BoundingSphere implements BoundingVolume {\n center: Vector3;\n radius: number;\n\n /** Creates a bounding sphere */\n constructor(center: readonly number[] = [0, 0, 0], radius: number = 0.0) {\n this.radius = -0;\n this.center = new Vector3();\n this.fromCenterRadius(center, radius);\n }\n\n /** Sets the bounding sphere from `center` and `radius`. */\n fromCenterRadius(center: readonly number[], radius: number): this {\n this.center.from(center);\n this.radius = radius;\n return this;\n }\n\n /**\n * Computes a bounding sphere from the corner points of an axis-aligned bounding box. The sphere\n * tightly and fully encompasses the box.\n */\n fromCornerPoints(corner: readonly number[], oppositeCorner: readonly number[]): this {\n oppositeCorner = scratchVector.from(oppositeCorner);\n this.center = new Vector3().from(corner).add(oppositeCorner).scale(0.5);\n this.radius = this.center.distance(oppositeCorner);\n return this;\n }\n\n /** Compares the provided BoundingSphere component wise */\n equals(right: BoundingSphere): boolean {\n return (\n this === right ||\n (Boolean(right) && this.center.equals(right.center) && this.radius === right.radius)\n );\n }\n\n /** Duplicates a BoundingSphere instance. */\n clone(): BoundingSphere {\n return new BoundingSphere(this.center, this.radius);\n }\n\n /** Computes a bounding sphere that contains both the left and right bounding spheres. */\n union(boundingSphere: BoundingSphere): BoundingSphere {\n const leftCenter = this.center;\n const leftRadius = this.radius;\n const rightCenter = boundingSphere.center;\n const rightRadius = boundingSphere.radius;\n\n const toRightCenter = scratchVector.copy(rightCenter).subtract(leftCenter);\n const centerSeparation = toRightCenter.magnitude();\n\n if (leftRadius >= centerSeparation + rightRadius) {\n // Left sphere wins.\n return this.clone();\n }\n\n if (rightRadius >= centerSeparation + leftRadius) {\n // Right sphere wins.\n return boundingSphere.clone();\n }\n\n // There are two tangent points, one on far side of each sphere.\n const halfDistanceBetweenTangentPoints = (leftRadius + centerSeparation + rightRadius) * 0.5;\n\n // Compute the center point halfway between the two tangent points.\n scratchVector2\n .copy(toRightCenter)\n .scale((-leftRadius + halfDistanceBetweenTangentPoints) / centerSeparation)\n .add(leftCenter);\n\n this.center.copy(scratchVector2);\n this.radius = halfDistanceBetweenTangentPoints;\n\n return this;\n }\n\n /** Computes a bounding sphere by enlarging the provided sphere to contain the provided point. */\n expand(point: readonly number[]): this {\n const scratchPoint = scratchVector.from(point);\n const radius = scratchPoint.subtract(this.center).magnitude();\n if (radius > this.radius) {\n this.radius = radius;\n }\n return this;\n }\n\n // BoundingVolume interface\n\n /**\n * Applies a 4x4 affine transformation matrix to a bounding sphere.\n * @param sphere The bounding sphere to apply the transformation to.\n * @param transform The transformation matrix to apply to the bounding sphere.\n * @returns self.\n */\n transform(transform: readonly number[]): this {\n this.center.transform(transform);\n const scale = mat4.getScaling(scratchVector, transform);\n this.radius = Math.max(scale[0], Math.max(scale[1], scale[2])) * this.radius;\n return this;\n }\n\n /** Computes the estimated distance squared from the closest point on a bounding sphere to a point. */\n distanceSquaredTo(point: Readonly<NumericArray>): number {\n const d = this.distanceTo(point);\n return d * d;\n }\n\n /** Computes the estimated distance from the closest point on a bounding sphere to a point. */\n distanceTo(point: Readonly<NumericArray>): number {\n const scratchPoint = scratchVector.from(point);\n const delta = scratchPoint.subtract(this.center);\n return Math.max(0, delta.len() - this.radius);\n }\n\n /** Determines which side of a plane a sphere is located. */\n intersectPlane(plane: Plane): INTERSECTION {\n const center = this.center;\n const radius = this.radius;\n const normal = plane.normal;\n const distanceToPlane = normal.dot(center) + plane.distance;\n\n // The center point is negative side of the plane normal\n if (distanceToPlane < -radius) {\n return INTERSECTION.OUTSIDE;\n }\n // The center point is positive side of the plane, but radius extends beyond it; partial overlap\n if (distanceToPlane < radius) {\n return INTERSECTION.INTERSECTING;\n }\n // The center point and radius is positive side of the plane\n return INTERSECTION.INSIDE;\n }\n}\n"],"file":"bounding-sphere.js"}
|