@gnsx/three 0.185.15 → 0.186.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/build/three.cjs +10 -82600
- package/build/three.core.js +1303 -728
- package/build/three.module.js +439 -338
- package/build/three.tsl.js +74 -44
- package/build/three.webgpu.js +6036 -2184
- package/build/three.webgpu.nodes.js +6020 -2184
- package/examples/jsm/Addons.js +6 -6
- package/examples/jsm/controls/ArcballControls.js +1 -1
- package/examples/jsm/controls/FirstPersonControls.js +44 -20
- package/examples/jsm/controls/OrbitControls.js +9 -0
- package/examples/jsm/controls/TrackballControls.js +109 -4
- package/examples/jsm/csm/CSMShadowNode.js +13 -0
- package/examples/jsm/exporters/GLTFExporter.js +23 -7
- package/examples/jsm/exporters/USDZExporter.js +2 -2
- package/examples/jsm/generators/CityGenerator.js +377 -45
- package/examples/jsm/generators/ForestGenerator.js +12 -12
- package/examples/jsm/generators/TerrainGenerator.js +49 -37
- package/examples/jsm/generators/TreeGenerator.js +70 -76
- package/examples/jsm/generators/city/BenchGenerator.js +127 -0
- package/examples/jsm/generators/city/CarGenerator.js +479 -0
- package/examples/jsm/generators/city/CityGeneratorUtils.js +31 -0
- package/examples/jsm/generators/city/HydrantGenerator.js +106 -0
- package/examples/jsm/generators/city/InstancedMeshGenerator.js +86 -0
- package/examples/jsm/generators/city/PersonGenerator.js +447 -0
- package/examples/jsm/generators/city/SidewalkGenerator.js +33 -38
- package/examples/jsm/generators/city/SkyscraperGenerator.js +448 -48
- package/examples/jsm/generators/city/StreetTreeGenerator.js +231 -0
- package/examples/jsm/generators/city/StreetlightGenerator.js +100 -0
- package/examples/jsm/generators/city/TrafficlightGenerator.js +106 -0
- package/examples/jsm/generators/city/TrashcanGenerator.js +100 -0
- package/examples/jsm/geometries/BoxLineGeometry.js +1 -1
- package/examples/jsm/geometries/ParametricGeometry.js +1 -1
- package/examples/jsm/geometries/RoundedBoxGeometry.js +1 -1
- package/examples/jsm/gpgpu/CountingSort.js +271 -0
- package/examples/jsm/helpers/LightProbeGridHelper.js +60 -239
- package/examples/jsm/helpers/LightProbeGridHelperWebGL.js +221 -0
- package/examples/jsm/inspector/Extension.js +94 -0
- package/examples/jsm/inspector/Inspector.js +145 -41
- package/examples/jsm/inspector/RendererInspector.js +100 -52
- package/examples/jsm/inspector/extensions/color-grading/ColorGrading.js +2609 -0
- package/examples/jsm/inspector/extensions/color-grading/ColorWheel.js +352 -0
- package/examples/jsm/inspector/extensions/color-grading/CurveEditor.js +599 -0
- package/examples/jsm/inspector/extensions/color-grading/LUT3DStyle.js +1201 -0
- package/examples/jsm/inspector/extensions/color-grading/LUTMath.js +788 -0
- package/examples/jsm/inspector/extensions/color-grading/modules/BrightnessModule.js +72 -0
- package/examples/jsm/inspector/extensions/color-grading/modules/ColorWheelModule.js +112 -0
- package/examples/jsm/inspector/extensions/color-grading/modules/ContrastModule.js +82 -0
- package/examples/jsm/inspector/extensions/color-grading/modules/CurvesModule.js +109 -0
- package/examples/jsm/inspector/extensions/color-grading/modules/ExposureHueModule.js +110 -0
- package/examples/jsm/inspector/extensions/color-grading/modules/ExposureModule.js +73 -0
- package/examples/jsm/inspector/extensions/color-grading/modules/HueModule.js +78 -0
- package/examples/jsm/inspector/extensions/color-grading/modules/ImportedCubeModule.js +89 -0
- package/examples/jsm/inspector/extensions/color-grading/modules/Module.js +285 -0
- package/examples/jsm/inspector/extensions/color-grading/modules/OutputModule.js +101 -0
- package/examples/jsm/inspector/extensions/color-grading/modules/RendererModule.js +225 -0
- package/examples/jsm/inspector/extensions/color-grading/modules/SatVibranceModule.js +102 -0
- package/examples/jsm/inspector/extensions/color-grading/modules/SaturationModule.js +76 -0
- package/examples/jsm/inspector/extensions/color-grading/modules/VibranceModule.js +76 -0
- package/examples/jsm/inspector/extensions/color-grading/modules/WhiteBalanceModule.js +86 -0
- package/examples/jsm/inspector/extensions/tsl-graph/TSLGraphEditor.js +26 -31
- package/examples/jsm/inspector/extensions/tsl-graph/TSLGraphLoader.js +1 -0
- package/examples/jsm/inspector/tabs/Memory.js +0 -2
- package/examples/jsm/inspector/tabs/Settings.js +4 -0
- package/examples/jsm/inspector/tabs/Timeline.js +223 -171
- package/examples/jsm/inspector/tabs/Viewer.js +515 -21
- package/examples/jsm/inspector/ui/List.js +15 -9
- package/examples/jsm/inspector/ui/Profiler.js +170 -14
- package/examples/jsm/inspector/ui/Style.js +269 -23
- package/examples/jsm/inspector/ui/Tab.js +2 -0
- package/examples/jsm/inspector/ui/Values.js +14 -2
- package/examples/jsm/interactive/HTMLMesh.js +19 -3
- package/examples/jsm/lighting/LightProbeGrid.js +484 -889
- package/examples/jsm/lighting/LightProbeGridUtils.js +107 -0
- package/examples/jsm/lighting/LightProbeGridWebGL.js +841 -0
- package/examples/jsm/lighting/vxgi/VXGIConeTracer.js +194 -0
- package/examples/jsm/lighting/vxgi/VXGINode.js +660 -0
- package/examples/jsm/lighting/vxgi/VXGISceneCollector.js +478 -0
- package/examples/jsm/lighting/vxgi/VXGIVolume.js +1430 -0
- package/examples/jsm/lights/SunLight.js +95 -0
- package/examples/jsm/lights/SunLightNode.js +56 -0
- package/examples/jsm/lights/SunLightShadow.js +319 -0
- package/examples/jsm/lights/SunShadowNode.js +312 -0
- package/examples/jsm/loaders/3DMLoader.js +150 -49
- package/examples/jsm/loaders/3MFLoader.js +202 -1
- package/examples/jsm/loaders/FBXLoader.js +81 -5
- package/examples/jsm/loaders/GLTFGaussianSplatLoaderExtension.js +330 -0
- package/examples/jsm/loaders/GLTFLoader.js +79 -14
- package/examples/jsm/loaders/GaussianSplatPLYLoader.js +386 -0
- package/examples/jsm/loaders/KSPLATLoader.js +463 -0
- package/examples/jsm/loaders/MaterialXLoader.js +111 -1010
- package/examples/jsm/loaders/PCDLoader.js +1 -1
- package/examples/jsm/loaders/SPLATLoader.js +139 -0
- package/examples/jsm/loaders/SPZLoader.js +561 -0
- package/examples/jsm/loaders/materialx/MaterialXArchive.js +108 -0
- package/examples/jsm/loaders/materialx/MaterialXDocument.js +878 -0
- package/examples/jsm/loaders/materialx/MaterialXHextile.js +183 -0
- package/examples/jsm/loaders/materialx/MaterialXInterfaceValidation.js +376 -0
- package/examples/jsm/loaders/materialx/MaterialXLog.js +75 -0
- package/examples/jsm/loaders/materialx/MaterialXNodeInterfaceRegistry.js +4 -0
- package/examples/jsm/loaders/materialx/MaterialXNodeLibrary.js +1021 -0
- package/examples/jsm/loaders/materialx/MaterialXSurfaceMappings.js +661 -0
- package/examples/jsm/loaders/materialx/MaterialXUtils.js +57 -0
- package/examples/jsm/loaders/materialx/compile/MaterialXCompileRegistry.js +997 -0
- package/examples/jsm/loaders/materialx/parse/MaterialXParser.js +28 -0
- package/examples/jsm/loaders/usd/USDAParser.js +15 -2
- package/examples/jsm/loaders/usd/USDCParser.js +1 -4
- package/examples/jsm/loaders/usd/USDComposer.js +80 -42
- package/examples/jsm/materials/WoodNodeMaterial.js +6 -108
- package/examples/jsm/misc/RollerCoaster.js +2 -2
- package/examples/jsm/misc/SculptGL.LICENSE.txt +21 -0
- package/examples/jsm/misc/Sculptor.js +1679 -0
- package/examples/jsm/misc/SculptorMesh.js +1504 -0
- package/examples/jsm/misc/SculptorTools.js +1180 -0
- package/examples/jsm/misc/SculptorUtils.js +345 -0
- package/examples/jsm/misc/TubePainter.js +28 -16
- package/examples/jsm/misc/VolumeSlice.js +24 -24
- package/examples/jsm/modifiers/SimplifyModifier.js +63 -556
- package/examples/jsm/objects/GaussianSplat.js +1039 -0
- package/examples/jsm/objects/Sky.js +66 -45
- package/examples/jsm/objects/SkyMesh.js +70 -51
- package/examples/jsm/physics/JoltPhysics.js +1 -1
- package/examples/jsm/postprocessing/AfterimagePass.js +4 -2
- package/examples/jsm/postprocessing/BloomPass.js +2 -2
- package/examples/jsm/postprocessing/GTAOPass.js +1 -1
- package/examples/jsm/postprocessing/OutlinePass.js +5 -5
- package/examples/jsm/postprocessing/SAOPass.js +1 -1
- package/examples/jsm/postprocessing/SSAOPass.js +1 -1
- package/examples/jsm/postprocessing/SSRPass.js +4 -2
- package/examples/jsm/postprocessing/SavePass.js +1 -1
- package/examples/jsm/postprocessing/TAARenderPass.js +1 -1
- package/examples/jsm/postprocessing/UnrealBloomPass.js +30 -13
- package/examples/jsm/renderers/CSS2DRenderer.js +29 -5
- package/examples/jsm/shaders/DepthLimitedBlurShader.js +4 -1
- package/examples/jsm/shaders/ExposureShader.js +1 -1
- package/examples/jsm/shaders/FilmShader.js +2 -1
- package/examples/jsm/transpiler/AST.js +21 -2
- package/examples/jsm/transpiler/GLSLDecoder.js +498 -8
- package/examples/jsm/transpiler/TSLEncoder.js +82 -10
- package/examples/jsm/transpiler/WGSLEncoder.js +33 -4
- package/examples/jsm/tsl/WebGLNodesHandler.js +29 -39
- package/examples/jsm/tsl/display/AfterImageNode.js +2 -0
- package/examples/jsm/tsl/display/AnaglyphPassNode.js +3 -2
- package/examples/jsm/tsl/display/BilateralBlurNode.js +5 -2
- package/examples/jsm/tsl/display/BloomNode.js +55 -30
- package/examples/jsm/tsl/display/DenoiseNode.js +21 -1
- package/examples/jsm/tsl/display/DepthOfFieldNode.js +24 -6
- package/examples/jsm/tsl/display/DotScreenNode.js +11 -11
- package/examples/jsm/tsl/display/FSR1Node.js +8 -4
- package/examples/jsm/tsl/display/GTAONode.js +199 -86
- package/examples/jsm/tsl/display/GaussianBlurNode.js +65 -52
- package/examples/jsm/tsl/display/GodraysNode.js +5 -2
- package/examples/jsm/tsl/display/ImportanceSampledEnvironment.js +2 -2
- package/examples/jsm/tsl/display/LensflareNode.js +5 -2
- package/examples/jsm/tsl/display/OITPassNode.js +352 -0
- package/examples/jsm/tsl/display/OutlineNode.js +2 -0
- package/examples/jsm/tsl/display/ParallaxBarrierPassNode.js +3 -2
- package/examples/jsm/tsl/display/RGBShiftNode.js +9 -9
- package/examples/jsm/tsl/display/RecurrentDenoiseNode.js +7 -4
- package/examples/jsm/tsl/display/RetroPassNode.js +1 -1
- package/examples/jsm/tsl/display/SMAANode.js +22 -61
- package/examples/jsm/tsl/display/SSAAPassNode.js +2 -4
- package/examples/jsm/tsl/display/SSAONode.js +436 -0
- package/examples/jsm/tsl/display/SSGINode.js +5 -2
- package/examples/jsm/tsl/display/SSRNode.js +7 -2
- package/examples/jsm/tsl/display/SSSNode.js +5 -2
- package/examples/jsm/tsl/display/SharpenNode.js +5 -4
- package/examples/jsm/tsl/display/StereoCompositePassNode.js +1 -3
- package/examples/jsm/tsl/display/StereoPassNode.js +1 -3
- package/examples/jsm/tsl/display/TAAUNode.js +22 -125
- package/examples/jsm/tsl/display/TRAANode.js +16 -142
- package/examples/jsm/tsl/display/TemporalReprojectNode.js +21 -15
- package/examples/jsm/tsl/display/depthAwareBlur.js +63 -0
- package/examples/jsm/tsl/display/hashBlur.js +3 -2
- package/examples/jsm/tsl/lighting/ClusteredLightsNode.js +38 -27
- package/examples/jsm/tsl/lighting/LightProbeGridNode.js +136 -0
- package/examples/jsm/tsl/math/voronoiNoise.js +112 -0
- package/examples/jsm/tsl/shadows/TileShadowNode.js +4 -6
- package/examples/jsm/tsl/utils/Raymarching.js +5 -5
- package/examples/jsm/tsl/utils/SoftParticles.js +60 -0
- package/examples/jsm/tsl/utils/TAAUtils.js +195 -0
- package/examples/jsm/utils/BufferGeometryUtils.js +14 -14
- package/examples/jsm/utils/GaussianSplatUtils.js +229 -0
- package/examples/jsm/utils/WebGLTextureUtils.js +1 -1
- package/examples/jsm/utils/WebGPUTextureUtils.js +1 -1
- package/examples/jsm/webxr/WebGLXRFallback.js +2 -16
- package/examples/jsm/webxr/XRControllerModelFactory.js +16 -4
- package/package.json +9 -16
- package/src/Three.Core.js +2 -1
- package/src/Three.TSL.js +73 -43
- package/src/Three.WebGPU.Nodes.js +1 -0
- package/src/Three.WebGPU.js +1 -0
- package/src/animation/AnimationClip.js +15 -2
- package/src/animation/AnimationObjectGroup.js +18 -6
- package/src/animation/AnimationUtils.js +26 -0
- package/src/animation/KeyframeTrack.js +37 -0
- package/src/constants.js +23 -1
- package/src/core/BufferAttribute.js +3 -2
- package/src/core/BufferGeometry.js +1 -1
- package/src/core/InterleavedBuffer.js +5 -1
- package/src/core/Object3D.js +40 -12
- package/src/core/Raycaster.js +4 -0
- package/src/core/RenderTarget.js +99 -9
- package/src/core/RenderTarget3D.js +12 -8
- package/src/extras/Controls.js +0 -8
- package/src/extras/PMREMGenerator.js +99 -205
- package/src/geometries/TorusGeometry.js +1 -1
- package/src/helpers/ArrowHelper.js +2 -0
- package/src/helpers/AxesHelper.js +2 -0
- package/src/helpers/Box3Helper.js +2 -0
- package/src/helpers/BoxHelper.js +2 -0
- package/src/helpers/CameraHelper.js +2 -0
- package/src/helpers/DirectionalLightHelper.js +2 -0
- package/src/helpers/GridHelper.js +2 -0
- package/src/helpers/HemisphereLightHelper.js +2 -0
- package/src/helpers/PlaneHelper.js +2 -0
- package/src/helpers/PointLightHelper.js +2 -0
- package/src/helpers/PolarGridHelper.js +2 -0
- package/src/helpers/SkeletonHelper.js +2 -0
- package/src/helpers/SpotLightHelper.js +2 -0
- package/src/lights/Light.js +0 -10
- package/src/lights/LightShadow.js +43 -12
- package/src/lights/SpotLightShadow.js +18 -0
- package/src/loaders/BufferGeometryLoader.js +5 -0
- package/src/loaders/ImageBitmapLoader.js +3 -1
- package/src/loaders/ObjectLoader.js +8 -5
- package/src/materials/Material.js +80 -57
- package/src/materials/MeshPhysicalMaterial.js +32 -0
- package/src/materials/nodes/Line2NodeMaterial.js +17 -8
- package/src/materials/nodes/MeshPhysicalNodeMaterial.js +42 -5
- package/src/materials/nodes/NodeMaterial.js +19 -13
- package/src/materials/nodes/PointsNodeMaterial.js +2 -1
- package/src/materials/nodes/manager/NodeMaterialObserver.js +282 -55
- package/src/math/Frustum.js +9 -0
- package/src/math/FrustumArray.js +1 -1
- package/src/math/MathUtils.js +5 -3
- package/src/math/Matrix4.js +2 -9
- package/src/math/Plane.js +30 -1
- package/src/math/Quaternion.js +0 -10
- package/src/math/Ray.js +95 -45
- package/src/math/Triangle.js +0 -2
- package/src/math/Vector3.js +2 -2
- package/src/math/Vector4.js +0 -4
- package/src/math/interpolants/BezierInterpolant.js +36 -23
- package/src/nodes/Nodes.js +2 -0
- package/src/nodes/TSL.js +11 -3
- package/src/nodes/accessors/Batch.js +85 -13
- package/src/nodes/accessors/BufferAttributeNode.js +1 -1
- package/src/nodes/accessors/BuiltinNode.js +1 -1
- package/src/nodes/accessors/Instance.js +19 -18
- package/src/nodes/accessors/MaterialNode.js +9 -0
- package/src/nodes/accessors/ModelNode.js +85 -9
- package/src/nodes/accessors/ReferenceBaseNode.js +1 -70
- package/src/nodes/accessors/ReferenceElementNode.js +72 -0
- package/src/nodes/accessors/ReferenceNode.js +1 -70
- package/src/nodes/accessors/Skinning.js +124 -12
- package/src/nodes/accessors/StorageTextureNode.js +7 -3
- package/src/nodes/accessors/Texture3DNode.js +1 -1
- package/src/nodes/accessors/TextureNode.js +51 -21
- package/src/nodes/accessors/TextureSizeNode.js +4 -2
- package/src/nodes/accessors/UniformArrayNode.js +30 -5
- package/src/nodes/code/CodeNode.js +1 -1
- package/src/nodes/code/FunctionNode.js +12 -2
- package/src/nodes/core/ArrayNode.js +2 -2
- package/src/nodes/core/ContextNode.js +57 -4
- package/src/nodes/core/IndexNode.js +69 -4
- package/src/nodes/core/InspectorNode.js +2 -2
- package/src/nodes/core/MRTNode.js +44 -2
- package/src/nodes/core/Node.js +6 -3
- package/src/nodes/core/NodeBuilder.js +65 -50
- package/src/nodes/core/NodeFrame.js +11 -3
- package/src/nodes/core/NodeUtils.js +88 -0
- package/src/nodes/core/PropertyNode.js +8 -0
- package/src/nodes/core/StackNode.js +0 -1
- package/src/nodes/core/StructNode.js +4 -3
- package/src/nodes/core/UniformGroupNode.js +3 -2
- package/src/nodes/core/UniformNode.js +26 -12
- package/src/nodes/core/VarNode.js +0 -1
- package/src/nodes/display/BumpMapNode.js +2 -2
- package/src/nodes/display/ColorAdjustment.js +1 -1
- package/src/nodes/display/PassNode.js +76 -15
- package/src/nodes/display/ScreenNode.js +22 -65
- package/src/nodes/fog/Fog.js +4 -4
- package/src/nodes/functions/BSDF/BRDF_GGX.js +6 -6
- package/src/nodes/functions/BSDF/BRDF_Sheen.js +1 -1
- package/src/nodes/functions/BSDF/DFGLUT.js +2 -1
- package/src/nodes/functions/BSDF/LTC.js +1 -1
- package/src/nodes/functions/PhongLightingModel.js +1 -1
- package/src/nodes/functions/PhysicalLightingModel.js +83 -25
- package/src/nodes/functions/ToonLightingModel.js +2 -2
- package/src/nodes/functions/material/getParallaxCorrectNormal.js +3 -3
- package/src/nodes/gpgpu/AtomicFunctionNode.js +64 -13
- package/src/nodes/gpgpu/BarrierNode.js +13 -4
- package/src/nodes/gpgpu/ComputeBuiltinNode.js +1 -1
- package/src/nodes/gpgpu/ComputeNode.js +20 -17
- package/src/nodes/gpgpu/SubgroupFunctionNode.js +165 -37
- package/src/nodes/gpgpu/WorkgroupInfoNode.js +44 -6
- package/src/nodes/lighting/EnvironmentNode.js +40 -4
- package/src/nodes/lighting/LightsNode.js +20 -4
- package/src/nodes/lighting/ShadowBaseNode.js +158 -1
- package/src/nodes/lighting/ShadowFilterNode.js +2 -106
- package/src/nodes/lighting/ShadowNode.js +22 -91
- package/src/nodes/materialx/{lib/mx_hsv.js → MaterialXColor.js} +3 -6
- package/src/nodes/materialx/{lib/mx_transform_color.js → MaterialXColorTransform.js} +3 -6
- package/src/nodes/materialx/MaterialXCore.js +37 -0
- package/src/nodes/materialx/MaterialXNodes.js +64 -72
- package/src/nodes/materialx/{lib/mx_noise.js → MaterialXNoise.js} +426 -197
- package/src/nodes/math/BitcountNode.js +24 -4
- package/src/nodes/math/MathNode.js +4 -4
- package/src/nodes/math/MathUtils.js +15 -4
- package/src/nodes/math/OperatorNode.js +2 -2
- package/src/nodes/math/PackFloatNode.js +29 -1
- package/src/nodes/math/Packed4x8IntegerNode.js +433 -0
- package/src/nodes/math/UnpackFloatNode.js +30 -2
- package/src/nodes/parsers/GLSLNodeFunction.js +1 -1
- package/src/nodes/pmrem/PMREMNode.js +1 -1
- package/src/nodes/pmrem/PMREMUtils.js +31 -74
- package/src/nodes/shapes/Shapes.js +1 -1
- package/src/nodes/tsl/TSLCore.js +1 -31
- package/src/nodes/utils/EventNode.js +75 -0
- package/src/nodes/utils/LoopNode.js +54 -13
- package/src/nodes/utils/PostProcessingUtils.js +23 -2
- package/src/nodes/utils/RTTNode.js +97 -32
- package/src/nodes/utils/ReflectorNode.js +8 -4
- package/src/nodes/utils/RotateNode.js +85 -8
- package/src/nodes/utils/SpriteUtils.js +58 -23
- package/src/objects/BatchedMesh.js +6 -0
- package/src/objects/InstancedMesh.js +1 -1
- package/src/objects/LOD.js +1 -1
- package/src/objects/Line.js +12 -0
- package/src/objects/Mesh.js +12 -0
- package/src/objects/Points.js +12 -0
- package/src/objects/Sprite.js +12 -0
- package/src/renderers/WebGLRenderer.js +93 -27
- package/src/renderers/common/Animation.js +12 -2
- package/src/renderers/common/Backend.js +38 -10
- package/src/renderers/common/BindGroup.js +0 -1
- package/src/renderers/common/Bindings.js +50 -4
- package/src/renderers/common/BundleGroup.js +4 -0
- package/src/renderers/common/ClippingContext.js +11 -1
- package/src/renderers/common/Color4.js +9 -0
- package/src/renderers/common/Constants.js +0 -5
- package/src/renderers/common/DirectRenderPipeline.js +233 -0
- package/src/renderers/common/Geometries.js +24 -3
- package/src/renderers/common/Info.js +3 -3
- package/src/renderers/common/InspectorBase.js +37 -8
- package/src/renderers/common/Lighting.js +11 -4
- package/src/renderers/common/Pipelines.js +6 -4
- package/src/renderers/common/QuadMesh.js +16 -2
- package/src/renderers/common/RenderContext.js +8 -0
- package/src/renderers/common/RenderList.js +53 -19
- package/src/renderers/common/RenderLists.js +58 -11
- package/src/renderers/common/RenderObject.js +14 -0
- package/src/renderers/common/RenderObjects.js +14 -9
- package/src/renderers/common/RenderPipeline.js +52 -44
- package/src/renderers/common/Renderer.js +226 -55
- package/src/renderers/common/Storage3DTexture.js +16 -0
- package/src/renderers/common/Textures.js +3 -3
- package/src/renderers/common/XRManager.js +79 -72
- package/src/renderers/common/extras/PMREMGenerator.js +76 -144
- package/src/renderers/common/nodes/NodeManager.js +144 -6
- package/src/renderers/common/nodes/NodeStorageBuffer.js +3 -1
- package/src/renderers/common/nodes/NodeUniformBuffer.js +3 -1
- package/src/renderers/shaders/DFGLUTData.js +2 -1
- package/src/renderers/shaders/ShaderChunk/defaultnormal_vertex.glsl.js +4 -2
- package/src/renderers/shaders/ShaderChunk/envmap_physical_pars_fragment.glsl.js +48 -0
- package/src/renderers/shaders/ShaderChunk/lights_fragment_begin.glsl.js +53 -4
- package/src/renderers/shaders/ShaderChunk/lights_fragment_maps.glsl.js +20 -2
- package/src/renderers/shaders/ShaderChunk/lights_pars_begin.glsl.js +20 -0
- package/src/renderers/shaders/ShaderChunk/lights_physical_fragment.glsl.js +6 -0
- package/src/renderers/shaders/ShaderChunk/lights_physical_pars_fragment.glsl.js +61 -57
- package/src/renderers/shaders/ShaderChunk/shadowmap_pars_fragment.glsl.js +82 -0
- package/src/renderers/shaders/ShaderChunk/shadowmap_pars_vertex.glsl.js +9 -0
- package/src/renderers/shaders/ShaderChunk/shadowmap_vertex.glsl.js +8 -1
- package/src/renderers/shaders/ShaderChunk/shadowmask_pars_fragment.glsl.js +15 -0
- package/src/renderers/shaders/ShaderLib/meshphysical.glsl.js +4 -0
- package/src/renderers/shaders/ShaderLib.js +1 -0
- package/src/renderers/shaders/UniformsLib.js +16 -0
- package/src/renderers/webgl/WebGLAnimation.js +2 -2
- package/src/renderers/webgl/WebGLCapabilities.js +2 -2
- package/src/renderers/webgl/WebGLLights.js +74 -4
- package/src/renderers/webgl/WebGLMaterials.js +6 -0
- package/src/renderers/webgl/WebGLOutput.js +36 -24
- package/src/renderers/webgl/WebGLProgram.js +3 -0
- package/src/renderers/webgl/WebGLPrograms.js +8 -0
- package/src/renderers/webgl/WebGLRenderLists.js +6 -10
- package/src/renderers/webgl/WebGLShadowMap.js +47 -44
- package/src/renderers/webgl/WebGLTextures.js +7 -7
- package/src/renderers/webgl-fallback/WebGLBackend.js +153 -45
- package/src/renderers/webgl-fallback/nodes/GLSLNodeBuilder.js +83 -29
- package/src/renderers/webgl-fallback/utils/WebGLState.js +163 -17
- package/src/renderers/webgl-fallback/utils/WebGLTextureUtils.js +32 -5
- package/src/renderers/webgl-fallback/utils/WebGLTimestampQueryPool.js +11 -4
- package/src/renderers/webgpu/WebGPUBackend.js +513 -145
- package/src/renderers/webgpu/nodes/WGSLNodeBuilder.js +99 -20
- package/src/renderers/webgpu/nodes/WGSLNodeFunction.js +2 -1
- package/src/renderers/webgpu/utils/WebGPUAttributeUtils.js +3 -12
- package/src/renderers/webgpu/utils/WebGPUBindingUtils.js +24 -14
- package/src/renderers/webgpu/utils/WebGPUPipelineUtils.js +80 -14
- package/src/renderers/webgpu/utils/WebGPUTextureUtils.js +62 -7
- package/src/renderers/webgpu/utils/WebGPUTimestampQueryPool.js +9 -3
- package/src/renderers/webgpu/utils/WebGPUUtils.js +16 -4
- package/src/renderers/webxr/WebXRManager.js +25 -2
- package/src/scenes/Scene.js +3 -3
- package/src/textures/CompressedArrayTexture.js +16 -0
- package/src/textures/Data3DTexture.js +16 -0
- package/src/textures/DataArrayTexture.js +16 -0
- package/src/textures/DepthTexture.js +3 -3
- package/src/textures/Texture.js +3 -3
- package/src/textures/{Source.js → TextureSource.js} +39 -8
- package/build/three.core.min.js +0 -6
- package/build/three.module.min.js +0 -6
- package/build/three.tsl.min.js +0 -6
- package/build/three.webgpu.min.js +0 -6
- package/build/three.webgpu.nodes.min.js +0 -6
- package/examples/jsm/libs/ecsy.module.js +0 -1792
- package/examples/jsm/loaders/LottieLoader.js +0 -130
- package/src/nodes/functions/BSDF/BRDF_GGX_Multiscatter.js +0 -52
|
@@ -1,12 +1,10 @@
|
|
|
1
1
|
import Node from '../core/Node.js';
|
|
2
|
-
import StackTrace from '../core/StackTrace.js';
|
|
3
2
|
import { NodeUpdateType } from '../core/constants.js';
|
|
3
|
+
import { renderGroup } from '../core/UniformGroupNode.js';
|
|
4
4
|
import { uniform } from '../core/UniformNode.js';
|
|
5
|
-
import {
|
|
6
|
-
|
|
5
|
+
import { nodeImmutable, vec2 } from '../tsl/TSLBase.js';
|
|
7
6
|
import { Vector2 } from '../../math/Vector2.js';
|
|
8
7
|
import { Vector4 } from '../../math/Vector4.js';
|
|
9
|
-
import { warn } from '../../utils.js';
|
|
10
8
|
|
|
11
9
|
let _screenSizeVec, _viewportVec;
|
|
12
10
|
|
|
@@ -28,7 +26,7 @@ class ScreenNode extends Node {
|
|
|
28
26
|
/**
|
|
29
27
|
* Constructs a new screen node.
|
|
30
28
|
*
|
|
31
|
-
* @param {('coordinate'|'viewport'|'size'|'uv'
|
|
29
|
+
* @param {('coordinate'|'viewport'|'size'|'uv')} scope - The node's scope.
|
|
32
30
|
*/
|
|
33
31
|
constructor( scope ) {
|
|
34
32
|
|
|
@@ -41,21 +39,11 @@ class ScreenNode extends Node {
|
|
|
41
39
|
* - `ScreenNode.VIEWPORT`: The current viewport defined as a four-dimensional vector.
|
|
42
40
|
* - `ScreenNode.SIZE`: The dimensions of the current bound framebuffer.
|
|
43
41
|
* - `ScreenNode.UV`: Normalized coordinates.
|
|
44
|
-
* - `ScreenNode.DPR`: Device pixel ratio.
|
|
45
42
|
*
|
|
46
|
-
* @type {('coordinate'|'viewport'|'size'|'uv'
|
|
43
|
+
* @type {('coordinate'|'viewport'|'size'|'uv')}
|
|
47
44
|
*/
|
|
48
45
|
this.scope = scope;
|
|
49
46
|
|
|
50
|
-
/**
|
|
51
|
-
* This output node.
|
|
52
|
-
*
|
|
53
|
-
* @private
|
|
54
|
-
* @type {?Node}
|
|
55
|
-
* @default null
|
|
56
|
-
*/
|
|
57
|
-
this._output = null;
|
|
58
|
-
|
|
59
47
|
/**
|
|
60
48
|
* This flag can be used for type testing.
|
|
61
49
|
*
|
|
@@ -70,37 +58,15 @@ class ScreenNode extends Node {
|
|
|
70
58
|
/**
|
|
71
59
|
* This method is overwritten since the node type depends on the selected scope.
|
|
72
60
|
*
|
|
73
|
-
* @return {('
|
|
61
|
+
* @return {('vec2'|'vec4')} The node type.
|
|
74
62
|
*/
|
|
75
63
|
generateNodeType() {
|
|
76
64
|
|
|
77
|
-
if ( this.scope === ScreenNode.DPR ) return 'float';
|
|
78
65
|
if ( this.scope === ScreenNode.VIEWPORT ) return 'vec4';
|
|
79
66
|
else return 'vec2';
|
|
80
67
|
|
|
81
68
|
}
|
|
82
69
|
|
|
83
|
-
/**
|
|
84
|
-
* This method is overwritten since the node's update type depends on the selected scope.
|
|
85
|
-
*
|
|
86
|
-
* @return {NodeUpdateType} The update type.
|
|
87
|
-
*/
|
|
88
|
-
getUpdateType() {
|
|
89
|
-
|
|
90
|
-
let updateType = NodeUpdateType.NONE;
|
|
91
|
-
|
|
92
|
-
if ( this.scope === ScreenNode.SIZE || this.scope === ScreenNode.VIEWPORT || this.scope === ScreenNode.DPR ) {
|
|
93
|
-
|
|
94
|
-
updateType = NodeUpdateType.RENDER;
|
|
95
|
-
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
this.updateType = updateType;
|
|
99
|
-
|
|
100
|
-
return updateType;
|
|
101
|
-
|
|
102
|
-
}
|
|
103
|
-
|
|
104
70
|
/**
|
|
105
71
|
* `ScreenNode` implements {@link Node#update} to retrieve viewport and size information
|
|
106
72
|
* from the current renderer.
|
|
@@ -125,10 +91,6 @@ class ScreenNode extends Node {
|
|
|
125
91
|
|
|
126
92
|
}
|
|
127
93
|
|
|
128
|
-
} else if ( this.scope === ScreenNode.DPR ) {
|
|
129
|
-
|
|
130
|
-
this._output.value = renderer.getPixelRatio();
|
|
131
|
-
|
|
132
94
|
} else {
|
|
133
95
|
|
|
134
96
|
if ( renderTarget !== null ) {
|
|
@@ -154,15 +116,11 @@ class ScreenNode extends Node {
|
|
|
154
116
|
|
|
155
117
|
if ( scope === ScreenNode.SIZE ) {
|
|
156
118
|
|
|
157
|
-
output = uniform( _screenSizeVec || ( _screenSizeVec = new Vector2() ) );
|
|
119
|
+
output = uniform( _screenSizeVec || ( _screenSizeVec = new Vector2() ) ).setGroup( renderGroup );
|
|
158
120
|
|
|
159
121
|
} else if ( scope === ScreenNode.VIEWPORT ) {
|
|
160
122
|
|
|
161
|
-
output = uniform( _viewportVec || ( _viewportVec = new Vector4() ) );
|
|
162
|
-
|
|
163
|
-
} else if ( scope === ScreenNode.DPR ) {
|
|
164
|
-
|
|
165
|
-
output = uniform( 1 );
|
|
123
|
+
output = uniform( _viewportVec || ( _viewportVec = new Vector4() ) ).setGroup( renderGroup );
|
|
166
124
|
|
|
167
125
|
} else {
|
|
168
126
|
|
|
@@ -170,7 +128,19 @@ class ScreenNode extends Node {
|
|
|
170
128
|
|
|
171
129
|
}
|
|
172
130
|
|
|
173
|
-
|
|
131
|
+
//
|
|
132
|
+
|
|
133
|
+
let updateType = NodeUpdateType.NONE;
|
|
134
|
+
|
|
135
|
+
if ( this.scope === ScreenNode.SIZE || this.scope === ScreenNode.VIEWPORT ) {
|
|
136
|
+
|
|
137
|
+
updateType = NodeUpdateType.RENDER;
|
|
138
|
+
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
this.updateType = updateType;
|
|
142
|
+
|
|
143
|
+
//
|
|
174
144
|
|
|
175
145
|
return output;
|
|
176
146
|
|
|
@@ -206,7 +176,6 @@ ScreenNode.COORDINATE = 'coordinate';
|
|
|
206
176
|
ScreenNode.VIEWPORT = 'viewport';
|
|
207
177
|
ScreenNode.SIZE = 'size';
|
|
208
178
|
ScreenNode.UV = 'uv';
|
|
209
|
-
ScreenNode.DPR = 'dpr';
|
|
210
179
|
|
|
211
180
|
export default ScreenNode;
|
|
212
181
|
|
|
@@ -216,9 +185,9 @@ export default ScreenNode;
|
|
|
216
185
|
* TSL object that represents the current DPR.
|
|
217
186
|
*
|
|
218
187
|
* @tsl
|
|
219
|
-
* @type {
|
|
188
|
+
* @type {UniformNode<float>}
|
|
220
189
|
*/
|
|
221
|
-
export const screenDPR = /*@__PURE__*/
|
|
190
|
+
export const screenDPR = /*@__PURE__*/ uniform( 1 ).setGroup( renderGroup ).onRenderUpdate( ( { renderer } ) => renderer.getPixelRatio() );
|
|
222
191
|
|
|
223
192
|
/**
|
|
224
193
|
* TSL object that represents normalized screen coordinates, unitless in `[0, 1]`.
|
|
@@ -278,15 +247,3 @@ export const viewportCoordinate = /*@__PURE__*/ screenCoordinate.sub( viewport.x
|
|
|
278
247
|
*/
|
|
279
248
|
export const viewportUV = /*@__PURE__*/ viewportCoordinate.div( viewportSize );
|
|
280
249
|
|
|
281
|
-
// Deprecated
|
|
282
|
-
|
|
283
|
-
/**
|
|
284
|
-
* @deprecated since r169. Use {@link screenSize} instead.
|
|
285
|
-
*/
|
|
286
|
-
export const viewportResolution = /*@__PURE__*/ ( Fn( () => { // @deprecated, r169
|
|
287
|
-
|
|
288
|
-
warn( 'TSL: "viewportResolution" is deprecated. Use "screenSize" instead.', new StackTrace() );
|
|
289
|
-
|
|
290
|
-
return screenSize;
|
|
291
|
-
|
|
292
|
-
}, 'vec2' ).once() )();
|
package/src/nodes/fog/Fog.js
CHANGED
|
@@ -37,7 +37,7 @@ function getViewZNode( builder ) {
|
|
|
37
37
|
* @param {Node} near - Defines the near value.
|
|
38
38
|
* @param {Node} far - Defines the far value.
|
|
39
39
|
*/
|
|
40
|
-
export const rangeFogFactor = Fn( ( [ near, far ], builder ) => {
|
|
40
|
+
export const rangeFogFactor = /*@__PURE__*/ Fn( ( [ near, far ], builder ) => {
|
|
41
41
|
|
|
42
42
|
const viewZ = getViewZNode( builder );
|
|
43
43
|
|
|
@@ -54,7 +54,7 @@ export const rangeFogFactor = Fn( ( [ near, far ], builder ) => {
|
|
|
54
54
|
* @function
|
|
55
55
|
* @param {Node} density - Defines the fog density.
|
|
56
56
|
*/
|
|
57
|
-
export const densityFogFactor = Fn( ( [ density ], builder ) => {
|
|
57
|
+
export const densityFogFactor = /*@__PURE__*/ Fn( ( [ density ], builder ) => {
|
|
58
58
|
|
|
59
59
|
const viewZ = getViewZNode( builder );
|
|
60
60
|
|
|
@@ -70,7 +70,7 @@ export const densityFogFactor = Fn( ( [ density ], builder ) => {
|
|
|
70
70
|
* @param {Node} density - Defines the fog density.
|
|
71
71
|
* @param {Node} height - The height threshold in world space. Everything below this y-coordinate is affected by fog.
|
|
72
72
|
*/
|
|
73
|
-
export const exponentialHeightFogFactor = Fn( ( [ density, height ], builder ) => {
|
|
73
|
+
export const exponentialHeightFogFactor = /*@__PURE__*/ Fn( ( [ density, height ], builder ) => {
|
|
74
74
|
|
|
75
75
|
const viewZ = getViewZNode( builder );
|
|
76
76
|
|
|
@@ -90,7 +90,7 @@ export const exponentialHeightFogFactor = Fn( ( [ density, height ], builder ) =
|
|
|
90
90
|
* @param {Node} color - Defines the color of the fog.
|
|
91
91
|
* @param {Node} factor - Defines how the fog is factored in the scene.
|
|
92
92
|
*/
|
|
93
|
-
export const fog = Fn( ( [ color, factor ] ) => {
|
|
93
|
+
export const fog = /*@__PURE__*/ Fn( ( [ color, factor ] ) => {
|
|
94
94
|
|
|
95
95
|
return vec4( factor.toFloat().mix( output.rgb, color.toVec3() ), output.a );
|
|
96
96
|
|
|
@@ -9,16 +9,16 @@ import { iridescence, alphaT, anisotropyT, anisotropyB } from '../../core/Proper
|
|
|
9
9
|
import { Fn, defined } from '../../tsl/TSLBase.js';
|
|
10
10
|
|
|
11
11
|
// GGX Distribution, Schlick Fresnel, GGX_SmithCorrelated Visibility
|
|
12
|
-
const BRDF_GGX = /*@__PURE__*/ Fn( ( { lightDirection, f0, f90, roughness, f, normalView = NormalView, USE_IRIDESCENCE, USE_ANISOTROPY } ) => {
|
|
12
|
+
const BRDF_GGX = /*@__PURE__*/ Fn( ( { lightDirection, f0, f90, roughness, f, normalView = NormalView, viewDirection = positionViewDirection, USE_IRIDESCENCE, USE_ANISOTROPY } ) => {
|
|
13
13
|
|
|
14
14
|
const alpha = roughness.pow2(); // UE4's roughness
|
|
15
15
|
|
|
16
|
-
const halfDir = lightDirection.add(
|
|
16
|
+
const halfDir = lightDirection.add( viewDirection ).normalize();
|
|
17
17
|
|
|
18
18
|
const dotNL = normalView.dot( lightDirection ).clamp();
|
|
19
|
-
const dotNV = normalView.dot(
|
|
19
|
+
const dotNV = normalView.dot( viewDirection ).clamp(); // @ TODO: Move to core dotNV
|
|
20
20
|
const dotNH = normalView.dot( halfDir ).clamp();
|
|
21
|
-
const dotVH =
|
|
21
|
+
const dotVH = viewDirection.dot( halfDir ).clamp();
|
|
22
22
|
|
|
23
23
|
let F = F_Schlick( { f0, f90, dotVH } );
|
|
24
24
|
let V, D;
|
|
@@ -32,10 +32,10 @@ const BRDF_GGX = /*@__PURE__*/ Fn( ( { lightDirection, f0, f90, roughness, f, no
|
|
|
32
32
|
if ( defined( USE_ANISOTROPY ) ) {
|
|
33
33
|
|
|
34
34
|
const dotTL = anisotropyT.dot( lightDirection );
|
|
35
|
-
const dotTV = anisotropyT.dot(
|
|
35
|
+
const dotTV = anisotropyT.dot( viewDirection );
|
|
36
36
|
const dotTH = anisotropyT.dot( halfDir );
|
|
37
37
|
const dotBL = anisotropyB.dot( lightDirection );
|
|
38
|
-
const dotBV = anisotropyB.dot(
|
|
38
|
+
const dotBV = anisotropyB.dot( viewDirection );
|
|
39
39
|
const dotBH = anisotropyB.dot( halfDir );
|
|
40
40
|
|
|
41
41
|
V = V_GGX_SmithCorrelated_Anisotropic( { alphaT, alphaB: alpha, dotTV, dotBV, dotTL, dotBL, dotNV, dotNL } );
|
|
@@ -28,7 +28,7 @@ const D_Charlie = /*@__PURE__*/ Fn( ( { roughness, dotNH } ) => {
|
|
|
28
28
|
const V_Neubelt = /*@__PURE__*/ Fn( ( { dotNV, dotNL } ) => {
|
|
29
29
|
|
|
30
30
|
// Neubelt and Pettineo 2013, "Crafting a Next-gen Material Pipeline for The Order: 1886"
|
|
31
|
-
return float( 1.0 ).div( float( 4.0 ).mul( dotNL.add( dotNV ).sub( dotNL.mul( dotNV ) ) ) );
|
|
31
|
+
return float( 1.0 ).div( float( 4.0 ).mul( dotNL.add( dotNV ).sub( dotNL.mul( dotNV ) ) ) ).clamp();
|
|
32
32
|
|
|
33
33
|
} ).setLayout( {
|
|
34
34
|
name: 'V_Neubelt',
|
|
@@ -5,7 +5,8 @@ import { DataTexture } from '../../../textures/DataTexture.js';
|
|
|
5
5
|
import { RGFormat, HalfFloatType, LinearFilter, ClampToEdgeWrapping } from '../../../constants.js';
|
|
6
6
|
|
|
7
7
|
/**
|
|
8
|
-
* Precomputed DFG LUT for
|
|
8
|
+
* Precomputed DFG LUT for physically based specular lighting, used by both
|
|
9
|
+
* image-based lighting and direct-light multi-scattering energy compensation
|
|
9
10
|
* Resolution: 16x16
|
|
10
11
|
* Samples: 4096 per texel
|
|
11
12
|
* Format: RG16F (2 half floats per texel: scale, bias)
|
|
@@ -59,7 +59,7 @@ class PhongLightingModel extends BasicLightingModel {
|
|
|
59
59
|
}
|
|
60
60
|
|
|
61
61
|
/**
|
|
62
|
-
* Implements the direct lighting. The specular portion is optional
|
|
62
|
+
* Implements the direct lighting. The specular portion is optional and can be controlled
|
|
63
63
|
* with the {@link PhongLightingModel#specular} flag.
|
|
64
64
|
*
|
|
65
65
|
* @param {Object} lightData - The light data.
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import BRDF_Lambert from './BSDF/BRDF_Lambert.js';
|
|
2
2
|
import BRDF_GGX from './BSDF/BRDF_GGX.js';
|
|
3
|
-
import BRDF_GGX_Multiscatter from './BSDF/BRDF_GGX_Multiscatter.js';
|
|
4
3
|
import DFGLUT from './BSDF/DFGLUT.js';
|
|
5
4
|
import EnvironmentBRDF from './BSDF/EnvironmentBRDF.js';
|
|
6
5
|
import F_Schlick from './BSDF/F_Schlick.js';
|
|
@@ -8,13 +7,13 @@ import Schlick_to_F0 from './BSDF/Schlick_to_F0.js';
|
|
|
8
7
|
import BRDF_Sheen from './BSDF/BRDF_Sheen.js';
|
|
9
8
|
import { LTC_Evaluate, LTC_Uv } from './BSDF/LTC.js';
|
|
10
9
|
import LightingModel from '../core/LightingModel.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';
|
|
10
|
+
import { diffuseColor, diffuseContribution, specularColor, specularColorBlended, specularF90, roughness, metalness, clearcoat, clearcoatRoughness, sheen, sheenRoughness, iridescence, iridescenceIOR, iridescenceThickness, ior, thickness, transmission, attenuationDistance, attenuationColor, dispersion, retroreflectivity } from '../core/PropertyNode.js';
|
|
12
11
|
import { normalView, clearcoatNormalView, normalWorld } from '../accessors/Normal.js';
|
|
13
12
|
import { positionViewDirection, positionView, positionWorld } from '../accessors/Position.js';
|
|
14
13
|
import { Fn, float, vec2, vec3, vec4, mat3, If } from '../tsl/TSLBase.js';
|
|
15
14
|
import { mix, normalize, refract, length, clamp, log2, log, exp, smoothstep } from '../math/MathNode.js';
|
|
16
15
|
import { div } from '../math/OperatorNode.js';
|
|
17
|
-
import { cameraPosition, cameraProjectionMatrix, cameraViewMatrix } from '../accessors/Camera.js';
|
|
16
|
+
import { cameraPosition, cameraProjectionMatrix, cameraViewMatrix, cameraViewport } from '../accessors/Camera.js';
|
|
18
17
|
import { modelWorldMatrix } from '../accessors/ModelNode.js';
|
|
19
18
|
import { screenSize } from '../display/ScreenNode.js';
|
|
20
19
|
import { viewportMipTexture, viewportOpaqueMipTexture } from '../display/ViewportTextureNode.js';
|
|
@@ -75,10 +74,10 @@ const getTransmissionSample = /*@__PURE__*/ Fn( ( [ fragCoord, roughness, ior ],
|
|
|
75
74
|
|
|
76
75
|
const vTexture = material.side === BackSide ? viewportBackSideTexture : viewportFrontSideTexture;
|
|
77
76
|
|
|
78
|
-
const transmissionSample = vTexture.sample( fragCoord );
|
|
77
|
+
const transmissionSample = vTexture.sample( fragCoord.mul( cameraViewport.zw ).add( cameraViewport.xy ).div( screenSize ) );
|
|
79
78
|
//const transmissionSample = viewportMipTexture( fragCoord );
|
|
80
79
|
|
|
81
|
-
const lod = log2(
|
|
80
|
+
const lod = log2( cameraViewport.z ).mul( applyIorToRoughness( roughness, ior ) );
|
|
82
81
|
|
|
83
82
|
return textureBicubicLevel( transmissionSample, lod );
|
|
84
83
|
|
|
@@ -190,9 +189,9 @@ const getIBLVolumeRefraction = /*@__PURE__*/ Fn( ( [ n, v, roughness, diffuseCol
|
|
|
190
189
|
|
|
191
190
|
// XYZ to linear-sRGB color space
|
|
192
191
|
const XYZ_TO_REC709 = /*@__PURE__*/ mat3(
|
|
193
|
-
3.2404542, -
|
|
194
|
-
-
|
|
195
|
-
|
|
192
|
+
3.2404542, - 1.5371385, - 0.4985314,
|
|
193
|
+
- 0.9692660, 1.8760108, 0.0415560,
|
|
194
|
+
0.0556434, - 0.2040259, 1.0572252
|
|
196
195
|
);
|
|
197
196
|
|
|
198
197
|
// Assume air interface for top
|
|
@@ -348,8 +347,9 @@ class PhysicalLightingModel extends LightingModel {
|
|
|
348
347
|
* @param {boolean} [anisotropy=false] - Whether anisotropy is supported or not.
|
|
349
348
|
* @param {boolean} [transmission=false] - Whether transmission is supported or not.
|
|
350
349
|
* @param {boolean} [dispersion=false] - Whether dispersion is supported or not.
|
|
350
|
+
* @param {boolean} [retroreflection=false] - Whether retroreflection is supported or not.
|
|
351
351
|
*/
|
|
352
|
-
constructor( clearcoat = false, sheen = false, iridescence = false, anisotropy = false, transmission = false, dispersion = false ) {
|
|
352
|
+
constructor( clearcoat = false, sheen = false, iridescence = false, anisotropy = false, transmission = false, dispersion = false, retroreflection = false ) {
|
|
353
353
|
|
|
354
354
|
super();
|
|
355
355
|
|
|
@@ -401,6 +401,14 @@ class PhysicalLightingModel extends LightingModel {
|
|
|
401
401
|
*/
|
|
402
402
|
this.dispersion = dispersion;
|
|
403
403
|
|
|
404
|
+
/**
|
|
405
|
+
* Whether retroreflection is supported or not.
|
|
406
|
+
*
|
|
407
|
+
* @type {boolean}
|
|
408
|
+
* @default false
|
|
409
|
+
*/
|
|
410
|
+
this.retroreflection = retroreflection;
|
|
411
|
+
|
|
404
412
|
/**
|
|
405
413
|
* The clear coat radiance.
|
|
406
414
|
*
|
|
@@ -450,28 +458,36 @@ class PhysicalLightingModel extends LightingModel {
|
|
|
450
458
|
this.iridescenceFresnel = null;
|
|
451
459
|
|
|
452
460
|
/**
|
|
453
|
-
* The iridescence F0.
|
|
461
|
+
* The iridescence F0 dielectric.
|
|
454
462
|
*
|
|
455
463
|
* @type {?Node}
|
|
456
464
|
* @default null
|
|
457
465
|
*/
|
|
458
|
-
this.
|
|
466
|
+
this.iridescenceF0Dielectric = null;
|
|
459
467
|
|
|
460
468
|
/**
|
|
461
|
-
* The iridescence F0
|
|
469
|
+
* The iridescence F0 metallic.
|
|
462
470
|
*
|
|
463
471
|
* @type {?Node}
|
|
464
472
|
* @default null
|
|
465
473
|
*/
|
|
466
|
-
this.
|
|
474
|
+
this.iridescenceF0Metallic = null;
|
|
467
475
|
|
|
468
476
|
/**
|
|
469
|
-
* The
|
|
477
|
+
* The sampled DFG LUT value, shared by the direct and indirect lighting paths.
|
|
470
478
|
*
|
|
471
479
|
* @type {?Node}
|
|
472
480
|
* @default null
|
|
473
481
|
*/
|
|
474
|
-
this.
|
|
482
|
+
this.dfg = null;
|
|
483
|
+
|
|
484
|
+
/**
|
|
485
|
+
* The multi-scattering energy compensation for direct lighting.
|
|
486
|
+
*
|
|
487
|
+
* @type {?Node}
|
|
488
|
+
* @default null
|
|
489
|
+
*/
|
|
490
|
+
this.multiScatteringCompensation = null;
|
|
475
491
|
|
|
476
492
|
}
|
|
477
493
|
|
|
@@ -523,8 +539,6 @@ class PhysicalLightingModel extends LightingModel {
|
|
|
523
539
|
this.iridescenceF0Dielectric = Schlick_to_F0( { f: iridescenceFresnelDielectric, f90: 1.0, dotVH: dotNVi } );
|
|
524
540
|
this.iridescenceF0Metallic = Schlick_to_F0( { f: iridescenceFresnelMetallic, f90: 1.0, dotVH: dotNVi } );
|
|
525
541
|
|
|
526
|
-
this.iridescenceF0 = mix( this.iridescenceF0Dielectric, this.iridescenceF0Metallic, metalness );
|
|
527
|
-
|
|
528
542
|
}
|
|
529
543
|
|
|
530
544
|
if ( this.transmission === true ) {
|
|
@@ -559,6 +573,21 @@ class PhysicalLightingModel extends LightingModel {
|
|
|
559
573
|
|
|
560
574
|
}
|
|
561
575
|
|
|
576
|
+
//
|
|
577
|
+
|
|
578
|
+
const dotNV = normalView.dot( positionViewDirection ).clamp();
|
|
579
|
+
this.dfg = DFGLUT( { roughness, dotNV } ).toConst( 'dfg' );
|
|
580
|
+
|
|
581
|
+
// Multi-scattering energy compensation for direct lighting
|
|
582
|
+
// Based on "Practical Multiple Scattering Compensation for Microfacet Models"
|
|
583
|
+
// https://blog.selfshadow.com/publications/turquin/ms_comp_final.pdf
|
|
584
|
+
|
|
585
|
+
// Energy of the single-scattering lobe in a white furnace ( F0 = F90 = 1 )
|
|
586
|
+
const Ess = this.dfg.x.add( this.dfg.y );
|
|
587
|
+
|
|
588
|
+
// Compensate for the energy lost to multiple scattering, tinting the added term by F0 ( equation 16 )
|
|
589
|
+
this.multiScatteringCompensation = specularColorBlended.mul( Ess.reciprocal().sub( 1.0 ) ).add( 1.0 ).toConst( 'multiScatteringCompensation' );
|
|
590
|
+
|
|
562
591
|
super.start( builder );
|
|
563
592
|
|
|
564
593
|
}
|
|
@@ -569,9 +598,7 @@ class PhysicalLightingModel extends LightingModel {
|
|
|
569
598
|
|
|
570
599
|
computeMultiscattering( singleScatter, multiScatter, specularF90, f0, iridescenceF0 = null ) {
|
|
571
600
|
|
|
572
|
-
const
|
|
573
|
-
|
|
574
|
-
const fab = DFGLUT( { roughness, dotNV } );
|
|
601
|
+
const fab = this.dfg;
|
|
575
602
|
|
|
576
603
|
const Fr = iridescenceF0 ? iridescence.mix( f0, iridescenceF0 ) : f0;
|
|
577
604
|
|
|
@@ -621,9 +648,31 @@ class PhysicalLightingModel extends LightingModel {
|
|
|
621
648
|
|
|
622
649
|
}
|
|
623
650
|
|
|
624
|
-
|
|
651
|
+
// Light reflected by the specular interface is not available to the diffuse layer ( glTF fresnel_mix )
|
|
652
|
+
const halfDir = lightDirection.add( positionViewDirection ).normalize();
|
|
653
|
+
const dotVH = positionViewDirection.dot( halfDir ).clamp();
|
|
654
|
+
let F = F_Schlick( { f0: specularColor, f90: specularF90, dotVH } );
|
|
655
|
+
|
|
656
|
+
let specularBRDF = BRDF_GGX( { lightDirection, f0: specularColorBlended, f90: 1, roughness, f: this.iridescenceFresnel, USE_IRIDESCENCE: this.iridescence, USE_ANISOTROPY: this.anisotropy } );
|
|
625
657
|
|
|
626
|
-
|
|
658
|
+
if ( this.retroreflection === true ) {
|
|
659
|
+
|
|
660
|
+
// Minimal Retroreflective Microfacet Model:
|
|
661
|
+
// https://jcgt.org/published/0015/01/04/
|
|
662
|
+
const retroViewDirection = positionViewDirection.negate().reflect( normalView );
|
|
663
|
+
const retroHalfDir = lightDirection.add( retroViewDirection ).normalize();
|
|
664
|
+
const dotRetroVH = retroViewDirection.dot( retroHalfDir ).clamp();
|
|
665
|
+
const retroF = F_Schlick( { f0: specularColor, f90: specularF90, dotVH: dotRetroVH } );
|
|
666
|
+
const retroSpecularBRDF = BRDF_GGX( { lightDirection, viewDirection: retroViewDirection, f0: specularColorBlended, f90: 1, roughness, f: this.iridescenceFresnel, USE_IRIDESCENCE: this.iridescence, USE_ANISOTROPY: this.anisotropy } );
|
|
667
|
+
|
|
668
|
+
F = mix( F, retroF, retroreflectivity.clamp() );
|
|
669
|
+
specularBRDF = mix( specularBRDF, retroSpecularBRDF, retroreflectivity.clamp() );
|
|
670
|
+
|
|
671
|
+
}
|
|
672
|
+
|
|
673
|
+
reflectedLight.directDiffuse.addAssign( irradiance.mul( BRDF_Lambert( { diffuseColor: diffuseContribution } ) ).mul( F.oneMinus() ) );
|
|
674
|
+
|
|
675
|
+
reflectedLight.directSpecular.addAssign( irradiance.mul( specularBRDF ).mul( this.multiScatteringCompensation ) );
|
|
627
676
|
|
|
628
677
|
}
|
|
629
678
|
|
|
@@ -710,12 +759,20 @@ class PhysicalLightingModel extends LightingModel {
|
|
|
710
759
|
|
|
711
760
|
const { irradiance, reflectedLight } = builder.context;
|
|
712
761
|
|
|
713
|
-
|
|
762
|
+
// Energy reflected by the specular lobe is not available to the diffuse layer
|
|
763
|
+
const singleScattering = vec3().toVar();
|
|
764
|
+
const multiScattering = vec3().toVar();
|
|
765
|
+
|
|
766
|
+
this.computeMultiscattering( singleScattering, multiScattering, specularF90, specularColor, this.iridescenceF0Dielectric );
|
|
767
|
+
|
|
768
|
+
const diffuse = irradiance.mul( BRDF_Lambert( { diffuseColor: diffuseContribution } ) ).mul( singleScattering.add( multiScattering ).oneMinus() ).toVar();
|
|
714
769
|
|
|
715
770
|
if ( this.sheen === true ) {
|
|
716
771
|
|
|
717
772
|
const sheenAlbedo = IBLSheenBRDF( { normal: normalView, viewDir: positionViewDirection, roughness: sheenRoughness } );
|
|
718
773
|
|
|
774
|
+
this.sheenSpecularIndirect.addAssign( irradiance.mul( sheen, sheenAlbedo, 1 / Math.PI ) );
|
|
775
|
+
|
|
719
776
|
const sheenEnergyComp = sheen.r.max( sheen.g ).max( sheen.b ).mul( sheenAlbedo ).oneMinus();
|
|
720
777
|
|
|
721
778
|
diffuse.mulAssign( sheenEnergyComp );
|
|
@@ -743,7 +800,8 @@ class PhysicalLightingModel extends LightingModel {
|
|
|
743
800
|
normal: normalView,
|
|
744
801
|
viewDir: positionViewDirection,
|
|
745
802
|
roughness: sheenRoughness
|
|
746
|
-
} )
|
|
803
|
+
} ),
|
|
804
|
+
1 / Math.PI
|
|
747
805
|
) );
|
|
748
806
|
|
|
749
807
|
}
|
|
@@ -865,7 +923,7 @@ class PhysicalLightingModel extends LightingModel {
|
|
|
865
923
|
|
|
866
924
|
if ( this.sheen === true ) {
|
|
867
925
|
|
|
868
|
-
const sheenLight = outgoingLight.add( this.sheenSpecularDirect, this.sheenSpecularIndirect
|
|
926
|
+
const sheenLight = outgoingLight.add( this.sheenSpecularDirect, this.sheenSpecularIndirect );
|
|
869
927
|
|
|
870
928
|
outgoingLight.assign( sheenLight );
|
|
871
929
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import LightingModel from '../core/LightingModel.js';
|
|
2
2
|
import BRDF_Lambert from './BSDF/BRDF_Lambert.js';
|
|
3
3
|
import { diffuseColor } from '../core/PropertyNode.js';
|
|
4
|
-
import {
|
|
4
|
+
import { normalView } from '../accessors/Normal.js';
|
|
5
5
|
import { Fn, float, vec2, vec3 } from '../tsl/TSLBase.js';
|
|
6
6
|
import { mix, smoothstep } from '../math/MathNode.js';
|
|
7
7
|
import { materialReference } from '../accessors/MaterialReferenceNode.js';
|
|
@@ -44,7 +44,7 @@ class ToonLightingModel extends LightingModel {
|
|
|
44
44
|
*/
|
|
45
45
|
direct( { lightDirection, lightColor, reflectedLight }, builder ) {
|
|
46
46
|
|
|
47
|
-
const irradiance = getGradientIrradiance( { normal:
|
|
47
|
+
const irradiance = getGradientIrradiance( { normal: normalView, lightDirection, builder } ).mul( lightColor );
|
|
48
48
|
|
|
49
49
|
reflectedLight.directDiffuse.addAssign( irradiance.mul( BRDF_Lambert( { diffuseColor: diffuseColor.rgb } ) ) );
|
|
50
50
|
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { positionWorld } from '../../accessors/Position.js';
|
|
2
|
-
import { float, Fn, min, normalize,
|
|
2
|
+
import { float, Fn, min, normalize, vec3 } from '../../tsl/TSLBase.js';
|
|
3
3
|
|
|
4
4
|
/**
|
|
5
5
|
* This computes a parallax corrected normal which is used for box-projected cube mapping (BPCEM).
|
|
@@ -21,8 +21,8 @@ import { float, Fn, min, normalize, sub, vec3 } from '../../tsl/TSLBase.js';
|
|
|
21
21
|
const getParallaxCorrectNormal = /*@__PURE__*/ Fn( ( [ normal, cubeSize, cubePos ] ) => {
|
|
22
22
|
|
|
23
23
|
const nDir = normalize( normal ).toVar();
|
|
24
|
-
const rbmax =
|
|
25
|
-
const rbmin =
|
|
24
|
+
const rbmax = cubeSize.mul( 0.5 ).add( cubePos ).sub( positionWorld ).div( nDir ).toVar();
|
|
25
|
+
const rbmin = cubeSize.mul( - 0.5 ).add( cubePos ).sub( positionWorld ).div( nDir ).toVar();
|
|
26
26
|
const rbminmax = vec3().toVar();
|
|
27
27
|
rbminmax.x = nDir.x.greaterThan( float( 0 ) ).select( rbmax.x, rbmin.x );
|
|
28
28
|
rbminmax.y = nDir.y.greaterThan( float( 0 ) ).select( rbmax.y, rbmin.y );
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import Node from '../core/Node.js';
|
|
2
2
|
import { expression } from '../code/ExpressionNode.js';
|
|
3
3
|
import { nodeProxy } from '../tsl/TSLCore.js';
|
|
4
|
+
import { error } from '../../utils.js';
|
|
4
5
|
|
|
5
6
|
/**
|
|
6
7
|
* `AtomicFunctionNode` represents any function that can operate on atomic variable types
|
|
@@ -90,11 +91,17 @@ class AtomicFunctionNode extends Node {
|
|
|
90
91
|
|
|
91
92
|
generate( builder ) {
|
|
92
93
|
|
|
94
|
+
const method = this.method;
|
|
95
|
+
|
|
96
|
+
if ( builder.shaderStage === 'vertex' ) {
|
|
97
|
+
|
|
98
|
+
error( `TSL: "${this.method}" is not supported in the vertex stage.` );
|
|
99
|
+
|
|
100
|
+
}
|
|
101
|
+
|
|
93
102
|
const properties = builder.getNodeProperties( this );
|
|
94
103
|
const parents = properties.parents;
|
|
95
104
|
|
|
96
|
-
const method = this.method;
|
|
97
|
-
|
|
98
105
|
const type = this.getNodeType( builder );
|
|
99
106
|
const inputType = this.getInputType( builder );
|
|
100
107
|
|
|
@@ -133,17 +140,61 @@ class AtomicFunctionNode extends Node {
|
|
|
133
140
|
|
|
134
141
|
}
|
|
135
142
|
|
|
136
|
-
|
|
143
|
+
static get ATOMIC_LOAD() {
|
|
144
|
+
|
|
145
|
+
return 'atomicLoad';
|
|
146
|
+
|
|
147
|
+
}
|
|
137
148
|
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
149
|
+
static get ATOMIC_STORE() {
|
|
150
|
+
|
|
151
|
+
return 'atomicStore';
|
|
152
|
+
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
static get ATOMIC_ADD() {
|
|
156
|
+
|
|
157
|
+
return 'atomicAdd';
|
|
158
|
+
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
static get ATOMIC_SUB() {
|
|
162
|
+
|
|
163
|
+
return 'atomicSub';
|
|
164
|
+
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
static get ATOMIC_MAX() {
|
|
168
|
+
|
|
169
|
+
return 'atomicMax';
|
|
170
|
+
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
static get ATOMIC_MIN() {
|
|
174
|
+
|
|
175
|
+
return 'atomicMin';
|
|
176
|
+
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
static get ATOMIC_AND() {
|
|
180
|
+
|
|
181
|
+
return 'atomicAnd';
|
|
182
|
+
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
static get ATOMIC_OR() {
|
|
186
|
+
|
|
187
|
+
return 'atomicOr';
|
|
188
|
+
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
static get ATOMIC_XOR() {
|
|
192
|
+
|
|
193
|
+
return 'atomicXor';
|
|
194
|
+
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
}
|
|
147
198
|
|
|
148
199
|
export default AtomicFunctionNode;
|
|
149
200
|
|
|
@@ -157,7 +208,7 @@ export default AtomicFunctionNode;
|
|
|
157
208
|
* @param {Node} valueNode - The value that mutates the atomic variable.
|
|
158
209
|
* @returns {AtomicFunctionNode}
|
|
159
210
|
*/
|
|
160
|
-
const atomicNode = nodeProxy( AtomicFunctionNode );
|
|
211
|
+
const atomicNode = /*@__PURE__*/ nodeProxy( AtomicFunctionNode );
|
|
161
212
|
|
|
162
213
|
/**
|
|
163
214
|
* TSL function for appending an atomic function call into the programmatic flow of a compute shader.
|