@flighthq/physics3d 0.4.0-next.1725.752ca79 → 0.4.0-next.1749.d81a21c

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.
Files changed (110) hide show
  1. package/dist/broadphase.d.ts +4 -0
  2. package/dist/broadphase.d.ts.map +1 -0
  3. package/dist/broadphase.js +152 -0
  4. package/dist/broadphase.js.map +1 -0
  5. package/dist/colliderTransform.d.ts +5 -0
  6. package/dist/colliderTransform.d.ts.map +1 -0
  7. package/dist/colliderTransform.js +245 -0
  8. package/dist/colliderTransform.js.map +1 -0
  9. package/dist/contactIntake.d.ts +4 -0
  10. package/dist/contactIntake.d.ts.map +1 -0
  11. package/dist/contactIntake.js +218 -0
  12. package/dist/contactIntake.js.map +1 -0
  13. package/dist/contacts.d.ts +1 -1
  14. package/dist/contacts.d.ts.map +1 -1
  15. package/dist/contacts.js +17 -8
  16. package/dist/contacts.js.map +1 -1
  17. package/dist/continuous.d.ts +4 -0
  18. package/dist/continuous.d.ts.map +1 -0
  19. package/dist/continuous.js +229 -0
  20. package/dist/continuous.js.map +1 -0
  21. package/dist/contract.d.ts +10 -0
  22. package/dist/contract.d.ts.map +1 -1
  23. package/dist/contract.js +10 -0
  24. package/dist/contract.js.map +1 -1
  25. package/dist/debugGeometry.d.ts +4 -0
  26. package/dist/debugGeometry.d.ts.map +1 -0
  27. package/dist/debugGeometry.js +211 -0
  28. package/dist/debugGeometry.js.map +1 -0
  29. package/dist/enablePhysics3DGuards.d.ts.map +1 -1
  30. package/dist/enablePhysics3DGuards.js +24 -1
  31. package/dist/enablePhysics3DGuards.js.map +1 -1
  32. package/dist/explainPhysics3DCollision.d.ts +3 -0
  33. package/dist/explainPhysics3DCollision.d.ts.map +1 -0
  34. package/dist/explainPhysics3DCollision.js +28 -0
  35. package/dist/explainPhysics3DCollision.js.map +1 -0
  36. package/dist/index.d.ts +11 -4
  37. package/dist/index.d.ts.map +1 -1
  38. package/dist/index.js +11 -4
  39. package/dist/index.js.map +1 -1
  40. package/dist/islands.js +4 -4
  41. package/dist/islands.js.map +1 -1
  42. package/dist/jointBreakage.d.ts +5 -0
  43. package/dist/jointBreakage.d.ts.map +1 -0
  44. package/dist/jointBreakage.js +44 -0
  45. package/dist/jointBreakage.js.map +1 -0
  46. package/dist/jointFactories.d.ts +2 -1
  47. package/dist/jointFactories.d.ts.map +1 -1
  48. package/dist/jointFactories.js +22 -1
  49. package/dist/jointFactories.js.map +1 -1
  50. package/dist/jointReaction.d.ts +8 -0
  51. package/dist/jointReaction.d.ts.map +1 -0
  52. package/dist/jointReaction.js +65 -0
  53. package/dist/jointReaction.js.map +1 -0
  54. package/dist/joints.d.ts +2 -0
  55. package/dist/joints.d.ts.map +1 -1
  56. package/dist/joints.js +264 -1
  57. package/dist/joints.js.map +1 -1
  58. package/dist/massProperties.d.ts +4 -1
  59. package/dist/massProperties.d.ts.map +1 -1
  60. package/dist/massProperties.js +241 -3
  61. package/dist/massProperties.js.map +1 -1
  62. package/dist/material.d.ts +3 -0
  63. package/dist/material.d.ts.map +1 -0
  64. package/dist/material.js +13 -0
  65. package/dist/material.js.map +1 -0
  66. package/dist/ownership.d.ts +2 -1
  67. package/dist/ownership.d.ts.map +1 -1
  68. package/dist/ownership.js +4 -0
  69. package/dist/ownership.js.map +1 -1
  70. package/dist/registerBuiltInPhysics3DJointSolvers.d.ts.map +1 -1
  71. package/dist/registerBuiltInPhysics3DJointSolvers.js +2 -1
  72. package/dist/registerBuiltInPhysics3DJointSolvers.js.map +1 -1
  73. package/dist/solver.d.ts.map +1 -1
  74. package/dist/solver.js +58 -9
  75. package/dist/solver.js.map +1 -1
  76. package/dist/step.d.ts.map +1 -1
  77. package/dist/step.js +23 -0
  78. package/dist/step.js.map +1 -1
  79. package/dist/stepValidation.js +12 -0
  80. package/dist/stepValidation.js.map +1 -1
  81. package/dist/world.d.ts +7 -3
  82. package/dist/world.d.ts.map +1 -1
  83. package/dist/world.js +133 -9
  84. package/dist/world.js.map +1 -1
  85. package/dist/worldQueries.d.ts +9 -0
  86. package/dist/worldQueries.d.ts.map +1 -0
  87. package/dist/worldQueries.js +278 -0
  88. package/dist/worldQueries.js.map +1 -0
  89. package/package.json +5 -3
  90. package/src/broadphase.test.ts +235 -0
  91. package/src/colliderTransform.test.ts +221 -0
  92. package/src/contactIntake.test.ts +343 -0
  93. package/src/continuous.test.ts +309 -0
  94. package/src/debugGeometry.test.ts +271 -0
  95. package/src/explainPhysics3DCollision.test.ts +78 -0
  96. package/src/islands.test.ts +2 -0
  97. package/src/jointBreakage.test.ts +143 -0
  98. package/src/jointFactories.test.ts +49 -0
  99. package/src/jointMath.test.ts +3 -0
  100. package/src/jointReaction.test.ts +241 -0
  101. package/src/joints.test.ts +265 -1
  102. package/src/massProperties.test.ts +276 -59
  103. package/src/material.test.ts +40 -0
  104. package/src/registerBuiltInPhysics3DJointSolvers.test.ts +4 -1
  105. package/src/solver.test.ts +54 -18
  106. package/src/step.test.ts +72 -18
  107. package/src/stepValidation.test.ts +23 -1
  108. package/src/stress.test.ts +374 -0
  109. package/src/world.test.ts +287 -27
  110. package/src/worldQueries.test.ts +405 -0
@@ -0,0 +1,4 @@
1
+ import type { Physics3DWorld } from '@flighthq/types/contract';
2
+ export declare function synchronizePhysics3DBroadphase(world: Physics3DWorld): void;
3
+ export declare function synchronizePhysics3DSweptBroadphase(world: Physics3DWorld, dt: number): void;
4
+ //# sourceMappingURL=broadphase.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"broadphase.d.ts","sourceRoot":"","sources":["../src/broadphase.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAiB,MAAM,0BAA0B,CAAC;AAO9E,wBAAgB,8BAA8B,CAAC,KAAK,EAAE,cAAc,GAAG,IAAI,CAO1E;AAQD,wBAAgB,mCAAmC,CAAC,KAAK,EAAE,cAAc,EAAE,EAAE,EAAE,MAAM,GAAG,IAAI,CAO3F"}
@@ -0,0 +1,152 @@
1
+ import { updatePhysics3DColliderWorldShape, writePhysics3DColliderBounds } from './colliderTransform';
2
+ // Refreshes every collider's world shape and republishes its body's bounds to the broadphase index. The
3
+ // step and the public world queries share this path, so a query observes the body's current authored
4
+ // pose rather than the pre-integration snapshot the most recent contact set was built from.
5
+ export function synchronizePhysics3DBroadphase(world) {
6
+ const scratch = acquirePhysics3DBroadphaseScratch();
7
+ try {
8
+ synchronizePhysics3DBroadphaseWithScratch(world, scratch, 0);
9
+ }
10
+ finally {
11
+ releasePhysics3DBroadphaseScratch(scratch);
12
+ }
13
+ }
14
+ // Publishes the union of every body's current bounds and the bounds it would have after `dt` of its
15
+ // current motion — the volume it sweeps through, which is what a continuous pass must find candidates in.
16
+ //
17
+ // The ORDINARY index is reused rather than a second swept one. A continuous step queries the candidate
18
+ // pairs immediately and then restores the current bounds, so nothing observes the widened state, and the
19
+ // backend swap point stays single.
20
+ export function synchronizePhysics3DSweptBroadphase(world, dt) {
21
+ const scratch = acquirePhysics3DBroadphaseScratch();
22
+ try {
23
+ synchronizePhysics3DBroadphaseWithScratch(world, scratch, dt);
24
+ }
25
+ finally {
26
+ releasePhysics3DBroadphaseScratch(scratch);
27
+ }
28
+ }
29
+ // The BODY is what the index holds, not the collider: a `SpatialObjectId` is one number, and the pair
30
+ // query returns pairs of them. Indexing colliders would need a composite id, and the step already
31
+ // refines a body pair down to its collider pairs — which is where the filter and sensor decisions live
32
+ // anyway.
33
+ function synchronizePhysics3DBroadphaseWithScratch(world, scratch, dt) {
34
+ for (const body of world.bodies) {
35
+ let minX = Infinity;
36
+ let minY = Infinity;
37
+ let minZ = Infinity;
38
+ let maxX = -Infinity;
39
+ let maxY = -Infinity;
40
+ let maxZ = -Infinity;
41
+ let rotationRadiusSquared = 0;
42
+ for (const collider of body.colliders) {
43
+ updatePhysics3DColliderWorldShape(collider, body);
44
+ writePhysics3DColliderBounds(collider, scratch.bounds);
45
+ if (scratch.bounds.minX < minX)
46
+ minX = scratch.bounds.minX;
47
+ if (scratch.bounds.minY < minY)
48
+ minY = scratch.bounds.minY;
49
+ if (scratch.bounds.minZ < minZ)
50
+ minZ = scratch.bounds.minZ;
51
+ if (scratch.bounds.maxX > maxX)
52
+ maxX = scratch.bounds.maxX;
53
+ if (scratch.bounds.maxY > maxY)
54
+ maxY = scratch.bounds.maxY;
55
+ if (scratch.bounds.maxZ > maxZ)
56
+ maxZ = scratch.bounds.maxZ;
57
+ if (dt > 0) {
58
+ const radiusX = Math.max(Math.abs(scratch.bounds.minX - body.x), Math.abs(scratch.bounds.maxX - body.x));
59
+ const radiusY = Math.max(Math.abs(scratch.bounds.minY - body.y), Math.abs(scratch.bounds.maxY - body.y));
60
+ const radiusZ = Math.max(Math.abs(scratch.bounds.minZ - body.z), Math.abs(scratch.bounds.maxZ - body.z));
61
+ const radiusSquared = radiusX * radiusX + radiusY * radiusY + radiusZ * radiusZ;
62
+ if (radiusSquared > rotationRadiusSquared)
63
+ rotationRadiusSquared = radiusSquared;
64
+ }
65
+ }
66
+ if (minX > maxX) {
67
+ // No collider produced bounds, so there is nothing to index. Withdraw rather than skip: the id may
68
+ // have been indexed on a previous step, and stale bounds would keep returning a body that has since
69
+ // lost its geometry.
70
+ world.index.removeSpatialObject(body.index);
71
+ continue;
72
+ }
73
+ if (dt > 0 && body.type !== 'static' && !body.sleeping) {
74
+ const translationX = body.velocityX * dt;
75
+ const translationY = body.velocityY * dt;
76
+ const translationZ = body.velocityZ * dt;
77
+ const spinning = body.angularVelocityX !== 0 || body.angularVelocityY !== 0 || body.angularVelocityZ !== 0;
78
+ if (spinning) {
79
+ // A SPHERE around the body origin encloses every orientation of every collider, so sweeping that
80
+ // sphere along the origin's translation is conservative for arbitrary rotation — including an
81
+ // offset collider whose centre follows an arc rather than the straight line a shape sweep assumes.
82
+ const radius = Math.sqrt(rotationRadiusSquared);
83
+ minX = Math.min(minX, body.x - radius, body.x + translationX - radius);
84
+ minY = Math.min(minY, body.y - radius, body.y + translationY - radius);
85
+ minZ = Math.min(minZ, body.z - radius, body.z + translationZ - radius);
86
+ maxX = Math.max(maxX, body.x + radius, body.x + translationX + radius);
87
+ maxY = Math.max(maxY, body.y + radius, body.y + translationY + radius);
88
+ maxZ = Math.max(maxZ, body.z + radius, body.z + translationZ + radius);
89
+ }
90
+ else {
91
+ if (translationX < 0)
92
+ minX += translationX;
93
+ else
94
+ maxX += translationX;
95
+ if (translationY < 0)
96
+ minY += translationY;
97
+ else
98
+ maxY += translationY;
99
+ if (translationZ < 0)
100
+ minZ += translationZ;
101
+ else
102
+ maxZ += translationZ;
103
+ }
104
+ }
105
+ // The spatial package bounds its own indexing cost. This second limit expresses the physics world's
106
+ // stricter judgement that a non-finite or ten-million-unit body has diverged and should no longer
107
+ // participate in collision or queries.
108
+ if (!Number.isFinite(minX) ||
109
+ !Number.isFinite(minY) ||
110
+ !Number.isFinite(minZ) ||
111
+ !Number.isFinite(maxX) ||
112
+ !Number.isFinite(maxY) ||
113
+ !Number.isFinite(maxZ) ||
114
+ maxX - minX > MAX_SIMULATED_EXTENT ||
115
+ maxY - minY > MAX_SIMULATED_EXTENT ||
116
+ maxZ - minZ > MAX_SIMULATED_EXTENT) {
117
+ world.index.removeSpatialObject(body.index);
118
+ continue;
119
+ }
120
+ scratch.bodyBounds.minX = minX;
121
+ scratch.bodyBounds.minY = minY;
122
+ scratch.bodyBounds.minZ = minZ;
123
+ // Spatial cells use half-open containment while collision point tests include a shape's boundary.
124
+ // Publish a minimally conservative upper corner so an exact query at the maximum remains a broadphase
125
+ // candidate, and so a degenerate zero-volume collider still spans a non-empty indexed cell.
126
+ scratch.bodyBounds.maxX = paddedUpperBound(maxX);
127
+ scratch.bodyBounds.maxY = paddedUpperBound(maxY);
128
+ scratch.bodyBounds.maxZ = paddedUpperBound(maxZ);
129
+ world.index.updateSpatialObject(body.index, scratch.bodyBounds);
130
+ }
131
+ }
132
+ function paddedUpperBound(value) {
133
+ const padded = value + Math.max(1, Math.abs(value)) * Number.EPSILON * 4;
134
+ return Number.isFinite(padded) ? padded : value;
135
+ }
136
+ // The widest body this world still treats as simulating. Named for what it bounds — the simulation's
137
+ // tolerance for divergence — not for the index, which bounds its own insert cost independently.
138
+ const MAX_SIMULATED_EXTENT = 1e7;
139
+ function acquirePhysics3DBroadphaseScratch() {
140
+ return physics3DBroadphaseScratchPool.pop() ?? createPhysics3DBroadphaseScratch();
141
+ }
142
+ function createPhysics3DBroadphaseScratch() {
143
+ return {
144
+ bounds: { minX: 0, minY: 0, minZ: 0, maxX: 0, maxY: 0, maxZ: 0 },
145
+ bodyBounds: { minX: 0, minY: 0, minZ: 0, maxX: 0, maxY: 0, maxZ: 0 },
146
+ };
147
+ }
148
+ function releasePhysics3DBroadphaseScratch(scratch) {
149
+ physics3DBroadphaseScratchPool.push(scratch);
150
+ }
151
+ const physics3DBroadphaseScratchPool = [createPhysics3DBroadphaseScratch()];
152
+ //# sourceMappingURL=broadphase.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"broadphase.js","sourceRoot":"","sources":["../src/broadphase.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import type { CollisionBuiltInShape3D, Physics3DCollider, RigidBody3D, SpatialAabb3D } from '@flighthq/types/contract';
2
+ export declare function createPhysics3DColliderWorldShape(local: Readonly<CollisionBuiltInShape3D>): CollisionBuiltInShape3D;
3
+ export declare function updatePhysics3DColliderWorldShape(collider: Physics3DCollider, body: Readonly<RigidBody3D>): void;
4
+ export declare function writePhysics3DColliderBounds(collider: Readonly<Physics3DCollider>, out: SpatialAabb3D): void;
5
+ //# sourceMappingURL=colliderTransform.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"colliderTransform.d.ts","sourceRoot":"","sources":["../src/colliderTransform.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,uBAAuB,EAAE,iBAAiB,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAKvH,wBAAgB,iCAAiC,CAAC,KAAK,EAAE,QAAQ,CAAC,uBAAuB,CAAC,GAAG,uBAAuB,CAmCnH;AAUD,wBAAgB,iCAAiC,CAAC,QAAQ,EAAE,iBAAiB,EAAE,IAAI,EAAE,QAAQ,CAAC,WAAW,CAAC,GAAG,IAAI,CA+EhH;AAMD,wBAAgB,4BAA4B,CAAC,QAAQ,EAAE,QAAQ,CAAC,iBAAiB,CAAC,EAAE,GAAG,EAAE,aAAa,GAAG,IAAI,CAmG5G"}
@@ -0,0 +1,245 @@
1
+ // Allocates the world-space shape a collider needs for `local`, choosing the kind the transform can
2
+ // actually express. Every field is filled at creation so the shape is never read half-initialised, and
3
+ // convex-hull storage is sized once here so the per-step transform can write in place.
4
+ export function createPhysics3DColliderWorldShape(local) {
5
+ switch (local.kind) {
6
+ case 'sphere':
7
+ return { kind: 'sphere', x: local.x, y: local.y, z: local.z, radius: local.radius };
8
+ case 'aabb':
9
+ case 'box':
10
+ return {
11
+ kind: 'box',
12
+ x: 0,
13
+ y: 0,
14
+ z: 0,
15
+ halfX: 0,
16
+ halfY: 0,
17
+ halfZ: 0,
18
+ rotationX: 0,
19
+ rotationY: 0,
20
+ rotationZ: 0,
21
+ rotationW: 1,
22
+ };
23
+ case 'capsule':
24
+ return {
25
+ kind: 'capsule',
26
+ x0: local.x0,
27
+ y0: local.y0,
28
+ z0: local.z0,
29
+ x1: local.x1,
30
+ y1: local.y1,
31
+ z1: local.z1,
32
+ radius: local.radius,
33
+ };
34
+ case 'convex':
35
+ return { kind: 'convex', points: local.points.slice() };
36
+ default:
37
+ return { kind: 'sphere', x: 0, y: 0, z: 0, radius: 0 };
38
+ }
39
+ }
40
+ // Rewrites `collider.world` from its local shape and the body's current pose. Called once per collider
41
+ // per step, before the narrow phase — never per contact test, because a body with four colliders against
42
+ // a hundred broadphase candidates would otherwise transform the same shape a hundred times to produce
43
+ // the same answer.
44
+ //
45
+ // The world shape is preallocated at collider creation and mutated in place, so a step allocates
46
+ // nothing. Hull points are the only variable-length part, and the world array is sized once from the
47
+ // local one; `invalidatePhysics3DCollider` replaces that storage after an authored shape changes.
48
+ export function updatePhysics3DColliderWorldShape(collider, body) {
49
+ const local = collider.local;
50
+ const world = collider.world;
51
+ const qX = body.orientationX;
52
+ const qY = body.orientationY;
53
+ const qZ = body.orientationZ;
54
+ const qW = body.orientationW;
55
+ if (local.kind === 'sphere' && world.kind === 'sphere') {
56
+ rotatePhysics3DPoint(qX, qY, qZ, qW, local.x, local.y, local.z, scratchPoint);
57
+ world.x = body.x + scratchPoint[0];
58
+ world.y = body.y + scratchPoint[1];
59
+ world.z = body.z + scratchPoint[2];
60
+ world.radius = local.radius;
61
+ return;
62
+ }
63
+ // An axis-aligned box promotes to an ORIENTED box in world space: rotate it and it is no longer
64
+ // axis-aligned, and silently keeping the `aabb` kind would grow the box to its bounding extent the
65
+ // first time the body turned.
66
+ if (local.kind === 'aabb' && world.kind === 'box') {
67
+ const centerX = (local.minX + local.maxX) / 2;
68
+ const centerY = (local.minY + local.maxY) / 2;
69
+ const centerZ = (local.minZ + local.maxZ) / 2;
70
+ rotatePhysics3DPoint(qX, qY, qZ, qW, centerX, centerY, centerZ, scratchPoint);
71
+ world.x = body.x + scratchPoint[0];
72
+ world.y = body.y + scratchPoint[1];
73
+ world.z = body.z + scratchPoint[2];
74
+ world.halfX = (local.maxX - local.minX) / 2;
75
+ world.halfY = (local.maxY - local.minY) / 2;
76
+ world.halfZ = (local.maxZ - local.minZ) / 2;
77
+ world.rotationX = qX;
78
+ world.rotationY = qY;
79
+ world.rotationZ = qZ;
80
+ world.rotationW = qW;
81
+ return;
82
+ }
83
+ if (local.kind === 'box' && world.kind === 'box') {
84
+ rotatePhysics3DPoint(qX, qY, qZ, qW, local.x, local.y, local.z, scratchPoint);
85
+ world.x = body.x + scratchPoint[0];
86
+ world.y = body.y + scratchPoint[1];
87
+ world.z = body.z + scratchPoint[2];
88
+ world.halfX = local.halfX;
89
+ world.halfY = local.halfY;
90
+ world.halfZ = local.halfZ;
91
+ // Quaternion composition, body THEN local — the order a local rotation is applied first and the
92
+ // body's on top of it. Reversing the operands is the classic silent error: it produces a valid unit
93
+ // quaternion describing the wrong orientation, so nothing is non-finite and nothing throws.
94
+ world.rotationX = qW * local.rotationX + qX * local.rotationW + qY * local.rotationZ - qZ * local.rotationY;
95
+ world.rotationY = qW * local.rotationY - qX * local.rotationZ + qY * local.rotationW + qZ * local.rotationX;
96
+ world.rotationZ = qW * local.rotationZ + qX * local.rotationY - qY * local.rotationX + qZ * local.rotationW;
97
+ world.rotationW = qW * local.rotationW - qX * local.rotationX - qY * local.rotationY - qZ * local.rotationZ;
98
+ return;
99
+ }
100
+ if (local.kind === 'capsule' && world.kind === 'capsule') {
101
+ rotatePhysics3DPoint(qX, qY, qZ, qW, local.x0, local.y0, local.z0, scratchPoint);
102
+ world.x0 = body.x + scratchPoint[0];
103
+ world.y0 = body.y + scratchPoint[1];
104
+ world.z0 = body.z + scratchPoint[2];
105
+ rotatePhysics3DPoint(qX, qY, qZ, qW, local.x1, local.y1, local.z1, scratchPoint);
106
+ world.x1 = body.x + scratchPoint[0];
107
+ world.y1 = body.y + scratchPoint[1];
108
+ world.z1 = body.z + scratchPoint[2];
109
+ world.radius = local.radius;
110
+ return;
111
+ }
112
+ if (local.kind === 'convex' && world.kind === 'convex') {
113
+ const source = local.points;
114
+ const target = world.points;
115
+ for (let i = 0; i + 2 < source.length; i += 3) {
116
+ rotatePhysics3DPoint(qX, qY, qZ, qW, source[i], source[i + 1], source[i + 2], scratchPoint);
117
+ target[i] = body.x + scratchPoint[0];
118
+ target[i + 1] = body.y + scratchPoint[1];
119
+ target[i + 2] = body.z + scratchPoint[2];
120
+ }
121
+ }
122
+ }
123
+ // Writes `collider.world`'s axis-aligned bounds into `out` — the broadphase's view of the collider.
124
+ // Bounds are computed from the WORLD shape rather than by transforming local bounds, because rotating
125
+ // an extent and rotating a shape's bounds are different boxes: the second is the bound of the first and
126
+ // grows without limit as the body spins.
127
+ export function writePhysics3DColliderBounds(collider, out) {
128
+ const shape = collider.world;
129
+ switch (shape.kind) {
130
+ case 'sphere':
131
+ out.minX = shape.x - shape.radius;
132
+ out.minY = shape.y - shape.radius;
133
+ out.minZ = shape.z - shape.radius;
134
+ out.maxX = shape.x + shape.radius;
135
+ out.maxY = shape.y + shape.radius;
136
+ out.maxZ = shape.z + shape.radius;
137
+ return;
138
+ case 'aabb':
139
+ out.minX = shape.minX;
140
+ out.minY = shape.minY;
141
+ out.minZ = shape.minZ;
142
+ out.maxX = shape.maxX;
143
+ out.maxY = shape.maxY;
144
+ out.maxZ = shape.maxZ;
145
+ return;
146
+ case 'box': {
147
+ // The support of a rotated box along each world axis: the absolute row of its rotation matrix
148
+ // dotted with the half extents. Taking absolute values is what makes this the extent of the
149
+ // rotated box rather than of one particular corner.
150
+ const x = shape.rotationX;
151
+ const y = shape.rotationY;
152
+ const z = shape.rotationZ;
153
+ const w = shape.rotationW;
154
+ const m00 = Math.abs(1 - 2 * (y * y + z * z));
155
+ const m01 = Math.abs(2 * (x * y - w * z));
156
+ const m02 = Math.abs(2 * (x * z + w * y));
157
+ const m10 = Math.abs(2 * (x * y + w * z));
158
+ const m11 = Math.abs(1 - 2 * (x * x + z * z));
159
+ const m12 = Math.abs(2 * (y * z - w * x));
160
+ const m20 = Math.abs(2 * (x * z - w * y));
161
+ const m21 = Math.abs(2 * (y * z + w * x));
162
+ const m22 = Math.abs(1 - 2 * (x * x + y * y));
163
+ const extentX = m00 * shape.halfX + m01 * shape.halfY + m02 * shape.halfZ;
164
+ const extentY = m10 * shape.halfX + m11 * shape.halfY + m12 * shape.halfZ;
165
+ const extentZ = m20 * shape.halfX + m21 * shape.halfY + m22 * shape.halfZ;
166
+ out.minX = shape.x - extentX;
167
+ out.minY = shape.y - extentY;
168
+ out.minZ = shape.z - extentZ;
169
+ out.maxX = shape.x + extentX;
170
+ out.maxY = shape.y + extentY;
171
+ out.maxZ = shape.z + extentZ;
172
+ return;
173
+ }
174
+ case 'capsule':
175
+ out.minX = Math.min(shape.x0, shape.x1) - shape.radius;
176
+ out.minY = Math.min(shape.y0, shape.y1) - shape.radius;
177
+ out.minZ = Math.min(shape.z0, shape.z1) - shape.radius;
178
+ out.maxX = Math.max(shape.x0, shape.x1) + shape.radius;
179
+ out.maxY = Math.max(shape.y0, shape.y1) + shape.radius;
180
+ out.maxZ = Math.max(shape.z0, shape.z1) + shape.radius;
181
+ return;
182
+ case 'convex': {
183
+ const points = shape.points;
184
+ if (points.length < 3) {
185
+ out.minX = 0;
186
+ out.minY = 0;
187
+ out.minZ = 0;
188
+ out.maxX = 0;
189
+ out.maxY = 0;
190
+ out.maxZ = 0;
191
+ return;
192
+ }
193
+ let minX = points[0];
194
+ let minY = points[1];
195
+ let minZ = points[2];
196
+ let maxX = minX;
197
+ let maxY = minY;
198
+ let maxZ = minZ;
199
+ for (let i = 3; i + 2 < points.length; i += 3) {
200
+ const x = points[i];
201
+ const y = points[i + 1];
202
+ const z = points[i + 2];
203
+ if (x < minX)
204
+ minX = x;
205
+ else if (x > maxX)
206
+ maxX = x;
207
+ if (y < minY)
208
+ minY = y;
209
+ else if (y > maxY)
210
+ maxY = y;
211
+ if (z < minZ)
212
+ minZ = z;
213
+ else if (z > maxZ)
214
+ maxZ = z;
215
+ }
216
+ out.minX = minX;
217
+ out.minY = minY;
218
+ out.minZ = minZ;
219
+ out.maxX = maxX;
220
+ out.maxY = maxY;
221
+ out.maxZ = maxZ;
222
+ return;
223
+ }
224
+ default:
225
+ out.minX = 0;
226
+ out.minY = 0;
227
+ out.minZ = 0;
228
+ out.maxX = 0;
229
+ out.maxY = 0;
230
+ out.maxZ = 0;
231
+ }
232
+ }
233
+ // Rotates (`x`,`y`,`z`) by the unit quaternion, writing three components into `out`. The two-cross-product
234
+ // form rather than a matrix build: this runs per point of every hull of every collider every step, and
235
+ // materialising nine matrix entries to use them once is the more expensive of the two.
236
+ function rotatePhysics3DPoint(qX, qY, qZ, qW, x, y, z, out) {
237
+ const tX = 2 * (qY * z - qZ * y);
238
+ const tY = 2 * (qZ * x - qX * z);
239
+ const tZ = 2 * (qX * y - qY * x);
240
+ out[0] = x + qW * tX + qY * tZ - qZ * tY;
241
+ out[1] = y + qW * tY + qZ * tX - qX * tZ;
242
+ out[2] = z + qW * tZ + qX * tY - qY * tX;
243
+ }
244
+ const scratchPoint = [0, 0, 0];
245
+ //# sourceMappingURL=colliderTransform.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"colliderTransform.js","sourceRoot":"","sources":["../src/colliderTransform.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { Physics3DContactIntakeGuard, Physics3DWorld } from '@flighthq/types/contract';
2
+ export declare function buildPhysics3DContacts(world: Physics3DWorld): void;
3
+ export declare function setPhysics3DContactIntakeGuard(guard: Physics3DContactIntakeGuard | null): void;
4
+ //# sourceMappingURL=contactIntake.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contactIntake.d.ts","sourceRoot":"","sources":["../src/contactIntake.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAGV,2BAA2B,EAE3B,cAAc,EAEf,MAAM,0BAA0B,CAAC;AAsBlC,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,cAAc,GAAG,IAAI,CAalE;AAID,wBAAgB,8BAA8B,CAAC,KAAK,EAAE,2BAA2B,GAAG,IAAI,GAAG,IAAI,CAE9F"}