@plastic-software/three 0.179.0 → 0.181.1
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 +1108 -591
- package/build/three.core.js +616 -345
- package/build/three.core.min.js +1 -1
- package/build/three.module.js +488 -250
- package/build/three.module.min.js +1 -1
- package/build/three.tsl.js +37 -6
- package/build/three.tsl.min.js +1 -1
- package/build/three.webgpu.js +6576 -2152
- package/build/three.webgpu.min.js +1 -1
- package/build/three.webgpu.nodes.js +6575 -2151
- package/build/three.webgpu.nodes.min.js +1 -1
- package/examples/fonts/MPLUSRounded1c/MPLUSRounded1c-Regular.typeface.json.zip +0 -0
- package/examples/fonts/MPLUSRounded1c/OFL.txt +91 -0
- package/examples/jsm/Addons.js +1 -1
- package/examples/jsm/animation/CCDIKSolver.js +1 -1
- package/examples/jsm/controls/ArcballControls.js +8 -8
- package/examples/jsm/controls/DragControls.js +7 -57
- package/examples/jsm/controls/FirstPersonControls.js +3 -3
- package/examples/jsm/controls/FlyControls.js +1 -1
- package/examples/jsm/controls/OrbitControls.js +2 -2
- package/examples/jsm/controls/PointerLockControls.js +2 -10
- package/examples/jsm/controls/TrackballControls.js +1 -1
- package/examples/jsm/controls/TransformControls.js +1 -1
- package/examples/jsm/effects/AsciiEffect.js +8 -8
- package/examples/jsm/exporters/DRACOExporter.js +2 -2
- package/examples/jsm/exporters/EXRExporter.js +1 -1
- package/examples/jsm/exporters/GLTFExporter.js +33 -25
- package/examples/jsm/exporters/KTX2Exporter.js +4 -2
- package/examples/jsm/exporters/PLYExporter.js +1 -1
- package/examples/jsm/exporters/USDZExporter.js +9 -2
- package/examples/jsm/geometries/DecalGeometry.js +2 -2
- package/examples/jsm/geometries/ParametricGeometry.js +1 -1
- package/examples/jsm/geometries/TeapotGeometry.js +2 -2
- package/examples/jsm/geometries/TextGeometry.js +3 -2
- package/examples/jsm/gpgpu/BitonicSort.js +715 -0
- package/examples/jsm/helpers/ViewHelper.js +43 -5
- package/examples/jsm/inspector/Inspector.js +427 -0
- package/examples/jsm/inspector/RendererInspector.js +415 -0
- package/examples/jsm/inspector/tabs/Console.js +204 -0
- package/examples/jsm/inspector/tabs/Parameters.js +332 -0
- package/examples/jsm/inspector/tabs/Performance.js +268 -0
- package/examples/jsm/inspector/tabs/Viewer.js +166 -0
- package/examples/jsm/inspector/ui/Graph.js +95 -0
- package/examples/jsm/inspector/ui/Item.js +170 -0
- package/examples/jsm/inspector/ui/List.js +75 -0
- package/examples/jsm/inspector/ui/Profiler.js +170 -0
- package/examples/jsm/inspector/ui/Style.js +654 -0
- package/examples/jsm/inspector/ui/Tab.js +46 -0
- package/examples/jsm/inspector/ui/Values.js +423 -0
- package/examples/jsm/inspector/ui/utils.js +56 -0
- package/examples/jsm/interactive/HTMLMesh.js +6 -10
- package/examples/jsm/interactive/InteractiveGroup.js +1 -1
- package/examples/jsm/interactive/SelectionBox.js +30 -0
- package/examples/jsm/libs/ktx-parse.module.js +1 -1
- package/examples/jsm/lights/RectAreaLightTexturesLib.js +1 -1
- package/examples/jsm/lines/Line2.js +3 -3
- package/examples/jsm/lines/LineGeometry.js +1 -1
- package/examples/jsm/lines/LineSegments2.js +2 -2
- package/examples/jsm/lines/Wireframe.js +2 -2
- package/examples/jsm/lines/WireframeGeometry2.js +1 -1
- package/examples/jsm/lines/webgpu/LineSegments2.js +1 -1
- package/examples/jsm/lines/webgpu/Wireframe.js +1 -1
- package/examples/jsm/loaders/3MFLoader.js +1 -1
- package/examples/jsm/loaders/ColladaLoader.js +3 -3
- package/examples/jsm/loaders/DDSLoader.js +1 -1
- package/examples/jsm/loaders/DRACOLoader.js +73 -22
- package/examples/jsm/loaders/EXRLoader.js +5 -5
- package/examples/jsm/loaders/FBXLoader.js +2 -2
- package/examples/jsm/loaders/FontLoader.js +23 -5
- package/examples/jsm/loaders/GLTFLoader.js +14 -8
- package/examples/jsm/loaders/HDRCubeTextureLoader.js +5 -5
- package/examples/jsm/loaders/HDRLoader.js +486 -0
- package/examples/jsm/loaders/KTX2Loader.js +136 -49
- package/examples/jsm/loaders/KTXLoader.js +2 -2
- package/examples/jsm/loaders/LDrawLoader.js +1 -1
- package/examples/jsm/loaders/LUT3dlLoader.js +2 -2
- package/examples/jsm/loaders/LUTCubeLoader.js +1 -1
- package/examples/jsm/loaders/LWOLoader.js +2 -2
- package/examples/jsm/loaders/MaterialXLoader.js +22 -5
- package/examples/jsm/loaders/OBJLoader.js +1 -1
- package/examples/jsm/loaders/PDBLoader.js +1 -1
- package/examples/jsm/loaders/RGBELoader.js +7 -473
- package/examples/jsm/loaders/SVGLoader.js +2 -2
- package/examples/jsm/loaders/TTFLoader.js +4 -4
- package/examples/jsm/loaders/UltraHDRLoader.js +2 -2
- package/examples/jsm/loaders/lwo/IFFParser.js +1 -1
- package/examples/jsm/materials/WoodNodeMaterial.js +533 -0
- package/examples/jsm/math/ColorSpaces.js +19 -1
- package/examples/jsm/math/ConvexHull.js +3 -3
- package/examples/jsm/math/ImprovedNoise.js +1 -1
- package/examples/jsm/math/Lut.js +2 -2
- package/examples/jsm/math/SimplexNoise.js +1 -1
- package/examples/jsm/misc/MD2CharacterComplex.js +1 -1
- package/examples/jsm/misc/ProgressiveLightMap.js +9 -3
- package/examples/jsm/misc/ProgressiveLightMapGPU.js +7 -1
- package/examples/jsm/misc/TubePainter.js +383 -40
- package/examples/jsm/misc/Volume.js +1 -1
- package/examples/jsm/modifiers/SimplifyModifier.js +1 -1
- package/examples/jsm/objects/ReflectorForSSRPass.js +1 -0
- package/examples/jsm/objects/Sky.js +1 -1
- package/examples/jsm/objects/SkyMesh.js +1 -1
- package/examples/jsm/objects/Water.js +3 -3
- package/examples/jsm/objects/WaterMesh.js +6 -6
- package/examples/jsm/postprocessing/GlitchPass.js +2 -2
- package/examples/jsm/postprocessing/OutlinePass.js +1 -1
- package/examples/jsm/postprocessing/SSRPass.js +37 -8
- package/examples/jsm/postprocessing/UnrealBloomPass.js +8 -6
- package/examples/jsm/renderers/CSS2DRenderer.js +16 -5
- package/examples/jsm/renderers/CSS3DRenderer.js +7 -6
- package/examples/jsm/renderers/SVGRenderer.js +1 -1
- package/examples/jsm/shaders/ACESFilmicToneMappingShader.js +1 -1
- package/examples/jsm/shaders/AfterimageShader.js +1 -1
- package/examples/jsm/shaders/BleachBypassShader.js +1 -1
- package/examples/jsm/shaders/BokehShader.js +1 -1
- package/examples/jsm/shaders/BokehShader2.js +1 -1
- package/examples/jsm/shaders/DotScreenShader.js +1 -1
- package/examples/jsm/shaders/FocusShader.js +1 -1
- package/examples/jsm/shaders/GTAOShader.js +2 -2
- package/examples/jsm/shaders/GodRaysShader.js +1 -1
- package/examples/jsm/shaders/KaleidoShader.js +1 -1
- package/examples/jsm/shaders/PoissonDenoiseShader.js +2 -2
- package/examples/jsm/shaders/SSRShader.js +1 -1
- package/examples/jsm/shaders/SepiaShader.js +1 -1
- package/examples/jsm/shaders/SubsurfaceScatteringShader.js +1 -1
- package/examples/jsm/shaders/TriangleBlurShader.js +1 -1
- package/examples/jsm/shaders/UnpackDepthRGBAShader.js +1 -1
- package/examples/jsm/shaders/VignetteShader.js +1 -1
- package/examples/jsm/transpiler/GLSLDecoder.js +22 -19
- package/examples/jsm/transpiler/TSLEncoder.js +9 -10
- package/examples/jsm/transpiler/WGSLEncoder.js +24 -0
- package/examples/jsm/tsl/display/AfterImageNode.js +26 -24
- package/examples/jsm/tsl/display/AnamorphicNode.js +28 -4
- package/examples/jsm/tsl/display/BloomNode.js +7 -3
- package/examples/jsm/tsl/display/ChromaticAberrationNode.js +2 -1
- package/examples/jsm/tsl/display/DenoiseNode.js +2 -0
- package/examples/jsm/tsl/display/DepthOfFieldNode.js +446 -90
- package/examples/jsm/tsl/display/GTAONode.js +53 -5
- package/examples/jsm/tsl/display/GaussianBlurNode.js +49 -35
- package/examples/jsm/tsl/display/OutlineNode.js +13 -2
- package/examples/jsm/tsl/display/SSGINode.js +654 -0
- package/examples/jsm/tsl/display/SSRNode.js +182 -65
- package/examples/jsm/tsl/display/SSSNode.js +488 -0
- package/examples/jsm/tsl/display/TRAANode.js +124 -7
- package/examples/jsm/tsl/display/boxBlur.js +65 -0
- package/examples/jsm/tsl/display/hashBlur.js +16 -18
- package/examples/jsm/tsl/lighting/TiledLightsNode.js +21 -1
- package/examples/jsm/utils/BufferGeometryUtils.js +1 -1
- package/examples/jsm/utils/ShadowMapViewerGPU.js +12 -5
- package/examples/jsm/webxr/OculusHandModel.js +1 -1
- package/examples/jsm/webxr/XRControllerModelFactory.js +1 -1
- package/examples/jsm/webxr/XRHandModelFactory.js +2 -6
- package/package.json +5 -10
- package/src/Three.Core.js +4 -2
- package/src/Three.TSL.js +36 -5
- package/src/Three.WebGPU.Nodes.js +2 -0
- package/src/Three.WebGPU.js +2 -0
- package/src/animation/AnimationClip.js +20 -4
- package/src/animation/AnimationMixer.js +3 -3
- package/src/animation/AnimationObjectGroup.js +2 -1
- package/src/animation/KeyframeTrack.js +7 -6
- package/src/animation/PropertyBinding.js +12 -11
- package/src/audio/Audio.js +10 -9
- package/src/audio/PositionalAudio.js +1 -1
- package/src/cameras/OrthographicCamera.js +1 -1
- package/src/cameras/PerspectiveCamera.js +1 -1
- package/src/cameras/StereoCamera.js +2 -2
- package/src/constants.js +11 -3
- package/src/core/BufferGeometry.js +10 -10
- package/src/core/EventDispatcher.js +1 -1
- package/src/core/InterleavedBuffer.js +1 -1
- package/src/core/InterleavedBufferAttribute.js +3 -2
- package/src/core/Object3D.js +3 -2
- package/src/core/Raycaster.js +2 -1
- package/src/core/RenderTarget.js +10 -1
- package/src/extras/Controls.js +5 -4
- package/src/extras/DataUtils.js +2 -1
- package/src/extras/Earcut.js +6 -0
- package/src/extras/ImageUtils.js +2 -2
- package/src/extras/PMREMGenerator.js +268 -55
- package/src/extras/TextureUtils.js +2 -1
- package/src/extras/core/Curve.js +2 -1
- package/src/extras/core/Interpolations.js +7 -1
- package/src/extras/core/ShapePath.js +4 -4
- package/src/extras/lib/earcut.js +8 -8
- package/src/geometries/BoxGeometry.js +1 -0
- package/src/geometries/CapsuleGeometry.js +1 -0
- package/src/geometries/CircleGeometry.js +1 -0
- package/src/geometries/ConeGeometry.js +1 -0
- package/src/geometries/CylinderGeometry.js +1 -0
- package/src/geometries/DodecahedronGeometry.js +1 -0
- package/src/geometries/ExtrudeGeometry.js +8 -6
- package/src/geometries/IcosahedronGeometry.js +1 -0
- package/src/geometries/LatheGeometry.js +1 -0
- package/src/geometries/OctahedronGeometry.js +1 -0
- package/src/geometries/PlaneGeometry.js +1 -0
- package/src/geometries/RingGeometry.js +1 -0
- package/src/geometries/ShapeGeometry.js +1 -0
- package/src/geometries/SphereGeometry.js +1 -0
- package/src/geometries/TetrahedronGeometry.js +1 -0
- package/src/geometries/TorusGeometry.js +1 -0
- package/src/geometries/TorusKnotGeometry.js +1 -0
- package/src/geometries/TubeGeometry.js +1 -0
- package/src/helpers/CameraHelper.js +1 -1
- package/src/lights/webgpu/ProjectorLight.js +1 -1
- package/src/loaders/AnimationLoader.js +2 -1
- package/src/loaders/AudioLoader.js +2 -1
- package/src/loaders/BufferGeometryLoader.js +2 -2
- package/src/loaders/Cache.js +2 -2
- package/src/loaders/DataTextureLoader.js +1 -1
- package/src/loaders/FileLoader.js +3 -2
- package/src/loaders/ImageBitmapLoader.js +5 -4
- package/src/loaders/ImageLoader.js +1 -1
- package/src/loaders/Loader.js +3 -3
- package/src/loaders/LoadingManager.js +25 -3
- package/src/loaders/MaterialLoader.js +3 -2
- package/src/loaders/ObjectLoader.js +13 -13
- package/src/loaders/TextureLoader.js +1 -1
- package/src/loaders/nodes/NodeLoader.js +3 -2
- package/src/materials/Material.js +16 -3
- package/src/materials/MeshBasicMaterial.js +1 -0
- package/src/materials/MeshDepthMaterial.js +1 -0
- package/src/materials/MeshDistanceMaterial.js +1 -1
- package/src/materials/MeshLambertMaterial.js +2 -1
- package/src/materials/MeshMatcapMaterial.js +22 -0
- package/src/materials/MeshNormalMaterial.js +1 -0
- package/src/materials/MeshPhongMaterial.js +2 -1
- package/src/materials/MeshPhysicalMaterial.js +2 -1
- package/src/materials/MeshStandardMaterial.js +8 -7
- package/src/materials/MeshToonMaterial.js +1 -0
- package/src/materials/PointsMaterial.js +1 -1
- package/src/materials/ShaderMaterial.js +2 -2
- package/src/materials/nodes/Line2NodeMaterial.js +2 -2
- package/src/materials/nodes/MeshSSSNodeMaterial.js +1 -1
- package/src/materials/nodes/NodeMaterial.js +62 -22
- package/src/materials/nodes/PointsNodeMaterial.js +81 -28
- package/src/materials/nodes/SpriteNodeMaterial.js +3 -15
- package/src/materials/nodes/manager/NodeMaterialObserver.js +3 -2
- package/src/math/Color.js +6 -5
- package/src/math/ColorManagement.js +9 -3
- package/src/math/Cylindrical.js +1 -1
- package/src/math/Euler.js +2 -1
- package/src/math/MathUtils.js +13 -11
- package/src/math/Matrix2.js +1 -1
- package/src/math/Matrix3.js +2 -2
- package/src/math/Matrix4.js +7 -7
- package/src/math/Plane.js +1 -1
- package/src/math/Quaternion.js +68 -66
- package/src/math/Spherical.js +1 -1
- package/src/nodes/Nodes.js +4 -1
- package/src/nodes/TSL.js +4 -1
- package/src/nodes/accessors/BufferNode.js +1 -1
- package/src/nodes/accessors/Camera.js +133 -7
- package/src/nodes/accessors/ClippingNode.js +6 -5
- package/src/nodes/accessors/CubeTextureNode.js +5 -4
- package/src/nodes/accessors/InstanceNode.js +25 -5
- package/src/nodes/accessors/Lights.js +10 -0
- package/src/nodes/accessors/Normal.js +5 -4
- package/src/nodes/accessors/Object3DNode.js +1 -1
- package/src/nodes/accessors/Position.js +18 -2
- package/src/nodes/accessors/ReferenceBaseNode.js +1 -1
- package/src/nodes/accessors/ReferenceNode.js +3 -2
- package/src/nodes/accessors/SceneNode.js +2 -1
- package/src/nodes/accessors/StorageBufferNode.js +2 -1
- package/src/nodes/accessors/StorageTextureNode.js +22 -0
- package/src/nodes/accessors/Texture3DNode.js +14 -1
- package/src/nodes/accessors/TextureNode.js +130 -44
- package/src/nodes/code/FunctionCallNode.js +24 -4
- package/src/nodes/code/FunctionNode.js +23 -0
- package/src/nodes/core/ArrayNode.js +1 -0
- package/src/nodes/core/AssignNode.js +4 -3
- package/src/nodes/core/AttributeNode.js +2 -1
- package/src/nodes/core/ContextNode.js +29 -10
- package/src/nodes/core/IndexNode.js +2 -2
- package/src/nodes/core/InputNode.js +2 -1
- package/src/nodes/core/InspectorNode.js +128 -0
- package/src/nodes/core/{CacheNode.js → IsolateNode.js} +40 -7
- package/src/nodes/core/Node.js +152 -31
- package/src/nodes/core/NodeBuilder.js +183 -35
- package/src/nodes/core/NodeFrame.js +21 -21
- package/src/nodes/core/NodeFunction.js +2 -1
- package/src/nodes/core/NodeParser.js +2 -1
- package/src/nodes/core/NodeUniform.js +1 -1
- package/src/nodes/core/NodeUtils.js +17 -91
- package/src/nodes/core/ParameterNode.js +31 -0
- package/src/nodes/core/PropertyNode.js +7 -0
- package/src/nodes/core/StackNode.js +43 -16
- package/src/nodes/core/StructNode.js +5 -5
- package/src/nodes/core/StructTypeNode.js +1 -0
- package/src/nodes/core/SubBuildNode.js +2 -2
- package/src/nodes/core/UniformNode.js +18 -10
- package/src/nodes/core/VarNode.js +70 -33
- package/src/nodes/core/VaryingNode.js +3 -2
- package/src/nodes/display/BlendModes.js +5 -4
- package/src/nodes/display/BumpMapNode.js +1 -1
- package/src/nodes/display/ColorAdjustment.js +1 -1
- package/src/nodes/display/FrontFacingNode.js +4 -8
- package/src/nodes/display/NormalMapNode.js +2 -1
- package/src/nodes/display/PassNode.js +52 -11
- package/src/nodes/display/RenderOutputNode.js +28 -2
- package/src/nodes/display/ScreenNode.js +44 -14
- package/src/nodes/display/ToneMappingNode.js +31 -4
- package/src/nodes/display/ToonOutlinePassNode.js +8 -0
- package/src/nodes/display/ViewportDepthTextureNode.js +16 -4
- package/src/nodes/display/ViewportSharedTextureNode.js +12 -0
- package/src/nodes/display/ViewportTextureNode.js +42 -12
- package/src/nodes/fog/Fog.js +3 -2
- package/src/nodes/functions/BSDF/BRDF_GGX_Multiscatter.js +52 -0
- package/src/nodes/functions/BSDF/DFGApprox.js +60 -19
- package/src/nodes/functions/BasicLightingModel.js +2 -1
- package/src/nodes/functions/PhysicalLightingModel.js +3 -2
- package/src/nodes/functions/VolumetricLightingModel.js +5 -5
- package/src/nodes/geometry/RangeNode.js +40 -4
- package/src/nodes/gpgpu/ComputeBuiltinNode.js +2 -1
- package/src/nodes/gpgpu/ComputeNode.js +17 -5
- package/src/nodes/gpgpu/SubgroupFunctionNode.js +455 -0
- package/src/nodes/gpgpu/WorkgroupInfoNode.js +2 -1
- package/src/nodes/lighting/EnvironmentNode.js +6 -6
- package/src/nodes/lighting/LightsNode.js +3 -4
- package/src/nodes/lighting/PointShadowNode.js +6 -0
- package/src/nodes/lighting/ShadowFilterNode.js +2 -0
- package/src/nodes/lighting/ShadowNode.js +75 -8
- package/src/nodes/math/BitcastNode.js +156 -0
- package/src/nodes/math/ConditionalNode.js +24 -7
- package/src/nodes/math/MathNode.js +25 -19
- package/src/nodes/math/OperatorNode.js +7 -5
- package/src/nodes/pmrem/PMREMUtils.js +117 -2
- package/src/nodes/shapes/Shapes.js +1 -1
- package/src/nodes/tsl/TSLBase.js +5 -2
- package/src/nodes/tsl/TSLCore.js +460 -159
- package/src/nodes/utils/DebugNode.js +2 -1
- package/src/nodes/utils/EventNode.js +36 -0
- package/src/nodes/utils/FunctionOverloadingNode.js +37 -19
- package/src/nodes/utils/JoinNode.js +6 -3
- package/src/nodes/utils/LoopNode.js +20 -24
- package/src/nodes/utils/MemberNode.js +59 -7
- package/src/nodes/utils/PostProcessingUtils.js +28 -1
- package/src/nodes/utils/RTTNode.js +13 -3
- package/src/nodes/utils/ReflectorNode.js +58 -7
- package/src/nodes/utils/SampleNode.js +12 -2
- package/src/nodes/utils/SplitNode.js +11 -0
- package/src/nodes/utils/Timer.js +0 -47
- package/src/objects/BatchedMesh.js +2 -2
- package/src/objects/LOD.js +1 -1
- package/src/objects/Line.js +2 -1
- package/src/objects/LineSegments.js +2 -1
- package/src/objects/Skeleton.js +3 -2
- package/src/objects/SkinnedMesh.js +3 -1
- package/src/objects/Sprite.js +4 -3
- package/src/renderers/WebGLRenderer.js +48 -41
- package/src/renderers/common/Animation.js +13 -1
- package/src/renderers/common/Attributes.js +1 -1
- package/src/renderers/common/Backend.js +108 -27
- package/src/renderers/common/Background.js +2 -1
- package/src/renderers/common/Bindings.js +58 -2
- package/src/renderers/common/CanvasTarget.js +341 -0
- package/src/renderers/common/ChainMap.js +1 -1
- package/src/renderers/common/DataMap.js +1 -1
- package/src/renderers/common/Geometries.js +26 -0
- package/src/renderers/common/Info.js +4 -2
- package/src/renderers/common/InspectorBase.js +146 -0
- package/src/renderers/common/Pipelines.js +1 -1
- package/src/renderers/common/PostProcessing.js +6 -25
- package/src/renderers/common/QuadMesh.js +7 -1
- package/src/renderers/common/RenderContext.js +2 -2
- package/src/renderers/common/RenderList.js +7 -3
- package/src/renderers/common/RenderObject.js +16 -2
- package/src/renderers/common/RenderObjects.js +1 -1
- package/src/renderers/common/Renderer.js +473 -245
- package/src/renderers/common/RendererUtils.js +9 -0
- package/src/renderers/common/SampledTexture.js +9 -1
- package/src/renderers/common/Sampler.js +50 -12
- package/src/renderers/common/StorageTexture.js +9 -1
- package/src/renderers/common/Textures.js +121 -45
- package/src/renderers/common/TimestampQueryPool.js +65 -3
- package/src/renderers/common/UniformsGroup.js +2 -1
- package/src/renderers/common/XRManager.js +42 -22
- package/src/renderers/common/extras/PMREMGenerator.js +160 -65
- package/src/renderers/common/nodes/NodeBuilderState.js +1 -1
- package/src/renderers/common/nodes/NodeLibrary.js +9 -7
- package/src/renderers/common/nodes/NodeSampler.js +13 -1
- package/src/renderers/common/nodes/Nodes.js +38 -16
- package/src/renderers/shaders/DFGLUTData.js +64 -0
- package/src/renderers/shaders/ShaderChunk/common.glsl.js +0 -12
- package/src/renderers/shaders/ShaderChunk/envmap_common_pars_fragment.glsl.js +1 -1
- package/src/renderers/shaders/ShaderChunk/envmap_physical_pars_fragment.glsl.js +1 -1
- package/src/renderers/shaders/ShaderChunk/lights_physical_pars_fragment.glsl.js +52 -18
- package/src/renderers/shaders/ShaderChunk/logdepthbuf_fragment.glsl.js +1 -1
- package/src/renderers/shaders/ShaderChunk/logdepthbuf_pars_fragment.glsl.js +1 -1
- package/src/renderers/shaders/ShaderChunk/logdepthbuf_pars_vertex.glsl.js +1 -1
- package/src/renderers/shaders/ShaderChunk/logdepthbuf_vertex.glsl.js +1 -1
- package/src/renderers/shaders/ShaderChunk/shadowmap_pars_fragment.glsl.js +7 -15
- package/src/renderers/shaders/ShaderLib/depth.glsl.js +1 -1
- package/src/renderers/shaders/UniformsLib.js +1 -0
- package/src/renderers/shaders/UniformsUtils.js +25 -4
- package/src/renderers/webgl/WebGLCapabilities.js +2 -1
- package/src/renderers/webgl/WebGLExtensions.js +2 -25
- package/src/renderers/webgl/WebGLInfo.js +3 -1
- package/src/renderers/webgl/WebGLProgram.js +15 -14
- package/src/renderers/webgl/WebGLPrograms.js +2 -1
- package/src/renderers/webgl/WebGLShadowMap.js +3 -2
- package/src/renderers/webgl/WebGLState.js +15 -14
- package/src/renderers/webgl/WebGLTextures.js +19 -14
- package/src/renderers/webgl/WebGLUniformsGroups.js +5 -3
- package/src/renderers/webgl/WebGLUtils.js +3 -2
- package/src/renderers/webgl-fallback/WebGLBackend.js +199 -167
- package/src/renderers/webgl-fallback/nodes/GLSLNodeBuilder.js +181 -25
- package/src/renderers/webgl-fallback/utils/WebGLConstants.js +2 -3
- package/src/renderers/webgl-fallback/utils/WebGLState.js +7 -6
- package/src/renderers/webgl-fallback/utils/WebGLTextureUtils.js +169 -19
- package/src/renderers/webgl-fallback/utils/WebGLTimestampQueryPool.js +51 -22
- package/src/renderers/webgl-fallback/utils/WebGLUtils.js +3 -2
- package/src/renderers/webgpu/WebGPUBackend.js +153 -123
- package/src/renderers/webgpu/WebGPURenderer.Nodes.js +2 -1
- package/src/renderers/webgpu/WebGPURenderer.js +3 -2
- package/src/renderers/webgpu/nodes/WGSLNodeBuilder.js +142 -50
- package/src/renderers/webgpu/utils/WebGPUAttributeUtils.js +2 -1
- package/src/renderers/webgpu/utils/WebGPUBindingUtils.js +5 -3
- package/src/renderers/webgpu/utils/WebGPUConstants.js +7 -2
- package/src/renderers/webgpu/utils/WebGPUPipelineUtils.js +53 -34
- package/src/renderers/webgpu/utils/WebGPUTexturePassUtils.js +6 -8
- package/src/renderers/webgpu/utils/WebGPUTextureUtils.js +260 -99
- package/src/renderers/webgpu/utils/WebGPUTimestampQueryPool.js +32 -9
- package/src/renderers/webgpu/utils/WebGPUUtils.js +22 -2
- package/src/renderers/webxr/WebXRManager.js +42 -26
- package/src/textures/ExternalTexture.js +15 -4
- package/src/textures/Source.js +3 -2
- package/src/textures/Texture.js +3 -2
- package/src/textures/VideoTexture.js +2 -3
- package/src/utils.js +67 -3
- package/examples/jsm/loaders/RGBMLoader.js +0 -1148
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import ShadowBaseNode, { shadowPositionWorld } from './ShadowBaseNode.js';
|
|
2
2
|
import { float, vec2, vec3, int, Fn, nodeObject } from '../tsl/TSLBase.js';
|
|
3
3
|
import { reference } from '../accessors/ReferenceNode.js';
|
|
4
|
-
import { texture } from '../accessors/TextureNode.js';
|
|
4
|
+
import { texture, textureLoad } from '../accessors/TextureNode.js';
|
|
5
5
|
import { normalWorld } from '../accessors/Normal.js';
|
|
6
6
|
import { mix, sqrt } from '../math/MathNode.js';
|
|
7
7
|
import { add } from '../math/OperatorNode.js';
|
|
@@ -18,6 +18,9 @@ import { resetRendererAndSceneState, restoreRendererAndSceneState } from '../../
|
|
|
18
18
|
import { getDataFromObject } from '../core/NodeUtils.js';
|
|
19
19
|
import { getShadowMaterial, BasicShadowFilter, PCFShadowFilter, PCFSoftShadowFilter, VSMShadowFilter } from './ShadowFilterNode.js';
|
|
20
20
|
import ChainMap from '../../renderers/common/ChainMap.js';
|
|
21
|
+
import { warn } from '../../utils.js';
|
|
22
|
+
import { textureSize } from '../accessors/TextureSizeNode.js';
|
|
23
|
+
import { uv } from '../accessors/UV.js';
|
|
21
24
|
|
|
22
25
|
//
|
|
23
26
|
|
|
@@ -27,6 +30,8 @@ const _shadowRenderObjectKeys = [];
|
|
|
27
30
|
/**
|
|
28
31
|
* Creates a function to render shadow objects in a scene.
|
|
29
32
|
*
|
|
33
|
+
* @tsl
|
|
34
|
+
* @function
|
|
30
35
|
* @param {Renderer} renderer - The renderer.
|
|
31
36
|
* @param {LightShadow} shadow - The light shadow object containing shadow properties.
|
|
32
37
|
* @param {number} shadowType - The type of shadow map (e.g., BasicShadowMap).
|
|
@@ -268,6 +273,22 @@ class ShadowNode extends ShadowBaseNode {
|
|
|
268
273
|
*/
|
|
269
274
|
this._node = null;
|
|
270
275
|
|
|
276
|
+
/**
|
|
277
|
+
* The current shadow map type of this shadow node.
|
|
278
|
+
*
|
|
279
|
+
* @type {?number}
|
|
280
|
+
* @private
|
|
281
|
+
* @default null
|
|
282
|
+
*/
|
|
283
|
+
this._currentShadowType = null;
|
|
284
|
+
|
|
285
|
+
/**
|
|
286
|
+
* A Weak Map holding the current frame ID per camera. Used
|
|
287
|
+
* to control the update of shadow maps.
|
|
288
|
+
*
|
|
289
|
+
* @type {WeakMap<Camera,number>}
|
|
290
|
+
* @private
|
|
291
|
+
*/
|
|
271
292
|
this._cameraFrameId = new WeakMap();
|
|
272
293
|
|
|
273
294
|
/**
|
|
@@ -405,7 +426,7 @@ class ShadowNode extends ShadowBaseNode {
|
|
|
405
426
|
*/
|
|
406
427
|
setupShadow( builder ) {
|
|
407
428
|
|
|
408
|
-
const { renderer } = builder;
|
|
429
|
+
const { renderer, camera } = builder;
|
|
409
430
|
|
|
410
431
|
const { light, shadow } = this;
|
|
411
432
|
|
|
@@ -413,6 +434,7 @@ class ShadowNode extends ShadowBaseNode {
|
|
|
413
434
|
|
|
414
435
|
const { depthTexture, shadowMap } = this.setupRenderTarget( shadow, builder );
|
|
415
436
|
|
|
437
|
+
shadow.camera.coordinateSystem = camera.coordinateSystem;
|
|
416
438
|
shadow.camera.updateProjectionMatrix();
|
|
417
439
|
|
|
418
440
|
// VSM
|
|
@@ -514,7 +536,19 @@ class ShadowNode extends ShadowBaseNode {
|
|
|
514
536
|
this.shadowMap = shadowMap;
|
|
515
537
|
this.shadow.map = shadowMap;
|
|
516
538
|
|
|
517
|
-
|
|
539
|
+
// Shadow Output + Inspector
|
|
540
|
+
|
|
541
|
+
const inspectName = `${ this.light.type } Shadow [ ${ this.light.name || 'ID: ' + this.light.id } ]`;
|
|
542
|
+
|
|
543
|
+
return shadowOutput.toInspector( `${ inspectName } / Color`, () => {
|
|
544
|
+
|
|
545
|
+
return texture( this.shadowMap.texture );
|
|
546
|
+
|
|
547
|
+
} ).toInspector( `${ inspectName } / Depth`, () => {
|
|
548
|
+
|
|
549
|
+
return textureLoad( this.shadowMap.depthTexture, uv().mul( textureSize( texture( this.shadowMap.depthTexture ) ) ) ).x.oneMinus();
|
|
550
|
+
|
|
551
|
+
} );
|
|
518
552
|
|
|
519
553
|
}
|
|
520
554
|
|
|
@@ -531,6 +565,15 @@ class ShadowNode extends ShadowBaseNode {
|
|
|
531
565
|
|
|
532
566
|
return Fn( () => {
|
|
533
567
|
|
|
568
|
+
const currentShadowType = builder.renderer.shadowMap.type;
|
|
569
|
+
|
|
570
|
+
if ( this._currentShadowType !== currentShadowType ) {
|
|
571
|
+
|
|
572
|
+
this._reset();
|
|
573
|
+
this._node = null;
|
|
574
|
+
|
|
575
|
+
}
|
|
576
|
+
|
|
534
577
|
let node = this._node;
|
|
535
578
|
|
|
536
579
|
this.setupShadowPosition( builder );
|
|
@@ -538,12 +581,13 @@ class ShadowNode extends ShadowBaseNode {
|
|
|
538
581
|
if ( node === null ) {
|
|
539
582
|
|
|
540
583
|
this._node = node = this.setupShadow( builder );
|
|
584
|
+
this._currentShadowType = currentShadowType;
|
|
541
585
|
|
|
542
586
|
}
|
|
543
587
|
|
|
544
588
|
if ( builder.material.shadowNode ) { // @deprecated, r171
|
|
545
589
|
|
|
546
|
-
|
|
590
|
+
warn( 'NodeMaterial: ".shadowNode" is deprecated. Use ".castShadowNode" instead.' );
|
|
547
591
|
|
|
548
592
|
}
|
|
549
593
|
|
|
@@ -576,8 +620,14 @@ class ShadowNode extends ShadowBaseNode {
|
|
|
576
620
|
|
|
577
621
|
shadowMap.setSize( shadow.mapSize.width, shadow.mapSize.height, shadowMap.depth );
|
|
578
622
|
|
|
623
|
+
const currentSceneName = scene.name;
|
|
624
|
+
|
|
625
|
+
scene.name = `Shadow Map [ ${ light.name || 'ID: ' + light.id } ]`;
|
|
626
|
+
|
|
579
627
|
renderer.render( scene, shadow.camera );
|
|
580
628
|
|
|
629
|
+
scene.name = currentSceneName;
|
|
630
|
+
|
|
581
631
|
}
|
|
582
632
|
|
|
583
633
|
/**
|
|
@@ -664,8 +714,27 @@ class ShadowNode extends ShadowBaseNode {
|
|
|
664
714
|
*/
|
|
665
715
|
dispose() {
|
|
666
716
|
|
|
667
|
-
this.
|
|
668
|
-
|
|
717
|
+
this._reset();
|
|
718
|
+
|
|
719
|
+
super.dispose();
|
|
720
|
+
|
|
721
|
+
}
|
|
722
|
+
|
|
723
|
+
/**
|
|
724
|
+
* Resets the resouce state of this shadow node.
|
|
725
|
+
*
|
|
726
|
+
* @private
|
|
727
|
+
*/
|
|
728
|
+
_reset() {
|
|
729
|
+
|
|
730
|
+
this._currentShadowType = null;
|
|
731
|
+
|
|
732
|
+
if ( this.shadowMap ) {
|
|
733
|
+
|
|
734
|
+
this.shadowMap.dispose();
|
|
735
|
+
this.shadowMap = null;
|
|
736
|
+
|
|
737
|
+
}
|
|
669
738
|
|
|
670
739
|
if ( this.vsmShadowMapVertical !== null ) {
|
|
671
740
|
|
|
@@ -687,8 +756,6 @@ class ShadowNode extends ShadowBaseNode {
|
|
|
687
756
|
|
|
688
757
|
}
|
|
689
758
|
|
|
690
|
-
super.dispose();
|
|
691
|
-
|
|
692
759
|
}
|
|
693
760
|
|
|
694
761
|
/**
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
import TempNode from '../core/TempNode.js';
|
|
2
|
+
import { nodeProxyIntent } from '../tsl/TSLCore.js';
|
|
3
|
+
/**
|
|
4
|
+
* This node represents an operation that reinterprets the bit representation of a value
|
|
5
|
+
* in one type as a value in another type.
|
|
6
|
+
*
|
|
7
|
+
* @augments TempNode
|
|
8
|
+
*/
|
|
9
|
+
class BitcastNode extends TempNode {
|
|
10
|
+
|
|
11
|
+
static get type() {
|
|
12
|
+
|
|
13
|
+
return 'BitcastNode';
|
|
14
|
+
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Constructs a new bitcast node.
|
|
19
|
+
*
|
|
20
|
+
* @param {Node} valueNode - The value to convert.
|
|
21
|
+
* @param {string} conversionType - The type to convert to.
|
|
22
|
+
* @param {?string} [inputType = null] - The expected input data type of the bitcast operation.
|
|
23
|
+
*/
|
|
24
|
+
constructor( valueNode, conversionType, inputType = null ) {
|
|
25
|
+
|
|
26
|
+
super();
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* The data to bitcast to a new type.
|
|
30
|
+
*
|
|
31
|
+
* @type {Node}
|
|
32
|
+
*/
|
|
33
|
+
this.valueNode = valueNode;
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* The type the value will be converted to.
|
|
37
|
+
*
|
|
38
|
+
* @type {string}
|
|
39
|
+
*/
|
|
40
|
+
this.conversionType = conversionType;
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* The expected input data type of the bitcast operation.
|
|
45
|
+
*
|
|
46
|
+
*
|
|
47
|
+
* @type {string}
|
|
48
|
+
* @default null
|
|
49
|
+
*/
|
|
50
|
+
this.inputType = inputType;
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* This flag can be used for type testing.
|
|
54
|
+
*
|
|
55
|
+
* @type {boolean}
|
|
56
|
+
* @readonly
|
|
57
|
+
* @default true
|
|
58
|
+
*/
|
|
59
|
+
this.isBitcastNode = true;
|
|
60
|
+
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
getNodeType( builder ) {
|
|
64
|
+
|
|
65
|
+
// GLSL aliasing
|
|
66
|
+
if ( this.inputType !== null ) {
|
|
67
|
+
|
|
68
|
+
const valueType = this.valueNode.getNodeType( builder );
|
|
69
|
+
const valueLength = builder.getTypeLength( valueType );
|
|
70
|
+
|
|
71
|
+
return builder.getTypeFromLength( valueLength, this.conversionType );
|
|
72
|
+
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
return this.conversionType;
|
|
76
|
+
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
generate( builder ) {
|
|
81
|
+
|
|
82
|
+
const type = this.getNodeType( builder );
|
|
83
|
+
let inputType = '';
|
|
84
|
+
|
|
85
|
+
if ( this.inputType !== null ) {
|
|
86
|
+
|
|
87
|
+
const valueType = this.valueNode.getNodeType( builder );
|
|
88
|
+
const valueTypeLength = builder.getTypeLength( valueType );
|
|
89
|
+
|
|
90
|
+
inputType = valueTypeLength === 1 ? this.inputType : builder.changeComponentType( valueType, this.inputType );
|
|
91
|
+
|
|
92
|
+
} else {
|
|
93
|
+
|
|
94
|
+
inputType = this.valueNode.getNodeType( builder );
|
|
95
|
+
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
return `${ builder.getBitcastMethod( type, inputType ) }( ${ this.valueNode.build( builder, inputType ) } )`;
|
|
99
|
+
|
|
100
|
+
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
export default BitcastNode;
|
|
106
|
+
|
|
107
|
+
/**
|
|
108
|
+
* Reinterpret the bit representation of a value in one type as a value in another type.
|
|
109
|
+
*
|
|
110
|
+
* @tsl
|
|
111
|
+
* @function
|
|
112
|
+
* @param {Node | number} x - The parameter.
|
|
113
|
+
* @param {string} y - The new type.
|
|
114
|
+
* @returns {Node}
|
|
115
|
+
*/
|
|
116
|
+
export const bitcast = /*@__PURE__*/ nodeProxyIntent( BitcastNode ).setParameterLength( 2 );
|
|
117
|
+
|
|
118
|
+
/**
|
|
119
|
+
* Bitcasts a float or a vector of floats to a corresponding integer type with the same element size.
|
|
120
|
+
*
|
|
121
|
+
* @tsl
|
|
122
|
+
* @function
|
|
123
|
+
* @param {Node<float>} value - The float or vector of floats to bitcast.
|
|
124
|
+
* @returns {BitcastNode}
|
|
125
|
+
*/
|
|
126
|
+
export const floatBitsToInt = ( value ) => new BitcastNode( value, 'int', 'float' );
|
|
127
|
+
|
|
128
|
+
/**
|
|
129
|
+
* Bitcasts a float or a vector of floats to a corresponding unsigned integer type with the same element size.
|
|
130
|
+
*
|
|
131
|
+
* @tsl
|
|
132
|
+
* @function
|
|
133
|
+
* @param {Node<float>} value - The float or vector of floats to bitcast.
|
|
134
|
+
* @returns {BitcastNode}
|
|
135
|
+
*/
|
|
136
|
+
export const floatBitsToUint = ( value ) => new BitcastNode( value, 'uint', 'float' );
|
|
137
|
+
|
|
138
|
+
/**
|
|
139
|
+
* Bitcasts an integer or a vector of integers to a corresponding float type with the same element size.
|
|
140
|
+
*
|
|
141
|
+
* @tsl
|
|
142
|
+
* @function
|
|
143
|
+
* @param {Node<int>} value - The integer or vector of integers to bitcast.
|
|
144
|
+
* @returns {BitcastNode}
|
|
145
|
+
*/
|
|
146
|
+
export const intBitsToFloat = ( value ) => new BitcastNode( value, 'float', 'int' );
|
|
147
|
+
|
|
148
|
+
/**
|
|
149
|
+
* Bitcast an unsigned integer or a vector of unsigned integers to a corresponding float type with the same element size.
|
|
150
|
+
*
|
|
151
|
+
* @tsl
|
|
152
|
+
* @function
|
|
153
|
+
* @param {Node<uint>} value - The unsigned integer or vector of unsigned integers to bitcast.
|
|
154
|
+
* @returns {BitcastNode}
|
|
155
|
+
*/
|
|
156
|
+
export const uintBitsToFloat = ( value ) => new BitcastNode( value, 'float', 'uint' );
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import Node from '../core/Node.js';
|
|
2
2
|
import { property } from '../core/PropertyNode.js';
|
|
3
3
|
import { addMethodChaining, nodeProxy } from '../tsl/TSLCore.js';
|
|
4
|
+
import { warn } from '../../utils.js';
|
|
4
5
|
|
|
5
6
|
/**
|
|
6
7
|
* Represents a logical `if/else` statement. Can be used as an alternative
|
|
@@ -99,9 +100,9 @@ class ConditionalNode extends Node {
|
|
|
99
100
|
|
|
100
101
|
setup( builder ) {
|
|
101
102
|
|
|
102
|
-
const condNode = this.condNode
|
|
103
|
-
const ifNode = this.ifNode.
|
|
104
|
-
const elseNode = this.elseNode ? this.elseNode.
|
|
103
|
+
const condNode = this.condNode;
|
|
104
|
+
const ifNode = this.ifNode.isolate();
|
|
105
|
+
const elseNode = this.elseNode ? this.elseNode.isolate() : null;
|
|
105
106
|
|
|
106
107
|
//
|
|
107
108
|
|
|
@@ -112,10 +113,12 @@ class ConditionalNode extends Node {
|
|
|
112
113
|
|
|
113
114
|
//
|
|
114
115
|
|
|
116
|
+
const isUniformFlow = builder.context.uniformFlow;
|
|
117
|
+
|
|
115
118
|
const properties = builder.getNodeProperties( this );
|
|
116
119
|
properties.condNode = condNode;
|
|
117
|
-
properties.ifNode = ifNode.context( { nodeBlock: ifNode } );
|
|
118
|
-
properties.elseNode = elseNode ? elseNode.context( { nodeBlock: elseNode } ) : null;
|
|
120
|
+
properties.ifNode = isUniformFlow ? ifNode : ifNode.context( { nodeBlock: ifNode } );
|
|
121
|
+
properties.elseNode = elseNode ? ( isUniformFlow ? elseNode : elseNode.context( { nodeBlock: elseNode } ) ) : null;
|
|
119
122
|
|
|
120
123
|
}
|
|
121
124
|
|
|
@@ -140,6 +143,20 @@ class ConditionalNode extends Node {
|
|
|
140
143
|
nodeData.nodeProperty = nodeProperty;
|
|
141
144
|
|
|
142
145
|
const nodeSnippet = condNode.build( builder, 'bool' );
|
|
146
|
+
const isUniformFlow = builder.context.uniformFlow;
|
|
147
|
+
|
|
148
|
+
if ( isUniformFlow && elseNode !== null ) {
|
|
149
|
+
|
|
150
|
+
const ifSnippet = ifNode.build( builder, type );
|
|
151
|
+
const elseSnippet = elseNode.build( builder, type );
|
|
152
|
+
|
|
153
|
+
const mathSnippet = builder.getTernary( nodeSnippet, ifSnippet, elseSnippet );
|
|
154
|
+
|
|
155
|
+
// TODO: If node property already exists return something else
|
|
156
|
+
|
|
157
|
+
return builder.format( mathSnippet, type, output );
|
|
158
|
+
|
|
159
|
+
}
|
|
143
160
|
|
|
144
161
|
builder.addFlowCode( `\n${ builder.tab }if ( ${ nodeSnippet } ) {\n\n` ).addFlowTab();
|
|
145
162
|
|
|
@@ -157,7 +174,7 @@ class ConditionalNode extends Node {
|
|
|
157
174
|
|
|
158
175
|
if ( functionNode === null ) {
|
|
159
176
|
|
|
160
|
-
|
|
177
|
+
warn( 'TSL: Return statement used in an inline \'Fn()\'. Define a layout struct to allow return values.' );
|
|
161
178
|
|
|
162
179
|
ifSnippet = '// ' + ifSnippet;
|
|
163
180
|
|
|
@@ -187,7 +204,7 @@ class ConditionalNode extends Node {
|
|
|
187
204
|
|
|
188
205
|
if ( functionNode === null ) {
|
|
189
206
|
|
|
190
|
-
|
|
207
|
+
warn( 'TSL: Return statement used in an inline \'Fn()\'. Define a layout struct to allow return values.' );
|
|
191
208
|
|
|
192
209
|
elseSnippet = '// ' + elseSnippet;
|
|
193
210
|
|
|
@@ -2,6 +2,7 @@ import TempNode from '../core/TempNode.js';
|
|
|
2
2
|
import { sub, mul, div, mod, equal } from './OperatorNode.js';
|
|
3
3
|
import { addMethodChaining, nodeObject, nodeProxyIntent, float, vec2, vec3, vec4, Fn } from '../tsl/TSLCore.js';
|
|
4
4
|
import { WebGLCoordinateSystem, WebGPUCoordinateSystem } from '../../constants.js';
|
|
5
|
+
import { warn } from '../../utils.js';
|
|
5
6
|
|
|
6
7
|
/**
|
|
7
8
|
* This node represents a variety of mathematical methods available in shaders.
|
|
@@ -290,7 +291,7 @@ class MathNode extends TempNode {
|
|
|
290
291
|
|
|
291
292
|
if ( builder.shaderStage !== 'fragment' && ( method === MathNode.DFDX || method === MathNode.DFDY ) ) {
|
|
292
293
|
|
|
293
|
-
|
|
294
|
+
warn( `TSL: '${ method }' is not supported in the ${ builder.shaderStage } stage.` );
|
|
294
295
|
|
|
295
296
|
method = '/*' + method + '*/';
|
|
296
297
|
|
|
@@ -366,7 +367,6 @@ MathNode.INVERSE = 'inverse';
|
|
|
366
367
|
|
|
367
368
|
// 2 inputs
|
|
368
369
|
|
|
369
|
-
MathNode.BITCAST = 'bitcast';
|
|
370
370
|
MathNode.EQUALS = 'equals';
|
|
371
371
|
MathNode.MIN = 'min';
|
|
372
372
|
MathNode.MAX = 'max';
|
|
@@ -415,13 +415,30 @@ export const INFINITY = /*@__PURE__*/ float( 1e6 );
|
|
|
415
415
|
*/
|
|
416
416
|
export const PI = /*@__PURE__*/ float( Math.PI );
|
|
417
417
|
|
|
418
|
+
/**
|
|
419
|
+
* Represents PI * 2. Please use the non-deprecated version `TWO_PI`.
|
|
420
|
+
*
|
|
421
|
+
* @tsl
|
|
422
|
+
* @deprecated
|
|
423
|
+
* @type {Node<float>}
|
|
424
|
+
*/
|
|
425
|
+
export const PI2 = /*@__PURE__*/ float( Math.PI * 2 ); // @deprecated r181
|
|
426
|
+
|
|
418
427
|
/**
|
|
419
428
|
* Represents PI * 2.
|
|
420
429
|
*
|
|
421
430
|
* @tsl
|
|
422
431
|
* @type {Node<float>}
|
|
423
432
|
*/
|
|
424
|
-
export const
|
|
433
|
+
export const TWO_PI = /*@__PURE__*/ float( Math.PI * 2 );
|
|
434
|
+
|
|
435
|
+
/**
|
|
436
|
+
* Represents PI / 2.
|
|
437
|
+
*
|
|
438
|
+
* @tsl
|
|
439
|
+
* @type {Node<float>}
|
|
440
|
+
*/
|
|
441
|
+
export const HALF_PI = /*@__PURE__*/ float( Math.PI * 0.5 );
|
|
425
442
|
|
|
426
443
|
/**
|
|
427
444
|
* Returns `true` if all components of `x` are `true`.
|
|
@@ -767,17 +784,6 @@ export const inverse = /*@__PURE__*/ nodeProxyIntent( MathNode, MathNode.INVERSE
|
|
|
767
784
|
|
|
768
785
|
// 2 inputs
|
|
769
786
|
|
|
770
|
-
/**
|
|
771
|
-
* Reinterpret the bit representation of a value in one type as a value in another type.
|
|
772
|
-
*
|
|
773
|
-
* @tsl
|
|
774
|
-
* @function
|
|
775
|
-
* @param {Node | number} x - The parameter.
|
|
776
|
-
* @param {string} y - The new type.
|
|
777
|
-
* @returns {Node}
|
|
778
|
-
*/
|
|
779
|
-
export const bitcast = /*@__PURE__*/ nodeProxyIntent( MathNode, MathNode.BITCAST ).setParameterLength( 2 );
|
|
780
|
-
|
|
781
787
|
/**
|
|
782
788
|
* Returns `true` if `x` equals `y`.
|
|
783
789
|
*
|
|
@@ -790,7 +796,7 @@ export const bitcast = /*@__PURE__*/ nodeProxyIntent( MathNode, MathNode.BITCAST
|
|
|
790
796
|
*/
|
|
791
797
|
export const equals = ( x, y ) => { // @deprecated, r172
|
|
792
798
|
|
|
793
|
-
|
|
799
|
+
warn( 'TSL: "equals" is deprecated. Use "equal" inside a vector instead, like: "bvec*( equal( ... ) )"' );
|
|
794
800
|
return equal( x, y );
|
|
795
801
|
|
|
796
802
|
};
|
|
@@ -900,7 +906,7 @@ export const pow = /*@__PURE__*/ nodeProxyIntent( MathNode, MathNode.POW ).setPa
|
|
|
900
906
|
* @param {Node | number} x - The first parameter.
|
|
901
907
|
* @returns {Node}
|
|
902
908
|
*/
|
|
903
|
-
export const pow2 =
|
|
909
|
+
export const pow2 = ( x ) => mul( x, x );
|
|
904
910
|
|
|
905
911
|
/**
|
|
906
912
|
* Returns the cube of the parameter.
|
|
@@ -910,7 +916,7 @@ export const pow2 = /*@__PURE__*/ nodeProxyIntent( MathNode, MathNode.POW, 2 ).s
|
|
|
910
916
|
* @param {Node | number} x - The first parameter.
|
|
911
917
|
* @returns {Node}
|
|
912
918
|
*/
|
|
913
|
-
export const pow3 =
|
|
919
|
+
export const pow3 = ( x ) => mul( x, x, x );
|
|
914
920
|
|
|
915
921
|
/**
|
|
916
922
|
* Returns the fourth power of the parameter.
|
|
@@ -920,7 +926,7 @@ export const pow3 = /*@__PURE__*/ nodeProxyIntent( MathNode, MathNode.POW, 3 ).s
|
|
|
920
926
|
* @param {Node | number} x - The first parameter.
|
|
921
927
|
* @returns {Node}
|
|
922
928
|
*/
|
|
923
|
-
export const pow4 =
|
|
929
|
+
export const pow4 = ( x ) => mul( x, x, x, x );
|
|
924
930
|
|
|
925
931
|
/**
|
|
926
932
|
* Transforms the direction of a vector by a matrix and then normalizes the result.
|
|
@@ -1088,7 +1094,7 @@ export const stepElement = ( x, edge ) => step( edge, x );
|
|
|
1088
1094
|
*/
|
|
1089
1095
|
export const atan2 = ( y, x ) => { // @deprecated, r172
|
|
1090
1096
|
|
|
1091
|
-
|
|
1097
|
+
warn( 'TSL: "atan2" is overloaded. Use "atan" instead.' );
|
|
1092
1098
|
return atan( y, x );
|
|
1093
1099
|
|
|
1094
1100
|
};
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { WebGLCoordinateSystem } from '../../constants.js';
|
|
2
2
|
import TempNode from '../core/TempNode.js';
|
|
3
3
|
import { addMethodChaining, Fn, int, nodeProxyIntent } from '../tsl/TSLCore.js';
|
|
4
|
+
import { warn } from '../../utils.js';
|
|
4
5
|
|
|
5
6
|
const _vectorOperators = {
|
|
6
7
|
'==': 'equal',
|
|
@@ -103,9 +104,10 @@ class OperatorNode extends TempNode {
|
|
|
103
104
|
* and the input node types.
|
|
104
105
|
*
|
|
105
106
|
* @param {NodeBuilder} builder - The current node builder.
|
|
107
|
+
* @param {?string} [output=null] - The output type.
|
|
106
108
|
* @return {string} The node type.
|
|
107
109
|
*/
|
|
108
|
-
getNodeType( builder ) {
|
|
110
|
+
getNodeType( builder, output = null ) {
|
|
109
111
|
|
|
110
112
|
const op = this.op;
|
|
111
113
|
|
|
@@ -117,7 +119,7 @@ class OperatorNode extends TempNode {
|
|
|
117
119
|
|
|
118
120
|
if ( typeA === 'void' || typeB === 'void' ) {
|
|
119
121
|
|
|
120
|
-
return 'void';
|
|
122
|
+
return output || 'void';
|
|
121
123
|
|
|
122
124
|
} else if ( op === '%' ) {
|
|
123
125
|
|
|
@@ -193,7 +195,7 @@ class OperatorNode extends TempNode {
|
|
|
193
195
|
|
|
194
196
|
const { aNode, bNode } = this;
|
|
195
197
|
|
|
196
|
-
const type = this.getNodeType( builder );
|
|
198
|
+
const type = this.getNodeType( builder, output );
|
|
197
199
|
|
|
198
200
|
let typeA = null;
|
|
199
201
|
let typeB = null;
|
|
@@ -595,7 +597,7 @@ export const bitAnd = /*@__PURE__*/ nodeProxyIntent( OperatorNode, '&' ).setPara
|
|
|
595
597
|
* @param {Node} b - The second input.
|
|
596
598
|
* @returns {OperatorNode}
|
|
597
599
|
*/
|
|
598
|
-
export const bitNot = /*@__PURE__*/ nodeProxyIntent( OperatorNode, '~' ).setParameterLength(
|
|
600
|
+
export const bitNot = /*@__PURE__*/ nodeProxyIntent( OperatorNode, '~' ).setParameterLength( 1 ).setName( 'bitNot' );
|
|
599
601
|
|
|
600
602
|
/**
|
|
601
603
|
* Performs bitwise OR on two nodes.
|
|
@@ -741,7 +743,7 @@ addMethodChaining( 'decrement', decrement );
|
|
|
741
743
|
*/
|
|
742
744
|
export const modInt = ( a, b ) => { // @deprecated, r175
|
|
743
745
|
|
|
744
|
-
|
|
746
|
+
warn( 'TSL: "modInt()" is deprecated. Use "mod( int( ... ) )" instead.' );
|
|
745
747
|
return mod( int( a ), int( b ) );
|
|
746
748
|
|
|
747
749
|
};
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { Fn, int, float, vec2, vec3, vec4, If } from '../tsl/TSLBase.js';
|
|
2
|
-
import { cos, sin, abs, max, exp2, log2, clamp, fract, mix, floor, normalize, cross } from '../math/MathNode.js';
|
|
1
|
+
import { Fn, int, uint, float, vec2, vec3, vec4, If } from '../tsl/TSLBase.js';
|
|
2
|
+
import { cos, sin, abs, max, exp2, log2, clamp, fract, mix, floor, normalize, cross, dot, sqrt } from '../math/MathNode.js';
|
|
3
3
|
import { mul } from '../math/OperatorNode.js';
|
|
4
4
|
import { select } from '../math/ConditionalNode.js';
|
|
5
5
|
import { Loop, Break } from '../utils/LoopNode.js';
|
|
@@ -286,3 +286,118 @@ export const blur = /*@__PURE__*/ Fn( ( { n, latitudinal, poleAxis, outputDirect
|
|
|
286
286
|
return vec4( gl_FragColor, 1 );
|
|
287
287
|
|
|
288
288
|
} );
|
|
289
|
+
|
|
290
|
+
// GGX VNDF importance sampling functions
|
|
291
|
+
|
|
292
|
+
// Van der Corput radical inverse for generating quasi-random sequences
|
|
293
|
+
const radicalInverse_VdC = /*@__PURE__*/ Fn( ( [ bits_immutable ] ) => {
|
|
294
|
+
|
|
295
|
+
const bits = uint( bits_immutable ).toVar();
|
|
296
|
+
bits.assign( bits.shiftLeft( uint( 16 ) ).bitOr( bits.shiftRight( uint( 16 ) ) ) );
|
|
297
|
+
bits.assign( bits.bitAnd( uint( 0x55555555 ) ).shiftLeft( uint( 1 ) ).bitOr( bits.bitAnd( uint( 0xAAAAAAAA ) ).shiftRight( uint( 1 ) ) ) );
|
|
298
|
+
bits.assign( bits.bitAnd( uint( 0x33333333 ) ).shiftLeft( uint( 2 ) ).bitOr( bits.bitAnd( uint( 0xCCCCCCCC ) ).shiftRight( uint( 2 ) ) ) );
|
|
299
|
+
bits.assign( bits.bitAnd( uint( 0x0F0F0F0F ) ).shiftLeft( uint( 4 ) ).bitOr( bits.bitAnd( uint( 0xF0F0F0F0 ) ).shiftRight( uint( 4 ) ) ) );
|
|
300
|
+
bits.assign( bits.bitAnd( uint( 0x00FF00FF ) ).shiftLeft( uint( 8 ) ).bitOr( bits.bitAnd( uint( 0xFF00FF00 ) ).shiftRight( uint( 8 ) ) ) );
|
|
301
|
+
return float( bits ).mul( 2.3283064365386963e-10 ); // / 0x100000000
|
|
302
|
+
|
|
303
|
+
} );
|
|
304
|
+
|
|
305
|
+
// Hammersley sequence for quasi-Monte Carlo sampling
|
|
306
|
+
const hammersley = /*@__PURE__*/ Fn( ( [ i, N ] ) => {
|
|
307
|
+
|
|
308
|
+
return vec2( float( i ).div( float( N ) ), radicalInverse_VdC( i ) );
|
|
309
|
+
|
|
310
|
+
} );
|
|
311
|
+
|
|
312
|
+
// GGX VNDF importance sampling (Eric Heitz 2018)
|
|
313
|
+
// "Sampling the GGX Distribution of Visible Normals"
|
|
314
|
+
// https://jcgt.org/published/0007/04/01/
|
|
315
|
+
const importanceSampleGGX_VNDF = /*@__PURE__*/ Fn( ( [ Xi, V_immutable, roughness_immutable ] ) => {
|
|
316
|
+
|
|
317
|
+
const V = vec3( V_immutable ).toVar();
|
|
318
|
+
const roughness = float( roughness_immutable );
|
|
319
|
+
const alpha = roughness.mul( roughness ).toVar();
|
|
320
|
+
|
|
321
|
+
// Section 3.2: Transform view direction to hemisphere configuration
|
|
322
|
+
const Vh = normalize( vec3( alpha.mul( V.x ), alpha.mul( V.y ), V.z ) ).toVar();
|
|
323
|
+
|
|
324
|
+
// Section 4.1: Orthonormal basis
|
|
325
|
+
const lensq = Vh.x.mul( Vh.x ).add( Vh.y.mul( Vh.y ) );
|
|
326
|
+
const T1 = select( lensq.greaterThan( 0.0 ), vec3( Vh.y.negate(), Vh.x, 0.0 ).div( sqrt( lensq ) ), vec3( 1.0, 0.0, 0.0 ) ).toVar();
|
|
327
|
+
const T2 = cross( Vh, T1 ).toVar();
|
|
328
|
+
|
|
329
|
+
// Section 4.2: Parameterization of projected area
|
|
330
|
+
const r = sqrt( Xi.x );
|
|
331
|
+
const phi = mul( 2.0, 3.14159265359 ).mul( Xi.y );
|
|
332
|
+
const t1 = r.mul( cos( phi ) ).toVar();
|
|
333
|
+
const t2 = r.mul( sin( phi ) ).toVar();
|
|
334
|
+
const s = mul( 0.5, Vh.z.add( 1.0 ) );
|
|
335
|
+
t2.assign( s.oneMinus().mul( sqrt( t1.mul( t1 ).oneMinus() ) ).add( s.mul( t2 ) ) );
|
|
336
|
+
|
|
337
|
+
// Section 4.3: Reprojection onto hemisphere
|
|
338
|
+
const Nh = T1.mul( t1 ).add( T2.mul( t2 ) ).add( Vh.mul( sqrt( max( 0.0, t1.mul( t1 ).add( t2.mul( t2 ) ).oneMinus() ) ) ) );
|
|
339
|
+
|
|
340
|
+
// Section 3.4: Transform back to ellipsoid configuration
|
|
341
|
+
return normalize( vec3( alpha.mul( Nh.x ), alpha.mul( Nh.y ), max( 0.0, Nh.z ) ) );
|
|
342
|
+
|
|
343
|
+
} );
|
|
344
|
+
|
|
345
|
+
// GGX convolution using VNDF importance sampling
|
|
346
|
+
export const ggxConvolution = /*@__PURE__*/ Fn( ( { roughness, mipInt, envMap, N_immutable, GGX_SAMPLES, CUBEUV_TEXEL_WIDTH, CUBEUV_TEXEL_HEIGHT, CUBEUV_MAX_MIP } ) => {
|
|
347
|
+
|
|
348
|
+
const N = vec3( N_immutable ).toVar();
|
|
349
|
+
|
|
350
|
+
const prefilteredColor = vec3( 0.0 ).toVar();
|
|
351
|
+
const totalWeight = float( 0.0 ).toVar();
|
|
352
|
+
|
|
353
|
+
// For very low roughness, just sample the environment directly
|
|
354
|
+
If( roughness.lessThan( 0.001 ), () => {
|
|
355
|
+
|
|
356
|
+
prefilteredColor.assign( bilinearCubeUV( envMap, N, mipInt, CUBEUV_TEXEL_WIDTH, CUBEUV_TEXEL_HEIGHT, CUBEUV_MAX_MIP ) );
|
|
357
|
+
|
|
358
|
+
} ).Else( () => {
|
|
359
|
+
|
|
360
|
+
// Tangent space basis for VNDF sampling
|
|
361
|
+
const up = select( abs( N.z ).lessThan( 0.999 ), vec3( 0.0, 0.0, 1.0 ), vec3( 1.0, 0.0, 0.0 ) );
|
|
362
|
+
const tangent = normalize( cross( up, N ) ).toVar();
|
|
363
|
+
const bitangent = cross( N, tangent ).toVar();
|
|
364
|
+
|
|
365
|
+
Loop( { start: uint( 0 ), end: GGX_SAMPLES }, ( { i } ) => {
|
|
366
|
+
|
|
367
|
+
const Xi = hammersley( i, GGX_SAMPLES );
|
|
368
|
+
|
|
369
|
+
// For PMREM, V = N, so in tangent space V is always (0, 0, 1)
|
|
370
|
+
const H_tangent = importanceSampleGGX_VNDF( Xi, vec3( 0.0, 0.0, 1.0 ), roughness );
|
|
371
|
+
|
|
372
|
+
// Transform H back to world space
|
|
373
|
+
const H = normalize( tangent.mul( H_tangent.x ).add( bitangent.mul( H_tangent.y ) ).add( N.mul( H_tangent.z ) ) );
|
|
374
|
+
const L = normalize( H.mul( dot( N, H ).mul( 2.0 ) ).sub( N ) );
|
|
375
|
+
|
|
376
|
+
const NdotL = max( dot( N, L ), 0.0 );
|
|
377
|
+
|
|
378
|
+
If( NdotL.greaterThan( 0.0 ), () => {
|
|
379
|
+
|
|
380
|
+
// Sample environment at fixed mip level
|
|
381
|
+
// VNDF importance sampling handles the distribution filtering
|
|
382
|
+
const sampleColor = bilinearCubeUV( envMap, L, mipInt, CUBEUV_TEXEL_WIDTH, CUBEUV_TEXEL_HEIGHT, CUBEUV_MAX_MIP );
|
|
383
|
+
|
|
384
|
+
// Weight by NdotL for the split-sum approximation
|
|
385
|
+
// VNDF PDF naturally accounts for the visible microfacet distribution
|
|
386
|
+
prefilteredColor.addAssign( sampleColor.mul( NdotL ) );
|
|
387
|
+
totalWeight.addAssign( NdotL );
|
|
388
|
+
|
|
389
|
+
} );
|
|
390
|
+
|
|
391
|
+
} );
|
|
392
|
+
|
|
393
|
+
If( totalWeight.greaterThan( 0.0 ), () => {
|
|
394
|
+
|
|
395
|
+
prefilteredColor.assign( prefilteredColor.div( totalWeight ) );
|
|
396
|
+
|
|
397
|
+
} );
|
|
398
|
+
|
|
399
|
+
} );
|
|
400
|
+
|
|
401
|
+
return vec4( prefilteredColor, 1.0 );
|
|
402
|
+
|
|
403
|
+
} );
|