super-three 0.181.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 +13152 -11354
- package/build/three.core.js +12319 -11539
- package/build/three.core.min.js +2 -2
- package/build/three.module.js +1808 -781
- package/build/three.module.min.js +2 -2
- package/build/three.tsl.js +27 -13
- package/build/three.tsl.min.js +2 -2
- package/build/three.webgpu.js +10523 -6263
- package/build/three.webgpu.min.js +2 -2
- package/build/three.webgpu.nodes.js +10484 -6262
- package/build/three.webgpu.nodes.min.js +2 -2
- package/examples/jsm/Addons.js +11 -3
- package/examples/jsm/animation/CCDIKSolver.js +7 -3
- package/examples/jsm/controls/ArcballControls.js +7 -4
- package/examples/jsm/controls/DragControls.js +2 -2
- package/examples/jsm/controls/FirstPersonControls.js +58 -54
- package/examples/jsm/controls/FlyControls.js +4 -0
- package/examples/jsm/controls/MapControls.js +55 -1
- package/examples/jsm/controls/OrbitControls.js +111 -8
- package/examples/jsm/controls/TrackballControls.js +8 -8
- package/examples/jsm/controls/TransformControls.js +34 -2
- 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/environments/ColorEnvironment.js +59 -0
- package/examples/jsm/environments/RoomEnvironment.js +3 -0
- package/examples/jsm/exporters/EXRExporter.js +1 -1
- package/examples/jsm/exporters/GLTFExporter.js +152 -9
- package/examples/jsm/exporters/USDZExporter.js +22 -3
- package/examples/jsm/geometries/DecalGeometry.js +1 -1
- package/examples/jsm/geometries/TextGeometry.js +18 -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 +67 -8
- package/examples/jsm/inspector/Extension.js +13 -0
- package/examples/jsm/inspector/Inspector.js +203 -88
- package/examples/jsm/inspector/RendererInspector.js +14 -4
- 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 +41 -7
- package/examples/jsm/inspector/tabs/Memory.js +128 -0
- package/examples/jsm/inspector/tabs/Parameters.js +51 -3
- package/examples/jsm/inspector/tabs/Performance.js +4 -4
- 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 +107 -5
- package/examples/jsm/inspector/ui/Graph.js +2 -2
- package/examples/jsm/inspector/ui/List.js +1 -1
- package/examples/jsm/inspector/ui/Profiler.js +1936 -34
- package/examples/jsm/inspector/ui/Style.js +1044 -31
- package/examples/jsm/inspector/ui/Tab.js +222 -3
- package/examples/jsm/inspector/ui/Values.js +55 -2
- package/examples/jsm/inspector/ui/utils.js +13 -0
- package/examples/jsm/interaction/InteractionManager.js +226 -0
- 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/lines/LineMaterial.js +7 -1
- package/examples/jsm/loaders/3DMLoader.js +5 -4
- package/examples/jsm/loaders/3MFLoader.js +2 -2
- package/examples/jsm/loaders/AMFLoader.js +2 -2
- package/examples/jsm/loaders/ColladaLoader.js +24 -4026
- package/examples/jsm/loaders/DRACOLoader.js +5 -5
- package/examples/jsm/loaders/EXRLoader.js +687 -48
- package/examples/jsm/loaders/FBXLoader.js +235 -37
- package/examples/jsm/loaders/GCodeLoader.js +34 -8
- package/examples/jsm/loaders/GLTFLoader.js +146 -178
- package/examples/jsm/loaders/HDRLoader.js +1 -2
- package/examples/jsm/loaders/KMZLoader.js +5 -5
- package/examples/jsm/loaders/KTX2Loader.js +27 -5
- package/examples/jsm/loaders/LDrawLoader.js +41 -50
- package/examples/jsm/loaders/LWOLoader.js +7 -39
- package/examples/jsm/loaders/NRRDLoader.js +2 -2
- package/examples/jsm/loaders/PCDLoader.js +4 -2
- package/examples/jsm/loaders/SVGLoader.js +2 -2
- package/examples/jsm/loaders/TDSLoader.js +0 -2
- package/examples/jsm/loaders/TGALoader.js +0 -2
- package/examples/jsm/loaders/USDLoader.js +100 -40
- package/examples/jsm/loaders/UltraHDRLoader.js +285 -160
- package/examples/jsm/loaders/VOXLoader.js +660 -117
- package/examples/jsm/loaders/VRMLLoader.js +79 -2
- package/examples/jsm/loaders/VTKLoader.js +42 -25
- package/examples/jsm/loaders/collada/ColladaComposer.js +3044 -0
- package/examples/jsm/loaders/collada/ColladaParser.js +1977 -0
- 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 +11 -11
- package/examples/jsm/math/Octree.js +131 -1
- package/examples/jsm/misc/GPUComputationRenderer.js +2 -0
- package/examples/jsm/misc/RollerCoaster.js +42 -4
- package/examples/jsm/misc/Volume.js +0 -1
- package/examples/jsm/misc/VolumeSlice.js +0 -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/Sky.js +90 -6
- package/examples/jsm/objects/SkyMesh.js +150 -16
- package/examples/jsm/objects/Water.js +4 -3
- package/examples/jsm/objects/Water2.js +5 -3
- package/examples/jsm/objects/WaterMesh.js +5 -7
- package/examples/jsm/physics/AmmoPhysics.js +12 -7
- package/examples/jsm/physics/JoltPhysics.js +10 -6
- package/examples/jsm/physics/RapierPhysics.js +9 -5
- package/examples/jsm/postprocessing/EffectComposer.js +7 -5
- package/examples/jsm/postprocessing/OutputPass.js +9 -0
- package/examples/jsm/postprocessing/RenderPass.js +10 -0
- package/examples/jsm/postprocessing/RenderTransitionPass.js +1 -1
- package/examples/jsm/postprocessing/UnrealBloomPass.js +48 -18
- package/examples/jsm/renderers/CSS3DRenderer.js +1 -1
- package/examples/jsm/renderers/Projector.js +246 -28
- package/examples/jsm/renderers/SVGRenderer.js +174 -60
- package/examples/jsm/shaders/GTAOShader.js +19 -6
- package/examples/jsm/shaders/HalftoneShader.js +12 -1
- package/examples/jsm/shaders/PoissonDenoiseShader.js +6 -2
- package/examples/jsm/shaders/SAOShader.js +17 -4
- package/examples/jsm/shaders/SSAOShader.js +11 -1
- package/examples/jsm/shaders/SSRShader.js +6 -5
- package/examples/jsm/shaders/UnpackDepthRGBAShader.js +2 -4
- package/examples/jsm/shaders/VignetteShader.js +1 -1
- package/examples/jsm/transpiler/AST.js +44 -0
- package/examples/jsm/transpiler/GLSLDecoder.js +63 -6
- package/examples/jsm/transpiler/ShaderToyDecoder.js +2 -0
- package/examples/jsm/transpiler/TSLEncoder.js +46 -3
- package/examples/jsm/transpiler/TranspilerUtils.js +3 -3
- package/examples/jsm/transpiler/WGSLEncoder.js +27 -0
- package/examples/jsm/tsl/WebGLNodesHandler.js +605 -0
- package/examples/jsm/tsl/display/AfterImageNode.js +11 -1
- package/examples/jsm/tsl/display/AnaglyphPassNode.js +458 -16
- package/examples/jsm/tsl/display/AnamorphicNode.js +12 -1
- package/examples/jsm/tsl/display/BilateralBlurNode.js +374 -0
- package/examples/jsm/tsl/display/BloomNode.js +16 -6
- package/examples/jsm/tsl/display/CRT.js +150 -0
- package/examples/jsm/tsl/display/ChromaticAberrationNode.js +3 -36
- package/examples/jsm/tsl/display/DenoiseNode.js +1 -1
- package/examples/jsm/tsl/display/DepthOfFieldNode.js +1 -1
- package/examples/jsm/tsl/display/DotScreenNode.js +1 -1
- package/examples/jsm/tsl/display/FSR1Node.js +477 -0
- package/examples/jsm/tsl/display/FXAANode.js +2 -2
- package/examples/jsm/tsl/display/GTAONode.js +6 -4
- package/examples/jsm/tsl/display/GaussianBlurNode.js +21 -2
- 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 +69 -19
- package/examples/jsm/tsl/display/ParallaxBarrierPassNode.js +2 -2
- package/examples/jsm/tsl/display/PixelationPassNode.js +7 -6
- package/examples/jsm/tsl/display/RGBShiftNode.js +2 -2
- package/examples/jsm/tsl/display/RetroPassNode.js +263 -0
- package/examples/jsm/tsl/display/SMAANode.js +2 -2
- package/examples/jsm/tsl/display/SSAAPassNode.js +2 -2
- package/examples/jsm/tsl/display/SSGINode.js +8 -24
- package/examples/jsm/tsl/display/SSRNode.js +8 -8
- package/examples/jsm/tsl/display/SSSNode.js +6 -4
- package/examples/jsm/tsl/display/Shape.js +29 -0
- package/examples/jsm/tsl/display/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 +315 -126
- package/examples/jsm/tsl/display/TransitionNode.js +1 -1
- package/examples/jsm/tsl/display/depthAwareBlend.js +80 -0
- package/examples/jsm/tsl/display/radialBlur.js +68 -0
- package/examples/jsm/tsl/lighting/DynamicLightsNode.js +300 -0
- 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 +2 -3
- 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 +1 -1
- package/examples/jsm/utils/SkeletonUtils.js +14 -8
- package/examples/jsm/utils/WebGPUTextureUtils.js +1 -1
- package/examples/jsm/webxr/XRHandMeshModel.js +36 -10
- package/examples/jsm/webxr/XRHandModelFactory.js +2 -1
- package/package.json +24 -30
- package/src/Three.Core.js +3 -1
- package/src/Three.TSL.js +25 -11
- package/src/Three.WebGPU.Nodes.js +5 -0
- package/src/Three.WebGPU.js +9 -0
- package/src/Three.js +1 -0
- package/src/animation/AnimationAction.js +12 -2
- package/src/animation/AnimationClip.js +1 -1
- package/src/animation/AnimationMixer.js +6 -0
- package/src/animation/AnimationUtils.js +1 -12
- package/src/animation/KeyframeTrack.js +47 -8
- package/src/animation/PropertyMixer.js +4 -4
- package/src/animation/tracks/BooleanKeyframeTrack.js +1 -1
- package/src/animation/tracks/ColorKeyframeTrack.js +1 -1
- package/src/animation/tracks/NumberKeyframeTrack.js +1 -1
- package/src/animation/tracks/QuaternionKeyframeTrack.js +1 -1
- package/src/animation/tracks/StringKeyframeTrack.js +1 -1
- package/src/animation/tracks/VectorKeyframeTrack.js +1 -1
- package/src/audio/Audio.js +1 -1
- package/src/audio/AudioContext.js +2 -2
- package/src/audio/AudioListener.js +5 -3
- package/src/cameras/Camera.js +32 -2
- package/src/cameras/CubeCamera.js +20 -0
- package/src/constants.js +90 -5
- package/src/core/BufferAttribute.js +13 -1
- package/src/core/BufferGeometry.js +14 -2
- package/src/core/Clock.js +7 -0
- package/src/core/Object3D.js +52 -4
- package/src/core/Raycaster.js +2 -2
- package/src/core/RenderTarget.js +4 -4
- package/src/extras/PMREMGenerator.js +7 -18
- package/src/extras/TextureUtils.js +5 -1
- package/src/extras/curves/CatmullRomCurve3.js +3 -2
- package/src/geometries/ExtrudeGeometry.js +2 -2
- package/src/geometries/PolyhedronGeometry.js +1 -1
- package/src/geometries/TorusGeometry.js +8 -3
- package/src/helpers/CameraHelper.js +3 -0
- package/src/helpers/DirectionalLightHelper.js +4 -1
- package/src/helpers/HemisphereLightHelper.js +3 -0
- package/src/helpers/PointLightHelper.js +1 -25
- package/src/helpers/SpotLightHelper.js +3 -0
- package/src/lights/DirectionalLight.js +13 -0
- package/src/lights/HemisphereLight.js +10 -0
- package/src/lights/Light.js +1 -11
- package/src/lights/LightProbe.js +0 -15
- package/src/lights/LightShadow.js +15 -6
- package/src/lights/PointLight.js +15 -0
- package/src/lights/PointLightShadow.js +0 -86
- package/src/lights/SpotLight.js +22 -1
- package/src/lights/webgpu/IESSpotLight.js +2 -1
- package/src/loaders/AudioLoader.js +11 -1
- package/src/loaders/Cache.js +28 -0
- package/src/loaders/DataTextureLoader.js +6 -4
- package/src/loaders/FileLoader.js +2 -3
- package/src/loaders/ImageBitmapLoader.js +12 -9
- package/src/loaders/Loader.js +6 -0
- package/src/loaders/MaterialLoader.js +3 -2
- package/src/loaders/ObjectLoader.js +46 -6
- package/src/loaders/nodes/NodeLoader.js +2 -2
- package/src/loaders/nodes/NodeObjectLoader.js +18 -0
- package/src/materials/Material.js +2 -0
- package/src/materials/MeshLambertMaterial.js +9 -0
- package/src/materials/MeshPhongMaterial.js +9 -0
- package/src/materials/MeshToonMaterial.js +1 -1
- package/src/materials/ShaderMaterial.js +20 -1
- package/src/materials/nodes/Line2NodeMaterial.js +34 -7
- package/src/materials/nodes/MeshPhysicalNodeMaterial.js +5 -2
- package/src/materials/nodes/MeshStandardNodeMaterial.js +5 -4
- package/src/materials/nodes/NodeMaterial.js +45 -25
- package/src/materials/nodes/manager/NodeMaterialObserver.js +191 -86
- package/src/math/Line3.js +6 -5
- package/src/math/MathUtils.js +10 -10
- package/src/math/Matrix2.js +13 -9
- package/src/math/Matrix3.js +13 -9
- package/src/math/Matrix4.js +87 -74
- package/src/math/Plane.js +4 -3
- package/src/math/Quaternion.js +3 -29
- package/src/math/Sphere.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 -68
- package/src/nodes/TSL.js +7 -7
- 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 +29 -2
- package/src/nodes/accessors/Camera.js +149 -28
- package/src/nodes/accessors/ClippingNode.js +4 -4
- package/src/nodes/accessors/CubeTextureNode.js +27 -2
- package/src/nodes/accessors/InstanceNode.js +148 -43
- 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 +11 -11
- package/src/nodes/accessors/Object3DNode.js +1 -1
- package/src/nodes/accessors/Position.js +34 -2
- package/src/nodes/accessors/ReferenceBaseNode.js +6 -6
- package/src/nodes/accessors/ReferenceNode.js +8 -8
- 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 -25
- package/src/nodes/accessors/StorageTextureNode.js +40 -9
- package/src/nodes/accessors/Tangent.js +4 -14
- package/src/nodes/accessors/Texture3DNode.js +32 -35
- package/src/nodes/accessors/TextureNode.js +67 -23
- 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 +1 -1
- package/src/nodes/code/FunctionNode.js +2 -3
- package/src/nodes/core/ArrayNode.js +21 -2
- package/src/nodes/core/AssignNode.js +3 -3
- package/src/nodes/core/AttributeNode.js +3 -3
- package/src/nodes/core/BypassNode.js +1 -1
- package/src/nodes/core/ContextNode.js +104 -5
- package/src/nodes/core/IndexNode.js +2 -1
- package/src/nodes/core/InputNode.js +1 -1
- package/src/nodes/core/InspectorNode.js +1 -1
- package/src/nodes/core/IsolateNode.js +1 -1
- package/src/nodes/core/MRTNode.js +48 -2
- package/src/nodes/core/Node.js +112 -15
- package/src/nodes/core/NodeBuilder.js +284 -66
- package/src/nodes/core/NodeError.js +28 -0
- package/src/nodes/core/NodeFrame.js +12 -4
- package/src/nodes/core/NodeUtils.js +11 -9
- package/src/nodes/core/OutputStructNode.js +12 -10
- package/src/nodes/core/ParameterNode.js +4 -4
- package/src/nodes/core/PropertyNode.js +19 -3
- package/src/nodes/core/StackNode.js +66 -17
- package/src/nodes/core/StackTrace.js +139 -0
- package/src/nodes/core/StructNode.js +17 -3
- package/src/nodes/core/StructTypeNode.js +12 -18
- package/src/nodes/core/SubBuildNode.js +2 -2
- package/src/nodes/core/UniformGroupNode.js +36 -6
- package/src/nodes/core/UniformNode.js +21 -5
- package/src/nodes/core/VarNode.js +48 -23
- package/src/nodes/core/VaryingNode.js +2 -19
- package/src/nodes/display/BlendModes.js +0 -64
- package/src/nodes/display/ColorAdjustment.js +17 -0
- package/src/nodes/display/ColorSpaceNode.js +3 -3
- package/src/nodes/display/NormalMapNode.js +39 -4
- package/src/nodes/display/PassNode.js +125 -16
- package/src/nodes/display/RenderOutputNode.js +7 -7
- package/src/nodes/display/ScreenNode.js +4 -2
- package/src/nodes/display/ToneMappingNode.js +1 -1
- package/src/nodes/display/ToonOutlinePassNode.js +2 -2
- package/src/nodes/display/ViewportDepthNode.js +52 -4
- package/src/nodes/display/ViewportDepthTextureNode.js +11 -15
- package/src/nodes/display/ViewportTextureNode.js +39 -11
- package/src/nodes/fog/Fog.js +18 -35
- package/src/nodes/functions/BSDF/BRDF_GGX_Multiscatter.js +3 -3
- package/src/nodes/functions/BSDF/DFGLUT.js +56 -0
- package/src/nodes/functions/BSDF/EnvironmentBRDF.js +2 -2
- package/src/nodes/functions/BSDF/V_GGX_SmithCorrelated_Anisotropic.js +2 -2
- package/src/nodes/functions/PhysicalLightingModel.js +126 -45
- package/src/nodes/geometry/RangeNode.js +5 -3
- package/src/nodes/gpgpu/AtomicFunctionNode.js +1 -1
- package/src/nodes/gpgpu/BarrierNode.js +9 -0
- package/src/nodes/gpgpu/ComputeBuiltinNode.js +2 -3
- package/src/nodes/gpgpu/ComputeNode.js +74 -48
- package/src/nodes/gpgpu/SubgroupFunctionNode.js +2 -2
- package/src/nodes/gpgpu/WorkgroupInfoNode.js +4 -4
- package/src/nodes/lighting/AnalyticLightNode.js +53 -0
- package/src/nodes/lighting/EnvironmentNode.js +28 -3
- package/src/nodes/lighting/LightsNode.js +7 -28
- package/src/nodes/lighting/PointShadowNode.js +162 -149
- package/src/nodes/lighting/ShadowFilterNode.js +53 -65
- package/src/nodes/lighting/ShadowNode.js +120 -42
- package/src/nodes/math/BitcastNode.js +1 -1
- package/src/nodes/math/BitcountNode.js +433 -0
- package/src/nodes/math/ConditionalNode.js +3 -3
- package/src/nodes/math/MathNode.js +76 -41
- package/src/nodes/math/OperatorNode.js +3 -2
- package/src/nodes/math/PackFloatNode.js +98 -0
- package/src/nodes/math/UnpackFloatNode.js +96 -0
- package/src/nodes/pmrem/PMREMNode.js +1 -1
- package/src/nodes/pmrem/PMREMUtils.js +9 -15
- package/src/nodes/tsl/TSLBase.js +1 -1
- package/src/nodes/tsl/TSLCore.js +38 -17
- package/src/nodes/utils/ArrayElementNode.js +14 -1
- package/src/nodes/utils/ConvertNode.js +1 -1
- package/src/nodes/utils/DebugNode.js +12 -12
- package/src/nodes/utils/EventNode.js +31 -2
- package/src/nodes/utils/FlipNode.js +1 -1
- package/src/nodes/utils/FunctionOverloadingNode.js +1 -1
- package/src/nodes/utils/JoinNode.js +3 -3
- package/src/nodes/utils/LoopNode.js +1 -1
- package/src/nodes/utils/MemberNode.js +2 -2
- package/src/nodes/utils/Packing.js +13 -1
- package/src/nodes/utils/PostProcessingUtils.js +33 -1
- package/src/nodes/utils/RTTNode.js +1 -1
- package/src/nodes/utils/ReflectorNode.js +3 -4
- package/src/nodes/utils/Remap.js +48 -0
- package/src/nodes/utils/RotateNode.js +1 -1
- package/src/nodes/utils/SampleNode.js +1 -1
- package/src/nodes/utils/SetNode.js +1 -1
- package/src/nodes/utils/SplitNode.js +1 -1
- package/src/nodes/utils/SpriteSheetUV.js +35 -0
- package/src/nodes/utils/UVUtils.js +28 -0
- package/src/objects/BatchedMesh.js +44 -16
- package/src/objects/InstancedMesh.js +30 -3
- package/src/objects/Line.js +1 -1
- package/src/objects/Mesh.js +1 -1
- package/src/objects/Points.js +1 -1
- package/src/objects/Skeleton.js +9 -0
- package/src/objects/SkinnedMesh.js +26 -9
- package/src/renderers/WebGLRenderer.js +329 -145
- package/src/renderers/common/Animation.js +3 -3
- package/src/renderers/common/Attributes.js +15 -1
- package/src/renderers/common/Backend.js +29 -8
- package/src/renderers/common/Background.js +26 -13
- package/src/renderers/common/BindGroup.js +1 -16
- package/src/renderers/common/Binding.js +11 -0
- package/src/renderers/common/Bindings.js +29 -14
- package/src/renderers/common/BlendMode.js +143 -0
- package/src/renderers/common/Buffer.js +40 -0
- package/src/renderers/common/BundleGroup.js +1 -1
- package/src/renderers/common/ChainMap.js +30 -6
- package/src/renderers/common/ComputePipeline.js +1 -1
- package/src/renderers/common/CubeRenderTarget.js +51 -7
- package/src/renderers/common/Geometries.js +29 -3
- package/src/renderers/common/Info.js +333 -4
- package/src/renderers/common/InspectorBase.js +6 -1
- package/src/renderers/common/Lighting.js +5 -21
- package/src/renderers/common/Pipelines.js +40 -7
- package/src/renderers/common/PostProcessing.js +8 -206
- 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 +16 -0
- package/src/renderers/common/RenderContexts.js +33 -49
- package/src/renderers/common/RenderLists.js +2 -1
- package/src/renderers/common/RenderObject.js +17 -5
- package/src/renderers/common/RenderObjectPipeline.js +40 -0
- package/src/renderers/common/RenderObjects.js +21 -5
- package/src/renderers/common/RenderPipeline.js +232 -17
- package/src/renderers/common/Renderer.js +481 -117
- package/src/renderers/common/Sampler.js +4 -4
- package/src/renderers/common/StorageBuffer.js +13 -1
- package/src/renderers/common/Textures.js +89 -4
- package/src/renderers/common/TimestampQueryPool.js +5 -3
- package/src/renderers/common/Uniform.js +8 -0
- package/src/renderers/common/UniformsGroup.js +62 -1
- package/src/renderers/common/XRManager.js +37 -29
- package/src/renderers/common/extras/PMREMGenerator.js +25 -23
- package/src/renderers/common/nodes/NodeBuilderState.js +1 -1
- package/src/renderers/common/nodes/{Nodes.js → NodeManager.js} +242 -99
- package/src/renderers/common/nodes/NodeStorageBuffer.js +13 -2
- package/src/renderers/common/nodes/NodeUniformBuffer.js +52 -0
- package/src/renderers/shaders/DFGLUTData.js +19 -34
- package/src/renderers/shaders/ShaderChunk/batching_pars_vertex.glsl.js +2 -2
- package/src/renderers/shaders/ShaderChunk/color_fragment.glsl.js +1 -5
- package/src/renderers/shaders/ShaderChunk/color_pars_fragment.glsl.js +1 -5
- package/src/renderers/shaders/ShaderChunk/color_pars_vertex.glsl.js +1 -5
- package/src/renderers/shaders/ShaderChunk/color_vertex.glsl.js +8 -10
- package/src/renderers/shaders/ShaderChunk/envmap_common_pars_fragment.glsl.js +0 -1
- package/src/renderers/shaders/ShaderChunk/envmap_fragment.glsl.js +8 -12
- 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 +112 -53
- 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 +225 -186
- 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 +3 -0
- package/src/renderers/shaders/ShaderLib/{distanceRGBA.glsl.js → distance.glsl.js} +1 -2
- package/src/renderers/shaders/ShaderLib/meshlambert.glsl.js +2 -1
- package/src/renderers/shaders/ShaderLib/meshnormal.glsl.js +1 -2
- package/src/renderers/shaders/ShaderLib/meshphong.glsl.js +2 -1
- package/src/renderers/shaders/ShaderLib/meshphysical.glsl.js +4 -9
- package/src/renderers/shaders/ShaderLib/meshtoon.glsl.js +0 -1
- package/src/renderers/shaders/ShaderLib/shadow.glsl.js +1 -1
- package/src/renderers/shaders/ShaderLib/vsm.glsl.js +4 -6
- package/src/renderers/shaders/ShaderLib.js +7 -6
- package/src/renderers/shaders/UniformsLib.js +7 -5
- package/src/renderers/shaders/UniformsUtils.js +27 -5
- 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 +9 -4
- package/src/renderers/webgl/WebGLEnvironments.js +228 -0
- package/src/renderers/webgl/WebGLGeometries.js +10 -7
- package/src/renderers/webgl/WebGLIndexedBufferRenderer.js +0 -32
- 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 +49 -109
- package/src/renderers/webgl/WebGLPrograms.js +63 -51
- package/src/renderers/webgl/WebGLRenderLists.js +15 -0
- package/src/renderers/webgl/WebGLRenderStates.js +13 -2
- package/src/renderers/webgl/WebGLShadowMap.js +188 -24
- package/src/renderers/webgl/WebGLState.js +75 -37
- package/src/renderers/webgl/WebGLTextures.js +215 -54
- package/src/renderers/webgl/WebGLUniforms.js +40 -3
- package/src/renderers/webgl/WebGLUniformsGroups.js +19 -0
- package/src/renderers/webgl/WebGLUtils.js +6 -2
- package/src/renderers/webgl-fallback/WebGLBackend.js +253 -82
- package/src/renderers/webgl-fallback/WebGLBufferRenderer.js +0 -41
- package/src/renderers/webgl-fallback/nodes/GLSLNodeBuilder.js +173 -74
- 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/WebGLState.js +223 -6
- package/src/renderers/webgl-fallback/utils/WebGLTextureUtils.js +68 -53
- package/src/renderers/webgl-fallback/utils/WebGLTimestampQueryPool.js +10 -10
- package/src/renderers/webgl-fallback/utils/WebGLUtils.js +6 -2
- package/src/renderers/webgpu/WebGPUBackend.js +260 -140
- package/src/renderers/webgpu/WebGPURenderer.js +2 -1
- package/src/renderers/webgpu/nodes/WGSLNodeBuilder.js +366 -90
- package/src/renderers/webgpu/utils/WebGPUAttributeUtils.js +107 -34
- package/src/renderers/webgpu/utils/WebGPUBindingUtils.js +357 -200
- package/src/renderers/webgpu/utils/WebGPUCapabilities.js +48 -0
- package/src/renderers/webgpu/utils/WebGPUConstants.js +10 -0
- package/src/renderers/webgpu/utils/WebGPUPipelineUtils.js +61 -23
- package/src/renderers/webgpu/utils/WebGPUTexturePassUtils.js +152 -200
- package/src/renderers/webgpu/utils/WebGPUTextureUtils.js +156 -59
- package/src/renderers/webgpu/utils/WebGPUTimestampQueryPool.js +7 -7
- package/src/renderers/webgpu/utils/WebGPUUtils.js +33 -11
- package/src/renderers/webxr/WebXRController.js +12 -0
- package/src/renderers/webxr/WebXRManager.js +4 -2
- package/src/textures/CubeDepthTexture.js +76 -0
- package/src/textures/HTMLTexture.js +74 -0
- package/src/textures/Source.js +2 -2
- package/src/textures/Texture.js +16 -5
- package/src/utils.js +280 -3
- package/examples/jsm/materials/MeshGouraudMaterial.js +0 -434
- package/examples/jsm/materials/MeshPostProcessingMaterial.js +0 -167
- package/examples/jsm/shaders/GodRaysShader.js +0 -333
- package/src/nodes/accessors/SceneNode.js +0 -145
- package/src/nodes/code/ScriptableNode.js +0 -726
- package/src/nodes/code/ScriptableValueNode.js +0 -253
- package/src/nodes/display/PosterizeNode.js +0 -65
- package/src/nodes/functions/BSDF/DFGApprox.js +0 -71
- package/src/nodes/utils/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,11 +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
20
|
import { warn, error } from '../../../utils.js';
|
|
21
21
|
|
|
22
|
-
|
|
23
|
-
const GPUShaderStage = ( typeof self !== 'undefined' ) ? self.GPUShaderStage : { VERTEX: 1, FRAGMENT: 2, COMPUTE: 4 };
|
|
22
|
+
import { GPUShaderStage } from '../utils/WebGPUConstants.js';
|
|
24
23
|
|
|
25
24
|
const accessNames = {
|
|
26
25
|
[ NodeAccess.READ_ONLY ]: 'read',
|
|
@@ -35,9 +34,9 @@ const wrapNames = {
|
|
|
35
34
|
};
|
|
36
35
|
|
|
37
36
|
const gpuShaderStageLib = {
|
|
38
|
-
'vertex': GPUShaderStage
|
|
39
|
-
'fragment': GPUShaderStage
|
|
40
|
-
'compute': GPUShaderStage
|
|
37
|
+
'vertex': GPUShaderStage.VERTEX,
|
|
38
|
+
'fragment': GPUShaderStage.FRAGMENT,
|
|
39
|
+
'compute': GPUShaderStage.COMPUTE
|
|
41
40
|
};
|
|
42
41
|
|
|
43
42
|
const supports = {
|
|
@@ -113,6 +112,29 @@ fn tsl_biquadraticTexture( map : texture_2d<f32>, coord : vec2f, iRes : vec2u, l
|
|
|
113
112
|
|
|
114
113
|
return mix( mix( rg1, rg2, f.x ), mix( rg3, rg4, f.x ), f.y );
|
|
115
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
|
+
|
|
116
138
|
}
|
|
117
139
|
` )
|
|
118
140
|
};
|
|
@@ -129,7 +151,13 @@ const wgslMethods = {
|
|
|
129
151
|
equals_bvec3: 'tsl_equals_bvec3',
|
|
130
152
|
equals_bvec4: 'tsl_equals_bvec4',
|
|
131
153
|
inversesqrt: 'inverseSqrt',
|
|
132
|
-
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'
|
|
133
161
|
};
|
|
134
162
|
|
|
135
163
|
//
|
|
@@ -172,6 +200,14 @@ class WGSLNodeBuilder extends NodeBuilder {
|
|
|
172
200
|
*/
|
|
173
201
|
this.uniformGroups = {};
|
|
174
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
|
+
|
|
175
211
|
/**
|
|
176
212
|
* A dictionary that holds for each shader stage a Map of builtins.
|
|
177
213
|
*
|
|
@@ -194,6 +230,22 @@ class WGSLNodeBuilder extends NodeBuilder {
|
|
|
194
230
|
*/
|
|
195
231
|
this.scopedArrays = new Map();
|
|
196
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
|
+
|
|
197
249
|
}
|
|
198
250
|
|
|
199
251
|
/**
|
|
@@ -258,17 +310,31 @@ class WGSLNodeBuilder extends NodeBuilder {
|
|
|
258
310
|
|
|
259
311
|
if ( this.isUnfilterable( texture ) === false ) {
|
|
260
312
|
|
|
261
|
-
if (
|
|
313
|
+
if ( depthSnippet ) {
|
|
262
314
|
|
|
263
|
-
|
|
315
|
+
if ( offsetSnippet ) {
|
|
264
316
|
|
|
265
|
-
|
|
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 } )`;
|
|
266
328
|
|
|
267
|
-
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
return `textureSampleLevel( ${ textureProperty }, ${ textureProperty }_sampler, ${ uvSnippet }, ${ levelSnippet } )`;
|
|
332
|
+
|
|
333
|
+
}
|
|
268
334
|
|
|
269
335
|
} else if ( this.isFilteredTexture( texture ) ) {
|
|
270
336
|
|
|
271
|
-
return this.generateFilteredTexture( texture, textureProperty, uvSnippet, offsetSnippet, levelSnippet );
|
|
337
|
+
return this.generateFilteredTexture( texture, textureProperty, uvSnippet, offsetSnippet, levelSnippet, depthSnippet );
|
|
272
338
|
|
|
273
339
|
} else {
|
|
274
340
|
|
|
@@ -286,7 +352,7 @@ class WGSLNodeBuilder extends NodeBuilder {
|
|
|
286
352
|
*/
|
|
287
353
|
generateWrapFunction( texture ) {
|
|
288
354
|
|
|
289
|
-
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`;
|
|
290
356
|
|
|
291
357
|
let nodeCode = wgslCodeCache[ functionName ];
|
|
292
358
|
|
|
@@ -295,7 +361,7 @@ class WGSLNodeBuilder extends NodeBuilder {
|
|
|
295
361
|
const includes = [];
|
|
296
362
|
|
|
297
363
|
// For 3D textures, use vec3f; for texture arrays, keep vec2f since array index is separate
|
|
298
|
-
const coordType = texture.isData3DTexture ? 'vec3f' : 'vec2f';
|
|
364
|
+
const coordType = texture.is3DTexture || texture.isData3DTexture ? 'vec3f' : 'vec2f';
|
|
299
365
|
let code = `fn ${ functionName }( coord : ${ coordType } ) -> ${ coordType } {\n\n\treturn ${ coordType }(\n`;
|
|
300
366
|
|
|
301
367
|
const addWrapSnippet = ( wrap, axis ) => {
|
|
@@ -334,7 +400,7 @@ class WGSLNodeBuilder extends NodeBuilder {
|
|
|
334
400
|
|
|
335
401
|
addWrapSnippet( texture.wrapT, 'y' );
|
|
336
402
|
|
|
337
|
-
if ( texture.isData3DTexture ) {
|
|
403
|
+
if ( texture.is3DTexture || texture.isData3DTexture ) {
|
|
338
404
|
|
|
339
405
|
code += ',\n';
|
|
340
406
|
addWrapSnippet( texture.wrapR, 'z' );
|
|
@@ -378,7 +444,7 @@ class WGSLNodeBuilder extends NodeBuilder {
|
|
|
378
444
|
*/
|
|
379
445
|
generateTextureDimension( texture, textureProperty, levelSnippet ) {
|
|
380
446
|
|
|
381
|
-
const textureData = this.getDataFromNode( texture, this.shaderStage, this.
|
|
447
|
+
const textureData = this.getDataFromNode( texture, this.shaderStage, this.cache );
|
|
382
448
|
|
|
383
449
|
if ( textureData.dimensionsSnippet === undefined ) textureData.dimensionsSnippet = {};
|
|
384
450
|
|
|
@@ -392,7 +458,7 @@ class WGSLNodeBuilder extends NodeBuilder {
|
|
|
392
458
|
const { primarySamples } = this.renderer.backend.utils.getTextureSampleData( texture );
|
|
393
459
|
const isMultisampled = primarySamples > 1;
|
|
394
460
|
|
|
395
|
-
if ( texture.isData3DTexture ) {
|
|
461
|
+
if ( texture.is3DTexture || texture.isData3DTexture ) {
|
|
396
462
|
|
|
397
463
|
dimensionType = 'vec3<u32>';
|
|
398
464
|
|
|
@@ -418,7 +484,7 @@ class WGSLNodeBuilder extends NodeBuilder {
|
|
|
418
484
|
|
|
419
485
|
textureData.dimensionsSnippet[ levelSnippet ] = textureDimensionNode;
|
|
420
486
|
|
|
421
|
-
if ( texture.isArrayTexture || texture.isDataArrayTexture || texture.isData3DTexture ) {
|
|
487
|
+
if ( texture.isArrayTexture || texture.isDataArrayTexture || texture.is3DTexture || texture.isData3DTexture ) {
|
|
422
488
|
|
|
423
489
|
textureData.arrayLayerCount = new VarNode(
|
|
424
490
|
new ExpressionNode(
|
|
@@ -452,11 +518,10 @@ class WGSLNodeBuilder extends NodeBuilder {
|
|
|
452
518
|
* @param {string} uvSnippet - A WGSL snippet that represents texture coordinates used for sampling.
|
|
453
519
|
* @param {?string} offsetSnippet - A WGSL snippet that represents the offset that will be applied to the unnormalized texture coordinate before sampling the texture.
|
|
454
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.
|
|
455
522
|
* @return {string} The WGSL snippet.
|
|
456
523
|
*/
|
|
457
|
-
generateFilteredTexture( texture, textureProperty, uvSnippet, offsetSnippet, levelSnippet = '0u' ) {
|
|
458
|
-
|
|
459
|
-
this._include( 'biquadraticTexture' );
|
|
524
|
+
generateFilteredTexture( texture, textureProperty, uvSnippet, offsetSnippet, levelSnippet = '0u', depthSnippet ) {
|
|
460
525
|
|
|
461
526
|
const wrapFunction = this.generateWrapFunction( texture );
|
|
462
527
|
const textureDimension = this.generateTextureDimension( texture, textureProperty, levelSnippet );
|
|
@@ -467,6 +532,16 @@ class WGSLNodeBuilder extends NodeBuilder {
|
|
|
467
532
|
|
|
468
533
|
}
|
|
469
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
|
+
|
|
470
545
|
return `tsl_biquadraticTexture( ${ textureProperty }, ${ wrapFunction }( ${ uvSnippet } ), ${ textureDimension }, u32( ${ levelSnippet } ) )`;
|
|
471
546
|
|
|
472
547
|
}
|
|
@@ -485,10 +560,27 @@ class WGSLNodeBuilder extends NodeBuilder {
|
|
|
485
560
|
*/
|
|
486
561
|
generateTextureLod( texture, textureProperty, uvSnippet, depthSnippet, offsetSnippet, levelSnippet = '0u' ) {
|
|
487
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
|
+
}
|
|
578
|
+
|
|
488
579
|
const wrapFunction = this.generateWrapFunction( texture );
|
|
489
580
|
const textureDimension = this.generateTextureDimension( texture, textureProperty, levelSnippet );
|
|
490
581
|
|
|
491
|
-
const vecType = texture.isData3DTexture ? 'vec3' : 'vec2';
|
|
582
|
+
const vecType = texture.is3DTexture || texture.isData3DTexture ? 'vec3' : 'vec2';
|
|
583
|
+
const textureDimensionMargin = ( vecType === 'vec3' ) ? 'vec3<u32>( 1, 1, 1 )' : 'vec2<u32>( 1, 1 )';
|
|
492
584
|
|
|
493
585
|
if ( offsetSnippet ) {
|
|
494
586
|
|
|
@@ -496,9 +588,47 @@ class WGSLNodeBuilder extends NodeBuilder {
|
|
|
496
588
|
|
|
497
589
|
}
|
|
498
590
|
|
|
499
|
-
const
|
|
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 } )`;
|
|
500
628
|
|
|
501
|
-
|
|
629
|
+
}
|
|
630
|
+
|
|
631
|
+
return snippet;
|
|
502
632
|
|
|
503
633
|
}
|
|
504
634
|
|
|
@@ -581,7 +711,7 @@ class WGSLNodeBuilder extends NodeBuilder {
|
|
|
581
711
|
*/
|
|
582
712
|
isSampleCompare( texture ) {
|
|
583
713
|
|
|
584
|
-
return texture.isDepthTexture === true && texture.compareFunction !== null;
|
|
714
|
+
return texture.isDepthTexture === true && texture.compareFunction !== null && this.renderer.hasCompatibility( Compatibility.TEXTURE_COMPARE );
|
|
585
715
|
|
|
586
716
|
}
|
|
587
717
|
|
|
@@ -594,7 +724,7 @@ class WGSLNodeBuilder extends NodeBuilder {
|
|
|
594
724
|
isUnfilterable( texture ) {
|
|
595
725
|
|
|
596
726
|
return this.getComponentTypeFromTexture( texture ) !== 'float' ||
|
|
597
|
-
( ! this.isAvailable( 'float32Filterable' ) && texture.
|
|
727
|
+
( ! this.isAvailable( 'float32Filterable' ) && texture.type === FloatType ) ||
|
|
598
728
|
( this.isSampleCompare( texture ) === false && texture.minFilter === NearestFilter && texture.magFilter === NearestFilter ) ||
|
|
599
729
|
this.renderer.backend.utils.getTextureSampleData( texture ).primarySamples > 1;
|
|
600
730
|
|
|
@@ -645,14 +775,27 @@ class WGSLNodeBuilder extends NodeBuilder {
|
|
|
645
775
|
|
|
646
776
|
if ( shaderStage === 'fragment' ) {
|
|
647
777
|
|
|
648
|
-
|
|
649
|
-
if ( offsetSnippet ) {
|
|
778
|
+
if ( depthSnippet ) {
|
|
650
779
|
|
|
651
|
-
|
|
780
|
+
if ( offsetSnippet ) {
|
|
652
781
|
|
|
653
|
-
|
|
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 ] } )`;
|
|
654
797
|
|
|
655
|
-
|
|
798
|
+
}
|
|
656
799
|
|
|
657
800
|
} else {
|
|
658
801
|
|
|
@@ -723,17 +866,31 @@ class WGSLNodeBuilder extends NodeBuilder {
|
|
|
723
866
|
|
|
724
867
|
if ( this.isUnfilterable( texture ) === false ) {
|
|
725
868
|
|
|
726
|
-
if (
|
|
869
|
+
if ( depthSnippet ) {
|
|
727
870
|
|
|
728
|
-
|
|
871
|
+
if ( offsetSnippet ) {
|
|
729
872
|
|
|
730
|
-
|
|
873
|
+
return `textureSampleLevel( ${ textureProperty }, ${ textureProperty }_sampler, ${ uvSnippet }, ${ depthSnippet }, ${ levelSnippet }, ${ offsetSnippet } )`;
|
|
874
|
+
|
|
875
|
+
}
|
|
731
876
|
|
|
732
|
-
|
|
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
|
+
}
|
|
733
890
|
|
|
734
891
|
} else if ( this.isFilteredTexture( texture ) ) {
|
|
735
892
|
|
|
736
|
-
return this.generateFilteredTexture( texture, textureProperty, uvSnippet, offsetSnippet, levelSnippet );
|
|
893
|
+
return this.generateFilteredTexture( texture, textureProperty, uvSnippet, offsetSnippet, levelSnippet, depthSnippet );
|
|
737
894
|
|
|
738
895
|
} else {
|
|
739
896
|
|
|
@@ -759,13 +916,27 @@ class WGSLNodeBuilder extends NodeBuilder {
|
|
|
759
916
|
|
|
760
917
|
if ( shaderStage === 'fragment' ) {
|
|
761
918
|
|
|
762
|
-
if (
|
|
919
|
+
if ( depthSnippet ) {
|
|
763
920
|
|
|
764
|
-
|
|
921
|
+
if ( offsetSnippet ) {
|
|
765
922
|
|
|
766
|
-
|
|
923
|
+
return `textureSampleBias( ${ textureProperty }, ${ textureProperty }_sampler, ${ uvSnippet }, ${ depthSnippet }, ${ biasSnippet }, ${ offsetSnippet } )`;
|
|
924
|
+
|
|
925
|
+
}
|
|
926
|
+
|
|
927
|
+
return `textureSampleBias( ${ textureProperty }, ${ textureProperty }_sampler, ${ uvSnippet }, ${ depthSnippet }, ${ biasSnippet } )`;
|
|
767
928
|
|
|
768
|
-
|
|
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
|
+
}
|
|
769
940
|
|
|
770
941
|
} else {
|
|
771
942
|
|
|
@@ -797,7 +968,7 @@ class WGSLNodeBuilder extends NodeBuilder {
|
|
|
797
968
|
const name = node.name;
|
|
798
969
|
const type = node.type;
|
|
799
970
|
|
|
800
|
-
if ( type === 'texture' || type === 'cubeTexture' || type === 'storageTexture' || type === 'texture3D' ) {
|
|
971
|
+
if ( type === 'texture' || type === 'cubeTexture' || type === 'cubeDepthTexture' || type === 'storageTexture' || type === 'texture3D' ) {
|
|
801
972
|
|
|
802
973
|
return name;
|
|
803
974
|
|
|
@@ -923,7 +1094,7 @@ class WGSLNodeBuilder extends NodeBuilder {
|
|
|
923
1094
|
|
|
924
1095
|
const bindings = this.getBindGroupArray( groupName, shaderStage );
|
|
925
1096
|
|
|
926
|
-
if ( type === 'texture' || type === 'cubeTexture' || type === 'storageTexture' || type === 'texture3D' ) {
|
|
1097
|
+
if ( type === 'texture' || type === 'cubeTexture' || type === 'cubeDepthTexture' || type === 'storageTexture' || type === 'texture3D' ) {
|
|
927
1098
|
|
|
928
1099
|
let texture = null;
|
|
929
1100
|
|
|
@@ -941,7 +1112,7 @@ class WGSLNodeBuilder extends NodeBuilder {
|
|
|
941
1112
|
|
|
942
1113
|
}
|
|
943
1114
|
|
|
944
|
-
} else if ( type === 'cubeTexture' ) {
|
|
1115
|
+
} else if ( type === 'cubeTexture' || type === 'cubeDepthTexture' ) {
|
|
945
1116
|
|
|
946
1117
|
texture = new NodeSampledCubeTexture( uniformNode.name, uniformNode.node, group, access );
|
|
947
1118
|
|
|
@@ -955,7 +1126,10 @@ class WGSLNodeBuilder extends NodeBuilder {
|
|
|
955
1126
|
texture.mipLevel = texture.store ? node.mipLevel : 0;
|
|
956
1127
|
texture.setVisibility( gpuShaderStageLib[ shaderStage ] );
|
|
957
1128
|
|
|
958
|
-
|
|
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 ) {
|
|
959
1133
|
|
|
960
1134
|
const sampler = new NodeSampler( `${ uniformNode.name }_sampler`, uniformNode.node, group );
|
|
961
1135
|
sampler.setVisibility( gpuShaderStageLib[ shaderStage ] );
|
|
@@ -974,10 +1148,21 @@ class WGSLNodeBuilder extends NodeBuilder {
|
|
|
974
1148
|
|
|
975
1149
|
} else if ( type === 'buffer' || type === 'storageBuffer' || type === 'indirectStorageBuffer' ) {
|
|
976
1150
|
|
|
977
|
-
const
|
|
1151
|
+
const sharedData = this.getSharedDataFromNode( node );
|
|
1152
|
+
|
|
1153
|
+
let buffer = sharedData.buffer;
|
|
1154
|
+
|
|
1155
|
+
if ( buffer === undefined ) {
|
|
1156
|
+
|
|
1157
|
+
const bufferClass = type === 'buffer' ? NodeUniformBuffer : NodeStorageBuffer;
|
|
978
1158
|
|
|
979
|
-
|
|
980
|
-
|
|
1159
|
+
buffer = new bufferClass( node, group );
|
|
1160
|
+
|
|
1161
|
+
sharedData.buffer = buffer;
|
|
1162
|
+
|
|
1163
|
+
}
|
|
1164
|
+
|
|
1165
|
+
buffer.setVisibility( buffer.getVisibility() | gpuShaderStageLib[ shaderStage ] );
|
|
981
1166
|
|
|
982
1167
|
bindings.push( buffer );
|
|
983
1168
|
|
|
@@ -987,16 +1172,19 @@ class WGSLNodeBuilder extends NodeBuilder {
|
|
|
987
1172
|
|
|
988
1173
|
} else {
|
|
989
1174
|
|
|
990
|
-
|
|
991
|
-
|
|
992
|
-
let uniformsGroup = uniformsStage[ groupName ];
|
|
1175
|
+
let uniformsGroup = this.uniformGroups[ groupName ];
|
|
993
1176
|
|
|
994
1177
|
if ( uniformsGroup === undefined ) {
|
|
995
1178
|
|
|
996
1179
|
uniformsGroup = new NodeUniformsGroup( groupName, group );
|
|
997
|
-
uniformsGroup.setVisibility(
|
|
1180
|
+
uniformsGroup.setVisibility( GPUShaderStage.VERTEX | GPUShaderStage.FRAGMENT | GPUShaderStage.COMPUTE );
|
|
1181
|
+
|
|
1182
|
+
this.uniformGroups[ groupName ] = uniformsGroup;
|
|
998
1183
|
|
|
999
|
-
|
|
1184
|
+
}
|
|
1185
|
+
|
|
1186
|
+
// Add to bindings for this stage if not already present
|
|
1187
|
+
if ( bindings.indexOf( uniformsGroup ) === - 1 ) {
|
|
1000
1188
|
|
|
1001
1189
|
bindings.push( uniformsGroup );
|
|
1002
1190
|
|
|
@@ -1004,7 +1192,15 @@ class WGSLNodeBuilder extends NodeBuilder {
|
|
|
1004
1192
|
|
|
1005
1193
|
uniformGPU = this.getNodeUniform( uniformNode, type );
|
|
1006
1194
|
|
|
1007
|
-
|
|
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
|
+
}
|
|
1008
1204
|
|
|
1009
1205
|
}
|
|
1010
1206
|
|
|
@@ -1553,11 +1749,12 @@ ${ flowData.code }
|
|
|
1553
1749
|
* @param {string} type - The variable's type.
|
|
1554
1750
|
* @param {string} name - The variable's name.
|
|
1555
1751
|
* @param {?number} [count=null] - The array length.
|
|
1752
|
+
* @param {string} [qualifier=''] - The variable's qualifier.
|
|
1556
1753
|
* @return {string} The WGSL snippet that defines a variable.
|
|
1557
1754
|
*/
|
|
1558
|
-
getVar( type, name, count = null ) {
|
|
1755
|
+
getVar( type, name, count = null, qualifier = '' ) {
|
|
1559
1756
|
|
|
1560
|
-
let snippet = `var ${ name } : `;
|
|
1757
|
+
let snippet = `var${ qualifier } ${ name } : `;
|
|
1561
1758
|
|
|
1562
1759
|
if ( count !== null ) {
|
|
1563
1760
|
|
|
@@ -1579,7 +1776,15 @@ ${ flowData.code }
|
|
|
1579
1776
|
* @param {string} shaderStage - The shader stage.
|
|
1580
1777
|
* @return {string} The WGSL snippet that defines the variables.
|
|
1581
1778
|
*/
|
|
1582
|
-
getVars( shaderStage ) {
|
|
1779
|
+
getVars( shaderStage, global = false ) {
|
|
1780
|
+
|
|
1781
|
+
let qualifier = '';
|
|
1782
|
+
|
|
1783
|
+
if ( global ) {
|
|
1784
|
+
|
|
1785
|
+
qualifier = '<private>';
|
|
1786
|
+
|
|
1787
|
+
}
|
|
1583
1788
|
|
|
1584
1789
|
const snippets = [];
|
|
1585
1790
|
const vars = this.vars[ shaderStage ];
|
|
@@ -1588,13 +1793,13 @@ ${ flowData.code }
|
|
|
1588
1793
|
|
|
1589
1794
|
for ( const variable of vars ) {
|
|
1590
1795
|
|
|
1591
|
-
snippets.push(
|
|
1796
|
+
snippets.push( `${ this.getVar( variable.type, variable.name, variable.count, qualifier ) };` );
|
|
1592
1797
|
|
|
1593
1798
|
}
|
|
1594
1799
|
|
|
1595
1800
|
}
|
|
1596
1801
|
|
|
1597
|
-
return `\n${ snippets.join( '\n' ) }\n`;
|
|
1802
|
+
return global ? snippets.join( '\n' ) : `\n\t${ snippets.join( '\n\t' ) }\n`;
|
|
1598
1803
|
|
|
1599
1804
|
}
|
|
1600
1805
|
|
|
@@ -1610,7 +1815,7 @@ ${ flowData.code }
|
|
|
1610
1815
|
|
|
1611
1816
|
if ( shaderStage === 'vertex' ) {
|
|
1612
1817
|
|
|
1613
|
-
this.getBuiltin( 'position', '
|
|
1818
|
+
this.getBuiltin( 'position', 'builtinClipSpace', 'vec4<f32>', 'vertex' );
|
|
1614
1819
|
|
|
1615
1820
|
}
|
|
1616
1821
|
|
|
@@ -1619,13 +1824,15 @@ ${ flowData.code }
|
|
|
1619
1824
|
const varyings = this.varyings;
|
|
1620
1825
|
const vars = this.vars[ shaderStage ];
|
|
1621
1826
|
|
|
1827
|
+
let varyingIndex = 0;
|
|
1828
|
+
|
|
1622
1829
|
for ( let index = 0; index < varyings.length; index ++ ) {
|
|
1623
1830
|
|
|
1624
1831
|
const varying = varyings[ index ];
|
|
1625
1832
|
|
|
1626
1833
|
if ( varying.needsInterpolation ) {
|
|
1627
1834
|
|
|
1628
|
-
let attributesSnippet = `@location( ${
|
|
1835
|
+
let attributesSnippet = `@location( ${ varyingIndex ++ } )`;
|
|
1629
1836
|
|
|
1630
1837
|
if ( varying.interpolationType ) {
|
|
1631
1838
|
|
|
@@ -1637,7 +1844,7 @@ ${ flowData.code }
|
|
|
1637
1844
|
|
|
1638
1845
|
} else if ( /^(int|uint|ivec|uvec)/.test( varying.type ) ) {
|
|
1639
1846
|
|
|
1640
|
-
attributesSnippet +=
|
|
1847
|
+
attributesSnippet += ' @interpolate(flat, either)';
|
|
1641
1848
|
|
|
1642
1849
|
}
|
|
1643
1850
|
|
|
@@ -1686,6 +1893,7 @@ ${ flowData.code }
|
|
|
1686
1893
|
*/
|
|
1687
1894
|
getUniforms( shaderStage ) {
|
|
1688
1895
|
|
|
1896
|
+
const backend = this.renderer.backend;
|
|
1689
1897
|
const uniforms = this.uniforms[ shaderStage ];
|
|
1690
1898
|
|
|
1691
1899
|
const bindingSnippets = [];
|
|
@@ -1698,11 +1906,14 @@ ${ flowData.code }
|
|
|
1698
1906
|
const groupName = uniform.groupNode.name;
|
|
1699
1907
|
const uniformIndexes = this.bindingsIndexes[ groupName ];
|
|
1700
1908
|
|
|
1701
|
-
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' ) {
|
|
1702
1910
|
|
|
1703
1911
|
const texture = uniform.node.value;
|
|
1704
1912
|
|
|
1705
|
-
|
|
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 ) {
|
|
1706
1917
|
|
|
1707
1918
|
if ( this.isSampleCompare( texture ) ) {
|
|
1708
1919
|
|
|
@@ -1720,7 +1931,7 @@ ${ flowData.code }
|
|
|
1720
1931
|
|
|
1721
1932
|
let multisampled = '';
|
|
1722
1933
|
|
|
1723
|
-
const { primarySamples } =
|
|
1934
|
+
const { primarySamples } = backend.utils.getTextureSampleData( texture );
|
|
1724
1935
|
|
|
1725
1936
|
if ( primarySamples > 1 ) {
|
|
1726
1937
|
|
|
@@ -1728,13 +1939,17 @@ ${ flowData.code }
|
|
|
1728
1939
|
|
|
1729
1940
|
}
|
|
1730
1941
|
|
|
1731
|
-
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 ) {
|
|
1732
1947
|
|
|
1733
1948
|
textureType = 'texture_cube<f32>';
|
|
1734
1949
|
|
|
1735
1950
|
} else if ( texture.isDepthTexture === true ) {
|
|
1736
1951
|
|
|
1737
|
-
if (
|
|
1952
|
+
if ( backend.compatibilityMode && texture.compareFunction === null ) {
|
|
1738
1953
|
|
|
1739
1954
|
textureType = `texture${ multisampled }_2d<f32>`;
|
|
1740
1955
|
|
|
@@ -1746,7 +1961,7 @@ ${ flowData.code }
|
|
|
1746
1961
|
|
|
1747
1962
|
} else if ( uniform.node.isStorageTextureNode === true ) {
|
|
1748
1963
|
|
|
1749
|
-
const format = getFormat( texture );
|
|
1964
|
+
const format = getFormat( texture, backend.device );
|
|
1750
1965
|
const access = this.getStorageAccess( uniform.node, shaderStage );
|
|
1751
1966
|
|
|
1752
1967
|
const is3D = uniform.node.value.is3DTexture;
|
|
@@ -1797,16 +2012,51 @@ ${ flowData.code }
|
|
|
1797
2012
|
|
|
1798
2013
|
} else {
|
|
1799
2014
|
|
|
1800
|
-
const vectorType = this.getType( this.getVectorType( uniform.type ) );
|
|
1801
2015
|
const groupName = uniform.groupNode.name;
|
|
1802
2016
|
|
|
1803
|
-
|
|
1804
|
-
|
|
1805
|
-
|
|
1806
|
-
|
|
1807
|
-
|
|
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 ) {
|
|
2040
|
+
|
|
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
|
+
};
|
|
1808
2056
|
|
|
1809
|
-
|
|
2057
|
+
}
|
|
2058
|
+
|
|
2059
|
+
}
|
|
1810
2060
|
|
|
1811
2061
|
}
|
|
1812
2062
|
|
|
@@ -1820,9 +2070,7 @@ ${ flowData.code }
|
|
|
1820
2070
|
|
|
1821
2071
|
}
|
|
1822
2072
|
|
|
1823
|
-
|
|
1824
|
-
code += bufferSnippets.join( '\n' );
|
|
1825
|
-
code += structSnippets.join( '\n' );
|
|
2073
|
+
const code = [ ...bindingSnippets, ...bufferSnippets, ...structSnippets ].join( '\n' );
|
|
1826
2074
|
|
|
1827
2075
|
return code;
|
|
1828
2076
|
|
|
@@ -1841,12 +2089,14 @@ ${ flowData.code }
|
|
|
1841
2089
|
|
|
1842
2090
|
this.shaderStage = shaderStage;
|
|
1843
2091
|
|
|
2092
|
+
const allowGlobal = this.allowGlobalVariables;
|
|
2093
|
+
|
|
1844
2094
|
const stageData = shadersData[ shaderStage ];
|
|
1845
2095
|
stageData.uniforms = this.getUniforms( shaderStage );
|
|
1846
2096
|
stageData.attributes = this.getAttributes( shaderStage );
|
|
1847
2097
|
stageData.varyings = this.getVaryings( shaderStage );
|
|
1848
2098
|
stageData.structs = this.getStructs( shaderStage );
|
|
1849
|
-
stageData.vars = this.getVars( shaderStage );
|
|
2099
|
+
stageData.vars = this.getVars( shaderStage, allowGlobal );
|
|
1850
2100
|
stageData.codes = this.getCodes( shaderStage );
|
|
1851
2101
|
stageData.directives = this.getDirectives( shaderStage );
|
|
1852
2102
|
stageData.scopedArrays = this.getScopedArrays( shaderStage );
|
|
@@ -1883,7 +2133,7 @@ ${ flowData.code }
|
|
|
1883
2133
|
|
|
1884
2134
|
if ( shaderStage === 'vertex' ) {
|
|
1885
2135
|
|
|
1886
|
-
flow += `varyings.
|
|
2136
|
+
flow += `varyings.builtinClipSpace = ${ flowSlotData.result };`;
|
|
1887
2137
|
|
|
1888
2138
|
} else if ( shaderStage === 'fragment' ) {
|
|
1889
2139
|
|
|
@@ -1896,7 +2146,7 @@ ${ flowData.code }
|
|
|
1896
2146
|
|
|
1897
2147
|
} else {
|
|
1898
2148
|
|
|
1899
|
-
let structSnippet = '\t@location(0) color: vec4<f32>';
|
|
2149
|
+
let structSnippet = '\t@location( 0 ) color: vec4<f32>';
|
|
1900
2150
|
|
|
1901
2151
|
const builtins = this.getBuiltins( 'output' );
|
|
1902
2152
|
|
|
@@ -1980,6 +2230,30 @@ ${ flowData.code }
|
|
|
1980
2230
|
|
|
1981
2231
|
}
|
|
1982
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
|
+
|
|
1983
2257
|
/**
|
|
1984
2258
|
* Returns the native snippet for a ternary operation.
|
|
1985
2259
|
*
|
|
@@ -1994,7 +2268,6 @@ ${ flowData.code }
|
|
|
1994
2268
|
|
|
1995
2269
|
}
|
|
1996
2270
|
|
|
1997
|
-
|
|
1998
2271
|
/**
|
|
1999
2272
|
* Returns the WGSL type of the given node data type.
|
|
2000
2273
|
*
|
|
@@ -2098,15 +2371,15 @@ ${shaderData.uniforms}
|
|
|
2098
2371
|
${shaderData.varyings}
|
|
2099
2372
|
var<private> varyings : VaryingsStruct;
|
|
2100
2373
|
|
|
2374
|
+
// vars
|
|
2375
|
+
${shaderData.vars}
|
|
2376
|
+
|
|
2101
2377
|
// codes
|
|
2102
2378
|
${shaderData.codes}
|
|
2103
2379
|
|
|
2104
2380
|
@vertex
|
|
2105
2381
|
fn main( ${shaderData.attributes} ) -> VaryingsStruct {
|
|
2106
2382
|
|
|
2107
|
-
// vars
|
|
2108
|
-
${shaderData.vars}
|
|
2109
|
-
|
|
2110
2383
|
// flow
|
|
2111
2384
|
${shaderData.flow}
|
|
2112
2385
|
|
|
@@ -2136,15 +2409,15 @@ ${shaderData.structs}
|
|
|
2136
2409
|
// uniforms
|
|
2137
2410
|
${shaderData.uniforms}
|
|
2138
2411
|
|
|
2412
|
+
// vars
|
|
2413
|
+
${shaderData.vars}
|
|
2414
|
+
|
|
2139
2415
|
// codes
|
|
2140
2416
|
${shaderData.codes}
|
|
2141
2417
|
|
|
2142
2418
|
@fragment
|
|
2143
2419
|
fn main( ${shaderData.varyings} ) -> ${shaderData.returnType} {
|
|
2144
2420
|
|
|
2145
|
-
// vars
|
|
2146
|
-
${shaderData.vars}
|
|
2147
|
-
|
|
2148
2421
|
// flow
|
|
2149
2422
|
${shaderData.flow}
|
|
2150
2423
|
|
|
@@ -2181,20 +2454,23 @@ ${ shaderData.structs }
|
|
|
2181
2454
|
// uniforms
|
|
2182
2455
|
${ shaderData.uniforms }
|
|
2183
2456
|
|
|
2457
|
+
// vars
|
|
2458
|
+
${ this.allowGlobalVariables ? shaderData.vars : '' }
|
|
2459
|
+
|
|
2184
2460
|
// codes
|
|
2185
2461
|
${ shaderData.codes }
|
|
2186
2462
|
|
|
2187
2463
|
@compute @workgroup_size( ${ workgroupSizeX }, ${ workgroupSizeY }, ${ workgroupSizeZ } )
|
|
2188
2464
|
fn main( ${ shaderData.attributes } ) {
|
|
2189
2465
|
|
|
2466
|
+
// local vars
|
|
2467
|
+
${ this.allowGlobalVariables ? '' : shaderData.vars }
|
|
2468
|
+
|
|
2190
2469
|
// system
|
|
2191
2470
|
instanceIndex = globalId.x
|
|
2192
2471
|
+ globalId.y * ( ${ workgroupSizeX } * numWorkgroups.x )
|
|
2193
2472
|
+ globalId.z * ( ${ workgroupSizeX } * numWorkgroups.x ) * ( ${ workgroupSizeY } * numWorkgroups.y );
|
|
2194
2473
|
|
|
2195
|
-
// vars
|
|
2196
|
-
${ shaderData.vars }
|
|
2197
|
-
|
|
2198
2474
|
// flow
|
|
2199
2475
|
${ shaderData.flow }
|
|
2200
2476
|
|