super-three 0.181.0 → 0.184.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/LICENSE +1 -1
- package/README.md +3 -4
- package/build/three.cjs +13152 -11354
- package/build/three.core.js +12319 -11539
- package/build/three.core.min.js +2 -2
- package/build/three.module.js +1808 -781
- package/build/three.module.min.js +2 -2
- package/build/three.tsl.js +27 -13
- package/build/three.tsl.min.js +2 -2
- package/build/three.webgpu.js +10523 -6263
- package/build/three.webgpu.min.js +2 -2
- package/build/three.webgpu.nodes.js +10484 -6262
- package/build/three.webgpu.nodes.min.js +2 -2
- package/examples/jsm/Addons.js +11 -3
- package/examples/jsm/animation/CCDIKSolver.js +7 -3
- package/examples/jsm/controls/ArcballControls.js +7 -4
- package/examples/jsm/controls/DragControls.js +2 -2
- package/examples/jsm/controls/FirstPersonControls.js +58 -54
- package/examples/jsm/controls/FlyControls.js +4 -0
- package/examples/jsm/controls/MapControls.js +55 -1
- package/examples/jsm/controls/OrbitControls.js +111 -8
- package/examples/jsm/controls/TrackballControls.js +8 -8
- package/examples/jsm/controls/TransformControls.js +34 -2
- package/examples/jsm/csm/CSM.js +2 -1
- package/examples/jsm/csm/CSMShadowNode.js +6 -2
- package/examples/jsm/effects/AnaglyphEffect.js +102 -7
- package/examples/jsm/environments/ColorEnvironment.js +59 -0
- package/examples/jsm/environments/RoomEnvironment.js +3 -0
- package/examples/jsm/exporters/EXRExporter.js +1 -1
- package/examples/jsm/exporters/GLTFExporter.js +152 -9
- package/examples/jsm/exporters/USDZExporter.js +22 -3
- package/examples/jsm/geometries/DecalGeometry.js +1 -1
- package/examples/jsm/geometries/TextGeometry.js +18 -0
- package/examples/jsm/helpers/AnimationPathHelper.js +302 -0
- package/examples/jsm/helpers/LightProbeGridHelper.js +221 -0
- package/examples/jsm/helpers/LightProbeHelperGPU.js +1 -1
- package/examples/jsm/helpers/TextureHelperGPU.js +1 -1
- package/examples/jsm/helpers/ViewHelper.js +67 -8
- package/examples/jsm/inspector/Extension.js +13 -0
- package/examples/jsm/inspector/Inspector.js +203 -88
- package/examples/jsm/inspector/RendererInspector.js +14 -4
- package/examples/jsm/inspector/extensions/extensions.json +6 -0
- package/examples/jsm/inspector/extensions/tsl-graph/TSLGraphEditor.js +916 -0
- package/examples/jsm/inspector/extensions/tsl-graph/TSLGraphLoader.js +281 -0
- package/examples/jsm/inspector/tabs/Console.js +41 -7
- package/examples/jsm/inspector/tabs/Memory.js +128 -0
- package/examples/jsm/inspector/tabs/Parameters.js +51 -3
- package/examples/jsm/inspector/tabs/Performance.js +4 -4
- package/examples/jsm/inspector/tabs/Settings.js +264 -0
- package/examples/jsm/inspector/tabs/Timeline.js +1611 -0
- package/examples/jsm/inspector/tabs/Viewer.js +107 -5
- package/examples/jsm/inspector/ui/Graph.js +2 -2
- package/examples/jsm/inspector/ui/List.js +1 -1
- package/examples/jsm/inspector/ui/Profiler.js +1936 -34
- package/examples/jsm/inspector/ui/Style.js +1044 -31
- package/examples/jsm/inspector/ui/Tab.js +222 -3
- package/examples/jsm/inspector/ui/Values.js +55 -2
- package/examples/jsm/inspector/ui/utils.js +13 -0
- package/examples/jsm/interaction/InteractionManager.js +226 -0
- package/examples/jsm/libs/meshopt_decoder.module.js +9 -8
- package/examples/jsm/lighting/DynamicLighting.js +82 -0
- package/examples/jsm/lighting/LightProbeGrid.js +651 -0
- package/examples/jsm/lines/LineMaterial.js +7 -1
- package/examples/jsm/loaders/3DMLoader.js +5 -4
- package/examples/jsm/loaders/3MFLoader.js +2 -2
- package/examples/jsm/loaders/AMFLoader.js +2 -2
- package/examples/jsm/loaders/ColladaLoader.js +24 -4026
- package/examples/jsm/loaders/DRACOLoader.js +5 -5
- package/examples/jsm/loaders/EXRLoader.js +687 -48
- package/examples/jsm/loaders/FBXLoader.js +235 -37
- package/examples/jsm/loaders/GCodeLoader.js +34 -8
- package/examples/jsm/loaders/GLTFLoader.js +146 -178
- package/examples/jsm/loaders/HDRLoader.js +1 -2
- package/examples/jsm/loaders/KMZLoader.js +5 -5
- package/examples/jsm/loaders/KTX2Loader.js +27 -5
- package/examples/jsm/loaders/LDrawLoader.js +41 -50
- package/examples/jsm/loaders/LWOLoader.js +7 -39
- package/examples/jsm/loaders/NRRDLoader.js +2 -2
- package/examples/jsm/loaders/PCDLoader.js +4 -2
- package/examples/jsm/loaders/SVGLoader.js +2 -2
- package/examples/jsm/loaders/TDSLoader.js +0 -2
- package/examples/jsm/loaders/TGALoader.js +0 -2
- package/examples/jsm/loaders/USDLoader.js +100 -40
- package/examples/jsm/loaders/UltraHDRLoader.js +285 -160
- package/examples/jsm/loaders/VOXLoader.js +660 -117
- package/examples/jsm/loaders/VRMLLoader.js +79 -2
- package/examples/jsm/loaders/VTKLoader.js +42 -25
- package/examples/jsm/loaders/collada/ColladaComposer.js +3044 -0
- package/examples/jsm/loaders/collada/ColladaParser.js +1977 -0
- package/examples/jsm/loaders/usd/USDAParser.js +450 -363
- package/examples/jsm/loaders/usd/USDCParser.js +1867 -6
- package/examples/jsm/loaders/usd/USDComposer.js +4594 -0
- package/examples/jsm/materials/LDrawConditionalLineNodeMaterial.js +2 -2
- package/examples/jsm/materials/WoodNodeMaterial.js +11 -11
- package/examples/jsm/math/Octree.js +131 -1
- package/examples/jsm/misc/GPUComputationRenderer.js +2 -0
- package/examples/jsm/misc/RollerCoaster.js +42 -4
- package/examples/jsm/misc/Volume.js +0 -1
- package/examples/jsm/misc/VolumeSlice.js +0 -1
- package/examples/jsm/modifiers/TessellateModifier.js +1 -1
- package/examples/jsm/objects/LensflareMesh.js +1 -1
- package/examples/jsm/objects/Reflector.js +73 -25
- package/examples/jsm/objects/Sky.js +90 -6
- package/examples/jsm/objects/SkyMesh.js +150 -16
- package/examples/jsm/objects/Water.js +4 -3
- package/examples/jsm/objects/Water2.js +5 -3
- package/examples/jsm/objects/WaterMesh.js +5 -7
- package/examples/jsm/physics/AmmoPhysics.js +12 -7
- package/examples/jsm/physics/JoltPhysics.js +10 -6
- package/examples/jsm/physics/RapierPhysics.js +9 -5
- package/examples/jsm/postprocessing/EffectComposer.js +7 -5
- package/examples/jsm/postprocessing/OutputPass.js +9 -0
- package/examples/jsm/postprocessing/RenderPass.js +10 -0
- package/examples/jsm/postprocessing/RenderTransitionPass.js +1 -1
- package/examples/jsm/postprocessing/UnrealBloomPass.js +48 -18
- package/examples/jsm/renderers/CSS3DRenderer.js +1 -1
- package/examples/jsm/renderers/Projector.js +246 -28
- package/examples/jsm/renderers/SVGRenderer.js +174 -60
- package/examples/jsm/shaders/GTAOShader.js +19 -6
- package/examples/jsm/shaders/HalftoneShader.js +12 -1
- package/examples/jsm/shaders/PoissonDenoiseShader.js +6 -2
- package/examples/jsm/shaders/SAOShader.js +17 -4
- package/examples/jsm/shaders/SSAOShader.js +11 -1
- package/examples/jsm/shaders/SSRShader.js +6 -5
- package/examples/jsm/shaders/UnpackDepthRGBAShader.js +2 -4
- package/examples/jsm/shaders/VignetteShader.js +1 -1
- package/examples/jsm/transpiler/AST.js +44 -0
- package/examples/jsm/transpiler/GLSLDecoder.js +63 -6
- package/examples/jsm/transpiler/ShaderToyDecoder.js +2 -0
- package/examples/jsm/transpiler/TSLEncoder.js +46 -3
- package/examples/jsm/transpiler/TranspilerUtils.js +3 -3
- package/examples/jsm/transpiler/WGSLEncoder.js +27 -0
- package/examples/jsm/tsl/WebGLNodesHandler.js +605 -0
- package/examples/jsm/tsl/display/AfterImageNode.js +11 -1
- package/examples/jsm/tsl/display/AnaglyphPassNode.js +458 -16
- package/examples/jsm/tsl/display/AnamorphicNode.js +12 -1
- package/examples/jsm/tsl/display/BilateralBlurNode.js +374 -0
- package/examples/jsm/tsl/display/BloomNode.js +16 -6
- package/examples/jsm/tsl/display/CRT.js +150 -0
- package/examples/jsm/tsl/display/ChromaticAberrationNode.js +3 -36
- package/examples/jsm/tsl/display/DenoiseNode.js +1 -1
- package/examples/jsm/tsl/display/DepthOfFieldNode.js +1 -1
- package/examples/jsm/tsl/display/DotScreenNode.js +1 -1
- package/examples/jsm/tsl/display/FSR1Node.js +477 -0
- package/examples/jsm/tsl/display/FXAANode.js +2 -2
- package/examples/jsm/tsl/display/GTAONode.js +6 -4
- package/examples/jsm/tsl/display/GaussianBlurNode.js +21 -2
- package/examples/jsm/tsl/display/GodraysNode.js +615 -0
- package/examples/jsm/tsl/display/LensflareNode.js +1 -1
- package/examples/jsm/tsl/display/Lut3DNode.js +1 -1
- package/examples/jsm/tsl/display/OutlineNode.js +69 -19
- package/examples/jsm/tsl/display/ParallaxBarrierPassNode.js +2 -2
- package/examples/jsm/tsl/display/PixelationPassNode.js +7 -6
- package/examples/jsm/tsl/display/RGBShiftNode.js +2 -2
- package/examples/jsm/tsl/display/RetroPassNode.js +263 -0
- package/examples/jsm/tsl/display/SMAANode.js +2 -2
- package/examples/jsm/tsl/display/SSAAPassNode.js +2 -2
- package/examples/jsm/tsl/display/SSGINode.js +8 -24
- package/examples/jsm/tsl/display/SSRNode.js +8 -8
- package/examples/jsm/tsl/display/SSSNode.js +6 -4
- package/examples/jsm/tsl/display/Shape.js +29 -0
- package/examples/jsm/tsl/display/SharpenNode.js +283 -0
- package/examples/jsm/tsl/display/SobelOperatorNode.js +2 -2
- package/examples/jsm/tsl/display/StereoCompositePassNode.js +8 -1
- package/examples/jsm/tsl/display/StereoPassNode.js +1 -2
- package/examples/jsm/tsl/display/TAAUNode.js +835 -0
- package/examples/jsm/tsl/display/TRAANode.js +315 -126
- package/examples/jsm/tsl/display/TransitionNode.js +1 -1
- package/examples/jsm/tsl/display/depthAwareBlend.js +80 -0
- package/examples/jsm/tsl/display/radialBlur.js +68 -0
- package/examples/jsm/tsl/lighting/DynamicLightsNode.js +300 -0
- package/examples/jsm/tsl/lighting/data/AmbientLightDataNode.js +61 -0
- package/examples/jsm/tsl/lighting/data/DirectionalLightDataNode.js +111 -0
- package/examples/jsm/tsl/lighting/data/HemisphereLightDataNode.js +99 -0
- package/examples/jsm/tsl/lighting/data/PointLightDataNode.js +134 -0
- package/examples/jsm/tsl/lighting/data/SpotLightDataNode.js +161 -0
- package/examples/jsm/tsl/math/Bayer.js +53 -3
- package/examples/jsm/utils/BufferGeometryUtils.js +2 -3
- package/examples/jsm/utils/ColorUtils.js +76 -0
- package/examples/jsm/utils/LDrawUtils.js +1 -1
- package/examples/jsm/utils/ShadowMapViewer.js +24 -10
- package/examples/jsm/utils/ShadowMapViewerGPU.js +1 -1
- package/examples/jsm/utils/SkeletonUtils.js +14 -8
- package/examples/jsm/utils/WebGPUTextureUtils.js +1 -1
- package/examples/jsm/webxr/XRHandMeshModel.js +36 -10
- package/examples/jsm/webxr/XRHandModelFactory.js +2 -1
- package/package.json +24 -30
- package/src/Three.Core.js +3 -1
- package/src/Three.TSL.js +25 -11
- package/src/Three.WebGPU.Nodes.js +5 -0
- package/src/Three.WebGPU.js +9 -0
- package/src/Three.js +1 -0
- package/src/animation/AnimationAction.js +12 -2
- package/src/animation/AnimationClip.js +1 -1
- package/src/animation/AnimationMixer.js +6 -0
- package/src/animation/AnimationUtils.js +1 -12
- package/src/animation/KeyframeTrack.js +47 -8
- package/src/animation/PropertyMixer.js +4 -4
- package/src/animation/tracks/BooleanKeyframeTrack.js +1 -1
- package/src/animation/tracks/ColorKeyframeTrack.js +1 -1
- package/src/animation/tracks/NumberKeyframeTrack.js +1 -1
- package/src/animation/tracks/QuaternionKeyframeTrack.js +1 -1
- package/src/animation/tracks/StringKeyframeTrack.js +1 -1
- package/src/animation/tracks/VectorKeyframeTrack.js +1 -1
- package/src/audio/Audio.js +1 -1
- package/src/audio/AudioContext.js +2 -2
- package/src/audio/AudioListener.js +5 -3
- package/src/cameras/Camera.js +32 -2
- package/src/cameras/CubeCamera.js +20 -0
- package/src/constants.js +90 -5
- package/src/core/BufferAttribute.js +13 -1
- package/src/core/BufferGeometry.js +14 -2
- package/src/core/Clock.js +7 -0
- package/src/core/Object3D.js +52 -4
- package/src/core/Raycaster.js +2 -2
- package/src/core/RenderTarget.js +4 -4
- package/src/extras/PMREMGenerator.js +7 -18
- package/src/extras/TextureUtils.js +5 -1
- package/src/extras/curves/CatmullRomCurve3.js +3 -2
- package/src/geometries/ExtrudeGeometry.js +2 -2
- package/src/geometries/PolyhedronGeometry.js +1 -1
- package/src/geometries/TorusGeometry.js +8 -3
- package/src/helpers/CameraHelper.js +3 -0
- package/src/helpers/DirectionalLightHelper.js +4 -1
- package/src/helpers/HemisphereLightHelper.js +3 -0
- package/src/helpers/PointLightHelper.js +1 -25
- package/src/helpers/SpotLightHelper.js +3 -0
- package/src/lights/DirectionalLight.js +13 -0
- package/src/lights/HemisphereLight.js +10 -0
- package/src/lights/Light.js +1 -11
- package/src/lights/LightProbe.js +0 -15
- package/src/lights/LightShadow.js +15 -6
- package/src/lights/PointLight.js +15 -0
- package/src/lights/PointLightShadow.js +0 -86
- package/src/lights/SpotLight.js +22 -1
- package/src/lights/webgpu/IESSpotLight.js +2 -1
- package/src/loaders/AudioLoader.js +11 -1
- package/src/loaders/Cache.js +28 -0
- package/src/loaders/DataTextureLoader.js +6 -4
- package/src/loaders/FileLoader.js +2 -3
- package/src/loaders/ImageBitmapLoader.js +12 -9
- package/src/loaders/Loader.js +6 -0
- package/src/loaders/MaterialLoader.js +3 -2
- package/src/loaders/ObjectLoader.js +46 -6
- package/src/loaders/nodes/NodeLoader.js +2 -2
- package/src/loaders/nodes/NodeObjectLoader.js +18 -0
- package/src/materials/Material.js +2 -0
- package/src/materials/MeshLambertMaterial.js +9 -0
- package/src/materials/MeshPhongMaterial.js +9 -0
- package/src/materials/MeshToonMaterial.js +1 -1
- package/src/materials/ShaderMaterial.js +20 -1
- package/src/materials/nodes/Line2NodeMaterial.js +34 -7
- package/src/materials/nodes/MeshPhysicalNodeMaterial.js +5 -2
- package/src/materials/nodes/MeshStandardNodeMaterial.js +5 -4
- package/src/materials/nodes/NodeMaterial.js +45 -25
- package/src/materials/nodes/manager/NodeMaterialObserver.js +191 -86
- package/src/math/Line3.js +6 -5
- package/src/math/MathUtils.js +10 -10
- package/src/math/Matrix2.js +13 -9
- package/src/math/Matrix3.js +13 -9
- package/src/math/Matrix4.js +87 -74
- package/src/math/Plane.js +4 -3
- package/src/math/Quaternion.js +3 -29
- package/src/math/Sphere.js +1 -1
- package/src/math/Triangle.js +1 -1
- package/src/math/Vector2.js +11 -7
- package/src/math/Vector3.js +15 -13
- package/src/math/Vector4.js +13 -9
- package/src/math/interpolants/BezierInterpolant.js +108 -0
- package/src/nodes/Nodes.js +86 -68
- package/src/nodes/TSL.js +7 -7
- package/src/nodes/accessors/Arrays.js +1 -1
- package/src/nodes/accessors/BatchNode.js +10 -10
- package/src/nodes/accessors/Bitangent.js +5 -5
- package/src/nodes/accessors/BufferAttributeNode.js +107 -15
- package/src/nodes/accessors/BufferNode.js +29 -2
- package/src/nodes/accessors/Camera.js +149 -28
- package/src/nodes/accessors/ClippingNode.js +4 -4
- package/src/nodes/accessors/CubeTextureNode.js +27 -2
- package/src/nodes/accessors/InstanceNode.js +148 -43
- package/src/nodes/accessors/MaterialNode.js +9 -1
- package/src/nodes/accessors/MaterialProperties.js +2 -5
- package/src/nodes/accessors/MaterialReferenceNode.js +1 -2
- package/src/nodes/accessors/ModelNode.js +1 -1
- package/src/nodes/accessors/Normal.js +11 -11
- package/src/nodes/accessors/Object3DNode.js +1 -1
- package/src/nodes/accessors/Position.js +34 -2
- package/src/nodes/accessors/ReferenceBaseNode.js +6 -6
- package/src/nodes/accessors/ReferenceNode.js +8 -8
- package/src/nodes/accessors/RendererReferenceNode.js +1 -2
- package/src/nodes/accessors/SceneProperties.js +47 -0
- package/src/nodes/accessors/SkinningNode.js +27 -26
- package/src/nodes/accessors/StorageBufferNode.js +14 -25
- package/src/nodes/accessors/StorageTextureNode.js +40 -9
- package/src/nodes/accessors/Tangent.js +4 -14
- package/src/nodes/accessors/Texture3DNode.js +32 -35
- package/src/nodes/accessors/TextureNode.js +67 -23
- package/src/nodes/accessors/UniformArrayNode.js +6 -4
- package/src/nodes/accessors/UserDataNode.js +1 -2
- package/src/nodes/accessors/VertexColorNode.js +1 -2
- package/src/nodes/code/FunctionCallNode.js +1 -1
- package/src/nodes/code/FunctionNode.js +2 -3
- package/src/nodes/core/ArrayNode.js +21 -2
- package/src/nodes/core/AssignNode.js +3 -3
- package/src/nodes/core/AttributeNode.js +3 -3
- package/src/nodes/core/BypassNode.js +1 -1
- package/src/nodes/core/ContextNode.js +104 -5
- package/src/nodes/core/IndexNode.js +2 -1
- package/src/nodes/core/InputNode.js +1 -1
- package/src/nodes/core/InspectorNode.js +1 -1
- package/src/nodes/core/IsolateNode.js +1 -1
- package/src/nodes/core/MRTNode.js +48 -2
- package/src/nodes/core/Node.js +112 -15
- package/src/nodes/core/NodeBuilder.js +284 -66
- package/src/nodes/core/NodeError.js +28 -0
- package/src/nodes/core/NodeFrame.js +12 -4
- package/src/nodes/core/NodeUtils.js +11 -9
- package/src/nodes/core/OutputStructNode.js +12 -10
- package/src/nodes/core/ParameterNode.js +4 -4
- package/src/nodes/core/PropertyNode.js +19 -3
- package/src/nodes/core/StackNode.js +66 -17
- package/src/nodes/core/StackTrace.js +139 -0
- package/src/nodes/core/StructNode.js +17 -3
- package/src/nodes/core/StructTypeNode.js +12 -18
- package/src/nodes/core/SubBuildNode.js +2 -2
- package/src/nodes/core/UniformGroupNode.js +36 -6
- package/src/nodes/core/UniformNode.js +21 -5
- package/src/nodes/core/VarNode.js +48 -23
- package/src/nodes/core/VaryingNode.js +2 -19
- package/src/nodes/display/BlendModes.js +0 -64
- package/src/nodes/display/ColorAdjustment.js +17 -0
- package/src/nodes/display/ColorSpaceNode.js +3 -3
- package/src/nodes/display/NormalMapNode.js +39 -4
- package/src/nodes/display/PassNode.js +125 -16
- package/src/nodes/display/RenderOutputNode.js +7 -7
- package/src/nodes/display/ScreenNode.js +4 -2
- package/src/nodes/display/ToneMappingNode.js +1 -1
- package/src/nodes/display/ToonOutlinePassNode.js +2 -2
- package/src/nodes/display/ViewportDepthNode.js +52 -4
- package/src/nodes/display/ViewportDepthTextureNode.js +11 -15
- package/src/nodes/display/ViewportTextureNode.js +39 -11
- package/src/nodes/fog/Fog.js +18 -35
- package/src/nodes/functions/BSDF/BRDF_GGX_Multiscatter.js +3 -3
- package/src/nodes/functions/BSDF/DFGLUT.js +56 -0
- package/src/nodes/functions/BSDF/EnvironmentBRDF.js +2 -2
- package/src/nodes/functions/BSDF/V_GGX_SmithCorrelated_Anisotropic.js +2 -2
- package/src/nodes/functions/PhysicalLightingModel.js +126 -45
- package/src/nodes/geometry/RangeNode.js +5 -3
- package/src/nodes/gpgpu/AtomicFunctionNode.js +1 -1
- package/src/nodes/gpgpu/BarrierNode.js +9 -0
- package/src/nodes/gpgpu/ComputeBuiltinNode.js +2 -3
- package/src/nodes/gpgpu/ComputeNode.js +74 -48
- package/src/nodes/gpgpu/SubgroupFunctionNode.js +2 -2
- package/src/nodes/gpgpu/WorkgroupInfoNode.js +4 -4
- package/src/nodes/lighting/AnalyticLightNode.js +53 -0
- package/src/nodes/lighting/EnvironmentNode.js +28 -3
- package/src/nodes/lighting/LightsNode.js +7 -28
- package/src/nodes/lighting/PointShadowNode.js +162 -149
- package/src/nodes/lighting/ShadowFilterNode.js +53 -65
- package/src/nodes/lighting/ShadowNode.js +120 -42
- package/src/nodes/math/BitcastNode.js +1 -1
- package/src/nodes/math/BitcountNode.js +433 -0
- package/src/nodes/math/ConditionalNode.js +3 -3
- package/src/nodes/math/MathNode.js +76 -41
- package/src/nodes/math/OperatorNode.js +3 -2
- package/src/nodes/math/PackFloatNode.js +98 -0
- package/src/nodes/math/UnpackFloatNode.js +96 -0
- package/src/nodes/pmrem/PMREMNode.js +1 -1
- package/src/nodes/pmrem/PMREMUtils.js +9 -15
- package/src/nodes/tsl/TSLBase.js +1 -1
- package/src/nodes/tsl/TSLCore.js +38 -17
- package/src/nodes/utils/ArrayElementNode.js +14 -1
- package/src/nodes/utils/ConvertNode.js +1 -1
- package/src/nodes/utils/DebugNode.js +12 -12
- package/src/nodes/utils/EventNode.js +31 -2
- package/src/nodes/utils/FlipNode.js +1 -1
- package/src/nodes/utils/FunctionOverloadingNode.js +1 -1
- package/src/nodes/utils/JoinNode.js +3 -3
- package/src/nodes/utils/LoopNode.js +1 -1
- package/src/nodes/utils/MemberNode.js +2 -2
- package/src/nodes/utils/Packing.js +13 -1
- package/src/nodes/utils/PostProcessingUtils.js +33 -1
- package/src/nodes/utils/RTTNode.js +1 -1
- package/src/nodes/utils/ReflectorNode.js +3 -4
- package/src/nodes/utils/Remap.js +48 -0
- package/src/nodes/utils/RotateNode.js +1 -1
- package/src/nodes/utils/SampleNode.js +1 -1
- package/src/nodes/utils/SetNode.js +1 -1
- package/src/nodes/utils/SplitNode.js +1 -1
- package/src/nodes/utils/SpriteSheetUV.js +35 -0
- package/src/nodes/utils/UVUtils.js +28 -0
- package/src/objects/BatchedMesh.js +44 -16
- package/src/objects/InstancedMesh.js +30 -3
- package/src/objects/Line.js +1 -1
- package/src/objects/Mesh.js +1 -1
- package/src/objects/Points.js +1 -1
- package/src/objects/Skeleton.js +9 -0
- package/src/objects/SkinnedMesh.js +26 -9
- package/src/renderers/WebGLRenderer.js +329 -145
- package/src/renderers/common/Animation.js +3 -3
- package/src/renderers/common/Attributes.js +15 -1
- package/src/renderers/common/Backend.js +29 -8
- package/src/renderers/common/Background.js +26 -13
- package/src/renderers/common/BindGroup.js +1 -16
- package/src/renderers/common/Binding.js +11 -0
- package/src/renderers/common/Bindings.js +29 -14
- package/src/renderers/common/BlendMode.js +143 -0
- package/src/renderers/common/Buffer.js +40 -0
- package/src/renderers/common/BundleGroup.js +1 -1
- package/src/renderers/common/ChainMap.js +30 -6
- package/src/renderers/common/ComputePipeline.js +1 -1
- package/src/renderers/common/CubeRenderTarget.js +51 -7
- package/src/renderers/common/Geometries.js +29 -3
- package/src/renderers/common/Info.js +333 -4
- package/src/renderers/common/InspectorBase.js +6 -1
- package/src/renderers/common/Lighting.js +5 -21
- package/src/renderers/common/Pipelines.js +40 -7
- package/src/renderers/common/PostProcessing.js +8 -206
- package/src/renderers/common/ReadbackBuffer.js +78 -0
- package/src/renderers/common/RenderBundle.js +3 -1
- package/src/renderers/common/RenderBundles.js +7 -3
- package/src/renderers/common/RenderContext.js +16 -0
- package/src/renderers/common/RenderContexts.js +33 -49
- package/src/renderers/common/RenderLists.js +2 -1
- package/src/renderers/common/RenderObject.js +17 -5
- package/src/renderers/common/RenderObjectPipeline.js +40 -0
- package/src/renderers/common/RenderObjects.js +21 -5
- package/src/renderers/common/RenderPipeline.js +232 -17
- package/src/renderers/common/Renderer.js +481 -117
- package/src/renderers/common/Sampler.js +4 -4
- package/src/renderers/common/StorageBuffer.js +13 -1
- package/src/renderers/common/Textures.js +89 -4
- package/src/renderers/common/TimestampQueryPool.js +5 -3
- package/src/renderers/common/Uniform.js +8 -0
- package/src/renderers/common/UniformsGroup.js +62 -1
- package/src/renderers/common/XRManager.js +37 -29
- package/src/renderers/common/extras/PMREMGenerator.js +25 -23
- package/src/renderers/common/nodes/NodeBuilderState.js +1 -1
- package/src/renderers/common/nodes/{Nodes.js → NodeManager.js} +242 -99
- package/src/renderers/common/nodes/NodeStorageBuffer.js +13 -2
- package/src/renderers/common/nodes/NodeUniformBuffer.js +52 -0
- package/src/renderers/shaders/DFGLUTData.js +19 -34
- package/src/renderers/shaders/ShaderChunk/batching_pars_vertex.glsl.js +2 -2
- package/src/renderers/shaders/ShaderChunk/color_fragment.glsl.js +1 -5
- package/src/renderers/shaders/ShaderChunk/color_pars_fragment.glsl.js +1 -5
- package/src/renderers/shaders/ShaderChunk/color_pars_vertex.glsl.js +1 -5
- package/src/renderers/shaders/ShaderChunk/color_vertex.glsl.js +8 -10
- package/src/renderers/shaders/ShaderChunk/envmap_common_pars_fragment.glsl.js +0 -1
- package/src/renderers/shaders/ShaderChunk/envmap_fragment.glsl.js +8 -12
- package/src/renderers/shaders/ShaderChunk/lightprobes_pars_fragment.glsl.js +80 -0
- package/src/renderers/shaders/ShaderChunk/lights_fragment_begin.glsl.js +13 -2
- package/src/renderers/shaders/ShaderChunk/lights_fragment_end.glsl.js +6 -0
- package/src/renderers/shaders/ShaderChunk/lights_fragment_maps.glsl.js +6 -2
- package/src/renderers/shaders/ShaderChunk/lights_pars_begin.glsl.js +2 -0
- package/src/renderers/shaders/ShaderChunk/lights_physical_fragment.glsl.js +8 -4
- package/src/renderers/shaders/ShaderChunk/lights_physical_pars_fragment.glsl.js +112 -53
- package/src/renderers/shaders/ShaderChunk/normal_fragment_maps.glsl.js +7 -0
- package/src/renderers/shaders/ShaderChunk/packing.glsl.js +20 -4
- package/src/renderers/shaders/ShaderChunk/premultiplied_alpha_fragment.glsl.js +0 -1
- package/src/renderers/shaders/ShaderChunk/shadowmap_pars_fragment.glsl.js +225 -186
- package/src/renderers/shaders/ShaderChunk/shadowmap_vertex.glsl.js +12 -2
- package/src/renderers/shaders/ShaderChunk/shadowmask_pars_fragment.glsl.js +1 -1
- package/src/renderers/shaders/ShaderChunk/transmission_fragment.glsl.js +1 -1
- package/src/renderers/shaders/ShaderChunk.js +5 -3
- package/src/renderers/shaders/ShaderLib/backgroundCube.glsl.js +1 -2
- package/src/renderers/shaders/ShaderLib/depth.glsl.js +3 -0
- package/src/renderers/shaders/ShaderLib/{distanceRGBA.glsl.js → distance.glsl.js} +1 -2
- package/src/renderers/shaders/ShaderLib/meshlambert.glsl.js +2 -1
- package/src/renderers/shaders/ShaderLib/meshnormal.glsl.js +1 -2
- package/src/renderers/shaders/ShaderLib/meshphong.glsl.js +2 -1
- package/src/renderers/shaders/ShaderLib/meshphysical.glsl.js +4 -9
- package/src/renderers/shaders/ShaderLib/meshtoon.glsl.js +0 -1
- package/src/renderers/shaders/ShaderLib/shadow.glsl.js +1 -1
- package/src/renderers/shaders/ShaderLib/vsm.glsl.js +4 -6
- package/src/renderers/shaders/ShaderLib.js +7 -6
- package/src/renderers/shaders/UniformsLib.js +7 -5
- package/src/renderers/shaders/UniformsUtils.js +27 -5
- package/src/renderers/webgl/WebGLAnimation.js +2 -1
- package/src/renderers/webgl/WebGLBackground.js +15 -15
- package/src/renderers/webgl/WebGLBindingStates.js +99 -27
- package/src/renderers/webgl/WebGLBufferRenderer.js +0 -32
- package/src/renderers/webgl/WebGLCapabilities.js +9 -4
- package/src/renderers/webgl/WebGLEnvironments.js +228 -0
- package/src/renderers/webgl/WebGLGeometries.js +10 -7
- package/src/renderers/webgl/WebGLIndexedBufferRenderer.js +0 -32
- package/src/renderers/webgl/WebGLLights.js +18 -1
- package/src/renderers/webgl/WebGLMaterials.js +24 -13
- package/src/renderers/webgl/WebGLObjects.js +3 -1
- package/src/renderers/webgl/WebGLOutput.js +270 -0
- package/src/renderers/webgl/WebGLProgram.js +49 -109
- package/src/renderers/webgl/WebGLPrograms.js +63 -51
- package/src/renderers/webgl/WebGLRenderLists.js +15 -0
- package/src/renderers/webgl/WebGLRenderStates.js +13 -2
- package/src/renderers/webgl/WebGLShadowMap.js +188 -24
- package/src/renderers/webgl/WebGLState.js +75 -37
- package/src/renderers/webgl/WebGLTextures.js +215 -54
- package/src/renderers/webgl/WebGLUniforms.js +40 -3
- package/src/renderers/webgl/WebGLUniformsGroups.js +19 -0
- package/src/renderers/webgl/WebGLUtils.js +6 -2
- package/src/renderers/webgl-fallback/WebGLBackend.js +253 -82
- package/src/renderers/webgl-fallback/WebGLBufferRenderer.js +0 -41
- package/src/renderers/webgl-fallback/nodes/GLSLNodeBuilder.js +173 -74
- package/src/renderers/webgl-fallback/utils/WebGLAttributeUtils.js +53 -19
- package/src/renderers/webgl-fallback/utils/WebGLCapabilities.js +25 -0
- package/src/renderers/webgl-fallback/utils/WebGLState.js +223 -6
- package/src/renderers/webgl-fallback/utils/WebGLTextureUtils.js +68 -53
- package/src/renderers/webgl-fallback/utils/WebGLTimestampQueryPool.js +10 -10
- package/src/renderers/webgl-fallback/utils/WebGLUtils.js +6 -2
- package/src/renderers/webgpu/WebGPUBackend.js +260 -140
- package/src/renderers/webgpu/WebGPURenderer.js +2 -1
- package/src/renderers/webgpu/nodes/WGSLNodeBuilder.js +366 -90
- package/src/renderers/webgpu/utils/WebGPUAttributeUtils.js +107 -34
- package/src/renderers/webgpu/utils/WebGPUBindingUtils.js +357 -200
- package/src/renderers/webgpu/utils/WebGPUCapabilities.js +48 -0
- package/src/renderers/webgpu/utils/WebGPUConstants.js +10 -0
- package/src/renderers/webgpu/utils/WebGPUPipelineUtils.js +61 -23
- package/src/renderers/webgpu/utils/WebGPUTexturePassUtils.js +152 -200
- package/src/renderers/webgpu/utils/WebGPUTextureUtils.js +156 -59
- package/src/renderers/webgpu/utils/WebGPUTimestampQueryPool.js +7 -7
- package/src/renderers/webgpu/utils/WebGPUUtils.js +33 -11
- package/src/renderers/webxr/WebXRController.js +12 -0
- package/src/renderers/webxr/WebXRManager.js +4 -2
- package/src/textures/CubeDepthTexture.js +76 -0
- package/src/textures/HTMLTexture.js +74 -0
- package/src/textures/Source.js +2 -2
- package/src/textures/Texture.js +16 -5
- package/src/utils.js +280 -3
- package/examples/jsm/materials/MeshGouraudMaterial.js +0 -434
- package/examples/jsm/materials/MeshPostProcessingMaterial.js +0 -167
- package/examples/jsm/shaders/GodRaysShader.js +0 -333
- package/src/nodes/accessors/SceneNode.js +0 -145
- package/src/nodes/code/ScriptableNode.js +0 -726
- package/src/nodes/code/ScriptableValueNode.js +0 -253
- package/src/nodes/display/PosterizeNode.js +0 -65
- package/src/nodes/functions/BSDF/DFGApprox.js +0 -71
- package/src/nodes/utils/RemapNode.js +0 -125
- package/src/nodes/utils/SpriteSheetUVNode.js +0 -90
- package/src/renderers/webgl/WebGLCubeMaps.js +0 -99
- package/src/renderers/webgl/WebGLCubeUVMaps.js +0 -134
|
@@ -5,8 +5,9 @@ import { mix, fract, step, max, clamp } from '../math/MathNode.js';
|
|
|
5
5
|
import { add, sub } from '../math/OperatorNode.js';
|
|
6
6
|
import { renderGroup } from '../core/UniformGroupNode.js';
|
|
7
7
|
import NodeMaterial from '../../materials/nodes/NodeMaterial.js';
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
8
|
+
import { screenCoordinate } from '../display/ScreenNode.js';
|
|
9
|
+
import { interleavedGradientNoise, vogelDiskSample } from '../utils/PostProcessingUtils.js';
|
|
10
|
+
import { NoBlending } from '../../constants.js';
|
|
10
11
|
|
|
11
12
|
const shadowMaterialLib = /*@__PURE__*/ new WeakMap();
|
|
12
13
|
|
|
@@ -35,7 +36,11 @@ export const BasicShadowFilter = /*@__PURE__*/ Fn( ( { depthTexture, shadowCoord
|
|
|
35
36
|
} );
|
|
36
37
|
|
|
37
38
|
/**
|
|
38
|
-
* A shadow filtering function performing PCF filtering.
|
|
39
|
+
* A shadow filtering function performing PCF filtering with Vogel disk sampling and IGN.
|
|
40
|
+
*
|
|
41
|
+
* Uses 5 samples distributed via Vogel disk pattern, rotated per-pixel using Interleaved
|
|
42
|
+
* Gradient Noise (IGN) to break up banding artifacts. Combined with hardware PCF (4-tap
|
|
43
|
+
* filtering per sample), this effectively provides 20 filtered taps with better distribution.
|
|
39
44
|
*
|
|
40
45
|
* @method
|
|
41
46
|
* @param {Object} inputs - The input parameter object.
|
|
@@ -64,34 +69,19 @@ export const PCFShadowFilter = /*@__PURE__*/ Fn( ( { depthTexture, shadowCoord,
|
|
|
64
69
|
const radius = reference( 'radius', 'float', shadow ).setGroup( renderGroup );
|
|
65
70
|
|
|
66
71
|
const texelSize = vec2( 1 ).div( mapSize );
|
|
67
|
-
const
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
const
|
|
71
|
-
const dx2 = dx0.div( 2 );
|
|
72
|
-
const dy2 = dy0.div( 2 );
|
|
73
|
-
const dx3 = dx1.div( 2 );
|
|
74
|
-
const dy3 = dy1.div( 2 );
|
|
72
|
+
const radiusScaled = radius.mul( texelSize.x );
|
|
73
|
+
|
|
74
|
+
// Use IGN to rotate sampling pattern per pixel (phi = IGN * 2π)
|
|
75
|
+
const phi = interleavedGradientNoise( screenCoordinate.xy ).mul( 6.28318530718 );
|
|
75
76
|
|
|
77
|
+
// 5 samples using Vogel disk distribution
|
|
76
78
|
return add(
|
|
77
|
-
depthCompare( shadowCoord.xy.add(
|
|
78
|
-
depthCompare( shadowCoord.xy.add(
|
|
79
|
-
depthCompare( shadowCoord.xy.add(
|
|
80
|
-
depthCompare( shadowCoord.xy.add(
|
|
81
|
-
depthCompare( shadowCoord.xy.add(
|
|
82
|
-
|
|
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 );
|
|
79
|
+
depthCompare( shadowCoord.xy.add( vogelDiskSample( 0, 5, phi ).mul( radiusScaled ) ), shadowCoord.z ),
|
|
80
|
+
depthCompare( shadowCoord.xy.add( vogelDiskSample( 1, 5, phi ).mul( radiusScaled ) ), shadowCoord.z ),
|
|
81
|
+
depthCompare( shadowCoord.xy.add( vogelDiskSample( 2, 5, phi ).mul( radiusScaled ) ), shadowCoord.z ),
|
|
82
|
+
depthCompare( shadowCoord.xy.add( vogelDiskSample( 3, 5, phi ).mul( radiusScaled ) ), shadowCoord.z ),
|
|
83
|
+
depthCompare( shadowCoord.xy.add( vogelDiskSample( 4, 5, phi ).mul( radiusScaled ) ), shadowCoord.z )
|
|
84
|
+
).mul( 1 / 5 );
|
|
95
85
|
|
|
96
86
|
} );
|
|
97
87
|
|
|
@@ -183,9 +173,7 @@ export const PCFSoftShadowFilter = /*@__PURE__*/ Fn( ( { depthTexture, shadowCoo
|
|
|
183
173
|
* @param {Node<vec3>} inputs.shadowCoord - The shadow coordinates.
|
|
184
174
|
* @return {Node<float>} The filtering result.
|
|
185
175
|
*/
|
|
186
|
-
export const VSMShadowFilter = /*@__PURE__*/ Fn( ( { depthTexture, shadowCoord, depthLayer } ) => {
|
|
187
|
-
|
|
188
|
-
const occlusion = float( 1 ).toVar();
|
|
176
|
+
export const VSMShadowFilter = /*@__PURE__*/ Fn( ( { depthTexture, shadowCoord, depthLayer }, builder ) => {
|
|
189
177
|
|
|
190
178
|
let distribution = texture( depthTexture ).sample( shadowCoord.xy );
|
|
191
179
|
|
|
@@ -197,47 +185,31 @@ export const VSMShadowFilter = /*@__PURE__*/ Fn( ( { depthTexture, shadowCoord,
|
|
|
197
185
|
|
|
198
186
|
distribution = distribution.rg;
|
|
199
187
|
|
|
200
|
-
const
|
|
188
|
+
const mean = distribution.x;
|
|
189
|
+
const variance = max( 0.0000001, distribution.y.mul( distribution.y ) );
|
|
201
190
|
|
|
202
|
-
|
|
191
|
+
const hardShadow = ( builder.renderer.reversedDepthBuffer ) ? step( mean, shadowCoord.z ) : step( shadowCoord.z, mean );
|
|
203
192
|
|
|
204
|
-
|
|
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 ) ) );
|
|
193
|
+
const output = float( 1 ).toVar(); // default, fully lit
|
|
209
194
|
|
|
210
|
-
|
|
195
|
+
If( hardShadow.notEqual( 1.0 ), () => {
|
|
211
196
|
|
|
212
|
-
|
|
197
|
+
// Distance from mean
|
|
198
|
+
const d = shadowCoord.z.sub( mean );
|
|
213
199
|
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
//
|
|
200
|
+
// Chebyshev's inequality for upper bound on probability
|
|
201
|
+
let p_max = variance.div( variance.add( d.mul( d ) ) );
|
|
217
202
|
|
|
218
|
-
|
|
203
|
+
// Reduce light bleeding by remapping [amount, 1] to [0, 1]
|
|
204
|
+
p_max = clamp( sub( p_max, 0.3 ).div( 0.65 ) );
|
|
219
205
|
|
|
220
|
-
|
|
221
|
-
dist = dist.sub( cameraNear ).div( cameraFar.sub( cameraNear ) );
|
|
222
|
-
dist = dist.saturate(); // clamp to [ 0, 1 ]
|
|
206
|
+
output.assign( max( hardShadow, p_max ) );
|
|
223
207
|
|
|
224
|
-
|
|
208
|
+
} );
|
|
209
|
+
return output;
|
|
225
210
|
|
|
226
211
|
} );
|
|
227
212
|
|
|
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
213
|
/**
|
|
242
214
|
* Retrieves or creates a shadow material for the given light source.
|
|
243
215
|
*
|
|
@@ -258,13 +230,11 @@ export const getShadowMaterial = ( light ) => {
|
|
|
258
230
|
|
|
259
231
|
if ( material === undefined ) {
|
|
260
232
|
|
|
261
|
-
const depthNode = light.isPointLight ? linearShadowDistance( light ) : null;
|
|
262
|
-
|
|
263
233
|
material = new NodeMaterial();
|
|
264
234
|
material.colorNode = vec4( 0, 0, 0, 1 );
|
|
265
|
-
material.depthNode = depthNode;
|
|
266
235
|
material.isShadowPassMaterial = true; // Use to avoid other overrideMaterial override material.colorNode unintentionally when using material.shadowNode
|
|
267
236
|
material.name = 'ShadowMaterial';
|
|
237
|
+
material.blending = NoBlending;
|
|
268
238
|
material.fog = false;
|
|
269
239
|
|
|
270
240
|
shadowMaterialLib.set( light, material );
|
|
@@ -274,3 +244,21 @@ export const getShadowMaterial = ( light ) => {
|
|
|
274
244
|
return material;
|
|
275
245
|
|
|
276
246
|
};
|
|
247
|
+
|
|
248
|
+
/**
|
|
249
|
+
* Disposes the shadow material for the given light source.
|
|
250
|
+
*
|
|
251
|
+
* @param {Light} light - The light source.
|
|
252
|
+
*/
|
|
253
|
+
export const disposeShadowMaterial = ( light ) => {
|
|
254
|
+
|
|
255
|
+
const material = shadowMaterialLib.get( light );
|
|
256
|
+
|
|
257
|
+
if ( material !== undefined ) {
|
|
258
|
+
|
|
259
|
+
material.dispose();
|
|
260
|
+
shadowMaterialLib.delete( light );
|
|
261
|
+
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
};
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import ShadowBaseNode, { shadowPositionWorld } from './ShadowBaseNode.js';
|
|
2
|
-
import { float, vec2, vec3, int, Fn
|
|
2
|
+
import { float, vec2, vec3, vec4, int, Fn } from '../tsl/TSLBase.js';
|
|
3
3
|
import { reference } from '../accessors/ReferenceNode.js';
|
|
4
4
|
import { texture, textureLoad } from '../accessors/TextureNode.js';
|
|
5
|
+
import { cubeTexture } from '../accessors/CubeTextureNode.js';
|
|
5
6
|
import { normalWorld } from '../accessors/Normal.js';
|
|
6
7
|
import { mix, sqrt } from '../math/MathNode.js';
|
|
7
8
|
import { add } from '../math/OperatorNode.js';
|
|
@@ -10,17 +11,18 @@ import NodeMaterial from '../../materials/nodes/NodeMaterial.js';
|
|
|
10
11
|
import QuadMesh from '../../renderers/common/QuadMesh.js';
|
|
11
12
|
import { Loop } from '../utils/LoopNode.js';
|
|
12
13
|
import { screenCoordinate } from '../display/ScreenNode.js';
|
|
13
|
-
import { HalfFloatType,
|
|
14
|
+
import { Compatibility, GreaterEqualCompare, HalfFloatType, LessEqualCompare, LinearFilter, NearestFilter, PCFShadowMap, PCFSoftShadowMap, RGFormat, VSMShadowMap } from '../../constants.js';
|
|
14
15
|
import { renderGroup } from '../core/UniformGroupNode.js';
|
|
15
16
|
import { viewZToLogarithmicDepth } from '../display/ViewportDepthNode.js';
|
|
16
17
|
import { lightShadowMatrix } from '../accessors/Lights.js';
|
|
17
18
|
import { resetRendererAndSceneState, restoreRendererAndSceneState } from '../../renderers/common/RendererUtils.js';
|
|
18
19
|
import { getDataFromObject } from '../core/NodeUtils.js';
|
|
19
|
-
import { getShadowMaterial, BasicShadowFilter, PCFShadowFilter, PCFSoftShadowFilter, VSMShadowFilter } from './ShadowFilterNode.js';
|
|
20
|
+
import { getShadowMaterial, disposeShadowMaterial, BasicShadowFilter, PCFShadowFilter, PCFSoftShadowFilter, VSMShadowFilter } from './ShadowFilterNode.js';
|
|
20
21
|
import ChainMap from '../../renderers/common/ChainMap.js';
|
|
21
|
-
import { warn } from '../../utils.js';
|
|
22
22
|
import { textureSize } from '../accessors/TextureSizeNode.js';
|
|
23
23
|
import { uv } from '../accessors/UV.js';
|
|
24
|
+
import { positionLocal } from '../accessors/Position.js';
|
|
25
|
+
import { uniform } from '../core/UniformNode.js';
|
|
24
26
|
|
|
25
27
|
//
|
|
26
28
|
|
|
@@ -36,16 +38,7 @@ const _shadowRenderObjectKeys = [];
|
|
|
36
38
|
* @param {LightShadow} shadow - The light shadow object containing shadow properties.
|
|
37
39
|
* @param {number} shadowType - The type of shadow map (e.g., BasicShadowMap).
|
|
38
40
|
* @param {boolean} useVelocity - Whether to use velocity data for rendering.
|
|
39
|
-
* @return {
|
|
40
|
-
*
|
|
41
|
-
* The returned function has the following parameters:
|
|
42
|
-
* @param {Object3D} object - The 3D object to render.
|
|
43
|
-
* @param {Scene} scene - The scene containing the object.
|
|
44
|
-
* @param {Camera} _camera - The camera used for rendering.
|
|
45
|
-
* @param {BufferGeometry} geometry - The geometry of the object.
|
|
46
|
-
* @param {Material} material - The material of the object.
|
|
47
|
-
* @param {Group} group - The group the object belongs to.
|
|
48
|
-
* @param {...any} params - Additional parameters for rendering.
|
|
41
|
+
* @return {shadowRenderObjectFunction} A function that renders shadow objects.
|
|
49
42
|
*/
|
|
50
43
|
export const getShadowRenderObjectFunction = ( renderer, shadow, shadowType, useVelocity ) => {
|
|
51
44
|
|
|
@@ -93,6 +86,7 @@ export const getShadowRenderObjectFunction = ( renderer, shadow, shadowType, use
|
|
|
93
86
|
/**
|
|
94
87
|
* Represents the shader code for the first VSM render pass.
|
|
95
88
|
*
|
|
89
|
+
* @private
|
|
96
90
|
* @method
|
|
97
91
|
* @param {Object} inputs - The input parameter object.
|
|
98
92
|
* @param {Node<float>} inputs.samples - The number of samples
|
|
@@ -131,7 +125,7 @@ const VSMPassVertical = /*@__PURE__*/ Fn( ( { samples, radius, size, shadowPass,
|
|
|
131
125
|
mean.divAssign( samples );
|
|
132
126
|
squaredMean.divAssign( samples );
|
|
133
127
|
|
|
134
|
-
const std_dev = sqrt( squaredMean.sub( mean.mul( mean ) ) );
|
|
128
|
+
const std_dev = sqrt( squaredMean.sub( mean.mul( mean ) ).max( 0 ) );
|
|
135
129
|
return vec2( mean, std_dev );
|
|
136
130
|
|
|
137
131
|
} );
|
|
@@ -139,6 +133,7 @@ const VSMPassVertical = /*@__PURE__*/ Fn( ( { samples, radius, size, shadowPass,
|
|
|
139
133
|
/**
|
|
140
134
|
* Represents the shader code for the second VSM render pass.
|
|
141
135
|
*
|
|
136
|
+
* @private
|
|
142
137
|
* @method
|
|
143
138
|
* @param {Object} inputs - The input parameter object.
|
|
144
139
|
* @param {Node<float>} inputs.samples - The number of samples
|
|
@@ -175,7 +170,7 @@ const VSMPassHorizontal = /*@__PURE__*/ Fn( ( { samples, radius, size, shadowPas
|
|
|
175
170
|
mean.divAssign( samples );
|
|
176
171
|
squaredMean.divAssign( samples );
|
|
177
172
|
|
|
178
|
-
const std_dev = sqrt( squaredMean.sub( mean.mul( mean ) ) );
|
|
173
|
+
const std_dev = sqrt( squaredMean.sub( mean.mul( mean ) ).max( 0 ) );
|
|
179
174
|
return vec2( mean, std_dev );
|
|
180
175
|
|
|
181
176
|
} );
|
|
@@ -348,7 +343,7 @@ class ShadowNode extends ShadowBaseNode {
|
|
|
348
343
|
const { shadow } = this;
|
|
349
344
|
const { renderer } = builder;
|
|
350
345
|
|
|
351
|
-
const bias = reference( 'bias', 'float', shadow ).setGroup( renderGroup );
|
|
346
|
+
const bias = shadow.biasNode || reference( 'bias', 'float', shadow ).setGroup( renderGroup );
|
|
352
347
|
|
|
353
348
|
let shadowCoord = shadowPosition;
|
|
354
349
|
let coordZ;
|
|
@@ -359,12 +354,6 @@ class ShadowNode extends ShadowBaseNode {
|
|
|
359
354
|
|
|
360
355
|
coordZ = shadowCoord.z;
|
|
361
356
|
|
|
362
|
-
if ( renderer.coordinateSystem === WebGPUCoordinateSystem ) {
|
|
363
|
-
|
|
364
|
-
coordZ = coordZ.mul( 2 ).sub( 1 ); // WebGPU: Conversion [ 0, 1 ] to [ - 1, 1 ]
|
|
365
|
-
|
|
366
|
-
}
|
|
367
|
-
|
|
368
357
|
} else {
|
|
369
358
|
|
|
370
359
|
const w = shadowCoord.w;
|
|
@@ -383,7 +372,7 @@ class ShadowNode extends ShadowBaseNode {
|
|
|
383
372
|
shadowCoord = vec3(
|
|
384
373
|
shadowCoord.x,
|
|
385
374
|
shadowCoord.y.oneMinus(), // follow webgpu standards
|
|
386
|
-
coordZ.add( bias )
|
|
375
|
+
renderer.reversedDepthBuffer ? coordZ.sub( bias ) : coordZ.add( bias )
|
|
387
376
|
);
|
|
388
377
|
|
|
389
378
|
return shadowCoord;
|
|
@@ -407,7 +396,7 @@ class ShadowNode extends ShadowBaseNode {
|
|
|
407
396
|
|
|
408
397
|
const depthTexture = new DepthTexture( shadow.mapSize.width, shadow.mapSize.height );
|
|
409
398
|
depthTexture.name = 'ShadowDepthTexture';
|
|
410
|
-
depthTexture.compareFunction =
|
|
399
|
+
depthTexture.compareFunction = builder.renderer.reversedDepthBuffer ? GreaterEqualCompare : LessEqualCompare;
|
|
411
400
|
|
|
412
401
|
const shadowMap = builder.createRenderTarget( shadow.mapSize.width, shadow.mapSize.height );
|
|
413
402
|
shadowMap.texture.name = 'ShadowMap';
|
|
@@ -430,9 +419,22 @@ class ShadowNode extends ShadowBaseNode {
|
|
|
430
419
|
|
|
431
420
|
const { light, shadow } = this;
|
|
432
421
|
|
|
422
|
+
const { depthTexture, shadowMap } = this.setupRenderTarget( shadow, builder );
|
|
423
|
+
|
|
433
424
|
const shadowMapType = renderer.shadowMap.type;
|
|
425
|
+
const hasTextureCompare = renderer.hasCompatibility( Compatibility.TEXTURE_COMPARE );
|
|
434
426
|
|
|
435
|
-
|
|
427
|
+
if ( ( shadowMapType === PCFShadowMap || shadowMapType === PCFSoftShadowMap ) && hasTextureCompare ) {
|
|
428
|
+
|
|
429
|
+
depthTexture.minFilter = LinearFilter;
|
|
430
|
+
depthTexture.magFilter = LinearFilter;
|
|
431
|
+
|
|
432
|
+
} else {
|
|
433
|
+
|
|
434
|
+
depthTexture.minFilter = NearestFilter;
|
|
435
|
+
depthTexture.magFilter = NearestFilter;
|
|
436
|
+
|
|
437
|
+
}
|
|
436
438
|
|
|
437
439
|
shadow.camera.coordinateSystem = camera.coordinateSystem;
|
|
438
440
|
shadow.camera.updateProjectionMatrix();
|
|
@@ -506,7 +508,27 @@ class ShadowNode extends ShadowBaseNode {
|
|
|
506
508
|
const shadowIntensity = reference( 'intensity', 'float', shadow ).setGroup( renderGroup );
|
|
507
509
|
const normalBias = reference( 'normalBias', 'float', shadow ).setGroup( renderGroup );
|
|
508
510
|
|
|
509
|
-
const
|
|
511
|
+
const shadowMatrix = lightShadowMatrix( light );
|
|
512
|
+
const shadowNormalBias = normalWorld.mul( normalBias );
|
|
513
|
+
|
|
514
|
+
let shadowPosition;
|
|
515
|
+
|
|
516
|
+
if ( ! renderer.highPrecision || builder.material.receivedShadowPositionNode || builder.context.shadowPositionWorld ) {
|
|
517
|
+
|
|
518
|
+
shadowPosition = shadowMatrix.mul( shadowPositionWorld.add( shadowNormalBias ) );
|
|
519
|
+
|
|
520
|
+
} else {
|
|
521
|
+
|
|
522
|
+
const highpShadowModelMatrix = uniform( 'mat4' ).onObjectUpdate( ( { object }, self ) => {
|
|
523
|
+
|
|
524
|
+
return self.value.multiplyMatrices( shadowMatrix.value, object.matrixWorld );
|
|
525
|
+
|
|
526
|
+
} );
|
|
527
|
+
|
|
528
|
+
shadowPosition = highpShadowModelMatrix.mul( positionLocal ).add( shadowMatrix.mul( vec4( shadowNormalBias, 0 ) ) );
|
|
529
|
+
|
|
530
|
+
}
|
|
531
|
+
|
|
510
532
|
const shadowCoord = this.setupShadowCoord( builder, shadowPosition );
|
|
511
533
|
|
|
512
534
|
//
|
|
@@ -523,15 +545,42 @@ class ShadowNode extends ShadowBaseNode {
|
|
|
523
545
|
|
|
524
546
|
const shadowNode = this.setupShadowFilter( builder, { filterFn, shadowTexture: shadowMap.texture, depthTexture: shadowDepthTexture, shadowCoord, shadow, depthLayer: this.depthLayer } );
|
|
525
547
|
|
|
526
|
-
let shadowColor
|
|
548
|
+
let shadowColor;
|
|
549
|
+
|
|
550
|
+
if ( renderer.shadowMap.transmitted === true ) {
|
|
551
|
+
|
|
552
|
+
if ( shadowMap.texture.isCubeTexture ) {
|
|
553
|
+
|
|
554
|
+
// For cube shadow maps (point lights), use cubeTexture with vec3 coordinates
|
|
555
|
+
shadowColor = cubeTexture( shadowMap.texture, shadowCoord.xyz );
|
|
527
556
|
|
|
528
|
-
|
|
557
|
+
} else {
|
|
558
|
+
|
|
559
|
+
shadowColor = texture( shadowMap.texture, shadowCoord );
|
|
560
|
+
|
|
561
|
+
if ( depthTexture.isArrayTexture ) {
|
|
529
562
|
|
|
530
|
-
|
|
563
|
+
shadowColor = shadowColor.depth( this.depthLayer );
|
|
564
|
+
|
|
565
|
+
}
|
|
566
|
+
|
|
567
|
+
}
|
|
531
568
|
|
|
532
569
|
}
|
|
533
570
|
|
|
534
|
-
|
|
571
|
+
//
|
|
572
|
+
|
|
573
|
+
let shadowOutput;
|
|
574
|
+
|
|
575
|
+
if ( shadowColor ) {
|
|
576
|
+
|
|
577
|
+
shadowOutput = mix( 1, shadowNode.rgb.mix( shadowColor, 1 ), shadowIntensity.mul( shadowColor.a ) ).toVar();
|
|
578
|
+
|
|
579
|
+
} else {
|
|
580
|
+
|
|
581
|
+
shadowOutput = mix( 1, shadowNode, shadowIntensity ).toVar();
|
|
582
|
+
|
|
583
|
+
}
|
|
535
584
|
|
|
536
585
|
this.shadowMap = shadowMap;
|
|
537
586
|
this.shadow.map = shadowMap;
|
|
@@ -540,13 +589,33 @@ class ShadowNode extends ShadowBaseNode {
|
|
|
540
589
|
|
|
541
590
|
const inspectName = `${ this.light.type } Shadow [ ${ this.light.name || 'ID: ' + this.light.id } ]`;
|
|
542
591
|
|
|
543
|
-
|
|
592
|
+
if ( shadowColor ) {
|
|
593
|
+
|
|
594
|
+
shadowOutput.toInspector( `${ inspectName } / Color`, () => {
|
|
595
|
+
|
|
596
|
+
if ( this.shadowMap.texture.isCubeTexture ) {
|
|
597
|
+
|
|
598
|
+
return cubeTexture( this.shadowMap.texture );
|
|
599
|
+
|
|
600
|
+
}
|
|
601
|
+
|
|
602
|
+
return texture( this.shadowMap.texture );
|
|
603
|
+
|
|
604
|
+
} );
|
|
605
|
+
|
|
606
|
+
}
|
|
607
|
+
|
|
608
|
+
return shadowOutput.toInspector( `${ inspectName } / Depth`, () => {
|
|
609
|
+
|
|
610
|
+
// TODO: Use linear depth
|
|
544
611
|
|
|
545
|
-
|
|
612
|
+
if ( this.shadowMap.texture.isCubeTexture ) {
|
|
546
613
|
|
|
547
|
-
|
|
614
|
+
return cubeTexture( this.shadowMap.texture ).r.oneMinus();
|
|
548
615
|
|
|
549
|
-
|
|
616
|
+
}
|
|
617
|
+
|
|
618
|
+
return textureLoad( this.shadowMap.depthTexture, uv().mul( textureSize( texture( this.shadowMap.depthTexture ) ) ) ).r.oneMinus();
|
|
550
619
|
|
|
551
620
|
} );
|
|
552
621
|
|
|
@@ -585,12 +654,6 @@ class ShadowNode extends ShadowBaseNode {
|
|
|
585
654
|
|
|
586
655
|
}
|
|
587
656
|
|
|
588
|
-
if ( builder.material.shadowNode ) { // @deprecated, r171
|
|
589
|
-
|
|
590
|
-
warn( 'NodeMaterial: ".shadowNode" is deprecated. Use ".castShadowNode" instead.' );
|
|
591
|
-
|
|
592
|
-
}
|
|
593
|
-
|
|
594
657
|
if ( builder.material.receivedShadowNode ) {
|
|
595
658
|
|
|
596
659
|
node = builder.material.receivedShadowNode( node );
|
|
@@ -729,6 +792,8 @@ class ShadowNode extends ShadowBaseNode {
|
|
|
729
792
|
|
|
730
793
|
this._currentShadowType = null;
|
|
731
794
|
|
|
795
|
+
disposeShadowMaterial( this.light );
|
|
796
|
+
|
|
732
797
|
if ( this.shadowMap ) {
|
|
733
798
|
|
|
734
799
|
this.shadowMap.dispose();
|
|
@@ -799,6 +864,19 @@ class ShadowNode extends ShadowBaseNode {
|
|
|
799
864
|
|
|
800
865
|
export default ShadowNode;
|
|
801
866
|
|
|
867
|
+
/**
|
|
868
|
+
* Shadow Render Object Function.
|
|
869
|
+
*
|
|
870
|
+
* @function shadowRenderObjectFunction
|
|
871
|
+
* @param {Object3D} object - The 3D object to render.
|
|
872
|
+
* @param {Scene} scene - The scene containing the object.
|
|
873
|
+
* @param {Camera} _camera - The camera used for rendering.
|
|
874
|
+
* @param {BufferGeometry} geometry - The geometry of the object.
|
|
875
|
+
* @param {Material} material - The material of the object.
|
|
876
|
+
* @param {Group} group - The group the object belongs to.
|
|
877
|
+
* @param {...any} params - Additional parameters for rendering.
|
|
878
|
+
*/
|
|
879
|
+
|
|
802
880
|
/**
|
|
803
881
|
* TSL function for creating an instance of `ShadowNode`.
|
|
804
882
|
*
|
|
@@ -808,4 +886,4 @@ export default ShadowNode;
|
|
|
808
886
|
* @param {?LightShadow} [shadow] - The light shadow.
|
|
809
887
|
* @return {ShadowNode} The created shadow node.
|
|
810
888
|
*/
|
|
811
|
-
export const shadow = ( light, shadow ) =>
|
|
889
|
+
export const shadow = ( light, shadow ) => new ShadowNode( light, shadow );
|