@zephyr3d/scene 0.9.21 → 0.9.23
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 +1 -7
- package/dist/animation/joint_dynamics/collision.js.map +1 -1
- package/dist/animation/joint_dynamics/constraints.js +2 -17
- package/dist/animation/joint_dynamics/constraints.js.map +1 -1
- package/dist/animation/joint_dynamics/controller.js +2 -20
- package/dist/animation/joint_dynamics/controller.js.map +1 -1
- package/dist/animation/joint_dynamics/joint_dynamics_system.js +1 -3
- package/dist/animation/joint_dynamics/joint_dynamics_system.js.map +1 -1
- package/dist/animation/joint_dynamics/solver.js +14 -60
- package/dist/animation/joint_dynamics/solver.js.map +1 -1
- package/dist/animation/joint_dynamics/types.js +3 -3
- package/dist/animation/joint_dynamics/types.js.map +1 -1
- package/dist/app/app.js +23 -0
- package/dist/app/app.js.map +1 -1
- package/dist/app/scriptregistry.js +16 -53
- package/dist/app/scriptregistry.js.map +1 -1
- package/dist/asset/assetmanager.js +2 -0
- package/dist/asset/assetmanager.js.map +1 -1
- package/dist/asset/model.js +22 -0
- package/dist/asset/model.js.map +1 -1
- package/dist/blitter/bilateralblur.js +3 -1
- package/dist/blitter/bilateralblur.js.map +1 -1
- package/dist/blitter/blitter.js +3 -3
- package/dist/blitter/blitter.js.map +1 -1
- package/dist/camera/camera.js +398 -45
- package/dist/camera/camera.js.map +1 -1
- package/dist/camera/perspectivecamera.js +69 -2
- package/dist/camera/perspectivecamera.js.map +1 -1
- package/dist/index.d.ts +9100 -8712
- package/dist/index.js +9 -1
- package/dist/index.js.map +1 -1
- package/dist/material/blinn.js +1 -1
- package/dist/material/blinn.js.map +1 -1
- package/dist/material/lambert.js +3 -3
- package/dist/material/lambert.js.map +1 -1
- package/dist/material/material.js +8 -5
- package/dist/material/material.js.map +1 -1
- package/dist/material/meshmaterial.js +17 -10
- package/dist/material/meshmaterial.js.map +1 -1
- package/dist/material/mixins/lightmodel/blinnphong.js +1 -1
- package/dist/material/mixins/lightmodel/blinnphong.js.map +1 -1
- package/dist/material/mixins/lightmodel/lambert.js +1 -1
- package/dist/material/mixins/lightmodel/lambert.js.map +1 -1
- package/dist/material/mixins/lightmodel/pbrblueprintmixin.js +21 -6
- package/dist/material/mixins/lightmodel/pbrblueprintmixin.js.map +1 -1
- package/dist/material/mixins/lightmodel/pbrmetallicroughness.js +1 -1
- package/dist/material/mixins/lightmodel/pbrmetallicroughness.js.map +1 -1
- package/dist/material/mixins/lightmodel/pbrspecularglossness.js +1 -1
- package/dist/material/mixins/lightmodel/pbrspecularglossness.js.map +1 -1
- package/dist/material/mixins/lit.js +33 -11
- package/dist/material/mixins/lit.js.map +1 -1
- package/dist/material/mixins/pbr/brdf.js +44 -12
- package/dist/material/mixins/pbr/brdf.js.map +1 -1
- package/dist/material/mixins/pbr/common.js +149 -14
- package/dist/material/mixins/pbr/common.js.map +1 -1
- package/dist/material/mtoon.js +7 -4
- package/dist/material/mtoon.js.map +1 -1
- package/dist/material/pbrblueprint.js +5 -1
- package/dist/material/pbrblueprint.js.map +1 -1
- package/dist/material/pbrmr.js +1 -1
- package/dist/material/pbrmr.js.map +1 -1
- package/dist/material/pbrsg.js +1 -1
- package/dist/material/pbrsg.js.map +1 -1
- package/dist/material/shader/helper.js +186 -11
- package/dist/material/shader/helper.js.map +1 -1
- package/dist/material/skin.js +2 -2
- package/dist/material/skin.js.map +1 -1
- package/dist/material/terrain-cm.js +5 -5
- package/dist/material/terrain-cm.js.map +1 -1
- package/dist/material/water.js +6 -4
- package/dist/material/water.js.map +1 -1
- package/dist/posteffect/bloom.js +54 -4
- package/dist/posteffect/bloom.js.map +1 -1
- package/dist/posteffect/compositor.js +41 -0
- package/dist/posteffect/compositor.js.map +1 -1
- package/dist/posteffect/posteffect.js +51 -0
- package/dist/posteffect/posteffect.js.map +1 -1
- package/dist/posteffect/sao.js +7 -6
- package/dist/posteffect/sao.js.map +1 -1
- package/dist/posteffect/skinsss.js +3 -3
- package/dist/posteffect/skinsss.js.map +1 -1
- package/dist/posteffect/ssgi.js +1196 -0
- package/dist/posteffect/ssgi.js.map +1 -0
- package/dist/posteffect/ssr.js +83 -45
- package/dist/posteffect/ssr.js.map +1 -1
- package/dist/posteffect/sss.js +137 -49
- package/dist/posteffect/sss.js.map +1 -1
- package/dist/posteffect/taa.js +5 -4
- package/dist/posteffect/taa.js.map +1 -1
- package/dist/posteffect/tonemap.js +15 -3
- package/dist/posteffect/tonemap.js.map +1 -1
- package/dist/render/abuffer_oit.js +2 -2
- package/dist/render/abuffer_oit.js.map +1 -1
- package/dist/render/cluster_light.js +12 -6
- package/dist/render/cluster_light.js.map +1 -1
- package/dist/render/drawable_mixin.js +8 -5
- package/dist/render/drawable_mixin.js.map +1 -1
- package/dist/render/dualdepthpeeling_oit.js +10 -5
- package/dist/render/dualdepthpeeling_oit.js.map +1 -1
- package/dist/render/envlight.js +298 -5
- package/dist/render/envlight.js.map +1 -1
- package/dist/render/gpu_picking.js +7 -5
- package/dist/render/gpu_picking.js.map +1 -1
- package/dist/render/hzb.js +28 -19
- package/dist/render/hzb.js.map +1 -1
- package/dist/render/lightpass.js +18 -4
- package/dist/render/lightpass.js.map +1 -1
- package/dist/render/render_queue.js +37 -4
- package/dist/render/render_queue.js.map +1 -1
- package/dist/render/renderer.js +8 -3
- package/dist/render/renderer.js.map +1 -1
- package/dist/render/rendergraph/blackboard.js +20 -48
- package/dist/render/rendergraph/blackboard.js.map +1 -1
- package/dist/render/rendergraph/device_pool_allocator.js +18 -58
- package/dist/render/rendergraph/device_pool_allocator.js.map +1 -1
- package/dist/render/rendergraph/executor.js +89 -115
- package/dist/render/rendergraph/executor.js.map +1 -1
- package/dist/render/rendergraph/forward_plus_builder.js +1003 -715
- package/dist/render/rendergraph/forward_plus_builder.js.map +1 -1
- package/dist/render/rendergraph/frame_graph_context.js +41 -0
- package/dist/render/rendergraph/frame_graph_context.js.map +1 -0
- package/dist/render/rendergraph/frame_resource_requirements.js +14 -0
- package/dist/render/rendergraph/frame_resource_requirements.js.map +1 -0
- package/dist/render/rendergraph/history_resource_manager.js +74 -140
- package/dist/render/rendergraph/history_resource_manager.js.map +1 -1
- package/dist/render/rendergraph/history_resources.js +7 -5
- package/dist/render/rendergraph/history_resources.js.map +1 -1
- package/dist/render/rendergraph/render_context.js +19 -0
- package/dist/render/rendergraph/render_context.js.map +1 -0
- package/dist/render/rendergraph/render_pipeline.js +315 -0
- package/dist/render/rendergraph/render_pipeline.js.map +1 -0
- package/dist/render/rendergraph/rendergraph.js +158 -141
- package/dist/render/rendergraph/rendergraph.js.map +1 -1
- package/dist/render/rendergraph/scene_render_context.js +267 -0
- package/dist/render/rendergraph/scene_render_context.js.map +1 -0
- package/dist/render/rendergraph/texture_affinity_cache.js +19 -0
- package/dist/render/rendergraph/texture_affinity_cache.js.map +1 -0
- package/dist/render/rendergraph/types.js +19 -31
- package/dist/render/rendergraph/types.js.map +1 -1
- package/dist/render/renderpass.js +3 -3
- package/dist/render/renderpass.js.map +1 -1
- package/dist/render/shadow_mask_pass.js +10 -6
- package/dist/render/shadow_mask_pass.js.map +1 -1
- package/dist/render/sky.js +197 -35
- package/dist/render/sky.js.map +1 -1
- package/dist/render/weightedblended_oit.js +4 -3
- package/dist/render/weightedblended_oit.js.map +1 -1
- package/dist/scene/basesprite.js +2 -0
- package/dist/scene/basesprite.js.map +1 -1
- package/dist/scene/batchgroup.js +10 -0
- package/dist/scene/batchgroup.js.map +1 -1
- package/dist/scene/environment.js +61 -2
- package/dist/scene/environment.js.map +1 -1
- package/dist/scene/light.js +178 -10
- package/dist/scene/light.js.map +1 -1
- package/dist/scene/meshdrawable.js +89 -2
- package/dist/scene/meshdrawable.js.map +1 -1
- package/dist/scene/msdftext.js +2 -0
- package/dist/scene/msdftext.js.map +1 -1
- package/dist/scene/msdftextsprite.js +2 -0
- package/dist/scene/msdftextsprite.js.map +1 -1
- package/dist/scene/particlesys.js +2 -0
- package/dist/scene/particlesys.js.map +1 -1
- package/dist/scene/scene.js +34 -1
- package/dist/scene/scene.js.map +1 -1
- package/dist/scene/terrain-cm/grass.js +2 -1
- package/dist/scene/terrain-cm/grass.js.map +1 -1
- package/dist/scene/terrain-cm/terrain-cm.js +2 -0
- package/dist/scene/terrain-cm/terrain-cm.js.map +1 -1
- package/dist/scene/water.js +2 -0
- package/dist/scene/water.js.map +1 -1
- package/dist/shaders/atmosphere.js +5 -4
- package/dist/shaders/atmosphere.js.map +1 -1
- package/dist/shaders/fog.js +10 -3
- package/dist/shaders/fog.js.map +1 -1
- package/dist/shaders/shadow.js +96 -29
- package/dist/shaders/shadow.js.map +1 -1
- package/dist/shaders/ssgi.js +63 -0
- package/dist/shaders/ssgi.js.map +1 -0
- package/dist/shaders/ssgi_reprojection.js +118 -0
- package/dist/shaders/ssgi_reprojection.js.map +1 -0
- package/dist/shaders/ssr.js +322 -154
- package/dist/shaders/ssr.js.map +1 -1
- package/dist/shadow/esm.js +13 -8
- package/dist/shadow/esm.js.map +1 -1
- package/dist/shadow/pcf_opt.js +15 -12
- package/dist/shadow/pcf_opt.js.map +1 -1
- package/dist/shadow/pcf_pd.js +15 -12
- package/dist/shadow/pcf_pd.js.map +1 -1
- package/dist/shadow/pcss.js +17 -11
- package/dist/shadow/pcss.js.map +1 -1
- package/dist/shadow/shadow_impl.js +20 -2
- package/dist/shadow/shadow_impl.js.map +1 -1
- package/dist/shadow/shadowmapper.js +10 -3
- package/dist/shadow/shadowmapper.js.map +1 -1
- package/dist/shadow/ssm.js +16 -13
- package/dist/shadow/ssm.js.map +1 -1
- package/dist/shadow/vsm.js +10 -8
- package/dist/shadow/vsm.js.map +1 -1
- package/dist/utility/physical.js +74 -0
- package/dist/utility/physical.js.map +1 -0
- package/dist/utility/rendermipmap.js +2 -2
- package/dist/utility/rendermipmap.js.map +1 -1
- package/dist/utility/serialization/manager.js +3 -1
- package/dist/utility/serialization/manager.js.map +1 -1
- package/dist/utility/serialization/scene/animation.js +3 -1
- package/dist/utility/serialization/scene/animation.js.map +1 -1
- package/dist/utility/serialization/scene/batch.js +3 -1
- package/dist/utility/serialization/scene/batch.js.map +1 -1
- package/dist/utility/serialization/scene/camera.js +598 -2
- package/dist/utility/serialization/scene/camera.js.map +1 -1
- package/dist/utility/serialization/scene/light.js +180 -9
- package/dist/utility/serialization/scene/light.js.map +1 -1
- package/dist/utility/serialization/scene/material.js +43 -3
- package/dist/utility/serialization/scene/material.js.map +1 -1
- package/dist/utility/serialization/scene/mesh.js +3 -1
- package/dist/utility/serialization/scene/mesh.js.map +1 -1
- package/dist/utility/serialization/scene/node.js +3 -1
- package/dist/utility/serialization/scene/node.js.map +1 -1
- package/dist/utility/serialization/scene/particle.js +3 -1
- package/dist/utility/serialization/scene/particle.js.map +1 -1
- package/dist/utility/serialization/scene/primitive.js +2 -0
- package/dist/utility/serialization/scene/primitive.js.map +1 -1
- package/dist/utility/serialization/scene/scene.js +70 -0
- package/dist/utility/serialization/scene/scene.js.map +1 -1
- package/dist/utility/serialization/scene/sprite.js +3 -1
- package/dist/utility/serialization/scene/sprite.js.map +1 -1
- package/dist/utility/serialization/scene/terrain.js +3 -1
- package/dist/utility/serialization/scene/terrain.js.map +1 -1
- package/dist/utility/serialization/scene/text.js +3 -0
- package/dist/utility/serialization/scene/text.js.map +1 -1
- package/dist/utility/serialization/scene/water.js +3 -1
- package/dist/utility/serialization/scene/water.js.map +1 -1
- package/dist/values.js +2 -3
- package/dist/values.js.map +1 -1
- package/package.json +3 -3
- package/dist/animation/joint_dynamics/convex_collider.js +0 -320
- package/dist/animation/joint_dynamics/convex_collider.js.map +0 -1
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { Vector3 } from '@zephyr3d/base';
|
|
2
2
|
import { EPSILON, ColliderForce } from './types.js';
|
|
3
3
|
|
|
4
|
-
// Collision
|
|
4
|
+
// Collision routines ported from SPCRJointDynamicsJob.cs.
|
|
5
5
|
const _pushoutSphereDirection = new Vector3();
|
|
6
6
|
const _pushoutSphereScaled = new Vector3();
|
|
7
7
|
const _pushoutCapsuleVecN = new Vector3();
|
|
@@ -161,7 +161,6 @@ function writeNearestPointsResult(out, tP, tQ, pointOnP, pointOnQ, sqrDistance,
|
|
|
161
161
|
out.sqrDistance = sqrDistance;
|
|
162
162
|
return out;
|
|
163
163
|
}
|
|
164
|
-
// Pushout (keep point outside collider)
|
|
165
164
|
/**
|
|
166
165
|
* Pushes a point out of a sphere collider.
|
|
167
166
|
*
|
|
@@ -224,7 +223,6 @@ function writeNearestPointsResult(out, tP, tQ, pointOnP, pointOnQ, sqrDistance,
|
|
|
224
223
|
}
|
|
225
224
|
return writeCollisionResult(out, false, point, !out);
|
|
226
225
|
}
|
|
227
|
-
// PushIn (keep point inside collider - inverse mode)
|
|
228
226
|
/**
|
|
229
227
|
* Pulls a point inside a sphere collider.
|
|
230
228
|
*
|
|
@@ -285,7 +283,6 @@ function writeNearestPointsResult(out, tP, tQ, pointOnP, pointOnQ, sqrDistance,
|
|
|
285
283
|
}
|
|
286
284
|
return writeCollisionResult(out, false, point, !out);
|
|
287
285
|
}
|
|
288
|
-
// Line segment vs collider detection
|
|
289
286
|
/**
|
|
290
287
|
* Performs sphere collision detection.
|
|
291
288
|
*
|
|
@@ -360,7 +357,6 @@ function writeNearestPointsResult(out, tP, tQ, pointOnP, pointOnQ, sqrDistance,
|
|
|
360
357
|
res.hit = false;
|
|
361
358
|
return res;
|
|
362
359
|
}
|
|
363
|
-
// Nearest points between two line segments
|
|
364
360
|
/**
|
|
365
361
|
* Computes the nearest points between two segments.
|
|
366
362
|
*
|
|
@@ -382,7 +378,6 @@ function writeNearestPointsResult(out, tP, tQ, pointOnP, pointOnQ, sqrDistance,
|
|
|
382
378
|
const diff = Vector3.sub(pointOnQ, pointOnP, _nearestPointDiff);
|
|
383
379
|
return writeNearestPointsResult(out, tP, tQ, pointOnP, pointOnQ, diff.magnitudeSq, !out);
|
|
384
380
|
}
|
|
385
|
-
// Surface collision (triangle-based)
|
|
386
381
|
/**
|
|
387
382
|
* Checks triangle-surface collision against a collider.
|
|
388
383
|
*
|
|
@@ -484,7 +479,6 @@ function writeNearestPointsResult(out, tP, tQ, pointOnP, pointOnQ, sqrDistance,
|
|
|
484
479
|
}
|
|
485
480
|
return writeSurfaceCheckResult(out, _surfaceNoHit.hit, _surfaceNoHit.intersectionPoint, _surfaceNoHit.pushOut, _surfaceNoHit.pointOnCollider, _surfaceNoHit.radius, !out);
|
|
486
481
|
}
|
|
487
|
-
// Helpers
|
|
488
482
|
function raycast(normal, planeDist, origin, direction) {
|
|
489
483
|
const vdot = Vector3.dot(direction, normal);
|
|
490
484
|
const ndot = -Vector3.dot(origin, normal) - planeDist;
|
|
@@ -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 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
|
+
{"version":3,"file":"collision.js","sources":["../../../src/animation/joint_dynamics/collision.ts"],"sourcesContent":["// Collision routines ported from SPCRJointDynamicsJob.cs.\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/**\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/**\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/**\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/**\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/**\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\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,14 +1,13 @@
|
|
|
1
1
|
import { Vector3 } from '@zephyr3d/base';
|
|
2
2
|
import { ConstraintType } from './types.js';
|
|
3
3
|
|
|
4
|
-
// Constraint
|
|
4
|
+
// Constraint builders ported from SPCRJointDynamicsController.
|
|
5
5
|
function getFirstChild(node) {
|
|
6
6
|
return node.children.length > 0 ? node.children[0] : null;
|
|
7
7
|
}
|
|
8
8
|
function constraintLength(a, b) {
|
|
9
9
|
return Vector3.distance(a.position, b.position);
|
|
10
10
|
}
|
|
11
|
-
// ── Structural Vertical: parent→child chains ──
|
|
12
11
|
function createStructuralVertical(node, out) {
|
|
13
12
|
for (const child of node.children){
|
|
14
13
|
out.push({
|
|
@@ -20,7 +19,6 @@ function createStructuralVertical(node, out) {
|
|
|
20
19
|
createStructuralVertical(child, out);
|
|
21
20
|
}
|
|
22
21
|
}
|
|
23
|
-
// ── Structural Horizontal: same-depth siblings across chains ──
|
|
24
22
|
function createHorizontal(a, b, type, out) {
|
|
25
23
|
if (!a || !b || a === b) {
|
|
26
24
|
return;
|
|
@@ -51,7 +49,6 @@ function createHorizontal(a, b, type, out) {
|
|
|
51
49
|
});
|
|
52
50
|
}
|
|
53
51
|
}
|
|
54
|
-
// ── Shear: diagonal cross-bracing ──
|
|
55
52
|
function createShear(a, b, out) {
|
|
56
53
|
if (!a || !b || a === b) {
|
|
57
54
|
return;
|
|
@@ -82,7 +79,6 @@ function createShear(a, b, out) {
|
|
|
82
79
|
}
|
|
83
80
|
createShear(cA, cB, out);
|
|
84
81
|
}
|
|
85
|
-
// ── Bending Vertical: skip-one (grandparent→grandchild) ──
|
|
86
82
|
function createBendingVertical(node, out) {
|
|
87
83
|
if (node.children.length !== 1) {
|
|
88
84
|
return;
|
|
@@ -100,7 +96,6 @@ function createBendingVertical(node, out) {
|
|
|
100
96
|
});
|
|
101
97
|
createBendingVertical(childA, out);
|
|
102
98
|
}
|
|
103
|
-
// ── Constraint grouping (no shared point indices per group) ──
|
|
104
99
|
function findSameIndex(group, c) {
|
|
105
100
|
for (const g of group){
|
|
106
101
|
if (g.indexA === c.indexA || g.indexA === c.indexB || g.indexB === c.indexA || g.indexB === c.indexB) {
|
|
@@ -120,7 +115,6 @@ function pushToGroups(groups, c) {
|
|
|
120
115
|
c
|
|
121
116
|
]);
|
|
122
117
|
}
|
|
123
|
-
// ── Surface faces (quads → 2 triangles of 3 indices) ──
|
|
124
118
|
function createSurfaceFaces(a, b, out) {
|
|
125
119
|
if (!a || !b || a === b) {
|
|
126
120
|
return;
|
|
@@ -129,13 +123,12 @@ function createSurfaceFaces(a, b, out) {
|
|
|
129
123
|
const cB = getFirstChild(b);
|
|
130
124
|
if (cA && cB) {
|
|
131
125
|
if (a.useForSurfaceCollision !== false && b.useForSurfaceCollision !== false && cA.useForSurfaceCollision !== false && cB.useForSurfaceCollision !== false) {
|
|
132
|
-
// Quad ABCD
|
|
126
|
+
// Quad ABCD becomes triangles ABC and CDA.
|
|
133
127
|
out.push(a.index, b.index, cB.index, cB.index, cA.index, a.index);
|
|
134
128
|
}
|
|
135
129
|
createSurfaceFaces(cA, cB, out);
|
|
136
130
|
}
|
|
137
131
|
}
|
|
138
|
-
// ── Public API ──
|
|
139
132
|
/**
|
|
140
133
|
* Builds solver constraints from the supplied root chains.
|
|
141
134
|
*
|
|
@@ -155,7 +148,6 @@ function createSurfaceFaces(a, b, out) {
|
|
|
155
148
|
});
|
|
156
149
|
}
|
|
157
150
|
};
|
|
158
|
-
// Bending Horizontal
|
|
159
151
|
if (options.bendingHorizontal) {
|
|
160
152
|
const raw = [];
|
|
161
153
|
const pairs = options.isLoop ? Array.from({
|
|
@@ -174,7 +166,6 @@ function createSurfaceFaces(a, b, out) {
|
|
|
174
166
|
}
|
|
175
167
|
addRaw(raw, false);
|
|
176
168
|
}
|
|
177
|
-
// Bending Vertical
|
|
178
169
|
if (options.bendingVertical) {
|
|
179
170
|
const raw = [];
|
|
180
171
|
for (const root of rootPoints){
|
|
@@ -182,7 +173,6 @@ function createSurfaceFaces(a, b, out) {
|
|
|
182
173
|
}
|
|
183
174
|
addRaw(raw, false);
|
|
184
175
|
}
|
|
185
|
-
// Shear
|
|
186
176
|
if (options.shear) {
|
|
187
177
|
const raw = [];
|
|
188
178
|
const pairs = options.isLoop ? Array.from({
|
|
@@ -201,7 +191,6 @@ function createSurfaceFaces(a, b, out) {
|
|
|
201
191
|
}
|
|
202
192
|
addRaw(raw, options.enableSurfaceCollision || options.collideShear);
|
|
203
193
|
}
|
|
204
|
-
// Structural Horizontal
|
|
205
194
|
if (options.structuralHorizontal) {
|
|
206
195
|
const raw = [];
|
|
207
196
|
const pairs = options.isLoop ? Array.from({
|
|
@@ -220,7 +209,6 @@ function createSurfaceFaces(a, b, out) {
|
|
|
220
209
|
}
|
|
221
210
|
addRaw(raw, options.enableSurfaceCollision || options.collideStructuralHorizontal);
|
|
222
211
|
}
|
|
223
|
-
// Structural Vertical
|
|
224
212
|
if (options.structuralVertical) {
|
|
225
213
|
const raw = [];
|
|
226
214
|
for (const root of rootPoints){
|
|
@@ -228,7 +216,6 @@ function createSurfaceFaces(a, b, out) {
|
|
|
228
216
|
}
|
|
229
217
|
addRaw(raw, options.enableSurfaceCollision || options.collideStructuralVertical);
|
|
230
218
|
}
|
|
231
|
-
// Flatten groups into single array
|
|
232
219
|
return groups.flat();
|
|
233
220
|
}
|
|
234
221
|
/**
|
|
@@ -312,13 +299,11 @@ function createSurfaceFaces(a, b, out) {
|
|
|
312
299
|
}
|
|
313
300
|
return sorted;
|
|
314
301
|
}
|
|
315
|
-
// ── Helpers ──
|
|
316
302
|
function distXYZ(a, b, ignoreY) {
|
|
317
303
|
const dx = a.x - b.x, dz = a.z - b.z;
|
|
318
304
|
const dy = ignoreY ? 0 : a.y - b.y;
|
|
319
305
|
return dx * dx + dy * dy + dz * dz;
|
|
320
306
|
}
|
|
321
|
-
// Walk all nodes to find if a given index is fixed
|
|
322
307
|
function isBoneFixed(roots, index) {
|
|
323
308
|
function find(node) {
|
|
324
309
|
if (node.index === index) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constraints.js","sources":["../../../src/animation/joint_dynamics/constraints.ts"],"sourcesContent":["// Constraint creation utilities — port of SPCRJointDynamicsController constraint building\r\n\r\nimport { Vector3 } from '@zephyr3d/base';\r\nimport { ConstraintType, type Constraint, type BoneNode } from './types';\r\n\r\n/**\r\n * Options for constraint generation from a bone hierarchy.\r\n *\r\n * @public\r\n */\r\nexport interface ConstraintBuildOptions {\r\n /** Generate parent→child vertical constraints */\r\n structuralVertical: boolean;\r\n /** Generate same-depth horizontal constraints across chains */\r\n structuralHorizontal: boolean;\r\n /** Generate diagonal cross-bracing constraints */\r\n shear: boolean;\r\n /** Generate skip-one vertical bending constraints */\r\n bendingVertical: boolean;\r\n /** Generate skip-one horizontal bending constraints */\r\n bendingHorizontal: boolean;\r\n /** Connect last root point back to first (for cylindrical topology like skirts) */\r\n isLoop: boolean;\r\n /** Enable per-constraint collision detection on structural vertical pairs */\r\n collideStructuralVertical: boolean;\r\n /** Enable per-constraint collision detection on structural horizontal pairs */\r\n collideStructuralHorizontal: boolean;\r\n /** Enable per-constraint collision detection on shear pairs */\r\n collideShear: boolean;\r\n /** Enable surface/triangle collision (overrides per-type collision flags) */\r\n enableSurfaceCollision: boolean;\r\n}\r\n\r\ninterface RawConstraint {\r\n type: ConstraintType;\r\n indexA: number;\r\n indexB: number;\r\n length: number;\r\n}\r\n\r\nfunction getFirstChild(node: BoneNode): BoneNode | null {\r\n return node.children.length > 0 ? node.children[0] : null;\r\n}\r\n\r\nfunction constraintLength(a: BoneNode, b: BoneNode): number {\r\n return Vector3.distance(a.position, b.position);\r\n}\r\n\r\n// ── Structural Vertical: parent→child chains ──\r\n\r\nfunction createStructuralVertical(node: BoneNode, out: RawConstraint[]) {\r\n for (const child of node.children) {\r\n out.push({\r\n type: ConstraintType.Structural_Vertical,\r\n indexA: node.index,\r\n indexB: child.index,\r\n length: constraintLength(node, child)\r\n });\r\n createStructuralVertical(child, out);\r\n }\r\n}\r\n\r\n// ── Structural Horizontal: same-depth siblings across chains ──\r\n\r\nfunction createHorizontal(\r\n a: BoneNode | null,\r\n b: BoneNode | null,\r\n type: ConstraintType,\r\n out: RawConstraint[]\r\n) {\r\n if (!a || !b || a === b) {\r\n return;\r\n }\r\n const childA = getFirstChild(a);\r\n const childB = getFirstChild(b);\r\n\r\n if (childA && childB) {\r\n out.push({\r\n type,\r\n indexA: childA.index,\r\n indexB: childB.index,\r\n length: constraintLength(childA, childB)\r\n });\r\n createHorizontal(childA, childB, type, out);\r\n } else if (childA && !childB) {\r\n out.push({\r\n type,\r\n indexA: childA.index,\r\n indexB: b.index,\r\n length: constraintLength(childA, b)\r\n });\r\n } else if (!childA && childB) {\r\n out.push({\r\n type,\r\n indexA: a.index,\r\n indexB: childB.index,\r\n length: constraintLength(a, childB)\r\n });\r\n }\r\n}\r\n\r\n// ── Shear: diagonal cross-bracing ──\r\n\r\nfunction createShear(a: BoneNode | null, b: BoneNode | null, out: RawConstraint[]) {\r\n if (!a || !b || a === b) {\r\n return;\r\n }\r\n const cA = getFirstChild(a);\r\n const cB = getFirstChild(b);\r\n const cA2 = cA ? getFirstChild(cA) : null;\r\n const cB2 = cB ? getFirstChild(cB) : null;\r\n const cA3 = cA2 ? getFirstChild(cA2) : null;\r\n const cB3 = cB2 ? getFirstChild(cB2) : null;\r\n\r\n const target1 = cA ?? cA2 ?? cA3;\r\n if (target1) {\r\n out.push({\r\n type: ConstraintType.Shear,\r\n indexA: target1.index,\r\n indexB: b.index,\r\n length: constraintLength(target1, b)\r\n });\r\n }\r\n\r\n const target2 = cB ?? cB2 ?? cB3;\r\n if (target2) {\r\n out.push({\r\n type: ConstraintType.Shear,\r\n indexA: a.index,\r\n indexB: target2.index,\r\n length: constraintLength(a, target2)\r\n });\r\n }\r\n\r\n createShear(cA, cB, out);\r\n}\r\n\r\n// ── Bending Vertical: skip-one (grandparent→grandchild) ──\r\n\r\nfunction createBendingVertical(node: BoneNode, out: RawConstraint[]) {\r\n if (node.children.length !== 1) {\r\n return;\r\n }\r\n const childA = node.children[0];\r\n if (childA.children.length !== 1) {\r\n return;\r\n }\r\n const childB = childA.children[0];\r\n\r\n out.push({\r\n type: ConstraintType.Bending_Vertical,\r\n indexA: node.index,\r\n indexB: childB.index,\r\n length: constraintLength(node, childB)\r\n });\r\n createBendingVertical(childA, out);\r\n}\r\n\r\n// ── Constraint grouping (no shared point indices per group) ──\r\n\r\nfunction findSameIndex(group: Constraint[], c: Constraint): boolean {\r\n for (const g of group) {\r\n if (g.indexA === c.indexA || g.indexA === c.indexB || g.indexB === c.indexA || g.indexB === c.indexB) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n}\r\n\r\nfunction pushToGroups(groups: Constraint[][], c: Constraint) {\r\n for (const g of groups) {\r\n if (!findSameIndex(g, c)) {\r\n g.push(c);\r\n return;\r\n }\r\n }\r\n groups.push([c]);\r\n}\r\n\r\n// ── Surface faces (quads → 2 triangles of 3 indices) ──\r\n\r\nfunction createSurfaceFaces(a: BoneNode | null, b: BoneNode | null, out: number[]) {\r\n if (!a || !b || a === b) {\r\n return;\r\n }\r\n const cA = getFirstChild(a);\r\n const cB = getFirstChild(b);\r\n if (cA && cB) {\r\n if (\r\n a.useForSurfaceCollision !== false &&\r\n b.useForSurfaceCollision !== false &&\r\n cA.useForSurfaceCollision !== false &&\r\n cB.useForSurfaceCollision !== false\r\n ) {\r\n // Quad ABCD → triangles ABC, CDA\r\n out.push(a.index, b.index, cB.index, cB.index, cA.index, a.index);\r\n }\r\n createSurfaceFaces(cA, cB, out);\r\n }\r\n}\r\n\r\n// ── Public API ──\r\n\r\n/**\r\n * Builds solver constraints from the supplied root chains.\r\n *\r\n * @public\r\n */\r\nexport function buildConstraints(rootPoints: BoneNode[], options: ConstraintBuildOptions): Constraint[] {\r\n const n = rootPoints.length;\r\n const groups: Constraint[][] = [];\r\n\r\n const addRaw = (raws: RawConstraint[], collide: boolean) => {\r\n for (const r of raws) {\r\n const bothFixed = isBoneFixed(rootPoints, r.indexA) && isBoneFixed(rootPoints, r.indexB);\r\n pushToGroups(groups, {\r\n type: r.type,\r\n indexA: r.indexA,\r\n indexB: r.indexB,\r\n length: r.length,\r\n isCollision: !bothFixed && collide ? 1 : 0\r\n });\r\n }\r\n };\r\n\r\n // Bending Horizontal\r\n if (options.bendingHorizontal) {\r\n const raw: RawConstraint[] = [];\r\n const pairs = options.isLoop\r\n ? Array.from({ length: n }, (_, i) => [i, (i + 2) % n])\r\n : Array.from({ length: Math.max(0, n - 2) }, (_, i) => [i, i + 2]);\r\n for (const [a, b] of pairs) {\r\n createHorizontal(rootPoints[a], rootPoints[b], ConstraintType.Bending_Horizontal, raw);\r\n }\r\n addRaw(raw, false);\r\n }\r\n\r\n // Bending Vertical\r\n if (options.bendingVertical) {\r\n const raw: RawConstraint[] = [];\r\n for (const root of rootPoints) {\r\n createBendingVertical(root, raw);\r\n }\r\n addRaw(raw, false);\r\n }\r\n\r\n // Shear\r\n if (options.shear) {\r\n const raw: RawConstraint[] = [];\r\n const pairs = options.isLoop\r\n ? Array.from({ length: n }, (_, i) => [i, (i + 1) % n])\r\n : Array.from({ length: Math.max(0, n - 1) }, (_, i) => [i, i + 1]);\r\n for (const [a, b] of pairs) {\r\n createShear(rootPoints[a], rootPoints[b], raw);\r\n }\r\n addRaw(raw, options.enableSurfaceCollision || options.collideShear);\r\n }\r\n\r\n // Structural Horizontal\r\n if (options.structuralHorizontal) {\r\n const raw: RawConstraint[] = [];\r\n const pairs = options.isLoop\r\n ? Array.from({ length: n }, (_, i) => [i, (i + 1) % n])\r\n : Array.from({ length: Math.max(0, n - 1) }, (_, i) => [i, i + 1]);\r\n for (const [a, b] of pairs) {\r\n createHorizontal(rootPoints[a], rootPoints[b], ConstraintType.Structural_Horizontal, raw);\r\n }\r\n addRaw(raw, options.enableSurfaceCollision || options.collideStructuralHorizontal);\r\n }\r\n\r\n // Structural Vertical\r\n if (options.structuralVertical) {\r\n const raw: RawConstraint[] = [];\r\n for (const root of rootPoints) {\r\n createStructuralVertical(root, raw);\r\n }\r\n addRaw(raw, options.enableSurfaceCollision || options.collideStructuralVertical);\r\n }\r\n\r\n // Flatten groups into single array\r\n return groups.flat();\r\n}\r\n\r\n/**\r\n * Builds triangle indices used for surface collision.\r\n *\r\n * @public\r\n */\r\nexport function buildSurfaceFaces(rootPoints: BoneNode[], isLoop: boolean): number[] {\r\n const out: number[] = [];\r\n const n = rootPoints.length;\r\n for (let i = 0; i < n - 1; i++) {\r\n createSurfaceFaces(rootPoints[i], rootPoints[i + 1], out);\r\n }\r\n if (isLoop && n > 1) {\r\n createSurfaceFaces(rootPoints[n - 1], rootPoints[0], out);\r\n }\r\n return out;\r\n}\r\n\r\n/**\r\n * Computes the maximum chain depth among all root points.\r\n *\r\n * @public\r\n */\r\nexport function computeMaxDepth(rootPoints: BoneNode[]): number {\r\n let max = 0;\r\n function walk(node: BoneNode) {\r\n if (node.depth > max) {\r\n max = node.depth;\r\n }\r\n for (const c of node.children) {\r\n walk(c);\r\n }\r\n }\r\n for (const r of rootPoints) {\r\n walk(r);\r\n }\r\n return max;\r\n}\r\n\r\n/**\r\n * Sorts root points by proximity to the supplied reference position.\r\n *\r\n * @public\r\n */\r\nexport function sortRootPointsByProximity(\r\n roots: BoneNode[],\r\n ignoreY: boolean,\r\n fixedBeginEnd: boolean\r\n): BoneNode[] {\r\n if (roots.length <= 2) {\r\n return [...roots];\r\n }\r\n const sorted: BoneNode[] = [];\r\n const remaining = [...roots];\r\n\r\n if (fixedBeginEnd) {\r\n sorted.push(remaining.shift()!);\r\n const last = remaining.pop()!;\r\n while (remaining.length > 0) {\r\n const cur = sorted[sorted.length - 1];\r\n let bestIdx = 0,\r\n bestDist = Infinity;\r\n for (let i = 0; i < remaining.length; i++) {\r\n const d = distXYZ(cur.position, remaining[i].position, ignoreY);\r\n if (d < bestDist) {\r\n bestDist = d;\r\n bestIdx = i;\r\n }\r\n }\r\n sorted.push(remaining.splice(bestIdx, 1)[0]);\r\n }\r\n sorted.push(last);\r\n } else {\r\n sorted.push(remaining.shift()!);\r\n while (remaining.length > 0) {\r\n const cur = sorted[sorted.length - 1];\r\n let bestIdx = 0,\r\n bestDist = Infinity;\r\n for (let i = 0; i < remaining.length; i++) {\r\n const d = distXYZ(cur.position, remaining[i].position, ignoreY);\r\n if (d < bestDist) {\r\n bestDist = d;\r\n bestIdx = i;\r\n }\r\n }\r\n sorted.push(remaining.splice(bestIdx, 1)[0]);\r\n }\r\n }\r\n return sorted;\r\n}\r\n\r\n// ── Helpers ──\r\n\r\nfunction distXYZ(a: Vector3, b: Vector3, ignoreY: boolean): number {\r\n const dx = a.x - b.x,\r\n dz = a.z - b.z;\r\n const dy = ignoreY ? 0 : a.y - b.y;\r\n return dx * dx + dy * dy + dz * dz;\r\n}\r\n\r\n// Walk all nodes to find if a given index is fixed\r\nfunction isBoneFixed(roots: BoneNode[], index: number): boolean {\r\n function find(node: BoneNode): boolean {\r\n if (node.index === index) {\r\n return node.isFixed;\r\n }\r\n for (const c of node.children) {\r\n const r = find(c);\r\n if (r !== undefined) {\r\n return r;\r\n }\r\n }\r\n return false;\r\n }\r\n for (const r of roots) {\r\n const res = find(r);\r\n if (res) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n}\r\n"],"names":["getFirstChild","node","children","length","constraintLength","a","b","Vector3","distance","position","createStructuralVertical","out","child","push","type","ConstraintType","Structural_Vertical","indexA","index","indexB","createHorizontal","childA","childB","createShear","cA","cB","cA2","cB2","cA3","cB3","target1","Shear","target2","createBendingVertical","Bending_Vertical","findSameIndex","group","c","g","pushToGroups","groups","createSurfaceFaces","useForSurfaceCollision","buildConstraints","rootPoints","options","n","addRaw","raws","collide","r","bothFixed","isBoneFixed","isCollision","bendingHorizontal","raw","pairs","isLoop","Array","from","_","i","Math","max","Bending_Horizontal","bendingVertical","root","shear","enableSurfaceCollision","collideShear","structuralHorizontal","Structural_Horizontal","collideStructuralHorizontal","structuralVertical","collideStructuralVertical","flat","buildSurfaceFaces","computeMaxDepth","walk","depth","sortRootPointsByProximity","roots","ignoreY","fixedBeginEnd","sorted","remaining","shift","last","pop","cur","bestIdx","bestDist","Infinity","d","distXYZ","splice","dx","x","dz","z","dy","y","find","isFixed","undefined","res"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"constraints.js","sources":["../../../src/animation/joint_dynamics/constraints.ts"],"sourcesContent":["// Constraint builders ported from SPCRJointDynamicsController.\r\n\r\nimport { Vector3 } from '@zephyr3d/base';\r\nimport { ConstraintType, type Constraint, type BoneNode } from './types';\r\n\r\n/**\r\n * Options for constraint generation from a bone hierarchy.\r\n *\r\n * @public\r\n */\r\nexport interface ConstraintBuildOptions {\r\n /** Generate parent→child vertical constraints */\r\n structuralVertical: boolean;\r\n /** Generate same-depth horizontal constraints across chains */\r\n structuralHorizontal: boolean;\r\n /** Generate diagonal cross-bracing constraints */\r\n shear: boolean;\r\n /** Generate skip-one vertical bending constraints */\r\n bendingVertical: boolean;\r\n /** Generate skip-one horizontal bending constraints */\r\n bendingHorizontal: boolean;\r\n /** Connect last root point back to first (for cylindrical topology like skirts) */\r\n isLoop: boolean;\r\n /** Enable per-constraint collision detection on structural vertical pairs */\r\n collideStructuralVertical: boolean;\r\n /** Enable per-constraint collision detection on structural horizontal pairs */\r\n collideStructuralHorizontal: boolean;\r\n /** Enable per-constraint collision detection on shear pairs */\r\n collideShear: boolean;\r\n /** Enable surface/triangle collision (overrides per-type collision flags) */\r\n enableSurfaceCollision: boolean;\r\n}\r\n\r\ninterface RawConstraint {\r\n type: ConstraintType;\r\n indexA: number;\r\n indexB: number;\r\n length: number;\r\n}\r\n\r\nfunction getFirstChild(node: BoneNode): BoneNode | null {\r\n return node.children.length > 0 ? node.children[0] : null;\r\n}\r\n\r\nfunction constraintLength(a: BoneNode, b: BoneNode): number {\r\n return Vector3.distance(a.position, b.position);\r\n}\r\n\r\nfunction createStructuralVertical(node: BoneNode, out: RawConstraint[]) {\r\n for (const child of node.children) {\r\n out.push({\r\n type: ConstraintType.Structural_Vertical,\r\n indexA: node.index,\r\n indexB: child.index,\r\n length: constraintLength(node, child)\r\n });\r\n createStructuralVertical(child, out);\r\n }\r\n}\r\n\r\nfunction createHorizontal(\r\n a: BoneNode | null,\r\n b: BoneNode | null,\r\n type: ConstraintType,\r\n out: RawConstraint[]\r\n) {\r\n if (!a || !b || a === b) {\r\n return;\r\n }\r\n const childA = getFirstChild(a);\r\n const childB = getFirstChild(b);\r\n\r\n if (childA && childB) {\r\n out.push({\r\n type,\r\n indexA: childA.index,\r\n indexB: childB.index,\r\n length: constraintLength(childA, childB)\r\n });\r\n createHorizontal(childA, childB, type, out);\r\n } else if (childA && !childB) {\r\n out.push({\r\n type,\r\n indexA: childA.index,\r\n indexB: b.index,\r\n length: constraintLength(childA, b)\r\n });\r\n } else if (!childA && childB) {\r\n out.push({\r\n type,\r\n indexA: a.index,\r\n indexB: childB.index,\r\n length: constraintLength(a, childB)\r\n });\r\n }\r\n}\r\n\r\nfunction createShear(a: BoneNode | null, b: BoneNode | null, out: RawConstraint[]) {\r\n if (!a || !b || a === b) {\r\n return;\r\n }\r\n const cA = getFirstChild(a);\r\n const cB = getFirstChild(b);\r\n const cA2 = cA ? getFirstChild(cA) : null;\r\n const cB2 = cB ? getFirstChild(cB) : null;\r\n const cA3 = cA2 ? getFirstChild(cA2) : null;\r\n const cB3 = cB2 ? getFirstChild(cB2) : null;\r\n\r\n const target1 = cA ?? cA2 ?? cA3;\r\n if (target1) {\r\n out.push({\r\n type: ConstraintType.Shear,\r\n indexA: target1.index,\r\n indexB: b.index,\r\n length: constraintLength(target1, b)\r\n });\r\n }\r\n\r\n const target2 = cB ?? cB2 ?? cB3;\r\n if (target2) {\r\n out.push({\r\n type: ConstraintType.Shear,\r\n indexA: a.index,\r\n indexB: target2.index,\r\n length: constraintLength(a, target2)\r\n });\r\n }\r\n\r\n createShear(cA, cB, out);\r\n}\r\n\r\nfunction createBendingVertical(node: BoneNode, out: RawConstraint[]) {\r\n if (node.children.length !== 1) {\r\n return;\r\n }\r\n const childA = node.children[0];\r\n if (childA.children.length !== 1) {\r\n return;\r\n }\r\n const childB = childA.children[0];\r\n\r\n out.push({\r\n type: ConstraintType.Bending_Vertical,\r\n indexA: node.index,\r\n indexB: childB.index,\r\n length: constraintLength(node, childB)\r\n });\r\n createBendingVertical(childA, out);\r\n}\r\n\r\nfunction findSameIndex(group: Constraint[], c: Constraint): boolean {\r\n for (const g of group) {\r\n if (g.indexA === c.indexA || g.indexA === c.indexB || g.indexB === c.indexA || g.indexB === c.indexB) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n}\r\n\r\nfunction pushToGroups(groups: Constraint[][], c: Constraint) {\r\n for (const g of groups) {\r\n if (!findSameIndex(g, c)) {\r\n g.push(c);\r\n return;\r\n }\r\n }\r\n groups.push([c]);\r\n}\r\n\r\nfunction createSurfaceFaces(a: BoneNode | null, b: BoneNode | null, out: number[]) {\r\n if (!a || !b || a === b) {\r\n return;\r\n }\r\n const cA = getFirstChild(a);\r\n const cB = getFirstChild(b);\r\n if (cA && cB) {\r\n if (\r\n a.useForSurfaceCollision !== false &&\r\n b.useForSurfaceCollision !== false &&\r\n cA.useForSurfaceCollision !== false &&\r\n cB.useForSurfaceCollision !== false\r\n ) {\r\n // Quad ABCD becomes triangles ABC and CDA.\r\n out.push(a.index, b.index, cB.index, cB.index, cA.index, a.index);\r\n }\r\n createSurfaceFaces(cA, cB, out);\r\n }\r\n}\r\n\r\n/**\r\n * Builds solver constraints from the supplied root chains.\r\n *\r\n * @public\r\n */\r\nexport function buildConstraints(rootPoints: BoneNode[], options: ConstraintBuildOptions): Constraint[] {\r\n const n = rootPoints.length;\r\n const groups: Constraint[][] = [];\r\n\r\n const addRaw = (raws: RawConstraint[], collide: boolean) => {\r\n for (const r of raws) {\r\n const bothFixed = isBoneFixed(rootPoints, r.indexA) && isBoneFixed(rootPoints, r.indexB);\r\n pushToGroups(groups, {\r\n type: r.type,\r\n indexA: r.indexA,\r\n indexB: r.indexB,\r\n length: r.length,\r\n isCollision: !bothFixed && collide ? 1 : 0\r\n });\r\n }\r\n };\r\n\r\n if (options.bendingHorizontal) {\r\n const raw: RawConstraint[] = [];\r\n const pairs = options.isLoop\r\n ? Array.from({ length: n }, (_, i) => [i, (i + 2) % n])\r\n : Array.from({ length: Math.max(0, n - 2) }, (_, i) => [i, i + 2]);\r\n for (const [a, b] of pairs) {\r\n createHorizontal(rootPoints[a], rootPoints[b], ConstraintType.Bending_Horizontal, raw);\r\n }\r\n addRaw(raw, false);\r\n }\r\n\r\n if (options.bendingVertical) {\r\n const raw: RawConstraint[] = [];\r\n for (const root of rootPoints) {\r\n createBendingVertical(root, raw);\r\n }\r\n addRaw(raw, false);\r\n }\r\n\r\n if (options.shear) {\r\n const raw: RawConstraint[] = [];\r\n const pairs = options.isLoop\r\n ? Array.from({ length: n }, (_, i) => [i, (i + 1) % n])\r\n : Array.from({ length: Math.max(0, n - 1) }, (_, i) => [i, i + 1]);\r\n for (const [a, b] of pairs) {\r\n createShear(rootPoints[a], rootPoints[b], raw);\r\n }\r\n addRaw(raw, options.enableSurfaceCollision || options.collideShear);\r\n }\r\n\r\n if (options.structuralHorizontal) {\r\n const raw: RawConstraint[] = [];\r\n const pairs = options.isLoop\r\n ? Array.from({ length: n }, (_, i) => [i, (i + 1) % n])\r\n : Array.from({ length: Math.max(0, n - 1) }, (_, i) => [i, i + 1]);\r\n for (const [a, b] of pairs) {\r\n createHorizontal(rootPoints[a], rootPoints[b], ConstraintType.Structural_Horizontal, raw);\r\n }\r\n addRaw(raw, options.enableSurfaceCollision || options.collideStructuralHorizontal);\r\n }\r\n\r\n if (options.structuralVertical) {\r\n const raw: RawConstraint[] = [];\r\n for (const root of rootPoints) {\r\n createStructuralVertical(root, raw);\r\n }\r\n addRaw(raw, options.enableSurfaceCollision || options.collideStructuralVertical);\r\n }\r\n\r\n return groups.flat();\r\n}\r\n\r\n/**\r\n * Builds triangle indices used for surface collision.\r\n *\r\n * @public\r\n */\r\nexport function buildSurfaceFaces(rootPoints: BoneNode[], isLoop: boolean): number[] {\r\n const out: number[] = [];\r\n const n = rootPoints.length;\r\n for (let i = 0; i < n - 1; i++) {\r\n createSurfaceFaces(rootPoints[i], rootPoints[i + 1], out);\r\n }\r\n if (isLoop && n > 1) {\r\n createSurfaceFaces(rootPoints[n - 1], rootPoints[0], out);\r\n }\r\n return out;\r\n}\r\n\r\n/**\r\n * Computes the maximum chain depth among all root points.\r\n *\r\n * @public\r\n */\r\nexport function computeMaxDepth(rootPoints: BoneNode[]): number {\r\n let max = 0;\r\n function walk(node: BoneNode) {\r\n if (node.depth > max) {\r\n max = node.depth;\r\n }\r\n for (const c of node.children) {\r\n walk(c);\r\n }\r\n }\r\n for (const r of rootPoints) {\r\n walk(r);\r\n }\r\n return max;\r\n}\r\n\r\n/**\r\n * Sorts root points by proximity to the supplied reference position.\r\n *\r\n * @public\r\n */\r\nexport function sortRootPointsByProximity(\r\n roots: BoneNode[],\r\n ignoreY: boolean,\r\n fixedBeginEnd: boolean\r\n): BoneNode[] {\r\n if (roots.length <= 2) {\r\n return [...roots];\r\n }\r\n const sorted: BoneNode[] = [];\r\n const remaining = [...roots];\r\n\r\n if (fixedBeginEnd) {\r\n sorted.push(remaining.shift()!);\r\n const last = remaining.pop()!;\r\n while (remaining.length > 0) {\r\n const cur = sorted[sorted.length - 1];\r\n let bestIdx = 0,\r\n bestDist = Infinity;\r\n for (let i = 0; i < remaining.length; i++) {\r\n const d = distXYZ(cur.position, remaining[i].position, ignoreY);\r\n if (d < bestDist) {\r\n bestDist = d;\r\n bestIdx = i;\r\n }\r\n }\r\n sorted.push(remaining.splice(bestIdx, 1)[0]);\r\n }\r\n sorted.push(last);\r\n } else {\r\n sorted.push(remaining.shift()!);\r\n while (remaining.length > 0) {\r\n const cur = sorted[sorted.length - 1];\r\n let bestIdx = 0,\r\n bestDist = Infinity;\r\n for (let i = 0; i < remaining.length; i++) {\r\n const d = distXYZ(cur.position, remaining[i].position, ignoreY);\r\n if (d < bestDist) {\r\n bestDist = d;\r\n bestIdx = i;\r\n }\r\n }\r\n sorted.push(remaining.splice(bestIdx, 1)[0]);\r\n }\r\n }\r\n return sorted;\r\n}\r\n\r\nfunction distXYZ(a: Vector3, b: Vector3, ignoreY: boolean): number {\r\n const dx = a.x - b.x,\r\n dz = a.z - b.z;\r\n const dy = ignoreY ? 0 : a.y - b.y;\r\n return dx * dx + dy * dy + dz * dz;\r\n}\r\n\r\nfunction isBoneFixed(roots: BoneNode[], index: number): boolean {\r\n function find(node: BoneNode): boolean {\r\n if (node.index === index) {\r\n return node.isFixed;\r\n }\r\n for (const c of node.children) {\r\n const r = find(c);\r\n if (r !== undefined) {\r\n return r;\r\n }\r\n }\r\n return false;\r\n }\r\n for (const r of roots) {\r\n const res = find(r);\r\n if (res) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n}\r\n"],"names":["getFirstChild","node","children","length","constraintLength","a","b","Vector3","distance","position","createStructuralVertical","out","child","push","type","ConstraintType","Structural_Vertical","indexA","index","indexB","createHorizontal","childA","childB","createShear","cA","cB","cA2","cB2","cA3","cB3","target1","Shear","target2","createBendingVertical","Bending_Vertical","findSameIndex","group","c","g","pushToGroups","groups","createSurfaceFaces","useForSurfaceCollision","buildConstraints","rootPoints","options","n","addRaw","raws","collide","r","bothFixed","isBoneFixed","isCollision","bendingHorizontal","raw","pairs","isLoop","Array","from","_","i","Math","max","Bending_Horizontal","bendingVertical","root","shear","enableSurfaceCollision","collideShear","structuralHorizontal","Structural_Horizontal","collideStructuralHorizontal","structuralVertical","collideStructuralVertical","flat","buildSurfaceFaces","computeMaxDepth","walk","depth","sortRootPointsByProximity","roots","ignoreY","fixedBeginEnd","sorted","remaining","shift","last","pop","cur","bestIdx","bestDist","Infinity","d","distXYZ","splice","dx","x","dz","z","dy","y","find","isFixed","undefined","res"],"mappings":"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"}
|