@zephyr3d/scene 0.9.4 → 0.9.5

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.
Files changed (102) hide show
  1. package/dist/animation/animationmask.js +224 -0
  2. package/dist/animation/animationmask.js.map +1 -0
  3. package/dist/animation/animationset.js +268 -67
  4. package/dist/animation/animationset.js.map +1 -1
  5. package/dist/animation/animationtrack.js.map +1 -1
  6. package/dist/animation/eulerrotationtrack.js +3 -0
  7. package/dist/animation/eulerrotationtrack.js.map +1 -1
  8. package/dist/animation/fixed_geometry_cache_track.js +7 -0
  9. package/dist/animation/fixed_geometry_cache_track.js.map +1 -1
  10. package/dist/animation/ik_modifier.js.map +1 -1
  11. package/dist/animation/joint_dynamics/collision.js +6 -4
  12. package/dist/animation/joint_dynamics/collision.js.map +1 -1
  13. package/dist/animation/joint_dynamics/controller.js +390 -43
  14. package/dist/animation/joint_dynamics/controller.js.map +1 -1
  15. package/dist/animation/joint_dynamics/joint_dynamics_system.js +62 -3
  16. package/dist/animation/joint_dynamics/joint_dynamics_system.js.map +1 -1
  17. package/dist/animation/joint_dynamics/solver.js +4 -3
  18. package/dist/animation/joint_dynamics/solver.js.map +1 -1
  19. package/dist/animation/joint_dynamics/types.js.map +1 -1
  20. package/dist/animation/joint_dynamics_modifier.js +2 -0
  21. package/dist/animation/joint_dynamics_modifier.js.map +1 -1
  22. package/dist/animation/morphtarget.js +3 -72
  23. package/dist/animation/morphtarget.js.map +1 -1
  24. package/dist/animation/morphtrack.js +3 -0
  25. package/dist/animation/morphtrack.js.map +1 -1
  26. package/dist/animation/pca_geometry_cache_track.js +3 -0
  27. package/dist/animation/pca_geometry_cache_track.js.map +1 -1
  28. package/dist/animation/proptrack.js +3 -0
  29. package/dist/animation/proptrack.js.map +1 -1
  30. package/dist/animation/rotationtrack.js +3 -0
  31. package/dist/animation/rotationtrack.js.map +1 -1
  32. package/dist/animation/scaletrack.js +3 -0
  33. package/dist/animation/scaletrack.js.map +1 -1
  34. package/dist/animation/skeleton.js +254 -79
  35. package/dist/animation/skeleton.js.map +1 -1
  36. package/dist/animation/skeleton_modifier.js.map +1 -1
  37. package/dist/animation/spring_modifier.js.map +1 -1
  38. package/dist/animation/translationtrack.js +3 -0
  39. package/dist/animation/translationtrack.js.map +1 -1
  40. package/dist/app/engine.js +171 -107
  41. package/dist/app/engine.js.map +1 -1
  42. package/dist/app/scriptregistry.js +251 -80
  43. package/dist/app/scriptregistry.js.map +1 -1
  44. package/dist/asset/assetmanager.js +344 -365
  45. package/dist/asset/assetmanager.js.map +1 -1
  46. package/dist/asset/loaders/gltf/gltf_loader.js +17 -14
  47. package/dist/asset/loaders/gltf/gltf_loader.js.map +1 -1
  48. package/dist/asset/loaders/loader.js +1 -6
  49. package/dist/asset/loaders/loader.js.map +1 -1
  50. package/dist/asset/loaders/zabc/zabc_loader.js.map +1 -1
  51. package/dist/asset/model.js +1000 -131
  52. package/dist/asset/model.js.map +1 -1
  53. package/dist/avatar/wardrobe.js +474 -0
  54. package/dist/avatar/wardrobe.js.map +1 -0
  55. package/dist/index.d.ts +1125 -199
  56. package/dist/index.js +3 -2
  57. package/dist/index.js.map +1 -1
  58. package/dist/material/mixins/lightmodel/pbrmetallicroughness.js +6 -3
  59. package/dist/material/mixins/lightmodel/pbrmetallicroughness.js.map +1 -1
  60. package/dist/material/mixins/pbr/common.js +72 -15
  61. package/dist/material/mixins/pbr/common.js.map +1 -1
  62. package/dist/material/msdf_text_sprite.js +4 -4
  63. package/dist/material/msdf_text_sprite.js.map +1 -1
  64. package/dist/material/pbrblueprint.js +102 -102
  65. package/dist/material/pbrblueprint.js.map +1 -1
  66. package/dist/render/envlight.js +54 -1
  67. package/dist/render/envlight.js.map +1 -1
  68. package/dist/render/sky.js +9 -0
  69. package/dist/render/sky.js.map +1 -1
  70. package/dist/scene/batchgroup.js +11 -13
  71. package/dist/scene/batchgroup.js.map +1 -1
  72. package/dist/scene/environment.js +15 -2
  73. package/dist/scene/environment.js.map +1 -1
  74. package/dist/scene/mesh.js +79 -16
  75. package/dist/scene/mesh.js.map +1 -1
  76. package/dist/scene/scene.js +1 -0
  77. package/dist/scene/scene.js.map +1 -1
  78. package/dist/scene/scene_node.js +203 -2
  79. package/dist/scene/scene_node.js.map +1 -1
  80. package/dist/text/font/font_asset.js.map +1 -1
  81. package/dist/text/msdf/generator.js.map +1 -1
  82. package/dist/text/msdf/shape.js +4 -1
  83. package/dist/text/msdf/shape.js.map +1 -1
  84. package/dist/text/runtime/msdf_text_atlas_manager.js +4 -1
  85. package/dist/text/runtime/msdf_text_atlas_manager.js.map +1 -1
  86. package/dist/utility/blueprint/material/inputs.js +1157 -1154
  87. package/dist/utility/blueprint/material/inputs.js.map +1 -1
  88. package/dist/utility/bounding_volume.js.map +1 -1
  89. package/dist/utility/pmrem.js +34 -8
  90. package/dist/utility/pmrem.js.map +1 -1
  91. package/dist/utility/serialization/manager.js +22 -9
  92. package/dist/utility/serialization/manager.js.map +1 -1
  93. package/dist/utility/serialization/scene/animation.js +700 -7
  94. package/dist/utility/serialization/scene/animation.js.map +1 -1
  95. package/dist/utility/serialization/scene/mesh.js +64 -4
  96. package/dist/utility/serialization/scene/mesh.js.map +1 -1
  97. package/dist/utility/serialization/scene/node.js +187 -8
  98. package/dist/utility/serialization/scene/node.js.map +1 -1
  99. package/dist/utility/serialization/types.js.map +1 -1
  100. package/dist/utility/textures/sheenlut.js +138 -0
  101. package/dist/utility/textures/sheenlut.js.map +1 -0
  102. package/package.json +2 -2
@@ -1 +1 @@
1
- {"version":3,"file":"fixed_geometry_cache_track.js","sources":["../../src/animation/fixed_geometry_cache_track.ts"],"sourcesContent":["import { AnimationTrack } from './animationtrack';\r\nimport type { Mesh } from '../scene';\r\nimport type { Nullable } from '@zephyr3d/base';\r\nimport {\r\n createGeometryCacheState,\r\n ensureGeometryCacheMeshBinding,\r\n mixGeometryCacheBoundingBox,\r\n type GeometryCacheFrame,\r\n type GeometryCacheMeshBinding,\r\n type GeometryCacheState\r\n} from './geometry_cache_utils';\r\n\r\n/** @public */\r\nexport type FixedGeometryCacheFrame = GeometryCacheFrame;\r\n/** @public */\r\nexport type FixedGeometryCacheState = GeometryCacheState;\r\n\r\n/**\r\n * Geometry cache track backed by explicit per-frame vertex data.\r\n *\r\n * @public\r\n */\r\nexport class FixedGeometryCacheTrack extends AnimationTrack<FixedGeometryCacheState> {\r\n private _times: Float32Array;\r\n private _frames: FixedGeometryCacheFrame[];\r\n private _state: Nullable<FixedGeometryCacheState>;\r\n private readonly _meshBindings: WeakMap<Mesh, GeometryCacheMeshBinding>;\r\n\r\n constructor(times?: Float32Array, frames?: FixedGeometryCacheFrame[], embedded?: boolean) {\r\n super(embedded);\r\n this._times = times ?? new Float32Array();\r\n this._frames = frames ?? [];\r\n this._state = this._frames.length > 0 ? createGeometryCacheState(this._frames[0]) : null;\r\n this._meshBindings = new WeakMap();\r\n }\r\n\r\n get times() {\r\n return this._times;\r\n }\r\n\r\n set times(value: Float32Array) {\r\n this._times = value ?? new Float32Array();\r\n }\r\n\r\n get frames() {\r\n return this._frames;\r\n }\r\n\r\n set frames(value: FixedGeometryCacheFrame[]) {\r\n this._frames = value ?? [];\r\n this._state = this._frames.length > 0 ? createGeometryCacheState(this._frames[0]) : null;\r\n }\r\n\r\n calculateState(_target: object, currentTime: number) {\r\n if (this._frames.length === 0) {\r\n throw new Error('FixedGeometryCacheTrack.calculateState(): no frames available');\r\n }\r\n if (this._frames.length === 1 || this._times.length <= 1) {\r\n return this.copyFrameToState(this._frames[0]);\r\n }\r\n if (currentTime <= this._times[0]) {\r\n return this.copyFrameToState(this._frames[0]);\r\n }\r\n const lastIndex = this._times.length - 1;\r\n if (currentTime >= this._times[lastIndex]) {\r\n return this.copyFrameToState(this._frames[lastIndex]);\r\n }\r\n let right = 1;\r\n while (right < this._times.length && this._times[right] < currentTime) {\r\n right++;\r\n }\r\n const left = Math.max(0, right - 1);\r\n const start = this._times[left];\r\n const end = this._times[right];\r\n const t = end > start ? (currentTime - start) / (end - start) : 0;\r\n return this.interpolateFrames(this._frames[left], this._frames[right], t);\r\n }\r\n\r\n applyState(target: object, state: FixedGeometryCacheState) {\r\n const mesh = target as Mesh;\r\n const binding = this.ensureMeshBinding(mesh, state);\r\n binding.positionBuffer.bufferSubData(0, state.positions as unknown as Float32Array<ArrayBuffer>);\r\n if (binding.normalBuffer && state.normals) {\r\n binding.normalBuffer.bufferSubData(0, state.normals as unknown as Float32Array<ArrayBuffer>);\r\n }\r\n mesh.setAnimatedBoundingBox(state.boundingBox);\r\n }\r\n\r\n mixState(a: FixedGeometryCacheState, b: FixedGeometryCacheState, t: number) {\r\n if (!this._state) {\r\n throw new Error('FixedGeometryCacheTrack.mixState(): invalid state');\r\n }\r\n const positions = new Float32Array(a.positions.length);\r\n for (let i = 0; i < positions.length; i++) {\r\n positions[i] = a.positions[i] + (b.positions[i] - a.positions[i]) * t;\r\n }\r\n let normals: Nullable<Float32Array> = null;\r\n if (a.normals && b.normals && a.normals.length === b.normals.length) {\r\n normals = new Float32Array(a.normals.length);\r\n for (let i = 0; i < normals.length; i++) {\r\n normals[i] = a.normals[i] + (b.normals[i] - a.normals[i]) * t;\r\n }\r\n }\r\n return {\r\n positions,\r\n normals,\r\n boundingBox: mixGeometryCacheBoundingBox(a.boundingBox, b.boundingBox, t)\r\n };\r\n }\r\n\r\n getBlendId() {\r\n return 'fixed-geometry-cache';\r\n }\r\n\r\n getDuration() {\r\n return this._times.length > 0 ? this._times[this._times.length - 1] : 0;\r\n }\r\n\r\n reset(target: object) {\r\n if (this._frames.length > 0) {\r\n this.applyState(target, this.copyFrameToState(this._frames[0]));\r\n }\r\n }\r\n\r\n private copyFrameToState(frame: FixedGeometryCacheFrame) {\r\n if (!this._state) {\r\n this._state = createGeometryCacheState(frame);\r\n }\r\n this._state.positions.set(frame.positions);\r\n if (frame.normals) {\r\n if (!this._state.normals || this._state.normals.length !== frame.normals.length) {\r\n this._state.normals = new Float32Array(frame.normals.length);\r\n }\r\n this._state.normals.set(frame.normals);\r\n } else {\r\n this._state.normals = null;\r\n }\r\n this._state.boundingBox.minPoint.set(frame.boundingBox.minPoint);\r\n this._state.boundingBox.maxPoint.set(frame.boundingBox.maxPoint);\r\n return this._state;\r\n }\r\n\r\n private interpolateFrames(a: FixedGeometryCacheFrame, b: FixedGeometryCacheFrame, t: number) {\r\n if (!this._state) {\r\n this._state = createGeometryCacheState(a);\r\n }\r\n for (let i = 0; i < this._state.positions.length; i++) {\r\n this._state.positions[i] = a.positions[i] + (b.positions[i] - a.positions[i]) * t;\r\n }\r\n if (a.normals && b.normals && a.normals.length === b.normals.length) {\r\n if (!this._state.normals || this._state.normals.length !== a.normals.length) {\r\n this._state.normals = new Float32Array(a.normals.length);\r\n }\r\n for (let i = 0; i < this._state.normals.length; i++) {\r\n this._state.normals[i] = a.normals[i] + (b.normals[i] - a.normals[i]) * t;\r\n }\r\n } else {\r\n this._state.normals = null;\r\n }\r\n this._state.boundingBox.minPoint.setXYZ(\r\n a.boundingBox.minPoint.x + (b.boundingBox.minPoint.x - a.boundingBox.minPoint.x) * t,\r\n a.boundingBox.minPoint.y + (b.boundingBox.minPoint.y - a.boundingBox.minPoint.y) * t,\r\n a.boundingBox.minPoint.z + (b.boundingBox.minPoint.z - a.boundingBox.minPoint.z) * t\r\n );\r\n this._state.boundingBox.maxPoint.setXYZ(\r\n a.boundingBox.maxPoint.x + (b.boundingBox.maxPoint.x - a.boundingBox.maxPoint.x) * t,\r\n a.boundingBox.maxPoint.y + (b.boundingBox.maxPoint.y - a.boundingBox.maxPoint.y) * t,\r\n a.boundingBox.maxPoint.z + (b.boundingBox.maxPoint.z - a.boundingBox.maxPoint.z) * t\r\n );\r\n return this._state;\r\n }\r\n\r\n private ensureMeshBinding(mesh: Mesh, state: FixedGeometryCacheState) {\r\n return ensureGeometryCacheMeshBinding(\r\n this._meshBindings,\r\n mesh,\r\n state,\r\n 'FixedGeometryCacheTrack.applyState()'\r\n );\r\n }\r\n}\r\n"],"names":["FixedGeometryCacheTrack","AnimationTrack","_times","_frames","_state","_meshBindings","times","frames","embedded","Float32Array","length","createGeometryCacheState","WeakMap","value","calculateState","_target","currentTime","Error","copyFrameToState","lastIndex","right","left","Math","max","start","end","t","interpolateFrames","applyState","target","state","mesh","binding","ensureMeshBinding","positionBuffer","bufferSubData","positions","normalBuffer","normals","setAnimatedBoundingBox","boundingBox","mixState","a","b","i","mixGeometryCacheBoundingBox","getBlendId","getDuration","reset","frame","set","minPoint","maxPoint","setXYZ","x","y","z","ensureGeometryCacheMeshBinding"],"mappings":"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"}
1
+ {"version":3,"file":"fixed_geometry_cache_track.js","sources":["../../src/animation/fixed_geometry_cache_track.ts"],"sourcesContent":["import { AnimationTrack } from './animationtrack';\r\nimport type { Mesh } from '../scene';\r\nimport type { Nullable } from '@zephyr3d/base';\r\nimport {\r\n createGeometryCacheState,\r\n ensureGeometryCacheMeshBinding,\r\n mixGeometryCacheBoundingBox,\r\n type GeometryCacheFrame,\r\n type GeometryCacheMeshBinding,\r\n type GeometryCacheState\r\n} from './geometry_cache_utils';\r\n\r\n/** @public */\r\nexport type FixedGeometryCacheFrame = GeometryCacheFrame;\r\n/** @public */\r\nexport type FixedGeometryCacheState = GeometryCacheState;\r\n\r\n/**\r\n * Geometry cache track backed by explicit per-frame vertex data.\r\n *\r\n * @public\r\n */\r\nexport class FixedGeometryCacheTrack extends AnimationTrack<FixedGeometryCacheState> {\r\n private _times: Float32Array;\r\n private _frames: FixedGeometryCacheFrame[];\r\n private _state: Nullable<FixedGeometryCacheState>;\r\n private readonly _meshBindings: WeakMap<Mesh, GeometryCacheMeshBinding>;\r\n\r\n constructor(times?: Float32Array, frames?: FixedGeometryCacheFrame[], embedded?: boolean) {\r\n super(embedded);\r\n this._times = times ?? new Float32Array();\r\n this._frames = frames ?? [];\r\n this._state = this._frames.length > 0 ? createGeometryCacheState(this._frames[0]) : null;\r\n this._meshBindings = new WeakMap();\r\n }\r\n\r\n clone(): this {\r\n return new FixedGeometryCacheTrack(\r\n this._times.slice(),\r\n this._frames.map((frame) => ({\r\n positions: frame.positions.slice(),\r\n normals: frame.normals?.slice() ?? null,\r\n boundingBox: frame.boundingBox.clone()\r\n })),\r\n false\r\n ) as this;\r\n }\r\n\r\n get times() {\r\n return this._times;\r\n }\r\n\r\n set times(value: Float32Array) {\r\n this._times = value ?? new Float32Array();\r\n }\r\n\r\n get frames() {\r\n return this._frames;\r\n }\r\n\r\n set frames(value: FixedGeometryCacheFrame[]) {\r\n this._frames = value ?? [];\r\n this._state = this._frames.length > 0 ? createGeometryCacheState(this._frames[0]) : null;\r\n }\r\n\r\n calculateState(_target: object, currentTime: number) {\r\n if (this._frames.length === 0) {\r\n throw new Error('FixedGeometryCacheTrack.calculateState(): no frames available');\r\n }\r\n if (this._frames.length === 1 || this._times.length <= 1) {\r\n return this.copyFrameToState(this._frames[0]);\r\n }\r\n if (currentTime <= this._times[0]) {\r\n return this.copyFrameToState(this._frames[0]);\r\n }\r\n const lastIndex = this._times.length - 1;\r\n if (currentTime >= this._times[lastIndex]) {\r\n return this.copyFrameToState(this._frames[lastIndex]);\r\n }\r\n let right = 1;\r\n while (right < this._times.length && this._times[right] < currentTime) {\r\n right++;\r\n }\r\n const left = Math.max(0, right - 1);\r\n const start = this._times[left];\r\n const end = this._times[right];\r\n const t = end > start ? (currentTime - start) / (end - start) : 0;\r\n return this.interpolateFrames(this._frames[left], this._frames[right], t);\r\n }\r\n\r\n applyState(target: object, state: FixedGeometryCacheState) {\r\n const mesh = target as Mesh;\r\n const binding = this.ensureMeshBinding(mesh, state);\r\n binding.positionBuffer.bufferSubData(0, state.positions as unknown as Float32Array<ArrayBuffer>);\r\n if (binding.normalBuffer && state.normals) {\r\n binding.normalBuffer.bufferSubData(0, state.normals as unknown as Float32Array<ArrayBuffer>);\r\n }\r\n mesh.setAnimatedBoundingBox(state.boundingBox);\r\n }\r\n\r\n mixState(a: FixedGeometryCacheState, b: FixedGeometryCacheState, t: number) {\r\n if (!this._state) {\r\n throw new Error('FixedGeometryCacheTrack.mixState(): invalid state');\r\n }\r\n const positions = new Float32Array(a.positions.length);\r\n for (let i = 0; i < positions.length; i++) {\r\n positions[i] = a.positions[i] + (b.positions[i] - a.positions[i]) * t;\r\n }\r\n let normals: Nullable<Float32Array> = null;\r\n if (a.normals && b.normals && a.normals.length === b.normals.length) {\r\n normals = new Float32Array(a.normals.length);\r\n for (let i = 0; i < normals.length; i++) {\r\n normals[i] = a.normals[i] + (b.normals[i] - a.normals[i]) * t;\r\n }\r\n }\r\n return {\r\n positions,\r\n normals,\r\n boundingBox: mixGeometryCacheBoundingBox(a.boundingBox, b.boundingBox, t)\r\n };\r\n }\r\n\r\n getBlendId() {\r\n return 'fixed-geometry-cache';\r\n }\r\n\r\n getDuration() {\r\n return this._times.length > 0 ? this._times[this._times.length - 1] : 0;\r\n }\r\n\r\n reset(target: object) {\r\n if (this._frames.length > 0) {\r\n this.applyState(target, this.copyFrameToState(this._frames[0]));\r\n }\r\n }\r\n\r\n private copyFrameToState(frame: FixedGeometryCacheFrame) {\r\n if (!this._state) {\r\n this._state = createGeometryCacheState(frame);\r\n }\r\n this._state.positions.set(frame.positions);\r\n if (frame.normals) {\r\n if (!this._state.normals || this._state.normals.length !== frame.normals.length) {\r\n this._state.normals = new Float32Array(frame.normals.length);\r\n }\r\n this._state.normals.set(frame.normals);\r\n } else {\r\n this._state.normals = null;\r\n }\r\n this._state.boundingBox.minPoint.set(frame.boundingBox.minPoint);\r\n this._state.boundingBox.maxPoint.set(frame.boundingBox.maxPoint);\r\n return this._state;\r\n }\r\n\r\n private interpolateFrames(a: FixedGeometryCacheFrame, b: FixedGeometryCacheFrame, t: number) {\r\n if (!this._state) {\r\n this._state = createGeometryCacheState(a);\r\n }\r\n for (let i = 0; i < this._state.positions.length; i++) {\r\n this._state.positions[i] = a.positions[i] + (b.positions[i] - a.positions[i]) * t;\r\n }\r\n if (a.normals && b.normals && a.normals.length === b.normals.length) {\r\n if (!this._state.normals || this._state.normals.length !== a.normals.length) {\r\n this._state.normals = new Float32Array(a.normals.length);\r\n }\r\n for (let i = 0; i < this._state.normals.length; i++) {\r\n this._state.normals[i] = a.normals[i] + (b.normals[i] - a.normals[i]) * t;\r\n }\r\n } else {\r\n this._state.normals = null;\r\n }\r\n this._state.boundingBox.minPoint.setXYZ(\r\n a.boundingBox.minPoint.x + (b.boundingBox.minPoint.x - a.boundingBox.minPoint.x) * t,\r\n a.boundingBox.minPoint.y + (b.boundingBox.minPoint.y - a.boundingBox.minPoint.y) * t,\r\n a.boundingBox.minPoint.z + (b.boundingBox.minPoint.z - a.boundingBox.minPoint.z) * t\r\n );\r\n this._state.boundingBox.maxPoint.setXYZ(\r\n a.boundingBox.maxPoint.x + (b.boundingBox.maxPoint.x - a.boundingBox.maxPoint.x) * t,\r\n a.boundingBox.maxPoint.y + (b.boundingBox.maxPoint.y - a.boundingBox.maxPoint.y) * t,\r\n a.boundingBox.maxPoint.z + (b.boundingBox.maxPoint.z - a.boundingBox.maxPoint.z) * t\r\n );\r\n return this._state;\r\n }\r\n\r\n private ensureMeshBinding(mesh: Mesh, state: FixedGeometryCacheState) {\r\n return ensureGeometryCacheMeshBinding(\r\n this._meshBindings,\r\n mesh,\r\n state,\r\n 'FixedGeometryCacheTrack.applyState()'\r\n );\r\n }\r\n}\r\n"],"names":["FixedGeometryCacheTrack","AnimationTrack","_times","_frames","_state","_meshBindings","times","frames","embedded","Float32Array","length","createGeometryCacheState","WeakMap","clone","slice","map","frame","positions","normals","boundingBox","value","calculateState","_target","currentTime","Error","copyFrameToState","lastIndex","right","left","Math","max","start","end","t","interpolateFrames","applyState","target","state","mesh","binding","ensureMeshBinding","positionBuffer","bufferSubData","normalBuffer","setAnimatedBoundingBox","mixState","a","b","i","mixGeometryCacheBoundingBox","getBlendId","getDuration","reset","set","minPoint","maxPoint","setXYZ","x","y","z","ensureGeometryCacheMeshBinding"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"ik_modifier.js","sources":["../../src/animation/ik_modifier.ts"],"sourcesContent":["import { SkeletonModifier } from './skeleton_modifier';\r\nimport type { Skeleton } from './skeleton';\r\nimport type { IKSolver } from './ik/ik_solver';\r\nimport type { Vector3 } from '@zephyr3d/base';\r\n\r\n/**\r\n * Skeleton modifier for IK solvers.\r\n *\r\n * Integrates IK solving into the skeleton post-processing pipeline.\r\n * The IK solver is executed each frame and results are blended with the base animation.\r\n *\r\n * @public\r\n */\r\nexport class IKModifier<Solver extends IKSolver = IKSolver> extends SkeletonModifier {\r\n private _solver: Solver;\r\n private _target: Vector3;\r\n private _weight: number;\r\n\r\n /**\r\n * Create an IK post-processor.\r\n *\r\n * @param solver - The IK solver to integrate\r\n * @param target - Target position for the end effector\r\n * @param weight - Blend weight [0-1] (default: 1.0)\r\n */\r\n constructor(solver: Solver, target: Vector3, weight: number = 1.0) {\r\n super();\r\n this._weight = weight;\r\n this._solver = solver;\r\n this._target = target.clone();\r\n }\r\n\r\n /**\r\n * Get the IK solver.\r\n */\r\n get solver(): Solver {\r\n return this._solver;\r\n }\r\n\r\n /**\r\n * Get the current target position.\r\n */\r\n get target(): Vector3 {\r\n return this._target.clone();\r\n }\r\n\r\n /**\r\n * Set the target position for the end effector.\r\n *\r\n * @param target - New target position (will be cloned)\r\n */\r\n setTarget(target: Vector3): void {\r\n this._target.set(target);\r\n }\r\n\r\n /**\r\n * Apply IK solving to skeleton joints.\r\n */\r\n apply(_skeleton: Skeleton, _deltaTime: number): void {\r\n if (!this._enabled || this._weight <= 0) {\r\n return;\r\n }\r\n\r\n // Solve IK\r\n this._solver.solve(this._target);\r\n\r\n // Apply to nodes with blending\r\n this._solver.applyToNodes(this._weight);\r\n }\r\n\r\n /**\r\n * Reset the IK solver to initial state.\r\n */\r\n reset(): void {\r\n // IK solvers typically don't need explicit reset\r\n // as they solve based on current joint positions\r\n }\r\n\r\n protected _getWeight(): number {\r\n return this._weight;\r\n }\r\n\r\n protected _setWeight(value: number): void {\r\n this._weight = Math.max(0, Math.min(1, value));\r\n }\r\n}\r\n"],"names":["IKModifier","SkeletonModifier","_solver","_target","_weight","solver","target","weight","clone","setTarget","set","apply","_skeleton","_deltaTime","_enabled","solve","applyToNodes","reset","_getWeight","_setWeight","value","Math","max","min"],"mappings":";;AAKA;;;;;;;IAQO,MAAMA,UAAuDC,SAAAA,gBAAAA,CAAAA;IAC1DC,OAAgB;IAChBC,OAAiB;IACjBC,OAAgB;AAExB;;;;;;AAMC,MACD,YAAYC,MAAc,EAAEC,MAAe,EAAEC,MAAAA,GAAiB,GAAG,CAAE;QACjE,KAAK,EAAA;QACL,IAAI,CAACH,OAAO,GAAGG,MAAAA;QACf,IAAI,CAACL,OAAO,GAAGG,MAAAA;AACf,QAAA,IAAI,CAACF,OAAO,GAAGG,MAAAA,CAAOE,KAAK,EAAA;AAC7B;AAEA;;AAEC,MACD,IAAIH,MAAiB,GAAA;QACnB,OAAO,IAAI,CAACH,OAAO;AACrB;AAEA;;AAEC,MACD,IAAII,MAAkB,GAAA;AACpB,QAAA,OAAO,IAAI,CAACH,OAAO,CAACK,KAAK,EAAA;AAC3B;AAEA;;;;MAKAC,SAAAA,CAAUH,MAAe,EAAQ;AAC/B,QAAA,IAAI,CAACH,OAAO,CAACO,GAAG,CAACJ,MAAAA,CAAAA;AACnB;AAEA;;AAEC,MACDK,KAAMC,CAAAA,SAAmB,EAAEC,UAAkB,EAAQ;QACnD,IAAI,CAAC,IAAI,CAACC,QAAQ,IAAI,IAAI,CAACV,OAAO,IAAI,CAAG,EAAA;AACvC,YAAA;AACF;;AAGA,QAAA,IAAI,CAACF,OAAO,CAACa,KAAK,CAAC,IAAI,CAACZ,OAAO,CAAA;;AAG/B,QAAA,IAAI,CAACD,OAAO,CAACc,YAAY,CAAC,IAAI,CAACZ,OAAO,CAAA;AACxC;AAEA;;AAEC,MACDa,KAAc,GAAA;;;AAGd;IAEUC,UAAqB,GAAA;QAC7B,OAAO,IAAI,CAACd,OAAO;AACrB;AAEUe,IAAAA,UAAAA,CAAWC,KAAa,EAAQ;QACxC,IAAI,CAAChB,OAAO,GAAGiB,IAAKC,CAAAA,GAAG,CAAC,CAAGD,EAAAA,IAAAA,CAAKE,GAAG,CAAC,CAAGH,EAAAA,KAAAA,CAAAA,CAAAA;AACzC;AACF;;;;"}
1
+ {"version":3,"file":"ik_modifier.js","sources":["../../src/animation/ik_modifier.ts"],"sourcesContent":["import { SkeletonModifier } from './skeleton_modifier';\r\nimport type { SkeletonRig } from './skeleton';\r\nimport type { IKSolver } from './ik/ik_solver';\r\nimport type { Vector3 } from '@zephyr3d/base';\r\n\r\n/**\r\n * Skeleton modifier for IK solvers.\r\n *\r\n * Integrates IK solving into the skeleton post-processing pipeline.\r\n * The IK solver is executed each frame and results are blended with the base animation.\r\n *\r\n * @public\r\n */\r\nexport class IKModifier<Solver extends IKSolver = IKSolver> extends SkeletonModifier {\r\n private _solver: Solver;\r\n private _target: Vector3;\r\n private _weight: number;\r\n\r\n /**\r\n * Create an IK post-processor.\r\n *\r\n * @param solver - The IK solver to integrate\r\n * @param target - Target position for the end effector\r\n * @param weight - Blend weight [0-1] (default: 1.0)\r\n */\r\n constructor(solver: Solver, target: Vector3, weight: number = 1.0) {\r\n super();\r\n this._weight = weight;\r\n this._solver = solver;\r\n this._target = target.clone();\r\n }\r\n\r\n /**\r\n * Get the IK solver.\r\n */\r\n get solver(): Solver {\r\n return this._solver;\r\n }\r\n\r\n /**\r\n * Get the current target position.\r\n */\r\n get target(): Vector3 {\r\n return this._target.clone();\r\n }\r\n\r\n /**\r\n * Set the target position for the end effector.\r\n *\r\n * @param target - New target position (will be cloned)\r\n */\r\n setTarget(target: Vector3): void {\r\n this._target.set(target);\r\n }\r\n\r\n /**\r\n * Apply IK solving to skeleton joints.\r\n */\r\n apply(_skeleton: SkeletonRig, _deltaTime: number): void {\r\n if (!this._enabled || this._weight <= 0) {\r\n return;\r\n }\r\n\r\n // Solve IK\r\n this._solver.solve(this._target);\r\n\r\n // Apply to nodes with blending\r\n this._solver.applyToNodes(this._weight);\r\n }\r\n\r\n /**\r\n * Reset the IK solver to initial state.\r\n */\r\n reset(): void {\r\n // IK solvers typically don't need explicit reset\r\n // as they solve based on current joint positions\r\n }\r\n\r\n protected _getWeight(): number {\r\n return this._weight;\r\n }\r\n\r\n protected _setWeight(value: number): void {\r\n this._weight = Math.max(0, Math.min(1, value));\r\n }\r\n}\r\n"],"names":["IKModifier","SkeletonModifier","_solver","_target","_weight","solver","target","weight","clone","setTarget","set","apply","_skeleton","_deltaTime","_enabled","solve","applyToNodes","reset","_getWeight","_setWeight","value","Math","max","min"],"mappings":";;AAKA;;;;;;;IAQO,MAAMA,UAAuDC,SAAAA,gBAAAA,CAAAA;IAC1DC,OAAgB;IAChBC,OAAiB;IACjBC,OAAgB;AAExB;;;;;;AAMC,MACD,YAAYC,MAAc,EAAEC,MAAe,EAAEC,MAAAA,GAAiB,GAAG,CAAE;QACjE,KAAK,EAAA;QACL,IAAI,CAACH,OAAO,GAAGG,MAAAA;QACf,IAAI,CAACL,OAAO,GAAGG,MAAAA;AACf,QAAA,IAAI,CAACF,OAAO,GAAGG,MAAAA,CAAOE,KAAK,EAAA;AAC7B;AAEA;;AAEC,MACD,IAAIH,MAAiB,GAAA;QACnB,OAAO,IAAI,CAACH,OAAO;AACrB;AAEA;;AAEC,MACD,IAAII,MAAkB,GAAA;AACpB,QAAA,OAAO,IAAI,CAACH,OAAO,CAACK,KAAK,EAAA;AAC3B;AAEA;;;;MAKAC,SAAAA,CAAUH,MAAe,EAAQ;AAC/B,QAAA,IAAI,CAACH,OAAO,CAACO,GAAG,CAACJ,MAAAA,CAAAA;AACnB;AAEA;;AAEC,MACDK,KAAMC,CAAAA,SAAsB,EAAEC,UAAkB,EAAQ;QACtD,IAAI,CAAC,IAAI,CAACC,QAAQ,IAAI,IAAI,CAACV,OAAO,IAAI,CAAG,EAAA;AACvC,YAAA;AACF;;AAGA,QAAA,IAAI,CAACF,OAAO,CAACa,KAAK,CAAC,IAAI,CAACZ,OAAO,CAAA;;AAG/B,QAAA,IAAI,CAACD,OAAO,CAACc,YAAY,CAAC,IAAI,CAACZ,OAAO,CAAA;AACxC;AAEA;;AAEC,MACDa,KAAc,GAAA;;;AAGd;IAEUC,UAAqB,GAAA;QAC7B,OAAO,IAAI,CAACd,OAAO;AACrB;AAEUe,IAAAA,UAAAA,CAAWC,KAAa,EAAQ;QACxC,IAAI,CAAChB,OAAO,GAAGiB,IAAKC,CAAAA,GAAG,CAAC,CAAGD,EAAAA,IAAAA,CAAKE,GAAG,CAAC,CAAGH,EAAAA,KAAAA,CAAAA,CAAAA;AACzC;AACF;;;;"}
@@ -195,6 +195,7 @@ function writeNearestPointsResult(out, tP, tQ, pointOnP, pointOnQ, sqrDistance,
195
195
  * @public
196
196
  */ function pushoutFromCapsule(colR, colRW, point, ptR, out) {
197
197
  const capsuleVec = colRW.directionCurrent;
198
+ const capsuleHeight = colRW.height > EPSILON ? colRW.height : capsuleVec.magnitude;
198
199
  const capsuleVecN = Vector3.normalize(capsuleVec, _pushoutCapsuleVecN);
199
200
  const capsulePos = colRW.positionCurrent;
200
201
  const targetVec = Vector3.sub(point, capsulePos, _pushoutCapsuleTargetVec);
@@ -202,7 +203,7 @@ function writeNearestPointsResult(out, tP, tQ, pointOnP, pointOnQ, sqrDistance,
202
203
  if (distOnVec <= EPSILON) {
203
204
  return pushoutFromSphere(capsulePos, colRW.radius, ptR.pointRadius, point, out);
204
205
  }
205
- if (distOnVec >= colR.height) {
206
+ if (distOnVec >= capsuleHeight) {
206
207
  const tail = Vector3.add(capsulePos, capsuleVec, _pushoutCapsuleTail);
207
208
  return pushoutFromSphere(tail, colRW.radius * colR.radiusTailScale, ptR.pointRadius, point, out);
208
209
  }
@@ -212,7 +213,7 @@ function writeNearestPointsResult(out, tP, tQ, pointOnP, pointOnQ, sqrDistance,
212
213
  const sqrPushDist = pushVec.magnitudeSq;
213
214
  if (sqrPushDist > EPSILON) {
214
215
  const pushDist = Math.sqrt(sqrPushDist) - ptR.pointRadius;
215
- const r = colRW.radius * lerp(1.0, colR.radiusTailScale, distOnVec / colR.height);
216
+ const r = colRW.radius * lerp(1.0, colR.radiusTailScale, distOnVec / capsuleHeight);
216
217
  if (pushDist < r) {
217
218
  const scaled = Vector3.scale(pushVec, r / pushDist, _pushoutCapsuleScaled);
218
219
  Vector3.add(posOnVec, scaled, scaled);
@@ -254,6 +255,7 @@ function writeNearestPointsResult(out, tP, tQ, pointOnP, pointOnQ, sqrDistance,
254
255
  * @public
255
256
  */ function pushInFromCapsule(colR, colRW, point, out) {
256
257
  const capsuleVec = colRW.directionCurrent;
258
+ const capsuleHeight = colRW.height > EPSILON ? colRW.height : capsuleVec.magnitude;
257
259
  const capsuleVecN = Vector3.normalize(capsuleVec, _pushInCapsuleVecN);
258
260
  const capsulePos = colRW.positionCurrent;
259
261
  const targetVec = Vector3.sub(point, capsulePos, _pushInCapsuleTargetVec);
@@ -261,7 +263,7 @@ function writeNearestPointsResult(out, tP, tQ, pointOnP, pointOnQ, sqrDistance,
261
263
  if (distOnVec <= EPSILON) {
262
264
  return pushInFromSphere(capsulePos, colRW.radius, point, out);
263
265
  }
264
- if (distOnVec >= colR.height) {
266
+ if (distOnVec >= capsuleHeight) {
265
267
  const tail = Vector3.add(capsulePos, capsuleVec, _pushInCapsuleTail);
266
268
  return pushInFromSphere(tail, colRW.radius * colR.radiusTailScale, point, out);
267
269
  }
@@ -270,7 +272,7 @@ function writeNearestPointsResult(out, tP, tQ, pointOnP, pointOnQ, sqrDistance,
270
272
  const pullVec = Vector3.sub(posOnVec, point, _pushInCapsulePullVec);
271
273
  const sqrPullDist = pullVec.magnitudeSq;
272
274
  if (sqrPullDist > EPSILON) {
273
- const r = colRW.radius * lerp(1.0, colR.radiusTailScale, colR.height / distOnVec);
275
+ const r = colRW.radius * lerp(1.0, colR.radiusTailScale, distOnVec / capsuleHeight);
274
276
  if (sqrPullDist > r * r) {
275
277
  const pullDist = Math.sqrt(sqrPullDist);
276
278
  const pullVecN = Vector3.normalize(pullVec, _pushInCapsulePullVecN);
@@ -1 +1 @@
1
- {"version":3,"file":"collision.js","sources":["../../../src/animation/joint_dynamics/collision.ts"],"sourcesContent":["// Collision detection & response - direct port of SPCRJointDynamicsJob.cs Collision class\r\n\r\nimport { Vector3 } from '@zephyr3d/base';\r\nimport type { ColliderR, ColliderRW, PointR } from './types';\r\nimport { EPSILON, ColliderForce } from './types';\r\n\r\n/** @public */\r\nexport interface CollisionResult {\r\n hit: boolean;\r\n point: Vector3;\r\n}\r\n\r\n/** @public */\r\nexport interface LineCollisionResult {\r\n hit: boolean;\r\n pointOnLine: Vector3;\r\n pointOnCollider: Vector3;\r\n radius: number;\r\n}\r\n\r\n/** @public */\r\nexport interface SurfaceCheckResult {\r\n hit: boolean;\r\n intersectionPoint: Vector3;\r\n pushOut: Vector3;\r\n pointOnCollider: Vector3;\r\n radius: number;\r\n}\r\n\r\n/** @public */\r\nexport interface NearestPointsResult {\r\n tP: number;\r\n tQ: number;\r\n pointOnP: Vector3;\r\n pointOnQ: Vector3;\r\n sqrDistance: number;\r\n}\r\n\r\nconst _pushoutSphereDirection = new Vector3();\r\nconst _pushoutSphereScaled = new Vector3();\r\nconst _pushoutCapsuleVecN = new Vector3();\r\nconst _pushoutCapsuleTargetVec = new Vector3();\r\nconst _pushoutCapsuleTail = new Vector3();\r\nconst _pushoutCapsulePosOnVec = new Vector3();\r\nconst _pushoutCapsulePushVec = new Vector3();\r\nconst _pushoutCapsuleScaled = new Vector3();\r\nconst _pushInSphereDirection = new Vector3();\r\nconst _pushInSphereDirectionN = new Vector3();\r\nconst _pushInSphereScaled = new Vector3();\r\nconst _pushInCapsuleVecN = new Vector3();\r\nconst _pushInCapsuleTargetVec = new Vector3();\r\nconst _pushInCapsuleTail = new Vector3();\r\nconst _pushInCapsulePosOnVec = new Vector3();\r\nconst _pushInCapsulePullVec = new Vector3();\r\nconst _pushInCapsulePullVecN = new Vector3();\r\nconst _pushInCapsuleScaled = new Vector3();\r\nconst _collisionSphereDir = new Vector3();\r\nconst _collisionSphereDirN = new Vector3();\r\nconst _collisionSphereToCenter = new Vector3();\r\nconst _collisionSphereScaled = new Vector3();\r\nconst _collisionSphereDiff = new Vector3();\r\nconst _collisionCapsuleTail = new Vector3();\r\nconst _collisionCapsulePointDir = new Vector3();\r\nconst _collisionCapsulePtOnCol = new Vector3();\r\nconst _collisionCapsulePtOnLine = new Vector3();\r\nconst _collisionCapsuleDiff = new Vector3();\r\nconst _collisionCapsuleTempLineResult: LineCollisionResult = {\r\n hit: false,\r\n pointOnLine: new Vector3(),\r\n pointOnCollider: new Vector3(),\r\n radius: 0\r\n};\r\nconst _nearestCross0 = new Vector3();\r\nconst _nearestCross1 = new Vector3();\r\nconst _nearestN1 = new Vector3();\r\nconst _nearestN2 = new Vector3();\r\nconst _nearestPosDiff = new Vector3();\r\nconst _nearestPointOnP = new Vector3();\r\nconst _nearestPointOnQ = new Vector3();\r\nconst _nearestPointDiff = new Vector3();\r\nconst _nearestResult: NearestPointsResult = {\r\n tP: 0,\r\n tQ: 0,\r\n pointOnP: new Vector3(),\r\n pointOnQ: new Vector3(),\r\n sqrDistance: 0\r\n};\r\nconst _surfaceNoHit: SurfaceCheckResult = {\r\n hit: false,\r\n intersectionPoint: new Vector3(),\r\n pushOut: new Vector3(),\r\n pointOnCollider: new Vector3(),\r\n radius: 0\r\n};\r\nconst _surfaceTriCenter = new Vector3();\r\nconst _surfaceEdgeAB = new Vector3();\r\nconst _surfaceEdgeAC = new Vector3();\r\nconst _surfacePlaneNormal = new Vector3();\r\nconst _surfacePlaneNormalNeg = new Vector3();\r\nconst _surfaceColliderDir = new Vector3();\r\nconst _surfaceRayDir = new Vector3();\r\nconst _surfaceRayDirN = new Vector3();\r\nconst _surfaceTail = new Vector3();\r\nconst _surfaceIntersection = new Vector3();\r\nconst _surfacePushOut = new Vector3();\r\nconst _surfaceToCol = new Vector3();\r\nconst _surfaceEndVec = new Vector3();\r\nconst _surfaceColDirVec = new Vector3();\r\nconst _surfaceIntersecToEnd = new Vector3();\r\nconst _surfaceColToEnd = new Vector3();\r\nconst _surfaceColToIntersect = new Vector3();\r\nconst _surfaceEVec = new Vector3();\r\nconst _surfacePoc2 = new Vector3();\r\nconst _triangleAp = new Vector3();\r\nconst _triangleBp = new Vector3();\r\nconst _triangleCp = new Vector3();\r\nconst _triangleU = new Vector3();\r\nconst _triangleV = new Vector3();\r\nconst _triangleW = new Vector3();\r\n\r\nfunction writeCollisionResult(\r\n out: CollisionResult | undefined,\r\n hit: boolean,\r\n point: Vector3,\r\n copyPoint: boolean\r\n) {\r\n if (!out) {\r\n return { hit, point: copyPoint ? point.clone() : point };\r\n }\r\n if (!out.point) {\r\n out.point = new Vector3();\r\n }\r\n out.hit = hit;\r\n out.point.set(point);\r\n return out;\r\n}\r\n\r\nfunction writeLineCollisionResult(\r\n out: LineCollisionResult | undefined,\r\n hit: boolean,\r\n pointOnLine: Vector3,\r\n pointOnCollider: Vector3,\r\n radius: number,\r\n copyVectors: boolean\r\n) {\r\n if (!out) {\r\n return {\r\n hit,\r\n pointOnLine: copyVectors ? pointOnLine.clone() : pointOnLine,\r\n pointOnCollider: copyVectors ? pointOnCollider.clone() : pointOnCollider,\r\n radius\r\n };\r\n }\r\n if (!out.pointOnLine) {\r\n out.pointOnLine = new Vector3();\r\n }\r\n if (!out.pointOnCollider) {\r\n out.pointOnCollider = new Vector3();\r\n }\r\n out.hit = hit;\r\n out.pointOnLine.set(pointOnLine);\r\n out.pointOnCollider.set(pointOnCollider);\r\n out.radius = radius;\r\n return out;\r\n}\r\n\r\nfunction writeSurfaceCheckResult(\r\n out: SurfaceCheckResult | undefined,\r\n hit: boolean,\r\n intersectionPoint: Vector3,\r\n pushOut: Vector3,\r\n pointOnCollider: Vector3,\r\n radius: number,\r\n copyVectors: boolean\r\n) {\r\n if (!out) {\r\n return {\r\n hit,\r\n intersectionPoint: copyVectors ? intersectionPoint.clone() : intersectionPoint,\r\n pushOut: copyVectors ? pushOut.clone() : pushOut,\r\n pointOnCollider: copyVectors ? pointOnCollider.clone() : pointOnCollider,\r\n radius\r\n };\r\n }\r\n if (!out.intersectionPoint) {\r\n out.intersectionPoint = new Vector3();\r\n }\r\n if (!out.pushOut) {\r\n out.pushOut = new Vector3();\r\n }\r\n if (!out.pointOnCollider) {\r\n out.pointOnCollider = new Vector3();\r\n }\r\n out.hit = hit;\r\n out.intersectionPoint.set(intersectionPoint);\r\n out.pushOut.set(pushOut);\r\n out.pointOnCollider.set(pointOnCollider);\r\n out.radius = radius;\r\n return out;\r\n}\r\n\r\nfunction writeNearestPointsResult(\r\n out: NearestPointsResult | undefined,\r\n tP: number,\r\n tQ: number,\r\n pointOnP: Vector3,\r\n pointOnQ: Vector3,\r\n sqrDistance: number,\r\n copyVectors: boolean\r\n) {\r\n if (!out) {\r\n return {\r\n tP,\r\n tQ,\r\n pointOnP: copyVectors ? pointOnP.clone() : pointOnP,\r\n pointOnQ: copyVectors ? pointOnQ.clone() : pointOnQ,\r\n sqrDistance\r\n };\r\n }\r\n out.tP = tP;\r\n out.tQ = tQ;\r\n out.pointOnP.set(pointOnP);\r\n out.pointOnQ.set(pointOnQ);\r\n out.sqrDistance = sqrDistance;\r\n return out;\r\n}\r\n\r\n// Pushout (keep point outside collider)\r\n\r\n/**\r\n * Pushes a point out of a sphere collider.\r\n *\r\n * @public\r\n */\r\nexport function pushoutFromSphere(\r\n center: Vector3,\r\n radius: number,\r\n pointRadius: number,\r\n point: Vector3,\r\n out?: CollisionResult\r\n): CollisionResult {\r\n const direction = Vector3.sub(point, center, _pushoutSphereDirection);\r\n const sqrLen = direction.magnitudeSq;\r\n if (sqrLen > EPSILON) {\r\n const dirLen = Math.sqrt(sqrLen) - pointRadius;\r\n if (dirLen < radius) {\r\n const scaled = Vector3.scale(direction, radius / dirLen, _pushoutSphereScaled);\r\n Vector3.add(center, scaled, scaled);\r\n return writeCollisionResult(out, true, scaled, !out);\r\n }\r\n }\r\n return writeCollisionResult(out, false, point, !out);\r\n}\r\n\r\n/**\r\n * Pushes a point out of a collider.\r\n *\r\n * @public\r\n */\r\nexport function pushoutFromCollider(\r\n colR: ColliderR,\r\n colRW: ColliderRW,\r\n point: Vector3,\r\n ptR: PointR,\r\n out?: CollisionResult\r\n): CollisionResult {\r\n if (colR.height <= EPSILON) {\r\n return pushoutFromSphere(colRW.positionCurrent, colRW.radius, ptR.pointRadius, point, out);\r\n }\r\n return pushoutFromCapsule(colR, colRW, point, ptR, out);\r\n}\r\n\r\n/**\r\n * Pushes a point out of a capsule collider.\r\n *\r\n * @public\r\n */\r\nexport function pushoutFromCapsule(\r\n colR: ColliderR,\r\n colRW: ColliderRW,\r\n point: Vector3,\r\n ptR: PointR,\r\n out?: CollisionResult\r\n): CollisionResult {\r\n const capsuleVec = colRW.directionCurrent;\r\n const 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 >= colR.height) {\r\n const tail = Vector3.add(capsulePos, capsuleVec, _pushoutCapsuleTail);\r\n return pushoutFromSphere(tail, colRW.radius * colR.radiusTailScale, ptR.pointRadius, point, out);\r\n }\r\n\r\n const posOnVec = Vector3.scale(capsuleVecN, distOnVec, _pushoutCapsulePosOnVec);\r\n Vector3.add(capsulePos, posOnVec, posOnVec);\r\n const pushVec = Vector3.sub(point, posOnVec, _pushoutCapsulePushVec);\r\n const sqrPushDist = pushVec.magnitudeSq;\r\n if (sqrPushDist > EPSILON) {\r\n const pushDist = Math.sqrt(sqrPushDist) - ptR.pointRadius;\r\n const r = colRW.radius * lerp(1.0, colR.radiusTailScale, distOnVec / colR.height);\r\n if (pushDist < r) {\r\n const scaled = Vector3.scale(pushVec, r / pushDist, _pushoutCapsuleScaled);\r\n Vector3.add(posOnVec, scaled, scaled);\r\n return writeCollisionResult(out, true, scaled, !out);\r\n }\r\n }\r\n return writeCollisionResult(out, false, point, !out);\r\n}\r\n\r\n// PushIn (keep point inside collider - inverse mode)\r\n\r\n/**\r\n * Pulls a point inside a sphere collider.\r\n *\r\n * @public\r\n */\r\nexport function pushInFromSphere(\r\n center: Vector3,\r\n radius: number,\r\n point: Vector3,\r\n out?: CollisionResult\r\n): CollisionResult {\r\n const direction = Vector3.sub(center, point, _pushInSphereDirection);\r\n const sqrLen = direction.magnitudeSq;\r\n if (sqrLen > EPSILON && sqrLen > radius * radius) {\r\n const dirLen = Math.sqrt(sqrLen);\r\n const directionN = Vector3.normalize(direction, _pushInSphereDirectionN);\r\n const scaled = Vector3.scale(directionN, dirLen - radius, _pushInSphereScaled);\r\n Vector3.add(point, scaled, scaled);\r\n return writeCollisionResult(out, true, scaled, !out);\r\n }\r\n return writeCollisionResult(out, false, point, !out);\r\n}\r\n\r\n/**\r\n * Pulls a point inside a collider.\r\n *\r\n * @public\r\n */\r\nexport function pushInFromCollider(\r\n colR: ColliderR,\r\n colRW: ColliderRW,\r\n point: Vector3,\r\n out?: CollisionResult\r\n): CollisionResult {\r\n if (colR.height <= EPSILON) {\r\n return pushInFromSphere(colRW.positionCurrent, colRW.radius, point, out);\r\n }\r\n return pushInFromCapsule(colR, colRW, point, out);\r\n}\r\n\r\n/**\r\n * Pulls a point inside a capsule collider.\r\n *\r\n * @public\r\n */\r\nexport function pushInFromCapsule(\r\n colR: ColliderR,\r\n colRW: ColliderRW,\r\n point: Vector3,\r\n out?: CollisionResult\r\n): CollisionResult {\r\n const capsuleVec = colRW.directionCurrent;\r\n const 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 >= colR.height) {\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, colR.height / distOnVec);\r\n if (sqrPullDist > r * r) {\r\n const pullDist = Math.sqrt(sqrPullDist);\r\n const pullVecN = Vector3.normalize(pullVec, _pushInCapsulePullVecN);\r\n const scaled = Vector3.scale(pullVecN, pullDist - r, _pushInCapsuleScaled);\r\n Vector3.add(point, scaled, scaled);\r\n return writeCollisionResult(out, true, scaled, !out);\r\n }\r\n }\r\n return writeCollisionResult(out, false, point, !out);\r\n}\r\n\r\n// Line segment vs collider detection\r\n\r\n/**\r\n * Performs sphere collision detection.\r\n *\r\n * @public\r\n */\r\nexport function collisionDetectionSphere(\r\n center: Vector3,\r\n radius: number,\r\n point1: Vector3,\r\n point2: Vector3,\r\n out?: LineCollisionResult\r\n): LineCollisionResult {\r\n const dir = Vector3.sub(point2, point1, _collisionSphereDir);\r\n const dirLen = dir.magnitude;\r\n if (dirLen < EPSILON) {\r\n return writeLineCollisionResult(out, false, point1, center, radius, !out);\r\n }\r\n const dirN = Vector3.scale(dir, 1 / dirLen, _collisionSphereDirN);\r\n const toCenter = Vector3.sub(center, point1, _collisionSphereToCenter);\r\n const dot = Vector3.dot(dirN, toCenter);\r\n const clamped = Math.max(0, Math.min(dot, dirLen));\r\n const ptOnLine = Vector3.scale(dirN, clamped, _collisionSphereScaled);\r\n Vector3.add(point1, ptOnLine, ptOnLine);\r\n const diff = Vector3.sub(center, ptOnLine, _collisionSphereDiff);\r\n const hit = diff.magnitudeSq <= radius * radius;\r\n return writeLineCollisionResult(out, hit, ptOnLine, center, radius, !out);\r\n}\r\n\r\n/**\r\n * Performs capsule collision detection.\r\n *\r\n * @public\r\n */\r\nexport function collisionDetectionCapsule(\r\n colR: ColliderR,\r\n colRW: ColliderRW,\r\n point1: Vector3,\r\n point2: Vector3,\r\n out?: LineCollisionResult\r\n): LineCollisionResult {\r\n const capsuleDir = colRW.directionCurrent;\r\n const capsulePos = colRW.positionCurrent;\r\n\r\n let res = collisionDetectionSphere(capsulePos, colRW.radius, point1, point2, out);\r\n if (res.hit) {\r\n return res;\r\n }\r\n\r\n const tail = Vector3.add(capsulePos, capsuleDir, _collisionCapsuleTail);\r\n res = collisionDetectionSphere(\r\n tail,\r\n colRW.radius * colR.radiusTailScale,\r\n point1,\r\n point2,\r\n _collisionCapsuleTempLineResult\r\n );\r\n if (res.hit) {\r\n return writeLineCollisionResult(out, true, res.pointOnLine, res.pointOnCollider, res.radius, !out);\r\n }\r\n\r\n const pointDir = Vector3.sub(point2, point1, _collisionCapsulePointDir);\r\n const nearest = computeNearestPoints(capsulePos, capsuleDir, point1, pointDir, _nearestResult);\r\n const t1 = Math.max(0, Math.min(1, nearest.tP));\r\n const r = colRW.radius * lerp(1.0, colR.radiusTailScale, t1);\r\n\r\n if (nearest.sqrDistance > r * r) {\r\n return writeLineCollisionResult(out, false, point1, capsulePos, r, !out);\r\n }\r\n\r\n const t2 = Math.max(0, Math.min(1, nearest.tQ));\r\n const ptOnCol = Vector3.scale(capsuleDir, t1, _collisionCapsulePtOnCol);\r\n Vector3.add(capsulePos, ptOnCol, ptOnCol);\r\n const ptOnLine = Vector3.scale(pointDir, t2, _collisionCapsulePtOnLine);\r\n Vector3.add(point1, ptOnLine, ptOnLine);\r\n const diff = Vector3.sub(ptOnCol, ptOnLine, _collisionCapsuleDiff);\r\n const hit = diff.magnitudeSq <= r * r;\r\n return writeLineCollisionResult(out, hit, ptOnLine, ptOnCol, r, !out);\r\n}\r\n\r\n/**\r\n * Performs collision detection against the specified collider.\r\n *\r\n * @public\r\n */\r\nexport function collisionDetection(\r\n colR: ColliderR,\r\n colRW: ColliderRW,\r\n point1: Vector3,\r\n point2: Vector3,\r\n out?: LineCollisionResult\r\n): LineCollisionResult {\r\n if (colR.height <= EPSILON) {\r\n return collisionDetectionSphere(colRW.positionCurrent, colRW.radius, point1, point2, out);\r\n }\r\n return collisionDetectionCapsule(colR, colRW, point1, point2, out);\r\n}\r\n\r\n/**\r\n * Performs inward collision detection.\r\n *\r\n * @public\r\n */\r\nexport function pushInCollisionDetection(\r\n colR: ColliderR,\r\n colRW: ColliderRW,\r\n point1: Vector3,\r\n point2: Vector3,\r\n out?: LineCollisionResult\r\n): LineCollisionResult {\r\n if (colR.height <= EPSILON) {\r\n return collisionDetectionSphere(colRW.positionCurrent, colRW.radius, point1, point2, out);\r\n }\r\n const res = collisionDetectionCapsule(colR, colRW, point1, point2, out);\r\n res.hit = false;\r\n return res;\r\n}\r\n\r\n// Nearest points between two line segments\r\n\r\n/**\r\n * Computes the nearest points between two segments.\r\n *\r\n * @public\r\n */\r\nexport function computeNearestPoints(\r\n posP: Vector3,\r\n dirP: Vector3,\r\n posQ: Vector3,\r\n dirQ: Vector3,\r\n out?: NearestPointsResult\r\n): {\r\n tP: number;\r\n tQ: number;\r\n pointOnP: Vector3;\r\n pointOnQ: Vector3;\r\n sqrDistance: number;\r\n} {\r\n const cross0 = Vector3.cross(dirQ, dirP, _nearestCross0);\r\n const n1 = Vector3.cross(dirP, cross0, _nearestN1);\r\n const cross1 = Vector3.cross(dirP, dirQ, _nearestCross1);\r\n const n2 = Vector3.cross(dirQ, cross1, _nearestN2);\r\n const dP_n2 = Vector3.dot(dirP, n2);\r\n const dQ_n1 = Vector3.dot(dirQ, n1);\r\n const posDiff = Vector3.sub(posQ, posP, _nearestPosDiff);\r\n const tP = dP_n2 !== 0 ? Vector3.dot(posDiff, n2) / dP_n2 : 0;\r\n const tQ = dQ_n1 !== 0 ? Vector3.dot(Vector3.scale(posDiff, -1, posDiff), n1) / dQ_n1 : 0;\r\n const pointOnP = Vector3.scale(dirP, tP, _nearestPointOnP);\r\n Vector3.add(posP, pointOnP, pointOnP);\r\n const pointOnQ = Vector3.scale(dirQ, tQ, _nearestPointOnQ);\r\n Vector3.add(posQ, pointOnQ, pointOnQ);\r\n const diff = Vector3.sub(pointOnQ, pointOnP, _nearestPointDiff);\r\n return writeNearestPointsResult(out, tP, tQ, pointOnP, pointOnQ, diff.magnitudeSq, !out);\r\n}\r\n\r\n// Surface collision (triangle-based)\r\n\r\n/**\r\n * Checks triangle-surface collision against a collider.\r\n *\r\n * @public\r\n */\r\nexport function checkSurfaceCollision(\r\n ptA: Vector3,\r\n ptB: Vector3,\r\n ptC: Vector3,\r\n colliderPos: Vector3,\r\n colR: ColliderR,\r\n colRW: ColliderRW,\r\n out?: SurfaceCheckResult\r\n): SurfaceCheckResult {\r\n _surfaceNoHit.hit = false;\r\n _surfaceNoHit.intersectionPoint.setXYZ(0, 0, 0);\r\n _surfaceNoHit.pushOut.setXYZ(0, 0, 0);\r\n _surfaceNoHit.pointOnCollider.set(colliderPos);\r\n _surfaceNoHit.radius = colRW.radius;\r\n\r\n let pointOnCollider = colliderPos;\r\n let radius = colRW.radius;\r\n const isCapsule = colR.height > EPSILON;\r\n\r\n const triCenter = centerOfTriangle(ptA, ptB, ptC, _surfaceTriCenter);\r\n const edgeAB = Vector3.sub(ptB, ptA, _surfaceEdgeAB);\r\n const edgeAC = Vector3.sub(ptC, ptA, _surfaceEdgeAC);\r\n const planeNormal = Vector3.cross(edgeAB, edgeAC, _surfacePlaneNormal);\r\n Vector3.normalize(planeNormal, planeNormal);\r\n Vector3.scale(planeNormal, -1, planeNormal);\r\n const planeNormalNeg = Vector3.scale(planeNormal, -1, _surfacePlaneNormalNeg);\r\n const planeDist = -Vector3.dot(planeNormalNeg, ptA);\r\n const colliderDir = Vector3.sub(colliderPos, triCenter, _surfaceColliderDir);\r\n Vector3.normalize(colliderDir, colliderDir);\r\n const dot = Vector3.dot(colliderDir, planeNormal);\r\n\r\n if (isCapsule) {\r\n const side = Vector3.dot(colRW.directionCurrent, planeNormal) * dot;\r\n const rayDir = Vector3.scale(planeNormal, dot * -1, _surfaceRayDir);\r\n const tempPOC = pointOnCollider;\r\n\r\n if (side < 0) {\r\n radius = colRW.radius * colR.radiusTailScale;\r\n pointOnCollider = Vector3.add(colliderPos, colRW.directionCurrent, _surfaceTail);\r\n }\r\n\r\n const rayDirN = Vector3.normalize(rayDir, _surfaceRayDirN);\r\n const enter = raycast(planeNormalNeg, planeDist, pointOnCollider, rayDirN);\r\n if (enter !== null) {\r\n const ip = Vector3.scale(rayDirN, enter, _surfaceIntersection);\r\n Vector3.add(pointOnCollider, ip, ip);\r\n if (triangleContainsPoint(ptA, ptB, ptC, ip)) {\r\n const pushOut = Vector3.sub(ip, pointOnCollider, _surfacePushOut);\r\n const toCol = Vector3.sub(pointOnCollider, ip, _surfaceToCol);\r\n if (toCol.magnitudeSq <= radius * radius) {\r\n return writeSurfaceCheckResult(out, true, ip, pushOut, pointOnCollider, radius, !out);\r\n }\r\n }\r\n } else if (colR.forceType !== ColliderForce.Off) {\r\n pointOnCollider = tempPOC;\r\n let endVec = Vector3.add(colliderPos, colRW.directionCurrent, _surfaceEndVec);\r\n _surfaceColDirVec.set(colRW.directionCurrent);\r\n let colDirVec = _surfaceColDirVec;\r\n if (colR.forceType === ColliderForce.Pull) {\r\n const tmp = pointOnCollider;\r\n pointOnCollider = endVec;\r\n endVec = tmp;\r\n colDirVec = Vector3.scale(colDirVec, -1, colDirVec);\r\n }\r\n const enter2 = raycast(planeNormalNeg, planeDist, pointOnCollider, colDirVec);\r\n if (enter2 !== null) {\r\n const ip = Vector3.scale(colDirVec, enter2, _surfaceIntersection);\r\n Vector3.add(pointOnCollider, ip, ip);\r\n if (triangleContainsPoint(ptA, ptB, ptC, ip)) {\r\n const intersecToEnd = Vector3.sub(endVec, ip, _surfaceIntersecToEnd);\r\n const colToEnd = Vector3.sub(endVec, pointOnCollider, _surfaceColToEnd);\r\n const colToIntersect = Vector3.sub(ip, pointOnCollider, _surfaceColToIntersect);\r\n const pDot = Vector3.dot(intersecToEnd, colToIntersect);\r\n const lDot = Vector3.dot(colToEnd, colToEnd);\r\n if (!(pDot >= 0 && pDot <= lDot)) {\r\n return writeSurfaceCheckResult(\r\n out,\r\n _surfaceNoHit.hit,\r\n _surfaceNoHit.intersectionPoint,\r\n _surfaceNoHit.pushOut,\r\n _surfaceNoHit.pointOnCollider,\r\n _surfaceNoHit.radius,\r\n !out\r\n );\r\n }\r\n const dotVal = Vector3.dot(colToEnd, colToIntersect);\r\n const s2eMag = Vector3.dot(colToEnd, colToEnd);\r\n const colToEndN = Vector3.normalize(colToEnd, colToEnd);\r\n const eVec = Vector3.scale(colToEndN, -radius, _surfaceEVec);\r\n Vector3.add(pointOnCollider, eVec, eVec);\r\n const pushOut = Vector3.sub(ip, eVec, _surfacePushOut);\r\n const poc2 = Vector3.scale(colToEnd, dotVal / s2eMag, _surfacePoc2);\r\n Vector3.add(pointOnCollider, poc2, poc2);\r\n const toCol = Vector3.sub(poc2, ip, _surfaceToCol);\r\n if (toCol.magnitudeSq <= radius * radius) {\r\n return writeSurfaceCheckResult(out, true, ip, pushOut, poc2, radius, !out);\r\n }\r\n }\r\n }\r\n }\r\n } else {\r\n const rayDir = Vector3.scale(planeNormal, dot * -1, _surfaceRayDir);\r\n const rayDirN = Vector3.normalize(rayDir, _surfaceRayDirN);\r\n const enter = raycast(planeNormalNeg, planeDist, pointOnCollider, rayDirN);\r\n if (enter !== null) {\r\n const ip = Vector3.scale(rayDirN, enter, _surfaceIntersection);\r\n Vector3.add(pointOnCollider, ip, ip);\r\n if (triangleContainsPoint(ptA, ptB, ptC, ip)) {\r\n const pushOut = Vector3.sub(ip, pointOnCollider, _surfacePushOut);\r\n const toCol = Vector3.sub(pointOnCollider, ip, _surfaceToCol);\r\n if (toCol.magnitudeSq <= radius * radius) {\r\n return writeSurfaceCheckResult(out, true, ip, pushOut, pointOnCollider, radius, !out);\r\n }\r\n }\r\n }\r\n }\r\n\r\n return writeSurfaceCheckResult(\r\n out,\r\n _surfaceNoHit.hit,\r\n _surfaceNoHit.intersectionPoint,\r\n _surfaceNoHit.pushOut,\r\n _surfaceNoHit.pointOnCollider,\r\n _surfaceNoHit.radius,\r\n !out\r\n );\r\n}\r\n\r\n// Helpers\r\n\r\nfunction raycast(normal: Vector3, planeDist: number, origin: Vector3, direction: Vector3): number | null {\r\n const vdot = Vector3.dot(direction, normal);\r\n const ndot = -Vector3.dot(origin, normal) - planeDist;\r\n if (Math.abs(vdot) <= EPSILON) {\r\n return null;\r\n }\r\n const enter = ndot / vdot;\r\n return enter > 0 ? enter : null;\r\n}\r\n\r\nfunction centerOfTriangle(a: Vector3, b: Vector3, c: Vector3, result?: Vector3): Vector3 {\r\n result = result || new Vector3();\r\n return result.setXYZ((a.x + b.x + c.x) / 3, (a.y + b.y + c.y) / 3, (a.z + b.z + c.z) / 3);\r\n}\r\n\r\nfunction triangleContainsPoint(a: Vector3, b: Vector3, c: Vector3, p: Vector3): boolean {\r\n const ap = Vector3.sub(a, p, _triangleAp);\r\n const bp = Vector3.sub(b, p, _triangleBp);\r\n const cp = Vector3.sub(c, p, _triangleCp);\r\n const u = Vector3.cross(ap, bp, _triangleU);\r\n const vv = Vector3.cross(bp, cp, _triangleV);\r\n const w = Vector3.cross(cp, ap, _triangleW);\r\n if (Vector3.dot(u, vv) < 0) {\r\n return false;\r\n }\r\n if (Vector3.dot(vv, w) < 0) {\r\n return false;\r\n }\r\n return true;\r\n}\r\n\r\nfunction lerp(a: number, b: number, t: number): number {\r\n return a + (b - a) * t;\r\n}\r\n"],"names":["_pushoutSphereDirection","Vector3","_pushoutSphereScaled","_pushoutCapsuleVecN","_pushoutCapsuleTargetVec","_pushoutCapsuleTail","_pushoutCapsulePosOnVec","_pushoutCapsulePushVec","_pushoutCapsuleScaled","_pushInSphereDirection","_pushInSphereDirectionN","_pushInSphereScaled","_pushInCapsuleVecN","_pushInCapsuleTargetVec","_pushInCapsuleTail","_pushInCapsulePosOnVec","_pushInCapsulePullVec","_pushInCapsulePullVecN","_pushInCapsuleScaled","_collisionSphereDir","_collisionSphereDirN","_collisionSphereToCenter","_collisionSphereScaled","_collisionSphereDiff","_collisionCapsuleTail","_collisionCapsulePointDir","_collisionCapsulePtOnCol","_collisionCapsulePtOnLine","_collisionCapsuleDiff","_collisionCapsuleTempLineResult","hit","pointOnLine","pointOnCollider","radius","_nearestCross0","_nearestCross1","_nearestN1","_nearestN2","_nearestPosDiff","_nearestPointOnP","_nearestPointOnQ","_nearestPointDiff","_nearestResult","tP","tQ","pointOnP","pointOnQ","sqrDistance","_surfaceNoHit","intersectionPoint","pushOut","_surfaceTriCenter","_surfaceEdgeAB","_surfaceEdgeAC","_surfacePlaneNormal","_surfacePlaneNormalNeg","_surfaceColliderDir","_surfaceRayDir","_surfaceRayDirN","_surfaceTail","_surfaceIntersection","_surfacePushOut","_surfaceToCol","_surfaceEndVec","_surfaceColDirVec","_surfaceIntersecToEnd","_surfaceColToEnd","_surfaceColToIntersect","_surfaceEVec","_surfacePoc2","_triangleAp","_triangleBp","_triangleCp","_triangleU","_triangleV","_triangleW","writeCollisionResult","out","point","copyPoint","clone","set","writeLineCollisionResult","copyVectors","writeSurfaceCheckResult","writeNearestPointsResult","pushoutFromSphere","center","pointRadius","direction","sub","sqrLen","magnitudeSq","EPSILON","dirLen","Math","sqrt","scaled","scale","add","pushoutFromCollider","colR","colRW","ptR","height","positionCurrent","pushoutFromCapsule","capsuleVec","directionCurrent","capsuleVecN","normalize","capsulePos","targetVec","distOnVec","dot","tail","radiusTailScale","posOnVec","pushVec","sqrPushDist","pushDist","r","lerp","pushInFromSphere","directionN","pushInFromCollider","pushInFromCapsule","pullVec","sqrPullDist","pullDist","pullVecN","collisionDetectionSphere","point1","point2","dir","magnitude","dirN","toCenter","clamped","max","min","ptOnLine","diff","collisionDetectionCapsule","capsuleDir","res","pointDir","nearest","computeNearestPoints","t1","t2","ptOnCol","collisionDetection","pushInCollisionDetection","posP","dirP","posQ","dirQ","cross0","cross","n1","cross1","n2","dP_n2","dQ_n1","posDiff","checkSurfaceCollision","ptA","ptB","ptC","colliderPos","setXYZ","isCapsule","triCenter","centerOfTriangle","edgeAB","edgeAC","planeNormal","planeNormalNeg","planeDist","colliderDir","side","rayDir","tempPOC","rayDirN","enter","raycast","ip","triangleContainsPoint","toCol","forceType","ColliderForce","Off","endVec","colDirVec","Pull","tmp","enter2","intersecToEnd","colToEnd","colToIntersect","pDot","lDot","dotVal","s2eMag","colToEndN","eVec","poc2","normal","origin","vdot","ndot","abs","a","b","c","result","x","y","z","p","ap","bp","cp","u","vv","w","t"],"mappings":"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"}
1
+ {"version":3,"file":"collision.js","sources":["../../../src/animation/joint_dynamics/collision.ts"],"sourcesContent":["// Collision detection & response - direct port of SPCRJointDynamicsJob.cs Collision class\r\n\r\nimport { Vector3 } from '@zephyr3d/base';\r\nimport type { ColliderR, ColliderRW, PointR } from './types';\r\nimport { EPSILON, ColliderForce } from './types';\r\n\r\n/** @public */\r\nexport interface CollisionResult {\r\n hit: boolean;\r\n point: Vector3;\r\n}\r\n\r\n/** @public */\r\nexport interface LineCollisionResult {\r\n hit: boolean;\r\n pointOnLine: Vector3;\r\n pointOnCollider: Vector3;\r\n radius: number;\r\n}\r\n\r\n/** @public */\r\nexport interface SurfaceCheckResult {\r\n hit: boolean;\r\n intersectionPoint: Vector3;\r\n pushOut: Vector3;\r\n pointOnCollider: Vector3;\r\n radius: number;\r\n}\r\n\r\n/** @public */\r\nexport interface NearestPointsResult {\r\n tP: number;\r\n tQ: number;\r\n pointOnP: Vector3;\r\n pointOnQ: Vector3;\r\n sqrDistance: number;\r\n}\r\n\r\nconst _pushoutSphereDirection = new Vector3();\r\nconst _pushoutSphereScaled = new Vector3();\r\nconst _pushoutCapsuleVecN = new Vector3();\r\nconst _pushoutCapsuleTargetVec = new Vector3();\r\nconst _pushoutCapsuleTail = new Vector3();\r\nconst _pushoutCapsulePosOnVec = new Vector3();\r\nconst _pushoutCapsulePushVec = new Vector3();\r\nconst _pushoutCapsuleScaled = new Vector3();\r\nconst _pushInSphereDirection = new Vector3();\r\nconst _pushInSphereDirectionN = new Vector3();\r\nconst _pushInSphereScaled = new Vector3();\r\nconst _pushInCapsuleVecN = new Vector3();\r\nconst _pushInCapsuleTargetVec = new Vector3();\r\nconst _pushInCapsuleTail = new Vector3();\r\nconst _pushInCapsulePosOnVec = new Vector3();\r\nconst _pushInCapsulePullVec = new Vector3();\r\nconst _pushInCapsulePullVecN = new Vector3();\r\nconst _pushInCapsuleScaled = new Vector3();\r\nconst _collisionSphereDir = new Vector3();\r\nconst _collisionSphereDirN = new Vector3();\r\nconst _collisionSphereToCenter = new Vector3();\r\nconst _collisionSphereScaled = new Vector3();\r\nconst _collisionSphereDiff = new Vector3();\r\nconst _collisionCapsuleTail = new Vector3();\r\nconst _collisionCapsulePointDir = new Vector3();\r\nconst _collisionCapsulePtOnCol = new Vector3();\r\nconst _collisionCapsulePtOnLine = new Vector3();\r\nconst _collisionCapsuleDiff = new Vector3();\r\nconst _collisionCapsuleTempLineResult: LineCollisionResult = {\r\n hit: false,\r\n pointOnLine: new Vector3(),\r\n pointOnCollider: new Vector3(),\r\n radius: 0\r\n};\r\nconst _nearestCross0 = new Vector3();\r\nconst _nearestCross1 = new Vector3();\r\nconst _nearestN1 = new Vector3();\r\nconst _nearestN2 = new Vector3();\r\nconst _nearestPosDiff = new Vector3();\r\nconst _nearestPointOnP = new Vector3();\r\nconst _nearestPointOnQ = new Vector3();\r\nconst _nearestPointDiff = new Vector3();\r\nconst _nearestResult: NearestPointsResult = {\r\n tP: 0,\r\n tQ: 0,\r\n pointOnP: new Vector3(),\r\n pointOnQ: new Vector3(),\r\n sqrDistance: 0\r\n};\r\nconst _surfaceNoHit: SurfaceCheckResult = {\r\n hit: false,\r\n intersectionPoint: new Vector3(),\r\n pushOut: new Vector3(),\r\n pointOnCollider: new Vector3(),\r\n radius: 0\r\n};\r\nconst _surfaceTriCenter = new Vector3();\r\nconst _surfaceEdgeAB = new Vector3();\r\nconst _surfaceEdgeAC = new Vector3();\r\nconst _surfacePlaneNormal = new Vector3();\r\nconst _surfacePlaneNormalNeg = new Vector3();\r\nconst _surfaceColliderDir = new Vector3();\r\nconst _surfaceRayDir = new Vector3();\r\nconst _surfaceRayDirN = new Vector3();\r\nconst _surfaceTail = new Vector3();\r\nconst _surfaceIntersection = new Vector3();\r\nconst _surfacePushOut = new Vector3();\r\nconst _surfaceToCol = new Vector3();\r\nconst _surfaceEndVec = new Vector3();\r\nconst _surfaceColDirVec = new Vector3();\r\nconst _surfaceIntersecToEnd = new Vector3();\r\nconst _surfaceColToEnd = new Vector3();\r\nconst _surfaceColToIntersect = new Vector3();\r\nconst _surfaceEVec = new Vector3();\r\nconst _surfacePoc2 = new Vector3();\r\nconst _triangleAp = new Vector3();\r\nconst _triangleBp = new Vector3();\r\nconst _triangleCp = new Vector3();\r\nconst _triangleU = new Vector3();\r\nconst _triangleV = new Vector3();\r\nconst _triangleW = new Vector3();\r\n\r\nfunction writeCollisionResult(\r\n out: CollisionResult | undefined,\r\n hit: boolean,\r\n point: Vector3,\r\n copyPoint: boolean\r\n) {\r\n if (!out) {\r\n return { hit, point: copyPoint ? point.clone() : point };\r\n }\r\n if (!out.point) {\r\n out.point = new Vector3();\r\n }\r\n out.hit = hit;\r\n out.point.set(point);\r\n return out;\r\n}\r\n\r\nfunction writeLineCollisionResult(\r\n out: LineCollisionResult | undefined,\r\n hit: boolean,\r\n pointOnLine: Vector3,\r\n pointOnCollider: Vector3,\r\n radius: number,\r\n copyVectors: boolean\r\n) {\r\n if (!out) {\r\n return {\r\n hit,\r\n pointOnLine: copyVectors ? pointOnLine.clone() : pointOnLine,\r\n pointOnCollider: copyVectors ? pointOnCollider.clone() : pointOnCollider,\r\n radius\r\n };\r\n }\r\n if (!out.pointOnLine) {\r\n out.pointOnLine = new Vector3();\r\n }\r\n if (!out.pointOnCollider) {\r\n out.pointOnCollider = new Vector3();\r\n }\r\n out.hit = hit;\r\n out.pointOnLine.set(pointOnLine);\r\n out.pointOnCollider.set(pointOnCollider);\r\n out.radius = radius;\r\n return out;\r\n}\r\n\r\nfunction writeSurfaceCheckResult(\r\n out: SurfaceCheckResult | undefined,\r\n hit: boolean,\r\n intersectionPoint: Vector3,\r\n pushOut: Vector3,\r\n pointOnCollider: Vector3,\r\n radius: number,\r\n copyVectors: boolean\r\n) {\r\n if (!out) {\r\n return {\r\n hit,\r\n intersectionPoint: copyVectors ? intersectionPoint.clone() : intersectionPoint,\r\n pushOut: copyVectors ? pushOut.clone() : pushOut,\r\n pointOnCollider: copyVectors ? pointOnCollider.clone() : pointOnCollider,\r\n radius\r\n };\r\n }\r\n if (!out.intersectionPoint) {\r\n out.intersectionPoint = new Vector3();\r\n }\r\n if (!out.pushOut) {\r\n out.pushOut = new Vector3();\r\n }\r\n if (!out.pointOnCollider) {\r\n out.pointOnCollider = new Vector3();\r\n }\r\n out.hit = hit;\r\n out.intersectionPoint.set(intersectionPoint);\r\n out.pushOut.set(pushOut);\r\n out.pointOnCollider.set(pointOnCollider);\r\n out.radius = radius;\r\n return out;\r\n}\r\n\r\nfunction writeNearestPointsResult(\r\n out: NearestPointsResult | undefined,\r\n tP: number,\r\n tQ: number,\r\n pointOnP: Vector3,\r\n pointOnQ: Vector3,\r\n sqrDistance: number,\r\n copyVectors: boolean\r\n) {\r\n if (!out) {\r\n return {\r\n tP,\r\n tQ,\r\n pointOnP: copyVectors ? pointOnP.clone() : pointOnP,\r\n pointOnQ: copyVectors ? pointOnQ.clone() : pointOnQ,\r\n sqrDistance\r\n };\r\n }\r\n out.tP = tP;\r\n out.tQ = tQ;\r\n out.pointOnP.set(pointOnP);\r\n out.pointOnQ.set(pointOnQ);\r\n out.sqrDistance = sqrDistance;\r\n return out;\r\n}\r\n\r\n// Pushout (keep point outside collider)\r\n\r\n/**\r\n * Pushes a point out of a sphere collider.\r\n *\r\n * @public\r\n */\r\nexport function pushoutFromSphere(\r\n center: Vector3,\r\n radius: number,\r\n pointRadius: number,\r\n point: Vector3,\r\n out?: CollisionResult\r\n): CollisionResult {\r\n const direction = Vector3.sub(point, center, _pushoutSphereDirection);\r\n const sqrLen = direction.magnitudeSq;\r\n if (sqrLen > EPSILON) {\r\n const dirLen = Math.sqrt(sqrLen) - pointRadius;\r\n if (dirLen < radius) {\r\n const scaled = Vector3.scale(direction, radius / dirLen, _pushoutSphereScaled);\r\n Vector3.add(center, scaled, scaled);\r\n return writeCollisionResult(out, true, scaled, !out);\r\n }\r\n }\r\n return writeCollisionResult(out, false, point, !out);\r\n}\r\n\r\n/**\r\n * Pushes a point out of a collider.\r\n *\r\n * @public\r\n */\r\nexport function pushoutFromCollider(\r\n colR: ColliderR,\r\n colRW: ColliderRW,\r\n point: Vector3,\r\n ptR: PointR,\r\n out?: CollisionResult\r\n): CollisionResult {\r\n if (colR.height <= EPSILON) {\r\n return pushoutFromSphere(colRW.positionCurrent, colRW.radius, ptR.pointRadius, point, out);\r\n }\r\n return pushoutFromCapsule(colR, colRW, point, ptR, out);\r\n}\r\n\r\n/**\r\n * Pushes a point out of a capsule collider.\r\n *\r\n * @public\r\n */\r\nexport function pushoutFromCapsule(\r\n colR: ColliderR,\r\n colRW: ColliderRW,\r\n point: Vector3,\r\n ptR: PointR,\r\n out?: CollisionResult\r\n): CollisionResult {\r\n const capsuleVec = colRW.directionCurrent;\r\n const capsuleHeight = colRW.height > EPSILON ? colRW.height : capsuleVec.magnitude;\r\n const capsuleVecN = Vector3.normalize(capsuleVec, _pushoutCapsuleVecN);\r\n const capsulePos = colRW.positionCurrent;\r\n const targetVec = Vector3.sub(point, capsulePos, _pushoutCapsuleTargetVec);\r\n const distOnVec = Vector3.dot(capsuleVecN, targetVec);\r\n\r\n if (distOnVec <= EPSILON) {\r\n return pushoutFromSphere(capsulePos, colRW.radius, ptR.pointRadius, point, out);\r\n }\r\n if (distOnVec >= capsuleHeight) {\r\n const tail = Vector3.add(capsulePos, capsuleVec, _pushoutCapsuleTail);\r\n return pushoutFromSphere(tail, colRW.radius * colR.radiusTailScale, ptR.pointRadius, point, out);\r\n }\r\n\r\n const posOnVec = Vector3.scale(capsuleVecN, distOnVec, _pushoutCapsulePosOnVec);\r\n Vector3.add(capsulePos, posOnVec, posOnVec);\r\n const pushVec = Vector3.sub(point, posOnVec, _pushoutCapsulePushVec);\r\n const sqrPushDist = pushVec.magnitudeSq;\r\n if (sqrPushDist > EPSILON) {\r\n const pushDist = Math.sqrt(sqrPushDist) - ptR.pointRadius;\r\n const r = colRW.radius * lerp(1.0, colR.radiusTailScale, distOnVec / capsuleHeight);\r\n if (pushDist < r) {\r\n const scaled = Vector3.scale(pushVec, r / pushDist, _pushoutCapsuleScaled);\r\n Vector3.add(posOnVec, scaled, scaled);\r\n return writeCollisionResult(out, true, scaled, !out);\r\n }\r\n }\r\n return writeCollisionResult(out, false, point, !out);\r\n}\r\n\r\n// PushIn (keep point inside collider - inverse mode)\r\n\r\n/**\r\n * Pulls a point inside a sphere collider.\r\n *\r\n * @public\r\n */\r\nexport function pushInFromSphere(\r\n center: Vector3,\r\n radius: number,\r\n point: Vector3,\r\n out?: CollisionResult\r\n): CollisionResult {\r\n const direction = Vector3.sub(center, point, _pushInSphereDirection);\r\n const sqrLen = direction.magnitudeSq;\r\n if (sqrLen > EPSILON && sqrLen > radius * radius) {\r\n const dirLen = Math.sqrt(sqrLen);\r\n const directionN = Vector3.normalize(direction, _pushInSphereDirectionN);\r\n const scaled = Vector3.scale(directionN, dirLen - radius, _pushInSphereScaled);\r\n Vector3.add(point, scaled, scaled);\r\n return writeCollisionResult(out, true, scaled, !out);\r\n }\r\n return writeCollisionResult(out, false, point, !out);\r\n}\r\n\r\n/**\r\n * Pulls a point inside a collider.\r\n *\r\n * @public\r\n */\r\nexport function pushInFromCollider(\r\n colR: ColliderR,\r\n colRW: ColliderRW,\r\n point: Vector3,\r\n out?: CollisionResult\r\n): CollisionResult {\r\n if (colR.height <= EPSILON) {\r\n return pushInFromSphere(colRW.positionCurrent, colRW.radius, point, out);\r\n }\r\n return pushInFromCapsule(colR, colRW, point, out);\r\n}\r\n\r\n/**\r\n * Pulls a point inside a capsule collider.\r\n *\r\n * @public\r\n */\r\nexport function pushInFromCapsule(\r\n colR: ColliderR,\r\n colRW: ColliderRW,\r\n point: Vector3,\r\n out?: CollisionResult\r\n): CollisionResult {\r\n const capsuleVec = colRW.directionCurrent;\r\n const capsuleHeight = colRW.height > EPSILON ? colRW.height : capsuleVec.magnitude;\r\n const capsuleVecN = Vector3.normalize(capsuleVec, _pushInCapsuleVecN);\r\n const capsulePos = colRW.positionCurrent;\r\n const targetVec = Vector3.sub(point, capsulePos, _pushInCapsuleTargetVec);\r\n const distOnVec = Vector3.dot(capsuleVecN, targetVec);\r\n\r\n if (distOnVec <= EPSILON) {\r\n return pushInFromSphere(capsulePos, colRW.radius, point, out);\r\n }\r\n if (distOnVec >= capsuleHeight) {\r\n const tail = Vector3.add(capsulePos, capsuleVec, _pushInCapsuleTail);\r\n return pushInFromSphere(tail, colRW.radius * colR.radiusTailScale, point, out);\r\n }\r\n\r\n const posOnVec = Vector3.scale(capsuleVecN, distOnVec, _pushInCapsulePosOnVec);\r\n Vector3.add(capsulePos, posOnVec, posOnVec);\r\n const pullVec = Vector3.sub(posOnVec, point, _pushInCapsulePullVec);\r\n const sqrPullDist = pullVec.magnitudeSq;\r\n if (sqrPullDist > EPSILON) {\r\n const r = colRW.radius * lerp(1.0, colR.radiusTailScale, distOnVec / capsuleHeight);\r\n if (sqrPullDist > r * r) {\r\n const pullDist = Math.sqrt(sqrPullDist);\r\n const pullVecN = Vector3.normalize(pullVec, _pushInCapsulePullVecN);\r\n const scaled = Vector3.scale(pullVecN, pullDist - r, _pushInCapsuleScaled);\r\n Vector3.add(point, scaled, scaled);\r\n return writeCollisionResult(out, true, scaled, !out);\r\n }\r\n }\r\n return writeCollisionResult(out, false, point, !out);\r\n}\r\n\r\n// Line segment vs collider detection\r\n\r\n/**\r\n * Performs sphere collision detection.\r\n *\r\n * @public\r\n */\r\nexport function collisionDetectionSphere(\r\n center: Vector3,\r\n radius: number,\r\n point1: Vector3,\r\n point2: Vector3,\r\n out?: LineCollisionResult\r\n): LineCollisionResult {\r\n const dir = Vector3.sub(point2, point1, _collisionSphereDir);\r\n const dirLen = dir.magnitude;\r\n if (dirLen < EPSILON) {\r\n return writeLineCollisionResult(out, false, point1, center, radius, !out);\r\n }\r\n const dirN = Vector3.scale(dir, 1 / dirLen, _collisionSphereDirN);\r\n const toCenter = Vector3.sub(center, point1, _collisionSphereToCenter);\r\n const dot = Vector3.dot(dirN, toCenter);\r\n const clamped = Math.max(0, Math.min(dot, dirLen));\r\n const ptOnLine = Vector3.scale(dirN, clamped, _collisionSphereScaled);\r\n Vector3.add(point1, ptOnLine, ptOnLine);\r\n const diff = Vector3.sub(center, ptOnLine, _collisionSphereDiff);\r\n const hit = diff.magnitudeSq <= radius * radius;\r\n return writeLineCollisionResult(out, hit, ptOnLine, center, radius, !out);\r\n}\r\n\r\n/**\r\n * Performs capsule collision detection.\r\n *\r\n * @public\r\n */\r\nexport function collisionDetectionCapsule(\r\n colR: ColliderR,\r\n colRW: ColliderRW,\r\n point1: Vector3,\r\n point2: Vector3,\r\n out?: LineCollisionResult\r\n): LineCollisionResult {\r\n const capsuleDir = colRW.directionCurrent;\r\n const capsulePos = colRW.positionCurrent;\r\n\r\n let res = collisionDetectionSphere(capsulePos, colRW.radius, point1, point2, out);\r\n if (res.hit) {\r\n return res;\r\n }\r\n\r\n const tail = Vector3.add(capsulePos, capsuleDir, _collisionCapsuleTail);\r\n res = collisionDetectionSphere(\r\n tail,\r\n colRW.radius * colR.radiusTailScale,\r\n point1,\r\n point2,\r\n _collisionCapsuleTempLineResult\r\n );\r\n if (res.hit) {\r\n return writeLineCollisionResult(out, true, res.pointOnLine, res.pointOnCollider, res.radius, !out);\r\n }\r\n\r\n const pointDir = Vector3.sub(point2, point1, _collisionCapsulePointDir);\r\n const nearest = computeNearestPoints(capsulePos, capsuleDir, point1, pointDir, _nearestResult);\r\n const t1 = Math.max(0, Math.min(1, nearest.tP));\r\n const r = colRW.radius * lerp(1.0, colR.radiusTailScale, t1);\r\n\r\n if (nearest.sqrDistance > r * r) {\r\n return writeLineCollisionResult(out, false, point1, capsulePos, r, !out);\r\n }\r\n\r\n const t2 = Math.max(0, Math.min(1, nearest.tQ));\r\n const ptOnCol = Vector3.scale(capsuleDir, t1, _collisionCapsulePtOnCol);\r\n Vector3.add(capsulePos, ptOnCol, ptOnCol);\r\n const ptOnLine = Vector3.scale(pointDir, t2, _collisionCapsulePtOnLine);\r\n Vector3.add(point1, ptOnLine, ptOnLine);\r\n const diff = Vector3.sub(ptOnCol, ptOnLine, _collisionCapsuleDiff);\r\n const hit = diff.magnitudeSq <= r * r;\r\n return writeLineCollisionResult(out, hit, ptOnLine, ptOnCol, r, !out);\r\n}\r\n\r\n/**\r\n * Performs collision detection against the specified collider.\r\n *\r\n * @public\r\n */\r\nexport function collisionDetection(\r\n colR: ColliderR,\r\n colRW: ColliderRW,\r\n point1: Vector3,\r\n point2: Vector3,\r\n out?: LineCollisionResult\r\n): LineCollisionResult {\r\n if (colR.height <= EPSILON) {\r\n return collisionDetectionSphere(colRW.positionCurrent, colRW.radius, point1, point2, out);\r\n }\r\n return collisionDetectionCapsule(colR, colRW, point1, point2, out);\r\n}\r\n\r\n/**\r\n * Performs inward collision detection.\r\n *\r\n * @public\r\n */\r\nexport function pushInCollisionDetection(\r\n colR: ColliderR,\r\n colRW: ColliderRW,\r\n point1: Vector3,\r\n point2: Vector3,\r\n out?: LineCollisionResult\r\n): LineCollisionResult {\r\n if (colR.height <= EPSILON) {\r\n return collisionDetectionSphere(colRW.positionCurrent, colRW.radius, point1, point2, out);\r\n }\r\n const res = collisionDetectionCapsule(colR, colRW, point1, point2, out);\r\n res.hit = false;\r\n return res;\r\n}\r\n\r\n// Nearest points between two line segments\r\n\r\n/**\r\n * Computes the nearest points between two segments.\r\n *\r\n * @public\r\n */\r\nexport function computeNearestPoints(\r\n posP: Vector3,\r\n dirP: Vector3,\r\n posQ: Vector3,\r\n dirQ: Vector3,\r\n out?: NearestPointsResult\r\n): {\r\n tP: number;\r\n tQ: number;\r\n pointOnP: Vector3;\r\n pointOnQ: Vector3;\r\n sqrDistance: number;\r\n} {\r\n const cross0 = Vector3.cross(dirQ, dirP, _nearestCross0);\r\n const n1 = Vector3.cross(dirP, cross0, _nearestN1);\r\n const cross1 = Vector3.cross(dirP, dirQ, _nearestCross1);\r\n const n2 = Vector3.cross(dirQ, cross1, _nearestN2);\r\n const dP_n2 = Vector3.dot(dirP, n2);\r\n const dQ_n1 = Vector3.dot(dirQ, n1);\r\n const posDiff = Vector3.sub(posQ, posP, _nearestPosDiff);\r\n const tP = dP_n2 !== 0 ? Vector3.dot(posDiff, n2) / dP_n2 : 0;\r\n const tQ = dQ_n1 !== 0 ? Vector3.dot(Vector3.scale(posDiff, -1, posDiff), n1) / dQ_n1 : 0;\r\n const pointOnP = Vector3.scale(dirP, tP, _nearestPointOnP);\r\n Vector3.add(posP, pointOnP, pointOnP);\r\n const pointOnQ = Vector3.scale(dirQ, tQ, _nearestPointOnQ);\r\n Vector3.add(posQ, pointOnQ, pointOnQ);\r\n const diff = Vector3.sub(pointOnQ, pointOnP, _nearestPointDiff);\r\n return writeNearestPointsResult(out, tP, tQ, pointOnP, pointOnQ, diff.magnitudeSq, !out);\r\n}\r\n\r\n// Surface collision (triangle-based)\r\n\r\n/**\r\n * Checks triangle-surface collision against a collider.\r\n *\r\n * @public\r\n */\r\nexport function checkSurfaceCollision(\r\n ptA: Vector3,\r\n ptB: Vector3,\r\n ptC: Vector3,\r\n colliderPos: Vector3,\r\n colR: ColliderR,\r\n colRW: ColliderRW,\r\n out?: SurfaceCheckResult\r\n): SurfaceCheckResult {\r\n _surfaceNoHit.hit = false;\r\n _surfaceNoHit.intersectionPoint.setXYZ(0, 0, 0);\r\n _surfaceNoHit.pushOut.setXYZ(0, 0, 0);\r\n _surfaceNoHit.pointOnCollider.set(colliderPos);\r\n _surfaceNoHit.radius = colRW.radius;\r\n\r\n let pointOnCollider = colliderPos;\r\n let radius = colRW.radius;\r\n const isCapsule = colR.height > EPSILON;\r\n\r\n const triCenter = centerOfTriangle(ptA, ptB, ptC, _surfaceTriCenter);\r\n const edgeAB = Vector3.sub(ptB, ptA, _surfaceEdgeAB);\r\n const edgeAC = Vector3.sub(ptC, ptA, _surfaceEdgeAC);\r\n const planeNormal = Vector3.cross(edgeAB, edgeAC, _surfacePlaneNormal);\r\n Vector3.normalize(planeNormal, planeNormal);\r\n Vector3.scale(planeNormal, -1, planeNormal);\r\n const planeNormalNeg = Vector3.scale(planeNormal, -1, _surfacePlaneNormalNeg);\r\n const planeDist = -Vector3.dot(planeNormalNeg, ptA);\r\n const colliderDir = Vector3.sub(colliderPos, triCenter, _surfaceColliderDir);\r\n Vector3.normalize(colliderDir, colliderDir);\r\n const dot = Vector3.dot(colliderDir, planeNormal);\r\n\r\n if (isCapsule) {\r\n const side = Vector3.dot(colRW.directionCurrent, planeNormal) * dot;\r\n const rayDir = Vector3.scale(planeNormal, dot * -1, _surfaceRayDir);\r\n const tempPOC = pointOnCollider;\r\n\r\n if (side < 0) {\r\n radius = colRW.radius * colR.radiusTailScale;\r\n pointOnCollider = Vector3.add(colliderPos, colRW.directionCurrent, _surfaceTail);\r\n }\r\n\r\n const rayDirN = Vector3.normalize(rayDir, _surfaceRayDirN);\r\n const enter = raycast(planeNormalNeg, planeDist, pointOnCollider, rayDirN);\r\n if (enter !== null) {\r\n const ip = Vector3.scale(rayDirN, enter, _surfaceIntersection);\r\n Vector3.add(pointOnCollider, ip, ip);\r\n if (triangleContainsPoint(ptA, ptB, ptC, ip)) {\r\n const pushOut = Vector3.sub(ip, pointOnCollider, _surfacePushOut);\r\n const toCol = Vector3.sub(pointOnCollider, ip, _surfaceToCol);\r\n if (toCol.magnitudeSq <= radius * radius) {\r\n return writeSurfaceCheckResult(out, true, ip, pushOut, pointOnCollider, radius, !out);\r\n }\r\n }\r\n } else if (colR.forceType !== ColliderForce.Off) {\r\n pointOnCollider = tempPOC;\r\n let endVec = Vector3.add(colliderPos, colRW.directionCurrent, _surfaceEndVec);\r\n _surfaceColDirVec.set(colRW.directionCurrent);\r\n let colDirVec = _surfaceColDirVec;\r\n if (colR.forceType === ColliderForce.Pull) {\r\n const tmp = pointOnCollider;\r\n pointOnCollider = endVec;\r\n endVec = tmp;\r\n colDirVec = Vector3.scale(colDirVec, -1, colDirVec);\r\n }\r\n const enter2 = raycast(planeNormalNeg, planeDist, pointOnCollider, colDirVec);\r\n if (enter2 !== null) {\r\n const ip = Vector3.scale(colDirVec, enter2, _surfaceIntersection);\r\n Vector3.add(pointOnCollider, ip, ip);\r\n if (triangleContainsPoint(ptA, ptB, ptC, ip)) {\r\n const intersecToEnd = Vector3.sub(endVec, ip, _surfaceIntersecToEnd);\r\n const colToEnd = Vector3.sub(endVec, pointOnCollider, _surfaceColToEnd);\r\n const colToIntersect = Vector3.sub(ip, pointOnCollider, _surfaceColToIntersect);\r\n const pDot = Vector3.dot(intersecToEnd, colToIntersect);\r\n const lDot = Vector3.dot(colToEnd, colToEnd);\r\n if (!(pDot >= 0 && pDot <= lDot)) {\r\n return writeSurfaceCheckResult(\r\n out,\r\n _surfaceNoHit.hit,\r\n _surfaceNoHit.intersectionPoint,\r\n _surfaceNoHit.pushOut,\r\n _surfaceNoHit.pointOnCollider,\r\n _surfaceNoHit.radius,\r\n !out\r\n );\r\n }\r\n const dotVal = Vector3.dot(colToEnd, colToIntersect);\r\n const s2eMag = Vector3.dot(colToEnd, colToEnd);\r\n const colToEndN = Vector3.normalize(colToEnd, colToEnd);\r\n const eVec = Vector3.scale(colToEndN, -radius, _surfaceEVec);\r\n Vector3.add(pointOnCollider, eVec, eVec);\r\n const pushOut = Vector3.sub(ip, eVec, _surfacePushOut);\r\n const poc2 = Vector3.scale(colToEnd, dotVal / s2eMag, _surfacePoc2);\r\n Vector3.add(pointOnCollider, poc2, poc2);\r\n const toCol = Vector3.sub(poc2, ip, _surfaceToCol);\r\n if (toCol.magnitudeSq <= radius * radius) {\r\n return writeSurfaceCheckResult(out, true, ip, pushOut, poc2, radius, !out);\r\n }\r\n }\r\n }\r\n }\r\n } else {\r\n const rayDir = Vector3.scale(planeNormal, dot * -1, _surfaceRayDir);\r\n const rayDirN = Vector3.normalize(rayDir, _surfaceRayDirN);\r\n const enter = raycast(planeNormalNeg, planeDist, pointOnCollider, rayDirN);\r\n if (enter !== null) {\r\n const ip = Vector3.scale(rayDirN, enter, _surfaceIntersection);\r\n Vector3.add(pointOnCollider, ip, ip);\r\n if (triangleContainsPoint(ptA, ptB, ptC, ip)) {\r\n const pushOut = Vector3.sub(ip, pointOnCollider, _surfacePushOut);\r\n const toCol = Vector3.sub(pointOnCollider, ip, _surfaceToCol);\r\n if (toCol.magnitudeSq <= radius * radius) {\r\n return writeSurfaceCheckResult(out, true, ip, pushOut, pointOnCollider, radius, !out);\r\n }\r\n }\r\n }\r\n }\r\n\r\n return writeSurfaceCheckResult(\r\n out,\r\n _surfaceNoHit.hit,\r\n _surfaceNoHit.intersectionPoint,\r\n _surfaceNoHit.pushOut,\r\n _surfaceNoHit.pointOnCollider,\r\n _surfaceNoHit.radius,\r\n !out\r\n );\r\n}\r\n\r\n// Helpers\r\n\r\nfunction raycast(normal: Vector3, planeDist: number, origin: Vector3, direction: Vector3): number | null {\r\n const vdot = Vector3.dot(direction, normal);\r\n const ndot = -Vector3.dot(origin, normal) - planeDist;\r\n if (Math.abs(vdot) <= EPSILON) {\r\n return null;\r\n }\r\n const enter = ndot / vdot;\r\n return enter > 0 ? enter : null;\r\n}\r\n\r\nfunction centerOfTriangle(a: Vector3, b: Vector3, c: Vector3, result?: Vector3): Vector3 {\r\n result = result || new Vector3();\r\n return result.setXYZ((a.x + b.x + c.x) / 3, (a.y + b.y + c.y) / 3, (a.z + b.z + c.z) / 3);\r\n}\r\n\r\nfunction triangleContainsPoint(a: Vector3, b: Vector3, c: Vector3, p: Vector3): boolean {\r\n const ap = Vector3.sub(a, p, _triangleAp);\r\n const bp = Vector3.sub(b, p, _triangleBp);\r\n const cp = Vector3.sub(c, p, _triangleCp);\r\n const u = Vector3.cross(ap, bp, _triangleU);\r\n const vv = Vector3.cross(bp, cp, _triangleV);\r\n const w = Vector3.cross(cp, ap, _triangleW);\r\n if (Vector3.dot(u, vv) < 0) {\r\n return false;\r\n }\r\n if (Vector3.dot(vv, w) < 0) {\r\n return false;\r\n }\r\n return true;\r\n}\r\n\r\nfunction lerp(a: number, b: number, t: number): number {\r\n return a + (b - a) * t;\r\n}\r\n"],"names":["_pushoutSphereDirection","Vector3","_pushoutSphereScaled","_pushoutCapsuleVecN","_pushoutCapsuleTargetVec","_pushoutCapsuleTail","_pushoutCapsulePosOnVec","_pushoutCapsulePushVec","_pushoutCapsuleScaled","_pushInSphereDirection","_pushInSphereDirectionN","_pushInSphereScaled","_pushInCapsuleVecN","_pushInCapsuleTargetVec","_pushInCapsuleTail","_pushInCapsulePosOnVec","_pushInCapsulePullVec","_pushInCapsulePullVecN","_pushInCapsuleScaled","_collisionSphereDir","_collisionSphereDirN","_collisionSphereToCenter","_collisionSphereScaled","_collisionSphereDiff","_collisionCapsuleTail","_collisionCapsulePointDir","_collisionCapsulePtOnCol","_collisionCapsulePtOnLine","_collisionCapsuleDiff","_collisionCapsuleTempLineResult","hit","pointOnLine","pointOnCollider","radius","_nearestCross0","_nearestCross1","_nearestN1","_nearestN2","_nearestPosDiff","_nearestPointOnP","_nearestPointOnQ","_nearestPointDiff","_nearestResult","tP","tQ","pointOnP","pointOnQ","sqrDistance","_surfaceNoHit","intersectionPoint","pushOut","_surfaceTriCenter","_surfaceEdgeAB","_surfaceEdgeAC","_surfacePlaneNormal","_surfacePlaneNormalNeg","_surfaceColliderDir","_surfaceRayDir","_surfaceRayDirN","_surfaceTail","_surfaceIntersection","_surfacePushOut","_surfaceToCol","_surfaceEndVec","_surfaceColDirVec","_surfaceIntersecToEnd","_surfaceColToEnd","_surfaceColToIntersect","_surfaceEVec","_surfacePoc2","_triangleAp","_triangleBp","_triangleCp","_triangleU","_triangleV","_triangleW","writeCollisionResult","out","point","copyPoint","clone","set","writeLineCollisionResult","copyVectors","writeSurfaceCheckResult","writeNearestPointsResult","pushoutFromSphere","center","pointRadius","direction","sub","sqrLen","magnitudeSq","EPSILON","dirLen","Math","sqrt","scaled","scale","add","pushoutFromCollider","colR","colRW","ptR","height","positionCurrent","pushoutFromCapsule","capsuleVec","directionCurrent","capsuleHeight","magnitude","capsuleVecN","normalize","capsulePos","targetVec","distOnVec","dot","tail","radiusTailScale","posOnVec","pushVec","sqrPushDist","pushDist","r","lerp","pushInFromSphere","directionN","pushInFromCollider","pushInFromCapsule","pullVec","sqrPullDist","pullDist","pullVecN","collisionDetectionSphere","point1","point2","dir","dirN","toCenter","clamped","max","min","ptOnLine","diff","collisionDetectionCapsule","capsuleDir","res","pointDir","nearest","computeNearestPoints","t1","t2","ptOnCol","collisionDetection","pushInCollisionDetection","posP","dirP","posQ","dirQ","cross0","cross","n1","cross1","n2","dP_n2","dQ_n1","posDiff","checkSurfaceCollision","ptA","ptB","ptC","colliderPos","setXYZ","isCapsule","triCenter","centerOfTriangle","edgeAB","edgeAC","planeNormal","planeNormalNeg","planeDist","colliderDir","side","rayDir","tempPOC","rayDirN","enter","raycast","ip","triangleContainsPoint","toCol","forceType","ColliderForce","Off","endVec","colDirVec","Pull","tmp","enter2","intersecToEnd","colToEnd","colToIntersect","pDot","lDot","dotVal","s2eMag","colToEndN","eVec","poc2","normal","origin","vdot","ndot","abs","a","b","c","result","x","y","z","p","ap","bp","cp","u","vv","w","t"],"mappings":"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"}