@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
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { GPULoadOp, GPUStoreOp } from './constants.js';
|
|
2
|
-
import { Color, Mesh, BoxGeometry, BackSide } from 'three';
|
|
3
|
-
import { context, transformDirection, positionWorld, modelWorldMatrix, MeshBasicNodeMaterial } from 'three/nodes';
|
|
2
|
+
import { Color, Mesh, BoxGeometry, BackSide, EquirectangularReflectionMapping, EquirectangularRefractionMapping } from 'three';
|
|
3
|
+
import { context, vec2, invert, texture, cubeTexture, transformDirection, positionWorld, modelWorldMatrix, viewportBottomLeft, equirectUV, MeshBasicNodeMaterial } from 'three/nodes';
|
|
4
4
|
|
|
5
5
|
let _clearAlpha;
|
|
6
6
|
const _clearColor = new Color();
|
|
@@ -45,7 +45,7 @@ class WebGPUBackground {
|
|
|
45
45
|
_clearAlpha = 1;
|
|
46
46
|
forceClear = true;
|
|
47
47
|
|
|
48
|
-
} else if ( background.isNode === true ) {
|
|
48
|
+
} else if ( background.isNode === true || background.isTexture === true ) {
|
|
49
49
|
|
|
50
50
|
_clearColor.copy( renderer._clearColor );
|
|
51
51
|
_clearAlpha = renderer._clearAlpha;
|
|
@@ -54,12 +54,41 @@ class WebGPUBackground {
|
|
|
54
54
|
|
|
55
55
|
if ( boxMesh === null ) {
|
|
56
56
|
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
57
|
+
let node = null;
|
|
58
|
+
|
|
59
|
+
if ( background.isCubeTexture === true ) {
|
|
60
|
+
|
|
61
|
+
node = cubeTexture( background, transformDirection( positionWorld, modelWorldMatrix ) );
|
|
62
|
+
|
|
63
|
+
} else if ( background.isTexture === true ) {
|
|
64
|
+
|
|
65
|
+
let nodeUV = null;
|
|
66
|
+
|
|
67
|
+
if ( background.mapping === EquirectangularReflectionMapping || background.mapping === EquirectangularRefractionMapping ) {
|
|
68
|
+
|
|
69
|
+
const dirNode = transformDirection( positionWorld, modelWorldMatrix );
|
|
70
|
+
|
|
71
|
+
nodeUV = equirectUV( dirNode );
|
|
72
|
+
nodeUV = vec2( nodeUV.x, invert( nodeUV.y ) );
|
|
73
|
+
|
|
74
|
+
} else {
|
|
75
|
+
|
|
76
|
+
nodeUV = viewportBottomLeft;
|
|
77
|
+
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
node = texture( background, nodeUV );
|
|
81
|
+
|
|
82
|
+
} else /*if ( background.isNode === true )*/ {
|
|
83
|
+
|
|
84
|
+
node = context( background, {
|
|
85
|
+
uvNode: transformDirection( positionWorld, modelWorldMatrix )
|
|
86
|
+
} );
|
|
87
|
+
|
|
88
|
+
}
|
|
60
89
|
|
|
61
90
|
const nodeMaterial = new MeshBasicNodeMaterial();
|
|
62
|
-
nodeMaterial.colorNode =
|
|
91
|
+
nodeMaterial.colorNode = node;
|
|
63
92
|
nodeMaterial.side = BackSide;
|
|
64
93
|
nodeMaterial.depthTest = false;
|
|
65
94
|
nodeMaterial.depthWrite = false;
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { GPUIndexFormat, GPUTextureFormat, GPUStoreOp } from './constants.js';
|
|
2
|
+
import WebGPUAnimation from './WebGPUAnimation.js';
|
|
2
3
|
import WebGPUObjects from './WebGPUObjects.js';
|
|
3
4
|
import WebGPUAttributes from './WebGPUAttributes.js';
|
|
4
5
|
import WebGPUGeometries from './WebGPUGeometries.js';
|
|
@@ -132,6 +133,8 @@ class WebGPURenderer {
|
|
|
132
133
|
this._textures = null;
|
|
133
134
|
this._background = null;
|
|
134
135
|
|
|
136
|
+
this._animation = new WebGPUAnimation();
|
|
137
|
+
|
|
135
138
|
this._renderPassDescriptor = null;
|
|
136
139
|
|
|
137
140
|
this._currentRenderState = null;
|
|
@@ -147,6 +150,8 @@ class WebGPURenderer {
|
|
|
147
150
|
|
|
148
151
|
this._renderTarget = null;
|
|
149
152
|
|
|
153
|
+
this._initialized = false;
|
|
154
|
+
|
|
150
155
|
// some parameters require default values other than "undefined"
|
|
151
156
|
|
|
152
157
|
this._parameters.antialias = ( parameters.antialias === true );
|
|
@@ -168,6 +173,12 @@ class WebGPURenderer {
|
|
|
168
173
|
|
|
169
174
|
async init() {
|
|
170
175
|
|
|
176
|
+
if ( this._initialized === true ) {
|
|
177
|
+
|
|
178
|
+
throw new Error( 'WebGPURenderer: Device has already been initialized.' );
|
|
179
|
+
|
|
180
|
+
}
|
|
181
|
+
|
|
171
182
|
const parameters = this._parameters;
|
|
172
183
|
|
|
173
184
|
const adapterOptions = {
|
|
@@ -192,7 +203,7 @@ class WebGPURenderer {
|
|
|
192
203
|
const context = ( parameters.context !== undefined ) ? parameters.context : this.domElement.getContext( 'webgpu' );
|
|
193
204
|
|
|
194
205
|
context.configure( {
|
|
195
|
-
device
|
|
206
|
+
device,
|
|
196
207
|
format: GPUTextureFormat.BGRA8Unorm, // this is the only valid context format right now (r121)
|
|
197
208
|
alphaMode: 'premultiplied'
|
|
198
209
|
} );
|
|
@@ -232,16 +243,21 @@ class WebGPURenderer {
|
|
|
232
243
|
this._setupColorBuffer();
|
|
233
244
|
this._setupDepthBuffer();
|
|
234
245
|
|
|
235
|
-
|
|
246
|
+
this._animation.setNodes( this._nodes );
|
|
247
|
+
this._animation.start();
|
|
248
|
+
|
|
249
|
+
this._initialized = true;
|
|
236
250
|
|
|
237
|
-
|
|
251
|
+
}
|
|
238
252
|
|
|
239
|
-
|
|
253
|
+
async render( scene, camera ) {
|
|
240
254
|
|
|
241
|
-
this.
|
|
255
|
+
if ( this._initialized === false ) return await this.init();
|
|
242
256
|
|
|
243
257
|
//
|
|
244
258
|
|
|
259
|
+
if ( this._animation.isAnimating === false ) this._nodes.updateFrame();
|
|
260
|
+
|
|
245
261
|
if ( scene.matrixWorldAutoUpdate === true ) scene.updateMatrixWorld();
|
|
246
262
|
|
|
247
263
|
if ( camera.parent === null && camera.matrixWorldAutoUpdate === true ) camera.updateMatrixWorld();
|
|
@@ -276,6 +292,8 @@ class WebGPURenderer {
|
|
|
276
292
|
|
|
277
293
|
if ( renderTarget !== null ) {
|
|
278
294
|
|
|
295
|
+
this._textures.initRenderTarget( renderTarget );
|
|
296
|
+
|
|
279
297
|
// @TODO: Support RenderTarget with antialiasing.
|
|
280
298
|
|
|
281
299
|
const renderTargetProperties = this._properties.get( renderTarget );
|
|
@@ -354,6 +372,24 @@ class WebGPURenderer {
|
|
|
354
372
|
|
|
355
373
|
}
|
|
356
374
|
|
|
375
|
+
setAnimationLoop( callback ) {
|
|
376
|
+
|
|
377
|
+
if ( this._initialized === false ) this.init();
|
|
378
|
+
|
|
379
|
+
const animation = this._animation;
|
|
380
|
+
|
|
381
|
+
animation.setAnimationLoop( callback );
|
|
382
|
+
|
|
383
|
+
( callback === null ) ? animation.stop() : animation.start();
|
|
384
|
+
|
|
385
|
+
}
|
|
386
|
+
|
|
387
|
+
async getArrayFromBuffer( attribute ) {
|
|
388
|
+
|
|
389
|
+
return await this._attributes.getArrayBuffer( attribute );
|
|
390
|
+
|
|
391
|
+
}
|
|
392
|
+
|
|
357
393
|
getContext() {
|
|
358
394
|
|
|
359
395
|
return this._context;
|
|
@@ -571,21 +607,20 @@ class WebGPURenderer {
|
|
|
571
607
|
this._renderStates.dispose();
|
|
572
608
|
this._textures.dispose();
|
|
573
609
|
|
|
610
|
+
this.setRenderTarget( null );
|
|
611
|
+
this.setAnimationLoop( null );
|
|
612
|
+
|
|
574
613
|
}
|
|
575
614
|
|
|
576
615
|
setRenderTarget( renderTarget ) {
|
|
577
616
|
|
|
578
617
|
this._renderTarget = renderTarget;
|
|
579
618
|
|
|
580
|
-
if ( renderTarget !== null ) {
|
|
581
|
-
|
|
582
|
-
this._textures.initRenderTarget( renderTarget );
|
|
583
|
-
|
|
584
|
-
}
|
|
585
|
-
|
|
586
619
|
}
|
|
587
620
|
|
|
588
|
-
compute( ...computeNodes ) {
|
|
621
|
+
async compute( ...computeNodes ) {
|
|
622
|
+
|
|
623
|
+
if ( this._initialized === false ) return await this.init();
|
|
589
624
|
|
|
590
625
|
const device = this._device;
|
|
591
626
|
const computePipelines = this._computePipelines;
|
|
@@ -78,9 +78,9 @@ fn threejs_mod( x : f32, y : f32 ) -> f32 {
|
|
|
78
78
|
}
|
|
79
79
|
` ),
|
|
80
80
|
repeatWrapping: new CodeNode( `
|
|
81
|
-
fn threejs_repeatWrapping( uv : vec2<f32>, dimension : vec2<
|
|
81
|
+
fn threejs_repeatWrapping( uv : vec2<f32>, dimension : vec2<u32> ) -> vec2<u32> {
|
|
82
82
|
|
|
83
|
-
let uvScaled = vec2<
|
|
83
|
+
let uvScaled = vec2<u32>( uv * vec2<f32>( dimension ) );
|
|
84
84
|
|
|
85
85
|
return ( ( uvScaled % dimension ) + dimension ) % dimension;
|
|
86
86
|
|
|
@@ -200,7 +200,7 @@ class WebGPUNodeBuilder extends NodeBuilder {
|
|
|
200
200
|
|
|
201
201
|
getPropertyName( node, shaderStage = this.shaderStage ) {
|
|
202
202
|
|
|
203
|
-
if ( node.isNodeVarying === true ) {
|
|
203
|
+
if ( node.isNodeVarying === true && node.needsInterpolation === true ) {
|
|
204
204
|
|
|
205
205
|
if ( shaderStage === 'vertex' ) {
|
|
206
206
|
|
|
@@ -399,6 +399,18 @@ class WebGPUNodeBuilder extends NodeBuilder {
|
|
|
399
399
|
|
|
400
400
|
}
|
|
401
401
|
|
|
402
|
+
getFragCoord() {
|
|
403
|
+
|
|
404
|
+
return this.getBuiltin( 'position', 'fragCoord', 'vec4<f32>', 'fragment' );
|
|
405
|
+
|
|
406
|
+
}
|
|
407
|
+
|
|
408
|
+
isFlipY() {
|
|
409
|
+
|
|
410
|
+
return false;
|
|
411
|
+
|
|
412
|
+
}
|
|
413
|
+
|
|
402
414
|
getAttributes( shaderStage ) {
|
|
403
415
|
|
|
404
416
|
const snippets = [];
|
|
@@ -463,24 +475,42 @@ class WebGPUNodeBuilder extends NodeBuilder {
|
|
|
463
475
|
this.getBuiltin( 'position', 'Vertex', 'vec4<f32>', 'vertex' );
|
|
464
476
|
|
|
465
477
|
const varyings = this.varyings;
|
|
478
|
+
const vars = this.vars[ shaderStage ];
|
|
466
479
|
|
|
467
480
|
for ( let index = 0; index < varyings.length; index ++ ) {
|
|
468
481
|
|
|
469
482
|
const varying = varyings[ index ];
|
|
470
483
|
|
|
471
|
-
|
|
484
|
+
if ( varying.needsInterpolation ) {
|
|
485
|
+
|
|
486
|
+
snippets.push( `@location( ${index} ) ${ varying.name } : ${ this.getType( varying.type ) }` );
|
|
487
|
+
|
|
488
|
+
} else if ( vars.includes( varying ) === false ) {
|
|
489
|
+
|
|
490
|
+
vars.push( varying );
|
|
491
|
+
|
|
492
|
+
}
|
|
472
493
|
|
|
473
494
|
}
|
|
474
495
|
|
|
475
496
|
} else if ( shaderStage === 'fragment' ) {
|
|
476
497
|
|
|
477
498
|
const varyings = this.varyings;
|
|
499
|
+
const vars = this.vars[ shaderStage ];
|
|
478
500
|
|
|
479
501
|
for ( let index = 0; index < varyings.length; index ++ ) {
|
|
480
502
|
|
|
481
503
|
const varying = varyings[ index ];
|
|
482
504
|
|
|
483
|
-
|
|
505
|
+
if ( varying.needsInterpolation ) {
|
|
506
|
+
|
|
507
|
+
snippets.push( `@location( ${index} ) ${ varying.name } : ${ this.getType( varying.type ) }` );
|
|
508
|
+
|
|
509
|
+
} else if ( vars.includes( varying ) === false ) {
|
|
510
|
+
|
|
511
|
+
vars.push( varying );
|
|
512
|
+
|
|
513
|
+
}
|
|
484
514
|
|
|
485
515
|
}
|
|
486
516
|
|
|
@@ -45,8 +45,6 @@ void RE_IndirectDiffuse_BlinnPhong( const in vec3 irradiance, const in Geometric
|
|
|
45
45
|
|
|
46
46
|
#define RE_Direct RE_Direct_BlinnPhong
|
|
47
47
|
#define RE_IndirectDiffuse RE_IndirectDiffuse_BlinnPhong
|
|
48
|
-
|
|
49
|
-
#define Material_LightProbeLOD( material ) (0)
|
|
50
48
|
`;
|
|
51
49
|
|
|
52
50
|
const mmd_toon_matcap_fragment = /* glsl */`
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
import {
|
|
2
|
+
UniformsLib,
|
|
3
|
+
UniformsUtils,
|
|
4
|
+
Matrix4
|
|
5
|
+
} from 'three';
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Mesh Velocity Shader @bhouston
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
const VelocityShader = {
|
|
12
|
+
|
|
13
|
+
uniforms: UniformsUtils.merge( [
|
|
14
|
+
UniformsLib.common,
|
|
15
|
+
UniformsLib.displacementmap,
|
|
16
|
+
{
|
|
17
|
+
modelMatrixPrev: { value: new Matrix4() },
|
|
18
|
+
currentProjectionViewMatrix: { value: new Matrix4() },
|
|
19
|
+
previousProjectionViewMatrix: { value: new Matrix4() }
|
|
20
|
+
}
|
|
21
|
+
] ),
|
|
22
|
+
|
|
23
|
+
vertexShader: /* glsl */`
|
|
24
|
+
#define NORMAL
|
|
25
|
+
|
|
26
|
+
#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( TANGENTSPACE_NORMALMAP )
|
|
27
|
+
|
|
28
|
+
varying vec3 vViewPosition;
|
|
29
|
+
|
|
30
|
+
#endif
|
|
31
|
+
|
|
32
|
+
#include <common>
|
|
33
|
+
#include <packing>
|
|
34
|
+
#include <uv_pars_vertex>
|
|
35
|
+
#include <displacementmap_pars_vertex>
|
|
36
|
+
#include <normal_pars_vertex>
|
|
37
|
+
#include <morphtarget_pars_vertex>
|
|
38
|
+
#include <skinning_pars_vertex>
|
|
39
|
+
#include <logdepthbuf_pars_vertex>
|
|
40
|
+
#include <clipping_planes_pars_vertex>
|
|
41
|
+
|
|
42
|
+
uniform mat4 previousProjectionViewMatrix;
|
|
43
|
+
uniform mat4 currentProjectionViewMatrix;
|
|
44
|
+
|
|
45
|
+
uniform mat4 modelMatrixPrev;
|
|
46
|
+
|
|
47
|
+
varying vec4 clipPositionCurrent;
|
|
48
|
+
varying vec4 clipPositionPrevious;
|
|
49
|
+
|
|
50
|
+
void main() {
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
#include <uv_vertex>
|
|
54
|
+
|
|
55
|
+
#include <beginnormal_vertex>
|
|
56
|
+
#include <morphnormal_vertex>
|
|
57
|
+
#include <skinbase_vertex>
|
|
58
|
+
#include <skinnormal_vertex>
|
|
59
|
+
#include <defaultnormal_vertex>
|
|
60
|
+
#include <normal_vertex>
|
|
61
|
+
|
|
62
|
+
#include <begin_vertex>
|
|
63
|
+
#include <morphtarget_vertex>
|
|
64
|
+
#include <displacementmap_vertex>
|
|
65
|
+
#include <morphtarget_vertex>
|
|
66
|
+
#include <skinning_vertex>
|
|
67
|
+
|
|
68
|
+
#ifdef USE_SKINNING
|
|
69
|
+
|
|
70
|
+
vec4 mvPosition = modelViewMatrix * skinned;
|
|
71
|
+
clipPositionCurrent = currentProjectionViewMatrix * modelMatrix * skinned;
|
|
72
|
+
clipPositionPrevious = previousProjectionViewMatrix * modelMatrixPrev * skinned;
|
|
73
|
+
|
|
74
|
+
#else
|
|
75
|
+
|
|
76
|
+
vec4 mvPosition = modelViewMatrix * vec4( transformed, 1.0 );
|
|
77
|
+
clipPositionCurrent = currentProjectionViewMatrix * modelMatrix * vec4( transformed, 1.0 );
|
|
78
|
+
clipPositionPrevious = previousProjectionViewMatrix * modelMatrixPrev * vec4( transformed, 1.0 );
|
|
79
|
+
|
|
80
|
+
#endif
|
|
81
|
+
|
|
82
|
+
gl_Position = projectionMatrix * mvPosition;
|
|
83
|
+
|
|
84
|
+
#include <logdepthbuf_vertex>
|
|
85
|
+
#include <clipping_planes_vertex>
|
|
86
|
+
}
|
|
87
|
+
`,
|
|
88
|
+
fragmentShader: /* glsl */`
|
|
89
|
+
#define NORMAL
|
|
90
|
+
|
|
91
|
+
uniform float opacity;
|
|
92
|
+
|
|
93
|
+
#include <packing>
|
|
94
|
+
#include <uv_pars_fragment>
|
|
95
|
+
#include <map_pars_fragment>
|
|
96
|
+
#include <alphamap_pars_fragment>
|
|
97
|
+
#include <alphatest_pars_fragment>
|
|
98
|
+
#include <logdepthbuf_pars_fragment>
|
|
99
|
+
#include <clipping_planes_pars_fragment>
|
|
100
|
+
|
|
101
|
+
varying vec4 clipPositionCurrent;
|
|
102
|
+
varying vec4 clipPositionPrevious;
|
|
103
|
+
|
|
104
|
+
void main() {
|
|
105
|
+
|
|
106
|
+
vec4 diffuseColor = vec4( 1.0 );
|
|
107
|
+
diffuseColor.a = opacity;
|
|
108
|
+
|
|
109
|
+
#include <map_fragment>
|
|
110
|
+
#include <alphamap_fragment>
|
|
111
|
+
#include <alphatest_fragment>
|
|
112
|
+
|
|
113
|
+
vec2 ndcPositionCurrent = clipPositionCurrent.xy/clipPositionCurrent.w;
|
|
114
|
+
vec2 ndcPositionPrevious = clipPositionPrevious.xy/clipPositionPrevious.w;
|
|
115
|
+
vec2 vel = ( ndcPositionCurrent - ndcPositionPrevious ) * 0.5;
|
|
116
|
+
vel = vel * 0.5 + 0.5;
|
|
117
|
+
vec2 v1 = packDepthToRG(vel.x);
|
|
118
|
+
vec2 v2 = packDepthToRG(vel.y);
|
|
119
|
+
gl_FragColor = vec4(v1.x, v1.y, v2.x, v2.y);
|
|
120
|
+
|
|
121
|
+
#include <logdepthbuf_fragment>
|
|
122
|
+
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
`
|
|
126
|
+
};
|
|
127
|
+
|
|
128
|
+
export { VelocityShader };
|
|
@@ -192,11 +192,6 @@ function mergeBufferGeometries( geometries, useGroups = false ) {
|
|
|
192
192
|
|
|
193
193
|
}
|
|
194
194
|
|
|
195
|
-
// gather .userData
|
|
196
|
-
|
|
197
|
-
mergedGeometry.userData.mergedUserData = mergedGeometry.userData.mergedUserData || [];
|
|
198
|
-
mergedGeometry.userData.mergedUserData.push( geometry.userData );
|
|
199
|
-
|
|
200
195
|
if ( useGroups ) {
|
|
201
196
|
|
|
202
197
|
let count;
|
|
@@ -371,6 +366,28 @@ function mergeBufferAttributes( attributes ) {
|
|
|
371
366
|
|
|
372
367
|
}
|
|
373
368
|
|
|
369
|
+
/**
|
|
370
|
+
* @param {BufferAttribute}
|
|
371
|
+
* @return {BufferAttribute}
|
|
372
|
+
*/
|
|
373
|
+
export function deepCloneAttribute( attribute ) {
|
|
374
|
+
|
|
375
|
+
if ( attribute.isInstancedInterleavedBufferAttribute || attribute.isInterleavedBufferAttribute ) {
|
|
376
|
+
|
|
377
|
+
return deinterleaveAttribute( attribute );
|
|
378
|
+
|
|
379
|
+
}
|
|
380
|
+
|
|
381
|
+
if ( attribute.isInstancedBufferAttribute ) {
|
|
382
|
+
|
|
383
|
+
return new InstancedBufferAttribute().copy( attribute );
|
|
384
|
+
|
|
385
|
+
}
|
|
386
|
+
|
|
387
|
+
return new BufferAttribute().copy( attribute );
|
|
388
|
+
|
|
389
|
+
}
|
|
390
|
+
|
|
374
391
|
/**
|
|
375
392
|
* @param {Array<BufferAttribute>} attributes
|
|
376
393
|
* @return {Array<InterleavedBufferAttribute>}
|
|
@@ -1208,6 +1225,112 @@ function mergeGroups( geometry ) {
|
|
|
1208
1225
|
|
|
1209
1226
|
}
|
|
1210
1227
|
|
|
1228
|
+
|
|
1229
|
+
// Creates a new, non-indexed geometry with smooth normals everywhere except faces that meet at
|
|
1230
|
+
// an angle greater than the crease angle.
|
|
1231
|
+
function toCreasedNormals( geometry, creaseAngle = Math.PI / 3 /* 60 degrees */ ) {
|
|
1232
|
+
|
|
1233
|
+
const creaseDot = Math.cos( creaseAngle );
|
|
1234
|
+
const hashMultiplier = ( 1 + 1e-10 ) * 1e2;
|
|
1235
|
+
|
|
1236
|
+
// reusable vertors
|
|
1237
|
+
const verts = [ new Vector3(), new Vector3(), new Vector3() ];
|
|
1238
|
+
const tempVec1 = new Vector3();
|
|
1239
|
+
const tempVec2 = new Vector3();
|
|
1240
|
+
const tempNorm = new Vector3();
|
|
1241
|
+
const tempNorm2 = new Vector3();
|
|
1242
|
+
|
|
1243
|
+
// hashes a vector
|
|
1244
|
+
function hashVertex( v ) {
|
|
1245
|
+
|
|
1246
|
+
const x = ~ ~ ( v.x * hashMultiplier );
|
|
1247
|
+
const y = ~ ~ ( v.y * hashMultiplier );
|
|
1248
|
+
const z = ~ ~ ( v.z * hashMultiplier );
|
|
1249
|
+
return `${x},${y},${z}`;
|
|
1250
|
+
|
|
1251
|
+
}
|
|
1252
|
+
|
|
1253
|
+
const resultGeometry = geometry.toNonIndexed();
|
|
1254
|
+
const posAttr = resultGeometry.attributes.position;
|
|
1255
|
+
const vertexMap = {};
|
|
1256
|
+
|
|
1257
|
+
// find all the normals shared by commonly located vertices
|
|
1258
|
+
for ( let i = 0, l = posAttr.count / 3; i < l; i ++ ) {
|
|
1259
|
+
|
|
1260
|
+
const i3 = 3 * i;
|
|
1261
|
+
const a = verts[ 0 ].fromBufferAttribute( posAttr, i3 + 0 );
|
|
1262
|
+
const b = verts[ 1 ].fromBufferAttribute( posAttr, i3 + 1 );
|
|
1263
|
+
const c = verts[ 2 ].fromBufferAttribute( posAttr, i3 + 2 );
|
|
1264
|
+
|
|
1265
|
+
tempVec1.subVectors( c, b );
|
|
1266
|
+
tempVec2.subVectors( a, b );
|
|
1267
|
+
|
|
1268
|
+
// add the normal to the map for all vertices
|
|
1269
|
+
const normal = new Vector3().crossVectors( tempVec1, tempVec2 ).normalize();
|
|
1270
|
+
for ( let n = 0; n < 3; n ++ ) {
|
|
1271
|
+
|
|
1272
|
+
const vert = verts[ n ];
|
|
1273
|
+
const hash = hashVertex( vert );
|
|
1274
|
+
if ( ! ( hash in vertexMap ) ) {
|
|
1275
|
+
|
|
1276
|
+
vertexMap[ hash ] = [];
|
|
1277
|
+
|
|
1278
|
+
}
|
|
1279
|
+
|
|
1280
|
+
vertexMap[ hash ].push( normal );
|
|
1281
|
+
|
|
1282
|
+
}
|
|
1283
|
+
|
|
1284
|
+
}
|
|
1285
|
+
|
|
1286
|
+
// average normals from all vertices that share a common location if they are within the
|
|
1287
|
+
// provided crease threshold
|
|
1288
|
+
const normalArray = new Float32Array( posAttr.count * 3 );
|
|
1289
|
+
const normAttr = new BufferAttribute( normalArray, 3, false );
|
|
1290
|
+
for ( let i = 0, l = posAttr.count / 3; i < l; i ++ ) {
|
|
1291
|
+
|
|
1292
|
+
// get the face normal for this vertex
|
|
1293
|
+
const i3 = 3 * i;
|
|
1294
|
+
const a = verts[ 0 ].fromBufferAttribute( posAttr, i3 + 0 );
|
|
1295
|
+
const b = verts[ 1 ].fromBufferAttribute( posAttr, i3 + 1 );
|
|
1296
|
+
const c = verts[ 2 ].fromBufferAttribute( posAttr, i3 + 2 );
|
|
1297
|
+
|
|
1298
|
+
tempVec1.subVectors( c, b );
|
|
1299
|
+
tempVec2.subVectors( a, b );
|
|
1300
|
+
|
|
1301
|
+
tempNorm.crossVectors( tempVec1, tempVec2 ).normalize();
|
|
1302
|
+
|
|
1303
|
+
// average all normals that meet the threshold and set the normal value
|
|
1304
|
+
for ( let n = 0; n < 3; n ++ ) {
|
|
1305
|
+
|
|
1306
|
+
const vert = verts[ n ];
|
|
1307
|
+
const hash = hashVertex( vert );
|
|
1308
|
+
const otherNormals = vertexMap[ hash ];
|
|
1309
|
+
tempNorm2.set( 0, 0, 0 );
|
|
1310
|
+
|
|
1311
|
+
for ( let k = 0, lk = otherNormals.length; k < lk; k ++ ) {
|
|
1312
|
+
|
|
1313
|
+
const otherNorm = otherNormals[ k ];
|
|
1314
|
+
if ( tempNorm.dot( otherNorm ) > creaseDot ) {
|
|
1315
|
+
|
|
1316
|
+
tempNorm2.add( otherNorm );
|
|
1317
|
+
|
|
1318
|
+
}
|
|
1319
|
+
|
|
1320
|
+
}
|
|
1321
|
+
|
|
1322
|
+
tempNorm2.normalize();
|
|
1323
|
+
normAttr.setXYZ( i3 + n, tempNorm2.x, tempNorm2.y, tempNorm2.z );
|
|
1324
|
+
|
|
1325
|
+
}
|
|
1326
|
+
|
|
1327
|
+
}
|
|
1328
|
+
|
|
1329
|
+
resultGeometry.setAttribute( 'normal', normAttr );
|
|
1330
|
+
return resultGeometry;
|
|
1331
|
+
|
|
1332
|
+
}
|
|
1333
|
+
|
|
1211
1334
|
export {
|
|
1212
1335
|
computeTangents,
|
|
1213
1336
|
computeMikkTSpaceTangents,
|
|
@@ -1218,5 +1341,6 @@ export {
|
|
|
1218
1341
|
mergeVertices,
|
|
1219
1342
|
toTrianglesDrawMode,
|
|
1220
1343
|
computeMorphedAttributes,
|
|
1221
|
-
mergeGroups
|
|
1344
|
+
mergeGroups,
|
|
1345
|
+
toCreasedNormals
|
|
1222
1346
|
};
|