@gnsx/three 0.185.16 → 0.186.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/three.cjs +10 -82600
- package/build/three.core.js +1309 -807
- package/build/three.module.js +439 -338
- package/build/three.tsl.js +74 -44
- package/build/three.webgpu.js +6036 -2184
- package/build/three.webgpu.nodes.js +6020 -2184
- package/examples/jsm/Addons.js +6 -6
- package/examples/jsm/controls/ArcballControls.js +1 -1
- package/examples/jsm/controls/FirstPersonControls.js +44 -20
- package/examples/jsm/controls/OrbitControls.js +9 -0
- package/examples/jsm/controls/TrackballControls.js +109 -4
- package/examples/jsm/csm/CSMShadowNode.js +13 -0
- package/examples/jsm/exporters/GLTFExporter.js +23 -7
- package/examples/jsm/exporters/USDZExporter.js +2 -2
- package/examples/jsm/generators/CityGenerator.js +377 -45
- package/examples/jsm/generators/ForestGenerator.js +12 -12
- package/examples/jsm/generators/TerrainGenerator.js +49 -37
- package/examples/jsm/generators/TreeGenerator.js +70 -76
- package/examples/jsm/generators/city/BenchGenerator.js +127 -0
- package/examples/jsm/generators/city/CarGenerator.js +479 -0
- package/examples/jsm/generators/city/CityGeneratorUtils.js +31 -0
- package/examples/jsm/generators/city/HydrantGenerator.js +106 -0
- package/examples/jsm/generators/city/InstancedMeshGenerator.js +86 -0
- package/examples/jsm/generators/city/PersonGenerator.js +447 -0
- package/examples/jsm/generators/city/SidewalkGenerator.js +33 -38
- package/examples/jsm/generators/city/SkyscraperGenerator.js +448 -48
- package/examples/jsm/generators/city/StreetTreeGenerator.js +231 -0
- package/examples/jsm/generators/city/StreetlightGenerator.js +100 -0
- package/examples/jsm/generators/city/TrafficlightGenerator.js +106 -0
- package/examples/jsm/generators/city/TrashcanGenerator.js +100 -0
- package/examples/jsm/geometries/BoxLineGeometry.js +1 -1
- package/examples/jsm/geometries/ParametricGeometry.js +1 -1
- package/examples/jsm/geometries/RoundedBoxGeometry.js +1 -1
- package/examples/jsm/gpgpu/CountingSort.js +271 -0
- package/examples/jsm/helpers/LightProbeGridHelper.js +60 -239
- package/examples/jsm/helpers/LightProbeGridHelperWebGL.js +221 -0
- package/examples/jsm/inspector/Extension.js +94 -0
- package/examples/jsm/inspector/Inspector.js +145 -41
- package/examples/jsm/inspector/RendererInspector.js +100 -52
- package/examples/jsm/inspector/extensions/color-grading/ColorGrading.js +2609 -0
- package/examples/jsm/inspector/extensions/color-grading/ColorWheel.js +352 -0
- package/examples/jsm/inspector/extensions/color-grading/CurveEditor.js +599 -0
- package/examples/jsm/inspector/extensions/color-grading/LUT3DStyle.js +1201 -0
- package/examples/jsm/inspector/extensions/color-grading/LUTMath.js +788 -0
- package/examples/jsm/inspector/extensions/color-grading/modules/BrightnessModule.js +72 -0
- package/examples/jsm/inspector/extensions/color-grading/modules/ColorWheelModule.js +112 -0
- package/examples/jsm/inspector/extensions/color-grading/modules/ContrastModule.js +82 -0
- package/examples/jsm/inspector/extensions/color-grading/modules/CurvesModule.js +109 -0
- package/examples/jsm/inspector/extensions/color-grading/modules/ExposureHueModule.js +110 -0
- package/examples/jsm/inspector/extensions/color-grading/modules/ExposureModule.js +73 -0
- package/examples/jsm/inspector/extensions/color-grading/modules/HueModule.js +78 -0
- package/examples/jsm/inspector/extensions/color-grading/modules/ImportedCubeModule.js +89 -0
- package/examples/jsm/inspector/extensions/color-grading/modules/Module.js +285 -0
- package/examples/jsm/inspector/extensions/color-grading/modules/OutputModule.js +101 -0
- package/examples/jsm/inspector/extensions/color-grading/modules/RendererModule.js +225 -0
- package/examples/jsm/inspector/extensions/color-grading/modules/SatVibranceModule.js +102 -0
- package/examples/jsm/inspector/extensions/color-grading/modules/SaturationModule.js +76 -0
- package/examples/jsm/inspector/extensions/color-grading/modules/VibranceModule.js +76 -0
- package/examples/jsm/inspector/extensions/color-grading/modules/WhiteBalanceModule.js +86 -0
- package/examples/jsm/inspector/extensions/tsl-graph/TSLGraphEditor.js +26 -31
- package/examples/jsm/inspector/extensions/tsl-graph/TSLGraphLoader.js +1 -0
- package/examples/jsm/inspector/tabs/Memory.js +0 -2
- package/examples/jsm/inspector/tabs/Settings.js +4 -0
- package/examples/jsm/inspector/tabs/Timeline.js +223 -171
- package/examples/jsm/inspector/tabs/Viewer.js +515 -21
- package/examples/jsm/inspector/ui/List.js +15 -9
- package/examples/jsm/inspector/ui/Profiler.js +170 -14
- package/examples/jsm/inspector/ui/Style.js +269 -23
- package/examples/jsm/inspector/ui/Tab.js +2 -0
- package/examples/jsm/inspector/ui/Values.js +14 -2
- package/examples/jsm/interactive/HTMLMesh.js +19 -3
- package/examples/jsm/lighting/LightProbeGrid.js +484 -889
- package/examples/jsm/lighting/LightProbeGridUtils.js +107 -0
- package/examples/jsm/lighting/LightProbeGridWebGL.js +841 -0
- package/examples/jsm/lighting/vxgi/VXGIConeTracer.js +194 -0
- package/examples/jsm/lighting/vxgi/VXGINode.js +660 -0
- package/examples/jsm/lighting/vxgi/VXGISceneCollector.js +478 -0
- package/examples/jsm/lighting/vxgi/VXGIVolume.js +1430 -0
- package/examples/jsm/lights/SunLight.js +95 -0
- package/examples/jsm/lights/SunLightNode.js +56 -0
- package/examples/jsm/lights/SunLightShadow.js +319 -0
- package/examples/jsm/lights/SunShadowNode.js +312 -0
- package/examples/jsm/loaders/3DMLoader.js +150 -49
- package/examples/jsm/loaders/3MFLoader.js +202 -1
- package/examples/jsm/loaders/FBXLoader.js +81 -5
- package/examples/jsm/loaders/GLTFGaussianSplatLoaderExtension.js +330 -0
- package/examples/jsm/loaders/GLTFLoader.js +79 -14
- package/examples/jsm/loaders/GaussianSplatPLYLoader.js +386 -0
- package/examples/jsm/loaders/KSPLATLoader.js +463 -0
- package/examples/jsm/loaders/MaterialXLoader.js +111 -1010
- package/examples/jsm/loaders/PCDLoader.js +1 -1
- package/examples/jsm/loaders/SPLATLoader.js +139 -0
- package/examples/jsm/loaders/SPZLoader.js +561 -0
- package/examples/jsm/loaders/materialx/MaterialXArchive.js +108 -0
- package/examples/jsm/loaders/materialx/MaterialXDocument.js +878 -0
- package/examples/jsm/loaders/materialx/MaterialXHextile.js +183 -0
- package/examples/jsm/loaders/materialx/MaterialXInterfaceValidation.js +376 -0
- package/examples/jsm/loaders/materialx/MaterialXLog.js +75 -0
- package/examples/jsm/loaders/materialx/MaterialXNodeInterfaceRegistry.js +4 -0
- package/examples/jsm/loaders/materialx/MaterialXNodeLibrary.js +1021 -0
- package/examples/jsm/loaders/materialx/MaterialXSurfaceMappings.js +661 -0
- package/examples/jsm/loaders/materialx/MaterialXUtils.js +57 -0
- package/examples/jsm/loaders/materialx/compile/MaterialXCompileRegistry.js +997 -0
- package/examples/jsm/loaders/materialx/parse/MaterialXParser.js +28 -0
- package/examples/jsm/loaders/usd/USDAParser.js +15 -2
- package/examples/jsm/loaders/usd/USDCParser.js +1 -4
- package/examples/jsm/loaders/usd/USDComposer.js +80 -42
- package/examples/jsm/materials/WoodNodeMaterial.js +6 -108
- package/examples/jsm/misc/RollerCoaster.js +2 -2
- package/examples/jsm/misc/SculptGL.LICENSE.txt +21 -0
- package/examples/jsm/misc/Sculptor.js +1679 -0
- package/examples/jsm/misc/SculptorMesh.js +1504 -0
- package/examples/jsm/misc/SculptorTools.js +1180 -0
- package/examples/jsm/misc/SculptorUtils.js +345 -0
- package/examples/jsm/misc/TubePainter.js +28 -16
- package/examples/jsm/misc/VolumeSlice.js +24 -24
- package/examples/jsm/modifiers/SimplifyModifier.js +63 -556
- package/examples/jsm/objects/GaussianSplat.js +1039 -0
- package/examples/jsm/objects/Sky.js +66 -45
- package/examples/jsm/objects/SkyMesh.js +70 -51
- package/examples/jsm/physics/JoltPhysics.js +1 -1
- package/examples/jsm/postprocessing/AfterimagePass.js +4 -2
- package/examples/jsm/postprocessing/BloomPass.js +2 -2
- package/examples/jsm/postprocessing/GTAOPass.js +1 -1
- package/examples/jsm/postprocessing/OutlinePass.js +5 -5
- package/examples/jsm/postprocessing/SAOPass.js +1 -1
- package/examples/jsm/postprocessing/SSAOPass.js +1 -1
- package/examples/jsm/postprocessing/SSRPass.js +4 -2
- package/examples/jsm/postprocessing/SavePass.js +1 -1
- package/examples/jsm/postprocessing/TAARenderPass.js +1 -1
- package/examples/jsm/postprocessing/UnrealBloomPass.js +30 -13
- package/examples/jsm/renderers/CSS2DRenderer.js +29 -5
- package/examples/jsm/shaders/DepthLimitedBlurShader.js +4 -1
- package/examples/jsm/shaders/ExposureShader.js +1 -1
- package/examples/jsm/shaders/FilmShader.js +2 -1
- package/examples/jsm/transpiler/AST.js +21 -2
- package/examples/jsm/transpiler/GLSLDecoder.js +498 -8
- package/examples/jsm/transpiler/TSLEncoder.js +82 -10
- package/examples/jsm/transpiler/WGSLEncoder.js +33 -4
- package/examples/jsm/tsl/WebGLNodesHandler.js +29 -39
- package/examples/jsm/tsl/display/AfterImageNode.js +2 -0
- package/examples/jsm/tsl/display/AnaglyphPassNode.js +3 -2
- package/examples/jsm/tsl/display/BilateralBlurNode.js +5 -2
- package/examples/jsm/tsl/display/BloomNode.js +55 -30
- package/examples/jsm/tsl/display/DenoiseNode.js +21 -1
- package/examples/jsm/tsl/display/DepthOfFieldNode.js +24 -6
- package/examples/jsm/tsl/display/DotScreenNode.js +11 -11
- package/examples/jsm/tsl/display/FSR1Node.js +8 -4
- package/examples/jsm/tsl/display/GTAONode.js +199 -86
- package/examples/jsm/tsl/display/GaussianBlurNode.js +65 -52
- package/examples/jsm/tsl/display/GodraysNode.js +5 -2
- package/examples/jsm/tsl/display/ImportanceSampledEnvironment.js +2 -2
- package/examples/jsm/tsl/display/LensflareNode.js +5 -2
- package/examples/jsm/tsl/display/OITPassNode.js +352 -0
- package/examples/jsm/tsl/display/OutlineNode.js +2 -0
- package/examples/jsm/tsl/display/ParallaxBarrierPassNode.js +3 -2
- package/examples/jsm/tsl/display/RGBShiftNode.js +9 -9
- package/examples/jsm/tsl/display/RecurrentDenoiseNode.js +7 -4
- package/examples/jsm/tsl/display/RetroPassNode.js +1 -1
- package/examples/jsm/tsl/display/SMAANode.js +22 -61
- package/examples/jsm/tsl/display/SSAAPassNode.js +2 -4
- package/examples/jsm/tsl/display/SSAONode.js +436 -0
- package/examples/jsm/tsl/display/SSGINode.js +5 -2
- package/examples/jsm/tsl/display/SSRNode.js +7 -2
- package/examples/jsm/tsl/display/SSSNode.js +5 -2
- package/examples/jsm/tsl/display/SharpenNode.js +5 -4
- package/examples/jsm/tsl/display/StereoCompositePassNode.js +1 -3
- package/examples/jsm/tsl/display/StereoPassNode.js +1 -3
- package/examples/jsm/tsl/display/TAAUNode.js +22 -125
- package/examples/jsm/tsl/display/TRAANode.js +16 -142
- package/examples/jsm/tsl/display/TemporalReprojectNode.js +21 -15
- package/examples/jsm/tsl/display/depthAwareBlur.js +63 -0
- package/examples/jsm/tsl/display/hashBlur.js +3 -2
- package/examples/jsm/tsl/lighting/ClusteredLightsNode.js +38 -27
- package/examples/jsm/tsl/lighting/LightProbeGridNode.js +136 -0
- package/examples/jsm/tsl/math/voronoiNoise.js +112 -0
- package/examples/jsm/tsl/shadows/TileShadowNode.js +4 -6
- package/examples/jsm/tsl/utils/Raymarching.js +5 -5
- package/examples/jsm/tsl/utils/SoftParticles.js +60 -0
- package/examples/jsm/tsl/utils/TAAUtils.js +195 -0
- package/examples/jsm/utils/BufferGeometryUtils.js +14 -14
- package/examples/jsm/utils/GaussianSplatUtils.js +229 -0
- package/examples/jsm/utils/WebGLTextureUtils.js +1 -1
- package/examples/jsm/utils/WebGPUTextureUtils.js +1 -1
- package/examples/jsm/webxr/WebGLXRFallback.js +2 -16
- package/examples/jsm/webxr/XRControllerModelFactory.js +16 -4
- package/package.json +9 -16
- package/src/Three.Core.js +2 -1
- package/src/Three.TSL.js +73 -43
- package/src/Three.WebGPU.Nodes.js +1 -0
- package/src/Three.WebGPU.js +1 -0
- package/src/animation/AnimationClip.js +15 -2
- package/src/animation/AnimationObjectGroup.js +18 -6
- package/src/animation/AnimationUtils.js +26 -0
- package/src/animation/KeyframeTrack.js +37 -0
- package/src/constants.js +23 -1
- package/src/core/BufferAttribute.js +3 -2
- package/src/core/BufferGeometry.js +1 -1
- package/src/core/InterleavedBuffer.js +5 -1
- package/src/core/Object3D.js +40 -12
- package/src/core/Raycaster.js +4 -0
- package/src/core/RenderTarget.js +99 -9
- package/src/core/RenderTarget3D.js +12 -8
- package/src/extras/Controls.js +0 -8
- package/src/extras/PMREMGenerator.js +99 -205
- package/src/geometries/TorusGeometry.js +1 -1
- package/src/helpers/ArrowHelper.js +2 -0
- package/src/helpers/AxesHelper.js +2 -0
- package/src/helpers/Box3Helper.js +2 -0
- package/src/helpers/BoxHelper.js +2 -0
- package/src/helpers/CameraHelper.js +2 -0
- package/src/helpers/DirectionalLightHelper.js +2 -0
- package/src/helpers/GridHelper.js +2 -0
- package/src/helpers/HemisphereLightHelper.js +2 -0
- package/src/helpers/PlaneHelper.js +2 -0
- package/src/helpers/PointLightHelper.js +2 -0
- package/src/helpers/PolarGridHelper.js +2 -0
- package/src/helpers/SkeletonHelper.js +2 -0
- package/src/helpers/SpotLightHelper.js +2 -0
- package/src/lights/Light.js +0 -10
- package/src/lights/LightShadow.js +43 -12
- package/src/lights/SpotLightShadow.js +18 -0
- package/src/loaders/BufferGeometryLoader.js +5 -0
- package/src/loaders/ImageBitmapLoader.js +3 -1
- package/src/loaders/ObjectLoader.js +8 -5
- package/src/materials/Material.js +80 -57
- package/src/materials/MeshPhysicalMaterial.js +32 -0
- package/src/materials/nodes/Line2NodeMaterial.js +17 -8
- package/src/materials/nodes/MeshPhysicalNodeMaterial.js +42 -5
- package/src/materials/nodes/NodeMaterial.js +19 -13
- package/src/materials/nodes/PointsNodeMaterial.js +2 -1
- package/src/materials/nodes/manager/NodeMaterialObserver.js +282 -55
- package/src/math/Frustum.js +9 -0
- package/src/math/FrustumArray.js +1 -1
- package/src/math/MathUtils.js +5 -3
- package/src/math/Matrix4.js +2 -9
- package/src/math/Plane.js +30 -1
- package/src/math/Quaternion.js +0 -10
- package/src/math/Ray.js +95 -45
- package/src/math/Triangle.js +0 -2
- package/src/math/Vector3.js +2 -2
- package/src/math/Vector4.js +0 -4
- package/src/math/interpolants/BezierInterpolant.js +36 -23
- package/src/nodes/Nodes.js +2 -0
- package/src/nodes/TSL.js +11 -3
- package/src/nodes/accessors/Batch.js +85 -13
- package/src/nodes/accessors/BufferAttributeNode.js +1 -1
- package/src/nodes/accessors/BuiltinNode.js +1 -1
- package/src/nodes/accessors/Instance.js +19 -18
- package/src/nodes/accessors/MaterialNode.js +9 -0
- package/src/nodes/accessors/ModelNode.js +85 -9
- package/src/nodes/accessors/ReferenceBaseNode.js +1 -70
- package/src/nodes/accessors/ReferenceElementNode.js +72 -0
- package/src/nodes/accessors/ReferenceNode.js +1 -70
- package/src/nodes/accessors/Skinning.js +124 -12
- package/src/nodes/accessors/StorageTextureNode.js +7 -3
- package/src/nodes/accessors/Texture3DNode.js +1 -1
- package/src/nodes/accessors/TextureNode.js +51 -21
- package/src/nodes/accessors/TextureSizeNode.js +4 -2
- package/src/nodes/accessors/UniformArrayNode.js +30 -5
- package/src/nodes/code/CodeNode.js +1 -1
- package/src/nodes/code/FunctionNode.js +12 -2
- package/src/nodes/core/ArrayNode.js +2 -2
- package/src/nodes/core/ContextNode.js +57 -4
- package/src/nodes/core/IndexNode.js +69 -4
- package/src/nodes/core/InspectorNode.js +2 -2
- package/src/nodes/core/MRTNode.js +44 -2
- package/src/nodes/core/Node.js +6 -3
- package/src/nodes/core/NodeBuilder.js +65 -50
- package/src/nodes/core/NodeFrame.js +11 -3
- package/src/nodes/core/NodeUtils.js +88 -0
- package/src/nodes/core/PropertyNode.js +8 -0
- package/src/nodes/core/StackNode.js +0 -1
- package/src/nodes/core/StructNode.js +4 -3
- package/src/nodes/core/UniformGroupNode.js +3 -2
- package/src/nodes/core/UniformNode.js +26 -12
- package/src/nodes/core/VarNode.js +0 -1
- package/src/nodes/display/BumpMapNode.js +2 -2
- package/src/nodes/display/ColorAdjustment.js +1 -1
- package/src/nodes/display/PassNode.js +76 -15
- package/src/nodes/display/ScreenNode.js +22 -65
- package/src/nodes/fog/Fog.js +4 -4
- package/src/nodes/functions/BSDF/BRDF_GGX.js +6 -6
- package/src/nodes/functions/BSDF/BRDF_Sheen.js +1 -1
- package/src/nodes/functions/BSDF/DFGLUT.js +2 -1
- package/src/nodes/functions/BSDF/LTC.js +1 -1
- package/src/nodes/functions/PhongLightingModel.js +1 -1
- package/src/nodes/functions/PhysicalLightingModel.js +83 -25
- package/src/nodes/functions/ToonLightingModel.js +2 -2
- package/src/nodes/functions/material/getParallaxCorrectNormal.js +3 -3
- package/src/nodes/gpgpu/AtomicFunctionNode.js +64 -13
- package/src/nodes/gpgpu/BarrierNode.js +13 -4
- package/src/nodes/gpgpu/ComputeBuiltinNode.js +1 -1
- package/src/nodes/gpgpu/ComputeNode.js +20 -17
- package/src/nodes/gpgpu/SubgroupFunctionNode.js +165 -37
- package/src/nodes/gpgpu/WorkgroupInfoNode.js +44 -6
- package/src/nodes/lighting/EnvironmentNode.js +40 -4
- package/src/nodes/lighting/LightsNode.js +20 -4
- package/src/nodes/lighting/ShadowBaseNode.js +158 -1
- package/src/nodes/lighting/ShadowFilterNode.js +2 -106
- package/src/nodes/lighting/ShadowNode.js +22 -91
- package/src/nodes/materialx/{lib/mx_hsv.js → MaterialXColor.js} +3 -6
- package/src/nodes/materialx/{lib/mx_transform_color.js → MaterialXColorTransform.js} +3 -6
- package/src/nodes/materialx/MaterialXCore.js +37 -0
- package/src/nodes/materialx/MaterialXNodes.js +64 -72
- package/src/nodes/materialx/{lib/mx_noise.js → MaterialXNoise.js} +426 -197
- package/src/nodes/math/BitcountNode.js +24 -4
- package/src/nodes/math/MathNode.js +4 -4
- package/src/nodes/math/MathUtils.js +15 -4
- package/src/nodes/math/OperatorNode.js +2 -2
- package/src/nodes/math/PackFloatNode.js +29 -1
- package/src/nodes/math/Packed4x8IntegerNode.js +433 -0
- package/src/nodes/math/UnpackFloatNode.js +30 -2
- package/src/nodes/parsers/GLSLNodeFunction.js +1 -1
- package/src/nodes/pmrem/PMREMNode.js +1 -1
- package/src/nodes/pmrem/PMREMUtils.js +31 -74
- package/src/nodes/shapes/Shapes.js +1 -1
- package/src/nodes/tsl/TSLCore.js +1 -31
- package/src/nodes/utils/EventNode.js +75 -0
- package/src/nodes/utils/LoopNode.js +54 -13
- package/src/nodes/utils/PostProcessingUtils.js +23 -2
- package/src/nodes/utils/RTTNode.js +97 -32
- package/src/nodes/utils/ReflectorNode.js +8 -4
- package/src/nodes/utils/RotateNode.js +85 -8
- package/src/nodes/utils/SpriteUtils.js +58 -23
- package/src/objects/BatchedMesh.js +6 -0
- package/src/objects/InstancedMesh.js +1 -1
- package/src/objects/LOD.js +1 -1
- package/src/objects/Line.js +12 -0
- package/src/objects/Mesh.js +12 -0
- package/src/objects/Points.js +12 -0
- package/src/objects/Sprite.js +12 -0
- package/src/renderers/WebGLRenderer.js +93 -27
- package/src/renderers/common/Animation.js +12 -2
- package/src/renderers/common/Backend.js +38 -10
- package/src/renderers/common/BindGroup.js +0 -1
- package/src/renderers/common/Bindings.js +50 -4
- package/src/renderers/common/BundleGroup.js +4 -0
- package/src/renderers/common/ClippingContext.js +11 -1
- package/src/renderers/common/Color4.js +9 -0
- package/src/renderers/common/Constants.js +0 -5
- package/src/renderers/common/DirectRenderPipeline.js +233 -0
- package/src/renderers/common/Geometries.js +24 -3
- package/src/renderers/common/Info.js +3 -3
- package/src/renderers/common/InspectorBase.js +37 -8
- package/src/renderers/common/Lighting.js +11 -4
- package/src/renderers/common/Pipelines.js +6 -4
- package/src/renderers/common/QuadMesh.js +16 -2
- package/src/renderers/common/RenderContext.js +8 -0
- package/src/renderers/common/RenderList.js +53 -19
- package/src/renderers/common/RenderLists.js +58 -11
- package/src/renderers/common/RenderObject.js +14 -0
- package/src/renderers/common/RenderObjects.js +14 -9
- package/src/renderers/common/RenderPipeline.js +52 -44
- package/src/renderers/common/Renderer.js +226 -55
- package/src/renderers/common/Storage3DTexture.js +16 -0
- package/src/renderers/common/Textures.js +3 -3
- package/src/renderers/common/XRManager.js +79 -72
- package/src/renderers/common/extras/PMREMGenerator.js +76 -144
- package/src/renderers/common/nodes/NodeManager.js +144 -6
- package/src/renderers/common/nodes/NodeStorageBuffer.js +3 -1
- package/src/renderers/common/nodes/NodeUniformBuffer.js +3 -1
- package/src/renderers/shaders/DFGLUTData.js +2 -1
- package/src/renderers/shaders/ShaderChunk/defaultnormal_vertex.glsl.js +4 -2
- package/src/renderers/shaders/ShaderChunk/envmap_physical_pars_fragment.glsl.js +48 -0
- package/src/renderers/shaders/ShaderChunk/lights_fragment_begin.glsl.js +53 -4
- package/src/renderers/shaders/ShaderChunk/lights_fragment_maps.glsl.js +20 -2
- package/src/renderers/shaders/ShaderChunk/lights_pars_begin.glsl.js +20 -0
- package/src/renderers/shaders/ShaderChunk/lights_physical_fragment.glsl.js +6 -0
- package/src/renderers/shaders/ShaderChunk/lights_physical_pars_fragment.glsl.js +61 -57
- package/src/renderers/shaders/ShaderChunk/shadowmap_pars_fragment.glsl.js +82 -0
- package/src/renderers/shaders/ShaderChunk/shadowmap_pars_vertex.glsl.js +9 -0
- package/src/renderers/shaders/ShaderChunk/shadowmap_vertex.glsl.js +8 -1
- package/src/renderers/shaders/ShaderChunk/shadowmask_pars_fragment.glsl.js +15 -0
- package/src/renderers/shaders/ShaderLib/meshphysical.glsl.js +4 -0
- package/src/renderers/shaders/ShaderLib.js +1 -0
- package/src/renderers/shaders/UniformsLib.js +16 -0
- package/src/renderers/webgl/WebGLAnimation.js +2 -2
- package/src/renderers/webgl/WebGLCapabilities.js +2 -2
- package/src/renderers/webgl/WebGLLights.js +74 -4
- package/src/renderers/webgl/WebGLMaterials.js +6 -0
- package/src/renderers/webgl/WebGLOutput.js +36 -24
- package/src/renderers/webgl/WebGLProgram.js +3 -0
- package/src/renderers/webgl/WebGLPrograms.js +8 -0
- package/src/renderers/webgl/WebGLRenderLists.js +6 -10
- package/src/renderers/webgl/WebGLShadowMap.js +47 -44
- package/src/renderers/webgl/WebGLTextures.js +7 -7
- package/src/renderers/webgl-fallback/WebGLBackend.js +153 -45
- package/src/renderers/webgl-fallback/nodes/GLSLNodeBuilder.js +83 -29
- package/src/renderers/webgl-fallback/utils/WebGLState.js +163 -17
- package/src/renderers/webgl-fallback/utils/WebGLTextureUtils.js +32 -5
- package/src/renderers/webgl-fallback/utils/WebGLTimestampQueryPool.js +11 -4
- package/src/renderers/webgpu/WebGPUBackend.js +513 -145
- package/src/renderers/webgpu/nodes/WGSLNodeBuilder.js +99 -20
- package/src/renderers/webgpu/nodes/WGSLNodeFunction.js +2 -1
- package/src/renderers/webgpu/utils/WebGPUAttributeUtils.js +3 -12
- package/src/renderers/webgpu/utils/WebGPUBindingUtils.js +24 -14
- package/src/renderers/webgpu/utils/WebGPUPipelineUtils.js +80 -14
- package/src/renderers/webgpu/utils/WebGPUTextureUtils.js +62 -7
- package/src/renderers/webgpu/utils/WebGPUTimestampQueryPool.js +9 -3
- package/src/renderers/webgpu/utils/WebGPUUtils.js +16 -4
- package/src/renderers/webxr/WebXRManager.js +25 -2
- package/src/scenes/Scene.js +3 -3
- package/src/textures/CompressedArrayTexture.js +16 -0
- package/src/textures/Data3DTexture.js +16 -0
- package/src/textures/DataArrayTexture.js +16 -0
- package/src/textures/DepthTexture.js +3 -3
- package/src/textures/Texture.js +3 -3
- package/src/textures/{Source.js → TextureSource.js} +39 -8
- package/src/utils.js +6 -79
- package/build/three.core.min.js +0 -6
- package/build/three.module.min.js +0 -6
- package/build/three.tsl.min.js +0 -6
- package/build/three.webgpu.min.js +0 -6
- package/build/three.webgpu.nodes.min.js +0 -6
- package/examples/jsm/libs/ecsy.module.js +0 -1792
- package/examples/jsm/loaders/LottieLoader.js +0 -130
- package/src/nodes/functions/BSDF/BRDF_GGX_Multiscatter.js +0 -52
|
@@ -16,7 +16,7 @@ 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, Compatibility } from '../../../constants.js';
|
|
19
|
+
import { FloatType, RepeatWrapping, ClampToEdgeWrapping, MirroredRepeatWrapping, NearestFilter, Compatibility, ShortType, UnsignedShortType } from '../../../constants.js';
|
|
20
20
|
import { warn, error } from '../../../utils.js';
|
|
21
21
|
|
|
22
22
|
import { GPUShaderStage } from '../utils/WebGPUConstants.js';
|
|
@@ -231,15 +231,49 @@ const wgslMethods = {
|
|
|
231
231
|
inverse_mat3: 'tsl_inverse_mat3',
|
|
232
232
|
inverse_mat4: 'tsl_inverse_mat4',
|
|
233
233
|
inversesqrt: 'inverseSqrt',
|
|
234
|
+
faceforward: 'faceForward',
|
|
234
235
|
bitcast: 'bitcast<f32>',
|
|
235
236
|
floatpack_snorm_2x16: 'pack2x16snorm',
|
|
236
237
|
floatpack_unorm_2x16: 'pack2x16unorm',
|
|
237
238
|
floatpack_float16_2x16: 'pack2x16float',
|
|
239
|
+
floatpack_snorm_4x8: 'pack4x8snorm',
|
|
240
|
+
floatpack_unorm_4x8: 'pack4x8unorm',
|
|
238
241
|
floatunpack_snorm_2x16: 'unpack2x16snorm',
|
|
239
242
|
floatunpack_unorm_2x16: 'unpack2x16unorm',
|
|
240
|
-
floatunpack_float16_2x16: 'unpack2x16float'
|
|
243
|
+
floatunpack_float16_2x16: 'unpack2x16float',
|
|
244
|
+
floatunpack_snorm_4x8: 'unpack4x8snorm',
|
|
245
|
+
floatunpack_unorm_4x8: 'unpack4x8unorm'
|
|
241
246
|
};
|
|
242
247
|
|
|
248
|
+
// See: https://www.w3.org/TR/WGSL/#keyword-summary and #reserved-words-section
|
|
249
|
+
|
|
250
|
+
const wgslReservedKeywords = new Set( [
|
|
251
|
+
// keywords
|
|
252
|
+
'alias', 'break', 'case', 'const', 'const_assert', 'continue', 'continuing', 'default', 'diagnostic',
|
|
253
|
+
'discard', 'else', 'enable', 'false', 'fn', 'for', 'if', 'let', 'loop', 'override', 'requires',
|
|
254
|
+
'return', 'struct', 'switch', 'true', 'var', 'while',
|
|
255
|
+
// reserved words
|
|
256
|
+
'NULL', 'Self', 'abstract', 'active', 'alignas', 'alignof', 'as', 'asm', 'asm_fragment', 'async',
|
|
257
|
+
'attribute', 'auto', 'await', 'become', 'binding_array', 'cast', 'catch', 'class', 'co_await',
|
|
258
|
+
'co_return', 'co_yield', 'coherent', 'column_major', 'common', 'compile', 'compile_fragment',
|
|
259
|
+
'concept', 'const_cast', 'consteval', 'constexpr', 'constinit', 'crate', 'debugger', 'decltype',
|
|
260
|
+
'delete', 'demote', 'demote_to_helper', 'do', 'dynamic_cast', 'enum', 'explicit', 'export',
|
|
261
|
+
'extends', 'extern', 'external', 'fallthrough', 'filter', 'final', 'finally', 'friend', 'from',
|
|
262
|
+
'fxgroup', 'get', 'goto', 'groupshared', 'highp', 'impl', 'implements', 'import', 'inline',
|
|
263
|
+
'instanceof', 'interface', 'layout', 'lowp', 'macro', 'macro_rules', 'match', 'mediump', 'meta',
|
|
264
|
+
'mod', 'module', 'move', 'mut', 'mutable', 'namespace', 'new', 'nil', 'noexcept', 'noinline',
|
|
265
|
+
'nointerpolation', 'non_coherent', 'noncoherent', 'noperspective', 'null', 'nullptr', 'of',
|
|
266
|
+
'operator', 'package', 'packoffset', 'partition', 'pass', 'patch', 'pixelfragment', 'precise',
|
|
267
|
+
'precision', 'premerge', 'priv', 'protected', 'pub', 'public', 'readonly', 'ref', 'regardless',
|
|
268
|
+
'register', 'reinterpret_cast', 'require', 'resource', 'restrict', 'self', 'set', 'shared',
|
|
269
|
+
'sizeof', 'smooth', 'snorm', 'static', 'static_assert', 'static_cast', 'std', 'subroutine',
|
|
270
|
+
'super', 'target', 'template', 'this', 'thread_local', 'throw', 'trait', 'try', 'type', 'typedef',
|
|
271
|
+
'typeid', 'typename', 'typeof', 'union', 'unless', 'unorm', 'unsafe', 'unsized', 'use', 'using',
|
|
272
|
+
'varying', 'virtual', 'volatile', 'wgsl', 'where', 'with', 'writeonly', 'yield',
|
|
273
|
+
// generated entry points
|
|
274
|
+
'main'
|
|
275
|
+
] );
|
|
276
|
+
|
|
243
277
|
//
|
|
244
278
|
|
|
245
279
|
let diagnostics = '';
|
|
@@ -590,6 +624,25 @@ class WGSLNodeBuilder extends NodeBuilder {
|
|
|
590
624
|
|
|
591
625
|
}
|
|
592
626
|
|
|
627
|
+
/**
|
|
628
|
+
* Generates the WGSL snippet that resolves the dimensions of the given texture.
|
|
629
|
+
*
|
|
630
|
+
* @param {Texture} texture - The texture.
|
|
631
|
+
* @param {string} textureProperty - The name of the texture uniform in the shader.
|
|
632
|
+
* @param {string} levelSnippet - A WGSL snippet that represents the mip level.
|
|
633
|
+
* @return {string} The WGSL snippet.
|
|
634
|
+
*/
|
|
635
|
+
generateTextureSize( texture, textureProperty, levelSnippet ) {
|
|
636
|
+
|
|
637
|
+
const { primarySamples } = this.renderer.backend.utils.getTextureSampleData( texture );
|
|
638
|
+
const isMultisampled = primarySamples > 1;
|
|
639
|
+
|
|
640
|
+
const params = ( isMultisampled || texture.isStorageTexture ) ? textureProperty : `${ textureProperty }, ${ levelSnippet }`;
|
|
641
|
+
|
|
642
|
+
return `textureDimensions( ${ params } )`;
|
|
643
|
+
|
|
644
|
+
}
|
|
645
|
+
|
|
593
646
|
/**
|
|
594
647
|
* Generates the WGSL snippet for a manual filtered texture.
|
|
595
648
|
*
|
|
@@ -806,7 +859,8 @@ class WGSLNodeBuilder extends NodeBuilder {
|
|
|
806
859
|
return this.getComponentTypeFromTexture( texture ) !== 'float' ||
|
|
807
860
|
( ! this.isAvailable( 'float32Filterable' ) && texture.type === FloatType ) ||
|
|
808
861
|
( this.isSampleCompare( texture ) === false && texture.minFilter === NearestFilter && texture.magFilter === NearestFilter ) ||
|
|
809
|
-
this.renderer.backend.utils.getTextureSampleData( texture ).primarySamples > 1
|
|
862
|
+
this.renderer.backend.utils.getTextureSampleData( texture ).primarySamples > 1 ||
|
|
863
|
+
texture.normalized === true && ( texture.type === ShortType || texture.type === UnsignedShortType );
|
|
810
864
|
|
|
811
865
|
}
|
|
812
866
|
|
|
@@ -939,7 +993,6 @@ class WGSLNodeBuilder extends NodeBuilder {
|
|
|
939
993
|
* @param {string} gatherSnippet - A WGSL snippet that represents the index of the channel to read.
|
|
940
994
|
* @param {?string} depthSnippet - A WGSL snippet that represents 0-based texture array index to sample.
|
|
941
995
|
* @param {?string} offsetSnippet - A WGSL snippet that represents the offset that will be applied to the unnormalized texture coordinate before sampling the texture.
|
|
942
|
-
* @param {?string} flipYSnippet - A WGSL snippet that represents the y-flip. Only used for WebGL.
|
|
943
996
|
* @return {string} The WGSL snippet.
|
|
944
997
|
*/
|
|
945
998
|
generateTextureGather( texture, textureProperty, uvSnippet, gatherSnippet, depthSnippet, offsetSnippet ) {
|
|
@@ -977,7 +1030,6 @@ class WGSLNodeBuilder extends NodeBuilder {
|
|
|
977
1030
|
* @param {string} compareSnippet - A WGSL snippet that represents the reference value.
|
|
978
1031
|
* @param {?string} depthSnippet - A WGSL snippet that represents 0-based texture array index to sample.
|
|
979
1032
|
* @param {?string} offsetSnippet - A WGSL snippet that represents the offset that will be applied to the unnormalized texture coordinate before sampling the texture.
|
|
980
|
-
* @param {?string} flipYSnippet - A WGSL snippet that represents the y-flip. Only used for WebGL.
|
|
981
1033
|
* @return {string} The WGSL snippet.
|
|
982
1034
|
*/
|
|
983
1035
|
generateTextureGatherCompare( texture, textureProperty, uvSnippet, compareSnippet, depthSnippet, offsetSnippet ) {
|
|
@@ -1013,7 +1065,6 @@ class WGSLNodeBuilder extends NodeBuilder {
|
|
|
1013
1065
|
* @param {string} levelSnippet - A WGSL snippet that represents the mip level, with level 0 containing a full size version of the texture.
|
|
1014
1066
|
* @param {?string} depthSnippet - A WGSL snippet that represents 0-based texture array index to sample.
|
|
1015
1067
|
* @param {?string} offsetSnippet - A WGSL snippet that represents the offset that will be applied to the unnormalized texture coordinate before sampling the texture.
|
|
1016
|
-
* @param {string} [shaderStage=this.shaderStage] - The shader stage this code snippet is generated for.
|
|
1017
1068
|
* @return {string} The WGSL snippet.
|
|
1018
1069
|
*/
|
|
1019
1070
|
generateTextureLevel( texture, textureProperty, uvSnippet, levelSnippet, depthSnippet, offsetSnippet ) {
|
|
@@ -1148,6 +1199,18 @@ class WGSLNodeBuilder extends NodeBuilder {
|
|
|
1148
1199
|
|
|
1149
1200
|
}
|
|
1150
1201
|
|
|
1202
|
+
/**
|
|
1203
|
+
* Returns whether the given name is a reserved keyword of WGSL.
|
|
1204
|
+
*
|
|
1205
|
+
* @param {string} name - The name to test.
|
|
1206
|
+
* @return {boolean} Whether the name is a reserved keyword or not.
|
|
1207
|
+
*/
|
|
1208
|
+
isReservedKeyword( name ) {
|
|
1209
|
+
|
|
1210
|
+
return wgslReservedKeywords.has( name );
|
|
1211
|
+
|
|
1212
|
+
}
|
|
1213
|
+
|
|
1151
1214
|
/**
|
|
1152
1215
|
* Returns the output struct name.
|
|
1153
1216
|
*
|
|
@@ -1194,7 +1257,16 @@ class WGSLNodeBuilder extends NodeBuilder {
|
|
|
1194
1257
|
|
|
1195
1258
|
if ( node.isAtomic === true ) {
|
|
1196
1259
|
|
|
1197
|
-
|
|
1260
|
+
// Per the WGSL spec, atomic built-in functions are only allowed in
|
|
1261
|
+
// the fragment and compute stages, not in the vertex stage.
|
|
1262
|
+
|
|
1263
|
+
if ( shaderStage === 'vertex' ) {
|
|
1264
|
+
|
|
1265
|
+
warn( 'WebGPURenderer: Atomic operations are not supported in the vertex stage. They are only available in the fragment and compute stages.' );
|
|
1266
|
+
|
|
1267
|
+
return NodeAccess.READ_ONLY;
|
|
1268
|
+
|
|
1269
|
+
}
|
|
1198
1270
|
|
|
1199
1271
|
return NodeAccess.READ_WRITE;
|
|
1200
1272
|
|
|
@@ -1730,9 +1802,10 @@ ${ flowData.code }
|
|
|
1730
1802
|
* @param {string} scope - The scope.
|
|
1731
1803
|
* @param {string} bufferType - The buffer type.
|
|
1732
1804
|
* @param {string} bufferCount - The buffer count.
|
|
1805
|
+
* @param {boolean} isAtomic - Whether the array elements are atomic or not.
|
|
1733
1806
|
* @return {string} The array name.
|
|
1734
1807
|
*/
|
|
1735
|
-
getScopedArray( name, scope, bufferType, bufferCount ) {
|
|
1808
|
+
getScopedArray( name, scope, bufferType, bufferCount, isAtomic ) {
|
|
1736
1809
|
|
|
1737
1810
|
if ( this.scopedArrays.has( name ) === false ) {
|
|
1738
1811
|
|
|
@@ -1740,7 +1813,8 @@ ${ flowData.code }
|
|
|
1740
1813
|
name,
|
|
1741
1814
|
scope,
|
|
1742
1815
|
bufferType,
|
|
1743
|
-
bufferCount
|
|
1816
|
+
bufferCount,
|
|
1817
|
+
isAtomic
|
|
1744
1818
|
} );
|
|
1745
1819
|
|
|
1746
1820
|
}
|
|
@@ -1766,9 +1840,11 @@ ${ flowData.code }
|
|
|
1766
1840
|
|
|
1767
1841
|
const snippets = [];
|
|
1768
1842
|
|
|
1769
|
-
for ( const { name, scope, bufferType, bufferCount } of this.scopedArrays.values() ) {
|
|
1843
|
+
for ( const { name, scope, bufferType, bufferCount, isAtomic } of this.scopedArrays.values() ) {
|
|
1844
|
+
|
|
1845
|
+
let type = this.getType( bufferType );
|
|
1770
1846
|
|
|
1771
|
-
|
|
1847
|
+
if ( isAtomic === true ) type = `atomic<${type}>`;
|
|
1772
1848
|
|
|
1773
1849
|
snippets.push( `var<${scope}> ${name}: array< ${type}, ${bufferCount} >;` );
|
|
1774
1850
|
|
|
@@ -2072,7 +2148,7 @@ ${ flowData.code }
|
|
|
2072
2148
|
|
|
2073
2149
|
if ( needsSampler ) {
|
|
2074
2150
|
|
|
2075
|
-
if ( this.isSampleCompare( texture ) && textureNode.
|
|
2151
|
+
if ( this.isSampleCompare( texture ) && textureNode.isSampleCompare() ) {
|
|
2076
2152
|
|
|
2077
2153
|
bindingSnippets.push( `@binding( ${ uniformIndexes.binding ++ } ) @group( ${ uniformIndexes.group } ) var ${ uniform.name }_sampler : sampler_comparison;` );
|
|
2078
2154
|
|
|
@@ -2130,11 +2206,13 @@ ${ flowData.code }
|
|
|
2130
2206
|
|
|
2131
2207
|
} else if ( texture.isArrayTexture === true || texture.isDataArrayTexture === true || texture.isCompressedArrayTexture === true ) {
|
|
2132
2208
|
|
|
2133
|
-
|
|
2209
|
+
const componentPrefix = this.getComponentTypeFromTexture( texture ).charAt( 0 );
|
|
2210
|
+
textureType = `texture_2d_array<${ componentPrefix }32>`;
|
|
2134
2211
|
|
|
2135
2212
|
} else if ( texture.is3DTexture === true || texture.isData3DTexture === true ) {
|
|
2136
2213
|
|
|
2137
|
-
|
|
2214
|
+
const componentPrefix = this.getComponentTypeFromTexture( texture ).charAt( 0 );
|
|
2215
|
+
textureType = `texture_3d<${ componentPrefix }32>`;
|
|
2138
2216
|
|
|
2139
2217
|
} else {
|
|
2140
2218
|
|
|
@@ -2337,8 +2415,7 @@ ${ flowData.code }
|
|
|
2337
2415
|
} else {
|
|
2338
2416
|
|
|
2339
2417
|
// Early strictly validated in computeNode
|
|
2340
|
-
|
|
2341
|
-
const workgroupSize = this.object.workgroupSize;
|
|
2418
|
+
const workgroupSize = this.compute.workgroupSize;
|
|
2342
2419
|
|
|
2343
2420
|
this.computeShader = this._getWGSLComputeCode( shadersData.compute, workgroupSize );
|
|
2344
2421
|
|
|
@@ -2391,11 +2468,12 @@ ${ flowData.code }
|
|
|
2391
2468
|
* Returns the float packing method name for a given numeric encoding.
|
|
2392
2469
|
*
|
|
2393
2470
|
* @param {string} encoding - The numeric encoding that describes how the float values are mapped to the integer range.
|
|
2471
|
+
* @param {string} [layout='2x16'] - The component layout of the packed integer.
|
|
2394
2472
|
* @returns {string} The resolve WGSL float packing method name.
|
|
2395
2473
|
*/
|
|
2396
|
-
getFloatPackingMethod( encoding ) {
|
|
2474
|
+
getFloatPackingMethod( encoding, layout = '2x16' ) {
|
|
2397
2475
|
|
|
2398
|
-
return this.getMethod( `floatpack_${ encoding }
|
|
2476
|
+
return this.getMethod( `floatpack_${ encoding }_${ layout }` );
|
|
2399
2477
|
|
|
2400
2478
|
}
|
|
2401
2479
|
|
|
@@ -2403,11 +2481,12 @@ ${ flowData.code }
|
|
|
2403
2481
|
* Returns the float unpacking method name for a given numeric encoding.
|
|
2404
2482
|
*
|
|
2405
2483
|
* @param {string} encoding - The numeric encoding that describes how the integer values are mapped to the float range.
|
|
2484
|
+
* @param {string} [layout='2x16'] - The component layout of the packed integer.
|
|
2406
2485
|
* @returns {string} The resolve WGSL float unpacking method name.
|
|
2407
2486
|
*/
|
|
2408
|
-
getFloatUnpackingMethod( encoding ) {
|
|
2487
|
+
getFloatUnpackingMethod( encoding, layout = '2x16' ) {
|
|
2409
2488
|
|
|
2410
|
-
return this.getMethod( `floatunpack_${ encoding }
|
|
2489
|
+
return this.getMethod( `floatunpack_${ encoding }_${ layout }` );
|
|
2411
2490
|
|
|
2412
2491
|
}
|
|
2413
2492
|
|
|
@@ -50,6 +50,7 @@ const wgslTypeLib = {
|
|
|
50
50
|
'mat4x4f': 'mat4',
|
|
51
51
|
|
|
52
52
|
'sampler': 'sampler',
|
|
53
|
+
'sampler_comparison': 'samplerComparison',
|
|
53
54
|
|
|
54
55
|
'texture_1d': 'texture',
|
|
55
56
|
|
|
@@ -77,7 +78,7 @@ const wgslTypeLib = {
|
|
|
77
78
|
|
|
78
79
|
const parse = ( source ) => {
|
|
79
80
|
|
|
80
|
-
source = source.
|
|
81
|
+
source = source.replace( /^(?:\s*\/\/[^\r\n]*|\s*\/\*[\s\S]*?\*\/|\s*)+/, '' );
|
|
81
82
|
|
|
82
83
|
const declaration = source.match( declarationRegexp );
|
|
83
84
|
|
|
@@ -14,8 +14,8 @@ const typedArraysToVertexFormatPrefix = new Map( [
|
|
|
14
14
|
[ Uint8Array, [ 'uint8', 'unorm8' ]],
|
|
15
15
|
[ Int16Array, [ 'sint16', 'snorm16' ]],
|
|
16
16
|
[ Uint16Array, [ 'uint16', 'unorm16' ]],
|
|
17
|
-
[ Int32Array, [ 'sint32'
|
|
18
|
-
[ Uint32Array, [ 'uint32'
|
|
17
|
+
[ Int32Array, [ 'sint32' ]],
|
|
18
|
+
[ Uint32Array, [ 'uint32' ]],
|
|
19
19
|
[ Float32Array, [ 'float32', ]],
|
|
20
20
|
] );
|
|
21
21
|
|
|
@@ -31,9 +31,7 @@ const typedAttributeToVertexFormatPrefix = new Map( [
|
|
|
31
31
|
|
|
32
32
|
const typeArraysToVertexFormatPrefixForItemSize1 = new Map( [
|
|
33
33
|
[ Int32Array, 'sint32' ],
|
|
34
|
-
[ Int16Array, 'sint32' ], // patch for INT16
|
|
35
34
|
[ Uint32Array, 'uint32' ],
|
|
36
|
-
[ Uint16Array, 'uint32' ], // patch for UINT16
|
|
37
35
|
[ Float32Array, 'float32' ]
|
|
38
36
|
] );
|
|
39
37
|
|
|
@@ -82,7 +80,7 @@ class WebGPUAttributeUtils {
|
|
|
82
80
|
let array = bufferAttribute.array;
|
|
83
81
|
|
|
84
82
|
// patch for INT16 and UINT16
|
|
85
|
-
if ( attribute.normalized === false ) {
|
|
83
|
+
if ( attribute.normalized === false && attribute.isInterleavedBufferAttribute !== true ) {
|
|
86
84
|
|
|
87
85
|
if ( array.constructor === Int16Array || array.constructor === Int8Array ) {
|
|
88
86
|
|
|
@@ -321,13 +319,6 @@ class WebGPUAttributeUtils {
|
|
|
321
319
|
|
|
322
320
|
}
|
|
323
321
|
|
|
324
|
-
// patch for INT16 and UINT16
|
|
325
|
-
if ( geometryAttribute.normalized === false && ( geometryAttribute.array.constructor === Int16Array || geometryAttribute.array.constructor === Uint16Array ) ) {
|
|
326
|
-
|
|
327
|
-
arrayStride = 4;
|
|
328
|
-
|
|
329
|
-
}
|
|
330
|
-
|
|
331
322
|
vertexBufferLayout = {
|
|
332
323
|
arrayStride,
|
|
333
324
|
attributes: [],
|
|
@@ -3,7 +3,7 @@ import {
|
|
|
3
3
|
GPUSamplerBindingType, GPUShaderStage
|
|
4
4
|
} from './WebGPUConstants.js';
|
|
5
5
|
|
|
6
|
-
import { FloatType, IntType, UnsignedIntType, Compatibility } from '../../../constants.js';
|
|
6
|
+
import { FloatType, IntType, UnsignedIntType, Compatibility, UnsignedShortType, ShortType } from '../../../constants.js';
|
|
7
7
|
import { NodeAccess } from '../../../nodes/core/constants.js';
|
|
8
8
|
import { isTypedArray, error } from '../../../utils.js';
|
|
9
9
|
import { hashString } from '../../../nodes/core/NodeUtils.js';
|
|
@@ -137,10 +137,10 @@ class WebGPUBindingUtils {
|
|
|
137
137
|
*
|
|
138
138
|
* @param {BindGroup} bindGroup - The bind group.
|
|
139
139
|
* @param {Array<BindGroup>} bindings - Array of bind groups.
|
|
140
|
-
* @param {
|
|
140
|
+
* @param {string} cacheKey - The cache key.
|
|
141
141
|
* @param {number} version - The version.
|
|
142
142
|
*/
|
|
143
|
-
createBindings( bindGroup, bindings,
|
|
143
|
+
createBindings( bindGroup, bindings, cacheKey, version = 0 ) {
|
|
144
144
|
|
|
145
145
|
const { backend } = this;
|
|
146
146
|
const bindingsData = backend.get( bindGroup );
|
|
@@ -151,18 +151,18 @@ class WebGPUBindingUtils {
|
|
|
151
151
|
|
|
152
152
|
let bindGroupGPU;
|
|
153
153
|
|
|
154
|
-
if (
|
|
154
|
+
if ( cacheKey !== '' ) {
|
|
155
155
|
|
|
156
156
|
if ( bindingsData.groups === undefined ) {
|
|
157
157
|
|
|
158
|
-
bindingsData.groups =
|
|
159
|
-
bindingsData.versions =
|
|
158
|
+
bindingsData.groups = {};
|
|
159
|
+
bindingsData.versions = {};
|
|
160
160
|
|
|
161
161
|
}
|
|
162
162
|
|
|
163
|
-
if ( bindingsData.versions[
|
|
163
|
+
if ( bindingsData.versions[ cacheKey ] === version ) {
|
|
164
164
|
|
|
165
|
-
bindGroupGPU = bindingsData.groups[
|
|
165
|
+
bindGroupGPU = bindingsData.groups[ cacheKey ];
|
|
166
166
|
|
|
167
167
|
}
|
|
168
168
|
|
|
@@ -172,10 +172,10 @@ class WebGPUBindingUtils {
|
|
|
172
172
|
|
|
173
173
|
bindGroupGPU = this.createBindGroup( bindGroup, bindLayoutGPU );
|
|
174
174
|
|
|
175
|
-
if (
|
|
175
|
+
if ( cacheKey !== '' ) {
|
|
176
176
|
|
|
177
|
-
bindingsData.groups[
|
|
178
|
-
bindingsData.versions[
|
|
177
|
+
bindingsData.groups[ cacheKey ] = bindGroupGPU;
|
|
178
|
+
bindingsData.versions[ cacheKey ] = version;
|
|
179
179
|
|
|
180
180
|
}
|
|
181
181
|
|
|
@@ -439,8 +439,6 @@ class WebGPUBindingUtils {
|
|
|
439
439
|
|
|
440
440
|
if ( binding.visibility & GPUShaderStage.COMPUTE ) {
|
|
441
441
|
|
|
442
|
-
// compute
|
|
443
|
-
|
|
444
442
|
if ( binding.access === NodeAccess.READ_WRITE || binding.access === NodeAccess.WRITE_ONLY ) {
|
|
445
443
|
|
|
446
444
|
buffer.type = GPUBufferBindingType.Storage;
|
|
@@ -451,6 +449,14 @@ class WebGPUBindingUtils {
|
|
|
451
449
|
|
|
452
450
|
}
|
|
453
451
|
|
|
452
|
+
} else if ( binding.nodeUniform && binding.nodeUniform.isAtomic && ( binding.visibility & GPUShaderStage.FRAGMENT ) ) {
|
|
453
|
+
|
|
454
|
+
// Atomic buffers require a read_write storage binding. Per the WGSL
|
|
455
|
+
// spec this is only valid in the fragment stage (compute is handled
|
|
456
|
+
// above), so the vertex stage falls back to read-only storage.
|
|
457
|
+
|
|
458
|
+
buffer.type = GPUBufferBindingType.Storage;
|
|
459
|
+
|
|
454
460
|
} else {
|
|
455
461
|
|
|
456
462
|
buffer.type = GPUBufferBindingType.ReadOnlyStorage;
|
|
@@ -536,6 +542,10 @@ class WebGPUBindingUtils {
|
|
|
536
542
|
|
|
537
543
|
texture.sampleType = GPUTextureSampleType.UInt;
|
|
538
544
|
|
|
545
|
+
} else if ( binding.texture.normalized === true && ( type === ShortType || type === UnsignedShortType ) ) {
|
|
546
|
+
|
|
547
|
+
texture.sampleType = GPUTextureSampleType.UnfilterableFloat;
|
|
548
|
+
|
|
539
549
|
} else if ( type === FloatType ) {
|
|
540
550
|
|
|
541
551
|
if ( this.backend.hasFeature( 'float32-filterable' ) ) {
|
|
@@ -574,7 +584,7 @@ class WebGPUBindingUtils {
|
|
|
574
584
|
|
|
575
585
|
if ( binding.texture.isDepthTexture ) {
|
|
576
586
|
|
|
577
|
-
if ( binding.texture.compareFunction !== null && binding.textureNode.
|
|
587
|
+
if ( binding.texture.compareFunction !== null && binding.textureNode.isSampleCompare() && backend.hasCompatibility( Compatibility.TEXTURE_COMPARE ) ) {
|
|
578
588
|
|
|
579
589
|
sampler.type = GPUSamplerBindingType.Comparison;
|
|
580
590
|
|
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
import { BlendColorFactor, OneMinusBlendColorFactor, } from '../../common/Constants.js';
|
|
2
|
-
|
|
3
1
|
import {
|
|
4
2
|
GPUFrontFace, GPUCullMode, GPUColorWriteFlags, GPUCompareFunction, GPUBlendFactor, GPUBlendOperation, GPUIndexFormat, GPUStencilOperation, GPUPrimitiveTopology
|
|
5
3
|
} from './WebGPUConstants.js';
|
|
@@ -10,6 +8,7 @@ import {
|
|
|
10
8
|
NoBlending, NormalBlending, AdditiveBlending, SubtractiveBlending, MultiplyBlending, CustomBlending, MaterialBlending,
|
|
11
9
|
ZeroFactor, OneFactor, SrcColorFactor, OneMinusSrcColorFactor, SrcAlphaFactor, OneMinusSrcAlphaFactor, DstColorFactor,
|
|
12
10
|
OneMinusDstColorFactor, DstAlphaFactor, OneMinusDstAlphaFactor, SrcAlphaSaturateFactor,
|
|
11
|
+
ConstantColorFactor, OneMinusConstantColorFactor, ConstantAlphaFactor, OneMinusConstantAlphaFactor,
|
|
13
12
|
AddEquation, SubtractEquation, ReverseSubtractEquation, MinEquation, MaxEquation,
|
|
14
13
|
KeepStencilOp, ZeroStencilOp, ReplaceStencilOp, InvertStencilOp, IncrementStencilOp, DecrementStencilOp, IncrementWrapStencilOp, DecrementWrapStencilOp,
|
|
15
14
|
NeverStencilFunc, AlwaysStencilFunc, LessStencilFunc, LessEqualStencilFunc, EqualStencilFunc, GreaterEqualStencilFunc, GreaterStencilFunc, NotEqualStencilFunc
|
|
@@ -376,8 +375,9 @@ class WebGPUPipelineUtils {
|
|
|
376
375
|
*
|
|
377
376
|
* @param {ComputePipeline} pipeline - The compute pipeline.
|
|
378
377
|
* @param {Array<BindGroup>} bindings - The bindings.
|
|
378
|
+
* @param {?Array<Promise>} [promises=null] - Optional compilation promises.
|
|
379
379
|
*/
|
|
380
|
-
createComputePipeline( pipeline, bindings ) {
|
|
380
|
+
createComputePipeline( pipeline, bindings, promises = null ) {
|
|
381
381
|
|
|
382
382
|
const backend = this.backend;
|
|
383
383
|
const device = backend.device;
|
|
@@ -414,23 +414,87 @@ class WebGPUPipelineUtils {
|
|
|
414
414
|
_computePipelineDescriptor.compute = computeProgram;
|
|
415
415
|
_computePipelineDescriptor.layout = pipelineLayout;
|
|
416
416
|
|
|
417
|
-
|
|
417
|
+
if ( promises === null ) {
|
|
418
|
+
|
|
419
|
+
pipelineGPU.pipeline = device.createComputePipeline( _computePipelineDescriptor );
|
|
420
|
+
|
|
421
|
+
_computePipelineDescriptor.reset();
|
|
418
422
|
|
|
419
|
-
|
|
423
|
+
device.popErrorScope().then( ( err ) => {
|
|
420
424
|
|
|
421
|
-
|
|
425
|
+
if ( err !== null ) {
|
|
422
426
|
|
|
423
|
-
|
|
427
|
+
pipelineGPU.error = true;
|
|
424
428
|
|
|
425
|
-
|
|
429
|
+
error( `WebGPURenderer: Compute pipeline creation failed (${ pipelineLabel }): ${ err.message }` );
|
|
426
430
|
|
|
427
|
-
|
|
431
|
+
this._reportShaderDiagnostics( [ { program: computeStage, module: computeProgram.module } ], pipelineLabel );
|
|
428
432
|
|
|
429
|
-
|
|
433
|
+
}
|
|
430
434
|
|
|
431
|
-
}
|
|
435
|
+
} );
|
|
436
|
+
|
|
437
|
+
} else {
|
|
438
|
+
|
|
439
|
+
const promise = new Promise( async ( resolve /*, reject*/ ) => {
|
|
440
|
+
|
|
441
|
+
try {
|
|
442
|
+
|
|
443
|
+
let asyncError = null;
|
|
444
|
+
let pipelinePromise = null;
|
|
445
|
+
|
|
446
|
+
try {
|
|
447
|
+
|
|
448
|
+
pipelinePromise = device.createComputePipelineAsync( _computePipelineDescriptor );
|
|
449
|
+
|
|
450
|
+
} catch ( err ) {
|
|
451
|
+
|
|
452
|
+
asyncError = err;
|
|
453
|
+
|
|
454
|
+
}
|
|
455
|
+
|
|
456
|
+
_computePipelineDescriptor.reset();
|
|
457
|
+
|
|
458
|
+
if ( pipelinePromise !== null ) {
|
|
459
|
+
|
|
460
|
+
try {
|
|
432
461
|
|
|
433
|
-
|
|
462
|
+
pipelineGPU.pipeline = await pipelinePromise;
|
|
463
|
+
|
|
464
|
+
} catch ( err ) {
|
|
465
|
+
|
|
466
|
+
asyncError = err;
|
|
467
|
+
|
|
468
|
+
}
|
|
469
|
+
|
|
470
|
+
}
|
|
471
|
+
|
|
472
|
+
const errorScope = await device.popErrorScope();
|
|
473
|
+
|
|
474
|
+
if ( errorScope !== null || asyncError !== null ) {
|
|
475
|
+
|
|
476
|
+
pipelineGPU.error = true;
|
|
477
|
+
|
|
478
|
+
const reason = ( errorScope && errorScope.message ) || ( asyncError && asyncError.message ) || 'unknown';
|
|
479
|
+
error( `WebGPURenderer: Async compute pipeline creation failed (${ pipelineLabel }): ${ reason }` );
|
|
480
|
+
|
|
481
|
+
await this._reportShaderDiagnostics( [ { program: computeStage, module: computeProgram.module } ], pipelineLabel );
|
|
482
|
+
|
|
483
|
+
}
|
|
484
|
+
|
|
485
|
+
} finally {
|
|
486
|
+
|
|
487
|
+
// Guarantee resolution so `compileComputeAsync`'s Promise.all cannot hang on an
|
|
488
|
+
// unexpected throw from any await above.
|
|
489
|
+
resolve();
|
|
490
|
+
|
|
491
|
+
}
|
|
492
|
+
|
|
493
|
+
} );
|
|
494
|
+
|
|
495
|
+
promises.push( promise );
|
|
496
|
+
|
|
497
|
+
}
|
|
434
498
|
|
|
435
499
|
}
|
|
436
500
|
|
|
@@ -649,11 +713,13 @@ class WebGPUPipelineUtils {
|
|
|
649
713
|
blendFactor = GPUBlendFactor.SrcAlphaSaturated;
|
|
650
714
|
break;
|
|
651
715
|
|
|
652
|
-
case
|
|
716
|
+
case ConstantColorFactor:
|
|
717
|
+
case ConstantAlphaFactor: // WebGPU has no dedicated constant alpha blend factors
|
|
653
718
|
blendFactor = GPUBlendFactor.Constant;
|
|
654
719
|
break;
|
|
655
720
|
|
|
656
|
-
case
|
|
721
|
+
case OneMinusConstantColorFactor:
|
|
722
|
+
case OneMinusConstantAlphaFactor: // WebGPU has no dedicated constant alpha blend factors
|
|
657
723
|
blendFactor = GPUBlendFactor.OneMinusConstant;
|
|
658
724
|
break;
|
|
659
725
|
|