@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
|
@@ -8,12 +8,13 @@ import { float, pow4 } from '../tsl/TSLBase.js';
|
|
|
8
8
|
import { bentNormalView } from '../accessors/AccessorsUtils.js';
|
|
9
9
|
import { pmremTexture } from '../pmrem/PMREMNode.js';
|
|
10
10
|
import { materialEnvIntensity } from '../accessors/MaterialProperties.js';
|
|
11
|
+
import { NodeUpdateType } from '../core/constants.js';
|
|
11
12
|
|
|
12
13
|
const _rendererCache = new WeakMap();
|
|
13
14
|
|
|
14
15
|
/**
|
|
15
16
|
* Represents a physical model for Image-based lighting (IBL). The environment
|
|
16
|
-
* is defined
|
|
17
|
+
* is defined by an equirectangular or cube texture.
|
|
17
18
|
* `EnvironmentNode` is intended for PBR materials like {@link MeshStandardNodeMaterial}.
|
|
18
19
|
*
|
|
19
20
|
* @augments LightingNode
|
|
@@ -43,6 +44,16 @@ class EnvironmentNode extends LightingNode {
|
|
|
43
44
|
*/
|
|
44
45
|
this.envNode = envNode;
|
|
45
46
|
|
|
47
|
+
/**
|
|
48
|
+
* The PMREM node of a texture or material reference environment. Its texture is
|
|
49
|
+
* resolved before rendering since materials with different environments can share a shader.
|
|
50
|
+
*
|
|
51
|
+
* @private
|
|
52
|
+
* @type {?PMREMNode}
|
|
53
|
+
* @default null
|
|
54
|
+
*/
|
|
55
|
+
this._pmremNode = null;
|
|
56
|
+
|
|
46
57
|
}
|
|
47
58
|
|
|
48
59
|
setup( builder ) {
|
|
@@ -53,21 +64,22 @@ class EnvironmentNode extends LightingNode {
|
|
|
53
64
|
|
|
54
65
|
if ( envNode.isTextureNode || envNode.isMaterialReferenceNode ) {
|
|
55
66
|
|
|
56
|
-
const value = ( envNode.isTextureNode ) ? envNode.value : material[ envNode.property ];
|
|
57
|
-
|
|
58
67
|
const cache = this._getPMREMNodeCache( builder.renderer );
|
|
59
68
|
|
|
60
|
-
let
|
|
69
|
+
let pmremNode = cache.get( envNode );
|
|
61
70
|
|
|
62
|
-
if (
|
|
71
|
+
if ( pmremNode === undefined ) {
|
|
63
72
|
|
|
64
|
-
|
|
73
|
+
pmremNode = pmremTexture( this._getEnvTexture( builder ) );
|
|
65
74
|
|
|
66
|
-
cache.set(
|
|
75
|
+
cache.set( envNode, pmremNode );
|
|
67
76
|
|
|
68
77
|
}
|
|
69
78
|
|
|
70
|
-
|
|
79
|
+
this._pmremNode = pmremNode;
|
|
80
|
+
this.updateBeforeType = envNode.isMaterialReferenceNode ? NodeUpdateType.OBJECT : NodeUpdateType.RENDER;
|
|
81
|
+
|
|
82
|
+
envNode = pmremNode;
|
|
71
83
|
|
|
72
84
|
}
|
|
73
85
|
|
|
@@ -111,6 +123,44 @@ class EnvironmentNode extends LightingNode {
|
|
|
111
123
|
|
|
112
124
|
}
|
|
113
125
|
|
|
126
|
+
updateBefore( frame ) {
|
|
127
|
+
|
|
128
|
+
const texture = this._getEnvTexture( frame );
|
|
129
|
+
|
|
130
|
+
// the texture can be removed without a rebuild of the material
|
|
131
|
+
|
|
132
|
+
if ( texture && this._pmremNode.value !== texture ) {
|
|
133
|
+
|
|
134
|
+
this._pmremNode.value = texture;
|
|
135
|
+
this._pmremNode.updateBefore( frame );
|
|
136
|
+
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
/**
|
|
142
|
+
* Returns the current texture of the environment node.
|
|
143
|
+
*
|
|
144
|
+
* @private
|
|
145
|
+
* @param {(NodeFrame|NodeBuilder)} state - The current state.
|
|
146
|
+
* @return {Texture} The environment texture.
|
|
147
|
+
*/
|
|
148
|
+
_getEnvTexture( state ) {
|
|
149
|
+
|
|
150
|
+
const envNode = this.envNode;
|
|
151
|
+
|
|
152
|
+
if ( envNode.isMaterialReferenceNode ) {
|
|
153
|
+
|
|
154
|
+
envNode.updateReference( state );
|
|
155
|
+
|
|
156
|
+
return envNode.getValueFromReference();
|
|
157
|
+
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
return envNode.value;
|
|
161
|
+
|
|
162
|
+
}
|
|
163
|
+
|
|
114
164
|
/**
|
|
115
165
|
* Returns the PMREM node cache of the current renderer.
|
|
116
166
|
*
|
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
import SpotLightNode from './SpotLightNode.js';
|
|
2
2
|
import { texture } from '../accessors/TextureNode.js';
|
|
3
|
-
import {
|
|
3
|
+
import { textureSize } from '../accessors/TextureSizeNode.js';
|
|
4
|
+
import { float, vec2 } from '../tsl/TSLBase.js';
|
|
5
|
+
import { atan } from '../math/MathNode.js';
|
|
6
|
+
import { remap } from '../utils/Remap.js';
|
|
4
7
|
|
|
5
8
|
/**
|
|
6
9
|
* An IES version of the default spot light node.
|
|
@@ -49,11 +52,23 @@ class IESSpotLightNode extends SpotLightNode {
|
|
|
49
52
|
|
|
50
53
|
if ( iesMap && iesMap.isTexture === true ) {
|
|
51
54
|
|
|
52
|
-
|
|
55
|
+
// the light space coordinate used for projected maps, centered on the forward axis twist calculation
|
|
56
|
+
const lightCoord = this.getLightCoord( builder ).sub( 0.5 );
|
|
53
57
|
|
|
54
|
-
this._iesTextureNode = texture( iesMap
|
|
58
|
+
this._iesTextureNode = texture( iesMap );
|
|
55
59
|
|
|
56
|
-
|
|
60
|
+
// get the width of half a texel in uv
|
|
61
|
+
const texelInset = float( 0.5 ).div( vec2( textureSize( this._iesTextureNode ) ) );
|
|
62
|
+
|
|
63
|
+
// the twist angle around the light's forward axis, mapping from [0, 359]deg texels
|
|
64
|
+
// offset by half a texel so we start at the center of the first texel
|
|
65
|
+
const twistAngle = remap( atan( lightCoord.y, lightCoord.x ), - Math.PI, Math.PI ).add( texelInset.y );
|
|
66
|
+
|
|
67
|
+
// the tilt angle off the forward axis spanning from [0, 180]deg
|
|
68
|
+
// inset by half a texel on each side so we're clamping to the center of the extreme texels
|
|
69
|
+
const tiltAngle = remap( angleCosine.acos(), 0, Math.PI, texelInset.x, float( 1 ).sub( texelInset.x ) );
|
|
70
|
+
|
|
71
|
+
spotAttenuation = this._iesTextureNode.sample( vec2( tiltAngle, twistAngle ) ).level( 0 ).r;
|
|
57
72
|
|
|
58
73
|
} else {
|
|
59
74
|
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import AnalyticLightNode from './AnalyticLightNode.js';
|
|
2
2
|
import { normalWorld } from '../accessors/Normal.js';
|
|
3
3
|
import { uniformArray } from '../accessors/UniformArrayNode.js';
|
|
4
|
+
import { renderGroup } from '../core/UniformGroupNode.js';
|
|
4
5
|
import { Vector3 } from '../../math/Vector3.js';
|
|
5
6
|
import getShIrradianceAt from '../functions/material/getShIrradianceAt.js';
|
|
6
7
|
|
|
@@ -35,7 +36,7 @@ class LightProbeNode extends AnalyticLightNode {
|
|
|
35
36
|
*
|
|
36
37
|
* @type {UniformArrayNode}
|
|
37
38
|
*/
|
|
38
|
-
this.lightProbe = uniformArray( array );
|
|
39
|
+
this.lightProbe = uniformArray( array ).setGroup( renderGroup );
|
|
39
40
|
|
|
40
41
|
}
|
|
41
42
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { Fn } from '../tsl/TSLBase.js';
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
|
-
*
|
|
4
|
+
* Calculates, at a given distance from a light, the falloff of the light's brightness.
|
|
5
5
|
*
|
|
6
6
|
* @method
|
|
7
7
|
* @param {Object} inputs - The input parameter object.
|
|
@@ -22,4 +22,4 @@ export const getDistanceAttenuation = /*@__PURE__*/ Fn( ( { lightDistance, cutof
|
|
|
22
22
|
distanceFalloff
|
|
23
23
|
);
|
|
24
24
|
|
|
25
|
-
} ); // validated
|
|
25
|
+
}, { lightDistance: 'float', cutoffDistance: 'float', decayExponent: 'float', return: 'float' } ); // validated
|
|
@@ -138,6 +138,12 @@ class LightsNode extends Node {
|
|
|
138
138
|
|
|
139
139
|
}
|
|
140
140
|
|
|
141
|
+
isCacheable( /*builder*/ ) {
|
|
142
|
+
|
|
143
|
+
return false;
|
|
144
|
+
|
|
145
|
+
}
|
|
146
|
+
|
|
141
147
|
/**
|
|
142
148
|
* Overwrites the default {@link Node#customCacheKey} implementation by including
|
|
143
149
|
* light data into the cache key.
|
|
@@ -155,6 +161,17 @@ class LightsNode extends Node {
|
|
|
155
161
|
_hashData.push( light.id );
|
|
156
162
|
_hashData.push( light.castShadow ? 1 : 0 );
|
|
157
163
|
|
|
164
|
+
if ( light.castShadow === true ) {
|
|
165
|
+
|
|
166
|
+
// force rebuild on version change to avoid the usage of removed shadow nodes
|
|
167
|
+
|
|
168
|
+
const lightNode = _lightsNodeRef.get( light );
|
|
169
|
+
const lightVersion = ( lightNode ) ? lightNode.version : 0; // light nodes start at version 0, see #35019
|
|
170
|
+
|
|
171
|
+
_hashData.push( lightVersion );
|
|
172
|
+
|
|
173
|
+
}
|
|
174
|
+
|
|
158
175
|
if ( light.isSpotLight === true ) {
|
|
159
176
|
|
|
160
177
|
const hashMap = ( light.map !== null ) ? light.map.id : - 1;
|
|
@@ -206,26 +223,6 @@ class LightsNode extends Node {
|
|
|
206
223
|
|
|
207
224
|
}
|
|
208
225
|
|
|
209
|
-
/**
|
|
210
|
-
* Analyzes the node's dependencies by building all nested light nodes
|
|
211
|
-
* and the output node.
|
|
212
|
-
*
|
|
213
|
-
* @param {NodeBuilder} builder - A reference to the current node builder.
|
|
214
|
-
*/
|
|
215
|
-
analyze( builder ) {
|
|
216
|
-
|
|
217
|
-
const properties = builder.getNodeProperties( this );
|
|
218
|
-
|
|
219
|
-
for ( const node of properties.nodes ) {
|
|
220
|
-
|
|
221
|
-
node.build( builder );
|
|
222
|
-
|
|
223
|
-
}
|
|
224
|
-
|
|
225
|
-
properties.outputNode.build( builder );
|
|
226
|
-
|
|
227
|
-
}
|
|
228
|
-
|
|
229
226
|
/**
|
|
230
227
|
* Creates lighting nodes for each scene light. This makes it possible to further
|
|
231
228
|
* process lights in the node system.
|
|
@@ -244,7 +241,6 @@ class LightsNode extends Node {
|
|
|
244
241
|
const builtinLights = this.getBuiltinLights();
|
|
245
242
|
|
|
246
243
|
const lights = sortLights( [ ...materialLightings, ...builtinLights ] );
|
|
247
|
-
const nodeLibrary = builder.renderer.library;
|
|
248
244
|
|
|
249
245
|
for ( const light of lights ) {
|
|
250
246
|
|
|
@@ -264,9 +260,9 @@ class LightsNode extends Node {
|
|
|
264
260
|
|
|
265
261
|
if ( lightNode === null ) {
|
|
266
262
|
|
|
267
|
-
const lightNodeClass =
|
|
263
|
+
const lightNodeClass = light._lightNode;
|
|
268
264
|
|
|
269
|
-
if ( lightNodeClass ===
|
|
265
|
+
if ( lightNodeClass === undefined ) {
|
|
270
266
|
|
|
271
267
|
warn( `LightsNode.setupNodeLights: Light node not found for ${ light.constructor.name }` );
|
|
272
268
|
continue;
|
|
@@ -346,6 +342,12 @@ class LightsNode extends Node {
|
|
|
346
342
|
|
|
347
343
|
}
|
|
348
344
|
|
|
345
|
+
if ( builder.context.lightProbeIrradiance !== undefined ) {
|
|
346
|
+
|
|
347
|
+
builder.context.irradiance.addAssign( builder.context.lightProbeIrradiance );
|
|
348
|
+
|
|
349
|
+
}
|
|
350
|
+
|
|
349
351
|
}
|
|
350
352
|
|
|
351
353
|
getLightNodes( builder ) {
|
|
@@ -381,17 +383,13 @@ class LightsNode extends Node {
|
|
|
381
383
|
const context = builder.context;
|
|
382
384
|
const lightingModel = context.lightingModel;
|
|
383
385
|
|
|
384
|
-
const properties = builder.getNodeProperties( this );
|
|
385
|
-
|
|
386
386
|
if ( lightingModel ) {
|
|
387
387
|
|
|
388
388
|
const { totalDiffuseNode, totalSpecularNode } = this;
|
|
389
389
|
|
|
390
390
|
context.outgoingLight = outgoingLightNode;
|
|
391
391
|
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
properties.nodes = stack.nodes;
|
|
392
|
+
builder.addStack();
|
|
395
393
|
|
|
396
394
|
lightingModel.start( builder );
|
|
397
395
|
|
|
@@ -423,10 +421,6 @@ class LightsNode extends Node {
|
|
|
423
421
|
|
|
424
422
|
outgoingLightNode = outgoingLightNode.bypass( builder.removeStack() );
|
|
425
423
|
|
|
426
|
-
} else {
|
|
427
|
-
|
|
428
|
-
properties.nodes = [];
|
|
429
|
-
|
|
430
424
|
}
|
|
431
425
|
|
|
432
426
|
builder.lightsNode = currentLightsNode;
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import ShadowNode from './ShadowNode.js';
|
|
2
|
+
import { Loop } from '../utils/LoopNode.js';
|
|
2
3
|
import { uniform } from '../core/UniformNode.js';
|
|
3
4
|
import { float, vec3, If, Fn } from '../tsl/TSLBase.js';
|
|
4
5
|
import { reference } from '../accessors/ReferenceNode.js';
|
|
@@ -11,8 +12,8 @@ import { BasicShadowMap, GreaterEqualCompare, LessEqualCompare, WebGPUCoordinate
|
|
|
11
12
|
import { CubeDepthTexture } from '../../textures/CubeDepthTexture.js';
|
|
12
13
|
import { screenCoordinate } from '../display/ScreenNode.js';
|
|
13
14
|
import { interleavedGradientNoise, vogelDiskSample } from '../utils/PostProcessingUtils.js';
|
|
14
|
-
import { abs, normalize, cross } from '../math/MathNode.js';
|
|
15
|
-
import { viewZToLogarithmicDepth
|
|
15
|
+
import { abs, normalize, cross, max } from '../math/MathNode.js';
|
|
16
|
+
import { viewZToLogarithmicDepth } from '../display/ViewportDepthNode.js';
|
|
16
17
|
|
|
17
18
|
const _clearColor = /*@__PURE__*/ new Color();
|
|
18
19
|
const _projScreenMatrix = /*@__PURE__*/ new Matrix4();
|
|
@@ -21,15 +22,15 @@ const _lookTarget = /*@__PURE__*/ new Vector3();
|
|
|
21
22
|
|
|
22
23
|
// Cube map face directions and up vectors for point light shadows
|
|
23
24
|
// Face order: +X, -X, +Y, -Y, +Z, -Z
|
|
24
|
-
// WebGPU coordinate system -
|
|
25
|
+
// WebGPU coordinate system - same face orientations as CubeCamera
|
|
25
26
|
const _cubeDirectionsWebGPU = [
|
|
26
|
-
/*@__PURE__*/ new Vector3( 1, 0, 0 ), /*@__PURE__*/ new Vector3(
|
|
27
|
-
/*@__PURE__*/ new Vector3( 0, 1, 0 ), /*@__PURE__*/ new Vector3( 0, 0, 1 ), /*@__PURE__*/ new Vector3( 0, 0, - 1 )
|
|
27
|
+
/*@__PURE__*/ new Vector3( - 1, 0, 0 ), /*@__PURE__*/ new Vector3( 1, 0, 0 ), /*@__PURE__*/ new Vector3( 0, 1, 0 ),
|
|
28
|
+
/*@__PURE__*/ new Vector3( 0, - 1, 0 ), /*@__PURE__*/ new Vector3( 0, 0, 1 ), /*@__PURE__*/ new Vector3( 0, 0, - 1 )
|
|
28
29
|
];
|
|
29
30
|
|
|
30
31
|
const _cubeUpsWebGPU = [
|
|
31
|
-
/*@__PURE__*/ new Vector3( 0,
|
|
32
|
-
/*@__PURE__*/ new Vector3( 0, 0, 1 ), /*@__PURE__*/ new Vector3( 0,
|
|
32
|
+
/*@__PURE__*/ new Vector3( 0, 1, 0 ), /*@__PURE__*/ new Vector3( 0, 1, 0 ), /*@__PURE__*/ new Vector3( 0, 0, - 1 ),
|
|
33
|
+
/*@__PURE__*/ new Vector3( 0, 0, 1 ), /*@__PURE__*/ new Vector3( 0, 1, 0 ), /*@__PURE__*/ new Vector3( 0, 1, 0 )
|
|
33
34
|
];
|
|
34
35
|
|
|
35
36
|
// WebGL coordinate system - standard OpenGL convention
|
|
@@ -43,6 +44,55 @@ const _cubeUpsWebGL = [
|
|
|
43
44
|
/*@__PURE__*/ new Vector3( 0, 0, - 1 ), /*@__PURE__*/ new Vector3( 0, - 1, 0 ), /*@__PURE__*/ new Vector3( 0, - 1, 0 )
|
|
44
45
|
];
|
|
45
46
|
|
|
47
|
+
/**
|
|
48
|
+
* Returns a function that gives the depth the cube shadow map stores for the point at
|
|
49
|
+
* `direction * distance`, from the largest absolute component of the direction. Each face
|
|
50
|
+
* stores the depth along its own axis, and perspective depth is `depthA + depthB / max( |x|, |y|, |z| )`,
|
|
51
|
+
* so everything but the division is computed once.
|
|
52
|
+
*
|
|
53
|
+
* @private
|
|
54
|
+
* @param {Node<float>} distance - The distance from the light to the fragment.
|
|
55
|
+
* @param {Node<float>} near - The near plane of the shadow camera.
|
|
56
|
+
* @param {Node<float>} far - The far plane of the shadow camera.
|
|
57
|
+
* @param {Node<float>} bias - The shadow bias.
|
|
58
|
+
* @param {Renderer} renderer - The renderer.
|
|
59
|
+
* @return {function(Node<float>):Node<float>} The function, which takes the largest absolute component of the direction.
|
|
60
|
+
*/
|
|
61
|
+
const getPointShadowDepthFn = ( distance, near, far, bias, renderer ) => {
|
|
62
|
+
|
|
63
|
+
const { reversedDepthBuffer, logarithmicDepthBuffer } = renderer;
|
|
64
|
+
|
|
65
|
+
// logarithmic depth gets a separate depth function
|
|
66
|
+
|
|
67
|
+
if ( logarithmicDepthBuffer === true ) {
|
|
68
|
+
|
|
69
|
+
return ( maxAbs ) => viewZToLogarithmicDepth( maxAbs.mul( distance ).negate(), near, far ).add( bias );
|
|
70
|
+
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
// default and reverse depth share one
|
|
74
|
+
|
|
75
|
+
const depthRange = far.sub( near );
|
|
76
|
+
const nearFar = near.mul( far ).div( depthRange.mul( distance ) );
|
|
77
|
+
|
|
78
|
+
let depthA, depthB;
|
|
79
|
+
|
|
80
|
+
if ( reversedDepthBuffer === true ) {
|
|
81
|
+
|
|
82
|
+
depthA = near.div( depthRange ).add( bias ).negate().toConst();
|
|
83
|
+
depthB = nearFar.toConst();
|
|
84
|
+
|
|
85
|
+
} else {
|
|
86
|
+
|
|
87
|
+
depthA = far.div( depthRange ).add( bias ).toConst();
|
|
88
|
+
depthB = nearFar.negate().toConst();
|
|
89
|
+
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
return ( maxAbs ) => depthA.add( depthB.div( maxAbs ) );
|
|
93
|
+
|
|
94
|
+
};
|
|
95
|
+
|
|
46
96
|
export const BasicPointShadowFilter = /*@__PURE__*/ Fn( ( { depthTexture, bd3D, dp } ) => {
|
|
47
97
|
|
|
48
98
|
return cubeTexture( depthTexture, bd3D ).compare( dp );
|
|
@@ -59,38 +109,48 @@ export const BasicPointShadowFilter = /*@__PURE__*/ Fn( ( { depthTexture, bd3D,
|
|
|
59
109
|
* @param {Object} inputs - The input parameter object.
|
|
60
110
|
* @param {CubeDepthTexture} inputs.depthTexture - A reference to the shadow cube map.
|
|
61
111
|
* @param {Node<vec3>} inputs.bd3D - The normalized direction from light to fragment.
|
|
62
|
-
* @param {Node<float>} inputs.
|
|
112
|
+
* @param {Node<float>} inputs.distance - The distance from the light to the fragment.
|
|
63
113
|
* @param {LightShadow} inputs.shadow - The light shadow.
|
|
64
114
|
* @return {Node<float>} The filtering result.
|
|
65
115
|
*/
|
|
66
|
-
export const PointShadowFilter = /*@__PURE__*/ Fn( ( { depthTexture, bd3D,
|
|
116
|
+
export const PointShadowFilter = /*@__PURE__*/ Fn( ( { depthTexture, bd3D, distance, shadow }, builder ) => {
|
|
67
117
|
|
|
68
118
|
const radius = reference( 'radius', 'float', shadow ).setGroup( renderGroup );
|
|
69
119
|
const mapSize = reference( 'mapSize', 'vec2', shadow ).setGroup( renderGroup );
|
|
120
|
+
const near = reference( 'near', 'float', shadow.camera ).setGroup( renderGroup );
|
|
121
|
+
const far = reference( 'far', 'float', shadow.camera ).setGroup( renderGroup );
|
|
122
|
+
const bias = reference( 'bias', 'float', shadow ).setGroup( renderGroup );
|
|
70
123
|
|
|
71
|
-
const texelSize = radius.div( mapSize.x );
|
|
124
|
+
const texelSize = radius.div( mapSize.x ).toConst();
|
|
72
125
|
|
|
73
126
|
// Build a tangent-space coordinate system for applying offsets
|
|
74
127
|
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 );
|
|
128
|
+
const tangent = normalize( cross( bd3D, absDir.x.greaterThan( absDir.z ).select( vec3( 0, 1, 0 ), vec3( 1, 0, 0 ) ) ) ).toConst();
|
|
129
|
+
const bitangent = cross( bd3D, tangent ).toConst();
|
|
77
130
|
|
|
78
131
|
// Use IGN to rotate sampling pattern per pixel (phi = IGN * 2π)
|
|
79
|
-
const phi = interleavedGradientNoise( screenCoordinate.xy ).mul( 6.28318530718 );
|
|
80
|
-
|
|
81
|
-
//
|
|
82
|
-
|
|
83
|
-
const
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
132
|
+
const phi = interleavedGradientNoise( screenCoordinate.xy ).mul( 6.28318530718 ).toConst();
|
|
133
|
+
|
|
134
|
+
// Each sample is compared against the depth of the point next to the fragment in its direction,
|
|
135
|
+
// on whichever face of the cube it falls, so the comparison is the same on every face.
|
|
136
|
+
const getDepth = getPointShadowDepthFn( distance, near, far, bias, builder.renderer );
|
|
137
|
+
|
|
138
|
+
// Accumulate five samples using Vogel disk distribution in tangent space.
|
|
139
|
+
|
|
140
|
+
const result = float( 0.0 ).toVar();
|
|
141
|
+
|
|
142
|
+
Loop( 5, ( { i } ) => {
|
|
143
|
+
|
|
144
|
+
const sample = vogelDiskSample( i, 5, phi );
|
|
145
|
+
const direction = bd3D.add( tangent.mul( sample.x ).add( bitangent.mul( sample.y ) ).mul( texelSize ) ).toConst();
|
|
146
|
+
const absDirection = abs( direction ).toConst();
|
|
147
|
+
const maxAbs = max( absDirection.x, absDirection.y, absDirection.z ).toConst();
|
|
148
|
+
|
|
149
|
+
result.addAssign( cubeTexture( depthTexture, direction ).compare( getDepth( maxAbs ) ) );
|
|
150
|
+
|
|
151
|
+
} );
|
|
152
|
+
|
|
153
|
+
return result.mul( 1.0 / 5.0 );
|
|
94
154
|
|
|
95
155
|
} );
|
|
96
156
|
|
|
@@ -110,30 +170,15 @@ const pointShadowFilter = /*@__PURE__*/ Fn( ( { filterFn, depthTexture, shadowCo
|
|
|
110
170
|
|
|
111
171
|
If( viewZ.sub( shadowCameraFar ).lessThanEqual( 0.0 ).and( viewZ.sub( shadowCameraNear ).greaterThanEqual( 0.0 ) ), () => {
|
|
112
172
|
|
|
113
|
-
let dp;
|
|
114
|
-
|
|
115
|
-
if ( builder.renderer.reversedDepthBuffer ) {
|
|
116
|
-
|
|
117
|
-
dp = viewZToReversedPerspectiveDepth( viewZ.negate(), shadowCameraNear, shadowCameraFar );
|
|
118
|
-
dp.subAssign( bias );
|
|
119
|
-
|
|
120
|
-
} else if ( builder.renderer.logarithmicDepthBuffer ) {
|
|
121
|
-
|
|
122
|
-
dp = viewZToLogarithmicDepth( viewZ.negate(), shadowCameraNear, shadowCameraFar );
|
|
123
|
-
dp.addAssign( bias );
|
|
124
|
-
|
|
125
|
-
} else {
|
|
126
|
-
|
|
127
|
-
dp = viewZToPerspectiveDepth( viewZ.negate(), shadowCameraNear, shadowCameraFar );
|
|
128
|
-
dp.addAssign( bias );
|
|
129
|
-
|
|
130
|
-
}
|
|
131
|
-
|
|
132
173
|
// bd3D = base direction 3D (direction from light to fragment)
|
|
133
174
|
const bd3D = shadowPosition.normalize();
|
|
175
|
+
const distance = shadowPosition.length();
|
|
176
|
+
|
|
177
|
+
const getDepth = getPointShadowDepthFn( distance, shadowCameraNear, shadowCameraFar, bias, builder.renderer );
|
|
178
|
+
const dp = getDepth( viewZ.div( distance ) );
|
|
134
179
|
|
|
135
180
|
// percentage-closer filtering using cube texture sampling
|
|
136
|
-
result.assign( filterFn( { depthTexture, bd3D, dp, shadow } ) );
|
|
181
|
+
result.assign( filterFn( { depthTexture, bd3D, dp, distance, shadow } ) );
|
|
137
182
|
|
|
138
183
|
} );
|
|
139
184
|
|
|
@@ -141,7 +186,6 @@ const pointShadowFilter = /*@__PURE__*/ Fn( ( { filterFn, depthTexture, shadowCo
|
|
|
141
186
|
|
|
142
187
|
} );
|
|
143
188
|
|
|
144
|
-
|
|
145
189
|
/**
|
|
146
190
|
* Represents the shadow implementation for point light nodes.
|
|
147
191
|
*
|
|
@@ -2,14 +2,15 @@ import AnalyticLightNode from './AnalyticLightNode.js';
|
|
|
2
2
|
import { texture } from '../accessors/TextureNode.js';
|
|
3
3
|
import { uniform } from '../core/UniformNode.js';
|
|
4
4
|
import { lightViewPosition } from '../accessors/Lights.js';
|
|
5
|
+
import { cameraViewMatrix } from '../accessors/Camera.js';
|
|
6
|
+
import { vec4 } from '../tsl/TSLBase.js';
|
|
5
7
|
import { renderGroup } from '../core/UniformGroupNode.js';
|
|
6
8
|
|
|
7
9
|
import { Matrix4 } from '../../math/Matrix4.js';
|
|
8
10
|
import { Vector3 } from '../../math/Vector3.js';
|
|
9
11
|
import { NodeUpdateType } from '../core/constants.js';
|
|
10
12
|
|
|
11
|
-
const
|
|
12
|
-
const _matrix42 = /*@__PURE__*/ new Matrix4();
|
|
13
|
+
const _matrix4 = /*@__PURE__*/ new Matrix4();
|
|
13
14
|
|
|
14
15
|
let _ltcLib = null;
|
|
15
16
|
|
|
@@ -50,8 +51,8 @@ class RectAreaLightNode extends AnalyticLightNode {
|
|
|
50
51
|
this.halfWidth = uniform( new Vector3() ).setGroup( renderGroup );
|
|
51
52
|
|
|
52
53
|
/**
|
|
53
|
-
* The `updateType` is set to `NodeUpdateType.RENDER` since the light
|
|
54
|
-
*
|
|
54
|
+
* The `updateType` is set to `NodeUpdateType.RENDER` since the light's
|
|
55
|
+
* world matrix might vary per render call.
|
|
55
56
|
*
|
|
56
57
|
* @type {string}
|
|
57
58
|
* @default 'render'
|
|
@@ -71,18 +72,13 @@ class RectAreaLightNode extends AnalyticLightNode {
|
|
|
71
72
|
|
|
72
73
|
const { light } = this;
|
|
73
74
|
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
_matrix42.identity();
|
|
77
|
-
_matrix41.copy( light.matrixWorld );
|
|
78
|
-
_matrix41.premultiply( viewMatrix );
|
|
79
|
-
_matrix42.extractRotation( _matrix41 );
|
|
75
|
+
_matrix4.extractRotation( light.matrixWorld );
|
|
80
76
|
|
|
81
77
|
this.halfWidth.value.set( light.width * 0.5, 0.0, 0.0 );
|
|
82
78
|
this.halfHeight.value.set( 0.0, light.height * 0.5, 0.0 );
|
|
83
79
|
|
|
84
|
-
this.halfWidth.value.applyMatrix4(
|
|
85
|
-
this.halfHeight.value.applyMatrix4(
|
|
80
|
+
this.halfWidth.value.applyMatrix4( _matrix4 );
|
|
81
|
+
this.halfHeight.value.applyMatrix4( _matrix4 );
|
|
86
82
|
|
|
87
83
|
}
|
|
88
84
|
|
|
@@ -106,11 +102,14 @@ class RectAreaLightNode extends AnalyticLightNode {
|
|
|
106
102
|
|
|
107
103
|
const lightPosition = lightViewPosition( light );
|
|
108
104
|
|
|
105
|
+
const halfWidth = cameraViewMatrix.mul( vec4( this.halfWidth, 0 ) ).xyz;
|
|
106
|
+
const halfHeight = cameraViewMatrix.mul( vec4( this.halfHeight, 0 ) ).xyz;
|
|
107
|
+
|
|
109
108
|
return {
|
|
110
109
|
lightColor: colorNode,
|
|
111
110
|
lightPosition,
|
|
112
|
-
halfWidth
|
|
113
|
-
halfHeight
|
|
111
|
+
halfWidth,
|
|
112
|
+
halfHeight,
|
|
114
113
|
ltc_1,
|
|
115
114
|
ltc_2
|
|
116
115
|
};
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import Node from '../core/Node.js';
|
|
2
2
|
import NodeMaterial from '../../materials/nodes/NodeMaterial.js';
|
|
3
3
|
import ChainMap from '../../renderers/common/ChainMap.js';
|
|
4
|
-
import { getDataFromObject } from '../core/NodeUtils.js';
|
|
5
4
|
import { NodeUpdateType } from '../core/constants.js';
|
|
6
5
|
import { property, vec4 } from '../tsl/TSLBase.js';
|
|
7
6
|
import { positionWorld } from '../accessors/Position.js';
|
|
@@ -73,28 +72,21 @@ const _disposeShadowMaterial = ( light ) => {
|
|
|
73
72
|
* @param {Renderer} renderer - The renderer.
|
|
74
73
|
* @param {LightShadow} shadow - The light shadow object containing shadow properties.
|
|
75
74
|
* @param {number} shadowType - The type of shadow map (e.g., BasicShadowMap).
|
|
76
|
-
* @param {boolean} useVelocity - Whether to use velocity data for rendering.
|
|
77
75
|
* @return {shadowRenderObjectFunction} A function that renders shadow objects.
|
|
78
76
|
*/
|
|
79
|
-
const _getShadowRenderObjectFunction = ( renderer, shadow, shadowType
|
|
77
|
+
const _getShadowRenderObjectFunction = ( renderer, shadow, shadowType ) => {
|
|
80
78
|
|
|
81
79
|
_shadowRenderObjectKeys[ 0 ] = renderer;
|
|
82
80
|
_shadowRenderObjectKeys[ 1 ] = shadow;
|
|
83
81
|
|
|
84
82
|
let renderObjectFunction = _shadowRenderObjectLibrary.get( _shadowRenderObjectKeys );
|
|
85
83
|
|
|
86
|
-
if ( renderObjectFunction === undefined ||
|
|
84
|
+
if ( renderObjectFunction === undefined || renderObjectFunction.shadowType !== shadowType ) {
|
|
87
85
|
|
|
88
86
|
renderObjectFunction = ( object, scene, _camera, geometry, material, group, lightsNode, clippingContext, passId ) => {
|
|
89
87
|
|
|
90
88
|
if ( object.castShadow === true || ( object.receiveShadow && shadowType === VSMShadowMap ) ) {
|
|
91
89
|
|
|
92
|
-
if ( useVelocity ) {
|
|
93
|
-
|
|
94
|
-
getDataFromObject( object ).useVelocity = true;
|
|
95
|
-
|
|
96
|
-
}
|
|
97
|
-
|
|
98
90
|
object.onBeforeShadow( renderer, object, _camera, shadow.camera, geometry, scene.overrideMaterial, group );
|
|
99
91
|
|
|
100
92
|
renderer.renderObject( object, scene, _camera, geometry, material, group, lightsNode, clippingContext, passId );
|
|
@@ -106,7 +98,6 @@ const _getShadowRenderObjectFunction = ( renderer, shadow, shadowType, useVeloci
|
|
|
106
98
|
};
|
|
107
99
|
|
|
108
100
|
renderObjectFunction.shadowType = shadowType;
|
|
109
|
-
renderObjectFunction.useVelocity = useVelocity;
|
|
110
101
|
|
|
111
102
|
_shadowRenderObjectLibrary.set( _shadowRenderObjectKeys, renderObjectFunction );
|
|
112
103
|
|
|
@@ -171,6 +162,12 @@ class ShadowBaseNode extends Node {
|
|
|
171
162
|
|
|
172
163
|
}
|
|
173
164
|
|
|
165
|
+
isCacheable( /*builder*/ ) {
|
|
166
|
+
|
|
167
|
+
return false;
|
|
168
|
+
|
|
169
|
+
}
|
|
170
|
+
|
|
174
171
|
/**
|
|
175
172
|
* Retrieves or creates a shadow material for the shadow casting light source.
|
|
176
173
|
*
|
|
@@ -203,12 +200,7 @@ class ShadowBaseNode extends Node {
|
|
|
203
200
|
*/
|
|
204
201
|
getShadowRenderObjectFunction( renderer, shadow = this.light.shadow ) {
|
|
205
202
|
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
const currentMRT = renderer.getMRT();
|
|
209
|
-
const useVelocity = currentMRT ? currentMRT.has( 'velocity' ) : false;
|
|
210
|
-
|
|
211
|
-
return _getShadowRenderObjectFunction( renderer, shadow, shadowType, useVelocity );
|
|
203
|
+
return _getShadowRenderObjectFunction( renderer, shadow, renderer.shadowMap.type );
|
|
212
204
|
|
|
213
205
|
}
|
|
214
206
|
|