@zephyr3d/scene 0.9.17 → 0.9.19
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/animation/joint_dynamics/collision.js +8 -6
- package/dist/animation/joint_dynamics/collision.js.map +1 -1
- package/dist/animation/morphtargetgrouptrack.js +11 -3
- package/dist/animation/morphtargetgrouptrack.js.map +1 -1
- package/dist/app/scriptregistry.js +124 -6
- package/dist/app/scriptregistry.js.map +1 -1
- package/dist/index.d.ts +270 -7
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/dist/material/mixins/lightmodel/pbrblueprintmixin.js +11 -5
- package/dist/material/mixins/lightmodel/pbrblueprintmixin.js.map +1 -1
- package/dist/material/mtoon.js +20 -2
- package/dist/material/mtoon.js.map +1 -1
- package/dist/material/shader/helper.js +21 -8
- package/dist/material/shader/helper.js.map +1 -1
- package/dist/material/skin.js +4 -6
- package/dist/material/skin.js.map +1 -1
- package/dist/material/water.js +1 -1
- package/dist/material/water.js.map +1 -1
- package/dist/posteffect/bloom.js +177 -29
- package/dist/posteffect/bloom.js.map +1 -1
- package/dist/posteffect/compositor.js +111 -204
- package/dist/posteffect/compositor.js.map +1 -1
- package/dist/posteffect/motionblur.js +3 -0
- package/dist/posteffect/motionblur.js.map +1 -1
- package/dist/posteffect/posteffect.js +79 -0
- package/dist/posteffect/posteffect.js.map +1 -1
- package/dist/posteffect/skinsss.js +10 -10
- package/dist/posteffect/skinsss.js.map +1 -1
- package/dist/posteffect/ssr.js +247 -16
- package/dist/posteffect/ssr.js.map +1 -1
- package/dist/posteffect/taa.js +121 -19
- package/dist/posteffect/taa.js.map +1 -1
- package/dist/posteffect/tonemap.js +6 -6
- package/dist/posteffect/tonemap.js.map +1 -1
- package/dist/render/abuffer_oit.js +2 -1
- package/dist/render/abuffer_oit.js.map +1 -1
- package/dist/render/envlight.js +6 -3
- package/dist/render/envlight.js.map +1 -1
- package/dist/render/hzb.js +11 -4
- package/dist/render/hzb.js.map +1 -1
- package/dist/render/lightpass.js +7 -15
- package/dist/render/lightpass.js.map +1 -1
- package/dist/render/renderer.js +4 -3
- package/dist/render/renderer.js.map +1 -1
- package/dist/render/rendergraph/blackboard.js +78 -0
- package/dist/render/rendergraph/blackboard.js.map +1 -0
- package/dist/render/rendergraph/executor.js +41 -11
- package/dist/render/rendergraph/executor.js.map +1 -1
- package/dist/render/rendergraph/forward_plus_builder.js +495 -201
- package/dist/render/rendergraph/forward_plus_builder.js.map +1 -1
- package/dist/render/rendergraph/rendergraph.js +29 -0
- package/dist/render/rendergraph/rendergraph.js.map +1 -1
- package/dist/render/rendergraph/types.js.map +1 -1
- package/dist/scene/light.js +146 -146
- package/dist/scene/light.js.map +1 -1
- package/dist/shaders/ssr.js +52 -21
- package/dist/shaders/ssr.js.map +1 -1
- package/dist/shadow/shadowmapper.js +95 -95
- package/dist/shadow/shadowmapper.js.map +1 -1
- package/dist/utility/misc.js +10 -1
- package/dist/utility/misc.js.map +1 -1
- package/dist/utility/serialization/manager.js +2 -1
- package/dist/utility/serialization/manager.js.map +1 -1
- package/dist/utility/serialization/scene/animation.js +36 -2
- package/dist/utility/serialization/scene/animation.js.map +1 -1
- package/dist/utility/serialization/scene/light.js.map +1 -1
- package/package.json +2 -2
|
@@ -170,9 +170,10 @@ function writeNearestPointsResult(out, tP, tQ, pointOnP, pointOnQ, sqrDistance,
|
|
|
170
170
|
const direction = Vector3.sub(point, center, _pushoutSphereDirection);
|
|
171
171
|
const sqrLen = direction.magnitudeSq;
|
|
172
172
|
if (sqrLen > EPSILON) {
|
|
173
|
-
const
|
|
174
|
-
|
|
175
|
-
|
|
173
|
+
const dist = Math.sqrt(sqrLen);
|
|
174
|
+
const targetDist = radius + pointRadius;
|
|
175
|
+
if (dist < targetDist) {
|
|
176
|
+
const scaled = Vector3.scale(direction, targetDist / dist, _pushoutSphereScaled);
|
|
176
177
|
Vector3.add(center, scaled, scaled);
|
|
177
178
|
return writeCollisionResult(out, true, scaled, !out);
|
|
178
179
|
}
|
|
@@ -212,10 +213,11 @@ function writeNearestPointsResult(out, tP, tQ, pointOnP, pointOnQ, sqrDistance,
|
|
|
212
213
|
const pushVec = Vector3.sub(point, posOnVec, _pushoutCapsulePushVec);
|
|
213
214
|
const sqrPushDist = pushVec.magnitudeSq;
|
|
214
215
|
if (sqrPushDist > EPSILON) {
|
|
215
|
-
const pushDist = Math.sqrt(sqrPushDist)
|
|
216
|
+
const pushDist = Math.sqrt(sqrPushDist);
|
|
216
217
|
const r = colRW.radius * lerp(1.0, colR.radiusTailScale, distOnVec / capsuleHeight);
|
|
217
|
-
|
|
218
|
-
|
|
218
|
+
const targetDist = r + ptR.pointRadius;
|
|
219
|
+
if (pushDist < targetDist) {
|
|
220
|
+
const scaled = Vector3.scale(pushVec, targetDist / pushDist, _pushoutCapsuleScaled);
|
|
219
221
|
Vector3.add(posOnVec, scaled, scaled);
|
|
220
222
|
return writeCollisionResult(out, true, scaled, !out);
|
|
221
223
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"collision.js","sources":["../../../src/animation/joint_dynamics/collision.ts"],"sourcesContent":["// Collision detection & response - direct port of SPCRJointDynamicsJob.cs Collision class\r\n\r\nimport { Vector3 } from '@zephyr3d/base';\r\nimport type { ColliderR, ColliderRW, PointR } from './types';\r\nimport { EPSILON, ColliderForce } from './types';\r\n\r\n/** @public */\r\nexport interface CollisionResult {\r\n hit: boolean;\r\n point: Vector3;\r\n}\r\n\r\n/** @public */\r\nexport interface LineCollisionResult {\r\n hit: boolean;\r\n pointOnLine: Vector3;\r\n pointOnCollider: Vector3;\r\n radius: number;\r\n}\r\n\r\n/** @public */\r\nexport interface SurfaceCheckResult {\r\n hit: boolean;\r\n intersectionPoint: Vector3;\r\n pushOut: Vector3;\r\n pointOnCollider: Vector3;\r\n radius: number;\r\n}\r\n\r\n/** @public */\r\nexport interface NearestPointsResult {\r\n tP: number;\r\n tQ: number;\r\n pointOnP: Vector3;\r\n pointOnQ: Vector3;\r\n sqrDistance: number;\r\n}\r\n\r\nconst _pushoutSphereDirection = new Vector3();\r\nconst _pushoutSphereScaled = new Vector3();\r\nconst _pushoutCapsuleVecN = new Vector3();\r\nconst _pushoutCapsuleTargetVec = new Vector3();\r\nconst _pushoutCapsuleTail = new Vector3();\r\nconst _pushoutCapsulePosOnVec = new Vector3();\r\nconst _pushoutCapsulePushVec = new Vector3();\r\nconst _pushoutCapsuleScaled = new Vector3();\r\nconst _pushInSphereDirection = new Vector3();\r\nconst _pushInSphereDirectionN = new Vector3();\r\nconst _pushInSphereScaled = new Vector3();\r\nconst _pushInCapsuleVecN = new Vector3();\r\nconst _pushInCapsuleTargetVec = new Vector3();\r\nconst _pushInCapsuleTail = new Vector3();\r\nconst _pushInCapsulePosOnVec = new Vector3();\r\nconst _pushInCapsulePullVec = new Vector3();\r\nconst _pushInCapsulePullVecN = new Vector3();\r\nconst _pushInCapsuleScaled = new Vector3();\r\nconst _collisionSphereDir = new Vector3();\r\nconst _collisionSphereDirN = new Vector3();\r\nconst _collisionSphereToCenter = new Vector3();\r\nconst _collisionSphereScaled = new Vector3();\r\nconst _collisionSphereDiff = new Vector3();\r\nconst _collisionCapsuleTail = new Vector3();\r\nconst _collisionCapsulePointDir = new Vector3();\r\nconst _collisionCapsulePtOnCol = new Vector3();\r\nconst _collisionCapsulePtOnLine = new Vector3();\r\nconst _collisionCapsuleDiff = new Vector3();\r\nconst _collisionCapsuleTempLineResult: LineCollisionResult = {\r\n hit: false,\r\n pointOnLine: new Vector3(),\r\n pointOnCollider: new Vector3(),\r\n radius: 0\r\n};\r\nconst _nearestCross0 = new Vector3();\r\nconst _nearestCross1 = new Vector3();\r\nconst _nearestN1 = new Vector3();\r\nconst _nearestN2 = new Vector3();\r\nconst _nearestPosDiff = new Vector3();\r\nconst _nearestPointOnP = new Vector3();\r\nconst _nearestPointOnQ = new Vector3();\r\nconst _nearestPointDiff = new Vector3();\r\nconst _nearestResult: NearestPointsResult = {\r\n tP: 0,\r\n tQ: 0,\r\n pointOnP: new Vector3(),\r\n pointOnQ: new Vector3(),\r\n sqrDistance: 0\r\n};\r\nconst _surfaceNoHit: SurfaceCheckResult = {\r\n hit: false,\r\n intersectionPoint: new Vector3(),\r\n pushOut: new Vector3(),\r\n pointOnCollider: new Vector3(),\r\n radius: 0\r\n};\r\nconst _surfaceTriCenter = new Vector3();\r\nconst _surfaceEdgeAB = new Vector3();\r\nconst _surfaceEdgeAC = new Vector3();\r\nconst _surfacePlaneNormal = new Vector3();\r\nconst _surfacePlaneNormalNeg = new Vector3();\r\nconst _surfaceColliderDir = new Vector3();\r\nconst _surfaceRayDir = new Vector3();\r\nconst _surfaceRayDirN = new Vector3();\r\nconst _surfaceTail = new Vector3();\r\nconst _surfaceIntersection = new Vector3();\r\nconst _surfacePushOut = new Vector3();\r\nconst _surfaceToCol = new Vector3();\r\nconst _surfaceEndVec = new Vector3();\r\nconst _surfaceColDirVec = new Vector3();\r\nconst _surfaceIntersecToEnd = new Vector3();\r\nconst _surfaceColToEnd = new Vector3();\r\nconst _surfaceColToIntersect = new Vector3();\r\nconst _surfaceEVec = new Vector3();\r\nconst _surfacePoc2 = new Vector3();\r\nconst _triangleAp = new Vector3();\r\nconst _triangleBp = new Vector3();\r\nconst _triangleCp = new Vector3();\r\nconst _triangleU = new Vector3();\r\nconst _triangleV = new Vector3();\r\nconst _triangleW = new Vector3();\r\n\r\nfunction writeCollisionResult(\r\n out: CollisionResult | undefined,\r\n hit: boolean,\r\n point: Vector3,\r\n copyPoint: boolean\r\n) {\r\n if (!out) {\r\n return { hit, point: copyPoint ? point.clone() : point };\r\n }\r\n if (!out.point) {\r\n out.point = new Vector3();\r\n }\r\n out.hit = hit;\r\n out.point.set(point);\r\n return out;\r\n}\r\n\r\nfunction writeLineCollisionResult(\r\n out: LineCollisionResult | undefined,\r\n hit: boolean,\r\n pointOnLine: Vector3,\r\n pointOnCollider: Vector3,\r\n radius: number,\r\n copyVectors: boolean\r\n) {\r\n if (!out) {\r\n return {\r\n hit,\r\n pointOnLine: copyVectors ? pointOnLine.clone() : pointOnLine,\r\n pointOnCollider: copyVectors ? pointOnCollider.clone() : pointOnCollider,\r\n radius\r\n };\r\n }\r\n if (!out.pointOnLine) {\r\n out.pointOnLine = new Vector3();\r\n }\r\n if (!out.pointOnCollider) {\r\n out.pointOnCollider = new Vector3();\r\n }\r\n out.hit = hit;\r\n out.pointOnLine.set(pointOnLine);\r\n out.pointOnCollider.set(pointOnCollider);\r\n out.radius = radius;\r\n return out;\r\n}\r\n\r\nfunction writeSurfaceCheckResult(\r\n out: SurfaceCheckResult | undefined,\r\n hit: boolean,\r\n intersectionPoint: Vector3,\r\n pushOut: Vector3,\r\n pointOnCollider: Vector3,\r\n radius: number,\r\n copyVectors: boolean\r\n) {\r\n if (!out) {\r\n return {\r\n hit,\r\n intersectionPoint: copyVectors ? intersectionPoint.clone() : intersectionPoint,\r\n pushOut: copyVectors ? pushOut.clone() : pushOut,\r\n pointOnCollider: copyVectors ? pointOnCollider.clone() : pointOnCollider,\r\n radius\r\n };\r\n }\r\n if (!out.intersectionPoint) {\r\n out.intersectionPoint = new Vector3();\r\n }\r\n if (!out.pushOut) {\r\n out.pushOut = new Vector3();\r\n }\r\n if (!out.pointOnCollider) {\r\n out.pointOnCollider = new Vector3();\r\n }\r\n out.hit = hit;\r\n out.intersectionPoint.set(intersectionPoint);\r\n out.pushOut.set(pushOut);\r\n out.pointOnCollider.set(pointOnCollider);\r\n out.radius = radius;\r\n return out;\r\n}\r\n\r\nfunction writeNearestPointsResult(\r\n out: NearestPointsResult | undefined,\r\n tP: number,\r\n tQ: number,\r\n pointOnP: Vector3,\r\n pointOnQ: Vector3,\r\n sqrDistance: number,\r\n copyVectors: boolean\r\n) {\r\n if (!out) {\r\n return {\r\n tP,\r\n tQ,\r\n pointOnP: copyVectors ? pointOnP.clone() : pointOnP,\r\n pointOnQ: copyVectors ? pointOnQ.clone() : pointOnQ,\r\n sqrDistance\r\n };\r\n }\r\n out.tP = tP;\r\n out.tQ = tQ;\r\n out.pointOnP.set(pointOnP);\r\n out.pointOnQ.set(pointOnQ);\r\n out.sqrDistance = sqrDistance;\r\n return out;\r\n}\r\n\r\n// Pushout (keep point outside collider)\r\n\r\n/**\r\n * Pushes a point out of a sphere collider.\r\n *\r\n * @public\r\n */\r\nexport function pushoutFromSphere(\r\n center: Vector3,\r\n radius: number,\r\n pointRadius: number,\r\n point: Vector3,\r\n out?: CollisionResult\r\n): CollisionResult {\r\n const direction = Vector3.sub(point, center, _pushoutSphereDirection);\r\n const sqrLen = direction.magnitudeSq;\r\n if (sqrLen > EPSILON) {\r\n const dirLen = Math.sqrt(sqrLen) - pointRadius;\r\n if (dirLen < radius) {\r\n const scaled = Vector3.scale(direction, radius / dirLen, _pushoutSphereScaled);\r\n Vector3.add(center, scaled, scaled);\r\n return writeCollisionResult(out, true, scaled, !out);\r\n }\r\n }\r\n return writeCollisionResult(out, false, point, !out);\r\n}\r\n\r\n/**\r\n * Pushes a point out of a collider.\r\n *\r\n * @public\r\n */\r\nexport function pushoutFromCollider(\r\n colR: ColliderR,\r\n colRW: ColliderRW,\r\n point: Vector3,\r\n ptR: PointR,\r\n out?: CollisionResult\r\n): CollisionResult {\r\n if (colR.height <= EPSILON) {\r\n return pushoutFromSphere(colRW.positionCurrent, colRW.radius, ptR.pointRadius, point, out);\r\n }\r\n return pushoutFromCapsule(colR, colRW, point, ptR, out);\r\n}\r\n\r\n/**\r\n * Pushes a point out of a capsule collider.\r\n *\r\n * @public\r\n */\r\nexport function pushoutFromCapsule(\r\n colR: ColliderR,\r\n colRW: ColliderRW,\r\n point: Vector3,\r\n ptR: PointR,\r\n out?: CollisionResult\r\n): CollisionResult {\r\n const capsuleVec = colRW.directionCurrent;\r\n const capsuleHeight = colRW.height > EPSILON ? colRW.height : capsuleVec.magnitude;\r\n const capsuleVecN = Vector3.normalize(capsuleVec, _pushoutCapsuleVecN);\r\n const capsulePos = colRW.positionCurrent;\r\n const targetVec = Vector3.sub(point, capsulePos, _pushoutCapsuleTargetVec);\r\n const distOnVec = Vector3.dot(capsuleVecN, targetVec);\r\n\r\n if (distOnVec <= EPSILON) {\r\n return pushoutFromSphere(capsulePos, colRW.radius, ptR.pointRadius, point, out);\r\n }\r\n if (distOnVec >= capsuleHeight) {\r\n const tail = Vector3.add(capsulePos, capsuleVec, _pushoutCapsuleTail);\r\n return pushoutFromSphere(tail, colRW.radius * colR.radiusTailScale, ptR.pointRadius, point, out);\r\n }\r\n\r\n const posOnVec = Vector3.scale(capsuleVecN, distOnVec, _pushoutCapsulePosOnVec);\r\n Vector3.add(capsulePos, posOnVec, posOnVec);\r\n const pushVec = Vector3.sub(point, posOnVec, _pushoutCapsulePushVec);\r\n const sqrPushDist = pushVec.magnitudeSq;\r\n if (sqrPushDist > EPSILON) {\r\n const pushDist = Math.sqrt(sqrPushDist) - ptR.pointRadius;\r\n const r = colRW.radius * lerp(1.0, colR.radiusTailScale, distOnVec / capsuleHeight);\r\n if (pushDist < r) {\r\n const scaled = Vector3.scale(pushVec, r / pushDist, _pushoutCapsuleScaled);\r\n Vector3.add(posOnVec, scaled, scaled);\r\n return writeCollisionResult(out, true, scaled, !out);\r\n }\r\n }\r\n return writeCollisionResult(out, false, point, !out);\r\n}\r\n\r\n// PushIn (keep point inside collider - inverse mode)\r\n\r\n/**\r\n * Pulls a point inside a sphere collider.\r\n *\r\n * @public\r\n */\r\nexport function pushInFromSphere(\r\n center: Vector3,\r\n radius: number,\r\n point: Vector3,\r\n out?: CollisionResult\r\n): CollisionResult {\r\n const direction = Vector3.sub(center, point, _pushInSphereDirection);\r\n const sqrLen = direction.magnitudeSq;\r\n if (sqrLen > EPSILON && sqrLen > radius * radius) {\r\n const dirLen = Math.sqrt(sqrLen);\r\n const directionN = Vector3.normalize(direction, _pushInSphereDirectionN);\r\n const scaled = Vector3.scale(directionN, dirLen - radius, _pushInSphereScaled);\r\n Vector3.add(point, scaled, scaled);\r\n return writeCollisionResult(out, true, scaled, !out);\r\n }\r\n return writeCollisionResult(out, false, point, !out);\r\n}\r\n\r\n/**\r\n * Pulls a point inside a collider.\r\n *\r\n * @public\r\n */\r\nexport function pushInFromCollider(\r\n colR: ColliderR,\r\n colRW: ColliderRW,\r\n point: Vector3,\r\n out?: CollisionResult\r\n): CollisionResult {\r\n if (colR.height <= EPSILON) {\r\n return pushInFromSphere(colRW.positionCurrent, colRW.radius, point, out);\r\n }\r\n return pushInFromCapsule(colR, colRW, point, out);\r\n}\r\n\r\n/**\r\n * Pulls a point inside a capsule collider.\r\n *\r\n * @public\r\n */\r\nexport function pushInFromCapsule(\r\n colR: ColliderR,\r\n colRW: ColliderRW,\r\n point: Vector3,\r\n out?: CollisionResult\r\n): CollisionResult {\r\n const capsuleVec = colRW.directionCurrent;\r\n const capsuleHeight = colRW.height > EPSILON ? colRW.height : capsuleVec.magnitude;\r\n const capsuleVecN = Vector3.normalize(capsuleVec, _pushInCapsuleVecN);\r\n const capsulePos = colRW.positionCurrent;\r\n const targetVec = Vector3.sub(point, capsulePos, _pushInCapsuleTargetVec);\r\n const distOnVec = Vector3.dot(capsuleVecN, targetVec);\r\n\r\n if (distOnVec <= EPSILON) {\r\n return pushInFromSphere(capsulePos, colRW.radius, point, out);\r\n }\r\n if (distOnVec >= capsuleHeight) {\r\n const tail = Vector3.add(capsulePos, capsuleVec, _pushInCapsuleTail);\r\n return pushInFromSphere(tail, colRW.radius * colR.radiusTailScale, point, out);\r\n }\r\n\r\n const posOnVec = Vector3.scale(capsuleVecN, distOnVec, _pushInCapsulePosOnVec);\r\n Vector3.add(capsulePos, posOnVec, posOnVec);\r\n const pullVec = Vector3.sub(posOnVec, point, _pushInCapsulePullVec);\r\n const sqrPullDist = pullVec.magnitudeSq;\r\n if (sqrPullDist > EPSILON) {\r\n const r = colRW.radius * lerp(1.0, colR.radiusTailScale, distOnVec / capsuleHeight);\r\n if (sqrPullDist > r * r) {\r\n const pullDist = Math.sqrt(sqrPullDist);\r\n const pullVecN = Vector3.normalize(pullVec, _pushInCapsulePullVecN);\r\n const scaled = Vector3.scale(pullVecN, pullDist - r, _pushInCapsuleScaled);\r\n Vector3.add(point, scaled, scaled);\r\n return writeCollisionResult(out, true, scaled, !out);\r\n }\r\n }\r\n return writeCollisionResult(out, false, point, !out);\r\n}\r\n\r\n// Line segment vs collider detection\r\n\r\n/**\r\n * Performs sphere collision detection.\r\n *\r\n * @public\r\n */\r\nexport function collisionDetectionSphere(\r\n center: Vector3,\r\n radius: number,\r\n point1: Vector3,\r\n point2: Vector3,\r\n out?: LineCollisionResult\r\n): LineCollisionResult {\r\n const dir = Vector3.sub(point2, point1, _collisionSphereDir);\r\n const dirLen = dir.magnitude;\r\n if (dirLen < EPSILON) {\r\n return writeLineCollisionResult(out, false, point1, center, radius, !out);\r\n }\r\n const dirN = Vector3.scale(dir, 1 / dirLen, _collisionSphereDirN);\r\n const toCenter = Vector3.sub(center, point1, _collisionSphereToCenter);\r\n const dot = Vector3.dot(dirN, toCenter);\r\n const clamped = Math.max(0, Math.min(dot, dirLen));\r\n const ptOnLine = Vector3.scale(dirN, clamped, _collisionSphereScaled);\r\n Vector3.add(point1, ptOnLine, ptOnLine);\r\n const diff = Vector3.sub(center, ptOnLine, _collisionSphereDiff);\r\n const hit = diff.magnitudeSq <= radius * radius;\r\n return writeLineCollisionResult(out, hit, ptOnLine, center, radius, !out);\r\n}\r\n\r\n/**\r\n * Performs capsule collision detection.\r\n *\r\n * @public\r\n */\r\nexport function collisionDetectionCapsule(\r\n colR: ColliderR,\r\n colRW: ColliderRW,\r\n point1: Vector3,\r\n point2: Vector3,\r\n out?: LineCollisionResult\r\n): LineCollisionResult {\r\n const capsuleDir = colRW.directionCurrent;\r\n const capsulePos = colRW.positionCurrent;\r\n\r\n let res = collisionDetectionSphere(capsulePos, colRW.radius, point1, point2, out);\r\n if (res.hit) {\r\n return res;\r\n }\r\n\r\n const tail = Vector3.add(capsulePos, capsuleDir, _collisionCapsuleTail);\r\n res = collisionDetectionSphere(\r\n tail,\r\n colRW.radius * colR.radiusTailScale,\r\n point1,\r\n point2,\r\n _collisionCapsuleTempLineResult\r\n );\r\n if (res.hit) {\r\n return writeLineCollisionResult(out, true, res.pointOnLine, res.pointOnCollider, res.radius, !out);\r\n }\r\n\r\n const pointDir = Vector3.sub(point2, point1, _collisionCapsulePointDir);\r\n const nearest = computeNearestPoints(capsulePos, capsuleDir, point1, pointDir, _nearestResult);\r\n const t1 = Math.max(0, Math.min(1, nearest.tP));\r\n const r = colRW.radius * lerp(1.0, colR.radiusTailScale, t1);\r\n\r\n if (nearest.sqrDistance > r * r) {\r\n return writeLineCollisionResult(out, false, point1, capsulePos, r, !out);\r\n }\r\n\r\n const t2 = Math.max(0, Math.min(1, nearest.tQ));\r\n const ptOnCol = Vector3.scale(capsuleDir, t1, _collisionCapsulePtOnCol);\r\n Vector3.add(capsulePos, ptOnCol, ptOnCol);\r\n const ptOnLine = Vector3.scale(pointDir, t2, _collisionCapsulePtOnLine);\r\n Vector3.add(point1, ptOnLine, ptOnLine);\r\n const diff = Vector3.sub(ptOnCol, ptOnLine, _collisionCapsuleDiff);\r\n const hit = diff.magnitudeSq <= r * r;\r\n return writeLineCollisionResult(out, hit, ptOnLine, ptOnCol, r, !out);\r\n}\r\n\r\n/**\r\n * Performs collision detection against the specified collider.\r\n *\r\n * @public\r\n */\r\nexport function collisionDetection(\r\n colR: ColliderR,\r\n colRW: ColliderRW,\r\n point1: Vector3,\r\n point2: Vector3,\r\n out?: LineCollisionResult\r\n): LineCollisionResult {\r\n if (colR.height <= EPSILON) {\r\n return collisionDetectionSphere(colRW.positionCurrent, colRW.radius, point1, point2, out);\r\n }\r\n return collisionDetectionCapsule(colR, colRW, point1, point2, out);\r\n}\r\n\r\n/**\r\n * Performs inward collision detection.\r\n *\r\n * @public\r\n */\r\nexport function pushInCollisionDetection(\r\n colR: ColliderR,\r\n colRW: ColliderRW,\r\n point1: Vector3,\r\n point2: Vector3,\r\n out?: LineCollisionResult\r\n): LineCollisionResult {\r\n if (colR.height <= EPSILON) {\r\n return collisionDetectionSphere(colRW.positionCurrent, colRW.radius, point1, point2, out);\r\n }\r\n const res = collisionDetectionCapsule(colR, colRW, point1, point2, out);\r\n res.hit = false;\r\n return res;\r\n}\r\n\r\n// Nearest points between two line segments\r\n\r\n/**\r\n * Computes the nearest points between two segments.\r\n *\r\n * @public\r\n */\r\nexport function computeNearestPoints(\r\n posP: Vector3,\r\n dirP: Vector3,\r\n posQ: Vector3,\r\n dirQ: Vector3,\r\n out?: NearestPointsResult\r\n): {\r\n tP: number;\r\n tQ: number;\r\n pointOnP: Vector3;\r\n pointOnQ: Vector3;\r\n sqrDistance: number;\r\n} {\r\n const cross0 = Vector3.cross(dirQ, dirP, _nearestCross0);\r\n const n1 = Vector3.cross(dirP, cross0, _nearestN1);\r\n const cross1 = Vector3.cross(dirP, dirQ, _nearestCross1);\r\n const n2 = Vector3.cross(dirQ, cross1, _nearestN2);\r\n const dP_n2 = Vector3.dot(dirP, n2);\r\n const dQ_n1 = Vector3.dot(dirQ, n1);\r\n const posDiff = Vector3.sub(posQ, posP, _nearestPosDiff);\r\n const tP = dP_n2 !== 0 ? Vector3.dot(posDiff, n2) / dP_n2 : 0;\r\n const tQ = dQ_n1 !== 0 ? Vector3.dot(Vector3.scale(posDiff, -1, posDiff), n1) / dQ_n1 : 0;\r\n const pointOnP = Vector3.scale(dirP, tP, _nearestPointOnP);\r\n Vector3.add(posP, pointOnP, pointOnP);\r\n const pointOnQ = Vector3.scale(dirQ, tQ, _nearestPointOnQ);\r\n Vector3.add(posQ, pointOnQ, pointOnQ);\r\n const diff = Vector3.sub(pointOnQ, pointOnP, _nearestPointDiff);\r\n return writeNearestPointsResult(out, tP, tQ, pointOnP, pointOnQ, diff.magnitudeSq, !out);\r\n}\r\n\r\n// Surface collision (triangle-based)\r\n\r\n/**\r\n * Checks triangle-surface collision against a collider.\r\n *\r\n * @public\r\n */\r\nexport function checkSurfaceCollision(\r\n ptA: Vector3,\r\n ptB: Vector3,\r\n ptC: Vector3,\r\n colliderPos: Vector3,\r\n colR: ColliderR,\r\n colRW: ColliderRW,\r\n out?: SurfaceCheckResult\r\n): SurfaceCheckResult {\r\n _surfaceNoHit.hit = false;\r\n _surfaceNoHit.intersectionPoint.setXYZ(0, 0, 0);\r\n _surfaceNoHit.pushOut.setXYZ(0, 0, 0);\r\n _surfaceNoHit.pointOnCollider.set(colliderPos);\r\n _surfaceNoHit.radius = colRW.radius;\r\n\r\n let pointOnCollider = colliderPos;\r\n let radius = colRW.radius;\r\n const isCapsule = colR.height > EPSILON;\r\n\r\n const triCenter = centerOfTriangle(ptA, ptB, ptC, _surfaceTriCenter);\r\n const edgeAB = Vector3.sub(ptB, ptA, _surfaceEdgeAB);\r\n const edgeAC = Vector3.sub(ptC, ptA, _surfaceEdgeAC);\r\n const planeNormal = Vector3.cross(edgeAB, edgeAC, _surfacePlaneNormal);\r\n Vector3.normalize(planeNormal, planeNormal);\r\n Vector3.scale(planeNormal, -1, planeNormal);\r\n const planeNormalNeg = Vector3.scale(planeNormal, -1, _surfacePlaneNormalNeg);\r\n const planeDist = -Vector3.dot(planeNormalNeg, ptA);\r\n const colliderDir = Vector3.sub(colliderPos, triCenter, _surfaceColliderDir);\r\n Vector3.normalize(colliderDir, colliderDir);\r\n const dot = Vector3.dot(colliderDir, planeNormal);\r\n\r\n if (isCapsule) {\r\n const side = Vector3.dot(colRW.directionCurrent, planeNormal) * dot;\r\n const rayDir = Vector3.scale(planeNormal, dot * -1, _surfaceRayDir);\r\n const tempPOC = pointOnCollider;\r\n\r\n if (side < 0) {\r\n radius = colRW.radius * colR.radiusTailScale;\r\n pointOnCollider = Vector3.add(colliderPos, colRW.directionCurrent, _surfaceTail);\r\n }\r\n\r\n const rayDirN = Vector3.normalize(rayDir, _surfaceRayDirN);\r\n const enter = raycast(planeNormalNeg, planeDist, pointOnCollider, rayDirN);\r\n if (enter !== null) {\r\n const ip = Vector3.scale(rayDirN, enter, _surfaceIntersection);\r\n Vector3.add(pointOnCollider, ip, ip);\r\n if (triangleContainsPoint(ptA, ptB, ptC, ip)) {\r\n const pushOut = Vector3.sub(ip, pointOnCollider, _surfacePushOut);\r\n const toCol = Vector3.sub(pointOnCollider, ip, _surfaceToCol);\r\n if (toCol.magnitudeSq <= radius * radius) {\r\n return writeSurfaceCheckResult(out, true, ip, pushOut, pointOnCollider, radius, !out);\r\n }\r\n }\r\n } else if (colR.forceType !== ColliderForce.Off) {\r\n pointOnCollider = tempPOC;\r\n let endVec = Vector3.add(colliderPos, colRW.directionCurrent, _surfaceEndVec);\r\n _surfaceColDirVec.set(colRW.directionCurrent);\r\n let colDirVec = _surfaceColDirVec;\r\n if (colR.forceType === ColliderForce.Pull) {\r\n const tmp = pointOnCollider;\r\n pointOnCollider = endVec;\r\n endVec = tmp;\r\n colDirVec = Vector3.scale(colDirVec, -1, colDirVec);\r\n }\r\n const enter2 = raycast(planeNormalNeg, planeDist, pointOnCollider, colDirVec);\r\n if (enter2 !== null) {\r\n const ip = Vector3.scale(colDirVec, enter2, _surfaceIntersection);\r\n Vector3.add(pointOnCollider, ip, ip);\r\n if (triangleContainsPoint(ptA, ptB, ptC, ip)) {\r\n const intersecToEnd = Vector3.sub(endVec, ip, _surfaceIntersecToEnd);\r\n const colToEnd = Vector3.sub(endVec, pointOnCollider, _surfaceColToEnd);\r\n const colToIntersect = Vector3.sub(ip, pointOnCollider, _surfaceColToIntersect);\r\n const pDot = Vector3.dot(intersecToEnd, colToIntersect);\r\n const lDot = Vector3.dot(colToEnd, colToEnd);\r\n if (!(pDot >= 0 && pDot <= lDot)) {\r\n return writeSurfaceCheckResult(\r\n out,\r\n _surfaceNoHit.hit,\r\n _surfaceNoHit.intersectionPoint,\r\n _surfaceNoHit.pushOut,\r\n _surfaceNoHit.pointOnCollider,\r\n _surfaceNoHit.radius,\r\n !out\r\n );\r\n }\r\n const dotVal = Vector3.dot(colToEnd, colToIntersect);\r\n const s2eMag = Vector3.dot(colToEnd, colToEnd);\r\n const colToEndN = Vector3.normalize(colToEnd, colToEnd);\r\n const eVec = Vector3.scale(colToEndN, -radius, _surfaceEVec);\r\n Vector3.add(pointOnCollider, eVec, eVec);\r\n const pushOut = Vector3.sub(ip, eVec, _surfacePushOut);\r\n const poc2 = Vector3.scale(colToEnd, dotVal / s2eMag, _surfacePoc2);\r\n Vector3.add(pointOnCollider, poc2, poc2);\r\n const toCol = Vector3.sub(poc2, ip, _surfaceToCol);\r\n if (toCol.magnitudeSq <= radius * radius) {\r\n return writeSurfaceCheckResult(out, true, ip, pushOut, poc2, radius, !out);\r\n }\r\n }\r\n }\r\n }\r\n } else {\r\n const rayDir = Vector3.scale(planeNormal, dot * -1, _surfaceRayDir);\r\n const rayDirN = Vector3.normalize(rayDir, _surfaceRayDirN);\r\n const enter = raycast(planeNormalNeg, planeDist, pointOnCollider, rayDirN);\r\n if (enter !== null) {\r\n const ip = Vector3.scale(rayDirN, enter, _surfaceIntersection);\r\n Vector3.add(pointOnCollider, ip, ip);\r\n if (triangleContainsPoint(ptA, ptB, ptC, ip)) {\r\n const pushOut = Vector3.sub(ip, pointOnCollider, _surfacePushOut);\r\n const toCol = Vector3.sub(pointOnCollider, ip, _surfaceToCol);\r\n if (toCol.magnitudeSq <= radius * radius) {\r\n return writeSurfaceCheckResult(out, true, ip, pushOut, pointOnCollider, radius, !out);\r\n }\r\n }\r\n }\r\n }\r\n\r\n return writeSurfaceCheckResult(\r\n out,\r\n _surfaceNoHit.hit,\r\n _surfaceNoHit.intersectionPoint,\r\n _surfaceNoHit.pushOut,\r\n _surfaceNoHit.pointOnCollider,\r\n _surfaceNoHit.radius,\r\n !out\r\n );\r\n}\r\n\r\n// Helpers\r\n\r\nfunction raycast(normal: Vector3, planeDist: number, origin: Vector3, direction: Vector3): number | null {\r\n const vdot = Vector3.dot(direction, normal);\r\n const ndot = -Vector3.dot(origin, normal) - planeDist;\r\n if (Math.abs(vdot) <= EPSILON) {\r\n return null;\r\n }\r\n const enter = ndot / vdot;\r\n return enter > 0 ? enter : null;\r\n}\r\n\r\nfunction centerOfTriangle(a: Vector3, b: Vector3, c: Vector3, result?: Vector3): Vector3 {\r\n result = result || new Vector3();\r\n return result.setXYZ((a.x + b.x + c.x) / 3, (a.y + b.y + c.y) / 3, (a.z + b.z + c.z) / 3);\r\n}\r\n\r\nfunction triangleContainsPoint(a: Vector3, b: Vector3, c: Vector3, p: Vector3): boolean {\r\n const ap = Vector3.sub(a, p, _triangleAp);\r\n const bp = Vector3.sub(b, p, _triangleBp);\r\n const cp = Vector3.sub(c, p, _triangleCp);\r\n const u = Vector3.cross(ap, bp, _triangleU);\r\n const vv = Vector3.cross(bp, cp, _triangleV);\r\n const w = Vector3.cross(cp, ap, _triangleW);\r\n if (Vector3.dot(u, vv) < 0) {\r\n return false;\r\n }\r\n if (Vector3.dot(vv, w) < 0) {\r\n return false;\r\n }\r\n return true;\r\n}\r\n\r\nfunction lerp(a: number, b: number, t: number): number {\r\n return a + (b - a) * t;\r\n}\r\n"],"names":["_pushoutSphereDirection","Vector3","_pushoutSphereScaled","_pushoutCapsuleVecN","_pushoutCapsuleTargetVec","_pushoutCapsuleTail","_pushoutCapsulePosOnVec","_pushoutCapsulePushVec","_pushoutCapsuleScaled","_pushInSphereDirection","_pushInSphereDirectionN","_pushInSphereScaled","_pushInCapsuleVecN","_pushInCapsuleTargetVec","_pushInCapsuleTail","_pushInCapsulePosOnVec","_pushInCapsulePullVec","_pushInCapsulePullVecN","_pushInCapsuleScaled","_collisionSphereDir","_collisionSphereDirN","_collisionSphereToCenter","_collisionSphereScaled","_collisionSphereDiff","_collisionCapsuleTail","_collisionCapsulePointDir","_collisionCapsulePtOnCol","_collisionCapsulePtOnLine","_collisionCapsuleDiff","_collisionCapsuleTempLineResult","hit","pointOnLine","pointOnCollider","radius","_nearestCross0","_nearestCross1","_nearestN1","_nearestN2","_nearestPosDiff","_nearestPointOnP","_nearestPointOnQ","_nearestPointDiff","_nearestResult","tP","tQ","pointOnP","pointOnQ","sqrDistance","_surfaceNoHit","intersectionPoint","pushOut","_surfaceTriCenter","_surfaceEdgeAB","_surfaceEdgeAC","_surfacePlaneNormal","_surfacePlaneNormalNeg","_surfaceColliderDir","_surfaceRayDir","_surfaceRayDirN","_surfaceTail","_surfaceIntersection","_surfacePushOut","_surfaceToCol","_surfaceEndVec","_surfaceColDirVec","_surfaceIntersecToEnd","_surfaceColToEnd","_surfaceColToIntersect","_surfaceEVec","_surfacePoc2","_triangleAp","_triangleBp","_triangleCp","_triangleU","_triangleV","_triangleW","writeCollisionResult","out","point","copyPoint","clone","set","writeLineCollisionResult","copyVectors","writeSurfaceCheckResult","writeNearestPointsResult","pushoutFromSphere","center","pointRadius","direction","sub","sqrLen","magnitudeSq","EPSILON","dirLen","Math","sqrt","scaled","scale","add","pushoutFromCollider","colR","colRW","ptR","height","positionCurrent","pushoutFromCapsule","capsuleVec","directionCurrent","capsuleHeight","magnitude","capsuleVecN","normalize","capsulePos","targetVec","distOnVec","dot","tail","radiusTailScale","posOnVec","pushVec","sqrPushDist","pushDist","r","lerp","pushInFromSphere","directionN","pushInFromCollider","pushInFromCapsule","pullVec","sqrPullDist","pullDist","pullVecN","collisionDetectionSphere","point1","point2","dir","dirN","toCenter","clamped","max","min","ptOnLine","diff","collisionDetectionCapsule","capsuleDir","res","pointDir","nearest","computeNearestPoints","t1","t2","ptOnCol","collisionDetection","pushInCollisionDetection","posP","dirP","posQ","dirQ","cross0","cross","n1","cross1","n2","dP_n2","dQ_n1","posDiff","checkSurfaceCollision","ptA","ptB","ptC","colliderPos","setXYZ","isCapsule","triCenter","centerOfTriangle","edgeAB","edgeAC","planeNormal","planeNormalNeg","planeDist","colliderDir","side","rayDir","tempPOC","rayDirN","enter","raycast","ip","triangleContainsPoint","toCol","forceType","ColliderForce","Off","endVec","colDirVec","Pull","tmp","enter2","intersecToEnd","colToEnd","colToIntersect","pDot","lDot","dotVal","s2eMag","colToEndN","eVec","poc2","normal","origin","vdot","ndot","abs","a","b","c","result","x","y","z","p","ap","bp","cp","u","vv","w","t"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"collision.js","sources":["../../../src/animation/joint_dynamics/collision.ts"],"sourcesContent":["// Collision detection & response - direct port of SPCRJointDynamicsJob.cs Collision class\r\n\r\nimport { Vector3 } from '@zephyr3d/base';\r\nimport type { ColliderR, ColliderRW, PointR } from './types';\r\nimport { EPSILON, ColliderForce } from './types';\r\n\r\n/** @public */\r\nexport interface CollisionResult {\r\n hit: boolean;\r\n point: Vector3;\r\n}\r\n\r\n/** @public */\r\nexport interface LineCollisionResult {\r\n hit: boolean;\r\n pointOnLine: Vector3;\r\n pointOnCollider: Vector3;\r\n radius: number;\r\n}\r\n\r\n/** @public */\r\nexport interface SurfaceCheckResult {\r\n hit: boolean;\r\n intersectionPoint: Vector3;\r\n pushOut: Vector3;\r\n pointOnCollider: Vector3;\r\n radius: number;\r\n}\r\n\r\n/** @public */\r\nexport interface NearestPointsResult {\r\n tP: number;\r\n tQ: number;\r\n pointOnP: Vector3;\r\n pointOnQ: Vector3;\r\n sqrDistance: number;\r\n}\r\n\r\nconst _pushoutSphereDirection = new Vector3();\r\nconst _pushoutSphereScaled = new Vector3();\r\nconst _pushoutCapsuleVecN = new Vector3();\r\nconst _pushoutCapsuleTargetVec = new Vector3();\r\nconst _pushoutCapsuleTail = new Vector3();\r\nconst _pushoutCapsulePosOnVec = new Vector3();\r\nconst _pushoutCapsulePushVec = new Vector3();\r\nconst _pushoutCapsuleScaled = new Vector3();\r\nconst _pushInSphereDirection = new Vector3();\r\nconst _pushInSphereDirectionN = new Vector3();\r\nconst _pushInSphereScaled = new Vector3();\r\nconst _pushInCapsuleVecN = new Vector3();\r\nconst _pushInCapsuleTargetVec = new Vector3();\r\nconst _pushInCapsuleTail = new Vector3();\r\nconst _pushInCapsulePosOnVec = new Vector3();\r\nconst _pushInCapsulePullVec = new Vector3();\r\nconst _pushInCapsulePullVecN = new Vector3();\r\nconst _pushInCapsuleScaled = new Vector3();\r\nconst _collisionSphereDir = new Vector3();\r\nconst _collisionSphereDirN = new Vector3();\r\nconst _collisionSphereToCenter = new Vector3();\r\nconst _collisionSphereScaled = new Vector3();\r\nconst _collisionSphereDiff = new Vector3();\r\nconst _collisionCapsuleTail = new Vector3();\r\nconst _collisionCapsulePointDir = new Vector3();\r\nconst _collisionCapsulePtOnCol = new Vector3();\r\nconst _collisionCapsulePtOnLine = new Vector3();\r\nconst _collisionCapsuleDiff = new Vector3();\r\nconst _collisionCapsuleTempLineResult: LineCollisionResult = {\r\n hit: false,\r\n pointOnLine: new Vector3(),\r\n pointOnCollider: new Vector3(),\r\n radius: 0\r\n};\r\nconst _nearestCross0 = new Vector3();\r\nconst _nearestCross1 = new Vector3();\r\nconst _nearestN1 = new Vector3();\r\nconst _nearestN2 = new Vector3();\r\nconst _nearestPosDiff = new Vector3();\r\nconst _nearestPointOnP = new Vector3();\r\nconst _nearestPointOnQ = new Vector3();\r\nconst _nearestPointDiff = new Vector3();\r\nconst _nearestResult: NearestPointsResult = {\r\n tP: 0,\r\n tQ: 0,\r\n pointOnP: new Vector3(),\r\n pointOnQ: new Vector3(),\r\n sqrDistance: 0\r\n};\r\nconst _surfaceNoHit: SurfaceCheckResult = {\r\n hit: false,\r\n intersectionPoint: new Vector3(),\r\n pushOut: new Vector3(),\r\n pointOnCollider: new Vector3(),\r\n radius: 0\r\n};\r\nconst _surfaceTriCenter = new Vector3();\r\nconst _surfaceEdgeAB = new Vector3();\r\nconst _surfaceEdgeAC = new Vector3();\r\nconst _surfacePlaneNormal = new Vector3();\r\nconst _surfacePlaneNormalNeg = new Vector3();\r\nconst _surfaceColliderDir = new Vector3();\r\nconst _surfaceRayDir = new Vector3();\r\nconst _surfaceRayDirN = new Vector3();\r\nconst _surfaceTail = new Vector3();\r\nconst _surfaceIntersection = new Vector3();\r\nconst _surfacePushOut = new Vector3();\r\nconst _surfaceToCol = new Vector3();\r\nconst _surfaceEndVec = new Vector3();\r\nconst _surfaceColDirVec = new Vector3();\r\nconst _surfaceIntersecToEnd = new Vector3();\r\nconst _surfaceColToEnd = new Vector3();\r\nconst _surfaceColToIntersect = new Vector3();\r\nconst _surfaceEVec = new Vector3();\r\nconst _surfacePoc2 = new Vector3();\r\nconst _triangleAp = new Vector3();\r\nconst _triangleBp = new Vector3();\r\nconst _triangleCp = new Vector3();\r\nconst _triangleU = new Vector3();\r\nconst _triangleV = new Vector3();\r\nconst _triangleW = new Vector3();\r\n\r\nfunction writeCollisionResult(\r\n out: CollisionResult | undefined,\r\n hit: boolean,\r\n point: Vector3,\r\n copyPoint: boolean\r\n) {\r\n if (!out) {\r\n return { hit, point: copyPoint ? point.clone() : point };\r\n }\r\n if (!out.point) {\r\n out.point = new Vector3();\r\n }\r\n out.hit = hit;\r\n out.point.set(point);\r\n return out;\r\n}\r\n\r\nfunction writeLineCollisionResult(\r\n out: LineCollisionResult | undefined,\r\n hit: boolean,\r\n pointOnLine: Vector3,\r\n pointOnCollider: Vector3,\r\n radius: number,\r\n copyVectors: boolean\r\n) {\r\n if (!out) {\r\n return {\r\n hit,\r\n pointOnLine: copyVectors ? pointOnLine.clone() : pointOnLine,\r\n pointOnCollider: copyVectors ? pointOnCollider.clone() : pointOnCollider,\r\n radius\r\n };\r\n }\r\n if (!out.pointOnLine) {\r\n out.pointOnLine = new Vector3();\r\n }\r\n if (!out.pointOnCollider) {\r\n out.pointOnCollider = new Vector3();\r\n }\r\n out.hit = hit;\r\n out.pointOnLine.set(pointOnLine);\r\n out.pointOnCollider.set(pointOnCollider);\r\n out.radius = radius;\r\n return out;\r\n}\r\n\r\nfunction writeSurfaceCheckResult(\r\n out: SurfaceCheckResult | undefined,\r\n hit: boolean,\r\n intersectionPoint: Vector3,\r\n pushOut: Vector3,\r\n pointOnCollider: Vector3,\r\n radius: number,\r\n copyVectors: boolean\r\n) {\r\n if (!out) {\r\n return {\r\n hit,\r\n intersectionPoint: copyVectors ? intersectionPoint.clone() : intersectionPoint,\r\n pushOut: copyVectors ? pushOut.clone() : pushOut,\r\n pointOnCollider: copyVectors ? pointOnCollider.clone() : pointOnCollider,\r\n radius\r\n };\r\n }\r\n if (!out.intersectionPoint) {\r\n out.intersectionPoint = new Vector3();\r\n }\r\n if (!out.pushOut) {\r\n out.pushOut = new Vector3();\r\n }\r\n if (!out.pointOnCollider) {\r\n out.pointOnCollider = new Vector3();\r\n }\r\n out.hit = hit;\r\n out.intersectionPoint.set(intersectionPoint);\r\n out.pushOut.set(pushOut);\r\n out.pointOnCollider.set(pointOnCollider);\r\n out.radius = radius;\r\n return out;\r\n}\r\n\r\nfunction writeNearestPointsResult(\r\n out: NearestPointsResult | undefined,\r\n tP: number,\r\n tQ: number,\r\n pointOnP: Vector3,\r\n pointOnQ: Vector3,\r\n sqrDistance: number,\r\n copyVectors: boolean\r\n) {\r\n if (!out) {\r\n return {\r\n tP,\r\n tQ,\r\n pointOnP: copyVectors ? pointOnP.clone() : pointOnP,\r\n pointOnQ: copyVectors ? pointOnQ.clone() : pointOnQ,\r\n sqrDistance\r\n };\r\n }\r\n out.tP = tP;\r\n out.tQ = tQ;\r\n out.pointOnP.set(pointOnP);\r\n out.pointOnQ.set(pointOnQ);\r\n out.sqrDistance = sqrDistance;\r\n return out;\r\n}\r\n\r\n// Pushout (keep point outside collider)\r\n\r\n/**\r\n * Pushes a point out of a sphere collider.\r\n *\r\n * @public\r\n */\r\nexport function pushoutFromSphere(\r\n center: Vector3,\r\n radius: number,\r\n pointRadius: number,\r\n point: Vector3,\r\n out?: CollisionResult\r\n): CollisionResult {\r\n const direction = Vector3.sub(point, center, _pushoutSphereDirection);\r\n const sqrLen = direction.magnitudeSq;\r\n if (sqrLen > EPSILON) {\r\n const dist = Math.sqrt(sqrLen);\r\n const targetDist = radius + pointRadius;\r\n if (dist < targetDist) {\r\n const scaled = Vector3.scale(direction, targetDist / dist, _pushoutSphereScaled);\r\n Vector3.add(center, scaled, scaled);\r\n return writeCollisionResult(out, true, scaled, !out);\r\n }\r\n }\r\n return writeCollisionResult(out, false, point, !out);\r\n}\r\n\r\n/**\r\n * Pushes a point out of a collider.\r\n *\r\n * @public\r\n */\r\nexport function pushoutFromCollider(\r\n colR: ColliderR,\r\n colRW: ColliderRW,\r\n point: Vector3,\r\n ptR: PointR,\r\n out?: CollisionResult\r\n): CollisionResult {\r\n if (colR.height <= EPSILON) {\r\n return pushoutFromSphere(colRW.positionCurrent, colRW.radius, ptR.pointRadius, point, out);\r\n }\r\n return pushoutFromCapsule(colR, colRW, point, ptR, out);\r\n}\r\n\r\n/**\r\n * Pushes a point out of a capsule collider.\r\n *\r\n * @public\r\n */\r\nexport function pushoutFromCapsule(\r\n colR: ColliderR,\r\n colRW: ColliderRW,\r\n point: Vector3,\r\n ptR: PointR,\r\n out?: CollisionResult\r\n): CollisionResult {\r\n const capsuleVec = colRW.directionCurrent;\r\n const capsuleHeight = colRW.height > EPSILON ? colRW.height : capsuleVec.magnitude;\r\n const capsuleVecN = Vector3.normalize(capsuleVec, _pushoutCapsuleVecN);\r\n const capsulePos = colRW.positionCurrent;\r\n const targetVec = Vector3.sub(point, capsulePos, _pushoutCapsuleTargetVec);\r\n const distOnVec = Vector3.dot(capsuleVecN, targetVec);\r\n\r\n if (distOnVec <= EPSILON) {\r\n return pushoutFromSphere(capsulePos, colRW.radius, ptR.pointRadius, point, out);\r\n }\r\n if (distOnVec >= capsuleHeight) {\r\n const tail = Vector3.add(capsulePos, capsuleVec, _pushoutCapsuleTail);\r\n return pushoutFromSphere(tail, colRW.radius * colR.radiusTailScale, ptR.pointRadius, point, out);\r\n }\r\n\r\n const posOnVec = Vector3.scale(capsuleVecN, distOnVec, _pushoutCapsulePosOnVec);\r\n Vector3.add(capsulePos, posOnVec, posOnVec);\r\n const pushVec = Vector3.sub(point, posOnVec, _pushoutCapsulePushVec);\r\n const sqrPushDist = pushVec.magnitudeSq;\r\n if (sqrPushDist > EPSILON) {\r\n const pushDist = Math.sqrt(sqrPushDist);\r\n const r = colRW.radius * lerp(1.0, colR.radiusTailScale, distOnVec / capsuleHeight);\r\n const targetDist = r + ptR.pointRadius;\r\n if (pushDist < targetDist) {\r\n const scaled = Vector3.scale(pushVec, targetDist / pushDist, _pushoutCapsuleScaled);\r\n Vector3.add(posOnVec, scaled, scaled);\r\n return writeCollisionResult(out, true, scaled, !out);\r\n }\r\n }\r\n return writeCollisionResult(out, false, point, !out);\r\n}\r\n\r\n// PushIn (keep point inside collider - inverse mode)\r\n\r\n/**\r\n * Pulls a point inside a sphere collider.\r\n *\r\n * @public\r\n */\r\nexport function pushInFromSphere(\r\n center: Vector3,\r\n radius: number,\r\n point: Vector3,\r\n out?: CollisionResult\r\n): CollisionResult {\r\n const direction = Vector3.sub(center, point, _pushInSphereDirection);\r\n const sqrLen = direction.magnitudeSq;\r\n if (sqrLen > EPSILON && sqrLen > radius * radius) {\r\n const dirLen = Math.sqrt(sqrLen);\r\n const directionN = Vector3.normalize(direction, _pushInSphereDirectionN);\r\n const scaled = Vector3.scale(directionN, dirLen - radius, _pushInSphereScaled);\r\n Vector3.add(point, scaled, scaled);\r\n return writeCollisionResult(out, true, scaled, !out);\r\n }\r\n return writeCollisionResult(out, false, point, !out);\r\n}\r\n\r\n/**\r\n * Pulls a point inside a collider.\r\n *\r\n * @public\r\n */\r\nexport function pushInFromCollider(\r\n colR: ColliderR,\r\n colRW: ColliderRW,\r\n point: Vector3,\r\n out?: CollisionResult\r\n): CollisionResult {\r\n if (colR.height <= EPSILON) {\r\n return pushInFromSphere(colRW.positionCurrent, colRW.radius, point, out);\r\n }\r\n return pushInFromCapsule(colR, colRW, point, out);\r\n}\r\n\r\n/**\r\n * Pulls a point inside a capsule collider.\r\n *\r\n * @public\r\n */\r\nexport function pushInFromCapsule(\r\n colR: ColliderR,\r\n colRW: ColliderRW,\r\n point: Vector3,\r\n out?: CollisionResult\r\n): CollisionResult {\r\n const capsuleVec = colRW.directionCurrent;\r\n const capsuleHeight = colRW.height > EPSILON ? colRW.height : capsuleVec.magnitude;\r\n const capsuleVecN = Vector3.normalize(capsuleVec, _pushInCapsuleVecN);\r\n const capsulePos = colRW.positionCurrent;\r\n const targetVec = Vector3.sub(point, capsulePos, _pushInCapsuleTargetVec);\r\n const distOnVec = Vector3.dot(capsuleVecN, targetVec);\r\n\r\n if (distOnVec <= EPSILON) {\r\n return pushInFromSphere(capsulePos, colRW.radius, point, out);\r\n }\r\n if (distOnVec >= capsuleHeight) {\r\n const tail = Vector3.add(capsulePos, capsuleVec, _pushInCapsuleTail);\r\n return pushInFromSphere(tail, colRW.radius * colR.radiusTailScale, point, out);\r\n }\r\n\r\n const posOnVec = Vector3.scale(capsuleVecN, distOnVec, _pushInCapsulePosOnVec);\r\n Vector3.add(capsulePos, posOnVec, posOnVec);\r\n const pullVec = Vector3.sub(posOnVec, point, _pushInCapsulePullVec);\r\n const sqrPullDist = pullVec.magnitudeSq;\r\n if (sqrPullDist > EPSILON) {\r\n const r = colRW.radius * lerp(1.0, colR.radiusTailScale, distOnVec / capsuleHeight);\r\n if (sqrPullDist > r * r) {\r\n const pullDist = Math.sqrt(sqrPullDist);\r\n const pullVecN = Vector3.normalize(pullVec, _pushInCapsulePullVecN);\r\n const scaled = Vector3.scale(pullVecN, pullDist - r, _pushInCapsuleScaled);\r\n Vector3.add(point, scaled, scaled);\r\n return writeCollisionResult(out, true, scaled, !out);\r\n }\r\n }\r\n return writeCollisionResult(out, false, point, !out);\r\n}\r\n\r\n// Line segment vs collider detection\r\n\r\n/**\r\n * Performs sphere collision detection.\r\n *\r\n * @public\r\n */\r\nexport function collisionDetectionSphere(\r\n center: Vector3,\r\n radius: number,\r\n point1: Vector3,\r\n point2: Vector3,\r\n out?: LineCollisionResult\r\n): LineCollisionResult {\r\n const dir = Vector3.sub(point2, point1, _collisionSphereDir);\r\n const dirLen = dir.magnitude;\r\n if (dirLen < EPSILON) {\r\n return writeLineCollisionResult(out, false, point1, center, radius, !out);\r\n }\r\n const dirN = Vector3.scale(dir, 1 / dirLen, _collisionSphereDirN);\r\n const toCenter = Vector3.sub(center, point1, _collisionSphereToCenter);\r\n const dot = Vector3.dot(dirN, toCenter);\r\n const clamped = Math.max(0, Math.min(dot, dirLen));\r\n const ptOnLine = Vector3.scale(dirN, clamped, _collisionSphereScaled);\r\n Vector3.add(point1, ptOnLine, ptOnLine);\r\n const diff = Vector3.sub(center, ptOnLine, _collisionSphereDiff);\r\n const hit = diff.magnitudeSq <= radius * radius;\r\n return writeLineCollisionResult(out, hit, ptOnLine, center, radius, !out);\r\n}\r\n\r\n/**\r\n * Performs capsule collision detection.\r\n *\r\n * @public\r\n */\r\nexport function collisionDetectionCapsule(\r\n colR: ColliderR,\r\n colRW: ColliderRW,\r\n point1: Vector3,\r\n point2: Vector3,\r\n out?: LineCollisionResult\r\n): LineCollisionResult {\r\n const capsuleDir = colRW.directionCurrent;\r\n const capsulePos = colRW.positionCurrent;\r\n\r\n let res = collisionDetectionSphere(capsulePos, colRW.radius, point1, point2, out);\r\n if (res.hit) {\r\n return res;\r\n }\r\n\r\n const tail = Vector3.add(capsulePos, capsuleDir, _collisionCapsuleTail);\r\n res = collisionDetectionSphere(\r\n tail,\r\n colRW.radius * colR.radiusTailScale,\r\n point1,\r\n point2,\r\n _collisionCapsuleTempLineResult\r\n );\r\n if (res.hit) {\r\n return writeLineCollisionResult(out, true, res.pointOnLine, res.pointOnCollider, res.radius, !out);\r\n }\r\n\r\n const pointDir = Vector3.sub(point2, point1, _collisionCapsulePointDir);\r\n const nearest = computeNearestPoints(capsulePos, capsuleDir, point1, pointDir, _nearestResult);\r\n const t1 = Math.max(0, Math.min(1, nearest.tP));\r\n const r = colRW.radius * lerp(1.0, colR.radiusTailScale, t1);\r\n\r\n if (nearest.sqrDistance > r * r) {\r\n return writeLineCollisionResult(out, false, point1, capsulePos, r, !out);\r\n }\r\n\r\n const t2 = Math.max(0, Math.min(1, nearest.tQ));\r\n const ptOnCol = Vector3.scale(capsuleDir, t1, _collisionCapsulePtOnCol);\r\n Vector3.add(capsulePos, ptOnCol, ptOnCol);\r\n const ptOnLine = Vector3.scale(pointDir, t2, _collisionCapsulePtOnLine);\r\n Vector3.add(point1, ptOnLine, ptOnLine);\r\n const diff = Vector3.sub(ptOnCol, ptOnLine, _collisionCapsuleDiff);\r\n const hit = diff.magnitudeSq <= r * r;\r\n return writeLineCollisionResult(out, hit, ptOnLine, ptOnCol, r, !out);\r\n}\r\n\r\n/**\r\n * Performs collision detection against the specified collider.\r\n *\r\n * @public\r\n */\r\nexport function collisionDetection(\r\n colR: ColliderR,\r\n colRW: ColliderRW,\r\n point1: Vector3,\r\n point2: Vector3,\r\n out?: LineCollisionResult\r\n): LineCollisionResult {\r\n if (colR.height <= EPSILON) {\r\n return collisionDetectionSphere(colRW.positionCurrent, colRW.radius, point1, point2, out);\r\n }\r\n return collisionDetectionCapsule(colR, colRW, point1, point2, out);\r\n}\r\n\r\n/**\r\n * Performs inward collision detection.\r\n *\r\n * @public\r\n */\r\nexport function pushInCollisionDetection(\r\n colR: ColliderR,\r\n colRW: ColliderRW,\r\n point1: Vector3,\r\n point2: Vector3,\r\n out?: LineCollisionResult\r\n): LineCollisionResult {\r\n if (colR.height <= EPSILON) {\r\n return collisionDetectionSphere(colRW.positionCurrent, colRW.radius, point1, point2, out);\r\n }\r\n const res = collisionDetectionCapsule(colR, colRW, point1, point2, out);\r\n res.hit = false;\r\n return res;\r\n}\r\n\r\n// Nearest points between two line segments\r\n\r\n/**\r\n * Computes the nearest points between two segments.\r\n *\r\n * @public\r\n */\r\nexport function computeNearestPoints(\r\n posP: Vector3,\r\n dirP: Vector3,\r\n posQ: Vector3,\r\n dirQ: Vector3,\r\n out?: NearestPointsResult\r\n): {\r\n tP: number;\r\n tQ: number;\r\n pointOnP: Vector3;\r\n pointOnQ: Vector3;\r\n sqrDistance: number;\r\n} {\r\n const cross0 = Vector3.cross(dirQ, dirP, _nearestCross0);\r\n const n1 = Vector3.cross(dirP, cross0, _nearestN1);\r\n const cross1 = Vector3.cross(dirP, dirQ, _nearestCross1);\r\n const n2 = Vector3.cross(dirQ, cross1, _nearestN2);\r\n const dP_n2 = Vector3.dot(dirP, n2);\r\n const dQ_n1 = Vector3.dot(dirQ, n1);\r\n const posDiff = Vector3.sub(posQ, posP, _nearestPosDiff);\r\n const tP = dP_n2 !== 0 ? Vector3.dot(posDiff, n2) / dP_n2 : 0;\r\n const tQ = dQ_n1 !== 0 ? Vector3.dot(Vector3.scale(posDiff, -1, posDiff), n1) / dQ_n1 : 0;\r\n const pointOnP = Vector3.scale(dirP, tP, _nearestPointOnP);\r\n Vector3.add(posP, pointOnP, pointOnP);\r\n const pointOnQ = Vector3.scale(dirQ, tQ, _nearestPointOnQ);\r\n Vector3.add(posQ, pointOnQ, pointOnQ);\r\n const diff = Vector3.sub(pointOnQ, pointOnP, _nearestPointDiff);\r\n return writeNearestPointsResult(out, tP, tQ, pointOnP, pointOnQ, diff.magnitudeSq, !out);\r\n}\r\n\r\n// Surface collision (triangle-based)\r\n\r\n/**\r\n * Checks triangle-surface collision against a collider.\r\n *\r\n * @public\r\n */\r\nexport function checkSurfaceCollision(\r\n ptA: Vector3,\r\n ptB: Vector3,\r\n ptC: Vector3,\r\n colliderPos: Vector3,\r\n colR: ColliderR,\r\n colRW: ColliderRW,\r\n out?: SurfaceCheckResult\r\n): SurfaceCheckResult {\r\n _surfaceNoHit.hit = false;\r\n _surfaceNoHit.intersectionPoint.setXYZ(0, 0, 0);\r\n _surfaceNoHit.pushOut.setXYZ(0, 0, 0);\r\n _surfaceNoHit.pointOnCollider.set(colliderPos);\r\n _surfaceNoHit.radius = colRW.radius;\r\n\r\n let pointOnCollider = colliderPos;\r\n let radius = colRW.radius;\r\n const isCapsule = colR.height > EPSILON;\r\n\r\n const triCenter = centerOfTriangle(ptA, ptB, ptC, _surfaceTriCenter);\r\n const edgeAB = Vector3.sub(ptB, ptA, _surfaceEdgeAB);\r\n const edgeAC = Vector3.sub(ptC, ptA, _surfaceEdgeAC);\r\n const planeNormal = Vector3.cross(edgeAB, edgeAC, _surfacePlaneNormal);\r\n Vector3.normalize(planeNormal, planeNormal);\r\n Vector3.scale(planeNormal, -1, planeNormal);\r\n const planeNormalNeg = Vector3.scale(planeNormal, -1, _surfacePlaneNormalNeg);\r\n const planeDist = -Vector3.dot(planeNormalNeg, ptA);\r\n const colliderDir = Vector3.sub(colliderPos, triCenter, _surfaceColliderDir);\r\n Vector3.normalize(colliderDir, colliderDir);\r\n const dot = Vector3.dot(colliderDir, planeNormal);\r\n\r\n if (isCapsule) {\r\n const side = Vector3.dot(colRW.directionCurrent, planeNormal) * dot;\r\n const rayDir = Vector3.scale(planeNormal, dot * -1, _surfaceRayDir);\r\n const tempPOC = pointOnCollider;\r\n\r\n if (side < 0) {\r\n radius = colRW.radius * colR.radiusTailScale;\r\n pointOnCollider = Vector3.add(colliderPos, colRW.directionCurrent, _surfaceTail);\r\n }\r\n\r\n const rayDirN = Vector3.normalize(rayDir, _surfaceRayDirN);\r\n const enter = raycast(planeNormalNeg, planeDist, pointOnCollider, rayDirN);\r\n if (enter !== null) {\r\n const ip = Vector3.scale(rayDirN, enter, _surfaceIntersection);\r\n Vector3.add(pointOnCollider, ip, ip);\r\n if (triangleContainsPoint(ptA, ptB, ptC, ip)) {\r\n const pushOut = Vector3.sub(ip, pointOnCollider, _surfacePushOut);\r\n const toCol = Vector3.sub(pointOnCollider, ip, _surfaceToCol);\r\n if (toCol.magnitudeSq <= radius * radius) {\r\n return writeSurfaceCheckResult(out, true, ip, pushOut, pointOnCollider, radius, !out);\r\n }\r\n }\r\n } else if (colR.forceType !== ColliderForce.Off) {\r\n pointOnCollider = tempPOC;\r\n let endVec = Vector3.add(colliderPos, colRW.directionCurrent, _surfaceEndVec);\r\n _surfaceColDirVec.set(colRW.directionCurrent);\r\n let colDirVec = _surfaceColDirVec;\r\n if (colR.forceType === ColliderForce.Pull) {\r\n const tmp = pointOnCollider;\r\n pointOnCollider = endVec;\r\n endVec = tmp;\r\n colDirVec = Vector3.scale(colDirVec, -1, colDirVec);\r\n }\r\n const enter2 = raycast(planeNormalNeg, planeDist, pointOnCollider, colDirVec);\r\n if (enter2 !== null) {\r\n const ip = Vector3.scale(colDirVec, enter2, _surfaceIntersection);\r\n Vector3.add(pointOnCollider, ip, ip);\r\n if (triangleContainsPoint(ptA, ptB, ptC, ip)) {\r\n const intersecToEnd = Vector3.sub(endVec, ip, _surfaceIntersecToEnd);\r\n const colToEnd = Vector3.sub(endVec, pointOnCollider, _surfaceColToEnd);\r\n const colToIntersect = Vector3.sub(ip, pointOnCollider, _surfaceColToIntersect);\r\n const pDot = Vector3.dot(intersecToEnd, colToIntersect);\r\n const lDot = Vector3.dot(colToEnd, colToEnd);\r\n if (!(pDot >= 0 && pDot <= lDot)) {\r\n return writeSurfaceCheckResult(\r\n out,\r\n _surfaceNoHit.hit,\r\n _surfaceNoHit.intersectionPoint,\r\n _surfaceNoHit.pushOut,\r\n _surfaceNoHit.pointOnCollider,\r\n _surfaceNoHit.radius,\r\n !out\r\n );\r\n }\r\n const dotVal = Vector3.dot(colToEnd, colToIntersect);\r\n const s2eMag = Vector3.dot(colToEnd, colToEnd);\r\n const colToEndN = Vector3.normalize(colToEnd, colToEnd);\r\n const eVec = Vector3.scale(colToEndN, -radius, _surfaceEVec);\r\n Vector3.add(pointOnCollider, eVec, eVec);\r\n const pushOut = Vector3.sub(ip, eVec, _surfacePushOut);\r\n const poc2 = Vector3.scale(colToEnd, dotVal / s2eMag, _surfacePoc2);\r\n Vector3.add(pointOnCollider, poc2, poc2);\r\n const toCol = Vector3.sub(poc2, ip, _surfaceToCol);\r\n if (toCol.magnitudeSq <= radius * radius) {\r\n return writeSurfaceCheckResult(out, true, ip, pushOut, poc2, radius, !out);\r\n }\r\n }\r\n }\r\n }\r\n } else {\r\n const rayDir = Vector3.scale(planeNormal, dot * -1, _surfaceRayDir);\r\n const rayDirN = Vector3.normalize(rayDir, _surfaceRayDirN);\r\n const enter = raycast(planeNormalNeg, planeDist, pointOnCollider, rayDirN);\r\n if (enter !== null) {\r\n const ip = Vector3.scale(rayDirN, enter, _surfaceIntersection);\r\n Vector3.add(pointOnCollider, ip, ip);\r\n if (triangleContainsPoint(ptA, ptB, ptC, ip)) {\r\n const pushOut = Vector3.sub(ip, pointOnCollider, _surfacePushOut);\r\n const toCol = Vector3.sub(pointOnCollider, ip, _surfaceToCol);\r\n if (toCol.magnitudeSq <= radius * radius) {\r\n return writeSurfaceCheckResult(out, true, ip, pushOut, pointOnCollider, radius, !out);\r\n }\r\n }\r\n }\r\n }\r\n\r\n return writeSurfaceCheckResult(\r\n out,\r\n _surfaceNoHit.hit,\r\n _surfaceNoHit.intersectionPoint,\r\n _surfaceNoHit.pushOut,\r\n _surfaceNoHit.pointOnCollider,\r\n _surfaceNoHit.radius,\r\n !out\r\n );\r\n}\r\n\r\n// Helpers\r\n\r\nfunction raycast(normal: Vector3, planeDist: number, origin: Vector3, direction: Vector3): number | null {\r\n const vdot = Vector3.dot(direction, normal);\r\n const ndot = -Vector3.dot(origin, normal) - planeDist;\r\n if (Math.abs(vdot) <= EPSILON) {\r\n return null;\r\n }\r\n const enter = ndot / vdot;\r\n return enter > 0 ? enter : null;\r\n}\r\n\r\nfunction centerOfTriangle(a: Vector3, b: Vector3, c: Vector3, result?: Vector3): Vector3 {\r\n result = result || new Vector3();\r\n return result.setXYZ((a.x + b.x + c.x) / 3, (a.y + b.y + c.y) / 3, (a.z + b.z + c.z) / 3);\r\n}\r\n\r\nfunction triangleContainsPoint(a: Vector3, b: Vector3, c: Vector3, p: Vector3): boolean {\r\n const ap = Vector3.sub(a, p, _triangleAp);\r\n const bp = Vector3.sub(b, p, _triangleBp);\r\n const cp = Vector3.sub(c, p, _triangleCp);\r\n const u = Vector3.cross(ap, bp, _triangleU);\r\n const vv = Vector3.cross(bp, cp, _triangleV);\r\n const w = Vector3.cross(cp, ap, _triangleW);\r\n if (Vector3.dot(u, vv) < 0) {\r\n return false;\r\n }\r\n if (Vector3.dot(vv, w) < 0) {\r\n return false;\r\n }\r\n return true;\r\n}\r\n\r\nfunction lerp(a: number, b: number, t: number): number {\r\n return a + (b - a) * t;\r\n}\r\n"],"names":["_pushoutSphereDirection","Vector3","_pushoutSphereScaled","_pushoutCapsuleVecN","_pushoutCapsuleTargetVec","_pushoutCapsuleTail","_pushoutCapsulePosOnVec","_pushoutCapsulePushVec","_pushoutCapsuleScaled","_pushInSphereDirection","_pushInSphereDirectionN","_pushInSphereScaled","_pushInCapsuleVecN","_pushInCapsuleTargetVec","_pushInCapsuleTail","_pushInCapsulePosOnVec","_pushInCapsulePullVec","_pushInCapsulePullVecN","_pushInCapsuleScaled","_collisionSphereDir","_collisionSphereDirN","_collisionSphereToCenter","_collisionSphereScaled","_collisionSphereDiff","_collisionCapsuleTail","_collisionCapsulePointDir","_collisionCapsulePtOnCol","_collisionCapsulePtOnLine","_collisionCapsuleDiff","_collisionCapsuleTempLineResult","hit","pointOnLine","pointOnCollider","radius","_nearestCross0","_nearestCross1","_nearestN1","_nearestN2","_nearestPosDiff","_nearestPointOnP","_nearestPointOnQ","_nearestPointDiff","_nearestResult","tP","tQ","pointOnP","pointOnQ","sqrDistance","_surfaceNoHit","intersectionPoint","pushOut","_surfaceTriCenter","_surfaceEdgeAB","_surfaceEdgeAC","_surfacePlaneNormal","_surfacePlaneNormalNeg","_surfaceColliderDir","_surfaceRayDir","_surfaceRayDirN","_surfaceTail","_surfaceIntersection","_surfacePushOut","_surfaceToCol","_surfaceEndVec","_surfaceColDirVec","_surfaceIntersecToEnd","_surfaceColToEnd","_surfaceColToIntersect","_surfaceEVec","_surfacePoc2","_triangleAp","_triangleBp","_triangleCp","_triangleU","_triangleV","_triangleW","writeCollisionResult","out","point","copyPoint","clone","set","writeLineCollisionResult","copyVectors","writeSurfaceCheckResult","writeNearestPointsResult","pushoutFromSphere","center","pointRadius","direction","sub","sqrLen","magnitudeSq","EPSILON","dist","Math","sqrt","targetDist","scaled","scale","add","pushoutFromCollider","colR","colRW","ptR","height","positionCurrent","pushoutFromCapsule","capsuleVec","directionCurrent","capsuleHeight","magnitude","capsuleVecN","normalize","capsulePos","targetVec","distOnVec","dot","tail","radiusTailScale","posOnVec","pushVec","sqrPushDist","pushDist","r","lerp","pushInFromSphere","dirLen","directionN","pushInFromCollider","pushInFromCapsule","pullVec","sqrPullDist","pullDist","pullVecN","collisionDetectionSphere","point1","point2","dir","dirN","toCenter","clamped","max","min","ptOnLine","diff","collisionDetectionCapsule","capsuleDir","res","pointDir","nearest","computeNearestPoints","t1","t2","ptOnCol","collisionDetection","pushInCollisionDetection","posP","dirP","posQ","dirQ","cross0","cross","n1","cross1","n2","dP_n2","dQ_n1","posDiff","checkSurfaceCollision","ptA","ptB","ptC","colliderPos","setXYZ","isCapsule","triCenter","centerOfTriangle","edgeAB","edgeAC","planeNormal","planeNormalNeg","planeDist","colliderDir","side","rayDir","tempPOC","rayDirN","enter","raycast","ip","triangleContainsPoint","toCol","forceType","ColliderForce","Off","endVec","colDirVec","Pull","tmp","enter2","intersecToEnd","colToEnd","colToIntersect","pDot","lDot","dotVal","s2eMag","colToEndN","eVec","poc2","normal","origin","vdot","ndot","abs","a","b","c","result","x","y","z","p","ap","bp","cp","u","vv","w","t"],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { Interpolator } from '@zephyr3d/base';
|
|
2
2
|
import { AnimationTrack } from './animationtrack.js';
|
|
3
3
|
|
|
4
4
|
function clamp01(value) {
|
|
@@ -19,7 +19,11 @@ function clamp01(value) {
|
|
|
19
19
|
*/ constructor(groupName, interpolator, embedded){
|
|
20
20
|
super(embedded ?? false);
|
|
21
21
|
this._groupName = groupName ?? '';
|
|
22
|
-
this._interpolator = interpolator ??
|
|
22
|
+
this._interpolator = interpolator ?? new Interpolator('step', 'number', new Float32Array([
|
|
23
|
+
0
|
|
24
|
+
]), new Float32Array([
|
|
25
|
+
0
|
|
26
|
+
]));
|
|
23
27
|
this._state = [
|
|
24
28
|
0
|
|
25
29
|
];
|
|
@@ -37,7 +41,11 @@ function clamp01(value) {
|
|
|
37
41
|
if (value && value.target !== 'number') {
|
|
38
42
|
throw new Error(`MorphTargetGroupTrack(): interpolator target must be 'number'`);
|
|
39
43
|
}
|
|
40
|
-
this._interpolator = value ??
|
|
44
|
+
this._interpolator = value ?? new Interpolator('step', 'number', new Float32Array([
|
|
45
|
+
0
|
|
46
|
+
]), new Float32Array([
|
|
47
|
+
0
|
|
48
|
+
]));
|
|
41
49
|
}
|
|
42
50
|
/** {@inheritDoc AnimationTrack.clone} */ clone() {
|
|
43
51
|
return new MorphTargetGroupTrack(this._groupName, this._interpolator.clone(), false);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"morphtargetgrouptrack.js","sources":["../../src/animation/morphtargetgrouptrack.ts"],"sourcesContent":["import {
|
|
1
|
+
{"version":3,"file":"morphtargetgrouptrack.js","sources":["../../src/animation/morphtargetgrouptrack.ts"],"sourcesContent":["import { Interpolator } from '@zephyr3d/base';\r\nimport { AnimationTrack } from './animationtrack';\r\nimport type { SceneNode } from '../scene';\r\n\r\nfunction clamp01(value: number): number {\r\n return value < 0 ? 0 : value > 1 ? 1 : value;\r\n}\r\n\r\n/**\r\n * Animates a model-level morph target group by name.\r\n * @public\r\n */\r\nexport class MorphTargetGroupTrack extends AnimationTrack<number> {\r\n private _groupName: string;\r\n private _interpolator: Interpolator;\r\n private readonly _state: number[];\r\n /**\r\n * Create a morph target group animation track.\r\n * @param groupName - Morph target group name\r\n * @param interpolator - Scalar interpolator for the group weight\r\n * @param embedded - Whether this track is embedded\r\n */\r\n constructor(groupName?: string, interpolator?: Interpolator, embedded?: boolean) {\r\n super(embedded ?? false);\r\n this._groupName = groupName ?? '';\r\n this._interpolator =\r\n interpolator ?? new Interpolator('step', 'number', new Float32Array([0]), new Float32Array([0]));\r\n this._state = [0];\r\n }\r\n /** Morph target group name controlled by this track. */\r\n get groupName() {\r\n return this._groupName;\r\n }\r\n set groupName(value: string) {\r\n this._groupName = value ?? '';\r\n }\r\n /** Scalar interpolator for this track. */\r\n get interpolator() {\r\n return this._interpolator;\r\n }\r\n set interpolator(value: Interpolator) {\r\n if (value && value.target !== 'number') {\r\n throw new Error(`MorphTargetGroupTrack(): interpolator target must be 'number'`);\r\n }\r\n this._interpolator =\r\n value ?? new Interpolator('step', 'number', new Float32Array([0]), new Float32Array([0]));\r\n }\r\n /** {@inheritDoc AnimationTrack.clone} */\r\n clone(): this {\r\n return new MorphTargetGroupTrack(this._groupName, this._interpolator.clone(), false) as this;\r\n }\r\n /** {@inheritDoc AnimationTrack.calculateState} */\r\n calculateState(target: object, currentTime: number) {\r\n this._interpolator.interpolate(currentTime, this._state);\r\n return clamp01(this._state[0]);\r\n }\r\n /** {@inheritDoc AnimationTrack.applyState} */\r\n applyState(node: SceneNode, weight: number) {\r\n if (this._groupName) {\r\n node.setMorphTargetGroupWeight(this._groupName, clamp01(weight));\r\n }\r\n }\r\n /** {@inheritDoc AnimationTrack.mixState} */\r\n mixState(a: number, b: number, t: number) {\r\n return a + (b - a) * t;\r\n }\r\n /** {@inheritDoc AnimationTrack.getBlendId} */\r\n getBlendId() {\r\n return `morph-target-group:${this._groupName}`;\r\n }\r\n /** {@inheritDoc AnimationTrack.getDuration} */\r\n getDuration() {\r\n return this._interpolator.maxTime;\r\n }\r\n}\r\n"],"names":["clamp01","value","MorphTargetGroupTrack","AnimationTrack","_groupName","_interpolator","_state","groupName","interpolator","embedded","Interpolator","Float32Array","target","Error","clone","calculateState","currentTime","interpolate","applyState","node","weight","setMorphTargetGroupWeight","mixState","a","b","t","getBlendId","getDuration","maxTime"],"mappings":";;;AAIA,SAASA,QAAQC,KAAa,EAAA;AAC5B,IAAA,OAAOA,KAAQ,GAAA,CAAA,GAAI,CAAIA,GAAAA,KAAAA,GAAQ,IAAI,CAAIA,GAAAA,KAAAA;AACzC;AAEA;;;IAIO,MAAMC,qBAA8BC,SAAAA,cAAAA,CAAAA;IACjCC,UAAmB;IACnBC,aAA4B;IACnBC,MAAiB;AAClC;;;;;AAKC,MACD,YAAYC,SAAkB,EAAEC,YAA2B,EAAEC,QAAkB,CAAE;AAC/E,QAAA,KAAK,CAACA,QAAY,IAAA,KAAA,CAAA;QAClB,IAAI,CAACL,UAAU,GAAGG,SAAa,IAAA,EAAA;QAC/B,IAAI,CAACF,aAAa,GAChBG,YAAAA,IAAgB,IAAIE,YAAa,CAAA,MAAA,EAAQ,QAAU,EAAA,IAAIC,YAAa,CAAA;AAAC,YAAA;AAAE,SAAA,CAAA,EAAG,IAAIA,YAAa,CAAA;AAAC,YAAA;AAAE,SAAA,CAAA,CAAA;QAChG,IAAI,CAACL,MAAM,GAAG;AAAC,YAAA;AAAE,SAAA;AACnB;6DAEA,IAAIC,SAAY,GAAA;QACd,OAAO,IAAI,CAACH,UAAU;AACxB;IACA,IAAIG,SAAAA,CAAUN,KAAa,EAAE;QAC3B,IAAI,CAACG,UAAU,GAAGH,KAAS,IAAA,EAAA;AAC7B;+CAEA,IAAIO,YAAe,GAAA;QACjB,OAAO,IAAI,CAACH,aAAa;AAC3B;IACA,IAAIG,YAAAA,CAAaP,KAAmB,EAAE;AACpC,QAAA,IAAIA,KAASA,IAAAA,KAAAA,CAAMW,MAAM,KAAK,QAAU,EAAA;AACtC,YAAA,MAAM,IAAIC,KAAAA,CAAM,CAAC,6DAA6D,CAAC,CAAA;AACjF;QACA,IAAI,CAACR,aAAa,GAChBJ,KAAAA,IAAS,IAAIS,YAAa,CAAA,MAAA,EAAQ,QAAU,EAAA,IAAIC,YAAa,CAAA;AAAC,YAAA;AAAE,SAAA,CAAA,EAAG,IAAIA,YAAa,CAAA;AAAC,YAAA;AAAE,SAAA,CAAA,CAAA;AAC3F;AACA,8CACAG,KAAc,GAAA;QACZ,OAAO,IAAIZ,qBAAsB,CAAA,IAAI,CAACE,UAAU,EAAE,IAAI,CAACC,aAAa,CAACS,KAAK,EAAI,EAAA,KAAA,CAAA;AAChF;AACA,uDACAC,cAAAA,CAAeH,MAAc,EAAEI,WAAmB,EAAE;QAClD,IAAI,CAACX,aAAa,CAACY,WAAW,CAACD,WAAa,EAAA,IAAI,CAACV,MAAM,CAAA;AACvD,QAAA,OAAON,OAAQ,CAAA,IAAI,CAACM,MAAM,CAAC,CAAE,CAAA,CAAA;AAC/B;AACA,mDACAY,UAAAA,CAAWC,IAAe,EAAEC,MAAc,EAAE;QAC1C,IAAI,IAAI,CAAChB,UAAU,EAAE;AACnBe,YAAAA,IAAAA,CAAKE,yBAAyB,CAAC,IAAI,CAACjB,UAAU,EAAEJ,OAAQoB,CAAAA,MAAAA,CAAAA,CAAAA;AAC1D;AACF;AACA,iDACAE,QAASC,CAAAA,CAAS,EAAEC,CAAS,EAAEC,CAAS,EAAE;AACxC,QAAA,OAAOF,CAAI,GAACC,CAAAA,CAAAA,GAAID,CAAAA,IAAKE,CAAAA;AACvB;AACA,mDACAC,UAAa,GAAA;AACX,QAAA,OAAO,CAAC,mBAAmB,EAAE,IAAI,CAACtB,UAAU,CAAE,CAAA;AAChD;AACA,oDACAuB,WAAc,GAAA;AACZ,QAAA,OAAO,IAAI,CAACtB,aAAa,CAACuB,OAAO;AACnC;AACF;;;;"}
|
|
@@ -58,6 +58,37 @@ function hasRawQuery(spec) {
|
|
|
58
58
|
}
|
|
59
59
|
return query.split('&').some((part)=>part.trim() === 'raw');
|
|
60
60
|
}
|
|
61
|
+
/**
|
|
62
|
+
* Realm-global storage for shared script module registries, keyed by
|
|
63
|
+
* registry namespace. Bundles built by the same `ScriptRegistry` share one
|
|
64
|
+
* module registry so a module evaluates once and its exports (including
|
|
65
|
+
* module-level singletons) are identical across entry bundles.
|
|
66
|
+
* @internal
|
|
67
|
+
*/ const SCRIPT_MODULES_GLOBAL_KEY = '__z3dScriptModules';
|
|
68
|
+
let scriptRegistryNamespaceCounter = 0;
|
|
69
|
+
function nextScriptRegistryNamespace() {
|
|
70
|
+
return `z3d-scripts:${++scriptRegistryNamespaceCounter}`;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Monotonic serial stamped into each built bundle. The shared runtime uses it
|
|
74
|
+
* to ignore registrations coming from bundles older than the one that already
|
|
75
|
+
* registered a module, so late imports of stale bundles cannot downgrade a
|
|
76
|
+
* module record.
|
|
77
|
+
* @internal
|
|
78
|
+
*/ let scriptBuildSerialCounter = 0;
|
|
79
|
+
/**
|
|
80
|
+
* FNV-1a hash of module code, used to version shared module records.
|
|
81
|
+
* Rebuilding an unchanged module keeps its already-evaluated instance;
|
|
82
|
+
* changed content replaces the record so the next load re-evaluates.
|
|
83
|
+
* @internal
|
|
84
|
+
*/ function hashModuleCode(text) {
|
|
85
|
+
let h = 0x811c9dc5;
|
|
86
|
+
for(let i = 0; i < text.length; i++){
|
|
87
|
+
h ^= text.charCodeAt(i);
|
|
88
|
+
h = Math.imul(h, 0x01000193);
|
|
89
|
+
}
|
|
90
|
+
return (h >>> 0).toString(36);
|
|
91
|
+
}
|
|
61
92
|
/**
|
|
62
93
|
* Resolves, builds, and serves runtime modules using a VFS.
|
|
63
94
|
*
|
|
@@ -73,6 +104,13 @@ function hasRawQuery(spec) {
|
|
|
73
104
|
*
|
|
74
105
|
* Caching:
|
|
75
106
|
* - Built bundles are memoized in `_built` map keyed by canonical source path.
|
|
107
|
+
* - At runtime, all bundles built by the same registry share one realm-global
|
|
108
|
+
* module registry (keyed by a per-registry namespace): a local module is
|
|
109
|
+
* evaluated once no matter how many entry bundles inline it, so module-level
|
|
110
|
+
* singletons are identical across entries. Module records are versioned by a
|
|
111
|
+
* content hash — rebuilding an unchanged module reuses its evaluated
|
|
112
|
+
* instance, while changed content replaces the record so the next load
|
|
113
|
+
* re-evaluates the new code.
|
|
76
114
|
*
|
|
77
115
|
* @public
|
|
78
116
|
*/ class ScriptRegistry {
|
|
@@ -81,6 +119,7 @@ function hasRawQuery(spec) {
|
|
|
81
119
|
_built;
|
|
82
120
|
_building;
|
|
83
121
|
_builtDeps;
|
|
122
|
+
_namespace;
|
|
84
123
|
/**
|
|
85
124
|
* @param vfs - The virtual file system for existence checks, reads, and path ops.
|
|
86
125
|
* @param scriptsRoot - Root directory for script resolution (used with `#/` specifiers).
|
|
@@ -90,6 +129,7 @@ function hasRawQuery(spec) {
|
|
|
90
129
|
this._built = new Map();
|
|
91
130
|
this._building = new Map();
|
|
92
131
|
this._builtDeps = new Map();
|
|
132
|
+
this._namespace = nextScriptRegistryNamespace();
|
|
93
133
|
}
|
|
94
134
|
/**
|
|
95
135
|
* The active virtual file system.
|
|
@@ -104,6 +144,11 @@ function hasRawQuery(spec) {
|
|
|
104
144
|
this._built.clear();
|
|
105
145
|
this._building.clear();
|
|
106
146
|
this._builtDeps.clear();
|
|
147
|
+
// Rotate the shared module registry namespace: modules from the old VFS
|
|
148
|
+
// must not be reused as instances for same-named modules of the new VFS.
|
|
149
|
+
const root = globalThis[SCRIPT_MODULES_GLOBAL_KEY];
|
|
150
|
+
root?.delete(this._namespace);
|
|
151
|
+
this._namespace = nextScriptRegistryNamespace();
|
|
107
152
|
}
|
|
108
153
|
}
|
|
109
154
|
/**
|
|
@@ -318,11 +363,16 @@ function hasRawQuery(spec) {
|
|
|
318
363
|
if (!entry) {
|
|
319
364
|
return '';
|
|
320
365
|
}
|
|
366
|
+
// Replace content hashes with Merkle-style effective versions so that a
|
|
367
|
+
// module whose (transitive) dependencies changed is re-registered and
|
|
368
|
+
// re-evaluated even when its own source is unchanged.
|
|
369
|
+
this.applyEffectiveVersions(modules);
|
|
370
|
+
const serial = ++scriptBuildSerialCounter;
|
|
321
371
|
const chunks = [
|
|
322
372
|
this.getSystemBundleRuntime()
|
|
323
373
|
];
|
|
324
374
|
for (const module of modules.values()){
|
|
325
|
-
chunks.push(`__z3dRegister(${JSON.stringify(module.id)}, () => {\n${module.systemCode}\n});`);
|
|
375
|
+
chunks.push(`__z3dRegister(${JSON.stringify(module.id)}, ${JSON.stringify(module.version)}, ${serial}, () => {\n${module.systemCode}\n});`);
|
|
326
376
|
}
|
|
327
377
|
chunks.push(`const __z3dEntry = await __z3dLoad(${JSON.stringify(entry.id)});\n` + `const plugin = __z3dEntry.plugin;\n` + `const __z3dDefault = __z3dEntry.default ?? __z3dEntry.plugin ?? __z3dEntry;\n` + `export { plugin };\n` + `export default __z3dDefault;\n` + `//# sourceURL=${entry.id}`);
|
|
328
378
|
const url = toDataUrl(chunks.join('\n'), entry.id);
|
|
@@ -345,11 +395,47 @@ function hasRawQuery(spec) {
|
|
|
345
395
|
const rewritten = await this.rewriteImportsToLogicalIds(esmCode, module.id);
|
|
346
396
|
module.deps = rewritten.deps;
|
|
347
397
|
module.systemCode = await this.transpileToSystemModule(rewritten.code, module.id);
|
|
398
|
+
module.version = hashModuleCode(module.systemCode);
|
|
348
399
|
for (const dep of module.deps){
|
|
349
400
|
await this.collectModule(dep, modules);
|
|
350
401
|
}
|
|
351
402
|
return module;
|
|
352
403
|
}
|
|
404
|
+
/**
|
|
405
|
+
* Rewrites each collected module's version to a Merkle-style hash combining
|
|
406
|
+
* its own content hash with the effective versions of its local
|
|
407
|
+
* dependencies. Cycles fall back to the plain content hash, which is
|
|
408
|
+
* deterministic on both sides of the cycle.
|
|
409
|
+
*/ applyEffectiveVersions(modules) {
|
|
410
|
+
const effective = new Map();
|
|
411
|
+
const visiting = new Set();
|
|
412
|
+
const visit = (id)=>{
|
|
413
|
+
const cached = effective.get(id);
|
|
414
|
+
if (cached !== undefined) {
|
|
415
|
+
return cached;
|
|
416
|
+
}
|
|
417
|
+
const module = modules.get(id);
|
|
418
|
+
if (!module) {
|
|
419
|
+
return '';
|
|
420
|
+
}
|
|
421
|
+
if (visiting.has(id)) {
|
|
422
|
+
return module.version;
|
|
423
|
+
}
|
|
424
|
+
visiting.add(id);
|
|
425
|
+
let acc = module.version;
|
|
426
|
+
for (const dep of module.deps){
|
|
427
|
+
if (modules.has(dep)) {
|
|
428
|
+
acc = hashModuleCode(`${acc}:${dep}:${visit(dep)}`);
|
|
429
|
+
}
|
|
430
|
+
}
|
|
431
|
+
visiting.delete(id);
|
|
432
|
+
effective.set(id, acc);
|
|
433
|
+
return acc;
|
|
434
|
+
};
|
|
435
|
+
for (const module of modules.values()){
|
|
436
|
+
module.version = visit(module.id);
|
|
437
|
+
}
|
|
438
|
+
}
|
|
353
439
|
async resolveModuleInfo(id) {
|
|
354
440
|
const srcPath = await this.resolveSourcePath(id);
|
|
355
441
|
if (!srcPath) {
|
|
@@ -362,7 +448,8 @@ function hasRawQuery(spec) {
|
|
|
362
448
|
path,
|
|
363
449
|
type: srcPath.type,
|
|
364
450
|
deps: [],
|
|
365
|
-
systemCode: ''
|
|
451
|
+
systemCode: '',
|
|
452
|
+
version: ''
|
|
366
453
|
};
|
|
367
454
|
}
|
|
368
455
|
getTypeScriptRuntime() {
|
|
@@ -467,8 +554,19 @@ function hasRawQuery(spec) {
|
|
|
467
554
|
}
|
|
468
555
|
getSystemBundleRuntime() {
|
|
469
556
|
return `
|
|
470
|
-
const __z3dRegistry =
|
|
557
|
+
const __z3dRegistry = (() => {
|
|
558
|
+
const root = (globalThis.${SCRIPT_MODULES_GLOBAL_KEY} ??= new Map());
|
|
559
|
+
const ns = ${JSON.stringify(this._namespace)};
|
|
560
|
+
let registry = root.get(ns);
|
|
561
|
+
if (!registry) {
|
|
562
|
+
registry = new Map();
|
|
563
|
+
root.set(ns, registry);
|
|
564
|
+
}
|
|
565
|
+
return registry;
|
|
566
|
+
})();
|
|
471
567
|
let __z3dCurrentId = '';
|
|
568
|
+
let __z3dCurrentVersion = '';
|
|
569
|
+
let __z3dCurrentSerial = 0;
|
|
472
570
|
const System = {
|
|
473
571
|
register(deps, declare) {
|
|
474
572
|
if (!__z3dCurrentId) {
|
|
@@ -476,6 +574,8 @@ const System = {
|
|
|
476
574
|
}
|
|
477
575
|
__z3dRegistry.set(__z3dCurrentId, {
|
|
478
576
|
id: __z3dCurrentId,
|
|
577
|
+
version: __z3dCurrentVersion,
|
|
578
|
+
serial: __z3dCurrentSerial,
|
|
479
579
|
deps,
|
|
480
580
|
declare,
|
|
481
581
|
exports: Object.create(null),
|
|
@@ -486,13 +586,31 @@ const System = {
|
|
|
486
586
|
});
|
|
487
587
|
}
|
|
488
588
|
};
|
|
489
|
-
function __z3dRegister(id, factory) {
|
|
490
|
-
|
|
589
|
+
function __z3dRegister(id, version, serial, factory) {
|
|
590
|
+
// The module registry is shared across bundles: a module already registered
|
|
591
|
+
// by another bundle with the same effective version is reused (so
|
|
592
|
+
// module-level singletons stay unique), while changed content replaces the
|
|
593
|
+
// record so the next load re-evaluates the new code. A record from a newer
|
|
594
|
+
// build or one that is currently executing is never replaced.
|
|
595
|
+
const existing = __z3dRegistry.get(id);
|
|
596
|
+
if (existing && (existing.version === version || existing.state === 1 || existing.serial > serial)) {
|
|
597
|
+
if (serial > existing.serial) {
|
|
598
|
+
existing.serial = serial;
|
|
599
|
+
}
|
|
600
|
+
return;
|
|
601
|
+
}
|
|
602
|
+
const prevId = __z3dCurrentId;
|
|
603
|
+
const prevVersion = __z3dCurrentVersion;
|
|
604
|
+
const prevSerial = __z3dCurrentSerial;
|
|
491
605
|
__z3dCurrentId = id;
|
|
606
|
+
__z3dCurrentVersion = version;
|
|
607
|
+
__z3dCurrentSerial = serial;
|
|
492
608
|
try {
|
|
493
609
|
factory();
|
|
494
610
|
} finally {
|
|
495
|
-
__z3dCurrentId =
|
|
611
|
+
__z3dCurrentId = prevId;
|
|
612
|
+
__z3dCurrentVersion = prevVersion;
|
|
613
|
+
__z3dCurrentSerial = prevSerial;
|
|
496
614
|
}
|
|
497
615
|
}
|
|
498
616
|
function __z3dResolve(spec, parentId) {
|