@plastic-software/three 0.174.0 → 0.175.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/three.cjs +10655 -1446
- package/build/three.core.js +9626 -1094
- package/build/three.core.min.js +1 -1
- package/build/three.module.js +834 -157
- package/build/three.module.min.js +1 -1
- package/build/three.tsl.js +4 -2
- package/build/three.tsl.min.js +1 -1
- package/build/three.webgpu.js +2658 -1697
- package/build/three.webgpu.min.js +1 -1
- package/build/three.webgpu.nodes.js +2654 -1709
- package/build/three.webgpu.nodes.min.js +1 -1
- package/examples/jsm/Addons.js +1 -1
- package/examples/jsm/animation/AnimationClipCreator.js +57 -6
- package/examples/jsm/animation/CCDIKSolver.js +93 -39
- package/examples/jsm/capabilities/WebGL.js +28 -3
- package/examples/jsm/capabilities/WebGPU.js +16 -6
- package/examples/jsm/controls/ArcballControls.js +424 -154
- package/examples/jsm/controls/DragControls.js +93 -2
- package/examples/jsm/controls/FirstPersonControls.js +113 -4
- package/examples/jsm/controls/FlyControls.js +49 -2
- package/examples/jsm/controls/MapControls.js +42 -9
- package/examples/jsm/controls/OrbitControls.js +345 -42
- package/examples/jsm/controls/PointerLockControls.js +111 -9
- package/examples/jsm/controls/TrackballControls.js +159 -8
- package/examples/jsm/controls/TransformControls.js +252 -6
- package/examples/jsm/csm/CSM.js +226 -15
- package/examples/jsm/csm/CSMFrustum.js +52 -0
- package/examples/jsm/csm/CSMHelper.js +47 -0
- package/examples/jsm/csm/CSMShader.js +10 -1
- package/examples/jsm/csm/CSMShadowNode.js +156 -13
- package/examples/jsm/curves/CurveExtras.js +289 -31
- package/examples/jsm/curves/NURBSCurve.js +57 -14
- package/examples/jsm/curves/NURBSSurface.js +50 -6
- package/examples/jsm/curves/NURBSUtils.js +96 -112
- package/examples/jsm/curves/NURBSVolume.js +22 -4
- package/examples/jsm/effects/AnaglyphEffect.js +30 -0
- package/examples/jsm/effects/AsciiEffect.js +60 -15
- package/examples/jsm/effects/OutlineEffect.js +59 -111
- package/examples/jsm/effects/ParallaxBarrierEffect.js +28 -0
- package/examples/jsm/effects/PeppersGhostEffect.js +21 -2
- package/examples/jsm/effects/StereoEffect.js +29 -0
- package/examples/jsm/environments/DebugEnvironment.js +49 -0
- package/examples/jsm/environments/RoomEnvironment.js +23 -4
- package/examples/jsm/exporters/DRACOExporter.js +53 -13
- package/examples/jsm/exporters/EXRExporter.js +37 -8
- package/examples/jsm/exporters/GLTFExporter.js +171 -48
- package/examples/jsm/exporters/KTX2Exporter.js +20 -0
- package/examples/jsm/exporters/OBJExporter.js +18 -0
- package/examples/jsm/exporters/PLYExporter.js +39 -9
- package/examples/jsm/exporters/STLExporter.js +25 -5
- package/examples/jsm/exporters/USDZExporter.js +70 -3
- package/examples/jsm/geometries/BoxLineGeometry.js +22 -0
- package/examples/jsm/geometries/ConvexGeometry.js +18 -0
- package/examples/jsm/geometries/DecalGeometry.js +20 -9
- package/examples/jsm/geometries/ParametricFunctions.js +97 -0
- package/examples/jsm/geometries/ParametricGeometry.js +37 -5
- package/examples/jsm/geometries/RoundedBoxGeometry.js +21 -0
- package/examples/jsm/geometries/TeapotGeometry.js +22 -38
- package/examples/jsm/geometries/TextGeometry.js +44 -16
- package/examples/jsm/helpers/LightProbeHelper.js +35 -0
- package/examples/jsm/helpers/LightProbeHelperGPU.js +36 -0
- package/examples/jsm/helpers/OctreeHelper.js +35 -0
- package/examples/jsm/helpers/PositionalAudioHelper.js +59 -0
- package/examples/jsm/helpers/RectAreaLightHelper.js +35 -3
- package/examples/jsm/helpers/TextureHelper.js +27 -0
- package/examples/jsm/helpers/TextureHelperGPU.js +28 -0
- package/examples/jsm/helpers/VertexNormalsHelper.js +58 -2
- package/examples/jsm/helpers/VertexTangentsHelper.js +46 -2
- package/examples/jsm/helpers/ViewHelper.js +75 -1
- package/examples/jsm/interactive/HTMLMesh.js +25 -0
- package/examples/jsm/interactive/InteractiveGroup.js +65 -5
- package/examples/jsm/interactive/SelectionBox.js +74 -9
- package/examples/jsm/interactive/SelectionHelper.js +71 -29
- package/examples/jsm/libs/motion-controllers.module.js +1 -1
- package/examples/jsm/lighting/TiledLighting.js +23 -0
- package/examples/jsm/lights/LightProbeGenerator.js +26 -1
- package/examples/jsm/lights/RectAreaLightTexturesLib.js +48 -13
- package/examples/jsm/lights/RectAreaLightUniformsLib.js +15 -0
- package/examples/jsm/lines/Line2.js +36 -0
- package/examples/jsm/lines/LineGeometry.js +52 -0
- package/examples/jsm/lines/LineMaterial.js +95 -0
- package/examples/jsm/lines/LineSegments2.js +51 -2
- package/examples/jsm/lines/LineSegmentsGeometry.js +62 -8
- package/examples/jsm/lines/Wireframe.js +38 -2
- package/examples/jsm/lines/WireframeGeometry2.js +24 -0
- package/examples/jsm/lines/webgpu/Line2.js +25 -1
- package/examples/jsm/lines/webgpu/LineSegments2.js +44 -6
- package/examples/jsm/lines/webgpu/Wireframe.js +30 -2
- package/examples/jsm/loaders/3DMLoader.js +71 -2
- package/examples/jsm/loaders/3MFLoader.js +41 -3
- package/examples/jsm/loaders/AMFLoader.js +31 -12
- package/examples/jsm/loaders/BVHLoader.js +57 -11
- package/examples/jsm/loaders/ColladaLoader.js +35 -0
- package/examples/jsm/loaders/DDSLoader.js +24 -0
- package/examples/jsm/loaders/DRACOLoader.js +73 -1
- package/examples/jsm/loaders/EXRLoader.js +40 -8
- package/examples/jsm/loaders/FBXLoader.js +42 -14
- package/examples/jsm/loaders/FontLoader.js +60 -2
- package/examples/jsm/loaders/GCodeLoader.js +33 -5
- package/examples/jsm/loaders/GLTFLoader.js +218 -5
- package/examples/jsm/loaders/HDRCubeTextureLoader.js +48 -0
- package/examples/jsm/loaders/IESLoader.js +41 -0
- package/examples/jsm/loaders/KMZLoader.js +32 -0
- package/examples/jsm/loaders/KTX2Loader.js +86 -18
- package/examples/jsm/loaders/KTXLoader.js +26 -6
- package/examples/jsm/loaders/LDrawLoader.js +115 -5
- package/examples/jsm/loaders/LUT3dlLoader.js +46 -10
- package/examples/jsm/loaders/LUTCubeLoader.js +45 -9
- package/examples/jsm/loaders/LUTImageLoader.js +78 -38
- package/examples/jsm/loaders/LWOLoader.js +46 -7
- package/examples/jsm/loaders/LottieLoader.js +37 -0
- package/examples/jsm/loaders/MD2Loader.js +36 -1
- package/examples/jsm/loaders/MDDLoader.js +56 -12
- package/examples/jsm/loaders/MTLLoader.js +38 -33
- package/examples/jsm/loaders/MaterialXLoader.js +33 -0
- package/examples/jsm/loaders/NRRDLoader.js +36 -5
- package/examples/jsm/loaders/OBJLoader.js +48 -1
- package/examples/jsm/loaders/PCDLoader.js +47 -0
- package/examples/jsm/loaders/PDBLoader.js +40 -2
- package/examples/jsm/loaders/PLYLoader.js +62 -32
- package/examples/jsm/loaders/PVRLoader.js +23 -5
- package/examples/jsm/loaders/RGBELoader.js +38 -5
- package/examples/jsm/loaders/RGBMLoader.js +67 -1
- package/examples/jsm/loaders/STLLoader.js +47 -38
- package/examples/jsm/loaders/SVGLoader.js +113 -20
- package/examples/jsm/loaders/TDSLoader.js +81 -61
- package/examples/jsm/loaders/TGALoader.js +22 -0
- package/examples/jsm/loaders/TIFFLoader.js +22 -0
- package/examples/jsm/loaders/TTFLoader.js +36 -2
- package/examples/jsm/loaders/USDZLoader.js +34 -1
- package/examples/jsm/loaders/UltraHDRLoader.js +58 -12
- package/examples/jsm/loaders/VOXLoader.js +57 -0
- package/examples/jsm/loaders/VRMLLoader.js +32 -1
- package/examples/jsm/loaders/VTKLoader.js +38 -0
- package/examples/jsm/loaders/XYZLoader.js +35 -0
- package/examples/jsm/materials/LDrawConditionalLineMaterial.js +39 -0
- package/examples/jsm/materials/LDrawConditionalLineNodeMaterial.js +39 -0
- package/examples/jsm/materials/MeshPostProcessingMaterial.js +24 -2
- package/examples/jsm/math/Capsule.js +89 -14
- package/examples/jsm/math/ColorConverter.js +21 -0
- package/examples/jsm/math/ColorSpaces.js +53 -0
- package/examples/jsm/math/ConvexHull.js +514 -92
- package/examples/jsm/math/ImprovedNoise.js +14 -2
- package/examples/jsm/math/Lut.js +111 -0
- package/examples/jsm/math/MeshSurfaceSampler.js +76 -13
- package/examples/jsm/math/OBB.js +139 -46
- package/examples/jsm/math/Octree.js +132 -5
- package/examples/jsm/math/SimplexNoise.js +66 -42
- package/examples/jsm/misc/ConvexObjectBreaker.js +43 -25
- package/examples/jsm/misc/GPUComputationRenderer.js +92 -17
- package/examples/jsm/misc/Gyroscope.js +11 -0
- package/examples/jsm/misc/MD2Character.js +115 -2
- package/examples/jsm/misc/MD2CharacterComplex.js +170 -8
- package/examples/jsm/misc/MorphAnimMesh.js +43 -0
- package/examples/jsm/misc/MorphBlendMesh.js +102 -0
- package/examples/jsm/misc/ProgressiveLightMap.js +40 -15
- package/examples/jsm/misc/ProgressiveLightMapGPU.js +33 -13
- package/examples/jsm/misc/RollerCoaster.js +52 -0
- package/examples/jsm/misc/Timer.js +79 -2
- package/examples/jsm/misc/TubePainter.js +53 -0
- package/examples/jsm/misc/Volume.js +108 -72
- package/examples/jsm/misc/VolumeSlice.js +88 -45
- package/examples/jsm/modifiers/CurveModifier.js +57 -34
- package/examples/jsm/modifiers/CurveModifierGPU.js +36 -17
- package/examples/jsm/modifiers/EdgeSplitModifier.js +18 -0
- package/examples/jsm/modifiers/SimplifyModifier.js +20 -8
- package/examples/jsm/modifiers/TessellateModifier.js +33 -2
- package/examples/jsm/objects/GroundedSkybox.js +23 -5
- package/examples/jsm/objects/Lensflare.js +91 -2
- package/examples/jsm/objects/LensflareMesh.js +53 -2
- package/examples/jsm/objects/MarchingCubes.js +88 -5
- package/examples/jsm/objects/Reflector.js +70 -0
- package/examples/jsm/objects/ReflectorForSSRPass.js +39 -0
- package/examples/jsm/objects/Refractor.js +61 -0
- package/examples/jsm/objects/ShadowMesh.js +53 -4
- package/examples/jsm/objects/Sky.js +26 -9
- package/examples/jsm/objects/SkyMesh.js +60 -9
- package/examples/jsm/objects/Water.js +44 -5
- package/examples/jsm/objects/Water2.js +42 -3
- package/examples/jsm/objects/Water2Mesh.js +38 -3
- package/examples/jsm/objects/WaterMesh.js +94 -7
- package/examples/jsm/physics/AmmoPhysics.js +47 -0
- package/examples/jsm/physics/JoltPhysics.js +48 -0
- package/examples/jsm/physics/RapierPhysics.js +56 -0
- package/examples/jsm/postprocessing/AfterimagePass.js +90 -38
- package/examples/jsm/postprocessing/BloomPass.js +125 -24
- package/examples/jsm/postprocessing/BokehPass.js +98 -22
- package/examples/jsm/postprocessing/ClearPass.js +53 -3
- package/examples/jsm/postprocessing/CubeTexturePass.js +81 -21
- package/examples/jsm/postprocessing/DotScreenPass.js +58 -10
- package/examples/jsm/postprocessing/EffectComposer.js +131 -0
- package/examples/jsm/postprocessing/FilmPass.js +53 -5
- package/examples/jsm/postprocessing/GTAOPass.js +191 -48
- package/examples/jsm/postprocessing/GlitchPass.js +84 -33
- package/examples/jsm/postprocessing/HalftonePass.js +64 -10
- package/examples/jsm/postprocessing/LUTPass.js +37 -8
- package/examples/jsm/postprocessing/MaskPass.js +90 -0
- package/examples/jsm/postprocessing/OutlinePass.js +266 -133
- package/examples/jsm/postprocessing/OutputPass.js +53 -14
- package/examples/jsm/postprocessing/Pass.js +98 -4
- package/examples/jsm/postprocessing/RenderPass.js +83 -0
- package/examples/jsm/postprocessing/RenderPixelatedPass.js +123 -45
- package/examples/jsm/postprocessing/RenderTransitionPass.js +119 -21
- package/examples/jsm/postprocessing/SAOPass.js +126 -53
- package/examples/jsm/postprocessing/SMAAPass.js +103 -71
- package/examples/jsm/postprocessing/SSAARenderPass.js +117 -35
- package/examples/jsm/postprocessing/SSAOPass.js +160 -47
- package/examples/jsm/postprocessing/SSRPass.js +230 -49
- package/examples/jsm/postprocessing/SavePass.js +68 -16
- package/examples/jsm/postprocessing/ShaderPass.js +64 -7
- package/examples/jsm/postprocessing/TAARenderPass.js +78 -24
- package/examples/jsm/postprocessing/TexturePass.js +71 -8
- package/examples/jsm/postprocessing/UnrealBloomPass.js +113 -37
- package/examples/jsm/renderers/CSS2DRenderer.js +77 -1
- package/examples/jsm/renderers/CSS3DRenderer.js +99 -3
- package/examples/jsm/renderers/Projector.js +18 -2
- package/examples/jsm/renderers/SVGRenderer.js +124 -0
- package/examples/jsm/shaders/ACESFilmicToneMappingShader.js +9 -5
- package/examples/jsm/shaders/AfterimageShader.js +6 -4
- package/examples/jsm/shaders/BasicShader.js +6 -2
- package/examples/jsm/shaders/BleachBypassShader.js +8 -4
- package/examples/jsm/shaders/BlendShader.js +6 -2
- package/examples/jsm/shaders/BokehShader.js +7 -4
- package/examples/jsm/shaders/BokehShader2.js +7 -3
- package/examples/jsm/shaders/BrightnessContrastShader.js +8 -5
- package/examples/jsm/shaders/ColorCorrectionShader.js +6 -2
- package/examples/jsm/shaders/ColorifyShader.js +6 -2
- package/examples/jsm/shaders/ConvolutionShader.js +7 -39
- package/examples/jsm/shaders/CopyShader.js +6 -2
- package/examples/jsm/shaders/DOFMipMapShader.js +8 -4
- package/examples/jsm/shaders/DepthLimitedBlurShader.js +7 -1
- package/examples/jsm/shaders/DigitalGlitch.js +7 -7
- package/examples/jsm/shaders/DotScreenShader.js +6 -4
- package/examples/jsm/shaders/ExposureShader.js +6 -2
- package/examples/jsm/shaders/FXAAShader.js +15 -7
- package/examples/jsm/shaders/FilmShader.js +10 -0
- package/examples/jsm/shaders/FocusShader.js +6 -4
- package/examples/jsm/shaders/FreiChenShader.js +7 -3
- package/examples/jsm/shaders/GTAOShader.js +33 -39
- package/examples/jsm/shaders/GammaCorrectionShader.js +8 -2
- package/examples/jsm/shaders/GodRaysShader.js +14 -5
- package/examples/jsm/shaders/HalftoneShader.js +11 -5
- package/examples/jsm/shaders/HorizontalBlurShader.js +9 -3
- package/examples/jsm/shaders/HorizontalTiltShiftShader.js +6 -2
- package/examples/jsm/shaders/HueSaturationShader.js +7 -3
- package/examples/jsm/shaders/KaleidoShader.js +8 -4
- package/examples/jsm/shaders/LuminosityHighPassShader.js +6 -5
- package/examples/jsm/shaders/LuminosityShader.js +6 -3
- package/examples/jsm/shaders/MirrorShader.js +7 -4
- package/examples/jsm/shaders/NormalMapShader.js +5 -3
- package/examples/jsm/shaders/OutputShader.js +11 -0
- package/examples/jsm/shaders/PoissonDenoiseShader.js +21 -15
- package/examples/jsm/shaders/RGBShiftShader.js +5 -1
- package/examples/jsm/shaders/SAOShader.js +8 -2
- package/examples/jsm/shaders/SMAAShader.js +23 -1
- package/examples/jsm/shaders/SSAOShader.js +23 -5
- package/examples/jsm/shaders/SSRShader.js +25 -1
- package/examples/jsm/shaders/SepiaShader.js +6 -4
- package/examples/jsm/shaders/SobelOperatorShader.js +5 -2
- package/examples/jsm/shaders/SubsurfaceScatteringShader.js +10 -8
- package/examples/jsm/shaders/TechnicolorShader.js +7 -4
- package/examples/jsm/shaders/ToonShader.js +29 -7
- package/examples/jsm/shaders/TriangleBlurShader.js +6 -4
- package/examples/jsm/shaders/UnpackDepthRGBAShader.js +6 -3
- package/examples/jsm/shaders/VelocityShader.js +6 -2
- package/examples/jsm/shaders/VerticalBlurShader.js +6 -2
- package/examples/jsm/shaders/VerticalTiltShiftShader.js +5 -1
- package/examples/jsm/shaders/VignetteShader.js +6 -4
- package/examples/jsm/shaders/VolumeShader.js +7 -1
- package/examples/jsm/shaders/WaterRefractionShader.js +8 -0
- package/examples/jsm/textures/FlakesTexture.js +12 -0
- package/examples/jsm/transpiler/Transpiler.js +31 -0
- package/examples/jsm/tsl/display/AfterImageNode.js +1 -1
- package/examples/jsm/tsl/display/BloomNode.js +1 -1
- package/examples/jsm/tsl/display/PixelationPassNode.js +4 -4
- package/examples/jsm/tsl/display/SSRNode.js +1 -1
- package/examples/jsm/tsl/lighting/TiledLightsNode.js +29 -3
- package/examples/jsm/tsl/math/Bayer.js +14 -1
- package/examples/jsm/tsl/utils/Raymarching.js +4 -2
- package/examples/jsm/utils/BufferGeometryUtils.js +88 -29
- package/examples/jsm/utils/CameraUtils.js +10 -7
- package/examples/jsm/utils/GeometryCompressionUtils.js +20 -30
- package/examples/jsm/utils/GeometryUtils.js +12 -13
- package/examples/jsm/utils/LDrawUtils.js +11 -4
- package/examples/jsm/utils/SceneOptimizer.js +66 -20
- package/examples/jsm/utils/SceneUtils.js +50 -3
- package/examples/jsm/utils/ShadowMapViewer.js +47 -24
- package/examples/jsm/utils/ShadowMapViewerGPU.js +47 -24
- package/examples/jsm/utils/SkeletonUtils.js +45 -0
- package/examples/jsm/utils/SortUtils.js +14 -5
- package/examples/jsm/utils/UVsDebug.js +9 -4
- package/examples/jsm/utils/WebGLTextureUtils.js +13 -0
- package/examples/jsm/utils/WebGPUTextureUtils.js +14 -0
- package/examples/jsm/utils/WorkerPool.js +65 -2
- package/examples/jsm/webxr/ARButton.js +18 -0
- package/examples/jsm/webxr/OculusHandModel.js +83 -0
- package/examples/jsm/webxr/OculusHandPointerModel.js +125 -0
- package/examples/jsm/webxr/Text2D.js +11 -0
- package/examples/jsm/webxr/VRButton.js +30 -0
- package/examples/jsm/webxr/XRButton.js +22 -0
- package/examples/jsm/webxr/XRControllerModelFactory.js +87 -3
- package/examples/jsm/webxr/XREstimatedLight.js +33 -3
- package/examples/jsm/webxr/XRHandMeshModel.js +35 -0
- package/examples/jsm/webxr/XRHandModelFactory.js +92 -0
- package/examples/jsm/webxr/XRHandPrimitiveModel.js +42 -0
- package/examples/jsm/webxr/XRPlanes.js +17 -0
- package/package.json +1 -1
- package/src/Three.TSL.js +3 -1
- package/src/animation/AnimationAction.js +262 -30
- package/src/animation/AnimationClip.js +141 -2
- package/src/animation/AnimationMixer.js +99 -15
- package/src/animation/AnimationObjectGroup.js +41 -18
- package/src/animation/AnimationUtils.js +168 -18
- package/src/animation/KeyframeTrack.js +144 -10
- package/src/animation/PropertyBinding.js +77 -3
- package/src/animation/PropertyMixer.js +72 -5
- package/src/animation/tracks/BooleanKeyframeTrack.js +33 -6
- package/src/animation/tracks/ColorKeyframeTrack.js +26 -5
- package/src/animation/tracks/NumberKeyframeTrack.js +26 -2
- package/src/animation/tracks/QuaternionKeyframeTrack.js +30 -1
- package/src/animation/tracks/StringKeyframeTrack.js +33 -2
- package/src/animation/tracks/VectorKeyframeTrack.js +26 -2
- package/src/audio/AudioAnalyser.js +1 -1
- package/src/audio/AudioListener.js +2 -2
- package/src/audio/PositionalAudio.js +5 -5
- package/src/constants.js +1429 -5
- package/src/core/BufferAttribute.js +413 -3
- package/src/core/BufferGeometry.js +337 -1
- package/src/core/Clock.js +60 -0
- package/src/core/GLBufferAttribute.js +99 -0
- package/src/core/InstancedBufferAttribute.js +29 -0
- package/src/core/InstancedBufferGeometry.js +20 -0
- package/src/core/InstancedInterleavedBuffer.js +26 -0
- package/src/core/InterleavedBuffer.js +137 -3
- package/src/core/InterleavedBufferAttribute.js +197 -0
- package/src/core/Layers.js +71 -10
- package/src/core/Object3D.js +23 -0
- package/src/core/Raycaster.js +134 -1
- package/src/core/RenderTarget.js +166 -7
- package/src/core/RenderTarget3D.js +25 -0
- package/src/core/RenderTargetArray.js +18 -0
- package/src/core/Uniform.js +29 -0
- package/src/core/UniformsGroup.js +84 -2
- package/src/extras/Controls.js +16 -1
- package/src/extras/Earcut.js +3 -781
- package/src/extras/ImageUtils.js +3 -2
- package/src/extras/PMREMGenerator.js +22 -17
- package/src/extras/core/Curve.js +1 -1
- package/src/extras/core/Path.js +1 -1
- package/src/extras/lib/earcut.js +685 -0
- package/src/geometries/ConeGeometry.js +2 -2
- package/src/geometries/CylinderGeometry.js +2 -2
- package/src/geometries/ExtrudeGeometry.js +71 -39
- package/src/geometries/LatheGeometry.js +1 -1
- package/src/lights/LightShadow.js +1 -1
- package/src/lights/webgpu/IESSpotLight.js +1 -1
- package/src/loaders/AnimationLoader.js +31 -0
- package/src/loaders/AudioLoader.js +31 -0
- package/src/loaders/BufferGeometryLoader.js +34 -0
- package/src/loaders/Cache.js +45 -0
- package/src/loaders/CompressedTextureLoader.js +36 -3
- package/src/loaders/CubeTextureLoader.js +45 -0
- package/src/loaders/DataTextureLoader.js +44 -3
- package/src/loaders/FileLoader.js +57 -1
- package/src/loaders/ImageBitmapLoader.js +57 -0
- package/src/loaders/ImageLoader.js +30 -0
- package/src/loaders/Loader.js +4 -6
- package/src/loaders/LoaderUtils.js +18 -36
- package/src/loaders/LoadingManager.js +142 -0
- package/src/loaders/MaterialLoader.js +57 -0
- package/src/loaders/ObjectLoader.js +53 -0
- package/src/loaders/TextureLoader.js +33 -0
- package/src/loaders/nodes/NodeLoader.js +6 -2
- package/src/loaders/nodes/NodeMaterialLoader.js +1 -1
- package/src/loaders/nodes/NodeObjectLoader.js +3 -3
- package/src/materials/LineBasicMaterial.js +74 -1
- package/src/materials/LineDashedMaterial.js +52 -0
- package/src/materials/Material.js +18 -3
- package/src/materials/MeshBasicMaterial.js +165 -0
- package/src/materials/MeshDepthMaterial.js +93 -0
- package/src/materials/MeshDistanceMaterial.js +76 -0
- package/src/materials/MeshLambertMaterial.js +273 -0
- package/src/materials/MeshMatcapMaterial.js +142 -0
- package/src/materials/MeshNormalMaterial.js +113 -0
- package/src/materials/MeshPhongMaterial.js +288 -0
- package/src/materials/MeshPhysicalMaterial.js +292 -1
- package/src/materials/MeshStandardMaterial.js +297 -0
- package/src/materials/MeshToonMaterial.js +218 -0
- package/src/materials/PointsMaterial.js +89 -0
- package/src/materials/RawShaderMaterial.js +25 -0
- package/src/materials/ShaderMaterial.js +215 -6
- package/src/materials/ShadowMaterial.js +54 -0
- package/src/materials/SpriteMaterial.js +82 -0
- package/src/materials/nodes/Line2NodeMaterial.js +1 -1
- package/src/materials/nodes/LineBasicNodeMaterial.js +2 -2
- package/src/materials/nodes/LineDashedNodeMaterial.js +2 -2
- package/src/materials/nodes/MeshBasicNodeMaterial.js +2 -2
- package/src/materials/nodes/MeshLambertNodeMaterial.js +2 -2
- package/src/materials/nodes/MeshMatcapNodeMaterial.js +2 -2
- package/src/materials/nodes/MeshNormalNodeMaterial.js +2 -2
- package/src/materials/nodes/MeshPhongNodeMaterial.js +2 -2
- package/src/materials/nodes/MeshPhysicalNodeMaterial.js +2 -2
- package/src/materials/nodes/MeshSSSNodeMaterial.js +1 -1
- package/src/materials/nodes/MeshStandardNodeMaterial.js +2 -2
- package/src/materials/nodes/MeshToonNodeMaterial.js +2 -2
- package/src/materials/nodes/NodeMaterial.js +7 -3
- package/src/materials/nodes/PointsNodeMaterial.js +1 -1
- package/src/materials/nodes/ShadowNodeMaterial.js +11 -2
- package/src/materials/nodes/SpriteNodeMaterial.js +1 -1
- package/src/materials/nodes/VolumeNodeMaterial.js +10 -1
- package/src/math/Color.js +1 -1
- package/src/math/MathUtils.js +223 -0
- package/src/nodes/Nodes.js +1 -0
- package/src/nodes/accessors/BatchNode.js +8 -8
- package/src/nodes/accessors/BuiltinNode.js +1 -1
- package/src/nodes/accessors/CubeTextureNode.js +1 -1
- package/src/nodes/accessors/InstanceNode.js +5 -5
- package/src/nodes/accessors/InstancedMeshNode.js +1 -1
- package/src/nodes/accessors/MorphNode.js +27 -23
- package/src/nodes/accessors/Normal.js +1 -1
- package/src/nodes/accessors/Object3DNode.js +12 -12
- package/src/nodes/accessors/ReferenceBaseNode.js +2 -2
- package/src/nodes/accessors/ReferenceNode.js +1 -1
- package/src/nodes/accessors/SkinningNode.js +46 -37
- package/src/nodes/accessors/StorageBufferNode.js +1 -1
- package/src/nodes/accessors/StorageTextureNode.js +3 -3
- package/src/nodes/accessors/Texture3DNode.js +1 -1
- package/src/nodes/accessors/TextureNode.js +25 -5
- package/src/nodes/accessors/TextureSizeNode.js +1 -1
- package/src/nodes/accessors/UniformArrayNode.js +2 -2
- package/src/nodes/code/CodeNode.js +4 -4
- package/src/nodes/code/ExpressionNode.js +4 -4
- package/src/nodes/code/FunctionCallNode.js +23 -3
- package/src/nodes/code/ScriptableNode.js +4 -4
- package/src/nodes/code/ScriptableValueNode.js +2 -2
- package/src/nodes/core/AssignNode.js +1 -1
- package/src/nodes/core/AttributeNode.js +1 -1
- package/src/nodes/core/BypassNode.js +1 -1
- package/src/nodes/core/CacheNode.js +1 -1
- package/src/nodes/core/ContextNode.js +1 -1
- package/src/nodes/core/InputNode.js +2 -2
- package/src/nodes/core/Node.js +14 -2
- package/src/nodes/core/NodeBuilder.js +86 -14
- package/src/nodes/core/StackNode.js +5 -5
- package/src/nodes/core/StructNode.js +1 -1
- package/src/nodes/core/StructTypeNode.js +2 -2
- package/src/nodes/core/VarNode.js +2 -8
- package/src/nodes/core/VaryingNode.js +3 -3
- package/src/nodes/display/BlendModes.js +4 -4
- package/src/nodes/display/BumpMapNode.js +1 -1
- package/src/nodes/display/NormalMapNode.js +1 -1
- package/src/nodes/display/PosterizeNode.js +1 -1
- package/src/nodes/display/ScreenNode.js +3 -3
- package/src/nodes/display/ViewportDepthNode.js +2 -2
- package/src/nodes/display/ViewportDepthTextureNode.js +2 -2
- package/src/nodes/display/ViewportSharedTextureNode.js +2 -2
- package/src/nodes/display/ViewportTextureNode.js +4 -4
- package/src/nodes/functions/ShadowMaskModel.js +4 -4
- package/src/nodes/functions/material/getParallaxCorrectNormal.js +6 -6
- package/src/nodes/geometry/RangeNode.js +1 -1
- package/src/nodes/gpgpu/AtomicFunctionNode.js +16 -40
- package/src/nodes/gpgpu/ComputeBuiltinNode.js +1 -1
- package/src/nodes/gpgpu/ComputeNode.js +30 -2
- package/src/nodes/lighting/AnalyticLightNode.js +9 -1
- package/src/nodes/lighting/LightsNode.js +3 -3
- package/src/nodes/lighting/ShadowNode.js +1 -1
- package/src/nodes/math/ConditionalNode.js +20 -3
- package/src/nodes/math/MathNode.js +83 -78
- package/src/nodes/math/OperatorNode.js +171 -82
- package/src/nodes/pmrem/PMREMNode.js +4 -4
- package/src/nodes/pmrem/PMREMUtils.js +2 -2
- package/src/nodes/tsl/TSLBase.js +2 -1
- package/src/nodes/tsl/TSLCore.js +115 -12
- package/src/nodes/utils/ArrayElementNode.js +3 -1
- package/src/nodes/utils/CubeMapNode.js +3 -3
- package/src/nodes/utils/DebugNode.js +70 -0
- package/src/nodes/utils/EquirectUVNode.js +2 -2
- package/src/nodes/utils/JoinNode.js +27 -2
- package/src/nodes/utils/LoopNode.js +58 -28
- package/src/nodes/utils/MaxMipLevelNode.js +1 -1
- package/src/nodes/utils/ReflectorNode.js +2 -2
- package/src/nodes/utils/RemapNode.js +6 -6
- package/src/nodes/utils/RotateNode.js +1 -1
- package/src/nodes/utils/SpriteSheetUVNode.js +3 -3
- package/src/nodes/utils/StorageArrayElementNode.js +1 -1
- package/src/nodes/utils/TriplanarTexturesNode.js +3 -3
- package/src/objects/BatchedMesh.js +4 -4
- package/src/objects/InstancedMesh.js +2 -2
- package/src/objects/LOD.js +1 -1
- package/src/objects/Skeleton.js +1 -1
- package/src/renderers/WebGL3DRenderTarget.js +25 -0
- package/src/renderers/WebGLArrayRenderTarget.js +25 -0
- package/src/renderers/WebGLCubeRenderTarget.js +39 -1
- package/src/renderers/WebGLRenderTarget.js +19 -0
- package/src/renderers/WebGLRenderer.js +617 -79
- package/src/renderers/common/Animation.js +2 -2
- package/src/renderers/common/Attributes.js +2 -2
- package/src/renderers/common/Backend.js +12 -3
- package/src/renderers/common/Background.js +1 -0
- package/src/renderers/common/Color4.js +1 -1
- package/src/renderers/common/CubeRenderTarget.js +13 -0
- package/src/renderers/common/PostProcessing.js +2 -0
- package/src/renderers/common/QuadMesh.js +2 -0
- package/src/renderers/common/RenderList.js +2 -2
- package/src/renderers/common/RenderObject.js +1 -1
- package/src/renderers/common/RenderObjects.js +2 -2
- package/src/renderers/common/Renderer.js +52 -31
- package/src/renderers/common/XRManager.js +333 -10
- package/src/renderers/common/extras/PMREMGenerator.js +6 -0
- package/src/renderers/common/nodes/NodeBuilderState.js +3 -3
- package/src/renderers/shaders/UniformsLib.js +1 -4
- package/src/renderers/shaders/UniformsUtils.js +1 -3
- package/src/renderers/webgl/WebGLBackground.js +4 -2
- package/src/renderers/webgl/WebGLState.js +9 -9
- package/src/renderers/webgl-fallback/WebGLBackend.js +25 -26
- package/src/renderers/webgl-fallback/nodes/GLSLNodeBuilder.js +3 -12
- package/src/renderers/webgl-fallback/utils/WebGLTextureUtils.js +67 -19
- package/src/renderers/webgl-fallback/utils/WebGLUtils.js +1 -1
- package/src/renderers/webgpu/WebGPUBackend.js +128 -87
- package/src/renderers/webgpu/WebGPURenderer.Nodes.js +1 -11
- package/src/renderers/webgpu/WebGPURenderer.js +17 -11
- package/src/renderers/webgpu/nodes/WGSLNodeBuilder.js +4 -4
- package/src/renderers/webgpu/utils/WebGPUAttributeUtils.js +5 -3
- package/src/renderers/webgpu/utils/WebGPUConstants.js +1 -1
- package/src/renderers/webgpu/utils/WebGPUTextureUtils.js +1 -1
- package/src/renderers/webxr/WebXRController.js +87 -2
- package/src/renderers/webxr/WebXRDepthSensing.js +49 -0
- package/src/renderers/webxr/WebXRManager.js +173 -1
- package/src/scenes/Scene.js +2 -1
- package/src/textures/CanvasTexture.js +28 -0
- package/src/textures/CompressedArrayTexture.js +57 -0
- package/src/textures/CompressedCubeTexture.js +29 -0
- package/src/textures/CompressedTexture.js +64 -6
- package/src/textures/CubeTexture.js +52 -4
- package/src/textures/Data3DTexture.js +77 -0
- package/src/textures/DataArrayTexture.js +93 -0
- package/src/textures/DataTexture.js +65 -0
- package/src/textures/DepthTexture.js +59 -9
- package/src/textures/FramebufferTexture.js +62 -0
- package/src/textures/Source.js +69 -0
- package/src/textures/Texture.js +5 -5
- package/src/textures/VideoFrameTexture.js +43 -6
- package/src/textures/VideoTexture.js +49 -4
- package/examples/jsm/geometries/ParametricGeometries.js +0 -254
|
@@ -5,10 +5,6 @@ import {
|
|
|
5
5
|
Vector3
|
|
6
6
|
} from 'three';
|
|
7
7
|
|
|
8
|
-
/**
|
|
9
|
-
* Ported from: https://github.com/maurizzzio/quickhull3d/ by Mauricio Poppe (https://github.com/maurizzzio)
|
|
10
|
-
*/
|
|
11
|
-
|
|
12
8
|
const Visible = 0;
|
|
13
9
|
const Deleted = 1;
|
|
14
10
|
|
|
@@ -18,8 +14,18 @@ const _plane = new Plane();
|
|
|
18
14
|
const _closestPoint = new Vector3();
|
|
19
15
|
const _triangle = new Triangle();
|
|
20
16
|
|
|
17
|
+
/**
|
|
18
|
+
* Can be used to compute the convex hull in 3D space for a given set of points. It
|
|
19
|
+
* is primarily intended for {@link ConvexGeometry}.
|
|
20
|
+
*
|
|
21
|
+
* This Quickhull 3D implementation is a port of [quickhull3d]{@link https://github.com/maurizzzio/quickhull3d/}
|
|
22
|
+
* by Mauricio Poppe.
|
|
23
|
+
*/
|
|
21
24
|
class ConvexHull {
|
|
22
25
|
|
|
26
|
+
/**
|
|
27
|
+
* Constructs a new convex hull.
|
|
28
|
+
*/
|
|
23
29
|
constructor() {
|
|
24
30
|
|
|
25
31
|
this.tolerance = - 1;
|
|
@@ -40,10 +46,16 @@ class ConvexHull {
|
|
|
40
46
|
this.assigned = new VertexList();
|
|
41
47
|
this.unassigned = new VertexList();
|
|
42
48
|
|
|
43
|
-
this.vertices = [];
|
|
49
|
+
this.vertices = []; // vertices of the hull (internal representation of given geometry data)
|
|
44
50
|
|
|
45
51
|
}
|
|
46
52
|
|
|
53
|
+
/**
|
|
54
|
+
* Computes to convex hull for the given array of points.
|
|
55
|
+
*
|
|
56
|
+
* @param {Array<Vector3>} points - The array of points in 3D space.
|
|
57
|
+
* @return {ConvexHull} A reference to this convex hull.
|
|
58
|
+
*/
|
|
47
59
|
setFromPoints( points ) {
|
|
48
60
|
|
|
49
61
|
// The algorithm needs at least four points.
|
|
@@ -58,7 +70,7 @@ class ConvexHull {
|
|
|
58
70
|
|
|
59
71
|
}
|
|
60
72
|
|
|
61
|
-
this.
|
|
73
|
+
this._compute();
|
|
62
74
|
|
|
63
75
|
}
|
|
64
76
|
|
|
@@ -66,6 +78,13 @@ class ConvexHull {
|
|
|
66
78
|
|
|
67
79
|
}
|
|
68
80
|
|
|
81
|
+
/**
|
|
82
|
+
* Computes the convex hull of the given 3D object (including its descendants),
|
|
83
|
+
* accounting for the world transforms of both the 3D object and its descendants.
|
|
84
|
+
*
|
|
85
|
+
* @param {Object3D} object - The 3D object to compute the convex hull for.
|
|
86
|
+
* @return {ConvexHull} A reference to this convex hull.
|
|
87
|
+
*/
|
|
69
88
|
setFromObject( object ) {
|
|
70
89
|
|
|
71
90
|
const points = [];
|
|
@@ -102,6 +121,12 @@ class ConvexHull {
|
|
|
102
121
|
|
|
103
122
|
}
|
|
104
123
|
|
|
124
|
+
/**
|
|
125
|
+
* Returns `true` if the given point lies in the convex hull.
|
|
126
|
+
*
|
|
127
|
+
* @param {Vector3} point - The point to test.
|
|
128
|
+
* @return {boolean} Whether the given point lies in the convex hull or not.
|
|
129
|
+
*/
|
|
105
130
|
containsPoint( point ) {
|
|
106
131
|
|
|
107
132
|
const faces = this.faces;
|
|
@@ -120,6 +145,13 @@ class ConvexHull {
|
|
|
120
145
|
|
|
121
146
|
}
|
|
122
147
|
|
|
148
|
+
/**
|
|
149
|
+
* Computes the intersections point of the given ray and this convex hull.
|
|
150
|
+
*
|
|
151
|
+
* @param {Ray} ray - The ray to test.
|
|
152
|
+
* @param {Vector3} target - The target vector that is used to store the method's result.
|
|
153
|
+
* @return {Vector3|null} The intersection point. Returns `null` if not intersection was detected.
|
|
154
|
+
*/
|
|
123
155
|
intersectRay( ray, target ) {
|
|
124
156
|
|
|
125
157
|
// based on "Fast Ray-Convex Polyhedron Intersection" by Eric Haines, GRAPHICS GEMS II
|
|
@@ -196,12 +228,23 @@ class ConvexHull {
|
|
|
196
228
|
|
|
197
229
|
}
|
|
198
230
|
|
|
231
|
+
/**
|
|
232
|
+
* Returns `true` if the given ray intersects with this convex hull.
|
|
233
|
+
*
|
|
234
|
+
* @param {Ray} ray - The ray to test.
|
|
235
|
+
* @return {boolean} Whether the given ray intersects with this convex hull or not.
|
|
236
|
+
*/
|
|
199
237
|
intersectsRay( ray ) {
|
|
200
238
|
|
|
201
239
|
return this.intersectRay( ray, _v1 ) !== null;
|
|
202
240
|
|
|
203
241
|
}
|
|
204
242
|
|
|
243
|
+
/**
|
|
244
|
+
* Makes the convex hull empty.
|
|
245
|
+
*
|
|
246
|
+
* @return {ConvexHull} A reference to this convex hull.
|
|
247
|
+
*/
|
|
205
248
|
makeEmpty() {
|
|
206
249
|
|
|
207
250
|
this.faces = [];
|
|
@@ -211,9 +254,17 @@ class ConvexHull {
|
|
|
211
254
|
|
|
212
255
|
}
|
|
213
256
|
|
|
214
|
-
//
|
|
257
|
+
// private
|
|
215
258
|
|
|
216
|
-
|
|
259
|
+
/**
|
|
260
|
+
* Adds a vertex to the 'assigned' list of vertices and assigns it to the given face.
|
|
261
|
+
*
|
|
262
|
+
* @private
|
|
263
|
+
* @param {VertexNode} vertex - The vertex to add.
|
|
264
|
+
* @param {Face} face - The target face.
|
|
265
|
+
* @return {ConvexHull} A reference to this convex hull.
|
|
266
|
+
*/
|
|
267
|
+
_addVertexToFace( vertex, face ) {
|
|
217
268
|
|
|
218
269
|
vertex.face = face;
|
|
219
270
|
|
|
@@ -233,9 +284,17 @@ class ConvexHull {
|
|
|
233
284
|
|
|
234
285
|
}
|
|
235
286
|
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
287
|
+
/**
|
|
288
|
+
* Removes a vertex from the 'assigned' list of vertices and from the given face.
|
|
289
|
+
* It also makes sure that the link from 'face' to the first vertex it sees in 'assigned'
|
|
290
|
+
* is linked correctly after the removal.
|
|
291
|
+
*
|
|
292
|
+
* @private
|
|
293
|
+
* @param {VertexNode} vertex - The vertex to remove.
|
|
294
|
+
* @param {Face} face - The target face.
|
|
295
|
+
* @return {ConvexHull} A reference to this convex hull.
|
|
296
|
+
*/
|
|
297
|
+
_removeVertexFromFace( vertex, face ) {
|
|
239
298
|
|
|
240
299
|
if ( vertex === face.outside ) {
|
|
241
300
|
|
|
@@ -263,9 +322,15 @@ class ConvexHull {
|
|
|
263
322
|
|
|
264
323
|
}
|
|
265
324
|
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
325
|
+
/**
|
|
326
|
+
* Removes all the visible vertices that a given face is able to see which are stored in
|
|
327
|
+
* the 'assigned' vertex list.
|
|
328
|
+
*
|
|
329
|
+
* @private
|
|
330
|
+
* @param {Face} face - The target face.
|
|
331
|
+
* @return {VertexNode|undefined} A reference to this convex hull.
|
|
332
|
+
*/
|
|
333
|
+
_removeAllVerticesFromFace( face ) {
|
|
269
334
|
|
|
270
335
|
if ( face.outside !== null ) {
|
|
271
336
|
|
|
@@ -293,11 +358,21 @@ class ConvexHull {
|
|
|
293
358
|
|
|
294
359
|
}
|
|
295
360
|
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
361
|
+
/**
|
|
362
|
+
* Removes all the visible vertices that `face` is able to see.
|
|
363
|
+
*
|
|
364
|
+
* - If `absorbingFace` doesn't exist, then all the removed vertices will be added to the 'unassigned' vertex list.
|
|
365
|
+
* - If `absorbingFace` exists, then this method will assign all the vertices of 'face' that can see 'absorbingFace'.
|
|
366
|
+
* - If a vertex cannot see `absorbingFace`, it's added to the 'unassigned' vertex list.
|
|
367
|
+
*
|
|
368
|
+
* @private
|
|
369
|
+
* @param {Face} face - The given face.
|
|
370
|
+
* @param {Face} [absorbingFace] - An optional face that tries to absorb the vertices of the first face.
|
|
371
|
+
* @return {ConvexHull} A reference to this convex hull.
|
|
372
|
+
*/
|
|
373
|
+
_deleteFaceVertices( face, absorbingFace ) {
|
|
374
|
+
|
|
375
|
+
const faceVertices = this._removeAllVerticesFromFace( face );
|
|
301
376
|
|
|
302
377
|
if ( faceVertices !== undefined ) {
|
|
303
378
|
|
|
@@ -327,7 +402,7 @@ class ConvexHull {
|
|
|
327
402
|
|
|
328
403
|
if ( distance > this.tolerance ) {
|
|
329
404
|
|
|
330
|
-
this.
|
|
405
|
+
this._addVertexToFace( vertex, absorbingFace );
|
|
331
406
|
|
|
332
407
|
} else {
|
|
333
408
|
|
|
@@ -349,9 +424,14 @@ class ConvexHull {
|
|
|
349
424
|
|
|
350
425
|
}
|
|
351
426
|
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
427
|
+
/**
|
|
428
|
+
* Reassigns as many vertices as possible from the unassigned list to the new faces.
|
|
429
|
+
*
|
|
430
|
+
* @private
|
|
431
|
+
* @param {Array<Face>} newFaces - The new faces.
|
|
432
|
+
* @return {ConvexHull} A reference to this convex hull.
|
|
433
|
+
*/
|
|
434
|
+
_resolveUnassignedPoints( newFaces ) {
|
|
355
435
|
|
|
356
436
|
if ( this.unassigned.isEmpty() === false ) {
|
|
357
437
|
|
|
@@ -359,7 +439,7 @@ class ConvexHull {
|
|
|
359
439
|
|
|
360
440
|
do {
|
|
361
441
|
|
|
362
|
-
// buffer 'next' reference, see .
|
|
442
|
+
// buffer 'next' reference, see ._deleteFaceVertices()
|
|
363
443
|
|
|
364
444
|
const nextVertex = vertex.next;
|
|
365
445
|
|
|
@@ -392,7 +472,7 @@ class ConvexHull {
|
|
|
392
472
|
|
|
393
473
|
if ( maxFace !== null ) {
|
|
394
474
|
|
|
395
|
-
this.
|
|
475
|
+
this._addVertexToFace( vertex, maxFace );
|
|
396
476
|
|
|
397
477
|
}
|
|
398
478
|
|
|
@@ -406,9 +486,14 @@ class ConvexHull {
|
|
|
406
486
|
|
|
407
487
|
}
|
|
408
488
|
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
489
|
+
/**
|
|
490
|
+
* Computes the extremes values (min/max vectors) which will be used to
|
|
491
|
+
* compute the initial hull.
|
|
492
|
+
*
|
|
493
|
+
* @private
|
|
494
|
+
* @return {Object} The extremes.
|
|
495
|
+
*/
|
|
496
|
+
_computeExtremes() {
|
|
412
497
|
|
|
413
498
|
const min = new Vector3();
|
|
414
499
|
const max = new Vector3();
|
|
@@ -474,13 +559,17 @@ class ConvexHull {
|
|
|
474
559
|
|
|
475
560
|
}
|
|
476
561
|
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
562
|
+
/**
|
|
563
|
+
* Computes the initial simplex assigning to its faces all the points that are
|
|
564
|
+
* candidates to form part of the hull.
|
|
565
|
+
*
|
|
566
|
+
* @private
|
|
567
|
+
* @return {ConvexHull} A reference to this convex hull.
|
|
568
|
+
*/
|
|
569
|
+
_computeInitialHull() {
|
|
481
570
|
|
|
482
571
|
const vertices = this.vertices;
|
|
483
|
-
const extremes = this.
|
|
572
|
+
const extremes = this._computeExtremes();
|
|
484
573
|
const min = extremes.min;
|
|
485
574
|
const max = extremes.max;
|
|
486
575
|
|
|
@@ -652,7 +741,7 @@ class ConvexHull {
|
|
|
652
741
|
|
|
653
742
|
if ( maxFace !== null ) {
|
|
654
743
|
|
|
655
|
-
this.
|
|
744
|
+
this._addVertexToFace( vertex, maxFace );
|
|
656
745
|
|
|
657
746
|
}
|
|
658
747
|
|
|
@@ -664,9 +753,13 @@ class ConvexHull {
|
|
|
664
753
|
|
|
665
754
|
}
|
|
666
755
|
|
|
667
|
-
|
|
668
|
-
|
|
669
|
-
|
|
756
|
+
/**
|
|
757
|
+
* Removes inactive (e.g. deleted) faces from the internal face list.
|
|
758
|
+
*
|
|
759
|
+
* @private
|
|
760
|
+
* @return {ConvexHull} A reference to this convex hull.
|
|
761
|
+
*/
|
|
762
|
+
_reindexFaces() {
|
|
670
763
|
|
|
671
764
|
const activeFaces = [];
|
|
672
765
|
|
|
@@ -688,9 +781,17 @@ class ConvexHull {
|
|
|
688
781
|
|
|
689
782
|
}
|
|
690
783
|
|
|
691
|
-
|
|
692
|
-
|
|
693
|
-
|
|
784
|
+
/**
|
|
785
|
+
* Finds the next vertex to create faces with the current hull.
|
|
786
|
+
*
|
|
787
|
+
* - Let the initial face be the first face existing in the 'assigned' vertex list.
|
|
788
|
+
* - If a face doesn't exist then return since there're no vertices left.
|
|
789
|
+
* - Otherwise for each vertex that face sees find the one furthest away from it.
|
|
790
|
+
*
|
|
791
|
+
* @private
|
|
792
|
+
* @return {?VertexNode} The next vertex to add.
|
|
793
|
+
*/
|
|
794
|
+
_nextVertexToAdd() {
|
|
694
795
|
|
|
695
796
|
// if the 'assigned' list of vertices is empty, no vertices are left. return with 'undefined'
|
|
696
797
|
|
|
@@ -726,15 +827,23 @@ class ConvexHull {
|
|
|
726
827
|
|
|
727
828
|
}
|
|
728
829
|
|
|
729
|
-
|
|
730
|
-
|
|
731
|
-
|
|
732
|
-
|
|
733
|
-
|
|
830
|
+
/**
|
|
831
|
+
* Computes a chain of half edges in CCW order called the 'horizon'. For an edge
|
|
832
|
+
* to be part of the horizon it must join a face that can see 'eyePoint' and a face
|
|
833
|
+
* that cannot see 'eyePoint'.
|
|
834
|
+
*
|
|
835
|
+
* @private
|
|
836
|
+
* @param {Vector3} eyePoint - The 3D-coordinates of a point.
|
|
837
|
+
* @param {HalfEdge} crossEdge - The edge used to jump to the current face.
|
|
838
|
+
* @param {Face} face - The current face being tested.
|
|
839
|
+
* @param {Array<HalfEdge>} horizon - The edges that form part of the horizon in CCW order.
|
|
840
|
+
* @return {ConvexHull} A reference to this convex hull.
|
|
841
|
+
*/
|
|
842
|
+
_computeHorizon( eyePoint, crossEdge, face, horizon ) {
|
|
734
843
|
|
|
735
844
|
// moves face's vertices to the 'unassigned' vertex list
|
|
736
845
|
|
|
737
|
-
this.
|
|
846
|
+
this._deleteFaceVertices( face );
|
|
738
847
|
|
|
739
848
|
face.mark = Deleted;
|
|
740
849
|
|
|
@@ -764,7 +873,7 @@ class ConvexHull {
|
|
|
764
873
|
|
|
765
874
|
// the opposite face can see the vertex, so proceed with next edge
|
|
766
875
|
|
|
767
|
-
this.
|
|
876
|
+
this._computeHorizon( eyePoint, twinEdge, oppositeFace, horizon );
|
|
768
877
|
|
|
769
878
|
} else {
|
|
770
879
|
|
|
@@ -784,9 +893,17 @@ class ConvexHull {
|
|
|
784
893
|
|
|
785
894
|
}
|
|
786
895
|
|
|
787
|
-
|
|
788
|
-
|
|
789
|
-
|
|
896
|
+
/**
|
|
897
|
+
* Creates a face with the vertices 'eyeVertex.point', 'horizonEdge.tail' and 'horizonEdge.head'
|
|
898
|
+
* in CCW order. All the half edges are created in CCW order thus the face is always pointing
|
|
899
|
+
* outside the hull.
|
|
900
|
+
*
|
|
901
|
+
* @private
|
|
902
|
+
* @param {VertexNode} eyeVertex - The vertex that is added to the hull.
|
|
903
|
+
* @param {HalfEdge} horizonEdge - A single edge of the horizon.
|
|
904
|
+
* @return {HalfEdge} The half edge whose vertex is the eyeVertex.
|
|
905
|
+
*/
|
|
906
|
+
_addAdjoiningFace( eyeVertex, horizonEdge ) {
|
|
790
907
|
|
|
791
908
|
// all the half edges are created in ccw order thus the face is always pointing outside the hull
|
|
792
909
|
|
|
@@ -803,10 +920,16 @@ class ConvexHull {
|
|
|
803
920
|
|
|
804
921
|
}
|
|
805
922
|
|
|
806
|
-
|
|
807
|
-
|
|
808
|
-
|
|
809
|
-
|
|
923
|
+
/**
|
|
924
|
+
* Adds 'horizon.length' faces to the hull, each face will be linked with the horizon
|
|
925
|
+
* opposite face and the face on the left/right.
|
|
926
|
+
*
|
|
927
|
+
* @private
|
|
928
|
+
* @param {VertexNode} eyeVertex - The vertex that is added to the hull.
|
|
929
|
+
* @param {Array<HalfEdge>} horizon - The horizon.
|
|
930
|
+
* @return {ConvexHull} A reference to this convex hull.
|
|
931
|
+
*/
|
|
932
|
+
_addNewFaces( eyeVertex, horizon ) {
|
|
810
933
|
|
|
811
934
|
this.newFaces = [];
|
|
812
935
|
|
|
@@ -819,7 +942,7 @@ class ConvexHull {
|
|
|
819
942
|
|
|
820
943
|
// returns the right side edge
|
|
821
944
|
|
|
822
|
-
const sideEdge = this.
|
|
945
|
+
const sideEdge = this._addAdjoiningFace( eyeVertex, horizonEdge );
|
|
823
946
|
|
|
824
947
|
if ( firstSideEdge === null ) {
|
|
825
948
|
|
|
@@ -846,9 +969,21 @@ class ConvexHull {
|
|
|
846
969
|
|
|
847
970
|
}
|
|
848
971
|
|
|
849
|
-
|
|
850
|
-
|
|
851
|
-
|
|
972
|
+
/**
|
|
973
|
+
* Adds a vertex to the hull with the following algorithm:
|
|
974
|
+
*
|
|
975
|
+
* - Compute the 'horizon' which is a chain of half edges. For an edge to belong to this group
|
|
976
|
+
* it must be the edge connecting a face that can see 'eyeVertex' and a face which cannot see 'eyeVertex'.
|
|
977
|
+
* - All the faces that can see 'eyeVertex' have its visible vertices removed from the assigned vertex list.
|
|
978
|
+
* - A new set of faces is created with each edge of the 'horizon' and 'eyeVertex'. Each face is connected
|
|
979
|
+
* with the opposite horizon face and the face on the left/right.
|
|
980
|
+
* - The vertices removed from all the visible faces are assigned to the new faces if possible.
|
|
981
|
+
*
|
|
982
|
+
* @private
|
|
983
|
+
* @param {VertexNode} eyeVertex - The vertex to add.
|
|
984
|
+
* @return {ConvexHull} A reference to this convex hull.
|
|
985
|
+
*/
|
|
986
|
+
_addVertexToHull( eyeVertex ) {
|
|
852
987
|
|
|
853
988
|
const horizon = [];
|
|
854
989
|
|
|
@@ -856,21 +991,27 @@ class ConvexHull {
|
|
|
856
991
|
|
|
857
992
|
// remove 'eyeVertex' from 'eyeVertex.face' so that it can't be added to the 'unassigned' vertex list
|
|
858
993
|
|
|
859
|
-
this.
|
|
994
|
+
this._removeVertexFromFace( eyeVertex, eyeVertex.face );
|
|
860
995
|
|
|
861
|
-
this.
|
|
996
|
+
this._computeHorizon( eyeVertex.point, null, eyeVertex.face, horizon );
|
|
862
997
|
|
|
863
|
-
this.
|
|
998
|
+
this._addNewFaces( eyeVertex, horizon );
|
|
864
999
|
|
|
865
1000
|
// reassign 'unassigned' vertices to the new faces
|
|
866
1001
|
|
|
867
|
-
this.
|
|
1002
|
+
this._resolveUnassignedPoints( this.newFaces );
|
|
868
1003
|
|
|
869
1004
|
return this;
|
|
870
1005
|
|
|
871
1006
|
}
|
|
872
1007
|
|
|
873
|
-
|
|
1008
|
+
/**
|
|
1009
|
+
* Cleans up internal properties after computing the convex hull.
|
|
1010
|
+
*
|
|
1011
|
+
* @private
|
|
1012
|
+
* @return {ConvexHull} A reference to this convex hull.
|
|
1013
|
+
*/
|
|
1014
|
+
_cleanup() {
|
|
874
1015
|
|
|
875
1016
|
this.assigned.clear();
|
|
876
1017
|
this.unassigned.clear();
|
|
@@ -880,23 +1021,29 @@ class ConvexHull {
|
|
|
880
1021
|
|
|
881
1022
|
}
|
|
882
1023
|
|
|
883
|
-
|
|
1024
|
+
/**
|
|
1025
|
+
* Starts the execution of the quick hull algorithm.
|
|
1026
|
+
*
|
|
1027
|
+
* @private
|
|
1028
|
+
* @return {ConvexHull} A reference to this convex hull.
|
|
1029
|
+
*/
|
|
1030
|
+
_compute() {
|
|
884
1031
|
|
|
885
1032
|
let vertex;
|
|
886
1033
|
|
|
887
|
-
this.
|
|
1034
|
+
this._computeInitialHull();
|
|
888
1035
|
|
|
889
1036
|
// add all available vertices gradually to the hull
|
|
890
1037
|
|
|
891
|
-
while ( ( vertex = this.
|
|
1038
|
+
while ( ( vertex = this._nextVertexToAdd() ) !== undefined ) {
|
|
892
1039
|
|
|
893
|
-
this.
|
|
1040
|
+
this._addVertexToHull( vertex );
|
|
894
1041
|
|
|
895
1042
|
}
|
|
896
1043
|
|
|
897
|
-
this.
|
|
1044
|
+
this._reindexFaces();
|
|
898
1045
|
|
|
899
|
-
this.
|
|
1046
|
+
this._cleanup();
|
|
900
1047
|
|
|
901
1048
|
return this;
|
|
902
1049
|
|
|
@@ -904,23 +1051,84 @@ class ConvexHull {
|
|
|
904
1051
|
|
|
905
1052
|
}
|
|
906
1053
|
|
|
907
|
-
|
|
908
|
-
|
|
1054
|
+
/**
|
|
1055
|
+
* Represents a section bounded by a specific amount of half-edges.
|
|
1056
|
+
* The current implementation assumes that a face always consist of three edges.
|
|
1057
|
+
*
|
|
1058
|
+
* @private
|
|
1059
|
+
*/
|
|
909
1060
|
class Face {
|
|
910
1061
|
|
|
1062
|
+
/**
|
|
1063
|
+
* Constructs a new face.
|
|
1064
|
+
*/
|
|
911
1065
|
constructor() {
|
|
912
1066
|
|
|
1067
|
+
/**
|
|
1068
|
+
* The normal vector of the face.
|
|
1069
|
+
*
|
|
1070
|
+
* @private
|
|
1071
|
+
* @type {Vector3}
|
|
1072
|
+
*/
|
|
913
1073
|
this.normal = new Vector3();
|
|
1074
|
+
|
|
1075
|
+
/**
|
|
1076
|
+
* The midpoint or centroid of the face.
|
|
1077
|
+
*
|
|
1078
|
+
* @private
|
|
1079
|
+
* @type {Vector3}
|
|
1080
|
+
*/
|
|
914
1081
|
this.midpoint = new Vector3();
|
|
1082
|
+
|
|
1083
|
+
/**
|
|
1084
|
+
* The area of the face.
|
|
1085
|
+
*
|
|
1086
|
+
* @private
|
|
1087
|
+
* @type {number}
|
|
1088
|
+
* @default 0
|
|
1089
|
+
*/
|
|
915
1090
|
this.area = 0;
|
|
916
1091
|
|
|
917
|
-
|
|
1092
|
+
/**
|
|
1093
|
+
* Signed distance from face to the origin.
|
|
1094
|
+
*
|
|
1095
|
+
* @private
|
|
1096
|
+
* @type {number}
|
|
1097
|
+
* @default 0
|
|
1098
|
+
*/
|
|
1099
|
+
this.constant = 0;
|
|
1100
|
+
|
|
1101
|
+
/**
|
|
1102
|
+
* Reference to a vertex in a vertex list this face can see.
|
|
1103
|
+
*
|
|
1104
|
+
* @private
|
|
1105
|
+
* @type {?VertexNode}
|
|
1106
|
+
* @default null
|
|
1107
|
+
*/
|
|
918
1108
|
this.outside = null; // reference to a vertex in a vertex list this face can see
|
|
919
1109
|
this.mark = Visible;
|
|
1110
|
+
|
|
1111
|
+
/**
|
|
1112
|
+
* Reference to the base edge of a face. To retrieve all edges, you can use the
|
|
1113
|
+
* `next` reference of the current edge.
|
|
1114
|
+
*
|
|
1115
|
+
* @private
|
|
1116
|
+
* @type {?HalfEdge}
|
|
1117
|
+
* @default null
|
|
1118
|
+
*/
|
|
920
1119
|
this.edge = null;
|
|
921
1120
|
|
|
922
1121
|
}
|
|
923
1122
|
|
|
1123
|
+
/**
|
|
1124
|
+
* Creates a face from the given vertex nodes.
|
|
1125
|
+
*
|
|
1126
|
+
* @private
|
|
1127
|
+
* @param {VertexNode} a - The first vertex node.
|
|
1128
|
+
* @param {VertexNode} b - The second vertex node.
|
|
1129
|
+
* @param {VertexNode} c - The third vertex node.
|
|
1130
|
+
* @return {Face} The created face.
|
|
1131
|
+
*/
|
|
924
1132
|
static create( a, b, c ) {
|
|
925
1133
|
|
|
926
1134
|
const face = new Face();
|
|
@@ -943,6 +1151,13 @@ class Face {
|
|
|
943
1151
|
|
|
944
1152
|
}
|
|
945
1153
|
|
|
1154
|
+
/**
|
|
1155
|
+
* Returns an edge by the given index.
|
|
1156
|
+
*
|
|
1157
|
+
* @private
|
|
1158
|
+
* @param {number} i - The edge index.
|
|
1159
|
+
* @return {HalfEdge} The edge.
|
|
1160
|
+
*/
|
|
946
1161
|
getEdge( i ) {
|
|
947
1162
|
|
|
948
1163
|
let edge = this.edge;
|
|
@@ -965,6 +1180,12 @@ class Face {
|
|
|
965
1180
|
|
|
966
1181
|
}
|
|
967
1182
|
|
|
1183
|
+
/**
|
|
1184
|
+
* Computes all properties of the face.
|
|
1185
|
+
*
|
|
1186
|
+
* @private
|
|
1187
|
+
* @return {Face} A reference to this face.
|
|
1188
|
+
*/
|
|
968
1189
|
compute() {
|
|
969
1190
|
|
|
970
1191
|
const a = this.edge.tail();
|
|
@@ -983,6 +1204,13 @@ class Face {
|
|
|
983
1204
|
|
|
984
1205
|
}
|
|
985
1206
|
|
|
1207
|
+
/**
|
|
1208
|
+
* Returns the signed distance from a given point to the plane representation of this face.
|
|
1209
|
+
*
|
|
1210
|
+
* @private
|
|
1211
|
+
* @param {Vector3} point - The point to compute the distance to.
|
|
1212
|
+
* @return {number} The distance.
|
|
1213
|
+
*/
|
|
986
1214
|
distanceToPoint( point ) {
|
|
987
1215
|
|
|
988
1216
|
return this.normal.dot( point ) - this.constant;
|
|
@@ -991,33 +1219,97 @@ class Face {
|
|
|
991
1219
|
|
|
992
1220
|
}
|
|
993
1221
|
|
|
994
|
-
|
|
995
|
-
|
|
1222
|
+
/**
|
|
1223
|
+
* The basis for a half-edge data structure, also known as doubly
|
|
1224
|
+
* connected edge list (DCEL).
|
|
1225
|
+
*
|
|
1226
|
+
* @private
|
|
1227
|
+
*/
|
|
996
1228
|
class HalfEdge {
|
|
997
1229
|
|
|
998
|
-
|
|
1230
|
+
/**
|
|
1231
|
+
* Constructs a new half edge.
|
|
1232
|
+
*
|
|
1233
|
+
* @param {VertexNode} vertex - A reference to its destination vertex.
|
|
1234
|
+
* @param {Face} face - A reference to its face.
|
|
1235
|
+
*/
|
|
999
1236
|
constructor( vertex, face ) {
|
|
1000
1237
|
|
|
1238
|
+
/**
|
|
1239
|
+
* A reference to its destination vertex.
|
|
1240
|
+
*
|
|
1241
|
+
* @private
|
|
1242
|
+
* @type {VertexNode}
|
|
1243
|
+
*/
|
|
1001
1244
|
this.vertex = vertex;
|
|
1245
|
+
|
|
1246
|
+
/**
|
|
1247
|
+
* Reference to the previous half-edge of the same face.
|
|
1248
|
+
*
|
|
1249
|
+
* @private
|
|
1250
|
+
* @type {?HalfEdge}
|
|
1251
|
+
* @default null
|
|
1252
|
+
*/
|
|
1002
1253
|
this.prev = null;
|
|
1254
|
+
|
|
1255
|
+
/**
|
|
1256
|
+
* Reference to the next half-edge of the same face.
|
|
1257
|
+
*
|
|
1258
|
+
* @private
|
|
1259
|
+
* @type {?HalfEdge}
|
|
1260
|
+
* @default null
|
|
1261
|
+
*/
|
|
1003
1262
|
this.next = null;
|
|
1263
|
+
|
|
1264
|
+
/**
|
|
1265
|
+
* Reference to the twin half-edge to reach the opposite face.
|
|
1266
|
+
*
|
|
1267
|
+
* @private
|
|
1268
|
+
* @type {?HalfEdge}
|
|
1269
|
+
* @default null
|
|
1270
|
+
*/
|
|
1004
1271
|
this.twin = null;
|
|
1272
|
+
|
|
1273
|
+
/**
|
|
1274
|
+
* A reference to its face.
|
|
1275
|
+
*
|
|
1276
|
+
* @private
|
|
1277
|
+
* @type {Face}
|
|
1278
|
+
*/
|
|
1005
1279
|
this.face = face;
|
|
1006
1280
|
|
|
1007
1281
|
}
|
|
1008
1282
|
|
|
1283
|
+
/**
|
|
1284
|
+
* Returns the destination vertex.
|
|
1285
|
+
*
|
|
1286
|
+
* @private
|
|
1287
|
+
* @return {VertexNode} The destination vertex.
|
|
1288
|
+
*/
|
|
1009
1289
|
head() {
|
|
1010
1290
|
|
|
1011
1291
|
return this.vertex;
|
|
1012
1292
|
|
|
1013
1293
|
}
|
|
1014
1294
|
|
|
1295
|
+
/**
|
|
1296
|
+
* Returns the origin vertex.
|
|
1297
|
+
*
|
|
1298
|
+
* @private
|
|
1299
|
+
* @return {VertexNode} The destination vertex.
|
|
1300
|
+
*/
|
|
1015
1301
|
tail() {
|
|
1016
1302
|
|
|
1017
1303
|
return this.prev ? this.prev.vertex : null;
|
|
1018
1304
|
|
|
1019
1305
|
}
|
|
1020
1306
|
|
|
1307
|
+
/**
|
|
1308
|
+
* Returns the Euclidean length (straight-line length) of the edge.
|
|
1309
|
+
*
|
|
1310
|
+
* @private
|
|
1311
|
+
* @return {number} The edge's length.
|
|
1312
|
+
*/
|
|
1021
1313
|
length() {
|
|
1022
1314
|
|
|
1023
1315
|
const head = this.head();
|
|
@@ -1033,6 +1325,12 @@ class HalfEdge {
|
|
|
1033
1325
|
|
|
1034
1326
|
}
|
|
1035
1327
|
|
|
1328
|
+
/**
|
|
1329
|
+
* Returns the square of the Euclidean length (straight-line length) of the edge.
|
|
1330
|
+
*
|
|
1331
|
+
* @private
|
|
1332
|
+
* @return {number} The square of the edge's length.
|
|
1333
|
+
*/
|
|
1036
1334
|
lengthSquared() {
|
|
1037
1335
|
|
|
1038
1336
|
const head = this.head();
|
|
@@ -1048,6 +1346,14 @@ class HalfEdge {
|
|
|
1048
1346
|
|
|
1049
1347
|
}
|
|
1050
1348
|
|
|
1349
|
+
/**
|
|
1350
|
+
* Sets the twin edge of this half-edge. It also ensures that the twin reference
|
|
1351
|
+
* of the given half-edge is correctly set.
|
|
1352
|
+
*
|
|
1353
|
+
* @private
|
|
1354
|
+
* @param {HalfEdge} edge - The twin edge to set.
|
|
1355
|
+
* @return {HalfEdge} A reference to this edge.
|
|
1356
|
+
*/
|
|
1051
1357
|
setTwin( edge ) {
|
|
1052
1358
|
|
|
1053
1359
|
this.twin = edge;
|
|
@@ -1059,44 +1365,121 @@ class HalfEdge {
|
|
|
1059
1365
|
|
|
1060
1366
|
}
|
|
1061
1367
|
|
|
1062
|
-
|
|
1063
|
-
|
|
1368
|
+
/**
|
|
1369
|
+
* A vertex as a double linked list node.
|
|
1370
|
+
*
|
|
1371
|
+
* @private
|
|
1372
|
+
*/
|
|
1064
1373
|
class VertexNode {
|
|
1065
1374
|
|
|
1375
|
+
/**
|
|
1376
|
+
* Constructs a new vertex node.
|
|
1377
|
+
*
|
|
1378
|
+
* @param {Vector3} point - A point in 3D space.
|
|
1379
|
+
*/
|
|
1066
1380
|
constructor( point ) {
|
|
1067
1381
|
|
|
1382
|
+
/**
|
|
1383
|
+
* A point in 3D space.
|
|
1384
|
+
*
|
|
1385
|
+
* @private
|
|
1386
|
+
* @type {Vector3}
|
|
1387
|
+
*/
|
|
1068
1388
|
this.point = point;
|
|
1389
|
+
|
|
1390
|
+
/**
|
|
1391
|
+
* Reference to the previous vertex in the double linked list.
|
|
1392
|
+
*
|
|
1393
|
+
* @private
|
|
1394
|
+
* @type {?VertexNode}
|
|
1395
|
+
* @default null
|
|
1396
|
+
*/
|
|
1069
1397
|
this.prev = null;
|
|
1398
|
+
|
|
1399
|
+
/**
|
|
1400
|
+
* Reference to the next vertex in the double linked list.
|
|
1401
|
+
*
|
|
1402
|
+
* @private
|
|
1403
|
+
* @type {?VertexNode}
|
|
1404
|
+
* @default null
|
|
1405
|
+
*/
|
|
1070
1406
|
this.next = null;
|
|
1071
|
-
|
|
1407
|
+
|
|
1408
|
+
/**
|
|
1409
|
+
* Reference to the face that is able to see this vertex.
|
|
1410
|
+
*
|
|
1411
|
+
* @private
|
|
1412
|
+
* @type {?Face}
|
|
1413
|
+
* @default null
|
|
1414
|
+
*/
|
|
1415
|
+
this.face = null;
|
|
1072
1416
|
|
|
1073
1417
|
}
|
|
1074
1418
|
|
|
1075
1419
|
}
|
|
1076
1420
|
|
|
1077
|
-
|
|
1078
|
-
|
|
1421
|
+
/**
|
|
1422
|
+
* A doubly linked list of vertices.
|
|
1423
|
+
*
|
|
1424
|
+
* @private
|
|
1425
|
+
*/
|
|
1079
1426
|
class VertexList {
|
|
1080
1427
|
|
|
1428
|
+
/**
|
|
1429
|
+
* Constructs a new vertex list.
|
|
1430
|
+
*/
|
|
1081
1431
|
constructor() {
|
|
1082
1432
|
|
|
1433
|
+
/**
|
|
1434
|
+
* Reference to the first vertex of the linked list.
|
|
1435
|
+
*
|
|
1436
|
+
* @private
|
|
1437
|
+
* @type {?VertexNode}
|
|
1438
|
+
* @default null
|
|
1439
|
+
*/
|
|
1083
1440
|
this.head = null;
|
|
1441
|
+
|
|
1442
|
+
/**
|
|
1443
|
+
* Reference to the last vertex of the linked list.
|
|
1444
|
+
*
|
|
1445
|
+
* @private
|
|
1446
|
+
* @type {?VertexNode}
|
|
1447
|
+
* @default null
|
|
1448
|
+
*/
|
|
1084
1449
|
this.tail = null;
|
|
1085
1450
|
|
|
1086
1451
|
}
|
|
1087
1452
|
|
|
1453
|
+
/**
|
|
1454
|
+
* Returns the head reference.
|
|
1455
|
+
*
|
|
1456
|
+
* @private
|
|
1457
|
+
* @return {VertexNode} The head reference.
|
|
1458
|
+
*/
|
|
1088
1459
|
first() {
|
|
1089
1460
|
|
|
1090
1461
|
return this.head;
|
|
1091
1462
|
|
|
1092
1463
|
}
|
|
1093
1464
|
|
|
1465
|
+
/**
|
|
1466
|
+
* Returns the tail reference.
|
|
1467
|
+
*
|
|
1468
|
+
* @private
|
|
1469
|
+
* @return {VertexNode} The tail reference.
|
|
1470
|
+
*/
|
|
1094
1471
|
last() {
|
|
1095
1472
|
|
|
1096
1473
|
return this.tail;
|
|
1097
1474
|
|
|
1098
1475
|
}
|
|
1099
1476
|
|
|
1477
|
+
/**
|
|
1478
|
+
* Clears the linked list.
|
|
1479
|
+
*
|
|
1480
|
+
* @private
|
|
1481
|
+
* @return {VertexList} A reference to this vertex list.
|
|
1482
|
+
*/
|
|
1100
1483
|
clear() {
|
|
1101
1484
|
|
|
1102
1485
|
this.head = this.tail = null;
|
|
@@ -1105,8 +1488,14 @@ class VertexList {
|
|
|
1105
1488
|
|
|
1106
1489
|
}
|
|
1107
1490
|
|
|
1108
|
-
|
|
1109
|
-
|
|
1491
|
+
/**
|
|
1492
|
+
* Inserts a vertex before a target vertex.
|
|
1493
|
+
*
|
|
1494
|
+
* @private
|
|
1495
|
+
* @param {VertexNode} target - The target.
|
|
1496
|
+
* @param {VertexNode} vertex - The vertex to insert.
|
|
1497
|
+
* @return {VertexList} A reference to this vertex list.
|
|
1498
|
+
*/
|
|
1110
1499
|
insertBefore( target, vertex ) {
|
|
1111
1500
|
|
|
1112
1501
|
vertex.prev = target.prev;
|
|
@@ -1128,8 +1517,14 @@ class VertexList {
|
|
|
1128
1517
|
|
|
1129
1518
|
}
|
|
1130
1519
|
|
|
1131
|
-
|
|
1132
|
-
|
|
1520
|
+
/**
|
|
1521
|
+
* Inserts a vertex after a target vertex.
|
|
1522
|
+
*
|
|
1523
|
+
* @private
|
|
1524
|
+
* @param {VertexNode} target - The target.
|
|
1525
|
+
* @param {VertexNode} vertex - The vertex to insert.
|
|
1526
|
+
* @return {VertexList} A reference to this vertex list.
|
|
1527
|
+
*/
|
|
1133
1528
|
insertAfter( target, vertex ) {
|
|
1134
1529
|
|
|
1135
1530
|
vertex.prev = target;
|
|
@@ -1151,8 +1546,13 @@ class VertexList {
|
|
|
1151
1546
|
|
|
1152
1547
|
}
|
|
1153
1548
|
|
|
1154
|
-
|
|
1155
|
-
|
|
1549
|
+
/**
|
|
1550
|
+
* Appends a vertex to this vertex list.
|
|
1551
|
+
*
|
|
1552
|
+
* @private
|
|
1553
|
+
* @param {VertexNode} vertex - The vertex to append.
|
|
1554
|
+
* @return {VertexList} A reference to this vertex list.
|
|
1555
|
+
*/
|
|
1156
1556
|
append( vertex ) {
|
|
1157
1557
|
|
|
1158
1558
|
if ( this.head === null ) {
|
|
@@ -1174,8 +1574,13 @@ class VertexList {
|
|
|
1174
1574
|
|
|
1175
1575
|
}
|
|
1176
1576
|
|
|
1177
|
-
|
|
1178
|
-
|
|
1577
|
+
/**
|
|
1578
|
+
* Appends a chain of vertices where the given vertex is the head.
|
|
1579
|
+
*
|
|
1580
|
+
* @private
|
|
1581
|
+
* @param {VertexNode} vertex - The head vertex of a chain of vertices.
|
|
1582
|
+
* @return {VertexList} A reference to this vertex list.
|
|
1583
|
+
*/
|
|
1179
1584
|
appendChain( vertex ) {
|
|
1180
1585
|
|
|
1181
1586
|
if ( this.head === null ) {
|
|
@@ -1204,8 +1609,13 @@ class VertexList {
|
|
|
1204
1609
|
|
|
1205
1610
|
}
|
|
1206
1611
|
|
|
1207
|
-
|
|
1208
|
-
|
|
1612
|
+
/**
|
|
1613
|
+
* Removes a vertex from the linked list.
|
|
1614
|
+
*
|
|
1615
|
+
* @private
|
|
1616
|
+
* @param {VertexNode} vertex - The vertex to remove.
|
|
1617
|
+
* @return {VertexList} A reference to this vertex list.
|
|
1618
|
+
*/
|
|
1209
1619
|
remove( vertex ) {
|
|
1210
1620
|
|
|
1211
1621
|
if ( vertex.prev === null ) {
|
|
@@ -1232,8 +1642,14 @@ class VertexList {
|
|
|
1232
1642
|
|
|
1233
1643
|
}
|
|
1234
1644
|
|
|
1235
|
-
|
|
1236
|
-
|
|
1645
|
+
/**
|
|
1646
|
+
* Removes a sublist of vertices from the linked list.
|
|
1647
|
+
*
|
|
1648
|
+
* @private
|
|
1649
|
+
* @param {VertexNode} a - The head of the sublist.
|
|
1650
|
+
* @param {VertexNode} b - The tail of the sublist.
|
|
1651
|
+
* @return {VertexList} A reference to this vertex list.
|
|
1652
|
+
*/
|
|
1237
1653
|
removeSubList( a, b ) {
|
|
1238
1654
|
|
|
1239
1655
|
if ( a.prev === null ) {
|
|
@@ -1260,6 +1676,12 @@ class VertexList {
|
|
|
1260
1676
|
|
|
1261
1677
|
}
|
|
1262
1678
|
|
|
1679
|
+
/**
|
|
1680
|
+
* Returns `true` if the linked list is empty.
|
|
1681
|
+
*
|
|
1682
|
+
* @private
|
|
1683
|
+
* @return {boolean} Whether the linked list is empty or not.
|
|
1684
|
+
*/
|
|
1263
1685
|
isEmpty() {
|
|
1264
1686
|
|
|
1265
1687
|
return this.head === null;
|