@plastic-software/three 0.181.3 → 0.183.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +1 -1
- package/README.md +3 -4
- package/build/three.cjs +11330 -10017
- package/build/three.core.js +10011 -9493
- package/build/three.core.min.js +2 -2
- package/build/three.module.js +1414 -631
- package/build/three.module.min.js +2 -2
- package/build/three.tsl.js +21 -13
- package/build/three.tsl.min.js +2 -2
- package/build/three.webgpu.js +8007 -5427
- package/build/three.webgpu.min.js +2 -2
- package/build/three.webgpu.nodes.js +8005 -5426
- package/build/three.webgpu.nodes.min.js +2 -2
- package/examples/jsm/Addons.js +0 -3
- package/examples/jsm/animation/CCDIKSolver.js +2 -2
- package/examples/jsm/controls/ArcballControls.js +3 -3
- package/examples/jsm/controls/MapControls.js +55 -1
- package/examples/jsm/controls/OrbitControls.js +109 -6
- package/examples/jsm/controls/TrackballControls.js +6 -6
- package/examples/jsm/csm/CSM.js +2 -1
- package/examples/jsm/effects/AnaglyphEffect.js +102 -7
- package/examples/jsm/environments/ColorEnvironment.js +59 -0
- package/examples/jsm/environments/RoomEnvironment.js +3 -0
- package/examples/jsm/exporters/EXRExporter.js +1 -1
- package/examples/jsm/exporters/GLTFExporter.js +131 -4
- package/examples/jsm/exporters/USDZExporter.js +22 -3
- package/examples/jsm/geometries/DecalGeometry.js +1 -1
- package/examples/jsm/helpers/AnimationPathHelper.js +302 -0
- package/examples/jsm/helpers/LightProbeHelperGPU.js +1 -1
- package/examples/jsm/helpers/TextureHelperGPU.js +1 -1
- package/examples/jsm/helpers/ViewHelper.js +67 -8
- package/examples/jsm/inspector/Inspector.js +74 -14
- package/examples/jsm/inspector/RendererInspector.js +12 -2
- package/examples/jsm/inspector/tabs/Console.js +41 -7
- package/examples/jsm/inspector/tabs/Parameters.js +18 -2
- package/examples/jsm/inspector/tabs/Performance.js +2 -2
- package/examples/jsm/inspector/tabs/Viewer.js +4 -4
- package/examples/jsm/inspector/ui/Profiler.js +1836 -31
- package/examples/jsm/inspector/ui/Style.js +973 -14
- package/examples/jsm/inspector/ui/Tab.js +188 -1
- package/examples/jsm/inspector/ui/Values.js +17 -1
- package/examples/jsm/libs/meshopt_decoder.module.js +6 -5
- package/examples/jsm/lines/LineMaterial.js +6 -0
- package/examples/jsm/loaders/3DMLoader.js +5 -4
- package/examples/jsm/loaders/3MFLoader.js +2 -2
- package/examples/jsm/loaders/AMFLoader.js +2 -2
- package/examples/jsm/loaders/ColladaLoader.js +24 -4026
- package/examples/jsm/loaders/DRACOLoader.js +5 -5
- package/examples/jsm/loaders/EXRLoader.js +5 -5
- package/examples/jsm/loaders/FBXLoader.js +2 -4
- package/examples/jsm/loaders/GCodeLoader.js +34 -8
- package/examples/jsm/loaders/GLTFLoader.js +122 -171
- package/examples/jsm/loaders/HDRLoader.js +0 -1
- package/examples/jsm/loaders/KMZLoader.js +5 -5
- package/examples/jsm/loaders/KTX2Loader.js +19 -3
- package/examples/jsm/loaders/LDrawLoader.js +2 -3
- package/examples/jsm/loaders/LWOLoader.js +7 -39
- package/examples/jsm/loaders/NRRDLoader.js +2 -2
- package/examples/jsm/loaders/PCDLoader.js +4 -2
- package/examples/jsm/loaders/SVGLoader.js +1 -1
- package/examples/jsm/loaders/TDSLoader.js +0 -2
- package/examples/jsm/loaders/TGALoader.js +0 -2
- package/examples/jsm/loaders/USDLoader.js +100 -40
- package/examples/jsm/loaders/UltraHDRLoader.js +285 -160
- package/examples/jsm/loaders/VOXLoader.js +660 -117
- package/examples/jsm/loaders/VRMLLoader.js +79 -2
- package/examples/jsm/loaders/VTKLoader.js +37 -24
- package/examples/jsm/loaders/collada/ColladaComposer.js +2950 -0
- package/examples/jsm/loaders/collada/ColladaParser.js +1962 -0
- package/examples/jsm/loaders/usd/USDAParser.js +447 -366
- package/examples/jsm/loaders/usd/USDCParser.js +1841 -6
- package/examples/jsm/loaders/usd/USDComposer.js +4041 -0
- package/examples/jsm/materials/LDrawConditionalLineNodeMaterial.js +2 -2
- package/examples/jsm/materials/WoodNodeMaterial.js +11 -11
- package/examples/jsm/math/Octree.js +131 -1
- package/examples/jsm/misc/Volume.js +0 -1
- package/examples/jsm/misc/VolumeSlice.js +0 -1
- package/examples/jsm/objects/LensflareMesh.js +1 -1
- package/examples/jsm/objects/Sky.js +76 -4
- package/examples/jsm/objects/SkyMesh.js +127 -10
- package/examples/jsm/objects/Water.js +4 -3
- package/examples/jsm/objects/Water2.js +5 -3
- package/examples/jsm/objects/WaterMesh.js +5 -7
- package/examples/jsm/physics/AmmoPhysics.js +12 -7
- package/examples/jsm/physics/JoltPhysics.js +10 -6
- package/examples/jsm/physics/RapierPhysics.js +9 -5
- package/examples/jsm/postprocessing/EffectComposer.js +7 -5
- package/examples/jsm/postprocessing/OutputPass.js +9 -0
- package/examples/jsm/postprocessing/RenderPass.js +10 -0
- package/examples/jsm/postprocessing/RenderTransitionPass.js +1 -1
- package/examples/jsm/postprocessing/UnrealBloomPass.js +48 -18
- package/examples/jsm/renderers/CSS3DRenderer.js +1 -1
- package/examples/jsm/renderers/Projector.js +268 -30
- package/examples/jsm/renderers/SVGRenderer.js +193 -60
- package/examples/jsm/shaders/GTAOShader.js +19 -6
- package/examples/jsm/shaders/HalftoneShader.js +12 -1
- package/examples/jsm/shaders/PoissonDenoiseShader.js +6 -2
- package/examples/jsm/shaders/SAOShader.js +17 -4
- package/examples/jsm/shaders/SSAOShader.js +11 -1
- package/examples/jsm/shaders/SSRShader.js +6 -5
- package/examples/jsm/shaders/UnpackDepthRGBAShader.js +2 -4
- package/examples/jsm/shaders/VignetteShader.js +1 -1
- package/examples/jsm/transpiler/AST.js +44 -0
- package/examples/jsm/transpiler/GLSLDecoder.js +61 -4
- package/examples/jsm/transpiler/ShaderToyDecoder.js +2 -0
- package/examples/jsm/transpiler/TSLEncoder.js +46 -3
- package/examples/jsm/transpiler/TranspilerUtils.js +3 -3
- package/examples/jsm/transpiler/WGSLEncoder.js +27 -0
- package/examples/jsm/tsl/display/AfterImageNode.js +1 -1
- package/examples/jsm/tsl/display/AnaglyphPassNode.js +458 -16
- package/examples/jsm/tsl/display/AnamorphicNode.js +1 -1
- package/examples/jsm/tsl/display/BilateralBlurNode.js +364 -0
- package/examples/jsm/tsl/display/BloomNode.js +16 -6
- package/examples/jsm/tsl/display/CRT.js +150 -0
- package/examples/jsm/tsl/display/DenoiseNode.js +1 -1
- package/examples/jsm/tsl/display/DepthOfFieldNode.js +1 -1
- package/examples/jsm/tsl/display/DotScreenNode.js +1 -1
- package/examples/jsm/tsl/display/FXAANode.js +2 -2
- package/examples/jsm/tsl/display/GTAONode.js +5 -4
- package/examples/jsm/tsl/display/GaussianBlurNode.js +11 -2
- package/examples/jsm/tsl/display/GodraysNode.js +624 -0
- package/examples/jsm/tsl/display/LensflareNode.js +1 -1
- package/examples/jsm/tsl/display/Lut3DNode.js +1 -1
- package/examples/jsm/tsl/display/OutlineNode.js +3 -3
- package/examples/jsm/tsl/display/ParallaxBarrierPassNode.js +2 -2
- package/examples/jsm/tsl/display/PixelationPassNode.js +7 -6
- package/examples/jsm/tsl/display/RGBShiftNode.js +2 -2
- package/examples/jsm/tsl/display/RetroPassNode.js +263 -0
- package/examples/jsm/tsl/display/SMAANode.js +2 -2
- package/examples/jsm/tsl/display/SSAAPassNode.js +2 -2
- package/examples/jsm/tsl/display/SSGINode.js +8 -20
- package/examples/jsm/tsl/display/SSRNode.js +8 -8
- package/examples/jsm/tsl/display/SSSNode.js +6 -4
- package/examples/jsm/tsl/display/Shape.js +29 -0
- package/examples/jsm/tsl/display/SobelOperatorNode.js +2 -2
- package/examples/jsm/tsl/display/StereoCompositePassNode.js +8 -1
- package/examples/jsm/tsl/display/StereoPassNode.js +1 -2
- package/examples/jsm/tsl/display/TRAANode.js +273 -125
- package/examples/jsm/tsl/display/TransitionNode.js +1 -1
- package/examples/jsm/tsl/display/depthAwareBlend.js +80 -0
- package/examples/jsm/tsl/display/radialBlur.js +68 -0
- package/examples/jsm/tsl/math/Bayer.js +40 -1
- package/examples/jsm/utils/LDrawUtils.js +1 -1
- package/examples/jsm/utils/ShadowMapViewer.js +24 -10
- package/examples/jsm/utils/ShadowMapViewerGPU.js +1 -1
- package/examples/jsm/utils/WebGPUTextureUtils.js +1 -1
- package/package.json +20 -26
- package/src/Three.Core.js +2 -1
- package/src/Three.TSL.js +19 -11
- package/src/Three.WebGPU.Nodes.js +2 -0
- package/src/Three.WebGPU.js +3 -0
- package/src/Three.js +1 -0
- package/src/animation/AnimationAction.js +1 -1
- package/src/animation/AnimationClip.js +1 -1
- package/src/animation/AnimationMixer.js +6 -0
- package/src/animation/AnimationUtils.js +1 -12
- package/src/animation/KeyframeTrack.js +47 -8
- package/src/animation/PropertyMixer.js +4 -4
- package/src/animation/tracks/BooleanKeyframeTrack.js +1 -1
- package/src/animation/tracks/ColorKeyframeTrack.js +1 -1
- package/src/animation/tracks/NumberKeyframeTrack.js +1 -1
- package/src/animation/tracks/QuaternionKeyframeTrack.js +1 -1
- package/src/animation/tracks/StringKeyframeTrack.js +1 -1
- package/src/animation/tracks/VectorKeyframeTrack.js +1 -1
- package/src/audio/Audio.js +1 -1
- package/src/audio/AudioListener.js +5 -3
- package/src/cameras/Camera.js +32 -2
- package/src/cameras/CubeCamera.js +20 -0
- package/src/constants.js +90 -5
- package/src/core/BufferGeometry.js +14 -2
- package/src/core/Clock.js +7 -0
- package/src/core/Object3D.js +56 -4
- package/src/core/Raycaster.js +2 -2
- package/src/core/RenderTarget.js +3 -4
- package/src/extras/PMREMGenerator.js +7 -18
- package/src/extras/TextureUtils.js +5 -1
- package/src/geometries/ExtrudeGeometry.js +2 -2
- package/src/geometries/PolyhedronGeometry.js +1 -1
- package/src/geometries/TorusGeometry.js +8 -3
- package/src/helpers/CameraHelper.js +3 -0
- package/src/helpers/DirectionalLightHelper.js +4 -1
- package/src/helpers/HemisphereLightHelper.js +3 -0
- package/src/helpers/PointLightHelper.js +1 -25
- package/src/helpers/SpotLightHelper.js +3 -0
- package/src/lights/DirectionalLight.js +13 -0
- package/src/lights/HemisphereLight.js +10 -0
- package/src/lights/Light.js +1 -11
- package/src/lights/LightProbe.js +0 -15
- package/src/lights/LightShadow.js +15 -6
- package/src/lights/PointLight.js +15 -0
- package/src/lights/PointLightShadow.js +0 -86
- package/src/lights/SpotLight.js +22 -1
- package/src/lights/webgpu/IESSpotLight.js +2 -1
- package/src/loaders/Cache.js +28 -0
- package/src/loaders/FileLoader.js +1 -1
- package/src/loaders/ImageBitmapLoader.js +8 -3
- package/src/loaders/Loader.js +6 -0
- package/src/loaders/MaterialLoader.js +2 -1
- package/src/loaders/ObjectLoader.js +21 -2
- package/src/loaders/nodes/NodeLoader.js +2 -2
- package/src/materials/Material.js +2 -0
- package/src/materials/MeshLambertMaterial.js +9 -0
- package/src/materials/MeshPhongMaterial.js +9 -0
- package/src/materials/ShaderMaterial.js +20 -1
- package/src/materials/nodes/Line2NodeMaterial.js +7 -7
- package/src/materials/nodes/MeshPhysicalNodeMaterial.js +5 -2
- package/src/materials/nodes/MeshStandardNodeMaterial.js +5 -4
- package/src/materials/nodes/NodeMaterial.js +72 -25
- package/src/materials/nodes/manager/NodeMaterialObserver.js +10 -4
- package/src/math/Line3.js +3 -5
- package/src/math/MathUtils.js +10 -10
- package/src/math/Matrix4.js +74 -65
- package/src/math/Quaternion.js +3 -29
- package/src/math/Sphere.js +1 -1
- package/src/math/Vector3.js +3 -5
- package/src/math/interpolants/BezierInterpolant.js +108 -0
- package/src/nodes/Nodes.js +87 -68
- package/src/nodes/TSL.js +6 -6
- package/src/nodes/accessors/Arrays.js +1 -1
- package/src/nodes/accessors/BatchNode.js +10 -10
- package/src/nodes/accessors/Bitangent.js +5 -5
- package/src/nodes/accessors/BufferAttributeNode.js +98 -12
- package/src/nodes/accessors/BufferNode.js +29 -2
- package/src/nodes/accessors/Camera.js +149 -28
- package/src/nodes/accessors/ClippingNode.js +4 -4
- package/src/nodes/accessors/CubeTextureNode.js +20 -1
- package/src/nodes/accessors/InstanceNode.js +148 -43
- package/src/nodes/accessors/MaterialNode.js +9 -1
- package/src/nodes/accessors/MaterialReferenceNode.js +1 -2
- package/src/nodes/accessors/ModelNode.js +1 -1
- package/src/nodes/accessors/Normal.js +11 -11
- package/src/nodes/accessors/Position.js +34 -2
- package/src/nodes/accessors/ReferenceBaseNode.js +4 -4
- package/src/nodes/accessors/ReferenceNode.js +4 -4
- package/src/nodes/accessors/RendererReferenceNode.js +1 -2
- package/src/nodes/accessors/SceneProperties.js +53 -0
- package/src/nodes/accessors/SkinningNode.js +27 -26
- package/src/nodes/accessors/StorageBufferNode.js +4 -21
- package/src/nodes/accessors/StorageTextureNode.js +37 -1
- package/src/nodes/accessors/Tangent.js +4 -14
- package/src/nodes/accessors/Texture3DNode.js +32 -35
- package/src/nodes/accessors/TextureNode.js +58 -22
- package/src/nodes/accessors/UniformArrayNode.js +4 -2
- package/src/nodes/accessors/UserDataNode.js +1 -2
- package/src/nodes/accessors/VertexColorNode.js +1 -2
- package/src/nodes/code/FunctionNode.js +1 -2
- package/src/nodes/core/ArrayNode.js +20 -1
- package/src/nodes/core/AssignNode.js +2 -2
- package/src/nodes/core/AttributeNode.js +2 -2
- package/src/nodes/core/ContextNode.js +103 -4
- package/src/nodes/core/MRTNode.js +48 -2
- package/src/nodes/core/Node.js +29 -3
- package/src/nodes/core/NodeBuilder.js +170 -53
- package/src/nodes/core/NodeError.js +28 -0
- package/src/nodes/core/NodeFrame.js +12 -4
- package/src/nodes/core/NodeUtils.js +10 -8
- package/src/nodes/core/OutputStructNode.js +12 -10
- package/src/nodes/core/ParameterNode.js +3 -3
- package/src/nodes/core/PropertyNode.js +19 -3
- package/src/nodes/core/StackNode.js +65 -16
- package/src/nodes/core/StackTrace.js +139 -0
- package/src/nodes/core/StructNode.js +16 -2
- package/src/nodes/core/StructTypeNode.js +11 -17
- package/src/nodes/core/SubBuildNode.js +1 -1
- package/src/nodes/core/UniformNode.js +21 -5
- package/src/nodes/core/VarNode.js +47 -22
- package/src/nodes/core/VaryingNode.js +1 -18
- package/src/nodes/display/BlendModes.js +0 -64
- package/src/nodes/display/ColorAdjustment.js +17 -0
- package/src/nodes/display/ColorSpaceNode.js +3 -3
- package/src/nodes/display/NormalMapNode.js +39 -4
- package/src/nodes/display/PassNode.js +98 -9
- package/src/nodes/display/RenderOutputNode.js +3 -3
- package/src/nodes/display/ScreenNode.js +3 -1
- package/src/nodes/display/ToneMappingNode.js +1 -1
- package/src/nodes/display/ToonOutlinePassNode.js +2 -2
- package/src/nodes/display/ViewportDepthNode.js +52 -4
- package/src/nodes/display/ViewportTextureNode.js +21 -4
- package/src/nodes/fog/Fog.js +18 -35
- package/src/nodes/functions/BSDF/BRDF_GGX_Multiscatter.js +3 -3
- package/src/nodes/functions/BSDF/DFGLUT.js +56 -0
- package/src/nodes/functions/BSDF/EnvironmentBRDF.js +2 -2
- package/src/nodes/functions/BSDF/V_GGX_SmithCorrelated_Anisotropic.js +1 -1
- package/src/nodes/functions/PhysicalLightingModel.js +126 -45
- package/src/nodes/geometry/RangeNode.js +4 -2
- package/src/nodes/gpgpu/ComputeBuiltinNode.js +1 -2
- package/src/nodes/gpgpu/ComputeNode.js +5 -4
- package/src/nodes/gpgpu/SubgroupFunctionNode.js +1 -1
- package/src/nodes/gpgpu/WorkgroupInfoNode.js +4 -4
- package/src/nodes/lighting/AnalyticLightNode.js +53 -0
- package/src/nodes/lighting/EnvironmentNode.js +28 -3
- package/src/nodes/lighting/LightsNode.js +2 -2
- package/src/nodes/lighting/PointShadowNode.js +162 -149
- package/src/nodes/lighting/ShadowFilterNode.js +53 -65
- package/src/nodes/lighting/ShadowNode.js +97 -41
- package/src/nodes/math/BitcountNode.js +433 -0
- package/src/nodes/math/ConditionalNode.js +2 -2
- package/src/nodes/math/MathNode.js +3 -40
- package/src/nodes/math/OperatorNode.js +2 -1
- package/src/nodes/math/PackFloatNode.js +98 -0
- package/src/nodes/math/UnpackFloatNode.js +96 -0
- package/src/nodes/pmrem/PMREMNode.js +1 -1
- package/src/nodes/pmrem/PMREMUtils.js +9 -15
- package/src/nodes/tsl/TSLCore.js +17 -14
- package/src/nodes/utils/ArrayElementNode.js +13 -0
- package/src/nodes/utils/DebugNode.js +11 -11
- package/src/nodes/utils/EventNode.js +1 -2
- package/src/nodes/utils/JoinNode.js +2 -2
- package/src/nodes/utils/LoopNode.js +1 -1
- package/src/nodes/utils/MemberNode.js +1 -1
- package/src/nodes/utils/Packing.js +13 -1
- package/src/nodes/utils/PostProcessingUtils.js +33 -1
- package/src/nodes/utils/RTTNode.js +1 -1
- package/src/nodes/utils/ReflectorNode.js +3 -4
- package/src/nodes/utils/SampleNode.js +1 -1
- package/src/nodes/utils/SpriteSheetUV.js +35 -0
- package/src/nodes/utils/UVUtils.js +28 -0
- package/src/objects/BatchedMesh.js +27 -14
- package/src/objects/InstancedMesh.js +11 -0
- package/src/objects/Line.js +1 -1
- package/src/objects/Mesh.js +1 -1
- package/src/objects/Points.js +1 -1
- package/src/objects/Skeleton.js +9 -0
- package/src/renderers/WebGLRenderer.js +178 -92
- package/src/renderers/common/Backend.js +29 -0
- package/src/renderers/common/Background.js +24 -11
- package/src/renderers/common/BindGroup.js +1 -9
- package/src/renderers/common/Binding.js +11 -0
- package/src/renderers/common/Bindings.js +27 -12
- package/src/renderers/common/BlendMode.js +143 -0
- package/src/renderers/common/Buffer.js +40 -0
- package/src/renderers/common/BundleGroup.js +1 -1
- package/src/renderers/common/ChainMap.js +30 -6
- package/src/renderers/common/CubeRenderTarget.js +50 -6
- package/src/renderers/common/Geometries.js +29 -3
- package/src/renderers/common/Lighting.js +5 -21
- package/src/renderers/common/Pipelines.js +4 -4
- package/src/renderers/common/PostProcessing.js +8 -206
- package/src/renderers/common/RenderBundles.js +2 -1
- package/src/renderers/common/RenderContext.js +16 -0
- package/src/renderers/common/RenderContexts.js +33 -49
- package/src/renderers/common/RenderLists.js +2 -1
- package/src/renderers/common/RenderObject.js +15 -3
- package/src/renderers/common/RenderObjectPipeline.js +40 -0
- package/src/renderers/common/RenderObjects.js +18 -2
- package/src/renderers/common/RenderPipeline.js +203 -17
- package/src/renderers/common/Renderer.js +257 -72
- package/src/renderers/common/Sampler.js +4 -4
- package/src/renderers/common/StorageBuffer.js +13 -1
- package/src/renderers/common/Textures.js +17 -1
- package/src/renderers/common/TimestampQueryPool.js +5 -3
- package/src/renderers/common/Uniform.js +8 -0
- package/src/renderers/common/UniformsGroup.js +61 -0
- package/src/renderers/common/XRManager.js +3 -2
- package/src/renderers/common/extras/PMREMGenerator.js +2 -8
- package/src/renderers/common/nodes/NodeBuilderState.js +1 -1
- package/src/renderers/common/nodes/{Nodes.js → NodeManager.js} +18 -6
- package/src/renderers/common/nodes/NodeStorageBuffer.js +13 -2
- package/src/renderers/common/nodes/NodeUniformBuffer.js +52 -0
- package/src/renderers/shaders/DFGLUTData.js +19 -34
- package/src/renderers/shaders/ShaderChunk/batching_pars_vertex.glsl.js +2 -2
- package/src/renderers/shaders/ShaderChunk/color_fragment.glsl.js +1 -5
- package/src/renderers/shaders/ShaderChunk/color_pars_fragment.glsl.js +1 -5
- package/src/renderers/shaders/ShaderChunk/color_pars_vertex.glsl.js +1 -5
- package/src/renderers/shaders/ShaderChunk/color_vertex.glsl.js +8 -10
- package/src/renderers/shaders/ShaderChunk/envmap_fragment.glsl.js +7 -11
- package/src/renderers/shaders/ShaderChunk/lights_fragment_begin.glsl.js +5 -2
- package/src/renderers/shaders/ShaderChunk/lights_fragment_end.glsl.js +6 -0
- package/src/renderers/shaders/ShaderChunk/lights_fragment_maps.glsl.js +6 -2
- package/src/renderers/shaders/ShaderChunk/lights_physical_fragment.glsl.js +8 -4
- package/src/renderers/shaders/ShaderChunk/lights_physical_pars_fragment.glsl.js +112 -51
- package/src/renderers/shaders/ShaderChunk/packing.glsl.js +20 -4
- package/src/renderers/shaders/ShaderChunk/shadowmap_pars_fragment.glsl.js +225 -186
- package/src/renderers/shaders/ShaderChunk/shadowmask_pars_fragment.glsl.js +1 -1
- package/src/renderers/shaders/ShaderChunk/transmission_fragment.glsl.js +1 -1
- package/src/renderers/shaders/ShaderChunk.js +3 -3
- package/src/renderers/shaders/ShaderLib/depth.glsl.js +3 -0
- package/src/renderers/shaders/ShaderLib/{distanceRGBA.glsl.js → distance.glsl.js} +1 -2
- package/src/renderers/shaders/ShaderLib/meshlambert.glsl.js +2 -1
- package/src/renderers/shaders/ShaderLib/meshnormal.glsl.js +1 -2
- package/src/renderers/shaders/ShaderLib/meshphong.glsl.js +2 -1
- package/src/renderers/shaders/ShaderLib/meshphysical.glsl.js +4 -9
- package/src/renderers/shaders/ShaderLib/meshtoon.glsl.js +0 -1
- package/src/renderers/shaders/ShaderLib/shadow.glsl.js +1 -1
- package/src/renderers/shaders/ShaderLib/vsm.glsl.js +4 -6
- package/src/renderers/shaders/ShaderLib.js +7 -5
- package/src/renderers/shaders/UniformsLib.js +0 -3
- package/src/renderers/webgl/WebGLBackground.js +2 -2
- package/src/renderers/webgl/WebGLBindingStates.js +99 -27
- package/src/renderers/webgl/WebGLCapabilities.js +3 -4
- package/src/renderers/webgl/WebGLEnvironments.js +228 -0
- package/src/renderers/webgl/WebGLGeometries.js +10 -7
- package/src/renderers/webgl/WebGLLights.js +18 -1
- package/src/renderers/webgl/WebGLMaterials.js +12 -0
- package/src/renderers/webgl/WebGLObjects.js +3 -1
- package/src/renderers/webgl/WebGLOutput.js +267 -0
- package/src/renderers/webgl/WebGLProgram.js +45 -109
- package/src/renderers/webgl/WebGLPrograms.js +45 -49
- package/src/renderers/webgl/WebGLRenderLists.js +15 -0
- package/src/renderers/webgl/WebGLShadowMap.js +188 -24
- package/src/renderers/webgl/WebGLState.js +32 -37
- package/src/renderers/webgl/WebGLTextures.js +89 -28
- package/src/renderers/webgl/WebGLUniforms.js +40 -3
- package/src/renderers/webgl/WebGLUtils.js +6 -2
- package/src/renderers/webgl-fallback/WebGLBackend.js +148 -18
- package/src/renderers/webgl-fallback/nodes/GLSLNodeBuilder.js +156 -35
- package/src/renderers/webgl-fallback/utils/WebGLState.js +181 -5
- package/src/renderers/webgl-fallback/utils/WebGLTextureUtils.js +5 -3
- package/src/renderers/webgl-fallback/utils/WebGLTimestampQueryPool.js +9 -9
- package/src/renderers/webgl-fallback/utils/WebGLUtils.js +6 -2
- package/src/renderers/webgpu/WebGPUBackend.js +119 -13
- package/src/renderers/webgpu/WebGPURenderer.js +2 -1
- package/src/renderers/webgpu/nodes/WGSLNodeBuilder.js +322 -68
- package/src/renderers/webgpu/utils/WebGPUAttributeUtils.js +4 -17
- package/src/renderers/webgpu/utils/WebGPUBindingUtils.js +357 -200
- package/src/renderers/webgpu/utils/WebGPUConstants.js +2 -0
- package/src/renderers/webgpu/utils/WebGPUPipelineUtils.js +61 -23
- package/src/renderers/webgpu/utils/WebGPUTexturePassUtils.js +152 -200
- package/src/renderers/webgpu/utils/WebGPUTextureUtils.js +65 -42
- package/src/renderers/webgpu/utils/WebGPUTimestampQueryPool.js +7 -7
- package/src/renderers/webgpu/utils/WebGPUUtils.js +17 -11
- package/src/renderers/webxr/WebXRManager.js +2 -2
- package/src/textures/CubeDepthTexture.js +76 -0
- package/src/textures/Source.js +1 -1
- package/src/textures/Texture.js +3 -3
- package/src/utils.js +258 -3
- package/examples/jsm/materials/MeshGouraudMaterial.js +0 -434
- package/examples/jsm/materials/MeshPostProcessingMaterial.js +0 -167
- package/examples/jsm/shaders/GodRaysShader.js +0 -333
- package/src/nodes/accessors/SceneNode.js +0 -145
- package/src/nodes/code/ScriptableNode.js +0 -726
- package/src/nodes/code/ScriptableValueNode.js +0 -253
- package/src/nodes/display/PosterizeNode.js +0 -65
- package/src/nodes/functions/BSDF/DFGApprox.js +0 -71
- package/src/nodes/utils/SpriteSheetUVNode.js +0 -90
- package/src/renderers/webgl/WebGLCubeMaps.js +0 -99
- package/src/renderers/webgl/WebGLCubeUVMaps.js +0 -134
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { Fn, vec2 } from '../../tsl/TSLBase.js';
|
|
2
|
+
import { texture } from '../../accessors/TextureNode.js';
|
|
3
|
+
|
|
4
|
+
import { DataTexture } from '../../../textures/DataTexture.js';
|
|
5
|
+
import { RGFormat, HalfFloatType, LinearFilter, ClampToEdgeWrapping } from '../../../constants.js';
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Precomputed DFG LUT for Image-Based Lighting
|
|
9
|
+
* Resolution: 16x16
|
|
10
|
+
* Samples: 4096 per texel
|
|
11
|
+
* Format: RG16F (2 half floats per texel: scale, bias)
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
const DATA = new Uint16Array( [
|
|
15
|
+
0x30b5, 0x3ad1, 0x314c, 0x3a4d, 0x33d2, 0x391c, 0x35ef, 0x3828, 0x37f3, 0x36a6, 0x38d1, 0x3539, 0x3979, 0x3410, 0x39f8, 0x3252, 0x3a53, 0x30f0, 0x3a94, 0x2fc9, 0x3abf, 0x2e35, 0x3ada, 0x2d05, 0x3ae8, 0x2c1f, 0x3aed, 0x2ae0, 0x3aea, 0x29d1, 0x3ae1, 0x28ff,
|
|
16
|
+
0x3638, 0x38e4, 0x364a, 0x38ce, 0x3699, 0x385e, 0x374e, 0x372c, 0x3839, 0x35a4, 0x38dc, 0x3462, 0x396e, 0x32c4, 0x39de, 0x3134, 0x3a2b, 0x3003, 0x3a59, 0x2e3a, 0x3a6d, 0x2ce1, 0x3a6e, 0x2bba, 0x3a5f, 0x2a33, 0x3a49, 0x290a, 0x3a2d, 0x2826, 0x3a0a, 0x26e8,
|
|
17
|
+
0x3894, 0x36d7, 0x3897, 0x36c9, 0x38a3, 0x3675, 0x38bc, 0x35ac, 0x38ee, 0x349c, 0x393e, 0x3332, 0x3997, 0x3186, 0x39e2, 0x3038, 0x3a13, 0x2e75, 0x3a29, 0x2cf5, 0x3a2d, 0x2bac, 0x3a21, 0x29ff, 0x3a04, 0x28bc, 0x39dc, 0x2790, 0x39ad, 0x261a, 0x3978, 0x24fa,
|
|
18
|
+
0x39ac, 0x34a8, 0x39ac, 0x34a3, 0x39ae, 0x3480, 0x39ae, 0x3423, 0x39b1, 0x330e, 0x39c2, 0x31a9, 0x39e0, 0x3063, 0x39fc, 0x2eb5, 0x3a0c, 0x2d1d, 0x3a14, 0x2bcf, 0x3a07, 0x29ff, 0x39e9, 0x28a3, 0x39be, 0x273c, 0x3989, 0x25b3, 0x394a, 0x2488, 0x3907, 0x2345,
|
|
19
|
+
0x3a77, 0x3223, 0x3a76, 0x321f, 0x3a73, 0x3204, 0x3a6a, 0x31b3, 0x3a58, 0x3114, 0x3a45, 0x303b, 0x3a34, 0x2eb6, 0x3a26, 0x2d31, 0x3a1e, 0x2bef, 0x3a0b, 0x2a0d, 0x39ec, 0x28a1, 0x39c0, 0x271b, 0x3987, 0x2580, 0x3944, 0x2449, 0x38fa, 0x22bd, 0x38ac, 0x2155,
|
|
20
|
+
0x3b07, 0x2fca, 0x3b06, 0x2fca, 0x3b00, 0x2fb8, 0x3af4, 0x2f7c, 0x3adb, 0x2eea, 0x3ab4, 0x2e00, 0x3a85, 0x2cec, 0x3a5e, 0x2bc5, 0x3a36, 0x2a00, 0x3a0d, 0x2899, 0x39dc, 0x2707, 0x39a0, 0x2562, 0x395a, 0x2424, 0x390b, 0x2268, 0x38b7, 0x20fd, 0x385f, 0x1fd1,
|
|
21
|
+
0x3b69, 0x2cb9, 0x3b68, 0x2cbb, 0x3b62, 0x2cbb, 0x3b56, 0x2cae, 0x3b3b, 0x2c78, 0x3b0d, 0x2c0a, 0x3acf, 0x2ae3, 0x3a92, 0x2998, 0x3a54, 0x2867, 0x3a17, 0x26d0, 0x39d3, 0x253c, 0x3989, 0x2402, 0x3935, 0x2226, 0x38dc, 0x20bd, 0x387d, 0x1f54, 0x381d, 0x1db3,
|
|
22
|
+
0x3ba9, 0x296b, 0x3ba8, 0x296f, 0x3ba3, 0x297b, 0x3b98, 0x2987, 0x3b7f, 0x2976, 0x3b4e, 0x2927, 0x3b0e, 0x2895, 0x3ac2, 0x27b7, 0x3a73, 0x263b, 0x3a23, 0x24e7, 0x39d0, 0x239b, 0x3976, 0x21d9, 0x3917, 0x207e, 0x38b2, 0x1ee7, 0x384b, 0x1d53, 0x37c7, 0x1c1e,
|
|
23
|
+
0x3bd2, 0x25cb, 0x3bd1, 0x25d3, 0x3bcd, 0x25f0, 0x3bc2, 0x261f, 0x3bad, 0x2645, 0x3b7d, 0x262d, 0x3b3e, 0x25c4, 0x3aec, 0x250f, 0x3a93, 0x243a, 0x3a32, 0x22ce, 0x39d0, 0x215b, 0x3969, 0x202a, 0x38fe, 0x1e6e, 0x388f, 0x1cf1, 0x381f, 0x1b9b, 0x3762, 0x19dd,
|
|
24
|
+
0x3be9, 0x21ab, 0x3be9, 0x21b7, 0x3be5, 0x21e5, 0x3bdd, 0x2241, 0x3bc9, 0x22a7, 0x3ba0, 0x22ec, 0x3b62, 0x22cd, 0x3b0f, 0x2247, 0x3aae, 0x2175, 0x3a44, 0x2088, 0x39d4, 0x1f49, 0x3960, 0x1dbe, 0x38e9, 0x1c77, 0x3870, 0x1ae8, 0x37f1, 0x1953, 0x3708, 0x181b,
|
|
25
|
+
0x3bf6, 0x1cea, 0x3bf6, 0x1cfb, 0x3bf3, 0x1d38, 0x3bec, 0x1dbd, 0x3bda, 0x1e7c, 0x3bb7, 0x1f25, 0x3b7d, 0x1f79, 0x3b2c, 0x1f4c, 0x3ac6, 0x1ea6, 0x3a55, 0x1dbb, 0x39da, 0x1cbd, 0x395a, 0x1b9d, 0x38d8, 0x1a00, 0x3855, 0x18ac, 0x37ab, 0x173c, 0x36b7, 0x1598,
|
|
26
|
+
0x3bfc, 0x1736, 0x3bfc, 0x1759, 0x3bf9, 0x17e7, 0x3bf4, 0x1896, 0x3be4, 0x1997, 0x3bc6, 0x1aa8, 0x3b91, 0x1b84, 0x3b43, 0x1bd2, 0x3ade, 0x1b8a, 0x3a65, 0x1acd, 0x39e2, 0x19d3, 0x3957, 0x18cd, 0x38ca, 0x17b3, 0x383e, 0x1613, 0x376d, 0x14bf, 0x366f, 0x135e,
|
|
27
|
+
0x3bff, 0x101b, 0x3bff, 0x1039, 0x3bfc, 0x10c8, 0x3bf9, 0x1226, 0x3bea, 0x1428, 0x3bcf, 0x1584, 0x3b9f, 0x16c5, 0x3b54, 0x179a, 0x3af0, 0x17ce, 0x3a76, 0x1771, 0x39ea, 0x16a4, 0x3956, 0x15a7, 0x38bf, 0x14a7, 0x3829, 0x1379, 0x3735, 0x11ea, 0x362d, 0x10a1,
|
|
28
|
+
0x3c00, 0x061b, 0x3c00, 0x066a, 0x3bfe, 0x081c, 0x3bfa, 0x0a4c, 0x3bed, 0x0d16, 0x3bd5, 0x0fb3, 0x3ba9, 0x114d, 0x3b63, 0x127c, 0x3b01, 0x132f, 0x3a85, 0x1344, 0x39f4, 0x12d2, 0x3957, 0x120d, 0x38b5, 0x1122, 0x3817, 0x103c, 0x3703, 0x0ed3, 0x35f0, 0x0d6d,
|
|
29
|
+
0x3c00, 0x007a, 0x3c00, 0x0089, 0x3bfe, 0x011d, 0x3bfb, 0x027c, 0x3bf0, 0x04fa, 0x3bda, 0x0881, 0x3bb1, 0x0acd, 0x3b6f, 0x0c97, 0x3b10, 0x0d7b, 0x3a93, 0x0df1, 0x39fe, 0x0def, 0x3959, 0x0d8a, 0x38af, 0x0ce9, 0x3808, 0x0c31, 0x36d5, 0x0af0, 0x35b9, 0x09a3,
|
|
30
|
+
0x3c00, 0x0000, 0x3c00, 0x0001, 0x3bff, 0x0015, 0x3bfb, 0x0059, 0x3bf2, 0x00fd, 0x3bdd, 0x01df, 0x3bb7, 0x031c, 0x3b79, 0x047c, 0x3b1d, 0x05d4, 0x3aa0, 0x06d5, 0x3a08, 0x075a, 0x395d, 0x075e, 0x38aa, 0x06f7, 0x37f4, 0x0648, 0x36ac, 0x0576, 0x3586, 0x049f
|
|
31
|
+
] );
|
|
32
|
+
|
|
33
|
+
let lut = null;
|
|
34
|
+
|
|
35
|
+
const DFGLUT = /*@__PURE__*/ Fn( ( { roughness, dotNV } ) => {
|
|
36
|
+
|
|
37
|
+
if ( lut === null ) {
|
|
38
|
+
|
|
39
|
+
lut = new DataTexture( DATA, 16, 16, RGFormat, HalfFloatType );
|
|
40
|
+
lut.name = 'DFG_LUT';
|
|
41
|
+
lut.minFilter = LinearFilter;
|
|
42
|
+
lut.magFilter = LinearFilter;
|
|
43
|
+
lut.wrapS = ClampToEdgeWrapping;
|
|
44
|
+
lut.wrapT = ClampToEdgeWrapping;
|
|
45
|
+
lut.generateMipmaps = false;
|
|
46
|
+
lut.needsUpdate = true;
|
|
47
|
+
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
const uv = vec2( roughness, dotNV );
|
|
51
|
+
|
|
52
|
+
return texture( lut, uv ).rg;
|
|
53
|
+
|
|
54
|
+
} );
|
|
55
|
+
|
|
56
|
+
export default DFGLUT;
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import
|
|
1
|
+
import DFGLUT from './DFGLUT.js';
|
|
2
2
|
import { Fn } from '../../tsl/TSLBase.js';
|
|
3
3
|
|
|
4
4
|
const EnvironmentBRDF = /*@__PURE__*/ Fn( ( inputs ) => {
|
|
5
5
|
|
|
6
6
|
const { dotNV, specularColor, specularF90, roughness } = inputs;
|
|
7
7
|
|
|
8
|
-
const fab =
|
|
8
|
+
const fab = DFGLUT( { dotNV, roughness } );
|
|
9
9
|
return specularColor.mul( fab.x ).add( specularF90.mul( fab.y ) );
|
|
10
10
|
|
|
11
11
|
} );
|
|
@@ -9,7 +9,7 @@ const V_GGX_SmithCorrelated_Anisotropic = /*@__PURE__*/ Fn( ( { alphaT, alphaB,
|
|
|
9
9
|
const gl = dotNV.mul( vec3( alphaT.mul( dotTL ), alphaB.mul( dotBL ), dotNL ).length() );
|
|
10
10
|
const v = div( 0.5, gv.add( gl ) );
|
|
11
11
|
|
|
12
|
-
return v
|
|
12
|
+
return v;
|
|
13
13
|
|
|
14
14
|
} ).setLayout( {
|
|
15
15
|
name: 'V_GGX_SmithCorrelated_Anisotropic',
|
|
@@ -1,24 +1,23 @@
|
|
|
1
1
|
import BRDF_Lambert from './BSDF/BRDF_Lambert.js';
|
|
2
2
|
import BRDF_GGX from './BSDF/BRDF_GGX.js';
|
|
3
3
|
import BRDF_GGX_Multiscatter from './BSDF/BRDF_GGX_Multiscatter.js';
|
|
4
|
-
import
|
|
4
|
+
import DFGLUT from './BSDF/DFGLUT.js';
|
|
5
5
|
import EnvironmentBRDF from './BSDF/EnvironmentBRDF.js';
|
|
6
6
|
import F_Schlick from './BSDF/F_Schlick.js';
|
|
7
7
|
import Schlick_to_F0 from './BSDF/Schlick_to_F0.js';
|
|
8
8
|
import BRDF_Sheen from './BSDF/BRDF_Sheen.js';
|
|
9
9
|
import { LTC_Evaluate, LTC_Uv } from './BSDF/LTC.js';
|
|
10
10
|
import LightingModel from '../core/LightingModel.js';
|
|
11
|
-
import { diffuseColor, specularColor, specularF90, roughness, clearcoat, clearcoatRoughness, sheen, sheenRoughness, iridescence, iridescenceIOR, iridescenceThickness, ior, thickness, transmission, attenuationDistance, attenuationColor, dispersion } from '../core/PropertyNode.js';
|
|
11
|
+
import { diffuseColor, diffuseContribution, specularColor, specularColorBlended, specularF90, roughness, metalness, clearcoat, clearcoatRoughness, sheen, sheenRoughness, iridescence, iridescenceIOR, iridescenceThickness, ior, thickness, transmission, attenuationDistance, attenuationColor, dispersion } from '../core/PropertyNode.js';
|
|
12
12
|
import { normalView, clearcoatNormalView, normalWorld } from '../accessors/Normal.js';
|
|
13
13
|
import { positionViewDirection, positionView, positionWorld } from '../accessors/Position.js';
|
|
14
14
|
import { Fn, float, vec2, vec3, vec4, mat3, If } from '../tsl/TSLBase.js';
|
|
15
|
-
import { select } from '../math/ConditionalNode.js';
|
|
16
15
|
import { mix, normalize, refract, length, clamp, log2, log, exp, smoothstep } from '../math/MathNode.js';
|
|
17
16
|
import { div } from '../math/OperatorNode.js';
|
|
18
17
|
import { cameraPosition, cameraProjectionMatrix, cameraViewMatrix } from '../accessors/Camera.js';
|
|
19
18
|
import { modelWorldMatrix } from '../accessors/ModelNode.js';
|
|
20
19
|
import { screenSize } from '../display/ScreenNode.js';
|
|
21
|
-
import { viewportMipTexture } from '../display/ViewportTextureNode.js';
|
|
20
|
+
import { viewportMipTexture, viewportOpaqueMipTexture } from '../display/ViewportTextureNode.js';
|
|
22
21
|
import { textureBicubicLevel } from '../accessors/TextureBicubic.js';
|
|
23
22
|
import { Loop } from '../utils/LoopNode.js';
|
|
24
23
|
import { BackSide } from '../../constants.js';
|
|
@@ -70,7 +69,7 @@ const applyIorToRoughness = /*@__PURE__*/ Fn( ( [ roughness, ior ] ) => {
|
|
|
70
69
|
} );
|
|
71
70
|
|
|
72
71
|
const viewportBackSideTexture = /*@__PURE__*/ viewportMipTexture();
|
|
73
|
-
const viewportFrontSideTexture = /*@__PURE__*/
|
|
72
|
+
const viewportFrontSideTexture = /*@__PURE__*/ viewportOpaqueMipTexture();
|
|
74
73
|
|
|
75
74
|
const getTransmissionSample = /*@__PURE__*/ Fn( ( [ fragCoord, roughness, ior ], { material } ) => {
|
|
76
75
|
|
|
@@ -313,29 +312,19 @@ const evalIridescence = /*@__PURE__*/ Fn( ( { outsideIOR, eta2, cosTheta1, thinF
|
|
|
313
312
|
//
|
|
314
313
|
|
|
315
314
|
// This is a curve-fit approximation to the "Charlie sheen" BRDF integrated over the hemisphere from
|
|
316
|
-
// Estevez and Kulla 2017, "Production Friendly Microfacet Sheen BRDF".
|
|
317
|
-
// in the Sheen section of https://drive.google.com/file/d/1T0D1VSyR4AllqIJTQAraEIzjlb5h4FKH/view?usp=sharing
|
|
315
|
+
// Estevez and Kulla 2017, "Production Friendly Microfacet Sheen BRDF".
|
|
318
316
|
const IBLSheenBRDF = /*@__PURE__*/ Fn( ( { normal, viewDir, roughness } ) => {
|
|
319
317
|
|
|
320
318
|
const dotNV = normal.dot( viewDir ).saturate();
|
|
319
|
+
const r2 = roughness.mul( roughness );
|
|
320
|
+
const rInv = roughness.add( 0.1 ).reciprocal();
|
|
321
321
|
|
|
322
|
-
const
|
|
322
|
+
const a = float( - 1.9362 ).add( roughness.mul( 1.0678 ) ).add( r2.mul( 0.4573 ) ).sub( rInv.mul( 0.8469 ) );
|
|
323
|
+
const b = float( - 0.6014 ).add( roughness.mul( 0.5538 ) ).sub( r2.mul( 0.4670 ) ).sub( rInv.mul( 0.1255 ) );
|
|
323
324
|
|
|
324
|
-
const
|
|
325
|
-
roughness.lessThan( 0.25 ),
|
|
326
|
-
float( - 339.2 ).mul( r2 ).add( float( 161.4 ).mul( roughness ) ).sub( 25.9 ),
|
|
327
|
-
float( - 8.48 ).mul( r2 ).add( float( 14.3 ).mul( roughness ) ).sub( 9.95 )
|
|
328
|
-
);
|
|
329
|
-
|
|
330
|
-
const b = select(
|
|
331
|
-
roughness.lessThan( 0.25 ),
|
|
332
|
-
float( 44.0 ).mul( r2 ).sub( float( 23.7 ).mul( roughness ) ).add( 3.26 ),
|
|
333
|
-
float( 1.97 ).mul( r2 ).sub( float( 3.27 ).mul( roughness ) ).add( 0.72 )
|
|
334
|
-
);
|
|
335
|
-
|
|
336
|
-
const DG = select( roughness.lessThan( 0.25 ), 0.0, float( 0.1 ).mul( roughness ).sub( 0.025 ) ).add( a.mul( dotNV ).add( b ).exp() );
|
|
325
|
+
const DG = a.mul( dotNV ).add( b ).exp();
|
|
337
326
|
|
|
338
|
-
return DG.
|
|
327
|
+
return DG.saturate();
|
|
339
328
|
|
|
340
329
|
} );
|
|
341
330
|
|
|
@@ -468,6 +457,22 @@ class PhysicalLightingModel extends LightingModel {
|
|
|
468
457
|
*/
|
|
469
458
|
this.iridescenceF0 = null;
|
|
470
459
|
|
|
460
|
+
/**
|
|
461
|
+
* The iridescence F0 dielectric.
|
|
462
|
+
*
|
|
463
|
+
* @type {?Node}
|
|
464
|
+
* @default null
|
|
465
|
+
*/
|
|
466
|
+
this.iridescenceF0Dielectric = null;
|
|
467
|
+
|
|
468
|
+
/**
|
|
469
|
+
* The iridescence F0 metallic.
|
|
470
|
+
*
|
|
471
|
+
* @type {?Node}
|
|
472
|
+
* @default null
|
|
473
|
+
*/
|
|
474
|
+
this.iridescenceF0Metallic = null;
|
|
475
|
+
|
|
471
476
|
}
|
|
472
477
|
|
|
473
478
|
/**
|
|
@@ -497,7 +502,7 @@ class PhysicalLightingModel extends LightingModel {
|
|
|
497
502
|
|
|
498
503
|
const dotNVi = normalView.dot( positionViewDirection ).clamp();
|
|
499
504
|
|
|
500
|
-
|
|
505
|
+
const iridescenceFresnelDielectric = evalIridescence( {
|
|
501
506
|
outsideIOR: float( 1.0 ),
|
|
502
507
|
eta2: iridescenceIOR,
|
|
503
508
|
cosTheta1: dotNVi,
|
|
@@ -505,7 +510,20 @@ class PhysicalLightingModel extends LightingModel {
|
|
|
505
510
|
baseF0: specularColor
|
|
506
511
|
} );
|
|
507
512
|
|
|
508
|
-
|
|
513
|
+
const iridescenceFresnelMetallic = evalIridescence( {
|
|
514
|
+
outsideIOR: float( 1.0 ),
|
|
515
|
+
eta2: iridescenceIOR,
|
|
516
|
+
cosTheta1: dotNVi,
|
|
517
|
+
thinFilmThickness: iridescenceThickness,
|
|
518
|
+
baseF0: diffuseColor.rgb
|
|
519
|
+
} );
|
|
520
|
+
|
|
521
|
+
this.iridescenceFresnel = mix( iridescenceFresnelDielectric, iridescenceFresnelMetallic, metalness );
|
|
522
|
+
|
|
523
|
+
this.iridescenceF0Dielectric = Schlick_to_F0( { f: iridescenceFresnelDielectric, f90: 1.0, dotVH: dotNVi } );
|
|
524
|
+
this.iridescenceF0Metallic = Schlick_to_F0( { f: iridescenceFresnelMetallic, f90: 1.0, dotVH: dotNVi } );
|
|
525
|
+
|
|
526
|
+
this.iridescenceF0 = mix( this.iridescenceF0Dielectric, this.iridescenceF0Metallic, metalness );
|
|
509
527
|
|
|
510
528
|
}
|
|
511
529
|
|
|
@@ -521,8 +539,8 @@ class PhysicalLightingModel extends LightingModel {
|
|
|
521
539
|
n,
|
|
522
540
|
v,
|
|
523
541
|
roughness,
|
|
524
|
-
|
|
525
|
-
|
|
542
|
+
diffuseContribution,
|
|
543
|
+
specularColorBlended,
|
|
526
544
|
specularF90, // specularF90
|
|
527
545
|
position, // positionWorld
|
|
528
546
|
modelWorldMatrix, // modelMatrix
|
|
@@ -549,13 +567,13 @@ class PhysicalLightingModel extends LightingModel {
|
|
|
549
567
|
// Approximates multi-scattering in order to preserve energy.
|
|
550
568
|
// http://www.jcgt.org/published/0008/01/03/
|
|
551
569
|
|
|
552
|
-
computeMultiscattering( singleScatter, multiScatter, specularF90 ) {
|
|
570
|
+
computeMultiscattering( singleScatter, multiScatter, specularF90, f0, iridescenceF0 = null ) {
|
|
553
571
|
|
|
554
572
|
const dotNV = normalView.dot( positionViewDirection ).clamp(); // @ TODO: Move to core dotNV
|
|
555
573
|
|
|
556
|
-
const fab =
|
|
574
|
+
const fab = DFGLUT( { roughness, dotNV } );
|
|
557
575
|
|
|
558
|
-
const Fr =
|
|
576
|
+
const Fr = iridescenceF0 ? iridescence.mix( f0, iridescenceF0 ) : f0;
|
|
559
577
|
|
|
560
578
|
const FssEss = Fr.mul( fab.x ).add( specularF90.mul( fab.y ) );
|
|
561
579
|
|
|
@@ -579,12 +597,19 @@ class PhysicalLightingModel extends LightingModel {
|
|
|
579
597
|
direct( { lightDirection, lightColor, reflectedLight }, /* builder */ ) {
|
|
580
598
|
|
|
581
599
|
const dotNL = normalView.dot( lightDirection ).clamp();
|
|
582
|
-
const irradiance = dotNL.mul( lightColor );
|
|
600
|
+
const irradiance = dotNL.mul( lightColor ).toVar();
|
|
583
601
|
|
|
584
602
|
if ( this.sheen === true ) {
|
|
585
603
|
|
|
586
604
|
this.sheenSpecularDirect.addAssign( irradiance.mul( BRDF_Sheen( { lightDirection } ) ) );
|
|
587
605
|
|
|
606
|
+
const sheenAlbedoV = IBLSheenBRDF( { normal: normalView, viewDir: positionViewDirection, roughness: sheenRoughness } );
|
|
607
|
+
const sheenAlbedoL = IBLSheenBRDF( { normal: normalView, viewDir: lightDirection, roughness: sheenRoughness } );
|
|
608
|
+
|
|
609
|
+
const sheenEnergyComp = sheen.r.max( sheen.g ).max( sheen.b ).mul( sheenAlbedoV.max( sheenAlbedoL ) ).oneMinus();
|
|
610
|
+
|
|
611
|
+
irradiance.mulAssign( sheenEnergyComp );
|
|
612
|
+
|
|
588
613
|
}
|
|
589
614
|
|
|
590
615
|
if ( this.clearcoat === true ) {
|
|
@@ -596,9 +621,9 @@ class PhysicalLightingModel extends LightingModel {
|
|
|
596
621
|
|
|
597
622
|
}
|
|
598
623
|
|
|
599
|
-
reflectedLight.directDiffuse.addAssign( irradiance.mul( BRDF_Lambert( { diffuseColor:
|
|
624
|
+
reflectedLight.directDiffuse.addAssign( irradiance.mul( BRDF_Lambert( { diffuseColor: diffuseContribution } ) ) );
|
|
600
625
|
|
|
601
|
-
reflectedLight.directSpecular.addAssign( irradiance.mul( BRDF_GGX_Multiscatter( { lightDirection, f0:
|
|
626
|
+
reflectedLight.directSpecular.addAssign( irradiance.mul( BRDF_GGX_Multiscatter( { lightDirection, f0: specularColorBlended, f90: 1, roughness, f: this.iridescenceFresnel, USE_IRIDESCENCE: this.iridescence, USE_ANISOTROPY: this.anisotropy } ) ) );
|
|
602
627
|
|
|
603
628
|
}
|
|
604
629
|
|
|
@@ -633,11 +658,33 @@ class PhysicalLightingModel extends LightingModel {
|
|
|
633
658
|
|
|
634
659
|
// LTC Fresnel Approximation by Stephen Hill
|
|
635
660
|
// http://blog.selfshadow.com/publications/s2016-advances/s2016_ltc_fresnel.pdf
|
|
636
|
-
const fresnel =
|
|
661
|
+
const fresnel = specularColorBlended.mul( t2.x ).add( specularF90.sub( specularColorBlended ).mul( t2.y ) ).toVar();
|
|
637
662
|
|
|
638
663
|
reflectedLight.directSpecular.addAssign( lightColor.mul( fresnel ).mul( LTC_Evaluate( { N, V, P, mInv, p0, p1, p2, p3 } ) ) );
|
|
639
664
|
|
|
640
|
-
reflectedLight.directDiffuse.addAssign( lightColor.mul(
|
|
665
|
+
reflectedLight.directDiffuse.addAssign( lightColor.mul( diffuseContribution ).mul( LTC_Evaluate( { N, V, P, mInv: mat3( 1, 0, 0, 0, 1, 0, 0, 0, 1 ), p0, p1, p2, p3 } ) ) );
|
|
666
|
+
|
|
667
|
+
if ( this.clearcoat === true ) {
|
|
668
|
+
|
|
669
|
+
const Ncc = clearcoatNormalView;
|
|
670
|
+
|
|
671
|
+
const uvClearcoat = LTC_Uv( { N: Ncc, V, roughness: clearcoatRoughness } );
|
|
672
|
+
|
|
673
|
+
const t1Clearcoat = ltc_1.sample( uvClearcoat );
|
|
674
|
+
const t2Clearcoat = ltc_2.sample( uvClearcoat );
|
|
675
|
+
|
|
676
|
+
const mInvClearcoat = mat3(
|
|
677
|
+
vec3( t1Clearcoat.x, 0, t1Clearcoat.y ),
|
|
678
|
+
vec3( 0, 1, 0 ),
|
|
679
|
+
vec3( t1Clearcoat.z, 0, t1Clearcoat.w )
|
|
680
|
+
);
|
|
681
|
+
|
|
682
|
+
// LTC Fresnel Approximation for clearcoat
|
|
683
|
+
const fresnelClearcoat = clearcoatF0.mul( t2Clearcoat.x ).add( clearcoatF90.sub( clearcoatF0 ).mul( t2Clearcoat.y ) );
|
|
684
|
+
|
|
685
|
+
this.clearcoatSpecularDirect.addAssign( lightColor.mul( fresnelClearcoat ).mul( LTC_Evaluate( { N: Ncc, V, P, mInv: mInvClearcoat, p0, p1, p2, p3 } ) ) );
|
|
686
|
+
|
|
687
|
+
}
|
|
641
688
|
|
|
642
689
|
}
|
|
643
690
|
|
|
@@ -663,7 +710,19 @@ class PhysicalLightingModel extends LightingModel {
|
|
|
663
710
|
|
|
664
711
|
const { irradiance, reflectedLight } = builder.context;
|
|
665
712
|
|
|
666
|
-
|
|
713
|
+
const diffuse = irradiance.mul( BRDF_Lambert( { diffuseColor: diffuseContribution } ) ).toVar();
|
|
714
|
+
|
|
715
|
+
if ( this.sheen === true ) {
|
|
716
|
+
|
|
717
|
+
const sheenAlbedo = IBLSheenBRDF( { normal: normalView, viewDir: positionViewDirection, roughness: sheenRoughness } );
|
|
718
|
+
|
|
719
|
+
const sheenEnergyComp = sheen.r.max( sheen.g ).max( sheen.b ).mul( sheenAlbedo ).oneMinus();
|
|
720
|
+
|
|
721
|
+
diffuse.mulAssign( sheenEnergyComp );
|
|
722
|
+
|
|
723
|
+
}
|
|
724
|
+
|
|
725
|
+
reflectedLight.indirectDiffuse.addAssign( diffuse );
|
|
667
726
|
|
|
668
727
|
}
|
|
669
728
|
|
|
@@ -705,21 +764,44 @@ class PhysicalLightingModel extends LightingModel {
|
|
|
705
764
|
}
|
|
706
765
|
|
|
707
766
|
// Both indirect specular and indirect diffuse light accumulate here
|
|
767
|
+
// Compute multiscattering separately for dielectric and metallic, then mix
|
|
768
|
+
|
|
769
|
+
const singleScatteringDielectric = vec3().toVar( 'singleScatteringDielectric' );
|
|
770
|
+
const multiScatteringDielectric = vec3().toVar( 'multiScatteringDielectric' );
|
|
771
|
+
const singleScatteringMetallic = vec3().toVar( 'singleScatteringMetallic' );
|
|
772
|
+
const multiScatteringMetallic = vec3().toVar( 'multiScatteringMetallic' );
|
|
773
|
+
|
|
774
|
+
this.computeMultiscattering( singleScatteringDielectric, multiScatteringDielectric, specularF90, specularColor, this.iridescenceF0Dielectric );
|
|
775
|
+
this.computeMultiscattering( singleScatteringMetallic, multiScatteringMetallic, specularF90, diffuseColor.rgb, this.iridescenceF0Metallic );
|
|
776
|
+
|
|
777
|
+
// Mix based on metalness
|
|
778
|
+
const singleScattering = mix( singleScatteringDielectric, singleScatteringMetallic, metalness );
|
|
779
|
+
const multiScattering = mix( multiScatteringDielectric, multiScatteringMetallic, metalness );
|
|
780
|
+
|
|
781
|
+
// Diffuse energy conservation uses dielectric path
|
|
782
|
+
const totalScatteringDielectric = singleScatteringDielectric.add( multiScatteringDielectric );
|
|
783
|
+
|
|
784
|
+
const diffuse = diffuseContribution.mul( totalScatteringDielectric.oneMinus() );
|
|
708
785
|
|
|
709
|
-
const singleScattering = vec3().toVar( 'singleScattering' );
|
|
710
|
-
const multiScattering = vec3().toVar( 'multiScattering' );
|
|
711
786
|
const cosineWeightedIrradiance = iblIrradiance.mul( 1 / Math.PI );
|
|
712
787
|
|
|
713
|
-
|
|
788
|
+
const indirectSpecular = radiance.mul( singleScattering ).add( multiScattering.mul( cosineWeightedIrradiance ) ).toVar();
|
|
789
|
+
const indirectDiffuse = diffuse.mul( cosineWeightedIrradiance ).toVar();
|
|
790
|
+
|
|
791
|
+
if ( this.sheen === true ) {
|
|
714
792
|
|
|
715
|
-
|
|
793
|
+
const sheenAlbedo = IBLSheenBRDF( { normal: normalView, viewDir: positionViewDirection, roughness: sheenRoughness } );
|
|
716
794
|
|
|
717
|
-
|
|
795
|
+
const sheenEnergyComp = sheen.r.max( sheen.g ).max( sheen.b ).mul( sheenAlbedo ).oneMinus();
|
|
796
|
+
|
|
797
|
+
indirectSpecular.mulAssign( sheenEnergyComp );
|
|
798
|
+
indirectDiffuse.mulAssign( sheenEnergyComp );
|
|
799
|
+
|
|
800
|
+
}
|
|
718
801
|
|
|
719
|
-
reflectedLight.indirectSpecular.addAssign(
|
|
720
|
-
reflectedLight.indirectSpecular.addAssign( multiScattering.mul( cosineWeightedIrradiance ) );
|
|
802
|
+
reflectedLight.indirectSpecular.addAssign( indirectSpecular );
|
|
721
803
|
|
|
722
|
-
reflectedLight.indirectDiffuse.addAssign(
|
|
804
|
+
reflectedLight.indirectDiffuse.addAssign( indirectDiffuse );
|
|
723
805
|
|
|
724
806
|
}
|
|
725
807
|
|
|
@@ -783,8 +865,7 @@ class PhysicalLightingModel extends LightingModel {
|
|
|
783
865
|
|
|
784
866
|
if ( this.sheen === true ) {
|
|
785
867
|
|
|
786
|
-
const
|
|
787
|
-
const sheenLight = outgoingLight.mul( sheenEnergyComp ).add( this.sheenSpecularDirect, this.sheenSpecularIndirect );
|
|
868
|
+
const sheenLight = outgoingLight.add( this.sheenSpecularDirect, this.sheenSpecularIndirect.mul( 1.0 / Math.PI ) );
|
|
788
869
|
|
|
789
870
|
outgoingLight.assign( sheenLight );
|
|
790
871
|
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import Node from '../core/Node.js';
|
|
2
|
+
import NodeError from '../core/NodeError.js';
|
|
2
3
|
import { getValueType } from '../core/NodeUtils.js';
|
|
3
4
|
import { buffer } from '../accessors/BufferNode.js';
|
|
4
5
|
import { instancedBufferAttribute } from '../accessors/BufferAttributeNode.js';
|
|
@@ -111,7 +112,7 @@ class RangeNode extends Node {
|
|
|
111
112
|
|
|
112
113
|
if ( output === null ) {
|
|
113
114
|
|
|
114
|
-
throw new
|
|
115
|
+
throw new NodeError( 'THREE.TSL: No "ConstNode" found in node graph.', this.stackTrace );
|
|
115
116
|
|
|
116
117
|
}
|
|
117
118
|
|
|
@@ -167,8 +168,9 @@ class RangeNode extends Node {
|
|
|
167
168
|
}
|
|
168
169
|
|
|
169
170
|
const nodeType = this.getNodeType( builder );
|
|
171
|
+
const uniformBufferSize = object.count * 4 * 4; // count * 4 components * 4 bytes (float)
|
|
170
172
|
|
|
171
|
-
if (
|
|
173
|
+
if ( uniformBufferSize <= builder.getUniformBufferLimit() ) {
|
|
172
174
|
|
|
173
175
|
output = buffer( array, 'vec4', object.count ).element( instanceIndex ).convert( nodeType );
|
|
174
176
|
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import Node from '../core/Node.js';
|
|
2
|
-
import { nodeObject } from '../tsl/TSLBase.js';
|
|
3
2
|
import { warn } from '../../utils.js';
|
|
4
3
|
|
|
5
4
|
/**
|
|
@@ -149,7 +148,7 @@ export default ComputeBuiltinNode;
|
|
|
149
148
|
* @param {string} nodeType - The node type.
|
|
150
149
|
* @returns {ComputeBuiltinNode}
|
|
151
150
|
*/
|
|
152
|
-
const computeBuiltin = ( name, nodeType ) =>
|
|
151
|
+
const computeBuiltin = ( name, nodeType ) => new ComputeBuiltinNode( name, nodeType );
|
|
153
152
|
|
|
154
153
|
/**
|
|
155
154
|
* Represents the number of workgroups dispatched by the compute shader.
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import Node from '../core/Node.js';
|
|
2
|
+
import StackTrace from '../core/StackTrace.js';
|
|
2
3
|
import { NodeUpdateType } from '../core/constants.js';
|
|
3
4
|
import { addMethodChaining, nodeObject } from '../tsl/TSLCore.js';
|
|
4
5
|
import { warn, error } from '../../utils.js';
|
|
@@ -148,7 +149,7 @@ class ComputeNode extends Node {
|
|
|
148
149
|
*/
|
|
149
150
|
label( name ) {
|
|
150
151
|
|
|
151
|
-
warn( 'TSL: "label()" has been deprecated. Use "setName()" instead.' ); // @deprecated r179
|
|
152
|
+
warn( 'TSL: "label()" has been deprecated. Use "setName()" instead.', new StackTrace() ); // @deprecated r179
|
|
152
153
|
|
|
153
154
|
return this.setName( name );
|
|
154
155
|
|
|
@@ -242,7 +243,7 @@ export const computeKernel = ( node, workgroupSize = [ 64 ] ) => {
|
|
|
242
243
|
|
|
243
244
|
if ( workgroupSize.length === 0 || workgroupSize.length > 3 ) {
|
|
244
245
|
|
|
245
|
-
error( 'TSL: compute() workgroupSize must have 1, 2, or 3 elements' );
|
|
246
|
+
error( 'TSL: compute() workgroupSize must have 1, 2, or 3 elements', new StackTrace() );
|
|
246
247
|
|
|
247
248
|
}
|
|
248
249
|
|
|
@@ -252,7 +253,7 @@ export const computeKernel = ( node, workgroupSize = [ 64 ] ) => {
|
|
|
252
253
|
|
|
253
254
|
if ( typeof val !== 'number' || val <= 0 || ! Number.isInteger( val ) ) {
|
|
254
255
|
|
|
255
|
-
error( `TSL: compute() workgroupSize element at index [ ${ i } ] must be a positive integer
|
|
256
|
+
error( `TSL: compute() workgroupSize element at index [ ${ i } ] must be a positive integer`, new StackTrace() );
|
|
256
257
|
|
|
257
258
|
}
|
|
258
259
|
|
|
@@ -264,7 +265,7 @@ export const computeKernel = ( node, workgroupSize = [ 64 ] ) => {
|
|
|
264
265
|
|
|
265
266
|
//
|
|
266
267
|
|
|
267
|
-
return
|
|
268
|
+
return new ComputeNode( nodeObject( node ), workgroupSize );
|
|
268
269
|
|
|
269
270
|
};
|
|
270
271
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import ArrayElementNode from '../utils/ArrayElementNode.js';
|
|
2
|
-
import { nodeObject } from '../tsl/TSLCore.js';
|
|
3
2
|
import Node from '../core/Node.js';
|
|
4
3
|
import { warn } from '../../utils.js';
|
|
4
|
+
import StackTrace from '../core/StackTrace.js';
|
|
5
5
|
|
|
6
6
|
/**
|
|
7
7
|
* Represents an element of a 'workgroup' scoped buffer.
|
|
@@ -150,7 +150,7 @@ class WorkgroupInfoNode extends Node {
|
|
|
150
150
|
*/
|
|
151
151
|
label( name ) {
|
|
152
152
|
|
|
153
|
-
warn( 'TSL: "label()" has been deprecated. Use "setName()" instead.' ); // @deprecated r179
|
|
153
|
+
warn( 'TSL: "label()" has been deprecated. Use "setName()" instead.', new StackTrace() ); // @deprecated r179
|
|
154
154
|
|
|
155
155
|
return this.setName( name );
|
|
156
156
|
|
|
@@ -203,7 +203,7 @@ class WorkgroupInfoNode extends Node {
|
|
|
203
203
|
*/
|
|
204
204
|
element( indexNode ) {
|
|
205
205
|
|
|
206
|
-
return
|
|
206
|
+
return new WorkgroupInfoElementNode( this, indexNode );
|
|
207
207
|
|
|
208
208
|
}
|
|
209
209
|
|
|
@@ -229,6 +229,6 @@ export default WorkgroupInfoNode;
|
|
|
229
229
|
* @param {number} [count=0] - The number of elements in the buffer.
|
|
230
230
|
* @returns {WorkgroupInfoNode}
|
|
231
231
|
*/
|
|
232
|
-
export const workgroupArray = ( type, count ) =>
|
|
232
|
+
export const workgroupArray = ( type, count ) => new WorkgroupInfoNode( 'Workgroup', type, count );
|
|
233
233
|
|
|
234
234
|
|
|
@@ -96,6 +96,53 @@ class AnalyticLightNode extends LightingNode {
|
|
|
96
96
|
*/
|
|
97
97
|
this.updateType = NodeUpdateType.FRAME;
|
|
98
98
|
|
|
99
|
+
if ( light && light.shadow ) {
|
|
100
|
+
|
|
101
|
+
this._shadowDisposeListener = () => {
|
|
102
|
+
|
|
103
|
+
this.disposeShadow();
|
|
104
|
+
|
|
105
|
+
};
|
|
106
|
+
|
|
107
|
+
light.addEventListener( 'dispose', this._shadowDisposeListener );
|
|
108
|
+
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
dispose() {
|
|
114
|
+
|
|
115
|
+
if ( this._shadowDisposeListener ) {
|
|
116
|
+
|
|
117
|
+
this.light.removeEventListener( 'dispose', this._shadowDisposeListener );
|
|
118
|
+
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
super.dispose();
|
|
122
|
+
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
/**
|
|
126
|
+
* Frees internal resources related to shadows.
|
|
127
|
+
*/
|
|
128
|
+
disposeShadow() {
|
|
129
|
+
|
|
130
|
+
if ( this.shadowNode !== null ) {
|
|
131
|
+
|
|
132
|
+
this.shadowNode.dispose();
|
|
133
|
+
this.shadowNode = null;
|
|
134
|
+
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
this.shadowColorNode = null;
|
|
138
|
+
|
|
139
|
+
if ( this.baseColorNode !== null ) {
|
|
140
|
+
|
|
141
|
+
this.colorNode = this.baseColorNode;
|
|
142
|
+
this.baseColorNode = null;
|
|
143
|
+
|
|
144
|
+
}
|
|
145
|
+
|
|
99
146
|
}
|
|
100
147
|
|
|
101
148
|
getHash() {
|
|
@@ -188,6 +235,12 @@ class AnalyticLightNode extends LightingNode {
|
|
|
188
235
|
|
|
189
236
|
//
|
|
190
237
|
|
|
238
|
+
if ( builder.context.getShadow ) {
|
|
239
|
+
|
|
240
|
+
shadowColorNode = builder.context.getShadow( this, builder );
|
|
241
|
+
|
|
242
|
+
}
|
|
243
|
+
|
|
191
244
|
this.colorNode = shadowColorNode;
|
|
192
245
|
|
|
193
246
|
}
|
|
@@ -9,7 +9,7 @@ import { bentNormalView } from '../accessors/AccessorsUtils.js';
|
|
|
9
9
|
import { pmremTexture } from '../pmrem/PMREMNode.js';
|
|
10
10
|
import { materialEnvIntensity } from '../accessors/MaterialProperties.js';
|
|
11
11
|
|
|
12
|
-
const
|
|
12
|
+
const _rendererCache = new WeakMap();
|
|
13
13
|
|
|
14
14
|
/**
|
|
15
15
|
* Represents a physical model for Image-based lighting (IBL). The environment
|
|
@@ -55,13 +55,15 @@ class EnvironmentNode extends LightingNode {
|
|
|
55
55
|
|
|
56
56
|
const value = ( envNode.isTextureNode ) ? envNode.value : material[ envNode.property ];
|
|
57
57
|
|
|
58
|
-
|
|
58
|
+
const cache = this._getPMREMNodeCache( builder.renderer );
|
|
59
|
+
|
|
60
|
+
let cacheEnvNode = cache.get( value );
|
|
59
61
|
|
|
60
62
|
if ( cacheEnvNode === undefined ) {
|
|
61
63
|
|
|
62
64
|
cacheEnvNode = pmremTexture( value );
|
|
63
65
|
|
|
64
|
-
|
|
66
|
+
cache.set( value, cacheEnvNode );
|
|
65
67
|
|
|
66
68
|
}
|
|
67
69
|
|
|
@@ -101,6 +103,29 @@ class EnvironmentNode extends LightingNode {
|
|
|
101
103
|
|
|
102
104
|
}
|
|
103
105
|
|
|
106
|
+
/**
|
|
107
|
+
* Returns the PMREM node cache of the current renderer.
|
|
108
|
+
*
|
|
109
|
+
* @private
|
|
110
|
+
* @param {Renderer} renderer - The current renderer.
|
|
111
|
+
* @return {WeakMap} The node cache.
|
|
112
|
+
*/
|
|
113
|
+
_getPMREMNodeCache( renderer ) {
|
|
114
|
+
|
|
115
|
+
let pmremCache = _rendererCache.get( renderer );
|
|
116
|
+
|
|
117
|
+
if ( pmremCache === undefined ) {
|
|
118
|
+
|
|
119
|
+
pmremCache = new WeakMap();
|
|
120
|
+
|
|
121
|
+
_rendererCache.set( renderer, pmremCache );
|
|
122
|
+
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
return pmremCache;
|
|
126
|
+
|
|
127
|
+
}
|
|
128
|
+
|
|
104
129
|
}
|
|
105
130
|
|
|
106
131
|
export default EnvironmentNode;
|
|
@@ -234,7 +234,7 @@ class LightsNode extends Node {
|
|
|
234
234
|
|
|
235
235
|
if ( ! _lightsNodeRef.has( light ) ) {
|
|
236
236
|
|
|
237
|
-
lightNode =
|
|
237
|
+
lightNode = new lightNodeClass( light );
|
|
238
238
|
_lightsNodeRef.set( light, lightNode );
|
|
239
239
|
|
|
240
240
|
} else {
|
|
@@ -450,4 +450,4 @@ export default LightsNode;
|
|
|
450
450
|
* @param {Array<Light>} lights - An array of lights.
|
|
451
451
|
* @return {LightsNode} The created lights node.
|
|
452
452
|
*/
|
|
453
|
-
export const lights = ( lights = [] ) =>
|
|
453
|
+
export const lights = ( lights = [] ) => new LightsNode().setLights( lights );
|