math 0.0.0 → 0.1.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/API.md +1605 -0
- package/LICENSE +21 -0
- package/README.md +197 -0
- package/dist/color/color.js +136 -0
- package/dist/color/color.js.map +1 -0
- package/dist/color/colorspace.js +43 -0
- package/dist/color/colorspace.js.map +1 -0
- package/dist/color/hsl.js +123 -0
- package/dist/color/hsl.js.map +1 -0
- package/dist/color/index.js +7 -0
- package/dist/color/index.js.map +1 -0
- package/dist/color/parse.js +276 -0
- package/dist/color/parse.js.map +1 -0
- package/dist/core/angle.js +43 -0
- package/dist/core/angle.js.map +1 -0
- package/dist/core/euler.js +212 -0
- package/dist/core/euler.js.map +1 -0
- package/dist/core/mat2.js +385 -0
- package/dist/core/mat2.js.map +1 -0
- package/dist/core/mat2d.js +422 -0
- package/dist/core/mat2d.js.map +1 -0
- package/dist/core/mat3.js +749 -0
- package/dist/core/mat3.js.map +1 -0
- package/dist/core/mat4.js +2197 -0
- package/dist/core/mat4.js.map +1 -0
- package/dist/core/polar.js +200 -0
- package/dist/core/polar.js.map +1 -0
- package/dist/core/quat.js +730 -0
- package/dist/core/quat.js.map +1 -0
- package/dist/core/quat2.js +883 -0
- package/dist/core/quat2.js.map +1 -0
- package/dist/core/scalar.js +112 -0
- package/dist/core/scalar.js.map +1 -0
- package/dist/core/spherical.js +248 -0
- package/dist/core/spherical.js.map +1 -0
- package/dist/core/vec2.js +597 -0
- package/dist/core/vec2.js.map +1 -0
- package/dist/core/vec3.js +916 -0
- package/dist/core/vec3.js.map +1 -0
- package/dist/core/vec4.js +573 -0
- package/dist/core/vec4.js.map +1 -0
- package/dist/geometry/circumcircle.js +39 -0
- package/dist/geometry/circumcircle.js.map +1 -0
- package/dist/geometry/index.js +6 -0
- package/dist/geometry/index.js.map +1 -0
- package/dist/geometry/polygon2-decompose.js +411 -0
- package/dist/geometry/polygon2-decompose.js.map +1 -0
- package/dist/geometry/polygon2-triangulate.js +222 -0
- package/dist/geometry/polygon2-triangulate.js.map +1 -0
- package/dist/geometry/quickhull2.js +123 -0
- package/dist/geometry/quickhull2.js.map +1 -0
- package/dist/geometry/quickhull3.js +605 -0
- package/dist/geometry/quickhull3.js.map +1 -0
- package/dist/ik/fabrik2.js +675 -0
- package/dist/ik/fabrik2.js.map +1 -0
- package/dist/ik/fabrik3.js +912 -0
- package/dist/ik/fabrik3.js.map +1 -0
- package/dist/ik/index.js +5 -0
- package/dist/ik/index.js.map +1 -0
- package/dist/index.js +27 -0
- package/dist/index.js.map +1 -0
- package/dist/noise/fractal.js +185 -0
- package/dist/noise/fractal.js.map +1 -0
- package/dist/noise/index.js +16 -0
- package/dist/noise/index.js.map +1 -0
- package/dist/noise/perlin2d.js +50 -0
- package/dist/noise/perlin2d.js.map +1 -0
- package/dist/noise/perlin3d.js +72 -0
- package/dist/noise/perlin3d.js.map +1 -0
- package/dist/noise/permutation.js +120 -0
- package/dist/noise/permutation.js.map +1 -0
- package/dist/noise/simplex2d.js +84 -0
- package/dist/noise/simplex2d.js.map +1 -0
- package/dist/noise/simplex3d.js +147 -0
- package/dist/noise/simplex3d.js.map +1 -0
- package/dist/noise/simplex4d.js +149 -0
- package/dist/noise/simplex4d.js.map +1 -0
- package/dist/noise/worley2d.js +50 -0
- package/dist/noise/worley2d.js.map +1 -0
- package/dist/noise/worley3d.js +61 -0
- package/dist/noise/worley3d.js.map +1 -0
- package/dist/random/index.js +9 -0
- package/dist/random/index.js.map +1 -0
- package/dist/random/isaac32.js +164 -0
- package/dist/random/isaac32.js.map +1 -0
- package/dist/random/isaac64.js +215 -0
- package/dist/random/isaac64.js.map +1 -0
- package/dist/random/mulberry32.js +48 -0
- package/dist/random/mulberry32.js.map +1 -0
- package/dist/random/random.js +120 -0
- package/dist/random/random.js.map +1 -0
- package/dist/shapes/box2.js +300 -0
- package/dist/shapes/box2.js.map +1 -0
- package/dist/shapes/box3.js +550 -0
- package/dist/shapes/box3.js.map +1 -0
- package/dist/shapes/circle.js +6 -0
- package/dist/shapes/circle.js.map +1 -0
- package/dist/shapes/frustum.js +662 -0
- package/dist/shapes/frustum.js.map +1 -0
- package/dist/shapes/index.js +25 -0
- package/dist/shapes/index.js.map +1 -0
- package/dist/shapes/obb3.js +557 -0
- package/dist/shapes/obb3.js.map +1 -0
- package/dist/shapes/plane3.js +267 -0
- package/dist/shapes/plane3.js.map +1 -0
- package/dist/shapes/polygon2.js +451 -0
- package/dist/shapes/polygon2.js.map +1 -0
- package/dist/shapes/raycast3.js +164 -0
- package/dist/shapes/raycast3.js.map +1 -0
- package/dist/shapes/segment2.js +82 -0
- package/dist/shapes/segment2.js.map +1 -0
- package/dist/shapes/sphere.js +23 -0
- package/dist/shapes/sphere.js.map +1 -0
- package/dist/shapes/triangle2.js +79 -0
- package/dist/shapes/triangle2.js.map +1 -0
- package/dist/shapes/triangle3.js +60 -0
- package/dist/shapes/triangle3.js.map +1 -0
- package/dist/src/color/color.d.ts +50 -0
- package/dist/src/color/colorspace.d.ts +15 -0
- package/dist/src/color/hsl.d.ts +28 -0
- package/dist/src/color/index.d.ts +5 -0
- package/dist/src/color/parse.d.ts +15 -0
- package/dist/src/core/angle.d.ts +29 -0
- package/dist/src/core/arrays.d.ts +4 -0
- package/dist/src/core/euler.d.ts +78 -0
- package/dist/src/core/index.d.ts +27 -0
- package/dist/src/core/mat2.d.ts +217 -0
- package/dist/src/core/mat2d.d.ts +218 -0
- package/dist/src/core/mat3.d.ts +295 -0
- package/dist/src/core/mat4.d.ts +667 -0
- package/dist/src/core/polar.d.ts +151 -0
- package/dist/src/core/quat.d.ts +370 -0
- package/dist/src/core/quat2.d.ts +344 -0
- package/dist/src/core/scalar.d.ts +75 -0
- package/dist/src/core/spherical.d.ts +165 -0
- package/dist/src/core/vec2.d.ts +403 -0
- package/dist/src/core/vec3.d.ts +493 -0
- package/dist/src/core/vec4.d.ts +336 -0
- package/dist/src/geometry/circumcircle.d.ts +9 -0
- package/dist/src/geometry/index.d.ts +5 -0
- package/dist/src/geometry/polygon2-decompose.d.ts +25 -0
- package/dist/src/geometry/polygon2-triangulate.d.ts +15 -0
- package/dist/src/geometry/quickhull2.d.ts +10 -0
- package/dist/src/geometry/quickhull3.d.ts +27 -0
- package/dist/src/ik/fabrik2.d.ts +314 -0
- package/dist/src/ik/fabrik3.d.ts +371 -0
- package/dist/src/ik/index.d.ts +2 -0
- package/dist/src/index.d.ts +1 -0
- package/dist/src/noise/fractal.d.ts +95 -0
- package/dist/src/noise/index.d.ts +9 -0
- package/dist/src/noise/perlin2d.d.ts +19 -0
- package/dist/src/noise/perlin3d.d.ts +20 -0
- package/dist/src/noise/permutation.d.ts +22 -0
- package/dist/src/noise/simplex2d.d.ts +19 -0
- package/dist/src/noise/simplex3d.d.ts +20 -0
- package/dist/src/noise/simplex4d.d.ts +24 -0
- package/dist/src/noise/worley2d.d.ts +22 -0
- package/dist/src/noise/worley3d.d.ts +23 -0
- package/dist/src/random/index.d.ts +8 -0
- package/dist/src/random/isaac32.d.ts +62 -0
- package/dist/src/random/isaac64.d.ts +75 -0
- package/dist/src/random/mulberry32.d.ts +43 -0
- package/dist/src/random/random.d.ts +67 -0
- package/dist/src/shapes/box2.d.ts +174 -0
- package/dist/src/shapes/box3.d.ts +213 -0
- package/dist/src/shapes/circle.d.ts +7 -0
- package/dist/src/shapes/frustum.d.ts +147 -0
- package/dist/src/shapes/index.d.ts +20 -0
- package/dist/src/shapes/obb3.d.ts +105 -0
- package/dist/src/shapes/plane3.d.ts +130 -0
- package/dist/src/shapes/polygon2.d.ts +155 -0
- package/dist/src/shapes/raycast3.d.ts +42 -0
- package/dist/src/shapes/segment2.d.ts +34 -0
- package/dist/src/shapes/sphere.d.ts +19 -0
- package/dist/src/shapes/triangle2.d.ts +53 -0
- package/dist/src/shapes/triangle3.d.ts +29 -0
- package/dist/src/time/easing.d.ts +21 -0
- package/dist/src/time/index.d.ts +6 -0
- package/dist/src/time/spring-core.d.ts +15 -0
- package/dist/src/time/spring.d.ts +36 -0
- package/dist/src/time/spring2.d.ts +11 -0
- package/dist/src/time/spring3.d.ts +11 -0
- package/dist/src/time/spring4.d.ts +11 -0
- package/dist/time/easing.js +24 -0
- package/dist/time/easing.js.map +1 -0
- package/dist/time/index.js +11 -0
- package/dist/time/index.js.map +1 -0
- package/dist/time/spring-core.js +48 -0
- package/dist/time/spring-core.js.map +1 -0
- package/dist/time/spring.js +62 -0
- package/dist/time/spring.js.map +1 -0
- package/dist/time/spring2.js +31 -0
- package/dist/time/spring2.js.map +1 -0
- package/dist/time/spring3.js +32 -0
- package/dist/time/spring3.js.map +1 -0
- package/dist/time/spring4.js +32 -0
- package/dist/time/spring4.js.map +1 -0
- package/package.json +90 -12
- package/skills/math/SKILL.md +140 -0
- package/math.coffee +0 -36
- package/math.js +0 -67
|
@@ -0,0 +1,557 @@
|
|
|
1
|
+
import { clone as clone$1, create as create$1, identity, fromQuat } from '../core/mat3.js';
|
|
2
|
+
import { EPSILON } from '../core/scalar.js';
|
|
3
|
+
|
|
4
|
+
function create() {
|
|
5
|
+
return { center: [0, 0, 0], halfExtents: [1, 1, 1], rotation: create$1() };
|
|
6
|
+
}
|
|
7
|
+
function clone(a) {
|
|
8
|
+
return {
|
|
9
|
+
center: [a.center[0], a.center[1], a.center[2]],
|
|
10
|
+
halfExtents: [a.halfExtents[0], a.halfExtents[1], a.halfExtents[2]],
|
|
11
|
+
rotation: clone$1(a.rotation),
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
function copy(out, a) {
|
|
15
|
+
out.center[0] = a.center[0];
|
|
16
|
+
out.center[1] = a.center[1];
|
|
17
|
+
out.center[2] = a.center[2];
|
|
18
|
+
out.halfExtents[0] = a.halfExtents[0];
|
|
19
|
+
out.halfExtents[1] = a.halfExtents[1];
|
|
20
|
+
out.halfExtents[2] = a.halfExtents[2];
|
|
21
|
+
out.rotation[0] = a.rotation[0];
|
|
22
|
+
out.rotation[1] = a.rotation[1];
|
|
23
|
+
out.rotation[2] = a.rotation[2];
|
|
24
|
+
out.rotation[3] = a.rotation[3];
|
|
25
|
+
out.rotation[4] = a.rotation[4];
|
|
26
|
+
out.rotation[5] = a.rotation[5];
|
|
27
|
+
out.rotation[6] = a.rotation[6];
|
|
28
|
+
out.rotation[7] = a.rotation[7];
|
|
29
|
+
out.rotation[8] = a.rotation[8];
|
|
30
|
+
return out;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Sets an OBB from center, half extents, and a rotation matrix.
|
|
34
|
+
* @param out the OBB to store the result
|
|
35
|
+
* @param center the center of the OBB
|
|
36
|
+
* @param halfExtents the half extents of the OBB
|
|
37
|
+
* @param rotation the Mat3 rotation matrix
|
|
38
|
+
* @returns the OBB with the given center, half extents, and rotation
|
|
39
|
+
*/
|
|
40
|
+
function set(out, center, halfExtents, rotation) {
|
|
41
|
+
out.center[0] = center[0];
|
|
42
|
+
out.center[1] = center[1];
|
|
43
|
+
out.center[2] = center[2];
|
|
44
|
+
out.halfExtents[0] = halfExtents[0];
|
|
45
|
+
out.halfExtents[1] = halfExtents[1];
|
|
46
|
+
out.halfExtents[2] = halfExtents[2];
|
|
47
|
+
out.rotation[0] = rotation[0];
|
|
48
|
+
out.rotation[1] = rotation[1];
|
|
49
|
+
out.rotation[2] = rotation[2];
|
|
50
|
+
out.rotation[3] = rotation[3];
|
|
51
|
+
out.rotation[4] = rotation[4];
|
|
52
|
+
out.rotation[5] = rotation[5];
|
|
53
|
+
out.rotation[6] = rotation[6];
|
|
54
|
+
out.rotation[7] = rotation[7];
|
|
55
|
+
out.rotation[8] = rotation[8];
|
|
56
|
+
return out;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Sets an OBB from center, half extents, and a quaternion.
|
|
60
|
+
* Convenience helper for users who store orientation as a quaternion.
|
|
61
|
+
*
|
|
62
|
+
* @param out - The OBB to store the result
|
|
63
|
+
* @param center - The center of the OBB
|
|
64
|
+
* @param halfExtents - The half extents of the OBB
|
|
65
|
+
* @param q - The quaternion representing the OBB's orientation
|
|
66
|
+
* @returns out
|
|
67
|
+
*/
|
|
68
|
+
function setFromCenterHalfExtentsQuaternion(out, center, halfExtents, q) {
|
|
69
|
+
out.center[0] = center[0];
|
|
70
|
+
out.center[1] = center[1];
|
|
71
|
+
out.center[2] = center[2];
|
|
72
|
+
out.halfExtents[0] = halfExtents[0];
|
|
73
|
+
out.halfExtents[1] = halfExtents[1];
|
|
74
|
+
out.halfExtents[2] = halfExtents[2];
|
|
75
|
+
fromQuat(out.rotation, q);
|
|
76
|
+
return out;
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Creates an OBB from an axis-aligned bounding box (AABB).
|
|
80
|
+
* The resulting OBB will have the same center and extents as the AABB,
|
|
81
|
+
* with no rotation (identity orientation).
|
|
82
|
+
*
|
|
83
|
+
* @param out - The OBB to store the result
|
|
84
|
+
* @param aabb - The AABB (min and max corners)
|
|
85
|
+
* @returns out
|
|
86
|
+
*/
|
|
87
|
+
function setFromBox3(out, aabb) {
|
|
88
|
+
// Center = (min + max) / 2
|
|
89
|
+
out.center[0] = (aabb[0] + aabb[3]) * 0.5;
|
|
90
|
+
out.center[1] = (aabb[1] + aabb[4]) * 0.5;
|
|
91
|
+
out.center[2] = (aabb[2] + aabb[5]) * 0.5;
|
|
92
|
+
// Half extents = (max - min) / 2
|
|
93
|
+
out.halfExtents[0] = (aabb[3] - aabb[0]) * 0.5;
|
|
94
|
+
out.halfExtents[1] = (aabb[4] - aabb[1]) * 0.5;
|
|
95
|
+
out.halfExtents[2] = (aabb[5] - aabb[2]) * 0.5;
|
|
96
|
+
// Identity rotation
|
|
97
|
+
identity(out.rotation);
|
|
98
|
+
return out;
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Tests whether a point is contained within an OBB.
|
|
102
|
+
*
|
|
103
|
+
* @param obb - The OBB to test
|
|
104
|
+
* @param point - The point to test
|
|
105
|
+
* @returns true if the point is inside the OBB
|
|
106
|
+
*/
|
|
107
|
+
function containsPoint(obb, point) {
|
|
108
|
+
// Vector from center to point
|
|
109
|
+
const dx = point[0] - obb.center[0];
|
|
110
|
+
const dy = point[1] - obb.center[1];
|
|
111
|
+
const dz = point[2] - obb.center[2];
|
|
112
|
+
// Project onto each OBB axis (columns of the rotation matrix) and compare against
|
|
113
|
+
// the half extents. The projections are used once, so keep them as scalars.
|
|
114
|
+
const r = obb.rotation;
|
|
115
|
+
const lx = dx * r[0] + dy * r[1] + dz * r[2];
|
|
116
|
+
const ly = dx * r[3] + dy * r[4] + dz * r[5];
|
|
117
|
+
const lz = dx * r[6] + dy * r[7] + dz * r[8];
|
|
118
|
+
return Math.abs(lx) <= obb.halfExtents[0] && Math.abs(ly) <= obb.halfExtents[1] && Math.abs(lz) <= obb.halfExtents[2];
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Clamps a point to the surface or interior of an OBB.
|
|
122
|
+
* Reference: Closest Point on OBB to Point in Real-Time Collision Detection
|
|
123
|
+
* by Christer Ericson (chapter 5.1.4)
|
|
124
|
+
*
|
|
125
|
+
* @param out - The clamped point result
|
|
126
|
+
* @param obb - The OBB
|
|
127
|
+
* @param point - The point to clamp
|
|
128
|
+
* @returns out
|
|
129
|
+
*/
|
|
130
|
+
function clampPoint(out, obb, point) {
|
|
131
|
+
// OBB axes are the columns of the rotation matrix, read directly from r[].
|
|
132
|
+
const r = obb.rotation;
|
|
133
|
+
// Vector from center to point (captured before writing out, in case out === point)
|
|
134
|
+
const dx = point[0] - obb.center[0];
|
|
135
|
+
const dy = point[1] - obb.center[1];
|
|
136
|
+
const dz = point[2] - obb.center[2];
|
|
137
|
+
// Start at center, then walk along each axis by the clamped projection distance.
|
|
138
|
+
out[0] = obb.center[0];
|
|
139
|
+
out[1] = obb.center[1];
|
|
140
|
+
out[2] = obb.center[2];
|
|
141
|
+
// x axis = r[0..2]
|
|
142
|
+
let dist = dx * r[0] + dy * r[1] + dz * r[2];
|
|
143
|
+
dist = Math.max(-obb.halfExtents[0], Math.min(obb.halfExtents[0], dist));
|
|
144
|
+
out[0] += r[0] * dist;
|
|
145
|
+
out[1] += r[1] * dist;
|
|
146
|
+
out[2] += r[2] * dist;
|
|
147
|
+
// y axis = r[3..5]
|
|
148
|
+
dist = dx * r[3] + dy * r[4] + dz * r[5];
|
|
149
|
+
dist = Math.max(-obb.halfExtents[1], Math.min(obb.halfExtents[1], dist));
|
|
150
|
+
out[0] += r[3] * dist;
|
|
151
|
+
out[1] += r[4] * dist;
|
|
152
|
+
out[2] += r[5] * dist;
|
|
153
|
+
// z axis = r[6..8]
|
|
154
|
+
dist = dx * r[6] + dy * r[7] + dz * r[8];
|
|
155
|
+
dist = Math.max(-obb.halfExtents[2], Math.min(obb.halfExtents[2], dist));
|
|
156
|
+
out[0] += r[6] * dist;
|
|
157
|
+
out[1] += r[7] * dist;
|
|
158
|
+
out[2] += r[8] * dist;
|
|
159
|
+
return out;
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Tests whether an OBB intersects with another OBB using the Separating Axis Theorem.
|
|
163
|
+
* Reference: OBB-OBB Intersection in Real-Time Collision Detection
|
|
164
|
+
* by Christer Ericson (chapter 4.4.1)
|
|
165
|
+
*
|
|
166
|
+
* A cross-product axis A_i x B_j degenerates to ~zero when those edges are near
|
|
167
|
+
* parallel, which makes its (un-normalised) separation test numerically unstable.
|
|
168
|
+
* Such an axis carries no separation information not already covered by the face
|
|
169
|
+
* axes, so it is skipped when `1 - R[i][j]^2` (its squared length, = sin^2 of the
|
|
170
|
+
* angle between the edges) falls below `epsilon`. This is scale-invariant — R is a
|
|
171
|
+
* matrix of cosines — unlike fudging the projected radii.
|
|
172
|
+
*
|
|
173
|
+
* @param a - The first OBB
|
|
174
|
+
* @param b - The second OBB
|
|
175
|
+
* @param epsilon - Squared-sine threshold below which near-parallel edge axes are skipped
|
|
176
|
+
* @returns true if the OBBs intersect
|
|
177
|
+
*/
|
|
178
|
+
function intersectsOBB3(a, b, epsilon = EPSILON) {
|
|
179
|
+
const rotA = a.rotation;
|
|
180
|
+
const rotB = b.rotation;
|
|
181
|
+
const a00 = rotA[0];
|
|
182
|
+
const a01 = rotA[1];
|
|
183
|
+
const a02 = rotA[2];
|
|
184
|
+
const a10 = rotA[3];
|
|
185
|
+
const a11 = rotA[4];
|
|
186
|
+
const a12 = rotA[5];
|
|
187
|
+
const a20 = rotA[6];
|
|
188
|
+
const a21 = rotA[7];
|
|
189
|
+
const a22 = rotA[8];
|
|
190
|
+
const b00 = rotB[0];
|
|
191
|
+
const b01 = rotB[1];
|
|
192
|
+
const b02 = rotB[2];
|
|
193
|
+
const b10 = rotB[3];
|
|
194
|
+
const b11 = rotB[4];
|
|
195
|
+
const b12 = rotB[5];
|
|
196
|
+
const b20 = rotB[6];
|
|
197
|
+
const b21 = rotB[7];
|
|
198
|
+
const b22 = rotB[8];
|
|
199
|
+
// R[i][j] = dot(A axis i, B axis j); OBB axes are the rows read above. Kept as
|
|
200
|
+
// flat scalar locals so every access stays in a register (no nested-array loads).
|
|
201
|
+
const r00 = a00 * b00 + a01 * b01 + a02 * b02;
|
|
202
|
+
const r01 = a00 * b10 + a01 * b11 + a02 * b12;
|
|
203
|
+
const r02 = a00 * b20 + a01 * b21 + a02 * b22;
|
|
204
|
+
const r10 = a10 * b00 + a11 * b01 + a12 * b02;
|
|
205
|
+
const r11 = a10 * b10 + a11 * b11 + a12 * b12;
|
|
206
|
+
const r12 = a10 * b20 + a11 * b21 + a12 * b22;
|
|
207
|
+
const r20 = a20 * b00 + a21 * b01 + a22 * b02;
|
|
208
|
+
const r21 = a20 * b10 + a21 * b11 + a22 * b12;
|
|
209
|
+
const r22 = a20 * b20 + a21 * b21 + a22 * b22;
|
|
210
|
+
// |R|, used to project box extents onto each candidate axis
|
|
211
|
+
const q00 = Math.abs(r00);
|
|
212
|
+
const q01 = Math.abs(r01);
|
|
213
|
+
const q02 = Math.abs(r02);
|
|
214
|
+
const q10 = Math.abs(r10);
|
|
215
|
+
const q11 = Math.abs(r11);
|
|
216
|
+
const q12 = Math.abs(r12);
|
|
217
|
+
const q20 = Math.abs(r20);
|
|
218
|
+
const q21 = Math.abs(r21);
|
|
219
|
+
const q22 = Math.abs(r22);
|
|
220
|
+
// Translation (b.center - a.center) brought into a's frame: t[i] = dot(t, A axis i)
|
|
221
|
+
const dx = b.center[0] - a.center[0];
|
|
222
|
+
const dy = b.center[1] - a.center[1];
|
|
223
|
+
const dz = b.center[2] - a.center[2];
|
|
224
|
+
const t0 = dx * a00 + dy * a01 + dz * a02;
|
|
225
|
+
const t1 = dx * a10 + dy * a11 + dz * a12;
|
|
226
|
+
const t2 = dx * a20 + dy * a21 + dz * a22;
|
|
227
|
+
const ae0 = a.halfExtents[0];
|
|
228
|
+
const ae1 = a.halfExtents[1];
|
|
229
|
+
const ae2 = a.halfExtents[2];
|
|
230
|
+
const be0 = b.halfExtents[0];
|
|
231
|
+
const be1 = b.halfExtents[1];
|
|
232
|
+
const be2 = b.halfExtents[2];
|
|
233
|
+
let ra;
|
|
234
|
+
let rb;
|
|
235
|
+
// Test axes L = A0, A1, A2
|
|
236
|
+
ra = ae0;
|
|
237
|
+
rb = be0 * q00 + be1 * q01 + be2 * q02;
|
|
238
|
+
if (Math.abs(t0) > ra + rb)
|
|
239
|
+
return false;
|
|
240
|
+
ra = ae1;
|
|
241
|
+
rb = be0 * q10 + be1 * q11 + be2 * q12;
|
|
242
|
+
if (Math.abs(t1) > ra + rb)
|
|
243
|
+
return false;
|
|
244
|
+
ra = ae2;
|
|
245
|
+
rb = be0 * q20 + be1 * q21 + be2 * q22;
|
|
246
|
+
if (Math.abs(t2) > ra + rb)
|
|
247
|
+
return false;
|
|
248
|
+
// Test axes L = B0, B1, B2
|
|
249
|
+
ra = ae0 * q00 + ae1 * q10 + ae2 * q20;
|
|
250
|
+
rb = be0;
|
|
251
|
+
if (Math.abs(t0 * r00 + t1 * r10 + t2 * r20) > ra + rb)
|
|
252
|
+
return false;
|
|
253
|
+
ra = ae0 * q01 + ae1 * q11 + ae2 * q21;
|
|
254
|
+
rb = be1;
|
|
255
|
+
if (Math.abs(t0 * r01 + t1 * r11 + t2 * r21) > ra + rb)
|
|
256
|
+
return false;
|
|
257
|
+
ra = ae0 * q02 + ae1 * q12 + ae2 * q22;
|
|
258
|
+
rb = be2;
|
|
259
|
+
if (Math.abs(t0 * r02 + t1 * r12 + t2 * r22) > ra + rb)
|
|
260
|
+
return false;
|
|
261
|
+
// Test axis L = A0 x B0 (skip when A0 ∥ B0)
|
|
262
|
+
if (1 - r00 * r00 >= epsilon) {
|
|
263
|
+
ra = ae1 * q20 + ae2 * q10;
|
|
264
|
+
rb = be1 * q02 + be2 * q01;
|
|
265
|
+
if (Math.abs(t2 * r10 - t1 * r20) > ra + rb)
|
|
266
|
+
return false;
|
|
267
|
+
}
|
|
268
|
+
// Test axis L = A0 x B1 (skip when A0 ∥ B1)
|
|
269
|
+
if (1 - r01 * r01 >= epsilon) {
|
|
270
|
+
ra = ae1 * q21 + ae2 * q11;
|
|
271
|
+
rb = be0 * q02 + be2 * q00;
|
|
272
|
+
if (Math.abs(t2 * r11 - t1 * r21) > ra + rb)
|
|
273
|
+
return false;
|
|
274
|
+
}
|
|
275
|
+
// Test axis L = A0 x B2 (skip when A0 ∥ B2)
|
|
276
|
+
if (1 - r02 * r02 >= epsilon) {
|
|
277
|
+
ra = ae1 * q22 + ae2 * q12;
|
|
278
|
+
rb = be0 * q01 + be1 * q00;
|
|
279
|
+
if (Math.abs(t2 * r12 - t1 * r22) > ra + rb)
|
|
280
|
+
return false;
|
|
281
|
+
}
|
|
282
|
+
// Test axis L = A1 x B0 (skip when A1 ∥ B0)
|
|
283
|
+
if (1 - r10 * r10 >= epsilon) {
|
|
284
|
+
ra = ae0 * q20 + ae2 * q00;
|
|
285
|
+
rb = be1 * q12 + be2 * q11;
|
|
286
|
+
if (Math.abs(t0 * r20 - t2 * r00) > ra + rb)
|
|
287
|
+
return false;
|
|
288
|
+
}
|
|
289
|
+
// Test axis L = A1 x B1 (skip when A1 ∥ B1)
|
|
290
|
+
if (1 - r11 * r11 >= epsilon) {
|
|
291
|
+
ra = ae0 * q21 + ae2 * q01;
|
|
292
|
+
rb = be0 * q12 + be2 * q10;
|
|
293
|
+
if (Math.abs(t0 * r21 - t2 * r01) > ra + rb)
|
|
294
|
+
return false;
|
|
295
|
+
}
|
|
296
|
+
// Test axis L = A1 x B2 (skip when A1 ∥ B2)
|
|
297
|
+
if (1 - r12 * r12 >= epsilon) {
|
|
298
|
+
ra = ae0 * q22 + ae2 * q02;
|
|
299
|
+
rb = be0 * q11 + be1 * q10;
|
|
300
|
+
if (Math.abs(t0 * r22 - t2 * r02) > ra + rb)
|
|
301
|
+
return false;
|
|
302
|
+
}
|
|
303
|
+
// Test axis L = A2 x B0 (skip when A2 ∥ B0)
|
|
304
|
+
if (1 - r20 * r20 >= epsilon) {
|
|
305
|
+
ra = ae0 * q10 + ae1 * q00;
|
|
306
|
+
rb = be1 * q22 + be2 * q21;
|
|
307
|
+
if (Math.abs(t1 * r00 - t0 * r10) > ra + rb)
|
|
308
|
+
return false;
|
|
309
|
+
}
|
|
310
|
+
// Test axis L = A2 x B1 (skip when A2 ∥ B1)
|
|
311
|
+
if (1 - r21 * r21 >= epsilon) {
|
|
312
|
+
ra = ae0 * q11 + ae1 * q01;
|
|
313
|
+
rb = be0 * q22 + be2 * q20;
|
|
314
|
+
if (Math.abs(t1 * r01 - t0 * r11) > ra + rb)
|
|
315
|
+
return false;
|
|
316
|
+
}
|
|
317
|
+
// Test axis L = A2 x B2 (skip when A2 ∥ B2)
|
|
318
|
+
if (1 - r22 * r22 >= epsilon) {
|
|
319
|
+
ra = ae0 * q12 + ae1 * q02;
|
|
320
|
+
rb = be0 * q21 + be1 * q20;
|
|
321
|
+
if (Math.abs(t1 * r02 - t0 * r12) > ra + rb)
|
|
322
|
+
return false;
|
|
323
|
+
}
|
|
324
|
+
// No separating axis found - OBBs must be intersecting
|
|
325
|
+
return true;
|
|
326
|
+
}
|
|
327
|
+
/**
|
|
328
|
+
* Tests whether an OBB intersects with an AABB.
|
|
329
|
+
*
|
|
330
|
+
* Specialised form of {@link intersectsOBB3}: the AABB's axes are the world axes, so
|
|
331
|
+
* the axis dot-product matrix R is just the OBB's rotation (no 9 dot-products), and the
|
|
332
|
+
* AABB's centre/half-extents come straight from its min/max. The near-parallel edge
|
|
333
|
+
* skip works identically — here it fires when an OBB axis aligns with a world axis.
|
|
334
|
+
*
|
|
335
|
+
* @param obb - The OBB
|
|
336
|
+
* @param aabb - The AABB (axis-aligned bounding box)
|
|
337
|
+
* @returns true if they intersect
|
|
338
|
+
*/
|
|
339
|
+
function intersectsBox3(obb, aabb) {
|
|
340
|
+
const rotA = obb.rotation;
|
|
341
|
+
const epsilon = EPSILON;
|
|
342
|
+
// R[i][j] = dot(A axis i, AABB axis j) = A axis i's j-th component = rotA itself
|
|
343
|
+
const r00 = rotA[0];
|
|
344
|
+
const r01 = rotA[1];
|
|
345
|
+
const r02 = rotA[2];
|
|
346
|
+
const r10 = rotA[3];
|
|
347
|
+
const r11 = rotA[4];
|
|
348
|
+
const r12 = rotA[5];
|
|
349
|
+
const r20 = rotA[6];
|
|
350
|
+
const r21 = rotA[7];
|
|
351
|
+
const r22 = rotA[8];
|
|
352
|
+
const q00 = Math.abs(r00);
|
|
353
|
+
const q01 = Math.abs(r01);
|
|
354
|
+
const q02 = Math.abs(r02);
|
|
355
|
+
const q10 = Math.abs(r10);
|
|
356
|
+
const q11 = Math.abs(r11);
|
|
357
|
+
const q12 = Math.abs(r12);
|
|
358
|
+
const q20 = Math.abs(r20);
|
|
359
|
+
const q21 = Math.abs(r21);
|
|
360
|
+
const q22 = Math.abs(r22);
|
|
361
|
+
// AABB centre and half-extents
|
|
362
|
+
const bcx = (aabb[0] + aabb[3]) * 0.5;
|
|
363
|
+
const bcy = (aabb[1] + aabb[4]) * 0.5;
|
|
364
|
+
const bcz = (aabb[2] + aabb[5]) * 0.5;
|
|
365
|
+
const be0 = (aabb[3] - aabb[0]) * 0.5;
|
|
366
|
+
const be1 = (aabb[4] - aabb[1]) * 0.5;
|
|
367
|
+
const be2 = (aabb[5] - aabb[2]) * 0.5;
|
|
368
|
+
// Translation (aabb.center - obb.center) brought into the OBB's frame
|
|
369
|
+
const dx = bcx - obb.center[0];
|
|
370
|
+
const dy = bcy - obb.center[1];
|
|
371
|
+
const dz = bcz - obb.center[2];
|
|
372
|
+
const t0 = dx * r00 + dy * r01 + dz * r02;
|
|
373
|
+
const t1 = dx * r10 + dy * r11 + dz * r12;
|
|
374
|
+
const t2 = dx * r20 + dy * r21 + dz * r22;
|
|
375
|
+
const ae0 = obb.halfExtents[0];
|
|
376
|
+
const ae1 = obb.halfExtents[1];
|
|
377
|
+
const ae2 = obb.halfExtents[2];
|
|
378
|
+
let ra;
|
|
379
|
+
let rb;
|
|
380
|
+
// Test axes L = A0, A1, A2
|
|
381
|
+
ra = ae0;
|
|
382
|
+
rb = be0 * q00 + be1 * q01 + be2 * q02;
|
|
383
|
+
if (Math.abs(t0) > ra + rb)
|
|
384
|
+
return false;
|
|
385
|
+
ra = ae1;
|
|
386
|
+
rb = be0 * q10 + be1 * q11 + be2 * q12;
|
|
387
|
+
if (Math.abs(t1) > ra + rb)
|
|
388
|
+
return false;
|
|
389
|
+
ra = ae2;
|
|
390
|
+
rb = be0 * q20 + be1 * q21 + be2 * q22;
|
|
391
|
+
if (Math.abs(t2) > ra + rb)
|
|
392
|
+
return false;
|
|
393
|
+
// Test axes L = B0, B1, B2
|
|
394
|
+
ra = ae0 * q00 + ae1 * q10 + ae2 * q20;
|
|
395
|
+
rb = be0;
|
|
396
|
+
if (Math.abs(t0 * r00 + t1 * r10 + t2 * r20) > ra + rb)
|
|
397
|
+
return false;
|
|
398
|
+
ra = ae0 * q01 + ae1 * q11 + ae2 * q21;
|
|
399
|
+
rb = be1;
|
|
400
|
+
if (Math.abs(t0 * r01 + t1 * r11 + t2 * r21) > ra + rb)
|
|
401
|
+
return false;
|
|
402
|
+
ra = ae0 * q02 + ae1 * q12 + ae2 * q22;
|
|
403
|
+
rb = be2;
|
|
404
|
+
if (Math.abs(t0 * r02 + t1 * r12 + t2 * r22) > ra + rb)
|
|
405
|
+
return false;
|
|
406
|
+
// Test axis L = A0 x B0 (skip when A0 aligns with world X)
|
|
407
|
+
if (1 - r00 * r00 >= epsilon) {
|
|
408
|
+
ra = ae1 * q20 + ae2 * q10;
|
|
409
|
+
rb = be1 * q02 + be2 * q01;
|
|
410
|
+
if (Math.abs(t2 * r10 - t1 * r20) > ra + rb)
|
|
411
|
+
return false;
|
|
412
|
+
}
|
|
413
|
+
// Test axis L = A0 x B1 (skip when A0 aligns with world Y)
|
|
414
|
+
if (1 - r01 * r01 >= epsilon) {
|
|
415
|
+
ra = ae1 * q21 + ae2 * q11;
|
|
416
|
+
rb = be0 * q02 + be2 * q00;
|
|
417
|
+
if (Math.abs(t2 * r11 - t1 * r21) > ra + rb)
|
|
418
|
+
return false;
|
|
419
|
+
}
|
|
420
|
+
// Test axis L = A0 x B2 (skip when A0 aligns with world Z)
|
|
421
|
+
if (1 - r02 * r02 >= epsilon) {
|
|
422
|
+
ra = ae1 * q22 + ae2 * q12;
|
|
423
|
+
rb = be0 * q01 + be1 * q00;
|
|
424
|
+
if (Math.abs(t2 * r12 - t1 * r22) > ra + rb)
|
|
425
|
+
return false;
|
|
426
|
+
}
|
|
427
|
+
// Test axis L = A1 x B0 (skip when A1 aligns with world X)
|
|
428
|
+
if (1 - r10 * r10 >= epsilon) {
|
|
429
|
+
ra = ae0 * q20 + ae2 * q00;
|
|
430
|
+
rb = be1 * q12 + be2 * q11;
|
|
431
|
+
if (Math.abs(t0 * r20 - t2 * r00) > ra + rb)
|
|
432
|
+
return false;
|
|
433
|
+
}
|
|
434
|
+
// Test axis L = A1 x B1 (skip when A1 aligns with world Y)
|
|
435
|
+
if (1 - r11 * r11 >= epsilon) {
|
|
436
|
+
ra = ae0 * q21 + ae2 * q01;
|
|
437
|
+
rb = be0 * q12 + be2 * q10;
|
|
438
|
+
if (Math.abs(t0 * r21 - t2 * r01) > ra + rb)
|
|
439
|
+
return false;
|
|
440
|
+
}
|
|
441
|
+
// Test axis L = A1 x B2 (skip when A1 aligns with world Z)
|
|
442
|
+
if (1 - r12 * r12 >= epsilon) {
|
|
443
|
+
ra = ae0 * q22 + ae2 * q02;
|
|
444
|
+
rb = be0 * q11 + be1 * q10;
|
|
445
|
+
if (Math.abs(t0 * r22 - t2 * r02) > ra + rb)
|
|
446
|
+
return false;
|
|
447
|
+
}
|
|
448
|
+
// Test axis L = A2 x B0 (skip when A2 aligns with world X)
|
|
449
|
+
if (1 - r20 * r20 >= epsilon) {
|
|
450
|
+
ra = ae0 * q10 + ae1 * q00;
|
|
451
|
+
rb = be1 * q22 + be2 * q21;
|
|
452
|
+
if (Math.abs(t1 * r00 - t0 * r10) > ra + rb)
|
|
453
|
+
return false;
|
|
454
|
+
}
|
|
455
|
+
// Test axis L = A2 x B1 (skip when A2 aligns with world Y)
|
|
456
|
+
if (1 - r21 * r21 >= epsilon) {
|
|
457
|
+
ra = ae0 * q11 + ae1 * q01;
|
|
458
|
+
rb = be0 * q22 + be2 * q20;
|
|
459
|
+
if (Math.abs(t1 * r01 - t0 * r11) > ra + rb)
|
|
460
|
+
return false;
|
|
461
|
+
}
|
|
462
|
+
// Test axis L = A2 x B2 (skip when A2 aligns with world Z)
|
|
463
|
+
if (1 - r22 * r22 >= epsilon) {
|
|
464
|
+
ra = ae0 * q12 + ae1 * q02;
|
|
465
|
+
rb = be0 * q21 + be1 * q20;
|
|
466
|
+
if (Math.abs(t1 * r02 - t0 * r12) > ra + rb)
|
|
467
|
+
return false;
|
|
468
|
+
}
|
|
469
|
+
return true;
|
|
470
|
+
}
|
|
471
|
+
/**
|
|
472
|
+
* Applies a 4x4 transformation matrix to an OBB.
|
|
473
|
+
* This can be used to transform the bounding volume with the world matrix
|
|
474
|
+
* of a 3D object to keep both entities in sync.
|
|
475
|
+
*
|
|
476
|
+
* @param out - The transformed OBB
|
|
477
|
+
* @param obb - The OBB to transform
|
|
478
|
+
* @param matrix - The 4x4 transformation matrix
|
|
479
|
+
* @returns out
|
|
480
|
+
*/
|
|
481
|
+
function applyMatrix4(out, obb, matrix) {
|
|
482
|
+
// read the upper-left 3x3 (the affine linear part) into locals once. Columns
|
|
483
|
+
// m0*, m1*, m2* correspond to mat4 columns 0, 1, 2.
|
|
484
|
+
const m00 = matrix[0];
|
|
485
|
+
const m01 = matrix[1];
|
|
486
|
+
const m02 = matrix[2];
|
|
487
|
+
const m10 = matrix[4];
|
|
488
|
+
const m11 = matrix[5];
|
|
489
|
+
const m12 = matrix[6];
|
|
490
|
+
const m20 = matrix[8];
|
|
491
|
+
const m21 = matrix[9];
|
|
492
|
+
const m22 = matrix[10];
|
|
493
|
+
// extract scale as the length of each column (always non-negative).
|
|
494
|
+
const sx = Math.sqrt(m00 * m00 + m01 * m01 + m02 * m02);
|
|
495
|
+
const sy = Math.sqrt(m10 * m10 + m11 * m11 + m12 * m12);
|
|
496
|
+
const sz = Math.sqrt(m20 * m20 + m21 * m21 + m22 * m22);
|
|
497
|
+
// handle negative scale (reflection).
|
|
498
|
+
// for an affine matrix the 4x4 determinant equals the upper-left 3x3 determinant, so we only need that (and only its sign).
|
|
499
|
+
// the reflection is folded into the first rotation column via invSX so that the extracted basis stays right-handed while the half extents remain positive.
|
|
500
|
+
const det = m00 * (m11 * m22 - m21 * m12) - m10 * (m01 * m22 - m21 * m02) + m20 * (m01 * m12 - m11 * m02);
|
|
501
|
+
const invSX = (det < 0 ? -1 : 1) / sx;
|
|
502
|
+
const invSY = 1 / sy;
|
|
503
|
+
const invSZ = 1 / sz;
|
|
504
|
+
// normalized rotation columns (scale removed).
|
|
505
|
+
const r00 = m00 * invSX;
|
|
506
|
+
const r01 = m01 * invSX;
|
|
507
|
+
const r02 = m02 * invSX;
|
|
508
|
+
const r10 = m10 * invSY;
|
|
509
|
+
const r11 = m11 * invSY;
|
|
510
|
+
const r12 = m12 * invSY;
|
|
511
|
+
const r20 = m20 * invSZ;
|
|
512
|
+
const r21 = m21 * invSZ;
|
|
513
|
+
const r22 = m22 * invSZ;
|
|
514
|
+
// cache the obb's rotation before writing to out.rotation (supports out === obb).
|
|
515
|
+
const q = obb.rotation;
|
|
516
|
+
const q0 = q[0];
|
|
517
|
+
const q1 = q[1];
|
|
518
|
+
const q2 = q[2];
|
|
519
|
+
const q3 = q[3];
|
|
520
|
+
const q4 = q[4];
|
|
521
|
+
const q5 = q[5];
|
|
522
|
+
const q6 = q[6];
|
|
523
|
+
const q7 = q[7];
|
|
524
|
+
const q8 = q[8];
|
|
525
|
+
// combine rotations: out.rotation = extractedRotation * obb.rotation (inlined mat3.multiply).
|
|
526
|
+
const outRotation = out.rotation;
|
|
527
|
+
outRotation[0] = q0 * r00 + q1 * r10 + q2 * r20;
|
|
528
|
+
outRotation[1] = q0 * r01 + q1 * r11 + q2 * r21;
|
|
529
|
+
outRotation[2] = q0 * r02 + q1 * r12 + q2 * r22;
|
|
530
|
+
outRotation[3] = q3 * r00 + q4 * r10 + q5 * r20;
|
|
531
|
+
outRotation[4] = q3 * r01 + q4 * r11 + q5 * r21;
|
|
532
|
+
outRotation[5] = q3 * r02 + q4 * r12 + q5 * r22;
|
|
533
|
+
outRotation[6] = q6 * r00 + q7 * r10 + q8 * r20;
|
|
534
|
+
outRotation[7] = q6 * r01 + q7 * r11 + q8 * r21;
|
|
535
|
+
outRotation[8] = q6 * r02 + q7 * r12 + q8 * r22;
|
|
536
|
+
// scale half extents (sx/sy/sz are already the positive scale magnitudes).
|
|
537
|
+
const he = obb.halfExtents;
|
|
538
|
+
const outHalfExtents = out.halfExtents;
|
|
539
|
+
outHalfExtents[0] = he[0] * sx;
|
|
540
|
+
outHalfExtents[1] = he[1] * sy;
|
|
541
|
+
outHalfExtents[2] = he[2] * sz;
|
|
542
|
+
// transform center through the full matrix (rotation + translation, inlined transformMat4).
|
|
543
|
+
const c = obb.center;
|
|
544
|
+
const cx = c[0];
|
|
545
|
+
const cy = c[1];
|
|
546
|
+
const cz = c[2];
|
|
547
|
+
let w = matrix[3] * cx + matrix[7] * cy + matrix[11] * cz + matrix[15];
|
|
548
|
+
w = w || 1.0;
|
|
549
|
+
const outCenter = out.center;
|
|
550
|
+
outCenter[0] = (m00 * cx + m10 * cy + m20 * cz + matrix[12]) / w;
|
|
551
|
+
outCenter[1] = (m01 * cx + m11 * cy + m21 * cz + matrix[13]) / w;
|
|
552
|
+
outCenter[2] = (m02 * cx + m12 * cy + m22 * cz + matrix[14]) / w;
|
|
553
|
+
return out;
|
|
554
|
+
}
|
|
555
|
+
|
|
556
|
+
export { applyMatrix4, clampPoint, clone, containsPoint, copy, create, intersectsBox3, intersectsOBB3, set, setFromBox3, setFromCenterHalfExtentsQuaternion };
|
|
557
|
+
//# sourceMappingURL=obb3.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"obb3.js","sources":["../../src/shapes/obb3.ts"],"sourcesContent":["import type { Mat3 } from '../core/mat3';\nimport * as mat3 from '../core/mat3';\nimport type { Mat4 } from '../core/mat4';\nimport type { Quat } from '../core/quat';\nimport { EPSILON } from '../core/scalar';\nimport type { Vec3 } from '../core/vec3';\nimport type { Box3 } from './box3';\n\n/** An oriented bounding box in 3D space */\nexport type OBB3 = { center: Vec3; halfExtents: Vec3; rotation: Mat3 };\n\nexport function create(): OBB3 {\n return { center: [0, 0, 0], halfExtents: [1, 1, 1], rotation: mat3.create() };\n}\n\nexport function clone(a: OBB3): OBB3 {\n return {\n center: [a.center[0], a.center[1], a.center[2]],\n halfExtents: [a.halfExtents[0], a.halfExtents[1], a.halfExtents[2]],\n rotation: mat3.clone(a.rotation),\n };\n}\n\nexport function copy(out: OBB3, a: OBB3): OBB3 {\n out.center[0] = a.center[0];\n out.center[1] = a.center[1];\n out.center[2] = a.center[2];\n out.halfExtents[0] = a.halfExtents[0];\n out.halfExtents[1] = a.halfExtents[1];\n out.halfExtents[2] = a.halfExtents[2];\n out.rotation[0] = a.rotation[0];\n out.rotation[1] = a.rotation[1];\n out.rotation[2] = a.rotation[2];\n out.rotation[3] = a.rotation[3];\n out.rotation[4] = a.rotation[4];\n out.rotation[5] = a.rotation[5];\n out.rotation[6] = a.rotation[6];\n out.rotation[7] = a.rotation[7];\n out.rotation[8] = a.rotation[8];\n return out;\n}\n\n/**\n * Sets an OBB from center, half extents, and a rotation matrix.\n * @param out the OBB to store the result\n * @param center the center of the OBB\n * @param halfExtents the half extents of the OBB\n * @param rotation the Mat3 rotation matrix\n * @returns the OBB with the given center, half extents, and rotation\n */\nexport function set(out: OBB3, center: Vec3, halfExtents: Vec3, rotation: Mat3): OBB3 {\n out.center[0] = center[0];\n out.center[1] = center[1];\n out.center[2] = center[2];\n out.halfExtents[0] = halfExtents[0];\n out.halfExtents[1] = halfExtents[1];\n out.halfExtents[2] = halfExtents[2];\n out.rotation[0] = rotation[0];\n out.rotation[1] = rotation[1];\n out.rotation[2] = rotation[2];\n out.rotation[3] = rotation[3];\n out.rotation[4] = rotation[4];\n out.rotation[5] = rotation[5];\n out.rotation[6] = rotation[6];\n out.rotation[7] = rotation[7];\n out.rotation[8] = rotation[8];\n return out;\n}\n\n/**\n * Sets an OBB from center, half extents, and a quaternion.\n * Convenience helper for users who store orientation as a quaternion.\n *\n * @param out - The OBB to store the result\n * @param center - The center of the OBB\n * @param halfExtents - The half extents of the OBB\n * @param q - The quaternion representing the OBB's orientation\n * @returns out\n */\nexport function setFromCenterHalfExtentsQuaternion(out: OBB3, center: Vec3, halfExtents: Vec3, q: Quat): OBB3 {\n out.center[0] = center[0];\n out.center[1] = center[1];\n out.center[2] = center[2];\n out.halfExtents[0] = halfExtents[0];\n out.halfExtents[1] = halfExtents[1];\n out.halfExtents[2] = halfExtents[2];\n mat3.fromQuat(out.rotation, q);\n return out;\n}\n\n/**\n * Creates an OBB from an axis-aligned bounding box (AABB).\n * The resulting OBB will have the same center and extents as the AABB,\n * with no rotation (identity orientation).\n *\n * @param out - The OBB to store the result\n * @param aabb - The AABB (min and max corners)\n * @returns out\n */\nexport function setFromBox3(out: OBB3, aabb: Box3): OBB3 {\n // Center = (min + max) / 2\n out.center[0] = (aabb[0] + aabb[3]) * 0.5;\n out.center[1] = (aabb[1] + aabb[4]) * 0.5;\n out.center[2] = (aabb[2] + aabb[5]) * 0.5;\n\n // Half extents = (max - min) / 2\n out.halfExtents[0] = (aabb[3] - aabb[0]) * 0.5;\n out.halfExtents[1] = (aabb[4] - aabb[1]) * 0.5;\n out.halfExtents[2] = (aabb[5] - aabb[2]) * 0.5;\n\n // Identity rotation\n mat3.identity(out.rotation);\n\n return out;\n}\n\n/**\n * Tests whether a point is contained within an OBB.\n *\n * @param obb - The OBB to test\n * @param point - The point to test\n * @returns true if the point is inside the OBB\n */\nexport function containsPoint(obb: OBB3, point: Vec3): boolean {\n // Vector from center to point\n const dx = point[0] - obb.center[0];\n const dy = point[1] - obb.center[1];\n const dz = point[2] - obb.center[2];\n\n // Project onto each OBB axis (columns of the rotation matrix) and compare against\n // the half extents. The projections are used once, so keep them as scalars.\n const r = obb.rotation;\n const lx = dx * r[0] + dy * r[1] + dz * r[2];\n const ly = dx * r[3] + dy * r[4] + dz * r[5];\n const lz = dx * r[6] + dy * r[7] + dz * r[8];\n\n return Math.abs(lx) <= obb.halfExtents[0] && Math.abs(ly) <= obb.halfExtents[1] && Math.abs(lz) <= obb.halfExtents[2];\n}\n\n/**\n * Clamps a point to the surface or interior of an OBB.\n * Reference: Closest Point on OBB to Point in Real-Time Collision Detection\n * by Christer Ericson (chapter 5.1.4)\n *\n * @param out - The clamped point result\n * @param obb - The OBB\n * @param point - The point to clamp\n * @returns out\n */\nexport function clampPoint(out: Vec3, obb: OBB3, point: Vec3): Vec3 {\n // OBB axes are the columns of the rotation matrix, read directly from r[].\n const r = obb.rotation;\n\n // Vector from center to point (captured before writing out, in case out === point)\n const dx = point[0] - obb.center[0];\n const dy = point[1] - obb.center[1];\n const dz = point[2] - obb.center[2];\n\n // Start at center, then walk along each axis by the clamped projection distance.\n out[0] = obb.center[0];\n out[1] = obb.center[1];\n out[2] = obb.center[2];\n\n // x axis = r[0..2]\n let dist = dx * r[0] + dy * r[1] + dz * r[2];\n dist = Math.max(-obb.halfExtents[0], Math.min(obb.halfExtents[0], dist));\n out[0] += r[0] * dist;\n out[1] += r[1] * dist;\n out[2] += r[2] * dist;\n\n // y axis = r[3..5]\n dist = dx * r[3] + dy * r[4] + dz * r[5];\n dist = Math.max(-obb.halfExtents[1], Math.min(obb.halfExtents[1], dist));\n out[0] += r[3] * dist;\n out[1] += r[4] * dist;\n out[2] += r[5] * dist;\n\n // z axis = r[6..8]\n dist = dx * r[6] + dy * r[7] + dz * r[8];\n dist = Math.max(-obb.halfExtents[2], Math.min(obb.halfExtents[2], dist));\n out[0] += r[6] * dist;\n out[1] += r[7] * dist;\n out[2] += r[8] * dist;\n\n return out;\n}\n\n/**\n * Tests whether an OBB intersects with another OBB using the Separating Axis Theorem.\n * Reference: OBB-OBB Intersection in Real-Time Collision Detection\n * by Christer Ericson (chapter 4.4.1)\n *\n * A cross-product axis A_i x B_j degenerates to ~zero when those edges are near\n * parallel, which makes its (un-normalised) separation test numerically unstable.\n * Such an axis carries no separation information not already covered by the face\n * axes, so it is skipped when `1 - R[i][j]^2` (its squared length, = sin^2 of the\n * angle between the edges) falls below `epsilon`. This is scale-invariant — R is a\n * matrix of cosines — unlike fudging the projected radii.\n *\n * @param a - The first OBB\n * @param b - The second OBB\n * @param epsilon - Squared-sine threshold below which near-parallel edge axes are skipped\n * @returns true if the OBBs intersect\n */\nexport function intersectsOBB3(a: OBB3, b: OBB3, epsilon = EPSILON): boolean {\n const rotA = a.rotation;\n const rotB = b.rotation;\n\n const a00 = rotA[0];\n const a01 = rotA[1];\n const a02 = rotA[2];\n const a10 = rotA[3];\n const a11 = rotA[4];\n const a12 = rotA[5];\n const a20 = rotA[6];\n const a21 = rotA[7];\n const a22 = rotA[8];\n\n const b00 = rotB[0];\n const b01 = rotB[1];\n const b02 = rotB[2];\n const b10 = rotB[3];\n const b11 = rotB[4];\n const b12 = rotB[5];\n const b20 = rotB[6];\n const b21 = rotB[7];\n const b22 = rotB[8];\n\n // R[i][j] = dot(A axis i, B axis j); OBB axes are the rows read above. Kept as\n // flat scalar locals so every access stays in a register (no nested-array loads).\n const r00 = a00 * b00 + a01 * b01 + a02 * b02;\n const r01 = a00 * b10 + a01 * b11 + a02 * b12;\n const r02 = a00 * b20 + a01 * b21 + a02 * b22;\n const r10 = a10 * b00 + a11 * b01 + a12 * b02;\n const r11 = a10 * b10 + a11 * b11 + a12 * b12;\n const r12 = a10 * b20 + a11 * b21 + a12 * b22;\n const r20 = a20 * b00 + a21 * b01 + a22 * b02;\n const r21 = a20 * b10 + a21 * b11 + a22 * b12;\n const r22 = a20 * b20 + a21 * b21 + a22 * b22;\n\n // |R|, used to project box extents onto each candidate axis\n const q00 = Math.abs(r00);\n const q01 = Math.abs(r01);\n const q02 = Math.abs(r02);\n const q10 = Math.abs(r10);\n const q11 = Math.abs(r11);\n const q12 = Math.abs(r12);\n const q20 = Math.abs(r20);\n const q21 = Math.abs(r21);\n const q22 = Math.abs(r22);\n\n // Translation (b.center - a.center) brought into a's frame: t[i] = dot(t, A axis i)\n const dx = b.center[0] - a.center[0];\n const dy = b.center[1] - a.center[1];\n const dz = b.center[2] - a.center[2];\n const t0 = dx * a00 + dy * a01 + dz * a02;\n const t1 = dx * a10 + dy * a11 + dz * a12;\n const t2 = dx * a20 + dy * a21 + dz * a22;\n\n const ae0 = a.halfExtents[0];\n const ae1 = a.halfExtents[1];\n const ae2 = a.halfExtents[2];\n const be0 = b.halfExtents[0];\n const be1 = b.halfExtents[1];\n const be2 = b.halfExtents[2];\n\n let ra: number;\n let rb: number;\n\n // Test axes L = A0, A1, A2\n ra = ae0;\n rb = be0 * q00 + be1 * q01 + be2 * q02;\n if (Math.abs(t0) > ra + rb) return false;\n ra = ae1;\n rb = be0 * q10 + be1 * q11 + be2 * q12;\n if (Math.abs(t1) > ra + rb) return false;\n ra = ae2;\n rb = be0 * q20 + be1 * q21 + be2 * q22;\n if (Math.abs(t2) > ra + rb) return false;\n\n // Test axes L = B0, B1, B2\n ra = ae0 * q00 + ae1 * q10 + ae2 * q20;\n rb = be0;\n if (Math.abs(t0 * r00 + t1 * r10 + t2 * r20) > ra + rb) return false;\n ra = ae0 * q01 + ae1 * q11 + ae2 * q21;\n rb = be1;\n if (Math.abs(t0 * r01 + t1 * r11 + t2 * r21) > ra + rb) return false;\n ra = ae0 * q02 + ae1 * q12 + ae2 * q22;\n rb = be2;\n if (Math.abs(t0 * r02 + t1 * r12 + t2 * r22) > ra + rb) return false;\n\n // Test axis L = A0 x B0 (skip when A0 ∥ B0)\n if (1 - r00 * r00 >= epsilon) {\n ra = ae1 * q20 + ae2 * q10;\n rb = be1 * q02 + be2 * q01;\n if (Math.abs(t2 * r10 - t1 * r20) > ra + rb) return false;\n }\n\n // Test axis L = A0 x B1 (skip when A0 ∥ B1)\n if (1 - r01 * r01 >= epsilon) {\n ra = ae1 * q21 + ae2 * q11;\n rb = be0 * q02 + be2 * q00;\n if (Math.abs(t2 * r11 - t1 * r21) > ra + rb) return false;\n }\n\n // Test axis L = A0 x B2 (skip when A0 ∥ B2)\n if (1 - r02 * r02 >= epsilon) {\n ra = ae1 * q22 + ae2 * q12;\n rb = be0 * q01 + be1 * q00;\n if (Math.abs(t2 * r12 - t1 * r22) > ra + rb) return false;\n }\n\n // Test axis L = A1 x B0 (skip when A1 ∥ B0)\n if (1 - r10 * r10 >= epsilon) {\n ra = ae0 * q20 + ae2 * q00;\n rb = be1 * q12 + be2 * q11;\n if (Math.abs(t0 * r20 - t2 * r00) > ra + rb) return false;\n }\n\n // Test axis L = A1 x B1 (skip when A1 ∥ B1)\n if (1 - r11 * r11 >= epsilon) {\n ra = ae0 * q21 + ae2 * q01;\n rb = be0 * q12 + be2 * q10;\n if (Math.abs(t0 * r21 - t2 * r01) > ra + rb) return false;\n }\n\n // Test axis L = A1 x B2 (skip when A1 ∥ B2)\n if (1 - r12 * r12 >= epsilon) {\n ra = ae0 * q22 + ae2 * q02;\n rb = be0 * q11 + be1 * q10;\n if (Math.abs(t0 * r22 - t2 * r02) > ra + rb) return false;\n }\n\n // Test axis L = A2 x B0 (skip when A2 ∥ B0)\n if (1 - r20 * r20 >= epsilon) {\n ra = ae0 * q10 + ae1 * q00;\n rb = be1 * q22 + be2 * q21;\n if (Math.abs(t1 * r00 - t0 * r10) > ra + rb) return false;\n }\n\n // Test axis L = A2 x B1 (skip when A2 ∥ B1)\n if (1 - r21 * r21 >= epsilon) {\n ra = ae0 * q11 + ae1 * q01;\n rb = be0 * q22 + be2 * q20;\n if (Math.abs(t1 * r01 - t0 * r11) > ra + rb) return false;\n }\n\n // Test axis L = A2 x B2 (skip when A2 ∥ B2)\n if (1 - r22 * r22 >= epsilon) {\n ra = ae0 * q12 + ae1 * q02;\n rb = be0 * q21 + be1 * q20;\n if (Math.abs(t1 * r02 - t0 * r12) > ra + rb) return false;\n }\n\n // No separating axis found - OBBs must be intersecting\n return true;\n}\n\n/**\n * Tests whether an OBB intersects with an AABB.\n *\n * Specialised form of {@link intersectsOBB3}: the AABB's axes are the world axes, so\n * the axis dot-product matrix R is just the OBB's rotation (no 9 dot-products), and the\n * AABB's centre/half-extents come straight from its min/max. The near-parallel edge\n * skip works identically — here it fires when an OBB axis aligns with a world axis.\n *\n * @param obb - The OBB\n * @param aabb - The AABB (axis-aligned bounding box)\n * @returns true if they intersect\n */\nexport function intersectsBox3(obb: OBB3, aabb: Box3): boolean {\n const rotA = obb.rotation;\n const epsilon = EPSILON;\n\n // R[i][j] = dot(A axis i, AABB axis j) = A axis i's j-th component = rotA itself\n const r00 = rotA[0];\n const r01 = rotA[1];\n const r02 = rotA[2];\n const r10 = rotA[3];\n const r11 = rotA[4];\n const r12 = rotA[5];\n const r20 = rotA[6];\n const r21 = rotA[7];\n const r22 = rotA[8];\n\n const q00 = Math.abs(r00);\n const q01 = Math.abs(r01);\n const q02 = Math.abs(r02);\n const q10 = Math.abs(r10);\n const q11 = Math.abs(r11);\n const q12 = Math.abs(r12);\n const q20 = Math.abs(r20);\n const q21 = Math.abs(r21);\n const q22 = Math.abs(r22);\n\n // AABB centre and half-extents\n const bcx = (aabb[0] + aabb[3]) * 0.5;\n const bcy = (aabb[1] + aabb[4]) * 0.5;\n const bcz = (aabb[2] + aabb[5]) * 0.5;\n const be0 = (aabb[3] - aabb[0]) * 0.5;\n const be1 = (aabb[4] - aabb[1]) * 0.5;\n const be2 = (aabb[5] - aabb[2]) * 0.5;\n\n // Translation (aabb.center - obb.center) brought into the OBB's frame\n const dx = bcx - obb.center[0];\n const dy = bcy - obb.center[1];\n const dz = bcz - obb.center[2];\n const t0 = dx * r00 + dy * r01 + dz * r02;\n const t1 = dx * r10 + dy * r11 + dz * r12;\n const t2 = dx * r20 + dy * r21 + dz * r22;\n\n const ae0 = obb.halfExtents[0];\n const ae1 = obb.halfExtents[1];\n const ae2 = obb.halfExtents[2];\n\n let ra: number;\n let rb: number;\n\n // Test axes L = A0, A1, A2\n ra = ae0;\n rb = be0 * q00 + be1 * q01 + be2 * q02;\n if (Math.abs(t0) > ra + rb) return false;\n ra = ae1;\n rb = be0 * q10 + be1 * q11 + be2 * q12;\n if (Math.abs(t1) > ra + rb) return false;\n ra = ae2;\n rb = be0 * q20 + be1 * q21 + be2 * q22;\n if (Math.abs(t2) > ra + rb) return false;\n\n // Test axes L = B0, B1, B2\n ra = ae0 * q00 + ae1 * q10 + ae2 * q20;\n rb = be0;\n if (Math.abs(t0 * r00 + t1 * r10 + t2 * r20) > ra + rb) return false;\n ra = ae0 * q01 + ae1 * q11 + ae2 * q21;\n rb = be1;\n if (Math.abs(t0 * r01 + t1 * r11 + t2 * r21) > ra + rb) return false;\n ra = ae0 * q02 + ae1 * q12 + ae2 * q22;\n rb = be2;\n if (Math.abs(t0 * r02 + t1 * r12 + t2 * r22) > ra + rb) return false;\n\n // Test axis L = A0 x B0 (skip when A0 aligns with world X)\n if (1 - r00 * r00 >= epsilon) {\n ra = ae1 * q20 + ae2 * q10;\n rb = be1 * q02 + be2 * q01;\n if (Math.abs(t2 * r10 - t1 * r20) > ra + rb) return false;\n }\n\n // Test axis L = A0 x B1 (skip when A0 aligns with world Y)\n if (1 - r01 * r01 >= epsilon) {\n ra = ae1 * q21 + ae2 * q11;\n rb = be0 * q02 + be2 * q00;\n if (Math.abs(t2 * r11 - t1 * r21) > ra + rb) return false;\n }\n\n // Test axis L = A0 x B2 (skip when A0 aligns with world Z)\n if (1 - r02 * r02 >= epsilon) {\n ra = ae1 * q22 + ae2 * q12;\n rb = be0 * q01 + be1 * q00;\n if (Math.abs(t2 * r12 - t1 * r22) > ra + rb) return false;\n }\n\n // Test axis L = A1 x B0 (skip when A1 aligns with world X)\n if (1 - r10 * r10 >= epsilon) {\n ra = ae0 * q20 + ae2 * q00;\n rb = be1 * q12 + be2 * q11;\n if (Math.abs(t0 * r20 - t2 * r00) > ra + rb) return false;\n }\n\n // Test axis L = A1 x B1 (skip when A1 aligns with world Y)\n if (1 - r11 * r11 >= epsilon) {\n ra = ae0 * q21 + ae2 * q01;\n rb = be0 * q12 + be2 * q10;\n if (Math.abs(t0 * r21 - t2 * r01) > ra + rb) return false;\n }\n\n // Test axis L = A1 x B2 (skip when A1 aligns with world Z)\n if (1 - r12 * r12 >= epsilon) {\n ra = ae0 * q22 + ae2 * q02;\n rb = be0 * q11 + be1 * q10;\n if (Math.abs(t0 * r22 - t2 * r02) > ra + rb) return false;\n }\n\n // Test axis L = A2 x B0 (skip when A2 aligns with world X)\n if (1 - r20 * r20 >= epsilon) {\n ra = ae0 * q10 + ae1 * q00;\n rb = be1 * q22 + be2 * q21;\n if (Math.abs(t1 * r00 - t0 * r10) > ra + rb) return false;\n }\n\n // Test axis L = A2 x B1 (skip when A2 aligns with world Y)\n if (1 - r21 * r21 >= epsilon) {\n ra = ae0 * q11 + ae1 * q01;\n rb = be0 * q22 + be2 * q20;\n if (Math.abs(t1 * r01 - t0 * r11) > ra + rb) return false;\n }\n\n // Test axis L = A2 x B2 (skip when A2 aligns with world Z)\n if (1 - r22 * r22 >= epsilon) {\n ra = ae0 * q12 + ae1 * q02;\n rb = be0 * q21 + be1 * q20;\n if (Math.abs(t1 * r02 - t0 * r12) > ra + rb) return false;\n }\n\n return true;\n}\n\n/**\n * Applies a 4x4 transformation matrix to an OBB.\n * This can be used to transform the bounding volume with the world matrix\n * of a 3D object to keep both entities in sync.\n *\n * @param out - The transformed OBB\n * @param obb - The OBB to transform\n * @param matrix - The 4x4 transformation matrix\n * @returns out\n */\nexport function applyMatrix4(out: OBB3, obb: OBB3, matrix: Mat4): OBB3 {\n // read the upper-left 3x3 (the affine linear part) into locals once. Columns\n // m0*, m1*, m2* correspond to mat4 columns 0, 1, 2.\n const m00 = matrix[0];\n const m01 = matrix[1];\n const m02 = matrix[2];\n const m10 = matrix[4];\n const m11 = matrix[5];\n const m12 = matrix[6];\n const m20 = matrix[8];\n const m21 = matrix[9];\n const m22 = matrix[10];\n\n // extract scale as the length of each column (always non-negative).\n const sx = Math.sqrt(m00 * m00 + m01 * m01 + m02 * m02);\n const sy = Math.sqrt(m10 * m10 + m11 * m11 + m12 * m12);\n const sz = Math.sqrt(m20 * m20 + m21 * m21 + m22 * m22);\n\n // handle negative scale (reflection).\n // for an affine matrix the 4x4 determinant equals the upper-left 3x3 determinant, so we only need that (and only its sign).\n // the reflection is folded into the first rotation column via invSX so that the extracted basis stays right-handed while the half extents remain positive.\n const det = m00 * (m11 * m22 - m21 * m12) - m10 * (m01 * m22 - m21 * m02) + m20 * (m01 * m12 - m11 * m02);\n const invSX = (det < 0 ? -1 : 1) / sx;\n const invSY = 1 / sy;\n const invSZ = 1 / sz;\n\n // normalized rotation columns (scale removed).\n const r00 = m00 * invSX;\n const r01 = m01 * invSX;\n const r02 = m02 * invSX;\n const r10 = m10 * invSY;\n const r11 = m11 * invSY;\n const r12 = m12 * invSY;\n const r20 = m20 * invSZ;\n const r21 = m21 * invSZ;\n const r22 = m22 * invSZ;\n\n // cache the obb's rotation before writing to out.rotation (supports out === obb).\n const q = obb.rotation;\n const q0 = q[0];\n const q1 = q[1];\n const q2 = q[2];\n const q3 = q[3];\n const q4 = q[4];\n const q5 = q[5];\n const q6 = q[6];\n const q7 = q[7];\n const q8 = q[8];\n\n // combine rotations: out.rotation = extractedRotation * obb.rotation (inlined mat3.multiply).\n const outRotation = out.rotation;\n outRotation[0] = q0 * r00 + q1 * r10 + q2 * r20;\n outRotation[1] = q0 * r01 + q1 * r11 + q2 * r21;\n outRotation[2] = q0 * r02 + q1 * r12 + q2 * r22;\n outRotation[3] = q3 * r00 + q4 * r10 + q5 * r20;\n outRotation[4] = q3 * r01 + q4 * r11 + q5 * r21;\n outRotation[5] = q3 * r02 + q4 * r12 + q5 * r22;\n outRotation[6] = q6 * r00 + q7 * r10 + q8 * r20;\n outRotation[7] = q6 * r01 + q7 * r11 + q8 * r21;\n outRotation[8] = q6 * r02 + q7 * r12 + q8 * r22;\n\n // scale half extents (sx/sy/sz are already the positive scale magnitudes).\n const he = obb.halfExtents;\n const outHalfExtents = out.halfExtents;\n outHalfExtents[0] = he[0] * sx;\n outHalfExtents[1] = he[1] * sy;\n outHalfExtents[2] = he[2] * sz;\n\n // transform center through the full matrix (rotation + translation, inlined transformMat4).\n const c = obb.center;\n const cx = c[0];\n const cy = c[1];\n const cz = c[2];\n let w = matrix[3] * cx + matrix[7] * cy + matrix[11] * cz + matrix[15];\n w = w || 1.0;\n const outCenter = out.center;\n outCenter[0] = (m00 * cx + m10 * cy + m20 * cz + matrix[12]) / w;\n outCenter[1] = (m01 * cx + m11 * cy + m21 * cz + matrix[13]) / w;\n outCenter[2] = (m02 * cx + m12 * cy + m22 * cz + matrix[14]) / w;\n\n return out;\n}\n"],"names":["mat3.create","mat3.clone","mat3.fromQuat","mat3.identity"],"mappings":";;;SAWgB,MAAM,GAAA;AAClB,IAAA,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,QAAQ,EAAEA,QAAW,EAAE,EAAE;AACjF;AAEM,SAAU,KAAK,CAAC,CAAO,EAAA;IACzB,OAAO;QACH,MAAM,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAC/C,WAAW,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;QACnE,QAAQ,EAAEC,OAAU,CAAC,CAAC,CAAC,QAAQ,CAAC;KACnC;AACL;AAEM,SAAU,IAAI,CAAC,GAAS,EAAE,CAAO,EAAA;AACnC,IAAA,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;AAC3B,IAAA,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;AAC3B,IAAA,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;AAC3B,IAAA,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC;AACrC,IAAA,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC;AACrC,IAAA,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC;AACrC,IAAA,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;AAC/B,IAAA,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;AAC/B,IAAA,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;AAC/B,IAAA,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;AAC/B,IAAA,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;AAC/B,IAAA,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;AAC/B,IAAA,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;AAC/B,IAAA,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;AAC/B,IAAA,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;AAC/B,IAAA,OAAO,GAAG;AACd;AAEA;;;;;;;AAOG;AACG,SAAU,GAAG,CAAC,GAAS,EAAE,MAAY,EAAE,WAAiB,EAAE,QAAc,EAAA;IAC1E,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC;IACzB,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC;IACzB,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC;IACzB,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC;IACnC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC;IACnC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC;IACnC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC;IAC7B,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC;IAC7B,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC;IAC7B,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC;IAC7B,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC;IAC7B,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC;IAC7B,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC;IAC7B,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC;IAC7B,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC;AAC7B,IAAA,OAAO,GAAG;AACd;AAEA;;;;;;;;;AASG;AACG,SAAU,kCAAkC,CAAC,GAAS,EAAE,MAAY,EAAE,WAAiB,EAAE,CAAO,EAAA;IAClG,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC;IACzB,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC;IACzB,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC;IACzB,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC;IACnC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC;IACnC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC;IACnCC,QAAa,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC;AAC9B,IAAA,OAAO,GAAG;AACd;AAEA;;;;;;;;AAQG;AACG,SAAU,WAAW,CAAC,GAAS,EAAE,IAAU,EAAA;;AAE7C,IAAA,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,GAAG;AACzC,IAAA,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,GAAG;AACzC,IAAA,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,GAAG;;AAGzC,IAAA,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,GAAG;AAC9C,IAAA,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,GAAG;AAC9C,IAAA,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,GAAG;;AAG9C,IAAAC,QAAa,CAAC,GAAG,CAAC,QAAQ,CAAC;AAE3B,IAAA,OAAO,GAAG;AACd;AAEA;;;;;;AAMG;AACG,SAAU,aAAa,CAAC,GAAS,EAAE,KAAW,EAAA;;AAEhD,IAAA,MAAM,EAAE,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;AACnC,IAAA,MAAM,EAAE,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;AACnC,IAAA,MAAM,EAAE,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;;;AAInC,IAAA,MAAM,CAAC,GAAG,GAAG,CAAC,QAAQ;IACtB,MAAM,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;IAC5C,MAAM,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;IAC5C,MAAM,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;AAE5C,IAAA,OAAO,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC;AACzH;AAEA;;;;;;;;;AASG;SACa,UAAU,CAAC,GAAS,EAAE,GAAS,EAAE,KAAW,EAAA;;AAExD,IAAA,MAAM,CAAC,GAAG,GAAG,CAAC,QAAQ;;AAGtB,IAAA,MAAM,EAAE,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;AACnC,IAAA,MAAM,EAAE,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;AACnC,IAAA,MAAM,EAAE,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;;IAGnC,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;IACtB,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;IACtB,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;;IAGtB,IAAI,IAAI,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;IAC5C,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;IACxE,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI;IACrB,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI;IACrB,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI;;IAGrB,IAAI,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;IACxC,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;IACxE,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI;IACrB,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI;IACrB,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI;;IAGrB,IAAI,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;IACxC,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;IACxE,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI;IACrB,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI;IACrB,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI;AAErB,IAAA,OAAO,GAAG;AACd;AAEA;;;;;;;;;;;;;;;;AAgBG;AACG,SAAU,cAAc,CAAC,CAAO,EAAE,CAAO,EAAE,OAAO,GAAG,OAAO,EAAA;AAC9D,IAAA,MAAM,IAAI,GAAG,CAAC,CAAC,QAAQ;AACvB,IAAA,MAAM,IAAI,GAAG,CAAC,CAAC,QAAQ;AAEvB,IAAA,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC;AACnB,IAAA,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC;AACnB,IAAA,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC;AACnB,IAAA,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC;AACnB,IAAA,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC;AACnB,IAAA,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC;AACnB,IAAA,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC;AACnB,IAAA,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC;AACnB,IAAA,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC;AAEnB,IAAA,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC;AACnB,IAAA,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC;AACnB,IAAA,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC;AACnB,IAAA,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC;AACnB,IAAA,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC;AACnB,IAAA,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC;AACnB,IAAA,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC;AACnB,IAAA,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC;AACnB,IAAA,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC;;;AAInB,IAAA,MAAM,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG;AAC7C,IAAA,MAAM,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG;AAC7C,IAAA,MAAM,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG;AAC7C,IAAA,MAAM,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG;AAC7C,IAAA,MAAM,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG;AAC7C,IAAA,MAAM,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG;AAC7C,IAAA,MAAM,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,G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"}
|