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
|
@@ -96,6 +96,53 @@ class AnalyticLightNode extends LightingNode {
|
|
|
96
96
|
*/
|
|
97
97
|
this.updateType = NodeUpdateType.FRAME;
|
|
98
98
|
|
|
99
|
+
if ( light && light.shadow ) {
|
|
100
|
+
|
|
101
|
+
this._shadowDisposeListener = () => {
|
|
102
|
+
|
|
103
|
+
this.disposeShadow();
|
|
104
|
+
|
|
105
|
+
};
|
|
106
|
+
|
|
107
|
+
light.addEventListener( 'dispose', this._shadowDisposeListener );
|
|
108
|
+
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
dispose() {
|
|
114
|
+
|
|
115
|
+
if ( this._shadowDisposeListener ) {
|
|
116
|
+
|
|
117
|
+
this.light.removeEventListener( 'dispose', this._shadowDisposeListener );
|
|
118
|
+
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
super.dispose();
|
|
122
|
+
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
/**
|
|
126
|
+
* Frees internal resources related to shadows.
|
|
127
|
+
*/
|
|
128
|
+
disposeShadow() {
|
|
129
|
+
|
|
130
|
+
if ( this.shadowNode !== null ) {
|
|
131
|
+
|
|
132
|
+
this.shadowNode.dispose();
|
|
133
|
+
this.shadowNode = null;
|
|
134
|
+
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
this.shadowColorNode = null;
|
|
138
|
+
|
|
139
|
+
if ( this.baseColorNode !== null ) {
|
|
140
|
+
|
|
141
|
+
this.colorNode = this.baseColorNode;
|
|
142
|
+
this.baseColorNode = null;
|
|
143
|
+
|
|
144
|
+
}
|
|
145
|
+
|
|
99
146
|
}
|
|
100
147
|
|
|
101
148
|
getHash() {
|
|
@@ -188,6 +235,12 @@ class AnalyticLightNode extends LightingNode {
|
|
|
188
235
|
|
|
189
236
|
//
|
|
190
237
|
|
|
238
|
+
if ( builder.context.getShadow ) {
|
|
239
|
+
|
|
240
|
+
shadowColorNode = builder.context.getShadow( this, builder );
|
|
241
|
+
|
|
242
|
+
}
|
|
243
|
+
|
|
191
244
|
this.colorNode = shadowColorNode;
|
|
192
245
|
|
|
193
246
|
}
|
|
@@ -9,7 +9,7 @@ import { bentNormalView } from '../accessors/AccessorsUtils.js';
|
|
|
9
9
|
import { pmremTexture } from '../pmrem/PMREMNode.js';
|
|
10
10
|
import { materialEnvIntensity } from '../accessors/MaterialProperties.js';
|
|
11
11
|
|
|
12
|
-
const
|
|
12
|
+
const _rendererCache = new WeakMap();
|
|
13
13
|
|
|
14
14
|
/**
|
|
15
15
|
* Represents a physical model for Image-based lighting (IBL). The environment
|
|
@@ -55,13 +55,15 @@ class EnvironmentNode extends LightingNode {
|
|
|
55
55
|
|
|
56
56
|
const value = ( envNode.isTextureNode ) ? envNode.value : material[ envNode.property ];
|
|
57
57
|
|
|
58
|
-
|
|
58
|
+
const cache = this._getPMREMNodeCache( builder.renderer );
|
|
59
|
+
|
|
60
|
+
let cacheEnvNode = cache.get( value );
|
|
59
61
|
|
|
60
62
|
if ( cacheEnvNode === undefined ) {
|
|
61
63
|
|
|
62
64
|
cacheEnvNode = pmremTexture( value );
|
|
63
65
|
|
|
64
|
-
|
|
66
|
+
cache.set( value, cacheEnvNode );
|
|
65
67
|
|
|
66
68
|
}
|
|
67
69
|
|
|
@@ -101,6 +103,29 @@ class EnvironmentNode extends LightingNode {
|
|
|
101
103
|
|
|
102
104
|
}
|
|
103
105
|
|
|
106
|
+
/**
|
|
107
|
+
* Returns the PMREM node cache of the current renderer.
|
|
108
|
+
*
|
|
109
|
+
* @private
|
|
110
|
+
* @param {Renderer} renderer - The current renderer.
|
|
111
|
+
* @return {WeakMap} The node cache.
|
|
112
|
+
*/
|
|
113
|
+
_getPMREMNodeCache( renderer ) {
|
|
114
|
+
|
|
115
|
+
let pmremCache = _rendererCache.get( renderer );
|
|
116
|
+
|
|
117
|
+
if ( pmremCache === undefined ) {
|
|
118
|
+
|
|
119
|
+
pmremCache = new WeakMap();
|
|
120
|
+
|
|
121
|
+
_rendererCache.set( renderer, pmremCache );
|
|
122
|
+
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
return pmremCache;
|
|
126
|
+
|
|
127
|
+
}
|
|
128
|
+
|
|
104
129
|
}
|
|
105
130
|
|
|
106
131
|
export default EnvironmentNode;
|
|
@@ -213,14 +213,12 @@ class LightsNode extends Node {
|
|
|
213
213
|
|
|
214
214
|
if ( previousLightNodes !== null ) {
|
|
215
215
|
|
|
216
|
-
lightNode = getLightNodeById( light.id, previousLightNodes );
|
|
216
|
+
lightNode = getLightNodeById( light.id, previousLightNodes );
|
|
217
217
|
|
|
218
218
|
}
|
|
219
219
|
|
|
220
220
|
if ( lightNode === null ) {
|
|
221
221
|
|
|
222
|
-
// find the corresponding node type for a given light
|
|
223
|
-
|
|
224
222
|
const lightNodeClass = nodeLibrary.getLightNodeClass( light.constructor );
|
|
225
223
|
|
|
226
224
|
if ( lightNodeClass === null ) {
|
|
@@ -230,23 +228,18 @@ class LightsNode extends Node {
|
|
|
230
228
|
|
|
231
229
|
}
|
|
232
230
|
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
if ( ! _lightsNodeRef.has( light ) ) {
|
|
236
|
-
|
|
237
|
-
lightNode = nodeObject( new lightNodeClass( light ) );
|
|
238
|
-
_lightsNodeRef.set( light, lightNode );
|
|
231
|
+
if ( _lightsNodeRef.has( light ) === false ) {
|
|
239
232
|
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
lightNode = _lightsNodeRef.get( light );
|
|
233
|
+
_lightsNodeRef.set( light, new lightNodeClass( light ) );
|
|
243
234
|
|
|
244
235
|
}
|
|
245
236
|
|
|
246
|
-
|
|
237
|
+
lightNode = _lightsNodeRef.get( light );
|
|
247
238
|
|
|
248
239
|
}
|
|
249
240
|
|
|
241
|
+
lightNodes.push( lightNode );
|
|
242
|
+
|
|
250
243
|
}
|
|
251
244
|
|
|
252
245
|
}
|
|
@@ -325,8 +318,6 @@ class LightsNode extends Node {
|
|
|
325
318
|
|
|
326
319
|
builder.lightsNode = this;
|
|
327
320
|
|
|
328
|
-
//
|
|
329
|
-
|
|
330
321
|
let outgoingLightNode = this.outgoingLightNode;
|
|
331
322
|
|
|
332
323
|
const context = builder.context;
|
|
@@ -342,16 +333,10 @@ class LightsNode extends Node {
|
|
|
342
333
|
|
|
343
334
|
const stack = builder.addStack();
|
|
344
335
|
|
|
345
|
-
//
|
|
346
|
-
|
|
347
336
|
properties.nodes = stack.nodes;
|
|
348
337
|
|
|
349
|
-
//
|
|
350
|
-
|
|
351
338
|
lightingModel.start( builder );
|
|
352
339
|
|
|
353
|
-
//
|
|
354
|
-
|
|
355
340
|
const { backdrop, backdropAlpha } = context;
|
|
356
341
|
const { directDiffuse, directSpecular, indirectDiffuse, indirectSpecular } = context.reflectedLight;
|
|
357
342
|
|
|
@@ -376,12 +361,8 @@ class LightsNode extends Node {
|
|
|
376
361
|
|
|
377
362
|
outgoingLightNode.assign( totalDiffuseNode.add( totalSpecularNode ) );
|
|
378
363
|
|
|
379
|
-
//
|
|
380
|
-
|
|
381
364
|
lightingModel.finish( builder );
|
|
382
365
|
|
|
383
|
-
//
|
|
384
|
-
|
|
385
366
|
outgoingLightNode = outgoingLightNode.bypass( builder.removeStack() );
|
|
386
367
|
|
|
387
368
|
} else {
|
|
@@ -390,8 +371,6 @@ class LightsNode extends Node {
|
|
|
390
371
|
|
|
391
372
|
}
|
|
392
373
|
|
|
393
|
-
//
|
|
394
|
-
|
|
395
374
|
builder.lightsNode = currentLightsNode;
|
|
396
375
|
|
|
397
376
|
return outgoingLightNode;
|
|
@@ -450,4 +429,4 @@ export default LightsNode;
|
|
|
450
429
|
* @param {Array<Light>} lights - An array of lights.
|
|
451
430
|
* @return {LightsNode} The created lights node.
|
|
452
431
|
*/
|
|
453
|
-
export const lights = ( lights = [] ) =>
|
|
432
|
+
export const lights = ( lights = [] ) => new LightsNode().setLights( lights );
|
|
@@ -1,151 +1,134 @@
|
|
|
1
1
|
import ShadowNode from './ShadowNode.js';
|
|
2
2
|
import { uniform } from '../core/UniformNode.js';
|
|
3
|
-
import { float,
|
|
3
|
+
import { float, vec3, If, Fn } from '../tsl/TSLBase.js';
|
|
4
4
|
import { reference } from '../accessors/ReferenceNode.js';
|
|
5
|
-
import {
|
|
6
|
-
import { max, abs, sign } from '../math/MathNode.js';
|
|
7
|
-
import { sub, div } from '../math/OperatorNode.js';
|
|
5
|
+
import { cubeTexture } from '../accessors/CubeTextureNode.js';
|
|
8
6
|
import { renderGroup } from '../core/UniformGroupNode.js';
|
|
9
|
-
import {
|
|
10
|
-
import {
|
|
7
|
+
import { Matrix4 } from '../../math/Matrix4.js';
|
|
8
|
+
import { Vector3 } from '../../math/Vector3.js';
|
|
11
9
|
import { Color } from '../../math/Color.js';
|
|
12
|
-
import { BasicShadowMap } from '../../constants.js';
|
|
10
|
+
import { BasicShadowMap, GreaterEqualCompare, LessEqualCompare, WebGPUCoordinateSystem } from '../../constants.js';
|
|
11
|
+
import { CubeDepthTexture } from '../../textures/CubeDepthTexture.js';
|
|
12
|
+
import { screenCoordinate } from '../display/ScreenNode.js';
|
|
13
|
+
import { interleavedGradientNoise, vogelDiskSample } from '../utils/PostProcessingUtils.js';
|
|
14
|
+
import { abs, normalize, cross } from '../math/MathNode.js';
|
|
15
|
+
import { viewZToPerspectiveDepth, viewZToReversedPerspectiveDepth } from '../display/ViewportDepthNode.js';
|
|
13
16
|
|
|
14
17
|
const _clearColor = /*@__PURE__*/ new Color();
|
|
18
|
+
const _projScreenMatrix = /*@__PURE__*/ new Matrix4();
|
|
19
|
+
const _lightPositionWorld = /*@__PURE__*/ new Vector3();
|
|
20
|
+
const _lookTarget = /*@__PURE__*/ new Vector3();
|
|
21
|
+
|
|
22
|
+
// Cube map face directions and up vectors for point light shadows
|
|
23
|
+
// Face order: +X, -X, +Y, -Y, +Z, -Z
|
|
24
|
+
// WebGPU coordinate system - Y faces swapped to match texture sampling convention
|
|
25
|
+
const _cubeDirectionsWebGPU = [
|
|
26
|
+
/*@__PURE__*/ new Vector3( 1, 0, 0 ), /*@__PURE__*/ new Vector3( - 1, 0, 0 ), /*@__PURE__*/ new Vector3( 0, - 1, 0 ),
|
|
27
|
+
/*@__PURE__*/ new Vector3( 0, 1, 0 ), /*@__PURE__*/ new Vector3( 0, 0, 1 ), /*@__PURE__*/ new Vector3( 0, 0, - 1 )
|
|
28
|
+
];
|
|
29
|
+
|
|
30
|
+
const _cubeUpsWebGPU = [
|
|
31
|
+
/*@__PURE__*/ new Vector3( 0, - 1, 0 ), /*@__PURE__*/ new Vector3( 0, - 1, 0 ), /*@__PURE__*/ new Vector3( 0, 0, - 1 ),
|
|
32
|
+
/*@__PURE__*/ new Vector3( 0, 0, 1 ), /*@__PURE__*/ new Vector3( 0, - 1, 0 ), /*@__PURE__*/ new Vector3( 0, - 1, 0 )
|
|
33
|
+
];
|
|
34
|
+
|
|
35
|
+
// WebGL coordinate system - standard OpenGL convention
|
|
36
|
+
const _cubeDirectionsWebGL = [
|
|
37
|
+
/*@__PURE__*/ new Vector3( 1, 0, 0 ), /*@__PURE__*/ new Vector3( - 1, 0, 0 ), /*@__PURE__*/ new Vector3( 0, 1, 0 ),
|
|
38
|
+
/*@__PURE__*/ new Vector3( 0, - 1, 0 ), /*@__PURE__*/ new Vector3( 0, 0, 1 ), /*@__PURE__*/ new Vector3( 0, 0, - 1 )
|
|
39
|
+
];
|
|
40
|
+
|
|
41
|
+
const _cubeUpsWebGL = [
|
|
42
|
+
/*@__PURE__*/ new Vector3( 0, - 1, 0 ), /*@__PURE__*/ new Vector3( 0, - 1, 0 ), /*@__PURE__*/ new Vector3( 0, 0, 1 ),
|
|
43
|
+
/*@__PURE__*/ new Vector3( 0, 0, - 1 ), /*@__PURE__*/ new Vector3( 0, - 1, 0 ), /*@__PURE__*/ new Vector3( 0, - 1, 0 )
|
|
44
|
+
];
|
|
45
|
+
|
|
46
|
+
export const BasicPointShadowFilter = /*@__PURE__*/ Fn( ( { depthTexture, bd3D, dp } ) => {
|
|
47
|
+
|
|
48
|
+
return cubeTexture( depthTexture, bd3D ).compare( dp );
|
|
15
49
|
|
|
16
|
-
|
|
17
|
-
// vector suitable for 2D texture mapping. This code uses the following layout for the
|
|
18
|
-
// 2D texture:
|
|
19
|
-
//
|
|
20
|
-
// xzXZ
|
|
21
|
-
// y Y
|
|
22
|
-
//
|
|
23
|
-
// Y - Positive y direction
|
|
24
|
-
// y - Negative y direction
|
|
25
|
-
// X - Positive x direction
|
|
26
|
-
// x - Negative x direction
|
|
27
|
-
// Z - Positive z direction
|
|
28
|
-
// z - Negative z direction
|
|
29
|
-
//
|
|
30
|
-
// Source and test bed:
|
|
31
|
-
// https://gist.github.com/tschw/da10c43c467ce8afd0c4
|
|
32
|
-
|
|
33
|
-
export const cubeToUV = /*@__PURE__*/ Fn( ( [ pos, texelSizeY ] ) => {
|
|
34
|
-
|
|
35
|
-
const v = pos.toVar();
|
|
36
|
-
|
|
37
|
-
// Number of texels to avoid at the edge of each square
|
|
38
|
-
|
|
39
|
-
const absV = abs( v );
|
|
40
|
-
|
|
41
|
-
// Intersect unit cube
|
|
42
|
-
|
|
43
|
-
const scaleToCube = div( 1.0, max( absV.x, max( absV.y, absV.z ) ) );
|
|
44
|
-
absV.mulAssign( scaleToCube );
|
|
45
|
-
|
|
46
|
-
// Apply scale to avoid seams
|
|
47
|
-
|
|
48
|
-
// two texels less per square (one texel will do for NEAREST)
|
|
49
|
-
v.mulAssign( scaleToCube.mul( texelSizeY.mul( 2 ).oneMinus() ) );
|
|
50
|
-
|
|
51
|
-
// Unwrap
|
|
52
|
-
|
|
53
|
-
// space: -1 ... 1 range for each square
|
|
54
|
-
//
|
|
55
|
-
// #X## dim := ( 4 , 2 )
|
|
56
|
-
// # # center := ( 1 , 1 )
|
|
57
|
-
|
|
58
|
-
const planar = vec2( v.xy ).toVar();
|
|
59
|
-
|
|
60
|
-
const almostATexel = texelSizeY.mul( 1.5 );
|
|
61
|
-
const almostOne = almostATexel.oneMinus();
|
|
62
|
-
|
|
63
|
-
If( absV.z.greaterThanEqual( almostOne ), () => {
|
|
64
|
-
|
|
65
|
-
If( v.z.greaterThan( 0.0 ), () => {
|
|
66
|
-
|
|
67
|
-
planar.x.assign( sub( 4.0, v.x ) );
|
|
68
|
-
|
|
69
|
-
} );
|
|
50
|
+
} );
|
|
70
51
|
|
|
71
|
-
|
|
52
|
+
/**
|
|
53
|
+
* A shadow filtering function for point lights using Vogel disk sampling and IGN.
|
|
54
|
+
*
|
|
55
|
+
* Uses 5 samples distributed via Vogel disk pattern in tangent space around the
|
|
56
|
+
* sample direction, rotated per-pixel using Interleaved Gradient Noise (IGN).
|
|
57
|
+
*
|
|
58
|
+
* @method
|
|
59
|
+
* @param {Object} inputs - The input parameter object.
|
|
60
|
+
* @param {CubeDepthTexture} inputs.depthTexture - A reference to the shadow cube map.
|
|
61
|
+
* @param {Node<vec3>} inputs.bd3D - The normalized direction from light to fragment.
|
|
62
|
+
* @param {Node<float>} inputs.dp - The depth value to compare against.
|
|
63
|
+
* @param {LightShadow} inputs.shadow - The light shadow.
|
|
64
|
+
* @return {Node<float>} The filtering result.
|
|
65
|
+
*/
|
|
66
|
+
export const PointShadowFilter = /*@__PURE__*/ Fn( ( { depthTexture, bd3D, dp, shadow } ) => {
|
|
72
67
|
|
|
73
|
-
|
|
74
|
-
|
|
68
|
+
const radius = reference( 'radius', 'float', shadow ).setGroup( renderGroup );
|
|
69
|
+
const mapSize = reference( 'mapSize', 'vec2', shadow ).setGroup( renderGroup );
|
|
75
70
|
|
|
76
|
-
|
|
71
|
+
const texelSize = radius.div( mapSize.x );
|
|
77
72
|
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
73
|
+
// Build a tangent-space coordinate system for applying offsets
|
|
74
|
+
const absDir = abs( bd3D );
|
|
75
|
+
const tangent = normalize( cross( bd3D, absDir.x.greaterThan( absDir.z ).select( vec3( 0, 1, 0 ), vec3( 1, 0, 0 ) ) ) );
|
|
76
|
+
const bitangent = cross( bd3D, tangent );
|
|
81
77
|
|
|
82
|
-
|
|
78
|
+
// Use IGN to rotate sampling pattern per pixel (phi = IGN * 2π)
|
|
79
|
+
const phi = interleavedGradientNoise( screenCoordinate.xy ).mul( 6.28318530718 );
|
|
83
80
|
|
|
84
|
-
//
|
|
81
|
+
// 5 samples using Vogel disk distribution in tangent space
|
|
82
|
+
const sample0 = vogelDiskSample( 0, 5, phi );
|
|
83
|
+
const sample1 = vogelDiskSample( 1, 5, phi );
|
|
84
|
+
const sample2 = vogelDiskSample( 2, 5, phi );
|
|
85
|
+
const sample3 = vogelDiskSample( 3, 5, phi );
|
|
86
|
+
const sample4 = vogelDiskSample( 4, 5, phi );
|
|
85
87
|
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
88
|
+
return cubeTexture( depthTexture, bd3D.add( tangent.mul( sample0.x ).add( bitangent.mul( sample0.y ) ).mul( texelSize ) ) ).compare( dp )
|
|
89
|
+
.add( cubeTexture( depthTexture, bd3D.add( tangent.mul( sample1.x ).add( bitangent.mul( sample1.y ) ).mul( texelSize ) ) ).compare( dp ) )
|
|
90
|
+
.add( cubeTexture( depthTexture, bd3D.add( tangent.mul( sample2.x ).add( bitangent.mul( sample2.y ) ).mul( texelSize ) ) ).compare( dp ) )
|
|
91
|
+
.add( cubeTexture( depthTexture, bd3D.add( tangent.mul( sample3.x ).add( bitangent.mul( sample3.y ) ).mul( texelSize ) ) ).compare( dp ) )
|
|
92
|
+
.add( cubeTexture( depthTexture, bd3D.add( tangent.mul( sample4.x ).add( bitangent.mul( sample4.y ) ).mul( texelSize ) ) ).compare( dp ) )
|
|
93
|
+
.mul( 1.0 / 5.0 );
|
|
89
94
|
|
|
90
|
-
} ).setLayout( {
|
|
91
|
-
name: 'cubeToUV',
|
|
92
|
-
type: 'vec2',
|
|
93
|
-
inputs: [
|
|
94
|
-
{ name: 'pos', type: 'vec3' },
|
|
95
|
-
{ name: 'texelSizeY', type: 'float' }
|
|
96
|
-
]
|
|
97
95
|
} );
|
|
98
96
|
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
return texture( depthTexture, cubeToUV( bd3D, texelSize.y ) ).compare( dp );
|
|
97
|
+
const pointShadowFilter = /*@__PURE__*/ Fn( ( { filterFn, depthTexture, shadowCoord, shadow }, builder ) => {
|
|
102
98
|
|
|
103
|
-
|
|
99
|
+
// for point lights, the uniform @vShadowCoord is re-purposed to hold
|
|
100
|
+
// the vector from the light to the world-space position of the fragment.
|
|
101
|
+
const shadowPosition = shadowCoord.xyz.toConst();
|
|
102
|
+
const shadowPositionAbs = shadowPosition.abs().toConst();
|
|
103
|
+
const viewZ = shadowPositionAbs.x.max( shadowPositionAbs.y ).max( shadowPositionAbs.z );
|
|
104
104
|
|
|
105
|
-
|
|
105
|
+
const shadowCameraNear = uniform( 'float' ).setGroup( renderGroup ).onRenderUpdate( () => shadow.camera.near );
|
|
106
|
+
const shadowCameraFar = uniform( 'float' ).setGroup( renderGroup ).onRenderUpdate( () => shadow.camera.far );
|
|
107
|
+
const bias = reference( 'bias', 'float', shadow ).setGroup( renderGroup );
|
|
106
108
|
|
|
107
|
-
const
|
|
108
|
-
const offset = vec2( - 1.0, 1.0 ).mul( radius ).mul( texelSize.y );
|
|
109
|
-
|
|
110
|
-
return texture( depthTexture, cubeToUV( bd3D.add( offset.xyy ), texelSize.y ) ).compare( dp )
|
|
111
|
-
.add( texture( depthTexture, cubeToUV( bd3D.add( offset.yyy ), texelSize.y ) ).compare( dp ) )
|
|
112
|
-
.add( texture( depthTexture, cubeToUV( bd3D.add( offset.xyx ), texelSize.y ) ).compare( dp ) )
|
|
113
|
-
.add( texture( depthTexture, cubeToUV( bd3D.add( offset.yyx ), texelSize.y ) ).compare( dp ) )
|
|
114
|
-
.add( texture( depthTexture, cubeToUV( bd3D, texelSize.y ) ).compare( dp ) )
|
|
115
|
-
.add( texture( depthTexture, cubeToUV( bd3D.add( offset.xxy ), texelSize.y ) ).compare( dp ) )
|
|
116
|
-
.add( texture( depthTexture, cubeToUV( bd3D.add( offset.yxy ), texelSize.y ) ).compare( dp ) )
|
|
117
|
-
.add( texture( depthTexture, cubeToUV( bd3D.add( offset.xxx ), texelSize.y ) ).compare( dp ) )
|
|
118
|
-
.add( texture( depthTexture, cubeToUV( bd3D.add( offset.yxx ), texelSize.y ) ).compare( dp ) )
|
|
119
|
-
.mul( 1.0 / 9.0 );
|
|
109
|
+
const result = float( 1.0 ).toVar();
|
|
120
110
|
|
|
121
|
-
|
|
111
|
+
If( viewZ.sub( shadowCameraFar ).lessThanEqual( 0.0 ).and( viewZ.sub( shadowCameraNear ).greaterThanEqual( 0.0 ) ), () => {
|
|
122
112
|
|
|
123
|
-
|
|
113
|
+
let dp;
|
|
124
114
|
|
|
125
|
-
|
|
126
|
-
// the vector from the light to the world-space position of the fragment.
|
|
127
|
-
const lightToPosition = shadowCoord.xyz.toVar();
|
|
128
|
-
const lightToPositionLength = lightToPosition.length();
|
|
115
|
+
if ( builder.renderer.reversedDepthBuffer ) {
|
|
129
116
|
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
const bias = reference( 'bias', 'float', shadow ).setGroup( renderGroup );
|
|
133
|
-
const mapSize = uniform( shadow.mapSize ).setGroup( renderGroup );
|
|
117
|
+
dp = viewZToReversedPerspectiveDepth( viewZ.negate(), shadowCameraNear, shadowCameraFar );
|
|
118
|
+
dp.subAssign( bias );
|
|
134
119
|
|
|
135
|
-
|
|
120
|
+
} else {
|
|
136
121
|
|
|
137
|
-
|
|
122
|
+
dp = viewZToPerspectiveDepth( viewZ.negate(), shadowCameraNear, shadowCameraFar );
|
|
123
|
+
dp.addAssign( bias );
|
|
138
124
|
|
|
139
|
-
|
|
140
|
-
const dp = lightToPositionLength.sub( cameraNearLocal ).div( cameraFarLocal.sub( cameraNearLocal ) ).toVar(); // need to clamp?
|
|
141
|
-
dp.addAssign( bias );
|
|
125
|
+
}
|
|
142
126
|
|
|
143
|
-
// bd3D = base direction 3D
|
|
144
|
-
const bd3D =
|
|
145
|
-
const texelSize = vec2( 1.0 ).div( mapSize.mul( vec2( 4.0, 2.0 ) ) );
|
|
127
|
+
// bd3D = base direction 3D (direction from light to fragment)
|
|
128
|
+
const bd3D = shadowPosition.normalize();
|
|
146
129
|
|
|
147
|
-
// percentage-closer filtering
|
|
148
|
-
result.assign( filterFn( { depthTexture, bd3D, dp,
|
|
130
|
+
// percentage-closer filtering using cube texture sampling
|
|
131
|
+
result.assign( filterFn( { depthTexture, bd3D, dp, shadow } ) );
|
|
149
132
|
|
|
150
133
|
} );
|
|
151
134
|
|
|
@@ -153,10 +136,6 @@ const pointShadowFilter = /*@__PURE__*/ Fn( ( { filterFn, depthTexture, shadowCo
|
|
|
153
136
|
|
|
154
137
|
} );
|
|
155
138
|
|
|
156
|
-
const _viewport = /*@__PURE__*/ new Vector4();
|
|
157
|
-
const _viewportSize = /*@__PURE__*/ new Vector2();
|
|
158
|
-
const _shadowMapSize = /*@__PURE__*/ new Vector2();
|
|
159
|
-
|
|
160
139
|
|
|
161
140
|
/**
|
|
162
141
|
* Represents the shadow implementation for point light nodes.
|
|
@@ -216,15 +195,35 @@ class PointShadowNode extends ShadowNode {
|
|
|
216
195
|
* @param {NodeBuilder} builder - A reference to the current node builder.
|
|
217
196
|
* @param {Object} inputs - A configuration object that defines the shadow filtering.
|
|
218
197
|
* @param {Function} inputs.filterFn - This function defines the filtering type of the shadow map e.g. PCF.
|
|
219
|
-
* @param {
|
|
220
|
-
* @param {DepthTexture} inputs.depthTexture - A reference to the shadow map's texture data.
|
|
198
|
+
* @param {DepthTexture} inputs.depthTexture - A reference to the shadow map's depth texture.
|
|
221
199
|
* @param {Node<vec3>} inputs.shadowCoord - Shadow coordinates which are used to sample from the shadow map.
|
|
222
200
|
* @param {LightShadow} inputs.shadow - The light shadow.
|
|
223
201
|
* @return {Node<float>} The result node of the shadow filtering.
|
|
224
202
|
*/
|
|
225
|
-
setupShadowFilter( builder, { filterFn,
|
|
203
|
+
setupShadowFilter( builder, { filterFn, depthTexture, shadowCoord, shadow } ) {
|
|
204
|
+
|
|
205
|
+
return pointShadowFilter( { filterFn, depthTexture, shadowCoord, shadow } );
|
|
206
|
+
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
/**
|
|
210
|
+
* Overwrites the default implementation to create a CubeRenderTarget with CubeDepthTexture.
|
|
211
|
+
*
|
|
212
|
+
* @param {LightShadow} shadow - The light shadow object.
|
|
213
|
+
* @param {NodeBuilder} builder - A reference to the current node builder.
|
|
214
|
+
* @return {Object} An object containing the shadow map and depth texture.
|
|
215
|
+
*/
|
|
216
|
+
setupRenderTarget( shadow, builder ) {
|
|
217
|
+
|
|
218
|
+
const depthTexture = new CubeDepthTexture( shadow.mapSize.width );
|
|
219
|
+
depthTexture.name = 'PointShadowDepthTexture';
|
|
220
|
+
depthTexture.compareFunction = builder.renderer.reversedDepthBuffer ? GreaterEqualCompare : LessEqualCompare;
|
|
221
|
+
|
|
222
|
+
const shadowMap = builder.createCubeRenderTarget( shadow.mapSize.width );
|
|
223
|
+
shadowMap.texture.name = 'PointShadowMap';
|
|
224
|
+
shadowMap.depthTexture = depthTexture;
|
|
226
225
|
|
|
227
|
-
return
|
|
226
|
+
return { shadowMap, depthTexture };
|
|
228
227
|
|
|
229
228
|
}
|
|
230
229
|
|
|
@@ -239,14 +238,15 @@ class PointShadowNode extends ShadowNode {
|
|
|
239
238
|
const { shadow, shadowMap, light } = this;
|
|
240
239
|
const { renderer, scene } = frame;
|
|
241
240
|
|
|
242
|
-
const
|
|
241
|
+
const camera = shadow.camera;
|
|
242
|
+
const shadowMatrix = shadow.matrix;
|
|
243
243
|
|
|
244
|
-
|
|
245
|
-
|
|
244
|
+
// Select cube directions/ups based on coordinate system
|
|
245
|
+
const isWebGPU = renderer.coordinateSystem === WebGPUCoordinateSystem;
|
|
246
|
+
const cubeDirections = isWebGPU ? _cubeDirectionsWebGPU : _cubeDirectionsWebGL;
|
|
247
|
+
const cubeUps = isWebGPU ? _cubeUpsWebGPU : _cubeUpsWebGL;
|
|
246
248
|
|
|
247
|
-
shadowMap.setSize(
|
|
248
|
-
|
|
249
|
-
_viewportSize.copy( shadow.mapSize );
|
|
249
|
+
shadowMap.setSize( shadow.mapSize.width, shadow.mapSize.width );
|
|
250
250
|
|
|
251
251
|
//
|
|
252
252
|
|
|
@@ -257,33 +257,46 @@ class PointShadowNode extends ShadowNode {
|
|
|
257
257
|
|
|
258
258
|
renderer.autoClear = false;
|
|
259
259
|
renderer.setClearColor( shadow.clearColor, shadow.clearAlpha );
|
|
260
|
-
renderer.clear();
|
|
261
260
|
|
|
262
|
-
|
|
261
|
+
// Render each cube face
|
|
262
|
+
for ( let face = 0; face < 6; face ++ ) {
|
|
263
|
+
|
|
264
|
+
// Set render target to the specific cube face
|
|
265
|
+
renderer.setRenderTarget( shadowMap, face );
|
|
266
|
+
renderer.clear();
|
|
267
|
+
|
|
268
|
+
// Update shadow camera matrices for this face
|
|
269
|
+
|
|
270
|
+
const far = light.distance || camera.far;
|
|
271
|
+
|
|
272
|
+
if ( far !== camera.far ) {
|
|
273
|
+
|
|
274
|
+
camera.far = far;
|
|
275
|
+
camera.updateProjectionMatrix();
|
|
263
276
|
|
|
264
|
-
|
|
277
|
+
}
|
|
265
278
|
|
|
266
|
-
|
|
279
|
+
_lightPositionWorld.setFromMatrixPosition( light.matrixWorld );
|
|
280
|
+
camera.position.copy( _lightPositionWorld );
|
|
267
281
|
|
|
268
|
-
|
|
269
|
-
|
|
282
|
+
_lookTarget.copy( camera.position );
|
|
283
|
+
_lookTarget.add( cubeDirections[ face ] );
|
|
284
|
+
camera.up.copy( cubeUps[ face ] );
|
|
285
|
+
camera.lookAt( _lookTarget );
|
|
286
|
+
camera.updateMatrixWorld();
|
|
270
287
|
|
|
271
|
-
|
|
272
|
-
x,
|
|
273
|
-
y,
|
|
274
|
-
_viewportSize.x * viewport.z,
|
|
275
|
-
_viewportSize.y * viewport.w
|
|
276
|
-
);
|
|
288
|
+
shadowMatrix.makeTranslation( - _lightPositionWorld.x, - _lightPositionWorld.y, - _lightPositionWorld.z );
|
|
277
289
|
|
|
278
|
-
|
|
290
|
+
_projScreenMatrix.multiplyMatrices( camera.projectionMatrix, camera.matrixWorldInverse );
|
|
291
|
+
shadow._frustum.setFromProjectionMatrix( _projScreenMatrix, camera.coordinateSystem, camera.reversedDepth );
|
|
279
292
|
|
|
280
|
-
|
|
293
|
+
//
|
|
281
294
|
|
|
282
295
|
const currentSceneName = scene.name;
|
|
283
296
|
|
|
284
|
-
scene.name = `Point Light Shadow [ ${ light.name || 'ID: ' + light.id } ] - Face ${
|
|
297
|
+
scene.name = `Point Light Shadow [ ${ light.name || 'ID: ' + light.id } ] - Face ${ face + 1 }`;
|
|
285
298
|
|
|
286
|
-
renderer.render( scene,
|
|
299
|
+
renderer.render( scene, camera );
|
|
287
300
|
|
|
288
301
|
scene.name = currentSceneName;
|
|
289
302
|
|
|
@@ -309,4 +322,4 @@ export default PointShadowNode;
|
|
|
309
322
|
* @param {?PointLightShadow} [shadow=null] - An optional point light shadow.
|
|
310
323
|
* @return {PointShadowNode} The created point shadow node.
|
|
311
324
|
*/
|
|
312
|
-
export const pointShadow = ( light, shadow ) =>
|
|
325
|
+
export const pointShadow = ( light, shadow ) => new PointShadowNode( light, shadow );
|