super-three 0.155.0 → 0.157.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 (268) hide show
  1. package/build/three.cjs +361 -324
  2. package/build/three.js +361 -324
  3. package/build/three.min.js +2 -2
  4. package/build/three.module.js +354 -323
  5. package/build/three.module.min.js +1 -1
  6. package/examples/jsm/capabilities/WebGL.js +17 -0
  7. package/examples/jsm/controls/DragControls.js +3 -2
  8. package/examples/jsm/controls/OrbitControls.js +13 -5
  9. package/examples/jsm/csm/CSMShader.js +59 -21
  10. package/examples/jsm/exporters/EXRExporter.js +102 -24
  11. package/examples/jsm/exporters/GLTFExporter.js +1 -1
  12. package/examples/jsm/libs/rhino3dm/rhino3dm.js +8726 -4
  13. package/examples/jsm/libs/rhino3dm/rhino3dm.module.js +8737 -4
  14. package/examples/jsm/libs/rhino3dm/rhino3dm.wasm +0 -0
  15. package/examples/jsm/libs/tween.module.js +790 -735
  16. package/examples/jsm/libs/utif.module.js +1644 -1558
  17. package/examples/jsm/lights/LightProbeGenerator.js +37 -3
  18. package/examples/jsm/lines/LineMaterial.js +90 -156
  19. package/examples/jsm/loaders/3DMLoader.js +378 -104
  20. package/examples/jsm/loaders/DDSLoader.js +46 -3
  21. package/examples/jsm/loaders/EXRLoader.js +4 -4
  22. package/examples/jsm/loaders/FBXLoader.js +2 -0
  23. package/examples/jsm/loaders/GLTFLoader.js +18 -8
  24. package/examples/jsm/loaders/KTX2Loader.js +126 -77
  25. package/examples/jsm/loaders/LDrawLoader.js +22 -16
  26. package/examples/jsm/loaders/LogLuvLoader.js +2 -2
  27. package/examples/jsm/loaders/MMDLoader.js +10 -7
  28. package/examples/jsm/loaders/RGBELoader.js +48 -66
  29. package/examples/jsm/loaders/STLLoader.js +7 -0
  30. package/examples/jsm/loaders/USDZLoader.js +215 -12
  31. package/examples/jsm/materials/MeshGouraudMaterial.js +22 -18
  32. package/examples/jsm/nodes/Nodes.js +8 -1
  33. package/examples/jsm/nodes/accessors/BitangentNode.js +1 -1
  34. package/examples/jsm/nodes/accessors/BufferAttributeNode.js +30 -4
  35. package/examples/jsm/nodes/accessors/BufferNode.js +1 -1
  36. package/examples/jsm/nodes/accessors/CameraNode.js +1 -1
  37. package/examples/jsm/nodes/accessors/CubeTextureNode.js +19 -4
  38. package/examples/jsm/nodes/accessors/ExtendedMaterialNode.js +4 -5
  39. package/examples/jsm/nodes/accessors/InstanceNode.js +2 -2
  40. package/examples/jsm/nodes/accessors/LineMaterialNode.js +29 -0
  41. package/examples/jsm/nodes/accessors/MaterialNode.js +23 -13
  42. package/examples/jsm/nodes/accessors/MaterialReferenceNode.js +12 -9
  43. package/examples/jsm/nodes/accessors/ModelNode.js +1 -1
  44. package/examples/jsm/nodes/accessors/ModelViewProjectionNode.js +5 -4
  45. package/examples/jsm/nodes/accessors/MorphNode.js +4 -4
  46. package/examples/jsm/nodes/accessors/NormalNode.js +1 -1
  47. package/examples/jsm/nodes/accessors/Object3DNode.js +3 -3
  48. package/examples/jsm/nodes/accessors/PointUVNode.js +1 -1
  49. package/examples/jsm/nodes/accessors/PositionNode.js +1 -1
  50. package/examples/jsm/nodes/accessors/ReferenceNode.js +13 -7
  51. package/examples/jsm/nodes/accessors/ReflectVectorNode.js +2 -2
  52. package/examples/jsm/nodes/accessors/SceneNode.js +2 -2
  53. package/examples/jsm/nodes/accessors/SkinningNode.js +2 -2
  54. package/examples/jsm/nodes/accessors/StorageBufferNode.js +1 -1
  55. package/examples/jsm/nodes/accessors/TangentNode.js +1 -1
  56. package/examples/jsm/nodes/accessors/TextureBicubicNode.js +2 -2
  57. package/examples/jsm/nodes/accessors/TextureNode.js +18 -8
  58. package/examples/jsm/nodes/accessors/TextureSizeNode.js +2 -2
  59. package/examples/jsm/nodes/accessors/TextureStoreNode.js +29 -0
  60. package/examples/jsm/nodes/accessors/UVNode.js +1 -1
  61. package/examples/jsm/nodes/accessors/UserDataNode.js +2 -2
  62. package/examples/jsm/nodes/code/CodeNode.js +1 -1
  63. package/examples/jsm/nodes/code/ExpressionNode.js +1 -1
  64. package/examples/jsm/nodes/code/FunctionCallNode.js +1 -1
  65. package/examples/jsm/nodes/code/FunctionNode.js +18 -7
  66. package/examples/jsm/nodes/code/ScriptableNode.js +2 -2
  67. package/examples/jsm/nodes/code/ScriptableValueNode.js +2 -2
  68. package/examples/jsm/nodes/core/ArrayUniformNode.js +1 -1
  69. package/examples/jsm/nodes/core/AttributeNode.js +3 -3
  70. package/examples/jsm/nodes/core/BypassNode.js +1 -1
  71. package/examples/jsm/nodes/core/CacheNode.js +1 -1
  72. package/examples/jsm/nodes/core/ConstNode.js +1 -1
  73. package/examples/jsm/nodes/core/ContextNode.js +2 -2
  74. package/examples/jsm/nodes/core/IndexNode.js +1 -1
  75. package/examples/jsm/nodes/core/InputNode.js +1 -1
  76. package/examples/jsm/nodes/core/Node.js +45 -14
  77. package/examples/jsm/nodes/core/NodeBuilder.js +83 -15
  78. package/examples/jsm/nodes/core/NodeFrame.js +37 -14
  79. package/examples/jsm/nodes/core/NodeUniform.js +1 -1
  80. package/examples/jsm/nodes/core/OutputStructNode.js +62 -0
  81. package/examples/jsm/nodes/core/PropertyNode.js +3 -1
  82. package/examples/jsm/nodes/core/StackNode.js +5 -5
  83. package/examples/jsm/nodes/core/StructTypeNode.js +24 -0
  84. package/examples/jsm/nodes/core/TempNode.js +1 -1
  85. package/examples/jsm/nodes/core/UniformNode.js +3 -1
  86. package/examples/jsm/nodes/core/VarNode.js +1 -1
  87. package/examples/jsm/nodes/core/VaryingNode.js +1 -1
  88. package/examples/jsm/nodes/core/constants.js +1 -1
  89. package/examples/jsm/nodes/display/BlendModeNode.js +2 -2
  90. package/examples/jsm/nodes/display/BumpMapNode.js +2 -2
  91. package/examples/jsm/nodes/display/ColorAdjustmentNode.js +2 -2
  92. package/examples/jsm/nodes/display/ColorSpaceNode.js +2 -2
  93. package/examples/jsm/nodes/display/FrontFacingNode.js +1 -1
  94. package/examples/jsm/nodes/display/NormalMapNode.js +2 -2
  95. package/examples/jsm/nodes/display/PosterizeNode.js +2 -2
  96. package/examples/jsm/nodes/display/ToneMappingNode.js +2 -2
  97. package/examples/jsm/nodes/display/ViewportDepthNode.js +2 -2
  98. package/examples/jsm/nodes/display/ViewportDepthTextureNode.js +1 -1
  99. package/examples/jsm/nodes/display/ViewportNode.js +21 -7
  100. package/examples/jsm/nodes/display/ViewportSharedTextureNode.js +1 -1
  101. package/examples/jsm/nodes/display/ViewportTextureNode.js +1 -1
  102. package/examples/jsm/nodes/fog/FogExp2Node.js +2 -2
  103. package/examples/jsm/nodes/fog/FogNode.js +2 -2
  104. package/examples/jsm/nodes/fog/FogRangeNode.js +2 -2
  105. package/examples/jsm/nodes/geometry/RangeNode.js +2 -2
  106. package/examples/jsm/nodes/gpgpu/ComputeNode.js +1 -1
  107. package/examples/jsm/nodes/lighting/AONode.js +2 -2
  108. package/examples/jsm/nodes/lighting/AmbientLightNode.js +3 -3
  109. package/examples/jsm/nodes/lighting/AnalyticLightNode.js +4 -4
  110. package/examples/jsm/nodes/lighting/DirectionalLightNode.js +4 -4
  111. package/examples/jsm/nodes/lighting/EnvironmentNode.js +2 -2
  112. package/examples/jsm/nodes/lighting/HemisphereLightNode.js +3 -3
  113. package/examples/jsm/nodes/lighting/IESSpotLightNode.js +2 -2
  114. package/examples/jsm/nodes/lighting/LightNode.js +2 -2
  115. package/examples/jsm/nodes/lighting/LightingContextNode.js +3 -3
  116. package/examples/jsm/nodes/lighting/LightingNode.js +1 -1
  117. package/examples/jsm/nodes/lighting/LightsNode.js +4 -4
  118. package/examples/jsm/nodes/lighting/PointLightNode.js +3 -3
  119. package/examples/jsm/nodes/lighting/SpotLightNode.js +4 -4
  120. package/examples/jsm/nodes/materials/Line2NodeMaterial.js +449 -0
  121. package/examples/jsm/nodes/materials/LineBasicNodeMaterial.js +1 -1
  122. package/examples/jsm/nodes/materials/LineDashedNodeMaterial.js +54 -0
  123. package/examples/jsm/nodes/materials/Materials.js +2 -0
  124. package/examples/jsm/nodes/materials/MeshBasicNodeMaterial.js +1 -1
  125. package/examples/jsm/nodes/materials/MeshLambertNodeMaterial.js +2 -2
  126. package/examples/jsm/nodes/materials/MeshNormalNodeMaterial.js +2 -2
  127. package/examples/jsm/nodes/materials/MeshPhongNodeMaterial.js +3 -3
  128. package/examples/jsm/nodes/materials/MeshPhysicalNodeMaterial.js +6 -6
  129. package/examples/jsm/nodes/materials/MeshStandardNodeMaterial.js +3 -3
  130. package/examples/jsm/nodes/materials/NodeMaterial.js +39 -29
  131. package/examples/jsm/nodes/materials/PointsNodeMaterial.js +1 -1
  132. package/examples/jsm/nodes/materials/SpriteNodeMaterial.js +2 -2
  133. package/examples/jsm/nodes/math/CondNode.js +1 -1
  134. package/examples/jsm/nodes/math/HashNode.js +34 -0
  135. package/examples/jsm/nodes/math/MathNode.js +2 -2
  136. package/examples/jsm/nodes/math/OperatorNode.js +1 -1
  137. package/examples/jsm/nodes/procedural/CheckerNode.js +3 -3
  138. package/examples/jsm/nodes/shadernode/ShaderNode.js +85 -28
  139. package/examples/jsm/nodes/utils/ArrayElementNode.js +1 -1
  140. package/examples/jsm/nodes/utils/ConvertNode.js +1 -1
  141. package/examples/jsm/nodes/utils/DiscardNode.js +1 -1
  142. package/examples/jsm/nodes/utils/EquirectUVNode.js +2 -2
  143. package/examples/jsm/nodes/utils/JoinNode.js +1 -1
  144. package/examples/jsm/nodes/utils/LoopNode.js +11 -11
  145. package/examples/jsm/nodes/utils/MatcapUVNode.js +2 -2
  146. package/examples/jsm/nodes/utils/MaxMipLevelNode.js +1 -1
  147. package/examples/jsm/nodes/utils/OscNode.js +2 -2
  148. package/examples/jsm/nodes/utils/PackingNode.js +2 -2
  149. package/examples/jsm/nodes/utils/RemapNode.js +2 -2
  150. package/examples/jsm/nodes/utils/RotateUVNode.js +2 -2
  151. package/examples/jsm/nodes/utils/SetNode.js +62 -0
  152. package/examples/jsm/nodes/utils/SpecularMIPLevelNode.js +2 -2
  153. package/examples/jsm/nodes/utils/SplitNode.js +2 -2
  154. package/examples/jsm/nodes/utils/SpriteSheetUVNode.js +2 -2
  155. package/examples/jsm/nodes/utils/TimerNode.js +2 -2
  156. package/examples/jsm/nodes/utils/TriplanarTexturesNode.js +2 -2
  157. package/examples/jsm/objects/Sky.js +1 -3
  158. package/examples/jsm/postprocessing/FilmPass.js +3 -5
  159. package/examples/jsm/postprocessing/OutputPass.js +3 -2
  160. package/examples/jsm/postprocessing/RenderPass.js +30 -12
  161. package/examples/jsm/postprocessing/SAOPass.js +23 -98
  162. package/examples/jsm/postprocessing/SSAOPass.js +10 -30
  163. package/examples/jsm/renderers/common/Backend.js +11 -8
  164. package/examples/jsm/renderers/common/Background.js +2 -2
  165. package/examples/jsm/renderers/common/Binding.js +6 -0
  166. package/examples/jsm/renderers/common/Bindings.js +4 -5
  167. package/examples/jsm/renderers/common/Pipelines.js +9 -9
  168. package/examples/jsm/renderers/common/RenderContext.js +3 -0
  169. package/examples/jsm/renderers/common/RenderContexts.js +26 -1
  170. package/examples/jsm/renderers/common/RenderList.js +12 -4
  171. package/examples/jsm/renderers/common/RenderObject.js +43 -15
  172. package/examples/jsm/renderers/common/RenderObjects.js +8 -14
  173. package/examples/jsm/renderers/common/Renderer.js +52 -16
  174. package/examples/jsm/renderers/common/SampledTexture.js +6 -3
  175. package/examples/jsm/renderers/common/Sampler.js +1 -1
  176. package/examples/jsm/renderers/common/StorageBuffer.js +1 -1
  177. package/examples/jsm/renderers/common/StorageTexture.js +19 -0
  178. package/examples/jsm/renderers/common/Textures.js +166 -21
  179. package/examples/jsm/renderers/common/nodes/NodeBuilderState.js +35 -0
  180. package/examples/jsm/renderers/common/nodes/NodeSampledTexture.js +21 -11
  181. package/examples/jsm/renderers/common/nodes/NodeSampler.js +1 -7
  182. package/examples/jsm/renderers/common/nodes/Nodes.js +79 -18
  183. package/examples/jsm/renderers/webgl/WebGLBackend.js +702 -0
  184. package/examples/jsm/renderers/webgl/nodes/GLSLNodeBuilder.js +207 -20
  185. package/examples/jsm/renderers/webgl/utils/WebGLAttributeUtils.js +84 -0
  186. package/examples/jsm/renderers/webgl/utils/WebGLExtensions.js +26 -0
  187. package/examples/jsm/renderers/webgl/utils/WebGLState.js +529 -0
  188. package/examples/jsm/renderers/webgl/utils/WebGLTextureUtils.js +212 -0
  189. package/examples/jsm/renderers/webgl/utils/WebGLUtils.js +242 -0
  190. package/examples/jsm/renderers/webgl-legacy/nodes/GLSL1NodeBuilder.js +340 -0
  191. package/examples/jsm/renderers/{webgl → webgl-legacy}/nodes/WebGLNodeBuilder.js +4 -4
  192. package/examples/jsm/renderers/{webgl → webgl-legacy}/nodes/WebGLNodes.js +14 -2
  193. package/examples/jsm/renderers/webgpu/WebGPUBackend.js +282 -43
  194. package/examples/jsm/renderers/webgpu/WebGPURenderer.js +18 -2
  195. package/examples/jsm/renderers/webgpu/nodes/WGSLNodeBuilder.js +93 -60
  196. package/examples/jsm/renderers/webgpu/nodes/WGSLNodeFunction.js +2 -2
  197. package/examples/jsm/renderers/webgpu/utils/WebGPUBindingUtils.js +15 -2
  198. package/examples/jsm/renderers/webgpu/utils/WebGPUPipelineUtils.js +39 -14
  199. package/examples/jsm/renderers/webgpu/utils/WebGPUTexturePassUtils.js +285 -0
  200. package/examples/jsm/renderers/webgpu/utils/WebGPUTextureUtils.js +205 -284
  201. package/examples/jsm/renderers/webgpu/utils/WebGPUUtils.js +6 -5
  202. package/examples/jsm/shaders/FilmShader.js +11 -54
  203. package/examples/jsm/shaders/GammaCorrectionShader.js +1 -1
  204. package/examples/jsm/shaders/MMDToonShader.js +4 -4
  205. package/examples/jsm/shaders/OutputShader.js +2 -2
  206. package/examples/jsm/shaders/SAOShader.js +0 -13
  207. package/examples/jsm/shaders/SSAOShader.js +33 -26
  208. package/examples/jsm/shaders/SubsurfaceScatteringShader.js +6 -6
  209. package/examples/jsm/utils/BufferGeometryUtils.js +6 -4
  210. package/package.json +1 -1
  211. package/src/Three.js +1 -2
  212. package/src/animation/AnimationUtils.js +3 -20
  213. package/src/animation/KeyframeTrack.js +8 -8
  214. package/src/audio/Audio.js +6 -0
  215. package/src/cameras/Camera.js +1 -5
  216. package/src/cameras/CubeCamera.js +14 -8
  217. package/src/constants.js +10 -1
  218. package/src/core/Object3D.js +1 -14
  219. package/src/core/RenderTarget.js +16 -7
  220. package/src/core/UniformsGroup.js +2 -2
  221. package/src/extras/core/CurvePath.js +4 -1
  222. package/src/loaders/DataTextureLoader.js +0 -2
  223. package/src/loaders/MaterialLoader.js +1 -1
  224. package/src/loaders/ObjectLoader.js +6 -0
  225. package/src/materials/Material.js +10 -10
  226. package/src/math/Color.js +1 -5
  227. package/src/math/ColorManagement.js +82 -60
  228. package/src/math/Vector2.js +2 -2
  229. package/src/math/Vector3.js +3 -3
  230. package/src/math/Vector4.js +4 -4
  231. package/src/objects/Line.js +1 -1
  232. package/src/objects/Mesh.js +1 -1
  233. package/src/objects/Points.js +1 -1
  234. package/src/objects/Sprite.js +2 -2
  235. package/src/renderers/WebGLRenderer.js +42 -51
  236. package/src/renderers/shaders/ShaderChunk/aomap_fragment.glsl.js +1 -1
  237. package/src/renderers/shaders/ShaderChunk/clearcoat_normal_fragment_begin.glsl.js +1 -1
  238. package/src/renderers/shaders/ShaderChunk/colorspace_pars_fragment.glsl.js +35 -2
  239. package/src/renderers/shaders/ShaderChunk/common.glsl.js +0 -9
  240. package/src/renderers/shaders/ShaderChunk/lights_fragment_begin.glsl.js +19 -15
  241. package/src/renderers/shaders/ShaderChunk/lights_fragment_end.glsl.js +2 -2
  242. package/src/renderers/shaders/ShaderChunk/lights_fragment_maps.glsl.js +4 -4
  243. package/src/renderers/shaders/ShaderChunk/lights_lambert_pars_fragment.glsl.js +3 -3
  244. package/src/renderers/shaders/ShaderChunk/lights_pars_begin.glsl.js +11 -6
  245. package/src/renderers/shaders/ShaderChunk/lights_phong_pars_fragment.glsl.js +4 -4
  246. package/src/renderers/shaders/ShaderChunk/lights_physical_fragment.glsl.js +1 -1
  247. package/src/renderers/shaders/ShaderChunk/lights_physical_pars_fragment.glsl.js +16 -16
  248. package/src/renderers/shaders/ShaderChunk/lights_toon_pars_fragment.glsl.js +3 -3
  249. package/src/renderers/shaders/ShaderChunk/map_fragment.glsl.js +11 -1
  250. package/src/renderers/shaders/ShaderChunk/normal_fragment_begin.glsl.js +1 -1
  251. package/src/renderers/shaders/ShaderLib/background.glsl.js +8 -0
  252. package/src/renderers/shaders/ShaderLib/meshphysical.glsl.js +1 -1
  253. package/src/renderers/shaders/UniformsUtils.js +2 -2
  254. package/src/renderers/webgl/WebGLBackground.js +9 -17
  255. package/src/renderers/webgl/WebGLLights.js +14 -3
  256. package/src/renderers/webgl/WebGLProgram.js +36 -5
  257. package/src/renderers/webgl/WebGLPrograms.js +9 -1
  258. package/src/renderers/webgl/WebGLTextures.js +19 -8
  259. package/src/renderers/webgl/WebGLUtils.js +25 -20
  260. package/src/scenes/Fog.js +1 -0
  261. package/src/scenes/FogExp2.js +1 -0
  262. package/src/textures/Source.js +2 -2
  263. package/src/textures/Texture.js +2 -2
  264. package/src/utils.js +9 -1
  265. package/examples/jsm/renderers/webgpu/utils/WebGPUTextureMipmapUtils.js +0 -163
  266. package/src/lights/AmbientLightProbe.js +0 -21
  267. package/src/lights/HemisphereLightProbe.js +0 -30
  268. /package/examples/jsm/renderers/{webgl → webgl-legacy}/nodes/SlotNode.js +0 -0
@@ -62,6 +62,7 @@ class WebGPUBackend extends Backend {
62
62
  this.bindingUtils = new WebGPUBindingUtils( this );
63
63
  this.pipelineUtils = new WebGPUPipelineUtils( this );
64
64
  this.textureUtils = new WebGPUTextureUtils( this );
65
+ this.occludedResolveCache = new Map();
65
66
 
66
67
  }
67
68
 
@@ -135,6 +136,32 @@ class WebGPUBackend extends Backend {
135
136
  const renderContextData = this.get( renderContext );
136
137
 
137
138
  const device = this.device;
139
+ const occlusionQueryCount = renderContext.occlusionQueryCount;
140
+
141
+ let occlusionQuerySet;
142
+
143
+ if ( occlusionQueryCount > 0 ) {
144
+
145
+ if ( renderContextData.currentOcclusionQuerySet ) renderContextData.currentOcclusionQuerySet.destroy();
146
+ if ( renderContextData.currentOcclusionQueryBuffer ) renderContextData.currentOcclusionQueryBuffer.destroy();
147
+
148
+ // Get a reference to the array of objects with queries. The renderContextData property
149
+ // can be changed by another render pass before the buffer.mapAsyc() completes.
150
+ renderContextData.currentOcclusionQuerySet = renderContextData.occlusionQuerySet;
151
+ renderContextData.currentOcclusionQueryBuffer = renderContextData.occlusionQueryBuffer;
152
+ renderContextData.currentOcclusionQueryObjects = renderContextData.occlusionQueryObjects;
153
+
154
+ //
155
+
156
+ occlusionQuerySet = device.createQuerySet( { type: 'occlusion', count: occlusionQueryCount } );
157
+
158
+ renderContextData.occlusionQuerySet = occlusionQuerySet;
159
+ renderContextData.occlusionQueryIndex = 0;
160
+ renderContextData.occlusionQueryObjects = new Array( occlusionQueryCount );
161
+
162
+ renderContextData.lastOcclusionObject = null;
163
+
164
+ }
138
165
 
139
166
  const descriptor = {
140
167
  colorAttachments: [ {
@@ -142,7 +169,8 @@ class WebGPUBackend extends Backend {
142
169
  } ],
143
170
  depthStencilAttachment: {
144
171
  view: null
145
- }
172
+ },
173
+ occlusionQuerySet
146
174
  };
147
175
 
148
176
  const colorAttachment = descriptor.colorAttachments[ 0 ];
@@ -150,30 +178,51 @@ class WebGPUBackend extends Backend {
150
178
 
151
179
  const antialias = this.parameters.antialias;
152
180
 
153
- if ( renderContext.texture !== null ) {
181
+ if ( renderContext.textures !== null ) {
154
182
 
155
- const textureData = this.get( renderContext.texture );
156
- const depthTextureData = this.get( renderContext.depthTexture );
183
+ const textures = renderContext.textures;
157
184
 
158
- const view = textureData.texture.createView( {
159
- baseMipLevel: 0,
160
- mipLevelCount: 1,
161
- baseArrayLayer: renderContext.activeCubeFace,
162
- dimension: GPUTextureViewDimension.TwoD
163
- } );
185
+ descriptor.colorAttachments = [];
164
186
 
165
- if ( textureData.msaaTexture !== undefined ) {
187
+ const colorAttachments = descriptor.colorAttachments;
166
188
 
167
- colorAttachment.view = textureData.msaaTexture.createView();
168
- colorAttachment.resolveTarget = view;
189
+ for ( let i = 0; i < textures.length; i ++ ) {
169
190
 
170
- } else {
191
+ const textureData = this.get( textures[ i ] );
171
192
 
172
- colorAttachment.view = view;
173
- colorAttachment.resolveTarget = undefined;
193
+ const textureView = textureData.texture.createView( {
194
+ baseMipLevel: renderContext.activeMipmapLevel,
195
+ mipLevelCount: 1,
196
+ baseArrayLayer: renderContext.activeCubeFace,
197
+ dimension: GPUTextureViewDimension.TwoD
198
+ } );
199
+
200
+ let view, resolveTarget;
201
+
202
+ if ( textureData.msaaTexture !== undefined ) {
203
+
204
+ view = textureData.msaaTexture.createView();
205
+ resolveTarget = textureView;
206
+
207
+ } else {
208
+
209
+ view = textureView;
210
+ resolveTarget = undefined;
211
+
212
+ }
213
+
214
+ colorAttachments.push( {
215
+ view,
216
+ resolveTarget,
217
+ loadOp: GPULoadOp.Load,
218
+ storeOp: GPUStoreOp.Store
219
+
220
+ } );
174
221
 
175
222
  }
176
223
 
224
+ const depthTextureData = this.get( renderContext.depthTexture );
225
+
177
226
  depthStencilAttachment.view = depthTextureData.texture.createView();
178
227
 
179
228
  if ( renderContext.stencil && renderContext.depthTexture.format === DepthFormat ) {
@@ -200,16 +249,44 @@ class WebGPUBackend extends Backend {
200
249
 
201
250
  }
202
251
 
203
- if ( renderContext.clearColor ) {
252
+ if ( renderContext.textures !== null ) {
253
+
254
+ const colorAttachments = descriptor.colorAttachments;
255
+
256
+ for ( let i = 0; i < colorAttachments.length; i ++ ) {
257
+
258
+ const colorAttachment = colorAttachments[ i ];
259
+
260
+ if ( renderContext.clearColor ) {
261
+
262
+ colorAttachment.clearValue = renderContext.clearColorValue;
263
+ colorAttachment.loadOp = GPULoadOp.Clear;
264
+ colorAttachment.storeOp = GPUStoreOp.Store;
265
+
266
+ } else {
267
+
268
+ colorAttachment.loadOp = GPULoadOp.Load;
269
+ colorAttachment.storeOp = GPUStoreOp.Store;
270
+
271
+ }
272
+
273
+ }
204
274
 
205
- colorAttachment.clearValue = renderContext.clearColorValue;
206
- colorAttachment.loadOp = GPULoadOp.Clear;
207
- colorAttachment.storeOp = GPUStoreOp.Store;
208
275
 
209
276
  } else {
210
277
 
211
- colorAttachment.loadOp = GPULoadOp.Load;
212
- colorAttachment.storeOp = GPUStoreOp.Store;
278
+ if ( renderContext.clearColor ) {
279
+
280
+ colorAttachment.clearValue = renderContext.clearColorValue;
281
+ colorAttachment.loadOp = GPULoadOp.Clear;
282
+ colorAttachment.storeOp = GPUStoreOp.Store;
283
+
284
+ } else {
285
+
286
+ colorAttachment.loadOp = GPULoadOp.Load;
287
+ colorAttachment.storeOp = GPUStoreOp.Store;
288
+
289
+ }
213
290
 
214
291
  }
215
292
 
@@ -259,7 +336,7 @@ class WebGPUBackend extends Backend {
259
336
  renderContextData.descriptor = descriptor;
260
337
  renderContextData.encoder = encoder;
261
338
  renderContextData.currentPass = currentPass;
262
- renderContextData.currentAttributesSet = {};
339
+ renderContextData.currentSets = { attributes: {} };
263
340
 
264
341
  //
265
342
 
@@ -273,7 +350,7 @@ class WebGPUBackend extends Backend {
273
350
 
274
351
  const { x, y, width, height } = renderContext.scissorValue;
275
352
 
276
- currentPass.setScissorRect( x, y, width, height );
353
+ currentPass.setScissorRect( x, renderContext.height - height - y, width, height );
277
354
 
278
355
  }
279
356
 
@@ -282,16 +359,123 @@ class WebGPUBackend extends Backend {
282
359
  finishRender( renderContext ) {
283
360
 
284
361
  const renderContextData = this.get( renderContext );
362
+ const occlusionQueryCount = renderContext.occlusionQueryCount;
363
+
364
+ if ( occlusionQueryCount > renderContextData.occlusionQueryIndex ) {
365
+
366
+ renderContextData.currentPass.endOcclusionQuery();
367
+
368
+ }
285
369
 
286
370
  renderContextData.currentPass.end();
287
371
 
372
+ if ( occlusionQueryCount > 0 ) {
373
+
374
+ const bufferSize = occlusionQueryCount * 8; // 8 byte entries for query results
375
+
376
+ //
377
+
378
+ let queryResolveBuffer = this.occludedResolveCache.get( bufferSize );
379
+
380
+ if ( queryResolveBuffer === undefined ) {
381
+
382
+ queryResolveBuffer = this.device.createBuffer(
383
+ {
384
+ size: bufferSize,
385
+ usage: GPUBufferUsage.QUERY_RESOLVE | GPUBufferUsage.COPY_SRC
386
+ }
387
+ );
388
+
389
+ this.occludedResolveCache.set( bufferSize, queryResolveBuffer );
390
+
391
+ }
392
+
393
+ //
394
+
395
+ const readBuffer = this.device.createBuffer(
396
+ {
397
+ size: bufferSize,
398
+ usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.MAP_READ
399
+ }
400
+ );
401
+
402
+ // two buffers required here - WebGPU doesn't allow usage of QUERY_RESOLVE & MAP_READ to be combined
403
+ renderContextData.encoder.resolveQuerySet( renderContextData.occlusionQuerySet, 0, occlusionQueryCount, queryResolveBuffer, 0 );
404
+ renderContextData.encoder.copyBufferToBuffer( queryResolveBuffer, 0, readBuffer, 0, bufferSize );
405
+
406
+ renderContextData.occlusionQueryBuffer = readBuffer;
407
+
408
+ //
409
+
410
+ this.resolveOccludedAsync( renderContext );
411
+
412
+ }
413
+
288
414
  this.device.queue.submit( [ renderContextData.encoder.finish() ] );
289
415
 
290
416
  //
291
417
 
292
- if ( renderContext.texture !== null && renderContext.texture.generateMipmaps === true ) {
418
+ if ( renderContext.textures !== null ) {
419
+
420
+ const textures = renderContext.textures;
421
+
422
+ for ( let i = 0; i < textures.length; i ++ ) {
423
+
424
+ const texture = textures[ i ];
425
+
426
+ if ( texture.generateMipmaps === true ) {
293
427
 
294
- this.textureUtils.generateMipmaps( renderContext.texture );
428
+ this.textureUtils.generateMipmaps( texture );
429
+
430
+ }
431
+
432
+ }
433
+
434
+ }
435
+
436
+ }
437
+
438
+ isOccluded( renderContext, object ) {
439
+
440
+ const renderContextData = this.get( renderContext );
441
+
442
+ return renderContextData.occluded && renderContextData.occluded.has( object );
443
+
444
+ }
445
+
446
+ async resolveOccludedAsync( renderContext ) {
447
+
448
+ const renderContextData = this.get( renderContext );
449
+
450
+ // handle occlusion query results
451
+
452
+ const { currentOcclusionQueryBuffer, currentOcclusionQueryObjects } = renderContextData;
453
+
454
+ if ( currentOcclusionQueryBuffer && currentOcclusionQueryObjects ) {
455
+
456
+ const occluded = new WeakSet();
457
+
458
+ renderContextData.currentOcclusionQueryObjects = null;
459
+ renderContextData.currentOcclusionQueryBuffer = null;
460
+
461
+ await currentOcclusionQueryBuffer.mapAsync( GPUMapMode.READ );
462
+
463
+ const buffer = currentOcclusionQueryBuffer.getMappedRange();
464
+ const results = new BigUint64Array( buffer );
465
+
466
+ for ( let i = 0; i < currentOcclusionQueryObjects.length; i++ ) {
467
+
468
+ if ( results[ i ] !== 0n ) {
469
+
470
+ occluded.add( currentOcclusionQueryObjects[ i ] );
471
+
472
+ }
473
+
474
+ }
475
+
476
+ currentOcclusionQueryBuffer.destroy();
477
+
478
+ renderContextData.occluded = occluded;
295
479
 
296
480
  }
297
481
 
@@ -300,9 +484,9 @@ class WebGPUBackend extends Backend {
300
484
  updateViewport( renderContext ) {
301
485
 
302
486
  const { currentPass } = this.get( renderContext );
303
- const { x, y, width, height, minDepth, maxDepth } = renderContext.viewportValue;
487
+ let { x, y, width, height, minDepth, maxDepth } = renderContext.viewportValue;
304
488
 
305
- currentPass.setViewport( x, y, width, height, minDepth, maxDepth );
489
+ currentPass.setViewport( x, renderContext.height - height - y, width, height, minDepth, maxDepth );
306
490
 
307
491
  }
308
492
 
@@ -317,6 +501,7 @@ class WebGPUBackend extends Backend {
317
501
  stencil = stencil && renderContext.stencil;
318
502
 
319
503
  const colorAttachment = descriptor.colorAttachments[ 0 ];
504
+ const depthStencilAttachment = descriptor.depthStencilAttachment;
320
505
 
321
506
  const antialias = this.parameters.antialias;
322
507
 
@@ -340,19 +525,31 @@ class WebGPUBackend extends Backend {
340
525
  colorAttachment.loadOp = GPULoadOp.Clear;
341
526
  colorAttachment.clearValue = renderContext.clearColorValue;
342
527
 
528
+ } else {
529
+
530
+ colorAttachment.loadOp = GPULoadOp.Load;
531
+
343
532
  }
344
533
 
345
534
  if ( depth ) {
346
535
 
347
- descriptor.depthStencilAttachment.depthLoadOp = GPULoadOp.Clear;
348
- descriptor.depthStencilAttachment.depthClearValue = renderContext.clearDepthValue;
536
+ depthStencilAttachment.depthLoadOp = GPULoadOp.Clear;
537
+ depthStencilAttachment.depthClearValue = renderContext.clearDepthValue;
538
+
539
+ } else {
540
+
541
+ depthStencilAttachment.depthLoadOp = GPULoadOp.Load;
349
542
 
350
543
  }
351
544
 
352
545
  if ( stencil ) {
353
546
 
354
- descriptor.depthStencilAttachment.stencilLoadOp = GPULoadOp.Clear;
355
- descriptor.depthStencilAttachment.stencilClearValue = renderContext.clearStencilValue;
547
+ depthStencilAttachment.stencilLoadOp = GPULoadOp.Clear;
548
+ depthStencilAttachment.stencilClearValue = renderContext.clearStencilValue;
549
+
550
+ } else {
551
+
552
+ depthStencilAttachment.stencilLoadOp = GPULoadOp.Load;
356
553
 
357
554
  }
358
555
 
@@ -412,12 +609,19 @@ class WebGPUBackend extends Backend {
412
609
  const bindingsData = this.get( renderObject.getBindings() );
413
610
  const contextData = this.get( context );
414
611
  const pipelineGPU = this.get( pipeline ).pipeline;
415
- const attributesSet = contextData.currentAttributesSet;
612
+ const currentSets = contextData.currentSets;
416
613
 
417
614
  // pipeline
418
615
 
419
616
  const passEncoderGPU = contextData.currentPass;
420
- passEncoderGPU.setPipeline( pipelineGPU );
617
+
618
+ if ( currentSets.pipeline !== pipelineGPU ) {
619
+
620
+ passEncoderGPU.setPipeline( pipelineGPU );
621
+
622
+ currentSets.pipeline = pipelineGPU;
623
+
624
+ }
421
625
 
422
626
  // bind group
423
627
 
@@ -434,14 +638,14 @@ class WebGPUBackend extends Backend {
434
638
 
435
639
  if ( hasIndex === true ) {
436
640
 
437
- if ( attributesSet.index !== index ) {
438
-
641
+ if ( currentSets.index !== index ) {
642
+
439
643
  const buffer = this.get( index ).buffer;
440
644
  const indexFormat = ( index.array instanceof Uint16Array ) ? GPUIndexFormat.Uint16 : GPUIndexFormat.Uint32;
441
645
 
442
646
  passEncoderGPU.setIndexBuffer( buffer, indexFormat );
443
647
 
444
- attributesSet.index = index;
648
+ currentSets.index = index;
445
649
 
446
650
  }
447
651
 
@@ -455,12 +659,40 @@ class WebGPUBackend extends Backend {
455
659
 
456
660
  const vertexBuffer = vertexBuffers[ i ];
457
661
 
458
- if ( attributesSet[ i ] !== vertexBuffer ) {
662
+ if ( currentSets.attributes[ i ] !== vertexBuffer ) {
459
663
 
460
664
  const buffer = this.get( vertexBuffer ).buffer;
461
665
  passEncoderGPU.setVertexBuffer( i, buffer );
462
666
 
463
- attributesSet[ i ] = vertexBuffer;
667
+ currentSets.attributes[ i ] = vertexBuffer;
668
+
669
+ }
670
+
671
+ }
672
+
673
+ // occlusion queries - handle multiple consecutive draw calls for an object
674
+
675
+ if ( contextData.occlusionQuerySet !== undefined ) {
676
+
677
+ const lastObject = contextData.lastOcclusionObject;
678
+
679
+ if ( lastObject !== object ) {
680
+
681
+ if ( lastObject !== null && lastObject.occlusionTest === true ) {
682
+
683
+ passEncoderGPU.endOcclusionQuery();
684
+ contextData.occlusionQueryIndex ++;
685
+
686
+ }
687
+
688
+ if ( object.occlusionTest === true ) {
689
+
690
+ passEncoderGPU.beginOcclusionQuery( contextData.occlusionQueryIndex );
691
+ contextData.occlusionQueryObjects[ contextData.occlusionQueryIndex ] = object;
692
+
693
+ }
694
+
695
+ contextData.lastOcclusionObject = object;
464
696
 
465
697
  }
466
698
 
@@ -472,6 +704,7 @@ class WebGPUBackend extends Backend {
472
704
  const firstVertex = drawRange.start;
473
705
 
474
706
  const instanceCount = this.getInstanceCount( renderObject );
707
+ if ( instanceCount === 0 ) return;
475
708
 
476
709
  if ( hasIndex === true ) {
477
710
 
@@ -571,9 +804,15 @@ class WebGPUBackend extends Backend {
571
804
 
572
805
  }
573
806
 
574
- updateTexture( texture ) {
807
+ updateTexture( texture, options ) {
808
+
809
+ this.textureUtils.updateTexture( texture, options );
810
+
811
+ }
812
+
813
+ generateMipmaps( texture ) {
575
814
 
576
- this.textureUtils.updateTexture( texture );
815
+ this.textureUtils.generateMipmaps( texture );
577
816
 
578
817
  }
579
818
 
@@ -756,7 +995,7 @@ class WebGPUBackend extends Backend {
756
995
  if ( renderContext.stencil ) descriptor.depthStencilAttachment.stencilLoadOp = GPULoadOp.Load;
757
996
 
758
997
  renderContextData.currentPass = encoder.beginRenderPass( descriptor );
759
- renderContextData.currentAttributesSet = {};
998
+ renderContextData.currentSets = { attributes: {} };
760
999
 
761
1000
  }
762
1001
 
@@ -801,7 +1040,7 @@ class WebGPUBackend extends Backend {
801
1040
  depthTexture.image.width = width;
802
1041
  depthTexture.image.height = height;
803
1042
 
804
- this.textureUtils.createTexture( depthTexture, { sampleCount: this.parameters.sampleCount } );
1043
+ this.textureUtils.createTexture( depthTexture, { sampleCount: this.parameters.sampleCount, width, height } );
805
1044
 
806
1045
  return this.get( depthTexture ).texture;
807
1046
 
@@ -1,5 +1,7 @@
1
1
  import Renderer from '../common/Renderer.js';
2
+ import WebGLBackend from '../webgl/WebGLBackend.js';
2
3
  import WebGPUBackend from './WebGPUBackend.js';
4
+ import WebGPU from '../../capabilities/WebGPU.js';
3
5
  /*
4
6
  const debugHandler = {
5
7
 
@@ -18,9 +20,23 @@ class WebGPURenderer extends Renderer {
18
20
 
19
21
  constructor( parameters = {} ) {
20
22
 
21
- const backend = new WebGPUBackend( parameters );
22
- //const backend = new Proxy( new WebGPUBackend( parameters ), debugHandler );
23
+ let BackendClass;
23
24
 
25
+ if ( WebGPU.isAvailable() ) {
26
+
27
+ BackendClass = WebGPUBackend;
28
+
29
+ } else {
30
+
31
+ BackendClass = WebGLBackend;
32
+
33
+ console.warn( 'THREE.WebGPURenderer: WebGPU is not available, running under WebGL2 backend.' );
34
+
35
+ }
36
+
37
+ const backend = new BackendClass( parameters );
38
+
39
+ //super( new Proxy( backend, debugHandler ) );
24
40
  super( backend );
25
41
 
26
42
  this.isWebGPURenderer = true;