super-three 0.161.0 → 0.163.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 (206) hide show
  1. package/build/three.cjs +822 -1332
  2. package/build/three.module.js +820 -1328
  3. package/build/three.module.min.js +1 -1
  4. package/examples/jsm/controls/DragControls.js +91 -30
  5. package/examples/jsm/controls/OrbitControls.js +32 -6
  6. package/examples/jsm/controls/TransformControls.js +9 -9
  7. package/examples/jsm/exporters/GLTFExporter.js +30 -3
  8. package/examples/jsm/exporters/USDZExporter.js +15 -0
  9. package/examples/jsm/geometries/TextGeometry.js +10 -2
  10. package/examples/jsm/interactive/HTMLMesh.js +7 -9
  11. package/examples/jsm/interactive/InteractiveGroup.js +15 -25
  12. package/examples/jsm/libs/fflate.module.js +694 -496
  13. package/examples/jsm/libs/rhino3dm/rhino3dm.js +1 -8723
  14. package/examples/jsm/libs/rhino3dm/rhino3dm.module.js +1 -8734
  15. package/examples/jsm/libs/rhino3dm/rhino3dm.wasm +0 -0
  16. package/examples/jsm/libs/tween.module.js +32 -14
  17. package/examples/jsm/lines/LineMaterial.js +0 -2
  18. package/examples/jsm/loaders/3DMLoader.js +13 -21
  19. package/examples/jsm/loaders/3MFLoader.js +2 -0
  20. package/examples/jsm/loaders/EXRLoader.js +89 -19
  21. package/examples/jsm/loaders/FBXLoader.js +1 -1
  22. package/examples/jsm/loaders/GLTFLoader.js +6 -0
  23. package/examples/jsm/loaders/KTX2Loader.js +2 -6
  24. package/examples/jsm/loaders/LUT3dlLoader.js +0 -15
  25. package/examples/jsm/loaders/LUTCubeLoader.js +0 -14
  26. package/examples/jsm/loaders/LUTImageLoader.js +0 -14
  27. package/examples/jsm/loaders/RGBMLoader.js +16 -0
  28. package/examples/jsm/loaders/VOXLoader.js +9 -2
  29. package/examples/jsm/loaders/VRMLLoader.js +6 -2
  30. package/examples/jsm/misc/GPUComputationRenderer.js +0 -6
  31. package/examples/jsm/misc/ProgressiveLightMap.js +1 -0
  32. package/examples/jsm/nodes/Nodes.js +15 -8
  33. package/examples/jsm/nodes/accessors/AccessorsUtils.js +10 -0
  34. package/examples/jsm/nodes/accessors/BatchNode.js +78 -0
  35. package/examples/jsm/nodes/accessors/ClippingNode.js +144 -0
  36. package/examples/jsm/nodes/accessors/InstanceNode.js +25 -2
  37. package/examples/jsm/nodes/accessors/MaterialNode.js +2 -2
  38. package/examples/jsm/nodes/accessors/MaterialReferenceNode.js +2 -12
  39. package/examples/jsm/nodes/accessors/MorphNode.js +20 -10
  40. package/examples/jsm/nodes/accessors/NormalNode.js +12 -2
  41. package/examples/jsm/nodes/accessors/ReferenceNode.js +87 -29
  42. package/examples/jsm/nodes/accessors/RendererReferenceNode.js +29 -0
  43. package/examples/jsm/nodes/accessors/SkinningNode.js +31 -10
  44. package/examples/jsm/nodes/accessors/StorageBufferNode.js +18 -0
  45. package/examples/jsm/nodes/accessors/TangentNode.js +8 -2
  46. package/examples/jsm/nodes/accessors/TextureNode.js +30 -7
  47. package/examples/jsm/nodes/accessors/UniformsNode.js +140 -0
  48. package/examples/jsm/nodes/code/CodeNode.js +6 -0
  49. package/examples/jsm/nodes/core/AssignNode.js +68 -12
  50. package/examples/jsm/nodes/core/Node.js +67 -6
  51. package/examples/jsm/nodes/core/NodeBuilder.js +23 -24
  52. package/examples/jsm/nodes/core/NodeFrame.js +8 -8
  53. package/examples/jsm/nodes/core/NodeUtils.js +2 -2
  54. package/examples/jsm/nodes/core/TempNode.js +1 -1
  55. package/examples/jsm/nodes/core/UniformNode.js +20 -0
  56. package/examples/jsm/nodes/display/BlendModeNode.js +30 -1
  57. package/examples/jsm/nodes/display/NormalMapNode.js +3 -5
  58. package/examples/jsm/nodes/display/PassNode.js +17 -1
  59. package/examples/jsm/nodes/display/ToneMappingNode.js +8 -4
  60. package/examples/jsm/nodes/display/ViewportSharedTextureNode.js +6 -0
  61. package/examples/jsm/nodes/fog/FogExp2Node.js +4 -5
  62. package/examples/jsm/nodes/fog/FogNode.js +13 -3
  63. package/examples/jsm/nodes/fog/FogRangeNode.js +4 -3
  64. package/examples/jsm/nodes/lighting/AnalyticLightNode.js +1 -1
  65. package/examples/jsm/nodes/lighting/EnvironmentNode.js +12 -69
  66. package/examples/jsm/nodes/materials/NodeMaterial.js +70 -17
  67. package/examples/jsm/nodes/math/CondNode.js +42 -7
  68. package/examples/jsm/nodes/math/MathNode.js +20 -0
  69. package/examples/jsm/nodes/pmrem/PMREMNode.js +193 -0
  70. package/examples/jsm/nodes/pmrem/PMREMUtils.js +288 -0
  71. package/examples/jsm/nodes/shadernode/ShaderNode.js +1 -1
  72. package/examples/jsm/nodes/utils/ArrayElementNode.js +0 -6
  73. package/examples/jsm/nodes/utils/EquirectUVNode.js +1 -1
  74. package/examples/jsm/nodes/utils/LoopNode.js +2 -0
  75. package/examples/jsm/nodes/utils/StorageArrayElementNode.js +91 -0
  76. package/examples/jsm/objects/QuadMesh.js +7 -23
  77. package/examples/jsm/physics/RapierPhysics.js +4 -4
  78. package/examples/jsm/postprocessing/GlitchPass.js +0 -3
  79. package/examples/jsm/postprocessing/LUTPass.js +5 -71
  80. package/examples/jsm/postprocessing/OutputPass.js +2 -0
  81. package/examples/jsm/postprocessing/SAOPass.js +0 -1
  82. package/examples/jsm/postprocessing/SSAOPass.js +0 -3
  83. package/examples/jsm/renderers/common/Animation.js +3 -0
  84. package/examples/jsm/renderers/common/Background.js +3 -3
  85. package/examples/jsm/renderers/common/ClippingContext.js +165 -0
  86. package/examples/jsm/renderers/common/Info.js +11 -19
  87. package/examples/jsm/renderers/common/PostProcessing.js +12 -4
  88. package/examples/jsm/renderers/common/RenderContext.js +3 -1
  89. package/examples/jsm/renderers/common/RenderContexts.js +2 -13
  90. package/examples/jsm/renderers/common/RenderObject.js +46 -3
  91. package/examples/jsm/renderers/common/RenderObjects.js +2 -0
  92. package/examples/jsm/renderers/common/Renderer.js +113 -39
  93. package/examples/jsm/renderers/common/StorageBufferAttribute.js +2 -2
  94. package/examples/jsm/renderers/common/StorageInstancedBufferAttribute.js +17 -0
  95. package/examples/jsm/renderers/common/Textures.js +3 -13
  96. package/examples/jsm/renderers/common/UniformsGroup.js +6 -4
  97. package/examples/jsm/renderers/common/extras/PMREMGenerator.js +777 -0
  98. package/examples/jsm/renderers/common/nodes/NodeStorageBuffer.js +23 -0
  99. package/examples/jsm/renderers/common/nodes/NodeUniformBuffer.js +23 -0
  100. package/examples/jsm/renderers/common/nodes/Nodes.js +6 -18
  101. package/examples/jsm/renderers/webgl/WebGLBackend.js +174 -30
  102. package/examples/jsm/renderers/webgl/WebGLBufferRenderer.js +141 -0
  103. package/examples/jsm/renderers/webgl/nodes/GLSLNodeBuilder.js +136 -11
  104. package/examples/jsm/renderers/webgl/utils/WebGLAttributeUtils.js +8 -2
  105. package/examples/jsm/renderers/webgl/utils/WebGLConstants.js +1 -0
  106. package/examples/jsm/renderers/webgl/utils/WebGLTextureUtils.js +90 -0
  107. package/examples/jsm/renderers/webgl/utils/WebGLUtils.js +3 -1
  108. package/examples/jsm/renderers/webgl-legacy/nodes/GLSL1NodeBuilder.js +0 -2
  109. package/examples/jsm/renderers/webgl-legacy/nodes/WebGLNodeBuilder.js +0 -2
  110. package/examples/jsm/renderers/webgpu/WebGPUBackend.js +67 -37
  111. package/examples/jsm/renderers/webgpu/nodes/WGSLNodeBuilder.js +20 -43
  112. package/examples/jsm/renderers/webgpu/utils/WebGPUAttributeUtils.js +32 -1
  113. package/examples/jsm/renderers/webgpu/utils/WebGPUBindingUtils.js +18 -4
  114. package/examples/jsm/renderers/webgpu/utils/WebGPUTextureUtils.js +94 -20
  115. package/examples/jsm/shaders/OutputShader.js +4 -0
  116. package/examples/jsm/utils/GPUStatsPanel.js +10 -45
  117. package/examples/jsm/utils/SkeletonUtils.js +14 -3
  118. package/examples/jsm/utils/TextureUtils.js +1 -1
  119. package/examples/jsm/webxr/VRButton.js +13 -5
  120. package/examples/jsm/webxr/XRButton.js +0 -1
  121. package/examples/jsm/webxr/XRControllerModelFactory.js +8 -0
  122. package/package.json +4 -3
  123. package/src/Three.Legacy.js +20 -0
  124. package/src/Three.js +0 -2
  125. package/src/animation/AnimationClip.js +1 -1
  126. package/src/constants.js +4 -7
  127. package/src/core/BufferAttribute.js +0 -11
  128. package/src/core/BufferGeometry.js +23 -29
  129. package/src/core/Object3D.js +21 -7
  130. package/src/core/Raycaster.js +18 -4
  131. package/src/core/RenderTarget.js +44 -21
  132. package/src/extras/PMREMGenerator.js +11 -0
  133. package/src/extras/curves/EllipseCurve.js +2 -2
  134. package/src/helpers/SpotLightHelper.js +18 -1
  135. package/src/loaders/DataTextureLoader.js +0 -4
  136. package/src/loaders/MaterialLoader.js +1 -0
  137. package/src/loaders/ObjectLoader.js +4 -1
  138. package/src/materials/Material.js +2 -1
  139. package/src/materials/MeshBasicMaterial.js +3 -0
  140. package/src/materials/MeshLambertMaterial.js +3 -0
  141. package/src/materials/MeshPhongMaterial.js +3 -0
  142. package/src/materials/MeshStandardMaterial.js +3 -0
  143. package/src/materials/ShaderMaterial.js +0 -4
  144. package/src/math/Quaternion.js +13 -12
  145. package/src/math/Spherical.js +4 -5
  146. package/src/math/Vector3.js +7 -7
  147. package/src/objects/BatchedMesh.js +4 -3
  148. package/src/objects/InstancedMesh.js +63 -0
  149. package/src/objects/Mesh.js +0 -1
  150. package/src/renderers/WebGLCubeRenderTarget.js +1 -10
  151. package/src/renderers/WebGLRenderer.js +70 -136
  152. package/src/renderers/shaders/ShaderChunk/envmap_common_pars_fragment.glsl.js +1 -0
  153. package/src/renderers/shaders/ShaderChunk/envmap_fragment.glsl.js +1 -1
  154. package/src/renderers/shaders/ShaderChunk/envmap_physical_pars_fragment.glsl.js +2 -2
  155. package/src/renderers/shaders/ShaderChunk/logdepthbuf_fragment.glsl.js +2 -2
  156. package/src/renderers/shaders/ShaderChunk/logdepthbuf_pars_fragment.glsl.js +1 -1
  157. package/src/renderers/shaders/ShaderChunk/logdepthbuf_pars_vertex.glsl.js +2 -10
  158. package/src/renderers/shaders/ShaderChunk/logdepthbuf_vertex.glsl.js +2 -16
  159. package/src/renderers/shaders/ShaderChunk/map_fragment.glsl.js +1 -1
  160. package/src/renderers/shaders/ShaderChunk/morphinstance_vertex.glsl.js +14 -0
  161. package/src/renderers/shaders/ShaderChunk/morphtarget_pars_vertex.glsl.js +11 -2
  162. package/src/renderers/shaders/ShaderChunk/shadowmap_pars_fragment.glsl.js +32 -22
  163. package/src/renderers/shaders/ShaderChunk/tonemapping_pars_fragment.glsl.js +23 -0
  164. package/src/renderers/shaders/ShaderChunk.js +2 -0
  165. package/src/renderers/shaders/ShaderLib/backgroundCube.glsl.js +3 -2
  166. package/src/renderers/shaders/ShaderLib/depth.glsl.js +2 -0
  167. package/src/renderers/shaders/ShaderLib/distanceRGBA.glsl.js +2 -0
  168. package/src/renderers/shaders/ShaderLib/linedashed.glsl.js +1 -0
  169. package/src/renderers/shaders/ShaderLib/meshbasic.glsl.js +1 -0
  170. package/src/renderers/shaders/ShaderLib/meshlambert.glsl.js +1 -0
  171. package/src/renderers/shaders/ShaderLib/meshmatcap.glsl.js +1 -0
  172. package/src/renderers/shaders/ShaderLib/meshnormal.glsl.js +1 -0
  173. package/src/renderers/shaders/ShaderLib/meshphong.glsl.js +1 -0
  174. package/src/renderers/shaders/ShaderLib/meshphysical.glsl.js +1 -0
  175. package/src/renderers/shaders/ShaderLib/meshtoon.glsl.js +1 -0
  176. package/src/renderers/shaders/ShaderLib/points.glsl.js +1 -0
  177. package/src/renderers/shaders/ShaderLib/shadow.glsl.js +1 -0
  178. package/src/renderers/shaders/ShaderLib.js +3 -2
  179. package/src/renderers/shaders/UniformsLib.js +1 -0
  180. package/src/renderers/shaders/UniformsUtils.js +10 -1
  181. package/src/renderers/webgl/WebGLAttributes.js +6 -33
  182. package/src/renderers/webgl/WebGLBackground.js +18 -0
  183. package/src/renderers/webgl/WebGLBindingStates.js +14 -51
  184. package/src/renderers/webgl/WebGLBufferRenderer.js +3 -25
  185. package/src/renderers/webgl/WebGLCapabilities.js +2 -12
  186. package/src/renderers/webgl/WebGLCubeUVMaps.js +10 -6
  187. package/src/renderers/webgl/WebGLExtensions.js +4 -19
  188. package/src/renderers/webgl/WebGLIndexedBufferRenderer.js +3 -25
  189. package/src/renderers/webgl/WebGLLights.js +6 -32
  190. package/src/renderers/webgl/WebGLMaterials.js +26 -4
  191. package/src/renderers/webgl/WebGLMorphtargets.js +79 -210
  192. package/src/renderers/webgl/WebGLProgram.js +30 -48
  193. package/src/renderers/webgl/WebGLPrograms.js +5 -14
  194. package/src/renderers/webgl/WebGLRenderStates.js +8 -6
  195. package/src/renderers/webgl/WebGLState.js +21 -75
  196. package/src/renderers/webgl/WebGLTextures.js +143 -275
  197. package/src/renderers/webgl/WebGLUniformsGroups.js +1 -1
  198. package/src/renderers/webgl/WebGLUtils.js +6 -57
  199. package/src/renderers/webxr/WebXRDepthSensing.js +2 -3
  200. package/src/renderers/webxr/WebXRManager.js +2 -2
  201. package/src/scenes/Scene.js +14 -0
  202. package/src/textures/Texture.js +6 -24
  203. package/examples/jsm/nodes/core/ArrayUniformNode.js +0 -26
  204. package/examples/jsm/nodes/utils/SpecularMIPLevelNode.js +0 -37
  205. package/src/renderers/WebGL1Renderer.js +0 -7
  206. package/src/renderers/WebGLMultipleRenderTargets.js +0 -82
@@ -0,0 +1,23 @@
1
+ import StorageBuffer from '../StorageBuffer.js';
2
+
3
+ let _id = 0;
4
+
5
+ class NodeStorageBuffer extends StorageBuffer {
6
+
7
+ constructor( nodeUniform ) {
8
+
9
+ super( 'StorageBuffer_' + _id ++, nodeUniform ? nodeUniform.value : null );
10
+
11
+ this.nodeUniform = nodeUniform;
12
+
13
+ }
14
+
15
+ get buffer() {
16
+
17
+ return this.nodeUniform.value;
18
+
19
+ }
20
+
21
+ }
22
+
23
+ export default NodeStorageBuffer;
@@ -0,0 +1,23 @@
1
+ import UniformBuffer from '../UniformBuffer.js';
2
+
3
+ let _id = 0;
4
+
5
+ class NodeUniformBuffer extends UniformBuffer {
6
+
7
+ constructor( nodeUniform ) {
8
+
9
+ super( 'UniformBuffer_' + _id ++, nodeUniform ? nodeUniform.value : null );
10
+
11
+ this.nodeUniform = nodeUniform;
12
+
13
+ }
14
+
15
+ get buffer() {
16
+
17
+ return this.nodeUniform.value;
18
+
19
+ }
20
+
21
+ }
22
+
23
+ export default NodeUniformBuffer;
@@ -2,7 +2,7 @@ import DataMap from '../DataMap.js';
2
2
  import ChainMap from '../ChainMap.js';
3
3
  import NodeBuilderState from './NodeBuilderState.js';
4
4
  import { NoToneMapping, EquirectangularReflectionMapping, EquirectangularRefractionMapping } from 'three';
5
- import { NodeFrame, objectGroup, renderGroup, frameGroup, cubeTexture, texture, rangeFog, densityFog, reference, toneMapping, equirectUV, viewportBottomLeft, normalWorld } from '../../../nodes/Nodes.js';
5
+ import { NodeFrame, objectGroup, renderGroup, frameGroup, cubeTexture, texture, rangeFog, densityFog, reference, toneMapping, viewportBottomLeft, normalWorld, pmremTexture } from '../../../nodes/Nodes.js';
6
6
 
7
7
  class Nodes extends DataMap {
8
8
 
@@ -114,6 +114,7 @@ class Nodes extends DataMap {
114
114
  nodeBuilder.environmentNode = this.getEnvironmentNode( renderObject.scene );
115
115
  nodeBuilder.fogNode = this.getFogNode( renderObject.scene );
116
116
  nodeBuilder.toneMappingNode = this.getToneMappingNode();
117
+ nodeBuilder.clippingContext = renderObject.clippingContext;
117
118
  nodeBuilder.build();
118
119
 
119
120
  nodeBuilderState = this._createNodeBuilderState( nodeBuilder );
@@ -274,7 +275,7 @@ class Nodes extends DataMap {
274
275
 
275
276
  if ( rendererData.toneMapping !== rendererToneMapping ) {
276
277
 
277
- const rendererToneMappingNode = rendererData.rendererToneMappingNode || toneMapping( rendererToneMapping, reference( 'toneMappingExposure', 'float', renderer ) );
278
+ const rendererToneMappingNode = rendererData.rendererToneMappingNode || toneMapping( rendererToneMapping );
278
279
  rendererToneMappingNode.toneMapping = rendererToneMapping;
279
280
 
280
281
  rendererData.rendererToneMappingNode = rendererToneMappingNode;
@@ -304,26 +305,13 @@ class Nodes extends DataMap {
304
305
 
305
306
  let backgroundNode = null;
306
307
 
307
- if ( background.isCubeTexture === true ) {
308
+ if ( background.isCubeTexture === true || ( background.mapping === EquirectangularReflectionMapping || background.mapping === EquirectangularRefractionMapping ) ) {
308
309
 
309
- backgroundNode = cubeTexture( background, normalWorld );
310
+ backgroundNode = pmremTexture( background, normalWorld );
310
311
 
311
312
  } else if ( background.isTexture === true ) {
312
313
 
313
- let nodeUV = null;
314
-
315
- if ( background.mapping === EquirectangularReflectionMapping || background.mapping === EquirectangularRefractionMapping ) {
316
-
317
- nodeUV = equirectUV();
318
- background.flipY = false;
319
-
320
- } else {
321
-
322
- nodeUV = viewportBottomLeft;
323
-
324
- }
325
-
326
- backgroundNode = texture( background, nodeUV ).setUpdateMatrix( true );
314
+ backgroundNode = texture( background, viewportBottomLeft ).setUpdateMatrix( true );
327
315
 
328
316
  } else if ( background.isColor !== true ) {
329
317
 
@@ -10,6 +10,7 @@ import WebGLTextureUtils from './utils/WebGLTextureUtils.js';
10
10
  import WebGLExtensions from './utils/WebGLExtensions.js';
11
11
  import WebGLCapabilities from './utils/WebGLCapabilities.js';
12
12
  import { GLFeatureName } from './utils/WebGLConstants.js';
13
+ import { WebGLBufferRenderer } from './WebGLBufferRenderer.js';
13
14
 
14
15
  //
15
16
 
@@ -39,14 +40,18 @@ class WebGLBackend extends Backend {
39
40
  this.capabilities = new WebGLCapabilities( this );
40
41
  this.attributeUtils = new WebGLAttributeUtils( this );
41
42
  this.textureUtils = new WebGLTextureUtils( this );
43
+ this.bufferRenderer = new WebGLBufferRenderer( this );
44
+
42
45
  this.state = new WebGLState( this );
43
46
  this.utils = new WebGLUtils( this );
44
47
 
45
48
  this.vaoCache = {};
46
49
  this.transformFeedbackCache = {};
47
50
  this.discard = false;
51
+ this.trackTimestamp = ( parameters.trackTimestamp === true );
48
52
 
49
53
  this.extensions.get( 'EXT_color_buffer_float' );
54
+ this.disjoint = this.extensions.get( 'EXT_disjoint_timer_query_webgl2' );
50
55
  this.parallel = this.extensions.get( 'KHR_parallel_shader_compile' );
51
56
  this._currentContext = null;
52
57
 
@@ -64,6 +69,96 @@ class WebGLBackend extends Backend {
64
69
 
65
70
  }
66
71
 
72
+
73
+ initTimestampQuery( renderContext ) {
74
+
75
+ if ( ! this.disjoint || ! this.trackTimestamp ) return;
76
+
77
+ const renderContextData = this.get( renderContext );
78
+
79
+ if ( this.queryRunning ) {
80
+
81
+ if ( ! renderContextData.queryQueue ) renderContextData.queryQueue = [];
82
+ renderContextData.queryQueue.push( renderContext );
83
+ return;
84
+
85
+ }
86
+
87
+ if ( renderContextData.activeQuery ) {
88
+
89
+ this.gl.endQuery( this.disjoint.TIME_ELAPSED_EXT );
90
+ renderContextData.activeQuery = null;
91
+
92
+ }
93
+
94
+ renderContextData.activeQuery = this.gl.createQuery();
95
+
96
+ if ( renderContextData.activeQuery !== null ) {
97
+
98
+ this.gl.beginQuery( this.disjoint.TIME_ELAPSED_EXT, renderContextData.activeQuery );
99
+ this.queryRunning = true;
100
+
101
+ }
102
+
103
+ }
104
+
105
+ // timestamp utils
106
+
107
+ prepareTimestampBuffer( renderContext ) {
108
+
109
+ if ( ! this.disjoint || ! this.trackTimestamp ) return;
110
+
111
+ const renderContextData = this.get( renderContext );
112
+
113
+ if ( renderContextData.activeQuery ) {
114
+
115
+ this.gl.endQuery( this.disjoint.TIME_ELAPSED_EXT );
116
+
117
+ if ( ! renderContextData.gpuQueries ) renderContextData.gpuQueries = [];
118
+ renderContextData.gpuQueries.push( { query: renderContextData.activeQuery } );
119
+ renderContextData.activeQuery = null;
120
+ this.queryRunning = false;
121
+
122
+ if ( renderContextData.queryQueue && renderContextData.queryQueue.length > 0 ) {
123
+
124
+ const nextRenderContext = renderContextData.queryQueue.shift();
125
+ this.initTimestampQuery( nextRenderContext );
126
+
127
+ }
128
+
129
+ }
130
+
131
+ }
132
+
133
+ async resolveTimestampAsync( renderContext, type = 'render' ) {
134
+
135
+ if ( ! this.disjoint || ! this.trackTimestamp ) return;
136
+
137
+ const renderContextData = this.get( renderContext );
138
+
139
+ if ( ! renderContextData.gpuQueries ) renderContextData.gpuQueries = [];
140
+
141
+ for ( let i = 0; i < renderContextData.gpuQueries.length; i ++ ) {
142
+
143
+ const queryInfo = renderContextData.gpuQueries[ i ];
144
+ const available = this.gl.getQueryParameter( queryInfo.query, this.gl.QUERY_RESULT_AVAILABLE );
145
+ const disjoint = this.gl.getParameter( this.disjoint.GPU_DISJOINT_EXT );
146
+
147
+ if ( available && ! disjoint ) {
148
+
149
+ const elapsed = this.gl.getQueryParameter( queryInfo.query, this.gl.QUERY_RESULT );
150
+ const duration = Number( elapsed ) / 1000000; // Convert nanoseconds to milliseconds
151
+ this.gl.deleteQuery( queryInfo.query );
152
+ renderContextData.gpuQueries.splice( i, 1 ); // Remove the processed query
153
+ i --;
154
+ this.renderer.info.updateTimestamp( type, duration );
155
+
156
+ }
157
+
158
+ }
159
+
160
+ }
161
+
67
162
  getContext() {
68
163
 
69
164
  return this.gl;
@@ -78,13 +173,14 @@ class WebGLBackend extends Backend {
78
173
  //
79
174
 
80
175
  //
176
+ this.initTimestampQuery( renderContext );
81
177
 
82
178
  renderContextData.previousContext = this._currentContext;
83
179
  this._currentContext = renderContext;
84
180
 
85
181
  this._setFramebuffer( renderContext );
86
182
 
87
- this.clear( renderContext.clearColor, renderContext.clearDepth, renderContext.clearStencil, renderContext );
183
+ this.clear( renderContext.clearColor, renderContext.clearDepth, renderContext.clearStencil, renderContext, false );
88
184
 
89
185
  //
90
186
  if ( renderContext.viewport ) {
@@ -219,6 +315,7 @@ class WebGLBackend extends Backend {
219
315
 
220
316
  }
221
317
 
318
+ this.prepareTimestampBuffer( renderContext );
222
319
 
223
320
  }
224
321
 
@@ -313,7 +410,7 @@ class WebGLBackend extends Backend {
313
410
 
314
411
  }
315
412
 
316
- clear( color, depth, stencil, descriptor = null ) {
413
+ clear( color, depth, stencil, descriptor = null, setFrameBuffer = true ) {
317
414
 
318
415
  const { gl } = this;
319
416
 
@@ -336,7 +433,7 @@ class WebGLBackend extends Backend {
336
433
 
337
434
  if ( clear !== 0 ) {
338
435
 
339
- const clearColor = descriptor.clearColorValue;
436
+ const clearColor = descriptor.clearColorValue || this.getClearColor();
340
437
 
341
438
  if ( depth ) this.state.setDepthMask( true );
342
439
 
@@ -347,6 +444,8 @@ class WebGLBackend extends Backend {
347
444
 
348
445
  } else {
349
446
 
447
+ if ( setFrameBuffer ) this._setFramebuffer( descriptor );
448
+
350
449
  if ( color ) {
351
450
 
352
451
  for ( let i = 0; i < descriptor.textures.length; i ++ ) {
@@ -377,11 +476,12 @@ class WebGLBackend extends Backend {
377
476
 
378
477
  }
379
478
 
380
- beginCompute( /*computeGroup*/ ) {
479
+ beginCompute( computeGroup ) {
381
480
 
382
481
  const gl = this.gl;
383
482
 
384
483
  gl.bindFramebuffer( gl.FRAMEBUFFER, null );
484
+ this.initTimestampQuery( computeGroup );
385
485
 
386
486
  }
387
487
 
@@ -422,21 +522,39 @@ class WebGLBackend extends Backend {
422
522
  gl.bindTransformFeedback( gl.TRANSFORM_FEEDBACK, transformFeedbackGPU );
423
523
  gl.beginTransformFeedback( gl.POINTS );
424
524
 
425
- gl.drawArraysInstanced( gl.POINTS, 0, 1, computeNode.count );
525
+ if ( attributes[ 0 ].isStorageInstancedBufferAttribute ) {
526
+
527
+ gl.drawArraysInstanced( gl.POINTS, 0, 1, computeNode.count );
528
+
529
+ } else {
530
+
531
+ gl.drawArrays( gl.POINTS, 0, computeNode.count );
532
+
533
+ }
426
534
 
427
535
  gl.endTransformFeedback();
428
536
  gl.bindTransformFeedback( gl.TRANSFORM_FEEDBACK, null );
429
537
 
430
538
  // switch active buffers
539
+
431
540
  for ( let i = 0; i < transformBuffers.length; i ++ ) {
432
541
 
433
- transformBuffers[ i ].switchBuffers();
542
+ const dualAttributeData = transformBuffers[ i ];
543
+
544
+ if ( dualAttributeData.pbo ) {
545
+
546
+ this.textureUtils.copyBufferToTexture( dualAttributeData.transformBuffer, dualAttributeData.pbo );
547
+
548
+ }
549
+
550
+ dualAttributeData.switchBuffers();
551
+
434
552
 
435
553
  }
436
554
 
437
555
  }
438
556
 
439
- finishCompute( /*computeGroup*/ ) {
557
+ finishCompute( computeGroup ) {
440
558
 
441
559
  const gl = this.gl;
442
560
 
@@ -444,6 +562,8 @@ class WebGLBackend extends Backend {
444
562
 
445
563
  gl.disable( gl.RASTERIZER_DISCARD );
446
564
 
565
+ this.prepareTimestampBuffer( computeGroup );
566
+
447
567
  }
448
568
 
449
569
  draw( renderObject, info ) {
@@ -527,21 +647,22 @@ class WebGLBackend extends Backend {
527
647
 
528
648
  //
529
649
 
530
- let mode;
531
- if ( object.isPoints ) mode = gl.POINTS;
532
- else if ( object.isLineSegments ) mode = gl.LINES;
533
- else if ( object.isLine ) mode = gl.LINE_STRIP;
534
- else if ( object.isLineLoop ) mode = gl.LINE_LOOP;
650
+ const renderer = this.bufferRenderer;
651
+
652
+ if ( object.isPoints ) renderer.mode = gl.POINTS;
653
+ else if ( object.isLineSegments ) renderer.mode = gl.LINES;
654
+ else if ( object.isLine ) renderer.mode = gl.LINE_STRIP;
655
+ else if ( object.isLineLoop ) renderer.mode = gl.LINE_LOOP;
535
656
  else {
536
657
 
537
658
  if ( material.wireframe === true ) {
538
659
 
539
660
  state.setLineWidth( material.wireframeLinewidth * this.renderer.getPixelRatio() );
540
- mode = gl.LINES;
661
+ renderer.mode = gl.LINES;
541
662
 
542
663
  } else {
543
664
 
544
- mode = gl.TRIANGLES;
665
+ renderer.mode = gl.TRIANGLES;
545
666
 
546
667
  }
547
668
 
@@ -549,46 +670,63 @@ class WebGLBackend extends Backend {
549
670
 
550
671
  //
551
672
 
552
- const instanceCount = this.getInstanceCount( renderObject );
673
+
674
+ let count;
675
+
676
+ renderer.object = object;
553
677
 
554
678
  if ( index !== null ) {
555
679
 
556
680
  const indexData = this.get( index );
557
681
  const indexCount = ( drawRange.count !== Infinity ) ? drawRange.count : index.count;
558
682
 
559
- if ( instanceCount > 1 ) {
683
+ renderer.index = index.count;
684
+ renderer.type = indexData.type;
560
685
 
561
- gl.drawElementsInstanced( mode, index.count, indexData.type, firstVertex, instanceCount );
686
+ count = indexCount;
562
687
 
563
- } else {
688
+ } else {
564
689
 
565
- gl.drawElements( mode, index.count, indexData.type, firstVertex );
690
+ renderer.index = 0;
566
691
 
567
- }
692
+ const vertexCount = ( drawRange.count !== Infinity ) ? drawRange.count : geometry.attributes.position.count;
568
693
 
569
- info.update( object, indexCount, 1 );
694
+ count = vertexCount;
570
695
 
571
- } else {
696
+ }
697
+
698
+ const instanceCount = this.getInstanceCount( renderObject );
572
699
 
573
- const positionAttribute = geometry.attributes.position;
574
- const vertexCount = ( drawRange.count !== Infinity ) ? drawRange.count : positionAttribute.count;
700
+ if ( object.isBatchedMesh ) {
575
701
 
576
702
  if ( instanceCount > 1 ) {
577
703
 
578
- gl.drawArraysInstanced( mode, 0, vertexCount, instanceCount );
704
+ // TODO: Better support with InstancedBatchedMesh
705
+ if ( object._multiDrawInstances === undefined ) {
706
+
707
+ object._multiDrawInstances = new Int32Array( object._maxGeometryCount );
708
+
709
+ }
710
+
711
+ object._multiDrawInstances.fill( instanceCount );
712
+
713
+ renderer.renderMultiDrawInstances( object._multiDrawStarts, object._multiDrawCounts, object._multiDrawCount, object._multiDrawInstances );
579
714
 
580
715
  } else {
581
716
 
582
- gl.drawArrays( mode, 0, vertexCount );
717
+ renderer.renderMultiDraw( object._multiDrawStarts, object._multiDrawCounts, object._multiDrawCount );
583
718
 
584
719
  }
585
720
 
586
- //gl.drawArrays( mode, vertexCount, gl.UNSIGNED_SHORT, firstVertex );
721
+ } else if ( instanceCount > 1 ) {
587
722
 
588
- info.update( object, vertexCount, 1 );
723
+ renderer.renderInstances( firstVertex, count, instanceCount );
589
724
 
590
- }
725
+ } else {
726
+
727
+ renderer.render( firstVertex, count );
591
728
 
729
+ }
592
730
  //
593
731
 
594
732
  gl.bindVertexArray( null );
@@ -1007,6 +1145,12 @@ class WebGLBackend extends Backend {
1007
1145
 
1008
1146
  }
1009
1147
 
1148
+ copyTextureToTexture( position, srcTexture, dstTexture, level ) {
1149
+
1150
+ this.textureUtils.copyTextureToTexture( position, srcTexture, dstTexture, level );
1151
+
1152
+ }
1153
+
1010
1154
  copyFramebufferToTexture( texture, renderContext ) {
1011
1155
 
1012
1156
  this.textureUtils.copyFramebufferToTexture( texture, renderContext );
@@ -1222,7 +1366,7 @@ class WebGLBackend extends Backend {
1222
1366
  gl.bindBuffer( gl.ARRAY_BUFFER, attributeData.bufferGPU );
1223
1367
  gl.enableVertexAttribArray( i );
1224
1368
 
1225
- if ( attribute.isStorageBufferAttribute ) staticVao = false;
1369
+ if ( attribute.isStorageBufferAttribute || attribute.isStorageInstancedBufferAttribute ) staticVao = false;
1226
1370
 
1227
1371
  let stride, offset;
1228
1372
 
@@ -0,0 +1,141 @@
1
+ class WebGLBufferRenderer {
2
+
3
+ constructor( backend ) {
4
+
5
+ this.gl = backend.gl;
6
+ this.extensions = backend.extensions;
7
+ this.info = backend.renderer.info;
8
+ this.mode = null;
9
+ this.index = 0;
10
+ this.type = null;
11
+ this.object = null;
12
+
13
+ }
14
+
15
+ render( start, count ) {
16
+
17
+ const { gl, mode, object, type, info, index } = this;
18
+
19
+ if ( index !== 0 ) {
20
+
21
+ gl.drawElements( mode, count, type, start );
22
+
23
+ } else {
24
+
25
+ gl.drawArrays( mode, start, count );
26
+
27
+ }
28
+
29
+ info.update( object, count, mode, 1 );
30
+
31
+ }
32
+
33
+ renderInstances( start, count, primcount ) {
34
+
35
+ const { gl, mode, type, index, object, info } = this;
36
+
37
+ if ( primcount === 0 ) return;
38
+
39
+ if ( index !== 0 ) {
40
+
41
+ gl.drawElementsInstanced( mode, count, type, start, primcount );
42
+
43
+ } else {
44
+
45
+ gl.drawArraysInstanced( mode, start, count, primcount );
46
+
47
+ }
48
+
49
+ info.update( object, count, mode, primcount );
50
+
51
+ }
52
+
53
+ renderMultiDraw( starts, counts, drawCount ) {
54
+
55
+ const { extensions, mode, object, info } = this;
56
+
57
+ if ( drawCount === 0 ) return;
58
+
59
+ const extension = extensions.get( 'WEBGL_multi_draw' );
60
+
61
+ if ( extension === null ) {
62
+
63
+ for ( let i = 0; i < drawCount; i ++ ) {
64
+
65
+ this.render( starts[ i ], counts[ i ] );
66
+
67
+ }
68
+
69
+ } else {
70
+
71
+ if ( this.index !== 0 ) {
72
+
73
+ extension.multiDrawElementsWEBGL( mode, counts, 0, this.type, starts, 0, drawCount );
74
+
75
+ } else {
76
+
77
+ extension.multiDrawArraysWEBGL( mode, starts, 0, counts, 0, drawCount );
78
+
79
+ }
80
+
81
+ let elementCount = 0;
82
+ for ( let i = 0; i < drawCount; i ++ ) {
83
+
84
+ elementCount += counts[ i ];
85
+
86
+ }
87
+
88
+ info.update( object, elementCount, mode, 1 );
89
+
90
+ }
91
+
92
+ }
93
+
94
+ renderMultiDrawInstances( starts, counts, drawCount, primcount ) {
95
+
96
+ const { extensions, mode, object, info } = this;
97
+
98
+ if ( drawCount === 0 ) return;
99
+
100
+ const extension = extensions.get( 'WEBGL_multi_draw' );
101
+
102
+ if ( extension === null ) {
103
+
104
+ for ( let i = 0; i < drawCount; i ++ ) {
105
+
106
+ this.renderInstances( starts[ i ], counts[ i ], primcount[ i ] );
107
+
108
+ }
109
+
110
+ } else {
111
+
112
+ if ( this.index !== 0 ) {
113
+
114
+ extension.multiDrawElementsInstancedWEBGL( mode, counts, 0, this.type, starts, 0, primcount, 0, drawCount );
115
+
116
+ } else {
117
+
118
+ extension.multiDrawArraysInstancedWEBGL( mode, starts, 0, counts, 0, primcount, 0, drawCount );
119
+
120
+ }
121
+
122
+ let elementCount = 0;
123
+
124
+ for ( let i = 0; i < drawCount; i ++ ) {
125
+
126
+ elementCount += counts[ i ];
127
+
128
+ }
129
+
130
+ info.update( object, elementCount, mode, primcount );
131
+
132
+ }
133
+
134
+ }
135
+
136
+ //
137
+
138
+ }
139
+
140
+
141
+ export { WebGLBufferRenderer };