@unikia/upe-renderer 0.186.110 → 0.187.11
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 +5 -7
- package/UPSTREAM.md +4 -4
- package/build/three.core.js +853 -277
- package/build/three.module.js +1098 -1280
- package/build/three.tsl.js +41938 -686
- package/build/three.webgpu.js +10604 -49055
- package/build/three.webgpu.nodes.js +9249 -5788
- package/examples/jsm/Addons.js +2 -0
- package/examples/jsm/animation/CCDIKSolver.js +17 -5
- package/examples/jsm/controls/FirstPersonControls.js +1 -1
- package/examples/jsm/controls/OrbitControls.js +27 -14
- package/examples/jsm/csm/CSMShader.js +74 -3
- package/examples/jsm/curves/CurveExtras.js +4 -4
- package/examples/jsm/curves/NURBSCurve.js +14 -0
- package/examples/jsm/exporters/EXRExporter.js +673 -16
- package/examples/jsm/exporters/GLTFExporter.js +4 -4
- package/examples/jsm/exporters/KTX2Exporter.js +1 -1
- package/examples/jsm/exporters/OBJExporter.js +48 -5
- package/examples/jsm/exporters/PLYExporter.js +22 -11
- package/examples/jsm/generators/CityGenerator.js +3 -2
- package/examples/jsm/generators/city/SkyscraperGenerator.js +63 -21
- package/examples/jsm/gpgpu/BitonicSort.js +30 -23
- package/examples/jsm/helpers/VertexTangentsHelper.js +1 -1
- package/examples/jsm/inspector/Extension.js +1 -1
- package/examples/jsm/inspector/Inspector.js +6 -46
- package/examples/jsm/inspector/RendererInspector.js +43 -8
- package/examples/jsm/inspector/Storage.js +49 -0
- package/examples/jsm/inspector/extensions/color-grading/ColorGrading.js +32 -27
- package/examples/jsm/inspector/tabs/Parameters.js +5 -1
- package/examples/jsm/inspector/tabs/Performance.js +22 -7
- package/examples/jsm/inspector/tabs/Settings.js +1 -1
- package/examples/jsm/inspector/tabs/Timeline.js +83 -7
- package/examples/jsm/inspector/tabs/Viewer.js +25 -10
- package/examples/jsm/inspector/ui/Profiler.js +1 -1
- package/examples/jsm/inspector/ui/Style.js +21 -53
- package/examples/jsm/inspector/ui/Values.js +28 -3
- package/examples/jsm/libs/fflate.module.js +83 -56
- package/examples/jsm/libs/mikktspace.README.md +27 -0
- package/examples/jsm/libs/mikktspace.module.js +721 -109
- package/examples/jsm/lighting/ClusteredLighting.js +100 -2
- package/examples/jsm/lighting/LightMapper.js +295 -0
- package/examples/jsm/lighting/LightProbeGrid.js +242 -139
- package/examples/jsm/lighting/LightProbeGridWebGL.js +30 -14
- package/examples/jsm/lighting/vxgi/VXGIConeTracer.js +54 -5
- package/examples/jsm/lighting/vxgi/VXGIIrradiance.js +43 -0
- package/examples/jsm/lighting/vxgi/VXGINode.js +13 -56
- package/examples/jsm/lighting/vxgi/VXGISceneCollector.js +316 -1
- package/examples/jsm/lighting/vxgi/VXGIVolume.js +69 -59
- package/examples/jsm/lights/SunLight.js +9 -4
- package/examples/jsm/lights/SunLightNode.js +3 -3
- package/examples/jsm/lines/LineMaterial.js +26 -10
- package/examples/jsm/loaders/3DMLoader.js +10 -1
- package/examples/jsm/loaders/3MFLoader.js +5 -1
- package/examples/jsm/loaders/AMFLoader.js +2 -0
- package/examples/jsm/loaders/BVHLoader.js +2 -0
- package/examples/jsm/loaders/ColladaLoader.js +8 -0
- package/examples/jsm/loaders/DDSLoader.js +1 -1
- package/examples/jsm/loaders/DRACOLoader.js +5 -1
- package/examples/jsm/loaders/EXRLoader.js +120 -104
- package/examples/jsm/loaders/FBXLoader.js +4 -0
- package/examples/jsm/loaders/FontLoader.js +2 -0
- package/examples/jsm/loaders/GCodeLoader.js +5 -9
- package/examples/jsm/loaders/GLTFLoader.js +112 -31
- package/examples/jsm/loaders/GaussianSplatPLYLoader.js +2 -0
- package/examples/jsm/loaders/HDRCubeTextureLoader.js +3 -0
- package/examples/jsm/loaders/IESLoader.js +46 -12
- package/examples/jsm/loaders/JXLLoader.js +159 -0
- package/examples/jsm/loaders/KMZLoader.js +6 -0
- package/examples/jsm/loaders/KSPLATLoader.js +2 -0
- package/examples/jsm/loaders/KTX2Loader.js +49 -4
- package/examples/jsm/loaders/KTXLoader.js +5 -3
- package/examples/jsm/loaders/LDrawLoader.js +15 -22
- package/examples/jsm/loaders/LUT3dlLoader.js +5 -1
- package/examples/jsm/loaders/LUTCubeLoader.js +6 -2
- package/examples/jsm/loaders/LUTImageLoader.js +2 -0
- package/examples/jsm/loaders/LWOLoader.js +6 -0
- package/examples/jsm/loaders/MD2Loader.js +2 -0
- package/examples/jsm/loaders/MDDLoader.js +4 -0
- package/examples/jsm/loaders/MTLLoader.js +8 -0
- package/examples/jsm/loaders/MaterialXLoader.js +57 -5
- package/examples/jsm/loaders/NRRDLoader.js +4 -2
- package/examples/jsm/loaders/OBJLoader.js +10 -4
- package/examples/jsm/loaders/PCDLoader.js +6 -2
- package/examples/jsm/loaders/PDBLoader.js +5 -3
- package/examples/jsm/loaders/PLYLoader.js +39 -15
- package/examples/jsm/loaders/PVRLoader.js +2 -2
- package/examples/jsm/loaders/SPLATLoader.js +2 -0
- package/examples/jsm/loaders/SPZLoader.js +2 -0
- package/examples/jsm/loaders/STLLoader.js +3 -1
- package/examples/jsm/loaders/SVGLoader.js +27 -49
- package/examples/jsm/loaders/TDSLoader.js +4 -0
- package/examples/jsm/loaders/TGALoader.js +6 -5
- package/examples/jsm/loaders/TTFLoader.js +2 -0
- package/examples/jsm/loaders/USDLoader.js +14 -0
- package/examples/jsm/loaders/UltraHDRLoader.js +2 -0
- package/examples/jsm/loaders/VOXLoader.js +3 -0
- package/examples/jsm/loaders/VRMLLoader.js +4 -0
- package/examples/jsm/loaders/VTKLoader.js +2 -0
- package/examples/jsm/loaders/XYZLoader.js +2 -0
- package/examples/jsm/loaders/collada/ColladaComposer.js +15 -8
- package/examples/jsm/loaders/materialx/MaterialXDocument.js +610 -138
- package/examples/jsm/loaders/materialx/MaterialXInterfaceValidation.js +12 -95
- package/examples/jsm/loaders/materialx/MaterialXLog.js +4 -0
- package/examples/jsm/loaders/materialx/MaterialXNodeDefs.js +99 -0
- package/examples/jsm/loaders/materialx/MaterialXNodeInterfaceRegistry.js +760 -1
- package/examples/jsm/loaders/materialx/MaterialXNodeLibrary.js +222 -372
- package/examples/jsm/loaders/materialx/MaterialXSurfaceMappings.js +163 -259
- package/examples/jsm/loaders/materialx/MaterialXUtils.js +25 -0
- package/examples/jsm/loaders/materialx/compile/MaterialXCompileRegistry.js +161 -159
- package/examples/jsm/loaders/usd/USDAParser.js +56 -47
- package/examples/jsm/loaders/usd/USDComposer.js +25 -30
- package/examples/jsm/math/ColorConverter.js +7 -3
- package/examples/jsm/math/Lut.js +2 -2
- package/examples/jsm/math/OBB.js +3 -3
- package/examples/jsm/math/Octree.js +20 -17
- package/examples/jsm/objects/GaussianSplat.js +5 -4
- package/examples/jsm/objects/Reflector.js +5 -0
- package/examples/jsm/objects/SkyMesh.js +14 -7
- package/examples/jsm/objects/Water2Mesh.js +2 -2
- package/examples/jsm/physics/RapierPhysics.js +2 -2
- package/examples/jsm/pipelines/MeshletDrawingPipeline.js +5571 -0
- package/examples/jsm/pipelines/VisibilityBufferDrawingPipeline.js +954 -0
- package/examples/jsm/postprocessing/BokehPass.js +1 -1
- package/examples/jsm/postprocessing/GTAOPass.js +26 -18
- package/examples/jsm/renderers/SVGRenderer.js +3 -2
- package/examples/jsm/shaders/GTAOShader.js +7 -4
- package/examples/jsm/shaders/PoissonDenoiseShader.js +1 -10
- package/examples/jsm/tsl/WebGLNodesHandler.js +21 -9
- package/examples/jsm/tsl/display/AfterImageNode.js +3 -3
- package/examples/jsm/tsl/display/BilateralBlurNode.js +3 -3
- package/examples/jsm/tsl/display/BloomNode.js +3 -3
- package/examples/jsm/tsl/display/ChromaticAberrationNode.js +8 -19
- package/examples/jsm/tsl/display/DenoiseNode.js +5 -5
- package/examples/jsm/tsl/display/DepthOfFieldNode.js +3 -3
- package/examples/jsm/tsl/display/DotScreenNode.js +3 -3
- package/examples/jsm/tsl/display/FSR1Node.js +3 -3
- package/examples/jsm/tsl/display/FXAANode.js +3 -10
- package/examples/jsm/tsl/display/FilmNode.js +3 -3
- package/examples/jsm/tsl/display/GTAONode.js +33 -25
- package/examples/jsm/tsl/display/GaussianBlurNode.js +3 -3
- package/examples/jsm/tsl/display/GodraysNode.js +5 -19
- package/examples/jsm/tsl/display/ImportanceSampledEnvironment.js +8 -4
- package/examples/jsm/tsl/display/LensflareNode.js +3 -3
- package/examples/jsm/tsl/display/Lut3DNode.js +3 -3
- package/examples/jsm/tsl/display/OITPassNode.js +0 -11
- package/examples/jsm/tsl/display/OutlineNode.js +107 -5
- package/examples/jsm/tsl/display/PixelationPassNode.js +85 -193
- package/examples/jsm/tsl/display/RGBShiftNode.js +3 -3
- package/examples/jsm/tsl/display/RecurrentDenoiseNode.js +23 -126
- package/examples/jsm/tsl/display/SMAANode.js +3 -3
- package/examples/jsm/tsl/display/SSAONode.js +6 -20
- package/examples/jsm/tsl/display/SSGINode.js +36 -29
- package/examples/jsm/tsl/display/SSRNode.js +135 -63
- package/examples/jsm/tsl/display/SSSNode.js +6 -20
- package/examples/jsm/tsl/display/SharpenNode.js +3 -3
- package/examples/jsm/tsl/display/SobelOperatorNode.js +3 -3
- package/examples/jsm/tsl/display/TAAUNode.js +10 -42
- package/examples/jsm/tsl/display/TRAANode.js +11 -43
- package/examples/jsm/tsl/display/TemporalReprojectNode.js +42 -47
- package/examples/jsm/tsl/display/TransitionNode.js +3 -3
- package/examples/jsm/tsl/display/lensDirt.js +30 -0
- package/examples/jsm/tsl/lighting/ClusteredLightsNode.js +482 -121
- package/examples/jsm/tsl/lighting/DynamicLightsNode.js +41 -140
- package/examples/jsm/tsl/lighting/LightProbeGridNode.js +72 -25
- package/examples/jsm/tsl/lighting/data/AmbientLightDataNode.js +6 -0
- package/examples/jsm/tsl/lighting/data/DirectionalLightDataNode.js +6 -0
- package/examples/jsm/tsl/lighting/data/HemisphereLightDataNode.js +6 -0
- package/examples/jsm/tsl/lighting/data/PointLightDataNode.js +6 -0
- package/examples/jsm/tsl/lighting/data/SpotLightDataNode.js +6 -0
- package/examples/jsm/tsl/shadows/TileShadowNode.js +102 -14
- package/examples/jsm/tsl/utils/Raymarching.js +1 -1
- package/examples/jsm/tsl/utils/SoftParticles.js +5 -12
- package/examples/jsm/tsl/utils/SpecularHelpers.js +47 -70
- package/examples/jsm/tsl/utils/TAAUtils.js +6 -17
- package/examples/jsm/utils/BufferGeometryUtils.js +110 -88
- package/examples/jsm/utils/MeshletGeometryUtils.js +417 -0
- package/examples/jsm/utils/SceneOptimizer.js +2 -1
- package/examples/jsm/utils/SceneUtils.js +1 -1
- package/examples/jsm/utils/unwrapUVs.js +865 -0
- package/examples/jsm/webxr/XREstimatedLight.js +11 -4
- package/package.json +3 -3
- package/src/Three.TSL.js +2 -683
- package/src/Three.WebGPU.Nodes.js +2 -1
- package/src/Three.WebGPU.js +2 -1
- package/src/animation/AnimationAction.js +1 -1
- package/src/animation/AnimationUtils.js +1 -3
- package/src/animation/KeyframeTrack.js +19 -0
- package/src/cameras/ArrayCamera.js +12 -0
- package/src/cameras/CubeCamera.js +3 -3
- package/src/constants.js +1 -9
- package/src/core/BufferAttribute.js +57 -21
- package/src/core/BufferGeometry.js +5 -13
- package/src/core/Clock.js +1 -1
- package/src/core/InterleavedBuffer.js +28 -18
- package/src/core/InterleavedBufferAttribute.js +54 -20
- package/src/core/Object3D.js +19 -9
- package/src/core/Raycaster.js +2 -0
- package/src/core/RenderTarget.js +11 -5
- package/src/core/UniformsGroup.js +7 -3
- package/src/extras/PMREMGenerator.js +392 -685
- package/src/extras/core/Curve.js +4 -0
- package/src/extras/core/CurvePath.js +13 -0
- package/src/extras/core/ShapePath.js +1 -1
- package/src/geometries/EdgesGeometry.js +12 -10
- package/src/geometries/LatheGeometry.js +2 -0
- package/src/helpers/PolarGridHelper.js +1 -1
- package/src/lights/Light.js +11 -0
- package/src/lights/LightProbe.js +2 -0
- package/src/lights/LightShadow.js +2 -0
- package/src/loaders/AnimationLoader.js +2 -0
- package/src/loaders/AudioLoader.js +2 -0
- package/src/loaders/BufferGeometryLoader.js +2 -0
- package/src/loaders/CompressedTextureLoader.js +2 -0
- package/src/loaders/CubeTextureLoader.js +2 -0
- package/src/loaders/DataTextureLoader.js +2 -0
- package/src/loaders/FileLoader.js +2 -0
- package/src/loaders/ImageBitmapLoader.js +3 -1
- package/src/loaders/ImageLoader.js +1 -0
- package/src/loaders/Loader.js +47 -0
- package/src/loaders/MaterialLoader.js +2 -0
- package/src/loaders/ObjectLoader.js +27 -8
- package/src/loaders/TextureLoader.js +5 -3
- package/src/loaders/nodes/NodeLoader.js +2 -0
- package/src/materials/Material.js +21 -2
- package/src/materials/MeshDepthMaterial.js +1 -1
- package/src/materials/MeshDistanceMaterial.js +1 -1
- package/src/materials/MeshLambertMaterial.js +1 -1
- package/src/materials/MeshMatcapMaterial.js +1 -1
- package/src/materials/MeshNormalMaterial.js +1 -1
- package/src/materials/MeshPhongMaterial.js +1 -1
- package/src/materials/MeshPhysicalMaterial.js +90 -11
- package/src/materials/MeshStandardMaterial.js +1 -1
- package/src/materials/MeshToonMaterial.js +1 -1
- package/src/materials/nodes/Line2NodeMaterial.js +32 -10
- package/src/materials/nodes/MeshLambertNodeMaterial.js +13 -0
- package/src/materials/nodes/MeshPhongNodeMaterial.js +13 -0
- package/src/materials/nodes/MeshPhysicalNodeMaterial.js +40 -5
- package/src/materials/nodes/MeshToonNodeMaterial.js +13 -0
- package/src/materials/nodes/NodeMaterial.js +36 -16
- package/src/materials/nodes/NodeMaterialInstance.js +193 -0
- package/src/materials/nodes/NodeMaterials.js +1 -0
- package/src/materials/nodes/PointsNodeMaterial.js +1 -1
- package/src/materials/nodes/SpriteNodeMaterial.js +3 -3
- package/src/materials/nodes/manager/NodeMaterialObserver.js +191 -22
- package/src/math/Box3.js +2 -2
- package/src/math/Color.js +8 -8
- package/src/math/ColorManagement.js +2 -21
- package/src/math/FrustumArray.js +12 -0
- package/src/math/Interpolant.js +1 -1
- package/src/math/Line3.js +2 -4
- package/src/math/MathUtils.js +33 -46
- package/src/math/Matrix2.js +1 -1
- package/src/math/Matrix3.js +1 -1
- package/src/math/Matrix4.js +1 -1
- package/src/math/Triangle.js +2 -1
- package/src/math/Vector2.js +1 -1
- package/src/math/Vector3.js +1 -1
- package/src/math/Vector4.js +1 -1
- package/src/nodes/Nodes.js +1 -0
- package/src/nodes/TSL.js +2 -0
- package/src/nodes/accessors/Arrays.js +1 -1
- package/src/nodes/accessors/Batch.js +29 -23
- package/src/nodes/accessors/BufferAttributeNode.js +21 -1
- package/src/nodes/accessors/BuiltinNode.js +6 -0
- package/src/nodes/accessors/Camera.js +100 -93
- package/src/nodes/accessors/ClippingNode.js +17 -6
- package/src/nodes/accessors/CubeTextureNode.js +12 -24
- package/src/nodes/accessors/Instance.js +198 -160
- package/src/nodes/accessors/Lights.js +19 -6
- package/src/nodes/accessors/MaterialNode.js +33 -4
- package/src/nodes/accessors/Morph.js +81 -22
- package/src/nodes/accessors/Normal.js +0 -42
- package/src/nodes/accessors/Object3DNode.js +6 -0
- package/src/nodes/accessors/PointUVNode.js +6 -0
- package/src/nodes/accessors/ReferenceAttributeNode.js +279 -0
- package/src/nodes/accessors/ReferenceBaseNode.js +6 -0
- package/src/nodes/accessors/ReferenceNode.js +6 -0
- package/src/nodes/accessors/Skinning.js +57 -52
- package/src/nodes/accessors/StorageBufferNode.js +3 -12
- package/src/nodes/accessors/TextureBicubic.js +30 -27
- package/src/nodes/accessors/TextureNode.js +164 -78
- package/src/nodes/accessors/TextureSizeNode.js +6 -0
- package/src/nodes/accessors/UniformArrayNode.js +8 -15
- package/src/nodes/accessors/VelocityNode.js +13 -8
- package/src/nodes/code/CodeNode.js +6 -0
- package/src/nodes/code/ExpressionNode.js +6 -0
- package/src/nodes/code/FunctionCallNode.js +3 -3
- package/src/nodes/code/FunctionNode.js +15 -13
- package/src/nodes/core/ArrayNode.js +3 -3
- package/src/nodes/core/AssignNode.js +10 -9
- package/src/nodes/core/AttributeNode.js +39 -0
- package/src/nodes/core/BypassNode.js +6 -0
- package/src/nodes/core/ConstNode.js +31 -1
- package/src/nodes/core/ContextNode.js +11 -6
- package/src/nodes/core/IndexNode.js +6 -0
- package/src/nodes/core/InputNode.js +6 -0
- package/src/nodes/core/InspectorNode.js +17 -31
- package/src/nodes/core/IsolateNode.js +8 -0
- package/src/nodes/core/Node.js +367 -67
- package/src/nodes/core/NodeBuilder.js +664 -222
- package/src/nodes/core/NodeUtils.js +25 -0
- package/src/nodes/core/NodeVar.js +10 -1
- package/src/nodes/core/OutputStructNode.js +6 -0
- package/src/nodes/core/OverrideContextNode.js +38 -37
- package/src/nodes/core/PropertyNode.js +14 -0
- package/src/nodes/core/StackNode.js +33 -21
- package/src/nodes/core/StructNode.js +6 -0
- package/src/nodes/core/StructTypeNode.js +6 -0
- package/src/nodes/core/SubBuildNode.js +8 -0
- package/src/nodes/core/TempNode.js +10 -35
- package/src/nodes/core/UniformGroupNode.js +6 -0
- package/src/nodes/core/VarNode.js +43 -135
- package/src/nodes/core/VaryingNode.js +33 -2
- package/src/nodes/display/BlendModes.js +5 -40
- package/src/nodes/display/BumpMapNode.js +17 -7
- package/src/nodes/display/ColorAdjustment.js +22 -10
- package/src/nodes/display/ColorSpaceFunctions.js +2 -14
- package/src/nodes/display/ColorSpaceNode.js +3 -3
- package/src/nodes/display/FrontFacingNode.js +6 -0
- package/src/nodes/display/NormalMapNode.js +3 -3
- package/src/nodes/display/PassNode.js +75 -16
- package/src/nodes/display/RenderOutputNode.js +22 -5
- package/src/nodes/display/ScreenNode.js +6 -0
- package/src/nodes/display/ToneMappingFunctions.js +9 -51
- package/src/nodes/display/ToneMappingNode.js +3 -3
- package/src/nodes/display/ToonOutlinePassNode.js +66 -2
- package/src/nodes/display/ViewportDepthNode.js +34 -4
- package/src/nodes/functions/BSDF/BRDF_EON.js +65 -0
- package/src/nodes/functions/BSDF/BRDF_GGX.js +5 -3
- package/src/nodes/functions/BSDF/BRDF_Sheen.js +2 -16
- package/src/nodes/functions/BSDF/D_GGX.js +1 -8
- package/src/nodes/functions/BSDF/D_GGX_Anisotropic.js +7 -10
- package/src/nodes/functions/BSDF/LTC.js +20 -47
- package/src/nodes/functions/BSDF/Schlick_to_F0.js +1 -9
- package/src/nodes/functions/BSDF/V_GGX_SmithCorrelated.js +1 -9
- package/src/nodes/functions/BSDF/V_GGX_SmithCorrelated_Anisotropic.js +10 -13
- package/src/nodes/functions/PhysicalLightingModel.js +84 -51
- package/src/nodes/functions/VolumetricLightingModel.js +1 -1
- package/src/nodes/functions/material/getAlphaHashThreshold.js +3 -9
- package/src/nodes/functions/material/getParallaxCorrectNormal.js +10 -11
- package/src/nodes/functions/material/getRoughness.js +3 -1
- package/src/nodes/geometry/RangeNode.js +52 -69
- package/src/nodes/gpgpu/AtomicFunctionNode.js +11 -6
- package/src/nodes/gpgpu/BarrierNode.js +6 -0
- package/src/nodes/gpgpu/ComputeBuiltinNode.js +6 -0
- package/src/nodes/gpgpu/ComputeNode.js +6 -0
- package/src/nodes/gpgpu/SubgroupFunctionNode.js +38 -29
- package/src/nodes/gpgpu/WorkgroupInfoNode.js +6 -0
- package/src/nodes/lighting/AnalyticLightNode.js +7 -14
- package/src/nodes/lighting/BasicEnvironmentNode.js +5 -1
- package/src/nodes/lighting/EnvironmentNode.js +58 -8
- package/src/nodes/lighting/IESSpotLightNode.js +19 -4
- package/src/nodes/lighting/LightProbeNode.js +2 -1
- package/src/nodes/lighting/LightUtils.js +2 -2
- package/src/nodes/lighting/LightingNode.js +6 -0
- package/src/nodes/lighting/LightsNode.js +26 -32
- package/src/nodes/lighting/PointShadowNode.js +92 -48
- package/src/nodes/lighting/ProjectorLightNode.js +1 -1
- package/src/nodes/lighting/RectAreaLightNode.js +13 -14
- package/src/nodes/lighting/ShadowBaseNode.js +9 -17
- package/src/nodes/lighting/ShadowFilterNode.js +26 -3
- package/src/nodes/lighting/ShadowNode.js +13 -11
- package/src/nodes/materialx/MaterialXColor.js +2 -14
- package/src/nodes/materialx/MaterialXColorTransform.js +1 -7
- package/src/nodes/materialx/MaterialXNodes.js +8 -11
- package/src/nodes/materialx/MaterialXNoise.js +195 -454
- package/src/nodes/math/BitcastNode.js +5 -5
- package/src/nodes/math/BitcountNode.js +18 -46
- package/src/nodes/math/ConditionalNode.js +92 -22
- package/src/nodes/math/Hash.js +1 -1
- package/src/nodes/math/MathNode.js +86 -64
- package/src/nodes/math/MathUtils.js +2 -2
- package/src/nodes/math/OperatorNode.js +42 -59
- package/src/nodes/math/PackFloatNode.js +9 -9
- package/src/nodes/math/Packed4x8IntegerNode.js +20 -52
- package/src/nodes/math/TriNoise3D.js +3 -23
- package/src/nodes/math/UnpackFloatNode.js +9 -9
- package/src/nodes/pmrem/PMREMNode.js +38 -75
- package/src/nodes/pmrem/PMREMUtils.js +108 -272
- package/src/nodes/procedural/Checker.js +1 -1
- package/src/nodes/tsl/TSLCore.js +199 -74
- package/src/nodes/utils/ArrayElementNode.js +19 -1
- package/src/nodes/utils/CubeMapNode.js +3 -3
- package/src/nodes/utils/DebugNode.js +2 -2
- package/src/nodes/utils/EventNode.js +6 -0
- package/src/nodes/utils/FlipNode.js +3 -3
- package/src/nodes/utils/FunctionOverloadingNode.js +7 -1
- package/src/nodes/utils/JoinNode.js +3 -3
- package/src/nodes/utils/LoopNode.js +14 -9
- package/src/nodes/utils/MemberNode.js +18 -0
- package/src/nodes/utils/PostProcessingUtils.js +20 -25
- package/src/nodes/utils/RTTNode.js +2 -0
- package/src/nodes/utils/ReflectorNode.js +24 -0
- package/src/nodes/utils/RotateNode.js +3 -3
- package/src/nodes/utils/SampleNode.js +6 -0
- package/src/nodes/utils/SetNode.js +3 -3
- package/src/nodes/utils/SplitNode.js +6 -0
- package/src/nodes/utils/UVUtils.js +2 -2
- package/src/objects/BatchedMesh.js +146 -15
- package/src/objects/InstancedMesh.js +12 -4
- package/src/objects/Line.js +20 -0
- package/src/objects/Mesh.js +8 -0
- package/src/objects/Points.js +20 -0
- package/src/objects/Skeleton.js +26 -0
- package/src/objects/SkinnedMesh.js +3 -3
- package/src/objects/Sprite.js +10 -0
- package/src/renderers/WebGLRenderer.js +104 -70
- package/src/renderers/common/Animation.js +5 -1
- package/src/renderers/common/Attributes.js +67 -57
- package/src/renderers/common/Backend.js +78 -3
- package/src/renderers/common/BindGroup.js +11 -0
- package/src/renderers/common/Binding.js +0 -11
- package/src/renderers/common/Bindings.js +116 -10
- package/src/renderers/common/Buffer.js +1 -1
- package/src/renderers/common/ClippingContext.js +12 -1
- package/src/renderers/common/ComputePipeline.js +17 -1
- package/src/renderers/common/DirectRenderPipeline.js +7 -3
- package/src/renderers/common/Geometries.js +170 -132
- package/src/renderers/common/Info.js +1 -1
- package/src/renderers/common/InspectorBase.js +5 -5
- package/src/renderers/common/Lighting.js +59 -0
- package/src/renderers/common/Pipelines.js +26 -12
- package/src/renderers/common/ProgrammableStage.js +1 -17
- package/src/renderers/common/RenderContext.js +21 -0
- package/src/renderers/common/RenderContexts.js +13 -4
- package/src/renderers/common/RenderObject.js +111 -35
- package/src/renderers/common/RenderObjects.js +37 -19
- package/src/renderers/common/Renderer.js +537 -295
- package/src/renderers/common/RendererUtils.js +15 -0
- package/src/renderers/common/StandardDrawingPipeline.js +343 -0
- package/src/renderers/common/Storage3DTexture.js +11 -0
- package/src/renderers/common/StorageArrayTexture.js +10 -0
- package/src/renderers/common/StorageTexture.js +0 -9
- package/src/renderers/common/Textures.js +144 -37
- package/src/renderers/common/UniformsGroup.js +19 -0
- package/src/renderers/common/XRManager.js +10 -91
- package/src/renderers/common/extras/PMREMGenerator.js +298 -576
- package/src/renderers/common/nodes/NodeBuilderState.js +7 -5
- package/src/renderers/common/nodes/NodeLibrary.js +11 -35
- package/src/renderers/common/nodes/NodeManager.js +80 -31
- package/src/renderers/common/nodes/NodeSampledTexture.js +14 -0
- package/src/renderers/common/nodes/NodeSampler.js +14 -0
- package/src/renderers/common/nodes/NodeStorageBuffer.js +1 -1
- package/src/renderers/common/nodes/NodeUniformBuffer.js +1 -14
- package/src/renderers/shaders/ShaderChunk/envmap_common_pars_fragment.glsl.js +13 -4
- package/src/renderers/shaders/ShaderChunk/envmap_physical_pars_fragment.glsl.js +8 -8
- package/src/renderers/shaders/ShaderChunk/lightprobes_pars_fragment.glsl.js +23 -11
- package/src/renderers/shaders/ShaderChunk/lights_fragment_begin.glsl.js +21 -2
- package/src/renderers/shaders/ShaderChunk/lights_fragment_maps.glsl.js +1 -1
- package/src/renderers/shaders/ShaderChunk/lights_physical_fragment.glsl.js +18 -2
- package/src/renderers/shaders/ShaderChunk/lights_physical_pars_fragment.glsl.js +104 -7
- package/src/renderers/shaders/ShaderChunk/morphcolor_vertex.glsl.js +11 -2
- package/src/renderers/shaders/ShaderChunk/shadowmap_pars_fragment.glsl.js +36 -20
- package/src/renderers/shaders/ShaderChunk/uv_pars_fragment.glsl.js +5 -0
- package/src/renderers/shaders/ShaderChunk/uv_pars_vertex.glsl.js +6 -0
- package/src/renderers/shaders/ShaderChunk/uv_vertex.glsl.js +5 -0
- package/src/renderers/shaders/ShaderChunk.js +0 -2
- package/src/renderers/shaders/ShaderLib/backgroundCube.glsl.js +4 -18
- package/src/renderers/shaders/ShaderLib/meshlambert.glsl.js +0 -1
- package/src/renderers/shaders/ShaderLib/meshphong.glsl.js +0 -1
- package/src/renderers/shaders/ShaderLib/meshphysical.glsl.js +8 -1
- package/src/renderers/shaders/ShaderLib.js +3 -0
- package/src/renderers/shaders/UniformsLib.js +4 -5
- package/src/renderers/webgl/WebGLBackground.js +3 -3
- package/src/renderers/webgl/WebGLBindingStates.js +4 -2
- package/src/renderers/webgl/WebGLCapabilities.js +7 -1
- package/src/renderers/webgl/WebGLEnvironments.js +2 -2
- package/src/renderers/webgl/WebGLGeometries.js +42 -14
- package/src/renderers/webgl/WebGLMaterials.js +15 -2
- package/src/renderers/webgl/WebGLOutput.js +37 -1
- package/src/renderers/webgl/WebGLProgram.js +13 -54
- package/src/renderers/webgl/WebGLPrograms.js +22 -8
- package/src/renderers/webgl/WebGLRenderStates.js +11 -8
- package/src/renderers/webgl/WebGLShadowMap.js +6 -4
- package/src/renderers/webgl/WebGLState.js +10 -6
- package/src/renderers/webgl/WebGLTextures.js +129 -77
- package/src/renderers/webgl/WebGLUniforms.js +44 -6
- package/src/renderers/webgl/WebGLUniformsGroups.js +75 -69
- package/src/renderers/webgl-fallback/WebGLBackend.js +206 -278
- package/src/renderers/webgl-fallback/nodes/GLSLNodeBuilder.js +154 -20
- package/src/renderers/webgl-fallback/utils/WebGLAttributeUtils.js +45 -42
- package/src/renderers/webgl-fallback/utils/WebGLState.js +29 -4
- package/src/renderers/webgl-fallback/utils/WebGLTextureUtils.js +129 -49
- package/src/renderers/webgl-fallback/utils/WebGLVertexArrayUtils.js +346 -0
- package/src/renderers/webgpu/WebGPUBackend.js +140 -82
- package/src/renderers/webgpu/WebGPURenderer.js +1 -1
- package/src/renderers/webgpu/nodes/BasicNodeLibrary.js +10 -10
- package/src/renderers/webgpu/nodes/StandardNodeLibrary.js +10 -10
- package/src/renderers/webgpu/nodes/WGSLNodeBuilder.js +135 -60
- package/src/renderers/webgpu/utils/WebGPUAttributeUtils.js +128 -55
- package/src/renderers/webgpu/utils/WebGPUBindingUtils.js +1 -1
- package/src/renderers/webgpu/utils/WebGPUPipelineUtils.js +15 -12
- package/src/renderers/webgpu/utils/WebGPUTextureUtils.js +55 -19
- package/src/renderers/webgpu/utils/WebGPUUtils.js +20 -3
- package/src/renderers/webxr/WebXRController.js +3 -3
- package/src/renderers/webxr/WebXRManager.js +5 -90
- package/src/scenes/Scene.js +4 -4
- package/src/textures/CompressedTexture.js +2 -2
- package/src/textures/DepthTexture.js +2 -2
- package/src/textures/FramebufferTexture.js +11 -0
- package/src/textures/Texture.js +29 -1
- package/src/textures/TextureSource.js +1 -1
- package/src/upe.js +1 -1
- package/src/utils.js +4 -4
- package/examples/jsm/libs/surfaceNet.js +0 -201
- package/src/renderers/shaders/ShaderChunk/cube_uv_reflection_fragment.glsl.js +0 -186
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
import { LightsNode, NodeUtils,
|
|
2
|
-
import { nodeObject } from 'three/tsl';
|
|
1
|
+
import { AmbientLight, DirectionalLight, HemisphereLight, LightsNode, NodeUtils, PointLight, SpotLight } from 'three/webgpu';
|
|
3
2
|
|
|
4
3
|
import AmbientLightDataNode from './data/AmbientLightDataNode.js';
|
|
5
4
|
import DirectionalLightDataNode from './data/DirectionalLightDataNode.js';
|
|
@@ -7,9 +6,16 @@ import PointLightDataNode from './data/PointLightDataNode.js';
|
|
|
7
6
|
import SpotLightDataNode from './data/SpotLightDataNode.js';
|
|
8
7
|
import HemisphereLightDataNode from './data/HemisphereLightDataNode.js';
|
|
9
8
|
|
|
10
|
-
const _lightNodeRef = /*@__PURE__*/ new WeakMap();
|
|
11
9
|
const _hashData = [];
|
|
12
10
|
|
|
11
|
+
const _lightClassToType = new Map( [
|
|
12
|
+
[ AmbientLight, 'AmbientLight' ],
|
|
13
|
+
[ DirectionalLight, 'DirectionalLight' ],
|
|
14
|
+
[ PointLight, 'PointLight' ],
|
|
15
|
+
[ SpotLight, 'SpotLight' ],
|
|
16
|
+
[ HemisphereLight, 'HemisphereLight' ]
|
|
17
|
+
] );
|
|
18
|
+
|
|
13
19
|
const _lightTypeToDataNode = {
|
|
14
20
|
AmbientLight: AmbientLightDataNode,
|
|
15
21
|
DirectionalLight: DirectionalLightDataNode,
|
|
@@ -25,8 +31,6 @@ const _lightTypeToMaxProp = {
|
|
|
25
31
|
HemisphereLight: 'maxHemisphereLights'
|
|
26
32
|
};
|
|
27
33
|
|
|
28
|
-
const sortLights = ( lights ) => lights.sort( ( a, b ) => a.id - b.id );
|
|
29
|
-
|
|
30
34
|
const isSpecialSpotLight = ( light ) => {
|
|
31
35
|
|
|
32
36
|
return light.isSpotLight === true && ( light.map !== null || light.colorNode !== undefined );
|
|
@@ -38,28 +42,7 @@ const canBatchLight = ( light ) => {
|
|
|
38
42
|
return light.isNode !== true &&
|
|
39
43
|
light.castShadow !== true &&
|
|
40
44
|
isSpecialSpotLight( light ) === false &&
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
};
|
|
44
|
-
|
|
45
|
-
const getOrCreateLightNode = ( light, nodeLibrary ) => {
|
|
46
|
-
|
|
47
|
-
const lightNodeClass = nodeLibrary.getLightNodeClass( light.constructor );
|
|
48
|
-
|
|
49
|
-
if ( lightNodeClass === null ) {
|
|
50
|
-
|
|
51
|
-
warn( `DynamicLightsNode: Light node not found for ${ light.constructor.name }.` );
|
|
52
|
-
return null;
|
|
53
|
-
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
if ( _lightNodeRef.has( light ) === false ) {
|
|
57
|
-
|
|
58
|
-
_lightNodeRef.set( light, new lightNodeClass( light ) );
|
|
59
|
-
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
return _lightNodeRef.get( light );
|
|
45
|
+
_lightClassToType.has( light.constructor );
|
|
63
46
|
|
|
64
47
|
};
|
|
65
48
|
|
|
@@ -99,47 +82,16 @@ class DynamicLightsNode extends LightsNode {
|
|
|
99
82
|
this.maxSpotLights = options.maxSpotLights !== undefined ? options.maxSpotLights : 16;
|
|
100
83
|
this.maxHemisphereLights = options.maxHemisphereLights !== undefined ? options.maxHemisphereLights : 4;
|
|
101
84
|
|
|
85
|
+
this._builtinLights = [];
|
|
102
86
|
this._dataNodes = new Map();
|
|
103
87
|
|
|
104
88
|
}
|
|
105
89
|
|
|
106
90
|
customCacheKey() {
|
|
107
91
|
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
for ( let i = 0; i < this._lights.length; i ++ ) {
|
|
111
|
-
|
|
112
|
-
const light = this._lights[ i ];
|
|
113
|
-
|
|
114
|
-
if ( canBatchLight( light ) ) {
|
|
115
|
-
|
|
116
|
-
typeSet.add( light.constructor.name );
|
|
117
|
-
|
|
118
|
-
} else {
|
|
119
|
-
|
|
120
|
-
_hashData.push( light.id );
|
|
121
|
-
_hashData.push( light.castShadow ? 1 : 0 );
|
|
122
|
-
|
|
123
|
-
if ( light.isSpotLight === true ) {
|
|
124
|
-
|
|
125
|
-
const hashMap = light.map !== null ? light.map.id : - 1;
|
|
126
|
-
const hashColorNode = light.colorNode ? light.colorNode.getCacheKey() : - 1;
|
|
92
|
+
_hashData.push( super.customCacheKey() );
|
|
127
93
|
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
}
|
|
131
|
-
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
}
|
|
135
|
-
|
|
136
|
-
for ( const typeName of this._dataNodes.keys() ) {
|
|
137
|
-
|
|
138
|
-
typeSet.add( typeName );
|
|
139
|
-
|
|
140
|
-
}
|
|
141
|
-
|
|
142
|
-
for ( const typeName of [ ...typeSet ].sort() ) {
|
|
94
|
+
for ( const typeName of [ ...this._dataNodes.keys() ].sort() ) {
|
|
143
95
|
|
|
144
96
|
_hashData.push( NodeUtils.hashString( typeName ) );
|
|
145
97
|
|
|
@@ -155,127 +107,76 @@ class DynamicLightsNode extends LightsNode {
|
|
|
155
107
|
|
|
156
108
|
setupLightsNode( builder ) {
|
|
157
109
|
|
|
158
|
-
const lightNodes =
|
|
159
|
-
const lightsByType = new Map();
|
|
160
|
-
const lights = sortLights( this._lights );
|
|
161
|
-
const nodeLibrary = builder.renderer.library;
|
|
162
|
-
|
|
163
|
-
for ( const light of lights ) {
|
|
110
|
+
const lightNodes = super.setupLightsNode( builder );
|
|
164
111
|
|
|
165
|
-
|
|
112
|
+
for ( const dataNode of this._dataNodes.values() ) {
|
|
166
113
|
|
|
167
|
-
|
|
168
|
-
continue;
|
|
114
|
+
lightNodes.push( dataNode );
|
|
169
115
|
|
|
170
|
-
|
|
116
|
+
}
|
|
171
117
|
|
|
172
|
-
|
|
118
|
+
return lightNodes;
|
|
173
119
|
|
|
174
|
-
|
|
175
|
-
const typeLights = lightsByType.get( typeName );
|
|
120
|
+
}
|
|
176
121
|
|
|
177
|
-
|
|
122
|
+
setLights( lights ) {
|
|
178
123
|
|
|
179
|
-
|
|
124
|
+
const builtinLights = this._builtinLights;
|
|
125
|
+
const lightsByType = new Map();
|
|
180
126
|
|
|
181
|
-
|
|
127
|
+
builtinLights.length = 0;
|
|
182
128
|
|
|
183
|
-
|
|
129
|
+
for ( const light of lights ) {
|
|
184
130
|
|
|
185
|
-
|
|
131
|
+
if ( canBatchLight( light ) === false ) {
|
|
186
132
|
|
|
133
|
+
builtinLights.push( light );
|
|
187
134
|
continue;
|
|
188
135
|
|
|
189
136
|
}
|
|
190
137
|
|
|
191
|
-
const
|
|
138
|
+
const typeName = _lightClassToType.get( light.constructor );
|
|
139
|
+
const typeLights = lightsByType.get( typeName );
|
|
140
|
+
|
|
141
|
+
if ( typeLights === undefined ) {
|
|
142
|
+
|
|
143
|
+
lightsByType.set( typeName, [ light ] );
|
|
192
144
|
|
|
193
|
-
|
|
145
|
+
} else {
|
|
194
146
|
|
|
195
|
-
|
|
147
|
+
typeLights.push( light );
|
|
196
148
|
|
|
197
149
|
}
|
|
198
150
|
|
|
199
151
|
}
|
|
200
152
|
|
|
201
|
-
for ( const
|
|
202
|
-
|
|
203
|
-
let dataNode = this._dataNodes.get( typeName );
|
|
153
|
+
for ( const typeName of lightsByType.keys() ) {
|
|
204
154
|
|
|
205
|
-
if (
|
|
155
|
+
if ( this._dataNodes.has( typeName ) === false ) {
|
|
206
156
|
|
|
207
157
|
const DataNodeClass = _lightTypeToDataNode[ typeName ];
|
|
208
158
|
const maxProp = _lightTypeToMaxProp[ typeName ];
|
|
209
159
|
const maxCount = maxProp !== undefined ? this[ maxProp ] : undefined;
|
|
210
160
|
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
this._dataNodes.set( typeName, dataNode );
|
|
161
|
+
this._dataNodes.set( typeName, maxCount !== undefined ? new DataNodeClass( maxCount ) : new DataNodeClass() );
|
|
214
162
|
|
|
215
163
|
}
|
|
216
164
|
|
|
217
|
-
dataNode.setLights( typeLights );
|
|
218
|
-
lightNodes.push( dataNode );
|
|
219
|
-
|
|
220
165
|
}
|
|
221
166
|
|
|
222
167
|
for ( const [ typeName, dataNode ] of this._dataNodes ) {
|
|
223
168
|
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
dataNode.setLights( [] );
|
|
227
|
-
lightNodes.push( dataNode );
|
|
228
|
-
|
|
229
|
-
}
|
|
230
|
-
|
|
231
|
-
}
|
|
232
|
-
|
|
233
|
-
return lightNodes;
|
|
234
|
-
|
|
235
|
-
}
|
|
236
|
-
|
|
237
|
-
setLights( lights ) {
|
|
238
|
-
|
|
239
|
-
super.setLights( lights );
|
|
240
|
-
|
|
241
|
-
if ( this._dataNodes.size > 0 ) {
|
|
242
|
-
|
|
243
|
-
this._updateDataNodeLights( lights );
|
|
169
|
+
dataNode.setLights( lightsByType.get( typeName ) || [] );
|
|
244
170
|
|
|
245
171
|
}
|
|
246
172
|
|
|
247
|
-
return
|
|
173
|
+
return super.setLights( lights );
|
|
248
174
|
|
|
249
175
|
}
|
|
250
176
|
|
|
251
|
-
|
|
177
|
+
getBuiltinLights() {
|
|
252
178
|
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
for ( const light of lights ) {
|
|
256
|
-
|
|
257
|
-
if ( canBatchLight( light ) === false ) continue;
|
|
258
|
-
|
|
259
|
-
const typeName = light.constructor.name;
|
|
260
|
-
const typeLights = lightsByType.get( typeName );
|
|
261
|
-
|
|
262
|
-
if ( typeLights === undefined ) {
|
|
263
|
-
|
|
264
|
-
lightsByType.set( typeName, [ light ] );
|
|
265
|
-
|
|
266
|
-
} else {
|
|
267
|
-
|
|
268
|
-
typeLights.push( light );
|
|
269
|
-
|
|
270
|
-
}
|
|
271
|
-
|
|
272
|
-
}
|
|
273
|
-
|
|
274
|
-
for ( const [ typeName, dataNode ] of this._dataNodes ) {
|
|
275
|
-
|
|
276
|
-
dataNode.setLights( lightsByType.get( typeName ) || [] );
|
|
277
|
-
|
|
278
|
-
}
|
|
179
|
+
return this._builtinLights;
|
|
279
180
|
|
|
280
181
|
}
|
|
281
182
|
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { AnalyticLightNode, Vector3 } from 'three/webgpu';
|
|
2
|
-
import { array, getShIrradianceAt, normalWorld, positionWorld, texture3D, uniform, vec3 } from 'three/tsl';
|
|
1
|
+
import { AnalyticLightNode, NodeUpdateType, Vector3 } from 'three/webgpu';
|
|
2
|
+
import { INFINITY, If, array, getShIrradianceAt, normalWorld, positionWorld, renderGroup, texture3D, uniform, vec3 } from 'three/tsl';
|
|
3
3
|
|
|
4
4
|
// Padding texels at each boundary of every atlas sub-volume.
|
|
5
5
|
export const ATLAS_PADDING = 1;
|
|
@@ -49,6 +49,53 @@ function evaluateGridIrradiance( atlas, uvw, res, normal ) {
|
|
|
49
49
|
|
|
50
50
|
}
|
|
51
51
|
|
|
52
|
+
/**
|
|
53
|
+
* Evaluates the irradiance of a light probe grid at the given world-space position and normal.
|
|
54
|
+
*
|
|
55
|
+
* @private
|
|
56
|
+
* @param {LightProbeGrid} light - The light probe grid.
|
|
57
|
+
* @param {Node<vec3>} min - The minimum of the grid bounds.
|
|
58
|
+
* @param {Node<vec3>} max - The maximum of the grid bounds.
|
|
59
|
+
* @param {Node<vec3>} res - The probe resolution.
|
|
60
|
+
* @param {Node<float>} intensity - The intensity.
|
|
61
|
+
* @param {Node<vec3>} position - The world-space position.
|
|
62
|
+
* @param {Node<vec3>} normal - The world-space normal.
|
|
63
|
+
* @return {Node<vec3>} The irradiance.
|
|
64
|
+
*/
|
|
65
|
+
function getGridIrradiance( light, min, max, res, intensity, position, normal ) {
|
|
66
|
+
|
|
67
|
+
const range = max.sub( min );
|
|
68
|
+
const spacing = range.div( res );
|
|
69
|
+
|
|
70
|
+
// Offset along the normal by half a probe spacing. The bounds hold one cell per
|
|
71
|
+
// probe, so they map directly to the probe grid; clamp to the outermost texel centers.
|
|
72
|
+
|
|
73
|
+
const samplePos = position.add( normal.mul( spacing ).mul( 0.5 ) );
|
|
74
|
+
const halfTexel = vec3( 0.5 ).div( res );
|
|
75
|
+
const uvw = samplePos.sub( min ).div( range ).clamp( halfTexel, halfTexel.oneMinus() );
|
|
76
|
+
|
|
77
|
+
return evaluateGridIrradiance( texture3D( light.texture ), uvw, res, normal ).mul( intensity );
|
|
78
|
+
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
* Returns the irradiance of a baked {@link LightProbeGrid} at the given world-space
|
|
83
|
+
* position and normal. Use this to evaluate the grid outside of the lighting context,
|
|
84
|
+
* e.g. when baking light maps with {@link LightMapper}.
|
|
85
|
+
*
|
|
86
|
+
* @param {LightProbeGrid} light - The baked light probe grid.
|
|
87
|
+
* @param {Node<vec3>} position - The world-space position.
|
|
88
|
+
* @param {Node<vec3>} normal - The world-space normal.
|
|
89
|
+
* @return {Node<vec3>} The irradiance.
|
|
90
|
+
*/
|
|
91
|
+
export function lightProbeGridIrradiance( light, position, normal ) {
|
|
92
|
+
|
|
93
|
+
const box = light.boundingBox;
|
|
94
|
+
|
|
95
|
+
return getGridIrradiance( light, uniform( box.min ), uniform( box.max ), uniform( light.resolution ), uniform( light.intensity ), position, normal );
|
|
96
|
+
|
|
97
|
+
}
|
|
98
|
+
|
|
52
99
|
/**
|
|
53
100
|
* The light node that applies a {@link LightProbeGrid} to the scene. It samples
|
|
54
101
|
* the baked L2 spherical-harmonic atlas at the surface position and adds the
|
|
@@ -71,11 +118,15 @@ class LightProbeGridNode extends AnalyticLightNode {
|
|
|
71
118
|
|
|
72
119
|
super( light );
|
|
73
120
|
|
|
121
|
+
// Bounce grid intensity changes between bake passes within a frame.
|
|
122
|
+
|
|
74
123
|
this._min = uniform( new Vector3() );
|
|
75
124
|
this._max = uniform( new Vector3() );
|
|
76
125
|
this._resolution = uniform( new Vector3() );
|
|
77
|
-
this._intensity = uniform( 1 );
|
|
78
|
-
this.
|
|
126
|
+
this._intensity = uniform( 1 ).setGroup( renderGroup );
|
|
127
|
+
this._priority = uniform( 0 ).setGroup( renderGroup );
|
|
128
|
+
|
|
129
|
+
this.updateType = NodeUpdateType.RENDER;
|
|
79
130
|
|
|
80
131
|
}
|
|
81
132
|
|
|
@@ -87,7 +138,7 @@ class LightProbeGridNode extends AnalyticLightNode {
|
|
|
87
138
|
this._max.value.copy( light.boundingBox.max );
|
|
88
139
|
this._resolution.value.copy( light.resolution );
|
|
89
140
|
this._intensity.value = light.intensity;
|
|
90
|
-
this.
|
|
141
|
+
this._priority.value = light.priority;
|
|
91
142
|
|
|
92
143
|
}
|
|
93
144
|
|
|
@@ -95,39 +146,35 @@ class LightProbeGridNode extends AnalyticLightNode {
|
|
|
95
146
|
|
|
96
147
|
const light = this.light;
|
|
97
148
|
|
|
98
|
-
// No baked data yet: contribute nothing.
|
|
99
|
-
|
|
100
|
-
if ( light.texture === null ) return;
|
|
101
|
-
|
|
102
149
|
const min = this._min;
|
|
103
150
|
const max = this._max;
|
|
104
151
|
const res = this._resolution;
|
|
105
152
|
|
|
106
|
-
const
|
|
107
|
-
const resMinusOne = res.sub( 1.0 );
|
|
108
|
-
const spacing = range.div( resMinusOne );
|
|
109
|
-
|
|
110
|
-
// Offset along the normal by half a probe spacing, then remap to texel centers.
|
|
111
|
-
|
|
153
|
+
const spacing = max.sub( min ).div( res );
|
|
112
154
|
const samplePos = positionWorld.add( normalWorld.mul( spacing ).mul( 0.5 ) );
|
|
113
|
-
const uvw = samplePos.sub( min ).div( range ).clamp( 0.0, 1.0 ).mul( resMinusOne ).div( res ).add( vec3( 0.5 ).div( res ) );
|
|
114
155
|
|
|
115
|
-
|
|
156
|
+
// Grow the bounds by 1% of a cell, so fragments on the bounds aren't left out by
|
|
157
|
+
// precision errors or samples outside of the triangle.
|
|
158
|
+
|
|
159
|
+
const margin = spacing.mul( 0.01 );
|
|
160
|
+
const inside = samplePos.greaterThanEqual( min.sub( margin ) ).all().and( samplePos.lessThanEqual( max.add( margin ) ).all() );
|
|
116
161
|
|
|
117
|
-
|
|
162
|
+
builder.context.lightProbeIrradiance ||= vec3().toVar( 'lightProbeIrradiance' );
|
|
163
|
+
builder.context.lightProbePriority ||= INFINITY.negate().toVar( 'lightProbePriority' );
|
|
118
164
|
|
|
119
|
-
|
|
165
|
+
const prioritized = this._priority.greaterThanEqual( builder.context.lightProbePriority );
|
|
120
166
|
|
|
121
|
-
|
|
167
|
+
If( inside.and( prioritized ), () => {
|
|
122
168
|
|
|
123
|
-
const
|
|
124
|
-
const weight = outside.length().smoothstep( 0.0, this._falloff ).oneMinus();
|
|
169
|
+
const irradiance = getGridIrradiance( light, min, max, res, this._intensity, positionWorld, normalWorld ).toConst();
|
|
125
170
|
|
|
126
|
-
|
|
171
|
+
// fragments can be located in multiple grids but only the one with the highest priority defines the irradiance,
|
|
172
|
+
// on ties the most recently created grid wins, see #34798
|
|
127
173
|
|
|
128
|
-
|
|
174
|
+
builder.context.lightProbeIrradiance.assign( irradiance );
|
|
175
|
+
builder.context.lightProbePriority.assign( this._priority );
|
|
129
176
|
|
|
130
|
-
|
|
177
|
+
} );
|
|
131
178
|
|
|
132
179
|
}
|
|
133
180
|
|
|
@@ -5,16 +5,22 @@ import {
|
|
|
5
5
|
Plane,
|
|
6
6
|
Line3,
|
|
7
7
|
DepthTexture,
|
|
8
|
+
Compatibility,
|
|
8
9
|
LessCompare,
|
|
10
|
+
GreaterEqualCompare,
|
|
11
|
+
LinearFilter,
|
|
12
|
+
NearestFilter,
|
|
13
|
+
PCFShadowMap,
|
|
9
14
|
Vector2,
|
|
10
15
|
RedFormat,
|
|
11
16
|
ArrayCamera,
|
|
12
17
|
VSMShadowMap,
|
|
13
18
|
RendererUtils,
|
|
14
|
-
Quaternion
|
|
19
|
+
Quaternion,
|
|
20
|
+
UnsignedIntType
|
|
15
21
|
} from 'three/webgpu';
|
|
16
22
|
|
|
17
|
-
import {
|
|
23
|
+
import { Fn, int, lightShadowMatrix, mix, normalWorld, reference, renderGroup, shadow, shadowPositionWorld, texture, vec2, vec3, vec4, NodeUpdateType } from 'three/tsl';
|
|
18
24
|
|
|
19
25
|
const { resetRendererAndSceneState, restoreRendererAndSceneState } = RendererUtils;
|
|
20
26
|
let _rendererState;
|
|
@@ -57,6 +63,7 @@ class TileShadowNode extends ShadowBaseNode {
|
|
|
57
63
|
* @param {number} [options.tilesX=2] - The number of tiles along the X-axis.
|
|
58
64
|
* @param {number} [options.tilesY=2] - The number of tiles along the Y-axis.
|
|
59
65
|
* @param {Object} [options.resolution] - The resolution of the shadow map.
|
|
66
|
+
* @param {number} [options.depthType=UnsignedIntType] - The type of the tile depth texture. `UnsignedShortType` halves the memory when the depth range allows it.
|
|
60
67
|
* @param {boolean} [options.debug=false] - Whether to enable debug mode.
|
|
61
68
|
*/
|
|
62
69
|
constructor( light, options = {} ) {
|
|
@@ -68,6 +75,7 @@ class TileShadowNode extends ShadowBaseNode {
|
|
|
68
75
|
tilesX: options.tilesX || 2,
|
|
69
76
|
tilesY: options.tilesY || 2,
|
|
70
77
|
resolution: options.resolution || light.shadow.mapSize,
|
|
78
|
+
depthType: options.depthType || UnsignedIntType,
|
|
71
79
|
debug: options.debug !== undefined ? options.debug : false
|
|
72
80
|
};
|
|
73
81
|
|
|
@@ -159,12 +167,14 @@ class TileShadowNode extends ShadowBaseNode {
|
|
|
159
167
|
// Clear existing lights/nodes if re-initializing
|
|
160
168
|
this.disposeLightsAndNodes();
|
|
161
169
|
|
|
162
|
-
const depthTexture = new DepthTexture( shadowWidth, shadowHeight,
|
|
163
|
-
depthTexture.compareFunction = LessCompare;
|
|
170
|
+
const depthTexture = new DepthTexture( shadowWidth, shadowHeight, this.config.depthType, undefined, undefined, undefined, undefined, undefined, undefined, undefined, tileCount );
|
|
171
|
+
depthTexture.compareFunction = builder.renderer.reversedDepthBuffer ? GreaterEqualCompare : LessCompare;
|
|
164
172
|
depthTexture.name = 'ShadowDepthArrayTexture';
|
|
165
|
-
|
|
173
|
+
// The color attachment is only sampled for transmitted shadows.
|
|
174
|
+
const count = builder.renderer.shadowMap.transmitted === true ? 1 : 0;
|
|
175
|
+
const shadowMap = builder.createRenderTarget( shadowWidth, shadowHeight, { count, format: RedFormat, depth: tileCount, useArrayDepthTexture: true } );
|
|
166
176
|
shadowMap.depthTexture = depthTexture;
|
|
167
|
-
shadowMap.texture.name = 'ShadowTexture';
|
|
177
|
+
if ( count > 0 ) shadowMap.texture.name = 'ShadowTexture';
|
|
168
178
|
this.shadowMap = shadowMap;
|
|
169
179
|
const cameras = [];
|
|
170
180
|
|
|
@@ -221,6 +231,10 @@ class TileShadowNode extends ShadowBaseNode {
|
|
|
221
231
|
const cameraArray = new ArrayCamera( cameras );
|
|
222
232
|
this.cameraArray = cameraArray;
|
|
223
233
|
|
|
234
|
+
// setup() reads depth through this camera.
|
|
235
|
+
light.shadow.camera.coordinateSystem = builder.renderer.coordinateSystem;
|
|
236
|
+
light.shadow.camera._reversedDepth = builder.renderer.reversedDepthBuffer;
|
|
237
|
+
|
|
224
238
|
}
|
|
225
239
|
|
|
226
240
|
/**
|
|
@@ -259,6 +273,11 @@ class TileShadowNode extends ShadowBaseNode {
|
|
|
259
273
|
|
|
260
274
|
}
|
|
261
275
|
|
|
276
|
+
// The original light does not render a shadow map, but setup() uses its shadow matrix.
|
|
277
|
+
|
|
278
|
+
shadowCam.updateProjectionMatrix();
|
|
279
|
+
light.shadow.updateMatrices( light );
|
|
280
|
+
|
|
262
281
|
}
|
|
263
282
|
|
|
264
283
|
/**
|
|
@@ -270,14 +289,15 @@ class TileShadowNode extends ShadowBaseNode {
|
|
|
270
289
|
const { shadowMap, light } = this;
|
|
271
290
|
const { renderer, scene, camera } = frame;
|
|
272
291
|
const shadowType = renderer.shadowMap.type;
|
|
273
|
-
const depthVersion = shadowMap.depthTexture.version;
|
|
274
|
-
this._depthVersionCached = depthVersion;
|
|
275
292
|
const currentRenderObjectFunction = renderer.getRenderObjectFunction();
|
|
276
293
|
|
|
277
294
|
_rendererState = resetRendererAndSceneState( renderer, scene, _rendererState );
|
|
278
295
|
scene.overrideMaterial = this.getShadowMaterial();
|
|
279
296
|
renderer.setRenderTarget( this.shadowMap );
|
|
280
297
|
|
|
298
|
+
const cameraArrayLayers = this.cameraArray.layers.mask;
|
|
299
|
+
this.cameraArray.layers.mask = 0;
|
|
300
|
+
|
|
281
301
|
for ( let index = 0; index < this.lights.length; index ++ ) {
|
|
282
302
|
|
|
283
303
|
const light = this.lights[ index ];
|
|
@@ -294,6 +314,9 @@ class TileShadowNode extends ShadowBaseNode {
|
|
|
294
314
|
|
|
295
315
|
shadow.updateMatrices( light );
|
|
296
316
|
|
|
317
|
+
// The tiles render through the array camera, so it has to see every tile's layers.
|
|
318
|
+
this.cameraArray.layers.mask |= shadow.camera.layers.mask;
|
|
319
|
+
|
|
297
320
|
renderer.setRenderObjectFunction( this.getShadowRenderObjectFunction( renderer, shadow ) );
|
|
298
321
|
this.shadowMap.setSize( shadow.mapSize.width, shadow.mapSize.height, shadowMap.depth );
|
|
299
322
|
|
|
@@ -311,6 +334,8 @@ class TileShadowNode extends ShadowBaseNode {
|
|
|
311
334
|
|
|
312
335
|
restoreRendererAndSceneState( renderer, scene, _rendererState );
|
|
313
336
|
|
|
337
|
+
this.cameraArray.layers.mask = cameraArrayLayers;
|
|
338
|
+
|
|
314
339
|
for ( let index = 0; index < this.lights.length; index ++ ) {
|
|
315
340
|
|
|
316
341
|
const light = this.lights[ index ];
|
|
@@ -352,11 +377,7 @@ class TileShadowNode extends ShadowBaseNode {
|
|
|
352
377
|
this.update();
|
|
353
378
|
this.updateShadow( frame );
|
|
354
379
|
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
shadow.needsUpdate = false;
|
|
358
|
-
|
|
359
|
-
}
|
|
380
|
+
shadow.needsUpdate = false;
|
|
360
381
|
|
|
361
382
|
}
|
|
362
383
|
|
|
@@ -400,10 +421,77 @@ class TileShadowNode extends ShadowBaseNode {
|
|
|
400
421
|
|
|
401
422
|
}
|
|
402
423
|
|
|
424
|
+
// Hardware-filtered depth comparisons for PCF, as in ShadowNode. The shadow type can change between
|
|
425
|
+
// builds, so this is checked every time; disposing the shadow map recreates it with the new filter.
|
|
426
|
+
|
|
427
|
+
const { renderer } = builder;
|
|
428
|
+
const filter = renderer.shadowMap.type === PCFShadowMap && renderer.hasCompatibility( Compatibility.TEXTURE_COMPARE ) ? LinearFilter : NearestFilter;
|
|
429
|
+
const depthTexture = this.shadowMap.depthTexture;
|
|
430
|
+
|
|
431
|
+
if ( depthTexture.magFilter !== filter ) {
|
|
432
|
+
|
|
433
|
+
depthTexture.minFilter = filter;
|
|
434
|
+
depthTexture.magFilter = filter;
|
|
435
|
+
|
|
436
|
+
this.shadowMap.dispose();
|
|
437
|
+
|
|
438
|
+
}
|
|
439
|
+
|
|
403
440
|
return Fn( ( builder ) => {
|
|
404
441
|
|
|
405
442
|
this.setupShadowPosition( builder );
|
|
406
|
-
|
|
443
|
+
|
|
444
|
+
// The fragment's position in the full shadow camera gives its tile and the coordinate within it.
|
|
445
|
+
|
|
446
|
+
const { tilesX, tilesY } = this.config;
|
|
447
|
+
const tileShadowNode = this._shadowNodes[ 0 ];
|
|
448
|
+
const tileShadow = this.lights[ 0 ].shadow;
|
|
449
|
+
const shadow = this.originalLight.shadow;
|
|
450
|
+
const normalBias = reference( 'normalBias', 'float', shadow ).setGroup( renderGroup );
|
|
451
|
+
|
|
452
|
+
const shadowPosition = lightShadowMatrix( this.originalLight ).mul( vec4( shadowPositionWorld.add( normalWorld.mul( normalBias ) ), 1 ) );
|
|
453
|
+
const shadowCoord = tileShadowNode.setupShadowCoord( builder, shadowPosition );
|
|
454
|
+
|
|
455
|
+
const grid = shadowCoord.xy.mul( vec2( tilesX, tilesY ) ); // tiles start from the top row
|
|
456
|
+
const tile = grid.floor().clamp( vec2( 0 ), vec2( tilesX - 1, tilesY - 1 ) );
|
|
457
|
+
const depthLayer = int( tile.y.mul( tilesX ).add( tile.x ) );
|
|
458
|
+
|
|
459
|
+
const tileCoord = vec3( grid.sub( tile ), shadowCoord.z );
|
|
460
|
+
|
|
461
|
+
const filterFn = tileShadow.filterNode || tileShadowNode.getShadowFilterFn( builder.renderer.shadowMap.type );
|
|
462
|
+
const shadowValue = tileShadowNode.setupShadowFilter( builder, {
|
|
463
|
+
filterFn,
|
|
464
|
+
depthTexture,
|
|
465
|
+
shadowCoord: tileCoord,
|
|
466
|
+
shadow: tileShadow,
|
|
467
|
+
depthLayer
|
|
468
|
+
} );
|
|
469
|
+
|
|
470
|
+
const shadowIntensity = reference( 'intensity', 'float', shadow ).setGroup( renderGroup );
|
|
471
|
+
|
|
472
|
+
let shadowOutput;
|
|
473
|
+
|
|
474
|
+
if ( builder.renderer.shadowMap.transmitted === true ) {
|
|
475
|
+
|
|
476
|
+
const shadowColor = texture( this.shadowMap.texture, tileCoord ).depth( depthLayer );
|
|
477
|
+
|
|
478
|
+
shadowOutput = mix( 1, shadowValue.rgb.mix( shadowColor, 1 ), shadowIntensity.mul( shadowColor.a ) ).toVar( 'shadowValue' );
|
|
479
|
+
|
|
480
|
+
} else {
|
|
481
|
+
|
|
482
|
+
shadowOutput = mix( 1, shadowValue, shadowIntensity ).toVar( 'shadowValue' );
|
|
483
|
+
|
|
484
|
+
}
|
|
485
|
+
|
|
486
|
+
// As in ShadowNode.setup(), which the tiles no longer go through.
|
|
487
|
+
|
|
488
|
+
if ( builder.material.receivedShadowNode ) {
|
|
489
|
+
|
|
490
|
+
shadowOutput = builder.material.receivedShadowNode( shadowOutput );
|
|
491
|
+
|
|
492
|
+
}
|
|
493
|
+
|
|
494
|
+
return shadowOutput;
|
|
407
495
|
|
|
408
496
|
} )();
|
|
409
497
|
|