@series-inc/rundot-syncplay 5.26.0 → 5.28.0-beta.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/dist/browser.d.ts CHANGED
@@ -24,8 +24,9 @@ export { createNetworkedSyncplayClient, prepareNetworkedSyncplayTransport } from
24
24
  export { createSyncplayRunner } from './runner.js';
25
25
  export { fbm2D, hash2, hashUint32, valueNoise1D, valueNoise2D } from './noise.js';
26
26
  export { circleCastDeterministicPhysics2D, createDeterministicPhysicsWorld2D, nearestDeterministicPhysicsHit2D, queryDeterministicPhysicsAabb2D, queryDeterministicPhysicsShapeOverlap2D, raycastAllDeterministicPhysics2D, raycastDeterministicPhysics2D, stepDeterministicPhysicsWorld2D } from './physics2d.js';
27
- export { applyDeterministicImpulse3D, applyDeterministicImpulses3D, applyDeterministicWorldEdit3D, contactDetailsDeterministicPhysics3D, createDeterministicPhysicsWorld3D, createTrustedDeterministicPhysicsWorld3D, deriveInverseInertia, deterministicPhysicsBodyById3D, deterministicPhysicsCallback3D, overlapDeterministicPhysics3D, raycastDeterministicPhysics3D, raycastDeterministicPhysics3DDetailed, runDeterministicPhysics3DStress, setDeterministicBodyVelocity3D, shapeCastDeterministicPhysics3D, shapeCastDeterministicPhysics3DDetailed, stepDeterministicPhysicsWorld3D } from './physics3d.js';
28
- export { cookDeterministicVoxelChunkCollider3D } from './physics3d-voxel.js';
27
+ export { applyDeterministicImpulse3D, applyDeterministicImpulses3D, applyDeterministicWorldEdit3D, contactDetailsDeterministicPhysics3D, createBoxShapeFromExtents, createBoxShapeFromMinMax, createCapsuleShapeFromBase, createDeterministicPhysicsWorld3D, createTrustedDeterministicPhysicsWorld3D, deriveInverseInertia, deterministicPhysicsBodyById3D, deterministicPhysicsCallback3D, overlapDeterministicPhysics3D, raycastDeterministicPhysics3D, raycastDeterministicPhysics3DDetailed, runDeterministicPhysics3DStress, setDeterministicBodyVelocity3D, setDeterministicKinematicPoses3D, setDeterministicKinematicTransforms3D, shapeCastDeterministicPhysics3D, shapeCastDeterministicPhysics3DDetailed, stepDeterministicPhysicsWorld3D } from './physics3d.js';
28
+ export { carveDeterministicVoxelChunk3D, cookDeterministicVoxelChunkCollider3D, cookDeterministicVoxelSubregion3D, raycastDeterministicVoxelChunk3D } from './physics3d-voxel.js';
29
+ export { generatePhysicsWorldDebugMesh } from './debug-wireframe.js';
29
30
  export { cylinderHullVertices } from './physics3d-hull.js';
30
31
  export { createDeterministicCosmeticPhysicsWorld3D, setDeterministicCosmeticPhysicsAuthoritativeBodyProxies3D, stepDeterministicCosmeticPhysicsWorld3D } from './cosmetic-physics3d.js';
31
32
  export { stepDeterministicVehicle3D } from './physics3d-vehicle.js';
@@ -65,8 +66,9 @@ export type { CookedDeterministicNavmesh, DeterministicNavmeshAgent, Determinist
65
66
  export type { ConfirmedSyncplayPresentationFrame, KinetixRuntimeFactory, NetworkedClientTransport, NetworkedSyncplayClient, NetworkedSyncplayClientInputDelayOptions, NetworkedSyncplayClientNetStats, NetworkedSyncplayClientOptions, NetworkedSyncplayClientPacingOptions, NetworkedSyncplayPreparationOptions, NetworkedSyncplaySessionDescriptor, NetworkedSyncplaySlotPresence, PreparedNetworkedSyncplayTransport, SyncplayPredictionMode, SyncplayRemoteInputPrediction } from './networked-client.js';
66
67
  export type { SyncplayRunner, SyncplayRunnerConfig, SyncplayRunnerConnectionEvent, SyncplayRunnerOccupancy, SyncplayRunnerOfflineOptions, SyncplayRunnerPresentation, SyncplayRunnerSnapshot, SyncplayRunnerStatus, SyncplayRunnerTransport } from './runner.js';
67
68
  export type { DeterministicBodyKind, DeterministicContactEvent2D, DeterministicContactEventType, DeterministicPhysicsAabbQuery2D, DeterministicPhysicsActivePair2D, DeterministicPhysicsBody2D, DeterministicPhysicsCircleCastQuery2D, DeterministicPhysicsConstraint2D, DeterministicPhysicsHit2D, DeterministicPhysicsQueryOptions2D, DeterministicPhysicsRaycastQuery2D, DeterministicPhysicsShape2D, DeterministicPhysicsShapeOverlapQuery2D, DeterministicPhysicsStepOptions2D, DeterministicPhysicsStepResult2D, DeterministicPhysicsWorld2D } from './physics2d.js';
68
- export type { DeterministicContactCacheEntry3D, DeterministicJointCacheEntry3D, DeterministicPhysicsActivePair3D, DeterministicPhysicsAxisLock3D, DeterministicPhysicsBody3D, DeterministicPhysicsCallbackMask3D, DeterministicPhysicsCompoundChild3D, DeterministicPhysicsCompoundChildShape3D, DeterministicPhysicsConstraint3D, DeterministicPhysicsContactDetail3D, DeterministicPhysicsContactEvent3D, DeterministicPhysicsDetailedHit3D, DeterministicPhysicsHit3D, DeterministicPhysicsHullShape3D, DeterministicPhysicsImpulseApplication3D, DeterministicPhysicsOverlapQuery3D, DeterministicPhysicsPrimitiveShape3D, DeterministicPhysicsQuaternion3D, DeterministicPhysicsQueryOptions3D, DeterministicPhysicsRaycastQuery3D, DeterministicPhysicsScheduledQuery3D, DeterministicPhysicsShape3D, DeterministicPhysicsShapeCastQuery3D, DeterministicPhysicsStepResult3D, DeterministicPhysicsVec3, DeterministicPhysicsWorld3D, DeterministicPhysicsWorldEdit3D } from './physics3d.js';
69
- export type { DeterministicVoxelChunk3D, DeterministicVoxelCompoundShape3D } from './physics3d-voxel.js';
69
+ export type { DeterministicContactCacheEntry3D, DeterministicJointCacheEntry3D, DeterministicKinematicPose3D, DeterministicKinematicTransformBuffer3D, DeterministicPhysicsActivePair3D, DeterministicPhysicsAxisLock3D, DeterministicPhysicsBody3D, DeterministicPhysicsCallbackMask3D, DeterministicPhysicsCompoundChild3D, DeterministicPhysicsCompoundChildShape3D, DeterministicPhysicsConstraint3D, DeterministicPhysicsContactDetail3D, DeterministicPhysicsContactEvent3D, DeterministicPhysicsDetailedHit3D, DeterministicPhysicsHit3D, DeterministicPhysicsHullShape3D, DeterministicPhysicsImpulseApplication3D, DeterministicPhysicsOverlapQuery3D, DeterministicPhysicsPrimitiveShape3D, DeterministicPhysicsQuaternion3D, DeterministicPhysicsQueryOptions3D, DeterministicPhysicsRaycastQuery3D, DeterministicPhysicsScheduledQuery3D, DeterministicPhysicsShape3D, DeterministicPhysicsShapeCastQuery3D, DeterministicPhysicsStepResult3D, DeterministicPhysicsVec3, DeterministicPhysicsWorld3D, DeterministicPhysicsWorldEdit3D } from './physics3d.js';
70
+ export type { DeterministicVoxelChunk3D, DeterministicVoxelCompoundShape3D, DeterministicVoxelRayHit3D, VoxelCarveRegion3D } from './physics3d-voxel.js';
71
+ export type { PhysicsWorldDebugMesh, PhysicsWorldDebugMeshOptions } from './debug-wireframe.js';
70
72
  export type { DeterministicAuthoritativeBodyProxy3D, DeterministicCosmeticPhysicsBody3D, DeterministicCosmeticPhysicsStepOptions3D, DeterministicCosmeticPhysicsStepResult3D, DeterministicCosmeticPhysicsWorld3D } from './cosmetic-physics3d.js';
71
73
  export type { DeterministicPhysicsJoint3D } from './physics3d-joints.js';
72
74
  export type { DeterministicVehicle3D, DeterministicVehicleImpulse3D, DeterministicVehicleInput3D, DeterministicVehicleStepOptions3D, DeterministicVehicleStepResult3D, DeterministicVehicleWheel3D, DeterministicVehicleWheelTelemetry3D } from './physics3d-vehicle.js';
package/dist/browser.js CHANGED
@@ -25,8 +25,9 @@ export { createNetworkedSyncplayClient, prepareNetworkedSyncplayTransport } from
25
25
  export { createSyncplayRunner } from './runner.js';
26
26
  export { fbm2D, hash2, hashUint32, valueNoise1D, valueNoise2D } from './noise.js';
27
27
  export { circleCastDeterministicPhysics2D, createDeterministicPhysicsWorld2D, nearestDeterministicPhysicsHit2D, queryDeterministicPhysicsAabb2D, queryDeterministicPhysicsShapeOverlap2D, raycastAllDeterministicPhysics2D, raycastDeterministicPhysics2D, stepDeterministicPhysicsWorld2D } from './physics2d.js';
28
- export { applyDeterministicImpulse3D, applyDeterministicImpulses3D, applyDeterministicWorldEdit3D, contactDetailsDeterministicPhysics3D, createDeterministicPhysicsWorld3D, createTrustedDeterministicPhysicsWorld3D, deriveInverseInertia, deterministicPhysicsBodyById3D, deterministicPhysicsCallback3D, overlapDeterministicPhysics3D, raycastDeterministicPhysics3D, raycastDeterministicPhysics3DDetailed, runDeterministicPhysics3DStress, setDeterministicBodyVelocity3D, shapeCastDeterministicPhysics3D, shapeCastDeterministicPhysics3DDetailed, stepDeterministicPhysicsWorld3D } from './physics3d.js';
29
- export { cookDeterministicVoxelChunkCollider3D } from './physics3d-voxel.js';
28
+ export { applyDeterministicImpulse3D, applyDeterministicImpulses3D, applyDeterministicWorldEdit3D, contactDetailsDeterministicPhysics3D, createBoxShapeFromExtents, createBoxShapeFromMinMax, createCapsuleShapeFromBase, createDeterministicPhysicsWorld3D, createTrustedDeterministicPhysicsWorld3D, deriveInverseInertia, deterministicPhysicsBodyById3D, deterministicPhysicsCallback3D, overlapDeterministicPhysics3D, raycastDeterministicPhysics3D, raycastDeterministicPhysics3DDetailed, runDeterministicPhysics3DStress, setDeterministicBodyVelocity3D, setDeterministicKinematicPoses3D, setDeterministicKinematicTransforms3D, shapeCastDeterministicPhysics3D, shapeCastDeterministicPhysics3DDetailed, stepDeterministicPhysicsWorld3D } from './physics3d.js';
29
+ export { carveDeterministicVoxelChunk3D, cookDeterministicVoxelChunkCollider3D, cookDeterministicVoxelSubregion3D, raycastDeterministicVoxelChunk3D } from './physics3d-voxel.js';
30
+ export { generatePhysicsWorldDebugMesh } from './debug-wireframe.js';
30
31
  export { cylinderHullVertices } from './physics3d-hull.js';
31
32
  export { createDeterministicCosmeticPhysicsWorld3D, setDeterministicCosmeticPhysicsAuthoritativeBodyProxies3D, stepDeterministicCosmeticPhysicsWorld3D } from './cosmetic-physics3d.js';
32
33
  export { stepDeterministicVehicle3D } from './physics3d-vehicle.js';
package/dist/creator.d.ts CHANGED
@@ -12,12 +12,14 @@ export type { RecordedChecksum, RecordedCommandFrame, RecordedDebugEvent, Record
12
12
  export type { ReplayRuntimeFactory, ReplayVerificationConfig, ReplayVerificationExecution } from './replay.js';
13
13
  export type { SyncplaySession, SyncplaySessionPolicy } from './sdk-session.js';
14
14
  export type { InstantReplayInputFrame, InstantReplayResult, InstantReplayRunner, InstantReplayRunnerOptions, InstantReplayRunOptions, RunInstantReplayOptions, } from './instant-replay.js';
15
- export { applyDeterministicImpulse3D, applyDeterministicImpulses3D, applyDeterministicWorldEdit3D, contactDetailsDeterministicPhysics3D, createDeterministicPhysicsWorld3D, deriveInverseInertia, deterministicPhysicsBodyById3D, deterministicPhysicsCallback3D, overlapDeterministicPhysics3D, raycastDeterministicPhysics3D, raycastDeterministicPhysics3DDetailed, runDeterministicPhysics3DStress, setDeterministicBodyVelocity3D, shapeCastDeterministicPhysics3D, shapeCastDeterministicPhysics3DDetailed, stepDeterministicPhysicsWorld3D, } from './physics3d.js';
16
- export { cookDeterministicVoxelChunkCollider3D } from './physics3d-voxel.js';
15
+ export { applyDeterministicImpulse3D, applyDeterministicImpulses3D, applyDeterministicWorldEdit3D, contactDetailsDeterministicPhysics3D, createBoxShapeFromExtents, createBoxShapeFromMinMax, createCapsuleShapeFromBase, createDeterministicPhysicsWorld3D, deriveInverseInertia, deterministicPhysicsBodyById3D, deterministicPhysicsCallback3D, overlapDeterministicPhysics3D, raycastDeterministicPhysics3D, raycastDeterministicPhysics3DDetailed, runDeterministicPhysics3DStress, setDeterministicBodyVelocity3D, setDeterministicKinematicPoses3D, setDeterministicKinematicTransforms3D, shapeCastDeterministicPhysics3D, shapeCastDeterministicPhysics3DDetailed, stepDeterministicPhysicsWorld3D, } from './physics3d.js';
16
+ export { carveDeterministicVoxelChunk3D, cookDeterministicVoxelChunkCollider3D, cookDeterministicVoxelSubregion3D, raycastDeterministicVoxelChunk3D, } from './physics3d-voxel.js';
17
+ export { generatePhysicsWorldDebugMesh } from './debug-wireframe.js';
17
18
  export { cylinderHullVertices } from './physics3d-hull.js';
18
19
  export { stepDeterministicVehicle3D } from './physics3d-vehicle.js';
19
- export type { DeterministicContactCacheEntry3D, DeterministicJointCacheEntry3D, DeterministicPhysicsActivePair3D, DeterministicPhysicsAxisLock3D, DeterministicPhysicsBody3D, DeterministicPhysicsCallbackMask3D, DeterministicPhysicsCompoundChild3D, DeterministicPhysicsCompoundChildShape3D, DeterministicPhysicsConstraint3D, DeterministicPhysicsContactDetail3D, DeterministicPhysicsContactEvent3D, DeterministicPhysicsDetailedHit3D, DeterministicPhysicsHit3D, DeterministicPhysicsHullShape3D, DeterministicPhysicsImpulseApplication3D, DeterministicPhysicsOverlapQuery3D, DeterministicPhysicsPrimitiveShape3D, DeterministicPhysicsQuaternion3D, DeterministicPhysicsQueryOptions3D, DeterministicPhysicsRaycastQuery3D, DeterministicPhysicsScheduledQuery3D, DeterministicPhysicsShape3D, DeterministicPhysicsShapeCastQuery3D, DeterministicPhysicsStepResult3D, DeterministicPhysicsVec3, DeterministicPhysicsWorld3D, DeterministicPhysicsWorldEdit3D, } from './physics3d.js';
20
- export type { DeterministicVoxelChunk3D, DeterministicVoxelCompoundShape3D } from './physics3d-voxel.js';
20
+ export type { DeterministicContactCacheEntry3D, DeterministicJointCacheEntry3D, DeterministicKinematicPose3D, DeterministicKinematicTransformBuffer3D, DeterministicPhysicsActivePair3D, DeterministicPhysicsAxisLock3D, DeterministicPhysicsBody3D, DeterministicPhysicsCallbackMask3D, DeterministicPhysicsCompoundChild3D, DeterministicPhysicsCompoundChildShape3D, DeterministicPhysicsConstraint3D, DeterministicPhysicsContactDetail3D, DeterministicPhysicsContactEvent3D, DeterministicPhysicsDetailedHit3D, DeterministicPhysicsHit3D, DeterministicPhysicsHullShape3D, DeterministicPhysicsImpulseApplication3D, DeterministicPhysicsOverlapQuery3D, DeterministicPhysicsPrimitiveShape3D, DeterministicPhysicsQuaternion3D, DeterministicPhysicsQueryOptions3D, DeterministicPhysicsRaycastQuery3D, DeterministicPhysicsScheduledQuery3D, DeterministicPhysicsShape3D, DeterministicPhysicsShapeCastQuery3D, DeterministicPhysicsStepResult3D, DeterministicPhysicsVec3, DeterministicPhysicsWorld3D, DeterministicPhysicsWorldEdit3D, } from './physics3d.js';
21
+ export type { DeterministicVoxelChunk3D, DeterministicVoxelCompoundShape3D, DeterministicVoxelRayHit3D, VoxelCarveRegion3D, } from './physics3d-voxel.js';
22
+ export type { PhysicsWorldDebugMesh, PhysicsWorldDebugMeshOptions } from './debug-wireframe.js';
21
23
  export type { DeterministicPhysicsJoint3D } from './physics3d-joints.js';
22
24
  export type { DeterministicVehicle3D, DeterministicVehicleImpulse3D, DeterministicVehicleInput3D, DeterministicVehicleStepOptions3D, DeterministicVehicleStepResult3D, DeterministicVehicleWheel3D, DeterministicVehicleWheelTelemetry3D, } from './physics3d-vehicle.js';
23
25
  export type { DeterministicPhysicsMaterial } from './deterministic-primitives.js';
package/dist/creator.js CHANGED
@@ -9,7 +9,8 @@ export { runSyncplaySynctest } from './synctest.js';
9
9
  // create/step/edit, impulses, queries, vehicles, and voxel-chunk collider
10
10
  // cooking. Cosmetic physics, KCC (movement3d), and the destruction-cert runner
11
11
  // stay off it — the first two are not requested, the third reads wall clock.
12
- export { applyDeterministicImpulse3D, applyDeterministicImpulses3D, applyDeterministicWorldEdit3D, contactDetailsDeterministicPhysics3D, createDeterministicPhysicsWorld3D, deriveInverseInertia, deterministicPhysicsBodyById3D, deterministicPhysicsCallback3D, overlapDeterministicPhysics3D, raycastDeterministicPhysics3D, raycastDeterministicPhysics3DDetailed, runDeterministicPhysics3DStress, setDeterministicBodyVelocity3D, shapeCastDeterministicPhysics3D, shapeCastDeterministicPhysics3DDetailed, stepDeterministicPhysicsWorld3D, } from './physics3d.js';
13
- export { cookDeterministicVoxelChunkCollider3D } from './physics3d-voxel.js';
12
+ export { applyDeterministicImpulse3D, applyDeterministicImpulses3D, applyDeterministicWorldEdit3D, contactDetailsDeterministicPhysics3D, createBoxShapeFromExtents, createBoxShapeFromMinMax, createCapsuleShapeFromBase, createDeterministicPhysicsWorld3D, deriveInverseInertia, deterministicPhysicsBodyById3D, deterministicPhysicsCallback3D, overlapDeterministicPhysics3D, raycastDeterministicPhysics3D, raycastDeterministicPhysics3DDetailed, runDeterministicPhysics3DStress, setDeterministicBodyVelocity3D, setDeterministicKinematicPoses3D, setDeterministicKinematicTransforms3D, shapeCastDeterministicPhysics3D, shapeCastDeterministicPhysics3DDetailed, stepDeterministicPhysicsWorld3D, } from './physics3d.js';
13
+ export { carveDeterministicVoxelChunk3D, cookDeterministicVoxelChunkCollider3D, cookDeterministicVoxelSubregion3D, raycastDeterministicVoxelChunk3D, } from './physics3d-voxel.js';
14
+ export { generatePhysicsWorldDebugMesh } from './debug-wireframe.js';
14
15
  export { cylinderHullVertices } from './physics3d-hull.js';
15
16
  export { stepDeterministicVehicle3D } from './physics3d-vehicle.js';
@@ -0,0 +1,22 @@
1
+ import type { DeterministicPhysicsWorld3D } from './physics3d.js';
2
+ export interface PhysicsWorldDebugMesh {
3
+ /** Flat vertex positions [x0, y0, z0, x1, y1, z1, ...] for gl.LINES. */
4
+ readonly positions: Float32Array;
5
+ /** Line segment index pairs [start0, end0, start1, end1, ...] for gl.LINES / Three.js LineSegments. */
6
+ readonly indices: Uint32Array;
7
+ }
8
+ export interface PhysicsWorldDebugMeshOptions {
9
+ readonly includeStatics?: boolean;
10
+ readonly includeKinematics?: boolean;
11
+ readonly includeDynamics?: boolean;
12
+ readonly includeTriggers?: boolean;
13
+ readonly includeSensors?: boolean;
14
+ readonly sphereSegments?: number;
15
+ readonly capsuleSegments?: number;
16
+ }
17
+ /**
18
+ * Generates flat position and index buffers of line segments representing all
19
+ * colliders in a deterministic physics world, compatible with Three.js LineSegments
20
+ * and WebGL line rendering pipelines.
21
+ */
22
+ export declare function generatePhysicsWorldDebugMesh(world: DeterministicPhysicsWorld3D, options?: PhysicsWorldDebugMeshOptions): PhysicsWorldDebugMesh;
@@ -0,0 +1,226 @@
1
+ import { canonicalQuarterTurns, quaternionFromQuarterTurns, rotatePointByQuat, } from './physics3d-shared.js';
2
+ import { buildSolverHull } from './physics3d-hull.js';
3
+ function createCircleLines(radius, segments, plane, center = { x: 0, y: 0, z: 0 }) {
4
+ const vertices = [];
5
+ const indices = [];
6
+ const step = (Math.PI * 2) / segments;
7
+ for (let i = 0; i < segments; i += 1) {
8
+ const angle = i * step;
9
+ const cos = Math.cos(angle) * radius;
10
+ const sin = Math.sin(angle) * radius;
11
+ if (plane === 'xy') {
12
+ vertices.push({ x: center.x + cos, y: center.y + sin, z: center.z });
13
+ }
14
+ else if (plane === 'xz') {
15
+ vertices.push({ x: center.x + cos, y: center.y, z: center.z + sin });
16
+ }
17
+ else {
18
+ vertices.push({ x: center.x, y: center.y + cos, z: center.z + sin });
19
+ }
20
+ indices.push(i, (i + 1) % segments);
21
+ }
22
+ return { vertices, indices };
23
+ }
24
+ function createArcLines(radius, segments, plane, center, startAngle, endAngle) {
25
+ const vertices = [];
26
+ const indices = [];
27
+ const span = endAngle - startAngle;
28
+ for (let i = 0; i <= segments; i += 1) {
29
+ const angle = startAngle + (i / segments) * span;
30
+ const cos = Math.cos(angle) * radius;
31
+ const sin = Math.sin(angle) * radius;
32
+ if (plane === 'xy') {
33
+ vertices.push({ x: center.x + cos, y: center.y + sin, z: center.z });
34
+ }
35
+ else {
36
+ vertices.push({ x: center.x, y: center.y + cos, z: center.z + sin });
37
+ }
38
+ if (i < segments) {
39
+ indices.push(i, i + 1);
40
+ }
41
+ }
42
+ return { vertices, indices };
43
+ }
44
+ function appendGeometry(target, source, transform) {
45
+ const vertexOffset = target.vertices.length;
46
+ for (const vertex of source.vertices) {
47
+ let transformed = vertex;
48
+ if (transform?.orientation !== undefined) {
49
+ transformed = rotatePointByQuat(transform.orientation, transformed);
50
+ }
51
+ if (transform?.offset !== undefined) {
52
+ transformed = {
53
+ x: transformed.x + transform.offset.x,
54
+ y: transformed.y + transform.offset.y,
55
+ z: transformed.z + transform.offset.z,
56
+ };
57
+ }
58
+ target.vertices.push(transformed);
59
+ }
60
+ for (const idx of source.indices) {
61
+ target.indices.push(vertexOffset + idx);
62
+ }
63
+ }
64
+ function buildShapeLines(shape, options) {
65
+ const result = { vertices: [], indices: [] };
66
+ const sphereSegs = options.sphereSegments ?? 16;
67
+ const capsuleSegs = options.capsuleSegments ?? 12;
68
+ if (shape.type === 'box') {
69
+ const { halfX, halfY, halfZ } = shape;
70
+ const verts = [
71
+ { x: -halfX, y: -halfY, z: -halfZ },
72
+ { x: halfX, y: -halfY, z: -halfZ },
73
+ { x: halfX, y: -halfY, z: halfZ },
74
+ { x: -halfX, y: -halfY, z: halfZ },
75
+ { x: -halfX, y: halfY, z: -halfZ },
76
+ { x: halfX, y: halfY, z: -halfZ },
77
+ { x: halfX, y: halfY, z: halfZ },
78
+ { x: -halfX, y: halfY, z: halfZ },
79
+ ];
80
+ const indices = [
81
+ 0, 1, 1, 2, 2, 3, 3, 0, // bottom
82
+ 4, 5, 5, 6, 6, 7, 7, 4, // top
83
+ 0, 4, 1, 5, 2, 6, 3, 7, // pillars
84
+ ];
85
+ return { vertices: verts, indices };
86
+ }
87
+ if (shape.type === 'sphere') {
88
+ appendGeometry(result, createCircleLines(shape.radius, sphereSegs, 'xy'));
89
+ appendGeometry(result, createCircleLines(shape.radius, sphereSegs, 'xz'));
90
+ appendGeometry(result, createCircleLines(shape.radius, sphereSegs, 'yz'));
91
+ return result;
92
+ }
93
+ if (shape.type === 'capsule') {
94
+ const { radius: r, halfHeight: h } = shape;
95
+ const halfSegs = Math.max(4, Math.floor(capsuleSegs / 2));
96
+ // 4 cylinder side pillars
97
+ const baseIndex = result.vertices.length;
98
+ result.vertices.push({ x: -r, y: -h, z: 0 }, { x: -r, y: h, z: 0 }, { x: r, y: -h, z: 0 }, { x: r, y: h, z: 0 }, { x: 0, y: -h, z: -r }, { x: 0, y: h, z: -r }, { x: 0, y: -h, z: r }, { x: 0, y: h, z: r });
99
+ result.indices.push(baseIndex, baseIndex + 1, baseIndex + 2, baseIndex + 3, baseIndex + 4, baseIndex + 5, baseIndex + 6, baseIndex + 7);
100
+ // 2 horizontal equator rings
101
+ appendGeometry(result, createCircleLines(r, capsuleSegs, 'xz', { x: 0, y: h, z: 0 }));
102
+ appendGeometry(result, createCircleLines(r, capsuleSegs, 'xz', { x: 0, y: -h, z: 0 }));
103
+ // Top dome arcs
104
+ appendGeometry(result, createArcLines(r, halfSegs, 'xy', { x: 0, y: h, z: 0 }, Math.PI, 0));
105
+ appendGeometry(result, createArcLines(r, halfSegs, 'yz', { x: 0, y: h, z: 0 }, -Math.PI / 2, Math.PI / 2));
106
+ // Bottom dome arcs
107
+ appendGeometry(result, createArcLines(r, halfSegs, 'xy', { x: 0, y: -h, z: 0 }, Math.PI, Math.PI * 2));
108
+ appendGeometry(result, createArcLines(r, halfSegs, 'yz', { x: 0, y: -h, z: 0 }, Math.PI / 2, (3 * Math.PI) / 2));
109
+ return result;
110
+ }
111
+ if (shape.type === 'hull') {
112
+ const hullData = buildSolverHull(shape.vertices);
113
+ const vertices = [...hullData.vertices];
114
+ const indices = [];
115
+ for (const face of hullData.faces) {
116
+ const len = face.verts.length;
117
+ for (let i = 0; i < len; i += 1) {
118
+ indices.push(face.verts[i], face.verts[(i + 1) % len]);
119
+ }
120
+ }
121
+ return { vertices, indices };
122
+ }
123
+ if (shape.type === 'mesh') {
124
+ const vertices = [...shape.vertices];
125
+ const indices = [];
126
+ for (let i = 0; i < vertices.length; i += 3) {
127
+ indices.push(i, i + 1, i + 1, i + 2, i + 2, i);
128
+ }
129
+ return { vertices, indices };
130
+ }
131
+ if (shape.type === 'heightfield') {
132
+ const { columns, rows, scale, heights } = shape;
133
+ const vertices = [];
134
+ const indices = [];
135
+ for (let r = 0; r < rows; r += 1) {
136
+ for (let c = 0; c < columns; c += 1) {
137
+ const h = heights[c + columns * r] ?? 0;
138
+ vertices.push({ x: c * scale.x, y: h * scale.y, z: r * scale.z });
139
+ }
140
+ }
141
+ for (let r = 0; r < rows; r += 1) {
142
+ for (let c = 0; c < columns; c += 1) {
143
+ const curr = c + columns * r;
144
+ if (c + 1 < columns) {
145
+ indices.push(curr, curr + 1);
146
+ }
147
+ if (r + 1 < rows) {
148
+ indices.push(curr, curr + columns);
149
+ }
150
+ if (c + 1 < columns && r + 1 < rows) {
151
+ indices.push(curr + columns, curr + 1);
152
+ }
153
+ }
154
+ }
155
+ return { vertices, indices };
156
+ }
157
+ if (shape.type === 'compound') {
158
+ for (const child of shape.children) {
159
+ const childLines = buildShapeLines(child.shape, options);
160
+ const orientation = child.quarterTurns !== undefined
161
+ ? quaternionFromQuarterTurns({
162
+ x: canonicalQuarterTurns(child.quarterTurns.x),
163
+ y: canonicalQuarterTurns(child.quarterTurns.y),
164
+ z: canonicalQuarterTurns(child.quarterTurns.z),
165
+ })
166
+ : undefined;
167
+ appendGeometry(result, childLines, {
168
+ offset: child.offset,
169
+ orientation,
170
+ });
171
+ }
172
+ return result;
173
+ }
174
+ return result;
175
+ }
176
+ function bodyMatchesFilter(body, options) {
177
+ if (body.kind === 'static' && options.includeStatics === false)
178
+ return false;
179
+ if (body.kind === 'kinematic' && options.includeKinematics === false)
180
+ return false;
181
+ if (body.kind === 'dynamic' && options.includeDynamics === false)
182
+ return false;
183
+ if (body.trigger === true && options.includeTriggers === false)
184
+ return false;
185
+ if (body.sensor === true && options.includeSensors === false)
186
+ return false;
187
+ return true;
188
+ }
189
+ /**
190
+ * Generates flat position and index buffers of line segments representing all
191
+ * colliders in a deterministic physics world, compatible with Three.js LineSegments
192
+ * and WebGL line rendering pipelines.
193
+ */
194
+ export function generatePhysicsWorldDebugMesh(world, options = {}) {
195
+ const worldVertices = [];
196
+ const worldIndices = [];
197
+ let vertexIndexOffset = 0;
198
+ for (const body of world.bodies) {
199
+ if (!bodyMatchesFilter(body, options)) {
200
+ continue;
201
+ }
202
+ const localGeometry = buildShapeLines(body.shape, options);
203
+ const orientation = body.orientation ?? (body.rx !== undefined || body.ry !== undefined || body.rz !== undefined
204
+ ? quaternionFromQuarterTurns({
205
+ x: canonicalQuarterTurns(body.rx ?? 0),
206
+ y: canonicalQuarterTurns(body.ry ?? 0),
207
+ z: canonicalQuarterTurns(body.rz ?? 0),
208
+ })
209
+ : undefined);
210
+ for (const vertex of localGeometry.vertices) {
211
+ let worldPos = vertex;
212
+ if (orientation !== undefined) {
213
+ worldPos = rotatePointByQuat(orientation, worldPos);
214
+ }
215
+ worldVertices.push(worldPos.x + body.x, worldPos.y + body.y, worldPos.z + body.z);
216
+ }
217
+ for (const idx of localGeometry.indices) {
218
+ worldIndices.push(vertexIndexOffset + idx);
219
+ }
220
+ vertexIndexOffset += localGeometry.vertices.length;
221
+ }
222
+ return {
223
+ positions: new Float32Array(worldVertices),
224
+ indices: new Uint32Array(worldIndices),
225
+ };
226
+ }
package/dist/index.d.ts CHANGED
@@ -27,8 +27,9 @@ export { createNetworkedSyncplayClient, prepareNetworkedSyncplayTransport } from
27
27
  export { createSyncplayRunner } from './runner.js';
28
28
  export { fbm2D, hash2, hashUint32, valueNoise1D, valueNoise2D } from './noise.js';
29
29
  export { circleCastDeterministicPhysics2D, createDeterministicPhysicsWorld2D, nearestDeterministicPhysicsHit2D, queryDeterministicPhysicsAabb2D, queryDeterministicPhysicsShapeOverlap2D, raycastAllDeterministicPhysics2D, raycastDeterministicPhysics2D, stepDeterministicPhysicsWorld2D } from './physics2d.js';
30
- export { applyDeterministicImpulse3D, applyDeterministicImpulses3D, applyDeterministicWorldEdit3D, contactDetailsDeterministicPhysics3D, createDeterministicPhysicsWorld3D, createTrustedDeterministicPhysicsWorld3D, deriveInverseInertia, deterministicPhysicsBodyById3D, deterministicPhysicsCallback3D, overlapDeterministicPhysics3D, raycastDeterministicPhysics3D, raycastDeterministicPhysics3DDetailed, runDeterministicPhysics3DStress, setDeterministicBodyVelocity3D, shapeCastDeterministicPhysics3D, shapeCastDeterministicPhysics3DDetailed, stepDeterministicPhysicsWorld3D } from './physics3d.js';
31
- export { cookDeterministicVoxelChunkCollider3D } from './physics3d-voxel.js';
30
+ export { applyDeterministicImpulse3D, applyDeterministicImpulses3D, applyDeterministicWorldEdit3D, contactDetailsDeterministicPhysics3D, createBoxShapeFromExtents, createBoxShapeFromMinMax, createCapsuleShapeFromBase, createDeterministicPhysicsWorld3D, createTrustedDeterministicPhysicsWorld3D, deriveInverseInertia, deterministicPhysicsBodyById3D, deterministicPhysicsCallback3D, overlapDeterministicPhysics3D, raycastDeterministicPhysics3D, raycastDeterministicPhysics3DDetailed, runDeterministicPhysics3DStress, setDeterministicBodyVelocity3D, setDeterministicKinematicPoses3D, setDeterministicKinematicTransforms3D, shapeCastDeterministicPhysics3D, shapeCastDeterministicPhysics3DDetailed, stepDeterministicPhysicsWorld3D } from './physics3d.js';
31
+ export { carveDeterministicVoxelChunk3D, cookDeterministicVoxelChunkCollider3D, cookDeterministicVoxelSubregion3D, raycastDeterministicVoxelChunk3D } from './physics3d-voxel.js';
32
+ export { generatePhysicsWorldDebugMesh } from './debug-wireframe.js';
32
33
  export { cylinderHullVertices } from './physics3d-hull.js';
33
34
  export { runDeterministicPhysics3DDestructionCert } from './physics3d-destruction-cert.js';
34
35
  export { createDeterministicCosmeticPhysicsWorld3D, setDeterministicCosmeticPhysicsAuthoritativeBodyProxies3D, stepDeterministicCosmeticPhysicsWorld3D } from './cosmetic-physics3d.js';
@@ -77,8 +78,9 @@ export type { CookedDeterministicNavmesh, DeterministicNavmeshAgent, Determinist
77
78
  export type { ConfirmedSyncplayPresentationFrame, KinetixRuntimeFactory, NetworkedClientTransport, NetworkedSyncplayClient, NetworkedSyncplayClientInputDelayOptions, NetworkedSyncplayClientNetStats, NetworkedSyncplayClientOptions, NetworkedSyncplayClientPacingOptions, NetworkedSyncplayPreparationOptions, NetworkedSyncplaySessionDescriptor, PreparedNetworkedSyncplayTransport, SyncplayPredictionMode, SyncplayRemoteInputPrediction } from './networked-client.js';
78
79
  export type { SyncplayRunner, SyncplayRunnerConfig, SyncplayRunnerConnectionEvent, SyncplayRunnerOccupancy, SyncplayRunnerOfflineOptions, SyncplayRunnerPresentation, SyncplayRunnerSnapshot, SyncplayRunnerStatus, SyncplayRunnerTransport } from './runner.js';
79
80
  export type { DeterministicBodyKind, DeterministicContactEvent2D, DeterministicContactEventType, DeterministicPhysicsAabbQuery2D, DeterministicPhysicsBody2D, DeterministicPhysicsCircleCastQuery2D, DeterministicPhysicsConstraint2D, DeterministicPhysicsHit2D, DeterministicPhysicsQueryOptions2D, DeterministicPhysicsRaycastQuery2D, DeterministicPhysicsShape2D, DeterministicPhysicsShapeOverlapQuery2D, DeterministicPhysicsStepOptions2D, DeterministicPhysicsStepResult2D, DeterministicPhysicsWorld2D } from './physics2d.js';
80
- export type { DeterministicContactCacheEntry3D, DeterministicJointCacheEntry3D, DeterministicPhysicsActivePair3D, DeterministicPhysicsAxisLock3D, DeterministicPhysicsBody3D, DeterministicPhysicsCallbackMask3D, DeterministicPhysicsCompoundChild3D, DeterministicPhysicsCompoundChildShape3D, DeterministicPhysicsConstraint3D, DeterministicPhysicsContactDetail3D, DeterministicPhysicsContactEvent3D, DeterministicPhysicsDetailedHit3D, DeterministicPhysicsHit3D, DeterministicPhysicsHullShape3D, DeterministicPhysicsImpulseApplication3D, DeterministicPhysicsOverlapQuery3D, DeterministicPhysicsPrimitiveShape3D, DeterministicPhysicsQuaternion3D, DeterministicPhysicsQueryOptions3D, DeterministicPhysicsRaycastQuery3D, DeterministicPhysicsScheduledQuery3D, DeterministicPhysicsShape3D, DeterministicPhysicsShapeCastQuery3D, DeterministicPhysicsStepResult3D, DeterministicPhysicsVec3, DeterministicPhysicsWorld3D, DeterministicPhysicsWorldEdit3D } from './physics3d.js';
81
- export type { DeterministicVoxelChunk3D, DeterministicVoxelCompoundShape3D } from './physics3d-voxel.js';
81
+ export type { DeterministicContactCacheEntry3D, DeterministicJointCacheEntry3D, DeterministicKinematicPose3D, DeterministicKinematicTransformBuffer3D, DeterministicPhysicsActivePair3D, DeterministicPhysicsAxisLock3D, DeterministicPhysicsBody3D, DeterministicPhysicsCallbackMask3D, DeterministicPhysicsCompoundChild3D, DeterministicPhysicsCompoundChildShape3D, DeterministicPhysicsConstraint3D, DeterministicPhysicsContactDetail3D, DeterministicPhysicsContactEvent3D, DeterministicPhysicsDetailedHit3D, DeterministicPhysicsHit3D, DeterministicPhysicsHullShape3D, DeterministicPhysicsImpulseApplication3D, DeterministicPhysicsOverlapQuery3D, DeterministicPhysicsPrimitiveShape3D, DeterministicPhysicsQuaternion3D, DeterministicPhysicsQueryOptions3D, DeterministicPhysicsRaycastQuery3D, DeterministicPhysicsScheduledQuery3D, DeterministicPhysicsShape3D, DeterministicPhysicsShapeCastQuery3D, DeterministicPhysicsStepResult3D, DeterministicPhysicsVec3, DeterministicPhysicsWorld3D, DeterministicPhysicsWorldEdit3D } from './physics3d.js';
82
+ export type { DeterministicVoxelChunk3D, DeterministicVoxelCompoundShape3D, DeterministicVoxelRayHit3D, VoxelCarveRegion3D } from './physics3d-voxel.js';
83
+ export type { PhysicsWorldDebugMesh, PhysicsWorldDebugMeshOptions } from './debug-wireframe.js';
82
84
  export type { DeterministicDestructionCertOptions, DeterministicDestructionCertResult } from './physics3d-destruction-cert.js';
83
85
  export type { DeterministicAuthoritativeBodyProxy3D, DeterministicCosmeticPhysicsBody3D, DeterministicCosmeticPhysicsStepOptions3D, DeterministicCosmeticPhysicsStepResult3D, DeterministicCosmeticPhysicsWorld3D } from './cosmetic-physics3d.js';
84
86
  export type { DeterministicPhysicsJoint3D } from './physics3d-joints.js';
package/dist/index.js CHANGED
@@ -28,8 +28,9 @@ export { createNetworkedSyncplayClient, prepareNetworkedSyncplayTransport } from
28
28
  export { createSyncplayRunner } from './runner.js';
29
29
  export { fbm2D, hash2, hashUint32, valueNoise1D, valueNoise2D } from './noise.js';
30
30
  export { circleCastDeterministicPhysics2D, createDeterministicPhysicsWorld2D, nearestDeterministicPhysicsHit2D, queryDeterministicPhysicsAabb2D, queryDeterministicPhysicsShapeOverlap2D, raycastAllDeterministicPhysics2D, raycastDeterministicPhysics2D, stepDeterministicPhysicsWorld2D } from './physics2d.js';
31
- export { applyDeterministicImpulse3D, applyDeterministicImpulses3D, applyDeterministicWorldEdit3D, contactDetailsDeterministicPhysics3D, createDeterministicPhysicsWorld3D, createTrustedDeterministicPhysicsWorld3D, deriveInverseInertia, deterministicPhysicsBodyById3D, deterministicPhysicsCallback3D, overlapDeterministicPhysics3D, raycastDeterministicPhysics3D, raycastDeterministicPhysics3DDetailed, runDeterministicPhysics3DStress, setDeterministicBodyVelocity3D, shapeCastDeterministicPhysics3D, shapeCastDeterministicPhysics3DDetailed, stepDeterministicPhysicsWorld3D } from './physics3d.js';
32
- export { cookDeterministicVoxelChunkCollider3D } from './physics3d-voxel.js';
31
+ export { applyDeterministicImpulse3D, applyDeterministicImpulses3D, applyDeterministicWorldEdit3D, contactDetailsDeterministicPhysics3D, createBoxShapeFromExtents, createBoxShapeFromMinMax, createCapsuleShapeFromBase, createDeterministicPhysicsWorld3D, createTrustedDeterministicPhysicsWorld3D, deriveInverseInertia, deterministicPhysicsBodyById3D, deterministicPhysicsCallback3D, overlapDeterministicPhysics3D, raycastDeterministicPhysics3D, raycastDeterministicPhysics3DDetailed, runDeterministicPhysics3DStress, setDeterministicBodyVelocity3D, setDeterministicKinematicPoses3D, setDeterministicKinematicTransforms3D, shapeCastDeterministicPhysics3D, shapeCastDeterministicPhysics3DDetailed, stepDeterministicPhysicsWorld3D } from './physics3d.js';
32
+ export { carveDeterministicVoxelChunk3D, cookDeterministicVoxelChunkCollider3D, cookDeterministicVoxelSubregion3D, raycastDeterministicVoxelChunk3D } from './physics3d-voxel.js';
33
+ export { generatePhysicsWorldDebugMesh } from './debug-wireframe.js';
33
34
  export { cylinderHullVertices } from './physics3d-hull.js';
34
35
  export { runDeterministicPhysics3DDestructionCert } from './physics3d-destruction-cert.js';
35
36
  export { createDeterministicCosmeticPhysicsWorld3D, setDeterministicCosmeticPhysicsAuthoritativeBodyProxies3D, stepDeterministicCosmeticPhysicsWorld3D } from './cosmetic-physics3d.js';
@@ -1,4 +1,4 @@
1
- import type { DeterministicPhysicsShape3D } from './physics3d.js';
1
+ import type { DeterministicPhysicsRaycastQuery3D, DeterministicPhysicsShape3D } from './physics3d.js';
2
2
  export interface DeterministicVoxelChunk3D {
3
3
  readonly dimX: number;
4
4
  readonly dimY: number;
@@ -8,9 +8,31 @@ export interface DeterministicVoxelChunk3D {
8
8
  /** Row-major occupancy: occupancy[x + dimX * (y + dimY * z)]; non-zero = solid. */
9
9
  readonly occupancy: readonly (0 | 1)[];
10
10
  }
11
+ export interface DeterministicVoxelRayHit3D {
12
+ readonly hit: boolean;
13
+ readonly distance: number;
14
+ readonly voxelX: number;
15
+ readonly voxelY: number;
16
+ readonly voxelZ: number;
17
+ readonly point: {
18
+ readonly x: number;
19
+ readonly y: number;
20
+ readonly z: number;
21
+ };
22
+ readonly normal: {
23
+ readonly x: number;
24
+ readonly y: number;
25
+ readonly z: number;
26
+ };
27
+ }
11
28
  export type DeterministicVoxelCompoundShape3D = Extract<DeterministicPhysicsShape3D, {
12
29
  readonly type: 'compound';
13
30
  }>;
31
+ /**
32
+ * Amanatides & Woo 3D Digital Differential Analyzer (DDA) fast voxel grid raycaster.
33
+ * Marches through chunk cells in O(distance) directly over the occupancy bitset.
34
+ */
35
+ export declare function raycastDeterministicVoxelChunk3D(chunk: DeterministicVoxelChunk3D, query: DeterministicPhysicsRaycastQuery3D): DeterministicVoxelRayHit3D | undefined;
14
36
  /**
15
37
  * Deterministic greedy box merge: scan z→y→x ascending and grow each unconsumed
16
38
  * solid cell into the largest box along +x, then +y, then +z. A solid n³ chunk
@@ -18,3 +40,32 @@ export type DeterministicVoxelCompoundShape3D = Extract<DeterministicPhysicsShap
18
40
  * of the occupancy grid.
19
41
  */
20
42
  export declare function cookDeterministicVoxelChunkCollider3D(chunk: DeterministicVoxelChunk3D): DeterministicVoxelCompoundShape3D;
43
+ export interface VoxelCarveRegion3D {
44
+ readonly minX: number;
45
+ readonly minY: number;
46
+ readonly minZ: number;
47
+ readonly maxX: number;
48
+ readonly maxY: number;
49
+ readonly maxZ: number;
50
+ readonly operation: 'carve' | 'fill';
51
+ }
52
+ /**
53
+ * Carves or fills a 3D axis-aligned cell region in a voxel chunk occupancy grid.
54
+ * Computes interval intersection with chunk dimensions, returning chunk unchanged
55
+ * if disjoint or no-op.
56
+ */
57
+ export declare function carveDeterministicVoxelChunk3D(chunk: DeterministicVoxelChunk3D, region: VoxelCarveRegion3D): DeterministicVoxelChunk3D;
58
+ /**
59
+ * Re-cooks compound collider boxes intersecting a dirty AABB cell region,
60
+ * iteratively expanding the re-cook volume to cover any intersecting previously-merged
61
+ * boxes so uncarved solid voxels are never dropped. Preserves disjoint children
62
+ * without full-chunk re-cooking. Returns undefined if 0 voxels remain across the chunk.
63
+ */
64
+ export declare function cookDeterministicVoxelSubregion3D(chunk: DeterministicVoxelChunk3D, existingShape: DeterministicVoxelCompoundShape3D, dirtyRegion: {
65
+ readonly minX: number;
66
+ readonly minY: number;
67
+ readonly minZ: number;
68
+ readonly maxX: number;
69
+ readonly maxY: number;
70
+ readonly maxZ: number;
71
+ }): DeterministicVoxelCompoundShape3D | undefined;