@zephyr3d/scene 0.9.0 → 0.9.2
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 +135 -133
- package/dist/animation/animationset.js.map +1 -1
- package/dist/animation/cloth/gpu_cloth_system.js +9 -1
- package/dist/animation/cloth/gpu_cloth_system.js.map +1 -1
- package/dist/animation/fixed_geometry_cache_track.js +5 -1
- package/dist/animation/fixed_geometry_cache_track.js.map +1 -1
- package/dist/animation/geometry_cache_utils.js +20 -4
- package/dist/animation/geometry_cache_utils.js.map +1 -1
- package/dist/animation/ik/ik_angle_constraint.js +2 -6
- package/dist/animation/ik/ik_angle_constraint.js.map +1 -1
- package/dist/animation/ik/two_bone_ik_solver.js +2 -6
- package/dist/animation/ik/two_bone_ik_solver.js.map +1 -1
- package/dist/animation/joint_dynamics/collision.js +60 -12
- package/dist/animation/joint_dynamics/collision.js.map +1 -1
- package/dist/animation/joint_dynamics/constraints.js +20 -4
- package/dist/animation/joint_dynamics/constraints.js.map +1 -1
- package/dist/animation/joint_dynamics/controller.js +151 -103
- package/dist/animation/joint_dynamics/controller.js.map +1 -1
- package/dist/animation/joint_dynamics/solver.js +21 -11
- package/dist/animation/joint_dynamics/solver.js.map +1 -1
- package/dist/animation/joint_dynamics/types.js +15 -3
- package/dist/animation/joint_dynamics/types.js.map +1 -1
- package/dist/animation/pca_geometry_cache_track.js +5 -1
- package/dist/animation/pca_geometry_cache_track.js.map +1 -1
- package/dist/animation/skeleton.js +2 -2
- package/dist/animation/skeleton.js.map +1 -1
- package/dist/animation/skeleton_modifier.js +2 -6
- package/dist/animation/skeleton_modifier.js.map +1 -1
- package/dist/animation/spring/spring_system.js +87 -114
- package/dist/animation/spring/spring_system.js.map +1 -1
- package/dist/app/app.js.map +1 -1
- package/dist/app/engine.js +1 -1
- package/dist/app/engine.js.map +1 -1
- package/dist/app/screen.js +4 -4
- package/dist/app/screen.js.map +1 -1
- package/dist/app/scriptingsystem.js +24 -1
- package/dist/app/scriptingsystem.js.map +1 -1
- package/dist/app/scriptregistry.js +165 -144
- package/dist/app/scriptregistry.js.map +1 -1
- package/dist/asset/assetmanager.js +2 -2
- package/dist/asset/assetmanager.js.map +1 -1
- package/dist/asset/model.js +3 -3
- package/dist/asset/model.js.map +1 -1
- package/dist/camera/camera.js +185 -185
- package/dist/camera/camera.js.map +1 -1
- package/dist/camera/orbit.js.map +1 -1
- package/dist/index.d.ts +794 -261
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/dist/material/material.js +290 -288
- package/dist/material/material.js.map +1 -1
- package/dist/material/mixins/lightmodel/pbrmetallicroughness.js +13 -26
- package/dist/material/mixins/lightmodel/pbrmetallicroughness.js.map +1 -1
- package/dist/material/pbrmr.js +1 -11
- package/dist/material/pbrmr.js.map +1 -1
- package/dist/material/sprite.js +6 -6
- package/dist/material/sprite.js.map +1 -1
- package/dist/material/terrain-cm.js +2 -2
- package/dist/material/terrain-cm.js.map +1 -1
- package/dist/posteffect/taa.js +31 -39
- package/dist/posteffect/taa.js.map +1 -1
- package/dist/render/drawable.js +5 -1
- package/dist/render/drawable.js.map +1 -1
- package/dist/render/rendergraph/device_pool_allocator.js +29 -3
- package/dist/render/rendergraph/device_pool_allocator.js.map +1 -1
- package/dist/render/rendergraph/executor.js +283 -33
- package/dist/render/rendergraph/executor.js.map +1 -1
- package/dist/render/rendergraph/forward_plus_builder.js +338 -108
- package/dist/render/rendergraph/forward_plus_builder.js.map +1 -1
- package/dist/render/rendergraph/history_resource_manager.js +236 -156
- package/dist/render/rendergraph/history_resource_manager.js.map +1 -1
- package/dist/render/rendergraph/history_resources.js +10 -0
- package/dist/render/rendergraph/history_resources.js.map +1 -0
- package/dist/render/rendergraph/rendergraph.js +162 -35
- package/dist/render/rendergraph/rendergraph.js.map +1 -1
- package/dist/render/rendergraph/types.js +36 -16
- package/dist/render/rendergraph/types.js.map +1 -1
- package/dist/render/rendertarget.js +5 -1
- package/dist/render/rendertarget.js.map +1 -1
- package/dist/render/screenrendertarget.js +5 -1
- package/dist/render/screenrendertarget.js.map +1 -1
- package/dist/render/sky.js +4 -4
- package/dist/render/sky.js.map +1 -1
- package/dist/scene/basesprite.js +2 -2
- package/dist/scene/basesprite.js.map +1 -1
- package/dist/scene/graph_node.js +1 -1
- package/dist/scene/graph_node.js.map +1 -1
- package/dist/scene/mesh.js +4 -20
- package/dist/scene/mesh.js.map +1 -1
- package/dist/scene/particlesys.js +1 -1
- package/dist/scene/particlesys.js.map +1 -1
- package/dist/scene/scene_node.js +2 -2
- package/dist/scene/scene_node.js.map +1 -1
- package/dist/scene/script_attachment.js +15 -3
- package/dist/scene/script_attachment.js.map +1 -1
- package/dist/scene/terrain-cm/terrain-cm.js +3 -3
- package/dist/scene/terrain-cm/terrain-cm.js.map +1 -1
- package/dist/shadow/shadowmapper.js.map +1 -1
- package/dist/shapes/box.js +1 -1
- package/dist/shapes/box.js.map +1 -1
- package/dist/shapes/capsule.js +0 -3
- package/dist/shapes/capsule.js.map +1 -1
- package/dist/shapes/cylinder.js +0 -3
- package/dist/shapes/cylinder.js.map +1 -1
- package/dist/shapes/plane.js +0 -3
- package/dist/shapes/plane.js.map +1 -1
- package/dist/shapes/tetrahedron.js +3 -9
- package/dist/shapes/tetrahedron.js.map +1 -1
- package/dist/shapes/torus.js +4 -7
- package/dist/shapes/torus.js.map +1 -1
- package/dist/utility/blueprint/material/inputs.js +3 -3
- package/dist/utility/blueprint/material/inputs.js.map +1 -1
- package/dist/utility/blueprint/material/ir.js +493 -493
- package/dist/utility/blueprint/material/ir.js.map +1 -1
- package/dist/utility/serialization/manager.js +34 -3
- package/dist/utility/serialization/manager.js.map +1 -1
- package/dist/utility/serialization/scene/animation.js +45 -0
- package/dist/utility/serialization/scene/animation.js.map +1 -1
- package/dist/utility/serialization/scene/camera.js +53 -0
- package/dist/utility/serialization/scene/camera.js.map +1 -1
- package/dist/utility/serialization/scene/common.js +10 -0
- package/dist/utility/serialization/scene/common.js.map +1 -1
- package/dist/utility/serialization/scene/light.js +30 -0
- package/dist/utility/serialization/scene/light.js.map +1 -1
- package/dist/utility/serialization/scene/material.js +63 -0
- package/dist/utility/serialization/scene/material.js.map +1 -1
- package/dist/utility/serialization/scene/mesh.js +11 -0
- package/dist/utility/serialization/scene/mesh.js.map +1 -1
- package/dist/utility/serialization/scene/misc.js +2 -0
- package/dist/utility/serialization/scene/misc.js.map +1 -1
- package/dist/utility/serialization/scene/node.js +19 -0
- package/dist/utility/serialization/scene/node.js.map +1 -1
- package/dist/utility/serialization/scene/particle.js +22 -0
- package/dist/utility/serialization/scene/particle.js.map +1 -1
- package/dist/utility/serialization/scene/primitive.js +33 -0
- package/dist/utility/serialization/scene/primitive.js.map +1 -1
- package/dist/utility/serialization/scene/scene.js +39 -0
- package/dist/utility/serialization/scene/scene.js.map +1 -1
- package/dist/utility/serialization/scene/script.js +2 -0
- package/dist/utility/serialization/scene/script.js.map +1 -1
- package/dist/utility/serialization/scene/sprite.js +6 -0
- package/dist/utility/serialization/scene/sprite.js.map +1 -1
- package/dist/utility/serialization/scene/terrain.js +9 -0
- package/dist/utility/serialization/scene/terrain.js.map +1 -1
- package/dist/utility/serialization/scene/water.js +21 -0
- package/dist/utility/serialization/scene/water.js.map +1 -1
- package/dist/utility/serialization/types.js +5 -1
- package/dist/utility/serialization/types.js.map +1 -1
- package/package.json +2 -2
|
@@ -1 +1 @@
|
|
|
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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"}
|
|
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 * 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); // top vertex\r\n uvs?.push(...uv1); // bottom-left\r\n uvs?.push(...uv2); // bottom-right\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 * 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,9 +41,6 @@ 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
44
|
* Analytically intersects a ray with a torus lying in the XZ plane.
|
|
48
45
|
* The torus has major radius R (outerRadius) and minor radius r (innerRadius).
|
|
49
46
|
*
|
|
@@ -55,10 +52,10 @@ Triangle(n, m) = (VIndex(n, m), VIndex(n+1, m), VIndex(n+1, m+1), VIndex(n, m),
|
|
|
55
52
|
const r = this._options.innerRadius ?? 0.3; // minor radius
|
|
56
53
|
const ox = ray.origin.x, oy = ray.origin.y, oz = ray.origin.z;
|
|
57
54
|
const dx = ray.direction.x, dy = ray.direction.y, dz = ray.direction.z;
|
|
58
|
-
// Let f = |O
|
|
59
|
-
// g = O
|
|
60
|
-
// h = |D
|
|
61
|
-
// Quartic: (h*t
|
|
55
|
+
// Let f = |O|^2 + R^2 - r^2
|
|
56
|
+
// g = dot(O, D)
|
|
57
|
+
// h = |D|^2 (normally 1 for a normalized direction, kept general here)
|
|
58
|
+
// Quartic: (h*t^2 + 2g*t + f)^2 = 4R^2*((dx*t+ox)^2 + (dz*t+oz)^2)
|
|
62
59
|
// Expand into c4*t^4 + c3*t^3 + c2*t^2 + c1*t + c0 = 0
|
|
63
60
|
const OO = ox * ox + oy * oy + oz * oz;
|
|
64
61
|
const OD = ox * dx + oy * dy + oz * dz;
|
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, 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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"}
|
|
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 * 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|^2 + R^2 - r^2\r\n // g = dot(O, D)\r\n // h = |D|^2 (normally 1 for a normalized direction, kept general here)\r\n // Quartic: (h*t^2 + 2g*t + f)^2 = 4R^2*((dx*t+ox)^2 + (dz*t+oz)^2)\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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"}
|
|
@@ -375,7 +375,7 @@ import { BaseGraphNode } from '../node.js';
|
|
|
375
375
|
* Gets the output type for a specific output slot
|
|
376
376
|
*
|
|
377
377
|
* @param id - The output slot ID
|
|
378
|
-
* @returns 'float' for individual component outputs (id
|
|
378
|
+
* @returns 'float' for individual component outputs (id \> 1), 'vec3' for full position
|
|
379
379
|
*/ getType(id) {
|
|
380
380
|
return id > 1 ? 'float' : 'vec3';
|
|
381
381
|
}
|
|
@@ -559,7 +559,7 @@ import { BaseGraphNode } from '../node.js';
|
|
|
559
559
|
* Gets the output type for a specific output slot
|
|
560
560
|
*
|
|
561
561
|
* @param id - The output slot ID
|
|
562
|
-
* @returns 'float' for individual component outputs (id
|
|
562
|
+
* @returns 'float' for individual component outputs (id \> 1), 'vec3' for full normal
|
|
563
563
|
*/ getType(id) {
|
|
564
564
|
return id > 1 ? 'float' : 'vec3';
|
|
565
565
|
}
|
|
@@ -1522,7 +1522,7 @@ import { BaseGraphNode } from '../node.js';
|
|
|
1522
1522
|
* Gets the output type for a specific output slot
|
|
1523
1523
|
*
|
|
1524
1524
|
* @param id - The output slot ID
|
|
1525
|
-
* @returns 'float' for individual component outputs (id
|
|
1525
|
+
* @returns 'float' for individual component outputs (id \> 1), 'vec3' for full vector
|
|
1526
1526
|
*/ getType(id) {
|
|
1527
1527
|
return id > 1 ? 'float' : 'vec3';
|
|
1528
1528
|
}
|