@needle-tools/three 0.145.4 → 0.146.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/build/three.cjs +32586 -35951
- package/build/three.js +32600 -35965
- package/build/three.min.js +6 -7
- package/build/three.module.js +1547 -1154
- package/examples/js/animation/AnimationClipCreator.js +0 -8
- package/examples/js/animation/CCDIKSolver.js +49 -66
- package/examples/js/animation/MMDAnimationHelper.js +66 -137
- package/examples/js/animation/MMDPhysics.js +70 -134
- package/examples/js/cameras/CinematicCamera.js +33 -22
- package/examples/js/controls/ArcballControls.js +138 -405
- package/examples/js/controls/DragControls.js +8 -33
- package/examples/js/controls/FirstPersonControls.js +32 -54
- package/examples/js/controls/FlyControls.js +29 -55
- package/examples/js/controls/OrbitControls.js +85 -95
- package/examples/js/controls/PointerLockControls.js +5 -14
- package/examples/js/controls/TrackballControls.js +33 -86
- package/examples/js/controls/TransformControls.js +84 -169
- package/examples/js/csm/CSM.js +4 -39
- package/examples/js/csm/CSMFrustum.js +3 -9
- package/examples/js/csm/CSMHelper.js +24 -4
- package/examples/js/csm/CSMShader.js +2 -6
- package/examples/js/curves/CurveExtras.js +27 -27
- package/examples/js/curves/NURBSCurve.js +4 -16
- package/examples/js/curves/NURBSSurface.js +3 -9
- package/examples/js/curves/NURBSUtils.js +8 -45
- package/examples/js/effects/AnaglyphEffect.js +4 -18
- package/examples/js/effects/AsciiEffect.js +32 -31
- package/examples/js/effects/OutlineEffect.js +26 -30
- package/examples/js/effects/ParallaxBarrierEffect.js +0 -13
- package/examples/js/effects/PeppersGhostEffect.js +12 -39
- package/examples/js/effects/StereoEffect.js +0 -4
- package/examples/js/environments/RoomEnvironment.js +12 -10
- package/examples/js/exporters/ColladaExporter.js +48 -65
- package/examples/js/exporters/DRACOExporter.js +22 -22
- package/examples/js/exporters/EXRExporter.js +15 -18
- package/examples/js/exporters/GLTFExporter.js +143 -261
- package/examples/js/exporters/MMDExporter.js +5 -12
- package/examples/js/exporters/OBJExporter.js +42 -33
- package/examples/js/exporters/PLYExporter.js +38 -33
- package/examples/js/exporters/STLExporter.js +5 -7
- package/examples/js/exporters/USDZExporter.js +110 -25
- package/examples/js/geometries/BoxLineGeometry.js +0 -1
- package/examples/js/geometries/ConvexGeometry.js +11 -6
- package/examples/js/geometries/DecalGeometry.js +53 -20
- package/examples/js/geometries/LightningStrike.js +54 -67
- package/examples/js/geometries/ParametricGeometries.js +8 -7
- package/examples/js/geometries/ParametricGeometry.js +25 -12
- package/examples/js/geometries/RoundedBoxGeometry.js +21 -19
- package/examples/js/geometries/TeapotGeometry.js +54 -50
- package/examples/js/geometries/TextGeometry.js +6 -4
- package/examples/js/helpers/LightProbeHelper.js +1 -2
- package/examples/js/helpers/OctreeHelper.js +22 -20
- package/examples/js/helpers/PositionalAudioHelper.js +8 -6
- package/examples/js/helpers/RectAreaLightHelper.js +6 -7
- package/examples/js/helpers/VertexNormalsHelper.js +15 -13
- package/examples/js/helpers/VertexTangentsHelper.js +15 -9
- package/examples/js/helpers/ViewHelper.js +31 -16
- package/examples/js/interactive/HTMLMesh.js +22 -33
- package/examples/js/interactive/InteractiveGroup.js +6 -12
- package/examples/js/interactive/SelectionBox.js +3 -70
- package/examples/js/interactive/SelectionHelper.js +0 -8
- package/examples/js/lights/LightProbeGenerator.js +32 -39
- package/examples/js/lights/RectAreaLightUniformsLib.js +5 -1
- package/examples/js/lines/LineGeometry.js +3 -5
- package/examples/js/lines/LineMaterial.js +4 -11
- package/examples/js/lines/LineSegments2.js +38 -89
- package/examples/js/lines/LineSegmentsGeometry.js +7 -28
- package/examples/js/lines/Wireframe.js +2 -7
- package/examples/js/lines/WireframeGeometry2.js +3 -1
- package/examples/js/loaders/3DMLoader.js +58 -155
- package/examples/js/loaders/3MFLoader.js +72 -106
- package/examples/js/loaders/AMFLoader.js +0 -25
- package/examples/js/loaders/BVHLoader.js +44 -43
- package/examples/js/loaders/BasisTextureLoader.js +16 -46
- package/examples/js/loaders/ColladaLoader.js +201 -359
- package/examples/js/loaders/DDSLoader.js +24 -25
- package/examples/js/loaders/DRACOLoader.js +29 -66
- package/examples/js/loaders/EXRLoader.js +67 -164
- package/examples/js/loaders/FBXLoader.js +286 -441
- package/examples/js/loaders/FontLoader.js +6 -15
- package/examples/js/loaders/GCodeLoader.js +15 -16
- package/examples/js/loaders/GLTFLoader.js +354 -405
- package/examples/js/loaders/HDRCubeTextureLoader.js +0 -6
- package/examples/js/loaders/KMZLoader.js +3 -7
- package/examples/js/loaders/KTXLoader.js +12 -30
- package/examples/js/loaders/LDrawLoader.js +178 -289
- package/examples/js/loaders/LUT3dlLoader.js +7 -11
- package/examples/js/loaders/LUTCubeLoader.js +0 -8
- package/examples/js/loaders/LWOLoader.js +59 -124
- package/examples/js/loaders/LogLuvLoader.js +27 -77
- package/examples/js/loaders/LottieLoader.js +4 -4
- package/examples/js/loaders/MD2Loader.js +26 -27
- package/examples/js/loaders/MDDLoader.js +6 -10
- package/examples/js/loaders/MMDLoader.js +180 -189
- package/examples/js/loaders/MTLLoader.js +18 -47
- package/examples/js/loaders/MaterialXLoader.js +392 -0
- package/examples/js/loaders/NRRDLoader.js +44 -84
- package/examples/js/loaders/OBJLoader.js +50 -65
- package/examples/js/loaders/PCDLoader.js +34 -29
- package/examples/js/loaders/PDBLoader.js +17 -13
- package/examples/js/loaders/PLYLoader.js +9 -39
- package/examples/js/loaders/PRWMLoader.js +11 -22
- package/examples/js/loaders/PVRLoader.js +7 -16
- package/examples/js/loaders/RGBELoader.js +36 -61
- package/examples/js/loaders/RGBMLoader.js +26 -87
- package/examples/js/loaders/STLLoader.js +20 -27
- package/examples/js/loaders/SVGLoader.js +361 -233
- package/examples/js/loaders/TDSLoader.js +81 -118
- package/examples/js/loaders/TGALoader.js +39 -41
- package/examples/js/loaders/TIFFLoader.js +0 -1
- package/examples/js/loaders/TTFLoader.js +0 -8
- package/examples/js/loaders/TiltLoader.js +14 -15
- package/examples/js/loaders/VOXLoader.js +8 -16
- package/examples/js/loaders/VRMLLoader.js +243 -340
- package/examples/js/loaders/VTKLoader.js +101 -118
- package/examples/js/loaders/XYZLoader.js +2 -4
- package/examples/js/loaders/lwo/IFFParser.js +55 -136
- package/examples/js/loaders/lwo/LWO2Parser.js +32 -83
- package/examples/js/loaders/lwo/LWO3Parser.js +31 -73
- package/examples/js/materials/MeshGouraudMaterial.js +15 -13
- package/examples/js/math/Capsule.js +0 -17
- package/examples/js/math/ColorConverter.js +3 -3
- package/examples/js/math/ConvexHull.js +183 -139
- package/examples/js/math/ImprovedNoise.js +1 -1
- package/examples/js/math/Lut.js +8 -15
- package/examples/js/math/MeshSurfaceSampler.js +6 -28
- package/examples/js/math/OBB.js +90 -49
- package/examples/js/math/Octree.js +2 -57
- package/examples/js/math/SimplexNoise.js +74 -88
- package/examples/js/misc/ConvexObjectBreaker.js +37 -48
- package/examples/js/misc/GPUComputationRenderer.js +14 -18
- package/examples/js/misc/Gyroscope.js +5 -9
- package/examples/js/misc/MD2Character.js +14 -23
- package/examples/js/misc/MD2CharacterComplex.js +73 -54
- package/examples/js/misc/MorphAnimMesh.js +0 -6
- package/examples/js/misc/MorphBlendMesh.js +3 -30
- package/examples/js/misc/ProgressiveLightMap.js +47 -43
- package/examples/js/misc/RollerCoaster.js +17 -24
- package/examples/js/misc/TubePainter.js +18 -12
- package/examples/js/misc/Volume.js +16 -45
- package/examples/js/misc/VolumeSlice.js +14 -24
- package/examples/js/modifiers/CurveModifier.js +19 -21
- package/examples/js/modifiers/EdgeSplitModifier.js +0 -30
- package/examples/js/modifiers/SimplifyModifier.js +56 -59
- package/examples/js/modifiers/TessellateModifier.js +2 -9
- package/examples/js/objects/GroundProjectedEnv.js +2 -14
- package/examples/js/objects/Lensflare.js +47 -38
- package/examples/js/objects/LightningStorm.js +10 -13
- package/examples/js/objects/MarchingCubes.js +80 -59
- package/examples/js/objects/Reflector.js +22 -20
- package/examples/js/objects/ReflectorForSSRPass.js +19 -23
- package/examples/js/objects/Refractor.js +52 -30
- package/examples/js/objects/ShadowMesh.js +1 -2
- package/examples/js/objects/Sky.js +2 -7
- package/examples/js/objects/Water.js +23 -18
- package/examples/js/objects/Water2.js +20 -19
- package/examples/js/physics/AmmoPhysics.js +23 -20
- package/examples/js/physics/OimoPhysics.js +19 -17
- package/examples/js/postprocessing/AdaptiveToneMappingPass.js +13 -20
- package/examples/js/postprocessing/AfterimagePass.js +19 -12
- package/examples/js/postprocessing/BloomPass.js +38 -17
- package/examples/js/postprocessing/BokehPass.js +29 -12
- package/examples/js/postprocessing/ClearPass.js +1 -6
- package/examples/js/postprocessing/CubeTexturePass.js +12 -9
- package/examples/js/postprocessing/DotScreenPass.js +7 -5
- package/examples/js/postprocessing/EffectComposer.js +25 -32
- package/examples/js/postprocessing/FilmPass.js +7 -5
- package/examples/js/postprocessing/GlitchPass.js +10 -11
- package/examples/js/postprocessing/HalftonePass.js +9 -9
- package/examples/js/postprocessing/LUTPass.js +2 -15
- package/examples/js/postprocessing/MaskPass.js +20 -17
- package/examples/js/postprocessing/OutlinePass.js +45 -36
- package/examples/js/postprocessing/Pass.js +11 -14
- package/examples/js/postprocessing/RenderPass.js +3 -7
- package/examples/js/postprocessing/SAOPass.js +40 -32
- package/examples/js/postprocessing/SMAAPass.js +34 -17
- package/examples/js/postprocessing/SSAARenderPass.js +14 -14
- package/examples/js/postprocessing/SSAOPass.js +56 -42
- package/examples/js/postprocessing/SSRPass.js +78 -61
- package/examples/js/postprocessing/SavePass.js +14 -6
- package/examples/js/postprocessing/ShaderPass.js +9 -8
- package/examples/js/postprocessing/TAARenderPass.js +11 -9
- package/examples/js/postprocessing/TexturePass.js +7 -4
- package/examples/js/postprocessing/UnrealBloomPass.js +43 -25
- package/examples/js/renderers/CSS2DRenderer.js +2 -21
- package/examples/js/renderers/CSS3DRenderer.js +3 -24
- package/examples/js/renderers/Projector.js +29 -85
- package/examples/js/renderers/SVGRenderer.js +4 -50
- package/examples/js/shaders/ACESFilmicToneMappingShader.js +3 -6
- package/examples/js/shaders/AfterimageShader.js +3 -6
- package/examples/js/shaders/BasicShader.js +3 -6
- package/examples/js/shaders/BleachBypassShader.js +3 -6
- package/examples/js/shaders/BlendShader.js +3 -6
- package/examples/js/shaders/BokehShader.js +3 -6
- package/examples/js/shaders/BokehShader2.js +4 -13
- package/examples/js/shaders/BrightnessContrastShader.js +3 -6
- package/examples/js/shaders/ColorCorrectionShader.js +2 -6
- package/examples/js/shaders/ColorifyShader.js +2 -6
- package/examples/js/shaders/ConvolutionShader.js +5 -10
- package/examples/js/shaders/CopyShader.js +3 -6
- package/examples/js/shaders/DOFMipMapShader.js +3 -6
- package/examples/js/shaders/DepthLimitedBlurShader.js +2 -9
- package/examples/js/shaders/DigitalGlitch.js +3 -6
- package/examples/js/shaders/DotScreenShader.js +2 -6
- package/examples/js/shaders/FXAAShader.js +1 -3
- package/examples/js/shaders/FilmShader.js +3 -6
- package/examples/js/shaders/FocusShader.js +3 -6
- package/examples/js/shaders/FreiChenShader.js +2 -6
- package/examples/js/shaders/GammaCorrectionShader.js +3 -6
- package/examples/js/shaders/GodRaysShader.js +11 -24
- package/examples/js/shaders/HalftoneShader.js +3 -6
- package/examples/js/shaders/HorizontalBlurShader.js +3 -6
- package/examples/js/shaders/HorizontalTiltShiftShader.js +3 -6
- package/examples/js/shaders/HueSaturationShader.js +3 -6
- package/examples/js/shaders/KaleidoShader.js +3 -6
- package/examples/js/shaders/LuminosityHighPassShader.js +2 -6
- package/examples/js/shaders/LuminosityShader.js +3 -6
- package/examples/js/shaders/MMDToonShader.js +2 -6
- package/examples/js/shaders/MirrorShader.js +3 -6
- package/examples/js/shaders/NormalMapShader.js +2 -6
- package/examples/js/shaders/RGBShiftShader.js +3 -6
- package/examples/js/shaders/SAOShader.js +2 -6
- package/examples/js/shaders/SMAAShader.js +6 -18
- package/examples/js/shaders/SSAOShader.js +2 -6
- package/examples/js/shaders/SSRShader.js +6 -18
- package/examples/js/shaders/SepiaShader.js +3 -6
- package/examples/js/shaders/SobelOperatorShader.js +2 -6
- package/examples/js/shaders/TechnicolorShader.js +3 -6
- package/examples/js/shaders/ToneMapShader.js +3 -6
- package/examples/js/shaders/ToonShader.js +8 -24
- package/examples/js/shaders/TriangleBlurShader.js +2 -6
- package/examples/js/shaders/UnpackDepthRGBAShader.js +3 -6
- package/examples/js/shaders/VelocityShader.js +126 -0
- package/examples/js/shaders/VerticalBlurShader.js +3 -6
- package/examples/js/shaders/VerticalTiltShiftShader.js +3 -6
- package/examples/js/shaders/VignetteShader.js +3 -6
- package/examples/js/shaders/VolumeShader.js +2 -6
- package/examples/js/shaders/WaterRefractionShader.js +2 -6
- package/examples/js/textures/FlakesTexture.js +0 -1
- package/examples/js/utils/BufferGeometryUtils.js +234 -168
- package/examples/js/utils/CameraUtils.js +5 -20
- package/examples/js/utils/GPUStatsPanel.js +3 -12
- package/examples/js/utils/GeometryCompressionUtils.js +19 -44
- package/examples/js/utils/GeometryUtils.js +13 -18
- package/examples/js/utils/LDrawUtils.js +8 -11
- package/examples/js/utils/PackedPhongMaterial.js +6 -4
- package/examples/js/utils/SceneUtils.js +117 -6
- package/examples/js/utils/ShadowMapViewer.js +17 -14
- package/examples/js/utils/SkeletonUtils.js +13 -27
- package/examples/js/utils/UVsDebug.js +20 -12
- package/examples/js/utils/WorkerPool.js +1 -11
- package/examples/jsm/animation/CCDIKSolver.js +1 -1
- package/examples/jsm/capabilities/WebGPU.js +3 -1
- package/examples/jsm/controls/OrbitControls.js +44 -4
- package/examples/jsm/exporters/GLTFExporter.js +17 -131
- package/examples/jsm/exporters/USDZExporter.js +75 -19
- package/examples/jsm/interactive/HTMLMesh.js +2 -0
- package/examples/jsm/libs/lottie_canvas.module.js +14844 -0
- package/examples/jsm/loaders/3DMLoader.js +1 -2
- package/examples/jsm/loaders/ColladaLoader.js +28 -0
- package/examples/jsm/loaders/FBXLoader.js +16 -2
- package/examples/jsm/loaders/GLTFLoader.js +204 -377
- package/examples/jsm/loaders/KTX2Loader.js +68 -29
- package/examples/jsm/loaders/LDrawLoader.js +14 -13
- package/examples/jsm/loaders/LottieLoader.js +4 -2
- package/examples/jsm/loaders/MaterialXLoader.js +728 -0
- package/examples/jsm/loaders/PCDLoader.js +1 -1
- package/examples/jsm/loaders/PLYLoader.js +68 -16
- package/examples/jsm/loaders/SVGLoader.js +227 -14
- package/examples/jsm/loaders/USDZLoader.js +31 -16
- package/examples/jsm/nodes/Nodes.js +14 -2
- package/examples/jsm/nodes/accessors/Object3DNode.js +1 -1
- package/examples/jsm/nodes/accessors/PositionNode.js +6 -0
- package/examples/jsm/nodes/accessors/ReferenceNode.js +1 -1
- package/examples/jsm/nodes/accessors/SkinningNode.js +1 -1
- package/examples/jsm/nodes/core/Node.js +1 -1
- package/examples/jsm/nodes/core/NodeBuilder.js +36 -4
- package/examples/jsm/nodes/core/NodeFrame.js +2 -2
- package/examples/jsm/nodes/core/NodeVarying.js +7 -4
- package/examples/jsm/nodes/core/VaryingNode.js +6 -4
- package/examples/jsm/nodes/core/constants.js +13 -13
- package/examples/jsm/nodes/display/PosterizeNode.js +25 -0
- package/examples/jsm/nodes/display/ViewportNode.js +106 -0
- package/examples/jsm/nodes/gpgpu/ComputeNode.js +1 -1
- package/examples/jsm/nodes/lighting/AnalyticLightNode.js +1 -1
- package/examples/jsm/nodes/loaders/NodeMaterialLoader.js +3 -1
- package/examples/jsm/nodes/materials/Materials.js +9 -7
- package/examples/jsm/nodes/materials/NodeMaterial.js +9 -1
- package/examples/jsm/nodes/materialx/MaterialXNodes.js +6 -2
- package/examples/jsm/nodes/materialx/lib/mx_transform_color.js +18 -0
- package/examples/jsm/nodes/math/MathNode.js +5 -0
- package/examples/jsm/nodes/math/OperatorNode.js +6 -1
- package/examples/jsm/nodes/shadernode/ShaderNode.js +26 -13
- package/examples/jsm/nodes/shadernode/ShaderNodeBaseElements.js +2 -0
- package/examples/jsm/nodes/shadernode/ShaderNodeElements.js +18 -0
- package/examples/jsm/nodes/utils/EquirectUVNode.js +27 -0
- package/examples/jsm/nodes/utils/JoinNode.js +8 -2
- package/examples/jsm/nodes/utils/MatcapUVNode.js +2 -4
- package/examples/jsm/nodes/utils/MaxMipLevelNode.js +1 -1
- package/examples/jsm/nodes/utils/SpriteSheetUVNode.js +8 -10
- package/examples/jsm/nodes/utils/TimerNode.js +1 -1
- package/examples/jsm/nodes/utils/TriplanarTexturesNode.js +51 -0
- package/examples/jsm/postprocessing/AfterimagePass.js +17 -4
- package/examples/jsm/postprocessing/BloomPass.js +22 -3
- package/examples/jsm/postprocessing/BokehPass.js +18 -4
- package/examples/jsm/postprocessing/CubeTexturePass.js +12 -5
- package/examples/jsm/postprocessing/DotScreenPass.js +8 -0
- package/examples/jsm/postprocessing/EffectComposer.js +9 -0
- package/examples/jsm/postprocessing/FilmPass.js +8 -0
- package/examples/jsm/postprocessing/GlitchPass.js +13 -1
- package/examples/jsm/postprocessing/HalftonePass.js +8 -0
- package/examples/jsm/postprocessing/OutlinePass.js +10 -0
- package/examples/jsm/postprocessing/Pass.js +2 -0
- package/examples/jsm/postprocessing/RenderPixelatedPass.js +234 -0
- package/examples/jsm/postprocessing/SAOPass.js +20 -0
- package/examples/jsm/postprocessing/SMAAPass.js +16 -0
- package/examples/jsm/postprocessing/SSAARenderPass.js +4 -0
- package/examples/jsm/postprocessing/SavePass.js +17 -1
- package/examples/jsm/postprocessing/ShaderPass.js +8 -0
- package/examples/jsm/postprocessing/TAARenderPass.js +9 -0
- package/examples/jsm/postprocessing/TexturePass.js +8 -0
- package/examples/jsm/postprocessing/UnrealBloomPass.js +16 -0
- package/examples/jsm/renderers/webgl/nodes/WebGLNodeBuilder.js +39 -16
- package/examples/jsm/renderers/webgpu/WebGPUAnimation.js +58 -0
- package/examples/jsm/renderers/webgpu/WebGPUAttributes.js +63 -5
- package/examples/jsm/renderers/webgpu/WebGPUBackground.js +36 -7
- package/examples/jsm/renderers/webgpu/WebGPURenderer.js +47 -12
- package/examples/jsm/renderers/webgpu/nodes/WebGPUNodeBuilder.js +35 -5
- package/examples/jsm/shaders/MMDToonShader.js +0 -2
- package/examples/jsm/shaders/VelocityShader.js +128 -0
- package/examples/jsm/utils/BufferGeometryUtils.js +130 -6
- package/examples/jsm/utils/SceneUtils.js +129 -4
- package/examples/jsm/utils/TextureUtils.js +85 -0
- package/examples/jsm/webxr/OculusHandModel.js +1 -1
- package/examples/jsm/webxr/XRHandMeshModel.js +6 -3
- package/package.json +11 -12
- package/src/Three.js +1 -0
- package/src/audio/AudioContext.js +5 -5
- package/src/cameras/CubeCamera.js +14 -14
- package/src/constants.js +1 -1
- package/src/core/InstancedBufferGeometry.js +1 -7
- package/src/extras/Earcut.js +67 -67
- package/src/helpers/DirectionalLightHelper.js +5 -1
- package/src/helpers/HemisphereLightHelper.js +4 -1
- package/src/helpers/PointLightHelper.js +2 -1
- package/src/helpers/SpotLightHelper.js +4 -2
- package/src/lights/PointLight.js +2 -2
- package/src/lights/SpotLight.js +2 -2
- package/src/loaders/FileLoader.js +4 -1
- package/src/loaders/ObjectLoader.js +5 -1
- package/src/materials/Material.js +1 -1
- package/src/math/Color.js +5 -5
- package/src/math/Matrix3.js +53 -18
- package/src/math/Ray.js +2 -5
- package/src/math/Sphere.js +19 -26
- package/src/objects/InstancedMesh.js +7 -0
- package/src/objects/LOD.js +25 -6
- package/src/renderers/WebGL3DRenderTarget.js +1 -1
- package/src/renderers/WebGLArrayRenderTarget.js +1 -1
- package/src/renderers/WebGLCubeRenderTarget.js +1 -1
- package/src/renderers/WebGLMultipleRenderTargets.js +1 -1
- package/src/renderers/WebGLRenderTarget.js +1 -1
- package/src/renderers/WebGLRenderer.js +36 -62
- package/src/renderers/shaders/ShaderChunk/envmap_fragment.glsl.js +0 -4
- package/src/renderers/shaders/ShaderChunk/lights_fragment_begin.glsl.js +0 -1
- package/src/renderers/shaders/ShaderChunk/lights_lambert_pars_fragment.glsl.js +0 -2
- package/src/renderers/shaders/ShaderChunk/lights_phong_pars_fragment.glsl.js +0 -2
- package/src/renderers/shaders/ShaderChunk/lights_toon_pars_fragment.glsl.js +0 -2
- package/src/renderers/shaders/ShaderChunk/packing.glsl.js +8 -0
- package/src/renderers/shaders/ShaderChunk.js +3 -0
- package/src/renderers/shaders/ShaderLib/background.glsl.js +7 -2
- package/src/renderers/shaders/ShaderLib/backgroundCube.glsl.js +62 -0
- package/src/renderers/shaders/ShaderLib/cube.glsl.js +4 -6
- package/src/renderers/shaders/ShaderLib.js +20 -6
- package/src/renderers/shaders/UniformsLib.js +1 -1
- package/src/renderers/shaders/UniformsUtils.js +15 -0
- package/src/renderers/webgl/WebGLAttributes.js +2 -0
- package/src/renderers/webgl/WebGLBackground.js +15 -7
- package/src/renderers/webgl/WebGLLights.js +0 -4
- package/src/renderers/webgl/WebGLMaterials.js +2 -1
- package/src/renderers/webgl/WebGLShadowMap.js +3 -1
- package/src/renderers/webgl/WebGLState.js +31 -1
- package/src/renderers/webgl/WebGLTextures.js +71 -18
- package/src/renderers/webgl/WebGLUniforms.js +116 -20
- package/src/renderers/webgl/WebGLUtils.js +1 -1
- package/src/renderers/webxr/WebXRController.js +46 -13
- package/src/renderers/webxr/WebXRManager.js +85 -3
- package/src/scenes/Scene.js +8 -0
- package/src/textures/CompressedArrayTexture.js +18 -0
- package/examples/js/libs/lottie_canvas.js +0 -12751
- package/examples/js/shaders/PixelShader.js +0 -51
- package/examples/jsm/shaders/PixelShader.js +0 -44
|
@@ -23,7 +23,6 @@
|
|
|
23
23
|
super( manager );
|
|
24
24
|
|
|
25
25
|
}
|
|
26
|
-
|
|
27
26
|
load( url, onLoad, onProgress, onError ) {
|
|
28
27
|
|
|
29
28
|
const scope = this;
|
|
@@ -57,20 +56,17 @@
|
|
|
57
56
|
}, onProgress, onError );
|
|
58
57
|
|
|
59
58
|
}
|
|
60
|
-
|
|
61
59
|
parse( data ) {
|
|
62
60
|
|
|
63
61
|
function loadDocument( data ) {
|
|
64
62
|
|
|
65
63
|
let view = new DataView( data );
|
|
66
64
|
const magic = String.fromCharCode( view.getUint8( 0 ), view.getUint8( 1 ) );
|
|
67
|
-
|
|
68
65
|
if ( magic === 'PK' ) {
|
|
69
66
|
|
|
70
67
|
let zip = null;
|
|
71
68
|
let file = null;
|
|
72
69
|
console.log( 'THREE.AMFLoader: Loading Zip' );
|
|
73
|
-
|
|
74
70
|
try {
|
|
75
71
|
|
|
76
72
|
zip = fflate.unzipSync( new Uint8Array( data ) ); // eslint-disable-line no-undef
|
|
@@ -103,7 +99,6 @@
|
|
|
103
99
|
|
|
104
100
|
const fileText = THREE.LoaderUtils.decodeText( view );
|
|
105
101
|
const xmlData = new DOMParser().parseFromString( fileText, 'application/xml' );
|
|
106
|
-
|
|
107
102
|
if ( xmlData.documentElement.nodeName.toLowerCase() !== 'amf' ) {
|
|
108
103
|
|
|
109
104
|
console.log( 'THREE.AMFLoader: Error loading AMF - no AMF document found.' );
|
|
@@ -119,7 +114,6 @@
|
|
|
119
114
|
|
|
120
115
|
let scale = 1.0;
|
|
121
116
|
let unit = 'millimeter';
|
|
122
|
-
|
|
123
117
|
if ( node.documentElement.attributes.unit !== undefined ) {
|
|
124
118
|
|
|
125
119
|
unit = node.documentElement.attributes.unit.value.toLowerCase();
|
|
@@ -133,7 +127,6 @@
|
|
|
133
127
|
meter: 1000.0,
|
|
134
128
|
micron: 0.001
|
|
135
129
|
};
|
|
136
|
-
|
|
137
130
|
if ( scaleUnits[ unit ] !== undefined ) {
|
|
138
131
|
|
|
139
132
|
scale = scaleUnits[ unit ];
|
|
@@ -156,11 +149,9 @@
|
|
|
156
149
|
a: 1.0
|
|
157
150
|
};
|
|
158
151
|
let loadedMaterial = null;
|
|
159
|
-
|
|
160
152
|
for ( let i = 0; i < node.childNodes.length; i ++ ) {
|
|
161
153
|
|
|
162
154
|
const matChildEl = node.childNodes[ i ];
|
|
163
|
-
|
|
164
155
|
if ( matChildEl.nodeName === 'metadata' && matChildEl.attributes.type !== undefined ) {
|
|
165
156
|
|
|
166
157
|
if ( matChildEl.attributes.type.value === 'name' ) {
|
|
@@ -182,7 +173,6 @@
|
|
|
182
173
|
color: new THREE.Color( color.r, color.g, color.b ),
|
|
183
174
|
name: matName
|
|
184
175
|
} );
|
|
185
|
-
|
|
186
176
|
if ( color.a !== 1.0 ) {
|
|
187
177
|
|
|
188
178
|
loadedMaterial.transparent = true;
|
|
@@ -205,11 +195,9 @@
|
|
|
205
195
|
b: 1.0,
|
|
206
196
|
a: 1.0
|
|
207
197
|
};
|
|
208
|
-
|
|
209
198
|
for ( let i = 0; i < node.childNodes.length; i ++ ) {
|
|
210
199
|
|
|
211
200
|
const matColor = node.childNodes[ i ];
|
|
212
|
-
|
|
213
201
|
if ( matColor.nodeName === 'r' ) {
|
|
214
202
|
|
|
215
203
|
color.r = matColor.textContent;
|
|
@@ -242,7 +230,6 @@
|
|
|
242
230
|
materialid: null
|
|
243
231
|
};
|
|
244
232
|
let currVolumeNode = node.firstElementChild;
|
|
245
|
-
|
|
246
233
|
if ( node.attributes.materialid !== undefined ) {
|
|
247
234
|
|
|
248
235
|
volume.materialId = node.attributes.materialid.nodeValue;
|
|
@@ -285,13 +272,11 @@
|
|
|
285
272
|
const vertArray = [];
|
|
286
273
|
const normalArray = [];
|
|
287
274
|
let currVerticesNode = node.firstElementChild;
|
|
288
|
-
|
|
289
275
|
while ( currVerticesNode ) {
|
|
290
276
|
|
|
291
277
|
if ( currVerticesNode.nodeName === 'vertex' ) {
|
|
292
278
|
|
|
293
279
|
let vNode = currVerticesNode.firstElementChild;
|
|
294
|
-
|
|
295
280
|
while ( vNode ) {
|
|
296
281
|
|
|
297
282
|
if ( vNode.nodeName === 'coordinates' ) {
|
|
@@ -336,7 +321,6 @@
|
|
|
336
321
|
};
|
|
337
322
|
let currColor = null;
|
|
338
323
|
let currObjNode = node.firstElementChild;
|
|
339
|
-
|
|
340
324
|
while ( currObjNode ) {
|
|
341
325
|
|
|
342
326
|
if ( currObjNode.nodeName === 'metadata' ) {
|
|
@@ -364,7 +348,6 @@
|
|
|
364
348
|
volumes: [],
|
|
365
349
|
color: currColor
|
|
366
350
|
};
|
|
367
|
-
|
|
368
351
|
while ( currMeshNode ) {
|
|
369
352
|
|
|
370
353
|
if ( currMeshNode.nodeName === 'vertices' ) {
|
|
@@ -406,11 +389,9 @@
|
|
|
406
389
|
const amfObjects = {};
|
|
407
390
|
const childNodes = xmlData.documentElement.childNodes;
|
|
408
391
|
let i, j;
|
|
409
|
-
|
|
410
392
|
for ( i = 0; i < childNodes.length; i ++ ) {
|
|
411
393
|
|
|
412
394
|
const child = childNodes[ i ];
|
|
413
|
-
|
|
414
395
|
if ( child.nodeName === 'metadata' ) {
|
|
415
396
|
|
|
416
397
|
if ( child.attributes.type !== undefined ) {
|
|
@@ -449,21 +430,18 @@
|
|
|
449
430
|
sceneObject.name = amfName;
|
|
450
431
|
sceneObject.userData.author = amfAuthor;
|
|
451
432
|
sceneObject.userData.loader = 'AMF';
|
|
452
|
-
|
|
453
433
|
for ( const id in amfObjects ) {
|
|
454
434
|
|
|
455
435
|
const part = amfObjects[ id ];
|
|
456
436
|
const meshes = part.meshes;
|
|
457
437
|
const newObject = new THREE.Group();
|
|
458
438
|
newObject.name = part.name || '';
|
|
459
|
-
|
|
460
439
|
for ( i = 0; i < meshes.length; i ++ ) {
|
|
461
440
|
|
|
462
441
|
let objDefaultMaterial = defaultMaterial;
|
|
463
442
|
const mesh = meshes[ i ];
|
|
464
443
|
const vertices = new THREE.Float32BufferAttribute( mesh.vertices, 3 );
|
|
465
444
|
let normals = null;
|
|
466
|
-
|
|
467
445
|
if ( mesh.normals.length ) {
|
|
468
446
|
|
|
469
447
|
normals = new THREE.Float32BufferAttribute( mesh.normals, 3 );
|
|
@@ -475,7 +453,6 @@
|
|
|
475
453
|
const color = mesh.color;
|
|
476
454
|
objDefaultMaterial = defaultMaterial.clone();
|
|
477
455
|
objDefaultMaterial.color = new THREE.Color( color.r, color.g, color.b );
|
|
478
|
-
|
|
479
456
|
if ( color.a !== 1.0 ) {
|
|
480
457
|
|
|
481
458
|
objDefaultMaterial.transparent = true;
|
|
@@ -486,7 +463,6 @@
|
|
|
486
463
|
}
|
|
487
464
|
|
|
488
465
|
const volumes = mesh.volumes;
|
|
489
|
-
|
|
490
466
|
for ( j = 0; j < volumes.length; j ++ ) {
|
|
491
467
|
|
|
492
468
|
const volume = volumes[ j ];
|
|
@@ -494,7 +470,6 @@
|
|
|
494
470
|
let material = objDefaultMaterial;
|
|
495
471
|
newGeometry.setIndex( volume.triangles );
|
|
496
472
|
newGeometry.setAttribute( 'position', vertices.clone() );
|
|
497
|
-
|
|
498
473
|
if ( normals ) {
|
|
499
474
|
|
|
500
475
|
newGeometry.setAttribute( 'normal', normals.clone() );
|
|
@@ -16,7 +16,6 @@
|
|
|
16
16
|
this.animateBoneRotations = true;
|
|
17
17
|
|
|
18
18
|
}
|
|
19
|
-
|
|
20
19
|
load( url, onLoad, onProgress, onError ) {
|
|
21
20
|
|
|
22
21
|
const scope = this;
|
|
@@ -49,7 +48,6 @@
|
|
|
49
48
|
}, onProgress, onError );
|
|
50
49
|
|
|
51
50
|
}
|
|
52
|
-
|
|
53
51
|
parse( text ) {
|
|
54
52
|
|
|
55
53
|
/*
|
|
@@ -61,6 +59,7 @@
|
|
|
61
59
|
function readBvh( lines ) {
|
|
62
60
|
|
|
63
61
|
// read model structure
|
|
62
|
+
|
|
64
63
|
if ( nextLine( lines ) !== 'HIERARCHY' ) {
|
|
65
64
|
|
|
66
65
|
console.error( 'THREE.BVHLoader: HIERARCHY expected.' );
|
|
@@ -68,35 +67,37 @@
|
|
|
68
67
|
}
|
|
69
68
|
|
|
70
69
|
const list = []; // collects flat array of all bones
|
|
70
|
+
const root = readNode( lines, nextLine( lines ), list );
|
|
71
71
|
|
|
72
|
-
|
|
72
|
+
// read motion data
|
|
73
73
|
|
|
74
74
|
if ( nextLine( lines ) !== 'MOTION' ) {
|
|
75
75
|
|
|
76
76
|
console.error( 'THREE.BVHLoader: MOTION expected.' );
|
|
77
77
|
|
|
78
|
-
}
|
|
78
|
+
}
|
|
79
79
|
|
|
80
|
+
// number of frames
|
|
80
81
|
|
|
81
82
|
let tokens = nextLine( lines ).split( /[\s]+/ );
|
|
82
83
|
const numFrames = parseInt( tokens[ 1 ] );
|
|
83
|
-
|
|
84
84
|
if ( isNaN( numFrames ) ) {
|
|
85
85
|
|
|
86
86
|
console.error( 'THREE.BVHLoader: Failed to read number of frames.' );
|
|
87
87
|
|
|
88
|
-
}
|
|
88
|
+
}
|
|
89
89
|
|
|
90
|
+
// frame time
|
|
90
91
|
|
|
91
92
|
tokens = nextLine( lines ).split( /[\s]+/ );
|
|
92
93
|
const frameTime = parseFloat( tokens[ 2 ] );
|
|
93
|
-
|
|
94
94
|
if ( isNaN( frameTime ) ) {
|
|
95
95
|
|
|
96
96
|
console.error( 'THREE.BVHLoader: Failed to read frame time.' );
|
|
97
97
|
|
|
98
|
-
}
|
|
98
|
+
}
|
|
99
99
|
|
|
100
|
+
// read frame data line by line
|
|
100
101
|
|
|
101
102
|
for ( let i = 0; i < numFrames; i ++ ) {
|
|
102
103
|
|
|
@@ -108,6 +109,7 @@
|
|
|
108
109
|
return list;
|
|
109
110
|
|
|
110
111
|
}
|
|
112
|
+
|
|
111
113
|
/*
|
|
112
114
|
Recursively reads data from a single frame into the bone hierarchy.
|
|
113
115
|
The passed bone hierarchy has to be structured in the same order as the BVH file.
|
|
@@ -117,12 +119,13 @@
|
|
|
117
119
|
- frameTime: playback time for this keyframe.
|
|
118
120
|
- bone: the bone to read frame data from.
|
|
119
121
|
*/
|
|
120
|
-
|
|
121
|
-
|
|
122
122
|
function readFrameData( data, frameTime, bone ) {
|
|
123
123
|
|
|
124
124
|
// end sites have no motion data
|
|
125
|
-
|
|
125
|
+
|
|
126
|
+
if ( bone.type === 'ENDSITE' ) return;
|
|
127
|
+
|
|
128
|
+
// add keyframe
|
|
126
129
|
|
|
127
130
|
const keyframe = {
|
|
128
131
|
time: frameTime,
|
|
@@ -133,7 +136,9 @@
|
|
|
133
136
|
const quat = new THREE.Quaternion();
|
|
134
137
|
const vx = new THREE.Vector3( 1, 0, 0 );
|
|
135
138
|
const vy = new THREE.Vector3( 0, 1, 0 );
|
|
136
|
-
const vz = new THREE.Vector3( 0, 0, 1 );
|
|
139
|
+
const vz = new THREE.Vector3( 0, 0, 1 );
|
|
140
|
+
|
|
141
|
+
// parse values for each channel in node
|
|
137
142
|
|
|
138
143
|
for ( let i = 0; i < bone.channels.length; i ++ ) {
|
|
139
144
|
|
|
@@ -142,37 +147,32 @@
|
|
|
142
147
|
case 'Xposition':
|
|
143
148
|
keyframe.position.x = parseFloat( data.shift().trim() );
|
|
144
149
|
break;
|
|
145
|
-
|
|
146
150
|
case 'Yposition':
|
|
147
151
|
keyframe.position.y = parseFloat( data.shift().trim() );
|
|
148
152
|
break;
|
|
149
|
-
|
|
150
153
|
case 'Zposition':
|
|
151
154
|
keyframe.position.z = parseFloat( data.shift().trim() );
|
|
152
155
|
break;
|
|
153
|
-
|
|
154
156
|
case 'Xrotation':
|
|
155
157
|
quat.setFromAxisAngle( vx, parseFloat( data.shift().trim() ) * Math.PI / 180 );
|
|
156
158
|
keyframe.rotation.multiply( quat );
|
|
157
159
|
break;
|
|
158
|
-
|
|
159
160
|
case 'Yrotation':
|
|
160
161
|
quat.setFromAxisAngle( vy, parseFloat( data.shift().trim() ) * Math.PI / 180 );
|
|
161
162
|
keyframe.rotation.multiply( quat );
|
|
162
163
|
break;
|
|
163
|
-
|
|
164
164
|
case 'Zrotation':
|
|
165
165
|
quat.setFromAxisAngle( vz, parseFloat( data.shift().trim() ) * Math.PI / 180 );
|
|
166
166
|
keyframe.rotation.multiply( quat );
|
|
167
167
|
break;
|
|
168
|
-
|
|
169
168
|
default:
|
|
170
169
|
console.warn( 'THREE.BVHLoader: Invalid channel type.' );
|
|
171
170
|
|
|
172
171
|
}
|
|
173
172
|
|
|
174
|
-
}
|
|
173
|
+
}
|
|
175
174
|
|
|
175
|
+
// parse child nodes
|
|
176
176
|
|
|
177
177
|
for ( let i = 0; i < bone.children.length; i ++ ) {
|
|
178
178
|
|
|
@@ -181,6 +181,7 @@
|
|
|
181
181
|
}
|
|
182
182
|
|
|
183
183
|
}
|
|
184
|
+
|
|
184
185
|
/*
|
|
185
186
|
Recursively parses the HIERACHY section of the BVH file
|
|
186
187
|
- lines: all lines of the file. lines are consumed as we go along.
|
|
@@ -188,8 +189,6 @@
|
|
|
188
189
|
- list: collects a flat list of nodes
|
|
189
190
|
returns: a BVH node including children
|
|
190
191
|
*/
|
|
191
|
-
|
|
192
|
-
|
|
193
192
|
function readNode( lines, firstline, list ) {
|
|
194
193
|
|
|
195
194
|
const node = {
|
|
@@ -197,10 +196,11 @@
|
|
|
197
196
|
type: '',
|
|
198
197
|
frames: []
|
|
199
198
|
};
|
|
200
|
-
list.push( node );
|
|
199
|
+
list.push( node );
|
|
201
200
|
|
|
202
|
-
|
|
201
|
+
// parse node type and name
|
|
203
202
|
|
|
203
|
+
let tokens = firstline.split( /[\s]+/ );
|
|
204
204
|
if ( tokens[ 0 ].toUpperCase() === 'END' && tokens[ 1 ].toUpperCase() === 'SITE' ) {
|
|
205
205
|
|
|
206
206
|
node.type = 'ENDSITE';
|
|
@@ -217,11 +217,11 @@
|
|
|
217
217
|
|
|
218
218
|
console.error( 'THREE.BVHLoader: Expected opening { after type & name' );
|
|
219
219
|
|
|
220
|
-
}
|
|
220
|
+
}
|
|
221
221
|
|
|
222
|
+
// parse OFFSET
|
|
222
223
|
|
|
223
224
|
tokens = nextLine( lines ).split( /[\s]+/ );
|
|
224
|
-
|
|
225
225
|
if ( tokens[ 0 ] !== 'OFFSET' ) {
|
|
226
226
|
|
|
227
227
|
console.error( 'THREE.BVHLoader: Expected OFFSET but got: ' + tokens[ 0 ] );
|
|
@@ -235,19 +235,19 @@
|
|
|
235
235
|
}
|
|
236
236
|
|
|
237
237
|
const offset = new THREE.Vector3( parseFloat( tokens[ 1 ] ), parseFloat( tokens[ 2 ] ), parseFloat( tokens[ 3 ] ) );
|
|
238
|
-
|
|
239
238
|
if ( isNaN( offset.x ) || isNaN( offset.y ) || isNaN( offset.z ) ) {
|
|
240
239
|
|
|
241
240
|
console.error( 'THREE.BVHLoader: Invalid values of OFFSET.' );
|
|
242
241
|
|
|
243
242
|
}
|
|
244
243
|
|
|
245
|
-
node.offset = offset;
|
|
244
|
+
node.offset = offset;
|
|
245
|
+
|
|
246
|
+
// parse CHANNELS definitions
|
|
246
247
|
|
|
247
248
|
if ( node.type !== 'ENDSITE' ) {
|
|
248
249
|
|
|
249
250
|
tokens = nextLine( lines ).split( /[\s]+/ );
|
|
250
|
-
|
|
251
251
|
if ( tokens[ 0 ] !== 'CHANNELS' ) {
|
|
252
252
|
|
|
253
253
|
console.error( 'THREE.BVHLoader: Expected CHANNELS definition.' );
|
|
@@ -258,13 +258,13 @@
|
|
|
258
258
|
node.channels = tokens.splice( 2, numChannels );
|
|
259
259
|
node.children = [];
|
|
260
260
|
|
|
261
|
-
}
|
|
261
|
+
}
|
|
262
262
|
|
|
263
|
+
// read children
|
|
263
264
|
|
|
264
265
|
while ( true ) {
|
|
265
266
|
|
|
266
267
|
const line = nextLine( lines );
|
|
267
|
-
|
|
268
268
|
if ( line === '}' ) {
|
|
269
269
|
|
|
270
270
|
return node;
|
|
@@ -278,21 +278,19 @@
|
|
|
278
278
|
}
|
|
279
279
|
|
|
280
280
|
}
|
|
281
|
+
|
|
281
282
|
/*
|
|
282
283
|
recursively converts the internal bvh node structure to a THREE.Bone hierarchy
|
|
283
284
|
source: the bvh root node
|
|
284
285
|
list: pass an empty array, collects a flat list of all converted THREE.Bones
|
|
285
286
|
returns the root THREE.Bone
|
|
286
287
|
*/
|
|
287
|
-
|
|
288
|
-
|
|
289
288
|
function toTHREEBone( source, list ) {
|
|
290
289
|
|
|
291
290
|
const bone = new THREE.Bone();
|
|
292
291
|
list.push( bone );
|
|
293
292
|
bone.position.add( source.offset );
|
|
294
293
|
bone.name = source.name;
|
|
295
|
-
|
|
296
294
|
if ( source.type !== 'ENDSITE' ) {
|
|
297
295
|
|
|
298
296
|
for ( let i = 0; i < source.children.length; i ++ ) {
|
|
@@ -306,30 +304,34 @@
|
|
|
306
304
|
return bone;
|
|
307
305
|
|
|
308
306
|
}
|
|
307
|
+
|
|
309
308
|
/*
|
|
310
309
|
builds a THREE.AnimationClip from the keyframe data saved in each bone.
|
|
311
310
|
bone: bvh root node
|
|
312
311
|
returns: a THREE.AnimationClip containing position and quaternion tracks
|
|
313
312
|
*/
|
|
314
|
-
|
|
315
|
-
|
|
316
313
|
function toTHREEAnimation( bones ) {
|
|
317
314
|
|
|
318
|
-
const tracks = [];
|
|
315
|
+
const tracks = [];
|
|
316
|
+
|
|
317
|
+
// create a position and quaternion animation track for each node
|
|
319
318
|
|
|
320
319
|
for ( let i = 0; i < bones.length; i ++ ) {
|
|
321
320
|
|
|
322
321
|
const bone = bones[ i ];
|
|
323
|
-
if ( bone.type === 'ENDSITE' ) continue;
|
|
322
|
+
if ( bone.type === 'ENDSITE' ) continue;
|
|
323
|
+
|
|
324
|
+
// track data
|
|
324
325
|
|
|
325
326
|
const times = [];
|
|
326
327
|
const positions = [];
|
|
327
328
|
const rotations = [];
|
|
328
|
-
|
|
329
329
|
for ( let j = 0; j < bone.frames.length; j ++ ) {
|
|
330
330
|
|
|
331
331
|
const frame = bone.frames[ j ];
|
|
332
|
-
times.push( frame.time );
|
|
332
|
+
times.push( frame.time );
|
|
333
|
+
|
|
334
|
+
// the animation system animates the position property,
|
|
333
335
|
// so we have to add the joint offset to all values
|
|
334
336
|
|
|
335
337
|
positions.push( frame.position.x + bone.offset.x );
|
|
@@ -359,15 +361,14 @@
|
|
|
359
361
|
return new THREE.AnimationClip( 'animation', - 1, tracks );
|
|
360
362
|
|
|
361
363
|
}
|
|
364
|
+
|
|
362
365
|
/*
|
|
363
366
|
returns the next non-empty line in lines
|
|
364
367
|
*/
|
|
365
|
-
|
|
366
|
-
|
|
367
368
|
function nextLine( lines ) {
|
|
368
369
|
|
|
369
|
-
let line;
|
|
370
|
-
|
|
370
|
+
let line;
|
|
371
|
+
// skip empty lines
|
|
371
372
|
while ( ( line = lines.shift().trim() ).length === 0 ) {}
|
|
372
373
|
|
|
373
374
|
return line;
|