@codexo/exojs-physics 0.15.3 → 0.16.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/README.md +51 -23
- package/dist/esm/Aabb.d.ts +6 -10
- package/dist/esm/Aabb.d.ts.map +1 -0
- package/dist/esm/Aabb.js +9 -5
- package/dist/esm/Aabb.js.map +1 -1
- package/dist/esm/Collider.d.ts +62 -10
- package/dist/esm/Collider.d.ts.map +1 -0
- package/dist/esm/Collider.js +263 -157
- package/dist/esm/Collider.js.map +1 -1
- package/dist/esm/ContactGraph.d.ts +51 -5
- package/dist/esm/ContactGraph.d.ts.map +1 -0
- package/dist/esm/ContactGraph.js +282 -223
- package/dist/esm/ContactGraph.js.map +1 -1
- package/dist/esm/ContactModifier.d.ts +85 -0
- package/dist/esm/ContactModifier.d.ts.map +1 -0
- package/dist/esm/ContactModifier.js +49 -0
- package/dist/esm/ContactModifier.js.map +1 -0
- package/dist/esm/PhysicsBody.d.ts +56 -22
- package/dist/esm/PhysicsBody.d.ts.map +1 -0
- package/dist/esm/PhysicsBody.js +461 -443
- package/dist/esm/PhysicsBody.js.map +1 -1
- package/dist/esm/PhysicsWorld.d.ts +276 -43
- package/dist/esm/PhysicsWorld.d.ts.map +1 -0
- package/dist/esm/PhysicsWorld.js +890 -626
- package/dist/esm/PhysicsWorld.js.map +1 -1
- package/dist/esm/TimeStepper.d.ts +3 -2
- package/dist/esm/TimeStepper.d.ts.map +1 -0
- package/dist/esm/TimeStepper.js +56 -67
- package/dist/esm/TimeStepper.js.map +1 -1
- package/dist/esm/backend/NativePhysicsBackend.d.ts +8 -4
- package/dist/esm/backend/NativePhysicsBackend.d.ts.map +1 -0
- package/dist/esm/backend/NativePhysicsBackend.js +48 -41
- package/dist/esm/backend/NativePhysicsBackend.js.map +1 -1
- package/dist/esm/backend/PhysicsBackend.d.ts +9 -2
- package/dist/esm/backend/PhysicsBackend.d.ts.map +1 -0
- package/dist/esm/binding/BindingRegistry.d.ts +25 -4
- package/dist/esm/binding/BindingRegistry.d.ts.map +1 -0
- package/dist/esm/binding/BindingRegistry.js +70 -36
- package/dist/esm/binding/BindingRegistry.js.map +1 -1
- package/dist/esm/binding/PhysicsBinding.d.ts +22 -5
- package/dist/esm/binding/PhysicsBinding.d.ts.map +1 -0
- package/dist/esm/binding/PhysicsBinding.js +46 -21
- package/dist/esm/binding/PhysicsBinding.js.map +1 -1
- package/dist/esm/broadphase/AabbTreeBroadPhase.d.ts +68 -0
- package/dist/esm/broadphase/AabbTreeBroadPhase.d.ts.map +1 -0
- package/dist/esm/broadphase/AabbTreeBroadPhase.js +149 -0
- package/dist/esm/broadphase/AabbTreeBroadPhase.js.map +1 -0
- package/dist/esm/broadphase/BroadPhase.d.ts +7 -4
- package/dist/esm/broadphase/BroadPhase.d.ts.map +1 -0
- package/dist/esm/broadphase/index.d.ts +2 -1
- package/dist/esm/broadphase/index.d.ts.map +1 -0
- package/dist/esm/collision/CollisionProxy.d.ts +3 -2
- package/dist/esm/collision/CollisionProxy.d.ts.map +1 -0
- package/dist/esm/collision/Manifold.d.ts +5 -4
- package/dist/esm/collision/Manifold.d.ts.map +1 -0
- package/dist/esm/collision/Manifold.js +34 -25
- package/dist/esm/collision/Manifold.js.map +1 -1
- package/dist/esm/collision/chainAdjacency.d.ts +29 -0
- package/dist/esm/collision/chainAdjacency.d.ts.map +1 -0
- package/dist/esm/collision/chainAdjacency.js +44 -0
- package/dist/esm/collision/chainAdjacency.js.map +1 -0
- package/dist/esm/collision/dispatch.d.ts +35 -0
- package/dist/esm/collision/dispatch.d.ts.map +1 -0
- package/dist/esm/collision/dispatch.js +58 -0
- package/dist/esm/collision/dispatch.js.map +1 -0
- package/dist/esm/collision/index.d.ts +2 -0
- package/dist/esm/collision/index.d.ts.map +1 -0
- package/dist/esm/collision/narrowphase.d.ts +5 -2
- package/dist/esm/collision/narrowphase.d.ts.map +1 -0
- package/dist/esm/collision/narrowphase.js +524 -399
- package/dist/esm/collision/narrowphase.js.map +1 -1
- package/dist/esm/collision/segments.d.ts +19 -0
- package/dist/esm/collision/segments.d.ts.map +1 -0
- package/dist/esm/collision/segments.js +36 -0
- package/dist/esm/collision/segments.js.map +1 -0
- package/dist/esm/collision/sweep.d.ts +35 -0
- package/dist/esm/collision/sweep.d.ts.map +1 -0
- package/dist/esm/collision/sweep.js +437 -0
- package/dist/esm/collision/sweep.js.map +1 -0
- package/dist/esm/debug/PhysicsDebugDraw.d.ts +23 -4
- package/dist/esm/debug/PhysicsDebugDraw.d.ts.map +1 -0
- package/dist/esm/debug/PhysicsDebugDraw.js +230 -188
- package/dist/esm/debug/PhysicsDebugDraw.js.map +1 -1
- package/dist/esm/debug/index.d.ts +1 -0
- package/dist/esm/debug/index.d.ts.map +1 -0
- package/dist/esm/debug/index.js +3 -2
- package/dist/esm/events.d.ts +1 -0
- package/dist/esm/events.d.ts.map +1 -0
- package/dist/esm/index.d.ts +1 -0
- package/dist/esm/index.d.ts.map +1 -0
- package/dist/esm/index.js +24 -19
- package/dist/esm/joints/DistanceJoint.d.ts +4 -3
- package/dist/esm/joints/DistanceJoint.d.ts.map +1 -0
- package/dist/esm/joints/DistanceJoint.js +160 -172
- package/dist/esm/joints/DistanceJoint.js.map +1 -1
- package/dist/esm/joints/Joint.d.ts +5 -4
- package/dist/esm/joints/Joint.d.ts.map +1 -0
- package/dist/esm/joints/Joint.js +23 -21
- package/dist/esm/joints/Joint.js.map +1 -1
- package/dist/esm/joints/MouseJoint.d.ts +8 -7
- package/dist/esm/joints/MouseJoint.d.ts.map +1 -0
- package/dist/esm/joints/MouseJoint.js +132 -133
- package/dist/esm/joints/MouseJoint.js.map +1 -1
- package/dist/esm/joints/PrismaticJoint.d.ts +5 -4
- package/dist/esm/joints/PrismaticJoint.d.ts.map +1 -0
- package/dist/esm/joints/PrismaticJoint.js +211 -240
- package/dist/esm/joints/PrismaticJoint.js.map +1 -1
- package/dist/esm/joints/RevoluteJoint.d.ts +4 -3
- package/dist/esm/joints/RevoluteJoint.d.ts.map +1 -0
- package/dist/esm/joints/RevoluteJoint.js +191 -213
- package/dist/esm/joints/RevoluteJoint.js.map +1 -1
- package/dist/esm/joints/WeldJoint.d.ts +3 -2
- package/dist/esm/joints/WeldJoint.d.ts.map +1 -0
- package/dist/esm/joints/WeldJoint.js +156 -152
- package/dist/esm/joints/WeldJoint.js.map +1 -1
- package/dist/esm/joints/WheelJoint.d.ts +4 -3
- package/dist/esm/joints/WheelJoint.d.ts.map +1 -0
- package/dist/esm/joints/WheelJoint.js +228 -255
- package/dist/esm/joints/WheelJoint.js.map +1 -1
- package/dist/esm/math.d.ts +6 -9
- package/dist/esm/math.d.ts.map +1 -0
- package/dist/esm/math.js +37 -39
- package/dist/esm/math.js.map +1 -1
- package/dist/esm/physicsBuildInfo.d.ts +1 -0
- package/dist/esm/physicsBuildInfo.d.ts.map +1 -0
- package/dist/esm/physicsBuildInfo.js +6 -4
- package/dist/esm/physicsBuildInfo.js.map +1 -1
- package/dist/esm/public.d.ts +8 -3
- package/dist/esm/public.d.ts.map +1 -0
- package/dist/esm/query/QueryEngine.d.ts +56 -12
- package/dist/esm/query/QueryEngine.d.ts.map +1 -0
- package/dist/esm/query/QueryEngine.js +494 -237
- package/dist/esm/query/QueryEngine.js.map +1 -1
- package/dist/esm/query/SpatialIndex.d.ts +34 -0
- package/dist/esm/query/SpatialIndex.d.ts.map +1 -0
- package/dist/esm/shapes/AnyShape.d.ts +9 -4
- package/dist/esm/shapes/AnyShape.d.ts.map +1 -0
- package/dist/esm/shapes/BoxShape.d.ts +2 -1
- package/dist/esm/shapes/BoxShape.d.ts.map +1 -0
- package/dist/esm/shapes/BoxShape.js +37 -25
- package/dist/esm/shapes/BoxShape.js.map +1 -1
- package/dist/esm/shapes/CapsuleShape.d.ts +30 -0
- package/dist/esm/shapes/CapsuleShape.d.ts.map +1 -0
- package/dist/esm/shapes/CapsuleShape.js +88 -0
- package/dist/esm/shapes/CapsuleShape.js.map +1 -0
- package/dist/esm/shapes/ChainEdgeShape.d.ts +30 -0
- package/dist/esm/shapes/ChainEdgeShape.d.ts.map +1 -0
- package/dist/esm/shapes/ChainEdgeShape.js +66 -0
- package/dist/esm/shapes/ChainEdgeShape.js.map +1 -0
- package/dist/esm/shapes/ChainShape.d.ts +52 -0
- package/dist/esm/shapes/ChainShape.d.ts.map +1 -0
- package/dist/esm/shapes/ChainShape.js +85 -0
- package/dist/esm/shapes/ChainShape.js.map +1 -0
- package/dist/esm/shapes/CircleShape.d.ts +3 -4
- package/dist/esm/shapes/CircleShape.d.ts.map +1 -0
- package/dist/esm/shapes/CircleShape.js +27 -26
- package/dist/esm/shapes/CircleShape.js.map +1 -1
- package/dist/esm/shapes/PolygonShape.d.ts +7 -8
- package/dist/esm/shapes/PolygonShape.d.ts.map +1 -0
- package/dist/esm/shapes/PolygonShape.js +131 -162
- package/dist/esm/shapes/PolygonShape.js.map +1 -1
- package/dist/esm/shapes/SegmentShape.d.ts +31 -0
- package/dist/esm/shapes/SegmentShape.d.ts.map +1 -0
- package/dist/esm/shapes/SegmentShape.js +62 -0
- package/dist/esm/shapes/SegmentShape.js.map +1 -0
- package/dist/esm/shapes/Shape.d.ts +28 -17
- package/dist/esm/shapes/Shape.d.ts.map +1 -0
- package/dist/esm/shapes/Shape.js +12 -13
- package/dist/esm/shapes/Shape.js.map +1 -1
- package/dist/esm/shapes/convexParts.d.ts +21 -0
- package/dist/esm/shapes/convexParts.d.ts.map +1 -0
- package/dist/esm/shapes/convexParts.js +26 -0
- package/dist/esm/shapes/convexParts.js.map +1 -0
- package/dist/esm/shapes/decompose.d.ts +24 -0
- package/dist/esm/shapes/decompose.d.ts.map +1 -0
- package/dist/esm/shapes/decompose.js +272 -0
- package/dist/esm/shapes/decompose.js.map +1 -0
- package/dist/esm/shapes/index.d.ts +4 -0
- package/dist/esm/shapes/index.d.ts.map +1 -0
- package/dist/esm/solver/ContactSolver.d.ts +12 -5
- package/dist/esm/solver/ContactSolver.d.ts.map +1 -0
- package/dist/esm/solver/ContactSolver.js +425 -471
- package/dist/esm/solver/ContactSolver.js.map +1 -1
- package/dist/esm/solver/tolerances.d.ts +34 -0
- package/dist/esm/solver/tolerances.d.ts.map +1 -0
- package/dist/esm/solver/tolerances.js +38 -0
- package/dist/esm/solver/tolerances.js.map +1 -0
- package/dist/esm/sort.d.ts +5 -4
- package/dist/esm/sort.d.ts.map +1 -0
- package/dist/esm/sort.js +41 -51
- package/dist/esm/sort.js.map +1 -1
- package/dist/esm/types.d.ts +4 -8
- package/dist/esm/types.d.ts.map +1 -0
- package/dist/esm/types.js +15 -17
- package/dist/esm/types.js.map +1 -1
- package/package.json +6 -6
- package/dist/esm/broadphase/SweepAndPrune.d.ts +0 -15
- package/dist/esm/broadphase/SweepAndPrune.js +0 -77
- package/dist/esm/broadphase/SweepAndPrune.js.map +0 -1
- package/dist/esm/debug/index.js.map +0 -1
- package/dist/esm/index.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PhysicsDebugDraw.js","sources":["../../../../src/debug/PhysicsDebugDraw.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"PhysicsDebugDraw.js","names":[],"sources":["../../../src/debug/PhysicsDebugDraw.ts"],"sourcesContent":["import type { Application } from '@codexo/exojs';\nimport { Color, Graphics } from '@codexo/exojs';\nimport type { DebugLayerViewMode } from '@codexo/exojs/debug';\nimport { DebugLayer } from '@codexo/exojs/debug';\nimport type { RenderBackend } from '@codexo/exojs/renderer-sdk';\n\nimport { aabbOverlap } from '../Aabb';\nimport type { CandidatePair } from '../broadphase/BroadPhase';\nimport type { Collider } from '../Collider';\nimport { authoredCollider } from '../Collider';\nimport { Manifold } from '../collision/Manifold';\nimport { collide } from '../collision/narrowphase';\nimport type { PhysicsWorld } from '../PhysicsWorld';\nimport type { BodyType } from '../types';\n\n/** Toggles for the physics debug overlay. */\nexport interface PhysicsDebugDrawOptions {\n /** Collider shape outlines, coloured by body type. Default `true`. */\n drawShapes?: boolean;\n /** World AABBs of the geometry the broad phase holds - a chain as its per-edge leaves. Default `false`. */\n drawAabb?: boolean;\n /** Contact points. Default `false`. */\n drawContacts?: boolean;\n /** Contact normals. Default `false`. */\n drawNormals?: boolean;\n /** Body origins (centre markers). Default `false`. */\n drawCenters?: boolean;\n /** Broad-phase candidate links between AABB-overlapping leaves - a chain links per edge. Default `false`. */\n drawBroadphase?: boolean;\n /** Tint sleeping bodies distinctly (applies to the shape outline). Default `false`. */\n drawSleeping?: boolean;\n /** Lines connecting the bodies of each joint. Default `false`. */\n drawJoints?: boolean;\n}\n\nconst segments = 24;\n\nconst colorStatic = new Color(0.3, 0.9, 0.4, 0.9);\nconst colorKinematic = new Color(0.4, 0.7, 1, 0.9);\nconst colorDynamic = new Color(1, 0.85, 0.3, 0.9);\nconst colorSensor = new Color(1, 0.3, 1, 0.9);\nconst colorAabb = new Color(0.5, 0.5, 0.5, 0.5);\nconst colorContact = new Color(1, 0.2, 0.2, 1);\nconst colorNormal = new Color(1, 0.6, 0.1, 1);\nconst colorCenter = new Color(1, 1, 1, 0.9);\nconst colorBroadphase = new Color(0.2, 0.8, 0.8, 0.5);\nconst colorSleeping = new Color(0.45, 0.45, 0.5, 0.7);\nconst colorJoint = new Color(0.9, 0.5, 1, 0.8);\n\n/**\n * `DebugLayer` that visualises a {@link PhysicsWorld} - shapes, AABBs, contacts,\n * normals, centres and broad-phase links. It reads the world's public state and\n * recomputes contacts/broad-phase locally only while visible, so it never\n * perturbs the simulation and works over any backend. Lives in the `./debug`\n * subpath so it tree-shakes out of production bundles.\n */\nexport class PhysicsDebugDraw extends DebugLayer {\n /** Mutable option flags (read each frame). */\n public readonly options: Required<PhysicsDebugDrawOptions>;\n\n private readonly _world: PhysicsWorld;\n private _graphics: Graphics | null = null;\n private readonly _manifold = new Manifold();\n private readonly _pairs: CandidatePair[] = [];\n\n public constructor(app: Application, world: PhysicsWorld, options: PhysicsDebugDrawOptions = {}) {\n super(app);\n\n this._world = world;\n this.options = {\n drawShapes: options.drawShapes ?? true,\n drawAabb: options.drawAabb ?? false,\n drawContacts: options.drawContacts ?? false,\n drawNormals: options.drawNormals ?? false,\n drawCenters: options.drawCenters ?? false,\n drawBroadphase: options.drawBroadphase ?? false,\n drawSleeping: options.drawSleeping ?? false,\n drawJoints: options.drawJoints ?? false,\n };\n }\n\n public override get viewMode(): DebugLayerViewMode {\n return 'world';\n }\n\n public override update(): void {\n // All state is read from the world in render().\n }\n\n public override render(backend: RenderBackend): void {\n const gfx = (this._graphics ??= new Graphics());\n const options = this.options;\n\n gfx.clear();\n gfx.lineWidth = 1;\n\n if (options.drawBroadphase) {\n this._renderBroadphase(gfx);\n }\n\n if (options.drawAabb) {\n // The solver-side geometry, so a chain shows the leaves the broad phase\n // actually holds rather than the union box no phase ever tests.\n for (const collider of this._world.detectionGeometry) {\n this._strokeAabb(gfx, collider);\n }\n }\n\n if (options.drawShapes) {\n for (const collider of this._world.colliders) {\n this._strokeShape(gfx, collider);\n }\n }\n\n if (options.drawCenters) {\n gfx.lineColor = colorCenter;\n\n for (const body of this._world.bodies) {\n this._strokeCross(gfx, body.x, body.y, 4);\n }\n }\n\n if (options.drawContacts || options.drawNormals) {\n this._renderContacts(gfx);\n }\n\n if (options.drawJoints) {\n this._renderJoints(gfx);\n }\n\n gfx.render(backend);\n }\n\n private _renderJoints(gfx: Graphics): void {\n gfx.lineColor = colorJoint;\n\n for (const joint of this._world.joints) {\n gfx.moveTo(joint.bodyA.x, joint.bodyA.y);\n gfx.lineTo(joint.bodyB.x, joint.bodyB.y);\n }\n }\n\n public override destroy(): void {\n if (this._graphics !== null) {\n this._graphics.destroy();\n this._graphics = null;\n }\n }\n\n // ── helpers ────────────────────────────────────────────────────────────\n\n private _outlineColor(collider: Collider): Color {\n if (collider.isSensor) {\n return colorSensor;\n }\n\n if (this.options.drawSleeping && collider.body.isSleeping) {\n return colorSleeping;\n }\n\n return colorForType(collider.body.type);\n }\n\n private _strokeShape(gfx: Graphics, collider: Collider): void {\n gfx.lineColor = this._outlineColor(collider);\n\n if (collider.shape.type === 'circle') {\n const c = collider.worldCenter;\n const r = collider.shape.radius;\n\n this._strokeCircle(gfx, c.x, c.y, r);\n // A spoke to the surface conveys orientation once bodies rotate.\n gfx.moveTo(c.x, c.y);\n gfx.lineTo(c.x + collider.worldTransform.cos * r, c.y + collider.worldTransform.sin * r);\n\n return;\n }\n\n if (collider.shape.type === 'capsule') {\n this._strokeCapsule(gfx, collider.worldVertices, collider.shape.radius);\n\n return;\n }\n\n if (collider.shape.type === 'segment') {\n const ends = collider.worldVertices;\n\n gfx.moveTo(ends[0]!, ends[1]!);\n gfx.lineTo(ends[2]!, ends[3]!);\n\n return;\n }\n\n if (collider.shape.type === 'chain') {\n // A chain keeps no world geometry of its own - its edge proxies do, and\n // drawing them is drawing exactly what the solver sees, closing edge\n // included.\n for (const edge of collider.chainEdges ?? []) {\n const ends = edge.worldVertices;\n\n gfx.moveTo(ends[0]!, ends[1]!);\n gfx.lineTo(ends[2]!, ends[3]!);\n }\n\n return;\n }\n\n const verts = collider.worldVertices;\n const count = collider.shape.count;\n\n gfx.moveTo(verts[0]!, verts[1]!);\n\n for (let i = 1; i <= count; i++) {\n const j = i % count;\n\n gfx.lineTo(verts[j * 2]!, verts[j * 2 + 1]!);\n }\n }\n\n /**\n * Capsule outline: the two straight sides offset from the spine, joined by a\n * half-circle at each end. The arcs are approximated - a visualisation may\n * tessellate, the solver never does.\n */\n private _strokeCapsule(gfx: Graphics, spine: readonly number[], radius: number): void {\n const ax = spine[0]!;\n const ay = spine[1]!;\n const bx = spine[2]!;\n const by = spine[3]!;\n const along = Math.atan2(by - ay, bx - ax);\n const arcSegments = 12;\n\n gfx.moveTo(ax + Math.cos(along + Math.PI / 2) * radius, ay + Math.sin(along + Math.PI / 2) * radius);\n gfx.lineTo(bx + Math.cos(along + Math.PI / 2) * radius, by + Math.sin(along + Math.PI / 2) * radius);\n\n for (let i = 1; i <= arcSegments; i++) {\n const angle = along + Math.PI / 2 - (Math.PI * i) / arcSegments;\n\n gfx.lineTo(bx + Math.cos(angle) * radius, by + Math.sin(angle) * radius);\n }\n\n for (let i = 1; i <= arcSegments; i++) {\n const angle = along - Math.PI / 2 - (Math.PI * i) / arcSegments;\n\n gfx.lineTo(ax + Math.cos(angle) * radius, ay + Math.sin(angle) * radius);\n }\n }\n\n private _strokeAabb(gfx: Graphics, collider: Collider): void {\n const box = collider.aabb;\n\n gfx.lineColor = colorAabb;\n gfx.moveTo(box.minX, box.minY);\n gfx.lineTo(box.maxX, box.minY);\n gfx.lineTo(box.maxX, box.maxY);\n gfx.lineTo(box.minX, box.maxY);\n gfx.lineTo(box.minX, box.minY);\n }\n\n private _strokeCircle(gfx: Graphics, cx: number, cy: number, r: number): void {\n gfx.moveTo(cx + r, cy);\n\n for (let i = 1; i <= segments; i++) {\n const a = (i / segments) * Math.PI * 2;\n\n gfx.lineTo(cx + Math.cos(a) * r, cy + Math.sin(a) * r);\n }\n }\n\n private _strokeCross(gfx: Graphics, x: number, y: number, size: number): void {\n gfx.moveTo(x - size, y);\n gfx.lineTo(x + size, y);\n gfx.moveTo(x, y - size);\n gfx.lineTo(x, y + size);\n }\n\n /**\n * Recomputes candidate pairs from scratch for the current frame via a plain\n * brute-force AABB-overlap scan - deliberately NOT `AabbTreeBroadPhase`.\n * That class relies on `Collider._treeProxy`, a field shared on the\n * Collider object and valid only for whichever ONE broad phase currently\n * owns it (the world's own `NativePhysicsBackend`); a second instance here\n * would silently corrupt that ownership every time debug draw and a\n * physics step interleave. Debug-only/opt-in (tree-shaken from production\n * bundles), recomputed from scratch every visible frame regardless, so an\n * O(n^2) scan is an appropriate, fully self-contained trade for\n * correctness - it touches no state outside this method.\n */\n private _collectPairs(): void {\n // The solver-side geometry: a chain contributes one leaf per edge, which is\n // both what the broad phase pairs and what the narrow phase can solve.\n const colliders = this._world.detectionGeometry;\n const pairs = this._pairs;\n\n pairs.length = 0;\n\n for (let i = 0; i < colliders.length; i++) {\n const a = colliders[i]!;\n\n for (let j = i + 1; j < colliders.length; j++) {\n const b = colliders[j]!;\n\n if (a.body !== b.body && aabbOverlap(a.aabb, b.aabb)) {\n pairs.push(a.id < b.id ? { a, b } : { a: b, b: a });\n }\n }\n }\n }\n\n private _renderBroadphase(gfx: Graphics): void {\n this._collectPairs();\n gfx.lineColor = colorBroadphase;\n\n for (const pair of this._pairs) {\n const a = pair.a.aabb;\n const b = pair.b.aabb;\n\n gfx.moveTo((a.minX + a.maxX) * 0.5, (a.minY + a.maxY) * 0.5);\n gfx.lineTo((b.minX + b.maxX) * 0.5, (b.minY + b.maxY) * 0.5);\n }\n }\n\n private _renderContacts(gfx: Graphics): void {\n this._collectPairs();\n\n for (const pair of this._pairs) {\n const a = pair.a;\n const b = pair.b;\n\n // Material and sensor state live on the authored collider; an edge proxy\n // reads them from its chain.\n if (authoredCollider(a).isSensor || authoredCollider(b).isSensor) {\n continue;\n }\n\n if (!collide(a, b, this._manifold)) {\n continue;\n }\n\n for (let i = 0; i < this._manifold.pointCount; i++) {\n // i in 0..pointCount-1 and pointCount ≤ 2, so the point always exists.\n const point = i === 0 ? this._manifold.points[0] : this._manifold.points[1];\n\n if (this.options.drawContacts) {\n gfx.lineColor = colorContact;\n this._strokeCross(gfx, point.x, point.y, 3);\n }\n\n if (this.options.drawNormals) {\n gfx.lineColor = colorNormal;\n gfx.moveTo(point.x, point.y);\n gfx.lineTo(point.x + this._manifold.normalX * 12, point.y + this._manifold.normalY * 12);\n }\n }\n }\n }\n}\n\nconst colorForType = (type: BodyType): Color => {\n if (type === 'static') {\n return colorStatic;\n }\n\n return type === 'kinematic' ? colorKinematic : colorDynamic;\n};\n"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/debug/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,KAAK,uBAAuB,EAAE,MAAM,oBAAoB,CAAC"}
|
package/dist/esm/debug/index.js
CHANGED
|
@@ -1,2 +1,3 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
import { PhysicsDebugDraw } from "./PhysicsDebugDraw.js";
|
|
2
|
+
|
|
3
|
+
export { PhysicsDebugDraw };
|
package/dist/esm/events.d.ts
CHANGED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../../src/events.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAEjD,uEAAuE;AACvE,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC;IACnB,qCAAqC;IACrC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;CAC9B;AAED;;;;;GAKG;AACH,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC;IAC5B,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC;IAC5B,QAAQ,CAAC,SAAS,EAAE,QAAQ,CAAC;IAC7B,QAAQ,CAAC,SAAS,EAAE,QAAQ,CAAC;IAC7B,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACpD,QAAQ,CAAC,MAAM,EAAE,SAAS,YAAY,EAAE,CAAC;CAC1C;AAED;;;;GAIG;AACH,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC;IAC1B,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC;CAC1B"}
|
package/dist/esm/index.d.ts
CHANGED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAIA,cAAc,UAAU,CAAC"}
|
package/dist/esm/index.js
CHANGED
|
@@ -1,19 +1,24 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
1
|
+
import { PhysicsBinding } from "./binding/PhysicsBinding.js";
|
|
2
|
+
import { defaultFilter, shouldCollide } from "./types.js";
|
|
3
|
+
import { Collider } from "./Collider.js";
|
|
4
|
+
import { Joint } from "./joints/Joint.js";
|
|
5
|
+
import { DistanceJoint } from "./joints/DistanceJoint.js";
|
|
6
|
+
import { PhysicsBody } from "./PhysicsBody.js";
|
|
7
|
+
import { MouseJoint } from "./joints/MouseJoint.js";
|
|
8
|
+
import { PrismaticJoint } from "./joints/PrismaticJoint.js";
|
|
9
|
+
import { RevoluteJoint } from "./joints/RevoluteJoint.js";
|
|
10
|
+
import { WeldJoint } from "./joints/WeldJoint.js";
|
|
11
|
+
import { WheelJoint } from "./joints/WheelJoint.js";
|
|
12
|
+
import { physicsBuildInfo } from "./physicsBuildInfo.js";
|
|
13
|
+
import { Shape } from "./shapes/Shape.js";
|
|
14
|
+
import { SegmentShape } from "./shapes/SegmentShape.js";
|
|
15
|
+
import { TimeStepper } from "./TimeStepper.js";
|
|
16
|
+
import { PhysicsWorld } from "./PhysicsWorld.js";
|
|
17
|
+
import { PolygonShape } from "./shapes/PolygonShape.js";
|
|
18
|
+
import { BoxShape } from "./shapes/BoxShape.js";
|
|
19
|
+
import { CapsuleShape } from "./shapes/CapsuleShape.js";
|
|
20
|
+
import { ChainShape } from "./shapes/ChainShape.js";
|
|
21
|
+
import { CircleShape } from "./shapes/CircleShape.js";
|
|
22
|
+
import { toConvexPolygonShapes } from "./shapes/convexParts.js";
|
|
23
|
+
|
|
24
|
+
export { BoxShape, CapsuleShape, ChainShape, CircleShape, Collider, DistanceJoint, Joint, MouseJoint, PhysicsBinding, PhysicsBody, PhysicsWorld, PolygonShape, PrismaticJoint, RevoluteJoint, SegmentShape, Shape, TimeStepper, WeldJoint, WheelJoint, defaultFilter, physicsBuildInfo, shouldCollide, toConvexPolygonShapes };
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
+
import type { PointLike } from '@codexo/exojs';
|
|
1
2
|
import type { PhysicsBody } from '../PhysicsBody';
|
|
2
|
-
import type { VectorLike } from '../types';
|
|
3
3
|
import { Joint } from './Joint';
|
|
4
4
|
/** Construction options for a {@link DistanceJoint}. */
|
|
5
5
|
export interface DistanceJointOptions {
|
|
@@ -8,9 +8,9 @@ export interface DistanceJointOptions {
|
|
|
8
8
|
/** Second body. */
|
|
9
9
|
bodyB: PhysicsBody;
|
|
10
10
|
/** World-space anchor on body A at creation. Default: body A's position. */
|
|
11
|
-
anchorA?:
|
|
11
|
+
anchorA?: Readonly<PointLike>;
|
|
12
12
|
/** World-space anchor on body B at creation. Default: body B's position. */
|
|
13
|
-
anchorB?:
|
|
13
|
+
anchorB?: Readonly<PointLike>;
|
|
14
14
|
/** Target distance between the anchors. Default: their initial distance. */
|
|
15
15
|
length?: number;
|
|
16
16
|
/** Soft-spring frequency in Hz; `0` (default) makes it a rigid constraint. */
|
|
@@ -69,3 +69,4 @@ export declare class DistanceJoint extends Joint {
|
|
|
69
69
|
_solve(useBias: boolean): void;
|
|
70
70
|
private _applyAxisImpulse;
|
|
71
71
|
}
|
|
72
|
+
//# sourceMappingURL=DistanceJoint.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DistanceJoint.d.ts","sourceRoot":"","sources":["../../../src/joints/DistanceJoint.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAG/C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAEhC,wDAAwD;AACxD,MAAM,WAAW,oBAAoB;IACnC,0CAA0C;IAC1C,KAAK,EAAE,WAAW,CAAC;IACnB,mBAAmB;IACnB,KAAK,EAAE,WAAW,CAAC;IACnB,4EAA4E;IAC5E,OAAO,CAAC,EAAE,QAAQ,CAAC,SAAS,CAAC,CAAC;IAC9B,4EAA4E;IAC5E,OAAO,CAAC,EAAE,QAAQ,CAAC,SAAS,CAAC,CAAC;IAC9B,4EAA4E;IAC5E,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,8EAA8E;IAC9E,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,sEAAsE;IACtE,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;;;;OAKG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,+GAA+G;IAC/G,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAKD;;;;;GAKG;AACH,qBAAa,aAAc,SAAQ,KAAK;IACtC,2CAA2C;IACpC,MAAM,EAAE,MAAM,CAAC;IACtB,iDAAiD;IAC1C,KAAK,EAAE,MAAM,CAAC;IACrB,iCAAiC;IAC1B,YAAY,EAAE,MAAM,CAAC;IAC5B,kDAAkD;IAC3C,SAAS,EAAE,MAAM,CAAC;IACzB,kDAAkD;IAC3C,SAAS,EAAE,MAAM,CAAC;IAEzB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAU;IACnC,OAAO,CAAC,WAAW,CAAa;IAChC,OAAO,CAAC,WAAW,CAAY;IAC/B,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAS;IACxC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAS;IACxC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAS;IACxC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAS;IAExC,OAAO,CAAC,IAAI,CAAK;IACjB,OAAO,CAAC,IAAI,CAAK;IACjB,OAAO,CAAC,IAAI,CAAK;IACjB,OAAO,CAAC,IAAI,CAAK;IACjB,OAAO,CAAC,GAAG,CAAK;IAChB,OAAO,CAAC,GAAG,CAAK;IAChB,OAAO,CAAC,WAAW,CAAK;IACxB,OAAO,CAAC,QAAQ,CAAK;IACrB,OAAO,CAAC,SAAS,CAAK;IACtB,OAAO,CAAC,UAAU,CAAK;IACvB,OAAO,CAAC,aAAa,CAAK;IAC1B,OAAO,CAAC,QAAQ,CAAK;gBAEF,OAAO,EAAE,oBAAoB;IAuBhC,QAAQ,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI;IAmFzB,UAAU,IAAI,IAAI;IAMlB,MAAM,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IAyB9C,OAAO,CAAC,iBAAiB;CAa1B"}
|
|
@@ -1,176 +1,164 @@
|
|
|
1
|
-
import { applyInverseTransform, applyTransform } from
|
|
2
|
-
import { Joint } from
|
|
1
|
+
import { applyInverseTransform, applyTransform } from "../math.js";
|
|
2
|
+
import { Joint } from "./Joint.js";
|
|
3
3
|
|
|
4
|
-
|
|
5
|
-
|
|
4
|
+
//#region src/joints/DistanceJoint.ts
|
|
5
|
+
/** Reused output sink - physics steps single-threaded, so a shared scratch is safe. */
|
|
6
|
+
const scratch = {
|
|
7
|
+
x: 0,
|
|
8
|
+
y: 0
|
|
9
|
+
};
|
|
6
10
|
/**
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
const applied = clamped - this._impulse;
|
|
158
|
-
this._impulse = clamped;
|
|
159
|
-
this._applyAxisImpulse(applied);
|
|
160
|
-
}
|
|
161
|
-
_applyAxisImpulse(impulse) {
|
|
162
|
-
const jx = impulse * this._nx;
|
|
163
|
-
const jy = impulse * this._ny;
|
|
164
|
-
const bodyA = this.bodyA;
|
|
165
|
-
const bodyB = this.bodyB;
|
|
166
|
-
bodyA.linearVelocityX -= bodyA.invMass * jx;
|
|
167
|
-
bodyA.linearVelocityY -= bodyA.invMass * jy;
|
|
168
|
-
bodyA.angularVelocity -= bodyA.invInertia * (this._rAx * jy - this._rAy * jx);
|
|
169
|
-
bodyB.linearVelocityX += bodyB.invMass * jx;
|
|
170
|
-
bodyB.linearVelocityY += bodyB.invMass * jy;
|
|
171
|
-
bodyB.angularVelocity += bodyB.invInertia * (this._rBx * jy - this._rBy * jx);
|
|
172
|
-
}
|
|
173
|
-
}
|
|
11
|
+
* Holds the anchor points on two bodies at a target {@link length} along their
|
|
12
|
+
* connecting axis. With `hertz === 0` it is rigid; with `hertz > 0` it behaves
|
|
13
|
+
* as a damped spring. Solved as a soft constraint in the sub-step loop, warm-
|
|
14
|
+
* started across frames.
|
|
15
|
+
*/
|
|
16
|
+
var DistanceJoint = class extends Joint {
|
|
17
|
+
/** Target distance between the anchors. */
|
|
18
|
+
length;
|
|
19
|
+
/** Soft-spring frequency in Hz (`0` = rigid). */
|
|
20
|
+
hertz;
|
|
21
|
+
/** Soft-spring damping ratio. */
|
|
22
|
+
dampingRatio;
|
|
23
|
+
/** Minimum allowed distance (rope/limit mode). */
|
|
24
|
+
minLength;
|
|
25
|
+
/** Maximum allowed distance (rope/limit mode). */
|
|
26
|
+
maxLength;
|
|
27
|
+
_limited;
|
|
28
|
+
_minImpulse = -Infinity;
|
|
29
|
+
_maxImpulse = Infinity;
|
|
30
|
+
_localAnchorAx;
|
|
31
|
+
_localAnchorAy;
|
|
32
|
+
_localAnchorBx;
|
|
33
|
+
_localAnchorBy;
|
|
34
|
+
_rAx = 0;
|
|
35
|
+
_rAy = 0;
|
|
36
|
+
_rBx = 0;
|
|
37
|
+
_rBy = 0;
|
|
38
|
+
_nx = 0;
|
|
39
|
+
_ny = 0;
|
|
40
|
+
_separation = 0;
|
|
41
|
+
_effMass = 0;
|
|
42
|
+
_biasRate = 0;
|
|
43
|
+
_massScale = 1;
|
|
44
|
+
_impulseScale = 0;
|
|
45
|
+
_impulse = 0;
|
|
46
|
+
constructor(options) {
|
|
47
|
+
super(options.bodyA, options.bodyB);
|
|
48
|
+
const ax = options.anchorA?.x ?? options.bodyA.x;
|
|
49
|
+
const ay = options.anchorA?.y ?? options.bodyA.y;
|
|
50
|
+
const bx = options.anchorB?.x ?? options.bodyB.x;
|
|
51
|
+
const by = options.anchorB?.y ?? options.bodyB.y;
|
|
52
|
+
applyInverseTransform(options.bodyA.transform, ax, ay, scratch);
|
|
53
|
+
this._localAnchorAx = scratch.x;
|
|
54
|
+
this._localAnchorAy = scratch.y;
|
|
55
|
+
applyInverseTransform(options.bodyB.transform, bx, by, scratch);
|
|
56
|
+
this._localAnchorBx = scratch.x;
|
|
57
|
+
this._localAnchorBy = scratch.y;
|
|
58
|
+
this.length = options.length ?? Math.hypot(bx - ax, by - ay);
|
|
59
|
+
this.hertz = options.hertz ?? 0;
|
|
60
|
+
this.dampingRatio = options.dampingRatio ?? 1;
|
|
61
|
+
this._limited = options.minLength !== void 0 || options.maxLength !== void 0;
|
|
62
|
+
this.minLength = options.minLength ?? (this._limited ? 0 : this.length);
|
|
63
|
+
this.maxLength = options.maxLength ?? (this._limited ? Infinity : this.length);
|
|
64
|
+
}
|
|
65
|
+
_prepare(h) {
|
|
66
|
+
const bodyA = this.bodyA;
|
|
67
|
+
const bodyB = this.bodyB;
|
|
68
|
+
this._active = this.enabled && !bodyA.isSleeping && !bodyB.isSleeping && (bodyA.invMass > 0 || bodyB.invMass > 0);
|
|
69
|
+
if (!this._active) return;
|
|
70
|
+
applyTransform(bodyA.transform, this._localAnchorAx, this._localAnchorAy, scratch);
|
|
71
|
+
const pAx = scratch.x;
|
|
72
|
+
const pAy = scratch.y;
|
|
73
|
+
applyTransform(bodyB.transform, this._localAnchorBx, this._localAnchorBy, scratch);
|
|
74
|
+
const pBx = scratch.x;
|
|
75
|
+
const pBy = scratch.y;
|
|
76
|
+
this._rAx = pAx - bodyA.worldCenterOfMassX;
|
|
77
|
+
this._rAy = pAy - bodyA.worldCenterOfMassY;
|
|
78
|
+
this._rBx = pBx - bodyB.worldCenterOfMassX;
|
|
79
|
+
this._rBy = pBy - bodyB.worldCenterOfMassY;
|
|
80
|
+
let dx = pBx - pAx;
|
|
81
|
+
let dy = pBy - pAy;
|
|
82
|
+
const len = Math.hypot(dx, dy);
|
|
83
|
+
if (len > 1e-9) {
|
|
84
|
+
dx /= len;
|
|
85
|
+
dy /= len;
|
|
86
|
+
} else {
|
|
87
|
+
dx = 1;
|
|
88
|
+
dy = 0;
|
|
89
|
+
}
|
|
90
|
+
this._nx = dx;
|
|
91
|
+
this._ny = dy;
|
|
92
|
+
const crA = this._rAx * dy - this._rAy * dx;
|
|
93
|
+
const crB = this._rBx * dy - this._rBy * dx;
|
|
94
|
+
const k = bodyA.invMass + bodyB.invMass + bodyA.invInertia * crA * crA + bodyB.invInertia * crB * crB;
|
|
95
|
+
this._effMass = k > 0 ? 1 / k : 0;
|
|
96
|
+
if (this._limited) {
|
|
97
|
+
if (len > this.maxLength) {
|
|
98
|
+
this._separation = len - this.maxLength;
|
|
99
|
+
this._minImpulse = -Infinity;
|
|
100
|
+
this._maxImpulse = 0;
|
|
101
|
+
} else if (len < this.minLength) {
|
|
102
|
+
this._separation = len - this.minLength;
|
|
103
|
+
this._minImpulse = 0;
|
|
104
|
+
this._maxImpulse = Infinity;
|
|
105
|
+
} else {
|
|
106
|
+
this._active = false;
|
|
107
|
+
this._impulse = 0;
|
|
108
|
+
return;
|
|
109
|
+
}
|
|
110
|
+
} else {
|
|
111
|
+
this._separation = len - this.length;
|
|
112
|
+
this._minImpulse = -Infinity;
|
|
113
|
+
this._maxImpulse = Infinity;
|
|
114
|
+
}
|
|
115
|
+
if (this.hertz > 0 && !this._limited) {
|
|
116
|
+
const omega = 2 * Math.PI * this.hertz;
|
|
117
|
+
const a1 = 2 * this.dampingRatio + h * omega;
|
|
118
|
+
const a2 = h * omega * a1;
|
|
119
|
+
const a3 = 1 / (1 + a2);
|
|
120
|
+
this._biasRate = omega / a1;
|
|
121
|
+
this._massScale = a2 * a3;
|
|
122
|
+
this._impulseScale = a3;
|
|
123
|
+
} else {
|
|
124
|
+
this._biasRate = .2 / h;
|
|
125
|
+
this._massScale = 1;
|
|
126
|
+
this._impulseScale = 0;
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
_warmStart() {
|
|
130
|
+
if (this._active) this._applyAxisImpulse(this._impulse);
|
|
131
|
+
}
|
|
132
|
+
_solve(useBias) {
|
|
133
|
+
if (!this._active) return;
|
|
134
|
+
const bodyA = this.bodyA;
|
|
135
|
+
const bodyB = this.bodyB;
|
|
136
|
+
const vax = bodyA.linearVelocityX - bodyA.angularVelocity * this._rAy;
|
|
137
|
+
const vay = bodyA.linearVelocityY + bodyA.angularVelocity * this._rAx;
|
|
138
|
+
const vbx = bodyB.linearVelocityX - bodyB.angularVelocity * this._rBy;
|
|
139
|
+
const vby = bodyB.linearVelocityY + bodyB.angularVelocity * this._rBx;
|
|
140
|
+
const cdot = (vbx - vax) * this._nx + (vby - vay) * this._ny;
|
|
141
|
+
const bias = useBias ? this._biasRate * this._separation : 0;
|
|
142
|
+
const raw = -this._effMass * this._massScale * (cdot + bias) - this._impulseScale * this._impulse;
|
|
143
|
+
const clamped = Math.min(this._maxImpulse, Math.max(this._minImpulse, this._impulse + raw));
|
|
144
|
+
const applied = clamped - this._impulse;
|
|
145
|
+
this._impulse = clamped;
|
|
146
|
+
this._applyAxisImpulse(applied);
|
|
147
|
+
}
|
|
148
|
+
_applyAxisImpulse(impulse) {
|
|
149
|
+
const jx = impulse * this._nx;
|
|
150
|
+
const jy = impulse * this._ny;
|
|
151
|
+
const bodyA = this.bodyA;
|
|
152
|
+
const bodyB = this.bodyB;
|
|
153
|
+
bodyA.linearVelocityX -= bodyA.invMass * jx;
|
|
154
|
+
bodyA.linearVelocityY -= bodyA.invMass * jy;
|
|
155
|
+
bodyA.angularVelocity -= bodyA.invInertia * (this._rAx * jy - this._rAy * jx);
|
|
156
|
+
bodyB.linearVelocityX += bodyB.invMass * jx;
|
|
157
|
+
bodyB.linearVelocityY += bodyB.invMass * jy;
|
|
158
|
+
bodyB.angularVelocity += bodyB.invInertia * (this._rBx * jy - this._rBy * jx);
|
|
159
|
+
}
|
|
160
|
+
};
|
|
174
161
|
|
|
162
|
+
//#endregion
|
|
175
163
|
export { DistanceJoint };
|
|
176
|
-
//# sourceMappingURL=DistanceJoint.js.map
|
|
164
|
+
//# sourceMappingURL=DistanceJoint.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DistanceJoint.js","sources":["../../../../src/joints/DistanceJoint.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"DistanceJoint.js","names":[],"sources":["../../../src/joints/DistanceJoint.ts"],"sourcesContent":["import type { PointLike } from '@codexo/exojs';\n\nimport { applyInverseTransform, applyTransform } from '../math';\nimport type { PhysicsBody } from '../PhysicsBody';\nimport { Joint } from './Joint';\n\n/** Construction options for a {@link DistanceJoint}. */\nexport interface DistanceJointOptions {\n /** First body (often a static anchor). */\n bodyA: PhysicsBody;\n /** Second body. */\n bodyB: PhysicsBody;\n /** World-space anchor on body A at creation. Default: body A's position. */\n anchorA?: Readonly<PointLike>;\n /** World-space anchor on body B at creation. Default: body B's position. */\n anchorB?: Readonly<PointLike>;\n /** Target distance between the anchors. Default: their initial distance. */\n length?: number;\n /** Soft-spring frequency in Hz; `0` (default) makes it a rigid constraint. */\n hertz?: number;\n /** Soft-spring damping ratio (used when `hertz > 0`). Default `1`. */\n dampingRatio?: number;\n /**\n * Minimum allowed distance. Specifying `minLength` and/or `maxLength` turns the\n * joint into a **rope/limit** (distance kept within `[minLength, maxLength]`,\n * slack between, rigid limits). Otherwise the joint is a rigid/soft **equality**\n * at `length`. Defaults to `0` in limit mode.\n */\n minLength?: number;\n /** Maximum allowed distance (the rope length). See {@link minLength}. Defaults to `Infinity` in limit mode. */\n maxLength?: number;\n}\n\n/** Reused output sink - physics steps single-threaded, so a shared scratch is safe. */\nconst scratch: PointLike = { x: 0, y: 0 };\n\n/**\n * Holds the anchor points on two bodies at a target {@link length} along their\n * connecting axis. With `hertz === 0` it is rigid; with `hertz > 0` it behaves\n * as a damped spring. Solved as a soft constraint in the sub-step loop, warm-\n * started across frames.\n */\nexport class DistanceJoint extends Joint {\n /** Target distance between the anchors. */\n public length: number;\n /** Soft-spring frequency in Hz (`0` = rigid). */\n public hertz: number;\n /** Soft-spring damping ratio. */\n public dampingRatio: number;\n /** Minimum allowed distance (rope/limit mode). */\n public minLength: number;\n /** Maximum allowed distance (rope/limit mode). */\n public maxLength: number;\n\n private readonly _limited: boolean;\n private _minImpulse = -Infinity;\n private _maxImpulse = Infinity;\n private readonly _localAnchorAx: number;\n private readonly _localAnchorAy: number;\n private readonly _localAnchorBx: number;\n private readonly _localAnchorBy: number;\n\n private _rAx = 0;\n private _rAy = 0;\n private _rBx = 0;\n private _rBy = 0;\n private _nx = 0;\n private _ny = 0;\n private _separation = 0;\n private _effMass = 0;\n private _biasRate = 0;\n private _massScale = 1;\n private _impulseScale = 0;\n private _impulse = 0;\n\n public constructor(options: DistanceJointOptions) {\n super(options.bodyA, options.bodyB);\n\n const ax = options.anchorA?.x ?? options.bodyA.x;\n const ay = options.anchorA?.y ?? options.bodyA.y;\n const bx = options.anchorB?.x ?? options.bodyB.x;\n const by = options.anchorB?.y ?? options.bodyB.y;\n\n applyInverseTransform(options.bodyA.transform, ax, ay, scratch);\n this._localAnchorAx = scratch.x;\n this._localAnchorAy = scratch.y;\n applyInverseTransform(options.bodyB.transform, bx, by, scratch);\n this._localAnchorBx = scratch.x;\n this._localAnchorBy = scratch.y;\n\n this.length = options.length ?? Math.hypot(bx - ax, by - ay);\n this.hertz = options.hertz ?? 0;\n this.dampingRatio = options.dampingRatio ?? 1;\n this._limited = options.minLength !== undefined || options.maxLength !== undefined;\n this.minLength = options.minLength ?? (this._limited ? 0 : this.length);\n this.maxLength = options.maxLength ?? (this._limited ? Infinity : this.length);\n }\n\n public override _prepare(h: number): void {\n const bodyA = this.bodyA;\n const bodyB = this.bodyB;\n\n this._active = this.enabled && !bodyA.isSleeping && !bodyB.isSleeping && (bodyA.invMass > 0 || bodyB.invMass > 0);\n\n if (!this._active) {\n return;\n }\n\n applyTransform(bodyA.transform, this._localAnchorAx, this._localAnchorAy, scratch);\n const pAx = scratch.x;\n const pAy = scratch.y;\n applyTransform(bodyB.transform, this._localAnchorBx, this._localAnchorBy, scratch);\n const pBx = scratch.x;\n const pBy = scratch.y;\n\n this._rAx = pAx - bodyA.worldCenterOfMassX;\n this._rAy = pAy - bodyA.worldCenterOfMassY;\n this._rBx = pBx - bodyB.worldCenterOfMassX;\n this._rBy = pBy - bodyB.worldCenterOfMassY;\n\n let dx = pBx - pAx;\n let dy = pBy - pAy;\n const len = Math.hypot(dx, dy);\n\n if (len > 1e-9) {\n dx /= len;\n dy /= len;\n } else {\n dx = 1;\n dy = 0;\n }\n\n this._nx = dx;\n this._ny = dy;\n\n const crA = this._rAx * dy - this._rAy * dx;\n const crB = this._rBx * dy - this._rBy * dx;\n const k = bodyA.invMass + bodyB.invMass + bodyA.invInertia * crA * crA + bodyB.invInertia * crB * crB;\n this._effMass = k > 0 ? 1 / k : 0;\n\n if (this._limited) {\n // Rope/limit: solve only the violated bound; slack between min and max.\n if (len > this.maxLength) {\n this._separation = len - this.maxLength;\n this._minImpulse = -Infinity; // pull together only (tension)\n this._maxImpulse = 0;\n } else if (len < this.minLength) {\n this._separation = len - this.minLength;\n this._minImpulse = 0; // push apart only (compression)\n this._maxImpulse = Infinity;\n } else {\n this._active = false; // slack — nothing to solve this frame\n this._impulse = 0;\n\n return;\n }\n } else {\n this._separation = len - this.length;\n this._minImpulse = -Infinity;\n this._maxImpulse = Infinity;\n }\n\n // Soft spring only for the equality joint; rope limits are rigid.\n if (this.hertz > 0 && !this._limited) {\n // Box2D-v3 soft factors from a damped spring at the sub-step `h`.\n const omega = 2 * Math.PI * this.hertz;\n const a1 = 2 * this.dampingRatio + h * omega;\n const a2 = h * omega * a1;\n const a3 = 1 / (1 + a2);\n\n this._biasRate = omega / a1;\n this._massScale = a2 * a3;\n this._impulseScale = a3;\n } else {\n // Rigid: full mass, Baumgarte position bias, no impulse decay.\n this._biasRate = 0.2 / h;\n this._massScale = 1;\n this._impulseScale = 0;\n }\n }\n\n public override _warmStart(): void {\n if (this._active) {\n this._applyAxisImpulse(this._impulse);\n }\n }\n\n public override _solve(useBias: boolean): void {\n if (!this._active) {\n return;\n }\n\n const bodyA = this.bodyA;\n const bodyB = this.bodyB;\n\n // Relative velocity of the anchors projected onto the axis.\n const vax = bodyA.linearVelocityX - bodyA.angularVelocity * this._rAy;\n const vay = bodyA.linearVelocityY + bodyA.angularVelocity * this._rAx;\n const vbx = bodyB.linearVelocityX - bodyB.angularVelocity * this._rBy;\n const vby = bodyB.linearVelocityY + bodyB.angularVelocity * this._rBx;\n const cdot = (vbx - vax) * this._nx + (vby - vay) * this._ny;\n\n const bias = useBias ? this._biasRate * this._separation : 0;\n const raw = -this._effMass * this._massScale * (cdot + bias) - this._impulseScale * this._impulse;\n // Clamp the accumulated impulse to the limit's sign range (±Infinity = equality, no clamp).\n const clamped = Math.min(this._maxImpulse, Math.max(this._minImpulse, this._impulse + raw));\n const applied = clamped - this._impulse;\n\n this._impulse = clamped;\n this._applyAxisImpulse(applied);\n }\n\n private _applyAxisImpulse(impulse: number): void {\n const jx = impulse * this._nx;\n const jy = impulse * this._ny;\n const bodyA = this.bodyA;\n const bodyB = this.bodyB;\n\n bodyA.linearVelocityX -= bodyA.invMass * jx;\n bodyA.linearVelocityY -= bodyA.invMass * jy;\n bodyA.angularVelocity -= bodyA.invInertia * (this._rAx * jy - this._rAy * jx);\n bodyB.linearVelocityX += bodyB.invMass * jx;\n bodyB.linearVelocityY += bodyB.invMass * jy;\n bodyB.angularVelocity += bodyB.invInertia * (this._rBx * jy - this._rBy * jx);\n }\n}\n"],"mappings":"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"}
|
|
@@ -13,13 +13,14 @@ export declare abstract class Joint {
|
|
|
13
13
|
readonly bodyB: PhysicsBody;
|
|
14
14
|
/** When `false`, the joint is skipped by the solver (but still tracked by the world). */
|
|
15
15
|
enabled: boolean;
|
|
16
|
-
/** Whether this joint solves this frame
|
|
16
|
+
/** Whether this joint solves this frame - set in {@link _prepare} (disabled, sleeping or two static bodies → `false`). */
|
|
17
17
|
protected _active: boolean;
|
|
18
18
|
protected constructor(bodyA: PhysicsBody, bodyB: PhysicsBody);
|
|
19
|
-
/** @internal
|
|
19
|
+
/** @internal - build this frame's constraint data; called once per fixed step after detection. */
|
|
20
20
|
abstract _prepare(h: number): void;
|
|
21
|
-
/** @internal
|
|
21
|
+
/** @internal - re-apply the accumulated impulse; called each sub-step (TGS-Soft warm-start). */
|
|
22
22
|
abstract _warmStart(): void;
|
|
23
|
-
/** @internal
|
|
23
|
+
/** @internal - one velocity pass; `useBias` is the soft-bias pass, `false` the relax pass. */
|
|
24
24
|
abstract _solve(useBias: boolean): void;
|
|
25
25
|
}
|
|
26
|
+
//# sourceMappingURL=Joint.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Joint.d.ts","sourceRoot":"","sources":["../../../src/joints/Joint.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAElD;;;;;;GAMG;AACH,8BAAsB,KAAK;IACzB,8BAA8B;IAC9B,SAAgB,KAAK,EAAE,WAAW,CAAC;IACnC,+BAA+B;IAC/B,SAAgB,KAAK,EAAE,WAAW,CAAC;IACnC,yFAAyF;IAClF,OAAO,UAAQ;IAEtB,0HAA0H;IAC1H,SAAS,CAAC,OAAO,UAAS;IAE1B,SAAS,aAAa,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,WAAW;IAK5D,kGAAkG;aAClF,QAAQ,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI;IACzC,gGAAgG;aAChF,UAAU,IAAI,IAAI;IAClC,8FAA8F;aAC9E,MAAM,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;CAC/C"}
|