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.
Files changed (339) hide show
  1. package/build/three.cjs +779 -557
  2. package/build/three.js +779 -557
  3. package/build/three.min.js +2 -1
  4. package/build/three.module.js +770 -539
  5. package/build/three.module.min.js +2 -1
  6. package/examples/jsm/cameras/CinematicCamera.js +1 -2
  7. package/examples/jsm/capabilities/WebGPU.js +15 -1
  8. package/examples/jsm/controls/ArcballControls.js +2 -1
  9. package/examples/jsm/controls/FlyControls.js +25 -9
  10. package/examples/jsm/controls/OrbitControls.js +5 -1
  11. package/examples/jsm/csm/CSM.js +1 -3
  12. package/examples/jsm/effects/AnaglyphEffect.js +6 -20
  13. package/examples/jsm/effects/OutlineEffect.js +1 -1
  14. package/examples/jsm/effects/ParallaxBarrierEffect.js +3 -0
  15. package/examples/jsm/environments/RoomEnvironment.js +6 -2
  16. package/examples/jsm/exporters/GLTFExporter.js +74 -2
  17. package/examples/jsm/exporters/USDZExporter.js +170 -129
  18. package/examples/jsm/helpers/ViewHelper.js +1 -1
  19. package/examples/jsm/lines/LineMaterial.js +1 -1
  20. package/examples/jsm/loaders/3DMLoader.js +1 -1
  21. package/examples/jsm/loaders/3MFLoader.js +5 -1
  22. package/examples/jsm/loaders/AMFLoader.js +5 -1
  23. package/examples/jsm/loaders/ColladaLoader.js +4 -1
  24. package/examples/jsm/loaders/DRACOLoader.js +2 -0
  25. package/examples/jsm/loaders/FBXLoader.js +9 -2
  26. package/examples/jsm/loaders/GLTFLoader.js +230 -94
  27. package/examples/jsm/loaders/KTX2Loader.js +106 -47
  28. package/examples/jsm/loaders/LDrawLoader.js +4 -7
  29. package/examples/jsm/loaders/MMDLoader.js +40 -13
  30. package/examples/jsm/loaders/PCDLoader.js +25 -10
  31. package/examples/jsm/loaders/PDBLoader.js +7 -2
  32. package/examples/jsm/loaders/PLYLoader.js +30 -8
  33. package/examples/jsm/loaders/STLLoader.js +8 -3
  34. package/examples/jsm/loaders/VRMLLoader.js +55 -7
  35. package/examples/jsm/loaders/VTKLoader.js +12 -4
  36. package/examples/jsm/loaders/XYZLoader.js +9 -3
  37. package/examples/jsm/materials/MeshGouraudMaterial.js +2 -2
  38. package/examples/jsm/math/Lut.js +5 -4
  39. package/examples/jsm/math/MeshSurfaceSampler.js +82 -37
  40. package/examples/jsm/misc/GPUComputationRenderer.js +1 -0
  41. package/examples/jsm/misc/VolumeSlice.js +3 -1
  42. package/examples/jsm/nodes/Nodes.js +22 -16
  43. package/examples/jsm/nodes/accessors/BufferAttributeNode.js +99 -0
  44. package/examples/jsm/nodes/accessors/BufferNode.js +2 -2
  45. package/examples/jsm/nodes/accessors/CameraNode.js +25 -4
  46. package/examples/jsm/nodes/accessors/ExtendedMaterialNode.js +7 -1
  47. package/examples/jsm/nodes/accessors/InstanceNode.js +29 -12
  48. package/examples/jsm/nodes/accessors/MaterialNode.js +55 -47
  49. package/examples/jsm/nodes/accessors/MaterialReferenceNode.js +2 -2
  50. package/examples/jsm/nodes/accessors/ModelNode.js +3 -1
  51. package/examples/jsm/nodes/accessors/ModelViewProjectionNode.js +4 -9
  52. package/examples/jsm/nodes/accessors/MorphNode.js +70 -0
  53. package/examples/jsm/nodes/accessors/NormalNode.js +3 -2
  54. package/examples/jsm/nodes/accessors/Object3DNode.js +10 -2
  55. package/examples/jsm/nodes/accessors/ReferenceNode.js +2 -2
  56. package/examples/jsm/nodes/accessors/SceneNode.js +46 -0
  57. package/examples/jsm/nodes/accessors/SkinningNode.js +43 -62
  58. package/examples/jsm/nodes/accessors/StorageBufferNode.js +2 -2
  59. package/examples/jsm/nodes/accessors/TangentNode.js +2 -2
  60. package/examples/jsm/nodes/accessors/TextureBicubicNode.js +94 -0
  61. package/examples/jsm/nodes/accessors/TextureNode.js +68 -6
  62. package/examples/jsm/nodes/accessors/TextureSizeNode.js +35 -0
  63. package/examples/jsm/nodes/accessors/UVNode.js +1 -1
  64. package/examples/jsm/nodes/code/CodeNode.js +3 -0
  65. package/examples/jsm/nodes/code/FunctionNode.js +25 -4
  66. package/examples/jsm/nodes/core/AttributeNode.js +1 -1
  67. package/examples/jsm/nodes/core/BypassNode.js +2 -2
  68. package/examples/jsm/nodes/core/ContextNode.js +2 -0
  69. package/examples/jsm/nodes/core/IndexNode.js +66 -0
  70. package/examples/jsm/nodes/core/LightingModel.js +2 -1
  71. package/examples/jsm/nodes/core/Node.js +13 -16
  72. package/examples/jsm/nodes/core/NodeAttribute.js +2 -1
  73. package/examples/jsm/nodes/core/NodeBuilder.js +86 -8
  74. package/examples/jsm/nodes/core/NodeUtils.js +10 -0
  75. package/examples/jsm/nodes/core/PropertyNode.js +6 -2
  76. package/examples/jsm/nodes/core/StackNode.js +8 -1
  77. package/examples/jsm/nodes/core/UniformNode.js +1 -1
  78. package/examples/jsm/nodes/core/VarNode.js +1 -3
  79. package/examples/jsm/nodes/display/BlendModeNode.js +9 -9
  80. package/examples/jsm/nodes/display/ColorAdjustmentNode.js +7 -7
  81. package/examples/jsm/nodes/display/ColorSpaceNode.js +50 -49
  82. package/examples/jsm/nodes/display/NormalMapNode.js +3 -3
  83. package/examples/jsm/nodes/display/ToneMappingNode.js +24 -15
  84. package/examples/jsm/nodes/display/ViewportDepthNode.js +69 -0
  85. package/examples/jsm/nodes/display/ViewportDepthTextureNode.js +34 -0
  86. package/examples/jsm/nodes/display/ViewportSharedTextureNode.js +7 -6
  87. package/examples/jsm/nodes/display/ViewportTextureNode.js +33 -19
  88. package/examples/jsm/nodes/functions/BSDF/BRDF_BlinnPhong.js +5 -5
  89. package/examples/jsm/nodes/functions/BSDF/BRDF_GGX.js +10 -8
  90. package/examples/jsm/nodes/functions/BSDF/BRDF_Lambert.js +2 -2
  91. package/examples/jsm/nodes/functions/BSDF/BRDF_Sheen.js +43 -0
  92. package/examples/jsm/nodes/functions/BSDF/DFGApprox.js +4 -4
  93. package/examples/jsm/nodes/functions/BSDF/D_GGX.js +2 -2
  94. package/examples/jsm/nodes/functions/BSDF/EnvironmentBRDF.js +13 -0
  95. package/examples/jsm/nodes/functions/BSDF/F_Schlick.js +2 -4
  96. package/examples/jsm/nodes/functions/BSDF/V_GGX_SmithCorrelated.js +2 -2
  97. package/examples/jsm/nodes/functions/PhongLightingModel.js +7 -7
  98. package/examples/jsm/nodes/functions/PhysicalLightingModel.js +132 -19
  99. package/examples/jsm/nodes/functions/material/getGeometryRoughness.js +2 -2
  100. package/examples/jsm/nodes/functions/material/getRoughness.js +3 -3
  101. package/examples/jsm/nodes/geometry/RangeNode.js +33 -51
  102. package/examples/jsm/nodes/lighting/AnalyticLightNode.js +6 -3
  103. package/examples/jsm/nodes/lighting/DirectionalLightNode.js +2 -2
  104. package/examples/jsm/nodes/lighting/EnvironmentNode.js +107 -62
  105. package/examples/jsm/nodes/lighting/HemisphereLightNode.js +2 -2
  106. package/examples/jsm/nodes/lighting/LightUtils.js +2 -2
  107. package/examples/jsm/nodes/lighting/LightingContextNode.js +17 -15
  108. package/examples/jsm/nodes/lighting/PointLightNode.js +3 -3
  109. package/examples/jsm/nodes/lighting/SpotLightNode.js +3 -3
  110. package/examples/jsm/nodes/materials/LineBasicNodeMaterial.js +0 -15
  111. package/examples/jsm/nodes/materials/MeshBasicNodeMaterial.js +0 -15
  112. package/examples/jsm/nodes/materials/MeshNormalNodeMaterial.js +0 -10
  113. package/examples/jsm/nodes/materials/MeshPhongNodeMaterial.js +0 -9
  114. package/examples/jsm/nodes/materials/MeshPhysicalNodeMaterial.js +41 -0
  115. package/examples/jsm/nodes/materials/MeshStandardNodeMaterial.js +1 -14
  116. package/examples/jsm/nodes/materials/NodeMaterial.js +119 -29
  117. package/examples/jsm/nodes/materials/PointsNodeMaterial.js +0 -9
  118. package/examples/jsm/nodes/materials/SpriteNodeMaterial.js +0 -7
  119. package/examples/jsm/nodes/materialx/lib/mx_hsv.js +3 -3
  120. package/examples/jsm/nodes/materialx/lib/mx_noise.js +14 -14
  121. package/examples/jsm/nodes/materialx/lib/mx_transform_color.js +4 -4
  122. package/examples/jsm/nodes/math/MathNode.js +6 -0
  123. package/examples/jsm/nodes/math/OperatorNode.js +1 -1
  124. package/examples/jsm/nodes/procedural/CheckerNode.js +3 -3
  125. package/examples/jsm/nodes/shadernode/ShaderNode.js +60 -33
  126. package/examples/jsm/nodes/utils/EquirectUVNode.js +2 -3
  127. package/examples/jsm/nodes/utils/LoopNode.js +186 -0
  128. package/examples/jsm/nodes/utils/TriplanarTexturesNode.js +1 -1
  129. package/examples/jsm/objects/GroundProjectedSkybox.js +1 -1
  130. package/examples/jsm/objects/Lensflare.js +3 -4
  131. package/examples/jsm/objects/MarchingCubes.js +5 -1
  132. package/examples/jsm/objects/Reflector.js +4 -1
  133. package/examples/jsm/objects/Refractor.js +1 -1
  134. package/examples/jsm/objects/Sky.js +1 -1
  135. package/examples/jsm/objects/Water.js +2 -1
  136. package/examples/jsm/objects/Water2.js +1 -1
  137. package/examples/jsm/offscreen/scene.js +1 -0
  138. package/examples/jsm/physics/RapierPhysics.js +93 -133
  139. package/examples/jsm/postprocessing/AfterimagePass.js +3 -0
  140. package/examples/jsm/postprocessing/BloomPass.js +7 -2
  141. package/examples/jsm/postprocessing/BokehPass.js +3 -2
  142. package/examples/jsm/postprocessing/DotScreenPass.js +1 -0
  143. package/examples/jsm/postprocessing/EffectComposer.js +4 -1
  144. package/examples/jsm/postprocessing/FilmPass.js +1 -0
  145. package/examples/jsm/postprocessing/OutlinePass.js +8 -9
  146. package/examples/jsm/postprocessing/OutputPass.js +72 -0
  147. package/examples/jsm/postprocessing/RenderPixelatedPass.js +4 -3
  148. package/examples/jsm/postprocessing/SAOPass.js +4 -2
  149. package/examples/jsm/postprocessing/SMAAPass.js +5 -2
  150. package/examples/jsm/postprocessing/SSAARenderPass.js +5 -13
  151. package/examples/jsm/postprocessing/SSAOPass.js +4 -2
  152. package/examples/jsm/postprocessing/SSRPass.js +3 -1
  153. package/examples/jsm/postprocessing/SavePass.js +5 -2
  154. package/examples/jsm/postprocessing/ShaderPass.js +1 -0
  155. package/examples/jsm/postprocessing/TAARenderPass.js +17 -4
  156. package/examples/jsm/postprocessing/TexturePass.js +2 -1
  157. package/examples/jsm/postprocessing/UnrealBloomPass.js +13 -13
  158. package/examples/jsm/renderers/{webgpu/WebGPUAnimation.js → common/Animation.js} +2 -2
  159. package/examples/jsm/renderers/common/Attributes.js +75 -0
  160. package/examples/jsm/renderers/common/Backend.js +162 -0
  161. package/examples/jsm/renderers/common/Background.js +134 -0
  162. package/examples/jsm/renderers/common/Binding.js +11 -0
  163. package/examples/jsm/renderers/common/Bindings.js +169 -0
  164. package/examples/jsm/renderers/common/Buffer.js +38 -0
  165. package/examples/jsm/renderers/{webgpu/WebGPUBufferUtils.js → common/BufferUtils.js} +2 -2
  166. package/examples/jsm/renderers/{webgpu/WebGPUWeakMap.js → common/ChainMap.js} +11 -5
  167. package/examples/jsm/renderers/common/ComputePipeline.js +17 -0
  168. package/examples/jsm/renderers/common/Constants.js +14 -0
  169. package/examples/jsm/renderers/common/CubeRenderTarget.js +65 -0
  170. package/examples/jsm/renderers/common/DataMap.js +54 -0
  171. package/examples/jsm/renderers/{webgpu/WebGPUGeometries.js → common/Geometries.js} +38 -37
  172. package/examples/jsm/renderers/{webgpu/WebGPUInfo.js → common/Info.js} +2 -3
  173. package/examples/jsm/renderers/common/Pipeline.js +13 -0
  174. package/examples/jsm/renderers/common/Pipelines.js +321 -0
  175. package/examples/jsm/renderers/common/ProgrammableStage.js +18 -0
  176. package/examples/jsm/renderers/common/RenderContext.js +37 -0
  177. package/examples/jsm/renderers/common/RenderContexts.js +38 -0
  178. package/examples/jsm/renderers/{webgpu/WebGPURenderLists.js → common/RenderList.js} +2 -39
  179. package/examples/jsm/renderers/common/RenderLists.js +38 -0
  180. package/examples/jsm/renderers/common/RenderObject.js +113 -0
  181. package/examples/jsm/renderers/common/RenderObjects.js +92 -0
  182. package/examples/jsm/renderers/common/RenderPipeline.js +16 -0
  183. package/examples/jsm/renderers/{webgpu/WebGPURenderTarget.js → common/RenderTarget.js} +2 -2
  184. package/examples/jsm/renderers/common/Renderer.js +864 -0
  185. package/examples/jsm/renderers/common/SampledTexture.js +80 -0
  186. package/examples/jsm/renderers/common/Sampler.js +18 -0
  187. package/examples/jsm/renderers/common/StorageBuffer.js +17 -0
  188. package/examples/jsm/renderers/common/Textures.js +206 -0
  189. package/examples/jsm/renderers/{webgpu/WebGPUUniform.js → common/Uniform.js} +13 -9
  190. package/examples/jsm/renderers/common/UniformBuffer.js +15 -0
  191. package/examples/jsm/renderers/{webgpu/WebGPUUniformsGroup.js → common/UniformsGroup.js} +13 -13
  192. package/examples/jsm/renderers/{webgpu/nodes/WebGPUNodes.js → common/nodes/NodeRender.js} +3 -3
  193. package/examples/jsm/renderers/{webgpu/nodes/WebGPUNodeSampledTexture.js → common/nodes/NodeSampledTexture.js} +4 -4
  194. package/examples/jsm/renderers/{webgpu/nodes/WebGPUNodeSampler.js → common/nodes/NodeSampler.js} +3 -3
  195. package/examples/jsm/renderers/{webgpu/nodes/WebGPUNodeUniform.js → common/nodes/NodeUniform.js} +1 -1
  196. package/examples/jsm/renderers/common/nodes/Nodes.js +319 -0
  197. package/examples/jsm/renderers/webgl/nodes/GLSLNodeBuilder.js +340 -0
  198. package/examples/jsm/renderers/webgl/nodes/WebGLNodeBuilder.js +23 -19
  199. package/examples/jsm/renderers/webgpu/WebGPUBackend.js +847 -0
  200. package/examples/jsm/renderers/webgpu/WebGPURenderer.js +15 -1131
  201. package/examples/jsm/renderers/webgpu/nodes/{WebGPUNodeBuilder.js → WGSLNodeBuilder.js} +75 -45
  202. package/examples/jsm/{nodes/parsers → renderers/webgpu/nodes}/WGSLNodeFunction.js +2 -2
  203. package/examples/jsm/{nodes/parsers → renderers/webgpu/nodes}/WGSLNodeParser.js +1 -1
  204. package/examples/jsm/renderers/webgpu/utils/WebGPUAttributeUtils.js +255 -0
  205. package/examples/jsm/renderers/webgpu/utils/WebGPUBindingUtils.js +145 -0
  206. package/examples/jsm/renderers/webgpu/{constants.js → utils/WebGPUConstants.js} +6 -7
  207. package/examples/jsm/renderers/webgpu/{WebGPURenderPipeline.js → utils/WebGPUPipelineUtils.js} +154 -247
  208. package/examples/jsm/renderers/webgpu/{WebGPUTextureUtils.js → utils/WebGPUTextureMipmapUtils.js} +3 -25
  209. package/examples/jsm/renderers/webgpu/{WebGPUTextures.js → utils/WebGPUTextureUtils.js} +392 -505
  210. package/examples/jsm/renderers/webgpu/utils/WebGPUUtils.js +92 -0
  211. package/examples/jsm/shaders/BleachBypassShader.js +2 -0
  212. package/examples/jsm/shaders/BlendShader.js +1 -2
  213. package/examples/jsm/shaders/BokehShader2.js +3 -0
  214. package/examples/jsm/shaders/ColorifyShader.js +2 -0
  215. package/examples/jsm/shaders/ConvolutionShader.js +2 -0
  216. package/examples/jsm/shaders/CopyShader.js +4 -2
  217. package/examples/jsm/shaders/DotScreenShader.js +2 -0
  218. package/examples/jsm/shaders/ExposureShader.js +44 -0
  219. package/examples/jsm/shaders/FilmShader.js +2 -0
  220. package/examples/jsm/shaders/GammaCorrectionShader.js +2 -0
  221. package/examples/jsm/shaders/HorizontalBlurShader.js +2 -0
  222. package/examples/jsm/shaders/OutputShader.js +61 -0
  223. package/examples/jsm/shaders/RGBShiftShader.js +2 -0
  224. package/examples/jsm/shaders/SepiaShader.js +2 -0
  225. package/examples/jsm/shaders/ToonShader.js +13 -5
  226. package/examples/jsm/shaders/VerticalBlurShader.js +2 -0
  227. package/examples/jsm/shaders/VignetteShader.js +2 -0
  228. package/examples/jsm/shaders/WaterRefractionShader.js +5 -2
  229. package/examples/jsm/utils/BufferGeometryUtils.js +17 -1
  230. package/examples/jsm/utils/TextureUtils.js +86 -0
  231. package/examples/jsm/webxr/OculusHandPointerModel.js +34 -13
  232. package/examples/jsm/webxr/XRHandPrimitiveModel.js +1 -0
  233. package/examples/jsm/webxr/XRPlanes.js +100 -0
  234. package/package.json +3 -1
  235. package/src/Three.Legacy.js +0 -228
  236. package/src/audio/PositionalAudio.js +8 -0
  237. package/src/cameras/Camera.js +5 -0
  238. package/src/cameras/CubeCamera.js +76 -13
  239. package/src/cameras/OrthographicCamera.js +1 -1
  240. package/src/cameras/PerspectiveCamera.js +1 -1
  241. package/src/constants.js +13 -1
  242. package/src/core/BufferAttribute.js +3 -25
  243. package/src/core/BufferGeometry.js +1 -8
  244. package/src/core/Object3D.js +1 -1
  245. package/src/extras/core/Curve.js +1 -1
  246. package/src/loaders/CubeTextureLoader.js +2 -0
  247. package/src/loaders/Loader.js +2 -0
  248. package/src/loaders/MaterialLoader.js +5 -0
  249. package/src/loaders/ObjectLoader.js +1 -0
  250. package/src/materials/Material.js +13 -1
  251. package/src/materials/MeshPhysicalMaterial.js +32 -6
  252. package/src/math/Color.js +16 -11
  253. package/src/math/Frustum.js +16 -2
  254. package/src/math/MathUtils.js +16 -0
  255. package/src/math/Matrix3.js +26 -6
  256. package/src/math/Matrix4.js +74 -19
  257. package/src/objects/InstancedMesh.js +3 -0
  258. package/src/objects/Mesh.js +14 -10
  259. package/src/objects/Skeleton.js +1 -3
  260. package/src/objects/SkinnedMesh.js +36 -8
  261. package/src/renderers/WebGLRenderer.js +126 -21
  262. package/src/renderers/shaders/ShaderChunk/alphahash_fragment.glsl.js +7 -0
  263. package/src/renderers/shaders/ShaderChunk/alphahash_pars_fragment.glsl.js +68 -0
  264. package/src/renderers/shaders/ShaderChunk/begin_vertex.glsl.js +6 -0
  265. package/src/renderers/shaders/ShaderChunk/common.glsl.js +6 -0
  266. package/src/renderers/shaders/ShaderChunk/envmap_physical_pars_fragment.glsl.js +26 -3
  267. package/src/renderers/shaders/ShaderChunk/lights_fragment_maps.glsl.js +9 -1
  268. package/src/renderers/shaders/ShaderChunk/lights_physical_fragment.glsl.js +26 -0
  269. package/src/renderers/shaders/ShaderChunk/lights_physical_pars_fragment.glsl.js +52 -2
  270. package/src/renderers/shaders/ShaderChunk/normal_fragment_begin.glsl.js +10 -2
  271. package/src/renderers/shaders/ShaderChunk/normalmap_pars_fragment.glsl.js +1 -1
  272. package/src/renderers/shaders/ShaderChunk/{output_fragment.glsl.js → opaque_fragment.glsl.js} +1 -2
  273. package/src/renderers/shaders/ShaderChunk/tonemapping_pars_fragment.glsl.js +1 -1
  274. package/src/renderers/shaders/ShaderChunk/transmission_fragment.glsl.js +3 -3
  275. package/src/renderers/shaders/ShaderChunk/transmission_pars_fragment.glsl.js +10 -5
  276. package/src/renderers/shaders/ShaderChunk/uv_pars_fragment.glsl.js +6 -1
  277. package/src/renderers/shaders/ShaderChunk/uv_pars_vertex.glsl.js +7 -1
  278. package/src/renderers/shaders/ShaderChunk/uv_vertex.glsl.js +6 -1
  279. package/src/renderers/shaders/ShaderChunk.js +10 -6
  280. package/src/renderers/shaders/ShaderLib/background.glsl.js +1 -1
  281. package/src/renderers/shaders/ShaderLib/backgroundCube.glsl.js +1 -1
  282. package/src/renderers/shaders/ShaderLib/cube.glsl.js +1 -1
  283. package/src/renderers/shaders/ShaderLib/depth.glsl.js +2 -0
  284. package/src/renderers/shaders/ShaderLib/distanceRGBA.glsl.js +2 -0
  285. package/src/renderers/shaders/ShaderLib/equirect.glsl.js +1 -1
  286. package/src/renderers/shaders/ShaderLib/linedashed.glsl.js +2 -2
  287. package/src/renderers/shaders/ShaderLib/meshbasic.glsl.js +4 -2
  288. package/src/renderers/shaders/ShaderLib/meshlambert.glsl.js +4 -2
  289. package/src/renderers/shaders/ShaderLib/meshmatcap.glsl.js +4 -2
  290. package/src/renderers/shaders/ShaderLib/meshphong.glsl.js +4 -2
  291. package/src/renderers/shaders/ShaderLib/meshphysical.glsl.js +12 -2
  292. package/src/renderers/shaders/ShaderLib/meshtoon.glsl.js +4 -2
  293. package/src/renderers/shaders/ShaderLib/points.glsl.js +4 -2
  294. package/src/renderers/shaders/ShaderLib/shadow.glsl.js +1 -1
  295. package/src/renderers/shaders/ShaderLib/sprite.glsl.js +4 -2
  296. package/src/renderers/shaders/ShaderLib.js +4 -1
  297. package/src/renderers/shaders/UniformsLib.js +2 -0
  298. package/src/renderers/webgl/WebGLBindingStates.js +13 -5
  299. package/src/renderers/webgl/WebGLGeometries.js +12 -0
  300. package/src/renderers/webgl/WebGLInfo.js +0 -1
  301. package/src/renderers/webgl/WebGLMaterials.js +18 -0
  302. package/src/renderers/webgl/WebGLObjects.js +23 -3
  303. package/src/renderers/webgl/WebGLProgram.js +43 -5
  304. package/src/renderers/webgl/WebGLPrograms.js +19 -7
  305. package/src/renderers/webgl/WebGLTextures.js +19 -1
  306. package/src/renderers/webvr/WebVRManager.js +12 -0
  307. package/src/renderers/webxr/WebXRManager.js +39 -99
  308. package/src/scenes/Scene.js +0 -14
  309. package/src/textures/DepthTexture.js +22 -0
  310. package/src/textures/FramebufferTexture.js +1 -3
  311. package/src/textures/Source.js +4 -0
  312. package/src/textures/Texture.js +1 -1
  313. package/examples/jsm/exporters/ColladaExporter.js +0 -725
  314. package/examples/jsm/geometries/LightningStrike.js +0 -1017
  315. package/examples/jsm/loaders/PRWMLoader.js +0 -299
  316. package/examples/jsm/nodes/core/InstanceIndexNode.js +0 -26
  317. package/examples/jsm/objects/LightningStorm.js +0 -245
  318. package/examples/jsm/postprocessing/AdaptiveToneMappingPass.js +0 -361
  319. package/examples/jsm/renderers/webgpu/WebGPUAttributes.js +0 -197
  320. package/examples/jsm/renderers/webgpu/WebGPUBackground.js +0 -190
  321. package/examples/jsm/renderers/webgpu/WebGPUBinding.js +0 -22
  322. package/examples/jsm/renderers/webgpu/WebGPUBindings.js +0 -270
  323. package/examples/jsm/renderers/webgpu/WebGPUBuffer.js +0 -43
  324. package/examples/jsm/renderers/webgpu/WebGPUComputePipelines.js +0 -78
  325. package/examples/jsm/renderers/webgpu/WebGPUProgrammableStage.js +0 -22
  326. package/examples/jsm/renderers/webgpu/WebGPUProperties.js +0 -44
  327. package/examples/jsm/renderers/webgpu/WebGPURenderObject.js +0 -40
  328. package/examples/jsm/renderers/webgpu/WebGPURenderObjects.js +0 -50
  329. package/examples/jsm/renderers/webgpu/WebGPURenderPipelines.js +0 -274
  330. package/examples/jsm/renderers/webgpu/WebGPURenderStates.js +0 -54
  331. package/examples/jsm/renderers/webgpu/WebGPUSampledTexture.js +0 -75
  332. package/examples/jsm/renderers/webgpu/WebGPUSampler.js +0 -29
  333. package/examples/jsm/renderers/webgpu/WebGPUStorageBuffer.js +0 -20
  334. package/examples/jsm/renderers/webgpu/WebGPUTextureRenderer.js +0 -38
  335. package/examples/jsm/renderers/webgpu/WebGPUUniformBuffer.js +0 -18
  336. package/examples/jsm/renderers/webgpu/WebGPUUtils.js +0 -88
  337. package/examples/jsm/shaders/ToneMapShader.js +0 -73
  338. /package/src/renderers/shaders/ShaderChunk/{encodings_fragment.glsl.js → colorspace_fragment.glsl.js} +0 -0
  339. /package/src/renderers/shaders/ShaderChunk/{encodings_pars_fragment.glsl.js → colorspace_pars_fragment.glsl.js} +0 -0
@@ -1,24 +1,31 @@
1
- import WebGPUUniformsGroup from '../WebGPUUniformsGroup.js';
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 './WebGPUNodeUniform.js';
6
- import WebGPUNodeSampler from './WebGPUNodeSampler.js';
7
- import { WebGPUNodeSampledTexture, WebGPUNodeSampledCubeTexture } from './WebGPUNodeSampledTexture.js';
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 WebGPUUniformBuffer from '../WebGPUUniformBuffer.js';
10
- import WebGPUStorageBuffer from '../WebGPUStorageBuffer.js';
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 WebGPURenderTarget from '../WebGPURenderTarget.js';
18
+ import { NodeBuilder, CodeNode, NodeMaterial } from '../../../nodes/Nodes.js';
14
19
 
15
- import { NodeBuilder, WGSLNodeParser, CodeNode, NodeMaterial } from '../../../nodes/Nodes.js';
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 WebGPUNodeBuilder extends NodeBuilder {
95
-
96
- constructor( object, renderer ) {
101
+ class WGSLNodeBuilder extends NodeBuilder {
97
102
 
98
- super( object, renderer, new WGSLNodeParser() );
103
+ constructor( object, renderer, scene = null ) {
99
104
 
100
- this.bindings = { vertex: [], fragment: [], compute: [] };
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
- getBindings() {
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, type );
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 WebGPUNodeSampler( `${uniformNode.name}_sampler`, uniformNode.node );
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 WebGPUNodeSampledTexture( uniformNode.name, uniformNode.node );
282
+ texture = new NodeSampledTexture( uniformNode.name, uniformNode.node );
281
283
 
282
284
  } else if ( type === 'cubeTexture' ) {
283
285
 
284
- texture = new WebGPUNodeSampledCubeTexture( uniformNode.name, uniformNode.node );
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' ? WebGPUStorageBuffer : WebGPUUniformBuffer;
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 WebGPUUniformsGroup( 'nodeUniforms' );
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.attributes;
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
- const name = variable.name;
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
- snippets.push( `@location( ${index} ) ${ varying.name } : ${ this.getType( varying.type ) }` );
523
+ let attributesSnippet = `@location( ${index} )`;
524
+
525
+ if ( varying.type === 'int' || varying.type === 'uint' ) {
508
526
 
509
- } else if ( vars.includes( varying ) === false ) {
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( `@group( 0 ) @binding( ${index ++} ) var ${uniform.name}_sampler : sampler;` );
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( `@group( 0 ) @binding( ${index ++} ) var ${uniform.name} : ${textureType};` );
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 WebGPURenderTarget( width, height, options );
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 WebGPUNodeBuilder;
878
+ export default WGSLNodeBuilder;
@@ -1,5 +1,5 @@
1
- import NodeFunction from '../core/NodeFunction.js';
2
- import NodeFunctionInput from '../core/NodeFunctionInput.js';
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;
@@ -1,4 +1,4 @@
1
- import NodeParser from '../core/NodeParser.js';
1
+ import NodeParser from '../../../nodes/core/NodeParser.js';
2
2
  import WGSLNodeFunction from './WGSLNodeFunction.js';
3
3
 
4
4
  class WGSLNodeParser extends NodeParser {
@@ -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;