super-three 0.160.1 → 0.162.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 (225) hide show
  1. package/LICENSE +1 -1
  2. package/build/three.cjs +867 -499
  3. package/build/three.module.js +867 -496
  4. package/build/three.module.min.js +1 -1
  5. package/examples/jsm/Addons.js +5 -1
  6. package/examples/jsm/capabilities/WebGPU.js +13 -9
  7. package/examples/jsm/controls/DragControls.js +91 -30
  8. package/examples/jsm/controls/OrbitControls.js +130 -15
  9. package/examples/jsm/controls/TransformControls.js +6 -6
  10. package/examples/jsm/curves/NURBSUtils.js +59 -4
  11. package/examples/jsm/curves/NURBSVolume.js +62 -0
  12. package/examples/jsm/exporters/GLTFExporter.js +11 -1
  13. package/examples/jsm/exporters/USDZExporter.js +8 -7
  14. package/examples/jsm/helpers/TextureHelper.js +3 -3
  15. package/examples/jsm/interactive/InteractiveGroup.js +15 -25
  16. package/examples/jsm/libs/rhino3dm/rhino3dm.js +1 -8723
  17. package/examples/jsm/libs/rhino3dm/rhino3dm.module.js +1 -8734
  18. package/examples/jsm/libs/rhino3dm/rhino3dm.wasm +0 -0
  19. package/examples/jsm/libs/tween.module.js +32 -14
  20. package/examples/jsm/loaders/3DMLoader.js +57 -64
  21. package/examples/jsm/loaders/DDSLoader.js +1 -0
  22. package/examples/jsm/loaders/KTX2Loader.js +20 -5
  23. package/examples/jsm/loaders/LUT3dlLoader.js +78 -46
  24. package/examples/jsm/loaders/LUTCubeLoader.js +81 -67
  25. package/examples/jsm/loaders/LUTImageLoader.js +3 -2
  26. package/examples/jsm/loaders/MaterialXLoader.js +115 -16
  27. package/examples/jsm/loaders/SVGLoader.js +4 -3
  28. package/examples/jsm/loaders/VOXLoader.js +9 -2
  29. package/examples/jsm/loaders/VRMLLoader.js +7 -3
  30. package/examples/jsm/materials/MeshPostProcessingMaterial.js +144 -0
  31. package/examples/jsm/misc/ProgressiveLightMap.js +1 -0
  32. package/examples/jsm/misc/Timer.js +13 -4
  33. package/examples/jsm/nodes/Nodes.js +24 -11
  34. package/examples/jsm/nodes/accessors/AccessorsUtils.js +10 -0
  35. package/examples/jsm/nodes/accessors/BufferAttributeNode.js +5 -3
  36. package/examples/jsm/nodes/accessors/CameraNode.js +9 -4
  37. package/examples/jsm/nodes/accessors/ClippingNode.js +144 -0
  38. package/examples/jsm/nodes/accessors/CubeTextureNode.js +12 -1
  39. package/examples/jsm/nodes/accessors/MaterialNode.js +2 -2
  40. package/examples/jsm/nodes/accessors/MaterialReferenceNode.js +2 -12
  41. package/examples/jsm/nodes/accessors/MorphNode.js +8 -8
  42. package/examples/jsm/nodes/accessors/ReferenceNode.js +87 -29
  43. package/examples/jsm/nodes/accessors/SkinningNode.js +31 -10
  44. package/examples/jsm/nodes/accessors/StorageBufferNode.js +45 -0
  45. package/examples/jsm/nodes/accessors/TangentNode.js +8 -2
  46. package/examples/jsm/nodes/accessors/TextureNode.js +1 -1
  47. package/examples/jsm/nodes/accessors/TextureStoreNode.js +56 -3
  48. package/examples/jsm/nodes/accessors/UniformsNode.js +140 -0
  49. package/examples/jsm/nodes/accessors/VertexColorNode.js +70 -0
  50. package/examples/jsm/nodes/code/CodeNode.js +6 -0
  51. package/examples/jsm/nodes/core/AssignNode.js +68 -12
  52. package/examples/jsm/nodes/core/AttributeNode.js +1 -1
  53. package/examples/jsm/nodes/core/Node.js +14 -4
  54. package/examples/jsm/nodes/core/NodeBuilder.js +26 -27
  55. package/examples/jsm/nodes/core/NodeFrame.js +18 -10
  56. package/examples/jsm/nodes/core/TempNode.js +1 -1
  57. package/examples/jsm/nodes/core/constants.js +1 -0
  58. package/examples/jsm/nodes/display/AfterImageNode.js +148 -0
  59. package/examples/jsm/nodes/display/AnamorphicNode.js +148 -0
  60. package/examples/jsm/nodes/display/BlendModeNode.js +30 -1
  61. package/examples/jsm/nodes/display/ColorAdjustmentNode.js +3 -0
  62. package/examples/jsm/nodes/display/GaussianBlurNode.js +33 -13
  63. package/examples/jsm/nodes/display/NormalMapNode.js +3 -5
  64. package/examples/jsm/nodes/display/PassNode.js +3 -2
  65. package/examples/jsm/nodes/display/ToneMappingNode.js +46 -3
  66. package/examples/jsm/nodes/display/ViewportDepthTextureNode.js +1 -4
  67. package/examples/jsm/nodes/display/ViewportNode.js +0 -2
  68. package/examples/jsm/nodes/display/ViewportSharedTextureNode.js +4 -4
  69. package/examples/jsm/nodes/fog/FogNode.js +2 -1
  70. package/examples/jsm/nodes/lighting/AmbientLightNode.js +1 -1
  71. package/examples/jsm/nodes/lighting/AnalyticLightNode.js +13 -5
  72. package/examples/jsm/nodes/lighting/LightingContextNode.js +1 -1
  73. package/examples/jsm/nodes/lighting/LightsNode.js +1 -1
  74. package/examples/jsm/nodes/materials/Line2NodeMaterial.js +18 -30
  75. package/examples/jsm/nodes/materials/Materials.js +1 -0
  76. package/examples/jsm/nodes/materials/MeshSSSNodeMaterial.js +84 -0
  77. package/examples/jsm/nodes/materials/NodeMaterial.js +43 -10
  78. package/examples/jsm/nodes/materials/SpriteNodeMaterial.js +1 -7
  79. package/examples/jsm/nodes/math/CondNode.js +42 -7
  80. package/examples/jsm/nodes/math/MathNode.js +32 -2
  81. package/examples/jsm/nodes/math/MathUtils.js +15 -0
  82. package/examples/jsm/nodes/math/OperatorNode.js +13 -5
  83. package/examples/jsm/nodes/math/TriNoise3D.js +71 -0
  84. package/examples/jsm/nodes/shadernode/ShaderNode.js +10 -1
  85. package/examples/jsm/nodes/utils/JoinNode.js +2 -2
  86. package/examples/jsm/nodes/utils/LoopNode.js +5 -3
  87. package/examples/jsm/nodes/utils/ReflectorNode.js +227 -0
  88. package/examples/jsm/nodes/utils/RotateNode.js +68 -0
  89. package/examples/jsm/nodes/utils/RotateUVNode.js +1 -9
  90. package/examples/jsm/nodes/utils/SplitNode.js +4 -4
  91. package/examples/jsm/nodes/utils/StorageArrayElementNode.js +91 -0
  92. package/examples/jsm/objects/GroundedSkybox.js +50 -0
  93. package/examples/jsm/objects/QuadMesh.js +8 -2
  94. package/examples/jsm/objects/Water2.js +8 -8
  95. package/examples/jsm/postprocessing/GTAOPass.js +11 -1
  96. package/examples/jsm/postprocessing/OutputPass.js +2 -0
  97. package/examples/jsm/renderers/common/Backend.js +14 -0
  98. package/examples/jsm/renderers/common/Background.js +2 -2
  99. package/examples/jsm/renderers/common/Bindings.js +1 -1
  100. package/examples/jsm/renderers/common/ClippingContext.js +165 -0
  101. package/examples/jsm/renderers/common/DataMap.js +1 -1
  102. package/examples/jsm/renderers/common/Info.js +25 -1
  103. package/examples/jsm/renderers/common/Pipelines.js +8 -8
  104. package/examples/jsm/renderers/common/PostProcessing.js +2 -2
  105. package/examples/jsm/renderers/common/ProgrammableStage.js +3 -1
  106. package/examples/jsm/renderers/common/RenderContext.js +2 -0
  107. package/examples/jsm/renderers/common/RenderContexts.js +2 -13
  108. package/examples/jsm/renderers/common/RenderObject.js +46 -1
  109. package/examples/jsm/renderers/common/RenderObjects.js +3 -1
  110. package/examples/jsm/renderers/common/Renderer.js +290 -17
  111. package/examples/jsm/renderers/common/StorageBufferAttribute.js +17 -0
  112. package/examples/jsm/renderers/common/StorageInstancedBufferAttribute.js +17 -0
  113. package/examples/jsm/renderers/common/Textures.js +28 -18
  114. package/examples/jsm/renderers/common/UniformsGroup.js +6 -4
  115. package/examples/jsm/renderers/common/nodes/NodeBuilderState.js +2 -1
  116. package/examples/jsm/renderers/common/nodes/NodeStorageBuffer.js +23 -0
  117. package/examples/jsm/renderers/common/nodes/NodeUniformBuffer.js +23 -0
  118. package/examples/jsm/renderers/common/nodes/Nodes.js +5 -2
  119. package/examples/jsm/renderers/webgl/WebGLBackend.js +653 -272
  120. package/examples/jsm/renderers/webgl/nodes/GLSLNodeBuilder.js +171 -39
  121. package/examples/jsm/renderers/webgl/utils/WebGLAttributeUtils.js +95 -8
  122. package/examples/jsm/renderers/webgl/utils/WebGLConstants.js +11 -0
  123. package/examples/jsm/renderers/webgl/utils/WebGLState.js +197 -0
  124. package/examples/jsm/renderers/webgl/utils/WebGLTextureUtils.js +424 -11
  125. package/examples/jsm/renderers/webgl/utils/WebGLUtils.js +3 -2
  126. package/examples/jsm/renderers/webgl-legacy/nodes/GLSL1NodeBuilder.js +1 -21
  127. package/examples/jsm/renderers/webgl-legacy/nodes/WebGLNodeBuilder.js +2 -2
  128. package/examples/jsm/renderers/webgpu/WebGPUBackend.js +300 -112
  129. package/examples/jsm/renderers/webgpu/WebGPURenderer.js +7 -2
  130. package/examples/jsm/renderers/webgpu/nodes/WGSLNodeBuilder.js +71 -79
  131. package/examples/jsm/renderers/webgpu/utils/WebGPUAttributeUtils.js +15 -1
  132. package/examples/jsm/renderers/webgpu/utils/WebGPUPipelineUtils.js +38 -4
  133. package/examples/jsm/renderers/webgpu/utils/WebGPUTextureUtils.js +87 -14
  134. package/examples/jsm/shaders/OutputShader.js +4 -0
  135. package/examples/jsm/transpiler/AST.js +1 -1
  136. package/examples/jsm/transpiler/GLSLDecoder.js +1 -1
  137. package/examples/jsm/transpiler/ShaderToyDecoder.js +1 -1
  138. package/examples/jsm/transpiler/TSLEncoder.js +1 -1
  139. package/examples/jsm/utils/BufferGeometryUtils.js +23 -27
  140. package/examples/jsm/utils/SkeletonUtils.js +14 -3
  141. package/examples/jsm/utils/SortUtils.js +2 -0
  142. package/examples/jsm/webxr/ARButton.js +12 -2
  143. package/examples/jsm/webxr/VRButton.js +25 -7
  144. package/examples/jsm/webxr/XRButton.js +12 -3
  145. package/examples/jsm/webxr/XRControllerModelFactory.js +14 -1
  146. package/examples/jsm/webxr/XRHandMeshModel.js +3 -1
  147. package/package.json +5 -4
  148. package/src/Three.Legacy.js +20 -0
  149. package/src/Three.js +0 -1
  150. package/src/audio/Audio.js +1 -3
  151. package/src/cameras/PerspectiveCamera.js +35 -0
  152. package/src/constants.js +2 -6
  153. package/src/core/BufferAttribute.js +2 -12
  154. package/src/core/BufferGeometry.js +23 -29
  155. package/src/core/InterleavedBuffer.js +2 -1
  156. package/src/core/InterleavedBufferAttribute.js +20 -0
  157. package/src/core/Object3D.js +11 -0
  158. package/src/core/Raycaster.js +18 -4
  159. package/src/core/RenderTarget.js +44 -21
  160. package/src/extras/PMREMGenerator.js +2 -0
  161. package/src/extras/curves/EllipseCurve.js +2 -2
  162. package/src/helpers/SpotLightHelper.js +18 -1
  163. package/src/loaders/DataTextureLoader.js +0 -4
  164. package/src/loaders/MaterialLoader.js +1 -0
  165. package/src/loaders/ObjectLoader.js +2 -1
  166. package/src/materials/Material.js +2 -1
  167. package/src/materials/MeshBasicMaterial.js +3 -0
  168. package/src/materials/MeshLambertMaterial.js +3 -0
  169. package/src/materials/MeshPhongMaterial.js +3 -0
  170. package/src/materials/MeshStandardMaterial.js +3 -0
  171. package/src/materials/ShaderMaterial.js +2 -1
  172. package/src/math/Quaternion.js +13 -12
  173. package/src/math/Triangle.js +0 -30
  174. package/src/math/Vector3.js +7 -7
  175. package/src/objects/BatchedMesh.js +6 -7
  176. package/src/objects/InstancedMesh.js +53 -0
  177. package/src/objects/Mesh.js +0 -1
  178. package/src/objects/SkinnedMesh.js +0 -8
  179. package/src/renderers/WebGLCubeRenderTarget.js +1 -10
  180. package/src/renderers/WebGLRenderer.js +20 -23
  181. package/src/renderers/shaders/ShaderChunk/alphatest_fragment.glsl.js +9 -0
  182. package/src/renderers/shaders/ShaderChunk/clipping_planes_fragment.glsl.js +56 -11
  183. package/src/renderers/shaders/ShaderChunk/envmap_common_pars_fragment.glsl.js +1 -0
  184. package/src/renderers/shaders/ShaderChunk/envmap_fragment.glsl.js +1 -1
  185. package/src/renderers/shaders/ShaderChunk/envmap_physical_pars_fragment.glsl.js +2 -2
  186. package/src/renderers/shaders/ShaderChunk/map_fragment.glsl.js +1 -1
  187. package/src/renderers/shaders/ShaderChunk/morphinstance_vertex.glsl.js +14 -0
  188. package/src/renderers/shaders/ShaderChunk/morphtarget_pars_vertex.glsl.js +11 -2
  189. package/src/renderers/shaders/ShaderChunk/tonemapping_pars_fragment.glsl.js +38 -7
  190. package/src/renderers/shaders/ShaderChunk.js +2 -0
  191. package/src/renderers/shaders/ShaderLib/backgroundCube.glsl.js +3 -2
  192. package/src/renderers/shaders/ShaderLib/depth.glsl.js +3 -2
  193. package/src/renderers/shaders/ShaderLib/distanceRGBA.glsl.js +3 -2
  194. package/src/renderers/shaders/ShaderLib/linedashed.glsl.js +2 -1
  195. package/src/renderers/shaders/ShaderLib/meshbasic.glsl.js +2 -2
  196. package/src/renderers/shaders/ShaderLib/meshlambert.glsl.js +2 -1
  197. package/src/renderers/shaders/ShaderLib/meshmatcap.glsl.js +2 -2
  198. package/src/renderers/shaders/ShaderLib/meshnormal.glsl.js +4 -1
  199. package/src/renderers/shaders/ShaderLib/meshphong.glsl.js +2 -1
  200. package/src/renderers/shaders/ShaderLib/meshphysical.glsl.js +2 -1
  201. package/src/renderers/shaders/ShaderLib/meshtoon.glsl.js +2 -1
  202. package/src/renderers/shaders/ShaderLib/points.glsl.js +2 -1
  203. package/src/renderers/shaders/ShaderLib/shadow.glsl.js +1 -0
  204. package/src/renderers/shaders/ShaderLib/sprite.glsl.js +1 -1
  205. package/src/renderers/shaders/ShaderLib.js +2 -1
  206. package/src/renderers/shaders/UniformsLib.js +1 -0
  207. package/src/renderers/webgl/WebGLAttributes.js +2 -2
  208. package/src/renderers/webgl/WebGLBackground.js +18 -0
  209. package/src/renderers/webgl/WebGLCubeMaps.js +1 -1
  210. package/src/renderers/webgl/WebGLMaterials.js +24 -1
  211. package/src/renderers/webgl/WebGLMorphtargets.js +15 -8
  212. package/src/renderers/webgl/WebGLProgram.js +42 -4
  213. package/src/renderers/webgl/WebGLPrograms.js +38 -27
  214. package/src/renderers/webgl/WebGLState.js +11 -21
  215. package/src/renderers/webgl/WebGLTextures.js +170 -66
  216. package/src/renderers/webxr/WebXRDepthSensing.js +105 -0
  217. package/src/renderers/webxr/WebXRManager.js +46 -0
  218. package/src/scenes/Scene.js +8 -0
  219. package/src/textures/Source.js +1 -0
  220. package/src/textures/Texture.js +1 -29
  221. package/build/three.js +0 -54519
  222. package/build/three.min.js +0 -7
  223. package/examples/jsm/nodes/core/ArrayUniformNode.js +0 -26
  224. package/examples/jsm/objects/GroundProjectedSkybox.js +0 -172
  225. package/src/renderers/WebGLMultipleRenderTargets.js +0 -82
@@ -2,28 +2,19 @@
2
2
  import 'https://greggman.github.io/webgpu-avoid-redundant-state-setting/webgpu-check-redundant-state-setting.js';
3
3
  //*/
4
4
 
5
+ import { WebGPUCoordinateSystem } from 'three';
6
+
5
7
  import { GPUFeatureName, GPUTextureFormat, GPULoadOp, GPUStoreOp, GPUIndexFormat, GPUTextureViewDimension } from './utils/WebGPUConstants.js';
6
8
 
7
9
  import WGSLNodeBuilder from './nodes/WGSLNodeBuilder.js';
8
10
  import Backend from '../common/Backend.js';
9
11
 
10
- import { DepthFormat, WebGPUCoordinateSystem } from 'three';
11
-
12
12
  import WebGPUUtils from './utils/WebGPUUtils.js';
13
13
  import WebGPUAttributeUtils from './utils/WebGPUAttributeUtils.js';
14
14
  import WebGPUBindingUtils from './utils/WebGPUBindingUtils.js';
15
15
  import WebGPUPipelineUtils from './utils/WebGPUPipelineUtils.js';
16
16
  import WebGPUTextureUtils from './utils/WebGPUTextureUtils.js';
17
-
18
- // statics
19
-
20
- let _staticAdapter = null;
21
-
22
- if ( navigator.gpu !== undefined ) {
23
-
24
- _staticAdapter = await navigator.gpu.requestAdapter();
25
-
26
- }
17
+ import WebGPU from '../../capabilities/WebGPU.js';
27
18
 
28
19
  //
29
20
 
@@ -36,6 +27,7 @@ class WebGPUBackend extends Backend {
36
27
  this.isWebGPUBackend = true;
37
28
 
38
29
  // some parameters require default values other than "undefined"
30
+ this.parameters.alpha = ( parameters.alpha === undefined ) ? true : parameters.alpha;
39
31
 
40
32
  this.parameters.antialias = ( parameters.antialias === true );
41
33
 
@@ -51,10 +43,13 @@ class WebGPUBackend extends Backend {
51
43
 
52
44
  this.parameters.requiredLimits = ( parameters.requiredLimits === undefined ) ? {} : parameters.requiredLimits;
53
45
 
46
+ this.trackTimestamp = ( parameters.trackTimestamp === true );
47
+
54
48
  this.adapter = null;
55
49
  this.device = null;
56
50
  this.context = null;
57
51
  this.colorBuffer = null;
52
+ this.defaultRenderPassdescriptor = null;
58
53
 
59
54
  this.utils = new WebGPUUtils( this );
60
55
  this.attributeUtils = new WebGPUAttributeUtils( this );
@@ -114,11 +109,13 @@ class WebGPUBackend extends Backend {
114
109
  this.device = device;
115
110
  this.context = context;
116
111
 
112
+ const alphaMode = parameters.alpha ? 'premultiplied' : 'opaque';
113
+
117
114
  this.context.configure( {
118
115
  device: this.device,
119
116
  format: GPUTextureFormat.BGRA8Unorm,
120
117
  usage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.COPY_SRC,
121
- alphaMode: 'premultiplied'
118
+ alphaMode: alphaMode
122
119
  } );
123
120
 
124
121
  this.updateSize();
@@ -137,60 +134,94 @@ class WebGPUBackend extends Backend {
137
134
 
138
135
  }
139
136
 
140
- beginRender( renderContext ) {
137
+ getContext() {
141
138
 
142
- const renderContextData = this.get( renderContext );
139
+ return this.context;
143
140
 
144
- const device = this.device;
145
- const occlusionQueryCount = renderContext.occlusionQueryCount;
141
+ }
146
142
 
147
- let occlusionQuerySet;
143
+ _getDefaultRenderPassDescriptor() {
148
144
 
149
- if ( occlusionQueryCount > 0 ) {
145
+ let descriptor = this.defaultRenderPassdescriptor;
150
146
 
151
- if ( renderContextData.currentOcclusionQuerySet ) renderContextData.currentOcclusionQuerySet.destroy();
152
- if ( renderContextData.currentOcclusionQueryBuffer ) renderContextData.currentOcclusionQueryBuffer.destroy();
147
+ const antialias = this.parameters.antialias;
153
148
 
154
- // Get a reference to the array of objects with queries. The renderContextData property
155
- // can be changed by another render pass before the buffer.mapAsyc() completes.
156
- renderContextData.currentOcclusionQuerySet = renderContextData.occlusionQuerySet;
157
- renderContextData.currentOcclusionQueryBuffer = renderContextData.occlusionQueryBuffer;
158
- renderContextData.currentOcclusionQueryObjects = renderContextData.occlusionQueryObjects;
149
+ if ( descriptor === null ) {
159
150
 
160
- //
151
+ const renderer = this.renderer;
161
152
 
162
- occlusionQuerySet = device.createQuerySet( { type: 'occlusion', count: occlusionQueryCount } );
153
+ descriptor = {
154
+ colorAttachments: [ {
155
+ view: null
156
+ } ],
157
+ depthStencilAttachment: {
158
+ view: this.textureUtils.getDepthBuffer( renderer.depth, renderer.stencil ).createView()
159
+ }
160
+ };
163
161
 
164
- renderContextData.occlusionQuerySet = occlusionQuerySet;
165
- renderContextData.occlusionQueryIndex = 0;
166
- renderContextData.occlusionQueryObjects = new Array( occlusionQueryCount );
162
+ const colorAttachment = descriptor.colorAttachments[ 0 ];
167
163
 
168
- renderContextData.lastOcclusionObject = null;
164
+ if ( antialias === true ) {
169
165
 
170
- }
166
+ colorAttachment.view = this.colorBuffer.createView();
171
167
 
172
- const descriptor = {
173
- colorAttachments: [ {
174
- view: null
175
- } ],
176
- depthStencilAttachment: {
177
- view: null
178
- },
179
- occlusionQuerySet
180
- };
168
+ } else {
169
+
170
+ colorAttachment.resolveTarget = undefined;
171
+
172
+ }
173
+
174
+ this.defaultRenderPassdescriptor = descriptor;
175
+
176
+ }
181
177
 
182
178
  const colorAttachment = descriptor.colorAttachments[ 0 ];
183
- const depthStencilAttachment = descriptor.depthStencilAttachment;
184
179
 
185
- const antialias = this.parameters.antialias;
180
+ if ( antialias === true ) {
186
181
 
187
- if ( renderContext.textures !== null ) {
182
+ colorAttachment.resolveTarget = this.context.getCurrentTexture().createView();
188
183
 
189
- const textures = renderContext.textures;
184
+ } else {
190
185
 
191
- descriptor.colorAttachments = [];
186
+ colorAttachment.view = this.context.getCurrentTexture().createView();
192
187
 
193
- const colorAttachments = descriptor.colorAttachments;
188
+ }
189
+
190
+ return descriptor;
191
+
192
+ }
193
+
194
+ _getRenderPassDescriptor( renderContext ) {
195
+
196
+ const renderTarget = renderContext.renderTarget;
197
+ const renderTargetData = this.get( renderTarget );
198
+
199
+ let descriptors = renderTargetData.descriptors;
200
+
201
+ if ( descriptors === undefined ) {
202
+
203
+ descriptors = [];
204
+
205
+ renderTargetData.descriptors = descriptors;
206
+
207
+ }
208
+
209
+ if ( renderTargetData.width !== renderTarget.width ||
210
+ renderTargetData.height !== renderTarget.height ||
211
+ renderTargetData.activeMipmapLevel !== renderTarget.activeMipmapLevel ||
212
+ renderTargetData.samples !== renderTarget.samples
213
+ ) {
214
+
215
+ descriptors.length = 0;
216
+
217
+ }
218
+
219
+ let descriptor = descriptors[ renderContext.activeCubeFace ];
220
+
221
+ if ( descriptor === undefined ) {
222
+
223
+ const textures = renderContext.textures;
224
+ const colorAttachments = [];
194
225
 
195
226
  for ( let i = 0; i < textures.length; i ++ ) {
196
227
 
@@ -228,32 +259,78 @@ class WebGPUBackend extends Backend {
228
259
 
229
260
  const depthTextureData = this.get( renderContext.depthTexture );
230
261
 
231
- depthStencilAttachment.view = depthTextureData.texture.createView();
262
+ const depthStencilAttachment = {
263
+ view: depthTextureData.texture.createView(),
264
+ };
232
265
 
233
- if ( renderContext.stencil && renderContext.depthTexture.format === DepthFormat ) {
266
+ descriptor = {
267
+ colorAttachments,
268
+ depthStencilAttachment
269
+ };
234
270
 
235
- renderContext.stencil = false;
271
+ descriptors[ renderContext.activeCubeFace ] = descriptor;
236
272
 
237
- }
273
+ renderTargetData.width = renderTarget.width;
274
+ renderTargetData.height = renderTarget.height;
275
+ renderTargetData.samples = renderTarget.samples;
276
+ renderTargetData.activeMipmapLevel = renderTarget.activeMipmapLevel;
238
277
 
239
- } else {
278
+ }
240
279
 
241
- if ( antialias === true ) {
280
+ return descriptor;
242
281
 
243
- colorAttachment.view = this.colorBuffer.createView();
244
- colorAttachment.resolveTarget = this.context.getCurrentTexture().createView();
282
+ }
245
283
 
246
- } else {
284
+ beginRender( renderContext ) {
247
285
 
248
- colorAttachment.view = this.context.getCurrentTexture().createView();
249
- colorAttachment.resolveTarget = undefined;
286
+ const renderContextData = this.get( renderContext );
250
287
 
251
- }
288
+ const device = this.device;
289
+ const occlusionQueryCount = renderContext.occlusionQueryCount;
290
+
291
+ let occlusionQuerySet;
252
292
 
253
- depthStencilAttachment.view = this.textureUtils.getDepthBuffer( renderContext.depth, renderContext.stencil ).createView();
293
+ if ( occlusionQueryCount > 0 ) {
294
+
295
+ if ( renderContextData.currentOcclusionQuerySet ) renderContextData.currentOcclusionQuerySet.destroy();
296
+ if ( renderContextData.currentOcclusionQueryBuffer ) renderContextData.currentOcclusionQueryBuffer.destroy();
297
+
298
+ // Get a reference to the array of objects with queries. The renderContextData property
299
+ // can be changed by another render pass before the buffer.mapAsyc() completes.
300
+ renderContextData.currentOcclusionQuerySet = renderContextData.occlusionQuerySet;
301
+ renderContextData.currentOcclusionQueryBuffer = renderContextData.occlusionQueryBuffer;
302
+ renderContextData.currentOcclusionQueryObjects = renderContextData.occlusionQueryObjects;
303
+
304
+ //
305
+
306
+ occlusionQuerySet = device.createQuerySet( { type: 'occlusion', count: occlusionQueryCount } );
307
+
308
+ renderContextData.occlusionQuerySet = occlusionQuerySet;
309
+ renderContextData.occlusionQueryIndex = 0;
310
+ renderContextData.occlusionQueryObjects = new Array( occlusionQueryCount );
311
+
312
+ renderContextData.lastOcclusionObject = null;
254
313
 
255
314
  }
256
315
 
316
+ let descriptor;
317
+
318
+ if ( renderContext.textures === null ) {
319
+
320
+ descriptor = this._getDefaultRenderPassDescriptor();
321
+
322
+ } else {
323
+
324
+ descriptor = this._getRenderPassDescriptor( renderContext );
325
+
326
+ }
327
+
328
+ this.initTimestampQuery( renderContext, descriptor );
329
+
330
+ descriptor.occlusionQuerySet = occlusionQuerySet;
331
+
332
+ const depthStencilAttachment = descriptor.depthStencilAttachment;
333
+
257
334
  if ( renderContext.textures !== null ) {
258
335
 
259
336
  const colorAttachments = descriptor.colorAttachments;
@@ -277,9 +354,10 @@ class WebGPUBackend extends Backend {
277
354
 
278
355
  }
279
356
 
280
-
281
357
  } else {
282
358
 
359
+ const colorAttachment = descriptor.colorAttachments[ 0 ];
360
+
283
361
  if ( renderContext.clearColor ) {
284
362
 
285
363
  colorAttachment.clearValue = renderContext.clearColorValue;
@@ -416,8 +494,11 @@ class WebGPUBackend extends Backend {
416
494
 
417
495
  }
418
496
 
497
+ this.prepareTimestampBuffer( renderContext, renderContextData.encoder );
498
+
419
499
  this.device.queue.submit( [ renderContextData.encoder.finish() ] );
420
500
 
501
+
421
502
  //
422
503
 
423
504
  if ( renderContext.textures !== null ) {
@@ -468,7 +549,7 @@ class WebGPUBackend extends Backend {
468
549
  const buffer = currentOcclusionQueryBuffer.getMappedRange();
469
550
  const results = new BigUint64Array( buffer );
470
551
 
471
- for ( let i = 0; i < currentOcclusionQueryObjects.length; i++ ) {
552
+ for ( let i = 0; i < currentOcclusionQueryObjects.length; i ++ ) {
472
553
 
473
554
  if ( results[ i ] !== 0n ) {
474
555
 
@@ -489,7 +570,7 @@ class WebGPUBackend extends Backend {
489
570
  updateViewport( renderContext ) {
490
571
 
491
572
  const { currentPass } = this.get( renderContext );
492
- let { x, y, width, height, minDepth, maxDepth } = renderContext.viewportValue;
573
+ const { x, y, width, height, minDepth, maxDepth } = renderContext.viewportValue;
493
574
 
494
575
  currentPass.setViewport( x, renderContext.height - height - y, width, height, minDepth, maxDepth );
495
576
 
@@ -500,7 +581,7 @@ class WebGPUBackend extends Backend {
500
581
  const device = this.device;
501
582
  const renderer = this.renderer;
502
583
 
503
- const colorAttachments = [];
584
+ let colorAttachments = [];
504
585
 
505
586
  let depthStencilAttachment;
506
587
  let clearValue;
@@ -521,39 +602,23 @@ class WebGPUBackend extends Backend {
521
602
  supportsDepth = renderer.depth;
522
603
  supportsStencil = renderer.stencil;
523
604
 
524
- depth = depth && supportsDepth;
525
- stencil = stencil && supportsStencil;
605
+ const descriptor = this._getDefaultRenderPassDescriptor();
526
606
 
527
607
  if ( color ) {
528
608
 
529
- const antialias = this.parameters.antialias;
609
+ colorAttachments = descriptor.colorAttachments;
530
610
 
531
- const colorAttachment = {};
532
-
533
- if ( antialias === true ) {
534
-
535
- colorAttachment.view = this.colorBuffer.createView();
536
- colorAttachment.resolveTarget = this.context.getCurrentTexture().createView();
537
-
538
- } else {
539
-
540
- colorAttachment.view = this.context.getCurrentTexture().createView();
541
-
542
- }
611
+ const colorAttachment = colorAttachments[ 0 ];
543
612
 
544
613
  colorAttachment.clearValue = clearValue;
545
614
  colorAttachment.loadOp = GPULoadOp.Clear;
546
615
  colorAttachment.storeOp = GPUStoreOp.Store;
547
616
 
548
- colorAttachments.push( colorAttachment );
549
-
550
617
  }
551
618
 
552
- if ( depth || stencil ) {
619
+ if ( supportsDepth || supportsStencil ) {
553
620
 
554
- depthStencilAttachment = {
555
- view: this.textureUtils.getDepthBuffer( renderer.depth, renderer.stencil ).createView()
556
- };
621
+ depthStencilAttachment = descriptor.depthStencilAttachment;
557
622
 
558
623
  }
559
624
 
@@ -562,9 +627,6 @@ class WebGPUBackend extends Backend {
562
627
  supportsDepth = renderTargetData.depth;
563
628
  supportsStencil = renderTargetData.stencil;
564
629
 
565
- depth = depth && supportsDepth;
566
- stencil = stencil && supportsStencil;
567
-
568
630
  if ( color ) {
569
631
 
570
632
  for ( const texture of renderTargetData.textures ) {
@@ -598,7 +660,7 @@ class WebGPUBackend extends Backend {
598
660
 
599
661
  }
600
662
 
601
- if ( depth || stencil ) {
663
+ if ( supportsDepth || supportsStencil ) {
602
664
 
603
665
  const depthTextureData = this.get( renderTargetData.depthTexture );
604
666
 
@@ -612,7 +674,7 @@ class WebGPUBackend extends Backend {
612
674
 
613
675
  //
614
676
 
615
- if ( depthStencilAttachment !== undefined ) {
677
+ if ( supportsDepth ) {
616
678
 
617
679
  if ( depth ) {
618
680
 
@@ -627,7 +689,11 @@ class WebGPUBackend extends Backend {
627
689
 
628
690
  }
629
691
 
630
- //
692
+ }
693
+
694
+ //
695
+
696
+ if ( supportsStencil ) {
631
697
 
632
698
  if ( stencil ) {
633
699
 
@@ -664,8 +730,14 @@ class WebGPUBackend extends Backend {
664
730
 
665
731
  const groupGPU = this.get( computeGroup );
666
732
 
667
- groupGPU.cmdEncoderGPU = this.device.createCommandEncoder( {} );
668
- groupGPU.passEncoderGPU = groupGPU.cmdEncoderGPU.beginComputePass();
733
+
734
+ const descriptor = {};
735
+
736
+ this.initTimestampQuery( computeGroup, descriptor );
737
+
738
+ groupGPU.cmdEncoderGPU = this.device.createCommandEncoder();
739
+
740
+ groupGPU.passEncoderGPU = groupGPU.cmdEncoderGPU.beginComputePass( descriptor );
669
741
 
670
742
  }
671
743
 
@@ -692,6 +764,9 @@ class WebGPUBackend extends Backend {
692
764
  const groupData = this.get( computeGroup );
693
765
 
694
766
  groupData.passEncoderGPU.end();
767
+
768
+ this.prepareTimestampBuffer( computeGroup, groupData.cmdEncoderGPU );
769
+
695
770
  this.device.queue.submit( [ groupData.cmdEncoderGPU.finish() ] );
696
771
 
697
772
  }
@@ -768,7 +843,7 @@ class WebGPUBackend extends Backend {
768
843
 
769
844
  // occlusion queries - handle multiple consecutive draw calls for an object
770
845
 
771
- if ( contextData.occlusionQuerySet !== undefined ) {
846
+ if ( contextData.occlusionQuerySet !== undefined ) {
772
847
 
773
848
  const lastObject = contextData.lastOcclusionObject;
774
849
 
@@ -852,7 +927,8 @@ class WebGPUBackend extends Backend {
852
927
  data.side !== material.side || data.alphaToCoverage !== material.alphaToCoverage ||
853
928
  data.sampleCount !== sampleCount || data.colorSpace !== colorSpace ||
854
929
  data.colorFormat !== colorFormat || data.depthStencilFormat !== depthStencilFormat ||
855
- data.primitiveTopology !== primitiveTopology
930
+ data.primitiveTopology !== primitiveTopology ||
931
+ data.clippingContextVersion !== renderObject.clippingContextVersion
856
932
  ) {
857
933
 
858
934
  data.material = material; data.materialVersion = material.version;
@@ -870,6 +946,7 @@ class WebGPUBackend extends Backend {
870
946
  data.colorFormat = colorFormat;
871
947
  data.depthStencilFormat = depthStencilFormat;
872
948
  data.primitiveTopology = primitiveTopology;
949
+ data.clippingContextVersion = renderObject.clippingContextVersion;
873
950
 
874
951
  needsUpdate = true;
875
952
 
@@ -898,7 +975,8 @@ class WebGPUBackend extends Backend {
898
975
  material.side,
899
976
  utils.getSampleCount( renderContext ),
900
977
  utils.getCurrentColorSpace( renderContext ), utils.getCurrentColorFormat( renderContext ), utils.getCurrentDepthStencilFormat( renderContext ),
901
- utils.getPrimitiveTopology( object, material )
978
+ utils.getPrimitiveTopology( object, material ),
979
+ renderObject.clippingContextVersion
902
980
  ].join();
903
981
 
904
982
  }
@@ -953,6 +1031,87 @@ class WebGPUBackend extends Backend {
953
1031
 
954
1032
  }
955
1033
 
1034
+
1035
+ initTimestampQuery( renderContext, descriptor ) {
1036
+
1037
+ if ( ! this.hasFeature( GPUFeatureName.TimestampQuery ) || ! this.trackTimestamp ) return;
1038
+
1039
+ const renderContextData = this.get( renderContext );
1040
+
1041
+ if ( ! renderContextData.timeStampQuerySet ) {
1042
+
1043
+ // Create a GPUQuerySet which holds 2 timestamp query results: one for the
1044
+ // beginning and one for the end of compute pass execution.
1045
+ const timeStampQuerySet = this.device.createQuerySet( { type: 'timestamp', count: 2 } );
1046
+
1047
+ const timestampWrites = {
1048
+ querySet: timeStampQuerySet,
1049
+ beginningOfPassWriteIndex: 0, // Write timestamp in index 0 when pass begins.
1050
+ endOfPassWriteIndex: 1, // Write timestamp in index 1 when pass ends.
1051
+ };
1052
+ Object.assign( descriptor, {
1053
+ timestampWrites,
1054
+ } );
1055
+ renderContextData.timeStampQuerySet = timeStampQuerySet;
1056
+
1057
+ }
1058
+
1059
+ }
1060
+
1061
+ // timestamp utils
1062
+
1063
+ prepareTimestampBuffer( renderContext, encoder ) {
1064
+
1065
+ if ( ! this.hasFeature( GPUFeatureName.TimestampQuery ) || ! this.trackTimestamp ) return;
1066
+
1067
+ const renderContextData = this.get( renderContext );
1068
+
1069
+ const size = 2 * BigInt64Array.BYTES_PER_ELEMENT;
1070
+ const resolveBuffer = this.device.createBuffer( {
1071
+ size,
1072
+ usage: GPUBufferUsage.QUERY_RESOLVE | GPUBufferUsage.COPY_SRC,
1073
+ } );
1074
+
1075
+ const resultBuffer = this.device.createBuffer( {
1076
+ size,
1077
+ usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.MAP_READ,
1078
+ } );
1079
+
1080
+ encoder.resolveQuerySet( renderContextData.timeStampQuerySet, 0, 2, resolveBuffer, 0 );
1081
+ encoder.copyBufferToBuffer( resolveBuffer, 0, resultBuffer, 0, size );
1082
+
1083
+ renderContextData.currentTimestampQueryBuffer = resultBuffer;
1084
+
1085
+ }
1086
+
1087
+ async resolveTimestampAsync( renderContext, type = 'render' ) {
1088
+
1089
+ if ( ! this.hasFeature( GPUFeatureName.TimestampQuery ) || ! this.trackTimestamp ) return;
1090
+
1091
+ const renderContextData = this.get( renderContext );
1092
+
1093
+ // handle timestamp query results
1094
+
1095
+ const { currentTimestampQueryBuffer } = renderContextData;
1096
+
1097
+ if ( currentTimestampQueryBuffer ) {
1098
+
1099
+ renderContextData.currentTimestampQueryBuffer = null;
1100
+
1101
+ await currentTimestampQueryBuffer.mapAsync( GPUMapMode.READ );
1102
+
1103
+ const times = new BigUint64Array( currentTimestampQueryBuffer.getMappedRange() );
1104
+
1105
+ const duration = Number( times[ 1 ] - times[ 0 ] ) / 1000000;
1106
+ // console.log( `Compute ${type} duration: ${Number( times[ 1 ] - times[ 0 ] ) / 1000000}ms` );
1107
+ this.renderer.info.updateTimestamp( type, duration );
1108
+
1109
+ currentTimestampQueryBuffer.unmap();
1110
+
1111
+ }
1112
+
1113
+ }
1114
+
956
1115
  // node builder
957
1116
 
958
1117
  createNodeBuilder( object, renderer, scene = null ) {
@@ -982,9 +1141,9 @@ class WebGPUBackend extends Backend {
982
1141
 
983
1142
  // pipelines
984
1143
 
985
- createRenderPipeline( renderObject ) {
1144
+ createRenderPipeline( renderObject, promises ) {
986
1145
 
987
- this.pipelineUtils.createRenderPipeline( renderObject );
1146
+ this.pipelineUtils.createRenderPipeline( renderObject, promises );
988
1147
 
989
1148
  }
990
1149
 
@@ -1051,7 +1210,8 @@ class WebGPUBackend extends Backend {
1051
1210
  updateSize() {
1052
1211
 
1053
1212
  this.colorBuffer = this.textureUtils.getColorBuffer();
1054
-
1213
+ this.defaultRenderPassdescriptor = null;
1214
+
1055
1215
  }
1056
1216
 
1057
1217
  // utils public
@@ -1062,23 +1222,27 @@ class WebGPUBackend extends Backend {
1062
1222
 
1063
1223
  }
1064
1224
 
1065
- hasFeature( name ) {
1225
+ async hasFeatureAsync( name ) {
1066
1226
 
1067
- const adapter = this.adapter || _staticAdapter;
1227
+ const adapter = this.adapter || await WebGPU.getStaticAdapter();
1068
1228
 
1069
1229
  //
1070
1230
 
1071
- const features = Object.values( GPUFeatureName );
1231
+ return adapter.features.has( name );
1072
1232
 
1073
- if ( features.includes( name ) === false ) {
1233
+ }
1074
1234
 
1075
- throw new Error( 'THREE.WebGPURenderer: Unknown WebGPU GPU feature: ' + name );
1235
+ hasFeature( name ) {
1076
1236
 
1077
- }
1237
+ if ( ! this.adapter ) {
1078
1238
 
1079
- //
1239
+ console.warn( 'WebGPUBackend: WebGPU adapter has not been initialized yet. Please use detectSupportAsync instead' );
1080
1240
 
1081
- return adapter.features.has( name );
1241
+ return false;
1242
+
1243
+ }
1244
+
1245
+ return this.adapter.features.has( name );
1082
1246
 
1083
1247
  }
1084
1248
 
@@ -1090,18 +1254,42 @@ class WebGPUBackend extends Backend {
1090
1254
 
1091
1255
  let sourceGPU = null;
1092
1256
 
1093
- if ( texture.isFramebufferTexture ) {
1257
+ if ( renderContext.renderTarget ) {
1258
+
1259
+ if ( texture.isDepthTexture ) {
1260
+
1261
+ sourceGPU = this.get( renderContext.depthTexture ).texture;
1262
+
1263
+ } else {
1264
+
1265
+ sourceGPU = this.get( renderContext.textures[ 0 ] ).texture;
1094
1266
 
1095
- sourceGPU = this.context.getCurrentTexture();
1267
+ }
1268
+
1269
+ } else {
1096
1270
 
1097
- } else if ( texture.isDepthTexture ) {
1271
+ if ( texture.isDepthTexture ) {
1098
1272
 
1099
- sourceGPU = this.textureUtils.getDepthBuffer( renderContext.depth, renderContext.stencil );
1273
+ sourceGPU = this.textureUtils.getDepthBuffer( renderContext.depth, renderContext.stencil );
1274
+
1275
+ } else {
1276
+
1277
+ sourceGPU = this.context.getCurrentTexture();
1278
+
1279
+ }
1100
1280
 
1101
1281
  }
1102
1282
 
1103
1283
  const destinationGPU = this.get( texture ).texture;
1104
1284
 
1285
+ if ( sourceGPU.format !== destinationGPU.format ) {
1286
+
1287
+ console.error( 'WebGPUBackend: copyFramebufferToTexture: Source and destination formats do not match.', sourceGPU.format, destinationGPU.format );
1288
+
1289
+ return;
1290
+
1291
+ }
1292
+
1105
1293
  renderContextData.currentPass.end();
1106
1294
 
1107
1295
  encoder.copyTextureToTexture(
@@ -1,7 +1,8 @@
1
+ import WebGPU from '../../capabilities/WebGPU.js';
2
+
1
3
  import Renderer from '../common/Renderer.js';
2
4
  import WebGLBackend from '../webgl/WebGLBackend.js';
3
5
  import WebGPUBackend from './WebGPUBackend.js';
4
- import WebGPU from '../../capabilities/WebGPU.js';
5
6
  /*
6
7
  const debugHandler = {
7
8
 
@@ -22,7 +23,11 @@ class WebGPURenderer extends Renderer {
22
23
 
23
24
  let BackendClass;
24
25
 
25
- if ( WebGPU.isAvailable() ) {
26
+ if ( parameters.forceWebGL ) {
27
+
28
+ BackendClass = WebGLBackend;
29
+
30
+ } else if ( WebGPU.isAvailable() ) {
26
31
 
27
32
  BackendClass = WebGPUBackend;
28
33