super-three 0.152.0 → 0.154.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 +779 -557
- package/build/three.js +779 -557
- package/build/three.min.js +2 -1
- package/build/three.module.js +770 -539
- package/build/three.module.min.js +2 -1
- package/examples/jsm/cameras/CinematicCamera.js +1 -2
- package/examples/jsm/capabilities/WebGPU.js +15 -1
- package/examples/jsm/controls/ArcballControls.js +2 -1
- package/examples/jsm/controls/FlyControls.js +25 -9
- package/examples/jsm/controls/OrbitControls.js +5 -1
- package/examples/jsm/csm/CSM.js +1 -3
- package/examples/jsm/effects/AnaglyphEffect.js +6 -20
- package/examples/jsm/effects/OutlineEffect.js +1 -1
- package/examples/jsm/effects/ParallaxBarrierEffect.js +3 -0
- package/examples/jsm/environments/RoomEnvironment.js +6 -2
- package/examples/jsm/exporters/GLTFExporter.js +74 -2
- package/examples/jsm/exporters/USDZExporter.js +170 -129
- package/examples/jsm/helpers/ViewHelper.js +1 -1
- package/examples/jsm/lines/LineMaterial.js +1 -1
- package/examples/jsm/loaders/3DMLoader.js +1 -1
- package/examples/jsm/loaders/3MFLoader.js +5 -1
- package/examples/jsm/loaders/AMFLoader.js +5 -1
- package/examples/jsm/loaders/ColladaLoader.js +4 -1
- package/examples/jsm/loaders/DRACOLoader.js +2 -0
- package/examples/jsm/loaders/FBXLoader.js +9 -2
- package/examples/jsm/loaders/GLTFLoader.js +230 -94
- package/examples/jsm/loaders/KTX2Loader.js +106 -47
- package/examples/jsm/loaders/LDrawLoader.js +4 -7
- package/examples/jsm/loaders/MMDLoader.js +40 -13
- package/examples/jsm/loaders/PCDLoader.js +25 -10
- package/examples/jsm/loaders/PDBLoader.js +7 -2
- package/examples/jsm/loaders/PLYLoader.js +30 -8
- package/examples/jsm/loaders/STLLoader.js +8 -3
- package/examples/jsm/loaders/VRMLLoader.js +55 -7
- package/examples/jsm/loaders/VTKLoader.js +12 -4
- package/examples/jsm/loaders/XYZLoader.js +9 -3
- package/examples/jsm/materials/MeshGouraudMaterial.js +2 -2
- package/examples/jsm/math/Lut.js +5 -4
- package/examples/jsm/math/MeshSurfaceSampler.js +82 -37
- package/examples/jsm/misc/GPUComputationRenderer.js +1 -0
- package/examples/jsm/misc/VolumeSlice.js +3 -1
- package/examples/jsm/nodes/Nodes.js +22 -16
- package/examples/jsm/nodes/accessors/BufferAttributeNode.js +99 -0
- package/examples/jsm/nodes/accessors/BufferNode.js +2 -2
- package/examples/jsm/nodes/accessors/CameraNode.js +25 -4
- package/examples/jsm/nodes/accessors/ExtendedMaterialNode.js +7 -1
- package/examples/jsm/nodes/accessors/InstanceNode.js +29 -12
- package/examples/jsm/nodes/accessors/MaterialNode.js +55 -47
- package/examples/jsm/nodes/accessors/MaterialReferenceNode.js +2 -2
- package/examples/jsm/nodes/accessors/ModelNode.js +3 -1
- package/examples/jsm/nodes/accessors/ModelViewProjectionNode.js +4 -9
- package/examples/jsm/nodes/accessors/MorphNode.js +70 -0
- package/examples/jsm/nodes/accessors/NormalNode.js +3 -2
- package/examples/jsm/nodes/accessors/Object3DNode.js +10 -2
- package/examples/jsm/nodes/accessors/ReferenceNode.js +2 -2
- package/examples/jsm/nodes/accessors/SceneNode.js +46 -0
- package/examples/jsm/nodes/accessors/SkinningNode.js +43 -62
- package/examples/jsm/nodes/accessors/StorageBufferNode.js +2 -2
- package/examples/jsm/nodes/accessors/TangentNode.js +2 -2
- package/examples/jsm/nodes/accessors/TextureBicubicNode.js +94 -0
- package/examples/jsm/nodes/accessors/TextureNode.js +68 -6
- package/examples/jsm/nodes/accessors/TextureSizeNode.js +35 -0
- package/examples/jsm/nodes/accessors/UVNode.js +1 -1
- package/examples/jsm/nodes/code/CodeNode.js +3 -0
- package/examples/jsm/nodes/code/FunctionNode.js +25 -4
- package/examples/jsm/nodes/core/AttributeNode.js +1 -1
- package/examples/jsm/nodes/core/BypassNode.js +2 -2
- package/examples/jsm/nodes/core/ContextNode.js +2 -0
- package/examples/jsm/nodes/core/IndexNode.js +66 -0
- package/examples/jsm/nodes/core/LightingModel.js +2 -1
- package/examples/jsm/nodes/core/Node.js +13 -16
- package/examples/jsm/nodes/core/NodeAttribute.js +2 -1
- package/examples/jsm/nodes/core/NodeBuilder.js +86 -8
- package/examples/jsm/nodes/core/NodeUtils.js +10 -0
- package/examples/jsm/nodes/core/PropertyNode.js +6 -2
- package/examples/jsm/nodes/core/StackNode.js +8 -1
- package/examples/jsm/nodes/core/UniformNode.js +1 -1
- package/examples/jsm/nodes/core/VarNode.js +1 -3
- package/examples/jsm/nodes/display/BlendModeNode.js +9 -9
- package/examples/jsm/nodes/display/ColorAdjustmentNode.js +7 -7
- package/examples/jsm/nodes/display/ColorSpaceNode.js +50 -49
- package/examples/jsm/nodes/display/NormalMapNode.js +3 -3
- package/examples/jsm/nodes/display/ToneMappingNode.js +24 -15
- package/examples/jsm/nodes/display/ViewportDepthNode.js +69 -0
- package/examples/jsm/nodes/display/ViewportDepthTextureNode.js +34 -0
- package/examples/jsm/nodes/display/ViewportSharedTextureNode.js +7 -6
- package/examples/jsm/nodes/display/ViewportTextureNode.js +33 -19
- package/examples/jsm/nodes/functions/BSDF/BRDF_BlinnPhong.js +5 -5
- package/examples/jsm/nodes/functions/BSDF/BRDF_GGX.js +10 -8
- package/examples/jsm/nodes/functions/BSDF/BRDF_Lambert.js +2 -2
- package/examples/jsm/nodes/functions/BSDF/BRDF_Sheen.js +43 -0
- package/examples/jsm/nodes/functions/BSDF/DFGApprox.js +4 -4
- package/examples/jsm/nodes/functions/BSDF/D_GGX.js +2 -2
- package/examples/jsm/nodes/functions/BSDF/EnvironmentBRDF.js +13 -0
- package/examples/jsm/nodes/functions/BSDF/F_Schlick.js +2 -4
- package/examples/jsm/nodes/functions/BSDF/V_GGX_SmithCorrelated.js +2 -2
- package/examples/jsm/nodes/functions/PhongLightingModel.js +7 -7
- package/examples/jsm/nodes/functions/PhysicalLightingModel.js +132 -19
- package/examples/jsm/nodes/functions/material/getGeometryRoughness.js +2 -2
- package/examples/jsm/nodes/functions/material/getRoughness.js +3 -3
- package/examples/jsm/nodes/geometry/RangeNode.js +33 -51
- package/examples/jsm/nodes/lighting/AnalyticLightNode.js +6 -3
- package/examples/jsm/nodes/lighting/DirectionalLightNode.js +2 -2
- package/examples/jsm/nodes/lighting/EnvironmentNode.js +107 -62
- package/examples/jsm/nodes/lighting/HemisphereLightNode.js +2 -2
- package/examples/jsm/nodes/lighting/LightUtils.js +2 -2
- package/examples/jsm/nodes/lighting/LightingContextNode.js +17 -15
- package/examples/jsm/nodes/lighting/PointLightNode.js +3 -3
- package/examples/jsm/nodes/lighting/SpotLightNode.js +3 -3
- package/examples/jsm/nodes/materials/LineBasicNodeMaterial.js +0 -15
- package/examples/jsm/nodes/materials/MeshBasicNodeMaterial.js +0 -15
- package/examples/jsm/nodes/materials/MeshNormalNodeMaterial.js +0 -10
- package/examples/jsm/nodes/materials/MeshPhongNodeMaterial.js +0 -9
- package/examples/jsm/nodes/materials/MeshPhysicalNodeMaterial.js +41 -0
- package/examples/jsm/nodes/materials/MeshStandardNodeMaterial.js +1 -14
- package/examples/jsm/nodes/materials/NodeMaterial.js +119 -29
- package/examples/jsm/nodes/materials/PointsNodeMaterial.js +0 -9
- package/examples/jsm/nodes/materials/SpriteNodeMaterial.js +0 -7
- package/examples/jsm/nodes/materialx/lib/mx_hsv.js +3 -3
- package/examples/jsm/nodes/materialx/lib/mx_noise.js +14 -14
- package/examples/jsm/nodes/materialx/lib/mx_transform_color.js +4 -4
- package/examples/jsm/nodes/math/MathNode.js +6 -0
- package/examples/jsm/nodes/math/OperatorNode.js +1 -1
- package/examples/jsm/nodes/procedural/CheckerNode.js +3 -3
- package/examples/jsm/nodes/shadernode/ShaderNode.js +60 -33
- package/examples/jsm/nodes/utils/EquirectUVNode.js +2 -3
- package/examples/jsm/nodes/utils/LoopNode.js +186 -0
- package/examples/jsm/nodes/utils/TriplanarTexturesNode.js +1 -1
- package/examples/jsm/objects/GroundProjectedSkybox.js +1 -1
- package/examples/jsm/objects/Lensflare.js +3 -4
- package/examples/jsm/objects/MarchingCubes.js +5 -1
- package/examples/jsm/objects/Reflector.js +4 -1
- package/examples/jsm/objects/Refractor.js +1 -1
- package/examples/jsm/objects/Sky.js +1 -1
- package/examples/jsm/objects/Water.js +2 -1
- package/examples/jsm/objects/Water2.js +1 -1
- package/examples/jsm/offscreen/scene.js +1 -0
- package/examples/jsm/physics/RapierPhysics.js +93 -133
- package/examples/jsm/postprocessing/AfterimagePass.js +3 -0
- package/examples/jsm/postprocessing/BloomPass.js +7 -2
- package/examples/jsm/postprocessing/BokehPass.js +3 -2
- package/examples/jsm/postprocessing/DotScreenPass.js +1 -0
- package/examples/jsm/postprocessing/EffectComposer.js +4 -1
- package/examples/jsm/postprocessing/FilmPass.js +1 -0
- package/examples/jsm/postprocessing/OutlinePass.js +8 -9
- package/examples/jsm/postprocessing/OutputPass.js +72 -0
- package/examples/jsm/postprocessing/RenderPixelatedPass.js +4 -3
- package/examples/jsm/postprocessing/SAOPass.js +4 -2
- package/examples/jsm/postprocessing/SMAAPass.js +5 -2
- package/examples/jsm/postprocessing/SSAARenderPass.js +5 -13
- package/examples/jsm/postprocessing/SSAOPass.js +4 -2
- package/examples/jsm/postprocessing/SSRPass.js +3 -1
- package/examples/jsm/postprocessing/SavePass.js +5 -2
- package/examples/jsm/postprocessing/ShaderPass.js +1 -0
- package/examples/jsm/postprocessing/TAARenderPass.js +17 -4
- package/examples/jsm/postprocessing/TexturePass.js +2 -1
- package/examples/jsm/postprocessing/UnrealBloomPass.js +13 -13
- package/examples/jsm/renderers/{webgpu/WebGPUAnimation.js → common/Animation.js} +2 -2
- package/examples/jsm/renderers/common/Attributes.js +75 -0
- package/examples/jsm/renderers/common/Backend.js +162 -0
- package/examples/jsm/renderers/common/Background.js +134 -0
- package/examples/jsm/renderers/common/Binding.js +11 -0
- package/examples/jsm/renderers/common/Bindings.js +169 -0
- package/examples/jsm/renderers/common/Buffer.js +38 -0
- package/examples/jsm/renderers/{webgpu/WebGPUBufferUtils.js → common/BufferUtils.js} +2 -2
- package/examples/jsm/renderers/{webgpu/WebGPUWeakMap.js → common/ChainMap.js} +11 -5
- package/examples/jsm/renderers/common/ComputePipeline.js +17 -0
- package/examples/jsm/renderers/common/Constants.js +14 -0
- package/examples/jsm/renderers/common/CubeRenderTarget.js +65 -0
- package/examples/jsm/renderers/common/DataMap.js +54 -0
- package/examples/jsm/renderers/{webgpu/WebGPUGeometries.js → common/Geometries.js} +38 -37
- package/examples/jsm/renderers/{webgpu/WebGPUInfo.js → common/Info.js} +2 -3
- package/examples/jsm/renderers/common/Pipeline.js +13 -0
- package/examples/jsm/renderers/common/Pipelines.js +321 -0
- package/examples/jsm/renderers/common/ProgrammableStage.js +18 -0
- package/examples/jsm/renderers/common/RenderContext.js +37 -0
- package/examples/jsm/renderers/common/RenderContexts.js +38 -0
- package/examples/jsm/renderers/{webgpu/WebGPURenderLists.js → common/RenderList.js} +2 -39
- package/examples/jsm/renderers/common/RenderLists.js +38 -0
- package/examples/jsm/renderers/common/RenderObject.js +113 -0
- package/examples/jsm/renderers/common/RenderObjects.js +92 -0
- package/examples/jsm/renderers/common/RenderPipeline.js +16 -0
- package/examples/jsm/renderers/{webgpu/WebGPURenderTarget.js → common/RenderTarget.js} +2 -2
- package/examples/jsm/renderers/common/Renderer.js +864 -0
- package/examples/jsm/renderers/common/SampledTexture.js +80 -0
- package/examples/jsm/renderers/common/Sampler.js +18 -0
- package/examples/jsm/renderers/common/StorageBuffer.js +17 -0
- package/examples/jsm/renderers/common/Textures.js +206 -0
- package/examples/jsm/renderers/{webgpu/WebGPUUniform.js → common/Uniform.js} +13 -9
- package/examples/jsm/renderers/common/UniformBuffer.js +15 -0
- package/examples/jsm/renderers/{webgpu/WebGPUUniformsGroup.js → common/UniformsGroup.js} +13 -13
- package/examples/jsm/renderers/{webgpu/nodes/WebGPUNodes.js → common/nodes/NodeRender.js} +3 -3
- package/examples/jsm/renderers/{webgpu/nodes/WebGPUNodeSampledTexture.js → common/nodes/NodeSampledTexture.js} +4 -4
- package/examples/jsm/renderers/{webgpu/nodes/WebGPUNodeSampler.js → common/nodes/NodeSampler.js} +3 -3
- package/examples/jsm/renderers/{webgpu/nodes/WebGPUNodeUniform.js → common/nodes/NodeUniform.js} +1 -1
- package/examples/jsm/renderers/common/nodes/Nodes.js +319 -0
- package/examples/jsm/renderers/webgl/nodes/GLSLNodeBuilder.js +340 -0
- package/examples/jsm/renderers/webgl/nodes/WebGLNodeBuilder.js +23 -19
- package/examples/jsm/renderers/webgpu/WebGPUBackend.js +847 -0
- package/examples/jsm/renderers/webgpu/WebGPURenderer.js +15 -1131
- package/examples/jsm/renderers/webgpu/nodes/{WebGPUNodeBuilder.js → WGSLNodeBuilder.js} +75 -45
- package/examples/jsm/{nodes/parsers → renderers/webgpu/nodes}/WGSLNodeFunction.js +2 -2
- package/examples/jsm/{nodes/parsers → renderers/webgpu/nodes}/WGSLNodeParser.js +1 -1
- package/examples/jsm/renderers/webgpu/utils/WebGPUAttributeUtils.js +255 -0
- package/examples/jsm/renderers/webgpu/utils/WebGPUBindingUtils.js +145 -0
- package/examples/jsm/renderers/webgpu/{constants.js → utils/WebGPUConstants.js} +6 -7
- package/examples/jsm/renderers/webgpu/{WebGPURenderPipeline.js → utils/WebGPUPipelineUtils.js} +154 -247
- package/examples/jsm/renderers/webgpu/{WebGPUTextureUtils.js → utils/WebGPUTextureMipmapUtils.js} +3 -25
- package/examples/jsm/renderers/webgpu/{WebGPUTextures.js → utils/WebGPUTextureUtils.js} +392 -505
- package/examples/jsm/renderers/webgpu/utils/WebGPUUtils.js +92 -0
- package/examples/jsm/shaders/BleachBypassShader.js +2 -0
- package/examples/jsm/shaders/BlendShader.js +1 -2
- package/examples/jsm/shaders/BokehShader2.js +3 -0
- package/examples/jsm/shaders/ColorifyShader.js +2 -0
- package/examples/jsm/shaders/ConvolutionShader.js +2 -0
- package/examples/jsm/shaders/CopyShader.js +4 -2
- package/examples/jsm/shaders/DotScreenShader.js +2 -0
- package/examples/jsm/shaders/ExposureShader.js +44 -0
- package/examples/jsm/shaders/FilmShader.js +2 -0
- package/examples/jsm/shaders/GammaCorrectionShader.js +2 -0
- package/examples/jsm/shaders/HorizontalBlurShader.js +2 -0
- package/examples/jsm/shaders/OutputShader.js +61 -0
- package/examples/jsm/shaders/RGBShiftShader.js +2 -0
- package/examples/jsm/shaders/SepiaShader.js +2 -0
- package/examples/jsm/shaders/ToonShader.js +13 -5
- package/examples/jsm/shaders/VerticalBlurShader.js +2 -0
- package/examples/jsm/shaders/VignetteShader.js +2 -0
- package/examples/jsm/shaders/WaterRefractionShader.js +5 -2
- package/examples/jsm/utils/BufferGeometryUtils.js +17 -1
- package/examples/jsm/utils/TextureUtils.js +86 -0
- package/examples/jsm/webxr/OculusHandPointerModel.js +34 -13
- package/examples/jsm/webxr/XRHandPrimitiveModel.js +1 -0
- package/examples/jsm/webxr/XRPlanes.js +100 -0
- package/package.json +3 -1
- package/src/Three.Legacy.js +0 -228
- package/src/audio/PositionalAudio.js +8 -0
- package/src/cameras/Camera.js +5 -0
- package/src/cameras/CubeCamera.js +76 -13
- package/src/cameras/OrthographicCamera.js +1 -1
- package/src/cameras/PerspectiveCamera.js +1 -1
- package/src/constants.js +13 -1
- package/src/core/BufferAttribute.js +3 -25
- package/src/core/BufferGeometry.js +1 -8
- package/src/core/Object3D.js +1 -1
- package/src/extras/core/Curve.js +1 -1
- package/src/loaders/CubeTextureLoader.js +2 -0
- package/src/loaders/Loader.js +2 -0
- package/src/loaders/MaterialLoader.js +5 -0
- package/src/loaders/ObjectLoader.js +1 -0
- package/src/materials/Material.js +13 -1
- package/src/materials/MeshPhysicalMaterial.js +32 -6
- package/src/math/Color.js +16 -11
- package/src/math/Frustum.js +16 -2
- package/src/math/MathUtils.js +16 -0
- package/src/math/Matrix3.js +26 -6
- package/src/math/Matrix4.js +74 -19
- package/src/objects/InstancedMesh.js +3 -0
- package/src/objects/Mesh.js +14 -10
- package/src/objects/Skeleton.js +1 -3
- package/src/objects/SkinnedMesh.js +36 -8
- package/src/renderers/WebGLRenderer.js +126 -21
- package/src/renderers/shaders/ShaderChunk/alphahash_fragment.glsl.js +7 -0
- package/src/renderers/shaders/ShaderChunk/alphahash_pars_fragment.glsl.js +68 -0
- package/src/renderers/shaders/ShaderChunk/begin_vertex.glsl.js +6 -0
- package/src/renderers/shaders/ShaderChunk/common.glsl.js +6 -0
- package/src/renderers/shaders/ShaderChunk/envmap_physical_pars_fragment.glsl.js +26 -3
- package/src/renderers/shaders/ShaderChunk/lights_fragment_maps.glsl.js +9 -1
- package/src/renderers/shaders/ShaderChunk/lights_physical_fragment.glsl.js +26 -0
- package/src/renderers/shaders/ShaderChunk/lights_physical_pars_fragment.glsl.js +52 -2
- package/src/renderers/shaders/ShaderChunk/normal_fragment_begin.glsl.js +10 -2
- package/src/renderers/shaders/ShaderChunk/normalmap_pars_fragment.glsl.js +1 -1
- package/src/renderers/shaders/ShaderChunk/{output_fragment.glsl.js → opaque_fragment.glsl.js} +1 -2
- package/src/renderers/shaders/ShaderChunk/tonemapping_pars_fragment.glsl.js +1 -1
- package/src/renderers/shaders/ShaderChunk/transmission_fragment.glsl.js +3 -3
- package/src/renderers/shaders/ShaderChunk/transmission_pars_fragment.glsl.js +10 -5
- package/src/renderers/shaders/ShaderChunk/uv_pars_fragment.glsl.js +6 -1
- package/src/renderers/shaders/ShaderChunk/uv_pars_vertex.glsl.js +7 -1
- package/src/renderers/shaders/ShaderChunk/uv_vertex.glsl.js +6 -1
- package/src/renderers/shaders/ShaderChunk.js +10 -6
- package/src/renderers/shaders/ShaderLib/background.glsl.js +1 -1
- package/src/renderers/shaders/ShaderLib/backgroundCube.glsl.js +1 -1
- package/src/renderers/shaders/ShaderLib/cube.glsl.js +1 -1
- package/src/renderers/shaders/ShaderLib/depth.glsl.js +2 -0
- package/src/renderers/shaders/ShaderLib/distanceRGBA.glsl.js +2 -0
- package/src/renderers/shaders/ShaderLib/equirect.glsl.js +1 -1
- package/src/renderers/shaders/ShaderLib/linedashed.glsl.js +2 -2
- package/src/renderers/shaders/ShaderLib/meshbasic.glsl.js +4 -2
- package/src/renderers/shaders/ShaderLib/meshlambert.glsl.js +4 -2
- package/src/renderers/shaders/ShaderLib/meshmatcap.glsl.js +4 -2
- package/src/renderers/shaders/ShaderLib/meshphong.glsl.js +4 -2
- package/src/renderers/shaders/ShaderLib/meshphysical.glsl.js +12 -2
- package/src/renderers/shaders/ShaderLib/meshtoon.glsl.js +4 -2
- package/src/renderers/shaders/ShaderLib/points.glsl.js +4 -2
- package/src/renderers/shaders/ShaderLib/shadow.glsl.js +1 -1
- package/src/renderers/shaders/ShaderLib/sprite.glsl.js +4 -2
- package/src/renderers/shaders/ShaderLib.js +4 -1
- package/src/renderers/shaders/UniformsLib.js +2 -0
- package/src/renderers/webgl/WebGLBindingStates.js +13 -5
- package/src/renderers/webgl/WebGLGeometries.js +12 -0
- package/src/renderers/webgl/WebGLInfo.js +0 -1
- package/src/renderers/webgl/WebGLMaterials.js +18 -0
- package/src/renderers/webgl/WebGLObjects.js +23 -3
- package/src/renderers/webgl/WebGLProgram.js +43 -5
- package/src/renderers/webgl/WebGLPrograms.js +19 -7
- package/src/renderers/webgl/WebGLTextures.js +19 -1
- package/src/renderers/webvr/WebVRManager.js +12 -0
- package/src/renderers/webxr/WebXRManager.js +39 -99
- package/src/scenes/Scene.js +0 -14
- package/src/textures/DepthTexture.js +22 -0
- package/src/textures/FramebufferTexture.js +1 -3
- package/src/textures/Source.js +4 -0
- package/src/textures/Texture.js +1 -1
- package/examples/jsm/exporters/ColladaExporter.js +0 -725
- package/examples/jsm/geometries/LightningStrike.js +0 -1017
- package/examples/jsm/loaders/PRWMLoader.js +0 -299
- package/examples/jsm/nodes/core/InstanceIndexNode.js +0 -26
- package/examples/jsm/objects/LightningStorm.js +0 -245
- package/examples/jsm/postprocessing/AdaptiveToneMappingPass.js +0 -361
- package/examples/jsm/renderers/webgpu/WebGPUAttributes.js +0 -197
- package/examples/jsm/renderers/webgpu/WebGPUBackground.js +0 -190
- package/examples/jsm/renderers/webgpu/WebGPUBinding.js +0 -22
- package/examples/jsm/renderers/webgpu/WebGPUBindings.js +0 -270
- package/examples/jsm/renderers/webgpu/WebGPUBuffer.js +0 -43
- package/examples/jsm/renderers/webgpu/WebGPUComputePipelines.js +0 -78
- package/examples/jsm/renderers/webgpu/WebGPUProgrammableStage.js +0 -22
- package/examples/jsm/renderers/webgpu/WebGPUProperties.js +0 -44
- package/examples/jsm/renderers/webgpu/WebGPURenderObject.js +0 -40
- package/examples/jsm/renderers/webgpu/WebGPURenderObjects.js +0 -50
- package/examples/jsm/renderers/webgpu/WebGPURenderPipelines.js +0 -274
- package/examples/jsm/renderers/webgpu/WebGPURenderStates.js +0 -54
- package/examples/jsm/renderers/webgpu/WebGPUSampledTexture.js +0 -75
- package/examples/jsm/renderers/webgpu/WebGPUSampler.js +0 -29
- package/examples/jsm/renderers/webgpu/WebGPUStorageBuffer.js +0 -20
- package/examples/jsm/renderers/webgpu/WebGPUTextureRenderer.js +0 -38
- package/examples/jsm/renderers/webgpu/WebGPUUniformBuffer.js +0 -18
- package/examples/jsm/renderers/webgpu/WebGPUUtils.js +0 -88
- package/examples/jsm/shaders/ToneMapShader.js +0 -73
- /package/src/renderers/shaders/ShaderChunk/{encodings_fragment.glsl.js → colorspace_fragment.glsl.js} +0 -0
- /package/src/renderers/shaders/ShaderChunk/{encodings_pars_fragment.glsl.js → colorspace_pars_fragment.glsl.js} +0 -0
|
@@ -1,24 +1,31 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { NoColorSpace } from 'three';
|
|
2
|
+
|
|
3
|
+
import UniformsGroup from '../../common/UniformsGroup.js';
|
|
2
4
|
import {
|
|
3
5
|
FloatNodeUniform, Vector2NodeUniform, Vector3NodeUniform, Vector4NodeUniform,
|
|
4
6
|
ColorNodeUniform, Matrix3NodeUniform, Matrix4NodeUniform
|
|
5
|
-
} from '
|
|
6
|
-
import
|
|
7
|
-
import {
|
|
7
|
+
} from '../../common/nodes/NodeUniform.js';
|
|
8
|
+
import NodeSampler from '../../common/nodes/NodeSampler.js';
|
|
9
|
+
import { NodeSampledTexture, NodeSampledCubeTexture } from '../../common/nodes/NodeSampledTexture.js';
|
|
10
|
+
|
|
11
|
+
import UniformBuffer from '../../common/UniformBuffer.js';
|
|
12
|
+
import StorageBuffer from '../../common/StorageBuffer.js';
|
|
13
|
+
import { getVectorLength, getStrideLength } from '../../common/BufferUtils.js';
|
|
8
14
|
|
|
9
|
-
import
|
|
10
|
-
import
|
|
11
|
-
import { getVectorLength, getStrideLength } from '../WebGPUBufferUtils.js';
|
|
15
|
+
import RenderTarget from '../../common/RenderTarget.js';
|
|
16
|
+
import CubeRenderTarget from '../../common/CubeRenderTarget.js';
|
|
12
17
|
|
|
13
|
-
import
|
|
18
|
+
import { NodeBuilder, CodeNode, NodeMaterial } from '../../../nodes/Nodes.js';
|
|
14
19
|
|
|
15
|
-
import
|
|
20
|
+
import WGSLNodeParser from './WGSLNodeParser.js';
|
|
16
21
|
|
|
22
|
+
/*
|
|
17
23
|
const gpuShaderStageLib = {
|
|
18
24
|
'vertex': GPUShaderStage.VERTEX,
|
|
19
25
|
'fragment': GPUShaderStage.FRAGMENT,
|
|
20
26
|
'compute': GPUShaderStage.COMPUTE
|
|
21
27
|
};
|
|
28
|
+
*/
|
|
22
29
|
|
|
23
30
|
const supports = {
|
|
24
31
|
instance: true
|
|
@@ -91,14 +98,11 @@ fn threejs_repeatWrapping( uv : vec2<f32>, dimension : vec2<u32> ) -> vec2<u32>
|
|
|
91
98
|
` )
|
|
92
99
|
};
|
|
93
100
|
|
|
94
|
-
class
|
|
95
|
-
|
|
96
|
-
constructor( object, renderer ) {
|
|
101
|
+
class WGSLNodeBuilder extends NodeBuilder {
|
|
97
102
|
|
|
98
|
-
|
|
103
|
+
constructor( object, renderer, scene = null ) {
|
|
99
104
|
|
|
100
|
-
|
|
101
|
-
this.bindingsOffset = { vertex: 0, fragment: 0, compute: 0 };
|
|
105
|
+
super( object, renderer, new WGSLNodeParser(), scene );
|
|
102
106
|
|
|
103
107
|
this.uniformsGroup = {};
|
|
104
108
|
|
|
@@ -129,6 +133,12 @@ class WebGPUNodeBuilder extends NodeBuilder {
|
|
|
129
133
|
|
|
130
134
|
}
|
|
131
135
|
|
|
136
|
+
needsColorSpaceToLinear( texture ) {
|
|
137
|
+
|
|
138
|
+
return texture.isVideoTexture === true && texture.colorSpace !== NoColorSpace;
|
|
139
|
+
|
|
140
|
+
}
|
|
141
|
+
|
|
132
142
|
getSampler( textureProperty, uvSnippet, shaderStage = this.shaderStage ) {
|
|
133
143
|
|
|
134
144
|
if ( shaderStage === 'fragment' ) {
|
|
@@ -250,17 +260,9 @@ class WebGPUNodeBuilder extends NodeBuilder {
|
|
|
250
260
|
|
|
251
261
|
}
|
|
252
262
|
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
const bindings = this.bindings;
|
|
256
|
-
|
|
257
|
-
return this.material !== null ? [ ...bindings.vertex, ...bindings.fragment ] : bindings.compute;
|
|
258
|
-
|
|
259
|
-
}
|
|
260
|
-
|
|
261
|
-
getUniformFromNode( node, shaderStage, type ) {
|
|
263
|
+
getUniformFromNode( node, type, shaderStage, name = null ) {
|
|
262
264
|
|
|
263
|
-
const uniformNode = super.getUniformFromNode( node, shaderStage,
|
|
265
|
+
const uniformNode = super.getUniformFromNode( node, type, shaderStage, name );
|
|
264
266
|
const nodeData = this.getDataFromNode( node, shaderStage );
|
|
265
267
|
|
|
266
268
|
if ( nodeData.uniformGPU === undefined ) {
|
|
@@ -271,17 +273,17 @@ class WebGPUNodeBuilder extends NodeBuilder {
|
|
|
271
273
|
|
|
272
274
|
if ( type === 'texture' || type === 'cubeTexture' ) {
|
|
273
275
|
|
|
274
|
-
const sampler = new
|
|
276
|
+
const sampler = new NodeSampler( `${uniformNode.name}_sampler`, uniformNode.node );
|
|
275
277
|
|
|
276
278
|
let texture = null;
|
|
277
279
|
|
|
278
280
|
if ( type === 'texture' ) {
|
|
279
281
|
|
|
280
|
-
texture = new
|
|
282
|
+
texture = new NodeSampledTexture( uniformNode.name, uniformNode.node );
|
|
281
283
|
|
|
282
284
|
} else if ( type === 'cubeTexture' ) {
|
|
283
285
|
|
|
284
|
-
texture = new
|
|
286
|
+
texture = new NodeSampledCubeTexture( uniformNode.name, uniformNode.node );
|
|
285
287
|
|
|
286
288
|
}
|
|
287
289
|
|
|
@@ -305,9 +307,9 @@ class WebGPUNodeBuilder extends NodeBuilder {
|
|
|
305
307
|
|
|
306
308
|
} else if ( type === 'buffer' || type === 'storageBuffer' ) {
|
|
307
309
|
|
|
308
|
-
const bufferClass = type === 'storageBuffer' ?
|
|
310
|
+
const bufferClass = type === 'storageBuffer' ? StorageBuffer : UniformBuffer;
|
|
309
311
|
const buffer = new bufferClass( 'NodeBuffer_' + node.id, node.value );
|
|
310
|
-
buffer.setVisibility( gpuShaderStageLib[ shaderStage ] );
|
|
312
|
+
//buffer.setVisibility( gpuShaderStageLib[ shaderStage ] );
|
|
311
313
|
|
|
312
314
|
// add first textures in sequence and group for last
|
|
313
315
|
const lastBinding = bindings[ bindings.length - 1 ];
|
|
@@ -323,8 +325,8 @@ class WebGPUNodeBuilder extends NodeBuilder {
|
|
|
323
325
|
|
|
324
326
|
if ( uniformsGroup === undefined ) {
|
|
325
327
|
|
|
326
|
-
uniformsGroup = new
|
|
327
|
-
uniformsGroup.setVisibility( gpuShaderStageLib[ shaderStage ] );
|
|
328
|
+
uniformsGroup = new UniformsGroup( 'nodeUniforms' );
|
|
329
|
+
//uniformsGroup.setVisibility( gpuShaderStageLib[ shaderStage ] );
|
|
328
330
|
|
|
329
331
|
this.uniformsGroup[ shaderStage ] = uniformsGroup;
|
|
330
332
|
|
|
@@ -398,6 +400,18 @@ class WebGPUNodeBuilder extends NodeBuilder {
|
|
|
398
400
|
|
|
399
401
|
}
|
|
400
402
|
|
|
403
|
+
getVertexIndex() {
|
|
404
|
+
|
|
405
|
+
if ( this.shaderStage === 'vertex' ) {
|
|
406
|
+
|
|
407
|
+
return this.getBuiltin( 'vertex_index', 'vertexIndex', 'u32', 'attribute' );
|
|
408
|
+
|
|
409
|
+
}
|
|
410
|
+
|
|
411
|
+
return 'vertexIndex';
|
|
412
|
+
|
|
413
|
+
}
|
|
414
|
+
|
|
401
415
|
getInstanceIndex() {
|
|
402
416
|
|
|
403
417
|
if ( this.shaderStage === 'vertex' ) {
|
|
@@ -446,10 +460,9 @@ class WebGPUNodeBuilder extends NodeBuilder {
|
|
|
446
460
|
|
|
447
461
|
}
|
|
448
462
|
|
|
449
|
-
const attributes = this.
|
|
450
|
-
const length = attributes.length;
|
|
463
|
+
const attributes = this.getAttributesArray();
|
|
451
464
|
|
|
452
|
-
for ( let index = 0; index < length; index ++ ) {
|
|
465
|
+
for ( let index = 0, length = attributes.length; index < length; index ++ ) {
|
|
453
466
|
|
|
454
467
|
const attribute = attributes[ index ];
|
|
455
468
|
const name = attribute.name;
|
|
@@ -465,6 +478,12 @@ class WebGPUNodeBuilder extends NodeBuilder {
|
|
|
465
478
|
|
|
466
479
|
}
|
|
467
480
|
|
|
481
|
+
getVar( type, name ) {
|
|
482
|
+
|
|
483
|
+
return `var ${ name } : ${ this.getType( type ) }`;
|
|
484
|
+
|
|
485
|
+
}
|
|
486
|
+
|
|
468
487
|
getVars( shaderStage ) {
|
|
469
488
|
|
|
470
489
|
const snippets = [];
|
|
@@ -472,10 +491,7 @@ class WebGPUNodeBuilder extends NodeBuilder {
|
|
|
472
491
|
|
|
473
492
|
for ( const variable of vars ) {
|
|
474
493
|
|
|
475
|
-
|
|
476
|
-
const type = this.getType( variable.type );
|
|
477
|
-
|
|
478
|
-
snippets.push( `\tvar ${name} : ${type};` );
|
|
494
|
+
snippets.push( `\t${ this.getVar( variable.type, variable.name ) };` );
|
|
479
495
|
|
|
480
496
|
}
|
|
481
497
|
|
|
@@ -504,9 +520,17 @@ class WebGPUNodeBuilder extends NodeBuilder {
|
|
|
504
520
|
|
|
505
521
|
if ( varying.needsInterpolation ) {
|
|
506
522
|
|
|
507
|
-
|
|
523
|
+
let attributesSnippet = `@location( ${index} )`;
|
|
524
|
+
|
|
525
|
+
if ( varying.type === 'int' || varying.type === 'uint' ) {
|
|
508
526
|
|
|
509
|
-
|
|
527
|
+
attributesSnippet += ' @interpolate( flat )';
|
|
528
|
+
|
|
529
|
+
}
|
|
530
|
+
|
|
531
|
+
snippets.push( `${ attributesSnippet } ${ varying.name } : ${ this.getType( varying.type ) }` );
|
|
532
|
+
|
|
533
|
+
} else if ( shaderStage === 'vertex' && vars.includes( varying ) === false ) {
|
|
510
534
|
|
|
511
535
|
vars.push( varying );
|
|
512
536
|
|
|
@@ -544,7 +568,7 @@ class WebGPUNodeBuilder extends NodeBuilder {
|
|
|
544
568
|
|
|
545
569
|
if ( shaderStage === 'fragment' ) {
|
|
546
570
|
|
|
547
|
-
bindingSnippets.push( `@
|
|
571
|
+
bindingSnippets.push( `@binding( ${index ++} ) @group( 0 ) var ${uniform.name}_sampler : sampler;` );
|
|
548
572
|
|
|
549
573
|
}
|
|
550
574
|
|
|
@@ -570,7 +594,7 @@ class WebGPUNodeBuilder extends NodeBuilder {
|
|
|
570
594
|
|
|
571
595
|
}
|
|
572
596
|
|
|
573
|
-
bindingSnippets.push( `@
|
|
597
|
+
bindingSnippets.push( `@binding( ${index ++} ) @group( 0 ) var ${uniform.name} : ${textureType};` );
|
|
574
598
|
|
|
575
599
|
} else if ( uniform.type === 'buffer' || uniform.type === 'storageBuffer' ) {
|
|
576
600
|
|
|
@@ -690,7 +714,13 @@ class WebGPUNodeBuilder extends NodeBuilder {
|
|
|
690
714
|
|
|
691
715
|
getRenderTarget( width, height, options ) {
|
|
692
716
|
|
|
693
|
-
return new
|
|
717
|
+
return new RenderTarget( width, height, options );
|
|
718
|
+
|
|
719
|
+
}
|
|
720
|
+
|
|
721
|
+
getCubeRenderTarget( size, options ) {
|
|
722
|
+
|
|
723
|
+
return new CubeRenderTarget( size, options );
|
|
694
724
|
|
|
695
725
|
}
|
|
696
726
|
|
|
@@ -845,4 +875,4 @@ var<${access}> ${name} : ${structName};`;
|
|
|
845
875
|
|
|
846
876
|
}
|
|
847
877
|
|
|
848
|
-
export default
|
|
878
|
+
export default WGSLNodeBuilder;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import NodeFunction from '
|
|
2
|
-
import NodeFunctionInput from '
|
|
1
|
+
import NodeFunction from '../../../nodes/core/NodeFunction.js';
|
|
2
|
+
import NodeFunctionInput from '../../../nodes/core/NodeFunctionInput.js';
|
|
3
3
|
|
|
4
4
|
const declarationRegexp = /^[fn]*\s*([a-z_0-9]+)?\s*\(([\s\S]*?)\)\s*[\-\>]*\s*([a-z_0-9]+)?/i;
|
|
5
5
|
const propertiesRegexp = /[a-z_0-9]+/ig;
|
|
@@ -0,0 +1,255 @@
|
|
|
1
|
+
import { Float16BufferAttribute } from 'three';
|
|
2
|
+
import { GPUInputStepMode } from './WebGPUConstants.js';
|
|
3
|
+
|
|
4
|
+
const typedArraysToVertexFormatPrefix = new Map( [
|
|
5
|
+
[ Int8Array, [ 'sint8', 'snorm8' ]],
|
|
6
|
+
[ Uint8Array, [ 'uint8', 'unorm8' ]],
|
|
7
|
+
[ Int16Array, [ 'sint16', 'snorm16' ]],
|
|
8
|
+
[ Uint16Array, [ 'uint16', 'unorm16' ]],
|
|
9
|
+
[ Int32Array, [ 'sint32', 'snorm32' ]],
|
|
10
|
+
[ Uint32Array, [ 'uint32', 'unorm32' ]],
|
|
11
|
+
[ Float32Array, [ 'float32', ]],
|
|
12
|
+
] );
|
|
13
|
+
|
|
14
|
+
const typedAttributeToVertexFormatPrefix = new Map( [
|
|
15
|
+
[ Float16BufferAttribute, [ 'float16', ]],
|
|
16
|
+
] );
|
|
17
|
+
|
|
18
|
+
const typeArraysToVertexFormatPrefixForItemSize1 = new Map( [
|
|
19
|
+
[ Int32Array, 'sint32' ],
|
|
20
|
+
[ Uint32Array, 'uint32' ],
|
|
21
|
+
[ Float32Array, 'float32' ]
|
|
22
|
+
] );
|
|
23
|
+
|
|
24
|
+
class WebGPUAttributeUtils {
|
|
25
|
+
|
|
26
|
+
constructor( backend ) {
|
|
27
|
+
|
|
28
|
+
this.backend = backend;
|
|
29
|
+
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
createAttribute( attribute, usage ) {
|
|
33
|
+
|
|
34
|
+
const bufferAttribute = this._getBufferAttribute( attribute );
|
|
35
|
+
|
|
36
|
+
const backend = this.backend;
|
|
37
|
+
const device = backend.device;
|
|
38
|
+
|
|
39
|
+
const array = bufferAttribute.array;
|
|
40
|
+
const size = array.byteLength + ( ( 4 - ( array.byteLength % 4 ) ) % 4 ); // ensure 4 byte alignment, see #20441
|
|
41
|
+
|
|
42
|
+
const buffer = device.createBuffer( {
|
|
43
|
+
label: bufferAttribute.name,
|
|
44
|
+
size: size,
|
|
45
|
+
usage: usage,
|
|
46
|
+
mappedAtCreation: true
|
|
47
|
+
} );
|
|
48
|
+
|
|
49
|
+
new array.constructor( buffer.getMappedRange() ).set( array );
|
|
50
|
+
|
|
51
|
+
buffer.unmap();
|
|
52
|
+
|
|
53
|
+
backend.get( attribute ).buffer = buffer;
|
|
54
|
+
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
updateAttribute( attribute ) {
|
|
58
|
+
|
|
59
|
+
const bufferAttribute = this._getBufferAttribute( attribute );
|
|
60
|
+
|
|
61
|
+
const backend = this.backend;
|
|
62
|
+
const device = backend.device;
|
|
63
|
+
|
|
64
|
+
const buffer = backend.get( attribute ).buffer;
|
|
65
|
+
|
|
66
|
+
const array = bufferAttribute.array;
|
|
67
|
+
const updateRange = bufferAttribute.updateRange;
|
|
68
|
+
|
|
69
|
+
if ( updateRange.count === - 1 ) {
|
|
70
|
+
|
|
71
|
+
// Not using update ranges
|
|
72
|
+
|
|
73
|
+
device.queue.writeBuffer(
|
|
74
|
+
buffer,
|
|
75
|
+
0,
|
|
76
|
+
array,
|
|
77
|
+
0
|
|
78
|
+
);
|
|
79
|
+
|
|
80
|
+
} else {
|
|
81
|
+
|
|
82
|
+
device.queue.writeBuffer(
|
|
83
|
+
buffer,
|
|
84
|
+
0,
|
|
85
|
+
array,
|
|
86
|
+
updateRange.offset * array.BYTES_PER_ELEMENT,
|
|
87
|
+
updateRange.count * array.BYTES_PER_ELEMENT
|
|
88
|
+
);
|
|
89
|
+
|
|
90
|
+
updateRange.count = - 1; // reset range
|
|
91
|
+
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
createShaderAttributes( renderObject ) {
|
|
97
|
+
|
|
98
|
+
const attributes = renderObject.getAttributes();
|
|
99
|
+
const shaderAttributes = [];
|
|
100
|
+
|
|
101
|
+
for ( let slot = 0; slot < attributes.length; slot ++ ) {
|
|
102
|
+
|
|
103
|
+
const geometryAttribute = attributes[ slot ];
|
|
104
|
+
const bytesPerElement = geometryAttribute.array.BYTES_PER_ELEMENT;
|
|
105
|
+
|
|
106
|
+
const format = this._getVertexFormat( geometryAttribute );
|
|
107
|
+
|
|
108
|
+
let arrayStride = geometryAttribute.itemSize * bytesPerElement;
|
|
109
|
+
let offset = 0;
|
|
110
|
+
let stepMode = geometryAttribute.isInstancedBufferAttribute ? GPUInputStepMode.Instance : GPUInputStepMode.Vertex;
|
|
111
|
+
|
|
112
|
+
if ( geometryAttribute.isInterleavedBufferAttribute === true ) {
|
|
113
|
+
|
|
114
|
+
// @TODO: It can be optimized for "vertexBuffers" on RenderPipeline
|
|
115
|
+
|
|
116
|
+
arrayStride = geometryAttribute.data.stride * bytesPerElement;
|
|
117
|
+
offset = geometryAttribute.offset * bytesPerElement;
|
|
118
|
+
if ( geometryAttribute.data.isInstancedInterleavedBuffer ) stepMode = GPUInputStepMode.Instance;
|
|
119
|
+
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
shaderAttributes.push( {
|
|
123
|
+
geometryAttribute,
|
|
124
|
+
arrayStride,
|
|
125
|
+
stepMode,
|
|
126
|
+
offset,
|
|
127
|
+
format,
|
|
128
|
+
slot
|
|
129
|
+
} );
|
|
130
|
+
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
return shaderAttributes;
|
|
134
|
+
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
destroyAttribute( attribute ) {
|
|
138
|
+
|
|
139
|
+
const backend = this.backend;
|
|
140
|
+
const data = backend.get( attribute );
|
|
141
|
+
|
|
142
|
+
data.buffer.destroy();
|
|
143
|
+
|
|
144
|
+
backend.delete( attribute );
|
|
145
|
+
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
async getArrayBuffer( attribute ) {
|
|
149
|
+
|
|
150
|
+
const backend = this.backend;
|
|
151
|
+
const device = backend.device;
|
|
152
|
+
|
|
153
|
+
const data = backend.get( attribute );
|
|
154
|
+
|
|
155
|
+
//const bufferAttribute = this._getBufferAttribute( attribute );
|
|
156
|
+
|
|
157
|
+
const bufferGPU = data.buffer;
|
|
158
|
+
const size = bufferGPU.size;
|
|
159
|
+
|
|
160
|
+
let readBufferGPU = data.readBuffer;
|
|
161
|
+
let needsUnmap = true;
|
|
162
|
+
|
|
163
|
+
if ( readBufferGPU === undefined ) {
|
|
164
|
+
|
|
165
|
+
readBufferGPU = device.createBuffer( {
|
|
166
|
+
label: attribute.name,
|
|
167
|
+
size,
|
|
168
|
+
usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.MAP_READ
|
|
169
|
+
} );
|
|
170
|
+
|
|
171
|
+
needsUnmap = false;
|
|
172
|
+
|
|
173
|
+
data.readBuffer = readBufferGPU;
|
|
174
|
+
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
const cmdEncoder = device.createCommandEncoder( {} );
|
|
178
|
+
|
|
179
|
+
cmdEncoder.copyBufferToBuffer(
|
|
180
|
+
bufferGPU,
|
|
181
|
+
0,
|
|
182
|
+
readBufferGPU,
|
|
183
|
+
0,
|
|
184
|
+
size
|
|
185
|
+
);
|
|
186
|
+
|
|
187
|
+
if ( needsUnmap ) readBufferGPU.unmap();
|
|
188
|
+
|
|
189
|
+
const gpuCommands = cmdEncoder.finish();
|
|
190
|
+
device.queue.submit( [ gpuCommands ] );
|
|
191
|
+
|
|
192
|
+
await readBufferGPU.mapAsync( GPUMapMode.READ );
|
|
193
|
+
|
|
194
|
+
const arrayBuffer = readBufferGPU.getMappedRange();
|
|
195
|
+
|
|
196
|
+
return arrayBuffer;
|
|
197
|
+
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
_getVertexFormat( geometryAttribute ) {
|
|
201
|
+
|
|
202
|
+
const { itemSize, normalized } = geometryAttribute;
|
|
203
|
+
const ArrayType = geometryAttribute.array.constructor;
|
|
204
|
+
const AttributeType = geometryAttribute.constructor;
|
|
205
|
+
|
|
206
|
+
let format;
|
|
207
|
+
|
|
208
|
+
if ( itemSize == 1 ) {
|
|
209
|
+
|
|
210
|
+
format = typeArraysToVertexFormatPrefixForItemSize1.get( ArrayType );
|
|
211
|
+
|
|
212
|
+
} else {
|
|
213
|
+
|
|
214
|
+
const prefixOptions = typedAttributeToVertexFormatPrefix.get( AttributeType ) || typedArraysToVertexFormatPrefix.get( ArrayType );
|
|
215
|
+
const prefix = prefixOptions[ normalized ? 1 : 0 ];
|
|
216
|
+
|
|
217
|
+
if ( prefix ) {
|
|
218
|
+
|
|
219
|
+
const bytesPerUnit = ArrayType.BYTES_PER_ELEMENT * itemSize;
|
|
220
|
+
const paddedBytesPerUnit = Math.floor( ( bytesPerUnit + 3 ) / 4 ) * 4;
|
|
221
|
+
const paddedItemSize = paddedBytesPerUnit / ArrayType.BYTES_PER_ELEMENT;
|
|
222
|
+
|
|
223
|
+
if ( paddedItemSize % 1 ) {
|
|
224
|
+
|
|
225
|
+
throw new Error( 'THREE.WebGPUAttributeUtils: Bad vertex format item size.' );
|
|
226
|
+
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
format = `${prefix}x${paddedItemSize}`;
|
|
230
|
+
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
if ( ! format ) {
|
|
236
|
+
|
|
237
|
+
console.error( 'THREE.WebGPUAttributeUtils: Vertex format not supported yet.' );
|
|
238
|
+
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
return format;
|
|
242
|
+
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
_getBufferAttribute( attribute ) {
|
|
246
|
+
|
|
247
|
+
if ( attribute.isInterleavedBufferAttribute ) attribute = attribute.data;
|
|
248
|
+
|
|
249
|
+
return attribute;
|
|
250
|
+
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
export default WebGPUAttributeUtils;
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
import {
|
|
2
|
+
GPUTextureAspect, GPUTextureViewDimension
|
|
3
|
+
} from './WebGPUConstants.js';
|
|
4
|
+
|
|
5
|
+
class WebGPUBindingUtils {
|
|
6
|
+
|
|
7
|
+
constructor( backend ) {
|
|
8
|
+
|
|
9
|
+
this.backend = backend;
|
|
10
|
+
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
createBindings( bindings, pipeline ) {
|
|
14
|
+
|
|
15
|
+
const backend = this.backend;
|
|
16
|
+
const bindingsData = backend.get( bindings );
|
|
17
|
+
|
|
18
|
+
// setup (static) binding layout and (dynamic) binding group
|
|
19
|
+
|
|
20
|
+
const pipelineGPU = backend.get( pipeline ).pipeline;
|
|
21
|
+
|
|
22
|
+
const bindLayoutGPU = pipelineGPU.getBindGroupLayout( 0 );
|
|
23
|
+
const bindGroupGPU = this.createBindGroup( bindings, bindLayoutGPU );
|
|
24
|
+
|
|
25
|
+
bindingsData.layout = bindLayoutGPU;
|
|
26
|
+
bindingsData.group = bindGroupGPU;
|
|
27
|
+
bindingsData.bindings = bindings;
|
|
28
|
+
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
updateBinding( binding ) {
|
|
32
|
+
|
|
33
|
+
const backend = this.backend;
|
|
34
|
+
const device = backend.device;
|
|
35
|
+
|
|
36
|
+
const buffer = binding.buffer;
|
|
37
|
+
const bufferGPU = backend.get( binding ).buffer;
|
|
38
|
+
|
|
39
|
+
device.queue.writeBuffer( bufferGPU, 0, buffer, 0 );
|
|
40
|
+
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
createBindGroup( bindings, layoutGPU ) {
|
|
44
|
+
|
|
45
|
+
const backend = this.backend;
|
|
46
|
+
const device = backend.device;
|
|
47
|
+
|
|
48
|
+
let bindingPoint = 0;
|
|
49
|
+
const entriesGPU = [];
|
|
50
|
+
|
|
51
|
+
for ( const binding of bindings ) {
|
|
52
|
+
|
|
53
|
+
if ( binding.isUniformBuffer ) {
|
|
54
|
+
|
|
55
|
+
const bindingData = backend.get( binding );
|
|
56
|
+
|
|
57
|
+
if ( bindingData.buffer === undefined ) {
|
|
58
|
+
|
|
59
|
+
const byteLength = binding.byteLength;
|
|
60
|
+
|
|
61
|
+
const usage = GPUBufferUsage.UNIFORM | GPUBufferUsage.COPY_DST;
|
|
62
|
+
|
|
63
|
+
const bufferGPU = device.createBuffer( {
|
|
64
|
+
label: 'bindingBuffer',
|
|
65
|
+
size: byteLength,
|
|
66
|
+
usage: usage
|
|
67
|
+
} );
|
|
68
|
+
|
|
69
|
+
bindingData.buffer = bufferGPU;
|
|
70
|
+
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
entriesGPU.push( { binding: bindingPoint, resource: { buffer: bindingData.buffer } } );
|
|
74
|
+
|
|
75
|
+
} else if ( binding.isStorageBuffer ) {
|
|
76
|
+
|
|
77
|
+
const bindingData = backend.get( binding );
|
|
78
|
+
|
|
79
|
+
if ( bindingData.buffer === undefined ) {
|
|
80
|
+
|
|
81
|
+
const attribute = binding.attribute;
|
|
82
|
+
//const usage = GPUBufferUsage.STORAGE | GPUBufferUsage.VERTEX | /*GPUBufferUsage.COPY_SRC |*/ GPUBufferUsage.COPY_DST;
|
|
83
|
+
|
|
84
|
+
//backend.attributeUtils.createAttribute( attribute, usage ); // @TODO: Move it to universal renderer
|
|
85
|
+
|
|
86
|
+
bindingData.buffer = backend.get( attribute ).buffer;
|
|
87
|
+
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
entriesGPU.push( { binding: bindingPoint, resource: { buffer: bindingData.buffer } } );
|
|
91
|
+
|
|
92
|
+
} else if ( binding.isSampler ) {
|
|
93
|
+
|
|
94
|
+
const textureGPU = backend.get( binding.texture );
|
|
95
|
+
|
|
96
|
+
entriesGPU.push( { binding: bindingPoint, resource: textureGPU.sampler } );
|
|
97
|
+
|
|
98
|
+
} else if ( binding.isSampledTexture ) {
|
|
99
|
+
|
|
100
|
+
const textureData = backend.get( binding.texture );
|
|
101
|
+
|
|
102
|
+
let dimensionViewGPU;
|
|
103
|
+
|
|
104
|
+
if ( binding.isSampledCubeTexture ) {
|
|
105
|
+
|
|
106
|
+
dimensionViewGPU = GPUTextureViewDimension.Cube;
|
|
107
|
+
|
|
108
|
+
} else {
|
|
109
|
+
|
|
110
|
+
dimensionViewGPU = GPUTextureViewDimension.TwoD;
|
|
111
|
+
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
let resourceGPU;
|
|
115
|
+
|
|
116
|
+
if ( textureData.externalTexture !== undefined ) {
|
|
117
|
+
|
|
118
|
+
resourceGPU = device.importExternalTexture( { source: textureData.externalTexture } );
|
|
119
|
+
|
|
120
|
+
} else {
|
|
121
|
+
|
|
122
|
+
const aspectGPU = GPUTextureAspect.All;
|
|
123
|
+
|
|
124
|
+
resourceGPU = textureData.texture.createView( { aspect: aspectGPU, dimension: dimensionViewGPU } );
|
|
125
|
+
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
entriesGPU.push( { binding: bindingPoint, resource: resourceGPU } );
|
|
129
|
+
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
bindingPoint ++;
|
|
133
|
+
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
return device.createBindGroup( {
|
|
137
|
+
layout: layoutGPU,
|
|
138
|
+
entries: entriesGPU
|
|
139
|
+
} );
|
|
140
|
+
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
export default WebGPUBindingUtils;
|
|
@@ -214,6 +214,12 @@ export const GPUAddressMode = {
|
|
|
214
214
|
MirrorRepeat: 'mirror-repeat'
|
|
215
215
|
};
|
|
216
216
|
|
|
217
|
+
export const GPUSamplerBindingType = {
|
|
218
|
+
Filtering: 'filtering',
|
|
219
|
+
NonFiltering: 'non-filtering',
|
|
220
|
+
Comparison: 'comparison'
|
|
221
|
+
};
|
|
222
|
+
|
|
217
223
|
export const GPUFilterMode = {
|
|
218
224
|
Linear: 'linear',
|
|
219
225
|
Nearest: 'nearest'
|
|
@@ -314,10 +320,3 @@ export const GPUFeatureName = {
|
|
|
314
320
|
BGRA8UNormStorage: 'bgra8unorm-storage',
|
|
315
321
|
Float32Filterable: 'float32-filterable'
|
|
316
322
|
};
|
|
317
|
-
|
|
318
|
-
export const GPUChunkSize = 16; // size of a chunk in bytes (STD140 layout)
|
|
319
|
-
|
|
320
|
-
// @TODO: Move to src/constants.js
|
|
321
|
-
|
|
322
|
-
export const BlendColorFactor = 211;
|
|
323
|
-
export const OneMinusBlendColorFactor = 212;
|