super-three 0.152.0 → 0.154.1

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 +778 -557
  2. package/build/three.js +778 -557
  3. package/build/three.min.js +1 -1
  4. package/build/three.module.js +769 -539
  5. package/build/three.module.min.js +1 -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,1145 +1,29 @@
1
- import { GPUIndexFormat, GPUTextureFormat, GPUFeatureName, GPULoadOp } from './constants.js';
2
- import WebGPUAnimation from './WebGPUAnimation.js';
3
- import WebGPURenderObjects from './WebGPURenderObjects.js';
4
- import WebGPUAttributes from './WebGPUAttributes.js';
5
- import WebGPUGeometries from './WebGPUGeometries.js';
6
- import WebGPUInfo from './WebGPUInfo.js';
7
- import WebGPUProperties from './WebGPUProperties.js';
8
- import WebGPURenderPipelines from './WebGPURenderPipelines.js';
9
- import WebGPUComputePipelines from './WebGPUComputePipelines.js';
10
- import WebGPUBindings from './WebGPUBindings.js';
11
- import WebGPURenderLists from './WebGPURenderLists.js';
12
- import WebGPURenderStates from './WebGPURenderStates.js';
13
- import WebGPUTextures from './WebGPUTextures.js';
14
- import WebGPUBackground from './WebGPUBackground.js';
15
- import WebGPUNodes from './nodes/WebGPUNodes.js';
16
- import WebGPUUtils from './WebGPUUtils.js';
17
- import { Frustum, Matrix4, Vector3, Color, SRGBColorSpace, NoToneMapping, DepthFormat } from 'three';
1
+ import Renderer from '../common/Renderer.js';
2
+ import WebGPUBackend from './WebGPUBackend.js';
3
+ /*
4
+ const debugHandler = {
18
5
 
19
- console.info( 'THREE.WebGPURenderer: Modified Matrix4.makePerspective() and Matrix4.makeOrtographic() to work with WebGPU, see https://github.com/mrdoob/three.js/issues/20276.' );
6
+ get: function ( target, name ) {
20
7
 
21
- Matrix4.prototype.makePerspective = function ( left, right, top, bottom, near, far ) {
8
+ // Add |update
9
+ if ( /^(create|destroy)/.test( name ) ) console.log( 'WebGPUBackend.' + name );
22
10
 
23
- const te = this.elements;
24
- const x = 2 * near / ( right - left );
25
- const y = 2 * near / ( top - bottom );
11
+ return target[ name ];
26
12
 
27
- const a = ( right + left ) / ( right - left );
28
- const b = ( top + bottom ) / ( top - bottom );
29
- const c = - far / ( far - near );
30
- const d = - far * near / ( far - near );
31
-
32
- te[ 0 ] = x; te[ 4 ] = 0; te[ 8 ] = a; te[ 12 ] = 0;
33
- te[ 1 ] = 0; te[ 5 ] = y; te[ 9 ] = b; te[ 13 ] = 0;
34
- te[ 2 ] = 0; te[ 6 ] = 0; te[ 10 ] = c; te[ 14 ] = d;
35
- te[ 3 ] = 0; te[ 7 ] = 0; te[ 11 ] = - 1; te[ 15 ] = 0;
36
-
37
- return this;
38
-
39
- };
40
-
41
- Matrix4.prototype.makeOrthographic = function ( left, right, top, bottom, near, far ) {
42
-
43
- const te = this.elements;
44
- const w = 1.0 / ( right - left );
45
- const h = 1.0 / ( top - bottom );
46
- const p = 1.0 / ( far - near );
47
-
48
- const x = ( right + left ) * w;
49
- const y = ( top + bottom ) * h;
50
- const z = near * p;
51
-
52
- te[ 0 ] = 2 * w; te[ 4 ] = 0; te[ 8 ] = 0; te[ 12 ] = - x;
53
- te[ 1 ] = 0; te[ 5 ] = 2 * h; te[ 9 ] = 0; te[ 13 ] = - y;
54
- te[ 2 ] = 0; te[ 6 ] = 0; te[ 10 ] = - 1 * p; te[ 14 ] = - z;
55
- te[ 3 ] = 0; te[ 7 ] = 0; te[ 11 ] = 0; te[ 15 ] = 1;
56
-
57
- return this;
58
-
59
- };
60
-
61
- Frustum.prototype.setFromProjectionMatrix = function ( m ) {
62
-
63
- const planes = this.planes;
64
- const me = m.elements;
65
- const me0 = me[ 0 ], me1 = me[ 1 ], me2 = me[ 2 ], me3 = me[ 3 ];
66
- const me4 = me[ 4 ], me5 = me[ 5 ], me6 = me[ 6 ], me7 = me[ 7 ];
67
- const me8 = me[ 8 ], me9 = me[ 9 ], me10 = me[ 10 ], me11 = me[ 11 ];
68
- const me12 = me[ 12 ], me13 = me[ 13 ], me14 = me[ 14 ], me15 = me[ 15 ];
69
-
70
- planes[ 0 ].setComponents( me3 - me0, me7 - me4, me11 - me8, me15 - me12 ).normalize();
71
- planes[ 1 ].setComponents( me3 + me0, me7 + me4, me11 + me8, me15 + me12 ).normalize();
72
- planes[ 2 ].setComponents( me3 + me1, me7 + me5, me11 + me9, me15 + me13 ).normalize();
73
- planes[ 3 ].setComponents( me3 - me1, me7 - me5, me11 - me9, me15 - me13 ).normalize();
74
- planes[ 4 ].setComponents( me3 - me2, me7 - me6, me11 - me10, me15 - me14 ).normalize();
75
- planes[ 5 ].setComponents( me2, me6, me10, me14 ).normalize();
76
-
77
- return this;
13
+ }
78
14
 
79
15
  };
80
-
81
- const _frustum = new Frustum();
82
- const _projScreenMatrix = new Matrix4();
83
- const _vector3 = new Vector3();
84
-
85
- class WebGPURenderer {
16
+ */
17
+ class WebGPURenderer extends Renderer {
86
18
 
87
19
  constructor( parameters = {} ) {
88
20
 
89
- this.isWebGPURenderer = true;
90
-
91
- // public
92
-
93
- this.domElement = ( parameters.canvas !== undefined ) ? parameters.canvas : this._createCanvasElement();
94
-
95
- this.autoClear = true;
96
- this.autoClearColor = true;
97
- this.autoClearDepth = true;
98
- this.autoClearStencil = true;
99
-
100
- this.outputColorSpace = SRGBColorSpace;
101
-
102
- this.toneMapping = NoToneMapping;
103
- this.toneMappingExposure = 1.0;
104
-
105
- this.sortObjects = true;
106
-
107
- // internals
108
-
109
- this._parameters = Object.assign( {}, parameters );
110
-
111
- this._pixelRatio = 1;
112
- this._width = this.domElement.width;
113
- this._height = this.domElement.height;
114
-
115
- this._viewport = null;
116
- this._scissor = null;
117
-
118
- this._adapter = null;
119
- this._device = null;
120
- this._context = null;
121
- this._colorBuffer = null;
122
- this._depthBuffer = null;
123
-
124
- this._info = null;
125
- this._properties = null;
126
- this._attributes = null;
127
- this._geometries = null;
128
- this._nodes = null;
129
- this._bindings = null;
130
- this._objects = null;
131
- this._renderPipelines = null;
132
- this._computePipelines = null;
133
- this._renderLists = null;
134
- this._renderStates = null;
135
- this._textures = null;
136
- this._background = null;
137
-
138
- this._animation = new WebGPUAnimation();
139
-
140
- this._currentRenderState = null;
141
-
142
- this._opaqueSort = null;
143
- this._transparentSort = null;
144
-
145
- this._clearAlpha = 1;
146
- this._clearColor = new Color( 0x000000 );
147
- this._clearDepth = 1;
148
- this._clearStencil = 0;
149
-
150
- this._renderTarget = null;
151
-
152
- this._initialized = false;
153
-
154
- // some parameters require default values other than "undefined"
155
-
156
- this._parameters.antialias = ( parameters.antialias === true );
157
-
158
- if ( this._parameters.antialias === true ) {
159
-
160
- this._parameters.sampleCount = ( parameters.sampleCount === undefined ) ? 4 : parameters.sampleCount;
161
-
162
- } else {
163
-
164
- this._parameters.sampleCount = 1;
165
-
166
- }
167
-
168
- this._parameters.requiredLimits = ( parameters.requiredLimits === undefined ) ? {} : parameters.requiredLimits;
169
-
170
- // backwards compatibility
171
-
172
- this.shadow = {
173
- shadowMap: {}
174
- };
175
-
176
- }
177
-
178
- async init() {
179
-
180
- if ( this._initialized === true ) {
181
-
182
- throw new Error( 'WebGPURenderer: Device has already been initialized.' );
183
-
184
- }
185
-
186
- const parameters = this._parameters;
187
-
188
- const adapterOptions = {
189
- powerPreference: parameters.powerPreference
190
- };
191
-
192
- const adapter = await navigator.gpu.requestAdapter( adapterOptions );
193
-
194
- if ( adapter === null ) {
195
-
196
- throw new Error( 'WebGPURenderer: Unable to create WebGPU adapter.' );
197
-
198
- }
199
-
200
- // feature support
201
-
202
- const features = Object.values( GPUFeatureName );
203
-
204
- const supportedFeatures = [];
205
-
206
- for ( const name of features ) {
207
-
208
- if ( adapter.features.has( name ) ) {
209
-
210
- supportedFeatures.push( name );
211
-
212
- }
213
-
214
- }
215
-
216
- const deviceDescriptor = {
217
- requiredFeatures: supportedFeatures,
218
- requiredLimits: parameters.requiredLimits
219
- };
220
-
221
- const device = await adapter.requestDevice( deviceDescriptor );
222
-
223
- const context = ( parameters.context !== undefined ) ? parameters.context : this.domElement.getContext( 'webgpu' );
224
-
225
- this._adapter = adapter;
226
- this._device = device;
227
- this._context = context;
228
-
229
- this._configureContext();
230
-
231
- this._info = new WebGPUInfo();
232
- this._properties = new WebGPUProperties();
233
- this._attributes = new WebGPUAttributes( device );
234
- this._geometries = new WebGPUGeometries( this._attributes, this._properties, this._info );
235
- this._textures = new WebGPUTextures( device, this._properties, this._info );
236
- this._utils = new WebGPUUtils( this );
237
- this._nodes = new WebGPUNodes( this, this._properties );
238
- this._objects = new WebGPURenderObjects( this, this._nodes, this._geometries, this._info );
239
- this._computePipelines = new WebGPUComputePipelines( device, this._nodes );
240
- this._renderPipelines = new WebGPURenderPipelines( device, this._nodes, this._utils );
241
- this._bindings = this._renderPipelines.bindings = new WebGPUBindings( device, this._info, this._properties, this._textures, this._renderPipelines, this._computePipelines, this._attributes, this._nodes );
242
- this._renderLists = new WebGPURenderLists();
243
- this._renderStates = new WebGPURenderStates();
244
- this._background = new WebGPUBackground( this, this._properties );
245
-
246
- //
247
-
248
- this._setupColorBuffer();
249
- this._setupDepthBuffer();
250
-
251
- this._animation.setNodes( this._nodes );
252
- this._animation.start();
253
-
254
- this._initialized = true;
255
-
256
- }
257
-
258
- async render( scene, camera ) {
259
-
260
- if ( this._initialized === false ) await this.init();
261
-
262
- // preserve render tree
263
-
264
- const nodeFrame = this._nodes.nodeFrame;
265
-
266
- const previousRenderId = nodeFrame.renderId;
267
- const previousRenderState = this._currentRenderState;
268
-
269
- //
270
-
271
- const renderState = this._renderStates.get( scene, camera );
272
- const renderTarget = this._renderTarget;
273
-
274
- this._currentRenderState = renderState;
275
-
276
- nodeFrame.renderId ++;
277
-
278
- //
279
-
280
- if ( this._animation.isAnimating === false ) nodeFrame.update();
281
-
282
- if ( scene.matrixWorldAutoUpdate === true ) scene.updateMatrixWorld();
283
-
284
- if ( camera.parent === null && camera.matrixWorldAutoUpdate === true ) camera.updateMatrixWorld();
285
-
286
- if ( this._info.autoReset === true ) this._info.reset();
287
-
288
- _projScreenMatrix.multiplyMatrices( camera.projectionMatrix, camera.matrixWorldInverse );
289
- _frustum.setFromProjectionMatrix( _projScreenMatrix );
290
-
291
- const renderList = this._renderLists.get( scene, camera );
292
- renderList.init();
293
-
294
- this._projectObject( scene, camera, 0, renderList );
295
-
296
- renderList.finish();
297
-
298
- if ( this.sortObjects === true ) {
299
-
300
- renderList.sort( this._opaqueSort, this._transparentSort );
301
-
302
- }
303
-
304
- // prepare render pass descriptor
305
-
306
- renderState.descriptorGPU = {
307
- colorAttachments: [ {
308
- view: null
309
- } ],
310
- depthStencilAttachment: {
311
- view: null
312
- }
313
- };
314
-
315
- const colorAttachment = renderState.descriptorGPU.colorAttachments[ 0 ];
316
- const depthStencilAttachment = renderState.descriptorGPU.depthStencilAttachment;
317
-
318
- if ( renderTarget !== null ) {
319
-
320
- this._textures.initRenderTarget( renderTarget );
321
-
322
- // @TODO: Support RenderTarget with antialiasing.
323
-
324
- const renderTargetProperties = this._properties.get( renderTarget );
325
-
326
- colorAttachment.view = renderTargetProperties.colorTextureGPU.createView();
327
- depthStencilAttachment.view = renderTargetProperties.depthTextureGPU.createView();
328
-
329
- renderState.stencil = renderTarget.depthTexture ? renderTarget.depthTexture.format !== DepthFormat : true;
330
-
331
- } else {
332
-
333
- if ( this._parameters.antialias === true ) {
334
-
335
- colorAttachment.view = this._colorBuffer.createView();
336
- colorAttachment.resolveTarget = this._context.getCurrentTexture().createView();
337
-
338
- } else {
339
-
340
- colorAttachment.view = this._context.getCurrentTexture().createView();
341
- colorAttachment.resolveTarget = undefined;
342
-
343
- }
344
-
345
- depthStencilAttachment.view = this._depthBuffer.createView();
346
-
347
- }
348
-
349
- //
350
-
351
- this._nodes.updateEnvironment( scene );
352
- this._nodes.updateFog( scene );
353
- this._nodes.updateBackground( scene );
354
- this._nodes.updateToneMapping();
355
-
356
- //
357
-
358
- this._background.update( scene, renderList, renderState );
359
-
360
- // start render pass
361
-
362
- const device = this._device;
363
-
364
- renderState.encoderGPU = device.createCommandEncoder( {} );
365
- renderState.currentPassGPU = renderState.encoderGPU.beginRenderPass( renderState.descriptorGPU );
366
-
367
- // global rasterization settings for all renderable objects
368
-
369
- const vp = this._viewport;
370
-
371
- if ( vp !== null ) {
372
-
373
- const width = Math.floor( vp.width * this._pixelRatio );
374
- const height = Math.floor( vp.height * this._pixelRatio );
375
-
376
- renderState.currentPassGPU.setViewport( vp.x, vp.y, width, height, vp.minDepth, vp.maxDepth );
377
-
378
- }
379
-
380
- const sc = this._scissor;
381
-
382
- if ( sc !== null ) {
383
-
384
- const width = Math.floor( sc.width * this._pixelRatio );
385
- const height = Math.floor( sc.height * this._pixelRatio );
386
-
387
- renderState.currentPassGPU.setScissorRect( sc.x, sc.y, width, height );
388
-
389
- }
390
-
391
- // process render lists
392
-
393
- const opaqueObjects = renderList.opaque;
394
- const transparentObjects = renderList.transparent;
395
- const lightsNode = renderList.lightsNode;
396
-
397
- if ( opaqueObjects.length > 0 ) this._renderObjects( opaqueObjects, camera, scene, lightsNode, renderState );
398
- if ( transparentObjects.length > 0 ) this._renderObjects( transparentObjects, camera, scene, lightsNode, renderState );
399
-
400
- // finish render pass
401
-
402
- renderState.currentPassGPU.end();
403
-
404
- device.queue.submit( [ renderState.encoderGPU.finish() ] );
405
-
406
- // restore render tree
407
-
408
- nodeFrame.renderId = previousRenderId;
409
- this._currentRenderState = previousRenderState;
410
-
411
- }
412
-
413
- setAnimationLoop( callback ) {
414
-
415
- if ( this._initialized === false ) this.init();
416
-
417
- const animation = this._animation;
418
-
419
- animation.setAnimationLoop( callback );
420
-
421
- ( callback === null ) ? animation.stop() : animation.start();
422
-
423
- }
424
-
425
- async getArrayBuffer( attribute ) {
426
-
427
- return await this._attributes.getArrayBuffer( attribute );
428
-
429
- }
430
-
431
- getContext() {
432
-
433
- return this._context;
434
-
435
- }
436
-
437
- getPixelRatio() {
438
-
439
- return this._pixelRatio;
440
-
441
- }
442
-
443
- getDrawingBufferSize( target ) {
444
-
445
- return target.set( this._width * this._pixelRatio, this._height * this._pixelRatio ).floor();
446
-
447
- }
448
-
449
- getSize( target ) {
450
-
451
- return target.set( this._width, this._height );
452
-
453
- }
454
-
455
- setPixelRatio( value = 1 ) {
456
-
457
- this._pixelRatio = value;
458
-
459
- this.setSize( this._width, this._height, false );
460
-
461
- }
462
-
463
- setDrawingBufferSize( width, height, pixelRatio ) {
464
-
465
- this._width = width;
466
- this._height = height;
467
-
468
- this._pixelRatio = pixelRatio;
469
-
470
- this.domElement.width = Math.floor( width * pixelRatio );
471
- this.domElement.height = Math.floor( height * pixelRatio );
472
-
473
- this._configureContext();
474
- this._setupColorBuffer();
475
- this._setupDepthBuffer();
476
-
477
- }
478
-
479
- setSize( width, height, updateStyle = true ) {
480
-
481
- this._width = width;
482
- this._height = height;
483
-
484
- this.domElement.width = Math.floor( width * this._pixelRatio );
485
- this.domElement.height = Math.floor( height * this._pixelRatio );
486
-
487
- if ( updateStyle === true ) {
488
-
489
- this.domElement.style.width = width + 'px';
490
- this.domElement.style.height = height + 'px';
491
-
492
- }
493
-
494
- this._configureContext();
495
- this._setupColorBuffer();
496
- this._setupDepthBuffer();
497
-
498
- }
499
-
500
- setOpaqueSort( method ) {
501
-
502
- this._opaqueSort = method;
503
-
504
- }
505
-
506
- setTransparentSort( method ) {
507
-
508
- this._transparentSort = method;
509
-
510
- }
511
-
512
- getScissor( target ) {
513
-
514
- const scissor = this._scissor;
515
-
516
- target.x = scissor.x;
517
- target.y = scissor.y;
518
- target.width = scissor.width;
519
- target.height = scissor.height;
520
-
521
- return target;
522
-
523
- }
524
-
525
- setScissor( x, y, width, height ) {
526
-
527
- if ( x === null ) {
528
-
529
- this._scissor = null;
530
-
531
- } else {
532
-
533
- this._scissor = {
534
- x: x,
535
- y: y,
536
- width: width,
537
- height: height
538
- };
539
-
540
- }
541
-
542
- }
543
-
544
- copyFramebufferToRenderTarget( renderTarget ) {
545
-
546
- const renderState = this._currentRenderState;
547
- const { encoderGPU, descriptorGPU } = renderState;
548
-
549
- const texture = renderTarget.texture;
550
- texture.internalFormat = GPUTextureFormat.BGRA8Unorm;
551
-
552
- this._textures.initRenderTarget( renderTarget );
553
-
554
- const sourceGPU = this._context.getCurrentTexture();
555
- const destinationGPU = this._textures.getTextureGPU( texture );
556
-
557
- renderState.currentPassGPU.end();
558
-
559
- encoderGPU.copyTextureToTexture(
560
- {
561
- texture: sourceGPU
562
- },
563
- {
564
- texture: destinationGPU
565
- },
566
- [
567
- texture.image.width,
568
- texture.image.height
569
- ]
570
- );
571
-
572
- descriptorGPU.colorAttachments[ 0 ].loadOp = GPULoadOp.Load;
573
- if ( renderState.depth ) descriptorGPU.depthStencilAttachment.depthLoadOp = GPULoadOp.Load;
574
- if ( renderState.stencil ) descriptorGPU.depthStencilAttachment.stencilLoadOp = GPULoadOp.Load;
575
-
576
- renderState.currentPassGPU = encoderGPU.beginRenderPass( descriptorGPU );
577
-
578
- }
579
-
580
- getViewport( target ) {
581
-
582
- const viewport = this._viewport;
583
-
584
- target.x = viewport.x;
585
- target.y = viewport.y;
586
- target.width = viewport.width;
587
- target.height = viewport.height;
588
- target.minDepth = viewport.minDepth;
589
- target.maxDepth = viewport.maxDepth;
590
-
591
- return target;
592
-
593
- }
594
-
595
- setViewport( x, y, width, height, minDepth = 0, maxDepth = 1 ) {
596
-
597
- if ( x === null ) {
598
-
599
- this._viewport = null;
600
-
601
- } else {
602
-
603
- this._viewport = {
604
- x: x,
605
- y: y,
606
- width: width,
607
- height: height,
608
- minDepth: minDepth,
609
- maxDepth: maxDepth
610
- };
611
-
612
- }
613
-
614
- }
615
-
616
- getClearColor( target ) {
617
-
618
- return target.copy( this._clearColor );
619
-
620
- }
621
-
622
- setClearColor( color, alpha = 1 ) {
623
-
624
- this._clearColor.set( color );
625
- this._clearAlpha = alpha;
21
+ const backend = new WebGPUBackend( parameters );
22
+ //const backend = new Proxy( new WebGPUBackend( parameters ), debugHandler );
626
23
 
627
- }
628
-
629
- getClearAlpha() {
630
-
631
- return this._clearAlpha;
632
-
633
- }
634
-
635
- setClearAlpha( alpha ) {
636
-
637
- this._clearAlpha = alpha;
638
-
639
- }
640
-
641
- getClearDepth() {
642
-
643
- return this._clearDepth;
644
-
645
- }
646
-
647
- setClearDepth( depth ) {
648
-
649
- this._clearDepth = depth;
650
-
651
- }
652
-
653
- getClearStencil() {
654
-
655
- return this._clearStencil;
656
-
657
- }
658
-
659
- setClearStencil( stencil ) {
660
-
661
- this._clearStencil = stencil;
662
-
663
- }
664
-
665
- clear() {
666
-
667
- if ( this._background ) this._background.clear();
668
-
669
- }
670
-
671
- dispose() {
672
-
673
- this._objects.dispose();
674
- this._properties.dispose();
675
- this._renderPipelines.dispose();
676
- this._computePipelines.dispose();
677
- this._nodes.dispose();
678
- this._bindings.dispose();
679
- this._info.dispose();
680
- this._renderLists.dispose();
681
- this._renderStates.dispose();
682
- this._textures.dispose();
683
-
684
- this.setRenderTarget( null );
685
- this.setAnimationLoop( null );
686
-
687
- }
688
-
689
- setRenderTarget( renderTarget ) {
690
-
691
- this._renderTarget = renderTarget;
692
-
693
- }
694
-
695
- async compute( ...computeNodes ) {
696
-
697
- if ( this._initialized === false ) await this.init();
698
-
699
- const device = this._device;
700
- const computePipelines = this._computePipelines;
701
-
702
- const cmdEncoder = device.createCommandEncoder( {} );
703
- const passEncoder = cmdEncoder.beginComputePass();
704
-
705
- for ( const computeNode of computeNodes ) {
706
-
707
- // onInit
708
-
709
- if ( computePipelines.has( computeNode ) === false ) {
710
-
711
- computeNode.onInit( { renderer: this } );
712
-
713
- }
714
-
715
- // pipeline
716
-
717
- const pipeline = computePipelines.get( computeNode );
718
- passEncoder.setPipeline( pipeline );
719
-
720
- // node
721
-
722
- //this._nodes.update( computeNode );
723
-
724
- // bind group
725
-
726
- const bindGroup = this._bindings.getForCompute( computeNode ).group;
727
- this._bindings.update( computeNode );
728
- passEncoder.setBindGroup( 0, bindGroup );
729
-
730
- passEncoder.dispatchWorkgroups( computeNode.dispatchCount );
731
-
732
- }
733
-
734
- passEncoder.end();
735
- device.queue.submit( [ cmdEncoder.finish() ] );
736
-
737
- }
738
-
739
- getRenderTarget() {
740
-
741
- return this._renderTarget;
742
-
743
- }
744
-
745
- hasFeature( name ) {
746
-
747
- if ( this._initialized === false ) {
748
-
749
- throw new Error( 'THREE.WebGPURenderer: Renderer must be initialized before testing features.' );
750
-
751
- }
752
-
753
- //
754
-
755
- const features = Object.values( GPUFeatureName );
756
-
757
- if ( features.includes( name ) === false ) {
758
-
759
- throw new Error( 'THREE.WebGPURenderer: Unknown WebGPU GPU feature: ' + name );
760
-
761
- }
762
-
763
- //
764
-
765
- return this._adapter.features.has( name );
766
-
767
- }
768
-
769
- _projectObject( object, camera, groupOrder, renderList ) {
770
-
771
- if ( object.visible === false ) return;
772
-
773
- const visible = object.layers.test( camera.layers );
774
-
775
- if ( visible ) {
776
-
777
- if ( object.isGroup ) {
778
-
779
- groupOrder = object.renderOrder;
780
-
781
- } else if ( object.isLOD ) {
782
-
783
- if ( object.autoUpdate === true ) object.update( camera );
784
-
785
- } else if ( object.isLight ) {
786
-
787
- renderList.pushLight( object );
788
-
789
- } else if ( object.isSprite ) {
790
-
791
- if ( ! object.frustumCulled || _frustum.intersectsSprite( object ) ) {
792
-
793
- if ( this.sortObjects === true ) {
794
-
795
- _vector3.setFromMatrixPosition( object.matrixWorld ).applyMatrix4( _projScreenMatrix );
796
-
797
- }
798
-
799
- const geometry = object.geometry;
800
- const material = object.material;
801
-
802
- if ( material.visible ) {
803
-
804
- renderList.push( object, geometry, material, groupOrder, _vector3.z, null );
805
-
806
- }
807
-
808
- }
809
-
810
- } else if ( object.isLineLoop ) {
811
-
812
- console.error( 'THREE.WebGPURenderer: Objects of type THREE.LineLoop are not supported. Please use THREE.Line or THREE.LineSegments.' );
813
-
814
- } else if ( object.isMesh || object.isLine || object.isPoints ) {
815
-
816
- if ( ! object.frustumCulled || _frustum.intersectsObject( object ) ) {
817
-
818
- const geometry = object.geometry;
819
- const material = object.material;
820
-
821
- if ( this.sortObjects === true ) {
822
-
823
- if ( geometry.boundingSphere === null ) geometry.computeBoundingSphere();
824
-
825
- _vector3
826
- .copy( geometry.boundingSphere.center )
827
- .applyMatrix4( object.matrixWorld )
828
- .applyMatrix4( _projScreenMatrix );
829
-
830
- }
831
-
832
- if ( Array.isArray( material ) ) {
833
-
834
- const groups = geometry.groups;
835
-
836
- for ( let i = 0, l = groups.length; i < l; i ++ ) {
837
-
838
- const group = groups[ i ];
839
- const groupMaterial = material[ group.materialIndex ];
840
-
841
- if ( groupMaterial && groupMaterial.visible ) {
842
-
843
- renderList.push( object, geometry, groupMaterial, groupOrder, _vector3.z, group );
844
-
845
- }
846
-
847
- }
848
-
849
- } else if ( material.visible ) {
850
-
851
- renderList.push( object, geometry, material, groupOrder, _vector3.z, null );
852
-
853
- }
854
-
855
- }
856
-
857
- }
858
-
859
- }
860
-
861
- const children = object.children;
862
-
863
- for ( let i = 0, l = children.length; i < l; i ++ ) {
864
-
865
- this._projectObject( children[ i ], camera, groupOrder, renderList );
866
-
867
- }
868
-
869
- }
870
-
871
- _renderObjects( renderList, camera, scene, lightsNode ) {
872
-
873
- // process renderable objects
874
-
875
- for ( let i = 0, il = renderList.length; i < il; i ++ ) {
876
-
877
- const renderItem = renderList[ i ];
878
-
879
- // @TODO: Add support for multiple materials per object. This will require to extract
880
- // the material from the renderItem object and pass it with its group data to _renderObject().
881
-
882
- const { object, geometry, material, group } = renderItem;
883
-
884
- if ( camera.isArrayCamera ) {
885
-
886
- const cameras = camera.cameras;
887
-
888
- for ( let j = 0, jl = cameras.length; j < jl; j ++ ) {
889
-
890
- const camera2 = cameras[ j ];
891
-
892
- if ( object.layers.test( camera2.layers ) ) {
893
-
894
- const vp = camera2.viewport;
895
- const minDepth = ( vp.minDepth === undefined ) ? 0 : vp.minDepth;
896
- const maxDepth = ( vp.maxDepth === undefined ) ? 1 : vp.maxDepth;
897
-
898
- this._currentRenderState.currentPassGPU.setViewport( vp.x, vp.y, vp.width, vp.height, minDepth, maxDepth );
899
-
900
- this._renderObject( object, scene, camera2, geometry, material, group, lightsNode );
901
-
902
- }
903
-
904
- }
905
-
906
- } else {
907
-
908
- this._renderObject( object, scene, camera, geometry, material, group, lightsNode );
909
-
910
- }
911
-
912
- }
913
-
914
- }
915
-
916
- _renderObject( object, scene, camera, geometry, material, group, lightsNode ) {
917
-
918
- material = scene.overrideMaterial !== null ? scene.overrideMaterial : material;
919
-
920
- //
921
-
922
- object.onBeforeRender( this, scene, camera, geometry, material, group );
923
-
924
- //
925
-
926
- const renderObject = this._getRenderObject( object, material, scene, camera, lightsNode );
927
-
928
- //
929
-
930
- this._nodes.updateBefore( renderObject );
24
+ super( backend );
931
25
 
932
- //
933
-
934
- const passEncoder = this._currentRenderState.currentPassGPU;
935
- const info = this._info;
936
-
937
- //
938
-
939
- object.modelViewMatrix.multiplyMatrices( camera.matrixWorldInverse, object.matrixWorld );
940
- object.normalMatrix.getNormalMatrix( object.modelViewMatrix );
941
-
942
- // updates
943
-
944
- this._nodes.update( renderObject );
945
- this._geometries.update( renderObject );
946
- this._bindings.update( renderObject );
947
-
948
- // pipeline
949
-
950
- const renderPipeline = this._renderPipelines.get( renderObject );
951
- passEncoder.setPipeline( renderPipeline.pipeline );
952
-
953
- // bind group
954
-
955
- const bindGroup = this._bindings.get( renderObject ).group;
956
- passEncoder.setBindGroup( 0, bindGroup );
957
-
958
- // index
959
-
960
- const index = this._geometries.getIndex( renderObject );
961
-
962
- const hasIndex = ( index !== null );
963
-
964
- if ( hasIndex === true ) {
965
-
966
- this._setupIndexBuffer( index, passEncoder );
967
-
968
- }
969
-
970
- // vertex buffers
971
-
972
- this._setupVertexBuffers( geometry.attributes, passEncoder, renderPipeline );
973
-
974
- // draw
975
-
976
- const drawRange = geometry.drawRange;
977
- const firstVertex = drawRange.start;
978
-
979
- const instanceCount = geometry.isInstancedBufferGeometry ? geometry.instanceCount : ( object.isInstancedMesh ? object.count : 1 );
980
-
981
- if ( hasIndex === true ) {
982
-
983
- const indexCount = ( drawRange.count !== Infinity ) ? drawRange.count : index.count;
984
-
985
- passEncoder.drawIndexed( indexCount, instanceCount, firstVertex, 0, 0 );
986
-
987
- info.update( object, indexCount, instanceCount );
988
-
989
- } else {
990
-
991
- const positionAttribute = geometry.attributes.position;
992
- const vertexCount = ( drawRange.count !== Infinity ) ? drawRange.count : positionAttribute.count;
993
-
994
- passEncoder.draw( vertexCount, instanceCount, firstVertex, 0 );
995
-
996
- info.update( object, vertexCount, instanceCount );
997
-
998
- }
999
-
1000
- }
1001
-
1002
- _getRenderObject( object, material, scene, camera, lightsNode ) {
1003
-
1004
- const renderObject = this._objects.get( object, material, scene, camera, lightsNode );
1005
- const renderObjectProperties = this._properties.get( renderObject );
1006
-
1007
- if ( renderObjectProperties.initialized !== true ) {
1008
-
1009
- renderObjectProperties.initialized = true;
1010
-
1011
- const dispose = () => {
1012
-
1013
- this._renderPipelines.remove( renderObject );
1014
- this._nodes.remove( renderObject );
1015
- this._properties.remove( renderObject );
1016
-
1017
- this._objects.remove( object, material, scene, camera, lightsNode );
1018
-
1019
- renderObject.material.removeEventListener( 'dispose', dispose );
1020
-
1021
- };
1022
-
1023
- renderObject.material.addEventListener( 'dispose', dispose );
1024
-
1025
- }
1026
-
1027
- const cacheKey = renderObject.getCacheKey();
1028
-
1029
- if ( renderObjectProperties.cacheKey !== cacheKey ) {
1030
-
1031
- renderObjectProperties.cacheKey = cacheKey;
1032
-
1033
- this._renderPipelines.remove( renderObject );
1034
- this._nodes.remove( renderObject );
1035
-
1036
- }
1037
-
1038
- return renderObject;
1039
-
1040
- }
1041
-
1042
- _setupIndexBuffer( index, encoder ) {
1043
-
1044
- const buffer = this._attributes.get( index ).buffer;
1045
- const indexFormat = ( index.array instanceof Uint16Array ) ? GPUIndexFormat.Uint16 : GPUIndexFormat.Uint32;
1046
-
1047
- encoder.setIndexBuffer( buffer, indexFormat );
1048
-
1049
- }
1050
-
1051
- _setupVertexBuffers( geometryAttributes, encoder, renderPipeline ) {
1052
-
1053
- const shaderAttributes = renderPipeline.shaderAttributes;
1054
-
1055
- for ( const shaderAttribute of shaderAttributes ) {
1056
-
1057
- const name = shaderAttribute.name;
1058
- const slot = shaderAttribute.slot;
1059
-
1060
- const attribute = geometryAttributes[ name ];
1061
-
1062
- if ( attribute !== undefined ) {
1063
-
1064
- const buffer = this._attributes.get( attribute ).buffer;
1065
- encoder.setVertexBuffer( slot, buffer );
1066
-
1067
- }
1068
-
1069
- }
1070
-
1071
- }
1072
-
1073
- _setupColorBuffer() {
1074
-
1075
- const device = this._device;
1076
-
1077
- if ( device ) {
1078
-
1079
- if ( this._colorBuffer ) this._colorBuffer.destroy();
1080
-
1081
- this._colorBuffer = this._device.createTexture( {
1082
- label: 'colorBuffer',
1083
- size: {
1084
- width: Math.floor( this._width * this._pixelRatio ),
1085
- height: Math.floor( this._height * this._pixelRatio ),
1086
- depthOrArrayLayers: 1
1087
- },
1088
- sampleCount: this._parameters.sampleCount,
1089
- format: GPUTextureFormat.BGRA8Unorm,
1090
- usage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.COPY_SRC
1091
- } );
1092
-
1093
- }
1094
-
1095
- }
1096
-
1097
- _setupDepthBuffer() {
1098
-
1099
- const device = this._device;
1100
-
1101
- if ( device ) {
1102
-
1103
- if ( this._depthBuffer ) this._depthBuffer.destroy();
1104
-
1105
- this._depthBuffer = this._device.createTexture( {
1106
- label: 'depthBuffer',
1107
- size: {
1108
- width: Math.floor( this._width * this._pixelRatio ),
1109
- height: Math.floor( this._height * this._pixelRatio ),
1110
- depthOrArrayLayers: 1
1111
- },
1112
- sampleCount: this._parameters.sampleCount,
1113
- format: GPUTextureFormat.Depth24PlusStencil8,
1114
- usage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.COPY_SRC
1115
- } );
1116
-
1117
- }
1118
-
1119
- }
1120
-
1121
- _configureContext() {
1122
-
1123
- const device = this._device;
1124
-
1125
- if ( device ) {
1126
-
1127
- this._context.configure( {
1128
- device: device,
1129
- format: GPUTextureFormat.BGRA8Unorm,
1130
- usage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.COPY_SRC,
1131
- alphaMode: 'premultiplied'
1132
- } );
1133
-
1134
- }
1135
-
1136
- }
1137
-
1138
- _createCanvasElement() {
1139
-
1140
- const canvas = document.createElementNS( 'http://www.w3.org/1999/xhtml', 'canvas' );
1141
- canvas.style.display = 'block';
1142
- return canvas;
26
+ this.isWebGPURenderer = true;
1143
27
 
1144
28
  }
1145
29