@zephyr3d/scene 0.7.0 → 0.7.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/animation/animation.js +4 -15
- package/dist/animation/animation.js.map +1 -1
- package/dist/animation/animationset.js +22 -9
- package/dist/animation/animationset.js.map +1 -1
- package/dist/animation/animationtrack.js +1 -0
- package/dist/animation/animationtrack.js.map +1 -1
- package/dist/animation/eulerrotationtrack.js +0 -1
- package/dist/animation/eulerrotationtrack.js.map +1 -1
- package/dist/animation/morphtarget.js +7 -1
- package/dist/animation/morphtarget.js.map +1 -1
- package/dist/animation/morphtrack.js +3 -3
- package/dist/animation/morphtrack.js.map +1 -1
- package/dist/animation/proptrack.js +37 -41
- package/dist/animation/proptrack.js.map +1 -1
- package/dist/animation/rotationtrack.js +0 -1
- package/dist/animation/rotationtrack.js.map +1 -1
- package/dist/animation/scaletrack.js +0 -1
- package/dist/animation/scaletrack.js.map +1 -1
- package/dist/animation/skeleton.js +7 -14
- package/dist/animation/skeleton.js.map +1 -1
- package/dist/animation/translationtrack.js +0 -1
- package/dist/animation/translationtrack.js.map +1 -1
- package/dist/app/api.js +13 -4
- package/dist/app/api.js.map +1 -1
- package/dist/app/app.js +13 -1
- package/dist/app/app.js.map +1 -1
- package/dist/app/engine.js +33 -45
- package/dist/app/engine.js.map +1 -1
- package/dist/app/inputmgr.js.map +1 -1
- package/dist/app/runtimescript.js.map +1 -1
- package/dist/app/screen.js +318 -0
- package/dist/app/screen.js.map +1 -0
- package/dist/app/scriptingsystem.js +10 -6
- package/dist/app/scriptingsystem.js.map +1 -1
- package/dist/app/scriptregistry.js +11 -22
- package/dist/app/scriptregistry.js.map +1 -1
- package/dist/asset/assetmanager.js +79 -58
- package/dist/asset/assetmanager.js.map +1 -1
- package/dist/asset/builtin.js +5 -5
- package/dist/asset/builtin.js.map +1 -1
- package/dist/asset/loaders/dds/dds.js +6 -2
- package/dist/asset/loaders/dds/dds.js.map +1 -1
- package/dist/asset/loaders/dds/dds_loader.js +1 -1
- package/dist/asset/loaders/dds/dds_loader.js.map +1 -1
- package/dist/asset/loaders/gltf/gltf_loader.js +14 -6
- package/dist/asset/loaders/gltf/gltf_loader.js.map +1 -1
- package/dist/asset/loaders/gltf/helpers.js +6 -2
- package/dist/asset/loaders/gltf/helpers.js.map +1 -1
- package/dist/asset/loaders/hdr/hdr.js +22 -15
- package/dist/asset/loaders/hdr/hdr.js.map +1 -1
- package/dist/asset/loaders/image/tga_Loader.js +2 -1
- package/dist/asset/loaders/image/tga_Loader.js.map +1 -1
- package/dist/asset/loaders/image/webimage_loader.js.map +1 -1
- package/dist/asset/loaders/loader.js +2 -2
- package/dist/asset/loaders/loader.js.map +1 -1
- package/dist/asset/model.js +2 -2
- package/dist/asset/model.js.map +1 -1
- package/dist/blitter/bilateralblur.js.map +1 -1
- package/dist/blitter/blitter.js +9 -11
- package/dist/blitter/blitter.js.map +1 -1
- package/dist/blitter/box.js +0 -1
- package/dist/blitter/box.js.map +1 -1
- package/dist/blitter/copy.js.map +1 -1
- package/dist/blitter/gaussianblur.js.map +1 -1
- package/dist/camera/base.js +1 -3
- package/dist/camera/base.js.map +1 -1
- package/dist/camera/camera.js +121 -37
- package/dist/camera/camera.js.map +1 -1
- package/dist/camera/fps.js +19 -17
- package/dist/camera/fps.js.map +1 -1
- package/dist/camera/orbit.js +45 -43
- package/dist/camera/orbit.js.map +1 -1
- package/dist/camera/orthocamera.js +27 -21
- package/dist/camera/orthocamera.js.map +1 -1
- package/dist/camera/perspectivecamera.js +26 -17
- package/dist/camera/perspectivecamera.js.map +1 -1
- package/dist/index.d.ts +14453 -15609
- package/dist/index.js +17 -11
- package/dist/index.js.map +1 -1
- package/dist/material/blinn.js.map +1 -1
- package/dist/material/grassmaterial.js.map +1 -1
- package/dist/material/lambert.js.map +1 -1
- package/dist/material/material.js +11 -5
- package/dist/material/material.js.map +1 -1
- package/dist/material/meshmaterial.js +10 -9
- package/dist/material/meshmaterial.js.map +1 -1
- package/dist/material/mixins/albedocolor.js.map +1 -1
- package/dist/material/mixins/foliage.js.map +1 -1
- package/dist/material/mixins/lightmodel/blinnphong.js.map +1 -1
- package/dist/material/mixins/lightmodel/lambert.js.map +1 -1
- package/dist/material/mixins/lightmodel/pbrblueprintmixin.js +7 -0
- package/dist/material/mixins/lightmodel/pbrblueprintmixin.js.map +1 -1
- package/dist/material/mixins/lightmodel/pbrmetallicroughness.js.map +1 -1
- package/dist/material/mixins/lightmodel/pbrspecularglossness.js.map +1 -1
- package/dist/material/mixins/lit.js +3 -3
- package/dist/material/mixins/lit.js.map +1 -1
- package/dist/material/mixins/pbr/brdf.js.map +1 -1
- package/dist/material/mixins/pbr/common.js.map +1 -1
- package/dist/material/mixins/texture.js +3 -0
- package/dist/material/mixins/texture.js.map +1 -1
- package/dist/material/mixins/vertexcolor.js.map +1 -1
- package/dist/material/particle.js.map +1 -1
- package/dist/material/pbrblueprint.js +180 -22
- package/dist/material/pbrblueprint.js.map +1 -1
- package/dist/material/pbrmr.js.map +1 -1
- package/dist/material/pbrsg.js.map +1 -1
- package/dist/material/shader/helper.js +36 -53
- package/dist/material/shader/helper.js.map +1 -1
- package/dist/material/sprite.js +301 -0
- package/dist/material/sprite.js.map +1 -0
- package/dist/material/sprite3d.js +301 -0
- package/dist/material/sprite3d.js.map +1 -0
- package/dist/material/sprite3d_std.js +116 -0
- package/dist/material/sprite3d_std.js.map +1 -0
- package/dist/material/sprite3dblueprint.js +235 -0
- package/dist/material/sprite3dblueprint.js.map +1 -0
- package/dist/material/sprite_std.js +116 -0
- package/dist/material/sprite_std.js.map +1 -0
- package/dist/material/spriteblueprint.js +235 -0
- package/dist/material/spriteblueprint.js.map +1 -0
- package/dist/material/terrain-cm.js +0 -1
- package/dist/material/terrain-cm.js.map +1 -1
- package/dist/material/unlit.js.map +1 -1
- package/dist/material/water.js.map +1 -1
- package/dist/posteffect/bloom.js.map +1 -1
- package/dist/posteffect/compositor.js.map +1 -1
- package/dist/posteffect/fxaa.js.map +1 -1
- package/dist/posteffect/grayscale.js.map +1 -1
- package/dist/posteffect/motionblur.js.map +1 -1
- package/dist/posteffect/posteffect.js.map +1 -1
- package/dist/posteffect/sao.js.map +1 -1
- package/dist/posteffect/ssr.js +7 -5
- package/dist/posteffect/ssr.js.map +1 -1
- package/dist/posteffect/taa.js.map +1 -1
- package/dist/posteffect/tonemap.js.map +1 -1
- package/dist/render/abuffer_oit.js +8 -6
- package/dist/render/abuffer_oit.js.map +1 -1
- package/dist/render/clipmap.js +0 -10
- package/dist/render/clipmap.js.map +1 -1
- package/dist/render/cluster_light.js +4 -4
- package/dist/render/cluster_light.js.map +1 -1
- package/dist/render/cull_visitor.js +15 -17
- package/dist/render/cull_visitor.js.map +1 -1
- package/dist/render/depthpass.js +3 -4
- package/dist/render/depthpass.js.map +1 -1
- package/dist/render/drawable.js +15 -0
- package/dist/render/drawable.js.map +1 -0
- package/dist/render/drawable_mixin.js +8 -4
- package/dist/render/drawable_mixin.js.map +1 -1
- package/dist/render/envlight.js.map +1 -1
- package/dist/render/fbm_wavegenerator.js +3 -1
- package/dist/render/fbm_wavegenerator.js.map +1 -1
- package/dist/render/fft_wavegenerator.js +67 -64
- package/dist/render/fft_wavegenerator.js.map +1 -1
- package/dist/render/fullscreenquad.js.map +1 -1
- package/dist/render/gerstner_wavegenerator.js +3 -1
- package/dist/render/gerstner_wavegenerator.js.map +1 -1
- package/dist/render/globalbindgroup_allocator.js +3 -1
- package/dist/render/globalbindgroup_allocator.js.map +1 -1
- package/dist/render/hzb.js +1 -2
- package/dist/render/hzb.js.map +1 -1
- package/dist/render/lightpass.js +13 -13
- package/dist/render/lightpass.js.map +1 -1
- package/dist/render/objectcolorpass.js +4 -7
- package/dist/render/objectcolorpass.js.map +1 -1
- package/dist/render/primitive.js +4 -5
- package/dist/render/primitive.js.map +1 -1
- package/dist/render/render_queue.js +10 -5
- package/dist/render/render_queue.js.map +1 -1
- package/dist/render/renderer.js +16 -22
- package/dist/render/renderer.js.map +1 -1
- package/dist/render/renderpass.js +27 -52
- package/dist/render/renderpass.js.map +1 -1
- package/dist/render/rendertarget.js +5 -0
- package/dist/render/rendertarget.js.map +1 -0
- package/dist/render/screenrendertarget.js +56 -0
- package/dist/render/screenrendertarget.js.map +1 -0
- package/dist/render/shadowmap_pass.js +4 -5
- package/dist/render/shadowmap_pass.js.map +1 -1
- package/dist/render/sky.js +16 -14
- package/dist/render/sky.js.map +1 -1
- package/dist/render/weightedblended_oit.js.map +1 -1
- package/dist/scene/basesprite.js +296 -0
- package/dist/scene/basesprite.js.map +1 -0
- package/dist/scene/batchgroup.js +4 -2
- package/dist/scene/batchgroup.js.map +1 -1
- package/dist/scene/environment.js +9 -10
- package/dist/scene/environment.js.map +1 -1
- package/dist/scene/graph_node.js.map +1 -1
- package/dist/scene/light.js +22 -4
- package/dist/scene/light.js.map +1 -1
- package/dist/scene/mesh.js +93 -15
- package/dist/scene/mesh.js.map +1 -1
- package/dist/scene/octree.js.map +1 -1
- package/dist/scene/particlesys.js +25 -22
- package/dist/scene/particlesys.js.map +1 -1
- package/dist/scene/raycast_visitor.js +0 -16
- package/dist/scene/raycast_visitor.js.map +1 -1
- package/dist/scene/scene.js +7 -4
- package/dist/scene/scene.js.map +1 -1
- package/dist/scene/scene_node.js +20 -35
- package/dist/scene/scene_node.js.map +1 -1
- package/dist/scene/sprite.js +18 -0
- package/dist/scene/sprite.js.map +1 -0
- package/dist/scene/sprite3d.js +18 -0
- package/dist/scene/sprite3d.js.map +1 -0
- package/dist/scene/terrain-cm/grass.js +5 -4
- package/dist/scene/terrain-cm/grass.js.map +1 -1
- package/dist/scene/terrain-cm/grassmaterial.js +3 -1
- package/dist/scene/terrain-cm/grassmaterial.js.map +1 -1
- package/dist/scene/terrain-cm/terrain-cm.js +65 -48
- package/dist/scene/terrain-cm/terrain-cm.js.map +1 -1
- package/dist/scene/water.js +35 -30
- package/dist/scene/water.js.map +1 -1
- package/dist/shaders/atmosphere.js +17 -29
- package/dist/shaders/atmosphere.js.map +1 -1
- package/dist/shaders/fog.js.map +1 -1
- package/dist/shaders/misc.js.map +1 -1
- package/dist/shaders/noise.js.map +1 -1
- package/dist/shaders/pbr.js.map +1 -1
- package/dist/shaders/shadow.js.map +1 -1
- package/dist/shaders/ssr.js.map +1 -1
- package/dist/shaders/temporal.js.map +1 -1
- package/dist/shaders/water.js.map +1 -1
- package/dist/shadow/esm.js +1 -1
- package/dist/shadow/esm.js.map +1 -1
- package/dist/shadow/pcf_opt.js.map +1 -1
- package/dist/shadow/pcf_pd.js.map +1 -1
- package/dist/shadow/shader.js +3 -1
- package/dist/shadow/shader.js.map +1 -1
- package/dist/shadow/shadow_impl.js.map +1 -1
- package/dist/shadow/shadowmapper.js +6 -18
- package/dist/shadow/shadowmapper.js.map +1 -1
- package/dist/shadow/ssm.js.map +1 -1
- package/dist/shadow/vsm.js.map +1 -1
- package/dist/shapes/box.js +9 -3
- package/dist/shapes/box.js.map +1 -1
- package/dist/shapes/cylinder.js +2 -2
- package/dist/shapes/cylinder.js.map +1 -1
- package/dist/shapes/plane.js +2 -2
- package/dist/shapes/plane.js.map +1 -1
- package/dist/shapes/shape.js +2 -1
- package/dist/shapes/shape.js.map +1 -1
- package/dist/shapes/sphere.js +2 -2
- package/dist/shapes/sphere.js.map +1 -1
- package/dist/shapes/tetrahedron.js +5 -6
- package/dist/shapes/tetrahedron.js.map +1 -1
- package/dist/shapes/torus.js +2 -2
- package/dist/shapes/torus.js.map +1 -1
- package/dist/utility/aabbtree.js +1 -1
- package/dist/utility/aabbtree.js.map +1 -1
- package/dist/utility/blueprint/common/constants.js +578 -104
- package/dist/utility/blueprint/common/constants.js.map +1 -1
- package/dist/utility/blueprint/common/math.js +471 -9
- package/dist/utility/blueprint/common/math.js.map +1 -1
- package/dist/utility/blueprint/common.js +1 -1
- package/dist/utility/blueprint/common.js.map +1 -1
- package/dist/utility/blueprint/material/func.js +9 -5
- package/dist/utility/blueprint/material/func.js.map +1 -1
- package/dist/utility/blueprint/material/inputs.js.map +1 -1
- package/dist/utility/blueprint/material/ir.js +288 -80
- package/dist/utility/blueprint/material/ir.js.map +1 -1
- package/dist/utility/blueprint/material/pbr.js +92 -4
- package/dist/utility/blueprint/material/pbr.js.map +1 -1
- package/dist/utility/blueprint/material/texture.js +62 -45
- package/dist/utility/blueprint/material/texture.js.map +1 -1
- package/dist/utility/blueprint/node.js +28 -1
- package/dist/utility/blueprint/node.js.map +1 -1
- package/dist/utility/bounding_volume.js.map +1 -1
- package/dist/utility/debug.js.map +1 -1
- package/dist/utility/draco/decoder.js.map +1 -1
- package/dist/utility/misc.js +1 -1
- package/dist/utility/misc.js.map +1 -1
- package/dist/utility/panorama.js.map +1 -1
- package/dist/utility/pmrem.js.map +1 -1
- package/dist/utility/rendermipmap.js.map +1 -1
- package/dist/utility/serialization/json.js +19 -15
- package/dist/utility/serialization/json.js.map +1 -1
- package/dist/utility/serialization/manager.js +89 -22
- package/dist/utility/serialization/manager.js.map +1 -1
- package/dist/utility/serialization/scene/animation.js +23 -21
- package/dist/utility/serialization/scene/animation.js.map +1 -1
- package/dist/utility/serialization/scene/batch.js +4 -3
- package/dist/utility/serialization/scene/batch.js.map +1 -1
- package/dist/utility/serialization/scene/camera.js +97 -9
- package/dist/utility/serialization/scene/camera.js.map +1 -1
- package/dist/utility/serialization/scene/common.js +102 -28
- package/dist/utility/serialization/scene/common.js.map +1 -1
- package/dist/utility/serialization/scene/light.js +14 -12
- package/dist/utility/serialization/scene/light.js.map +1 -1
- package/dist/utility/serialization/scene/material.js +154 -26
- package/dist/utility/serialization/scene/material.js.map +1 -1
- package/dist/utility/serialization/scene/mesh.js +71 -100
- package/dist/utility/serialization/scene/mesh.js.map +1 -1
- package/dist/utility/serialization/scene/misc.js +3 -2
- package/dist/utility/serialization/scene/misc.js.map +1 -1
- package/dist/utility/serialization/scene/node.js +42 -9
- package/dist/utility/serialization/scene/node.js.map +1 -1
- package/dist/utility/serialization/scene/particle.js +7 -5
- package/dist/utility/serialization/scene/particle.js.map +1 -1
- package/dist/utility/serialization/scene/primitive.js +18 -15
- package/dist/utility/serialization/scene/primitive.js.map +1 -1
- package/dist/utility/serialization/scene/scene.js +3 -2
- package/dist/utility/serialization/scene/scene.js.map +1 -1
- package/dist/utility/serialization/scene/sprite.js +164 -0
- package/dist/utility/serialization/scene/sprite.js.map +1 -0
- package/dist/utility/serialization/scene/terrain.js +8 -6
- package/dist/utility/serialization/scene/terrain.js.map +1 -1
- package/dist/utility/serialization/scene/water.js +11 -9
- package/dist/utility/serialization/scene/water.js.map +1 -1
- package/dist/utility/serialization/types.js +6 -0
- package/dist/utility/serialization/types.js.map +1 -0
- package/dist/utility/shprojector.js.map +1 -1
- package/dist/utility/textures/ggxlut.js.map +1 -1
- package/dist/utility/textures/gradientnoise.js.map +1 -1
- package/dist/utility/textures/randomnoise.js.map +1 -1
- package/dist/values.js +14 -14
- package/dist/values.js.map +1 -1
- package/package.json +80 -80
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sphere.js","sources":["../../src/shapes/sphere.ts"],"sourcesContent":["import type { Clonable, Ray } from '@zephyr3d/base';\r\nimport type { AABB } from '@zephyr3d/base';\r\nimport { Vector3 } from '@zephyr3d/base';\r\nimport type { ShapeCreationOptions } from './shape';\r\nimport { Shape } from './shape';\r\nimport type { PrimitiveType } from '@zephyr3d/device';\r\n\r\n/**\r\n * Creation options for sphere shape\r\n * @public\r\n */\r\nexport interface SphereCreationOptions extends ShapeCreationOptions {\r\n /** Radius of the sphere, default 1 */\r\n radius?: number;\r\n /** The vertical detail level, default 20 */\r\n verticalDetail?: number;\r\n /** The horizonal detail level, default 20 */\r\n horizonalDetail?: number;\r\n}\r\n\r\n/**\r\n * Sphere shape\r\n * @public\r\n */\r\nexport class SphereShape extends Shape<SphereCreationOptions> implements Clonable<SphereShape> {\r\n static _defaultOptions = {\r\n ...Shape._defaultOptions,\r\n radius: 1,\r\n verticalDetail: 20,\r\n horizonalDetail: 20\r\n };\r\n /**\r\n * Creates an instance of sphere shape\r\n * @param options - The creation options\r\n */\r\n constructor(options?: SphereCreationOptions) {\r\n super(options);\r\n }\r\n clone(): SphereShape {\r\n return new SphereShape(this._options);\r\n }\r\n /** type of the shape */\r\n get type(): string {\r\n return 'Sphere';\r\n }\r\n /**\r\n * {@inheritDoc Primitive.raycast}\r\n * @override\r\n */\r\n raycast(ray: Ray) {\r\n const rSquared = this._options.radius * this._options.radius;\r\n const eSquared = Vector3.dot(ray.origin, ray.origin);\r\n if (eSquared < rSquared) {\r\n return null;\r\n }\r\n const a = -Vector3.dot(ray.origin, ray.direction);\r\n const bSquared = eSquared - a * a;\r\n if (rSquared < bSquared) {\r\n return null;\r\n }\r\n return a - Math.sqrt(rSquared - bSquared);\r\n }\r\n /** Sphere radius */\r\n get radius(): number {\r\n return this._options.radius ?? 1;\r\n }\r\n /**\r\n * Generates the data for the sphere 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 options: SphereCreationOptions,\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 ): PrimitiveType {\r\n options = Object.assign({}, this._defaultOptions, options ?? {});\r\n indexOffset = indexOffset ?? 0;\r\n const start = vertices.length;\r\n const stripIndices: number[] = [];\r\n const radius = options.radius ?? 1;\r\n const verticalDetail = options.verticalDetail ?? 20;\r\n const horizonalDetail = options.horizonalDetail ?? 20;\r\n const vTheta = Math.PI / verticalDetail;\r\n const hTheta = (Math.PI * 2) / horizonalDetail;\r\n for (let i = 0; i <= verticalDetail; i++) {\r\n const v = i * vTheta;\r\n const sinV = Math.sin(v);\r\n const cosV = Math.cos(v);\r\n for (let j = 0; j <= horizonalDetail; j++) {\r\n const h = j * hTheta;\r\n const sinH = Math.sin(h);\r\n const cosH = Math.cos(h);\r\n\r\n const x = radius * sinV * sinH;\r\n const y = radius * cosV;\r\n const z = radius * sinV * cosH;\r\n vertices.push(x, y, z);\r\n uvs?.push(j / horizonalDetail, i / verticalDetail);\r\n if (normals) {\r\n const invR = 1 / radius;\r\n normals.push(x * invR, y * invR, z * invR);\r\n }\r\n if (tangents) {\r\n const w = 1;\r\n let tx: number, ty: number, tz: number;\r\n if (sinV > 1e-6) {\r\n tx = cosH;\r\n ty = 0.0;\r\n tz = -sinH;\r\n } else {\r\n tx = 1.0;\r\n ty = 0.0;\r\n tz = 0.0;\r\n }\r\n tangents.push(tx, ty, tz, w);\r\n }\r\n }\r\n }\r\n for (let i = 0; i < verticalDetail; i++) {\r\n for (let j = 0; j <= horizonalDetail; j++) {\r\n const startIndex = i * (horizonalDetail + 1);\r\n stripIndices.push(startIndex + j + indexOffset, startIndex + j + horizonalDetail + 1 + indexOffset);\r\n }\r\n stripIndices.push(stripIndices[stripIndices.length - 1]);\r\n stripIndices.push((i + 1) * (horizonalDetail + 1) + indexOffset);\r\n }\r\n for (let i = 0; i < stripIndices.length - 2; i++) {\r\n if (i % 2 === 0) {\r\n indices.push(stripIndices[i], stripIndices[i + 1], stripIndices[i + 2]);\r\n } else {\r\n indices.push(stripIndices[i], stripIndices[i + 2], stripIndices[i + 1]);\r\n }\r\n }\r\n Shape._transform(options.transform, vertices, normals, start);\r\n if (bbox) {\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';\r\n }\r\n}\r\n"],"names":["SphereShape","Shape","_defaultOptions","radius","verticalDetail","horizonalDetail","options","clone","_options","type","raycast","ray","rSquared","eSquared","Vector3","dot","origin","a","direction","bSquared","Math","sqrt","generateData","vertices","normals","tangents","uvs","indices","bbox","indexOffset","vertexCallback","Object","assign","start","length","stripIndices","vTheta","PI","hTheta","i","v","sinV","sin","cosV","cos","j","h","sinH","cosH","x","y","z","push","invR","w","tx","ty","tz","startIndex","_transform","transform","minPoint","min","maxPoint","max"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"sphere.js","sources":["../../src/shapes/sphere.ts"],"sourcesContent":["import type { Clonable, Ray } from '@zephyr3d/base';\r\nimport type { AABB } from '@zephyr3d/base';\r\nimport { Vector3 } from '@zephyr3d/base';\r\nimport type { ShapeCreationOptions } from './shape';\r\nimport { Shape } from './shape';\r\n\r\n/**\r\n * Creation options for sphere shape\r\n * @public\r\n */\r\nexport interface SphereCreationOptions extends ShapeCreationOptions {\r\n /** Radius of the sphere, default 1 */\r\n radius?: number;\r\n /** The vertical detail level, default 20 */\r\n verticalDetail?: number;\r\n /** The horizonal detail level, default 20 */\r\n horizonalDetail?: number;\r\n}\r\n\r\n/**\r\n * Sphere shape\r\n * @public\r\n */\r\nexport class SphereShape extends Shape<SphereCreationOptions> implements Clonable<SphereShape> {\r\n static _defaultOptions = {\r\n ...Shape._defaultOptions,\r\n radius: 1,\r\n verticalDetail: 20,\r\n horizonalDetail: 20\r\n };\r\n /**\r\n * Creates an instance of sphere shape\r\n * @param options - The creation options\r\n */\r\n constructor(options?: SphereCreationOptions) {\r\n super(options);\r\n }\r\n clone() {\r\n return new SphereShape(this._options) as this;\r\n }\r\n /** type of the shape */\r\n get type() {\r\n return 'Sphere' as const;\r\n }\r\n /**\r\n * {@inheritDoc Primitive.raycast}\r\n * @override\r\n */\r\n raycast(ray: Ray) {\r\n const rSquared = this._options.radius * this._options.radius;\r\n const eSquared = Vector3.dot(ray.origin, ray.origin);\r\n if (eSquared < rSquared) {\r\n return null;\r\n }\r\n const a = -Vector3.dot(ray.origin, ray.direction);\r\n const bSquared = eSquared - a * a;\r\n if (rSquared < bSquared) {\r\n return null;\r\n }\r\n return a - Math.sqrt(rSquared - bSquared);\r\n }\r\n /** Sphere radius */\r\n get radius() {\r\n return this._options.radius ?? 1;\r\n }\r\n /**\r\n * Generates the data for the sphere 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: SphereCreationOptions,\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 stripIndices: number[] = [];\r\n const radius = options.radius ?? 1;\r\n const verticalDetail = options.verticalDetail ?? 20;\r\n const horizonalDetail = options.horizonalDetail ?? 20;\r\n const vTheta = Math.PI / verticalDetail;\r\n const hTheta = (Math.PI * 2) / horizonalDetail;\r\n for (let i = 0; i <= verticalDetail; i++) {\r\n const v = i * vTheta;\r\n const sinV = Math.sin(v);\r\n const cosV = Math.cos(v);\r\n for (let j = 0; j <= horizonalDetail; j++) {\r\n const h = j * hTheta;\r\n const sinH = Math.sin(h);\r\n const cosH = Math.cos(h);\r\n\r\n const x = radius * sinV * sinH;\r\n const y = radius * cosV;\r\n const z = radius * sinV * cosH;\r\n vertices.push(x, y, z);\r\n uvs?.push(j / horizonalDetail, i / verticalDetail);\r\n if (normals) {\r\n const invR = 1 / radius;\r\n normals.push(x * invR, y * invR, z * invR);\r\n }\r\n if (tangents) {\r\n const w = 1;\r\n let tx: number, ty: number, tz: number;\r\n if (sinV > 1e-6) {\r\n tx = cosH;\r\n ty = 0.0;\r\n tz = -sinH;\r\n } else {\r\n tx = 1.0;\r\n ty = 0.0;\r\n tz = 0.0;\r\n }\r\n tangents.push(tx, ty, tz, w);\r\n }\r\n }\r\n }\r\n for (let i = 0; i < verticalDetail; i++) {\r\n for (let j = 0; j <= horizonalDetail; j++) {\r\n const startIndex = i * (horizonalDetail + 1);\r\n stripIndices.push(startIndex + j + indexOffset, startIndex + j + horizonalDetail + 1 + indexOffset);\r\n }\r\n stripIndices.push(stripIndices[stripIndices.length - 1]);\r\n stripIndices.push((i + 1) * (horizonalDetail + 1) + indexOffset);\r\n }\r\n for (let i = 0; i < stripIndices.length - 2; i++) {\r\n if (i % 2 === 0) {\r\n indices.push(stripIndices[i], stripIndices[i + 1], stripIndices[i + 2]);\r\n } else {\r\n indices.push(stripIndices[i], stripIndices[i + 2], stripIndices[i + 1]);\r\n }\r\n }\r\n Shape._transform(options.transform, vertices, normals, start);\r\n if (bbox) {\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":["SphereShape","Shape","_defaultOptions","radius","verticalDetail","horizonalDetail","options","clone","_options","type","raycast","ray","rSquared","eSquared","Vector3","dot","origin","a","direction","bSquared","Math","sqrt","generateData","opt","vertices","normals","tangents","uvs","indices","bbox","indexOffset","vertexCallback","Object","assign","start","length","stripIndices","vTheta","PI","hTheta","i","v","sinV","sin","cosV","cos","j","h","sinH","cosH","x","y","z","push","invR","w","tx","ty","tz","startIndex","_transform","transform","minPoint","min","maxPoint","max"],"mappings":"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"}
|
|
@@ -23,7 +23,6 @@ import { Shape } from './shape.js';
|
|
|
23
23
|
static calculateTriangleNormal(v0, v1, v2) {
|
|
24
24
|
const edge1 = Vector3.sub(v1, v0);
|
|
25
25
|
const edge2 = Vector3.sub(v2, v0);
|
|
26
|
-
// 使用右手定则:edge1 × edge2,确保逆时针顶点顺序产生向外法线
|
|
27
26
|
return Vector3.normalize(Vector3.cross(edge1, edge2));
|
|
28
27
|
}
|
|
29
28
|
static addTriangle(v0, v1, v2, vertices, normals, tangents, uvs, indices, indexOffset, currentVertexIndex) {
|
|
@@ -81,8 +80,8 @@ import { Shape } from './shape.js';
|
|
|
81
80
|
indices.push(indexOffset + currentVertexIndex + 2);
|
|
82
81
|
return currentVertexIndex + 3;
|
|
83
82
|
}
|
|
84
|
-
static generateData(
|
|
85
|
-
options = Object.assign({}, this._defaultOptions,
|
|
83
|
+
static generateData(opt, vertices, normals, tangents, uvs, indices, bbox, indexOffset, vertexCallback) {
|
|
84
|
+
const options = Object.assign({}, this._defaultOptions, opt ?? {});
|
|
86
85
|
indexOffset = indexOffset ?? 0;
|
|
87
86
|
const start = vertices.length;
|
|
88
87
|
const height = options.height;
|
|
@@ -144,7 +143,7 @@ import { Shape } from './shape.js';
|
|
|
144
143
|
return new TetrahedronShape(this._options);
|
|
145
144
|
}
|
|
146
145
|
get type() {
|
|
147
|
-
return '
|
|
146
|
+
return 'TetrahedronFrame';
|
|
148
147
|
}
|
|
149
148
|
static calculateTriangleNormal(v0, v1, v2) {
|
|
150
149
|
const edge1 = Vector3.sub(v1, v0);
|
|
@@ -210,8 +209,8 @@ import { Shape } from './shape.js';
|
|
|
210
209
|
indices.push(indexOffset + currentVertexIndex);
|
|
211
210
|
return currentVertexIndex + 3;
|
|
212
211
|
}
|
|
213
|
-
static generateData(
|
|
214
|
-
options = Object.assign({}, this._defaultOptions,
|
|
212
|
+
static generateData(opt, vertices, normals, tangents, uvs, indices, bbox, indexOffset, vertexCallback) {
|
|
213
|
+
const options = Object.assign({}, this._defaultOptions, opt ?? {});
|
|
215
214
|
indexOffset = indexOffset ?? 0;
|
|
216
215
|
const start = vertices.length;
|
|
217
216
|
const height = options.height;
|
|
@@ -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\nimport type { PrimitiveType } from '@zephyr3d/device';\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(): TetrahedronShape {\r\n return new TetrahedronShape(this._options);\r\n }\r\n\r\n get type(): string {\r\n return 'Tetrahedron';\r\n }\r\n\r\n private static calculateTriangleNormal(v0: Vector3, v1: Vector3, v2: Vector3): Vector3 {\r\n const edge1 = Vector3.sub(v1, v0);\r\n const edge2 = Vector3.sub(v2, v0);\r\n // 使用右手定则:edge1 × edge2,确保逆时针顶点顺序产生向外法线\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 ): number {\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 options: 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 ): PrimitiveType {\r\n options = Object.assign({}, this._defaultOptions, options ?? {});\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';\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(): TetrahedronShape {\r\n return new TetrahedronShape(this._options);\r\n }\r\n\r\n get type(): string {\r\n return 'Tetrahedron';\r\n }\r\n\r\n private static calculateTriangleNormal(v0: Vector3, v1: Vector3, v2: Vector3): 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 ): number {\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 options: 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 ): PrimitiveType {\r\n options = Object.assign({}, this._defaultOptions, options ?? {});\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';\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","bbox","vertexCallback","Object","assign","start","length","topVertex","bottomVertices","_currentVertexIndex","_transform","transform","i","minPoint","Math","min","maxPoint","max","TetrahedronFrameShape","addLines"],"mappings":";;;AAeA;;;IAIO,MAAMA,gBACHC,SAAAA,KAAAA,CAAAA;AAGR,IAAA,OAAOC,eAAkB,GAAA;AACvB,QAAA,GAAGD,MAAMC,eAAe;QACxBC,MAAQ,EAAA,CAAA;QACRC,KAAO,EAAA,CAAA;QACPC,KAAO,EAAA;KACP;AAEF,IAAA,WAAA,CAAYC,OAAoC,CAAE;AAChD,QAAA,KAAK,CAACA,OAAAA,CAAAA;AACR;IAEAC,KAA0B,GAAA;AACxB,QAAA,OAAO,IAAIP,gBAAAA,CAAiB,IAAI,CAACQ,QAAQ,CAAA;AAC3C;AAEA,IAAA,IAAIC,IAAe,GAAA;QACjB,OAAO,aAAA;AACT;AAEA,IAAA,OAAeC,wBAAwBC,EAAW,EAAEC,EAAW,EAAEC,EAAW,EAAW;AACrF,QAAA,MAAMC,KAAQC,GAAAA,OAAAA,CAAQC,GAAG,CAACJ,EAAID,EAAAA,EAAAA,CAAAA;AAC9B,QAAA,MAAMM,KAAQF,GAAAA,OAAAA,CAAQC,GAAG,CAACH,EAAIF,EAAAA,EAAAA,CAAAA;;AAE9B,QAAA,OAAOI,QAAQG,SAAS,CAACH,OAAQI,CAAAA,KAAK,CAACL,KAAOG,EAAAA,KAAAA,CAAAA,CAAAA;AAChD;IAEA,OAAeG,WAAAA,CACbT,EAAW,EACXC,EAAW,EACXC,EAAW,EACXQ,QAAkB,EAClBC,OAAiB,EACjBC,QAAkB,EAClBC,GAAa,EACbC,OAAiB,EACjBC,WAAmB,EACnBC,kBAA0B,EAClB;;AAER,QAAA,MAAMC,SAAS,IAAI,CAAClB,uBAAuB,CAACC,IAAIC,EAAIC,EAAAA,EAAAA,CAAAA;;QAGpDQ,QAASQ,CAAAA,IAAI,CAAClB,EAAGmB,CAAAA,CAAC,EAAEnB,EAAGoB,CAAAA,CAAC,EAAEpB,EAAAA,CAAGqB,CAAC,CAAA;QAC9BX,QAASQ,CAAAA,IAAI,CAACjB,EAAGkB,CAAAA,CAAC,EAAElB,EAAGmB,CAAAA,CAAC,EAAEnB,EAAAA,CAAGoB,CAAC,CAAA;QAC9BX,QAASQ,CAAAA,IAAI,CAAChB,EAAGiB,CAAAA,CAAC,EAAEjB,EAAGkB,CAAAA,CAAC,EAAElB,EAAAA,CAAGmB,CAAC,CAAA;;QAG9BV,OAASO,EAAAA,IAAAA,CAAKD,OAAOE,CAAC,EAAEF,OAAOG,CAAC,EAAEH,OAAOI,CAAC,CAAA;QAC1CV,OAASO,EAAAA,IAAAA,CAAKD,OAAOE,CAAC,EAAEF,OAAOG,CAAC,EAAEH,OAAOI,CAAC,CAAA;QAC1CV,OAASO,EAAAA,IAAAA,CAAKD,OAAOE,CAAC,EAAEF,OAAOG,CAAC,EAAEH,OAAOI,CAAC,CAAA;AAE1C,QAAA,MAAMC,GAAM,GAAA;AAAC,YAAA,GAAA;AAAK,YAAA;AAAE,SAAA;AACpB,QAAA,MAAMC,GAAM,GAAA;AAAC,YAAA,CAAA;AAAG,YAAA;AAAE,SAAA;AAClB,QAAA,MAAMC,GAAM,GAAA;AAAC,YAAA,CAAA;AAAG,YAAA;AAAE,SAAA;;QAElBX,GAAKK,EAAAA,IAAAA,CAAAA,GAAQI;QACbT,GAAKK,EAAAA,IAAAA,CAAAA,GAAQK;QACbV,GAAKK,EAAAA,IAAAA,CAAAA,GAAQM;AAEb,QAAA,IAAIZ,QAAU,EAAA;AACZ,YAAA,MAAMa,CAAI,GAAA,IAAI,CAACC,cAAc,CAC3B;AAAC1B,gBAAAA,EAAAA,CAAGmB,CAAC;AAAEnB,gBAAAA,EAAAA,CAAGoB,CAAC;AAAEpB,gBAAAA,EAAAA,CAAGqB;aAAE,EAClB;AAACpB,gBAAAA,EAAAA,CAAGkB,CAAC;AAAElB,gBAAAA,EAAAA,CAAGmB,CAAC;AAAEnB,gBAAAA,EAAAA,CAAGoB;aAAE,EAClB;AAACnB,gBAAAA,EAAAA,CAAGiB,CAAC;AAAEjB,gBAAAA,EAAAA,CAAGkB,CAAC;AAAElB,gBAAAA,EAAAA,CAAGmB;aAAE,EAClBC,GAAAA,EACAC,KACAC,GACA,EAAA;AAACP,gBAAAA,MAAAA,CAAOE,CAAC;AAAEF,gBAAAA,MAAAA,CAAOG,CAAC;AAAEH,gBAAAA,MAAAA,CAAOI;AAAE,aAAA,CAAA;AAEhCT,YAAAA,QAAAA,CAASM,IAAI,CAAIO,GAAAA,CAAAA,CAAAA;AACjBb,YAAAA,QAAAA,CAASM,IAAI,CAAIO,GAAAA,CAAAA,CAAAA;AACjBb,YAAAA,QAAAA,CAASM,IAAI,CAAIO,GAAAA,CAAAA,CAAAA;AACnB;;QAGAX,OAAQI,CAAAA,IAAI,CAACH,WAAcC,GAAAA,kBAAAA,CAAAA;QAC3BF,OAAQI,CAAAA,IAAI,CAACH,WAAAA,GAAcC,kBAAqB,GAAA,CAAA,CAAA;QAChDF,OAAQI,CAAAA,IAAI,CAACH,WAAAA,GAAcC,kBAAqB,GAAA,CAAA,CAAA;AAEhD,QAAA,OAAOA,kBAAqB,GAAA,CAAA;AAC9B;AAEA,IAAA,OAAOW,aACLhC,OAAmC,EACnCe,QAAkB,EAClBC,OAAiB,EACjBC,QAAkB,EAClBC,GAAa,EACbC,OAAiB,EACjBc,IAAW,EACXb,WAAoB,EACpBc,cAAyE,EAC1D;QACflC,OAAUmC,GAAAA,MAAAA,CAAOC,MAAM,CAAC,EAAC,EAAG,IAAI,CAACxC,eAAe,EAAEI,OAAAA,IAAW,EAAC,CAAA;AAC9DoB,QAAAA,WAAAA,GAAcA,WAAe,IAAA,CAAA;QAC7B,MAAMiB,KAAAA,GAAQtB,SAASuB,MAAM;QAE7B,MAAMzC,MAAAA,GAASG,QAAQH,MAAM;QAC7B,MAAMC,KAAAA,GAAQE,QAAQF,KAAK;QAC3B,MAAMC,KAAAA,GAAQC,QAAQD,KAAK;;AAG3B,QAAA,MAAMwC,SAAY,GAAA,IAAI9B,OAAQ,CAAA,CAAA,EAAGZ,MAAQ,EAAA,CAAA,CAAA;AACzC,QAAA,MAAM2C,cAAiB,GAAA;YACrB,IAAI/B,OAAAA,CAAQX,OAAO,CAAGC,EAAAA,KAAAA,CAAAA;YACtB,IAAIU,OAAAA,CAAQX,KAAO,EAAA,CAAA,EAAG,CAACC,KAAAA,CAAAA;AACvB,YAAA,IAAIU,OAAQ,CAAA,CAACX,KAAO,EAAA,CAAA,EAAG,CAACC,KAAAA,CAAAA;AACxB,YAAA,IAAIU,OAAQ,CAAA,CAACX,KAAO,EAAA,CAAA,EAAGC;AACxB,SAAA;AAED,QAAA,IAAI0C,mBAAsB,GAAA,CAAA;;AAG1BA,QAAAA,mBAAAA,GAAsB,IAAI,CAAC3B,WAAW,CACpCyB,SACAC,EAAAA,cAAc,CAAC,CAAE,CAAA,EACjBA,cAAc,CAAC,EAAE,EACjBzB,QAAAA,EACAC,SACAC,QACAC,EAAAA,GAAAA,EACAC,SACAC,WACAqB,EAAAA,mBAAAA,CAAAA;;AAIFA,QAAAA,mBAAAA,GAAsB,IAAI,CAAC3B,WAAW,CACpCyB,SACAC,EAAAA,cAAc,CAAC,CAAE,CAAA,EACjBA,cAAc,CAAC,EAAE,EACjBzB,QAAAA,EACAC,SACAC,QACAC,EAAAA,GAAAA,EACAC,SACAC,WACAqB,EAAAA,mBAAAA,CAAAA;;AAIFA,QAAAA,mBAAAA,GAAsB,IAAI,CAAC3B,WAAW,CACpCyB,SACAC,EAAAA,cAAc,CAAC,CAAE,CAAA,EACjBA,cAAc,CAAC,EAAE,EACjBzB,QAAAA,EACAC,SACAC,QACAC,EAAAA,GAAAA,EACAC,SACAC,WACAqB,EAAAA,mBAAAA,CAAAA;;AAIFA,QAAAA,mBAAAA,GAAsB,IAAI,CAAC3B,WAAW,CACpCyB,SACAC,EAAAA,cAAc,CAAC,CAAE,CAAA,EACjBA,cAAc,CAAC,EAAE,EACjBzB,QAAAA,EACAC,SACAC,QACAC,EAAAA,GAAAA,EACAC,SACAC,WACAqB,EAAAA,mBAAAA,CAAAA;;;QAKFA,mBAAsB,GAAA,IAAI,CAAC3B,WAAW,CACpC0B,cAAc,CAAC,CAAA,CAAE,EACjBA,cAAc,CAAC,EAAE,EACjBA,cAAc,CAAC,CAAE,CAAA,EACjBzB,UACAC,OACAC,EAAAA,QAAAA,EACAC,GACAC,EAAAA,OAAAA,EACAC,WACAqB,EAAAA,mBAAAA,CAAAA;;QAIFA,mBAAsB,GAAA,IAAI,CAAC3B,WAAW,CACpC0B,cAAc,CAAC,CAAA,CAAE,EACjBA,cAAc,CAAC,EAAE,EACjBA,cAAc,CAAC,CAAE,CAAA,EACjBzB,UACAC,OACAC,EAAAA,QAAAA,EACAC,GACAC,EAAAA,OAAAA,EACAC,WACAqB,EAAAA,mBAAAA,CAAAA;AAGF9C,QAAAA,KAAAA,CAAM+C,UAAU,CAAC1C,OAAAA,CAAQ2C,SAAS,EAAE5B,UAAUC,OAASqB,EAAAA,KAAAA,CAAAA;AACvD,QAAA,IAAIJ,QAAQC,cAAgB,EAAA;YAC1B,IAAK,IAAIU,IAAIP,KAAOO,EAAAA,CAAAA,GAAI7B,SAASuB,MAAM,GAAG,CAAGM,EAAAA,CAAAA,IAAK,CAAG,CAAA;AACnD,gBAAA,IAAIX,IAAM,EAAA;AACRA,oBAAAA,IAAAA,CAAKY,QAAQ,CAACrB,CAAC,GAAGsB,KAAKC,GAAG,CAACd,IAAKY,CAAAA,QAAQ,CAACrB,CAAC,EAAET,QAAQ,CAAC6B,CAAE,CAAA,CAAA;AACvDX,oBAAAA,IAAAA,CAAKY,QAAQ,CAACpB,CAAC,GAAGqB,KAAKC,GAAG,CAACd,IAAKY,CAAAA,QAAQ,CAACpB,CAAC,EAAEV,QAAQ,CAAC6B,IAAI,CAAE,CAAA,CAAA;AAC3DX,oBAAAA,IAAAA,CAAKY,QAAQ,CAACnB,CAAC,GAAGoB,KAAKC,GAAG,CAACd,IAAKY,CAAAA,QAAQ,CAACnB,CAAC,EAAEX,QAAQ,CAAC6B,IAAI,CAAE,CAAA,CAAA;AAC3DX,oBAAAA,IAAAA,CAAKe,QAAQ,CAACxB,CAAC,GAAGsB,KAAKG,GAAG,CAAChB,IAAKe,CAAAA,QAAQ,CAACxB,CAAC,EAAET,QAAQ,CAAC6B,CAAE,CAAA,CAAA;AACvDX,oBAAAA,IAAAA,CAAKe,QAAQ,CAACvB,CAAC,GAAGqB,KAAKG,GAAG,CAAChB,IAAKe,CAAAA,QAAQ,CAACvB,CAAC,EAAEV,QAAQ,CAAC6B,IAAI,CAAE,CAAA,CAAA;AAC3DX,oBAAAA,IAAAA,CAAKe,QAAQ,CAACtB,CAAC,GAAGoB,KAAKG,GAAG,CAAChB,IAAKe,CAAAA,QAAQ,CAACtB,CAAC,EAAEX,QAAQ,CAAC6B,IAAI,CAAE,CAAA,CAAA;AAC7D;AACAV,gBAAAA,cAAAA,GAAiB,CAACU,CAAAA,GAAIP,KAAI,IAAK,CAAA,EAAGtB,QAAQ,CAAC6B,CAAAA,CAAE,EAAE7B,QAAQ,CAAC6B,CAAI,GAAA,CAAA,CAAE,EAAE7B,QAAQ,CAAC6B,IAAI,CAAE,CAAA,CAAA;AACjF;AACF;QAEA,OAAO,eAAA;AACT;AACF;AAEA;;;IAIO,MAAMM,qBACHvD,SAAAA,KAAAA,CAAAA;AAGR,IAAA,OAAOC,eAAkB,GAAA;AACvB,QAAA,GAAGD,MAAMC,eAAe;QACxBC,MAAQ,EAAA,CAAA;QACRC,KAAO,EAAA,CAAA;QACPC,KAAO,EAAA;KACP;AAEF,IAAA,WAAA,CAAYC,OAAoC,CAAE;AAChD,QAAA,KAAK,CAACA,OAAAA,CAAAA;AACR;IAEAC,KAA0B,GAAA;AACxB,QAAA,OAAO,IAAIP,gBAAAA,CAAiB,IAAI,CAACQ,QAAQ,CAAA;AAC3C;AAEA,IAAA,IAAIC,IAAe,GAAA;QACjB,OAAO,aAAA;AACT;AAEA,IAAA,OAAeC,wBAAwBC,EAAW,EAAEC,EAAW,EAAEC,EAAW,EAAW;AACrF,QAAA,MAAMC,KAAQC,GAAAA,OAAAA,CAAQC,GAAG,CAACJ,EAAID,EAAAA,EAAAA,CAAAA;AAC9B,QAAA,MAAMM,KAAQF,GAAAA,OAAAA,CAAQC,GAAG,CAACH,EAAIF,EAAAA,EAAAA,CAAAA;AAC9B,QAAA,OAAOI,QAAQG,SAAS,CAACH,OAAQI,CAAAA,KAAK,CAACL,KAAOG,EAAAA,KAAAA,CAAAA,CAAAA;AAChD;IAEA,OAAewC,QAAAA,CACb9C,EAAW,EACXC,EAAW,EACXC,EAAW,EACXQ,QAAkB,EAClBC,OAAiB,EACjBC,QAAkB,EAClBC,GAAa,EACbC,OAAiB,EACjBC,WAAmB,EACnBC,kBAA0B,EAClB;;AAER,QAAA,MAAMC,SAAS,IAAI,CAAClB,uBAAuB,CAACC,IAAIC,EAAIC,EAAAA,EAAAA,CAAAA;;QAGpDQ,QAASQ,CAAAA,IAAI,CAAClB,EAAGmB,CAAAA,CAAC,EAAEnB,EAAGoB,CAAAA,CAAC,EAAEpB,EAAAA,CAAGqB,CAAC,CAAA;QAC9BX,QAASQ,CAAAA,IAAI,CAACjB,EAAGkB,CAAAA,CAAC,EAAElB,EAAGmB,CAAAA,CAAC,EAAEnB,EAAAA,CAAGoB,CAAC,CAAA;QAC9BX,QAASQ,CAAAA,IAAI,CAAChB,EAAGiB,CAAAA,CAAC,EAAEjB,EAAGkB,CAAAA,CAAC,EAAElB,EAAAA,CAAGmB,CAAC,CAAA;;QAG9BV,OAASO,EAAAA,IAAAA,CAAKD,OAAOE,CAAC,EAAEF,OAAOG,CAAC,EAAEH,OAAOI,CAAC,CAAA;QAC1CV,OAASO,EAAAA,IAAAA,CAAKD,OAAOE,CAAC,EAAEF,OAAOG,CAAC,EAAEH,OAAOI,CAAC,CAAA;QAC1CV,OAASO,EAAAA,IAAAA,CAAKD,OAAOE,CAAC,EAAEF,OAAOG,CAAC,EAAEH,OAAOI,CAAC,CAAA;;AAG1C,QAAA,MAAMC,GAAM,GAAA;AAAC,YAAA,GAAA;AAAK,YAAA;AAAE,SAAA;AACpB,QAAA,MAAMC,GAAM,GAAA;AAAC,YAAA,CAAA;AAAG,YAAA;AAAE,SAAA;AAClB,QAAA,MAAMC,GAAM,GAAA;AAAC,YAAA,CAAA;AAAG,YAAA;AAAE,SAAA;AAClBX,QAAAA,GAAAA,EAAKK,IAAQI,CAAAA,GAAAA,GAAAA,CAAAA;AACbT,QAAAA,GAAAA,EAAKK,IAAQK,CAAAA,GAAAA,GAAAA,CAAAA;AACbV,QAAAA,GAAAA,EAAKK,IAAQM,CAAAA,GAAAA,GAAAA,CAAAA;;AAGb,QAAA,IAAIZ,QAAU,EAAA;AACZ,YAAA,MAAMa,CAAI,GAAA,IAAI,CAACC,cAAc,CAC3B;AAAC1B,gBAAAA,EAAAA,CAAGmB,CAAC;AAAEnB,gBAAAA,EAAAA,CAAGoB,CAAC;AAAEpB,gBAAAA,EAAAA,CAAGqB;aAAE,EAClB;AAACpB,gBAAAA,EAAAA,CAAGkB,CAAC;AAAElB,gBAAAA,EAAAA,CAAGmB,CAAC;AAAEnB,gBAAAA,EAAAA,CAAGoB;aAAE,EAClB;AAACnB,gBAAAA,EAAAA,CAAGiB,CAAC;AAAEjB,gBAAAA,EAAAA,CAAGkB,CAAC;AAAElB,gBAAAA,EAAAA,CAAGmB;aAAE,EAClBC,GAAAA,EACAC,KACAC,GACA,EAAA;AAACP,gBAAAA,MAAAA,CAAOE,CAAC;AAAEF,gBAAAA,MAAAA,CAAOG,CAAC;AAAEH,gBAAAA,MAAAA,CAAOI;AAAE,aAAA,CAAA;AAEhCT,YAAAA,QAAAA,CAASM,IAAI,CAAIO,GAAAA,CAAAA,CAAAA;AACjBb,YAAAA,QAAAA,CAASM,IAAI,CAAIO,GAAAA,CAAAA,CAAAA;AACjBb,YAAAA,QAAAA,CAASM,IAAI,CAAIO,GAAAA,CAAAA,CAAAA;AACnB;;QAGAX,OAAQI,CAAAA,IAAI,CAACH,WAAcC,GAAAA,kBAAAA,CAAAA;QAC3BF,OAAQI,CAAAA,IAAI,CAACH,WAAAA,GAAcC,kBAAqB,GAAA,CAAA,CAAA;QAChDF,OAAQI,CAAAA,IAAI,CAACH,WAAAA,GAAcC,kBAAqB,GAAA,CAAA,CAAA;QAChDF,OAAQI,CAAAA,IAAI,CAACH,WAAAA,GAAcC,kBAAqB,GAAA,CAAA,CAAA;QAChDF,OAAQI,CAAAA,IAAI,CAACH,WAAAA,GAAcC,kBAAqB,GAAA,CAAA,CAAA;QAChDF,OAAQI,CAAAA,IAAI,CAACH,WAAcC,GAAAA,kBAAAA,CAAAA;AAE3B,QAAA,OAAOA,kBAAqB,GAAA,CAAA;AAC9B;AAEA,IAAA,OAAOW,aACLhC,OAAmC,EACnCe,QAAkB,EAClBC,OAAiB,EACjBC,QAAkB,EAClBC,GAAa,EACbC,OAAiB,EACjBc,IAAW,EACXb,WAAoB,EACpBc,cAAyE,EAC1D;QACflC,OAAUmC,GAAAA,MAAAA,CAAOC,MAAM,CAAC,EAAC,EAAG,IAAI,CAACxC,eAAe,EAAEI,OAAAA,IAAW,EAAC,CAAA;AAC9DoB,QAAAA,WAAAA,GAAcA,WAAe,IAAA,CAAA;QAC7B,MAAMiB,KAAAA,GAAQtB,SAASuB,MAAM;QAE7B,MAAMzC,MAAAA,GAASG,QAAQH,MAAM;QAC7B,MAAMC,KAAAA,GAAQE,QAAQF,KAAK;QAC3B,MAAMC,KAAAA,GAAQC,QAAQD,KAAK;;AAG3B,QAAA,MAAMwC,SAAY,GAAA,IAAI9B,OAAQ,CAAA,CAAA,EAAGZ,MAAQ,EAAA,CAAA,CAAA;AACzC,QAAA,MAAM2C,cAAiB,GAAA;YACrB,IAAI/B,OAAAA,CAAQX,OAAO,CAAGC,EAAAA,KAAAA,CAAAA;YACtB,IAAIU,OAAAA,CAAQX,KAAO,EAAA,CAAA,EAAG,CAACC,KAAAA,CAAAA;AACvB,YAAA,IAAIU,OAAQ,CAAA,CAACX,KAAO,EAAA,CAAA,EAAG,CAACC,KAAAA,CAAAA;AACxB,YAAA,IAAIU,OAAQ,CAAA,CAACX,KAAO,EAAA,CAAA,EAAGC;AACxB,SAAA;AAED,QAAA,IAAI0C,mBAAsB,GAAA,CAAA;;AAG1BA,QAAAA,mBAAAA,GAAsB,IAAI,CAACU,QAAQ,CACjCZ,SACAC,EAAAA,cAAc,CAAC,CAAE,CAAA,EACjBA,cAAc,CAAC,EAAE,EACjBzB,QAAAA,EACAC,SACAC,QACAC,EAAAA,GAAAA,EACAC,SACAC,WACAqB,EAAAA,mBAAAA,CAAAA;;AAIFA,QAAAA,mBAAAA,GAAsB,IAAI,CAACU,QAAQ,CACjCZ,SACAC,EAAAA,cAAc,CAAC,CAAE,CAAA,EACjBA,cAAc,CAAC,EAAE,EACjBzB,QAAAA,EACAC,SACAC,QACAC,EAAAA,GAAAA,EACAC,SACAC,WACAqB,EAAAA,mBAAAA,CAAAA;;AAIFA,QAAAA,mBAAAA,GAAsB,IAAI,CAACU,QAAQ,CACjCZ,SACAC,EAAAA,cAAc,CAAC,CAAE,CAAA,EACjBA,cAAc,CAAC,EAAE,EACjBzB,QAAAA,EACAC,SACAC,QACAC,EAAAA,GAAAA,EACAC,SACAC,WACAqB,EAAAA,mBAAAA,CAAAA;;AAIFA,QAAAA,mBAAAA,GAAsB,IAAI,CAACU,QAAQ,CACjCZ,SACAC,EAAAA,cAAc,CAAC,CAAE,CAAA,EACjBA,cAAc,CAAC,EAAE,EACjBzB,QAAAA,EACAC,SACAC,QACAC,EAAAA,GAAAA,EACAC,SACAC,WACAqB,EAAAA,mBAAAA,CAAAA;AAGF9C,QAAAA,KAAAA,CAAM+C,UAAU,CAAC1C,OAAAA,CAAQ2C,SAAS,EAAE5B,UAAUC,OAASqB,EAAAA,KAAAA,CAAAA;AACvD,QAAA,IAAIJ,QAAQC,cAAgB,EAAA;YAC1B,IAAK,IAAIU,IAAIP,KAAOO,EAAAA,CAAAA,GAAI7B,SAASuB,MAAM,GAAG,CAAGM,EAAAA,CAAAA,IAAK,CAAG,CAAA;AACnD,gBAAA,IAAIX,IAAM,EAAA;AACRA,oBAAAA,IAAAA,CAAKY,QAAQ,CAACrB,CAAC,GAAGsB,KAAKC,GAAG,CAACd,IAAKY,CAAAA,QAAQ,CAACrB,CAAC,EAAET,QAAQ,CAAC6B,CAAE,CAAA,CAAA;AACvDX,oBAAAA,IAAAA,CAAKY,QAAQ,CAACpB,CAAC,GAAGqB,KAAKC,GAAG,CAACd,IAAKY,CAAAA,QAAQ,CAACpB,CAAC,EAAEV,QAAQ,CAAC6B,IAAI,CAAE,CAAA,CAAA;AAC3DX,oBAAAA,IAAAA,CAAKY,QAAQ,CAACnB,CAAC,GAAGoB,KAAKC,GAAG,CAACd,IAAKY,CAAAA,QAAQ,CAACnB,CAAC,EAAEX,QAAQ,CAAC6B,IAAI,CAAE,CAAA,CAAA;AAC3DX,oBAAAA,IAAAA,CAAKe,QAAQ,CAACxB,CAAC,GAAGsB,KAAKG,GAAG,CAAChB,IAAKe,CAAAA,QAAQ,CAACxB,CAAC,EAAET,QAAQ,CAAC6B,CAAE,CAAA,CAAA;AACvDX,oBAAAA,IAAAA,CAAKe,QAAQ,CAACvB,CAAC,GAAGqB,KAAKG,GAAG,CAAChB,IAAKe,CAAAA,QAAQ,CAACvB,CAAC,EAAEV,QAAQ,CAAC6B,IAAI,CAAE,CAAA,CAAA;AAC3DX,oBAAAA,IAAAA,CAAKe,QAAQ,CAACtB,CAAC,GAAGoB,KAAKG,GAAG,CAAChB,IAAKe,CAAAA,QAAQ,CAACtB,CAAC,EAAEX,QAAQ,CAAC6B,IAAI,CAAE,CAAA,CAAA;AAC7D;AACAV,gBAAAA,cAAAA,GAAiB,CAACU,CAAAA,GAAIP,KAAI,IAAK,CAAA,EAAGtB,QAAQ,CAAC6B,CAAAA,CAAE,EAAE7B,QAAQ,CAAC6B,CAAI,GAAA,CAAA,CAAE,EAAE7B,QAAQ,CAAC6B,IAAI,CAAE,CAAA,CAAA;AACjF;AACF;QAEA,OAAO,WAAA;AACT;AACF;;;;"}
|
|
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":";;;AAcA;;;IAIO,MAAMA,gBACHC,SAAAA,KAAAA,CAAAA;AAGR,IAAA,OAAOC,eAAkB,GAAA;AACvB,QAAA,GAAGD,MAAMC,eAAe;QACxBC,MAAQ,EAAA,CAAA;QACRC,KAAO,EAAA,CAAA;QACPC,KAAO,EAAA;KACP;AAEF,IAAA,WAAA,CAAYC,OAAoC,CAAE;AAChD,QAAA,KAAK,CAACA,OAAAA,CAAAA;AACR;IAEAC,KAAQ,GAAA;AACN,QAAA,OAAO,IAAIP,gBAAAA,CAAiB,IAAI,CAACQ,QAAQ,CAAA;AAC3C;AAEA,IAAA,IAAIC,IAAO,GAAA;QACT,OAAO,aAAA;AACT;AAEA,IAAA,OAAeC,wBAAwBC,EAAW,EAAEC,EAAW,EAAEC,EAAW,EAAE;AAC5E,QAAA,MAAMC,KAAQC,GAAAA,OAAAA,CAAQC,GAAG,CAACJ,EAAID,EAAAA,EAAAA,CAAAA;AAC9B,QAAA,MAAMM,KAAQF,GAAAA,OAAAA,CAAQC,GAAG,CAACH,EAAIF,EAAAA,EAAAA,CAAAA;AAC9B,QAAA,OAAOI,QAAQG,SAAS,CAACH,OAAQI,CAAAA,KAAK,CAACL,KAAOG,EAAAA,KAAAA,CAAAA,CAAAA;AAChD;IAEA,OAAeG,WAAAA,CACbT,EAAW,EACXC,EAAW,EACXC,EAAW,EACXQ,QAAkB,EAClBC,OAAiB,EACjBC,QAAkB,EAClBC,GAAa,EACbC,OAAiB,EACjBC,WAAmB,EACnBC,kBAA0B,EAC1B;;AAEA,QAAA,MAAMC,SAAS,IAAI,CAAClB,uBAAuB,CAACC,IAAIC,EAAIC,EAAAA,EAAAA,CAAAA;;QAGpDQ,QAASQ,CAAAA,IAAI,CAAClB,EAAGmB,CAAAA,CAAC,EAAEnB,EAAGoB,CAAAA,CAAC,EAAEpB,EAAAA,CAAGqB,CAAC,CAAA;QAC9BX,QAASQ,CAAAA,IAAI,CAACjB,EAAGkB,CAAAA,CAAC,EAAElB,EAAGmB,CAAAA,CAAC,EAAEnB,EAAAA,CAAGoB,CAAC,CAAA;QAC9BX,QAASQ,CAAAA,IAAI,CAAChB,EAAGiB,CAAAA,CAAC,EAAEjB,EAAGkB,CAAAA,CAAC,EAAElB,EAAAA,CAAGmB,CAAC,CAAA;;QAG9BV,OAASO,EAAAA,IAAAA,CAAKD,OAAOE,CAAC,EAAEF,OAAOG,CAAC,EAAEH,OAAOI,CAAC,CAAA;QAC1CV,OAASO,EAAAA,IAAAA,CAAKD,OAAOE,CAAC,EAAEF,OAAOG,CAAC,EAAEH,OAAOI,CAAC,CAAA;QAC1CV,OAASO,EAAAA,IAAAA,CAAKD,OAAOE,CAAC,EAAEF,OAAOG,CAAC,EAAEH,OAAOI,CAAC,CAAA;AAE1C,QAAA,MAAMC,GAAM,GAAA;AAAC,YAAA,GAAA;AAAK,YAAA;AAAE,SAAA;AACpB,QAAA,MAAMC,GAAM,GAAA;AAAC,YAAA,CAAA;AAAG,YAAA;AAAE,SAAA;AAClB,QAAA,MAAMC,GAAM,GAAA;AAAC,YAAA,CAAA;AAAG,YAAA;AAAE,SAAA;;QAElBX,GAAKK,EAAAA,IAAAA,CAAAA,GAAQI;QACbT,GAAKK,EAAAA,IAAAA,CAAAA,GAAQK;QACbV,GAAKK,EAAAA,IAAAA,CAAAA,GAAQM;AAEb,QAAA,IAAIZ,QAAU,EAAA;AACZ,YAAA,MAAMa,CAAI,GAAA,IAAI,CAACC,cAAc,CAC3B;AAAC1B,gBAAAA,EAAAA,CAAGmB,CAAC;AAAEnB,gBAAAA,EAAAA,CAAGoB,CAAC;AAAEpB,gBAAAA,EAAAA,CAAGqB;aAAE,EAClB;AAACpB,gBAAAA,EAAAA,CAAGkB,CAAC;AAAElB,gBAAAA,EAAAA,CAAGmB,CAAC;AAAEnB,gBAAAA,EAAAA,CAAGoB;aAAE,EAClB;AAACnB,gBAAAA,EAAAA,CAAGiB,CAAC;AAAEjB,gBAAAA,EAAAA,CAAGkB,CAAC;AAAElB,gBAAAA,EAAAA,CAAGmB;aAAE,EAClBC,GAAAA,EACAC,KACAC,GACA,EAAA;AAACP,gBAAAA,MAAAA,CAAOE,CAAC;AAAEF,gBAAAA,MAAAA,CAAOG,CAAC;AAAEH,gBAAAA,MAAAA,CAAOI;AAAE,aAAA,CAAA;AAEhCT,YAAAA,QAAAA,CAASM,IAAI,CAAIO,GAAAA,CAAAA,CAAAA;AACjBb,YAAAA,QAAAA,CAASM,IAAI,CAAIO,GAAAA,CAAAA,CAAAA;AACjBb,YAAAA,QAAAA,CAASM,IAAI,CAAIO,GAAAA,CAAAA,CAAAA;AACnB;;QAGAX,OAAQI,CAAAA,IAAI,CAACH,WAAcC,GAAAA,kBAAAA,CAAAA;QAC3BF,OAAQI,CAAAA,IAAI,CAACH,WAAAA,GAAcC,kBAAqB,GAAA,CAAA,CAAA;QAChDF,OAAQI,CAAAA,IAAI,CAACH,WAAAA,GAAcC,kBAAqB,GAAA,CAAA,CAAA;AAEhD,QAAA,OAAOA,kBAAqB,GAAA,CAAA;AAC9B;AAEA,IAAA,OAAOW,aACLC,GAA+B,EAC/BlB,QAAkB,EAClBC,OAAiB,EACjBC,QAAkB,EAClBC,GAAa,EACbC,OAAiB,EACjBe,IAAW,EACXd,WAAoB,EACpBe,cAAyE,EACzE;QACA,MAAMnC,OAAAA,GAAUoC,MAAOC,CAAAA,MAAM,CAAC,EAAI,EAAA,IAAI,CAACzC,eAAe,EAAEqC,GAAAA,IAAO,EAAC,CAAA;AAChEb,QAAAA,WAAAA,GAAcA,WAAe,IAAA,CAAA;QAC7B,MAAMkB,KAAAA,GAAQvB,SAASwB,MAAM;QAE7B,MAAM1C,MAAAA,GAASG,QAAQH,MAAM;QAC7B,MAAMC,KAAAA,GAAQE,QAAQF,KAAK;QAC3B,MAAMC,KAAAA,GAAQC,QAAQD,KAAK;;AAG3B,QAAA,MAAMyC,SAAY,GAAA,IAAI/B,OAAQ,CAAA,CAAA,EAAGZ,MAAQ,EAAA,CAAA,CAAA;AACzC,QAAA,MAAM4C,cAAiB,GAAA;YACrB,IAAIhC,OAAAA,CAAQX,OAAO,CAAGC,EAAAA,KAAAA,CAAAA;YACtB,IAAIU,OAAAA,CAAQX,KAAO,EAAA,CAAA,EAAG,CAACC,KAAAA,CAAAA;AACvB,YAAA,IAAIU,OAAQ,CAAA,CAACX,KAAO,EAAA,CAAA,EAAG,CAACC,KAAAA,CAAAA;AACxB,YAAA,IAAIU,OAAQ,CAAA,CAACX,KAAO,EAAA,CAAA,EAAGC;AACxB,SAAA;AAED,QAAA,IAAI2C,mBAAsB,GAAA,CAAA;;AAG1BA,QAAAA,mBAAAA,GAAsB,IAAI,CAAC5B,WAAW,CACpC0B,SACAC,EAAAA,cAAc,CAAC,CAAE,CAAA,EACjBA,cAAc,CAAC,EAAE,EACjB1B,QAAAA,EACAC,SACAC,QACAC,EAAAA,GAAAA,EACAC,SACAC,WACAsB,EAAAA,mBAAAA,CAAAA;;AAIFA,QAAAA,mBAAAA,GAAsB,IAAI,CAAC5B,WAAW,CACpC0B,SACAC,EAAAA,cAAc,CAAC,CAAE,CAAA,EACjBA,cAAc,CAAC,EAAE,EACjB1B,QAAAA,EACAC,SACAC,QACAC,EAAAA,GAAAA,EACAC,SACAC,WACAsB,EAAAA,mBAAAA,CAAAA;;AAIFA,QAAAA,mBAAAA,GAAsB,IAAI,CAAC5B,WAAW,CACpC0B,SACAC,EAAAA,cAAc,CAAC,CAAE,CAAA,EACjBA,cAAc,CAAC,EAAE,EACjB1B,QAAAA,EACAC,SACAC,QACAC,EAAAA,GAAAA,EACAC,SACAC,WACAsB,EAAAA,mBAAAA,CAAAA;;AAIFA,QAAAA,mBAAAA,GAAsB,IAAI,CAAC5B,WAAW,CACpC0B,SACAC,EAAAA,cAAc,CAAC,CAAE,CAAA,EACjBA,cAAc,CAAC,EAAE,EACjB1B,QAAAA,EACAC,SACAC,QACAC,EAAAA,GAAAA,EACAC,SACAC,WACAsB,EAAAA,mBAAAA,CAAAA;;;QAKFA,mBAAsB,GAAA,IAAI,CAAC5B,WAAW,CACpC2B,cAAc,CAAC,CAAA,CAAE,EACjBA,cAAc,CAAC,EAAE,EACjBA,cAAc,CAAC,CAAE,CAAA,EACjB1B,UACAC,OACAC,EAAAA,QAAAA,EACAC,GACAC,EAAAA,OAAAA,EACAC,WACAsB,EAAAA,mBAAAA,CAAAA;;QAIFA,mBAAsB,GAAA,IAAI,CAAC5B,WAAW,CACpC2B,cAAc,CAAC,CAAA,CAAE,EACjBA,cAAc,CAAC,EAAE,EACjBA,cAAc,CAAC,CAAE,CAAA,EACjB1B,UACAC,OACAC,EAAAA,QAAAA,EACAC,GACAC,EAAAA,OAAAA,EACAC,WACAsB,EAAAA,mBAAAA,CAAAA;AAGF/C,QAAAA,KAAAA,CAAMgD,UAAU,CAAC3C,OAAAA,CAAQ4C,SAAS,EAAE7B,UAAUC,OAASsB,EAAAA,KAAAA,CAAAA;AACvD,QAAA,IAAIJ,QAAQC,cAAgB,EAAA;YAC1B,IAAK,IAAIU,IAAIP,KAAOO,EAAAA,CAAAA,GAAI9B,SAASwB,MAAM,GAAG,CAAGM,EAAAA,CAAAA,IAAK,CAAG,CAAA;AACnD,gBAAA,IAAIX,IAAM,EAAA;AACRA,oBAAAA,IAAAA,CAAKY,QAAQ,CAACtB,CAAC,GAAGuB,KAAKC,GAAG,CAACd,IAAKY,CAAAA,QAAQ,CAACtB,CAAC,EAAET,QAAQ,CAAC8B,CAAE,CAAA,CAAA;AACvDX,oBAAAA,IAAAA,CAAKY,QAAQ,CAACrB,CAAC,GAAGsB,KAAKC,GAAG,CAACd,IAAKY,CAAAA,QAAQ,CAACrB,CAAC,EAAEV,QAAQ,CAAC8B,IAAI,CAAE,CAAA,CAAA;AAC3DX,oBAAAA,IAAAA,CAAKY,QAAQ,CAACpB,CAAC,GAAGqB,KAAKC,GAAG,CAACd,IAAKY,CAAAA,QAAQ,CAACpB,CAAC,EAAEX,QAAQ,CAAC8B,IAAI,CAAE,CAAA,CAAA;AAC3DX,oBAAAA,IAAAA,CAAKe,QAAQ,CAACzB,CAAC,GAAGuB,KAAKG,GAAG,CAAChB,IAAKe,CAAAA,QAAQ,CAACzB,CAAC,EAAET,QAAQ,CAAC8B,CAAE,CAAA,CAAA;AACvDX,oBAAAA,IAAAA,CAAKe,QAAQ,CAACxB,CAAC,GAAGsB,KAAKG,GAAG,CAAChB,IAAKe,CAAAA,QAAQ,CAACxB,CAAC,EAAEV,QAAQ,CAAC8B,IAAI,CAAE,CAAA,CAAA;AAC3DX,oBAAAA,IAAAA,CAAKe,QAAQ,CAACvB,CAAC,GAAGqB,KAAKG,GAAG,CAAChB,IAAKe,CAAAA,QAAQ,CAACvB,CAAC,EAAEX,QAAQ,CAAC8B,IAAI,CAAE,CAAA,CAAA;AAC7D;AACAV,gBAAAA,cAAAA,GAAiB,CAACU,CAAAA,GAAIP,KAAI,IAAK,CAAA,EAAGvB,QAAQ,CAAC8B,CAAAA,CAAE,EAAE9B,QAAQ,CAAC8B,CAAI,GAAA,CAAA,CAAE,EAAE9B,QAAQ,CAAC8B,IAAI,CAAE,CAAA,CAAA;AACjF;AACF;QAEA,OAAO,eAAA;AACT;AACF;AAEA;;;IAIO,MAAMM,qBACHxD,SAAAA,KAAAA,CAAAA;AAGR,IAAA,OAAOC,eAAkB,GAAA;AACvB,QAAA,GAAGD,MAAMC,eAAe;QACxBC,MAAQ,EAAA,CAAA;QACRC,KAAO,EAAA,CAAA;QACPC,KAAO,EAAA;KACP;AAEF,IAAA,WAAA,CAAYC,OAAoC,CAAE;AAChD,QAAA,KAAK,CAACA,OAAAA,CAAAA;AACR;IAEAC,KAAQ,GAAA;AACN,QAAA,OAAO,IAAIP,gBAAAA,CAAiB,IAAI,CAACQ,QAAQ,CAAA;AAC3C;AAEA,IAAA,IAAIC,IAAO,GAAA;QACT,OAAO,kBAAA;AACT;AAEA,IAAA,OAAeC,wBAAwBC,EAAW,EAAEC,EAAW,EAAEC,EAAW,EAAE;AAC5E,QAAA,MAAMC,KAAQC,GAAAA,OAAAA,CAAQC,GAAG,CAACJ,EAAID,EAAAA,EAAAA,CAAAA;AAC9B,QAAA,MAAMM,KAAQF,GAAAA,OAAAA,CAAQC,GAAG,CAACH,EAAIF,EAAAA,EAAAA,CAAAA;AAC9B,QAAA,OAAOI,QAAQG,SAAS,CAACH,OAAQI,CAAAA,KAAK,CAACL,KAAOG,EAAAA,KAAAA,CAAAA,CAAAA;AAChD;IAEA,OAAeyC,QAAAA,CACb/C,EAAW,EACXC,EAAW,EACXC,EAAW,EACXQ,QAAkB,EAClBC,OAAiB,EACjBC,QAAkB,EAClBC,GAAa,EACbC,OAAiB,EACjBC,WAAmB,EACnBC,kBAA0B,EAC1B;;AAEA,QAAA,MAAMC,SAAS,IAAI,CAAClB,uBAAuB,CAACC,IAAIC,EAAIC,EAAAA,EAAAA,CAAAA;;QAGpDQ,QAASQ,CAAAA,IAAI,CAAClB,EAAGmB,CAAAA,CAAC,EAAEnB,EAAGoB,CAAAA,CAAC,EAAEpB,EAAAA,CAAGqB,CAAC,CAAA;QAC9BX,QAASQ,CAAAA,IAAI,CAACjB,EAAGkB,CAAAA,CAAC,EAAElB,EAAGmB,CAAAA,CAAC,EAAEnB,EAAAA,CAAGoB,CAAC,CAAA;QAC9BX,QAASQ,CAAAA,IAAI,CAAChB,EAAGiB,CAAAA,CAAC,EAAEjB,EAAGkB,CAAAA,CAAC,EAAElB,EAAAA,CAAGmB,CAAC,CAAA;;QAG9BV,OAASO,EAAAA,IAAAA,CAAKD,OAAOE,CAAC,EAAEF,OAAOG,CAAC,EAAEH,OAAOI,CAAC,CAAA;QAC1CV,OAASO,EAAAA,IAAAA,CAAKD,OAAOE,CAAC,EAAEF,OAAOG,CAAC,EAAEH,OAAOI,CAAC,CAAA;QAC1CV,OAASO,EAAAA,IAAAA,CAAKD,OAAOE,CAAC,EAAEF,OAAOG,CAAC,EAAEH,OAAOI,CAAC,CAAA;;AAG1C,QAAA,MAAMC,GAAM,GAAA;AAAC,YAAA,GAAA;AAAK,YAAA;AAAE,SAAA;AACpB,QAAA,MAAMC,GAAM,GAAA;AAAC,YAAA,CAAA;AAAG,YAAA;AAAE,SAAA;AAClB,QAAA,MAAMC,GAAM,GAAA;AAAC,YAAA,CAAA;AAAG,YAAA;AAAE,SAAA;AAClBX,QAAAA,GAAAA,EAAKK,IAAQI,CAAAA,GAAAA,GAAAA,CAAAA;AACbT,QAAAA,GAAAA,EAAKK,IAAQK,CAAAA,GAAAA,GAAAA,CAAAA;AACbV,QAAAA,GAAAA,EAAKK,IAAQM,CAAAA,GAAAA,GAAAA,CAAAA;;AAGb,QAAA,IAAIZ,QAAU,EAAA;AACZ,YAAA,MAAMa,CAAI,GAAA,IAAI,CAACC,cAAc,CAC3B;AAAC1B,gBAAAA,EAAAA,CAAGmB,CAAC;AAAEnB,gBAAAA,EAAAA,CAAGoB,CAAC;AAAEpB,gBAAAA,EAAAA,CAAGqB;aAAE,EAClB;AAACpB,gBAAAA,EAAAA,CAAGkB,CAAC;AAAElB,gBAAAA,EAAAA,CAAGmB,CAAC;AAAEnB,gBAAAA,EAAAA,CAAGoB;aAAE,EAClB;AAACnB,gBAAAA,EAAAA,CAAGiB,CAAC;AAAEjB,gBAAAA,EAAAA,CAAGkB,CAAC;AAAElB,gBAAAA,EAAAA,CAAGmB;aAAE,EAClBC,GAAAA,EACAC,KACAC,GACA,EAAA;AAACP,gBAAAA,MAAAA,CAAOE,CAAC;AAAEF,gBAAAA,MAAAA,CAAOG,CAAC;AAAEH,gBAAAA,MAAAA,CAAOI;AAAE,aAAA,CAAA;AAEhCT,YAAAA,QAAAA,CAASM,IAAI,CAAIO,GAAAA,CAAAA,CAAAA;AACjBb,YAAAA,QAAAA,CAASM,IAAI,CAAIO,GAAAA,CAAAA,CAAAA;AACjBb,YAAAA,QAAAA,CAASM,IAAI,CAAIO,GAAAA,CAAAA,CAAAA;AACnB;;QAGAX,OAAQI,CAAAA,IAAI,CAACH,WAAcC,GAAAA,kBAAAA,CAAAA;QAC3BF,OAAQI,CAAAA,IAAI,CAACH,WAAAA,GAAcC,kBAAqB,GAAA,CAAA,CAAA;QAChDF,OAAQI,CAAAA,IAAI,CAACH,WAAAA,GAAcC,kBAAqB,GAAA,CAAA,CAAA;QAChDF,OAAQI,CAAAA,IAAI,CAACH,WAAAA,GAAcC,kBAAqB,GAAA,CAAA,CAAA;QAChDF,OAAQI,CAAAA,IAAI,CAACH,WAAAA,GAAcC,kBAAqB,GAAA,CAAA,CAAA;QAChDF,OAAQI,CAAAA,IAAI,CAACH,WAAcC,GAAAA,kBAAAA,CAAAA;AAE3B,QAAA,OAAOA,kBAAqB,GAAA,CAAA;AAC9B;AAEA,IAAA,OAAOW,aACLC,GAA+B,EAC/BlB,QAAkB,EAClBC,OAAiB,EACjBC,QAAkB,EAClBC,GAAa,EACbC,OAAiB,EACjBe,IAAW,EACXd,WAAoB,EACpBe,cAAyE,EACzE;QACA,MAAMnC,OAAAA,GAAUoC,MAAOC,CAAAA,MAAM,CAAC,EAAI,EAAA,IAAI,CAACzC,eAAe,EAAEqC,GAAAA,IAAO,EAAC,CAAA;AAChEb,QAAAA,WAAAA,GAAcA,WAAe,IAAA,CAAA;QAC7B,MAAMkB,KAAAA,GAAQvB,SAASwB,MAAM;QAE7B,MAAM1C,MAAAA,GAASG,QAAQH,MAAM;QAC7B,MAAMC,KAAAA,GAAQE,QAAQF,KAAK;QAC3B,MAAMC,KAAAA,GAAQC,QAAQD,KAAK;;AAG3B,QAAA,MAAMyC,SAAY,GAAA,IAAI/B,OAAQ,CAAA,CAAA,EAAGZ,MAAQ,EAAA,CAAA,CAAA;AACzC,QAAA,MAAM4C,cAAiB,GAAA;YACrB,IAAIhC,OAAAA,CAAQX,OAAO,CAAGC,EAAAA,KAAAA,CAAAA;YACtB,IAAIU,OAAAA,CAAQX,KAAO,EAAA,CAAA,EAAG,CAACC,KAAAA,CAAAA;AACvB,YAAA,IAAIU,OAAQ,CAAA,CAACX,KAAO,EAAA,CAAA,EAAG,CAACC,KAAAA,CAAAA;AACxB,YAAA,IAAIU,OAAQ,CAAA,CAACX,KAAO,EAAA,CAAA,EAAGC;AACxB,SAAA;AAED,QAAA,IAAI2C,mBAAsB,GAAA,CAAA;;AAG1BA,QAAAA,mBAAAA,GAAsB,IAAI,CAACU,QAAQ,CACjCZ,SACAC,EAAAA,cAAc,CAAC,CAAE,CAAA,EACjBA,cAAc,CAAC,EAAE,EACjB1B,QAAAA,EACAC,SACAC,QACAC,EAAAA,GAAAA,EACAC,SACAC,WACAsB,EAAAA,mBAAAA,CAAAA;;AAIFA,QAAAA,mBAAAA,GAAsB,IAAI,CAACU,QAAQ,CACjCZ,SACAC,EAAAA,cAAc,CAAC,CAAE,CAAA,EACjBA,cAAc,CAAC,EAAE,EACjB1B,QAAAA,EACAC,SACAC,QACAC,EAAAA,GAAAA,EACAC,SACAC,WACAsB,EAAAA,mBAAAA,CAAAA;;AAIFA,QAAAA,mBAAAA,GAAsB,IAAI,CAACU,QAAQ,CACjCZ,SACAC,EAAAA,cAAc,CAAC,CAAE,CAAA,EACjBA,cAAc,CAAC,EAAE,EACjB1B,QAAAA,EACAC,SACAC,QACAC,EAAAA,GAAAA,EACAC,SACAC,WACAsB,EAAAA,mBAAAA,CAAAA;;AAIFA,QAAAA,mBAAAA,GAAsB,IAAI,CAACU,QAAQ,CACjCZ,SACAC,EAAAA,cAAc,CAAC,CAAE,CAAA,EACjBA,cAAc,CAAC,EAAE,EACjB1B,QAAAA,EACAC,SACAC,QACAC,EAAAA,GAAAA,EACAC,SACAC,WACAsB,EAAAA,mBAAAA,CAAAA;AAGF/C,QAAAA,KAAAA,CAAMgD,UAAU,CAAC3C,OAAAA,CAAQ4C,SAAS,EAAE7B,UAAUC,OAASsB,EAAAA,KAAAA,CAAAA;AACvD,QAAA,IAAIJ,QAAQC,cAAgB,EAAA;YAC1B,IAAK,IAAIU,IAAIP,KAAOO,EAAAA,CAAAA,GAAI9B,SAASwB,MAAM,GAAG,CAAGM,EAAAA,CAAAA,IAAK,CAAG,CAAA;AACnD,gBAAA,IAAIX,IAAM,EAAA;AACRA,oBAAAA,IAAAA,CAAKY,QAAQ,CAACtB,CAAC,GAAGuB,KAAKC,GAAG,CAACd,IAAKY,CAAAA,QAAQ,CAACtB,CAAC,EAAET,QAAQ,CAAC8B,CAAE,CAAA,CAAA;AACvDX,oBAAAA,IAAAA,CAAKY,QAAQ,CAACrB,CAAC,GAAGsB,KAAKC,GAAG,CAACd,IAAKY,CAAAA,QAAQ,CAACrB,CAAC,EAAEV,QAAQ,CAAC8B,IAAI,CAAE,CAAA,CAAA;AAC3DX,oBAAAA,IAAAA,CAAKY,QAAQ,CAACpB,CAAC,GAAGqB,KAAKC,GAAG,CAACd,IAAKY,CAAAA,QAAQ,CAACpB,CAAC,EAAEX,QAAQ,CAAC8B,IAAI,CAAE,CAAA,CAAA;AAC3DX,oBAAAA,IAAAA,CAAKe,QAAQ,CAACzB,CAAC,GAAGuB,KAAKG,GAAG,CAAChB,IAAKe,CAAAA,QAAQ,CAACzB,CAAC,EAAET,QAAQ,CAAC8B,CAAE,CAAA,CAAA;AACvDX,oBAAAA,IAAAA,CAAKe,QAAQ,CAACxB,CAAC,GAAGsB,KAAKG,GAAG,CAAChB,IAAKe,CAAAA,QAAQ,CAACxB,CAAC,EAAEV,QAAQ,CAAC8B,IAAI,CAAE,CAAA,CAAA;AAC3DX,oBAAAA,IAAAA,CAAKe,QAAQ,CAACvB,CAAC,GAAGqB,KAAKG,GAAG,CAAChB,IAAKe,CAAAA,QAAQ,CAACvB,CAAC,EAAEX,QAAQ,CAAC8B,IAAI,CAAE,CAAA,CAAA;AAC7D;AACAV,gBAAAA,cAAAA,GAAiB,CAACU,CAAAA,GAAIP,KAAI,IAAK,CAAA,EAAGvB,QAAQ,CAAC8B,CAAAA,CAAE,EAAE9B,QAAQ,CAAC8B,CAAI,GAAA,CAAA,CAAE,EAAE9B,QAAQ,CAAC8B,IAAI,CAAE,CAAA,CAAA;AACjF;AACF;QAEA,OAAO,WAAA;AACT;AACF;;;;"}
|
package/dist/shapes/torus.js
CHANGED
|
@@ -46,8 +46,8 @@ Triangle(n, m) = (VIndex(n, m), VIndex(n+1, m), VIndex(n+1, m+1), VIndex(n, m),
|
|
|
46
46
|
* @param normals - vertex normals
|
|
47
47
|
* @param uvs - vertex uvs
|
|
48
48
|
* @param indices - vertex indices
|
|
49
|
-
*/ static generateData(
|
|
50
|
-
options = Object.assign({}, this._defaultOptions,
|
|
49
|
+
*/ static generateData(opt, vertices, normals, tangents, uvs, indices, bbox, indexOffset, vertexCallback) {
|
|
50
|
+
const options = Object.assign({}, this._defaultOptions, opt ?? {});
|
|
51
51
|
indexOffset = indexOffset ?? 0;
|
|
52
52
|
const start = vertices.length;
|
|
53
53
|
const N = options.numSlices;
|
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\nimport type { PrimitiveType } from '@zephyr3d/device';\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(): TorusShape {\r\n return new TorusShape(this._options);\r\n }\r\n /** type of the shape */\r\n get type(): string {\r\n return 'Torus';\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 options: 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 ): PrimitiveType {\r\n options = Object.assign({}, this._defaultOptions, options ?? {});\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';\r\n }\r\n}\r\n"],"names":["TorusShape","Shape","_defaultOptions","numSlices","numSegments","outerRadius","innerRadius","radialDetail","options","clone","_options","type","generateData","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 } 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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"}
|
package/dist/utility/aabbtree.js
CHANGED
|
@@ -17,7 +17,7 @@ const tmpTriangle = [
|
|
|
17
17
|
if (other) {
|
|
18
18
|
this._primitivesInfo = other._primitivesInfo ? {
|
|
19
19
|
vertices: other._primitivesInfo.vertices?.map((value)=>new Vector3(value)),
|
|
20
|
-
indices: other._primitivesInfo.indices?.map((value)=>value),
|
|
20
|
+
indices: other._primitivesInfo.indices?.map((value)=>value) ?? null,
|
|
21
21
|
primitiveType: other._primitivesInfo.primitiveType
|
|
22
22
|
} : null;
|
|
23
23
|
this._nodes = other._nodes ? other._nodes.map((value)=>{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"aabbtree.js","sources":["../../src/utility/aabbtree.ts"],"sourcesContent":["import type { TypedArray, Matrix4x4, Ray } from '@zephyr3d/base';\r\nimport { AABB, Vector3 } from '@zephyr3d/base';\r\nimport type { PrimitiveType } from '@zephyr3d/device';\r\n\r\ninterface PrimitivesInfo {\r\n vertices: Vector3[];\r\n indices: number[];\r\n primitiveType: PrimitiveType;\r\n}\r\n\r\ninterface AABBTreeNode {\r\n box: AABB;\r\n triangles: number[];\r\n axis: number;\r\n left: number;\r\n right: number;\r\n}\r\n\r\nconst tmpTriangle: [number, number, number] = [0, 0, 0];\r\n\r\n/**\r\n * Axis-Aligned Bounding Box Tree\r\n * @public\r\n */\r\nexport class AABBTree {\r\n /** @internal */\r\n private _primitivesInfo: PrimitivesInfo;\r\n /** @internal */\r\n private _nodes: AABBTreeNode[];\r\n /** Creates an empty AABB tree */\r\n constructor();\r\n /** Creates an AABB tree by copying from another AABB tree */\r\n constructor(rhs: AABBTree);\r\n constructor(other?: AABBTree) {\r\n this._primitivesInfo = null;\r\n this._nodes = null;\r\n if (other) {\r\n this._primitivesInfo = other._primitivesInfo\r\n ? {\r\n vertices: other._primitivesInfo.vertices?.map((value) => new Vector3(value)),\r\n indices: other._primitivesInfo.indices?.map((value) => value),\r\n primitiveType: other._primitivesInfo.primitiveType\r\n }\r\n : null;\r\n this._nodes = other._nodes\r\n ? other._nodes.map((value) => {\r\n return {\r\n box: new AABB(value.box),\r\n triangles: value.triangles?.map((val) => val),\r\n axis: value.axis,\r\n left: value.left,\r\n right: value.right\r\n };\r\n })\r\n : null;\r\n }\r\n }\r\n /**\r\n * Build the AABB tree from a polygon soup\r\n * @param vertices - Vertices of the polygon soup\r\n * @param indices - indices of the polygon soup\r\n * @param primitiveType - Prmitive type of the polygon soup\r\n */\r\n buildFromPrimitives(\r\n vertices: number[] | TypedArray,\r\n indices: number[] | TypedArray,\r\n primitiveType: PrimitiveType\r\n ): void {\r\n this._primitivesInfo = {\r\n vertices: [],\r\n indices: null,\r\n primitiveType: primitiveType\r\n };\r\n for (let i = 0; i < vertices.length; i += 3) {\r\n this._primitivesInfo.vertices.push(\r\n new Vector3(vertices[i] as number, vertices[i + 1] as number, vertices[i + 2] as number)\r\n );\r\n }\r\n if (indices) {\r\n this._primitivesInfo.indices = [];\r\n for (const index of indices) {\r\n this._primitivesInfo.indices.push(index as number);\r\n }\r\n }\r\n this._buildSubNodes();\r\n }\r\n /**\r\n * Checks for intersection between a ray and the AABB tree without calculating the intersection point\r\n * @param ray - The ray being traced\r\n * @returns true if the ray hits the AABB tree, false otherwise\r\n */\r\n rayIntersectionTest(ray: Ray): boolean {\r\n return this._nodes.length > 0 ? this._rayIntersectionTest(0, ray) : false;\r\n }\r\n /**\r\n * Checks for intersection between a ray and the AABB tree\r\n * @param ray - The ray being traced\r\n * @returns The distance between the ray origin and the hit point if the ray hits the AABB tree, null otherwise\r\n */\r\n rayIntersectionDistance(ray: Ray): number {\r\n return this._nodes.length > 0 ? this._rayIntersectionDistance(0, ray) : null;\r\n }\r\n /**\r\n * Gets the top level bounding box of the tree\r\n * @returns The top level bounding box\r\n */\r\n getTopLevelAABB(): AABB {\r\n return this._nodes.length > 0 ? this._nodes[0].box : null;\r\n }\r\n /**\r\n * Transform the tree by a matrix\r\n * @param matrix - The transform matrix\r\n */\r\n transform(matrix: Matrix4x4): void {\r\n if (matrix && this._primitivesInfo && this._primitivesInfo.vertices) {\r\n for (const vert of this._primitivesInfo.vertices) {\r\n matrix.transformPointAffine(vert, vert);\r\n }\r\n this._buildSubNodes();\r\n }\r\n }\r\n /** @internal */\r\n verify() {\r\n const numTris = this._verifyNode(0);\r\n const n = this._getNumTriangles();\r\n if (numTris !== n) {\r\n throw new Error(`AABB tree verification failed: triangle count mismatch, got ${numTris}, expect ${n}`);\r\n }\r\n }\r\n /** @internal */\r\n private _verifyNode(nodeIndex: number): number {\r\n const node = this._nodes[nodeIndex];\r\n if (!node) {\r\n throw new Error(`AABB tree verification failed: invalid node index: ${nodeIndex}`);\r\n }\r\n let numTris = 0;\r\n const extents = node.box.extents[node.axis];\r\n const tmpTri: [number, number, number] = [0, 0, 0];\r\n for (const tri of node.triangles) {\r\n this._getTriangle(tri, tmpTri);\r\n let max = Number.MIN_VALUE;\r\n let min = Number.MAX_VALUE;\r\n for (const v of tmpTri) {\r\n const p = this._primitivesInfo.vertices[v];\r\n if (!node.box.containsPoint(p)) {\r\n throw new Error(`AABB tree verification failed: triangle not inside AABB`);\r\n }\r\n const t = p[node.axis];\r\n if (t < min) {\r\n min = t;\r\n }\r\n if (t > max) {\r\n max = t;\r\n }\r\n if (max - min <= extents) {\r\n throw new Error(`AABB tree verification failed: extents test failed`);\r\n }\r\n }\r\n }\r\n numTris += node.triangles.length;\r\n if (node.left >= 0) {\r\n numTris += this._verifyNode(node.left);\r\n }\r\n if (node.right >= 0) {\r\n numTris += this._verifyNode(node.right);\r\n }\r\n return numTris;\r\n }\r\n /** @internal */\r\n private _buildNode(\r\n nodeIndex: number,\r\n triangles: number[],\r\n triangleMin: [number, number, number][],\r\n triangleMax: [number, number, number][]\r\n ) {\r\n const node = this._nodes[nodeIndex];\r\n if (triangles.length === 1) {\r\n node.triangles.push(triangles[0]);\r\n } else {\r\n const splitAxis = (node.axis = this._selectBestSplitAxis(\r\n node.box.extents,\r\n triangles,\r\n triangleMin,\r\n triangleMax\r\n ));\r\n const sizeMax = node.box.extents[splitAxis];\r\n const sizeCenter = node.box.center[splitAxis];\r\n const sizeLeft = sizeCenter - node.box.extents[splitAxis] * 0.5;\r\n const leftTriangles: number[] = [];\r\n const rightTriangles: number[] = [];\r\n const leftbox = new AABB();\r\n leftbox.beginExtend();\r\n const rightbox = new AABB();\r\n rightbox.beginExtend();\r\n for (const tri of triangles) {\r\n const min = triangleMin[tri];\r\n const max = triangleMax[tri];\r\n const size = max[splitAxis] - min[splitAxis];\r\n if (size >= sizeMax) {\r\n node.triangles.push(tri);\r\n } else if (max[splitAxis] <= sizeCenter || min[splitAxis] <= sizeLeft) {\r\n leftTriangles.push(tri);\r\n leftbox.extend3(min[0], min[1], min[2]);\r\n leftbox.extend3(max[0], max[1], max[2]);\r\n } else {\r\n rightTriangles.push(tri);\r\n rightbox.extend3(min[0], min[1], min[2]);\r\n rightbox.extend3(max[0], max[1], max[2]);\r\n }\r\n }\r\n if (leftTriangles.length) {\r\n this._nodes.push({\r\n box: leftbox,\r\n triangles: [],\r\n axis: -1,\r\n left: -1,\r\n right: -1\r\n });\r\n node.left = this._nodes.length - 1;\r\n this._buildNode(this._nodes.length - 1, leftTriangles, triangleMin, triangleMax);\r\n }\r\n if (rightTriangles.length) {\r\n this._nodes.push({\r\n box: rightbox,\r\n triangles: [],\r\n axis: -1,\r\n left: -1,\r\n right: -1\r\n });\r\n node.right = this._nodes.length - 1;\r\n this._buildNode(this._nodes.length - 1, rightTriangles, triangleMin, triangleMax);\r\n }\r\n }\r\n }\r\n /** @internal */\r\n private _selectBestSplitAxis(\r\n extents: Vector3,\r\n triangles: number[],\r\n triangleMin: [number, number, number][],\r\n triangleMax: [number, number, number][]\r\n ): number {\r\n const dx = extents.x,\r\n dy = extents.y,\r\n dz = extents.z;\r\n let nx = 0,\r\n ny = 0,\r\n nz = 0;\r\n for (const tri of triangles) {\r\n const max = triangleMax[tri];\r\n const min = triangleMin[tri];\r\n if (max[0] - min[0] >= dx) {\r\n nx++;\r\n }\r\n if (max[1] - min[1] >= dy) {\r\n ny++;\r\n }\r\n if (max[2] - min[2] >= dz) {\r\n nz++;\r\n }\r\n }\r\n if (nx < ny) {\r\n if (nx < nz) {\r\n return 0;\r\n } else {\r\n return nx === nz ? (dx > dz ? 0 : 2) : 2;\r\n }\r\n } else if (nx == ny) {\r\n if (nz < nx) {\r\n return 2;\r\n } else if (nz > nx) {\r\n return dx > dy ? 0 : 1;\r\n } else {\r\n if (dx < dy) {\r\n return dy > dz ? 1 : 2;\r\n } else {\r\n return dx > dz ? 0 : 2;\r\n }\r\n }\r\n } else {\r\n if (ny < nz) {\r\n return 1;\r\n } else {\r\n return ny === nz ? (dy > dz ? 1 : 2) : 2;\r\n }\r\n }\r\n }\r\n /** @internal */\r\n private _getNumTriangles() {\r\n const numIndices = this._primitivesInfo.indices\r\n ? this._primitivesInfo.indices.length\r\n : this._primitivesInfo.vertices.length;\r\n switch (this._primitivesInfo.primitiveType) {\r\n case 'triangle-list':\r\n return Math.floor(numIndices / 3);\r\n case 'triangle-strip':\r\n return numIndices - 2;\r\n case 'triangle-fan':\r\n return numIndices - 2;\r\n default:\r\n return 0;\r\n }\r\n }\r\n /** @internal */\r\n private _rayIntersectionDistance(nodeIndex: number, ray: Ray): number {\r\n const node = this._nodes[nodeIndex];\r\n if (!ray.bboxIntersectionTest(node.box)) {\r\n return null;\r\n }\r\n let minDist = Number.MAX_VALUE;\r\n for (const tri of node.triangles) {\r\n this._getTriangle(tri, tmpTriangle);\r\n const v0 = this._primitivesInfo.vertices[tmpTriangle[0]];\r\n const v1 = this._primitivesInfo.vertices[tmpTriangle[1]];\r\n const v2 = this._primitivesInfo.vertices[tmpTriangle[2]];\r\n const dist = ray.intersectionTestTriangle(v0, v1, v2, false);\r\n if (dist !== null && dist >= 0 && dist < minDist) {\r\n minDist = dist;\r\n }\r\n }\r\n let a: number, b: number;\r\n if (node.axis >= 0) {\r\n if (ray.direction[node.axis] < 0) {\r\n a = node.right;\r\n b = node.left;\r\n } else {\r\n a = node.left;\r\n b = node.right;\r\n }\r\n if (a >= 0) {\r\n const dist = this._rayIntersectionDistance(a, ray);\r\n if (dist !== null && dist >= 0 && dist < minDist) {\r\n minDist = dist;\r\n }\r\n }\r\n if (b >= 0) {\r\n const dist = this._rayIntersectionDistance(b, ray);\r\n if (dist !== null && dist >= 0 && dist < minDist) {\r\n minDist = dist;\r\n }\r\n }\r\n }\r\n return minDist === Number.MAX_VALUE ? null : minDist;\r\n }\r\n /** @internal */\r\n private _rayIntersectionTest(nodeIndex: number, ray: Ray): boolean {\r\n const node = this._nodes[nodeIndex];\r\n if (!ray.bboxIntersectionTest(node.box)) {\r\n return false;\r\n }\r\n for (const tri of node.triangles) {\r\n this._getTriangle(tri, tmpTriangle);\r\n const v0 = this._primitivesInfo.vertices[tmpTriangle[0]];\r\n const v1 = this._primitivesInfo.vertices[tmpTriangle[1]];\r\n const v2 = this._primitivesInfo.vertices[tmpTriangle[2]];\r\n const dist = ray.intersectionTestTriangle(v0, v1, v2, false);\r\n if (dist !== null && dist > 0) {\r\n return true;\r\n }\r\n }\r\n let a: number, b: number;\r\n if (node.axis >= 0) {\r\n if (ray.direction[node.axis] < 0) {\r\n a = node.right;\r\n b = node.left;\r\n } else {\r\n a = node.left;\r\n b = node.right;\r\n }\r\n if (a >= 0 && this._rayIntersectionTest(a, ray)) {\r\n return true;\r\n }\r\n if (b >= 0 && this._rayIntersectionTest(b, ray)) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n /** @internal */\r\n private _getTriangle(n: number, out: [number, number, number]): [number, number, number] {\r\n const indices = this._primitivesInfo.indices;\r\n let v0: number, v1: number, v2: number;\r\n out = out || [0, 0, 0];\r\n switch (this._primitivesInfo.primitiveType) {\r\n case 'triangle-list':\r\n v0 = n * 3;\r\n v1 = v0 + 1;\r\n v2 = v0 + 2;\r\n break;\r\n case 'triangle-strip': {\r\n const r = n % 2;\r\n v0 = n + r;\r\n v1 = n - r + 1;\r\n v2 = n + 2;\r\n break;\r\n }\r\n case 'triangle-fan':\r\n v0 = 0;\r\n v1 = n + 1;\r\n v2 = n + 2;\r\n break;\r\n default:\r\n return null;\r\n }\r\n out[0] = indices ? indices[v0] : v0;\r\n out[1] = indices ? indices[v1] : v1;\r\n out[2] = indices ? indices[v2] : v2;\r\n return out;\r\n }\r\n /** @internal */\r\n _buildSubNodes() {\r\n const triangleMin: [number, number, number][] = [];\r\n const triangleMax: [number, number, number][] = [];\r\n const triangles: number[] = [];\r\n const numTriangles = this._getNumTriangles();\r\n const rootNode = {\r\n box: new AABB(),\r\n triangles: [],\r\n axis: -1,\r\n left: -1,\r\n right: -1\r\n };\r\n rootNode.box.beginExtend();\r\n for (let i = 0; i < numTriangles; i++) {\r\n triangles.push(i);\r\n this._getTriangle(i, tmpTriangle);\r\n const v0 = this._primitivesInfo.vertices[tmpTriangle[0]];\r\n const v1 = this._primitivesInfo.vertices[tmpTriangle[1]];\r\n const v2 = this._primitivesInfo.vertices[tmpTriangle[2]];\r\n const min: [number, number, number] = [\r\n Math.min(Math.min(v0.x, v1.x), v2.x),\r\n Math.min(Math.min(v0.y, v1.y), v2.y),\r\n Math.min(Math.min(v0.z, v1.z), v2.z)\r\n ];\r\n rootNode.box.extend3(min[0], min[1], min[2]);\r\n triangleMin.push(min);\r\n const max: [number, number, number] = [\r\n Math.max(Math.max(v0.x, v1.x), v2.x),\r\n Math.max(Math.max(v0.y, v1.y), v2.y),\r\n Math.max(Math.max(v0.z, v1.z), v2.z)\r\n ];\r\n rootNode.box.extend3(max[0], max[1], max[2]);\r\n triangleMax.push(max);\r\n }\r\n if (rootNode.box.isValid()) {\r\n this._nodes = [rootNode];\r\n this._buildNode(0, triangles, triangleMin, triangleMax);\r\n } else {\r\n this._nodes = [];\r\n }\r\n }\r\n}\r\n"],"names":["tmpTriangle","AABBTree","other","_primitivesInfo","_nodes","vertices","map","value","Vector3","indices","primitiveType","box","AABB","triangles","val","axis","left","right","buildFromPrimitives","i","length","push","index","_buildSubNodes","rayIntersectionTest","ray","_rayIntersectionTest","rayIntersectionDistance","_rayIntersectionDistance","getTopLevelAABB","transform","matrix","vert","transformPointAffine","verify","numTris","_verifyNode","n","_getNumTriangles","Error","nodeIndex","node","extents","tmpTri","tri","_getTriangle","max","Number","MIN_VALUE","min","MAX_VALUE","v","p","containsPoint","t","_buildNode","triangleMin","triangleMax","splitAxis","_selectBestSplitAxis","sizeMax","sizeCenter","center","sizeLeft","leftTriangles","rightTriangles","leftbox","beginExtend","rightbox","size","extend3","dx","x","dy","y","dz","z","nx","ny","nz","numIndices","Math","floor","bboxIntersectionTest","minDist","v0","v1","v2","dist","intersectionTestTriangle","a","b","direction","out","r","numTriangles","rootNode","isValid"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"aabbtree.js","sources":["../../src/utility/aabbtree.ts"],"sourcesContent":["import type { TypedArray, Matrix4x4, Ray, Nullable } from '@zephyr3d/base';\r\nimport { AABB, Vector3 } from '@zephyr3d/base';\r\nimport type { PrimitiveType } from '@zephyr3d/device';\r\n\r\ninterface PrimitivesInfo {\r\n vertices: Vector3[];\r\n indices: Nullable<number[]>;\r\n primitiveType: PrimitiveType;\r\n}\r\n\r\ninterface AABBTreeNode {\r\n box: AABB;\r\n triangles: number[];\r\n axis: number;\r\n left: number;\r\n right: number;\r\n}\r\n\r\nconst tmpTriangle: [number, number, number] = [0, 0, 0];\r\n\r\n/**\r\n * Axis-Aligned Bounding Box Tree\r\n * @public\r\n */\r\nexport class AABBTree {\r\n /** @internal */\r\n private _primitivesInfo: Nullable<PrimitivesInfo>;\r\n /** @internal */\r\n private _nodes: Nullable<AABBTreeNode[]>;\r\n /** Creates an empty AABB tree */\r\n constructor();\r\n /** Creates an AABB tree by copying from another AABB tree */\r\n constructor(rhs: AABBTree);\r\n constructor(other?: AABBTree) {\r\n this._primitivesInfo = null;\r\n this._nodes = null;\r\n if (other) {\r\n this._primitivesInfo = other._primitivesInfo\r\n ? {\r\n vertices: other._primitivesInfo.vertices?.map((value) => new Vector3(value)),\r\n indices: other._primitivesInfo.indices?.map((value) => value) ?? null,\r\n primitiveType: other._primitivesInfo.primitiveType\r\n }\r\n : null;\r\n this._nodes = other._nodes\r\n ? other._nodes.map((value) => {\r\n return {\r\n box: new AABB(value.box),\r\n triangles: value.triangles?.map((val) => val),\r\n axis: value.axis,\r\n left: value.left,\r\n right: value.right\r\n };\r\n })\r\n : null;\r\n }\r\n }\r\n /**\r\n * Build the AABB tree from a polygon soup\r\n * @param vertices - Vertices of the polygon soup\r\n * @param indices - indices of the polygon soup\r\n * @param primitiveType - Prmitive type of the polygon soup\r\n */\r\n buildFromPrimitives(\r\n vertices: number[] | TypedArray,\r\n indices: number[] | TypedArray,\r\n primitiveType: PrimitiveType\r\n ) {\r\n this._primitivesInfo = {\r\n vertices: [],\r\n indices: null,\r\n primitiveType: primitiveType\r\n };\r\n for (let i = 0; i < vertices.length; i += 3) {\r\n this._primitivesInfo.vertices.push(\r\n new Vector3(vertices[i] as number, vertices[i + 1] as number, vertices[i + 2] as number)\r\n );\r\n }\r\n if (indices) {\r\n this._primitivesInfo.indices = [];\r\n for (const index of indices) {\r\n this._primitivesInfo.indices.push(index as number);\r\n }\r\n }\r\n this._buildSubNodes();\r\n }\r\n /**\r\n * Checks for intersection between a ray and the AABB tree without calculating the intersection point\r\n * @param ray - The ray being traced\r\n * @returns true if the ray hits the AABB tree, false otherwise\r\n */\r\n rayIntersectionTest(ray: Ray) {\r\n return this._nodes!.length > 0 ? this._rayIntersectionTest(0, ray) : false;\r\n }\r\n /**\r\n * Checks for intersection between a ray and the AABB tree\r\n * @param ray - The ray being traced\r\n * @returns The distance between the ray origin and the hit point if the ray hits the AABB tree, null otherwise\r\n */\r\n rayIntersectionDistance(ray: Ray) {\r\n return this._nodes!.length > 0 ? this._rayIntersectionDistance(0, ray) : null;\r\n }\r\n /**\r\n * Gets the top level bounding box of the tree\r\n * @returns The top level bounding box\r\n */\r\n getTopLevelAABB() {\r\n return this._nodes!.length > 0 ? this._nodes![0].box : null;\r\n }\r\n /**\r\n * Transform the tree by a matrix\r\n * @param matrix - The transform matrix\r\n */\r\n transform(matrix: Matrix4x4) {\r\n if (matrix && this._primitivesInfo && this._primitivesInfo.vertices) {\r\n for (const vert of this._primitivesInfo.vertices) {\r\n matrix.transformPointAffine(vert, vert);\r\n }\r\n this._buildSubNodes();\r\n }\r\n }\r\n /** @internal */\r\n verify() {\r\n const numTris = this._verifyNode(0);\r\n const n = this._getNumTriangles();\r\n if (numTris !== n) {\r\n throw new Error(`AABB tree verification failed: triangle count mismatch, got ${numTris}, expect ${n}`);\r\n }\r\n }\r\n /** @internal */\r\n private _verifyNode(nodeIndex: number) {\r\n const node = this._nodes![nodeIndex];\r\n if (!node) {\r\n throw new Error(`AABB tree verification failed: invalid node index: ${nodeIndex}`);\r\n }\r\n let numTris = 0;\r\n const extents = node.box.extents[node.axis];\r\n const tmpTri: [number, number, number] = [0, 0, 0];\r\n for (const tri of node.triangles) {\r\n this._getTriangle(tri, tmpTri);\r\n let max = Number.MIN_VALUE;\r\n let min = Number.MAX_VALUE;\r\n for (const v of tmpTri) {\r\n const p = this._primitivesInfo!.vertices[v];\r\n if (!node.box.containsPoint(p)) {\r\n throw new Error(`AABB tree verification failed: triangle not inside AABB`);\r\n }\r\n const t = p[node.axis];\r\n if (t < min) {\r\n min = t;\r\n }\r\n if (t > max) {\r\n max = t;\r\n }\r\n if (max - min <= extents) {\r\n throw new Error(`AABB tree verification failed: extents test failed`);\r\n }\r\n }\r\n }\r\n numTris += node.triangles.length;\r\n if (node.left >= 0) {\r\n numTris += this._verifyNode(node.left);\r\n }\r\n if (node.right >= 0) {\r\n numTris += this._verifyNode(node.right);\r\n }\r\n return numTris;\r\n }\r\n /** @internal */\r\n private _buildNode(\r\n nodeIndex: number,\r\n triangles: number[],\r\n triangleMin: [number, number, number][],\r\n triangleMax: [number, number, number][]\r\n ) {\r\n const node = this._nodes![nodeIndex];\r\n if (triangles.length === 1) {\r\n node.triangles.push(triangles[0]);\r\n } else {\r\n const splitAxis = (node.axis = this._selectBestSplitAxis(\r\n node.box.extents,\r\n triangles,\r\n triangleMin,\r\n triangleMax\r\n ));\r\n const sizeMax = node.box.extents[splitAxis];\r\n const sizeCenter = node.box.center[splitAxis];\r\n const sizeLeft = sizeCenter - node.box.extents[splitAxis] * 0.5;\r\n const leftTriangles: number[] = [];\r\n const rightTriangles: number[] = [];\r\n const leftbox = new AABB();\r\n leftbox.beginExtend();\r\n const rightbox = new AABB();\r\n rightbox.beginExtend();\r\n for (const tri of triangles) {\r\n const min = triangleMin[tri];\r\n const max = triangleMax[tri];\r\n const size = max[splitAxis] - min[splitAxis];\r\n if (size >= sizeMax) {\r\n node.triangles.push(tri);\r\n } else if (max[splitAxis] <= sizeCenter || min[splitAxis] <= sizeLeft) {\r\n leftTriangles.push(tri);\r\n leftbox.extend3(min[0], min[1], min[2]);\r\n leftbox.extend3(max[0], max[1], max[2]);\r\n } else {\r\n rightTriangles.push(tri);\r\n rightbox.extend3(min[0], min[1], min[2]);\r\n rightbox.extend3(max[0], max[1], max[2]);\r\n }\r\n }\r\n if (leftTriangles.length) {\r\n this._nodes!.push({\r\n box: leftbox,\r\n triangles: [],\r\n axis: -1,\r\n left: -1,\r\n right: -1\r\n });\r\n node.left = this._nodes!.length - 1;\r\n this._buildNode(this._nodes!.length - 1, leftTriangles, triangleMin, triangleMax);\r\n }\r\n if (rightTriangles.length) {\r\n this._nodes!.push({\r\n box: rightbox,\r\n triangles: [],\r\n axis: -1,\r\n left: -1,\r\n right: -1\r\n });\r\n node.right = this._nodes!.length - 1;\r\n this._buildNode(this._nodes!.length - 1, rightTriangles, triangleMin, triangleMax);\r\n }\r\n }\r\n }\r\n /** @internal */\r\n private _selectBestSplitAxis(\r\n extents: Vector3,\r\n triangles: number[],\r\n triangleMin: [number, number, number][],\r\n triangleMax: [number, number, number][]\r\n ) {\r\n const dx = extents.x,\r\n dy = extents.y,\r\n dz = extents.z;\r\n let nx = 0,\r\n ny = 0,\r\n nz = 0;\r\n for (const tri of triangles) {\r\n const max = triangleMax[tri];\r\n const min = triangleMin[tri];\r\n if (max[0] - min[0] >= dx) {\r\n nx++;\r\n }\r\n if (max[1] - min[1] >= dy) {\r\n ny++;\r\n }\r\n if (max[2] - min[2] >= dz) {\r\n nz++;\r\n }\r\n }\r\n if (nx < ny) {\r\n if (nx < nz) {\r\n return 0;\r\n } else {\r\n return nx === nz ? (dx > dz ? 0 : 2) : 2;\r\n }\r\n } else if (nx == ny) {\r\n if (nz < nx) {\r\n return 2;\r\n } else if (nz > nx) {\r\n return dx > dy ? 0 : 1;\r\n } else {\r\n if (dx < dy) {\r\n return dy > dz ? 1 : 2;\r\n } else {\r\n return dx > dz ? 0 : 2;\r\n }\r\n }\r\n } else {\r\n if (ny < nz) {\r\n return 1;\r\n } else {\r\n return ny === nz ? (dy > dz ? 1 : 2) : 2;\r\n }\r\n }\r\n }\r\n /** @internal */\r\n private _getNumTriangles() {\r\n const numIndices = this._primitivesInfo!.indices\r\n ? this._primitivesInfo!.indices.length\r\n : this._primitivesInfo!.vertices.length;\r\n switch (this._primitivesInfo!.primitiveType) {\r\n case 'triangle-list':\r\n return Math.floor(numIndices / 3);\r\n case 'triangle-strip':\r\n return numIndices - 2;\r\n case 'triangle-fan':\r\n return numIndices - 2;\r\n default:\r\n return 0;\r\n }\r\n }\r\n /** @internal */\r\n private _rayIntersectionDistance(nodeIndex: number, ray: Ray) {\r\n const node = this._nodes![nodeIndex];\r\n if (!ray.bboxIntersectionTest(node.box)) {\r\n return null;\r\n }\r\n let minDist = Number.MAX_VALUE;\r\n for (const tri of node.triangles) {\r\n this._getTriangle(tri, tmpTriangle);\r\n const v0 = this._primitivesInfo!.vertices[tmpTriangle[0]];\r\n const v1 = this._primitivesInfo!.vertices[tmpTriangle[1]];\r\n const v2 = this._primitivesInfo!.vertices[tmpTriangle[2]];\r\n const dist = ray.intersectionTestTriangle(v0, v1, v2, false);\r\n if (dist !== null && dist >= 0 && dist < minDist) {\r\n minDist = dist;\r\n }\r\n }\r\n let a: number, b: number;\r\n if (node.axis >= 0) {\r\n if (ray.direction[node.axis] < 0) {\r\n a = node.right;\r\n b = node.left;\r\n } else {\r\n a = node.left;\r\n b = node.right;\r\n }\r\n if (a >= 0) {\r\n const dist = this._rayIntersectionDistance(a, ray);\r\n if (dist !== null && dist >= 0 && dist < minDist) {\r\n minDist = dist;\r\n }\r\n }\r\n if (b >= 0) {\r\n const dist = this._rayIntersectionDistance(b, ray);\r\n if (dist !== null && dist >= 0 && dist < minDist) {\r\n minDist = dist;\r\n }\r\n }\r\n }\r\n return minDist === Number.MAX_VALUE ? null : minDist;\r\n }\r\n /** @internal */\r\n private _rayIntersectionTest(nodeIndex: number, ray: Ray) {\r\n const node = this._nodes![nodeIndex];\r\n if (!ray.bboxIntersectionTest(node.box)) {\r\n return false;\r\n }\r\n for (const tri of node.triangles) {\r\n this._getTriangle(tri, tmpTriangle);\r\n const v0 = this._primitivesInfo!.vertices[tmpTriangle[0]];\r\n const v1 = this._primitivesInfo!.vertices[tmpTriangle[1]];\r\n const v2 = this._primitivesInfo!.vertices[tmpTriangle[2]];\r\n const dist = ray.intersectionTestTriangle(v0, v1, v2, false);\r\n if (dist !== null && dist > 0) {\r\n return true;\r\n }\r\n }\r\n let a: number, b: number;\r\n if (node.axis >= 0) {\r\n if (ray.direction[node.axis] < 0) {\r\n a = node.right;\r\n b = node.left;\r\n } else {\r\n a = node.left;\r\n b = node.right;\r\n }\r\n if (a >= 0 && this._rayIntersectionTest(a, ray)) {\r\n return true;\r\n }\r\n if (b >= 0 && this._rayIntersectionTest(b, ray)) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n /** @internal */\r\n private _getTriangle(n: number, out: [number, number, number]) {\r\n const indices = this._primitivesInfo!.indices;\r\n let v0: number, v1: number, v2: number;\r\n out = out || [0, 0, 0];\r\n switch (this._primitivesInfo!.primitiveType) {\r\n case 'triangle-list':\r\n v0 = n * 3;\r\n v1 = v0 + 1;\r\n v2 = v0 + 2;\r\n break;\r\n case 'triangle-strip': {\r\n const r = n % 2;\r\n v0 = n + r;\r\n v1 = n - r + 1;\r\n v2 = n + 2;\r\n break;\r\n }\r\n case 'triangle-fan':\r\n v0 = 0;\r\n v1 = n + 1;\r\n v2 = n + 2;\r\n break;\r\n default:\r\n return null;\r\n }\r\n out[0] = indices ? indices[v0] : v0;\r\n out[1] = indices ? indices[v1] : v1;\r\n out[2] = indices ? indices[v2] : v2;\r\n return out;\r\n }\r\n /** @internal */\r\n _buildSubNodes() {\r\n const triangleMin: [number, number, number][] = [];\r\n const triangleMax: [number, number, number][] = [];\r\n const triangles: number[] = [];\r\n const numTriangles = this._getNumTriangles();\r\n const rootNode = {\r\n box: new AABB(),\r\n triangles: [],\r\n axis: -1,\r\n left: -1,\r\n right: -1\r\n };\r\n rootNode.box.beginExtend();\r\n for (let i = 0; i < numTriangles; i++) {\r\n triangles.push(i);\r\n this._getTriangle(i, tmpTriangle);\r\n const v0 = this._primitivesInfo!.vertices[tmpTriangle[0]];\r\n const v1 = this._primitivesInfo!.vertices[tmpTriangle[1]];\r\n const v2 = this._primitivesInfo!.vertices[tmpTriangle[2]];\r\n const min: [number, number, number] = [\r\n Math.min(Math.min(v0.x, v1.x), v2.x),\r\n Math.min(Math.min(v0.y, v1.y), v2.y),\r\n Math.min(Math.min(v0.z, v1.z), v2.z)\r\n ];\r\n rootNode.box.extend3(min[0], min[1], min[2]);\r\n triangleMin.push(min);\r\n const max: [number, number, number] = [\r\n Math.max(Math.max(v0.x, v1.x), v2.x),\r\n Math.max(Math.max(v0.y, v1.y), v2.y),\r\n Math.max(Math.max(v0.z, v1.z), v2.z)\r\n ];\r\n rootNode.box.extend3(max[0], max[1], max[2]);\r\n triangleMax.push(max);\r\n }\r\n if (rootNode.box.isValid()) {\r\n this._nodes = [rootNode];\r\n this._buildNode(0, triangles, triangleMin, triangleMax);\r\n } else {\r\n this._nodes = [];\r\n }\r\n }\r\n}\r\n"],"names":["tmpTriangle","AABBTree","other","_primitivesInfo","_nodes","vertices","map","value","Vector3","indices","primitiveType","box","AABB","triangles","val","axis","left","right","buildFromPrimitives","i","length","push","index","_buildSubNodes","rayIntersectionTest","ray","_rayIntersectionTest","rayIntersectionDistance","_rayIntersectionDistance","getTopLevelAABB","transform","matrix","vert","transformPointAffine","verify","numTris","_verifyNode","n","_getNumTriangles","Error","nodeIndex","node","extents","tmpTri","tri","_getTriangle","max","Number","MIN_VALUE","min","MAX_VALUE","v","p","containsPoint","t","_buildNode","triangleMin","triangleMax","splitAxis","_selectBestSplitAxis","sizeMax","sizeCenter","center","sizeLeft","leftTriangles","rightTriangles","leftbox","beginExtend","rightbox","size","extend3","dx","x","dy","y","dz","z","nx","ny","nz","numIndices","Math","floor","bboxIntersectionTest","minDist","v0","v1","v2","dist","intersectionTestTriangle","a","b","direction","out","r","numTriangles","rootNode","isValid"],"mappings":"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"}
|