@plastic-software/three 0.175.14 → 0.179.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/README.md +4 -4
- package/build/three.cjs +8402 -6787
- package/build/three.core.js +8007 -6688
- package/build/three.core.min.js +1 -1
- package/build/three.module.js +397 -102
- package/build/three.module.min.js +1 -1
- package/build/three.tsl.js +84 -27
- package/build/three.tsl.min.js +1 -1
- package/build/three.webgpu.js +6831 -2838
- package/build/three.webgpu.min.js +1 -1
- package/build/three.webgpu.nodes.js +6648 -2838
- package/build/three.webgpu.nodes.min.js +1 -1
- package/examples/jsm/Addons.js +1 -3
- package/examples/jsm/animation/AnimationClipCreator.js +1 -0
- package/examples/jsm/animation/CCDIKSolver.js +6 -3
- package/examples/jsm/capabilities/WebGL.js +1 -27
- package/examples/jsm/capabilities/WebGPU.js +2 -1
- package/examples/jsm/controls/ArcballControls.js +15 -4
- package/examples/jsm/controls/DragControls.js +1 -0
- package/examples/jsm/controls/FirstPersonControls.js +1 -0
- package/examples/jsm/controls/FlyControls.js +1 -0
- package/examples/jsm/controls/MapControls.js +1 -0
- package/examples/jsm/controls/OrbitControls.js +1 -0
- package/examples/jsm/controls/PointerLockControls.js +5 -3
- package/examples/jsm/controls/TrackballControls.js +1 -0
- package/examples/jsm/controls/TransformControls.js +62 -14
- package/examples/jsm/csm/CSM.js +2 -0
- package/examples/jsm/csm/CSMFrustum.js +2 -0
- package/examples/jsm/csm/CSMHelper.js +1 -0
- package/examples/jsm/csm/CSMShader.js +4 -1
- package/examples/jsm/csm/CSMShadowNode.js +22 -8
- package/examples/jsm/curves/CurveExtras.js +14 -0
- package/examples/jsm/curves/NURBSCurve.js +1 -0
- package/examples/jsm/curves/NURBSSurface.js +2 -0
- package/examples/jsm/curves/NURBSUtils.js +4 -1
- package/examples/jsm/curves/NURBSVolume.js +2 -0
- package/examples/jsm/effects/AnaglyphEffect.js +2 -0
- package/examples/jsm/effects/AsciiEffect.js +2 -0
- package/examples/jsm/effects/OutlineEffect.js +2 -0
- package/examples/jsm/effects/ParallaxBarrierEffect.js +2 -0
- package/examples/jsm/effects/StereoEffect.js +2 -0
- package/examples/jsm/environments/DebugEnvironment.js +1 -0
- package/examples/jsm/environments/RoomEnvironment.js +57 -38
- package/examples/jsm/exporters/DRACOExporter.js +4 -2
- package/examples/jsm/exporters/EXRExporter.js +2 -0
- package/examples/jsm/exporters/GLTFExporter.js +7 -4
- package/examples/jsm/exporters/KTX2Exporter.js +2 -0
- package/examples/jsm/exporters/OBJExporter.js +3 -1
- package/examples/jsm/exporters/PLYExporter.js +4 -2
- package/examples/jsm/exporters/STLExporter.js +2 -0
- package/examples/jsm/exporters/USDZExporter.js +679 -300
- package/examples/jsm/geometries/BoxLineGeometry.js +1 -0
- package/examples/jsm/geometries/ConvexGeometry.js +1 -0
- package/examples/jsm/geometries/DecalGeometry.js +1 -0
- package/examples/jsm/geometries/ParametricFunctions.js +4 -1
- package/examples/jsm/geometries/ParametricGeometry.js +1 -0
- package/examples/jsm/geometries/RoundedBoxGeometry.js +48 -8
- package/examples/jsm/geometries/TeapotGeometry.js +1 -0
- package/examples/jsm/geometries/TextGeometry.js +1 -0
- package/examples/jsm/helpers/LightProbeHelper.js +1 -0
- package/examples/jsm/helpers/LightProbeHelperGPU.js +1 -0
- package/examples/jsm/helpers/OctreeHelper.js +1 -0
- package/examples/jsm/helpers/PositionalAudioHelper.js +1 -0
- package/examples/jsm/helpers/RapierHelper.js +59 -0
- package/examples/jsm/helpers/RectAreaLightHelper.js +1 -0
- package/examples/jsm/helpers/TextureHelper.js +1 -0
- package/examples/jsm/helpers/TextureHelperGPU.js +5 -4
- package/examples/jsm/helpers/VertexNormalsHelper.js +1 -0
- package/examples/jsm/helpers/VertexTangentsHelper.js +1 -0
- package/examples/jsm/helpers/ViewHelper.js +1 -0
- package/examples/jsm/interactive/HTMLMesh.js +11 -2
- package/examples/jsm/interactive/InteractiveGroup.js +1 -0
- package/examples/jsm/interactive/SelectionBox.js +2 -0
- package/examples/jsm/interactive/SelectionHelper.js +2 -0
- package/examples/jsm/libs/meshopt_decoder.module.js +75 -58
- package/examples/jsm/lighting/TiledLighting.js +1 -0
- package/examples/jsm/lights/LightProbeGenerator.js +15 -3
- package/examples/jsm/lights/RectAreaLightTexturesLib.js +1 -0
- package/examples/jsm/lights/RectAreaLightUniformsLib.js +1 -0
- package/examples/jsm/lines/Line2.js +1 -0
- package/examples/jsm/lines/LineGeometry.js +1 -0
- package/examples/jsm/lines/LineMaterial.js +4 -4
- package/examples/jsm/lines/LineSegments2.js +1 -0
- package/examples/jsm/lines/LineSegmentsGeometry.js +1 -0
- package/examples/jsm/lines/Wireframe.js +1 -0
- package/examples/jsm/lines/WireframeGeometry2.js +1 -0
- package/examples/jsm/lines/webgpu/Line2.js +1 -0
- package/examples/jsm/lines/webgpu/LineSegments2.js +3 -1
- package/examples/jsm/lines/webgpu/Wireframe.js +1 -0
- package/examples/jsm/loaders/3DMLoader.js +1 -0
- package/examples/jsm/loaders/3MFLoader.js +1 -0
- package/examples/jsm/loaders/AMFLoader.js +1 -0
- package/examples/jsm/loaders/BVHLoader.js +1 -0
- package/examples/jsm/loaders/ColladaLoader.js +6 -5
- package/examples/jsm/loaders/DDSLoader.js +1 -0
- package/examples/jsm/loaders/DRACOLoader.js +2 -1
- package/examples/jsm/loaders/EXRLoader.js +211 -22
- package/examples/jsm/loaders/FBXLoader.js +25 -23
- package/examples/jsm/loaders/FontLoader.js +1 -0
- package/examples/jsm/loaders/GCodeLoader.js +1 -0
- package/examples/jsm/loaders/GLTFLoader.js +10 -82
- package/examples/jsm/loaders/HDRCubeTextureLoader.js +1 -0
- package/examples/jsm/loaders/IESLoader.js +1 -0
- package/examples/jsm/loaders/KMZLoader.js +1 -0
- package/examples/jsm/loaders/KTX2Loader.js +67 -26
- package/examples/jsm/loaders/KTXLoader.js +1 -0
- package/examples/jsm/loaders/LDrawLoader.js +55 -3
- package/examples/jsm/loaders/LUT3dlLoader.js +1 -0
- package/examples/jsm/loaders/LUTCubeLoader.js +1 -0
- package/examples/jsm/loaders/LUTImageLoader.js +1 -0
- package/examples/jsm/loaders/LWOLoader.js +1 -13
- package/examples/jsm/loaders/LottieLoader.js +15 -0
- package/examples/jsm/loaders/MD2Loader.js +1 -0
- package/examples/jsm/loaders/MDDLoader.js +1 -0
- package/examples/jsm/loaders/MTLLoader.js +4 -3
- package/examples/jsm/loaders/MaterialXLoader.js +213 -30
- package/examples/jsm/loaders/NRRDLoader.js +1 -0
- package/examples/jsm/loaders/OBJLoader.js +1 -0
- package/examples/jsm/loaders/PCDLoader.js +122 -19
- package/examples/jsm/loaders/PDBLoader.js +1 -0
- package/examples/jsm/loaders/PLYLoader.js +1 -0
- package/examples/jsm/loaders/PVRLoader.js +1 -0
- package/examples/jsm/loaders/RGBELoader.js +1 -0
- package/examples/jsm/loaders/RGBMLoader.js +1 -0
- package/examples/jsm/loaders/STLLoader.js +1 -0
- package/examples/jsm/loaders/SVGLoader.js +1 -0
- package/examples/jsm/loaders/TDSLoader.js +1 -0
- package/examples/jsm/loaders/TGALoader.js +1 -0
- package/examples/jsm/loaders/TIFFLoader.js +1 -0
- package/examples/jsm/loaders/TTFLoader.js +14 -1
- package/examples/jsm/loaders/USDLoader.js +219 -0
- package/examples/jsm/loaders/USDZLoader.js +4 -891
- package/examples/jsm/loaders/UltraHDRLoader.js +1 -0
- package/examples/jsm/loaders/VOXLoader.js +1 -0
- package/examples/jsm/loaders/VRMLLoader.js +3 -2
- package/examples/jsm/loaders/VTKLoader.js +1 -0
- package/examples/jsm/loaders/XYZLoader.js +1 -0
- package/examples/jsm/loaders/lwo/IFFParser.js +74 -74
- package/examples/jsm/loaders/usd/USDAParser.js +741 -0
- package/examples/jsm/loaders/usd/USDCParser.js +17 -0
- package/examples/jsm/materials/LDrawConditionalLineMaterial.js +1 -0
- package/examples/jsm/materials/LDrawConditionalLineNodeMaterial.js +1 -0
- package/examples/jsm/materials/MeshPostProcessingMaterial.js +1 -0
- package/examples/jsm/math/Capsule.js +2 -0
- package/examples/jsm/math/ColorConverter.js +1 -0
- package/examples/jsm/math/ConvexHull.js +2 -0
- package/examples/jsm/math/ImprovedNoise.js +19 -14
- package/examples/jsm/math/Lut.js +2 -0
- package/examples/jsm/math/MeshSurfaceSampler.js +2 -0
- package/examples/jsm/math/OBB.js +2 -0
- package/examples/jsm/math/Octree.js +20 -1
- package/examples/jsm/math/SimplexNoise.js +2 -0
- package/examples/jsm/misc/ConvexObjectBreaker.js +3 -1
- package/examples/jsm/misc/GPUComputationRenderer.js +2 -0
- package/examples/jsm/misc/Gyroscope.js +1 -0
- package/examples/jsm/misc/MD2Character.js +2 -0
- package/examples/jsm/misc/MD2CharacterComplex.js +5 -3
- package/examples/jsm/misc/MorphAnimMesh.js +1 -0
- package/examples/jsm/misc/MorphBlendMesh.js +1 -0
- package/examples/jsm/misc/ProgressiveLightMap.js +2 -0
- package/examples/jsm/misc/ProgressiveLightMapGPU.js +2 -0
- package/examples/jsm/misc/RollerCoaster.js +5 -0
- package/examples/jsm/misc/TubePainter.js +1 -0
- package/examples/jsm/misc/Volume.js +2 -0
- package/examples/jsm/misc/VolumeSlice.js +1 -0
- package/examples/jsm/modifiers/CurveModifier.js +3 -0
- package/examples/jsm/modifiers/CurveModifierGPU.js +2 -0
- package/examples/jsm/modifiers/EdgeSplitModifier.js +2 -0
- package/examples/jsm/modifiers/SimplifyModifier.js +2 -0
- package/examples/jsm/modifiers/TessellateModifier.js +2 -0
- package/examples/jsm/objects/GroundedSkybox.js +1 -0
- package/examples/jsm/objects/Lensflare.js +3 -0
- package/examples/jsm/objects/LensflareMesh.js +4 -3
- package/examples/jsm/objects/MarchingCubes.js +2 -0
- package/examples/jsm/objects/Reflector.js +1 -0
- package/examples/jsm/objects/ReflectorForSSRPass.js +1 -0
- package/examples/jsm/objects/Refractor.js +1 -0
- package/examples/jsm/objects/ShadowMesh.js +1 -0
- package/examples/jsm/objects/Sky.js +2 -1
- package/examples/jsm/objects/SkyMesh.js +22 -19
- package/examples/jsm/objects/Water.js +1 -0
- package/examples/jsm/objects/Water2.js +1 -0
- package/examples/jsm/objects/Water2Mesh.js +3 -1
- package/examples/jsm/objects/WaterMesh.js +2 -1
- package/examples/jsm/physics/AmmoPhysics.js +1 -0
- package/examples/jsm/physics/JoltPhysics.js +1 -0
- package/examples/jsm/physics/RapierPhysics.js +149 -13
- package/examples/jsm/postprocessing/AfterimagePass.js +20 -2
- package/examples/jsm/postprocessing/BloomPass.js +2 -1
- package/examples/jsm/postprocessing/BokehPass.js +2 -1
- package/examples/jsm/postprocessing/ClearPass.js +1 -0
- package/examples/jsm/postprocessing/CubeTexturePass.js +1 -0
- package/examples/jsm/postprocessing/DotScreenPass.js +1 -0
- package/examples/jsm/postprocessing/EffectComposer.js +4 -2
- package/examples/jsm/postprocessing/FXAAPass.js +40 -0
- package/examples/jsm/postprocessing/FilmPass.js +1 -0
- package/examples/jsm/postprocessing/GTAOPass.js +14 -12
- package/examples/jsm/postprocessing/GlitchPass.js +2 -1
- package/examples/jsm/postprocessing/HalftonePass.js +2 -1
- package/examples/jsm/postprocessing/LUTPass.js +1 -0
- package/examples/jsm/postprocessing/MaskPass.js +1 -0
- package/examples/jsm/postprocessing/OutlinePass.js +22 -19
- package/examples/jsm/postprocessing/OutputPass.js +1 -0
- package/examples/jsm/postprocessing/Pass.js +3 -1
- package/examples/jsm/postprocessing/RenderPass.js +1 -0
- package/examples/jsm/postprocessing/RenderPixelatedPass.js +2 -1
- package/examples/jsm/postprocessing/RenderTransitionPass.js +4 -3
- package/examples/jsm/postprocessing/SAOPass.js +3 -2
- package/examples/jsm/postprocessing/SMAAPass.js +3 -2
- package/examples/jsm/postprocessing/SSAARenderPass.js +2 -1
- package/examples/jsm/postprocessing/SSAOPass.js +12 -10
- package/examples/jsm/postprocessing/SSRPass.js +4 -3
- package/examples/jsm/postprocessing/SavePass.js +2 -1
- package/examples/jsm/postprocessing/ShaderPass.js +1 -0
- package/examples/jsm/postprocessing/TAARenderPass.js +1 -0
- package/examples/jsm/postprocessing/TexturePass.js +1 -0
- package/examples/jsm/postprocessing/UnrealBloomPass.js +2 -1
- package/examples/jsm/renderers/CSS2DRenderer.js +3 -0
- package/examples/jsm/renderers/CSS3DRenderer.js +4 -0
- package/examples/jsm/renderers/Projector.js +2 -0
- package/examples/jsm/renderers/SVGRenderer.js +3 -0
- package/examples/jsm/shaders/ACESFilmicToneMappingShader.js +4 -1
- package/examples/jsm/shaders/AfterimageShader.js +4 -1
- package/examples/jsm/shaders/BasicShader.js +4 -1
- package/examples/jsm/shaders/BleachBypassShader.js +4 -1
- package/examples/jsm/shaders/BlendShader.js +4 -1
- package/examples/jsm/shaders/BokehShader.js +4 -1
- package/examples/jsm/shaders/BokehShader2.js +4 -1
- package/examples/jsm/shaders/BrightnessContrastShader.js +4 -1
- package/examples/jsm/shaders/ColorCorrectionShader.js +4 -1
- package/examples/jsm/shaders/ColorifyShader.js +4 -1
- package/examples/jsm/shaders/ConvolutionShader.js +4 -1
- package/examples/jsm/shaders/CopyShader.js +4 -1
- package/examples/jsm/shaders/DOFMipMapShader.js +4 -1
- package/examples/jsm/shaders/DepthLimitedBlurShader.js +4 -1
- package/examples/jsm/shaders/DigitalGlitch.js +4 -1
- package/examples/jsm/shaders/DotScreenShader.js +4 -1
- package/examples/jsm/shaders/ExposureShader.js +4 -1
- package/examples/jsm/shaders/FXAAShader.js +4 -1
- package/examples/jsm/shaders/FilmShader.js +4 -1
- package/examples/jsm/shaders/FocusShader.js +4 -1
- package/examples/jsm/shaders/FreiChenShader.js +4 -1
- package/examples/jsm/shaders/GTAOShader.js +4 -1
- package/examples/jsm/shaders/GammaCorrectionShader.js +4 -1
- package/examples/jsm/shaders/GodRaysShader.js +4 -1
- package/examples/jsm/shaders/HalftoneShader.js +4 -1
- package/examples/jsm/shaders/HorizontalBlurShader.js +4 -1
- package/examples/jsm/shaders/HorizontalTiltShiftShader.js +4 -1
- package/examples/jsm/shaders/HueSaturationShader.js +4 -1
- package/examples/jsm/shaders/KaleidoShader.js +4 -1
- package/examples/jsm/shaders/LuminosityHighPassShader.js +4 -1
- package/examples/jsm/shaders/LuminosityShader.js +4 -1
- package/examples/jsm/shaders/MirrorShader.js +4 -1
- package/examples/jsm/shaders/NormalMapShader.js +4 -1
- package/examples/jsm/shaders/OutputShader.js +4 -1
- package/examples/jsm/shaders/PoissonDenoiseShader.js +4 -1
- package/examples/jsm/shaders/RGBShiftShader.js +4 -1
- package/examples/jsm/shaders/SAOShader.js +4 -1
- package/examples/jsm/shaders/SMAAShader.js +1 -0
- package/examples/jsm/shaders/SSAOShader.js +4 -1
- package/examples/jsm/shaders/SSRShader.js +1 -0
- package/examples/jsm/shaders/SepiaShader.js +4 -1
- package/examples/jsm/shaders/SobelOperatorShader.js +4 -1
- package/examples/jsm/shaders/SubsurfaceScatteringShader.js +4 -1
- package/examples/jsm/shaders/TechnicolorShader.js +4 -1
- package/examples/jsm/shaders/ToonShader.js +2 -1
- package/examples/jsm/shaders/TriangleBlurShader.js +4 -1
- package/examples/jsm/shaders/UnpackDepthRGBAShader.js +15 -3
- package/examples/jsm/shaders/VelocityShader.js +4 -1
- package/examples/jsm/shaders/VerticalBlurShader.js +4 -1
- package/examples/jsm/shaders/VerticalTiltShiftShader.js +4 -1
- package/examples/jsm/shaders/VignetteShader.js +4 -1
- package/examples/jsm/shaders/VolumeShader.js +5 -2
- package/examples/jsm/shaders/WaterRefractionShader.js +4 -1
- package/examples/jsm/textures/FlakesTexture.js +2 -0
- package/examples/jsm/transpiler/AST.js +381 -30
- package/examples/jsm/transpiler/GLSLDecoder.js +227 -88
- package/examples/jsm/transpiler/Linker.js +327 -0
- package/examples/jsm/transpiler/TSLEncoder.js +234 -85
- package/examples/jsm/transpiler/Transpiler.js +19 -1
- package/examples/jsm/transpiler/TranspilerUtils.js +29 -0
- package/examples/jsm/transpiler/WGSLEncoder.js +788 -0
- package/examples/jsm/tsl/display/AfterImageNode.js +2 -3
- package/examples/jsm/tsl/display/AnaglyphPassNode.js +1 -0
- package/examples/jsm/tsl/display/AnamorphicNode.js +5 -4
- package/examples/jsm/tsl/display/BloomNode.js +9 -7
- package/examples/jsm/tsl/display/ChromaticAberrationNode.js +206 -0
- package/examples/jsm/tsl/display/DenoiseNode.js +33 -33
- package/examples/jsm/tsl/display/DepthOfFieldNode.js +1 -0
- package/examples/jsm/tsl/display/DotScreenNode.js +1 -0
- package/examples/jsm/tsl/display/FXAANode.js +3 -2
- package/examples/jsm/tsl/display/FilmNode.js +1 -0
- package/examples/jsm/tsl/display/GTAONode.js +1 -0
- package/examples/jsm/tsl/display/GaussianBlurNode.js +9 -36
- package/examples/jsm/tsl/display/LensflareNode.js +1 -0
- package/examples/jsm/tsl/display/Lut3DNode.js +1 -0
- package/examples/jsm/tsl/display/OutlineNode.js +1 -0
- package/examples/jsm/tsl/display/ParallaxBarrierPassNode.js +1 -0
- package/examples/jsm/tsl/display/PixelationPassNode.js +1 -0
- package/examples/jsm/tsl/display/RGBShiftNode.js +1 -0
- package/examples/jsm/tsl/display/SMAANode.js +9 -8
- package/examples/jsm/tsl/display/SSAAPassNode.js +5 -4
- package/examples/jsm/tsl/display/SSRNode.js +1 -0
- package/examples/jsm/tsl/display/SobelOperatorNode.js +1 -0
- package/examples/jsm/tsl/display/StereoCompositePassNode.js +1 -0
- package/examples/jsm/tsl/display/StereoPassNode.js +1 -0
- package/examples/jsm/tsl/display/{TRAAPassNode.js → TRAANode.js} +184 -174
- package/examples/jsm/tsl/display/TransitionNode.js +1 -0
- package/examples/jsm/tsl/display/hashBlur.js +28 -6
- package/examples/jsm/tsl/lighting/TiledLightsNode.js +5 -4
- package/examples/jsm/tsl/math/Bayer.js +4 -1
- package/examples/jsm/tsl/shadows/TileShadowNode.js +456 -0
- package/examples/jsm/tsl/shadows/TileShadowNodeHelper.js +212 -0
- package/examples/jsm/tsl/utils/Raymarching.js +6 -3
- package/examples/jsm/utils/BufferGeometryUtils.js +4 -1
- package/examples/jsm/utils/CameraUtils.js +4 -1
- package/examples/jsm/utils/GeometryCompressionUtils.js +4 -1
- package/examples/jsm/utils/GeometryUtils.js +4 -1
- package/examples/jsm/utils/LDrawUtils.js +2 -0
- package/examples/jsm/utils/SceneOptimizer.js +2 -0
- package/examples/jsm/utils/SceneUtils.js +4 -1
- package/examples/jsm/utils/ShadowMapViewer.js +2 -0
- package/examples/jsm/utils/ShadowMapViewerGPU.js +2 -0
- package/examples/jsm/utils/SkeletonUtils.js +4 -1
- package/examples/jsm/utils/SortUtils.js +4 -1
- package/examples/jsm/utils/UVsDebug.js +4 -1
- package/examples/jsm/utils/WebGLTextureUtils.js +4 -1
- package/examples/jsm/utils/WebGPUTextureUtils.js +4 -1
- package/examples/jsm/utils/WorkerPool.js +2 -0
- package/examples/jsm/webxr/ARButton.js +1 -0
- package/examples/jsm/webxr/OculusHandModel.js +1 -0
- package/examples/jsm/webxr/OculusHandPointerModel.js +1 -0
- package/examples/jsm/webxr/Text2D.js +4 -1
- package/examples/jsm/webxr/VRButton.js +1 -0
- package/examples/jsm/webxr/XRButton.js +1 -0
- package/examples/jsm/webxr/XRControllerModelFactory.js +2 -0
- package/examples/jsm/webxr/XREstimatedLight.js +1 -0
- package/examples/jsm/webxr/XRHandMeshModel.js +2 -0
- package/examples/jsm/webxr/XRHandModelFactory.js +2 -0
- package/examples/jsm/webxr/XRHandPrimitiveModel.js +2 -0
- package/examples/jsm/webxr/XRPlanes.js +1 -0
- package/package.json +6 -4
- package/src/Three.Core.js +2 -1
- package/src/Three.TSL.js +83 -26
- package/src/Three.WebGPU.Nodes.js +1 -0
- package/src/Three.WebGPU.js +3 -0
- package/src/animation/KeyframeTrack.js +1 -1
- package/src/animation/tracks/BooleanKeyframeTrack.js +1 -1
- package/src/animation/tracks/StringKeyframeTrack.js +1 -1
- package/src/audio/AudioListener.js +13 -10
- package/src/cameras/ArrayCamera.js +9 -1
- package/src/cameras/Camera.js +14 -0
- package/src/cameras/OrthographicCamera.js +1 -1
- package/src/cameras/PerspectiveCamera.js +1 -1
- package/src/constants.js +47 -20
- package/src/core/BufferAttribute.js +3 -3
- package/src/core/BufferGeometry.js +2 -5
- package/src/core/Clock.js +2 -8
- package/src/core/GLBufferAttribute.js +13 -1
- package/src/core/Object3D.js +23 -22
- package/src/core/RenderTarget.js +65 -21
- package/src/core/RenderTarget3D.js +1 -0
- package/{examples/jsm/misc → src/core}/Timer.js +4 -40
- package/src/extras/PMREMGenerator.js +11 -0
- package/src/extras/TextureUtils.js +1 -5
- package/src/extras/core/Curve.js +1 -1
- package/src/extras/core/Path.js +22 -22
- package/src/geometries/CapsuleGeometry.js +167 -17
- package/src/geometries/ExtrudeGeometry.js +39 -29
- package/src/helpers/ArrowHelper.js +2 -2
- package/src/helpers/CameraHelper.js +41 -11
- package/src/helpers/SkeletonHelper.js +36 -7
- package/src/lights/LightShadow.js +34 -7
- package/src/lights/PointLightShadow.js +1 -1
- package/src/lights/SpotLightShadow.js +9 -1
- package/src/lights/webgpu/ProjectorLight.js +46 -0
- package/src/loaders/BufferGeometryLoader.js +1 -10
- package/src/loaders/FileLoader.js +27 -4
- package/src/loaders/ImageBitmapLoader.js +48 -9
- package/src/loaders/ImageLoader.js +55 -8
- package/src/loaders/Loader.js +14 -0
- package/src/loaders/LoadingManager.js +23 -0
- package/src/loaders/ObjectLoader.js +44 -16
- package/src/loaders/nodes/NodeObjectLoader.js +2 -2
- package/src/materials/Material.js +1 -7
- package/src/materials/MeshBasicMaterial.js +1 -1
- package/src/materials/nodes/Line2NodeMaterial.js +0 -8
- package/src/materials/nodes/MeshBasicNodeMaterial.js +4 -3
- package/src/materials/nodes/MeshMatcapNodeMaterial.js +1 -1
- package/src/materials/nodes/MeshNormalNodeMaterial.js +2 -2
- package/src/materials/nodes/MeshPhysicalNodeMaterial.js +2 -1
- package/src/materials/nodes/MeshSSSNodeMaterial.js +2 -2
- package/src/materials/nodes/NodeMaterial.js +106 -20
- package/src/materials/nodes/PointsNodeMaterial.js +5 -0
- package/src/materials/nodes/manager/NodeMaterialObserver.js +107 -4
- package/src/math/Box3.js +28 -0
- package/src/math/Color.js +7 -7
- package/src/math/ColorManagement.js +22 -3
- package/src/math/Frustum.js +25 -9
- package/src/math/FrustumArray.js +258 -0
- package/src/math/Line3.js +129 -2
- package/src/math/Matrix4.js +48 -27
- package/src/math/Quaternion.js +1 -1
- package/src/math/Ray.js +2 -0
- package/src/math/Sphere.js +28 -0
- package/src/math/Spherical.js +2 -2
- package/src/nodes/Nodes.js +3 -3
- package/src/nodes/TSL.js +6 -3
- package/src/nodes/accessors/AccessorsUtils.js +7 -8
- package/src/nodes/accessors/Bitangent.js +54 -26
- package/src/nodes/accessors/Camera.js +40 -13
- package/src/nodes/accessors/CubeTextureNode.js +50 -2
- package/src/nodes/accessors/InstanceNode.js +5 -4
- package/src/nodes/accessors/Lights.js +2 -2
- package/src/nodes/accessors/MaterialNode.js +4 -0
- package/src/nodes/accessors/ModelNode.js +1 -1
- package/src/nodes/accessors/Normal.js +110 -24
- package/src/nodes/accessors/Object3DNode.js +7 -8
- package/src/nodes/accessors/Position.js +14 -4
- package/src/nodes/accessors/ReferenceBaseNode.js +1 -1
- package/src/nodes/accessors/ReferenceNode.js +19 -4
- package/src/nodes/accessors/ReflectVector.js +3 -3
- package/src/nodes/accessors/SceneNode.js +1 -1
- package/src/nodes/accessors/SkinningNode.js +3 -2
- package/src/nodes/accessors/StorageBufferNode.js +25 -0
- package/src/nodes/accessors/StorageTextureNode.js +15 -4
- package/src/nodes/accessors/Tangent.js +25 -17
- package/src/nodes/accessors/TangentUtils.js +46 -0
- package/src/nodes/accessors/TextureBicubic.js +21 -3
- package/src/nodes/accessors/TextureNode.js +71 -8
- package/src/nodes/accessors/UniformArrayNode.js +0 -16
- package/src/nodes/accessors/VelocityNode.js +1 -0
- package/src/nodes/accessors/VertexColorNode.js +4 -4
- package/src/nodes/code/CodeNode.js +8 -11
- package/src/nodes/core/ArrayNode.js +12 -0
- package/src/nodes/core/AssignNode.js +30 -5
- package/src/nodes/core/AttributeNode.js +2 -2
- package/src/nodes/core/ContextNode.js +27 -4
- package/src/nodes/core/Node.js +83 -22
- package/src/nodes/core/NodeBuilder.js +273 -49
- package/src/nodes/core/NodeUtils.js +46 -1
- package/src/nodes/core/NodeVarying.js +19 -1
- package/src/nodes/core/PropertyNode.js +8 -12
- package/src/nodes/core/StackNode.js +171 -26
- package/src/nodes/core/StructTypeNode.js +26 -4
- package/src/nodes/core/SubBuildNode.js +89 -0
- package/src/nodes/core/UniformNode.js +63 -5
- package/src/nodes/core/VarNode.js +102 -4
- package/src/nodes/core/VaryingNode.js +45 -24
- package/src/nodes/display/BlendModes.js +42 -1
- package/src/nodes/display/ColorSpaceNode.js +4 -27
- package/src/nodes/display/FrontFacingNode.js +34 -2
- package/src/nodes/display/NormalMapNode.js +19 -50
- package/src/nodes/display/PassNode.js +165 -20
- package/src/nodes/display/ScreenNode.js +0 -26
- package/src/nodes/display/ViewportTextureNode.js +67 -7
- package/src/nodes/functions/BSDF/BRDF_GGX.js +2 -6
- package/src/nodes/functions/BSDF/BRDF_Sheen.js +4 -4
- package/src/nodes/functions/PhongLightingModel.js +3 -3
- package/src/nodes/functions/PhysicalLightingModel.js +16 -16
- package/src/nodes/functions/ShadowMaskModel.js +5 -1
- package/src/nodes/functions/material/getGeometryRoughness.js +2 -2
- package/src/nodes/functions/material/getParallaxCorrectNormal.js +1 -1
- package/src/nodes/gpgpu/AtomicFunctionNode.js +28 -10
- package/src/nodes/gpgpu/BarrierNode.js +3 -3
- package/src/nodes/gpgpu/ComputeNode.js +68 -24
- package/src/nodes/gpgpu/WorkgroupInfoNode.js +28 -3
- package/src/nodes/lighting/AnalyticLightNode.js +7 -13
- package/src/nodes/lighting/EnvironmentNode.js +5 -5
- package/src/nodes/lighting/HemisphereLightNode.js +2 -2
- package/src/nodes/lighting/IESSpotLightNode.js +2 -1
- package/src/nodes/lighting/LightsNode.js +29 -11
- package/src/nodes/lighting/ProjectorLightNode.js +91 -0
- package/src/nodes/lighting/ShadowBaseNode.js +1 -12
- package/src/nodes/lighting/ShadowFilterNode.js +274 -0
- package/src/nodes/lighting/ShadowNode.js +174 -242
- package/src/nodes/lighting/SpotLightNode.js +44 -7
- package/src/nodes/materialx/MaterialXNodes.js +131 -2
- package/src/nodes/materialx/lib/mx_noise.js +166 -2
- package/src/nodes/math/ConditionalNode.js +1 -20
- package/src/nodes/math/MathNode.js +146 -75
- package/src/nodes/math/OperatorNode.js +129 -119
- package/src/nodes/shapes/Shapes.js +5 -4
- package/src/nodes/tsl/TSLBase.js +1 -0
- package/src/nodes/tsl/TSLCore.js +222 -72
- package/src/nodes/utils/DebugNode.js +16 -4
- package/src/nodes/utils/Discard.js +2 -2
- package/src/nodes/utils/EquirectUV.js +27 -0
- package/src/nodes/utils/EventNode.js +83 -0
- package/src/nodes/utils/LoopNode.js +64 -34
- package/src/nodes/utils/MatcapUV.js +22 -0
- package/src/nodes/utils/RTTNode.js +22 -5
- package/src/nodes/utils/ReflectorNode.js +77 -7
- package/src/nodes/utils/SampleNode.js +81 -0
- package/src/nodes/utils/TriplanarTextures.js +65 -0
- package/src/objects/BatchedMesh.js +20 -6
- package/src/objects/Mesh.js +9 -0
- package/src/objects/Skeleton.js +1 -1
- package/src/objects/Sprite.js +9 -0
- package/src/renderers/WebGL3DRenderTarget.js +1 -0
- package/src/renderers/WebGLArrayRenderTarget.js +1 -0
- package/src/renderers/WebGLCubeRenderTarget.js +2 -4
- package/src/renderers/WebGLRenderer.js +45 -32
- package/src/renderers/common/Animation.js +2 -2
- package/src/renderers/common/Background.js +13 -2
- package/src/renderers/common/Bindings.js +19 -18
- package/src/renderers/common/Color4.js +2 -2
- package/src/renderers/common/CubeRenderTarget.js +1 -1
- package/src/renderers/common/PostProcessing.js +60 -5
- package/src/renderers/common/RenderList.js +0 -4
- package/src/renderers/common/RenderObject.js +80 -4
- package/src/renderers/common/Renderer.js +133 -22
- package/src/renderers/common/SampledTexture.js +3 -71
- package/src/renderers/common/Sampler.js +79 -0
- package/src/renderers/common/Storage3DTexture.js +100 -0
- package/src/renderers/common/StorageArrayTexture.js +84 -0
- package/src/renderers/common/StorageTexture.js +19 -0
- package/src/renderers/common/Textures.js +34 -24
- package/src/renderers/common/TimestampQueryPool.js +1 -0
- package/src/renderers/common/Uniform.js +1 -1
- package/src/renderers/common/UniformsGroup.js +14 -18
- package/src/renderers/common/XRManager.js +183 -35
- package/src/renderers/common/XRRenderTarget.js +21 -4
- package/src/renderers/common/extras/PMREMGenerator.js +30 -23
- package/src/renderers/common/nodes/NodeSampledTexture.js +0 -12
- package/src/renderers/common/nodes/Nodes.js +13 -3
- package/src/renderers/shaders/ShaderChunk/premultiplied_alpha_fragment.glsl.js +1 -1
- package/src/renderers/shaders/ShaderChunk/shadowmap_pars_fragment.glsl.js +20 -2
- package/src/renderers/shaders/ShaderLib/background.glsl.js +1 -1
- package/src/renderers/shaders/ShaderLib/depth.glsl.js +11 -2
- package/src/renderers/webgl/WebGLAttributes.js +4 -0
- package/src/renderers/webgl/WebGLCapabilities.js +2 -2
- package/src/renderers/webgl/WebGLMaterials.js +6 -6
- package/src/renderers/webgl/WebGLProgram.js +22 -16
- package/src/renderers/webgl/WebGLPrograms.js +8 -6
- package/src/renderers/webgl/WebGLShadowMap.js +14 -3
- package/src/renderers/webgl/WebGLState.js +4 -4
- package/src/renderers/webgl/WebGLTextures.js +163 -11
- package/src/renderers/webgl/WebGLUtils.js +1 -3
- package/src/renderers/webgl-fallback/WebGLBackend.js +261 -94
- package/src/renderers/webgl-fallback/nodes/GLSLNodeBuilder.js +75 -9
- package/src/renderers/webgl-fallback/utils/WebGLAttributeUtils.js +4 -0
- package/src/renderers/webgl-fallback/utils/WebGLConstants.js +1 -0
- package/src/renderers/webgl-fallback/utils/WebGLState.js +4 -4
- package/src/renderers/webgl-fallback/utils/WebGLTextureUtils.js +44 -29
- package/src/renderers/webgl-fallback/utils/WebGLUtils.js +22 -21
- package/src/renderers/webgpu/WebGPUBackend.js +505 -143
- package/src/renderers/webgpu/WebGPURenderer.js +7 -0
- package/src/renderers/webgpu/nodes/BasicNodeLibrary.js +4 -1
- package/src/renderers/webgpu/nodes/StandardNodeLibrary.js +4 -1
- package/src/renderers/webgpu/nodes/WGSLNodeBuilder.js +129 -96
- package/src/renderers/webgpu/nodes/WGSLNodeFunction.js +3 -0
- package/src/renderers/webgpu/utils/WebGPUAttributeUtils.js +9 -1
- package/src/renderers/webgpu/utils/WebGPUBindingUtils.js +58 -31
- package/src/renderers/webgpu/utils/WebGPUConstants.js +8 -2
- package/src/renderers/webgpu/utils/WebGPUPipelineUtils.js +39 -9
- package/src/renderers/webgpu/utils/WebGPUTextureUtils.js +50 -108
- package/src/renderers/webgpu/utils/WebGPUUtils.js +2 -17
- package/src/renderers/webxr/WebXRController.js +1 -1
- package/src/renderers/webxr/WebXRDepthSensing.js +6 -10
- package/src/renderers/webxr/WebXRManager.js +70 -9
- package/src/textures/DepthTexture.js +6 -10
- package/src/textures/ExternalTexture.js +45 -0
- package/src/textures/FramebufferTexture.js +2 -2
- package/src/textures/Source.js +32 -0
- package/src/textures/Texture.js +118 -1
- package/src/textures/VideoTexture.js +31 -3
- package/examples/jsm/effects/PeppersGhostEffect.js +0 -172
- package/src/core/RenderTargetArray.js +0 -40
- package/src/nodes/utils/EquirectUVNode.js +0 -65
- package/src/nodes/utils/MatcapUVNode.js +0 -49
- package/src/nodes/utils/TriplanarTexturesNode.js +0 -148
|
@@ -3,7 +3,6 @@ import { NodeUpdateType } from '../core/constants.js';
|
|
|
3
3
|
import { uniform } from '../core/UniformNode.js';
|
|
4
4
|
import { Color } from '../../math/Color.js';
|
|
5
5
|
import { renderGroup } from '../core/UniformGroupNode.js';
|
|
6
|
-
import { hash } from '../core/NodeUtils.js';
|
|
7
6
|
import { shadow } from './ShadowNode.js';
|
|
8
7
|
import { nodeObject } from '../tsl/TSLCore.js';
|
|
9
8
|
import { lightViewPosition } from '../accessors/Lights.js';
|
|
@@ -99,24 +98,19 @@ class AnalyticLightNode extends LightingNode {
|
|
|
99
98
|
|
|
100
99
|
}
|
|
101
100
|
|
|
102
|
-
/**
|
|
103
|
-
* Overwrites the default {@link Node#customCacheKey} implementation by including the
|
|
104
|
-
* `light.id` and `light.castShadow` into the cache key.
|
|
105
|
-
*
|
|
106
|
-
* @return {number} The custom cache key.
|
|
107
|
-
*/
|
|
108
|
-
customCacheKey() {
|
|
109
|
-
|
|
110
|
-
return hash( this.light.id, this.light.castShadow ? 1 : 0 );
|
|
111
|
-
|
|
112
|
-
}
|
|
113
|
-
|
|
114
101
|
getHash() {
|
|
115
102
|
|
|
116
103
|
return this.light.uuid;
|
|
117
104
|
|
|
118
105
|
}
|
|
119
106
|
|
|
107
|
+
/**
|
|
108
|
+
* Returns a node representing a direction vector which points from the current
|
|
109
|
+
* position in view space to the light's position in view space.
|
|
110
|
+
*
|
|
111
|
+
* @param {NodeBuilder} builder - The builder object used for setting up the light.
|
|
112
|
+
* @return {Node<vec3>} The light vector node.
|
|
113
|
+
*/
|
|
120
114
|
getLightVector( builder ) {
|
|
121
115
|
|
|
122
116
|
return lightViewPosition( this.light ).sub( builder.context.positionView || positionView );
|
|
@@ -2,10 +2,10 @@ import LightingNode from './LightingNode.js';
|
|
|
2
2
|
import { cache } from '../core/CacheNode.js';
|
|
3
3
|
import { roughness, clearcoatRoughness } from '../core/PropertyNode.js';
|
|
4
4
|
import { cameraViewMatrix } from '../accessors/Camera.js';
|
|
5
|
-
import {
|
|
5
|
+
import { normalView, clearcoatNormalView, normalWorld } from '../accessors/Normal.js';
|
|
6
6
|
import { positionViewDirection } from '../accessors/Position.js';
|
|
7
7
|
import { float } from '../tsl/TSLBase.js';
|
|
8
|
-
import {
|
|
8
|
+
import { bentNormalView } from '../accessors/AccessorsUtils.js';
|
|
9
9
|
import { pmremTexture } from '../pmrem/PMREMNode.js';
|
|
10
10
|
import { materialEnvIntensity } from '../accessors/MaterialProperties.js';
|
|
11
11
|
|
|
@@ -72,10 +72,10 @@ class EnvironmentNode extends LightingNode {
|
|
|
72
72
|
//
|
|
73
73
|
|
|
74
74
|
const useAnisotropy = material.useAnisotropy === true || material.anisotropy > 0;
|
|
75
|
-
const radianceNormalView = useAnisotropy ?
|
|
75
|
+
const radianceNormalView = useAnisotropy ? bentNormalView : normalView;
|
|
76
76
|
|
|
77
77
|
const radiance = envNode.context( createRadianceContext( roughness, radianceNormalView ) ).mul( materialEnvIntensity );
|
|
78
|
-
const irradiance = envNode.context( createIrradianceContext(
|
|
78
|
+
const irradiance = envNode.context( createIrradianceContext( normalWorld ) ).mul( Math.PI ).mul( materialEnvIntensity );
|
|
79
79
|
|
|
80
80
|
const isolateRadiance = cache( radiance );
|
|
81
81
|
const isolateIrradiance = cache( irradiance );
|
|
@@ -92,7 +92,7 @@ class EnvironmentNode extends LightingNode {
|
|
|
92
92
|
|
|
93
93
|
if ( clearcoatRadiance ) {
|
|
94
94
|
|
|
95
|
-
const clearcoatRadianceContext = envNode.context( createRadianceContext( clearcoatRoughness,
|
|
95
|
+
const clearcoatRadianceContext = envNode.context( createRadianceContext( clearcoatRoughness, clearcoatNormalView ) ).mul( materialEnvIntensity );
|
|
96
96
|
const isolateClearcoatRadiance = cache( clearcoatRadianceContext );
|
|
97
97
|
|
|
98
98
|
clearcoatRadiance.addAssign( isolateClearcoatRadiance );
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import AnalyticLightNode from './AnalyticLightNode.js';
|
|
2
2
|
import { uniform } from '../core/UniformNode.js';
|
|
3
3
|
import { mix } from '../math/MathNode.js';
|
|
4
|
-
import {
|
|
4
|
+
import { normalWorld } from '../accessors/Normal.js';
|
|
5
5
|
import { lightPosition } from '../accessors/Lights.js';
|
|
6
6
|
import { renderGroup } from '../core/UniformGroupNode.js';
|
|
7
7
|
|
|
@@ -73,7 +73,7 @@ class HemisphereLightNode extends AnalyticLightNode {
|
|
|
73
73
|
|
|
74
74
|
const { colorNode, groundColorNode, lightDirectionNode } = this;
|
|
75
75
|
|
|
76
|
-
const dotNL =
|
|
76
|
+
const dotNL = normalWorld.dot( lightDirectionNode );
|
|
77
77
|
const hemiDiffuseWeight = dotNL.mul( 0.5 ).add( 0.5 );
|
|
78
78
|
|
|
79
79
|
const irradiance = mix( groundColorNode, colorNode, hemiDiffuseWeight );
|
|
@@ -18,10 +18,11 @@ class IESSpotLightNode extends SpotLightNode {
|
|
|
18
18
|
/**
|
|
19
19
|
* Overwrites the default implementation to compute an IES conform spot attenuation.
|
|
20
20
|
*
|
|
21
|
+
* @param {NodeBuilder} builder - The node builder.
|
|
21
22
|
* @param {Node<float>} angleCosine - The angle to compute the spot attenuation for.
|
|
22
23
|
* @return {Node<float>} The spot attenuation.
|
|
23
24
|
*/
|
|
24
|
-
getSpotAttenuation( angleCosine ) {
|
|
25
|
+
getSpotAttenuation( builder, angleCosine ) {
|
|
25
26
|
|
|
26
27
|
const iesMap = this.light.iesMap;
|
|
27
28
|
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import Node from '../core/Node.js';
|
|
2
|
-
import { nodeObject, vec3 } from '../tsl/TSLBase.js';
|
|
2
|
+
import { nodeObject, property, vec3 } from '../tsl/TSLBase.js';
|
|
3
3
|
import { hashArray } from '../core/NodeUtils.js';
|
|
4
4
|
|
|
5
5
|
const sortLights = ( lights ) => {
|
|
@@ -25,6 +25,7 @@ const getLightNodeById = ( id, lightNodes ) => {
|
|
|
25
25
|
};
|
|
26
26
|
|
|
27
27
|
const _lightsNodeRef = /*@__PURE__*/ new WeakMap();
|
|
28
|
+
const _hashData = [];
|
|
28
29
|
|
|
29
30
|
/**
|
|
30
31
|
* This node represents the scene's lighting and manages the lighting model's life cycle
|
|
@@ -53,21 +54,21 @@ class LightsNode extends Node {
|
|
|
53
54
|
*
|
|
54
55
|
* @type {Node<vec3>}
|
|
55
56
|
*/
|
|
56
|
-
this.totalDiffuseNode = vec3
|
|
57
|
+
this.totalDiffuseNode = property( 'vec3', 'totalDiffuse' );
|
|
57
58
|
|
|
58
59
|
/**
|
|
59
60
|
* A node representing the total specular light.
|
|
60
61
|
*
|
|
61
62
|
* @type {Node<vec3>}
|
|
62
63
|
*/
|
|
63
|
-
this.totalSpecularNode = vec3
|
|
64
|
+
this.totalSpecularNode = property( 'vec3', 'totalSpecular' );
|
|
64
65
|
|
|
65
66
|
/**
|
|
66
67
|
* A node representing the outgoing light.
|
|
67
68
|
*
|
|
68
69
|
* @type {Node<vec3>}
|
|
69
70
|
*/
|
|
70
|
-
this.outgoingLightNode = vec3
|
|
71
|
+
this.outgoingLightNode = property( 'vec3', 'outgoingLight' );
|
|
71
72
|
|
|
72
73
|
/**
|
|
73
74
|
* An array representing the lights in the scene.
|
|
@@ -107,23 +108,38 @@ class LightsNode extends Node {
|
|
|
107
108
|
}
|
|
108
109
|
|
|
109
110
|
/**
|
|
110
|
-
* Overwrites the default {@link Node#customCacheKey} implementation by including
|
|
111
|
-
* light
|
|
111
|
+
* Overwrites the default {@link Node#customCacheKey} implementation by including
|
|
112
|
+
* light data into the cache key.
|
|
112
113
|
*
|
|
113
114
|
* @return {number} The custom cache key.
|
|
114
115
|
*/
|
|
115
116
|
customCacheKey() {
|
|
116
117
|
|
|
117
|
-
const lightIDs = [];
|
|
118
118
|
const lights = this._lights;
|
|
119
119
|
|
|
120
120
|
for ( let i = 0; i < lights.length; i ++ ) {
|
|
121
121
|
|
|
122
|
-
|
|
122
|
+
const light = lights[ i ];
|
|
123
|
+
|
|
124
|
+
_hashData.push( light.id );
|
|
125
|
+
_hashData.push( light.castShadow ? 1 : 0 );
|
|
126
|
+
|
|
127
|
+
if ( light.isSpotLight === true ) {
|
|
128
|
+
|
|
129
|
+
const hashMap = ( light.map !== null ) ? light.map.id : - 1;
|
|
130
|
+
const hashColorNode = ( light.colorNode ) ? light.colorNode.getCacheKey() : - 1;
|
|
131
|
+
|
|
132
|
+
_hashData.push( hashMap, hashColorNode );
|
|
133
|
+
|
|
134
|
+
}
|
|
123
135
|
|
|
124
136
|
}
|
|
125
137
|
|
|
126
|
-
|
|
138
|
+
const cacheKey = hashArray( _hashData );
|
|
139
|
+
|
|
140
|
+
_hashData.length = 0;
|
|
141
|
+
|
|
142
|
+
return cacheKey;
|
|
127
143
|
|
|
128
144
|
}
|
|
129
145
|
|
|
@@ -157,7 +173,7 @@ class LightsNode extends Node {
|
|
|
157
173
|
|
|
158
174
|
analyze( builder ) {
|
|
159
175
|
|
|
160
|
-
const properties = builder.
|
|
176
|
+
const properties = builder.getNodeProperties( this );
|
|
161
177
|
|
|
162
178
|
for ( const node of properties.nodes ) {
|
|
163
179
|
|
|
@@ -165,6 +181,8 @@ class LightsNode extends Node {
|
|
|
165
181
|
|
|
166
182
|
}
|
|
167
183
|
|
|
184
|
+
properties.outputNode.build( builder );
|
|
185
|
+
|
|
168
186
|
}
|
|
169
187
|
|
|
170
188
|
/**
|
|
@@ -313,7 +331,7 @@ class LightsNode extends Node {
|
|
|
313
331
|
const context = builder.context;
|
|
314
332
|
const lightingModel = context.lightingModel;
|
|
315
333
|
|
|
316
|
-
const properties = builder.
|
|
334
|
+
const properties = builder.getNodeProperties( this );
|
|
317
335
|
|
|
318
336
|
if ( lightingModel ) {
|
|
319
337
|
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import SpotLightNode from './SpotLightNode.js';
|
|
2
|
+
|
|
3
|
+
import { float, Fn, If, vec2 } from '../tsl/TSLCore.js';
|
|
4
|
+
import { length, min, max, saturate, acos } from '../math/MathNode.js';
|
|
5
|
+
import { div, sub } from '../math/OperatorNode.js';
|
|
6
|
+
import { lightShadowMatrix } from '../accessors/Lights.js';
|
|
7
|
+
import { positionWorld } from '../accessors/Position.js';
|
|
8
|
+
|
|
9
|
+
const sdBox = /*@__PURE__*/ Fn( ( [ p, b ] ) => {
|
|
10
|
+
|
|
11
|
+
const d = p.abs().sub( b );
|
|
12
|
+
|
|
13
|
+
return length( max( d, 0.0 ) ).add( min( max( d.x, d.y ), 0.0 ) );
|
|
14
|
+
|
|
15
|
+
} );
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* An implementation of a projector light node.
|
|
19
|
+
*
|
|
20
|
+
* @augments SpotLightNode
|
|
21
|
+
*/
|
|
22
|
+
class ProjectorLightNode extends SpotLightNode {
|
|
23
|
+
|
|
24
|
+
static get type() {
|
|
25
|
+
|
|
26
|
+
return 'ProjectorLightNode';
|
|
27
|
+
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
update( frame ) {
|
|
31
|
+
|
|
32
|
+
super.update( frame );
|
|
33
|
+
|
|
34
|
+
const light = this.light;
|
|
35
|
+
|
|
36
|
+
this.penumbraCosNode.value = Math.min( Math.cos( light.angle * ( 1 - light.penumbra ) ), .99999 );
|
|
37
|
+
|
|
38
|
+
if ( light.aspect === null ) {
|
|
39
|
+
|
|
40
|
+
let aspect = 1;
|
|
41
|
+
|
|
42
|
+
if ( light.map !== null ) {
|
|
43
|
+
|
|
44
|
+
aspect = light.map.width / light.map.height;
|
|
45
|
+
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
light.shadow.aspect = aspect;
|
|
49
|
+
|
|
50
|
+
} else {
|
|
51
|
+
|
|
52
|
+
light.shadow.aspect = light.aspect;
|
|
53
|
+
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* Overwrites the default implementation to compute projection attenuation.
|
|
60
|
+
*
|
|
61
|
+
* @param {NodeBuilder} builder - The node builder.
|
|
62
|
+
* @return {Node<float>} The spot attenuation.
|
|
63
|
+
*/
|
|
64
|
+
getSpotAttenuation( builder ) {
|
|
65
|
+
|
|
66
|
+
const attenuation = float( 0 );
|
|
67
|
+
const penumbraCos = this.penumbraCosNode;
|
|
68
|
+
|
|
69
|
+
// compute the fragment's position in the light's clip space
|
|
70
|
+
|
|
71
|
+
const spotLightCoord = lightShadowMatrix( this.light ).mul( builder.context.positionWorld || positionWorld );
|
|
72
|
+
|
|
73
|
+
// the sign of w determines whether the current fragment is in front or behind the light.
|
|
74
|
+
// to avoid a back-projection, it's important to only compute an attenuation if w is positive
|
|
75
|
+
|
|
76
|
+
If( spotLightCoord.w.greaterThan( 0 ), () => {
|
|
77
|
+
|
|
78
|
+
const projectionUV = spotLightCoord.xyz.div( spotLightCoord.w );
|
|
79
|
+
const boxDist = sdBox( projectionUV.xy.sub( vec2( 0.5 ) ), vec2( 0.5 ) );
|
|
80
|
+
const angleFactor = div( - 1.0, sub( 1.0, acos( penumbraCos ) ).sub( 1.0 ) );
|
|
81
|
+
attenuation.assign( saturate( boxDist.mul( - 2.0 ).mul( angleFactor ) ) );
|
|
82
|
+
|
|
83
|
+
} );
|
|
84
|
+
|
|
85
|
+
return attenuation;
|
|
86
|
+
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
export default ProjectorLightNode;
|
|
@@ -64,18 +64,7 @@ class ShadowBaseNode extends Node {
|
|
|
64
64
|
|
|
65
65
|
// Use assign inside an Fn()
|
|
66
66
|
|
|
67
|
-
shadowPositionWorld.assign( material.
|
|
68
|
-
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
/**
|
|
72
|
-
* Can be called when the shadow isn't required anymore. That can happen when
|
|
73
|
-
* a lighting node stops casting shadows by setting {@link Object3D#castShadow}
|
|
74
|
-
* to `false`.
|
|
75
|
-
*/
|
|
76
|
-
dispose() {
|
|
77
|
-
|
|
78
|
-
this.updateBeforeType = NodeUpdateType.NONE;
|
|
67
|
+
shadowPositionWorld.assign( material.receivedShadowPositionNode || context.shadowPositionWorld || positionWorld );
|
|
79
68
|
|
|
80
69
|
}
|
|
81
70
|
|
|
@@ -0,0 +1,274 @@
|
|
|
1
|
+
import { float, vec2, vec4, If, Fn } from '../tsl/TSLBase.js';
|
|
2
|
+
import { reference } from '../accessors/ReferenceNode.js';
|
|
3
|
+
import { texture } from '../accessors/TextureNode.js';
|
|
4
|
+
import { mix, fract, step, max, clamp } from '../math/MathNode.js';
|
|
5
|
+
import { add, sub } from '../math/OperatorNode.js';
|
|
6
|
+
import { renderGroup } from '../core/UniformGroupNode.js';
|
|
7
|
+
import NodeMaterial from '../../materials/nodes/NodeMaterial.js';
|
|
8
|
+
import { objectPosition } from '../accessors/Object3DNode.js';
|
|
9
|
+
import { positionWorld } from '../accessors/Position.js';
|
|
10
|
+
|
|
11
|
+
const shadowMaterialLib = /*@__PURE__*/ new WeakMap();
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* A shadow filtering function performing basic filtering. This is in fact an unfiltered version of the shadow map
|
|
15
|
+
* with a binary `[0,1]` result.
|
|
16
|
+
*
|
|
17
|
+
* @method
|
|
18
|
+
* @param {Object} inputs - The input parameter object.
|
|
19
|
+
* @param {DepthTexture} inputs.depthTexture - A reference to the shadow map's texture data.
|
|
20
|
+
* @param {Node<vec3>} inputs.shadowCoord - The shadow coordinates.
|
|
21
|
+
* @return {Node<float>} The filtering result.
|
|
22
|
+
*/
|
|
23
|
+
export const BasicShadowFilter = /*@__PURE__*/ Fn( ( { depthTexture, shadowCoord, depthLayer } ) => {
|
|
24
|
+
|
|
25
|
+
let basic = texture( depthTexture, shadowCoord.xy ).setName( 't_basic' );
|
|
26
|
+
|
|
27
|
+
if ( depthTexture.isArrayTexture ) {
|
|
28
|
+
|
|
29
|
+
basic = basic.depth( depthLayer );
|
|
30
|
+
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
return basic.compare( shadowCoord.z );
|
|
34
|
+
|
|
35
|
+
} );
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* A shadow filtering function performing PCF filtering.
|
|
39
|
+
*
|
|
40
|
+
* @method
|
|
41
|
+
* @param {Object} inputs - The input parameter object.
|
|
42
|
+
* @param {DepthTexture} inputs.depthTexture - A reference to the shadow map's texture data.
|
|
43
|
+
* @param {Node<vec3>} inputs.shadowCoord - The shadow coordinates.
|
|
44
|
+
* @param {LightShadow} inputs.shadow - The light shadow.
|
|
45
|
+
* @return {Node<float>} The filtering result.
|
|
46
|
+
*/
|
|
47
|
+
export const PCFShadowFilter = /*@__PURE__*/ Fn( ( { depthTexture, shadowCoord, shadow, depthLayer } ) => {
|
|
48
|
+
|
|
49
|
+
const depthCompare = ( uv, compare ) => {
|
|
50
|
+
|
|
51
|
+
let depth = texture( depthTexture, uv );
|
|
52
|
+
|
|
53
|
+
if ( depthTexture.isArrayTexture ) {
|
|
54
|
+
|
|
55
|
+
depth = depth.depth( depthLayer );
|
|
56
|
+
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
return depth.compare( compare );
|
|
60
|
+
|
|
61
|
+
};
|
|
62
|
+
|
|
63
|
+
const mapSize = reference( 'mapSize', 'vec2', shadow ).setGroup( renderGroup );
|
|
64
|
+
const radius = reference( 'radius', 'float', shadow ).setGroup( renderGroup );
|
|
65
|
+
|
|
66
|
+
const texelSize = vec2( 1 ).div( mapSize );
|
|
67
|
+
const dx0 = texelSize.x.negate().mul( radius );
|
|
68
|
+
const dy0 = texelSize.y.negate().mul( radius );
|
|
69
|
+
const dx1 = texelSize.x.mul( radius );
|
|
70
|
+
const dy1 = texelSize.y.mul( radius );
|
|
71
|
+
const dx2 = dx0.div( 2 );
|
|
72
|
+
const dy2 = dy0.div( 2 );
|
|
73
|
+
const dx3 = dx1.div( 2 );
|
|
74
|
+
const dy3 = dy1.div( 2 );
|
|
75
|
+
|
|
76
|
+
return add(
|
|
77
|
+
depthCompare( shadowCoord.xy.add( vec2( dx0, dy0 ) ), shadowCoord.z ),
|
|
78
|
+
depthCompare( shadowCoord.xy.add( vec2( 0, dy0 ) ), shadowCoord.z ),
|
|
79
|
+
depthCompare( shadowCoord.xy.add( vec2( dx1, dy0 ) ), shadowCoord.z ),
|
|
80
|
+
depthCompare( shadowCoord.xy.add( vec2( dx2, dy2 ) ), shadowCoord.z ),
|
|
81
|
+
depthCompare( shadowCoord.xy.add( vec2( 0, dy2 ) ), shadowCoord.z ),
|
|
82
|
+
depthCompare( shadowCoord.xy.add( vec2( dx3, dy2 ) ), shadowCoord.z ),
|
|
83
|
+
depthCompare( shadowCoord.xy.add( vec2( dx0, 0 ) ), shadowCoord.z ),
|
|
84
|
+
depthCompare( shadowCoord.xy.add( vec2( dx2, 0 ) ), shadowCoord.z ),
|
|
85
|
+
depthCompare( shadowCoord.xy, shadowCoord.z ),
|
|
86
|
+
depthCompare( shadowCoord.xy.add( vec2( dx3, 0 ) ), shadowCoord.z ),
|
|
87
|
+
depthCompare( shadowCoord.xy.add( vec2( dx1, 0 ) ), shadowCoord.z ),
|
|
88
|
+
depthCompare( shadowCoord.xy.add( vec2( dx2, dy3 ) ), shadowCoord.z ),
|
|
89
|
+
depthCompare( shadowCoord.xy.add( vec2( 0, dy3 ) ), shadowCoord.z ),
|
|
90
|
+
depthCompare( shadowCoord.xy.add( vec2( dx3, dy3 ) ), shadowCoord.z ),
|
|
91
|
+
depthCompare( shadowCoord.xy.add( vec2( dx0, dy1 ) ), shadowCoord.z ),
|
|
92
|
+
depthCompare( shadowCoord.xy.add( vec2( 0, dy1 ) ), shadowCoord.z ),
|
|
93
|
+
depthCompare( shadowCoord.xy.add( vec2( dx1, dy1 ) ), shadowCoord.z )
|
|
94
|
+
).mul( 1 / 17 );
|
|
95
|
+
|
|
96
|
+
} );
|
|
97
|
+
|
|
98
|
+
/**
|
|
99
|
+
* A shadow filtering function performing PCF soft filtering.
|
|
100
|
+
*
|
|
101
|
+
* @method
|
|
102
|
+
* @param {Object} inputs - The input parameter object.
|
|
103
|
+
* @param {DepthTexture} inputs.depthTexture - A reference to the shadow map's texture data.
|
|
104
|
+
* @param {Node<vec3>} inputs.shadowCoord - The shadow coordinates.
|
|
105
|
+
* @param {LightShadow} inputs.shadow - The light shadow.
|
|
106
|
+
* @return {Node<float>} The filtering result.
|
|
107
|
+
*/
|
|
108
|
+
export const PCFSoftShadowFilter = /*@__PURE__*/ Fn( ( { depthTexture, shadowCoord, shadow, depthLayer } ) => {
|
|
109
|
+
|
|
110
|
+
const depthCompare = ( uv, compare ) => {
|
|
111
|
+
|
|
112
|
+
let depth = texture( depthTexture, uv );
|
|
113
|
+
|
|
114
|
+
if ( depthTexture.isArrayTexture ) {
|
|
115
|
+
|
|
116
|
+
depth = depth.depth( depthLayer );
|
|
117
|
+
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
return depth.compare( compare );
|
|
121
|
+
|
|
122
|
+
};
|
|
123
|
+
|
|
124
|
+
|
|
125
|
+
const mapSize = reference( 'mapSize', 'vec2', shadow ).setGroup( renderGroup );
|
|
126
|
+
|
|
127
|
+
const texelSize = vec2( 1 ).div( mapSize );
|
|
128
|
+
const dx = texelSize.x;
|
|
129
|
+
const dy = texelSize.y;
|
|
130
|
+
|
|
131
|
+
const uv = shadowCoord.xy;
|
|
132
|
+
const f = fract( uv.mul( mapSize ).add( 0.5 ) );
|
|
133
|
+
uv.subAssign( f.mul( texelSize ) );
|
|
134
|
+
|
|
135
|
+
return add(
|
|
136
|
+
depthCompare( uv, shadowCoord.z ),
|
|
137
|
+
depthCompare( uv.add( vec2( dx, 0 ) ), shadowCoord.z ),
|
|
138
|
+
depthCompare( uv.add( vec2( 0, dy ) ), shadowCoord.z ),
|
|
139
|
+
depthCompare( uv.add( texelSize ), shadowCoord.z ),
|
|
140
|
+
mix(
|
|
141
|
+
depthCompare( uv.add( vec2( dx.negate(), 0 ) ), shadowCoord.z ),
|
|
142
|
+
depthCompare( uv.add( vec2( dx.mul( 2 ), 0 ) ), shadowCoord.z ),
|
|
143
|
+
f.x
|
|
144
|
+
),
|
|
145
|
+
mix(
|
|
146
|
+
depthCompare( uv.add( vec2( dx.negate(), dy ) ), shadowCoord.z ),
|
|
147
|
+
depthCompare( uv.add( vec2( dx.mul( 2 ), dy ) ), shadowCoord.z ),
|
|
148
|
+
f.x
|
|
149
|
+
),
|
|
150
|
+
mix(
|
|
151
|
+
depthCompare( uv.add( vec2( 0, dy.negate() ) ), shadowCoord.z ),
|
|
152
|
+
depthCompare( uv.add( vec2( 0, dy.mul( 2 ) ) ), shadowCoord.z ),
|
|
153
|
+
f.y
|
|
154
|
+
),
|
|
155
|
+
mix(
|
|
156
|
+
depthCompare( uv.add( vec2( dx, dy.negate() ) ), shadowCoord.z ),
|
|
157
|
+
depthCompare( uv.add( vec2( dx, dy.mul( 2 ) ) ), shadowCoord.z ),
|
|
158
|
+
f.y
|
|
159
|
+
),
|
|
160
|
+
mix(
|
|
161
|
+
mix(
|
|
162
|
+
depthCompare( uv.add( vec2( dx.negate(), dy.negate() ) ), shadowCoord.z ),
|
|
163
|
+
depthCompare( uv.add( vec2( dx.mul( 2 ), dy.negate() ) ), shadowCoord.z ),
|
|
164
|
+
f.x
|
|
165
|
+
),
|
|
166
|
+
mix(
|
|
167
|
+
depthCompare( uv.add( vec2( dx.negate(), dy.mul( 2 ) ) ), shadowCoord.z ),
|
|
168
|
+
depthCompare( uv.add( vec2( dx.mul( 2 ), dy.mul( 2 ) ) ), shadowCoord.z ),
|
|
169
|
+
f.x
|
|
170
|
+
),
|
|
171
|
+
f.y
|
|
172
|
+
)
|
|
173
|
+
).mul( 1 / 9 );
|
|
174
|
+
|
|
175
|
+
} );
|
|
176
|
+
|
|
177
|
+
/**
|
|
178
|
+
* A shadow filtering function performing VSM filtering.
|
|
179
|
+
*
|
|
180
|
+
* @method
|
|
181
|
+
* @param {Object} inputs - The input parameter object.
|
|
182
|
+
* @param {DepthTexture} inputs.depthTexture - A reference to the shadow map's texture data.
|
|
183
|
+
* @param {Node<vec3>} inputs.shadowCoord - The shadow coordinates.
|
|
184
|
+
* @return {Node<float>} The filtering result.
|
|
185
|
+
*/
|
|
186
|
+
export const VSMShadowFilter = /*@__PURE__*/ Fn( ( { depthTexture, shadowCoord, depthLayer } ) => {
|
|
187
|
+
|
|
188
|
+
const occlusion = float( 1 ).toVar();
|
|
189
|
+
|
|
190
|
+
let distribution = texture( depthTexture ).sample( shadowCoord.xy );
|
|
191
|
+
|
|
192
|
+
if ( depthTexture.isArrayTexture ) {
|
|
193
|
+
|
|
194
|
+
distribution = distribution.depth( depthLayer );
|
|
195
|
+
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
distribution = distribution.rg;
|
|
199
|
+
|
|
200
|
+
const hardShadow = step( shadowCoord.z, distribution.x );
|
|
201
|
+
|
|
202
|
+
If( hardShadow.notEqual( float( 1.0 ) ), () => {
|
|
203
|
+
|
|
204
|
+
const distance = shadowCoord.z.sub( distribution.x );
|
|
205
|
+
const variance = max( 0, distribution.y.mul( distribution.y ) );
|
|
206
|
+
let softnessProbability = variance.div( variance.add( distance.mul( distance ) ) ); // Chebeyshevs inequality
|
|
207
|
+
softnessProbability = clamp( sub( softnessProbability, 0.3 ).div( 0.95 - 0.3 ) );
|
|
208
|
+
occlusion.assign( clamp( max( hardShadow, softnessProbability ) ) );
|
|
209
|
+
|
|
210
|
+
} );
|
|
211
|
+
|
|
212
|
+
return occlusion;
|
|
213
|
+
|
|
214
|
+
} );
|
|
215
|
+
|
|
216
|
+
//
|
|
217
|
+
|
|
218
|
+
const linearDistance = /*@__PURE__*/ Fn( ( [ position, cameraNear, cameraFar ] ) => {
|
|
219
|
+
|
|
220
|
+
let dist = positionWorld.sub( position ).length();
|
|
221
|
+
dist = dist.sub( cameraNear ).div( cameraFar.sub( cameraNear ) );
|
|
222
|
+
dist = dist.saturate(); // clamp to [ 0, 1 ]
|
|
223
|
+
|
|
224
|
+
return dist;
|
|
225
|
+
|
|
226
|
+
} );
|
|
227
|
+
|
|
228
|
+
const linearShadowDistance = ( light ) => {
|
|
229
|
+
|
|
230
|
+
const camera = light.shadow.camera;
|
|
231
|
+
|
|
232
|
+
const nearDistance = reference( 'near', 'float', camera ).setGroup( renderGroup );
|
|
233
|
+
const farDistance = reference( 'far', 'float', camera ).setGroup( renderGroup );
|
|
234
|
+
|
|
235
|
+
const referencePosition = objectPosition( light );
|
|
236
|
+
|
|
237
|
+
return linearDistance( referencePosition, nearDistance, farDistance );
|
|
238
|
+
|
|
239
|
+
};
|
|
240
|
+
|
|
241
|
+
/**
|
|
242
|
+
* Retrieves or creates a shadow material for the given light source.
|
|
243
|
+
*
|
|
244
|
+
* This function checks if a shadow material already exists for the provided light.
|
|
245
|
+
* If not, it creates a new `NodeMaterial` configured for shadow rendering and stores it
|
|
246
|
+
* in the `shadowMaterialLib` for future use.
|
|
247
|
+
*
|
|
248
|
+
* @param {Light} light - The light source for which the shadow material is needed.
|
|
249
|
+
* If the light is a point light, a depth node is calculated
|
|
250
|
+
* using the linear shadow distance.
|
|
251
|
+
* @returns {NodeMaterial} The shadow material associated with the given light.
|
|
252
|
+
*/
|
|
253
|
+
export const getShadowMaterial = ( light ) => {
|
|
254
|
+
|
|
255
|
+
let material = shadowMaterialLib.get( light );
|
|
256
|
+
|
|
257
|
+
if ( material === undefined ) {
|
|
258
|
+
|
|
259
|
+
const depthNode = light.isPointLight ? linearShadowDistance( light ) : null;
|
|
260
|
+
|
|
261
|
+
material = new NodeMaterial();
|
|
262
|
+
material.colorNode = vec4( 0, 0, 0, 1 );
|
|
263
|
+
material.depthNode = depthNode;
|
|
264
|
+
material.isShadowPassMaterial = true; // Use to avoid other overrideMaterial override material.colorNode unintentionally when using material.shadowNode
|
|
265
|
+
material.name = 'ShadowMaterial';
|
|
266
|
+
material.fog = false;
|
|
267
|
+
|
|
268
|
+
shadowMaterialLib.set( light, material );
|
|
269
|
+
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
return material;
|
|
273
|
+
|
|
274
|
+
};
|