@zephyr3d/scene 0.8.1 → 0.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/animation/animationset.js +563 -128
- package/dist/animation/animationset.js.map +1 -1
- package/dist/animation/cloth/gpu_cloth_system.js +2516 -0
- package/dist/animation/cloth/gpu_cloth_system.js.map +1 -0
- package/dist/animation/fixed_geometry_cache_track.js +138 -0
- package/dist/animation/fixed_geometry_cache_track.js.map +1 -0
- package/dist/animation/geometry_cache_utils.js +120 -0
- package/dist/animation/geometry_cache_utils.js.map +1 -0
- package/dist/animation/ik_modifier.js +9 -1
- package/dist/animation/ik_modifier.js.map +1 -1
- package/dist/animation/joint_dynamics/collision.js +469 -0
- package/dist/animation/joint_dynamics/collision.js.map +1 -0
- package/dist/animation/joint_dynamics/constraints.js +329 -0
- package/dist/animation/joint_dynamics/constraints.js.map +1 -0
- package/dist/animation/joint_dynamics/controller.js +699 -0
- package/dist/animation/joint_dynamics/controller.js.map +1 -0
- package/dist/animation/joint_dynamics/joint_dynamics_system.js +393 -0
- package/dist/animation/joint_dynamics/joint_dynamics_system.js.map +1 -0
- package/dist/animation/joint_dynamics/solver.js +794 -0
- package/dist/animation/joint_dynamics/solver.js.map +1 -0
- package/dist/animation/joint_dynamics/types.js +19 -0
- package/dist/animation/joint_dynamics/types.js.map +1 -0
- package/dist/animation/joint_dynamics/vrm_spring_bone.js +46 -0
- package/dist/animation/joint_dynamics/vrm_spring_bone.js.map +1 -0
- package/dist/animation/joint_dynamics_modifier.js +51 -0
- package/dist/animation/joint_dynamics_modifier.js.map +1 -0
- package/dist/animation/pca_geometry_cache_track.js +222 -0
- package/dist/animation/pca_geometry_cache_track.js.map +1 -0
- package/dist/animation/skeleton.js +1907 -3
- package/dist/animation/skeleton.js.map +1 -1
- package/dist/animation/skeleton_modifier.js +3 -5
- package/dist/animation/skeleton_modifier.js.map +1 -1
- package/dist/animation/spring/multi_chain_spring_system.js +2 -0
- package/dist/animation/spring/multi_chain_spring_system.js.map +1 -1
- package/dist/animation/spring/spring_chain.js +3 -2
- package/dist/animation/spring/spring_chain.js.map +1 -1
- package/dist/animation/spring/spring_collider.js +35 -5
- package/dist/animation/spring/spring_collider.js.map +1 -1
- package/dist/animation/spring/spring_particle.js +1 -0
- package/dist/animation/spring/spring_particle.js.map +1 -1
- package/dist/animation/spring/spring_system.js +325 -28
- package/dist/animation/spring/spring_system.js.map +1 -1
- package/dist/animation/spring2/collision.js +469 -0
- package/dist/animation/spring2/collision.js.map +1 -0
- package/dist/animation/spring2/constraints.js +329 -0
- package/dist/animation/spring2/constraints.js.map +1 -0
- package/dist/animation/spring2/controller.js +434 -0
- package/dist/animation/spring2/controller.js.map +1 -0
- package/dist/animation/spring2/math.js +16 -0
- package/dist/animation/spring2/math.js.map +1 -0
- package/dist/animation/spring2/solver.js +624 -0
- package/dist/animation/spring2/solver.js.map +1 -0
- package/dist/animation/spring2/spring_system.js +118 -0
- package/dist/animation/spring2/spring_system.js.map +1 -0
- package/dist/animation/spring2/types.js +19 -0
- package/dist/animation/spring2/types.js.map +1 -0
- package/dist/animation/spring_modifier.js +17 -1
- package/dist/animation/spring_modifier.js.map +1 -1
- package/dist/app/engine.js +42 -15
- package/dist/app/engine.js.map +1 -1
- package/dist/app/runtimescript.js +132 -1
- package/dist/app/runtimescript.js.map +1 -1
- package/dist/app/screen.js +3 -3
- package/dist/app/screen.js.map +1 -1
- package/dist/app/scriptingsystem.js +69 -37
- package/dist/app/scriptingsystem.js.map +1 -1
- package/dist/app/scriptregistry.js +157 -146
- package/dist/app/scriptregistry.js.map +1 -1
- package/dist/asset/assetmanager.js +2 -1
- package/dist/asset/assetmanager.js.map +1 -1
- package/dist/asset/loaders/zabc/zabc_loader.js +570 -0
- package/dist/asset/loaders/zabc/zabc_loader.js.map +1 -0
- package/dist/asset/model.js +192 -0
- package/dist/asset/model.js.map +1 -1
- package/dist/camera/base.js +26 -7
- package/dist/camera/base.js.map +1 -1
- package/dist/camera/camera.js +146 -24
- package/dist/camera/camera.js.map +1 -1
- package/dist/camera/fps.js +2 -2
- package/dist/camera/fps.js.map +1 -1
- package/dist/camera/orbit.js +2 -2
- package/dist/camera/orbit.js.map +1 -1
- package/dist/index.d.ts +11701 -8506
- package/dist/index.js +29 -8
- package/dist/index.js.map +1 -1
- package/dist/material/lambert.js +1 -1
- package/dist/material/lambert.js.map +1 -1
- package/dist/material/material.js +9 -3
- package/dist/material/material.js.map +1 -1
- package/dist/material/meshmaterial.js +54 -7
- package/dist/material/meshmaterial.js.map +1 -1
- package/dist/material/mixins/lightmodel/blinnphong.js +17 -7
- package/dist/material/mixins/lightmodel/blinnphong.js.map +1 -1
- package/dist/material/mixins/lightmodel/lambert.js +7 -2
- package/dist/material/mixins/lightmodel/lambert.js.map +1 -1
- package/dist/material/mixins/lightmodel/pbrblueprintmixin.js +108 -16
- package/dist/material/mixins/lightmodel/pbrblueprintmixin.js.map +1 -1
- package/dist/material/mixins/lightmodel/pbrmetallicroughness.js +222 -14
- package/dist/material/mixins/lightmodel/pbrmetallicroughness.js.map +1 -1
- package/dist/material/mixins/lightmodel/pbrspecularglossness.js +24 -12
- package/dist/material/mixins/lightmodel/pbrspecularglossness.js.map +1 -1
- package/dist/material/mixins/lit.js +11 -8
- package/dist/material/mixins/lit.js.map +1 -1
- package/dist/material/mixins/pbr/common.js +72 -5
- package/dist/material/mixins/pbr/common.js.map +1 -1
- package/dist/material/pbrblueprint.js +148 -1
- package/dist/material/pbrblueprint.js.map +1 -1
- package/dist/material/pbrmr.js +125 -2
- package/dist/material/pbrmr.js.map +1 -1
- package/dist/material/shader/helper.js +10 -4
- package/dist/material/shader/helper.js.map +1 -1
- package/dist/material/water.js +2 -2
- package/dist/material/water.js.map +1 -1
- package/dist/posteffect/coloradjust.js +145 -0
- package/dist/posteffect/coloradjust.js.map +1 -0
- package/dist/posteffect/taa.js +68 -32
- package/dist/posteffect/taa.js.map +1 -1
- package/dist/render/cluster_light.js +17 -12
- package/dist/render/cluster_light.js.map +1 -1
- package/dist/render/deferredlightpass.js +510 -0
- package/dist/render/deferredlightpass.js.map +1 -0
- package/dist/render/deferredshadowlightpass.js +428 -0
- package/dist/render/deferredshadowlightpass.js.map +1 -0
- package/dist/render/drawable.js.map +1 -1
- package/dist/render/drawable_mixin.js +21 -12
- package/dist/render/drawable_mixin.js.map +1 -1
- package/dist/render/envlight.js +20 -22
- package/dist/render/envlight.js.map +1 -1
- package/dist/render/gbufferpass.js +50 -0
- package/dist/render/gbufferpass.js.map +1 -0
- package/dist/render/lightpass.js +1 -2
- package/dist/render/lightpass.js.map +1 -1
- package/dist/render/primitive.js +1 -1
- package/dist/render/primitive.js.map +1 -1
- package/dist/render/render_queue.js +3 -2
- package/dist/render/render_queue.js.map +1 -1
- package/dist/render/renderer.js +5 -358
- package/dist/render/renderer.js.map +1 -1
- package/dist/render/rendergraph/executor.js +15 -12
- package/dist/render/rendergraph/executor.js.map +1 -1
- package/dist/render/rendergraph/forward_plus_builder.js +144 -88
- package/dist/render/rendergraph/forward_plus_builder.js.map +1 -1
- package/dist/render/rendergraph/history_resource_manager.js +178 -0
- package/dist/render/rendergraph/history_resource_manager.js.map +1 -0
- package/dist/render/rendergraph/rendergraph.js +12 -1
- package/dist/render/rendergraph/rendergraph.js.map +1 -1
- package/dist/render/rendergraph/types.js +2 -2
- package/dist/render/rendergraph/types.js.map +1 -1
- package/dist/render/sky.js +26 -9
- package/dist/render/sky.js.map +1 -1
- package/dist/scene/basesprite.js +4 -3
- package/dist/scene/basesprite.js.map +1 -1
- package/dist/scene/batchgroup.js +4 -4
- package/dist/scene/environment.js +7 -4
- package/dist/scene/environment.js.map +1 -1
- package/dist/scene/light.js +184 -18
- package/dist/scene/light.js.map +1 -1
- package/dist/scene/mesh.js +30 -0
- package/dist/scene/mesh.js.map +1 -1
- package/dist/scene/particlesys.js +3 -2
- package/dist/scene/particlesys.js.map +1 -1
- package/dist/scene/raycast_visitor.js +29 -3
- package/dist/scene/raycast_visitor.js.map +1 -1
- package/dist/scene/scene.js +86 -19
- package/dist/scene/scene.js.map +1 -1
- package/dist/scene/scene_node.js +87 -31
- package/dist/scene/scene_node.js.map +1 -1
- package/dist/scene/script_attachment.js +59 -0
- package/dist/scene/script_attachment.js.map +1 -0
- package/dist/scene/terrain-cm/grass.js +3 -2
- package/dist/scene/terrain-cm/grass.js.map +1 -1
- package/dist/scene/terrain-cm/terrain-cm.js +4 -3
- package/dist/scene/terrain-cm/terrain-cm.js.map +1 -1
- package/dist/scene/water.js +3 -2
- package/dist/scene/water.js.map +1 -1
- package/dist/shaders/shadow.js +2 -2
- package/dist/shaders/shadow.js.map +1 -1
- package/dist/shadow/shadowmapper.js +74 -4
- package/dist/shadow/shadowmapper.js.map +1 -1
- package/dist/shapes/box.js +163 -0
- package/dist/shapes/box.js.map +1 -1
- package/dist/shapes/capsule.js +216 -0
- package/dist/shapes/capsule.js.map +1 -0
- package/dist/shapes/cylinder.js +91 -0
- package/dist/shapes/cylinder.js.map +1 -1
- package/dist/shapes/plane.js +32 -0
- package/dist/shapes/plane.js.map +1 -1
- package/dist/shapes/tetrahedron.js +211 -0
- package/dist/shapes/tetrahedron.js.map +1 -1
- package/dist/shapes/torus.js +173 -0
- package/dist/shapes/torus.js.map +1 -1
- package/dist/utility/blueprint/common/math.js +111 -1
- package/dist/utility/blueprint/common/math.js.map +1 -1
- package/dist/utility/blueprint/material/inputs.js +235 -1
- package/dist/utility/blueprint/material/inputs.js.map +1 -1
- package/dist/utility/blueprint/material/ir.js +154 -10
- package/dist/utility/blueprint/material/ir.js.map +1 -1
- package/dist/utility/blueprint/material/texture.js +273 -19
- package/dist/utility/blueprint/material/texture.js.map +1 -1
- package/dist/utility/serialization/json.js +12 -2
- package/dist/utility/serialization/json.js.map +1 -1
- package/dist/utility/serialization/manager.js +30 -11
- package/dist/utility/serialization/manager.js.map +1 -1
- package/dist/utility/serialization/scene/animation.js +250 -7
- package/dist/utility/serialization/scene/animation.js.map +1 -1
- package/dist/utility/serialization/scene/batch.js +4 -2
- package/dist/utility/serialization/scene/batch.js.map +1 -1
- package/dist/utility/serialization/scene/camera.js +154 -2
- package/dist/utility/serialization/scene/camera.js.map +1 -1
- package/dist/utility/serialization/scene/cloth_script.js +834 -0
- package/dist/utility/serialization/scene/cloth_script.js.map +1 -0
- package/dist/utility/serialization/scene/common.js +7 -0
- package/dist/utility/serialization/scene/common.js.map +1 -1
- package/dist/utility/serialization/scene/light.js +120 -4
- package/dist/utility/serialization/scene/light.js.map +1 -1
- package/dist/utility/serialization/scene/material.js +453 -1
- package/dist/utility/serialization/scene/material.js.map +1 -1
- package/dist/utility/serialization/scene/mesh.js +4 -2
- package/dist/utility/serialization/scene/mesh.js.map +1 -1
- package/dist/utility/serialization/scene/node.js +298 -10
- package/dist/utility/serialization/scene/node.js.map +1 -1
- package/dist/utility/serialization/scene/particle.js +4 -2
- package/dist/utility/serialization/scene/particle.js.map +1 -1
- package/dist/utility/serialization/scene/primitive.js +100 -3
- package/dist/utility/serialization/scene/primitive.js.map +1 -1
- package/dist/utility/serialization/scene/scene.js +130 -3
- package/dist/utility/serialization/scene/scene.js.map +1 -1
- package/dist/utility/serialization/scene/script.js +66 -0
- package/dist/utility/serialization/scene/script.js.map +1 -0
- package/dist/utility/serialization/scene/spring_script.js +596 -0
- package/dist/utility/serialization/scene/spring_script.js.map +1 -0
- package/dist/utility/serialization/scene/sprite.js +5 -3
- package/dist/utility/serialization/scene/sprite.js.map +1 -1
- package/dist/utility/serialization/scene/terrain.js +4 -2
- package/dist/utility/serialization/scene/terrain.js.map +1 -1
- package/dist/utility/serialization/scene/water.js +4 -2
- package/dist/utility/serialization/scene/water.js.map +1 -1
- package/dist/utility/serialization/types.js.map +1 -1
- package/dist/values.js +5 -1
- package/dist/values.js.map +1 -1
- 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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"}
|
package/dist/shapes/torus.js
CHANGED
|
@@ -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
|
package/dist/shapes/torus.js.map
CHANGED
|
@@ -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":"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"}
|
|
@@ -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
|