super-three 0.179.0 → 0.184.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +1 -1
- package/README.md +3 -4
- package/build/three.cjs +14522 -12207
- package/build/three.core.js +12005 -10954
- package/build/three.core.min.js +2 -2
- package/build/three.module.js +2270 -1005
- package/build/three.module.min.js +2 -2
- package/build/three.tsl.js +63 -18
- package/build/three.tsl.min.js +2 -2
- package/build/three.webgpu.js +16573 -7890
- package/build/three.webgpu.min.js +2 -2
- package/build/three.webgpu.nodes.js +16533 -7888
- package/build/three.webgpu.nodes.min.js +2 -2
- package/examples/fonts/MPLUSRounded1c/MPLUSRounded1c-Regular.typeface.json.zip +0 -0
- package/examples/fonts/MPLUSRounded1c/OFL.txt +91 -0
- package/examples/jsm/Addons.js +12 -4
- package/examples/jsm/animation/CCDIKSolver.js +8 -4
- package/examples/jsm/controls/ArcballControls.js +15 -12
- package/examples/jsm/controls/DragControls.js +9 -59
- package/examples/jsm/controls/FirstPersonControls.js +61 -57
- package/examples/jsm/controls/FlyControls.js +5 -1
- package/examples/jsm/controls/MapControls.js +55 -1
- package/examples/jsm/controls/OrbitControls.js +113 -10
- package/examples/jsm/controls/PointerLockControls.js +2 -10
- package/examples/jsm/controls/TrackballControls.js +9 -9
- package/examples/jsm/controls/TransformControls.js +35 -3
- package/examples/jsm/csm/CSM.js +2 -1
- package/examples/jsm/csm/CSMShadowNode.js +6 -2
- package/examples/jsm/effects/AnaglyphEffect.js +102 -7
- package/examples/jsm/effects/AsciiEffect.js +8 -8
- package/examples/jsm/environments/ColorEnvironment.js +59 -0
- package/examples/jsm/environments/RoomEnvironment.js +3 -0
- package/examples/jsm/exporters/DRACOExporter.js +2 -2
- package/examples/jsm/exporters/EXRExporter.js +2 -2
- package/examples/jsm/exporters/GLTFExporter.js +185 -34
- package/examples/jsm/exporters/KTX2Exporter.js +4 -2
- package/examples/jsm/exporters/PLYExporter.js +1 -1
- package/examples/jsm/exporters/USDZExporter.js +31 -5
- package/examples/jsm/geometries/DecalGeometry.js +3 -3
- package/examples/jsm/geometries/ParametricGeometry.js +1 -1
- package/examples/jsm/geometries/TeapotGeometry.js +2 -2
- package/examples/jsm/geometries/TextGeometry.js +21 -2
- package/examples/jsm/gpgpu/BitonicSort.js +715 -0
- package/examples/jsm/helpers/AnimationPathHelper.js +302 -0
- package/examples/jsm/helpers/LightProbeGridHelper.js +221 -0
- package/examples/jsm/helpers/LightProbeHelperGPU.js +1 -1
- package/examples/jsm/helpers/TextureHelperGPU.js +1 -1
- package/examples/jsm/helpers/ViewHelper.js +110 -13
- package/examples/jsm/inspector/Extension.js +13 -0
- package/examples/jsm/inspector/Inspector.js +542 -0
- package/examples/jsm/inspector/RendererInspector.js +425 -0
- package/examples/jsm/inspector/extensions/extensions.json +6 -0
- package/examples/jsm/inspector/extensions/tsl-graph/TSLGraphEditor.js +916 -0
- package/examples/jsm/inspector/extensions/tsl-graph/TSLGraphLoader.js +281 -0
- package/examples/jsm/inspector/tabs/Console.js +238 -0
- package/examples/jsm/inspector/tabs/Memory.js +128 -0
- package/examples/jsm/inspector/tabs/Parameters.js +380 -0
- package/examples/jsm/inspector/tabs/Performance.js +268 -0
- package/examples/jsm/inspector/tabs/Settings.js +264 -0
- package/examples/jsm/inspector/tabs/Timeline.js +1611 -0
- package/examples/jsm/inspector/tabs/Viewer.js +268 -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 +2072 -0
- package/examples/jsm/inspector/ui/Style.js +1667 -0
- package/examples/jsm/inspector/ui/Tab.js +265 -0
- package/examples/jsm/inspector/ui/Values.js +476 -0
- package/examples/jsm/inspector/ui/utils.js +69 -0
- package/examples/jsm/interaction/InteractionManager.js +226 -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/libs/meshopt_decoder.module.js +9 -8
- package/examples/jsm/lighting/DynamicLighting.js +82 -0
- package/examples/jsm/lighting/LightProbeGrid.js +651 -0
- 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/LineMaterial.js +7 -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/3DMLoader.js +5 -4
- package/examples/jsm/loaders/3MFLoader.js +3 -3
- package/examples/jsm/loaders/AMFLoader.js +2 -2
- package/examples/jsm/loaders/ColladaLoader.js +27 -4029
- package/examples/jsm/loaders/DDSLoader.js +1 -1
- package/examples/jsm/loaders/DRACOLoader.js +73 -22
- package/examples/jsm/loaders/EXRLoader.js +692 -53
- package/examples/jsm/loaders/FBXLoader.js +237 -39
- package/examples/jsm/loaders/FontLoader.js +23 -5
- package/examples/jsm/loaders/GCodeLoader.js +34 -8
- package/examples/jsm/loaders/GLTFLoader.js +159 -185
- package/examples/jsm/loaders/HDRCubeTextureLoader.js +5 -5
- package/examples/jsm/loaders/HDRLoader.js +485 -0
- package/examples/jsm/loaders/KMZLoader.js +5 -5
- package/examples/jsm/loaders/KTX2Loader.js +162 -53
- package/examples/jsm/loaders/KTXLoader.js +2 -2
- package/examples/jsm/loaders/LDrawLoader.js +41 -50
- package/examples/jsm/loaders/LUT3dlLoader.js +2 -2
- package/examples/jsm/loaders/LUTCubeLoader.js +1 -1
- package/examples/jsm/loaders/LWOLoader.js +9 -41
- package/examples/jsm/loaders/MaterialXLoader.js +22 -5
- package/examples/jsm/loaders/NRRDLoader.js +2 -2
- package/examples/jsm/loaders/OBJLoader.js +1 -1
- package/examples/jsm/loaders/PCDLoader.js +4 -2
- package/examples/jsm/loaders/PDBLoader.js +1 -1
- package/examples/jsm/loaders/RGBELoader.js +7 -473
- package/examples/jsm/loaders/SVGLoader.js +4 -4
- package/examples/jsm/loaders/TDSLoader.js +0 -2
- package/examples/jsm/loaders/TGALoader.js +0 -2
- package/examples/jsm/loaders/TTFLoader.js +4 -4
- package/examples/jsm/loaders/USDLoader.js +100 -40
- package/examples/jsm/loaders/UltraHDRLoader.js +287 -162
- package/examples/jsm/loaders/VOXLoader.js +660 -117
- package/examples/jsm/loaders/VRMLLoader.js +79 -2
- package/examples/jsm/loaders/VTKLoader.js +42 -25
- package/examples/jsm/loaders/collada/ColladaComposer.js +3044 -0
- package/examples/jsm/loaders/collada/ColladaParser.js +1977 -0
- package/examples/jsm/loaders/lwo/IFFParser.js +1 -1
- package/examples/jsm/loaders/usd/USDAParser.js +450 -363
- package/examples/jsm/loaders/usd/USDCParser.js +1867 -6
- package/examples/jsm/loaders/usd/USDComposer.js +4594 -0
- package/examples/jsm/materials/LDrawConditionalLineNodeMaterial.js +2 -2
- 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/Octree.js +131 -1
- package/examples/jsm/math/SimplexNoise.js +1 -1
- package/examples/jsm/misc/GPUComputationRenderer.js +2 -0
- 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/RollerCoaster.js +42 -4
- package/examples/jsm/misc/TubePainter.js +383 -40
- package/examples/jsm/misc/Volume.js +1 -2
- package/examples/jsm/misc/VolumeSlice.js +0 -1
- package/examples/jsm/modifiers/SimplifyModifier.js +1 -1
- package/examples/jsm/modifiers/TessellateModifier.js +1 -1
- package/examples/jsm/objects/LensflareMesh.js +1 -1
- package/examples/jsm/objects/Reflector.js +73 -25
- package/examples/jsm/objects/ReflectorForSSRPass.js +1 -0
- package/examples/jsm/objects/Sky.js +91 -7
- package/examples/jsm/objects/SkyMesh.js +151 -17
- package/examples/jsm/objects/Water.js +7 -6
- package/examples/jsm/objects/Water2.js +5 -3
- package/examples/jsm/objects/WaterMesh.js +11 -13
- package/examples/jsm/physics/AmmoPhysics.js +12 -7
- package/examples/jsm/physics/JoltPhysics.js +10 -6
- package/examples/jsm/physics/RapierPhysics.js +9 -5
- package/examples/jsm/postprocessing/EffectComposer.js +7 -5
- package/examples/jsm/postprocessing/GlitchPass.js +2 -2
- package/examples/jsm/postprocessing/OutlinePass.js +1 -1
- package/examples/jsm/postprocessing/OutputPass.js +9 -0
- package/examples/jsm/postprocessing/RenderPass.js +10 -0
- package/examples/jsm/postprocessing/RenderTransitionPass.js +1 -1
- package/examples/jsm/postprocessing/SSRPass.js +37 -8
- package/examples/jsm/postprocessing/UnrealBloomPass.js +56 -24
- package/examples/jsm/renderers/CSS2DRenderer.js +16 -5
- package/examples/jsm/renderers/CSS3DRenderer.js +8 -7
- package/examples/jsm/renderers/Projector.js +246 -28
- package/examples/jsm/renderers/SVGRenderer.js +175 -61
- 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 +21 -8
- package/examples/jsm/shaders/HalftoneShader.js +12 -1
- package/examples/jsm/shaders/KaleidoShader.js +1 -1
- package/examples/jsm/shaders/PoissonDenoiseShader.js +8 -4
- package/examples/jsm/shaders/SAOShader.js +17 -4
- package/examples/jsm/shaders/SSAOShader.js +11 -1
- package/examples/jsm/shaders/SSRShader.js +7 -6
- 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 +3 -5
- package/examples/jsm/shaders/VignetteShader.js +1 -1
- package/examples/jsm/transpiler/AST.js +44 -0
- package/examples/jsm/transpiler/GLSLDecoder.js +85 -25
- package/examples/jsm/transpiler/ShaderToyDecoder.js +2 -0
- package/examples/jsm/transpiler/TSLEncoder.js +52 -10
- package/examples/jsm/transpiler/TranspilerUtils.js +3 -3
- package/examples/jsm/transpiler/WGSLEncoder.js +51 -0
- package/examples/jsm/tsl/WebGLNodesHandler.js +605 -0
- package/examples/jsm/tsl/display/AfterImageNode.js +36 -24
- package/examples/jsm/tsl/display/AnaglyphPassNode.js +458 -16
- package/examples/jsm/tsl/display/AnamorphicNode.js +40 -5
- package/examples/jsm/tsl/display/BilateralBlurNode.js +374 -0
- package/examples/jsm/tsl/display/BloomNode.js +23 -9
- package/examples/jsm/tsl/display/CRT.js +150 -0
- package/examples/jsm/tsl/display/ChromaticAberrationNode.js +5 -37
- package/examples/jsm/tsl/display/DenoiseNode.js +3 -1
- package/examples/jsm/tsl/display/DepthOfFieldNode.js +446 -90
- package/examples/jsm/tsl/display/DotScreenNode.js +1 -1
- package/examples/jsm/tsl/display/FSR1Node.js +477 -0
- package/examples/jsm/tsl/display/FXAANode.js +2 -2
- package/examples/jsm/tsl/display/GTAONode.js +59 -9
- package/examples/jsm/tsl/display/GaussianBlurNode.js +68 -35
- package/examples/jsm/tsl/display/GodraysNode.js +615 -0
- package/examples/jsm/tsl/display/LensflareNode.js +1 -1
- package/examples/jsm/tsl/display/Lut3DNode.js +1 -1
- package/examples/jsm/tsl/display/OutlineNode.js +81 -20
- package/examples/jsm/tsl/display/ParallaxBarrierPassNode.js +2 -2
- package/examples/jsm/tsl/display/PixelationPassNode.js +7 -6
- package/examples/jsm/tsl/display/RGBShiftNode.js +2 -2
- package/examples/jsm/tsl/display/RetroPassNode.js +263 -0
- package/examples/jsm/tsl/display/SMAANode.js +2 -2
- package/examples/jsm/tsl/display/SSAAPassNode.js +2 -2
- package/examples/jsm/tsl/display/SSGINode.js +638 -0
- package/examples/jsm/tsl/display/SSRNode.js +186 -69
- package/examples/jsm/tsl/display/SSSNode.js +490 -0
- package/examples/jsm/tsl/display/Shape.js +29 -0
- package/examples/jsm/tsl/display/SharpenNode.js +283 -0
- package/examples/jsm/tsl/display/SobelOperatorNode.js +2 -2
- package/examples/jsm/tsl/display/StereoCompositePassNode.js +8 -1
- package/examples/jsm/tsl/display/StereoPassNode.js +1 -2
- package/examples/jsm/tsl/display/TAAUNode.js +835 -0
- package/examples/jsm/tsl/display/TRAANode.js +381 -75
- package/examples/jsm/tsl/display/TransitionNode.js +1 -1
- package/examples/jsm/tsl/display/boxBlur.js +65 -0
- package/examples/jsm/tsl/display/depthAwareBlend.js +80 -0
- package/examples/jsm/tsl/display/hashBlur.js +16 -18
- package/examples/jsm/tsl/display/radialBlur.js +68 -0
- package/examples/jsm/tsl/lighting/DynamicLightsNode.js +300 -0
- package/examples/jsm/tsl/lighting/TiledLightsNode.js +21 -1
- package/examples/jsm/tsl/lighting/data/AmbientLightDataNode.js +61 -0
- package/examples/jsm/tsl/lighting/data/DirectionalLightDataNode.js +111 -0
- package/examples/jsm/tsl/lighting/data/HemisphereLightDataNode.js +99 -0
- package/examples/jsm/tsl/lighting/data/PointLightDataNode.js +134 -0
- package/examples/jsm/tsl/lighting/data/SpotLightDataNode.js +161 -0
- package/examples/jsm/tsl/math/Bayer.js +53 -3
- package/examples/jsm/utils/BufferGeometryUtils.js +3 -4
- package/examples/jsm/utils/ColorUtils.js +76 -0
- package/examples/jsm/utils/LDrawUtils.js +1 -1
- package/examples/jsm/utils/ShadowMapViewer.js +24 -10
- package/examples/jsm/utils/ShadowMapViewerGPU.js +13 -6
- package/examples/jsm/utils/SkeletonUtils.js +14 -8
- package/examples/jsm/utils/WebGPUTextureUtils.js +1 -1
- package/examples/jsm/webxr/OculusHandModel.js +1 -1
- package/examples/jsm/webxr/XRControllerModelFactory.js +1 -1
- package/examples/jsm/webxr/XRHandMeshModel.js +36 -10
- package/examples/jsm/webxr/XRHandModelFactory.js +4 -7
- package/package.json +27 -38
- package/src/Three.Core.js +7 -3
- package/src/Three.TSL.js +61 -16
- package/src/Three.WebGPU.Nodes.js +7 -0
- package/src/Three.WebGPU.js +11 -0
- package/src/Three.js +1 -0
- package/src/animation/AnimationAction.js +12 -2
- package/src/animation/AnimationClip.js +21 -5
- package/src/animation/AnimationMixer.js +9 -3
- package/src/animation/AnimationObjectGroup.js +2 -1
- package/src/animation/AnimationUtils.js +1 -12
- package/src/animation/KeyframeTrack.js +54 -14
- package/src/animation/PropertyBinding.js +12 -11
- package/src/animation/PropertyMixer.js +4 -4
- package/src/animation/tracks/BooleanKeyframeTrack.js +1 -1
- package/src/animation/tracks/ColorKeyframeTrack.js +1 -1
- package/src/animation/tracks/NumberKeyframeTrack.js +1 -1
- package/src/animation/tracks/QuaternionKeyframeTrack.js +1 -1
- package/src/animation/tracks/StringKeyframeTrack.js +1 -1
- package/src/animation/tracks/VectorKeyframeTrack.js +1 -1
- package/src/audio/Audio.js +11 -10
- package/src/audio/AudioContext.js +2 -2
- package/src/audio/AudioListener.js +5 -3
- package/src/audio/PositionalAudio.js +1 -1
- package/src/cameras/Camera.js +32 -2
- package/src/cameras/CubeCamera.js +20 -0
- 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 +100 -7
- package/src/core/BufferAttribute.js +13 -1
- package/src/core/BufferGeometry.js +24 -12
- package/src/core/Clock.js +7 -0
- 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 +55 -6
- package/src/core/Raycaster.js +4 -3
- package/src/core/RenderTarget.js +14 -5
- 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 +259 -57
- package/src/extras/TextureUtils.js +6 -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/curves/CatmullRomCurve3.js +3 -2
- 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 +10 -8
- 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/PolyhedronGeometry.js +1 -1
- 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 +9 -3
- package/src/geometries/TorusKnotGeometry.js +1 -0
- package/src/geometries/TubeGeometry.js +1 -0
- package/src/helpers/CameraHelper.js +4 -1
- package/src/helpers/DirectionalLightHelper.js +4 -1
- package/src/helpers/HemisphereLightHelper.js +3 -0
- package/src/helpers/PointLightHelper.js +1 -25
- package/src/helpers/SpotLightHelper.js +3 -0
- package/src/lights/DirectionalLight.js +13 -0
- package/src/lights/HemisphereLight.js +10 -0
- package/src/lights/Light.js +1 -11
- package/src/lights/LightProbe.js +0 -15
- package/src/lights/LightShadow.js +15 -6
- package/src/lights/PointLight.js +15 -0
- package/src/lights/PointLightShadow.js +0 -86
- package/src/lights/SpotLight.js +22 -1
- package/src/lights/webgpu/IESSpotLight.js +2 -1
- package/src/lights/webgpu/ProjectorLight.js +1 -1
- package/src/loaders/AnimationLoader.js +2 -1
- package/src/loaders/AudioLoader.js +13 -2
- package/src/loaders/BufferGeometryLoader.js +2 -2
- package/src/loaders/Cache.js +30 -2
- package/src/loaders/DataTextureLoader.js +6 -4
- package/src/loaders/FileLoader.js +4 -4
- package/src/loaders/ImageBitmapLoader.js +17 -13
- package/src/loaders/ImageLoader.js +1 -1
- package/src/loaders/Loader.js +9 -3
- package/src/loaders/LoadingManager.js +25 -3
- package/src/loaders/MaterialLoader.js +6 -4
- package/src/loaders/ObjectLoader.js +57 -17
- package/src/loaders/TextureLoader.js +1 -1
- package/src/loaders/nodes/NodeLoader.js +5 -4
- package/src/loaders/nodes/NodeObjectLoader.js +18 -0
- package/src/materials/Material.js +18 -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 +11 -1
- package/src/materials/MeshMatcapMaterial.js +22 -0
- package/src/materials/MeshNormalMaterial.js +1 -0
- package/src/materials/MeshPhongMaterial.js +11 -1
- package/src/materials/MeshPhysicalMaterial.js +2 -1
- package/src/materials/MeshStandardMaterial.js +8 -7
- package/src/materials/MeshToonMaterial.js +2 -1
- package/src/materials/PointsMaterial.js +1 -1
- package/src/materials/ShaderMaterial.js +22 -3
- package/src/materials/nodes/Line2NodeMaterial.js +36 -9
- package/src/materials/nodes/MeshPhysicalNodeMaterial.js +5 -2
- package/src/materials/nodes/MeshSSSNodeMaterial.js +1 -1
- package/src/materials/nodes/MeshStandardNodeMaterial.js +5 -4
- package/src/materials/nodes/NodeMaterial.js +95 -35
- package/src/materials/nodes/PointsNodeMaterial.js +81 -28
- package/src/materials/nodes/SpriteNodeMaterial.js +3 -15
- package/src/materials/nodes/manager/NodeMaterialObserver.js +194 -88
- 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/Line3.js +6 -5
- package/src/math/MathUtils.js +23 -21
- package/src/math/Matrix2.js +14 -10
- package/src/math/Matrix3.js +15 -11
- package/src/math/Matrix4.js +94 -81
- package/src/math/Plane.js +5 -4
- package/src/math/Quaternion.js +60 -84
- package/src/math/Sphere.js +1 -1
- package/src/math/Spherical.js +1 -1
- package/src/math/Triangle.js +1 -1
- package/src/math/Vector2.js +11 -7
- package/src/math/Vector3.js +15 -13
- package/src/math/Vector4.js +13 -9
- package/src/math/interpolants/BezierInterpolant.js +108 -0
- package/src/nodes/Nodes.js +86 -65
- package/src/nodes/TSL.js +11 -8
- package/src/nodes/accessors/Arrays.js +1 -1
- package/src/nodes/accessors/BatchNode.js +10 -10
- package/src/nodes/accessors/Bitangent.js +5 -5
- package/src/nodes/accessors/BufferAttributeNode.js +107 -15
- package/src/nodes/accessors/BufferNode.js +30 -3
- package/src/nodes/accessors/Camera.js +260 -13
- package/src/nodes/accessors/ClippingNode.js +10 -9
- package/src/nodes/accessors/CubeTextureNode.js +32 -6
- package/src/nodes/accessors/InstanceNode.js +164 -39
- package/src/nodes/accessors/Lights.js +10 -0
- package/src/nodes/accessors/MaterialNode.js +9 -1
- package/src/nodes/accessors/MaterialProperties.js +2 -5
- package/src/nodes/accessors/MaterialReferenceNode.js +1 -2
- package/src/nodes/accessors/ModelNode.js +1 -1
- package/src/nodes/accessors/Normal.js +16 -15
- package/src/nodes/accessors/Object3DNode.js +2 -2
- package/src/nodes/accessors/Position.js +51 -3
- package/src/nodes/accessors/ReferenceBaseNode.js +7 -7
- package/src/nodes/accessors/ReferenceNode.js +11 -10
- package/src/nodes/accessors/RendererReferenceNode.js +1 -2
- package/src/nodes/accessors/SceneProperties.js +47 -0
- package/src/nodes/accessors/SkinningNode.js +27 -26
- package/src/nodes/accessors/StorageBufferNode.js +14 -24
- package/src/nodes/accessors/StorageTextureNode.js +62 -9
- package/src/nodes/accessors/Tangent.js +4 -14
- package/src/nodes/accessors/Texture3DNode.js +41 -31
- package/src/nodes/accessors/TextureNode.js +193 -63
- package/src/nodes/accessors/UniformArrayNode.js +6 -4
- package/src/nodes/accessors/UserDataNode.js +1 -2
- package/src/nodes/accessors/VertexColorNode.js +1 -2
- package/src/nodes/code/FunctionCallNode.js +25 -5
- package/src/nodes/code/FunctionNode.js +25 -3
- package/src/nodes/core/ArrayNode.js +22 -2
- package/src/nodes/core/AssignNode.js +6 -5
- package/src/nodes/core/AttributeNode.js +5 -4
- package/src/nodes/core/BypassNode.js +1 -1
- package/src/nodes/core/ContextNode.js +133 -15
- package/src/nodes/core/IndexNode.js +4 -3
- package/src/nodes/core/InputNode.js +3 -2
- package/src/nodes/core/InspectorNode.js +128 -0
- package/src/nodes/core/{CacheNode.js → IsolateNode.js} +41 -8
- package/src/nodes/core/MRTNode.js +48 -2
- package/src/nodes/core/Node.js +264 -46
- package/src/nodes/core/NodeBuilder.js +453 -87
- package/src/nodes/core/NodeError.js +28 -0
- package/src/nodes/core/NodeFrame.js +31 -23
- 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 +25 -97
- package/src/nodes/core/OutputStructNode.js +12 -10
- package/src/nodes/core/ParameterNode.js +34 -3
- package/src/nodes/core/PropertyNode.js +26 -3
- package/src/nodes/core/StackNode.js +99 -23
- package/src/nodes/core/StackTrace.js +139 -0
- package/src/nodes/core/StructNode.js +22 -8
- package/src/nodes/core/StructTypeNode.js +13 -18
- package/src/nodes/core/SubBuildNode.js +4 -4
- package/src/nodes/core/UniformGroupNode.js +36 -6
- package/src/nodes/core/UniformNode.js +37 -13
- package/src/nodes/core/VarNode.js +96 -34
- package/src/nodes/core/VaryingNode.js +2 -18
- package/src/nodes/display/BlendModes.js +0 -63
- package/src/nodes/display/BumpMapNode.js +1 -1
- package/src/nodes/display/ColorAdjustment.js +18 -1
- package/src/nodes/display/ColorSpaceNode.js +3 -3
- package/src/nodes/display/FrontFacingNode.js +4 -8
- package/src/nodes/display/NormalMapNode.js +41 -5
- package/src/nodes/display/PassNode.js +175 -25
- package/src/nodes/display/RenderOutputNode.js +35 -9
- package/src/nodes/display/ScreenNode.js +47 -15
- package/src/nodes/display/ToneMappingNode.js +32 -5
- package/src/nodes/display/ToonOutlinePassNode.js +10 -2
- package/src/nodes/display/ViewportDepthNode.js +52 -4
- package/src/nodes/display/ViewportDepthTextureNode.js +14 -6
- package/src/nodes/display/ViewportSharedTextureNode.js +12 -0
- package/src/nodes/display/ViewportTextureNode.js +72 -14
- package/src/nodes/fog/Fog.js +18 -34
- package/src/nodes/functions/BSDF/BRDF_GGX_Multiscatter.js +52 -0
- package/src/nodes/functions/BSDF/DFGLUT.js +56 -0
- package/src/nodes/functions/BSDF/EnvironmentBRDF.js +2 -2
- package/src/nodes/functions/BSDF/V_GGX_SmithCorrelated_Anisotropic.js +2 -2
- package/src/nodes/functions/BasicLightingModel.js +2 -1
- package/src/nodes/functions/PhysicalLightingModel.js +128 -46
- package/src/nodes/functions/VolumetricLightingModel.js +5 -5
- package/src/nodes/geometry/RangeNode.js +44 -6
- package/src/nodes/gpgpu/AtomicFunctionNode.js +1 -1
- package/src/nodes/gpgpu/BarrierNode.js +9 -0
- package/src/nodes/gpgpu/ComputeBuiltinNode.js +4 -4
- package/src/nodes/gpgpu/ComputeNode.js +76 -38
- package/src/nodes/gpgpu/SubgroupFunctionNode.js +455 -0
- package/src/nodes/gpgpu/WorkgroupInfoNode.js +5 -4
- package/src/nodes/lighting/AnalyticLightNode.js +53 -0
- package/src/nodes/lighting/EnvironmentNode.js +34 -9
- package/src/nodes/lighting/LightsNode.js +10 -32
- package/src/nodes/lighting/PointShadowNode.js +167 -148
- package/src/nodes/lighting/ShadowFilterNode.js +55 -65
- package/src/nodes/lighting/ShadowNode.js +189 -44
- package/src/nodes/math/BitcastNode.js +156 -0
- package/src/nodes/math/BitcountNode.js +433 -0
- package/src/nodes/math/ConditionalNode.js +25 -8
- package/src/nodes/math/MathNode.js +98 -57
- package/src/nodes/math/OperatorNode.js +8 -5
- package/src/nodes/math/PackFloatNode.js +98 -0
- package/src/nodes/math/UnpackFloatNode.js +96 -0
- package/src/nodes/pmrem/PMREMNode.js +1 -1
- package/src/nodes/pmrem/PMREMUtils.js +111 -2
- package/src/nodes/shapes/Shapes.js +1 -1
- package/src/nodes/tsl/TSLBase.js +6 -3
- package/src/nodes/tsl/TSLCore.js +488 -166
- package/src/nodes/utils/ArrayElementNode.js +14 -1
- package/src/nodes/utils/ConvertNode.js +1 -1
- package/src/nodes/utils/DebugNode.js +14 -13
- package/src/nodes/utils/EventNode.js +67 -2
- package/src/nodes/utils/FlipNode.js +1 -1
- package/src/nodes/utils/FunctionOverloadingNode.js +37 -19
- package/src/nodes/utils/JoinNode.js +7 -4
- package/src/nodes/utils/LoopNode.js +20 -24
- package/src/nodes/utils/MemberNode.js +60 -8
- package/src/nodes/utils/Packing.js +13 -1
- package/src/nodes/utils/PostProcessingUtils.js +60 -1
- package/src/nodes/utils/RTTNode.js +14 -4
- package/src/nodes/utils/ReflectorNode.js +61 -11
- package/src/nodes/utils/Remap.js +48 -0
- package/src/nodes/utils/RotateNode.js +1 -1
- package/src/nodes/utils/SampleNode.js +12 -2
- package/src/nodes/utils/SetNode.js +1 -1
- package/src/nodes/utils/SplitNode.js +12 -1
- package/src/nodes/utils/SpriteSheetUV.js +35 -0
- package/src/nodes/utils/Timer.js +0 -47
- package/src/nodes/utils/UVUtils.js +28 -0
- package/src/objects/BatchedMesh.js +46 -18
- package/src/objects/InstancedMesh.js +30 -3
- package/src/objects/LOD.js +1 -1
- package/src/objects/Line.js +3 -2
- package/src/objects/LineSegments.js +2 -1
- package/src/objects/Mesh.js +1 -1
- package/src/objects/Points.js +1 -1
- package/src/objects/Skeleton.js +12 -2
- package/src/objects/SkinnedMesh.js +29 -10
- package/src/objects/Sprite.js +4 -3
- package/src/renderers/WebGLRenderer.js +372 -179
- package/src/renderers/common/Animation.js +16 -4
- package/src/renderers/common/Attributes.js +16 -2
- package/src/renderers/common/Backend.js +137 -35
- package/src/renderers/common/Background.js +28 -14
- package/src/renderers/common/BindGroup.js +1 -16
- package/src/renderers/common/Binding.js +11 -0
- package/src/renderers/common/Bindings.js +83 -12
- package/src/renderers/common/BlendMode.js +143 -0
- package/src/renderers/common/Buffer.js +40 -0
- package/src/renderers/common/BundleGroup.js +1 -1
- package/src/renderers/common/CanvasTarget.js +341 -0
- package/src/renderers/common/ChainMap.js +30 -6
- package/src/renderers/common/ComputePipeline.js +1 -1
- package/src/renderers/common/CubeRenderTarget.js +51 -7
- package/src/renderers/common/DataMap.js +1 -1
- package/src/renderers/common/Geometries.js +55 -3
- package/src/renderers/common/Info.js +337 -6
- package/src/renderers/common/InspectorBase.js +151 -0
- package/src/renderers/common/Lighting.js +5 -21
- package/src/renderers/common/Pipelines.js +41 -8
- package/src/renderers/common/PostProcessing.js +9 -226
- package/src/renderers/common/QuadMesh.js +7 -1
- package/src/renderers/common/ReadbackBuffer.js +78 -0
- package/src/renderers/common/RenderBundle.js +3 -1
- package/src/renderers/common/RenderBundles.js +7 -3
- package/src/renderers/common/RenderContext.js +18 -2
- package/src/renderers/common/RenderContexts.js +33 -49
- package/src/renderers/common/RenderList.js +7 -3
- package/src/renderers/common/RenderLists.js +2 -1
- package/src/renderers/common/RenderObject.js +32 -6
- package/src/renderers/common/RenderObjectPipeline.js +40 -0
- package/src/renderers/common/RenderObjects.js +22 -6
- package/src/renderers/common/RenderPipeline.js +232 -17
- package/src/renderers/common/Renderer.js +927 -335
- package/src/renderers/common/RendererUtils.js +9 -0
- package/src/renderers/common/SampledTexture.js +9 -1
- package/src/renderers/common/Sampler.js +52 -14
- package/src/renderers/common/StorageBuffer.js +13 -1
- package/src/renderers/common/StorageTexture.js +9 -1
- package/src/renderers/common/Textures.js +208 -47
- package/src/renderers/common/TimestampQueryPool.js +70 -6
- package/src/renderers/common/Uniform.js +8 -0
- package/src/renderers/common/UniformsGroup.js +64 -2
- package/src/renderers/common/XRManager.js +79 -51
- package/src/renderers/common/extras/PMREMGenerator.js +176 -79
- package/src/renderers/common/nodes/NodeBuilderState.js +1 -1
- package/src/renderers/common/nodes/NodeLibrary.js +9 -7
- package/src/renderers/common/nodes/{Nodes.js → NodeManager.js} +260 -95
- package/src/renderers/common/nodes/NodeSampler.js +13 -1
- package/src/renderers/common/nodes/NodeStorageBuffer.js +13 -2
- package/src/renderers/common/nodes/NodeUniformBuffer.js +52 -0
- package/src/renderers/shaders/DFGLUTData.js +49 -0
- package/src/renderers/shaders/ShaderChunk/batching_pars_vertex.glsl.js +2 -2
- package/src/renderers/shaders/ShaderChunk/color_fragment.glsl.js +1 -5
- package/src/renderers/shaders/ShaderChunk/color_pars_fragment.glsl.js +1 -5
- package/src/renderers/shaders/ShaderChunk/color_pars_vertex.glsl.js +1 -5
- package/src/renderers/shaders/ShaderChunk/color_vertex.glsl.js +8 -10
- package/src/renderers/shaders/ShaderChunk/common.glsl.js +0 -12
- package/src/renderers/shaders/ShaderChunk/envmap_common_pars_fragment.glsl.js +1 -2
- package/src/renderers/shaders/ShaderChunk/envmap_fragment.glsl.js +8 -12
- package/src/renderers/shaders/ShaderChunk/envmap_physical_pars_fragment.glsl.js +1 -1
- package/src/renderers/shaders/ShaderChunk/lightprobes_pars_fragment.glsl.js +80 -0
- package/src/renderers/shaders/ShaderChunk/lights_fragment_begin.glsl.js +13 -2
- package/src/renderers/shaders/ShaderChunk/lights_fragment_end.glsl.js +6 -0
- package/src/renderers/shaders/ShaderChunk/lights_fragment_maps.glsl.js +6 -2
- package/src/renderers/shaders/ShaderChunk/lights_pars_begin.glsl.js +2 -0
- package/src/renderers/shaders/ShaderChunk/lights_physical_fragment.glsl.js +8 -4
- package/src/renderers/shaders/ShaderChunk/lights_physical_pars_fragment.glsl.js +152 -59
- 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/normal_fragment_maps.glsl.js +7 -0
- package/src/renderers/shaders/ShaderChunk/packing.glsl.js +20 -4
- package/src/renderers/shaders/ShaderChunk/premultiplied_alpha_fragment.glsl.js +0 -1
- package/src/renderers/shaders/ShaderChunk/shadowmap_pars_fragment.glsl.js +221 -190
- package/src/renderers/shaders/ShaderChunk/shadowmap_vertex.glsl.js +12 -2
- package/src/renderers/shaders/ShaderChunk/shadowmask_pars_fragment.glsl.js +1 -1
- package/src/renderers/shaders/ShaderChunk/transmission_fragment.glsl.js +1 -1
- package/src/renderers/shaders/ShaderChunk.js +5 -3
- package/src/renderers/shaders/ShaderLib/backgroundCube.glsl.js +1 -2
- package/src/renderers/shaders/ShaderLib/depth.glsl.js +4 -1
- package/src/renderers/shaders/ShaderLib/{distanceRGBA.glsl.js → distance.glsl.js} +1 -2
- package/src/renderers/shaders/ShaderLib/meshlambert.glsl.js +2 -1
- package/src/renderers/shaders/ShaderLib/meshnormal.glsl.js +1 -2
- package/src/renderers/shaders/ShaderLib/meshphong.glsl.js +2 -1
- package/src/renderers/shaders/ShaderLib/meshphysical.glsl.js +4 -9
- package/src/renderers/shaders/ShaderLib/meshtoon.glsl.js +0 -1
- package/src/renderers/shaders/ShaderLib/shadow.glsl.js +1 -1
- package/src/renderers/shaders/ShaderLib/vsm.glsl.js +4 -6
- package/src/renderers/shaders/ShaderLib.js +7 -6
- package/src/renderers/shaders/UniformsLib.js +8 -5
- package/src/renderers/shaders/UniformsUtils.js +52 -9
- package/src/renderers/webgl/WebGLAnimation.js +2 -1
- package/src/renderers/webgl/WebGLBackground.js +15 -15
- package/src/renderers/webgl/WebGLBindingStates.js +99 -27
- package/src/renderers/webgl/WebGLBufferRenderer.js +0 -32
- package/src/renderers/webgl/WebGLCapabilities.js +11 -5
- package/src/renderers/webgl/WebGLEnvironments.js +228 -0
- package/src/renderers/webgl/WebGLExtensions.js +2 -25
- package/src/renderers/webgl/WebGLGeometries.js +10 -7
- package/src/renderers/webgl/WebGLIndexedBufferRenderer.js +0 -32
- package/src/renderers/webgl/WebGLInfo.js +3 -1
- package/src/renderers/webgl/WebGLLights.js +18 -1
- package/src/renderers/webgl/WebGLMaterials.js +24 -13
- package/src/renderers/webgl/WebGLObjects.js +3 -1
- package/src/renderers/webgl/WebGLOutput.js +270 -0
- package/src/renderers/webgl/WebGLProgram.js +63 -122
- package/src/renderers/webgl/WebGLPrograms.js +65 -52
- package/src/renderers/webgl/WebGLRenderLists.js +15 -0
- package/src/renderers/webgl/WebGLRenderStates.js +13 -2
- package/src/renderers/webgl/WebGLShadowMap.js +191 -26
- package/src/renderers/webgl/WebGLState.js +79 -40
- package/src/renderers/webgl/WebGLTextures.js +234 -68
- package/src/renderers/webgl/WebGLUniforms.js +40 -3
- package/src/renderers/webgl/WebGLUniformsGroups.js +24 -3
- package/src/renderers/webgl/WebGLUtils.js +8 -3
- package/src/renderers/webgl-fallback/WebGLBackend.js +438 -235
- package/src/renderers/webgl-fallback/WebGLBufferRenderer.js +0 -41
- package/src/renderers/webgl-fallback/nodes/GLSLNodeBuilder.js +339 -84
- package/src/renderers/webgl-fallback/utils/WebGLAttributeUtils.js +53 -19
- package/src/renderers/webgl-fallback/utils/WebGLCapabilities.js +25 -0
- package/src/renderers/webgl-fallback/utils/WebGLConstants.js +2 -3
- package/src/renderers/webgl-fallback/utils/WebGLState.js +229 -11
- package/src/renderers/webgl-fallback/utils/WebGLTextureUtils.js +237 -72
- package/src/renderers/webgl-fallback/utils/WebGLTimestampQueryPool.js +56 -27
- package/src/renderers/webgl-fallback/utils/WebGLUtils.js +8 -3
- package/src/renderers/webgpu/WebGPUBackend.js +403 -253
- package/src/renderers/webgpu/WebGPURenderer.Nodes.js +2 -1
- package/src/renderers/webgpu/WebGPURenderer.js +5 -3
- package/src/renderers/webgpu/nodes/WGSLNodeBuilder.js +491 -123
- package/src/renderers/webgpu/utils/WebGPUAttributeUtils.js +108 -34
- package/src/renderers/webgpu/utils/WebGPUBindingUtils.js +360 -201
- package/src/renderers/webgpu/utils/WebGPUCapabilities.js +48 -0
- package/src/renderers/webgpu/utils/WebGPUConstants.js +17 -2
- package/src/renderers/webgpu/utils/WebGPUPipelineUtils.js +111 -54
- package/src/renderers/webgpu/utils/WebGPUTexturePassUtils.js +155 -205
- package/src/renderers/webgpu/utils/WebGPUTextureUtils.js +407 -149
- package/src/renderers/webgpu/utils/WebGPUTimestampQueryPool.js +36 -13
- package/src/renderers/webgpu/utils/WebGPUUtils.js +55 -13
- package/src/renderers/webxr/WebXRController.js +12 -0
- package/src/renderers/webxr/WebXRManager.js +45 -29
- package/src/textures/CubeDepthTexture.js +76 -0
- package/src/textures/ExternalTexture.js +15 -4
- package/src/textures/HTMLTexture.js +74 -0
- package/src/textures/Source.js +5 -4
- package/src/textures/Texture.js +19 -7
- package/src/textures/VideoTexture.js +2 -3
- package/src/utils.js +344 -3
- package/examples/jsm/loaders/RGBMLoader.js +0 -1148
- package/examples/jsm/materials/MeshGouraudMaterial.js +0 -434
- package/examples/jsm/materials/MeshPostProcessingMaterial.js +0 -167
- package/examples/jsm/shaders/GodRaysShader.js +0 -333
- package/src/nodes/accessors/SceneNode.js +0 -144
- package/src/nodes/code/ScriptableNode.js +0 -726
- package/src/nodes/code/ScriptableValueNode.js +0 -253
- package/src/nodes/display/PosterizeNode.js +0 -65
- package/src/nodes/functions/BSDF/DFGApprox.js +0 -30
- package/src/nodes/utils/RemapNode.js +0 -125
- package/src/nodes/utils/SpriteSheetUVNode.js +0 -90
- package/src/renderers/webgl/WebGLCubeMaps.js +0 -99
- package/src/renderers/webgl/WebGLCubeUVMaps.js +0 -134
|
@@ -16,10 +16,10 @@ import { NodeAccess } from '../../../nodes/core/constants.js';
|
|
|
16
16
|
import VarNode from '../../../nodes/core/VarNode.js';
|
|
17
17
|
import ExpressionNode from '../../../nodes/code/ExpressionNode.js';
|
|
18
18
|
|
|
19
|
-
import { FloatType, RepeatWrapping, ClampToEdgeWrapping, MirroredRepeatWrapping, NearestFilter } from '../../../constants.js';
|
|
19
|
+
import { FloatType, RepeatWrapping, ClampToEdgeWrapping, MirroredRepeatWrapping, NearestFilter, Compatibility } from '../../../constants.js';
|
|
20
|
+
import { warn, error } from '../../../utils.js';
|
|
20
21
|
|
|
21
|
-
|
|
22
|
-
const GPUShaderStage = ( typeof self !== 'undefined' ) ? self.GPUShaderStage : { VERTEX: 1, FRAGMENT: 2, COMPUTE: 4 };
|
|
22
|
+
import { GPUShaderStage } from '../utils/WebGPUConstants.js';
|
|
23
23
|
|
|
24
24
|
const accessNames = {
|
|
25
25
|
[ NodeAccess.READ_ONLY ]: 'read',
|
|
@@ -34,9 +34,9 @@ const wrapNames = {
|
|
|
34
34
|
};
|
|
35
35
|
|
|
36
36
|
const gpuShaderStageLib = {
|
|
37
|
-
'vertex': GPUShaderStage
|
|
38
|
-
'fragment': GPUShaderStage
|
|
39
|
-
'compute': GPUShaderStage
|
|
37
|
+
'vertex': GPUShaderStage.VERTEX,
|
|
38
|
+
'fragment': GPUShaderStage.FRAGMENT,
|
|
39
|
+
'compute': GPUShaderStage.COMPUTE
|
|
40
40
|
};
|
|
41
41
|
|
|
42
42
|
const supports = {
|
|
@@ -112,6 +112,29 @@ fn tsl_biquadraticTexture( map : texture_2d<f32>, coord : vec2f, iRes : vec2u, l
|
|
|
112
112
|
|
|
113
113
|
return mix( mix( rg1, rg2, f.x ), mix( rg3, rg4, f.x ), f.y );
|
|
114
114
|
|
|
115
|
+
}
|
|
116
|
+
` ),
|
|
117
|
+
biquadraticTextureArray: new CodeNode( /* wgsl */`
|
|
118
|
+
fn tsl_biquadraticTexture_array( map : texture_2d_array<f32>, coord : vec2f, iRes : vec2u, layer : u32, level : u32 ) -> vec4f {
|
|
119
|
+
|
|
120
|
+
let res = vec2f( iRes );
|
|
121
|
+
|
|
122
|
+
let uvScaled = coord * res;
|
|
123
|
+
let uvWrapping = ( ( uvScaled % res ) + res ) % res;
|
|
124
|
+
|
|
125
|
+
// https://www.shadertoy.com/view/WtyXRy
|
|
126
|
+
|
|
127
|
+
let uv = uvWrapping - 0.5;
|
|
128
|
+
let iuv = floor( uv );
|
|
129
|
+
let f = fract( uv );
|
|
130
|
+
|
|
131
|
+
let rg1 = textureLoad( map, vec2u( iuv + vec2( 0.5, 0.5 ) ) % iRes, layer, level );
|
|
132
|
+
let rg2 = textureLoad( map, vec2u( iuv + vec2( 1.5, 0.5 ) ) % iRes, layer, level );
|
|
133
|
+
let rg3 = textureLoad( map, vec2u( iuv + vec2( 0.5, 1.5 ) ) % iRes, layer, level );
|
|
134
|
+
let rg4 = textureLoad( map, vec2u( iuv + vec2( 1.5, 1.5 ) ) % iRes, layer, level );
|
|
135
|
+
|
|
136
|
+
return mix( mix( rg1, rg2, f.x ), mix( rg3, rg4, f.x ), f.y );
|
|
137
|
+
|
|
115
138
|
}
|
|
116
139
|
` )
|
|
117
140
|
};
|
|
@@ -128,25 +151,15 @@ const wgslMethods = {
|
|
|
128
151
|
equals_bvec3: 'tsl_equals_bvec3',
|
|
129
152
|
equals_bvec4: 'tsl_equals_bvec4',
|
|
130
153
|
inversesqrt: 'inverseSqrt',
|
|
131
|
-
bitcast: 'bitcast<f32>'
|
|
154
|
+
bitcast: 'bitcast<f32>',
|
|
155
|
+
floatpack_snorm_2x16: 'pack2x16snorm',
|
|
156
|
+
floatpack_unorm_2x16: 'pack2x16unorm',
|
|
157
|
+
floatpack_float16_2x16: 'pack2x16float',
|
|
158
|
+
floatunpack_snorm_2x16: 'unpack2x16snorm',
|
|
159
|
+
floatunpack_unorm_2x16: 'unpack2x16unorm',
|
|
160
|
+
floatunpack_float16_2x16: 'unpack2x16float'
|
|
132
161
|
};
|
|
133
162
|
|
|
134
|
-
// WebGPU issue: does not support pow() with negative base on Windows
|
|
135
|
-
|
|
136
|
-
if ( typeof navigator !== 'undefined' && /Windows/g.test( navigator.userAgent ) ) {
|
|
137
|
-
|
|
138
|
-
wgslPolyfill.pow_float = new CodeNode( 'fn tsl_pow_float( a : f32, b : f32 ) -> f32 { return select( -pow( -a, b ), pow( a, b ), a > 0.0 ); }' );
|
|
139
|
-
wgslPolyfill.pow_vec2 = new CodeNode( 'fn tsl_pow_vec2( a : vec2f, b : vec2f ) -> vec2f { return vec2f( tsl_pow_float( a.x, b.x ), tsl_pow_float( a.y, b.y ) ); }', [ wgslPolyfill.pow_float ] );
|
|
140
|
-
wgslPolyfill.pow_vec3 = new CodeNode( 'fn tsl_pow_vec3( a : vec3f, b : vec3f ) -> vec3f { return vec3f( tsl_pow_float( a.x, b.x ), tsl_pow_float( a.y, b.y ), tsl_pow_float( a.z, b.z ) ); }', [ wgslPolyfill.pow_float ] );
|
|
141
|
-
wgslPolyfill.pow_vec4 = new CodeNode( 'fn tsl_pow_vec4( a : vec4f, b : vec4f ) -> vec4f { return vec4f( tsl_pow_float( a.x, b.x ), tsl_pow_float( a.y, b.y ), tsl_pow_float( a.z, b.z ), tsl_pow_float( a.w, b.w ) ); }', [ wgslPolyfill.pow_float ] );
|
|
142
|
-
|
|
143
|
-
wgslMethods.pow_float = 'tsl_pow_float';
|
|
144
|
-
wgslMethods.pow_vec2 = 'tsl_pow_vec2';
|
|
145
|
-
wgslMethods.pow_vec3 = 'tsl_pow_vec3';
|
|
146
|
-
wgslMethods.pow_vec4 = 'tsl_pow_vec4';
|
|
147
|
-
|
|
148
|
-
}
|
|
149
|
-
|
|
150
163
|
//
|
|
151
164
|
|
|
152
165
|
let diagnostics = '';
|
|
@@ -187,6 +200,14 @@ class WGSLNodeBuilder extends NodeBuilder {
|
|
|
187
200
|
*/
|
|
188
201
|
this.uniformGroups = {};
|
|
189
202
|
|
|
203
|
+
/**
|
|
204
|
+
* A dictionary that holds the assigned binding indices for each uniform group.
|
|
205
|
+
* This ensures the same binding index is used across all shader stages.
|
|
206
|
+
*
|
|
207
|
+
* @type {Object<string,{index: number, id: number}>}
|
|
208
|
+
*/
|
|
209
|
+
this.uniformGroupsBindings = {};
|
|
210
|
+
|
|
190
211
|
/**
|
|
191
212
|
* A dictionary that holds for each shader stage a Map of builtins.
|
|
192
213
|
*
|
|
@@ -209,6 +230,22 @@ class WGSLNodeBuilder extends NodeBuilder {
|
|
|
209
230
|
*/
|
|
210
231
|
this.scopedArrays = new Map();
|
|
211
232
|
|
|
233
|
+
/**
|
|
234
|
+
* A flag that indicates that early returns are allowed.
|
|
235
|
+
*
|
|
236
|
+
* @type {boolean}
|
|
237
|
+
* @default true
|
|
238
|
+
*/
|
|
239
|
+
this.allowEarlyReturns = true;
|
|
240
|
+
|
|
241
|
+
/**
|
|
242
|
+
* A flag that indicates that global variables are allowed.
|
|
243
|
+
*
|
|
244
|
+
* @type {boolean}
|
|
245
|
+
* @default true
|
|
246
|
+
*/
|
|
247
|
+
this.allowGlobalVariables = true;
|
|
248
|
+
|
|
212
249
|
}
|
|
213
250
|
|
|
214
251
|
/**
|
|
@@ -219,19 +256,32 @@ class WGSLNodeBuilder extends NodeBuilder {
|
|
|
219
256
|
* @param {string} textureProperty - The name of the texture uniform in the shader.
|
|
220
257
|
* @param {string} uvSnippet - A WGSL snippet that represents texture coordinates used for sampling.
|
|
221
258
|
* @param {?string} depthSnippet - A WGSL snippet that represents 0-based texture array index to sample.
|
|
259
|
+
* @param {?string} offsetSnippet - A WGSL snippet that represents the offset that will be applied to the unnormalized texture coordinate before sampling the texture.
|
|
222
260
|
* @param {string} [shaderStage=this.shaderStage] - The shader stage this code snippet is generated for.
|
|
223
261
|
* @return {string} The WGSL snippet.
|
|
224
262
|
*/
|
|
225
|
-
_generateTextureSample( texture, textureProperty, uvSnippet, depthSnippet, shaderStage = this.shaderStage ) {
|
|
263
|
+
_generateTextureSample( texture, textureProperty, uvSnippet, depthSnippet, offsetSnippet, shaderStage = this.shaderStage ) {
|
|
226
264
|
|
|
227
265
|
if ( shaderStage === 'fragment' ) {
|
|
228
266
|
|
|
229
267
|
if ( depthSnippet ) {
|
|
230
268
|
|
|
269
|
+
if ( offsetSnippet ) {
|
|
270
|
+
|
|
271
|
+
return `textureSample( ${ textureProperty }, ${ textureProperty }_sampler, ${ uvSnippet }, ${ depthSnippet }, ${ offsetSnippet } )`;
|
|
272
|
+
|
|
273
|
+
}
|
|
274
|
+
|
|
231
275
|
return `textureSample( ${ textureProperty }, ${ textureProperty }_sampler, ${ uvSnippet }, ${ depthSnippet } )`;
|
|
232
276
|
|
|
233
277
|
} else {
|
|
234
278
|
|
|
279
|
+
if ( offsetSnippet ) {
|
|
280
|
+
|
|
281
|
+
return `textureSample( ${ textureProperty }, ${ textureProperty }_sampler, ${ uvSnippet }, ${ offsetSnippet } )`;
|
|
282
|
+
|
|
283
|
+
}
|
|
284
|
+
|
|
235
285
|
return `textureSample( ${ textureProperty }, ${ textureProperty }_sampler, ${ uvSnippet } )`;
|
|
236
286
|
|
|
237
287
|
}
|
|
@@ -253,21 +303,42 @@ class WGSLNodeBuilder extends NodeBuilder {
|
|
|
253
303
|
* @param {string} uvSnippet - A WGSL snippet that represents texture coordinates used for sampling.
|
|
254
304
|
* @param {string} levelSnippet - A WGSL snippet that represents the mip level, with level 0 containing a full size version of the texture.
|
|
255
305
|
* @param {string} depthSnippet - A WGSL snippet that represents 0-based texture array index to sample.
|
|
306
|
+
* @param {?string} offsetSnippet - A WGSL snippet that represents the offset that will be applied to the unnormalized texture coordinate before sampling the texture.
|
|
256
307
|
* @return {string} The WGSL snippet.
|
|
257
308
|
*/
|
|
258
|
-
generateTextureSampleLevel( texture, textureProperty, uvSnippet, levelSnippet, depthSnippet ) {
|
|
309
|
+
generateTextureSampleLevel( texture, textureProperty, uvSnippet, levelSnippet, depthSnippet, offsetSnippet ) {
|
|
259
310
|
|
|
260
311
|
if ( this.isUnfilterable( texture ) === false ) {
|
|
261
312
|
|
|
262
|
-
|
|
313
|
+
if ( depthSnippet ) {
|
|
314
|
+
|
|
315
|
+
if ( offsetSnippet ) {
|
|
316
|
+
|
|
317
|
+
return `textureSampleLevel( ${ textureProperty }, ${ textureProperty }_sampler, ${ uvSnippet }, ${ depthSnippet }, ${ levelSnippet }, ${ offsetSnippet } )`;
|
|
318
|
+
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
return `textureSampleLevel( ${ textureProperty }, ${ textureProperty }_sampler, ${ uvSnippet }, ${ depthSnippet }, ${ levelSnippet } )`;
|
|
322
|
+
|
|
323
|
+
} else {
|
|
324
|
+
|
|
325
|
+
if ( offsetSnippet ) {
|
|
326
|
+
|
|
327
|
+
return `textureSampleLevel( ${ textureProperty }, ${ textureProperty }_sampler, ${ uvSnippet }, ${ levelSnippet }, ${ offsetSnippet } )`;
|
|
328
|
+
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
return `textureSampleLevel( ${ textureProperty }, ${ textureProperty }_sampler, ${ uvSnippet }, ${ levelSnippet } )`;
|
|
332
|
+
|
|
333
|
+
}
|
|
263
334
|
|
|
264
335
|
} else if ( this.isFilteredTexture( texture ) ) {
|
|
265
336
|
|
|
266
|
-
return this.generateFilteredTexture( texture, textureProperty, uvSnippet, levelSnippet );
|
|
337
|
+
return this.generateFilteredTexture( texture, textureProperty, uvSnippet, offsetSnippet, levelSnippet, depthSnippet );
|
|
267
338
|
|
|
268
339
|
} else {
|
|
269
340
|
|
|
270
|
-
return this.generateTextureLod( texture, textureProperty, uvSnippet, depthSnippet, levelSnippet );
|
|
341
|
+
return this.generateTextureLod( texture, textureProperty, uvSnippet, depthSnippet, offsetSnippet, levelSnippet );
|
|
271
342
|
|
|
272
343
|
}
|
|
273
344
|
|
|
@@ -281,7 +352,7 @@ class WGSLNodeBuilder extends NodeBuilder {
|
|
|
281
352
|
*/
|
|
282
353
|
generateWrapFunction( texture ) {
|
|
283
354
|
|
|
284
|
-
const functionName = `tsl_coord_${ wrapNames[ texture.wrapS ] }S_${ wrapNames[ texture.wrapT ] }_${ texture.isData3DTexture ? '3d' : '2d' }T`;
|
|
355
|
+
const functionName = `tsl_coord_${ wrapNames[ texture.wrapS ] }S_${ wrapNames[ texture.wrapT ] }_${ texture.is3DTexture || texture.isData3DTexture ? '3d' : '2d' }T`;
|
|
285
356
|
|
|
286
357
|
let nodeCode = wgslCodeCache[ functionName ];
|
|
287
358
|
|
|
@@ -290,7 +361,7 @@ class WGSLNodeBuilder extends NodeBuilder {
|
|
|
290
361
|
const includes = [];
|
|
291
362
|
|
|
292
363
|
// For 3D textures, use vec3f; for texture arrays, keep vec2f since array index is separate
|
|
293
|
-
const coordType = texture.isData3DTexture ? 'vec3f' : 'vec2f';
|
|
364
|
+
const coordType = texture.is3DTexture || texture.isData3DTexture ? 'vec3f' : 'vec2f';
|
|
294
365
|
let code = `fn ${ functionName }( coord : ${ coordType } ) -> ${ coordType } {\n\n\treturn ${ coordType }(\n`;
|
|
295
366
|
|
|
296
367
|
const addWrapSnippet = ( wrap, axis ) => {
|
|
@@ -317,7 +388,7 @@ class WGSLNodeBuilder extends NodeBuilder {
|
|
|
317
388
|
|
|
318
389
|
code += `\t\tcoord.${ axis }`;
|
|
319
390
|
|
|
320
|
-
|
|
391
|
+
warn( `WebGPURenderer: Unsupported texture wrap type "${ wrap }" for vertex shader.` );
|
|
321
392
|
|
|
322
393
|
}
|
|
323
394
|
|
|
@@ -329,7 +400,7 @@ class WGSLNodeBuilder extends NodeBuilder {
|
|
|
329
400
|
|
|
330
401
|
addWrapSnippet( texture.wrapT, 'y' );
|
|
331
402
|
|
|
332
|
-
if ( texture.isData3DTexture ) {
|
|
403
|
+
if ( texture.is3DTexture || texture.isData3DTexture ) {
|
|
333
404
|
|
|
334
405
|
code += ',\n';
|
|
335
406
|
addWrapSnippet( texture.wrapR, 'z' );
|
|
@@ -373,7 +444,7 @@ class WGSLNodeBuilder extends NodeBuilder {
|
|
|
373
444
|
*/
|
|
374
445
|
generateTextureDimension( texture, textureProperty, levelSnippet ) {
|
|
375
446
|
|
|
376
|
-
const textureData = this.getDataFromNode( texture, this.shaderStage, this.
|
|
447
|
+
const textureData = this.getDataFromNode( texture, this.shaderStage, this.cache );
|
|
377
448
|
|
|
378
449
|
if ( textureData.dimensionsSnippet === undefined ) textureData.dimensionsSnippet = {};
|
|
379
450
|
|
|
@@ -387,7 +458,7 @@ class WGSLNodeBuilder extends NodeBuilder {
|
|
|
387
458
|
const { primarySamples } = this.renderer.backend.utils.getTextureSampleData( texture );
|
|
388
459
|
const isMultisampled = primarySamples > 1;
|
|
389
460
|
|
|
390
|
-
if ( texture.isData3DTexture ) {
|
|
461
|
+
if ( texture.is3DTexture || texture.isData3DTexture ) {
|
|
391
462
|
|
|
392
463
|
dimensionType = 'vec3<u32>';
|
|
393
464
|
|
|
@@ -413,7 +484,7 @@ class WGSLNodeBuilder extends NodeBuilder {
|
|
|
413
484
|
|
|
414
485
|
textureData.dimensionsSnippet[ levelSnippet ] = textureDimensionNode;
|
|
415
486
|
|
|
416
|
-
if ( texture.isArrayTexture || texture.isDataArrayTexture || texture.isData3DTexture ) {
|
|
487
|
+
if ( texture.isArrayTexture || texture.isDataArrayTexture || texture.is3DTexture || texture.isData3DTexture ) {
|
|
417
488
|
|
|
418
489
|
textureData.arrayLayerCount = new VarNode(
|
|
419
490
|
new ExpressionNode(
|
|
@@ -445,16 +516,32 @@ class WGSLNodeBuilder extends NodeBuilder {
|
|
|
445
516
|
* @param {Texture} texture - The texture.
|
|
446
517
|
* @param {string} textureProperty - The name of the texture uniform in the shader.
|
|
447
518
|
* @param {string} uvSnippet - A WGSL snippet that represents texture coordinates used for sampling.
|
|
448
|
-
* @param {string}
|
|
519
|
+
* @param {?string} offsetSnippet - A WGSL snippet that represents the offset that will be applied to the unnormalized texture coordinate before sampling the texture.
|
|
520
|
+
* @param {string} [levelSnippet='0u'] - A WGSL snippet that represents the mip level, with level 0 containing a full size version of the texture.
|
|
521
|
+
* @param {?string} depthSnippet - A WGSL snippet that represents 0-based texture array index to sample.
|
|
449
522
|
* @return {string} The WGSL snippet.
|
|
450
523
|
*/
|
|
451
|
-
generateFilteredTexture( texture, textureProperty, uvSnippet, levelSnippet = '0u' ) {
|
|
452
|
-
|
|
453
|
-
this._include( 'biquadraticTexture' );
|
|
524
|
+
generateFilteredTexture( texture, textureProperty, uvSnippet, offsetSnippet, levelSnippet = '0u', depthSnippet ) {
|
|
454
525
|
|
|
455
526
|
const wrapFunction = this.generateWrapFunction( texture );
|
|
456
527
|
const textureDimension = this.generateTextureDimension( texture, textureProperty, levelSnippet );
|
|
457
528
|
|
|
529
|
+
if ( offsetSnippet ) {
|
|
530
|
+
|
|
531
|
+
uvSnippet = `${ uvSnippet } + vec2<f32>(${ offsetSnippet }) / ${ textureDimension }`;
|
|
532
|
+
|
|
533
|
+
}
|
|
534
|
+
|
|
535
|
+
if ( depthSnippet ) {
|
|
536
|
+
|
|
537
|
+
this._include( 'biquadraticTextureArray' );
|
|
538
|
+
|
|
539
|
+
return `tsl_biquadraticTexture_array( ${ textureProperty }, ${ wrapFunction }( ${ uvSnippet } ), ${ textureDimension }, u32( ${ depthSnippet } ), u32( ${ levelSnippet } ) )`;
|
|
540
|
+
|
|
541
|
+
}
|
|
542
|
+
|
|
543
|
+
this._include( 'biquadraticTexture' );
|
|
544
|
+
|
|
458
545
|
return `tsl_biquadraticTexture( ${ textureProperty }, ${ wrapFunction }( ${ uvSnippet } ), ${ textureDimension }, u32( ${ levelSnippet } ) )`;
|
|
459
546
|
|
|
460
547
|
}
|
|
@@ -467,18 +554,81 @@ class WGSLNodeBuilder extends NodeBuilder {
|
|
|
467
554
|
* @param {string} textureProperty - The name of the texture uniform in the shader.
|
|
468
555
|
* @param {string} uvSnippet - A WGSL snippet that represents texture coordinates used for sampling.
|
|
469
556
|
* @param {?string} depthSnippet - A WGSL snippet that represents 0-based texture array index to sample.
|
|
557
|
+
* @param {?string} offsetSnippet - A WGSL snippet that represents the offset that will be applied to the unnormalized texture coordinate before sampling the texture.
|
|
470
558
|
* @param {string} [levelSnippet='0u'] - A WGSL snippet that represents the mip level, with level 0 containing a full size version of the texture.
|
|
471
559
|
* @return {string} The WGSL snippet.
|
|
472
560
|
*/
|
|
473
|
-
generateTextureLod( texture, textureProperty, uvSnippet, depthSnippet, levelSnippet = '0u' ) {
|
|
561
|
+
generateTextureLod( texture, textureProperty, uvSnippet, depthSnippet, offsetSnippet, levelSnippet = '0u' ) {
|
|
562
|
+
|
|
563
|
+
// Cube textures cannot use textureLoad in WGSL, must use textureSampleLevel
|
|
564
|
+
if ( texture.isCubeTexture === true ) {
|
|
565
|
+
|
|
566
|
+
if ( offsetSnippet ) {
|
|
567
|
+
|
|
568
|
+
uvSnippet = `${ uvSnippet } + vec3<f32>(${ offsetSnippet })`;
|
|
569
|
+
|
|
570
|
+
}
|
|
571
|
+
|
|
572
|
+
// Depth textures require integer level, regular textures use float
|
|
573
|
+
const levelType = texture.isDepthTexture ? 'u32' : 'f32';
|
|
574
|
+
|
|
575
|
+
return `textureSampleLevel( ${ textureProperty }, ${ textureProperty }_sampler, ${ uvSnippet }, ${ levelType }( ${ levelSnippet } ) )`;
|
|
576
|
+
|
|
577
|
+
}
|
|
474
578
|
|
|
475
579
|
const wrapFunction = this.generateWrapFunction( texture );
|
|
476
580
|
const textureDimension = this.generateTextureDimension( texture, textureProperty, levelSnippet );
|
|
477
581
|
|
|
478
|
-
const vecType = texture.isData3DTexture ? 'vec3' : 'vec2';
|
|
479
|
-
const
|
|
582
|
+
const vecType = texture.is3DTexture || texture.isData3DTexture ? 'vec3' : 'vec2';
|
|
583
|
+
const textureDimensionMargin = ( vecType === 'vec3' ) ? 'vec3<u32>( 1, 1, 1 )' : 'vec2<u32>( 1, 1 )';
|
|
584
|
+
|
|
585
|
+
if ( offsetSnippet ) {
|
|
586
|
+
|
|
587
|
+
uvSnippet = `${ uvSnippet } + ${ vecType }<f32>(${ offsetSnippet }) / ${ vecType }<f32>( ${ textureDimension } )`;
|
|
588
|
+
|
|
589
|
+
}
|
|
590
|
+
|
|
591
|
+
const clampMin = `${ vecType }<f32>( 0 )`;
|
|
592
|
+
const clampMax = `${ vecType }<f32>( ${ textureDimension } - ${ textureDimensionMargin } )`;
|
|
593
|
+
|
|
594
|
+
uvSnippet = `${ vecType }<u32>( clamp( floor( ${ wrapFunction }( ${ uvSnippet } ) * ${ vecType }<f32>( ${ textureDimension } ) ), ${ clampMin }, ${ clampMax } ) )`;
|
|
595
|
+
|
|
596
|
+
return this.generateTextureLoad( texture, textureProperty, uvSnippet, levelSnippet, depthSnippet, null );
|
|
597
|
+
|
|
598
|
+
}
|
|
599
|
+
|
|
600
|
+
/**
|
|
601
|
+
* Generates the WGSL snippet that reads a single texel from a storage texture.
|
|
602
|
+
*
|
|
603
|
+
* @param {Texture} texture - The texture.
|
|
604
|
+
* @param {string} textureProperty - The name of the texture uniform in the shader.
|
|
605
|
+
* @param {string} uvIndexSnippet - A WGSL snippet that represents texture coordinates used for sampling.
|
|
606
|
+
* @param {?string} levelSnippet - A WGSL snippet that represents the mip level, with level 0 containing a full size version of the texture.
|
|
607
|
+
* @param {?string} depthSnippet - A WGSL snippet that represents 0-based texture array index to sample.
|
|
608
|
+
* @param {?string} offsetSnippet - A WGSL snippet that represents the offset that will be applied to the unnormalized texture coordinate before sampling the texture.
|
|
609
|
+
* @return {string} The WGSL snippet.
|
|
610
|
+
*/
|
|
611
|
+
generateStorageTextureLoad( texture, textureProperty, uvIndexSnippet, levelSnippet, depthSnippet, offsetSnippet ) {
|
|
612
|
+
|
|
613
|
+
if ( offsetSnippet ) {
|
|
614
|
+
|
|
615
|
+
uvIndexSnippet = `${ uvIndexSnippet } + ${ offsetSnippet }`;
|
|
616
|
+
|
|
617
|
+
}
|
|
618
|
+
|
|
619
|
+
let snippet;
|
|
620
|
+
|
|
621
|
+
if ( depthSnippet ) {
|
|
622
|
+
|
|
623
|
+
snippet = `textureLoad( ${ textureProperty }, ${ uvIndexSnippet }, ${ depthSnippet } )`;
|
|
624
|
+
|
|
625
|
+
} else {
|
|
626
|
+
|
|
627
|
+
snippet = `textureLoad( ${ textureProperty }, ${ uvIndexSnippet } )`;
|
|
480
628
|
|
|
481
|
-
|
|
629
|
+
}
|
|
630
|
+
|
|
631
|
+
return snippet;
|
|
482
632
|
|
|
483
633
|
}
|
|
484
634
|
|
|
@@ -488,11 +638,20 @@ class WGSLNodeBuilder extends NodeBuilder {
|
|
|
488
638
|
* @param {Texture} texture - The texture.
|
|
489
639
|
* @param {string} textureProperty - The name of the texture uniform in the shader.
|
|
490
640
|
* @param {string} uvIndexSnippet - A WGSL snippet that represents texture coordinates used for sampling.
|
|
641
|
+
* @param {?string} levelSnippet - A WGSL snippet that represents the mip level, with level 0 containing a full size version of the texture.
|
|
491
642
|
* @param {?string} depthSnippet - A WGSL snippet that represents 0-based texture array index to sample.
|
|
492
|
-
* @param {string}
|
|
643
|
+
* @param {?string} offsetSnippet - A WGSL snippet that represents the offset that will be applied to the unnormalized texture coordinate before sampling the texture.
|
|
493
644
|
* @return {string} The WGSL snippet.
|
|
494
645
|
*/
|
|
495
|
-
generateTextureLoad( texture, textureProperty, uvIndexSnippet, depthSnippet,
|
|
646
|
+
generateTextureLoad( texture, textureProperty, uvIndexSnippet, levelSnippet, depthSnippet, offsetSnippet ) {
|
|
647
|
+
|
|
648
|
+
if ( levelSnippet === null ) levelSnippet = '0u';
|
|
649
|
+
|
|
650
|
+
if ( offsetSnippet ) {
|
|
651
|
+
|
|
652
|
+
uvIndexSnippet = `${ uvIndexSnippet } + ${ offsetSnippet }`;
|
|
653
|
+
|
|
654
|
+
}
|
|
496
655
|
|
|
497
656
|
let snippet;
|
|
498
657
|
|
|
@@ -552,7 +711,7 @@ class WGSLNodeBuilder extends NodeBuilder {
|
|
|
552
711
|
*/
|
|
553
712
|
isSampleCompare( texture ) {
|
|
554
713
|
|
|
555
|
-
return texture.isDepthTexture === true && texture.compareFunction !== null;
|
|
714
|
+
return texture.isDepthTexture === true && texture.compareFunction !== null && this.renderer.hasCompatibility( Compatibility.TEXTURE_COMPARE );
|
|
556
715
|
|
|
557
716
|
}
|
|
558
717
|
|
|
@@ -565,7 +724,7 @@ class WGSLNodeBuilder extends NodeBuilder {
|
|
|
565
724
|
isUnfilterable( texture ) {
|
|
566
725
|
|
|
567
726
|
return this.getComponentTypeFromTexture( texture ) !== 'float' ||
|
|
568
|
-
( ! this.isAvailable( 'float32Filterable' ) && texture.
|
|
727
|
+
( ! this.isAvailable( 'float32Filterable' ) && texture.type === FloatType ) ||
|
|
569
728
|
( this.isSampleCompare( texture ) === false && texture.minFilter === NearestFilter && texture.magFilter === NearestFilter ) ||
|
|
570
729
|
this.renderer.backend.utils.getTextureSampleData( texture ).primarySamples > 1;
|
|
571
730
|
|
|
@@ -578,20 +737,21 @@ class WGSLNodeBuilder extends NodeBuilder {
|
|
|
578
737
|
* @param {string} textureProperty - The name of the texture uniform in the shader.
|
|
579
738
|
* @param {string} uvSnippet - A WGSL snippet that represents texture coordinates used for sampling.
|
|
580
739
|
* @param {?string} depthSnippet - A WGSL snippet that represents 0-based texture array index to sample.
|
|
740
|
+
* @param {?string} offsetSnippet - A WGSL snippet that represents the offset that will be applied to the unnormalized texture coordinate before sampling the texture.
|
|
581
741
|
* @param {string} [shaderStage=this.shaderStage] - The shader stage this code snippet is generated for.
|
|
582
742
|
* @return {string} The WGSL snippet.
|
|
583
743
|
*/
|
|
584
|
-
generateTexture( texture, textureProperty, uvSnippet, depthSnippet, shaderStage = this.shaderStage ) {
|
|
744
|
+
generateTexture( texture, textureProperty, uvSnippet, depthSnippet, offsetSnippet, shaderStage = this.shaderStage ) {
|
|
585
745
|
|
|
586
746
|
let snippet = null;
|
|
587
747
|
|
|
588
748
|
if ( this.isUnfilterable( texture ) ) {
|
|
589
749
|
|
|
590
|
-
snippet = this.generateTextureLod( texture, textureProperty, uvSnippet, depthSnippet, '0', shaderStage );
|
|
750
|
+
snippet = this.generateTextureLod( texture, textureProperty, uvSnippet, depthSnippet, offsetSnippet, '0', shaderStage );
|
|
591
751
|
|
|
592
752
|
} else {
|
|
593
753
|
|
|
594
|
-
snippet = this._generateTextureSample( texture, textureProperty, uvSnippet, depthSnippet, shaderStage );
|
|
754
|
+
snippet = this._generateTextureSample( texture, textureProperty, uvSnippet, depthSnippet, offsetSnippet, shaderStage );
|
|
595
755
|
|
|
596
756
|
}
|
|
597
757
|
|
|
@@ -607,19 +767,39 @@ class WGSLNodeBuilder extends NodeBuilder {
|
|
|
607
767
|
* @param {string} uvSnippet - A WGSL snippet that represents texture coordinates used for sampling.
|
|
608
768
|
* @param {Array<string>} gradSnippet - An array holding both gradient WGSL snippets.
|
|
609
769
|
* @param {?string} depthSnippet - A WGSL snippet that represents 0-based texture array index to sample.
|
|
770
|
+
* @param {?string} offsetSnippet - A WGSL snippet that represents the offset that will be applied to the unnormalized texture coordinate before sampling the texture.
|
|
610
771
|
* @param {string} [shaderStage=this.shaderStage] - The shader stage this code snippet is generated for.
|
|
611
772
|
* @return {string} The WGSL snippet.
|
|
612
773
|
*/
|
|
613
|
-
generateTextureGrad( texture, textureProperty, uvSnippet, gradSnippet, depthSnippet, shaderStage = this.shaderStage ) {
|
|
774
|
+
generateTextureGrad( texture, textureProperty, uvSnippet, gradSnippet, depthSnippet, offsetSnippet, shaderStage = this.shaderStage ) {
|
|
614
775
|
|
|
615
776
|
if ( shaderStage === 'fragment' ) {
|
|
616
777
|
|
|
617
|
-
|
|
618
|
-
|
|
778
|
+
if ( depthSnippet ) {
|
|
779
|
+
|
|
780
|
+
if ( offsetSnippet ) {
|
|
781
|
+
|
|
782
|
+
return `textureSampleGrad( ${ textureProperty }, ${ textureProperty }_sampler, ${ uvSnippet }, ${ depthSnippet }, ${ gradSnippet[ 0 ] }, ${ gradSnippet[ 1 ] }, ${ offsetSnippet } )`;
|
|
783
|
+
|
|
784
|
+
}
|
|
785
|
+
|
|
786
|
+
return `textureSampleGrad( ${ textureProperty }, ${ textureProperty }_sampler, ${ uvSnippet }, ${ depthSnippet }, ${ gradSnippet[ 0 ] }, ${ gradSnippet[ 1 ] } )`;
|
|
787
|
+
|
|
788
|
+
} else {
|
|
789
|
+
|
|
790
|
+
if ( offsetSnippet ) {
|
|
791
|
+
|
|
792
|
+
return `textureSampleGrad( ${ textureProperty }, ${ textureProperty }_sampler, ${ uvSnippet }, ${ gradSnippet[ 0 ] }, ${ gradSnippet[ 1 ] }, ${ offsetSnippet } )`;
|
|
793
|
+
|
|
794
|
+
}
|
|
795
|
+
|
|
796
|
+
return `textureSampleGrad( ${ textureProperty }, ${ textureProperty }_sampler, ${ uvSnippet }, ${ gradSnippet[ 0 ] }, ${ gradSnippet[ 1 ] } )`;
|
|
797
|
+
|
|
798
|
+
}
|
|
619
799
|
|
|
620
800
|
} else {
|
|
621
801
|
|
|
622
|
-
|
|
802
|
+
error( `WebGPURenderer: THREE.TextureNode.gradient() does not support ${ shaderStage } shader.` );
|
|
623
803
|
|
|
624
804
|
}
|
|
625
805
|
|
|
@@ -634,24 +814,37 @@ class WGSLNodeBuilder extends NodeBuilder {
|
|
|
634
814
|
* @param {string} uvSnippet - A WGSL snippet that represents texture coordinates used for sampling.
|
|
635
815
|
* @param {string} compareSnippet - A WGSL snippet that represents the reference value.
|
|
636
816
|
* @param {?string} depthSnippet - A WGSL snippet that represents 0-based texture array index to sample.
|
|
817
|
+
* @param {?string} offsetSnippet - A WGSL snippet that represents the offset that will be applied to the unnormalized texture coordinate before sampling the texture.
|
|
637
818
|
* @param {string} [shaderStage=this.shaderStage] - The shader stage this code snippet is generated for.
|
|
638
819
|
* @return {string} The WGSL snippet.
|
|
639
820
|
*/
|
|
640
|
-
generateTextureCompare( texture, textureProperty, uvSnippet, compareSnippet, depthSnippet, shaderStage = this.shaderStage ) {
|
|
821
|
+
generateTextureCompare( texture, textureProperty, uvSnippet, compareSnippet, depthSnippet, offsetSnippet, shaderStage = this.shaderStage ) {
|
|
641
822
|
|
|
642
823
|
if ( shaderStage === 'fragment' ) {
|
|
643
824
|
|
|
644
825
|
if ( texture.isDepthTexture === true && texture.isArrayTexture === true ) {
|
|
645
826
|
|
|
827
|
+
if ( offsetSnippet ) {
|
|
828
|
+
|
|
829
|
+
return `textureSampleCompare( ${ textureProperty }, ${ textureProperty }_sampler, ${ uvSnippet }, ${ depthSnippet }, ${ compareSnippet }, ${ offsetSnippet } )`;
|
|
830
|
+
|
|
831
|
+
}
|
|
832
|
+
|
|
646
833
|
return `textureSampleCompare( ${ textureProperty }, ${ textureProperty }_sampler, ${ uvSnippet }, ${ depthSnippet }, ${ compareSnippet } )`;
|
|
647
834
|
|
|
648
835
|
}
|
|
649
836
|
|
|
837
|
+
if ( offsetSnippet ) {
|
|
838
|
+
|
|
839
|
+
return `textureSampleCompare( ${ textureProperty }, ${ textureProperty }_sampler, ${ uvSnippet }, ${ compareSnippet }, ${ offsetSnippet } )`;
|
|
840
|
+
|
|
841
|
+
}
|
|
842
|
+
|
|
650
843
|
return `textureSampleCompare( ${ textureProperty }, ${ textureProperty }_sampler, ${ uvSnippet }, ${ compareSnippet } )`;
|
|
651
844
|
|
|
652
845
|
} else {
|
|
653
846
|
|
|
654
|
-
|
|
847
|
+
error( `WebGPURenderer: THREE.DepthTexture.compareFunction() does not support ${ shaderStage } shader.` );
|
|
655
848
|
|
|
656
849
|
}
|
|
657
850
|
|
|
@@ -665,22 +858,43 @@ class WGSLNodeBuilder extends NodeBuilder {
|
|
|
665
858
|
* @param {string} uvSnippet - A WGSL snippet that represents texture coordinates used for sampling.
|
|
666
859
|
* @param {string} levelSnippet - A WGSL snippet that represents the mip level, with level 0 containing a full size version of the texture.
|
|
667
860
|
* @param {?string} depthSnippet - A WGSL snippet that represents 0-based texture array index to sample.
|
|
861
|
+
* @param {?string} offsetSnippet - A WGSL snippet that represents the offset that will be applied to the unnormalized texture coordinate before sampling the texture.
|
|
668
862
|
* @param {string} [shaderStage=this.shaderStage] - The shader stage this code snippet is generated for.
|
|
669
863
|
* @return {string} The WGSL snippet.
|
|
670
864
|
*/
|
|
671
|
-
generateTextureLevel( texture, textureProperty, uvSnippet, levelSnippet, depthSnippet ) {
|
|
865
|
+
generateTextureLevel( texture, textureProperty, uvSnippet, levelSnippet, depthSnippet, offsetSnippet ) {
|
|
672
866
|
|
|
673
867
|
if ( this.isUnfilterable( texture ) === false ) {
|
|
674
868
|
|
|
675
|
-
|
|
869
|
+
if ( depthSnippet ) {
|
|
870
|
+
|
|
871
|
+
if ( offsetSnippet ) {
|
|
872
|
+
|
|
873
|
+
return `textureSampleLevel( ${ textureProperty }, ${ textureProperty }_sampler, ${ uvSnippet }, ${ depthSnippet }, ${ levelSnippet }, ${ offsetSnippet } )`;
|
|
874
|
+
|
|
875
|
+
}
|
|
876
|
+
|
|
877
|
+
return `textureSampleLevel( ${ textureProperty }, ${ textureProperty }_sampler, ${ uvSnippet }, ${ depthSnippet }, ${ levelSnippet } )`;
|
|
878
|
+
|
|
879
|
+
} else {
|
|
880
|
+
|
|
881
|
+
if ( offsetSnippet ) {
|
|
882
|
+
|
|
883
|
+
return `textureSampleLevel( ${ textureProperty }, ${ textureProperty }_sampler, ${ uvSnippet }, ${ levelSnippet }, ${ offsetSnippet } )`;
|
|
884
|
+
|
|
885
|
+
}
|
|
886
|
+
|
|
887
|
+
return `textureSampleLevel( ${ textureProperty }, ${ textureProperty }_sampler, ${ uvSnippet }, ${ levelSnippet } )`;
|
|
888
|
+
|
|
889
|
+
}
|
|
676
890
|
|
|
677
891
|
} else if ( this.isFilteredTexture( texture ) ) {
|
|
678
892
|
|
|
679
|
-
return this.generateFilteredTexture( texture, textureProperty, uvSnippet, levelSnippet );
|
|
893
|
+
return this.generateFilteredTexture( texture, textureProperty, uvSnippet, offsetSnippet, levelSnippet, depthSnippet );
|
|
680
894
|
|
|
681
895
|
} else {
|
|
682
896
|
|
|
683
|
-
return this.generateTextureLod( texture, textureProperty, uvSnippet, depthSnippet, levelSnippet );
|
|
897
|
+
return this.generateTextureLod( texture, textureProperty, uvSnippet, depthSnippet, offsetSnippet, levelSnippet );
|
|
684
898
|
|
|
685
899
|
}
|
|
686
900
|
|
|
@@ -694,18 +908,39 @@ class WGSLNodeBuilder extends NodeBuilder {
|
|
|
694
908
|
* @param {string} uvSnippet - A WGSL snippet that represents texture coordinates used for sampling.
|
|
695
909
|
* @param {string} biasSnippet - A WGSL snippet that represents the bias to apply to the mip level before sampling.
|
|
696
910
|
* @param {?string} depthSnippet - A WGSL snippet that represents 0-based texture array index to sample.
|
|
911
|
+
* @param {?string} offsetSnippet - A WGSL snippet that represents the offset that will be applied to the unnormalized texture coordinate before sampling the texture.
|
|
697
912
|
* @param {string} [shaderStage=this.shaderStage] - The shader stage this code snippet is generated for.
|
|
698
913
|
* @return {string} The WGSL snippet.
|
|
699
914
|
*/
|
|
700
|
-
generateTextureBias( texture, textureProperty, uvSnippet, biasSnippet, depthSnippet, shaderStage = this.shaderStage ) {
|
|
915
|
+
generateTextureBias( texture, textureProperty, uvSnippet, biasSnippet, depthSnippet, offsetSnippet, shaderStage = this.shaderStage ) {
|
|
701
916
|
|
|
702
917
|
if ( shaderStage === 'fragment' ) {
|
|
703
918
|
|
|
704
|
-
|
|
919
|
+
if ( depthSnippet ) {
|
|
920
|
+
|
|
921
|
+
if ( offsetSnippet ) {
|
|
922
|
+
|
|
923
|
+
return `textureSampleBias( ${ textureProperty }, ${ textureProperty }_sampler, ${ uvSnippet }, ${ depthSnippet }, ${ biasSnippet }, ${ offsetSnippet } )`;
|
|
924
|
+
|
|
925
|
+
}
|
|
926
|
+
|
|
927
|
+
return `textureSampleBias( ${ textureProperty }, ${ textureProperty }_sampler, ${ uvSnippet }, ${ depthSnippet }, ${ biasSnippet } )`;
|
|
928
|
+
|
|
929
|
+
} else {
|
|
930
|
+
|
|
931
|
+
if ( offsetSnippet ) {
|
|
932
|
+
|
|
933
|
+
return `textureSampleBias( ${ textureProperty }, ${ textureProperty }_sampler, ${ uvSnippet }, ${ biasSnippet }, ${ offsetSnippet } )`;
|
|
934
|
+
|
|
935
|
+
}
|
|
936
|
+
|
|
937
|
+
return `textureSampleBias( ${ textureProperty }, ${ textureProperty }_sampler, ${ uvSnippet }, ${ biasSnippet } )`;
|
|
938
|
+
|
|
939
|
+
}
|
|
705
940
|
|
|
706
941
|
} else {
|
|
707
942
|
|
|
708
|
-
|
|
943
|
+
error( `WebGPURenderer: THREE.TextureNode.biasNode does not support ${ shaderStage } shader.` );
|
|
709
944
|
|
|
710
945
|
}
|
|
711
946
|
|
|
@@ -733,7 +968,7 @@ class WGSLNodeBuilder extends NodeBuilder {
|
|
|
733
968
|
const name = node.name;
|
|
734
969
|
const type = node.type;
|
|
735
970
|
|
|
736
|
-
if ( type === 'texture' || type === 'cubeTexture' || type === 'storageTexture' || type === 'texture3D' ) {
|
|
971
|
+
if ( type === 'texture' || type === 'cubeTexture' || type === 'cubeDepthTexture' || type === 'storageTexture' || type === 'texture3D' ) {
|
|
737
972
|
|
|
738
973
|
return name;
|
|
739
974
|
|
|
@@ -805,7 +1040,7 @@ class WGSLNodeBuilder extends NodeBuilder {
|
|
|
805
1040
|
|
|
806
1041
|
if ( node.isAtomic === true ) {
|
|
807
1042
|
|
|
808
|
-
|
|
1043
|
+
warn( 'WebGPURenderer: Atomic operations are only supported in compute shaders.' );
|
|
809
1044
|
|
|
810
1045
|
return NodeAccess.READ_WRITE;
|
|
811
1046
|
|
|
@@ -859,7 +1094,7 @@ class WGSLNodeBuilder extends NodeBuilder {
|
|
|
859
1094
|
|
|
860
1095
|
const bindings = this.getBindGroupArray( groupName, shaderStage );
|
|
861
1096
|
|
|
862
|
-
if ( type === 'texture' || type === 'cubeTexture' || type === 'storageTexture' || type === 'texture3D' ) {
|
|
1097
|
+
if ( type === 'texture' || type === 'cubeTexture' || type === 'cubeDepthTexture' || type === 'storageTexture' || type === 'texture3D' ) {
|
|
863
1098
|
|
|
864
1099
|
let texture = null;
|
|
865
1100
|
|
|
@@ -877,7 +1112,7 @@ class WGSLNodeBuilder extends NodeBuilder {
|
|
|
877
1112
|
|
|
878
1113
|
}
|
|
879
1114
|
|
|
880
|
-
} else if ( type === 'cubeTexture' ) {
|
|
1115
|
+
} else if ( type === 'cubeTexture' || type === 'cubeDepthTexture' ) {
|
|
881
1116
|
|
|
882
1117
|
texture = new NodeSampledCubeTexture( uniformNode.name, uniformNode.node, group, access );
|
|
883
1118
|
|
|
@@ -888,9 +1123,13 @@ class WGSLNodeBuilder extends NodeBuilder {
|
|
|
888
1123
|
}
|
|
889
1124
|
|
|
890
1125
|
texture.store = node.isStorageTextureNode === true;
|
|
1126
|
+
texture.mipLevel = texture.store ? node.mipLevel : 0;
|
|
891
1127
|
texture.setVisibility( gpuShaderStageLib[ shaderStage ] );
|
|
892
1128
|
|
|
893
|
-
|
|
1129
|
+
// Cube textures always need samplers (they use textureSampleLevel, not textureLoad)
|
|
1130
|
+
const needsSampler = node.value.isCubeTexture === true || ( this.isUnfilterable( node.value ) === false && texture.store === false );
|
|
1131
|
+
|
|
1132
|
+
if ( needsSampler ) {
|
|
894
1133
|
|
|
895
1134
|
const sampler = new NodeSampler( `${ uniformNode.name }_sampler`, uniformNode.node, group );
|
|
896
1135
|
sampler.setVisibility( gpuShaderStageLib[ shaderStage ] );
|
|
@@ -909,10 +1148,21 @@ class WGSLNodeBuilder extends NodeBuilder {
|
|
|
909
1148
|
|
|
910
1149
|
} else if ( type === 'buffer' || type === 'storageBuffer' || type === 'indirectStorageBuffer' ) {
|
|
911
1150
|
|
|
912
|
-
const
|
|
1151
|
+
const sharedData = this.getSharedDataFromNode( node );
|
|
1152
|
+
|
|
1153
|
+
let buffer = sharedData.buffer;
|
|
1154
|
+
|
|
1155
|
+
if ( buffer === undefined ) {
|
|
913
1156
|
|
|
914
|
-
|
|
915
|
-
|
|
1157
|
+
const bufferClass = type === 'buffer' ? NodeUniformBuffer : NodeStorageBuffer;
|
|
1158
|
+
|
|
1159
|
+
buffer = new bufferClass( node, group );
|
|
1160
|
+
|
|
1161
|
+
sharedData.buffer = buffer;
|
|
1162
|
+
|
|
1163
|
+
}
|
|
1164
|
+
|
|
1165
|
+
buffer.setVisibility( buffer.getVisibility() | gpuShaderStageLib[ shaderStage ] );
|
|
916
1166
|
|
|
917
1167
|
bindings.push( buffer );
|
|
918
1168
|
|
|
@@ -922,16 +1172,19 @@ class WGSLNodeBuilder extends NodeBuilder {
|
|
|
922
1172
|
|
|
923
1173
|
} else {
|
|
924
1174
|
|
|
925
|
-
|
|
926
|
-
|
|
927
|
-
let uniformsGroup = uniformsStage[ groupName ];
|
|
1175
|
+
let uniformsGroup = this.uniformGroups[ groupName ];
|
|
928
1176
|
|
|
929
1177
|
if ( uniformsGroup === undefined ) {
|
|
930
1178
|
|
|
931
1179
|
uniformsGroup = new NodeUniformsGroup( groupName, group );
|
|
932
|
-
uniformsGroup.setVisibility(
|
|
1180
|
+
uniformsGroup.setVisibility( GPUShaderStage.VERTEX | GPUShaderStage.FRAGMENT | GPUShaderStage.COMPUTE );
|
|
1181
|
+
|
|
1182
|
+
this.uniformGroups[ groupName ] = uniformsGroup;
|
|
1183
|
+
|
|
1184
|
+
}
|
|
933
1185
|
|
|
934
|
-
|
|
1186
|
+
// Add to bindings for this stage if not already present
|
|
1187
|
+
if ( bindings.indexOf( uniformsGroup ) === - 1 ) {
|
|
935
1188
|
|
|
936
1189
|
bindings.push( uniformsGroup );
|
|
937
1190
|
|
|
@@ -939,7 +1192,15 @@ class WGSLNodeBuilder extends NodeBuilder {
|
|
|
939
1192
|
|
|
940
1193
|
uniformGPU = this.getNodeUniform( uniformNode, type );
|
|
941
1194
|
|
|
942
|
-
|
|
1195
|
+
// Only add uniform if not already present in the group (check by name to avoid duplicates across stages)
|
|
1196
|
+
const uniformName = uniformGPU.name;
|
|
1197
|
+
const alreadyExists = uniformsGroup.uniforms.some( u => u.name === uniformName );
|
|
1198
|
+
|
|
1199
|
+
if ( ! alreadyExists ) {
|
|
1200
|
+
|
|
1201
|
+
uniformsGroup.addUniform( uniformGPU );
|
|
1202
|
+
|
|
1203
|
+
}
|
|
943
1204
|
|
|
944
1205
|
}
|
|
945
1206
|
|
|
@@ -1051,7 +1312,8 @@ ${ flowData.code }
|
|
|
1051
1312
|
}
|
|
1052
1313
|
|
|
1053
1314
|
/**
|
|
1054
|
-
*
|
|
1315
|
+
* Contextually returns either the vertex stage instance index builtin
|
|
1316
|
+
* or the linearized index of an compute invocation within a grid of workgroups.
|
|
1055
1317
|
*
|
|
1056
1318
|
* @return {string} The instance index.
|
|
1057
1319
|
*/
|
|
@@ -1067,8 +1329,9 @@ ${ flowData.code }
|
|
|
1067
1329
|
|
|
1068
1330
|
}
|
|
1069
1331
|
|
|
1332
|
+
|
|
1070
1333
|
/**
|
|
1071
|
-
* Returns the invocation
|
|
1334
|
+
* Returns a builtin representing the index of a compute invocation within the scope of a workgroup load.
|
|
1072
1335
|
*
|
|
1073
1336
|
* @return {string} The invocation local index.
|
|
1074
1337
|
*/
|
|
@@ -1079,7 +1342,7 @@ ${ flowData.code }
|
|
|
1079
1342
|
}
|
|
1080
1343
|
|
|
1081
1344
|
/**
|
|
1082
|
-
* Returns the subgroup
|
|
1345
|
+
* Returns a builtin representing the size of a subgroup within the current shader.
|
|
1083
1346
|
*
|
|
1084
1347
|
* @return {string} The subgroup size.
|
|
1085
1348
|
*/
|
|
@@ -1092,7 +1355,7 @@ ${ flowData.code }
|
|
|
1092
1355
|
}
|
|
1093
1356
|
|
|
1094
1357
|
/**
|
|
1095
|
-
* Returns the invocation
|
|
1358
|
+
* Returns a builtin representing the index of a compute invocation within the scope of a subgroup.
|
|
1096
1359
|
*
|
|
1097
1360
|
* @return {string} The invocation subgroup index.
|
|
1098
1361
|
*/
|
|
@@ -1105,7 +1368,7 @@ ${ flowData.code }
|
|
|
1105
1368
|
}
|
|
1106
1369
|
|
|
1107
1370
|
/**
|
|
1108
|
-
* Returns the subgroup
|
|
1371
|
+
* Returns a builtin representing the index of a compute invocation's subgroup within its workgroup.
|
|
1109
1372
|
*
|
|
1110
1373
|
* @return {string} The subgroup index.
|
|
1111
1374
|
*/
|
|
@@ -1486,11 +1749,12 @@ ${ flowData.code }
|
|
|
1486
1749
|
* @param {string} type - The variable's type.
|
|
1487
1750
|
* @param {string} name - The variable's name.
|
|
1488
1751
|
* @param {?number} [count=null] - The array length.
|
|
1752
|
+
* @param {string} [qualifier=''] - The variable's qualifier.
|
|
1489
1753
|
* @return {string} The WGSL snippet that defines a variable.
|
|
1490
1754
|
*/
|
|
1491
|
-
getVar( type, name, count = null ) {
|
|
1755
|
+
getVar( type, name, count = null, qualifier = '' ) {
|
|
1492
1756
|
|
|
1493
|
-
let snippet = `var ${ name } : `;
|
|
1757
|
+
let snippet = `var${ qualifier } ${ name } : `;
|
|
1494
1758
|
|
|
1495
1759
|
if ( count !== null ) {
|
|
1496
1760
|
|
|
@@ -1512,7 +1776,15 @@ ${ flowData.code }
|
|
|
1512
1776
|
* @param {string} shaderStage - The shader stage.
|
|
1513
1777
|
* @return {string} The WGSL snippet that defines the variables.
|
|
1514
1778
|
*/
|
|
1515
|
-
getVars( shaderStage ) {
|
|
1779
|
+
getVars( shaderStage, global = false ) {
|
|
1780
|
+
|
|
1781
|
+
let qualifier = '';
|
|
1782
|
+
|
|
1783
|
+
if ( global ) {
|
|
1784
|
+
|
|
1785
|
+
qualifier = '<private>';
|
|
1786
|
+
|
|
1787
|
+
}
|
|
1516
1788
|
|
|
1517
1789
|
const snippets = [];
|
|
1518
1790
|
const vars = this.vars[ shaderStage ];
|
|
@@ -1521,13 +1793,13 @@ ${ flowData.code }
|
|
|
1521
1793
|
|
|
1522
1794
|
for ( const variable of vars ) {
|
|
1523
1795
|
|
|
1524
|
-
snippets.push(
|
|
1796
|
+
snippets.push( `${ this.getVar( variable.type, variable.name, variable.count, qualifier ) };` );
|
|
1525
1797
|
|
|
1526
1798
|
}
|
|
1527
1799
|
|
|
1528
1800
|
}
|
|
1529
1801
|
|
|
1530
|
-
return `\n${ snippets.join( '\n' ) }\n`;
|
|
1802
|
+
return global ? snippets.join( '\n' ) : `\n\t${ snippets.join( '\n\t' ) }\n`;
|
|
1531
1803
|
|
|
1532
1804
|
}
|
|
1533
1805
|
|
|
@@ -1543,7 +1815,7 @@ ${ flowData.code }
|
|
|
1543
1815
|
|
|
1544
1816
|
if ( shaderStage === 'vertex' ) {
|
|
1545
1817
|
|
|
1546
|
-
this.getBuiltin( 'position', '
|
|
1818
|
+
this.getBuiltin( 'position', 'builtinClipSpace', 'vec4<f32>', 'vertex' );
|
|
1547
1819
|
|
|
1548
1820
|
}
|
|
1549
1821
|
|
|
@@ -1552,13 +1824,15 @@ ${ flowData.code }
|
|
|
1552
1824
|
const varyings = this.varyings;
|
|
1553
1825
|
const vars = this.vars[ shaderStage ];
|
|
1554
1826
|
|
|
1827
|
+
let varyingIndex = 0;
|
|
1828
|
+
|
|
1555
1829
|
for ( let index = 0; index < varyings.length; index ++ ) {
|
|
1556
1830
|
|
|
1557
1831
|
const varying = varyings[ index ];
|
|
1558
1832
|
|
|
1559
1833
|
if ( varying.needsInterpolation ) {
|
|
1560
1834
|
|
|
1561
|
-
let attributesSnippet = `@location( ${
|
|
1835
|
+
let attributesSnippet = `@location( ${ varyingIndex ++ } )`;
|
|
1562
1836
|
|
|
1563
1837
|
if ( varying.interpolationType ) {
|
|
1564
1838
|
|
|
@@ -1570,7 +1844,7 @@ ${ flowData.code }
|
|
|
1570
1844
|
|
|
1571
1845
|
} else if ( /^(int|uint|ivec|uvec)/.test( varying.type ) ) {
|
|
1572
1846
|
|
|
1573
|
-
attributesSnippet +=
|
|
1847
|
+
attributesSnippet += ' @interpolate(flat, either)';
|
|
1574
1848
|
|
|
1575
1849
|
}
|
|
1576
1850
|
|
|
@@ -1619,6 +1893,7 @@ ${ flowData.code }
|
|
|
1619
1893
|
*/
|
|
1620
1894
|
getUniforms( shaderStage ) {
|
|
1621
1895
|
|
|
1896
|
+
const backend = this.renderer.backend;
|
|
1622
1897
|
const uniforms = this.uniforms[ shaderStage ];
|
|
1623
1898
|
|
|
1624
1899
|
const bindingSnippets = [];
|
|
@@ -1631,11 +1906,14 @@ ${ flowData.code }
|
|
|
1631
1906
|
const groupName = uniform.groupNode.name;
|
|
1632
1907
|
const uniformIndexes = this.bindingsIndexes[ groupName ];
|
|
1633
1908
|
|
|
1634
|
-
if ( uniform.type === 'texture' || uniform.type === 'cubeTexture' || uniform.type === 'storageTexture' || uniform.type === 'texture3D' ) {
|
|
1909
|
+
if ( uniform.type === 'texture' || uniform.type === 'cubeTexture' || uniform.type === 'cubeDepthTexture' || uniform.type === 'storageTexture' || uniform.type === 'texture3D' ) {
|
|
1635
1910
|
|
|
1636
1911
|
const texture = uniform.node.value;
|
|
1637
1912
|
|
|
1638
|
-
|
|
1913
|
+
// Cube textures always need samplers (they use textureSampleLevel, not textureLoad)
|
|
1914
|
+
const needsSampler = texture.isCubeTexture === true || ( this.isUnfilterable( texture ) === false && uniform.node.isStorageTextureNode !== true );
|
|
1915
|
+
|
|
1916
|
+
if ( needsSampler ) {
|
|
1639
1917
|
|
|
1640
1918
|
if ( this.isSampleCompare( texture ) ) {
|
|
1641
1919
|
|
|
@@ -1653,7 +1931,7 @@ ${ flowData.code }
|
|
|
1653
1931
|
|
|
1654
1932
|
let multisampled = '';
|
|
1655
1933
|
|
|
1656
|
-
const { primarySamples } =
|
|
1934
|
+
const { primarySamples } = backend.utils.getTextureSampleData( texture );
|
|
1657
1935
|
|
|
1658
1936
|
if ( primarySamples > 1 ) {
|
|
1659
1937
|
|
|
@@ -1661,13 +1939,17 @@ ${ flowData.code }
|
|
|
1661
1939
|
|
|
1662
1940
|
}
|
|
1663
1941
|
|
|
1664
|
-
if ( texture.isCubeTexture === true ) {
|
|
1942
|
+
if ( texture.isCubeTexture === true && texture.isDepthTexture === true ) {
|
|
1943
|
+
|
|
1944
|
+
textureType = 'texture_depth_cube';
|
|
1945
|
+
|
|
1946
|
+
} else if ( texture.isCubeTexture === true ) {
|
|
1665
1947
|
|
|
1666
1948
|
textureType = 'texture_cube<f32>';
|
|
1667
1949
|
|
|
1668
1950
|
} else if ( texture.isDepthTexture === true ) {
|
|
1669
1951
|
|
|
1670
|
-
if (
|
|
1952
|
+
if ( backend.compatibilityMode && texture.compareFunction === null ) {
|
|
1671
1953
|
|
|
1672
1954
|
textureType = `texture${ multisampled }_2d<f32>`;
|
|
1673
1955
|
|
|
@@ -1679,7 +1961,7 @@ ${ flowData.code }
|
|
|
1679
1961
|
|
|
1680
1962
|
} else if ( uniform.node.isStorageTextureNode === true ) {
|
|
1681
1963
|
|
|
1682
|
-
const format = getFormat( texture );
|
|
1964
|
+
const format = getFormat( texture, backend.device );
|
|
1683
1965
|
const access = this.getStorageAccess( uniform.node, shaderStage );
|
|
1684
1966
|
|
|
1685
1967
|
const is3D = uniform.node.value.is3DTexture;
|
|
@@ -1730,16 +2012,51 @@ ${ flowData.code }
|
|
|
1730
2012
|
|
|
1731
2013
|
} else {
|
|
1732
2014
|
|
|
1733
|
-
const vectorType = this.getType( this.getVectorType( uniform.type ) );
|
|
1734
2015
|
const groupName = uniform.groupNode.name;
|
|
1735
2016
|
|
|
1736
|
-
|
|
1737
|
-
|
|
1738
|
-
|
|
1739
|
-
|
|
1740
|
-
|
|
2017
|
+
// Check if this group has already been processed in this shader stage
|
|
2018
|
+
if ( uniformGroups[ groupName ] === undefined ) {
|
|
2019
|
+
|
|
2020
|
+
// Get the shared uniform group that contains uniforms from all stages
|
|
2021
|
+
const sharedUniformGroup = this.uniformGroups[ groupName ];
|
|
2022
|
+
|
|
2023
|
+
if ( sharedUniformGroup !== undefined ) {
|
|
2024
|
+
|
|
2025
|
+
// Generate snippets for ALL uniforms in this shared group
|
|
2026
|
+
const snippets = [];
|
|
2027
|
+
|
|
2028
|
+
for ( const sharedUniform of sharedUniformGroup.uniforms ) {
|
|
2029
|
+
|
|
2030
|
+
const type = sharedUniform.getType();
|
|
2031
|
+
const vectorType = this.getType( this.getVectorType( type ) );
|
|
2032
|
+
snippets.push( `\t${ sharedUniform.name } : ${ vectorType }` );
|
|
2033
|
+
|
|
2034
|
+
}
|
|
2035
|
+
|
|
2036
|
+
// Check if this group already has an assigned binding index (from another shader stage)
|
|
2037
|
+
let groupBinding = this.uniformGroupsBindings[ groupName ];
|
|
2038
|
+
|
|
2039
|
+
if ( groupBinding === undefined ) {
|
|
1741
2040
|
|
|
1742
|
-
|
|
2041
|
+
// First time processing this group - assign a new binding index
|
|
2042
|
+
groupBinding = {
|
|
2043
|
+
index: uniformIndexes.binding ++,
|
|
2044
|
+
id: uniformIndexes.group
|
|
2045
|
+
};
|
|
2046
|
+
|
|
2047
|
+
this.uniformGroupsBindings[ groupName ] = groupBinding;
|
|
2048
|
+
|
|
2049
|
+
}
|
|
2050
|
+
|
|
2051
|
+
uniformGroups[ groupName ] = {
|
|
2052
|
+
index: groupBinding.index,
|
|
2053
|
+
id: groupBinding.id,
|
|
2054
|
+
snippets: snippets
|
|
2055
|
+
};
|
|
2056
|
+
|
|
2057
|
+
}
|
|
2058
|
+
|
|
2059
|
+
}
|
|
1743
2060
|
|
|
1744
2061
|
}
|
|
1745
2062
|
|
|
@@ -1753,9 +2070,7 @@ ${ flowData.code }
|
|
|
1753
2070
|
|
|
1754
2071
|
}
|
|
1755
2072
|
|
|
1756
|
-
|
|
1757
|
-
code += bufferSnippets.join( '\n' );
|
|
1758
|
-
code += structSnippets.join( '\n' );
|
|
2073
|
+
const code = [ ...bindingSnippets, ...bufferSnippets, ...structSnippets ].join( '\n' );
|
|
1759
2074
|
|
|
1760
2075
|
return code;
|
|
1761
2076
|
|
|
@@ -1774,12 +2089,14 @@ ${ flowData.code }
|
|
|
1774
2089
|
|
|
1775
2090
|
this.shaderStage = shaderStage;
|
|
1776
2091
|
|
|
2092
|
+
const allowGlobal = this.allowGlobalVariables;
|
|
2093
|
+
|
|
1777
2094
|
const stageData = shadersData[ shaderStage ];
|
|
1778
2095
|
stageData.uniforms = this.getUniforms( shaderStage );
|
|
1779
2096
|
stageData.attributes = this.getAttributes( shaderStage );
|
|
1780
2097
|
stageData.varyings = this.getVaryings( shaderStage );
|
|
1781
2098
|
stageData.structs = this.getStructs( shaderStage );
|
|
1782
|
-
stageData.vars = this.getVars( shaderStage );
|
|
2099
|
+
stageData.vars = this.getVars( shaderStage, allowGlobal );
|
|
1783
2100
|
stageData.codes = this.getCodes( shaderStage );
|
|
1784
2101
|
stageData.directives = this.getDirectives( shaderStage );
|
|
1785
2102
|
stageData.scopedArrays = this.getScopedArrays( shaderStage );
|
|
@@ -1816,7 +2133,7 @@ ${ flowData.code }
|
|
|
1816
2133
|
|
|
1817
2134
|
if ( shaderStage === 'vertex' ) {
|
|
1818
2135
|
|
|
1819
|
-
flow += `varyings.
|
|
2136
|
+
flow += `varyings.builtinClipSpace = ${ flowSlotData.result };`;
|
|
1820
2137
|
|
|
1821
2138
|
} else if ( shaderStage === 'fragment' ) {
|
|
1822
2139
|
|
|
@@ -1829,7 +2146,7 @@ ${ flowData.code }
|
|
|
1829
2146
|
|
|
1830
2147
|
} else {
|
|
1831
2148
|
|
|
1832
|
-
let structSnippet = '\t@location(0) color: vec4<f32>';
|
|
2149
|
+
let structSnippet = '\t@location( 0 ) color: vec4<f32>';
|
|
1833
2150
|
|
|
1834
2151
|
const builtins = this.getBuiltins( 'output' );
|
|
1835
2152
|
|
|
@@ -1899,6 +2216,58 @@ ${ flowData.code }
|
|
|
1899
2216
|
|
|
1900
2217
|
}
|
|
1901
2218
|
|
|
2219
|
+
/**
|
|
2220
|
+
* Returns the bitcast method name for a given input and outputType.
|
|
2221
|
+
*
|
|
2222
|
+
* @param {string} type - The output type to bitcast to.
|
|
2223
|
+
* @return {string} The resolved WGSL bitcast invocation.
|
|
2224
|
+
*/
|
|
2225
|
+
getBitcastMethod( type ) {
|
|
2226
|
+
|
|
2227
|
+
const dataType = this.getType( type );
|
|
2228
|
+
|
|
2229
|
+
return `bitcast<${ dataType }>`;
|
|
2230
|
+
|
|
2231
|
+
}
|
|
2232
|
+
|
|
2233
|
+
/**
|
|
2234
|
+
* Returns the float packing method name for a given numeric encoding.
|
|
2235
|
+
*
|
|
2236
|
+
* @param {string} encoding - The numeric encoding that describes how the float values are mapped to the integer range.
|
|
2237
|
+
* @returns {string} The resolve WGSL float packing method name.
|
|
2238
|
+
*/
|
|
2239
|
+
getFloatPackingMethod( encoding ) {
|
|
2240
|
+
|
|
2241
|
+
return this.getMethod( `floatpack_${ encoding }_2x16` );
|
|
2242
|
+
|
|
2243
|
+
}
|
|
2244
|
+
|
|
2245
|
+
/**
|
|
2246
|
+
* Returns the float unpacking method name for a given numeric encoding.
|
|
2247
|
+
*
|
|
2248
|
+
* @param {string} encoding - The numeric encoding that describes how the integer values are mapped to the float range.
|
|
2249
|
+
* @returns {string} The resolve WGSL float unpacking method name.
|
|
2250
|
+
*/
|
|
2251
|
+
getFloatUnpackingMethod( encoding ) {
|
|
2252
|
+
|
|
2253
|
+
return this.getMethod( `floatunpack_${ encoding }_2x16` );
|
|
2254
|
+
|
|
2255
|
+
}
|
|
2256
|
+
|
|
2257
|
+
/**
|
|
2258
|
+
* Returns the native snippet for a ternary operation.
|
|
2259
|
+
*
|
|
2260
|
+
* @param {string} condSnippet - The condition determining which expression gets resolved.
|
|
2261
|
+
* @param {string} ifSnippet - The expression to resolve to if the condition is true.
|
|
2262
|
+
* @param {string} elseSnippet - The expression to resolve to if the condition is false.
|
|
2263
|
+
* @return {string} The resolved method name.
|
|
2264
|
+
*/
|
|
2265
|
+
getTernary( condSnippet, ifSnippet, elseSnippet ) {
|
|
2266
|
+
|
|
2267
|
+
return `select( ${elseSnippet}, ${ifSnippet}, ${condSnippet} )`;
|
|
2268
|
+
|
|
2269
|
+
}
|
|
2270
|
+
|
|
1902
2271
|
/**
|
|
1903
2272
|
* Returns the WGSL type of the given node data type.
|
|
1904
2273
|
*
|
|
@@ -1973,11 +2342,7 @@ ${ flowData.code }
|
|
|
1973
2342
|
const codeNode = wgslPolyfill[ name ];
|
|
1974
2343
|
codeNode.build( this );
|
|
1975
2344
|
|
|
1976
|
-
|
|
1977
|
-
|
|
1978
|
-
this.currentFunctionNode.includes.push( codeNode );
|
|
1979
|
-
|
|
1980
|
-
}
|
|
2345
|
+
this.addInclude( codeNode );
|
|
1981
2346
|
|
|
1982
2347
|
return codeNode;
|
|
1983
2348
|
|
|
@@ -2006,15 +2371,15 @@ ${shaderData.uniforms}
|
|
|
2006
2371
|
${shaderData.varyings}
|
|
2007
2372
|
var<private> varyings : VaryingsStruct;
|
|
2008
2373
|
|
|
2374
|
+
// vars
|
|
2375
|
+
${shaderData.vars}
|
|
2376
|
+
|
|
2009
2377
|
// codes
|
|
2010
2378
|
${shaderData.codes}
|
|
2011
2379
|
|
|
2012
2380
|
@vertex
|
|
2013
2381
|
fn main( ${shaderData.attributes} ) -> VaryingsStruct {
|
|
2014
2382
|
|
|
2015
|
-
// vars
|
|
2016
|
-
${shaderData.vars}
|
|
2017
|
-
|
|
2018
2383
|
// flow
|
|
2019
2384
|
${shaderData.flow}
|
|
2020
2385
|
|
|
@@ -2044,15 +2409,15 @@ ${shaderData.structs}
|
|
|
2044
2409
|
// uniforms
|
|
2045
2410
|
${shaderData.uniforms}
|
|
2046
2411
|
|
|
2412
|
+
// vars
|
|
2413
|
+
${shaderData.vars}
|
|
2414
|
+
|
|
2047
2415
|
// codes
|
|
2048
2416
|
${shaderData.codes}
|
|
2049
2417
|
|
|
2050
2418
|
@fragment
|
|
2051
2419
|
fn main( ${shaderData.varyings} ) -> ${shaderData.returnType} {
|
|
2052
2420
|
|
|
2053
|
-
// vars
|
|
2054
|
-
${shaderData.vars}
|
|
2055
|
-
|
|
2056
2421
|
// flow
|
|
2057
2422
|
${shaderData.flow}
|
|
2058
2423
|
|
|
@@ -2089,20 +2454,23 @@ ${ shaderData.structs }
|
|
|
2089
2454
|
// uniforms
|
|
2090
2455
|
${ shaderData.uniforms }
|
|
2091
2456
|
|
|
2457
|
+
// vars
|
|
2458
|
+
${ this.allowGlobalVariables ? shaderData.vars : '' }
|
|
2459
|
+
|
|
2092
2460
|
// codes
|
|
2093
2461
|
${ shaderData.codes }
|
|
2094
2462
|
|
|
2095
2463
|
@compute @workgroup_size( ${ workgroupSizeX }, ${ workgroupSizeY }, ${ workgroupSizeZ } )
|
|
2096
2464
|
fn main( ${ shaderData.attributes } ) {
|
|
2097
2465
|
|
|
2466
|
+
// local vars
|
|
2467
|
+
${ this.allowGlobalVariables ? '' : shaderData.vars }
|
|
2468
|
+
|
|
2098
2469
|
// system
|
|
2099
2470
|
instanceIndex = globalId.x
|
|
2100
2471
|
+ globalId.y * ( ${ workgroupSizeX } * numWorkgroups.x )
|
|
2101
2472
|
+ globalId.z * ( ${ workgroupSizeX } * numWorkgroups.x ) * ( ${ workgroupSizeY } * numWorkgroups.y );
|
|
2102
2473
|
|
|
2103
|
-
// vars
|
|
2104
|
-
${ shaderData.vars }
|
|
2105
|
-
|
|
2106
2474
|
// flow
|
|
2107
2475
|
${ shaderData.flow }
|
|
2108
2476
|
|