@zephyr3d/scene 0.8.2 → 0.9.1

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 (241) hide show
  1. package/dist/animation/animationset.js +473 -60
  2. package/dist/animation/animationset.js.map +1 -1
  3. package/dist/animation/cloth/gpu_cloth_system.js +2516 -0
  4. package/dist/animation/cloth/gpu_cloth_system.js.map +1 -0
  5. package/dist/animation/fixed_geometry_cache_track.js +138 -0
  6. package/dist/animation/fixed_geometry_cache_track.js.map +1 -0
  7. package/dist/animation/geometry_cache_utils.js +120 -0
  8. package/dist/animation/geometry_cache_utils.js.map +1 -0
  9. package/dist/animation/ik_modifier.js +9 -1
  10. package/dist/animation/ik_modifier.js.map +1 -1
  11. package/dist/animation/joint_dynamics/collision.js +469 -0
  12. package/dist/animation/joint_dynamics/collision.js.map +1 -0
  13. package/dist/animation/joint_dynamics/constraints.js +329 -0
  14. package/dist/animation/joint_dynamics/constraints.js.map +1 -0
  15. package/dist/animation/joint_dynamics/controller.js +699 -0
  16. package/dist/animation/joint_dynamics/controller.js.map +1 -0
  17. package/dist/animation/joint_dynamics/joint_dynamics_system.js +393 -0
  18. package/dist/animation/joint_dynamics/joint_dynamics_system.js.map +1 -0
  19. package/dist/animation/joint_dynamics/solver.js +794 -0
  20. package/dist/animation/joint_dynamics/solver.js.map +1 -0
  21. package/dist/animation/joint_dynamics/types.js +19 -0
  22. package/dist/animation/joint_dynamics/types.js.map +1 -0
  23. package/dist/animation/joint_dynamics/vrm_spring_bone.js +46 -0
  24. package/dist/animation/joint_dynamics/vrm_spring_bone.js.map +1 -0
  25. package/dist/animation/joint_dynamics_modifier.js +51 -0
  26. package/dist/animation/joint_dynamics_modifier.js.map +1 -0
  27. package/dist/animation/pca_geometry_cache_track.js +222 -0
  28. package/dist/animation/pca_geometry_cache_track.js.map +1 -0
  29. package/dist/animation/skeleton.js +2011 -139
  30. package/dist/animation/skeleton.js.map +1 -1
  31. package/dist/animation/skeleton_modifier.js +3 -5
  32. package/dist/animation/skeleton_modifier.js.map +1 -1
  33. package/dist/animation/spring/multi_chain_spring_system.js +2 -0
  34. package/dist/animation/spring/multi_chain_spring_system.js.map +1 -1
  35. package/dist/animation/spring/spring_chain.js +3 -2
  36. package/dist/animation/spring/spring_chain.js.map +1 -1
  37. package/dist/animation/spring/spring_collider.js +35 -5
  38. package/dist/animation/spring/spring_collider.js.map +1 -1
  39. package/dist/animation/spring/spring_particle.js +1 -0
  40. package/dist/animation/spring/spring_particle.js.map +1 -1
  41. package/dist/animation/spring/spring_system.js +325 -28
  42. package/dist/animation/spring/spring_system.js.map +1 -1
  43. package/dist/animation/spring2/collision.js +469 -0
  44. package/dist/animation/spring2/collision.js.map +1 -0
  45. package/dist/animation/spring2/constraints.js +329 -0
  46. package/dist/animation/spring2/constraints.js.map +1 -0
  47. package/dist/animation/spring2/controller.js +434 -0
  48. package/dist/animation/spring2/controller.js.map +1 -0
  49. package/dist/animation/spring2/math.js +16 -0
  50. package/dist/animation/spring2/math.js.map +1 -0
  51. package/dist/animation/spring2/solver.js +624 -0
  52. package/dist/animation/spring2/solver.js.map +1 -0
  53. package/dist/animation/spring2/spring_system.js +118 -0
  54. package/dist/animation/spring2/spring_system.js.map +1 -0
  55. package/dist/animation/spring2/types.js +19 -0
  56. package/dist/animation/spring2/types.js.map +1 -0
  57. package/dist/animation/spring_modifier.js +17 -1
  58. package/dist/animation/spring_modifier.js.map +1 -1
  59. package/dist/app/engine.js +42 -15
  60. package/dist/app/engine.js.map +1 -1
  61. package/dist/app/runtimescript.js +132 -1
  62. package/dist/app/runtimescript.js.map +1 -1
  63. package/dist/app/screen.js +3 -3
  64. package/dist/app/screen.js.map +1 -1
  65. package/dist/app/scriptingsystem.js +69 -37
  66. package/dist/app/scriptingsystem.js.map +1 -1
  67. package/dist/app/scriptregistry.js +14 -3
  68. package/dist/app/scriptregistry.js.map +1 -1
  69. package/dist/asset/assetmanager.js +2 -1
  70. package/dist/asset/assetmanager.js.map +1 -1
  71. package/dist/asset/loaders/zabc/zabc_loader.js +570 -0
  72. package/dist/asset/loaders/zabc/zabc_loader.js.map +1 -0
  73. package/dist/asset/model.js +192 -0
  74. package/dist/asset/model.js.map +1 -1
  75. package/dist/camera/base.js +26 -7
  76. package/dist/camera/base.js.map +1 -1
  77. package/dist/camera/camera.js +146 -24
  78. package/dist/camera/camera.js.map +1 -1
  79. package/dist/camera/fps.js +2 -2
  80. package/dist/camera/fps.js.map +1 -1
  81. package/dist/camera/orbit.js +2 -2
  82. package/dist/camera/orbit.js.map +1 -1
  83. package/dist/index.d.ts +11728 -8535
  84. package/dist/index.js +29 -8
  85. package/dist/index.js.map +1 -1
  86. package/dist/material/lambert.js +1 -1
  87. package/dist/material/lambert.js.map +1 -1
  88. package/dist/material/material.js +9 -3
  89. package/dist/material/material.js.map +1 -1
  90. package/dist/material/meshmaterial.js +54 -7
  91. package/dist/material/meshmaterial.js.map +1 -1
  92. package/dist/material/mixins/lightmodel/blinnphong.js +17 -7
  93. package/dist/material/mixins/lightmodel/blinnphong.js.map +1 -1
  94. package/dist/material/mixins/lightmodel/lambert.js +7 -2
  95. package/dist/material/mixins/lightmodel/lambert.js.map +1 -1
  96. package/dist/material/mixins/lightmodel/pbrblueprintmixin.js +108 -16
  97. package/dist/material/mixins/lightmodel/pbrblueprintmixin.js.map +1 -1
  98. package/dist/material/mixins/lightmodel/pbrmetallicroughness.js +209 -14
  99. package/dist/material/mixins/lightmodel/pbrmetallicroughness.js.map +1 -1
  100. package/dist/material/mixins/lightmodel/pbrspecularglossness.js +24 -12
  101. package/dist/material/mixins/lightmodel/pbrspecularglossness.js.map +1 -1
  102. package/dist/material/mixins/lit.js +11 -8
  103. package/dist/material/mixins/lit.js.map +1 -1
  104. package/dist/material/mixins/pbr/common.js +72 -5
  105. package/dist/material/mixins/pbr/common.js.map +1 -1
  106. package/dist/material/pbrblueprint.js +148 -1
  107. package/dist/material/pbrblueprint.js.map +1 -1
  108. package/dist/material/pbrmr.js +115 -2
  109. package/dist/material/pbrmr.js.map +1 -1
  110. package/dist/material/shader/helper.js +10 -4
  111. package/dist/material/shader/helper.js.map +1 -1
  112. package/dist/material/water.js +2 -2
  113. package/dist/material/water.js.map +1 -1
  114. package/dist/posteffect/coloradjust.js +145 -0
  115. package/dist/posteffect/coloradjust.js.map +1 -0
  116. package/dist/posteffect/taa.js +68 -32
  117. package/dist/posteffect/taa.js.map +1 -1
  118. package/dist/render/cluster_light.js +17 -12
  119. package/dist/render/cluster_light.js.map +1 -1
  120. package/dist/render/deferredlightpass.js +510 -0
  121. package/dist/render/deferredlightpass.js.map +1 -0
  122. package/dist/render/deferredshadowlightpass.js +428 -0
  123. package/dist/render/deferredshadowlightpass.js.map +1 -0
  124. package/dist/render/drawable.js.map +1 -1
  125. package/dist/render/drawable_mixin.js +21 -12
  126. package/dist/render/drawable_mixin.js.map +1 -1
  127. package/dist/render/envlight.js +20 -22
  128. package/dist/render/envlight.js.map +1 -1
  129. package/dist/render/gbufferpass.js +50 -0
  130. package/dist/render/gbufferpass.js.map +1 -0
  131. package/dist/render/lightpass.js +1 -2
  132. package/dist/render/lightpass.js.map +1 -1
  133. package/dist/render/primitive.js +1 -1
  134. package/dist/render/primitive.js.map +1 -1
  135. package/dist/render/render_queue.js +3 -2
  136. package/dist/render/render_queue.js.map +1 -1
  137. package/dist/render/renderer.js +5 -358
  138. package/dist/render/renderer.js.map +1 -1
  139. package/dist/render/rendergraph/executor.js +15 -12
  140. package/dist/render/rendergraph/executor.js.map +1 -1
  141. package/dist/render/rendergraph/forward_plus_builder.js +144 -88
  142. package/dist/render/rendergraph/forward_plus_builder.js.map +1 -1
  143. package/dist/render/rendergraph/history_resource_manager.js +178 -0
  144. package/dist/render/rendergraph/history_resource_manager.js.map +1 -0
  145. package/dist/render/rendergraph/rendergraph.js +12 -1
  146. package/dist/render/rendergraph/rendergraph.js.map +1 -1
  147. package/dist/render/rendergraph/types.js +2 -2
  148. package/dist/render/rendergraph/types.js.map +1 -1
  149. package/dist/render/sky.js +26 -9
  150. package/dist/render/sky.js.map +1 -1
  151. package/dist/scene/basesprite.js +4 -3
  152. package/dist/scene/basesprite.js.map +1 -1
  153. package/dist/scene/batchgroup.js +4 -4
  154. package/dist/scene/environment.js +7 -4
  155. package/dist/scene/environment.js.map +1 -1
  156. package/dist/scene/light.js +184 -18
  157. package/dist/scene/light.js.map +1 -1
  158. package/dist/scene/mesh.js +30 -0
  159. package/dist/scene/mesh.js.map +1 -1
  160. package/dist/scene/particlesys.js +3 -2
  161. package/dist/scene/particlesys.js.map +1 -1
  162. package/dist/scene/raycast_visitor.js +29 -3
  163. package/dist/scene/raycast_visitor.js.map +1 -1
  164. package/dist/scene/scene.js +86 -19
  165. package/dist/scene/scene.js.map +1 -1
  166. package/dist/scene/scene_node.js +87 -31
  167. package/dist/scene/scene_node.js.map +1 -1
  168. package/dist/scene/script_attachment.js +59 -0
  169. package/dist/scene/script_attachment.js.map +1 -0
  170. package/dist/scene/terrain-cm/grass.js +3 -2
  171. package/dist/scene/terrain-cm/grass.js.map +1 -1
  172. package/dist/scene/terrain-cm/terrain-cm.js +4 -3
  173. package/dist/scene/terrain-cm/terrain-cm.js.map +1 -1
  174. package/dist/scene/water.js +3 -2
  175. package/dist/scene/water.js.map +1 -1
  176. package/dist/shaders/shadow.js +2 -2
  177. package/dist/shaders/shadow.js.map +1 -1
  178. package/dist/shadow/shadowmapper.js +74 -4
  179. package/dist/shadow/shadowmapper.js.map +1 -1
  180. package/dist/shapes/box.js +163 -0
  181. package/dist/shapes/box.js.map +1 -1
  182. package/dist/shapes/capsule.js +216 -0
  183. package/dist/shapes/capsule.js.map +1 -0
  184. package/dist/shapes/cylinder.js +91 -0
  185. package/dist/shapes/cylinder.js.map +1 -1
  186. package/dist/shapes/plane.js +32 -0
  187. package/dist/shapes/plane.js.map +1 -1
  188. package/dist/shapes/tetrahedron.js +211 -0
  189. package/dist/shapes/tetrahedron.js.map +1 -1
  190. package/dist/shapes/torus.js +173 -0
  191. package/dist/shapes/torus.js.map +1 -1
  192. package/dist/utility/blueprint/common/math.js +111 -1
  193. package/dist/utility/blueprint/common/math.js.map +1 -1
  194. package/dist/utility/blueprint/material/inputs.js +235 -1
  195. package/dist/utility/blueprint/material/inputs.js.map +1 -1
  196. package/dist/utility/blueprint/material/ir.js +154 -10
  197. package/dist/utility/blueprint/material/ir.js.map +1 -1
  198. package/dist/utility/blueprint/material/texture.js +273 -19
  199. package/dist/utility/blueprint/material/texture.js.map +1 -1
  200. package/dist/utility/serialization/json.js +12 -2
  201. package/dist/utility/serialization/json.js.map +1 -1
  202. package/dist/utility/serialization/manager.js +30 -11
  203. package/dist/utility/serialization/manager.js.map +1 -1
  204. package/dist/utility/serialization/scene/animation.js +250 -7
  205. package/dist/utility/serialization/scene/animation.js.map +1 -1
  206. package/dist/utility/serialization/scene/batch.js +4 -2
  207. package/dist/utility/serialization/scene/batch.js.map +1 -1
  208. package/dist/utility/serialization/scene/camera.js +154 -2
  209. package/dist/utility/serialization/scene/camera.js.map +1 -1
  210. package/dist/utility/serialization/scene/cloth_script.js +834 -0
  211. package/dist/utility/serialization/scene/cloth_script.js.map +1 -0
  212. package/dist/utility/serialization/scene/common.js +7 -0
  213. package/dist/utility/serialization/scene/common.js.map +1 -1
  214. package/dist/utility/serialization/scene/light.js +120 -4
  215. package/dist/utility/serialization/scene/light.js.map +1 -1
  216. package/dist/utility/serialization/scene/material.js +453 -1
  217. package/dist/utility/serialization/scene/material.js.map +1 -1
  218. package/dist/utility/serialization/scene/mesh.js +4 -2
  219. package/dist/utility/serialization/scene/mesh.js.map +1 -1
  220. package/dist/utility/serialization/scene/node.js +298 -10
  221. package/dist/utility/serialization/scene/node.js.map +1 -1
  222. package/dist/utility/serialization/scene/particle.js +4 -2
  223. package/dist/utility/serialization/scene/particle.js.map +1 -1
  224. package/dist/utility/serialization/scene/primitive.js +100 -3
  225. package/dist/utility/serialization/scene/primitive.js.map +1 -1
  226. package/dist/utility/serialization/scene/scene.js +130 -3
  227. package/dist/utility/serialization/scene/scene.js.map +1 -1
  228. package/dist/utility/serialization/scene/script.js +66 -0
  229. package/dist/utility/serialization/scene/script.js.map +1 -0
  230. package/dist/utility/serialization/scene/spring_script.js +596 -0
  231. package/dist/utility/serialization/scene/spring_script.js.map +1 -0
  232. package/dist/utility/serialization/scene/sprite.js +5 -3
  233. package/dist/utility/serialization/scene/sprite.js.map +1 -1
  234. package/dist/utility/serialization/scene/terrain.js +4 -2
  235. package/dist/utility/serialization/scene/terrain.js.map +1 -1
  236. package/dist/utility/serialization/scene/water.js +4 -2
  237. package/dist/utility/serialization/scene/water.js.map +1 -1
  238. package/dist/utility/serialization/types.js.map +1 -1
  239. package/dist/values.js +5 -1
  240. package/dist/values.js.map +1 -1
  241. package/package.json +3 -3
@@ -1 +1 @@
1
- {"version":3,"file":"tetrahedron.js","sources":["../../src/shapes/tetrahedron.ts"],"sourcesContent":["import { Vector3, type AABB, type Clonable } from '@zephyr3d/base';\r\nimport type { ShapeCreationOptions } from './shape';\r\nimport { Shape } from './shape';\r\n\r\n/**\r\n * Creation options for tetrahedron shape\r\n * @public\r\n */\r\nexport interface TetrahedronCreationOptions extends ShapeCreationOptions {\r\n height?: number;\r\n sizeX?: number;\r\n sizeZ?: number;\r\n}\r\n\r\n/**\r\n * Tetrahedron shape\r\n * @public\r\n */\r\nexport class TetrahedronShape\r\n extends Shape<TetrahedronCreationOptions>\r\n implements Clonable<TetrahedronShape>\r\n{\r\n static _defaultOptions = {\r\n ...Shape._defaultOptions,\r\n height: 1,\r\n sizeX: 1,\r\n sizeZ: 1\r\n };\r\n\r\n constructor(options?: TetrahedronCreationOptions) {\r\n super(options);\r\n }\r\n\r\n clone() {\r\n return new TetrahedronShape(this._options) as this;\r\n }\r\n\r\n get type() {\r\n return 'Tetrahedron';\r\n }\r\n\r\n private static calculateTriangleNormal(v0: Vector3, v1: Vector3, v2: Vector3) {\r\n const edge1 = Vector3.sub(v1, v0);\r\n const edge2 = Vector3.sub(v2, v0);\r\n return Vector3.normalize(Vector3.cross(edge1, edge2));\r\n }\r\n\r\n private static addTriangle(\r\n v0: Vector3,\r\n v1: Vector3,\r\n v2: Vector3,\r\n vertices: number[],\r\n normals: number[],\r\n tangents: number[],\r\n uvs: number[],\r\n indices: number[],\r\n indexOffset: number,\r\n currentVertexIndex: number\r\n ) {\r\n // Calculate normal\r\n const normal = this.calculateTriangleNormal(v0, v1, v2);\r\n\r\n // Add vertex\r\n vertices.push(v0.x, v0.y, v0.z);\r\n vertices.push(v1.x, v1.y, v1.z);\r\n vertices.push(v2.x, v2.y, v2.z);\r\n\r\n // Add normal\r\n normals?.push(normal.x, normal.y, normal.z);\r\n normals?.push(normal.x, normal.y, normal.z);\r\n normals?.push(normal.x, normal.y, normal.z);\r\n\r\n const uv0 = [0.5, 0];\r\n const uv1 = [0, 1];\r\n const uv2 = [1, 1];\r\n // Add UV\r\n uvs?.push(...uv0); // 顶点\r\n uvs?.push(...uv1); // 左下\r\n uvs?.push(...uv2); // 右下\r\n\r\n if (tangents) {\r\n const t = this.computeTangent(\r\n [v0.x, v0.y, v0.z],\r\n [v1.x, v1.y, v1.z],\r\n [v2.x, v2.y, v2.z],\r\n uv0,\r\n uv1,\r\n uv2,\r\n [normal.x, normal.y, normal.z]\r\n );\r\n tangents.push(...t);\r\n tangents.push(...t);\r\n tangents.push(...t);\r\n }\r\n\r\n // Add index (CCW)\r\n indices.push(indexOffset + currentVertexIndex);\r\n indices.push(indexOffset + currentVertexIndex + 1);\r\n indices.push(indexOffset + currentVertexIndex + 2);\r\n\r\n return currentVertexIndex + 3;\r\n }\r\n\r\n static generateData(\r\n opt: TetrahedronCreationOptions,\r\n vertices: number[],\r\n normals: number[],\r\n tangents: number[],\r\n uvs: number[],\r\n indices: number[],\r\n bbox?: AABB,\r\n indexOffset?: number,\r\n vertexCallback?: (index: number, x: number, y: number, z: number) => void\r\n ) {\r\n const options = Object.assign({}, this._defaultOptions, opt ?? {});\r\n indexOffset = indexOffset ?? 0;\r\n const start = vertices.length;\r\n\r\n const height = options.height;\r\n const sizeX = options.sizeX;\r\n const sizeZ = options.sizeZ;\r\n\r\n // Five vertices for the tetrahedron\r\n const topVertex = new Vector3(0, height, 0);\r\n const bottomVertices = [\r\n new Vector3(sizeX, 0, sizeZ), // pxpz\r\n new Vector3(sizeX, 0, -sizeZ), // pxnz\r\n new Vector3(-sizeX, 0, -sizeZ), // nxnz\r\n new Vector3(-sizeX, 0, sizeZ) // nxpz\r\n ];\r\n\r\n let _currentVertexIndex = 0;\r\n\r\n // Right plane (top -> pxpz -> pxnz)\r\n _currentVertexIndex = this.addTriangle(\r\n topVertex,\r\n bottomVertices[0], // pxpz\r\n bottomVertices[1], // pxnz\r\n vertices,\r\n normals,\r\n tangents,\r\n uvs,\r\n indices,\r\n indexOffset,\r\n _currentVertexIndex\r\n );\r\n\r\n // Back plane (top -> pxnz -> nxnz)\r\n _currentVertexIndex = this.addTriangle(\r\n topVertex,\r\n bottomVertices[1], // pxnz\r\n bottomVertices[2], // nxnz\r\n vertices,\r\n normals,\r\n tangents,\r\n uvs,\r\n indices,\r\n indexOffset,\r\n _currentVertexIndex\r\n );\r\n\r\n // Left plane (top -> nxnz -> nxpz)\r\n _currentVertexIndex = this.addTriangle(\r\n topVertex,\r\n bottomVertices[2], // nxnz\r\n bottomVertices[3], // nxpz\r\n vertices,\r\n normals,\r\n tangents,\r\n uvs,\r\n indices,\r\n indexOffset,\r\n _currentVertexIndex\r\n );\r\n\r\n // Front plane (top -> nxpz -> pxpz)\r\n _currentVertexIndex = this.addTriangle(\r\n topVertex,\r\n bottomVertices[3], // nxpz\r\n bottomVertices[0], // pxpz\r\n vertices,\r\n normals,\r\n tangents,\r\n uvs,\r\n indices,\r\n indexOffset,\r\n _currentVertexIndex\r\n );\r\n\r\n // Bottom: split into two triangles\r\n // triangle 1: pxpz -> nxpz -> pxnz\r\n _currentVertexIndex = this.addTriangle(\r\n bottomVertices[0], // pxpz\r\n bottomVertices[3], // nxpz\r\n bottomVertices[1], // pxnz\r\n vertices,\r\n normals,\r\n tangents,\r\n uvs,\r\n indices,\r\n indexOffset,\r\n _currentVertexIndex\r\n );\r\n\r\n // triangle 2: pxnz -> nxpz -> nxnz\r\n _currentVertexIndex = this.addTriangle(\r\n bottomVertices[1], // pxnz\r\n bottomVertices[3], // nxpz\r\n bottomVertices[2], // nxnz\r\n vertices,\r\n normals,\r\n tangents,\r\n uvs,\r\n indices,\r\n indexOffset,\r\n _currentVertexIndex\r\n );\r\n\r\n Shape._transform(options.transform, vertices, normals, start);\r\n if (bbox || vertexCallback) {\r\n for (let i = start; i < vertices.length - 2; i += 3) {\r\n if (bbox) {\r\n bbox.minPoint.x = Math.min(bbox.minPoint.x, vertices[i]);\r\n bbox.minPoint.y = Math.min(bbox.minPoint.y, vertices[i + 1]);\r\n bbox.minPoint.z = Math.min(bbox.minPoint.z, vertices[i + 2]);\r\n bbox.maxPoint.x = Math.max(bbox.maxPoint.x, vertices[i]);\r\n bbox.maxPoint.y = Math.max(bbox.maxPoint.y, vertices[i + 1]);\r\n bbox.maxPoint.z = Math.max(bbox.maxPoint.z, vertices[i + 2]);\r\n }\r\n vertexCallback?.((i - start) / 3, vertices[i], vertices[i + 1], vertices[i + 2]);\r\n }\r\n }\r\n\r\n return 'triangle-list' as const;\r\n }\r\n}\r\n\r\n/**\r\n * Tetrahedron shape\r\n * @public\r\n */\r\nexport class TetrahedronFrameShape\r\n extends Shape<TetrahedronCreationOptions>\r\n implements Clonable<TetrahedronShape>\r\n{\r\n static _defaultOptions = {\r\n ...Shape._defaultOptions,\r\n height: 1,\r\n sizeX: 1,\r\n sizeZ: 1\r\n };\r\n\r\n constructor(options?: TetrahedronCreationOptions) {\r\n super(options);\r\n }\r\n\r\n clone() {\r\n return new TetrahedronShape(this._options) as this;\r\n }\r\n\r\n get type() {\r\n return 'TetrahedronFrame' as const;\r\n }\r\n\r\n private static calculateTriangleNormal(v0: Vector3, v1: Vector3, v2: Vector3) {\r\n const edge1 = Vector3.sub(v1, v0);\r\n const edge2 = Vector3.sub(v2, v0);\r\n return Vector3.normalize(Vector3.cross(edge1, edge2));\r\n }\r\n\r\n private static addLines(\r\n v0: Vector3,\r\n v1: Vector3,\r\n v2: Vector3,\r\n vertices: number[],\r\n normals: number[],\r\n tangents: number[],\r\n uvs: number[],\r\n indices: number[],\r\n indexOffset: number,\r\n currentVertexIndex: number\r\n ) {\r\n // Calculate normal\r\n const normal = this.calculateTriangleNormal(v0, v1, v2);\r\n\r\n // Add vertex\r\n vertices.push(v0.x, v0.y, v0.z);\r\n vertices.push(v1.x, v1.y, v1.z);\r\n vertices.push(v2.x, v2.y, v2.z);\r\n\r\n // Add normal\r\n normals?.push(normal.x, normal.y, normal.z);\r\n normals?.push(normal.x, normal.y, normal.z);\r\n normals?.push(normal.x, normal.y, normal.z);\r\n\r\n // Add UV\r\n const uv0 = [0.5, 0];\r\n const uv1 = [0, 1];\r\n const uv2 = [1, 1];\r\n uvs?.push(...uv0);\r\n uvs?.push(...uv1);\r\n uvs?.push(...uv2);\r\n\r\n // Add tangents\r\n if (tangents) {\r\n const t = this.computeTangent(\r\n [v0.x, v0.y, v0.z],\r\n [v1.x, v1.y, v1.z],\r\n [v2.x, v2.y, v2.z],\r\n uv0,\r\n uv1,\r\n uv2,\r\n [normal.x, normal.y, normal.z]\r\n );\r\n tangents.push(...t);\r\n tangents.push(...t);\r\n tangents.push(...t);\r\n }\r\n\r\n // Add index\r\n indices.push(indexOffset + currentVertexIndex);\r\n indices.push(indexOffset + currentVertexIndex + 1);\r\n indices.push(indexOffset + currentVertexIndex + 1);\r\n indices.push(indexOffset + currentVertexIndex + 2);\r\n indices.push(indexOffset + currentVertexIndex + 2);\r\n indices.push(indexOffset + currentVertexIndex);\r\n\r\n return currentVertexIndex + 3;\r\n }\r\n\r\n static generateData(\r\n opt: TetrahedronCreationOptions,\r\n vertices: number[],\r\n normals: number[],\r\n tangents: number[],\r\n uvs: number[],\r\n indices: number[],\r\n bbox?: AABB,\r\n indexOffset?: number,\r\n vertexCallback?: (index: number, x: number, y: number, z: number) => void\r\n ) {\r\n const options = Object.assign({}, this._defaultOptions, opt ?? {});\r\n indexOffset = indexOffset ?? 0;\r\n const start = vertices.length;\r\n\r\n const height = options.height;\r\n const sizeX = options.sizeX;\r\n const sizeZ = options.sizeZ;\r\n\r\n // Five vertices for the tetrahedron\r\n const topVertex = new Vector3(0, height, 0);\r\n const bottomVertices = [\r\n new Vector3(sizeX, 0, sizeZ), // pxpz\r\n new Vector3(sizeX, 0, -sizeZ), // pxnz\r\n new Vector3(-sizeX, 0, -sizeZ), // nxnz\r\n new Vector3(-sizeX, 0, sizeZ) // nxpz\r\n ];\r\n\r\n let _currentVertexIndex = 0;\r\n\r\n // Right plane (top -> pxpz -> pxnz)\r\n _currentVertexIndex = this.addLines(\r\n topVertex,\r\n bottomVertices[0], // pxpz\r\n bottomVertices[1], // pxnz\r\n vertices,\r\n normals,\r\n tangents,\r\n uvs,\r\n indices,\r\n indexOffset,\r\n _currentVertexIndex\r\n );\r\n\r\n // Back plane (top -> pxnz -> nxnz)\r\n _currentVertexIndex = this.addLines(\r\n topVertex,\r\n bottomVertices[1], // pxnz\r\n bottomVertices[2], // nxnz\r\n vertices,\r\n normals,\r\n tangents,\r\n uvs,\r\n indices,\r\n indexOffset,\r\n _currentVertexIndex\r\n );\r\n\r\n // Left plane (top -> nxnz -> nxpz)\r\n _currentVertexIndex = this.addLines(\r\n topVertex,\r\n bottomVertices[2], // nxnz\r\n bottomVertices[3], // nxpz\r\n vertices,\r\n normals,\r\n tangents,\r\n uvs,\r\n indices,\r\n indexOffset,\r\n _currentVertexIndex\r\n );\r\n\r\n // Front plane (top -> nxpz -> pxpz)\r\n _currentVertexIndex = this.addLines(\r\n topVertex,\r\n bottomVertices[3], // nxpz\r\n bottomVertices[0], // pxpz\r\n vertices,\r\n normals,\r\n tangents,\r\n uvs,\r\n indices,\r\n indexOffset,\r\n _currentVertexIndex\r\n );\r\n\r\n Shape._transform(options.transform, vertices, normals, start);\r\n if (bbox || vertexCallback) {\r\n for (let i = start; i < vertices.length - 2; i += 3) {\r\n if (bbox) {\r\n bbox.minPoint.x = Math.min(bbox.minPoint.x, vertices[i]);\r\n bbox.minPoint.y = Math.min(bbox.minPoint.y, vertices[i + 1]);\r\n bbox.minPoint.z = Math.min(bbox.minPoint.z, vertices[i + 2]);\r\n bbox.maxPoint.x = Math.max(bbox.maxPoint.x, vertices[i]);\r\n bbox.maxPoint.y = Math.max(bbox.maxPoint.y, vertices[i + 1]);\r\n bbox.maxPoint.z = Math.max(bbox.maxPoint.z, vertices[i + 2]);\r\n }\r\n vertexCallback?.((i - start) / 3, vertices[i], vertices[i + 1], vertices[i + 2]);\r\n }\r\n }\r\n\r\n return 'line-list' as const;\r\n }\r\n}\r\n"],"names":["TetrahedronShape","Shape","_defaultOptions","height","sizeX","sizeZ","options","clone","_options","type","calculateTriangleNormal","v0","v1","v2","edge1","Vector3","sub","edge2","normalize","cross","addTriangle","vertices","normals","tangents","uvs","indices","indexOffset","currentVertexIndex","normal","push","x","y","z","uv0","uv1","uv2","t","computeTangent","generateData","opt","bbox","vertexCallback","Object","assign","start","length","topVertex","bottomVertices","_currentVertexIndex","_transform","transform","i","minPoint","Math","min","maxPoint","max","TetrahedronFrameShape","addLines"],"mappings":"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"}
1
+ {"version":3,"file":"tetrahedron.js","sources":["../../src/shapes/tetrahedron.ts"],"sourcesContent":["import { Vector3, type AABB, type Clonable, type Ray } from '@zephyr3d/base';\r\nimport type { ShapeCreationOptions } from './shape';\r\nimport { Shape } from './shape';\r\n\r\n/**\r\n * Creation options for tetrahedron shape\r\n * @public\r\n */\r\nexport interface TetrahedronCreationOptions extends ShapeCreationOptions {\r\n height?: number;\r\n sizeX?: number;\r\n sizeZ?: number;\r\n}\r\n\r\n/**\r\n * Tetrahedron shape\r\n * @public\r\n */\r\nexport class TetrahedronShape\r\n extends Shape<TetrahedronCreationOptions>\r\n implements Clonable<TetrahedronShape>\r\n{\r\n static _defaultOptions = {\r\n ...Shape._defaultOptions,\r\n height: 1,\r\n sizeX: 1,\r\n sizeZ: 1\r\n };\r\n\r\n constructor(options?: TetrahedronCreationOptions) {\r\n super(options);\r\n }\r\n\r\n clone() {\r\n return new TetrahedronShape(this._options) as this;\r\n }\r\n\r\n get type() {\r\n return 'Tetrahedron';\r\n }\r\n\r\n /**\r\n * {@inheritDoc Primitive.raycast}\r\n * @override\r\n *\r\n * Tests each triangular face of the tetrahedron with the Möller–Trumbore\r\n * algorithm and returns the smallest non-negative t.\r\n */\r\n raycast(ray: Ray) {\r\n const opt = this._options;\r\n const height = opt.height ?? 1;\r\n const sizeX = opt.sizeX ?? 1;\r\n const sizeZ = opt.sizeZ ?? 1;\r\n\r\n const top = [0, height, 0] as const;\r\n const p0 = [sizeX, 0, sizeZ] as const; // pxpz\r\n const p1 = [sizeX, 0, -sizeZ] as const; // pxnz\r\n const p2 = [-sizeX, 0, -sizeZ] as const; // nxnz\r\n const p3 = [-sizeX, 0, sizeZ] as const; // nxpz\r\n\r\n // All six faces (4 side triangles + 2 bottom triangles)\r\n const faces: [\r\n readonly [number, number, number],\r\n readonly [number, number, number],\r\n readonly [number, number, number]\r\n ][] = [\r\n [top, p0, p1], // right\r\n [top, p1, p2], // back\r\n [top, p2, p3], // left\r\n [top, p3, p0], // front\r\n [p0, p3, p1], // bottom tri 1: pxpz -> nxpz -> pxnz\r\n [p1, p3, p2] // bottom tri 2: pxnz -> nxpz -> nxnz\r\n ];\r\n\r\n let tMin = Infinity;\r\n for (const [v0, v1, v2] of faces) {\r\n const t = TetrahedronShape._rayTriangle(ray, v0, v1, v2);\r\n if (t !== null && t < tMin) {\r\n tMin = t;\r\n }\r\n }\r\n return isFinite(tMin) ? tMin : null;\r\n }\r\n\r\n /**\r\n * @internal Möller–Trumbore ray-triangle intersection.\r\n * Returns t >= 0 on hit, null otherwise.\r\n */\r\n private static _rayTriangle(\r\n ray: Ray,\r\n v0: readonly [number, number, number],\r\n v1: readonly [number, number, number],\r\n v2: readonly [number, number, number]\r\n ): number | null {\r\n const eps = 1e-8;\r\n const e1x = v1[0] - v0[0],\r\n e1y = v1[1] - v0[1],\r\n e1z = v1[2] - v0[2];\r\n const e2x = v2[0] - v0[0],\r\n e2y = v2[1] - v0[1],\r\n e2z = v2[2] - v0[2];\r\n const dx = ray.direction.x,\r\n dy = ray.direction.y,\r\n dz = ray.direction.z;\r\n // h = D × e2\r\n const hx = dy * e2z - dz * e2y;\r\n const hy = dz * e2x - dx * e2z;\r\n const hz = dx * e2y - dy * e2x;\r\n const det = e1x * hx + e1y * hy + e1z * hz;\r\n if (Math.abs(det) < eps) {\r\n return null;\r\n }\r\n const invDet = 1 / det;\r\n const sx = ray.origin.x - v0[0];\r\n const sy = ray.origin.y - v0[1];\r\n const sz = ray.origin.z - v0[2];\r\n const u = (sx * hx + sy * hy + sz * hz) * invDet;\r\n if (u < 0 || u > 1) {\r\n return null;\r\n }\r\n // q = s × e1\r\n const qx = sy * e1z - sz * e1y;\r\n const qy = sz * e1x - sx * e1z;\r\n const qz = sx * e1y - sy * e1x;\r\n const v = (dx * qx + dy * qy + dz * qz) * invDet;\r\n if (v < 0 || u + v > 1) {\r\n return null;\r\n }\r\n const t = (e2x * qx + e2y * qy + e2z * qz) * invDet;\r\n return t >= 0 ? t : null;\r\n }\r\n\r\n private static calculateTriangleNormal(v0: Vector3, v1: Vector3, v2: Vector3) {\r\n const edge1 = Vector3.sub(v1, v0);\r\n const edge2 = Vector3.sub(v2, v0);\r\n return Vector3.normalize(Vector3.cross(edge1, edge2));\r\n }\r\n\r\n private static addTriangle(\r\n v0: Vector3,\r\n v1: Vector3,\r\n v2: Vector3,\r\n vertices: number[],\r\n normals: number[],\r\n tangents: number[],\r\n uvs: number[],\r\n indices: number[],\r\n indexOffset: number,\r\n currentVertexIndex: number\r\n ) {\r\n // Calculate normal\r\n const normal = this.calculateTriangleNormal(v0, v1, v2);\r\n\r\n // Add vertex\r\n vertices.push(v0.x, v0.y, v0.z);\r\n vertices.push(v1.x, v1.y, v1.z);\r\n vertices.push(v2.x, v2.y, v2.z);\r\n\r\n // Add normal\r\n normals?.push(normal.x, normal.y, normal.z);\r\n normals?.push(normal.x, normal.y, normal.z);\r\n normals?.push(normal.x, normal.y, normal.z);\r\n\r\n const uv0 = [0.5, 0];\r\n const uv1 = [0, 1];\r\n const uv2 = [1, 1];\r\n // Add UV\r\n uvs?.push(...uv0); // 顶点\r\n uvs?.push(...uv1); // 左下\r\n uvs?.push(...uv2); // 右下\r\n\r\n if (tangents) {\r\n const t = this.computeTangent(\r\n [v0.x, v0.y, v0.z],\r\n [v1.x, v1.y, v1.z],\r\n [v2.x, v2.y, v2.z],\r\n uv0,\r\n uv1,\r\n uv2,\r\n [normal.x, normal.y, normal.z]\r\n );\r\n tangents.push(...t);\r\n tangents.push(...t);\r\n tangents.push(...t);\r\n }\r\n\r\n // Add index (CCW)\r\n indices.push(indexOffset + currentVertexIndex);\r\n indices.push(indexOffset + currentVertexIndex + 1);\r\n indices.push(indexOffset + currentVertexIndex + 2);\r\n\r\n return currentVertexIndex + 3;\r\n }\r\n\r\n static generateData(\r\n opt: TetrahedronCreationOptions,\r\n vertices: number[],\r\n normals: number[],\r\n tangents: number[],\r\n uvs: number[],\r\n indices: number[],\r\n bbox?: AABB,\r\n indexOffset?: number,\r\n vertexCallback?: (index: number, x: number, y: number, z: number) => void\r\n ) {\r\n const options = Object.assign({}, this._defaultOptions, opt ?? {});\r\n indexOffset = indexOffset ?? 0;\r\n const start = vertices.length;\r\n\r\n const height = options.height;\r\n const sizeX = options.sizeX;\r\n const sizeZ = options.sizeZ;\r\n\r\n // Five vertices for the tetrahedron\r\n const topVertex = new Vector3(0, height, 0);\r\n const bottomVertices = [\r\n new Vector3(sizeX, 0, sizeZ), // pxpz\r\n new Vector3(sizeX, 0, -sizeZ), // pxnz\r\n new Vector3(-sizeX, 0, -sizeZ), // nxnz\r\n new Vector3(-sizeX, 0, sizeZ) // nxpz\r\n ];\r\n\r\n let _currentVertexIndex = 0;\r\n\r\n // Right plane (top -> pxpz -> pxnz)\r\n _currentVertexIndex = this.addTriangle(\r\n topVertex,\r\n bottomVertices[0], // pxpz\r\n bottomVertices[1], // pxnz\r\n vertices,\r\n normals,\r\n tangents,\r\n uvs,\r\n indices,\r\n indexOffset,\r\n _currentVertexIndex\r\n );\r\n\r\n // Back plane (top -> pxnz -> nxnz)\r\n _currentVertexIndex = this.addTriangle(\r\n topVertex,\r\n bottomVertices[1], // pxnz\r\n bottomVertices[2], // nxnz\r\n vertices,\r\n normals,\r\n tangents,\r\n uvs,\r\n indices,\r\n indexOffset,\r\n _currentVertexIndex\r\n );\r\n\r\n // Left plane (top -> nxnz -> nxpz)\r\n _currentVertexIndex = this.addTriangle(\r\n topVertex,\r\n bottomVertices[2], // nxnz\r\n bottomVertices[3], // nxpz\r\n vertices,\r\n normals,\r\n tangents,\r\n uvs,\r\n indices,\r\n indexOffset,\r\n _currentVertexIndex\r\n );\r\n\r\n // Front plane (top -> nxpz -> pxpz)\r\n _currentVertexIndex = this.addTriangle(\r\n topVertex,\r\n bottomVertices[3], // nxpz\r\n bottomVertices[0], // pxpz\r\n vertices,\r\n normals,\r\n tangents,\r\n uvs,\r\n indices,\r\n indexOffset,\r\n _currentVertexIndex\r\n );\r\n\r\n // Bottom: split into two triangles\r\n // triangle 1: pxpz -> nxpz -> pxnz\r\n _currentVertexIndex = this.addTriangle(\r\n bottomVertices[0], // pxpz\r\n bottomVertices[3], // nxpz\r\n bottomVertices[1], // pxnz\r\n vertices,\r\n normals,\r\n tangents,\r\n uvs,\r\n indices,\r\n indexOffset,\r\n _currentVertexIndex\r\n );\r\n\r\n // triangle 2: pxnz -> nxpz -> nxnz\r\n _currentVertexIndex = this.addTriangle(\r\n bottomVertices[1], // pxnz\r\n bottomVertices[3], // nxpz\r\n bottomVertices[2], // nxnz\r\n vertices,\r\n normals,\r\n tangents,\r\n uvs,\r\n indices,\r\n indexOffset,\r\n _currentVertexIndex\r\n );\r\n\r\n Shape._transform(options.transform, vertices, normals, start);\r\n if (bbox || vertexCallback) {\r\n for (let i = start; i < vertices.length - 2; i += 3) {\r\n if (bbox) {\r\n bbox.minPoint.x = Math.min(bbox.minPoint.x, vertices[i]);\r\n bbox.minPoint.y = Math.min(bbox.minPoint.y, vertices[i + 1]);\r\n bbox.minPoint.z = Math.min(bbox.minPoint.z, vertices[i + 2]);\r\n bbox.maxPoint.x = Math.max(bbox.maxPoint.x, vertices[i]);\r\n bbox.maxPoint.y = Math.max(bbox.maxPoint.y, vertices[i + 1]);\r\n bbox.maxPoint.z = Math.max(bbox.maxPoint.z, vertices[i + 2]);\r\n }\r\n vertexCallback?.((i - start) / 3, vertices[i], vertices[i + 1], vertices[i + 2]);\r\n }\r\n }\r\n\r\n return 'triangle-list' as const;\r\n }\r\n}\r\n\r\n/**\r\n * Tetrahedron shape\r\n * @public\r\n */\r\nexport class TetrahedronFrameShape\r\n extends Shape<TetrahedronCreationOptions>\r\n implements Clonable<TetrahedronShape>\r\n{\r\n static _defaultOptions = {\r\n ...Shape._defaultOptions,\r\n height: 1,\r\n sizeX: 1,\r\n sizeZ: 1\r\n };\r\n\r\n constructor(options?: TetrahedronCreationOptions) {\r\n super(options);\r\n }\r\n\r\n clone() {\r\n return new TetrahedronShape(this._options) as this;\r\n }\r\n\r\n get type() {\r\n return 'TetrahedronFrame' as const;\r\n }\r\n\r\n /**\r\n * {@inheritDoc Primitive.raycast}\r\n * @override\r\n *\r\n * Tests each triangular face of the tetrahedron with the Möller–Trumbore\r\n * algorithm and returns the smallest non-negative t.\r\n * The wireframe has the same overall geometry as the solid version.\r\n */\r\n raycast(ray: Ray) {\r\n const opt = this._options;\r\n const height = opt.height ?? 1;\r\n const sizeX = opt.sizeX ?? 1;\r\n const sizeZ = opt.sizeZ ?? 1;\r\n\r\n const top = [0, height, 0] as const;\r\n const p0 = [sizeX, 0, sizeZ] as const;\r\n const p1 = [sizeX, 0, -sizeZ] as const;\r\n const p2 = [-sizeX, 0, -sizeZ] as const;\r\n const p3 = [-sizeX, 0, sizeZ] as const;\r\n\r\n const faces: [\r\n readonly [number, number, number],\r\n readonly [number, number, number],\r\n readonly [number, number, number]\r\n ][] = [\r\n [top, p0, p1],\r\n [top, p1, p2],\r\n [top, p2, p3],\r\n [top, p3, p0]\r\n ];\r\n\r\n let tMin = Infinity;\r\n for (const [v0, v1, v2] of faces) {\r\n const t = TetrahedronFrameShape._rayTriangle(ray, v0, v1, v2);\r\n if (t !== null && t < tMin) {\r\n tMin = t;\r\n }\r\n }\r\n return isFinite(tMin) ? tMin : null;\r\n }\r\n\r\n /** @internal Möller–Trumbore ray-triangle intersection */\r\n private static _rayTriangle(\r\n ray: Ray,\r\n v0: readonly [number, number, number],\r\n v1: readonly [number, number, number],\r\n v2: readonly [number, number, number]\r\n ): number | null {\r\n const eps = 1e-8;\r\n const e1x = v1[0] - v0[0],\r\n e1y = v1[1] - v0[1],\r\n e1z = v1[2] - v0[2];\r\n const e2x = v2[0] - v0[0],\r\n e2y = v2[1] - v0[1],\r\n e2z = v2[2] - v0[2];\r\n const dx = ray.direction.x,\r\n dy = ray.direction.y,\r\n dz = ray.direction.z;\r\n const hx = dy * e2z - dz * e2y;\r\n const hy = dz * e2x - dx * e2z;\r\n const hz = dx * e2y - dy * e2x;\r\n const det = e1x * hx + e1y * hy + e1z * hz;\r\n if (Math.abs(det) < eps) {\r\n return null;\r\n }\r\n const invDet = 1 / det;\r\n const sx = ray.origin.x - v0[0];\r\n const sy = ray.origin.y - v0[1];\r\n const sz = ray.origin.z - v0[2];\r\n const u = (sx * hx + sy * hy + sz * hz) * invDet;\r\n if (u < 0 || u > 1) {\r\n return null;\r\n }\r\n const qx = sy * e1z - sz * e1y;\r\n const qy = sz * e1x - sx * e1z;\r\n const qz = sx * e1y - sy * e1x;\r\n const v = (dx * qx + dy * qy + dz * qz) * invDet;\r\n if (v < 0 || u + v > 1) {\r\n return null;\r\n }\r\n const t = (e2x * qx + e2y * qy + e2z * qz) * invDet;\r\n return t >= 0 ? t : null;\r\n }\r\n\r\n private static calculateTriangleNormal(v0: Vector3, v1: Vector3, v2: Vector3) {\r\n const edge1 = Vector3.sub(v1, v0);\r\n const edge2 = Vector3.sub(v2, v0);\r\n return Vector3.normalize(Vector3.cross(edge1, edge2));\r\n }\r\n\r\n private static addLines(\r\n v0: Vector3,\r\n v1: Vector3,\r\n v2: Vector3,\r\n vertices: number[],\r\n normals: number[],\r\n tangents: number[],\r\n uvs: number[],\r\n indices: number[],\r\n indexOffset: number,\r\n currentVertexIndex: number\r\n ) {\r\n // Calculate normal\r\n const normal = this.calculateTriangleNormal(v0, v1, v2);\r\n\r\n // Add vertex\r\n vertices.push(v0.x, v0.y, v0.z);\r\n vertices.push(v1.x, v1.y, v1.z);\r\n vertices.push(v2.x, v2.y, v2.z);\r\n\r\n // Add normal\r\n normals?.push(normal.x, normal.y, normal.z);\r\n normals?.push(normal.x, normal.y, normal.z);\r\n normals?.push(normal.x, normal.y, normal.z);\r\n\r\n // Add UV\r\n const uv0 = [0.5, 0];\r\n const uv1 = [0, 1];\r\n const uv2 = [1, 1];\r\n uvs?.push(...uv0);\r\n uvs?.push(...uv1);\r\n uvs?.push(...uv2);\r\n\r\n // Add tangents\r\n if (tangents) {\r\n const t = this.computeTangent(\r\n [v0.x, v0.y, v0.z],\r\n [v1.x, v1.y, v1.z],\r\n [v2.x, v2.y, v2.z],\r\n uv0,\r\n uv1,\r\n uv2,\r\n [normal.x, normal.y, normal.z]\r\n );\r\n tangents.push(...t);\r\n tangents.push(...t);\r\n tangents.push(...t);\r\n }\r\n\r\n // Add index\r\n indices.push(indexOffset + currentVertexIndex);\r\n indices.push(indexOffset + currentVertexIndex + 1);\r\n indices.push(indexOffset + currentVertexIndex + 1);\r\n indices.push(indexOffset + currentVertexIndex + 2);\r\n indices.push(indexOffset + currentVertexIndex + 2);\r\n indices.push(indexOffset + currentVertexIndex);\r\n\r\n return currentVertexIndex + 3;\r\n }\r\n\r\n static generateData(\r\n opt: TetrahedronCreationOptions,\r\n vertices: number[],\r\n normals: number[],\r\n tangents: number[],\r\n uvs: number[],\r\n indices: number[],\r\n bbox?: AABB,\r\n indexOffset?: number,\r\n vertexCallback?: (index: number, x: number, y: number, z: number) => void\r\n ) {\r\n const options = Object.assign({}, this._defaultOptions, opt ?? {});\r\n indexOffset = indexOffset ?? 0;\r\n const start = vertices.length;\r\n\r\n const height = options.height;\r\n const sizeX = options.sizeX;\r\n const sizeZ = options.sizeZ;\r\n\r\n // Five vertices for the tetrahedron\r\n const topVertex = new Vector3(0, height, 0);\r\n const bottomVertices = [\r\n new Vector3(sizeX, 0, sizeZ), // pxpz\r\n new Vector3(sizeX, 0, -sizeZ), // pxnz\r\n new Vector3(-sizeX, 0, -sizeZ), // nxnz\r\n new Vector3(-sizeX, 0, sizeZ) // nxpz\r\n ];\r\n\r\n let _currentVertexIndex = 0;\r\n\r\n // Right plane (top -> pxpz -> pxnz)\r\n _currentVertexIndex = this.addLines(\r\n topVertex,\r\n bottomVertices[0], // pxpz\r\n bottomVertices[1], // pxnz\r\n vertices,\r\n normals,\r\n tangents,\r\n uvs,\r\n indices,\r\n indexOffset,\r\n _currentVertexIndex\r\n );\r\n\r\n // Back plane (top -> pxnz -> nxnz)\r\n _currentVertexIndex = this.addLines(\r\n topVertex,\r\n bottomVertices[1], // pxnz\r\n bottomVertices[2], // nxnz\r\n vertices,\r\n normals,\r\n tangents,\r\n uvs,\r\n indices,\r\n indexOffset,\r\n _currentVertexIndex\r\n );\r\n\r\n // Left plane (top -> nxnz -> nxpz)\r\n _currentVertexIndex = this.addLines(\r\n topVertex,\r\n bottomVertices[2], // nxnz\r\n bottomVertices[3], // nxpz\r\n vertices,\r\n normals,\r\n tangents,\r\n uvs,\r\n indices,\r\n indexOffset,\r\n _currentVertexIndex\r\n );\r\n\r\n // Front plane (top -> nxpz -> pxpz)\r\n _currentVertexIndex = this.addLines(\r\n topVertex,\r\n bottomVertices[3], // nxpz\r\n bottomVertices[0], // pxpz\r\n vertices,\r\n normals,\r\n tangents,\r\n uvs,\r\n indices,\r\n indexOffset,\r\n _currentVertexIndex\r\n );\r\n\r\n Shape._transform(options.transform, vertices, normals, start);\r\n if (bbox || vertexCallback) {\r\n for (let i = start; i < vertices.length - 2; i += 3) {\r\n if (bbox) {\r\n bbox.minPoint.x = Math.min(bbox.minPoint.x, vertices[i]);\r\n bbox.minPoint.y = Math.min(bbox.minPoint.y, vertices[i + 1]);\r\n bbox.minPoint.z = Math.min(bbox.minPoint.z, vertices[i + 2]);\r\n bbox.maxPoint.x = Math.max(bbox.maxPoint.x, vertices[i]);\r\n bbox.maxPoint.y = Math.max(bbox.maxPoint.y, vertices[i + 1]);\r\n bbox.maxPoint.z = Math.max(bbox.maxPoint.z, vertices[i + 2]);\r\n }\r\n vertexCallback?.((i - start) / 3, vertices[i], vertices[i + 1], vertices[i + 2]);\r\n }\r\n }\r\n\r\n return 'line-list' as const;\r\n }\r\n}\r\n"],"names":["TetrahedronShape","Shape","_defaultOptions","height","sizeX","sizeZ","options","clone","_options","type","raycast","ray","opt","top","p0","p1","p2","p3","faces","tMin","Infinity","v0","v1","v2","t","_rayTriangle","isFinite","eps","e1x","e1y","e1z","e2x","e2y","e2z","dx","direction","x","dy","y","dz","z","hx","hy","hz","det","Math","abs","invDet","sx","origin","sy","sz","u","qx","qy","qz","v","calculateTriangleNormal","edge1","Vector3","sub","edge2","normalize","cross","addTriangle","vertices","normals","tangents","uvs","indices","indexOffset","currentVertexIndex","normal","push","uv0","uv1","uv2","computeTangent","generateData","bbox","vertexCallback","Object","assign","start","length","topVertex","bottomVertices","_currentVertexIndex","_transform","transform","i","minPoint","min","maxPoint","max","TetrahedronFrameShape","addLines"],"mappings":"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"}
@@ -41,6 +41,179 @@ Triangle(n, m) = (VIndex(n, m), VIndex(n+1, m), VIndex(n+1, m+1), VIndex(n, m),
41
41
  return 'Torus';
42
42
  }
43
43
  /**
44
+ * {@inheritDoc Primitive.raycast}
45
+ * @override
46
+ *
47
+ * Analytically intersects a ray with a torus lying in the XZ plane.
48
+ * The torus has major radius R (outerRadius) and minor radius r (innerRadius).
49
+ *
50
+ * Equation of torus: (x²+y²+z²+R²-r²)² = 4R²(x²+z²)
51
+ * Substituting ray P(t) = O + t*D leads to a quartic in t which is solved
52
+ * with Ferrari's method.
53
+ */ raycast(ray) {
54
+ const R = this._options.outerRadius ?? 1; // major radius
55
+ const r = this._options.innerRadius ?? 0.3; // minor radius
56
+ const ox = ray.origin.x, oy = ray.origin.y, oz = ray.origin.z;
57
+ const dx = ray.direction.x, dy = ray.direction.y, dz = ray.direction.z;
58
+ // Let f = |O|² + R² - r²
59
+ // g = O·D (dot product)
60
+ // h = |D|² (should be 1 for a normalised direction, kept general)
61
+ // Quartic: (h*t² + 2g*t + f)² = 4R²*((dx*t+ox)² + (dz*t+oz)²)
62
+ // Expand into c4*t^4 + c3*t^3 + c2*t^2 + c1*t + c0 = 0
63
+ const OO = ox * ox + oy * oy + oz * oz;
64
+ const OD = ox * dx + oy * dy + oz * dz;
65
+ const DD = dx * dx + dy * dy + dz * dz;
66
+ const f = OO + R * R - r * r;
67
+ const g = OD;
68
+ const h = DD;
69
+ // XZ components only (for the 4R²(x²+z²) term)
70
+ const oxz2 = ox * ox + oz * oz; // ox² + oz²
71
+ const odxz = ox * dx + oz * dz; // ox*dx + oz*dz
72
+ const dxz2 = dx * dx + dz * dz; // dx² + dz²
73
+ // Quartic coefficients (from expanding both sides)
74
+ const R2 = 4 * R * R;
75
+ const c4 = h * h;
76
+ const c3 = 4 * h * g;
77
+ const c2 = 2 * h * f + 4 * g * g - R2 * dxz2;
78
+ const c1 = 4 * g * f - 2 * R2 * odxz;
79
+ const c0 = f * f - R2 * oxz2;
80
+ // Solve quartic c4*t^4 + c3*t^3 + c2*t^2 + c1*t + c0 = 0
81
+ const roots = TorusShape._solveQuartic(c4, c3, c2, c1, c0);
82
+ let tMin = Infinity;
83
+ for (const t of roots){
84
+ if (t >= 0 && t < tMin) {
85
+ tMin = t;
86
+ }
87
+ }
88
+ return isFinite(tMin) ? tMin : null;
89
+ }
90
+ /** @internal Solve quartic a*t^4+b*t^3+c*t^2+d*t+e=0, returns real roots */ static _solveQuartic(a, b, c, d, e) {
91
+ const eps = 1e-8;
92
+ if (Math.abs(a) < eps) {
93
+ return TorusShape._solveCubic(b, c, d, e);
94
+ }
95
+ // Depress quartic: divide by a and substitute t = u - b/(4a)
96
+ const inv_a = 1 / a;
97
+ const B = b * inv_a;
98
+ const C = c * inv_a;
99
+ const D = d * inv_a;
100
+ const E = e * inv_a;
101
+ const p = C - 3 / 8 * B * B;
102
+ const q = B * B * B / 8 - B * C / 2 + D;
103
+ const r2 = -3 / 256 * B * B * B * B + B * B * C / 16 - B * D / 4 + E;
104
+ let roots;
105
+ if (Math.abs(q) < eps) {
106
+ // Biquadratic: u^4 + p*u^2 + r2 = 0
107
+ const disc = p * p - 4 * r2;
108
+ if (disc < 0) {
109
+ return [];
110
+ }
111
+ const sqrtDisc = Math.sqrt(disc);
112
+ roots = [];
113
+ for (const sign of [
114
+ -1,
115
+ 1
116
+ ]){
117
+ const w2 = (-p + sign * sqrtDisc) / 2;
118
+ if (w2 >= 0) {
119
+ const w = Math.sqrt(w2);
120
+ roots.push(w, -w);
121
+ }
122
+ }
123
+ } else {
124
+ // Ferrari: find a real root of the resolvent cubic
125
+ // 8m^3 + 8p*m^2 + (2p^2-8r2)*m - q^2 = 0
126
+ const cubicRoots = TorusShape._solveCubic(8, 8 * p, 2 * p * p - 8 * r2, -q * q);
127
+ // Pick the largest real root
128
+ let m = -Infinity;
129
+ for (const cr of cubicRoots){
130
+ if (cr > m) {
131
+ m = cr;
132
+ }
133
+ }
134
+ if (!isFinite(m)) {
135
+ return [];
136
+ }
137
+ const sqrtM = m >= 0 ? Math.sqrt(m) : 0;
138
+ const disc1 = -(p + 2 * m) + q / (sqrtM + eps);
139
+ const disc2 = -(p + 2 * m) - q / (sqrtM + eps);
140
+ roots = [];
141
+ if (disc1 >= 0) {
142
+ const s = Math.sqrt(disc1);
143
+ roots.push(sqrtM + s, sqrtM - s);
144
+ }
145
+ if (disc2 >= 0) {
146
+ const s = Math.sqrt(disc2);
147
+ roots.push(-sqrtM + s, -sqrtM - s);
148
+ }
149
+ }
150
+ // Un-depress: t = u - B/4
151
+ const shift = B / 4;
152
+ return roots.map((u)=>u - shift);
153
+ }
154
+ /** @internal Solve cubic a*t^3+b*t^2+c*t+d=0, returns real roots (Cardano) */ static _solveCubic(a, b, c, d) {
155
+ const eps = 1e-8;
156
+ if (Math.abs(a) < eps) {
157
+ return TorusShape._solveQuadratic(b, c, d);
158
+ }
159
+ const inv_a = 1 / a;
160
+ const B = b * inv_a;
161
+ const C = c * inv_a;
162
+ const D = d * inv_a;
163
+ const p = C - B * B / 3;
164
+ const q = 2 * B * B * B / 27 - B * C / 3 + D;
165
+ const disc = q * q / 4 + p * p * p / 27;
166
+ const shift = -B / 3;
167
+ if (disc > eps) {
168
+ const sqrtDisc = Math.sqrt(disc);
169
+ const u = Math.cbrt(-q / 2 + sqrtDisc);
170
+ const v = Math.cbrt(-q / 2 - sqrtDisc);
171
+ return [
172
+ u + v + shift
173
+ ];
174
+ } else if (disc < -1e-8) {
175
+ const r = Math.sqrt(-p * p * p / 27);
176
+ const theta = Math.acos(Math.max(-1, Math.min(1, -q / (2 * r))));
177
+ const rCbrt = Math.cbrt(r);
178
+ return [
179
+ 2 * rCbrt * Math.cos(theta / 3) + shift,
180
+ 2 * rCbrt * Math.cos((theta + 2 * Math.PI) / 3) + shift,
181
+ 2 * rCbrt * Math.cos((theta + 4 * Math.PI) / 3) + shift
182
+ ];
183
+ } else {
184
+ const u = Math.cbrt(-q / 2);
185
+ return [
186
+ 2 * u + shift,
187
+ -u + shift
188
+ ];
189
+ }
190
+ }
191
+ /** @internal Solve quadratic a*t^2+b*t+c=0 */ static _solveQuadratic(a, b, c) {
192
+ const eps = 1e-8;
193
+ if (Math.abs(a) < eps) {
194
+ if (Math.abs(b) < eps) {
195
+ return [];
196
+ }
197
+ return [
198
+ -c / b
199
+ ];
200
+ }
201
+ const disc = b * b - 4 * a * c;
202
+ if (disc < 0) {
203
+ return [];
204
+ }
205
+ if (disc < eps) {
206
+ return [
207
+ -b / (2 * a)
208
+ ];
209
+ }
210
+ const s = Math.sqrt(disc);
211
+ return [
212
+ (-b - s) / (2 * a),
213
+ (-b + s) / (2 * a)
214
+ ];
215
+ }
216
+ /**
44
217
  * Generates the data for the torus shape
45
218
  * @param vertices - vertex positions
46
219
  * @param normals - vertex normals
@@ -1 +1 @@
1
- {"version":3,"file":"torus.js","sources":["../../src/shapes/torus.ts"],"sourcesContent":["import type { AABB, Clonable } from '@zephyr3d/base';\r\nimport type { ShapeCreationOptions } from './shape';\r\nimport { Shape } from './shape';\r\n\r\n/**\r\n * Creation options for torus shape\r\n * @public\r\n */\r\nexport interface TorusCreationOptions extends ShapeCreationOptions {\r\n /** Slice count, default is 40 **/\r\n numSlices?: number;\r\n /** Segment count, default is 16 */\r\n numSegments?: number;\r\n /** Outer radius, default is 10 */\r\n outerRadius?: number;\r\n /** Inner radius, default is 3 */\r\n innerRadius?: number;\r\n /** Radial detail, default is 20*/\r\n radialDetail?: number;\r\n}\r\n\r\n/*\r\nN slices\r\nM sides\r\nOR outter radius\r\nIR inner radius\r\nUp (0, 1, 0)\r\n\r\nC(n) = (cos((n/N) * TwoPI) * OR, 0, sin((n/N) * twoPI * OR);\r\nTheta = m/M * TwoPI\r\nV(n, m) = C(n) * (1 + IR * cos(Theta) / OR) + Up * IR * sin(Theta)\r\nN(n, m) = normalize(V(n, m) - C(n))\r\nTC(n, m) = (m / M, n / N)\r\n\r\nVIndex(n, m) = n * (M + 1) + m\r\nTriangle(n, m) = (VIndex(n, m), VIndex(n+1, m), VIndex(n+1, m+1), VIndex(n, m), VIndex(n+1, m+1), VIndex(n, m+1))*/\r\n\r\n/**\r\n *\r\n * Torus shape\r\n *\r\n * @public\r\n */\r\nexport class TorusShape extends Shape<TorusCreationOptions> implements Clonable<TorusShape> {\r\n static _defaultOptions = {\r\n ...Shape._defaultOptions,\r\n numSlices: 40,\r\n numSegments: 16,\r\n outerRadius: 1,\r\n innerRadius: 0.3,\r\n radialDetail: 20\r\n };\r\n /**\r\n * Creates an instance of torus shape\r\n * @param options - The creation options\r\n */\r\n constructor(options?: TorusCreationOptions) {\r\n super(options);\r\n }\r\n clone() {\r\n return new TorusShape(this._options) as this;\r\n }\r\n /** type of the shape */\r\n get type() {\r\n return 'Torus' as const;\r\n }\r\n /**\r\n * Generates the data for the torus shape\r\n * @param vertices - vertex positions\r\n * @param normals - vertex normals\r\n * @param uvs - vertex uvs\r\n * @param indices - vertex indices\r\n */\r\n static generateData(\r\n opt: TorusCreationOptions,\r\n vertices: number[],\r\n normals: number[],\r\n tangents: number[],\r\n uvs: number[],\r\n indices: number[],\r\n bbox?: AABB,\r\n indexOffset?: number,\r\n vertexCallback?: (index: number, x: number, y: number, z: number) => void\r\n ) {\r\n const options = Object.assign({}, this._defaultOptions, opt ?? {});\r\n indexOffset = indexOffset ?? 0;\r\n const start = vertices.length;\r\n const N = options.numSlices;\r\n const M = options.numSegments;\r\n const OR = options.outerRadius;\r\n const IR = options.innerRadius;\r\n for (let n = 0; n <= N; n++) {\r\n const alpha = ((n % N) / N) * Math.PI * 2;\r\n const cosA = Math.cos(alpha);\r\n const sinA = Math.sin(alpha);\r\n const cx = OR * cosA;\r\n const cy = 0;\r\n const cz = OR * sinA;\r\n for (let m = 0; m <= M; m++) {\r\n const theta = ((m % M) / M) * Math.PI * 2;\r\n const cosT = Math.cos(theta);\r\n const sinT = Math.sin(theta);\r\n const t = 1 + (IR * cosT) / OR;\r\n const s = IR * sinT;\r\n const x = cx * t;\r\n const y = cy * t + s;\r\n const z = cz * t;\r\n vertices.push(x, y, z);\r\n if (normals) {\r\n const nx = x - cx;\r\n const ny = y - cy;\r\n const nz = z - cz;\r\n const mag = Math.hypot(nx, ny, nz);\r\n normals.push(nx / mag, ny / mag, nz / mag);\r\n }\r\n if (uvs) {\r\n uvs.push(m / M, n / N);\r\n }\r\n if (tangents) {\r\n const tx = -sinT * cosA;\r\n const ty = cosT;\r\n const tz = -sinT * sinA;\r\n tangents.push(tx, ty, tz, 1.0);\r\n }\r\n }\r\n }\r\n for (let n = 0; n < N; n++) {\r\n for (let m = 0; m < M; m++) {\r\n indices.push(n * (M + 1) + m + indexOffset);\r\n indices.push((n + 1) * (M + 1) + m + 1 + indexOffset);\r\n indices.push((n + 1) * (M + 1) + m + indexOffset);\r\n indices.push(n * (M + 1) + m + indexOffset);\r\n indices.push(n * (M + 1) + m + 1 + indexOffset);\r\n indices.push((n + 1) * (M + 1) + m + 1 + indexOffset);\r\n }\r\n }\r\n Shape._transform(options.transform, vertices, normals, start);\r\n if (bbox || vertexCallback) {\r\n for (let i = start; i < vertices.length - 2; i += 3) {\r\n if (bbox) {\r\n bbox.minPoint.x = Math.min(bbox.minPoint.x, vertices[i]);\r\n bbox.minPoint.y = Math.min(bbox.minPoint.y, vertices[i + 1]);\r\n bbox.minPoint.z = Math.min(bbox.minPoint.z, vertices[i + 2]);\r\n bbox.maxPoint.x = Math.max(bbox.maxPoint.x, vertices[i]);\r\n bbox.maxPoint.y = Math.max(bbox.maxPoint.y, vertices[i + 1]);\r\n bbox.maxPoint.z = Math.max(bbox.maxPoint.z, vertices[i + 2]);\r\n }\r\n vertexCallback?.((i - start) / 3, vertices[i], vertices[i + 1], vertices[i + 2]);\r\n }\r\n }\r\n return 'triangle-list' as const;\r\n }\r\n}\r\n"],"names":["TorusShape","Shape","_defaultOptions","numSlices","numSegments","outerRadius","innerRadius","radialDetail","options","clone","_options","type","generateData","opt","vertices","normals","tangents","uvs","indices","bbox","indexOffset","vertexCallback","Object","assign","start","length","N","M","OR","IR","n","alpha","Math","PI","cosA","cos","sinA","sin","cx","cy","cz","m","theta","cosT","sinT","t","s","x","y","z","push","nx","ny","nz","mag","hypot","tx","ty","tz","_transform","transform","i","minPoint","min","maxPoint","max"],"mappings":"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"}
1
+ {"version":3,"file":"torus.js","sources":["../../src/shapes/torus.ts"],"sourcesContent":["import type { AABB, Clonable, Ray } from '@zephyr3d/base';\r\nimport type { ShapeCreationOptions } from './shape';\r\nimport { Shape } from './shape';\r\n\r\n/**\r\n * Creation options for torus shape\r\n * @public\r\n */\r\nexport interface TorusCreationOptions extends ShapeCreationOptions {\r\n /** Slice count, default is 40 **/\r\n numSlices?: number;\r\n /** Segment count, default is 16 */\r\n numSegments?: number;\r\n /** Outer radius, default is 10 */\r\n outerRadius?: number;\r\n /** Inner radius, default is 3 */\r\n innerRadius?: number;\r\n /** Radial detail, default is 20*/\r\n radialDetail?: number;\r\n}\r\n\r\n/*\r\nN slices\r\nM sides\r\nOR outter radius\r\nIR inner radius\r\nUp (0, 1, 0)\r\n\r\nC(n) = (cos((n/N) * TwoPI) * OR, 0, sin((n/N) * twoPI * OR);\r\nTheta = m/M * TwoPI\r\nV(n, m) = C(n) * (1 + IR * cos(Theta) / OR) + Up * IR * sin(Theta)\r\nN(n, m) = normalize(V(n, m) - C(n))\r\nTC(n, m) = (m / M, n / N)\r\n\r\nVIndex(n, m) = n * (M + 1) + m\r\nTriangle(n, m) = (VIndex(n, m), VIndex(n+1, m), VIndex(n+1, m+1), VIndex(n, m), VIndex(n+1, m+1), VIndex(n, m+1))*/\r\n\r\n/**\r\n *\r\n * Torus shape\r\n *\r\n * @public\r\n */\r\nexport class TorusShape extends Shape<TorusCreationOptions> implements Clonable<TorusShape> {\r\n static _defaultOptions = {\r\n ...Shape._defaultOptions,\r\n numSlices: 40,\r\n numSegments: 16,\r\n outerRadius: 1,\r\n innerRadius: 0.3,\r\n radialDetail: 20\r\n };\r\n /**\r\n * Creates an instance of torus shape\r\n * @param options - The creation options\r\n */\r\n constructor(options?: TorusCreationOptions) {\r\n super(options);\r\n }\r\n clone() {\r\n return new TorusShape(this._options) as this;\r\n }\r\n /** type of the shape */\r\n get type() {\r\n return 'Torus' as const;\r\n }\r\n /**\r\n * {@inheritDoc Primitive.raycast}\r\n * @override\r\n *\r\n * Analytically intersects a ray with a torus lying in the XZ plane.\r\n * The torus has major radius R (outerRadius) and minor radius r (innerRadius).\r\n *\r\n * Equation of torus: (x²+y²+z²+R²-r²)² = 4R²(x²+z²)\r\n * Substituting ray P(t) = O + t*D leads to a quartic in t which is solved\r\n * with Ferrari's method.\r\n */\r\n raycast(ray: Ray) {\r\n const R = this._options.outerRadius ?? 1; // major radius\r\n const r = this._options.innerRadius ?? 0.3; // minor radius\r\n\r\n const ox = ray.origin.x,\r\n oy = ray.origin.y,\r\n oz = ray.origin.z;\r\n const dx = ray.direction.x,\r\n dy = ray.direction.y,\r\n dz = ray.direction.z;\r\n\r\n // Let f = |O|² + R² - r²\r\n // g = O·D (dot product)\r\n // h = |D|² (should be 1 for a normalised direction, kept general)\r\n // Quartic: (h*t² + 2g*t + f)² = 4R²*((dx*t+ox)² + (dz*t+oz)²)\r\n // Expand into c4*t^4 + c3*t^3 + c2*t^2 + c1*t + c0 = 0\r\n\r\n const OO = ox * ox + oy * oy + oz * oz;\r\n const OD = ox * dx + oy * dy + oz * dz;\r\n const DD = dx * dx + dy * dy + dz * dz;\r\n\r\n const f = OO + R * R - r * r;\r\n const g = OD;\r\n const h = DD;\r\n\r\n // XZ components only (for the 4R²(x²+z²) term)\r\n const oxz2 = ox * ox + oz * oz; // ox² + oz²\r\n const odxz = ox * dx + oz * dz; // ox*dx + oz*dz\r\n const dxz2 = dx * dx + dz * dz; // dx² + dz²\r\n\r\n // Quartic coefficients (from expanding both sides)\r\n const R2 = 4 * R * R;\r\n const c4 = h * h;\r\n const c3 = 4 * h * g;\r\n const c2 = 2 * h * f + 4 * g * g - R2 * dxz2;\r\n const c1 = 4 * g * f - 2 * R2 * odxz;\r\n const c0 = f * f - R2 * oxz2;\r\n\r\n // Solve quartic c4*t^4 + c3*t^3 + c2*t^2 + c1*t + c0 = 0\r\n const roots = TorusShape._solveQuartic(c4, c3, c2, c1, c0);\r\n let tMin = Infinity;\r\n for (const t of roots) {\r\n if (t >= 0 && t < tMin) {\r\n tMin = t;\r\n }\r\n }\r\n return isFinite(tMin) ? tMin : null;\r\n }\r\n\r\n /** @internal Solve quartic a*t^4+b*t^3+c*t^2+d*t+e=0, returns real roots */\r\n private static _solveQuartic(a: number, b: number, c: number, d: number, e: number): number[] {\r\n const eps = 1e-8;\r\n if (Math.abs(a) < eps) {\r\n return TorusShape._solveCubic(b, c, d, e);\r\n }\r\n // Depress quartic: divide by a and substitute t = u - b/(4a)\r\n const inv_a = 1 / a;\r\n const B = b * inv_a;\r\n const C = c * inv_a;\r\n const D = d * inv_a;\r\n const E = e * inv_a;\r\n const p = C - (3 / 8) * B * B;\r\n const q = (B * B * B) / 8 - (B * C) / 2 + D;\r\n const r2 = -(3 / 256) * B * B * B * B + (B * B * C) / 16 - (B * D) / 4 + E;\r\n\r\n let roots: number[];\r\n if (Math.abs(q) < eps) {\r\n // Biquadratic: u^4 + p*u^2 + r2 = 0\r\n const disc = p * p - 4 * r2;\r\n if (disc < 0) {\r\n return [];\r\n }\r\n const sqrtDisc = Math.sqrt(disc);\r\n roots = [];\r\n for (const sign of [-1, 1]) {\r\n const w2 = (-p + sign * sqrtDisc) / 2;\r\n if (w2 >= 0) {\r\n const w = Math.sqrt(w2);\r\n roots.push(w, -w);\r\n }\r\n }\r\n } else {\r\n // Ferrari: find a real root of the resolvent cubic\r\n // 8m^3 + 8p*m^2 + (2p^2-8r2)*m - q^2 = 0\r\n const cubicRoots = TorusShape._solveCubic(8, 8 * p, 2 * p * p - 8 * r2, -q * q);\r\n // Pick the largest real root\r\n let m = -Infinity;\r\n for (const cr of cubicRoots) {\r\n if (cr > m) {\r\n m = cr;\r\n }\r\n }\r\n if (!isFinite(m)) {\r\n return [];\r\n }\r\n\r\n const sqrtM = m >= 0 ? Math.sqrt(m) : 0;\r\n const disc1 = -(p + 2 * m) + q / (sqrtM + eps);\r\n const disc2 = -(p + 2 * m) - q / (sqrtM + eps);\r\n roots = [];\r\n if (disc1 >= 0) {\r\n const s = Math.sqrt(disc1);\r\n roots.push(sqrtM + s, sqrtM - s);\r\n }\r\n if (disc2 >= 0) {\r\n const s = Math.sqrt(disc2);\r\n roots.push(-sqrtM + s, -sqrtM - s);\r\n }\r\n }\r\n // Un-depress: t = u - B/4\r\n const shift = B / 4;\r\n return roots.map((u) => u - shift);\r\n }\r\n\r\n /** @internal Solve cubic a*t^3+b*t^2+c*t+d=0, returns real roots (Cardano) */\r\n private static _solveCubic(a: number, b: number, c: number, d: number): number[] {\r\n const eps = 1e-8;\r\n if (Math.abs(a) < eps) {\r\n return TorusShape._solveQuadratic(b, c, d);\r\n }\r\n const inv_a = 1 / a;\r\n const B = b * inv_a;\r\n const C = c * inv_a;\r\n const D = d * inv_a;\r\n const p = C - (B * B) / 3;\r\n const q = (2 * B * B * B) / 27 - (B * C) / 3 + D;\r\n const disc = (q * q) / 4 + (p * p * p) / 27;\r\n const shift = -B / 3;\r\n if (disc > eps) {\r\n const sqrtDisc = Math.sqrt(disc);\r\n const u = Math.cbrt(-q / 2 + sqrtDisc);\r\n const v = Math.cbrt(-q / 2 - sqrtDisc);\r\n return [u + v + shift];\r\n } else if (disc < -eps) {\r\n const r = Math.sqrt((-p * p * p) / 27);\r\n const theta = Math.acos(Math.max(-1, Math.min(1, -q / (2 * r))));\r\n const rCbrt = Math.cbrt(r);\r\n return [\r\n 2 * rCbrt * Math.cos(theta / 3) + shift,\r\n 2 * rCbrt * Math.cos((theta + 2 * Math.PI) / 3) + shift,\r\n 2 * rCbrt * Math.cos((theta + 4 * Math.PI) / 3) + shift\r\n ];\r\n } else {\r\n const u = Math.cbrt(-q / 2);\r\n return [2 * u + shift, -u + shift];\r\n }\r\n }\r\n\r\n /** @internal Solve quadratic a*t^2+b*t+c=0 */\r\n private static _solveQuadratic(a: number, b: number, c: number): number[] {\r\n const eps = 1e-8;\r\n if (Math.abs(a) < eps) {\r\n if (Math.abs(b) < eps) {\r\n return [];\r\n }\r\n return [-c / b];\r\n }\r\n const disc = b * b - 4 * a * c;\r\n if (disc < 0) {\r\n return [];\r\n }\r\n if (disc < eps) {\r\n return [-b / (2 * a)];\r\n }\r\n const s = Math.sqrt(disc);\r\n return [(-b - s) / (2 * a), (-b + s) / (2 * a)];\r\n }\r\n /**\r\n * Generates the data for the torus shape\r\n * @param vertices - vertex positions\r\n * @param normals - vertex normals\r\n * @param uvs - vertex uvs\r\n * @param indices - vertex indices\r\n */\r\n static generateData(\r\n opt: TorusCreationOptions,\r\n vertices: number[],\r\n normals: number[],\r\n tangents: number[],\r\n uvs: number[],\r\n indices: number[],\r\n bbox?: AABB,\r\n indexOffset?: number,\r\n vertexCallback?: (index: number, x: number, y: number, z: number) => void\r\n ) {\r\n const options = Object.assign({}, this._defaultOptions, opt ?? {});\r\n indexOffset = indexOffset ?? 0;\r\n const start = vertices.length;\r\n const N = options.numSlices;\r\n const M = options.numSegments;\r\n const OR = options.outerRadius;\r\n const IR = options.innerRadius;\r\n for (let n = 0; n <= N; n++) {\r\n const alpha = ((n % N) / N) * Math.PI * 2;\r\n const cosA = Math.cos(alpha);\r\n const sinA = Math.sin(alpha);\r\n const cx = OR * cosA;\r\n const cy = 0;\r\n const cz = OR * sinA;\r\n for (let m = 0; m <= M; m++) {\r\n const theta = ((m % M) / M) * Math.PI * 2;\r\n const cosT = Math.cos(theta);\r\n const sinT = Math.sin(theta);\r\n const t = 1 + (IR * cosT) / OR;\r\n const s = IR * sinT;\r\n const x = cx * t;\r\n const y = cy * t + s;\r\n const z = cz * t;\r\n vertices.push(x, y, z);\r\n if (normals) {\r\n const nx = x - cx;\r\n const ny = y - cy;\r\n const nz = z - cz;\r\n const mag = Math.hypot(nx, ny, nz);\r\n normals.push(nx / mag, ny / mag, nz / mag);\r\n }\r\n if (uvs) {\r\n uvs.push(m / M, n / N);\r\n }\r\n if (tangents) {\r\n const tx = -sinT * cosA;\r\n const ty = cosT;\r\n const tz = -sinT * sinA;\r\n tangents.push(tx, ty, tz, 1.0);\r\n }\r\n }\r\n }\r\n for (let n = 0; n < N; n++) {\r\n for (let m = 0; m < M; m++) {\r\n indices.push(n * (M + 1) + m + indexOffset);\r\n indices.push((n + 1) * (M + 1) + m + 1 + indexOffset);\r\n indices.push((n + 1) * (M + 1) + m + indexOffset);\r\n indices.push(n * (M + 1) + m + indexOffset);\r\n indices.push(n * (M + 1) + m + 1 + indexOffset);\r\n indices.push((n + 1) * (M + 1) + m + 1 + indexOffset);\r\n }\r\n }\r\n Shape._transform(options.transform, vertices, normals, start);\r\n if (bbox || vertexCallback) {\r\n for (let i = start; i < vertices.length - 2; i += 3) {\r\n if (bbox) {\r\n bbox.minPoint.x = Math.min(bbox.minPoint.x, vertices[i]);\r\n bbox.minPoint.y = Math.min(bbox.minPoint.y, vertices[i + 1]);\r\n bbox.minPoint.z = Math.min(bbox.minPoint.z, vertices[i + 2]);\r\n bbox.maxPoint.x = Math.max(bbox.maxPoint.x, vertices[i]);\r\n bbox.maxPoint.y = Math.max(bbox.maxPoint.y, vertices[i + 1]);\r\n bbox.maxPoint.z = Math.max(bbox.maxPoint.z, vertices[i + 2]);\r\n }\r\n vertexCallback?.((i - start) / 3, vertices[i], vertices[i + 1], vertices[i + 2]);\r\n }\r\n }\r\n return 'triangle-list' as const;\r\n }\r\n}\r\n"],"names":["TorusShape","Shape","_defaultOptions","numSlices","numSegments","outerRadius","innerRadius","radialDetail","options","clone","_options","type","raycast","ray","R","r","ox","origin","x","oy","y","oz","z","dx","direction","dy","dz","OO","OD","DD","f","g","h","oxz2","odxz","dxz2","R2","c4","c3","c2","c1","c0","roots","_solveQuartic","tMin","Infinity","t","isFinite","a","b","c","d","e","eps","Math","abs","_solveCubic","inv_a","B","C","D","E","p","q","r2","disc","sqrtDisc","sqrt","sign","w2","w","push","cubicRoots","m","cr","sqrtM","disc1","disc2","s","shift","map","u","_solveQuadratic","cbrt","v","theta","acos","max","min","rCbrt","cos","PI","generateData","opt","vertices","normals","tangents","uvs","indices","bbox","indexOffset","vertexCallback","Object","assign","start","length","N","M","OR","IR","n","alpha","cosA","sinA","sin","cx","cy","cz","cosT","sinT","nx","ny","nz","mag","hypot","tx","ty","tz","_transform","transform","i","minPoint","maxPoint"],"mappings":";;AAqBA;;;;;;;;;;;;;;;;;;;IAsBO,MAAMA,UAAmBC,SAAAA,KAAAA,CAAAA;AAC9B,IAAA,OAAOC,eAAkB,GAAA;AACvB,QAAA,GAAGD,MAAMC,eAAe;QACxBC,SAAW,EAAA,EAAA;QACXC,WAAa,EAAA,EAAA;QACbC,WAAa,EAAA,CAAA;QACbC,WAAa,EAAA,GAAA;QACbC,YAAc,EAAA;KACd;AACF;;;MAIA,WAAA,CAAYC,OAA8B,CAAE;AAC1C,QAAA,KAAK,CAACA,OAAAA,CAAAA;AACR;IACAC,KAAQ,GAAA;AACN,QAAA,OAAO,IAAIT,UAAAA,CAAW,IAAI,CAACU,QAAQ,CAAA;AACrC;6BAEA,IAAIC,IAAO,GAAA;QACT,OAAO,OAAA;AACT;AACA;;;;;;;;;;MAWAC,OAAAA,CAAQC,GAAQ,EAAE;QAChB,MAAMC,CAAAA,GAAI,IAAI,CAACJ,QAAQ,CAACL,WAAW,IAAI;QACvC,MAAMU,CAAAA,GAAI,IAAI,CAACL,QAAQ,CAACJ,WAAW,IAAI;AAEvC,QAAA,MAAMU,KAAKH,GAAII,CAAAA,MAAM,CAACC,CAAC,EACrBC,EAAKN,GAAAA,GAAAA,CAAII,MAAM,CAACG,CAAC,EACjBC,EAAAA,GAAKR,GAAII,CAAAA,MAAM,CAACK,CAAC;AACnB,QAAA,MAAMC,KAAKV,GAAIW,CAAAA,SAAS,CAACN,CAAC,EACxBO,EAAKZ,GAAAA,GAAAA,CAAIW,SAAS,CAACJ,CAAC,EACpBM,EAAAA,GAAKb,GAAIW,CAAAA,SAAS,CAACF,CAAC;;;;;;AAQtB,QAAA,MAAMK,EAAKX,GAAAA,EAAAA,GAAKA,EAAKG,GAAAA,EAAAA,GAAKA,KAAKE,EAAKA,GAAAA,EAAAA;AACpC,QAAA,MAAMO,EAAKZ,GAAAA,EAAAA,GAAKO,EAAKJ,GAAAA,EAAAA,GAAKM,KAAKJ,EAAKK,GAAAA,EAAAA;AACpC,QAAA,MAAMG,EAAKN,GAAAA,EAAAA,GAAKA,EAAKE,GAAAA,EAAAA,GAAKA,KAAKC,EAAKA,GAAAA,EAAAA;AAEpC,QAAA,MAAMI,CAAIH,GAAAA,EAAAA,GAAKb,CAAIA,GAAAA,CAAAA,GAAIC,CAAIA,GAAAA,CAAAA;AAC3B,QAAA,MAAMgB,CAAIH,GAAAA,EAAAA;AACV,QAAA,MAAMI,CAAIH,GAAAA,EAAAA;;AAGV,QAAA,MAAMI,IAAOjB,GAAAA,EAAAA,GAAKA,EAAKK,GAAAA,EAAAA,GAAKA;AAC5B,QAAA,MAAMa,IAAOlB,GAAAA,EAAAA,GAAKO,EAAKF,GAAAA,EAAAA,GAAKK;AAC5B,QAAA,MAAMS,IAAOZ,GAAAA,EAAAA,GAAKA,EAAKG,GAAAA,EAAAA,GAAKA;;QAG5B,MAAMU,EAAAA,GAAK,IAAItB,CAAIA,GAAAA,CAAAA;AACnB,QAAA,MAAMuB,KAAKL,CAAIA,GAAAA,CAAAA;QACf,MAAMM,EAAAA,GAAK,IAAIN,CAAID,GAAAA,CAAAA;AACnB,QAAA,MAAMQ,KAAK,CAAIP,GAAAA,CAAAA,GAAIF,IAAI,CAAIC,GAAAA,CAAAA,GAAIA,IAAIK,EAAKD,GAAAA,IAAAA;AACxC,QAAA,MAAMK,EAAK,GAAA,CAAA,GAAIT,CAAID,GAAAA,CAAAA,GAAI,IAAIM,EAAKF,GAAAA,IAAAA;QAChC,MAAMO,EAAAA,GAAKX,CAAIA,GAAAA,CAAAA,GAAIM,EAAKH,GAAAA,IAAAA;;AAGxB,QAAA,MAAMS,QAAQ1C,UAAW2C,CAAAA,aAAa,CAACN,EAAIC,EAAAA,EAAAA,EAAIC,IAAIC,EAAIC,EAAAA,EAAAA,CAAAA;AACvD,QAAA,IAAIG,IAAOC,GAAAA,QAAAA;QACX,KAAK,MAAMC,KAAKJ,KAAO,CAAA;YACrB,IAAII,CAAAA,IAAK,CAAKA,IAAAA,CAAAA,GAAIF,IAAM,EAAA;gBACtBA,IAAOE,GAAAA,CAAAA;AACT;AACF;QACA,OAAOC,QAAAA,CAASH,QAAQA,IAAO,GAAA,IAAA;AACjC;AAEA,iFACA,OAAeD,aAAcK,CAAAA,CAAS,EAAEC,CAAS,EAAEC,CAAS,EAAEC,CAAS,EAAEC,CAAS,EAAY;AAC5F,QAAA,MAAMC,GAAM,GAAA,IAAA;AACZ,QAAA,IAAIC,IAAKC,CAAAA,GAAG,CAACP,CAAAA,CAAAA,GAAKK,GAAK,EAAA;AACrB,YAAA,OAAOrD,UAAWwD,CAAAA,WAAW,CAACP,CAAAA,EAAGC,GAAGC,CAAGC,EAAAA,CAAAA,CAAAA;AACzC;;AAEA,QAAA,MAAMK,QAAQ,CAAIT,GAAAA,CAAAA;AAClB,QAAA,MAAMU,IAAIT,CAAIQ,GAAAA,KAAAA;AACd,QAAA,MAAME,IAAIT,CAAIO,GAAAA,KAAAA;AACd,QAAA,MAAMG,IAAIT,CAAIM,GAAAA,KAAAA;AACd,QAAA,MAAMI,IAAIT,CAAIK,GAAAA,KAAAA;AACd,QAAA,MAAMK,CAAIH,GAAAA,CAAAA,GAAI,CAAC,GAAI,IAAKD,CAAIA,GAAAA,CAAAA;QAC5B,MAAMK,CAAAA,GAAI,CAAKL,GAAAA,CAAAA,GAAIA,IAAK,CAAI,GAACA,CAAIC,GAAAA,CAAAA,GAAK,CAAIC,GAAAA,CAAAA;AAC1C,QAAA,MAAMI,KAAK,EAAE,GAAI,GAAON,GAAAA,CAAAA,GAAIA,IAAIA,CAAIA,GAAAA,CAAAA,GAAI,CAACA,GAAIA,IAAIC,CAAK,GAAA,EAAA,GAAK,CAACD,GAAIE,IAAK,CAAIC,GAAAA,CAAAA;QAEzE,IAAInB,KAAAA;AACJ,QAAA,IAAIY,IAAKC,CAAAA,GAAG,CAACQ,CAAAA,CAAAA,GAAKV,GAAK,EAAA;;YAErB,MAAMY,IAAAA,GAAOH,CAAIA,GAAAA,CAAAA,GAAI,CAAIE,GAAAA,EAAAA;AACzB,YAAA,IAAIC,OAAO,CAAG,EAAA;AACZ,gBAAA,OAAO,EAAE;AACX;YACA,MAAMC,QAAAA,GAAWZ,IAAKa,CAAAA,IAAI,CAACF,IAAAA,CAAAA;AAC3BvB,YAAAA,KAAAA,GAAQ,EAAE;AACV,YAAA,KAAK,MAAM0B,IAAQ,IAAA;gBAAC,EAAC;AAAG,gBAAA;aAAE,CAAE;AAC1B,gBAAA,MAAMC,KAAK,CAAC,CAACP,CAAIM,GAAAA,IAAAA,GAAOF,QAAO,IAAK,CAAA;AACpC,gBAAA,IAAIG,MAAM,CAAG,EAAA;oBACX,MAAMC,CAAAA,GAAIhB,IAAKa,CAAAA,IAAI,CAACE,EAAAA,CAAAA;oBACpB3B,KAAM6B,CAAAA,IAAI,CAACD,CAAAA,EAAG,CAACA,CAAAA,CAAAA;AACjB;AACF;SACK,MAAA;;;AAGL,YAAA,MAAME,UAAaxE,GAAAA,UAAAA,CAAWwD,WAAW,CAAC,CAAG,EAAA,CAAA,GAAIM,CAAG,EAAA,CAAA,GAAIA,CAAIA,GAAAA,CAAAA,GAAI,CAAIE,GAAAA,EAAAA,EAAI,CAACD,CAAIA,GAAAA,CAAAA,CAAAA;;AAE7E,YAAA,IAAIU,IAAI,CAAC5B,QAAAA;YACT,KAAK,MAAM6B,MAAMF,UAAY,CAAA;AAC3B,gBAAA,IAAIE,KAAKD,CAAG,EAAA;oBACVA,CAAIC,GAAAA,EAAAA;AACN;AACF;YACA,IAAI,CAAC3B,SAAS0B,CAAI,CAAA,EAAA;AAChB,gBAAA,OAAO,EAAE;AACX;AAEA,YAAA,MAAME,QAAQF,CAAK,IAAA,CAAA,GAAInB,IAAKa,CAAAA,IAAI,CAACM,CAAK,CAAA,GAAA,CAAA;YACtC,MAAMG,KAAAA,GAAQ,EAAEd,CAAI,GAAA,CAAA,GAAIW,CAAAA,CAAKV,GAAAA,CAAAA,IAAKY,KAAAA,GAAQtB,GAAE,CAAA;YAC5C,MAAMwB,KAAAA,GAAQ,EAAEf,CAAI,GAAA,CAAA,GAAIW,CAAAA,CAAKV,GAAAA,CAAAA,IAAKY,KAAAA,GAAQtB,GAAE,CAAA;AAC5CX,YAAAA,KAAAA,GAAQ,EAAE;AACV,YAAA,IAAIkC,SAAS,CAAG,EAAA;gBACd,MAAME,CAAAA,GAAIxB,IAAKa,CAAAA,IAAI,CAACS,KAAAA,CAAAA;AACpBlC,gBAAAA,KAAAA,CAAM6B,IAAI,CAACI,KAAQG,GAAAA,CAAAA,EAAGH,KAAQG,GAAAA,CAAAA,CAAAA;AAChC;AACA,YAAA,IAAID,SAAS,CAAG,EAAA;gBACd,MAAMC,CAAAA,GAAIxB,IAAKa,CAAAA,IAAI,CAACU,KAAAA,CAAAA;AACpBnC,gBAAAA,KAAAA,CAAM6B,IAAI,CAAC,CAACI,KAAQG,GAAAA,CAAAA,EAAG,CAACH,KAAQG,GAAAA,CAAAA,CAAAA;AAClC;AACF;;AAEA,QAAA,MAAMC,QAAQrB,CAAI,GAAA,CAAA;AAClB,QAAA,OAAOhB,KAAMsC,CAAAA,GAAG,CAAC,CAACC,IAAMA,CAAIF,GAAAA,KAAAA,CAAAA;AAC9B;mFAGA,OAAevB,WAAAA,CAAYR,CAAS,EAAEC,CAAS,EAAEC,CAAS,EAAEC,CAAS,EAAY;AAC/E,QAAA,MAAME,GAAM,GAAA,IAAA;AACZ,QAAA,IAAIC,IAAKC,CAAAA,GAAG,CAACP,CAAAA,CAAAA,GAAKK,GAAK,EAAA;AACrB,YAAA,OAAOrD,UAAWkF,CAAAA,eAAe,CAACjC,CAAAA,EAAGC,CAAGC,EAAAA,CAAAA,CAAAA;AAC1C;AACA,QAAA,MAAMM,QAAQ,CAAIT,GAAAA,CAAAA;AAClB,QAAA,MAAMU,IAAIT,CAAIQ,GAAAA,KAAAA;AACd,QAAA,MAAME,IAAIT,CAAIO,GAAAA,KAAAA;AACd,QAAA,MAAMG,IAAIT,CAAIM,GAAAA,KAAAA;AACd,QAAA,MAAMK,CAAIH,GAAAA,CAAAA,GAAI,CAACD,GAAIA,CAAK,GAAA,CAAA;QACxB,MAAMK,CAAAA,GAAI,CAAC,GAAIL,CAAIA,GAAAA,CAAAA,GAAIA,IAAK,EAAK,GAACA,CAAIC,GAAAA,CAAAA,GAAK,CAAIC,GAAAA,CAAAA;QAC/C,MAAMK,IAAAA,GAAO,CAAKF,GAAAA,CAAAA,GAAK,IAAI,CAACD,GAAIA,IAAIA,CAAK,GAAA,EAAA;QACzC,MAAMiB,KAAAA,GAAQ,CAACrB,CAAI,GAAA,CAAA;AACnB,QAAA,IAAIO,OAAOZ,GAAK,EAAA;YACd,MAAMa,QAAAA,GAAWZ,IAAKa,CAAAA,IAAI,CAACF,IAAAA,CAAAA;AAC3B,YAAA,MAAMgB,IAAI3B,IAAK6B,CAAAA,IAAI,CAAC,CAACpB,IAAI,CAAIG,GAAAA,QAAAA,CAAAA;AAC7B,YAAA,MAAMkB,IAAI9B,IAAK6B,CAAAA,IAAI,CAAC,CAACpB,IAAI,CAAIG,GAAAA,QAAAA,CAAAA;YAC7B,OAAO;AAACe,gBAAAA,CAAAA,GAAIG,CAAIL,GAAAA;AAAM,aAAA;SACjB,MAAA,IAAId,IAAO,GAAA,KAAM,EAAA;YACtB,MAAMlD,CAAAA,GAAIuC,KAAKa,IAAI,CAAC,CAAEL,CAAAA,GAAIA,IAAIA,CAAK,GAAA,EAAA,CAAA;AACnC,YAAA,MAAMuB,QAAQ/B,IAAKgC,CAAAA,IAAI,CAAChC,IAAAA,CAAKiC,GAAG,CAAC,EAAIjC,EAAAA,IAAAA,CAAKkC,GAAG,CAAC,CAAA,EAAG,CAACzB,CAAK,IAAA,IAAIhD,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA;YAC3D,MAAM0E,KAAAA,GAAQnC,IAAK6B,CAAAA,IAAI,CAACpE,CAAAA,CAAAA;YACxB,OAAO;AACL,gBAAA,CAAA,GAAI0E,KAAQnC,GAAAA,IAAAA,CAAKoC,GAAG,CAACL,QAAQ,CAAKN,CAAAA,GAAAA,KAAAA;AAClC,gBAAA,CAAA,GAAIU,KAAQnC,GAAAA,IAAAA,CAAKoC,GAAG,CAAC,CAACL,KAAQ,GAAA,CAAA,GAAI/B,IAAKqC,CAAAA,EAAE,IAAI,CAAKZ,CAAAA,GAAAA,KAAAA;AAClD,gBAAA,CAAA,GAAIU,KAAQnC,GAAAA,IAAAA,CAAKoC,GAAG,CAAC,CAACL,KAAQ,GAAA,CAAA,GAAI/B,IAAKqC,CAAAA,EAAE,IAAI,CAAKZ,CAAAA,GAAAA;AACnD,aAAA;SACI,MAAA;AACL,YAAA,MAAME,CAAI3B,GAAAA,IAAAA,CAAK6B,IAAI,CAAC,CAACpB,CAAI,GAAA,CAAA,CAAA;YACzB,OAAO;AAAC,gBAAA,CAAA,GAAIkB,CAAIF,GAAAA,KAAAA;AAAO,gBAAA,CAACE,CAAIF,GAAAA;AAAM,aAAA;AACpC;AACF;mDAGA,OAAeG,eAAgBlC,CAAAA,CAAS,EAAEC,CAAS,EAAEC,CAAS,EAAY;AACxE,QAAA,MAAMG,GAAM,GAAA,IAAA;AACZ,QAAA,IAAIC,IAAKC,CAAAA,GAAG,CAACP,CAAAA,CAAAA,GAAKK,GAAK,EAAA;AACrB,YAAA,IAAIC,IAAKC,CAAAA,GAAG,CAACN,CAAAA,CAAAA,GAAKI,GAAK,EAAA;AACrB,gBAAA,OAAO,EAAE;AACX;YACA,OAAO;AAAC,gBAAA,CAACH,CAAID,GAAAA;AAAE,aAAA;AACjB;AACA,QAAA,MAAMgB,IAAOhB,GAAAA,CAAAA,GAAIA,CAAI,GAAA,CAAA,GAAID,CAAIE,GAAAA,CAAAA;AAC7B,QAAA,IAAIe,OAAO,CAAG,EAAA;AACZ,YAAA,OAAO,EAAE;AACX;AACA,QAAA,IAAIA,OAAOZ,GAAK,EAAA;YACd,OAAO;gBAAC,CAACJ,CAAAA,IAAK,CAAA,GAAID,CAAAA;AAAG,aAAA;AACvB;QACA,MAAM8B,CAAAA,GAAIxB,IAAKa,CAAAA,IAAI,CAACF,IAAAA,CAAAA;QACpB,OAAO;AAAE,YAAA,CAAA,CAAChB,CAAI6B,GAAAA,CAAAA,KAAM,IAAI9B,CAAAA,CAAAA;AAAK,YAAA,CAAA,CAACC,CAAI6B,GAAAA,CAAAA,KAAM,IAAI9B,CAAAA;AAAG,SAAA;AACjD;AACA;;;;;;AAMC,MACD,OAAO4C,YACLC,CAAAA,GAAyB,EACzBC,QAAkB,EAClBC,OAAiB,EACjBC,QAAkB,EAClBC,GAAa,EACbC,OAAiB,EACjBC,IAAW,EACXC,WAAoB,EACpBC,cAAyE,EACzE;QACA,MAAM7F,OAAAA,GAAU8F,MAAOC,CAAAA,MAAM,CAAC,EAAI,EAAA,IAAI,CAACrG,eAAe,EAAE2F,GAAAA,IAAO,EAAC,CAAA;AAChEO,QAAAA,WAAAA,GAAcA,WAAe,IAAA,CAAA;QAC7B,MAAMI,KAAAA,GAAQV,SAASW,MAAM;QAC7B,MAAMC,CAAAA,GAAIlG,QAAQL,SAAS;QAC3B,MAAMwG,CAAAA,GAAInG,QAAQJ,WAAW;QAC7B,MAAMwG,EAAAA,GAAKpG,QAAQH,WAAW;QAC9B,MAAMwG,EAAAA,GAAKrG,QAAQF,WAAW;AAC9B,QAAA,IAAK,IAAIwG,CAAAA,GAAI,CAAGA,EAAAA,CAAAA,IAAKJ,GAAGI,CAAK,EAAA,CAAA;AAC3B,YAAA,MAAMC,QAAQ,CAAED,GAAIJ,IAAKA,CAAKpD,GAAAA,IAAAA,CAAKqC,EAAE,GAAG,CAAA;YACxC,MAAMqB,IAAAA,GAAO1D,IAAKoC,CAAAA,GAAG,CAACqB,KAAAA,CAAAA;YACtB,MAAME,IAAAA,GAAO3D,IAAK4D,CAAAA,GAAG,CAACH,KAAAA,CAAAA;AACtB,YAAA,MAAMI,KAAKP,EAAKI,GAAAA,IAAAA;AAChB,YAAA,MAAMI,EAAK,GAAA,CAAA;AACX,YAAA,MAAMC,KAAKT,EAAKK,GAAAA,IAAAA;AAChB,YAAA,IAAK,IAAIxC,CAAAA,GAAI,CAAGA,EAAAA,CAAAA,IAAKkC,GAAGlC,CAAK,EAAA,CAAA;AAC3B,gBAAA,MAAMY,QAAQ,CAAEZ,GAAIkC,IAAKA,CAAKrD,GAAAA,IAAAA,CAAKqC,EAAE,GAAG,CAAA;gBACxC,MAAM2B,IAAAA,GAAOhE,IAAKoC,CAAAA,GAAG,CAACL,KAAAA,CAAAA;gBACtB,MAAMkC,IAAAA,GAAOjE,IAAK4D,CAAAA,GAAG,CAAC7B,KAAAA,CAAAA;AACtB,gBAAA,MAAMvC,CAAI,GAAA,CAAA,GAAI,EAAC+D,GAAKS,IAAQV,GAAAA,EAAAA;AAC5B,gBAAA,MAAM9B,IAAI+B,EAAKU,GAAAA,IAAAA;AACf,gBAAA,MAAMrG,IAAIiG,EAAKrE,GAAAA,CAAAA;gBACf,MAAM1B,CAAAA,GAAIgG,KAAKtE,CAAIgC,GAAAA,CAAAA;AACnB,gBAAA,MAAMxD,IAAI+F,EAAKvE,GAAAA,CAAAA;gBACfgD,QAASvB,CAAAA,IAAI,CAACrD,CAAAA,EAAGE,CAAGE,EAAAA,CAAAA,CAAAA;AACpB,gBAAA,IAAIyE,OAAS,EAAA;AACX,oBAAA,MAAMyB,KAAKtG,CAAIiG,GAAAA,EAAAA;AACf,oBAAA,MAAMM,KAAKrG,CAAIgG,GAAAA,EAAAA;AACf,oBAAA,MAAMM,KAAKpG,CAAI+F,GAAAA,EAAAA;AACf,oBAAA,MAAMM,GAAMrE,GAAAA,IAAAA,CAAKsE,KAAK,CAACJ,IAAIC,EAAIC,EAAAA,EAAAA,CAAAA;AAC/B3B,oBAAAA,OAAAA,CAAQxB,IAAI,CAACiD,EAAAA,GAAKG,GAAKF,EAAAA,EAAAA,GAAKE,KAAKD,EAAKC,GAAAA,GAAAA,CAAAA;AACxC;AACA,gBAAA,IAAI1B,GAAK,EAAA;AACPA,oBAAAA,GAAAA,CAAI1B,IAAI,CAACE,CAAIkC,GAAAA,CAAAA,EAAGG,CAAIJ,GAAAA,CAAAA,CAAAA;AACtB;AACA,gBAAA,IAAIV,QAAU,EAAA;oBACZ,MAAM6B,EAAAA,GAAK,CAACN,IAAOP,GAAAA,IAAAA;AACnB,oBAAA,MAAMc,EAAKR,GAAAA,IAAAA;oBACX,MAAMS,EAAAA,GAAK,CAACR,IAAON,GAAAA,IAAAA;AACnBjB,oBAAAA,QAAAA,CAASzB,IAAI,CAACsD,EAAIC,EAAAA,EAAAA,EAAIC,EAAI,EAAA,GAAA,CAAA;AAC5B;AACF;AACF;AACA,QAAA,IAAK,IAAIjB,CAAAA,GAAI,CAAGA,EAAAA,CAAAA,GAAIJ,GAAGI,CAAK,EAAA,CAAA;AAC1B,YAAA,IAAK,IAAIrC,CAAAA,GAAI,CAAGA,EAAAA,CAAAA,GAAIkC,GAAGlC,CAAK,EAAA,CAAA;AAC1ByB,gBAAAA,OAAAA,CAAQ3B,IAAI,CAACuC,CAAAA,IAAKH,CAAI,GAAA,CAAA,IAAKlC,CAAI2B,GAAAA,WAAAA,CAAAA;AAC/BF,gBAAAA,OAAAA,CAAQ3B,IAAI,CAAC,CAACuC,CAAI,GAAA,CAAA,KAAMH,CAAI,GAAA,CAAA,CAAKlC,GAAAA,CAAAA,GAAI,CAAI2B,GAAAA,WAAAA,CAAAA;gBACzCF,OAAQ3B,CAAAA,IAAI,CAAEuC,CAAAA,CAAAA,GAAI,CAAA,KAAMH,CAAAA,GAAI,CAAA,CAAA,GAAKlC,CAAI2B,GAAAA,WAAAA,CAAAA;AACrCF,gBAAAA,OAAAA,CAAQ3B,IAAI,CAACuC,CAAAA,IAAKH,CAAI,GAAA,CAAA,IAAKlC,CAAI2B,GAAAA,WAAAA,CAAAA;gBAC/BF,OAAQ3B,CAAAA,IAAI,CAACuC,CAAKH,IAAAA,IAAI,CAAA,CAAA,GAAKlC,IAAI,CAAI2B,GAAAA,WAAAA,CAAAA;AACnCF,gBAAAA,OAAAA,CAAQ3B,IAAI,CAAC,CAACuC,CAAI,GAAA,CAAA,KAAMH,CAAI,GAAA,CAAA,CAAKlC,GAAAA,CAAAA,GAAI,CAAI2B,GAAAA,WAAAA,CAAAA;AAC3C;AACF;AACAnG,QAAAA,KAAAA,CAAM+H,UAAU,CAACxH,OAAAA,CAAQyH,SAAS,EAAEnC,UAAUC,OAASS,EAAAA,KAAAA,CAAAA;AACvD,QAAA,IAAIL,QAAQE,cAAgB,EAAA;YAC1B,IAAK,IAAI6B,IAAI1B,KAAO0B,EAAAA,CAAAA,GAAIpC,SAASW,MAAM,GAAG,CAAGyB,EAAAA,CAAAA,IAAK,CAAG,CAAA;AACnD,gBAAA,IAAI/B,IAAM,EAAA;AACRA,oBAAAA,IAAAA,CAAKgC,QAAQ,CAACjH,CAAC,GAAGoC,KAAKkC,GAAG,CAACW,IAAKgC,CAAAA,QAAQ,CAACjH,CAAC,EAAE4E,QAAQ,CAACoC,CAAE,CAAA,CAAA;AACvD/B,oBAAAA,IAAAA,CAAKgC,QAAQ,CAAC/G,CAAC,GAAGkC,KAAKkC,GAAG,CAACW,IAAKgC,CAAAA,QAAQ,CAAC/G,CAAC,EAAE0E,QAAQ,CAACoC,IAAI,CAAE,CAAA,CAAA;AAC3D/B,oBAAAA,IAAAA,CAAKgC,QAAQ,CAAC7G,CAAC,GAAGgC,KAAKkC,GAAG,CAACW,IAAKgC,CAAAA,QAAQ,CAAC7G,CAAC,EAAEwE,QAAQ,CAACoC,IAAI,CAAE,CAAA,CAAA;AAC3D/B,oBAAAA,IAAAA,CAAKiC,QAAQ,CAAClH,CAAC,GAAGoC,KAAKiC,GAAG,CAACY,IAAKiC,CAAAA,QAAQ,CAAClH,CAAC,EAAE4E,QAAQ,CAACoC,CAAE,CAAA,CAAA;AACvD/B,oBAAAA,IAAAA,CAAKiC,QAAQ,CAAChH,CAAC,GAAGkC,KAAKiC,GAAG,CAACY,IAAKiC,CAAAA,QAAQ,CAAChH,CAAC,EAAE0E,QAAQ,CAACoC,IAAI,CAAE,CAAA,CAAA;AAC3D/B,oBAAAA,IAAAA,CAAKiC,QAAQ,CAAC9G,CAAC,GAAGgC,KAAKiC,GAAG,CAACY,IAAKiC,CAAAA,QAAQ,CAAC9G,CAAC,EAAEwE,QAAQ,CAACoC,IAAI,CAAE,CAAA,CAAA;AAC7D;AACA7B,gBAAAA,cAAAA,GAAiB,CAAC6B,CAAAA,GAAI1B,KAAI,IAAK,CAAA,EAAGV,QAAQ,CAACoC,CAAAA,CAAE,EAAEpC,QAAQ,CAACoC,CAAI,GAAA,CAAA,CAAE,EAAEpC,QAAQ,CAACoC,IAAI,CAAE,CAAA,CAAA;AACjF;AACF;QACA,OAAO,eAAA;AACT;AACF;;;;"}
@@ -897,6 +897,116 @@ import { defineProps } from '../../serialization/types.js';
897
897
  return '';
898
898
  }
899
899
  }
900
+ /**
901
+ * Rotate about axis node
902
+ *
903
+ * @remarks
904
+ * Rotates a position around a pivot along a normalized axis by a given angle.
905
+ * Angle input is in turns (1.0 = 360 degrees).
906
+ *
907
+ * Outputs:
908
+ * - Output 1: Rotated position (vec3)
909
+ *
910
+ * @example
911
+ * ```typescript
912
+ * const rotate = new RotateAboutAxisNode();
913
+ * rotate.connectInput(1, axisNode, 1); // normalized axis (vec3)
914
+ * rotate.connectInput(2, angleNode, 1); // angle in turns (float)
915
+ * rotate.connectInput(3, pivotNode, 1); // pivot (vec3)
916
+ * rotate.connectInput(4, posNode, 1); // position (vec3)
917
+ * ```
918
+ *
919
+ * @public
920
+ */ class RotateAboutAxisNode extends BaseGraphNode {
921
+ /**
922
+ * Creates a new rotate-about-axis node
923
+ *
924
+ * @remarks
925
+ * Initializes with four inputs and one output.
926
+ */ constructor(){
927
+ super();
928
+ this._inputs = [
929
+ {
930
+ id: 1,
931
+ name: 'NormalizedRotationAxis',
932
+ type: [
933
+ 'vec3'
934
+ ],
935
+ required: true
936
+ },
937
+ {
938
+ id: 2,
939
+ name: 'RotationAngle',
940
+ type: [
941
+ 'float'
942
+ ],
943
+ defaultValue: [
944
+ 0
945
+ ]
946
+ },
947
+ {
948
+ id: 3,
949
+ name: 'PivotPoint',
950
+ type: [
951
+ 'vec3'
952
+ ],
953
+ defaultValue: [
954
+ 0,
955
+ 0,
956
+ 0
957
+ ]
958
+ },
959
+ {
960
+ id: 4,
961
+ name: 'Position',
962
+ type: [
963
+ 'vec3'
964
+ ],
965
+ required: true
966
+ }
967
+ ];
968
+ this._outputs = [
969
+ {
970
+ id: 1,
971
+ name: ''
972
+ }
973
+ ];
974
+ }
975
+ /**
976
+ * Generates a string representation of this node
977
+ *
978
+ * @returns 'RotateAboutAxis'
979
+ */ toString() {
980
+ return 'RotateAboutAxis';
981
+ }
982
+ /**
983
+ * Gets the serialization descriptor for this node type
984
+ *
985
+ * @returns Serialization class descriptor
986
+ */ static getSerializationCls() {
987
+ return {
988
+ ctor: RotateAboutAxisNode,
989
+ name: 'RotateAboutAxisNode',
990
+ getProps () {
991
+ return [];
992
+ }
993
+ };
994
+ }
995
+ /**
996
+ * Validates the node state
997
+ *
998
+ * @returns Empty string (always valid beyond base validation)
999
+ */ validate() {
1000
+ return super.validate();
1001
+ }
1002
+ /**
1003
+ * Gets the output type
1004
+ *
1005
+ * @returns 'vec3'
1006
+ */ getType() {
1007
+ return 'vec3';
1008
+ }
1009
+ }
900
1010
  /**
901
1011
  * Abstract base class for generic mathematical function nodes
902
1012
  *
@@ -2503,5 +2613,5 @@ import { defineProps } from '../../serialization/types.js';
2503
2613
  }
2504
2614
  }
2505
2615
 
2506
- export { AbsNode, AllConditionNode, AnyConditionNode, ArcCosNode, ArcSinNode, ArcTan2Node, ArcTanNode, ArccosineHNode, ArcsineHNode, ArctangentHNode, CeilNode, ClampNode, CompAddNode, CompComparisonNode, CompDivNode, CompMulNode, CompSubNode, CosHNode, CosNode, CrossProductNode, DDXNode, DDYNode, Degrees2RadiansNode, DistanceNode, DotProductNode, EqualNode, Exp2Node, ExpNode, FWidthNode, FaceForwardNode, FloorNode, FmaNode, FractNode, GenericMathNode, Hash1Node, Hash2Node, Hash3Node, InvSqrtNode, LengthNode, Log2Node, LogNode, LogicallyAndNode, LogicallyOrNode, MakeVectorNode, MaxNode, MinNode, MixNode, ModNode, NormalizeNode, NotEqualNode, PerlinNoise2DNode, PowNode, Radians2DegreesNode, ReflectNode, RefractNode, SaturateNode, SelectionNode, SignNode, SimplexNoise2DNode, SinHNode, SinNode, SmoothStepNode, SqrtNode, StepNode, SwizzleNode, TanHNode, TanNode, TransformNode };
2616
+ export { AbsNode, AllConditionNode, AnyConditionNode, ArcCosNode, ArcSinNode, ArcTan2Node, ArcTanNode, ArccosineHNode, ArcsineHNode, ArctangentHNode, CeilNode, ClampNode, CompAddNode, CompComparisonNode, CompDivNode, CompMulNode, CompSubNode, CosHNode, CosNode, CrossProductNode, DDXNode, DDYNode, Degrees2RadiansNode, DistanceNode, DotProductNode, EqualNode, Exp2Node, ExpNode, FWidthNode, FaceForwardNode, FloorNode, FmaNode, FractNode, GenericMathNode, Hash1Node, Hash2Node, Hash3Node, InvSqrtNode, LengthNode, Log2Node, LogNode, LogicallyAndNode, LogicallyOrNode, MakeVectorNode, MaxNode, MinNode, MixNode, ModNode, NormalizeNode, NotEqualNode, PerlinNoise2DNode, PowNode, Radians2DegreesNode, ReflectNode, RefractNode, RotateAboutAxisNode, SaturateNode, SelectionNode, SignNode, SimplexNoise2DNode, SinHNode, SinNode, SmoothStepNode, SqrtNode, StepNode, SwizzleNode, TanHNode, TanNode, TransformNode };
2507
2617
  //# sourceMappingURL=math.js.map