@flighthq/collision 0.5.1-next.903.f434bc2 → 0.5.1-next.905.5fbf787
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -2
- package/package.json +5 -5
- package/src/contactManifold2D.test.ts +10 -1
- package/src/contactManifold3D.test.ts +10 -1
- package/src/gjkDistance3D.test.ts +6 -1
- package/src/manifold2D.test.ts +6 -1
- package/src/manifold3D.test.ts +6 -1
- package/src/raycastCollisionShape2D.test.ts +10 -1
- package/src/raycastCollisionShape3D.test.ts +10 -1
- package/src/sweepCollisionShape2D.test.ts +10 -1
- package/src/sweepCollisionShape3D.test.ts +14 -5
- package/src/triangleMesh3D.test.ts +17 -4
package/README.md
CHANGED
|
@@ -13,5 +13,5 @@ Import the supported application-facing API from `@flighthq/collision`. The `@fl
|
|
|
13
13
|
This package is part of the locked-version Flight SDK graph. Applications may instead install and import `@flighthq/sdk` when package-level tree shaking is sufficient.
|
|
14
14
|
|
|
15
15
|
- [Flight project](https://github.com/flighthq/flight)
|
|
16
|
-
- [Source for @flighthq/collision@0.5.1-next.
|
|
17
|
-
- [License](https://github.com/flighthq/flight/blob/
|
|
16
|
+
- [Source for @flighthq/collision@0.5.1-next.905.5fbf787](https://github.com/flighthq/flight/tree/5fbf7874064c384307542d68b4dcb6a895ff0dcf/packages/collision)
|
|
17
|
+
- [License](https://github.com/flighthq/flight/blob/5fbf7874064c384307542d68b4dcb6a895ff0dcf/LICENSE.md)
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@flighthq/collision",
|
|
3
|
-
"version": "0.5.1-next.
|
|
3
|
+
"version": "0.5.1-next.905.5fbf787",
|
|
4
4
|
"author": "Joshua Granick and other contributors",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": {
|
|
@@ -38,10 +38,10 @@
|
|
|
38
38
|
"clean:dist": "tsx ../../scripts/clean-package-dist.ts"
|
|
39
39
|
},
|
|
40
40
|
"dependencies": {
|
|
41
|
-
"@flighthq/entity": "0.5.1-next.
|
|
42
|
-
"@flighthq/geometry": "0.5.1-next.
|
|
43
|
-
"@flighthq/log": "0.5.1-next.
|
|
44
|
-
"@flighthq/types": "0.5.1-next.
|
|
41
|
+
"@flighthq/entity": "0.5.1-next.905.5fbf787",
|
|
42
|
+
"@flighthq/geometry": "0.5.1-next.905.5fbf787",
|
|
43
|
+
"@flighthq/log": "0.5.1-next.905.5fbf787",
|
|
44
|
+
"@flighthq/types": "0.5.1-next.905.5fbf787"
|
|
45
45
|
},
|
|
46
46
|
"devDependencies": {
|
|
47
47
|
"typescript": "^5.3.0"
|
|
@@ -1,6 +1,10 @@
|
|
|
1
1
|
import { describe, expect, it } from 'vitest';
|
|
2
2
|
|
|
3
|
-
import {
|
|
3
|
+
import {
|
|
4
|
+
clearCollisionContactManifold2D,
|
|
5
|
+
createCollisionContactManifold2D,
|
|
6
|
+
initializeCollisionContactManifold2D,
|
|
7
|
+
} from './contactManifold2D';
|
|
4
8
|
|
|
5
9
|
describe('clearCollisionContactManifold2D', () => {
|
|
6
10
|
it('resets the manifold to the non-overlapping state', () => {
|
|
@@ -53,3 +57,8 @@ describe('createCollisionContactManifold2D', () => {
|
|
|
53
57
|
expect(first.points[0]).not.toBe(second.points[0]);
|
|
54
58
|
});
|
|
55
59
|
});
|
|
60
|
+
describe('initializeCollisionContactManifold2D', () => {
|
|
61
|
+
it('is the construction initializer of createCollisionContactManifold2D', () => {
|
|
62
|
+
expect(typeof initializeCollisionContactManifold2D).toBe('function');
|
|
63
|
+
});
|
|
64
|
+
});
|
|
@@ -1,7 +1,11 @@
|
|
|
1
1
|
import { MAX_COLLISION_CONTACT_POINTS_3D } from '@flighthq/types/contract';
|
|
2
2
|
import { describe, expect, it } from 'vitest';
|
|
3
3
|
|
|
4
|
-
import {
|
|
4
|
+
import {
|
|
5
|
+
clearCollisionContactManifold3D,
|
|
6
|
+
createCollisionContactManifold3D,
|
|
7
|
+
initializeCollisionContactManifold3D,
|
|
8
|
+
} from './contactManifold3D';
|
|
5
9
|
|
|
6
10
|
describe('clearCollisionContactManifold3D', () => {
|
|
7
11
|
it('resets the overlap state and the point count', () => {
|
|
@@ -42,3 +46,8 @@ describe('createCollisionContactManifold3D', () => {
|
|
|
42
46
|
expect(createCollisionContactManifold3D().points).not.toBe(createCollisionContactManifold3D().points);
|
|
43
47
|
});
|
|
44
48
|
});
|
|
49
|
+
describe('initializeCollisionContactManifold3D', () => {
|
|
50
|
+
it('is the construction initializer of createCollisionContactManifold3D', () => {
|
|
51
|
+
expect(typeof initializeCollisionContactManifold3D).toBe('function');
|
|
52
|
+
});
|
|
53
|
+
});
|
|
@@ -2,7 +2,7 @@ import type { CollisionShape3D } from '@flighthq/types/contract';
|
|
|
2
2
|
import { beforeEach, describe, expect, it } from 'vitest';
|
|
3
3
|
|
|
4
4
|
import { registerBuiltInCollisionSupports3D } from './collisionSupport3D';
|
|
5
|
-
import { createCollisionDistance3D, writeCollisionDistance3D } from './gjkDistance3D';
|
|
5
|
+
import { createCollisionDistance3D, initializeCollisionDistance3D, writeCollisionDistance3D } from './gjkDistance3D';
|
|
6
6
|
|
|
7
7
|
beforeEach(() => {
|
|
8
8
|
registerBuiltInCollisionSupports3D();
|
|
@@ -36,6 +36,11 @@ describe('createCollisionDistance3D', () => {
|
|
|
36
36
|
});
|
|
37
37
|
});
|
|
38
38
|
|
|
39
|
+
describe('initializeCollisionDistance3D', () => {
|
|
40
|
+
it('is the construction initializer of createCollisionDistance3D', () => {
|
|
41
|
+
expect(typeof initializeCollisionDistance3D).toBe('function');
|
|
42
|
+
});
|
|
43
|
+
});
|
|
39
44
|
describe('writeCollisionDistance3D', () => {
|
|
40
45
|
it('matches the closed form for two separated spheres', () => {
|
|
41
46
|
// Centres 10 apart, radii 1 and 2, so the surfaces are 7 apart. Exact, not approximate: a sphere's
|
package/src/manifold2D.test.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { describe, expect, it } from 'vitest';
|
|
2
2
|
|
|
3
|
-
import { clearCollisionManifold2D, createCollisionManifold2D } from './manifold2D';
|
|
3
|
+
import { clearCollisionManifold2D, createCollisionManifold2D, initializeCollisionManifold2D } from './manifold2D';
|
|
4
4
|
|
|
5
5
|
describe('clearCollisionManifold2D', () => {
|
|
6
6
|
it('resets every field to the non-overlapping state', () => {
|
|
@@ -33,3 +33,8 @@ describe('createCollisionManifold2D', () => {
|
|
|
33
33
|
expect(b.overlapping).toBe(false);
|
|
34
34
|
});
|
|
35
35
|
});
|
|
36
|
+
describe('initializeCollisionManifold2D', () => {
|
|
37
|
+
it('is the construction initializer of createCollisionManifold2D', () => {
|
|
38
|
+
expect(typeof initializeCollisionManifold2D).toBe('function');
|
|
39
|
+
});
|
|
40
|
+
});
|
package/src/manifold3D.test.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { describe, expect, it } from 'vitest';
|
|
2
2
|
|
|
3
|
-
import { clearCollisionManifold3D, createCollisionManifold3D } from './manifold3D';
|
|
3
|
+
import { clearCollisionManifold3D, createCollisionManifold3D, initializeCollisionManifold3D } from './manifold3D';
|
|
4
4
|
|
|
5
5
|
describe('clearCollisionManifold3D', () => {
|
|
6
6
|
it('resets every field so a reused out never carries a stale normal into a miss', () => {
|
|
@@ -30,3 +30,8 @@ describe('createCollisionManifold3D', () => {
|
|
|
30
30
|
expect(createCollisionManifold3D()).not.toBe(createCollisionManifold3D());
|
|
31
31
|
});
|
|
32
32
|
});
|
|
33
|
+
describe('initializeCollisionManifold3D', () => {
|
|
34
|
+
it('is the construction initializer of createCollisionManifold3D', () => {
|
|
35
|
+
expect(typeof initializeCollisionManifold3D).toBe('function');
|
|
36
|
+
});
|
|
37
|
+
});
|
|
@@ -2,7 +2,11 @@ import type { CollisionRaycastHit2D, CollisionBuiltInShape2D } from '@flighthq/t
|
|
|
2
2
|
import { describe, expect, it } from 'vitest';
|
|
3
3
|
|
|
4
4
|
import { getCollisionShapeContainsPoint2D } from './pointContainment2D';
|
|
5
|
-
import {
|
|
5
|
+
import {
|
|
6
|
+
createCollisionRaycastHit2D,
|
|
7
|
+
initializeCollisionRaycastHit2D,
|
|
8
|
+
raycastCollisionShape2D,
|
|
9
|
+
} from './raycastCollisionShape2D';
|
|
6
10
|
|
|
7
11
|
function hit(): CollisionRaycastHit2D {
|
|
8
12
|
return createCollisionRaycastHit2D();
|
|
@@ -14,6 +18,11 @@ describe('createCollisionRaycastHit2D', () => {
|
|
|
14
18
|
});
|
|
15
19
|
});
|
|
16
20
|
|
|
21
|
+
describe('initializeCollisionRaycastHit2D', () => {
|
|
22
|
+
it('is the construction initializer of createCollisionRaycastHit2D', () => {
|
|
23
|
+
expect(typeof initializeCollisionRaycastHit2D).toBe('function');
|
|
24
|
+
});
|
|
25
|
+
});
|
|
17
26
|
describe('raycastCollisionShape2D', () => {
|
|
18
27
|
it('keeps polygon center state isolated from a nested raycast triggered by a point getter', () => {
|
|
19
28
|
const points = [2, -1, 4, -1, 4, 1, 2, 1];
|
|
@@ -2,7 +2,11 @@ import type { CollisionBuiltInShape3D, CollisionRaycastHit3D } from '@flighthq/t
|
|
|
2
2
|
import { beforeEach, describe, expect, it } from 'vitest';
|
|
3
3
|
|
|
4
4
|
import { registerBuiltInCollisionSupports3D } from './collisionSupport3D';
|
|
5
|
-
import {
|
|
5
|
+
import {
|
|
6
|
+
createCollisionRaycastHit3D,
|
|
7
|
+
initializeCollisionRaycastHit3D,
|
|
8
|
+
raycastCollisionShape3D,
|
|
9
|
+
} from './raycastCollisionShape3D';
|
|
6
10
|
|
|
7
11
|
beforeEach(() => {
|
|
8
12
|
registerBuiltInCollisionSupports3D();
|
|
@@ -39,6 +43,11 @@ describe('createCollisionRaycastHit3D', () => {
|
|
|
39
43
|
});
|
|
40
44
|
});
|
|
41
45
|
|
|
46
|
+
describe('initializeCollisionRaycastHit3D', () => {
|
|
47
|
+
it('is the construction initializer of createCollisionRaycastHit3D', () => {
|
|
48
|
+
expect(typeof initializeCollisionRaycastHit3D).toBe('function');
|
|
49
|
+
});
|
|
50
|
+
});
|
|
42
51
|
describe('raycastCollisionShape3D', () => {
|
|
43
52
|
const sphere: CollisionBuiltInShape3D = { kind: 'sphere', x: 5, y: 0, z: 0, radius: 1 };
|
|
44
53
|
const aabb: CollisionBuiltInShape3D = { kind: 'aabb', minX: 4, minY: -1, minZ: -1, maxX: 6, maxY: 1, maxZ: 1 };
|
|
@@ -3,7 +3,11 @@ import { describe, expect, it } from 'vitest';
|
|
|
3
3
|
|
|
4
4
|
import { collideContactManifold2D } from './collideContactManifold2D';
|
|
5
5
|
import { createCollisionContactManifold2D } from './contactManifold2D';
|
|
6
|
-
import {
|
|
6
|
+
import {
|
|
7
|
+
createCollisionTimeOfImpact2D,
|
|
8
|
+
initializeCollisionTimeOfImpact2D,
|
|
9
|
+
sweepCollisionShape2D,
|
|
10
|
+
} from './sweepCollisionShape2D';
|
|
7
11
|
|
|
8
12
|
type CollisionCapsule2D = Extract<CollisionBuiltInShape2D, { kind: 'capsule' }>;
|
|
9
13
|
type CollisionSweepTarget2D = Extract<CollisionBuiltInShape2D, { kind: 'aabb' | 'capsule' | 'circle' | 'obb' }>;
|
|
@@ -21,6 +25,11 @@ describe('createCollisionTimeOfImpact2D', () => {
|
|
|
21
25
|
});
|
|
22
26
|
});
|
|
23
27
|
|
|
28
|
+
describe('initializeCollisionTimeOfImpact2D', () => {
|
|
29
|
+
it('is the construction initializer of createCollisionTimeOfImpact2D', () => {
|
|
30
|
+
expect(typeof initializeCollisionTimeOfImpact2D).toBe('function');
|
|
31
|
+
});
|
|
32
|
+
});
|
|
24
33
|
describe('sweepCollisionShape2D', () => {
|
|
25
34
|
it('keeps continuous-SAT state isolated from a nested sweep triggered by the output setter', () => {
|
|
26
35
|
const out = createCollisionTimeOfImpact2D();
|
|
@@ -4,7 +4,11 @@ import { beforeEach, describe, expect, it } from 'vitest';
|
|
|
4
4
|
|
|
5
5
|
import { registerBuiltInCollisionSupports3D } from './collisionSupport3D';
|
|
6
6
|
import { createCollisionManifold3D } from './manifold3D';
|
|
7
|
-
import {
|
|
7
|
+
import {
|
|
8
|
+
createCollisionTimeOfImpact3D,
|
|
9
|
+
initializeCollisionTimeOfImpact3D,
|
|
10
|
+
sweepCollisionShape3D,
|
|
11
|
+
} from './sweepCollisionShape3D';
|
|
8
12
|
import { testCollision3D } from './testCollision3D';
|
|
9
13
|
|
|
10
14
|
beforeEach(() => {
|
|
@@ -35,6 +39,15 @@ describe('createCollisionTimeOfImpact3D', () => {
|
|
|
35
39
|
});
|
|
36
40
|
});
|
|
37
41
|
|
|
42
|
+
describe('initializeCollisionTimeOfImpact3D', () => {
|
|
43
|
+
it('is the construction initializer of createCollisionTimeOfImpact3D', () => {
|
|
44
|
+
expect(typeof initializeCollisionTimeOfImpact3D).toBe('function');
|
|
45
|
+
});
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
function createManifold(): CollisionManifold3D {
|
|
49
|
+
return createCollisionManifold3D();
|
|
50
|
+
}
|
|
38
51
|
describe('sweepCollisionShape3D', () => {
|
|
39
52
|
it('finds the exact impact fraction for two approaching spheres', () => {
|
|
40
53
|
// A at x=0 r=1 moving +10x; B fixed at x=10 r=1. Surfaces meet when the centres are 2 apart, so A
|
|
@@ -182,7 +195,3 @@ describe('sweepCollisionShape3D', () => {
|
|
|
182
195
|
expect(out.fraction).toBeLessThan(1);
|
|
183
196
|
});
|
|
184
197
|
});
|
|
185
|
-
|
|
186
|
-
function createManifold(): CollisionManifold3D {
|
|
187
|
-
return createCollisionManifold3D();
|
|
188
|
-
}
|
|
@@ -13,6 +13,8 @@ import {
|
|
|
13
13
|
createCollisionTriangleMesh3D,
|
|
14
14
|
getCollisionHeightfieldValidationStatus3D,
|
|
15
15
|
getCollisionTriangleMeshValidationStatus3D,
|
|
16
|
+
initializeCollisionHeightfield3D,
|
|
17
|
+
initializeCollisionTriangleMesh3D,
|
|
16
18
|
invalidateCollisionHeightfield3D,
|
|
17
19
|
invalidateCollisionTriangleMesh3D,
|
|
18
20
|
raycastCollisionHeightfield3D,
|
|
@@ -157,6 +159,18 @@ describe('getCollisionTriangleMeshValidationStatus3D', () => {
|
|
|
157
159
|
});
|
|
158
160
|
});
|
|
159
161
|
|
|
162
|
+
describe('initializeCollisionHeightfield3D', () => {
|
|
163
|
+
it('is the construction initializer of createCollisionHeightfield3D', () => {
|
|
164
|
+
expect(typeof initializeCollisionHeightfield3D).toBe('function');
|
|
165
|
+
});
|
|
166
|
+
});
|
|
167
|
+
|
|
168
|
+
describe('initializeCollisionTriangleMesh3D', () => {
|
|
169
|
+
it('is the construction initializer of createCollisionTriangleMesh3D', () => {
|
|
170
|
+
expect(typeof initializeCollisionTriangleMesh3D).toBe('function');
|
|
171
|
+
});
|
|
172
|
+
});
|
|
173
|
+
|
|
160
174
|
describe('invalidateCollisionHeightfield3D', () => {
|
|
161
175
|
it('increments the payload version', () => {
|
|
162
176
|
const heightfield = createCollisionHeightfield3D(2, 2, [0, 0, 0, 0]);
|
|
@@ -217,6 +231,9 @@ describe('sweepCollisionTriangleMesh3D', () => {
|
|
|
217
231
|
});
|
|
218
232
|
});
|
|
219
233
|
|
|
234
|
+
function createFloorMesh() {
|
|
235
|
+
return createCollisionTriangleMesh3D([-5, 0, -5, 5, 0, -5, 5, 0, 5, -5, 0, 5], [0, 2, 1, 0, 3, 2]);
|
|
236
|
+
}
|
|
220
237
|
describe('writeCollisionHeightfieldBounds3D', () => {
|
|
221
238
|
it('includes the height samples and pose', () => {
|
|
222
239
|
const heightfield = createCollisionHeightfield3D(2, 2, [0, 1, -1, 0], 2, 3);
|
|
@@ -241,7 +258,3 @@ describe('writeCollisionTriangleMeshBounds3D', () => {
|
|
|
241
258
|
expect(bounds.maxY).toBeCloseTo(5, 12);
|
|
242
259
|
});
|
|
243
260
|
});
|
|
244
|
-
|
|
245
|
-
function createFloorMesh() {
|
|
246
|
-
return createCollisionTriangleMesh3D([-5, 0, -5, 5, 0, -5, 5, 0, 5, -5, 0, 5], [0, 2, 1, 0, 3, 2]);
|
|
247
|
-
}
|