@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/core/native/physics/physics.cpp +129 -3
- package/core/native/physics/physics.hpp +1 -1
- package/core/physics.d.ts +1 -0
- package/core/scripts/build-wasm-physics.mjs +1 -1
- package/core/src/physics/index.mjs +20 -9
- package/core/src/physics/physics-wasm-module.generated.mjs +4 -4
- package/dist/browser.d.ts +6 -4
- package/dist/browser.js +3 -2
- package/dist/creator.d.ts +6 -4
- package/dist/creator.js +3 -2
- package/dist/debug-wireframe.d.ts +22 -0
- package/dist/debug-wireframe.js +226 -0
- package/dist/index.d.ts +6 -4
- package/dist/index.js +3 -2
- package/dist/physics3d-voxel.d.ts +52 -1
- package/dist/physics3d-voxel.js +337 -0
- package/dist/physics3d.d.ts +57 -0
- package/dist/physics3d.js +295 -1
- package/package.json +7 -2
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;
|