super-three 0.170.1 → 0.172.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 +1 -1
- package/build/three.cjs +157 -49
- package/build/three.core.js +104 -42
- package/build/three.core.min.js +1 -1
- package/build/three.module.js +53 -8
- package/build/three.module.min.js +1 -1
- package/build/three.tsl.js +10 -5
- package/build/three.tsl.min.js +1 -1
- package/build/three.webgpu.js +21191 -1008
- package/build/three.webgpu.min.js +1 -1
- package/build/three.webgpu.nodes.js +21189 -1008
- package/build/three.webgpu.nodes.min.js +1 -1
- package/examples/jsm/Addons.js +0 -5
- package/examples/jsm/animation/CCDIKSolver.js +3 -2
- package/examples/jsm/controls/ArcballControls.js +28 -19
- package/examples/jsm/controls/OrbitControls.js +5 -4
- package/examples/jsm/csm/CSMShadowNode.js +16 -11
- package/examples/jsm/curves/NURBSCurve.js +1 -1
- package/examples/jsm/curves/NURBSUtils.js +3 -0
- package/examples/jsm/effects/OutlineEffect.js +1 -1
- package/examples/jsm/exporters/GLTFExporter.js +11 -7
- package/examples/jsm/exporters/KTX2Exporter.js +1 -1
- package/examples/jsm/exporters/PLYExporter.js +2 -2
- package/examples/jsm/helpers/TextureHelperGPU.js +15 -5
- package/examples/jsm/helpers/VertexNormalsHelper.js +2 -0
- package/examples/jsm/lights/LightProbeGenerator.js +3 -3
- package/examples/jsm/lines/webgpu/LineSegments2.js +15 -6
- package/examples/jsm/loaders/3MFLoader.js +6 -3
- package/examples/jsm/loaders/BVHLoader.js +1 -1
- package/examples/jsm/loaders/ColladaLoader.js +5 -5
- package/examples/jsm/loaders/DDSLoader.js +42 -0
- package/examples/jsm/loaders/GCodeLoader.js +1 -1
- package/examples/jsm/loaders/GLTFLoader.js +22 -2
- package/examples/jsm/loaders/KTX2Loader.js +6 -1
- package/examples/jsm/loaders/KTXLoader.js +4 -4
- package/examples/jsm/loaders/LDrawLoader.js +1 -1
- package/examples/jsm/loaders/LottieLoader.js +1 -1
- package/examples/jsm/loaders/MTLLoader.js +1 -0
- package/examples/jsm/loaders/NRRDLoader.js +1 -1
- package/examples/jsm/loaders/PLYLoader.js +7 -7
- package/examples/jsm/loaders/PVRLoader.js +1 -1
- package/examples/jsm/loaders/SVGLoader.js +2 -2
- package/examples/jsm/loaders/TDSLoader.js +1 -1
- package/examples/jsm/loaders/VRMLLoader.js +7 -7
- package/examples/jsm/loaders/lwo/IFFParser.js +4 -4
- package/examples/jsm/materials/LDrawConditionalLineNodeMaterial.js +1 -1
- package/examples/jsm/math/ConvexHull.js +1 -1
- package/examples/jsm/math/OBB.js +17 -0
- package/examples/jsm/misc/ProgressiveLightMapGPU.js +10 -10
- package/examples/jsm/misc/Volume.js +20 -12
- package/examples/jsm/misc/VolumeSlice.js +2 -2
- package/examples/jsm/modifiers/CurveModifier.js +10 -8
- package/examples/jsm/modifiers/CurveModifierGPU.js +9 -7
- package/examples/jsm/modifiers/SimplifyModifier.js +2 -2
- package/examples/jsm/objects/GroundedSkybox.js +4 -4
- package/examples/jsm/objects/Sky.js +2 -2
- package/examples/jsm/objects/SkyMesh.js +3 -3
- package/examples/jsm/objects/Water2.js +1 -1
- package/examples/jsm/objects/Water2Mesh.js +2 -2
- package/examples/jsm/objects/WaterMesh.js +4 -4
- package/examples/jsm/postprocessing/BloomPass.js +2 -2
- package/examples/jsm/postprocessing/EffectComposer.js +1 -2
- package/examples/jsm/postprocessing/OutlinePass.js +4 -4
- package/examples/jsm/postprocessing/SAOPass.js +1 -2
- package/examples/jsm/postprocessing/SMAAPass.js +1 -3
- package/examples/jsm/postprocessing/SSAOPass.js +2 -4
- package/examples/jsm/postprocessing/SSRPass.js +2 -4
- package/examples/jsm/postprocessing/UnrealBloomPass.js +2 -2
- package/examples/jsm/renderers/SVGRenderer.js +6 -4
- package/examples/jsm/shaders/BokehShader2.js +1 -1
- package/examples/jsm/shaders/GodRaysShader.js +3 -3
- package/examples/jsm/shaders/SobelOperatorShader.js +1 -1
- package/examples/jsm/tsl/display/AfterImageNode.js +93 -4
- package/examples/jsm/tsl/display/AnaglyphPassNode.js +46 -2
- package/examples/jsm/tsl/display/AnamorphicNode.js +118 -5
- package/examples/jsm/tsl/display/BleachBypass.js +10 -0
- package/examples/jsm/tsl/display/BloomNode.js +233 -26
- package/examples/jsm/tsl/display/DenoiseNode.js +141 -25
- package/examples/jsm/tsl/display/DepthOfFieldNode.js +80 -1
- package/examples/jsm/tsl/display/DotScreenNode.js +50 -5
- package/examples/jsm/tsl/display/FXAANode.js +52 -3
- package/examples/jsm/tsl/display/FilmNode.js +47 -1
- package/examples/jsm/tsl/display/GTAONode.js +210 -14
- package/examples/jsm/tsl/display/GaussianBlurNode.js +152 -8
- package/examples/jsm/tsl/display/LensflareNode.js +131 -13
- package/examples/jsm/tsl/display/Lut3DNode.js +55 -1
- package/examples/jsm/tsl/display/MotionBlur.js +12 -2
- package/examples/jsm/tsl/display/OutlineNode.js +343 -26
- package/examples/jsm/tsl/display/ParallaxBarrierPassNode.js +36 -2
- package/examples/jsm/tsl/display/PixelationPassNode.js +142 -9
- package/examples/jsm/tsl/display/RGBShiftNode.js +49 -2
- package/examples/jsm/tsl/display/SMAANode.js +187 -46
- package/examples/jsm/tsl/display/SSAAPassNode.js +110 -25
- package/examples/jsm/tsl/display/SSRNode.js +194 -21
- package/examples/jsm/tsl/display/Sepia.js +9 -0
- package/examples/jsm/tsl/display/SobelOperatorNode.js +54 -4
- package/examples/jsm/tsl/display/StereoCompositePassNode.js +79 -3
- package/examples/jsm/tsl/display/StereoPassNode.js +41 -3
- package/examples/jsm/tsl/display/TRAAPassNode.js +116 -21
- package/examples/jsm/tsl/display/TransitionNode.js +71 -6
- package/examples/jsm/tsl/display/hashBlur.js +14 -3
- package/examples/jsm/tsl/lighting/TiledLightsNode.js +40 -34
- package/examples/jsm/utils/BufferGeometryUtils.js +1 -1
- package/examples/jsm/utils/CameraUtils.js +4 -1
- package/examples/jsm/utils/GeometryUtils.js +22 -19
- package/examples/jsm/utils/SceneUtils.js +2 -2
- package/examples/jsm/webxr/XRControllerModelFactory.js +6 -1
- package/examples/jsm/webxr/XREstimatedLight.js +1 -1
- package/package.json +8 -3
- package/src/Three.Core.js +2 -0
- package/src/Three.Legacy.js +0 -21
- package/src/Three.TSL.js +9 -4
- package/src/Three.WebGPU.Nodes.js +2 -2
- package/src/Three.WebGPU.js +2 -2
- package/src/animation/PropertyBinding.js +2 -2
- package/src/cameras/PerspectiveCamera.js +18 -2
- package/src/constants.js +1 -1
- package/src/core/RenderTarget.js +18 -0
- package/src/core/RenderTarget3D.js +22 -0
- package/src/core/RenderTargetArray.js +22 -0
- package/src/extras/Earcut.js +1 -1
- package/src/extras/PMREMGenerator.js +20 -0
- package/src/extras/TextureUtils.js +6 -0
- package/src/helpers/CameraHelper.js +16 -13
- package/src/loaders/nodes/NodeLoader.js +59 -0
- package/src/loaders/nodes/NodeMaterialLoader.js +45 -0
- package/src/loaders/nodes/NodeObjectLoader.js +61 -0
- package/src/materials/nodes/InstancedPointsNodeMaterial.js +72 -19
- package/src/materials/nodes/Line2NodeMaterial.js +128 -34
- package/src/materials/nodes/LineBasicNodeMaterial.js +17 -2
- package/src/materials/nodes/LineDashedNodeMaterial.js +78 -5
- package/src/materials/nodes/MeshBasicNodeMaterial.js +56 -0
- package/src/materials/nodes/MeshLambertNodeMaterial.js +35 -0
- package/src/materials/nodes/MeshMatcapNodeMaterial.js +22 -2
- package/src/materials/nodes/MeshNormalNodeMaterial.js +21 -2
- package/src/materials/nodes/MeshPhongNodeMaterial.js +64 -1
- package/src/materials/nodes/MeshPhysicalNodeMaterial.js +269 -0
- package/src/materials/nodes/MeshSSSNodeMaterial.js +97 -6
- package/src/materials/nodes/MeshStandardNodeMaterial.js +78 -0
- package/src/materials/nodes/MeshToonNodeMaterial.js +28 -0
- package/src/materials/nodes/NodeMaterial.js +474 -21
- package/src/materials/nodes/PointsNodeMaterial.js +22 -13
- package/src/materials/nodes/ShadowNodeMaterial.js +29 -0
- package/src/materials/nodes/SpriteNodeMaterial.js +77 -19
- package/src/materials/nodes/VolumeNodeMaterial.js +80 -4
- package/src/materials/nodes/manager/NodeMaterialObserver.js +87 -0
- package/src/nodes/Nodes.js +1 -6
- package/src/nodes/TSL.js +2 -3
- package/src/nodes/accessors/AccessorsUtils.js +27 -0
- package/src/nodes/accessors/Arrays.js +24 -5
- package/src/nodes/accessors/BatchNode.js +39 -3
- package/src/nodes/accessors/Bitangent.js +37 -0
- package/src/nodes/accessors/BufferAttributeNode.js +178 -5
- package/src/nodes/accessors/BufferNode.js +63 -0
- package/src/nodes/accessors/BuiltinNode.js +38 -0
- package/src/nodes/accessors/Camera.js +49 -0
- package/src/nodes/accessors/ClippingNode.js +71 -2
- package/src/nodes/accessors/CubeTextureNode.js +64 -0
- package/src/nodes/accessors/InstanceNode.js +85 -2
- package/src/nodes/accessors/InstancedMeshNode.js +28 -3
- package/src/nodes/accessors/InstancedPointsMaterialNode.js +13 -0
- package/src/nodes/accessors/Lights.js +50 -1
- package/src/nodes/accessors/MaterialNode.js +302 -8
- package/src/nodes/accessors/MaterialProperties.js +7 -0
- package/src/nodes/accessors/MaterialReferenceNode.js +53 -13
- package/src/nodes/accessors/ModelNode.js +100 -5
- package/src/nodes/accessors/ModelViewProjectionNode.js +10 -38
- package/src/nodes/accessors/MorphNode.js +48 -4
- package/src/nodes/accessors/Normal.js +59 -3
- package/src/nodes/accessors/Object3DNode.js +102 -1
- package/src/nodes/accessors/PointUVNode.js +26 -0
- package/src/nodes/accessors/Position.js +53 -4
- package/src/nodes/accessors/ReferenceBaseNode.js +188 -0
- package/src/nodes/accessors/ReferenceNode.js +202 -2
- package/src/nodes/accessors/ReflectVector.js +24 -0
- package/src/nodes/accessors/RendererReferenceNode.js +46 -1
- package/src/nodes/accessors/SceneNode.js +54 -0
- package/src/nodes/accessors/SkinningNode.js +127 -1
- package/src/nodes/accessors/StorageBufferNode.js +168 -4
- package/src/nodes/accessors/StorageTextureNode.js +118 -0
- package/src/nodes/accessors/Tangent.js +36 -0
- package/src/nodes/accessors/Texture3DNode.js +89 -5
- package/src/nodes/accessors/TextureBicubic.js +12 -2
- package/src/nodes/accessors/TextureNode.js +309 -10
- package/src/nodes/accessors/TextureSizeNode.js +42 -0
- package/src/nodes/accessors/UV.js +10 -1
- package/src/nodes/accessors/UniformArrayNode.js +223 -23
- package/src/nodes/accessors/UserDataNode.js +46 -0
- package/src/nodes/accessors/VelocityNode.js +82 -0
- package/src/nodes/accessors/VertexColorNode.js +39 -2
- package/src/nodes/code/CodeNode.js +95 -1
- package/src/nodes/code/ExpressionNode.js +28 -0
- package/src/nodes/code/FunctionCallNode.js +37 -0
- package/src/nodes/code/FunctionNode.js +45 -0
- package/src/nodes/code/ScriptableNode.js +223 -1
- package/src/nodes/code/ScriptableValueNode.js +85 -1
- package/src/nodes/core/AssignNode.js +48 -2
- package/src/nodes/core/AttributeNode.js +43 -0
- package/src/nodes/core/BypassNode.js +47 -2
- package/src/nodes/core/CacheNode.js +53 -2
- package/src/nodes/core/ConstNode.js +24 -0
- package/src/nodes/core/ContextNode.js +65 -0
- package/src/nodes/core/IndexNode.js +68 -7
- package/src/nodes/core/InputNode.js +48 -0
- package/src/nodes/core/LightingModel.js +60 -0
- package/src/nodes/core/MRTNode.js +66 -0
- package/src/nodes/core/Node.js +337 -12
- package/src/nodes/core/NodeAttribute.js +38 -0
- package/src/nodes/core/NodeBuilder.js +945 -15
- package/src/nodes/core/NodeCache.js +41 -2
- package/src/nodes/core/NodeCode.js +31 -0
- package/src/nodes/core/NodeFrame.js +123 -2
- package/src/nodes/core/NodeFunction.js +46 -0
- package/src/nodes/core/NodeFunctionInput.js +44 -0
- package/src/nodes/core/NodeParser.js +11 -0
- package/src/nodes/core/NodeUniform.js +52 -0
- package/src/nodes/core/NodeUtils.js +141 -0
- package/src/nodes/core/NodeVar.js +30 -0
- package/src/nodes/core/NodeVarying.js +28 -0
- package/src/nodes/core/OutputStructNode.js +33 -2
- package/src/nodes/core/ParameterNode.js +28 -0
- package/src/nodes/core/PropertyNode.js +232 -0
- package/src/nodes/core/StackNode.js +78 -0
- package/src/nodes/core/StructTypeNode.js +39 -1
- package/src/nodes/core/TempNode.js +30 -4
- package/src/nodes/core/UniformGroupNode.js +82 -7
- package/src/nodes/core/UniformNode.js +66 -0
- package/src/nodes/core/VarNode.js +52 -0
- package/src/nodes/core/VaryingNode.js +83 -2
- package/src/nodes/core/constants.js +36 -0
- package/src/nodes/display/BumpMapNode.js +37 -0
- package/src/nodes/display/ColorAdjustment.js +53 -11
- package/src/nodes/display/ColorSpaceFunctions.js +16 -0
- package/src/nodes/display/ColorSpaceNode.js +82 -0
- package/src/nodes/display/FrontFacingNode.js +29 -0
- package/src/nodes/display/NormalMapNode.js +43 -0
- package/src/nodes/display/PassNode.js +298 -7
- package/src/nodes/display/PosterizeNode.js +33 -0
- package/src/nodes/display/RenderOutputNode.js +66 -1
- package/src/nodes/display/ScreenNode.js +87 -0
- package/src/nodes/display/ToneMappingFunctions.js +58 -10
- package/src/nodes/display/ToneMappingNode.js +55 -2
- package/src/nodes/display/ToonOutlinePassNode.js +73 -0
- package/src/nodes/display/ViewportDepthNode.js +122 -8
- package/src/nodes/display/ViewportDepthTextureNode.js +23 -0
- package/src/nodes/display/ViewportSharedTextureNode.js +23 -0
- package/src/nodes/display/ViewportTextureNode.js +57 -0
- package/src/nodes/fog/Fog.js +93 -0
- package/src/nodes/functions/BasicLightingModel.js +24 -0
- package/src/nodes/functions/PhongLightingModel.js +34 -2
- package/src/nodes/functions/PhysicalLightingModel.js +167 -8
- package/src/nodes/functions/ShadowMaskModel.js +23 -0
- package/src/nodes/functions/ToonLightingModel.js +20 -0
- package/src/nodes/functions/material/getAlphaHashThreshold.js +1 -3
- package/src/nodes/functions/material/getParallaxCorrectNormal.js +16 -1
- package/src/nodes/geometry/RangeNode.js +54 -2
- package/src/nodes/gpgpu/AtomicFunctionNode.js +157 -1
- package/src/nodes/gpgpu/BarrierNode.js +47 -0
- package/src/nodes/gpgpu/ComputeBuiltinNode.js +126 -0
- package/src/nodes/gpgpu/ComputeNode.js +106 -2
- package/src/nodes/gpgpu/WorkgroupInfoNode.js +115 -6
- package/src/nodes/lighting/AONode.js +18 -0
- package/src/nodes/lighting/AmbientLightNode.js +10 -0
- package/src/nodes/lighting/AnalyticLightNode.js +97 -2
- package/src/nodes/lighting/BasicEnvironmentNode.js +19 -0
- package/src/nodes/lighting/BasicLightMapNode.js +17 -0
- package/src/nodes/lighting/DirectionalLightNode.js +10 -0
- package/src/nodes/lighting/EnvironmentNode.js +18 -0
- package/src/nodes/lighting/HemisphereLightNode.js +31 -0
- package/src/nodes/lighting/IESSpotLightNode.js +11 -0
- package/src/nodes/lighting/IrradianceNode.js +17 -0
- package/src/nodes/lighting/LightProbeNode.js +20 -0
- package/src/nodes/lighting/LightUtils.js +12 -0
- package/src/nodes/lighting/LightingContextNode.js +48 -0
- package/src/nodes/lighting/LightingNode.js +15 -6
- package/src/nodes/lighting/LightsNode.js +132 -1
- package/src/nodes/lighting/PointLightNode.js +32 -1
- package/src/nodes/lighting/PointShadowNode.js +54 -1
- package/src/nodes/lighting/RectAreaLightNode.js +44 -6
- package/src/nodes/lighting/ShadowBaseNode.js +93 -0
- package/src/nodes/lighting/ShadowNode.js +240 -34
- package/src/nodes/lighting/SpotLightNode.js +43 -0
- package/src/nodes/math/ConditionalNode.js +70 -3
- package/src/nodes/math/Hash.js +9 -0
- package/src/nodes/math/MathNode.js +614 -11
- package/src/nodes/math/MathUtils.js +45 -1
- package/src/nodes/math/OperatorNode.js +233 -0
- package/src/nodes/math/TriNoise3D.js +18 -7
- package/src/nodes/parsers/GLSLNodeFunction.js +16 -0
- package/src/nodes/parsers/GLSLNodeParser.js +11 -0
- package/src/nodes/pmrem/PMREMNode.js +133 -0
- package/src/nodes/pmrem/PMREMUtils.js +1 -1
- package/src/nodes/procedural/Checker.js +9 -0
- package/src/nodes/tsl/TSLBase.js +2 -2
- package/src/nodes/utils/ArrayElementNode.js +38 -2
- package/src/nodes/utils/ConvertNode.js +31 -0
- package/src/nodes/utils/CubeMapNode.js +78 -0
- package/src/nodes/utils/Discard.js +16 -0
- package/src/nodes/utils/EquirectUVNode.js +31 -1
- package/src/nodes/utils/FlipNode.js +38 -0
- package/src/nodes/utils/FunctionOverloadingNode.js +53 -1
- package/src/nodes/utils/JoinNode.js +25 -0
- package/src/nodes/utils/LoopNode.js +74 -1
- package/src/nodes/utils/MatcapUVNode.js +17 -0
- package/src/nodes/utils/MaxMipLevelNode.js +49 -0
- package/src/nodes/utils/Oscillators.js +33 -0
- package/src/nodes/utils/Packing.js +17 -0
- package/src/nodes/utils/PostProcessingUtils.js +28 -23
- package/src/nodes/utils/RTTNode.js +123 -2
- package/src/nodes/utils/ReflectorNode.js +174 -4
- package/src/nodes/utils/RemapNode.js +79 -0
- package/src/nodes/utils/RotateNode.js +41 -0
- package/src/nodes/utils/SetNode.js +44 -1
- package/src/nodes/utils/SplitNode.js +55 -3
- package/src/nodes/utils/SpriteSheetUVNode.js +46 -0
- package/src/nodes/utils/SpriteUtils.js +17 -0
- package/src/nodes/utils/StorageArrayElementNode.js +40 -0
- package/src/nodes/utils/Timer.js +19 -0
- package/src/nodes/utils/TriplanarTexturesNode.js +84 -0
- package/src/nodes/utils/UVUtils.js +20 -0
- package/src/nodes/utils/ViewportUtils.js +13 -0
- package/src/objects/BatchedMesh.js +1 -2
- package/src/objects/ClippingGroup.js +49 -0
- package/src/renderers/WebGLRenderer.js +23 -4
- package/src/renderers/common/Animation.js +63 -0
- package/src/renderers/common/Attributes.js +36 -0
- package/src/renderers/common/Backend.js +467 -52
- package/src/renderers/common/Background.js +34 -1
- package/src/renderers/common/BindGroup.js +43 -0
- package/src/renderers/common/Binding.js +35 -0
- package/src/renderers/common/Bindings.js +93 -1
- package/src/renderers/common/Buffer.js +49 -0
- package/src/renderers/common/BufferUtils.js +27 -0
- package/src/renderers/common/BundleGroup.js +57 -0
- package/src/renderers/common/ChainMap.js +38 -1
- package/src/renderers/common/ClippingContext.js +107 -14
- package/src/renderers/common/Color4.js +36 -0
- package/src/renderers/common/ComputePipeline.js +24 -0
- package/src/renderers/common/CubeRenderTarget.js +13 -0
- package/src/renderers/common/DataMap.js +37 -1
- package/src/renderers/common/Geometries.js +98 -0
- package/src/renderers/common/IndirectStorageBufferAttribute.js +25 -2
- package/src/renderers/common/Info.js +87 -0
- package/src/renderers/common/Lighting.js +26 -0
- package/src/renderers/common/Pipeline.js +22 -0
- package/src/renderers/common/Pipelines.js +148 -5
- package/src/renderers/common/PostProcessing.js +75 -3
- package/src/renderers/common/ProgrammableStage.js +60 -2
- package/src/renderers/common/QuadMesh.js +54 -5
- package/src/renderers/common/RenderBundle.js +14 -8
- package/src/renderers/common/RenderBundles.js +33 -10
- package/src/renderers/common/RenderContext.js +169 -4
- package/src/renderers/common/RenderContexts.js +42 -2
- package/src/renderers/common/RenderList.js +178 -0
- package/src/renderers/common/RenderLists.js +31 -0
- package/src/renderers/common/RenderObject.js +328 -4
- package/src/renderers/common/RenderObjects.js +101 -7
- package/src/renderers/common/RenderPipeline.js +24 -0
- package/src/renderers/common/Renderer.js +1096 -31
- package/src/renderers/common/RendererUtils.js +193 -0
- package/src/renderers/common/SampledTexture.js +121 -0
- package/src/renderers/common/Sampler.js +30 -0
- package/src/renderers/common/StorageBuffer.js +24 -0
- package/src/renderers/common/StorageBufferAttribute.js +31 -2
- package/src/renderers/common/StorageInstancedBufferAttribute.js +31 -2
- package/src/renderers/common/StorageTexture.js +38 -0
- package/src/renderers/common/Textures.js +83 -0
- package/src/renderers/common/Uniform.js +188 -2
- package/src/renderers/common/UniformBuffer.js +19 -0
- package/src/renderers/common/UniformsGroup.js +139 -2
- package/src/renderers/common/extras/PMREMGenerator.js +24 -3
- package/src/renderers/common/nodes/NodeBuilderState.js +95 -1
- package/src/renderers/common/nodes/NodeLibrary.js +89 -0
- package/src/renderers/common/nodes/NodeSampledTexture.js +91 -2
- package/src/renderers/common/nodes/NodeSampler.js +28 -0
- package/src/renderers/common/nodes/NodeStorageBuffer.js +35 -0
- package/src/renderers/common/nodes/NodeUniform.js +189 -0
- package/src/renderers/common/nodes/NodeUniformBuffer.js +29 -0
- package/src/renderers/common/nodes/NodeUniformsGroup.js +31 -18
- package/src/renderers/common/nodes/Nodes.js +327 -60
- package/src/renderers/shaders/ShaderChunk/lights_physical_pars_fragment.glsl.js +2 -2
- package/src/renderers/shaders/ShaderChunk/transmission_pars_fragment.glsl.js +7 -7
- package/src/renderers/webgl-fallback/WebGLBackend.js +547 -29
- package/src/renderers/webgl-fallback/nodes/GLSLNodeBuilder.js +0 -1
- package/src/renderers/webgl-fallback/utils/WebGLAttributeUtils.js +1 -1
- package/src/renderers/webgl-fallback/utils/WebGLTextureUtils.js +1 -1
- package/src/renderers/webgpu/WebGPUBackend.js +480 -49
- package/src/renderers/webgpu/WebGPURenderer.Nodes.js +34 -0
- package/src/renderers/webgpu/WebGPURenderer.js +35 -0
- package/src/renderers/webgpu/nodes/BasicNodeLibrary.js +20 -8
- package/src/renderers/webgpu/nodes/StandardNodeLibrary.js +21 -8
- package/src/renderers/webgpu/nodes/WGSLNodeBuilder.js +59 -11
- package/src/renderers/webgpu/nodes/WGSLNodeFunction.js +17 -0
- package/src/renderers/webgpu/nodes/WGSLNodeParser.js +11 -0
- package/src/renderers/webgpu/utils/WebGPUAttributeUtils.js +10 -8
- package/src/renderers/webgpu/utils/WebGPUBindingUtils.js +9 -1
- package/src/renderers/webgpu/utils/WebGPUTextureUtils.js +5 -9
- package/src/renderers/webgpu/utils/WebGPUUtils.js +30 -0
- package/src/renderers/webxr/WebXRDepthSensing.js +1 -1
- package/src/renderers/webxr/WebXRManager.js +7 -1
- package/src/textures/Data3DTexture.js +2 -2
- package/src/textures/Texture.js +4 -0
- package/examples/jsm/animation/MMDAnimationHelper.js +0 -1209
- package/examples/jsm/animation/MMDPhysics.js +0 -1408
- package/examples/jsm/exporters/MMDExporter.js +0 -223
- package/examples/jsm/libs/mmdparser.module.js +0 -11530
- package/examples/jsm/loaders/MMDLoader.js +0 -2298
- package/examples/jsm/shaders/MMDToonShader.js +0 -134
- package/src/nodes/core/UniformGroup.js +0 -13
- package/src/nodes/fog/FogExp2Node.js +0 -35
- package/src/nodes/fog/FogNode.js +0 -50
- package/src/nodes/fog/FogRangeNode.js +0 -36
- package/src/renderers/common/PostProcessingUtils.js +0 -86
|
@@ -11,8 +11,13 @@ import { NodeUpdateType } from '../core/constants.js';
|
|
|
11
11
|
const _matrix41 = /*@__PURE__*/ new Matrix4();
|
|
12
12
|
const _matrix42 = /*@__PURE__*/ new Matrix4();
|
|
13
13
|
|
|
14
|
-
let
|
|
14
|
+
let _ltcLib = null;
|
|
15
15
|
|
|
16
|
+
/**
|
|
17
|
+
* Module for representing rect area lights as nodes.
|
|
18
|
+
*
|
|
19
|
+
* @augments AnalyticLightNode
|
|
20
|
+
*/
|
|
16
21
|
class RectAreaLightNode extends AnalyticLightNode {
|
|
17
22
|
|
|
18
23
|
static get type() {
|
|
@@ -21,17 +26,45 @@ class RectAreaLightNode extends AnalyticLightNode {
|
|
|
21
26
|
|
|
22
27
|
}
|
|
23
28
|
|
|
29
|
+
/**
|
|
30
|
+
* Constructs a new rect area light node.
|
|
31
|
+
*
|
|
32
|
+
* @param {RectAreaLight?} [light=null] - The rect area light source.
|
|
33
|
+
*/
|
|
24
34
|
constructor( light = null ) {
|
|
25
35
|
|
|
26
36
|
super( light );
|
|
27
37
|
|
|
38
|
+
/**
|
|
39
|
+
* Uniform node representing the half height of the are light.
|
|
40
|
+
*
|
|
41
|
+
* @type {UniformNode<vec3>}
|
|
42
|
+
*/
|
|
28
43
|
this.halfHeight = uniform( new Vector3() ).setGroup( renderGroup );
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* Uniform node representing the half width of the are light.
|
|
47
|
+
*
|
|
48
|
+
* @type {UniformNode<vec3>}
|
|
49
|
+
*/
|
|
29
50
|
this.halfWidth = uniform( new Vector3() ).setGroup( renderGroup );
|
|
30
51
|
|
|
52
|
+
/**
|
|
53
|
+
* The `updateType` is set to `NodeUpdateType.RENDER` since the light
|
|
54
|
+
* relies on `viewMatrix` which might vary per render call.
|
|
55
|
+
*
|
|
56
|
+
* @type {String}
|
|
57
|
+
* @default 'render'
|
|
58
|
+
*/
|
|
31
59
|
this.updateType = NodeUpdateType.RENDER;
|
|
32
60
|
|
|
33
61
|
}
|
|
34
62
|
|
|
63
|
+
/**
|
|
64
|
+
* Overwritten to updated rect area light specific uniforms.
|
|
65
|
+
*
|
|
66
|
+
* @param {NodeFrame} frame - A reference to the current node frame.
|
|
67
|
+
*/
|
|
35
68
|
update( frame ) {
|
|
36
69
|
|
|
37
70
|
super.update( frame );
|
|
@@ -61,13 +94,13 @@ class RectAreaLightNode extends AnalyticLightNode {
|
|
|
61
94
|
|
|
62
95
|
if ( builder.isAvailable( 'float32Filterable' ) ) {
|
|
63
96
|
|
|
64
|
-
ltc_1 = texture(
|
|
65
|
-
ltc_2 = texture(
|
|
97
|
+
ltc_1 = texture( _ltcLib.LTC_FLOAT_1 );
|
|
98
|
+
ltc_2 = texture( _ltcLib.LTC_FLOAT_2 );
|
|
66
99
|
|
|
67
100
|
} else {
|
|
68
101
|
|
|
69
|
-
ltc_1 = texture(
|
|
70
|
-
ltc_2 = texture(
|
|
102
|
+
ltc_1 = texture( _ltcLib.LTC_HALF_1 );
|
|
103
|
+
ltc_2 = texture( _ltcLib.LTC_HALF_2 );
|
|
71
104
|
|
|
72
105
|
}
|
|
73
106
|
|
|
@@ -89,9 +122,14 @@ class RectAreaLightNode extends AnalyticLightNode {
|
|
|
89
122
|
|
|
90
123
|
}
|
|
91
124
|
|
|
125
|
+
/**
|
|
126
|
+
* Used to configure the internal BRDF approximation texture data.
|
|
127
|
+
*
|
|
128
|
+
* @param {RectAreaLightTexturesLib} ltc - The BRDF approximation texture data.
|
|
129
|
+
*/
|
|
92
130
|
static setLTC( ltc ) {
|
|
93
131
|
|
|
94
|
-
|
|
132
|
+
_ltcLib = ltc;
|
|
95
133
|
|
|
96
134
|
}
|
|
97
135
|
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import Node from '../core/Node.js';
|
|
2
|
+
import { NodeUpdateType } from '../core/constants.js';
|
|
3
|
+
import { vec3 } from '../tsl/TSLBase.js';
|
|
4
|
+
import { positionWorld } from '../accessors/Position.js';
|
|
5
|
+
|
|
6
|
+
/** @module ShadowBaseNode **/
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Base class for all shadow nodes.
|
|
10
|
+
*
|
|
11
|
+
* Shadow nodes encapsulate shadow related logic and are always coupled to lighting nodes.
|
|
12
|
+
* Lighting nodes might share the same shadow node type or use specific ones depending on
|
|
13
|
+
* their requirements.
|
|
14
|
+
*
|
|
15
|
+
* @augments Node
|
|
16
|
+
*/
|
|
17
|
+
class ShadowBaseNode extends Node {
|
|
18
|
+
|
|
19
|
+
static get type() {
|
|
20
|
+
|
|
21
|
+
return 'ShadowBaseNode';
|
|
22
|
+
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Constructs a new shadow base node.
|
|
27
|
+
*
|
|
28
|
+
* @param {Light} light - The shadow casting light.
|
|
29
|
+
*/
|
|
30
|
+
constructor( light ) {
|
|
31
|
+
|
|
32
|
+
super();
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* The shadow casting light.
|
|
36
|
+
*
|
|
37
|
+
* @type {Light}
|
|
38
|
+
*/
|
|
39
|
+
this.light = light;
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* Overwritten since shadows are updated by default per render.
|
|
43
|
+
*
|
|
44
|
+
* @type {String}
|
|
45
|
+
* @default 'render'
|
|
46
|
+
*/
|
|
47
|
+
this.updateBeforeType = NodeUpdateType.RENDER;
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* This flag can be used for type testing.
|
|
51
|
+
*
|
|
52
|
+
* @type {Boolean}
|
|
53
|
+
* @readonly
|
|
54
|
+
* @default true
|
|
55
|
+
*/
|
|
56
|
+
this.isShadowBaseNode = true;
|
|
57
|
+
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* Setups the shadow position node which is by default the predefined TSL node object `shadowPositionWorld`.
|
|
62
|
+
*
|
|
63
|
+
* @param {(NodeBuilder|{Material})} object - A configuration object that must at least hold a material reference.
|
|
64
|
+
*/
|
|
65
|
+
setupShadowPosition( { material } ) {
|
|
66
|
+
|
|
67
|
+
// Use assign inside an Fn()
|
|
68
|
+
|
|
69
|
+
shadowPositionWorld.assign( material.shadowPositionNode || positionWorld );
|
|
70
|
+
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
* Can be called when the shadow isn't required anymore. That can happen when
|
|
75
|
+
* a lighting node stops casting shadows by setting {@link Object3D#castShadow}
|
|
76
|
+
* to `false`.
|
|
77
|
+
*/
|
|
78
|
+
dispose() {
|
|
79
|
+
|
|
80
|
+
this.updateBeforeType = NodeUpdateType.NONE;
|
|
81
|
+
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/**
|
|
87
|
+
* TSL object that represents the vertex position in world space during the shadow pass.
|
|
88
|
+
*
|
|
89
|
+
* @type {Node<vec3>}
|
|
90
|
+
*/
|
|
91
|
+
export const shadowPositionWorld = /*@__PURE__*/ vec3().toVar( 'shadowPositionWorld' );
|
|
92
|
+
|
|
93
|
+
export default ShadowBaseNode;
|
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
import
|
|
2
|
-
import { NodeUpdateType } from '../core/constants.js';
|
|
1
|
+
import ShadowBaseNode, { shadowPositionWorld } from './ShadowBaseNode.js';
|
|
3
2
|
import { float, vec2, vec3, vec4, If, int, Fn, nodeObject } from '../tsl/TSLBase.js';
|
|
4
3
|
import { reference } from '../accessors/ReferenceNode.js';
|
|
5
4
|
import { texture } from '../accessors/TextureNode.js';
|
|
@@ -12,15 +11,17 @@ import NodeMaterial from '../../materials/nodes/NodeMaterial.js';
|
|
|
12
11
|
import QuadMesh from '../../renderers/common/QuadMesh.js';
|
|
13
12
|
import { Loop } from '../utils/LoopNode.js';
|
|
14
13
|
import { screenCoordinate } from '../display/ScreenNode.js';
|
|
15
|
-
import { HalfFloatType, LessCompare,
|
|
14
|
+
import { HalfFloatType, LessCompare, RGFormat, VSMShadowMap, WebGPUCoordinateSystem } from '../../constants.js';
|
|
16
15
|
import { renderGroup } from '../core/UniformGroupNode.js';
|
|
17
16
|
import { viewZToLogarithmicDepth } from '../display/ViewportDepthNode.js';
|
|
18
17
|
import { objectPosition } from '../accessors/Object3DNode.js';
|
|
19
18
|
import { lightShadowMatrix } from '../accessors/Lights.js';
|
|
19
|
+
import { resetRendererAndSceneState, restoreRendererAndSceneState } from '../../renderers/common/RendererUtils.js';
|
|
20
|
+
import { getDataFromObject } from '../core/NodeUtils.js';
|
|
20
21
|
|
|
21
|
-
|
|
22
|
-
const shadowWorldPosition = /*@__PURE__*/ vec3().toVar( 'shadowWorldPosition' );
|
|
22
|
+
/** @module ShadowNode **/
|
|
23
23
|
|
|
24
|
+
const shadowMaterialLib = /*@__PURE__*/ new WeakMap();
|
|
24
25
|
const linearDistance = /*@__PURE__*/ Fn( ( [ position, cameraNear, cameraFar ] ) => {
|
|
25
26
|
|
|
26
27
|
let dist = positionWorld.sub( position ).length();
|
|
@@ -56,8 +57,8 @@ const getShadowMaterial = ( light ) => {
|
|
|
56
57
|
material.colorNode = vec4( 0, 0, 0, 1 );
|
|
57
58
|
material.depthNode = depthNode;
|
|
58
59
|
material.isShadowNodeMaterial = true; // Use to avoid other overrideMaterial override material.colorNode unintentionally when using material.shadowNode
|
|
59
|
-
material.blending = NoBlending;
|
|
60
60
|
material.name = 'ShadowMaterial';
|
|
61
|
+
material.fog = false;
|
|
61
62
|
|
|
62
63
|
shadowMaterialLib.set( light, material );
|
|
63
64
|
|
|
@@ -67,12 +68,32 @@ const getShadowMaterial = ( light ) => {
|
|
|
67
68
|
|
|
68
69
|
};
|
|
69
70
|
|
|
71
|
+
/**
|
|
72
|
+
* A shadow filtering function performing basic filtering. This is in fact an unfiltered version of the shadow map
|
|
73
|
+
* with a binary `[0,1]` result.
|
|
74
|
+
*
|
|
75
|
+
* @method
|
|
76
|
+
* @param {Object} inputs - The input parameter object.
|
|
77
|
+
* @param {DepthTexture} inputs.depthTexture - A reference to the shadow map's texture data.
|
|
78
|
+
* @param {Node<vec3>} inputs.shadowCoord - The shadow coordinates.
|
|
79
|
+
* @return {Node<float>} The filtering result.
|
|
80
|
+
*/
|
|
70
81
|
export const BasicShadowFilter = /*@__PURE__*/ Fn( ( { depthTexture, shadowCoord } ) => {
|
|
71
82
|
|
|
72
83
|
return texture( depthTexture, shadowCoord.xy ).compare( shadowCoord.z );
|
|
73
84
|
|
|
74
85
|
} );
|
|
75
86
|
|
|
87
|
+
/**
|
|
88
|
+
* A shadow filtering function performing PCF filtering.
|
|
89
|
+
*
|
|
90
|
+
* @method
|
|
91
|
+
* @param {Object} inputs - The input parameter object.
|
|
92
|
+
* @param {DepthTexture} inputs.depthTexture - A reference to the shadow map's texture data.
|
|
93
|
+
* @param {Node<vec3>} inputs.shadowCoord - The shadow coordinates.
|
|
94
|
+
* @param {LightShadow} inputs.shadow - The light shadow.
|
|
95
|
+
* @return {Node<float>} The filtering result.
|
|
96
|
+
*/
|
|
76
97
|
export const PCFShadowFilter = /*@__PURE__*/ Fn( ( { depthTexture, shadowCoord, shadow } ) => {
|
|
77
98
|
|
|
78
99
|
const depthCompare = ( uv, compare ) => texture( depthTexture, uv ).compare( compare );
|
|
@@ -112,6 +133,16 @@ export const PCFShadowFilter = /*@__PURE__*/ Fn( ( { depthTexture, shadowCoord,
|
|
|
112
133
|
|
|
113
134
|
} );
|
|
114
135
|
|
|
136
|
+
/**
|
|
137
|
+
* A shadow filtering function performing PCF soft filtering.
|
|
138
|
+
*
|
|
139
|
+
* @method
|
|
140
|
+
* @param {Object} inputs - The input parameter object.
|
|
141
|
+
* @param {DepthTexture} inputs.depthTexture - A reference to the shadow map's texture data.
|
|
142
|
+
* @param {Node<vec3>} inputs.shadowCoord - The shadow coordinates.
|
|
143
|
+
* @param {LightShadow} inputs.shadow - The light shadow.
|
|
144
|
+
* @return {Node<float>} The filtering result.
|
|
145
|
+
*/
|
|
115
146
|
export const PCFSoftShadowFilter = /*@__PURE__*/ Fn( ( { depthTexture, shadowCoord, shadow } ) => {
|
|
116
147
|
|
|
117
148
|
const depthCompare = ( uv, compare ) => texture( depthTexture, uv ).compare( compare );
|
|
@@ -168,13 +199,20 @@ export const PCFSoftShadowFilter = /*@__PURE__*/ Fn( ( { depthTexture, shadowCoo
|
|
|
168
199
|
|
|
169
200
|
} );
|
|
170
201
|
|
|
171
|
-
|
|
172
|
-
|
|
202
|
+
/**
|
|
203
|
+
* A shadow filtering function performing VSM filtering.
|
|
204
|
+
*
|
|
205
|
+
* @method
|
|
206
|
+
* @param {Object} inputs - The input parameter object.
|
|
207
|
+
* @param {DepthTexture} inputs.depthTexture - A reference to the shadow map's texture data.
|
|
208
|
+
* @param {Node<vec3>} inputs.shadowCoord - The shadow coordinates.
|
|
209
|
+
* @return {Node<float>} The filtering result.
|
|
210
|
+
*/
|
|
173
211
|
export const VSMShadowFilter = /*@__PURE__*/ Fn( ( { depthTexture, shadowCoord } ) => {
|
|
174
212
|
|
|
175
213
|
const occlusion = float( 1 ).toVar();
|
|
176
214
|
|
|
177
|
-
const distribution = texture( depthTexture ).
|
|
215
|
+
const distribution = texture( depthTexture ).sample( shadowCoord.xy ).rg;
|
|
178
216
|
|
|
179
217
|
const hardShadow = step( shadowCoord.z, distribution.x );
|
|
180
218
|
|
|
@@ -192,6 +230,17 @@ export const VSMShadowFilter = /*@__PURE__*/ Fn( ( { depthTexture, shadowCoord }
|
|
|
192
230
|
|
|
193
231
|
} );
|
|
194
232
|
|
|
233
|
+
/**
|
|
234
|
+
* Represents the shader code for the first VSM render pass.
|
|
235
|
+
*
|
|
236
|
+
* @method
|
|
237
|
+
* @param {Object} inputs - The input parameter object.
|
|
238
|
+
* @param {Node<float>} inputs.samples - The number of samples
|
|
239
|
+
* @param {Node<float>} inputs.radius - The radius.
|
|
240
|
+
* @param {Node<float>} inputs.size - The size.
|
|
241
|
+
* @param {TextureNode} inputs.shadowPass - A reference to the render target's depth data.
|
|
242
|
+
* @return {Node<vec2>} The VSM output.
|
|
243
|
+
*/
|
|
195
244
|
const VSMPassVertical = /*@__PURE__*/ Fn( ( { samples, radius, size, shadowPass } ) => {
|
|
196
245
|
|
|
197
246
|
const mean = float( 0 ).toVar();
|
|
@@ -204,7 +253,7 @@ const VSMPassVertical = /*@__PURE__*/ Fn( ( { samples, radius, size, shadowPass
|
|
|
204
253
|
|
|
205
254
|
const uvOffset = uvStart.add( float( i ).mul( uvStride ) );
|
|
206
255
|
|
|
207
|
-
const depth = shadowPass.
|
|
256
|
+
const depth = shadowPass.sample( add( screenCoordinate.xy, vec2( 0, uvOffset ).mul( radius ) ).div( size ) ).x;
|
|
208
257
|
mean.addAssign( depth );
|
|
209
258
|
squaredMean.addAssign( depth.mul( depth ) );
|
|
210
259
|
|
|
@@ -218,6 +267,17 @@ const VSMPassVertical = /*@__PURE__*/ Fn( ( { samples, radius, size, shadowPass
|
|
|
218
267
|
|
|
219
268
|
} );
|
|
220
269
|
|
|
270
|
+
/**
|
|
271
|
+
* Represents the shader code for the second VSM render pass.
|
|
272
|
+
*
|
|
273
|
+
* @method
|
|
274
|
+
* @param {Object} inputs - The input parameter object.
|
|
275
|
+
* @param {Node<float>} inputs.samples - The number of samples
|
|
276
|
+
* @param {Node<float>} inputs.radius - The radius.
|
|
277
|
+
* @param {Node<float>} inputs.size - The size.
|
|
278
|
+
* @param {TextureNode} inputs.shadowPass - The result of the first VSM render pass.
|
|
279
|
+
* @return {Node<vec2>} The VSM output.
|
|
280
|
+
*/
|
|
221
281
|
const VSMPassHorizontal = /*@__PURE__*/ Fn( ( { samples, radius, size, shadowPass } ) => {
|
|
222
282
|
|
|
223
283
|
const mean = float( 0 ).toVar();
|
|
@@ -230,7 +290,7 @@ const VSMPassHorizontal = /*@__PURE__*/ Fn( ( { samples, radius, size, shadowPas
|
|
|
230
290
|
|
|
231
291
|
const uvOffset = uvStart.add( float( i ).mul( uvStride ) );
|
|
232
292
|
|
|
233
|
-
const distribution = shadowPass.
|
|
293
|
+
const distribution = shadowPass.sample( add( screenCoordinate.xy, vec2( uvOffset, 0 ).mul( radius ) ).div( size ) );
|
|
234
294
|
mean.addAssign( distribution.x );
|
|
235
295
|
squaredMean.addAssign( add( distribution.y.mul( distribution.y ), distribution.x.mul( distribution.x ) ) );
|
|
236
296
|
|
|
@@ -248,9 +308,15 @@ const _shadowFilterLib = [ BasicShadowFilter, PCFShadowFilter, PCFSoftShadowFilt
|
|
|
248
308
|
|
|
249
309
|
//
|
|
250
310
|
|
|
311
|
+
let _rendererState;
|
|
251
312
|
const _quadMesh = /*@__PURE__*/ new QuadMesh();
|
|
252
313
|
|
|
253
|
-
|
|
314
|
+
/**
|
|
315
|
+
* Represents the default shadow implementation for lighting nodes.
|
|
316
|
+
*
|
|
317
|
+
* @augments module:ShadowBaseNode~ShadowBaseNode
|
|
318
|
+
*/
|
|
319
|
+
class ShadowNode extends ShadowBaseNode {
|
|
254
320
|
|
|
255
321
|
static get type() {
|
|
256
322
|
|
|
@@ -258,28 +324,101 @@ class ShadowNode extends Node {
|
|
|
258
324
|
|
|
259
325
|
}
|
|
260
326
|
|
|
327
|
+
/**
|
|
328
|
+
* Constructs a new shadow node.
|
|
329
|
+
*
|
|
330
|
+
* @param {Light} light - The shadow casting light.
|
|
331
|
+
* @param {LightShadow?} [shadow=null] - An optional light shadow.
|
|
332
|
+
*/
|
|
261
333
|
constructor( light, shadow = null ) {
|
|
262
334
|
|
|
263
|
-
super();
|
|
335
|
+
super( light );
|
|
264
336
|
|
|
265
|
-
|
|
337
|
+
/**
|
|
338
|
+
* The light shadow which defines the properties light's
|
|
339
|
+
* shadow.
|
|
340
|
+
*
|
|
341
|
+
* @type {LightShadow?}
|
|
342
|
+
* @default null
|
|
343
|
+
*/
|
|
266
344
|
this.shadow = shadow || light.shadow;
|
|
267
345
|
|
|
346
|
+
/**
|
|
347
|
+
* A reference to the shadow map which is a render target.
|
|
348
|
+
*
|
|
349
|
+
* @type {RenderTarget?}
|
|
350
|
+
* @default null
|
|
351
|
+
*/
|
|
268
352
|
this.shadowMap = null;
|
|
269
353
|
|
|
354
|
+
/**
|
|
355
|
+
* Only relevant for VSM shadows. Render target for the
|
|
356
|
+
* first VSM render pass.
|
|
357
|
+
*
|
|
358
|
+
* @type {RenderTarget?}
|
|
359
|
+
* @default null
|
|
360
|
+
*/
|
|
270
361
|
this.vsmShadowMapVertical = null;
|
|
362
|
+
|
|
363
|
+
/**
|
|
364
|
+
* Only relevant for VSM shadows. Render target for the
|
|
365
|
+
* second VSM render pass.
|
|
366
|
+
*
|
|
367
|
+
* @type {RenderTarget?}
|
|
368
|
+
* @default null
|
|
369
|
+
*/
|
|
271
370
|
this.vsmShadowMapHorizontal = null;
|
|
272
371
|
|
|
372
|
+
/**
|
|
373
|
+
* Only relevant for VSM shadows. Node material which
|
|
374
|
+
* is used to render the first VSM pass.
|
|
375
|
+
*
|
|
376
|
+
* @type {NodeMaterial?}
|
|
377
|
+
* @default null
|
|
378
|
+
*/
|
|
273
379
|
this.vsmMaterialVertical = null;
|
|
380
|
+
|
|
381
|
+
/**
|
|
382
|
+
* Only relevant for VSM shadows. Node material which
|
|
383
|
+
* is used to render the second VSM pass.
|
|
384
|
+
*
|
|
385
|
+
* @type {NodeMaterial?}
|
|
386
|
+
* @default null
|
|
387
|
+
*/
|
|
274
388
|
this.vsmMaterialHorizontal = null;
|
|
275
389
|
|
|
276
|
-
|
|
390
|
+
/**
|
|
391
|
+
* A reference to the output node which defines the
|
|
392
|
+
* final result of this shadow node.
|
|
393
|
+
*
|
|
394
|
+
* @type {Node?}
|
|
395
|
+
* @private
|
|
396
|
+
* @default null
|
|
397
|
+
*/
|
|
277
398
|
this._node = null;
|
|
278
399
|
|
|
400
|
+
/**
|
|
401
|
+
* This flag can be used for type testing.
|
|
402
|
+
*
|
|
403
|
+
* @type {Boolean}
|
|
404
|
+
* @readonly
|
|
405
|
+
* @default true
|
|
406
|
+
*/
|
|
279
407
|
this.isShadowNode = true;
|
|
280
408
|
|
|
281
409
|
}
|
|
282
410
|
|
|
411
|
+
/**
|
|
412
|
+
* Setups the shadow filtering.
|
|
413
|
+
*
|
|
414
|
+
* @param {NodeBuilder} builder - A reference to the current node builder.
|
|
415
|
+
* @param {Object} inputs - A configuration object that defines the shadow filtering.
|
|
416
|
+
* @param {Function} inputs.filterFn - This function defines the filtering type of the shadow map e.g. PCF.
|
|
417
|
+
* @param {DepthTexture} inputs.depthTexture - A reference to the shadow map's texture data.
|
|
418
|
+
* @param {Node<vec3>} inputs.shadowCoord - Shadow coordinates which are used to sample from the shadow map.
|
|
419
|
+
* @param {LightShadow} inputs.shadow - The light shadow.
|
|
420
|
+
* @return {Node<float>} The result node of the shadow filtering.
|
|
421
|
+
*/
|
|
283
422
|
setupShadowFilter( builder, { filterFn, depthTexture, shadowCoord, shadow } ) {
|
|
284
423
|
|
|
285
424
|
const frustumTest = shadowCoord.x.greaterThanEqual( 0 )
|
|
@@ -294,6 +433,13 @@ class ShadowNode extends Node {
|
|
|
294
433
|
|
|
295
434
|
}
|
|
296
435
|
|
|
436
|
+
/**
|
|
437
|
+
* Setups the shadow coordinates.
|
|
438
|
+
*
|
|
439
|
+
* @param {NodeBuilder} builder - A reference to the current node builder.
|
|
440
|
+
* @param {Node<vec3>} shadowPosition - A node representing the shadow position.
|
|
441
|
+
* @return {Node<vec3>} The shadow coordinates.
|
|
442
|
+
*/
|
|
297
443
|
setupShadowCoord( builder, shadowPosition ) {
|
|
298
444
|
|
|
299
445
|
const { shadow } = this;
|
|
@@ -341,12 +487,24 @@ class ShadowNode extends Node {
|
|
|
341
487
|
|
|
342
488
|
}
|
|
343
489
|
|
|
490
|
+
/**
|
|
491
|
+
* Returns the shadow filtering function for the given shadow type.
|
|
492
|
+
*
|
|
493
|
+
* @param {Number} type - The shadow type.
|
|
494
|
+
* @return {Function} The filtering function.
|
|
495
|
+
*/
|
|
344
496
|
getShadowFilterFn( type ) {
|
|
345
497
|
|
|
346
498
|
return _shadowFilterLib[ type ];
|
|
347
499
|
|
|
348
500
|
}
|
|
349
501
|
|
|
502
|
+
/**
|
|
503
|
+
* Setups the shadow output node.
|
|
504
|
+
*
|
|
505
|
+
* @param {NodeBuilder} builder - A reference to the current node builder.
|
|
506
|
+
* @return {Node<vec3>} The shadow output node.
|
|
507
|
+
*/
|
|
350
508
|
setupShadow( builder ) {
|
|
351
509
|
|
|
352
510
|
const { renderer } = builder;
|
|
@@ -394,7 +552,7 @@ class ShadowNode extends Node {
|
|
|
394
552
|
const shadowIntensity = reference( 'intensity', 'float', shadow ).setGroup( renderGroup );
|
|
395
553
|
const normalBias = reference( 'normalBias', 'float', shadow ).setGroup( renderGroup );
|
|
396
554
|
|
|
397
|
-
const shadowPosition = lightShadowMatrix( light ).mul(
|
|
555
|
+
const shadowPosition = lightShadowMatrix( light ).mul( shadowPositionWorld.add( transformedNormalWorld.mul( normalBias ) ) );
|
|
398
556
|
const shadowCoord = this.setupShadowCoord( builder, shadowPosition );
|
|
399
557
|
|
|
400
558
|
//
|
|
@@ -421,16 +579,23 @@ class ShadowNode extends Node {
|
|
|
421
579
|
|
|
422
580
|
}
|
|
423
581
|
|
|
582
|
+
/**
|
|
583
|
+
* The implementation performs the setup of the output node. An output is only
|
|
584
|
+
* produces if shadow mapping is globally enabled in the renderer.
|
|
585
|
+
*
|
|
586
|
+
* @param {NodeBuilder} builder - A reference to the current node builder.
|
|
587
|
+
* @return {ShaderCallNodeInternal} The output node.
|
|
588
|
+
*/
|
|
424
589
|
setup( builder ) {
|
|
425
590
|
|
|
426
591
|
if ( builder.renderer.shadowMap.enabled === false ) return;
|
|
427
592
|
|
|
428
|
-
return Fn( (
|
|
429
|
-
|
|
430
|
-
shadowWorldPosition.assign( material.shadowPositionNode || positionWorld );
|
|
593
|
+
return Fn( () => {
|
|
431
594
|
|
|
432
595
|
let node = this._node;
|
|
433
596
|
|
|
597
|
+
this.setupShadowPosition( builder );
|
|
598
|
+
|
|
434
599
|
if ( node === null ) {
|
|
435
600
|
|
|
436
601
|
this._node = node = this.setupShadow( builder );
|
|
@@ -455,17 +620,32 @@ class ShadowNode extends Node {
|
|
|
455
620
|
|
|
456
621
|
}
|
|
457
622
|
|
|
623
|
+
/**
|
|
624
|
+
* Renders the shadow. The logic of this function could be included
|
|
625
|
+
* into {@link ShadowNode#updateShadow} however more specialized shadow
|
|
626
|
+
* nodes might require a custom shadow map rendering. By having a
|
|
627
|
+
* dedicated method, it's easier to overwrite the default behavior.
|
|
628
|
+
*
|
|
629
|
+
* @param {NodeFrame} frame - A reference to the current node frame.
|
|
630
|
+
*/
|
|
458
631
|
renderShadow( frame ) {
|
|
459
632
|
|
|
460
|
-
const { shadow, shadowMap } = this;
|
|
633
|
+
const { shadow, shadowMap, light } = this;
|
|
461
634
|
const { renderer, scene } = frame;
|
|
462
635
|
|
|
636
|
+
shadow.updateMatrices( light );
|
|
637
|
+
|
|
463
638
|
shadowMap.setSize( shadow.mapSize.width, shadow.mapSize.height );
|
|
464
639
|
|
|
465
640
|
renderer.render( scene, shadow.camera );
|
|
466
641
|
|
|
467
642
|
}
|
|
468
643
|
|
|
644
|
+
/**
|
|
645
|
+
* Updates the shadow.
|
|
646
|
+
*
|
|
647
|
+
* @param {NodeFrame} frame - A reference to the current node frame.
|
|
648
|
+
*/
|
|
469
649
|
updateShadow( frame ) {
|
|
470
650
|
|
|
471
651
|
const { shadowMap, light, shadow } = this;
|
|
@@ -476,23 +656,32 @@ class ShadowNode extends Node {
|
|
|
476
656
|
const depthVersion = shadowMap.depthTexture.version;
|
|
477
657
|
this._depthVersionCached = depthVersion;
|
|
478
658
|
|
|
479
|
-
const currentOverrideMaterial = scene.overrideMaterial;
|
|
480
|
-
|
|
481
|
-
scene.overrideMaterial = getShadowMaterial( light );
|
|
482
|
-
|
|
483
659
|
shadow.camera.layers.mask = camera.layers.mask;
|
|
484
660
|
|
|
485
|
-
const currentRenderTarget = renderer.getRenderTarget();
|
|
486
661
|
const currentRenderObjectFunction = renderer.getRenderObjectFunction();
|
|
662
|
+
|
|
487
663
|
const currentMRT = renderer.getMRT();
|
|
664
|
+
const useVelocity = currentMRT ? currentMRT.has( 'velocity' ) : false;
|
|
665
|
+
|
|
666
|
+
_rendererState = resetRendererAndSceneState( renderer, scene, _rendererState );
|
|
488
667
|
|
|
489
|
-
|
|
668
|
+
scene.overrideMaterial = getShadowMaterial( light );
|
|
490
669
|
|
|
491
|
-
renderer.setRenderObjectFunction( ( object, ...params ) => {
|
|
670
|
+
renderer.setRenderObjectFunction( ( object, scene, _camera, geometry, material, group, ...params ) => {
|
|
492
671
|
|
|
493
672
|
if ( object.castShadow === true || ( object.receiveShadow && shadowType === VSMShadowMap ) ) {
|
|
494
673
|
|
|
495
|
-
|
|
674
|
+
if ( useVelocity ) {
|
|
675
|
+
|
|
676
|
+
getDataFromObject( object ).useVelocity = true;
|
|
677
|
+
|
|
678
|
+
}
|
|
679
|
+
|
|
680
|
+
object.onBeforeShadow( renderer, object, camera, shadow.camera, geometry, scene.overrideMaterial, group );
|
|
681
|
+
|
|
682
|
+
renderer.renderObject( object, scene, _camera, geometry, material, group, ...params );
|
|
683
|
+
|
|
684
|
+
object.onAfterShadow( renderer, object, camera, shadow.camera, geometry, scene.overrideMaterial, group );
|
|
496
685
|
|
|
497
686
|
}
|
|
498
687
|
|
|
@@ -512,14 +701,15 @@ class ShadowNode extends Node {
|
|
|
512
701
|
|
|
513
702
|
}
|
|
514
703
|
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
renderer.setMRT( currentMRT );
|
|
518
|
-
|
|
519
|
-
scene.overrideMaterial = currentOverrideMaterial;
|
|
704
|
+
restoreRendererAndSceneState( renderer, scene, _rendererState );
|
|
520
705
|
|
|
521
706
|
}
|
|
522
707
|
|
|
708
|
+
/**
|
|
709
|
+
* For VSM additional render passes are required.
|
|
710
|
+
*
|
|
711
|
+
* @param {Renderer} renderer - A reference to the current renderer.
|
|
712
|
+
*/
|
|
523
713
|
vsmPass( renderer ) {
|
|
524
714
|
|
|
525
715
|
const { shadow } = this;
|
|
@@ -537,6 +727,9 @@ class ShadowNode extends Node {
|
|
|
537
727
|
|
|
538
728
|
}
|
|
539
729
|
|
|
730
|
+
/**
|
|
731
|
+
* Frees the internal resources of this shadow node.
|
|
732
|
+
*/
|
|
540
733
|
dispose() {
|
|
541
734
|
|
|
542
735
|
this.shadowMap.dispose();
|
|
@@ -562,10 +755,15 @@ class ShadowNode extends Node {
|
|
|
562
755
|
|
|
563
756
|
}
|
|
564
757
|
|
|
565
|
-
|
|
758
|
+
super.dispose();
|
|
566
759
|
|
|
567
760
|
}
|
|
568
761
|
|
|
762
|
+
/**
|
|
763
|
+
* The implementation performs the update of the shadow map if necessary.
|
|
764
|
+
*
|
|
765
|
+
* @param {NodeFrame} frame - A reference to the current node frame.
|
|
766
|
+
*/
|
|
569
767
|
updateBefore( frame ) {
|
|
570
768
|
|
|
571
769
|
const { shadow } = this;
|
|
@@ -590,4 +788,12 @@ class ShadowNode extends Node {
|
|
|
590
788
|
|
|
591
789
|
export default ShadowNode;
|
|
592
790
|
|
|
791
|
+
/**
|
|
792
|
+
* TSL function for creating an instance of `ShadowNode`.
|
|
793
|
+
*
|
|
794
|
+
* @function
|
|
795
|
+
* @param {Light} light - The shadow casting light.
|
|
796
|
+
* @param {LightShadow} shadow - The light shadow.
|
|
797
|
+
* @return {ShadowNode} The created shadow node.
|
|
798
|
+
*/
|
|
593
799
|
export const shadow = ( light, shadow ) => nodeObject( new ShadowNode( light, shadow ) );
|