super-three 0.162.0 → 0.164.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 (187) hide show
  1. package/build/three.cjs +847 -1226
  2. package/build/three.module.js +846 -1225
  3. package/build/three.module.min.js +2 -2
  4. package/examples/jsm/animation/CCDIKSolver.js +4 -2
  5. package/examples/jsm/controls/TransformControls.js +3 -3
  6. package/examples/jsm/exporters/GLTFExporter.js +66 -5
  7. package/examples/jsm/exporters/USDZExporter.js +22 -1
  8. package/examples/jsm/geometries/TextGeometry.js +10 -2
  9. package/examples/jsm/interactive/HTMLMesh.js +7 -9
  10. package/examples/jsm/libs/draco/README.md +2 -2
  11. package/examples/jsm/libs/fflate.module.js +694 -496
  12. package/examples/jsm/lines/LineMaterial.js +0 -2
  13. package/examples/jsm/loaders/3MFLoader.js +2 -0
  14. package/examples/jsm/loaders/EXRLoader.js +351 -97
  15. package/examples/jsm/loaders/FBXLoader.js +1 -1
  16. package/examples/jsm/loaders/GLTFLoader.js +59 -0
  17. package/examples/jsm/loaders/KTX2Loader.js +3 -10
  18. package/examples/jsm/loaders/LUT3dlLoader.js +0 -15
  19. package/examples/jsm/loaders/LUTCubeLoader.js +0 -14
  20. package/examples/jsm/loaders/LUTImageLoader.js +0 -14
  21. package/examples/jsm/loaders/RGBMLoader.js +16 -0
  22. package/examples/jsm/loaders/VRMLLoader.js +1 -1
  23. package/examples/jsm/loaders/lwo/IFFParser.js +8 -5
  24. package/examples/jsm/materials/MeshGouraudMaterial.js +7 -1
  25. package/examples/jsm/math/Octree.js +26 -20
  26. package/examples/jsm/misc/GPUComputationRenderer.js +0 -6
  27. package/examples/jsm/nodes/Nodes.js +10 -4
  28. package/examples/jsm/nodes/accessors/AccessorsUtils.js +16 -1
  29. package/examples/jsm/nodes/accessors/BatchNode.js +78 -0
  30. package/examples/jsm/nodes/accessors/ClippingNode.js +3 -2
  31. package/examples/jsm/nodes/accessors/InstanceNode.js +25 -2
  32. package/examples/jsm/nodes/accessors/MaterialNode.js +107 -3
  33. package/examples/jsm/nodes/accessors/MaterialReferenceNode.js +1 -1
  34. package/examples/jsm/nodes/accessors/MorphNode.js +13 -3
  35. package/examples/jsm/nodes/accessors/NormalNode.js +12 -2
  36. package/examples/jsm/nodes/accessors/ReferenceNode.js +1 -1
  37. package/examples/jsm/nodes/accessors/RendererReferenceNode.js +29 -0
  38. package/examples/jsm/nodes/accessors/StorageBufferNode.js +9 -0
  39. package/examples/jsm/nodes/accessors/TextureNode.js +51 -10
  40. package/examples/jsm/nodes/accessors/TextureSizeNode.js +1 -1
  41. package/examples/jsm/nodes/code/FunctionNode.js +0 -8
  42. package/examples/jsm/nodes/core/Node.js +63 -4
  43. package/examples/jsm/nodes/core/NodeBuilder.js +26 -25
  44. package/examples/jsm/nodes/core/NodeFrame.js +10 -10
  45. package/examples/jsm/nodes/core/NodeUtils.js +2 -2
  46. package/examples/jsm/nodes/core/OutputStructNode.js +2 -1
  47. package/examples/jsm/nodes/core/PropertyNode.js +10 -0
  48. package/examples/jsm/nodes/core/UniformNode.js +20 -0
  49. package/examples/jsm/nodes/display/BumpMapNode.js +7 -26
  50. package/examples/jsm/nodes/display/FrontFacingNode.js +13 -0
  51. package/examples/jsm/nodes/display/PassNode.js +17 -1
  52. package/examples/jsm/nodes/display/ToneMappingNode.js +8 -4
  53. package/examples/jsm/nodes/display/ViewportDepthNode.js +1 -1
  54. package/examples/jsm/nodes/display/ViewportNode.js +4 -2
  55. package/examples/jsm/nodes/display/ViewportSharedTextureNode.js +6 -0
  56. package/examples/jsm/nodes/display/ViewportTextureNode.js +4 -1
  57. package/examples/jsm/nodes/fog/FogExp2Node.js +4 -5
  58. package/examples/jsm/nodes/fog/FogNode.js +13 -3
  59. package/examples/jsm/nodes/fog/FogRangeNode.js +4 -3
  60. package/examples/jsm/nodes/functions/BSDF/BRDF_GGX.js +26 -7
  61. package/examples/jsm/nodes/functions/BSDF/D_GGX_Anisotropic.js +28 -0
  62. package/examples/jsm/nodes/functions/BSDF/V_GGX_SmithCorrelated.js +1 -3
  63. package/examples/jsm/nodes/functions/BSDF/V_GGX_SmithCorrelated_Anisotropic.js +29 -0
  64. package/examples/jsm/nodes/functions/PhongLightingModel.js +1 -1
  65. package/examples/jsm/nodes/functions/PhysicalLightingModel.js +164 -10
  66. package/examples/jsm/nodes/functions/ShadowMaskModel.js +31 -0
  67. package/examples/jsm/nodes/lighting/AnalyticLightNode.js +19 -5
  68. package/examples/jsm/nodes/lighting/DirectionalLightNode.js +2 -1
  69. package/examples/jsm/nodes/lighting/EnvironmentNode.js +22 -70
  70. package/examples/jsm/nodes/lighting/IrradianceNode.js +24 -0
  71. package/examples/jsm/nodes/lighting/LightsNode.js +11 -1
  72. package/examples/jsm/nodes/lighting/PointLightNode.js +2 -1
  73. package/examples/jsm/nodes/lighting/SpotLightNode.js +2 -1
  74. package/examples/jsm/nodes/materials/Line2NodeMaterial.js +10 -6
  75. package/examples/jsm/nodes/materials/Materials.js +1 -0
  76. package/examples/jsm/nodes/materials/MeshNormalNodeMaterial.js +0 -2
  77. package/examples/jsm/nodes/materials/MeshPhongNodeMaterial.js +2 -2
  78. package/examples/jsm/nodes/materials/MeshPhysicalNodeMaterial.js +76 -5
  79. package/examples/jsm/nodes/materials/MeshStandardNodeMaterial.js +11 -4
  80. package/examples/jsm/nodes/materials/NodeMaterial.js +55 -43
  81. package/examples/jsm/nodes/materials/ShadowNodeMaterial.js +34 -0
  82. package/examples/jsm/nodes/pmrem/PMREMNode.js +193 -0
  83. package/examples/jsm/nodes/pmrem/PMREMUtils.js +288 -0
  84. package/examples/jsm/nodes/shadernode/ShaderNode.js +3 -9
  85. package/examples/jsm/nodes/utils/EquirectUVNode.js +1 -1
  86. package/examples/jsm/objects/QuadMesh.js +7 -23
  87. package/examples/jsm/physics/JoltPhysics.js +281 -0
  88. package/examples/jsm/physics/RapierPhysics.js +4 -4
  89. package/examples/jsm/postprocessing/GlitchPass.js +0 -3
  90. package/examples/jsm/postprocessing/LUTPass.js +5 -71
  91. package/examples/jsm/postprocessing/RenderTransitionPass.js +193 -0
  92. package/examples/jsm/postprocessing/SAOPass.js +0 -1
  93. package/examples/jsm/postprocessing/SSAOPass.js +0 -3
  94. package/examples/jsm/renderers/common/Animation.js +3 -0
  95. package/examples/jsm/renderers/common/Background.js +8 -8
  96. package/examples/jsm/renderers/common/ClippingContext.js +1 -1
  97. package/examples/jsm/renderers/common/Info.js +11 -19
  98. package/examples/jsm/renderers/common/PostProcessing.js +12 -4
  99. package/examples/jsm/renderers/common/RenderContext.js +1 -1
  100. package/examples/jsm/renderers/common/RenderList.js +1 -1
  101. package/examples/jsm/renderers/common/RenderObject.js +47 -5
  102. package/examples/jsm/renderers/common/RenderObjects.js +1 -1
  103. package/examples/jsm/renderers/common/Renderer.js +153 -21
  104. package/examples/jsm/renderers/common/Textures.js +1 -1
  105. package/examples/jsm/renderers/common/extras/PMREMGenerator.js +773 -0
  106. package/examples/jsm/renderers/common/nodes/Nodes.js +34 -63
  107. package/examples/jsm/renderers/webgl/WebGLBackend.js +146 -36
  108. package/examples/jsm/renderers/webgl/WebGLBufferRenderer.js +145 -0
  109. package/examples/jsm/renderers/webgl/nodes/GLSLNodeBuilder.js +9 -3
  110. package/examples/jsm/renderers/webgl/utils/WebGLAttributeUtils.js +1 -1
  111. package/examples/jsm/renderers/webgl/utils/WebGLConstants.js +1 -0
  112. package/examples/jsm/renderers/webgl/utils/WebGLTextureUtils.js +64 -7
  113. package/examples/jsm/renderers/webgl/utils/WebGLUtils.js +6 -23
  114. package/examples/jsm/renderers/webgpu/WebGPUBackend.js +77 -60
  115. package/examples/jsm/renderers/webgpu/nodes/WGSLNodeBuilder.js +21 -4
  116. package/examples/jsm/renderers/webgpu/utils/WebGPUAttributeUtils.js +29 -1
  117. package/examples/jsm/renderers/webgpu/utils/WebGPUBindingUtils.js +18 -4
  118. package/examples/jsm/renderers/webgpu/utils/WebGPUTextureUtils.js +92 -18
  119. package/examples/jsm/transpiler/GLSLDecoder.js +1 -1
  120. package/examples/jsm/transpiler/ShaderToyDecoder.js +1 -1
  121. package/examples/jsm/utils/GPUStatsPanel.js +10 -45
  122. package/examples/jsm/utils/SceneUtils.js +60 -1
  123. package/examples/jsm/utils/TextureUtils.js +1 -1
  124. package/examples/jsm/webxr/OculusHandModel.js +3 -2
  125. package/examples/jsm/webxr/XRHandModelFactory.js +4 -2
  126. package/package.json +1 -1
  127. package/src/Three.js +0 -1
  128. package/src/animation/AnimationClip.js +1 -1
  129. package/src/constants.js +3 -3
  130. package/src/core/Object3D.js +10 -7
  131. package/src/core/RenderTarget.js +8 -0
  132. package/src/extras/PMREMGenerator.js +21 -11
  133. package/src/loaders/FileLoader.js +1 -1
  134. package/src/loaders/MaterialLoader.js +1 -0
  135. package/src/loaders/ObjectLoader.js +2 -0
  136. package/src/materials/Material.js +2 -0
  137. package/src/materials/MeshPhysicalMaterial.js +20 -0
  138. package/src/materials/ShaderMaterial.js +0 -4
  139. package/src/math/Spherical.js +4 -5
  140. package/src/objects/BatchedMesh.js +27 -3
  141. package/src/objects/InstancedMesh.js +10 -0
  142. package/src/objects/Line.js +66 -43
  143. package/src/renderers/WebGLRenderer.js +130 -158
  144. package/src/renderers/shaders/ShaderChunk/lights_physical_fragment.glsl.js +6 -0
  145. package/src/renderers/shaders/ShaderChunk/lights_physical_pars_fragment.glsl.js +1 -0
  146. package/src/renderers/shaders/ShaderChunk/logdepthbuf_fragment.glsl.js +2 -2
  147. package/src/renderers/shaders/ShaderChunk/logdepthbuf_pars_fragment.glsl.js +1 -1
  148. package/src/renderers/shaders/ShaderChunk/logdepthbuf_pars_vertex.glsl.js +2 -10
  149. package/src/renderers/shaders/ShaderChunk/logdepthbuf_vertex.glsl.js +2 -16
  150. package/src/renderers/shaders/ShaderChunk/shadowmap_pars_fragment.glsl.js +32 -22
  151. package/src/renderers/shaders/ShaderChunk/tonemapping_pars_fragment.glsl.js +17 -9
  152. package/src/renderers/shaders/ShaderChunk/transmission_fragment.glsl.js +1 -1
  153. package/src/renderers/shaders/ShaderChunk/transmission_pars_fragment.glsl.js +47 -13
  154. package/src/renderers/shaders/ShaderChunk.js +0 -2
  155. package/src/renderers/shaders/ShaderLib/meshphysical.glsl.js +4 -0
  156. package/src/renderers/shaders/ShaderLib.js +2 -1
  157. package/src/renderers/shaders/UniformsUtils.js +10 -1
  158. package/src/renderers/webgl/WebGLAttributes.js +6 -33
  159. package/src/renderers/webgl/WebGLBackground.js +18 -3
  160. package/src/renderers/webgl/WebGLBindingStates.js +14 -51
  161. package/src/renderers/webgl/WebGLBufferRenderer.js +35 -21
  162. package/src/renderers/webgl/WebGLCapabilities.js +35 -13
  163. package/src/renderers/webgl/WebGLCubeUVMaps.js +10 -6
  164. package/src/renderers/webgl/WebGLExtensions.js +4 -19
  165. package/src/renderers/webgl/WebGLIndexedBufferRenderer.js +35 -21
  166. package/src/renderers/webgl/WebGLLights.js +6 -32
  167. package/src/renderers/webgl/WebGLMaterials.js +8 -3
  168. package/src/renderers/webgl/WebGLMorphtargets.js +79 -217
  169. package/src/renderers/webgl/WebGLProgram.js +21 -52
  170. package/src/renderers/webgl/WebGLPrograms.js +24 -31
  171. package/src/renderers/webgl/WebGLRenderStates.js +13 -7
  172. package/src/renderers/webgl/WebGLShadowMap.js +25 -25
  173. package/src/renderers/webgl/WebGLState.js +15 -59
  174. package/src/renderers/webgl/WebGLTextures.js +138 -292
  175. package/src/renderers/webgl/WebGLUniformsGroups.js +1 -1
  176. package/src/renderers/webgl/WebGLUtils.js +9 -78
  177. package/src/renderers/webxr/WebXRDepthSensing.js +2 -3
  178. package/src/renderers/webxr/WebXRManager.js +4 -6
  179. package/src/scenes/Scene.js +7 -1
  180. package/src/textures/Texture.js +11 -1
  181. package/examples/jsm/nodes/utils/SpecularMIPLevelNode.js +0 -37
  182. package/examples/jsm/renderers/webgl-legacy/nodes/GLSL1NodeBuilder.js +0 -320
  183. package/examples/jsm/renderers/webgl-legacy/nodes/SlotNode.js +0 -26
  184. package/examples/jsm/renderers/webgl-legacy/nodes/WebGLNodeBuilder.js +0 -794
  185. package/examples/jsm/renderers/webgl-legacy/nodes/WebGLNodes.js +0 -51
  186. package/src/renderers/WebGL1Renderer.js +0 -7
  187. package/src/renderers/shaders/ShaderChunk/lightmap_fragment.glsl.js +0 -10
@@ -1,8 +1,8 @@
1
1
  import DataMap from '../DataMap.js';
2
2
  import ChainMap from '../ChainMap.js';
3
3
  import NodeBuilderState from './NodeBuilderState.js';
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';
4
+ import { EquirectangularReflectionMapping, EquirectangularRefractionMapping, NoToneMapping, SRGBColorSpace } from 'three';
5
+ import { NodeFrame, vec4, objectGroup, renderGroup, frameGroup, cubeTexture, texture, rangeFog, densityFog, reference, viewportBottomLeft, normalWorld, pmremTexture, viewportTopLeft } from '../../../nodes/Nodes.js';
6
6
 
7
7
  class Nodes extends DataMap {
8
8
 
@@ -113,7 +113,6 @@ class Nodes extends DataMap {
113
113
  nodeBuilder.lightsNode = renderObject.lightsNode;
114
114
  nodeBuilder.environmentNode = this.getEnvironmentNode( renderObject.scene );
115
115
  nodeBuilder.fogNode = this.getFogNode( renderObject.scene );
116
- nodeBuilder.toneMappingNode = this.getToneMappingNode();
117
116
  nodeBuilder.clippingContext = renderObject.clippingContext;
118
117
  nodeBuilder.build();
119
118
 
@@ -206,14 +205,6 @@ class Nodes extends DataMap {
206
205
 
207
206
  }
208
207
 
209
- getToneMappingNode() {
210
-
211
- if ( this.isToneMappingState === false ) return null;
212
-
213
- return this.renderer.toneMappingNode || this.get( this.renderer ).toneMappingNode || null;
214
-
215
- }
216
-
217
208
  getCacheKey( scene, lightsNode ) {
218
209
 
219
210
  const chain = [ scene, lightsNode ];
@@ -225,14 +216,12 @@ class Nodes extends DataMap {
225
216
 
226
217
  const environmentNode = this.getEnvironmentNode( scene );
227
218
  const fogNode = this.getFogNode( scene );
228
- const toneMappingNode = this.getToneMappingNode();
229
219
 
230
220
  const cacheKey = [];
231
221
 
232
222
  if ( lightsNode ) cacheKey.push( lightsNode.getCacheKey() );
233
223
  if ( environmentNode ) cacheKey.push( environmentNode.getCacheKey() );
234
224
  if ( fogNode ) cacheKey.push( fogNode.getCacheKey() );
235
- if ( toneMappingNode ) cacheKey.push( toneMappingNode.getCacheKey() );
236
225
 
237
226
  cacheKeyData = {
238
227
  callId,
@@ -252,45 +241,12 @@ class Nodes extends DataMap {
252
241
  this.updateEnvironment( scene );
253
242
  this.updateFog( scene );
254
243
  this.updateBackground( scene );
255
- this.updateToneMapping();
256
244
 
257
245
  }
258
246
 
259
247
  get isToneMappingState() {
260
248
 
261
- const renderer = this.renderer;
262
- const renderTarget = renderer.getRenderTarget();
263
-
264
- return renderTarget && renderTarget.isCubeRenderTarget ? false : true;
265
-
266
- }
267
-
268
- updateToneMapping() {
269
-
270
- const renderer = this.renderer;
271
- const rendererData = this.get( renderer );
272
- const rendererToneMapping = renderer.toneMapping;
273
-
274
- if ( this.isToneMappingState && rendererToneMapping !== NoToneMapping ) {
275
-
276
- if ( rendererData.toneMapping !== rendererToneMapping ) {
277
-
278
- const rendererToneMappingNode = rendererData.rendererToneMappingNode || toneMapping( rendererToneMapping, reference( 'toneMappingExposure', 'float', renderer ) );
279
- rendererToneMappingNode.toneMapping = rendererToneMapping;
280
-
281
- rendererData.rendererToneMappingNode = rendererToneMappingNode;
282
- rendererData.toneMappingNode = rendererToneMappingNode;
283
- rendererData.toneMapping = rendererToneMapping;
284
-
285
- }
286
-
287
- } else {
288
-
289
- // Don't delete rendererData.rendererToneMappingNode
290
- delete rendererData.toneMappingNode;
291
- delete rendererData.toneMapping;
292
-
293
- }
249
+ return this.renderer.getRenderTarget() ? false : true;
294
250
 
295
251
  }
296
252
 
@@ -305,26 +261,13 @@ class Nodes extends DataMap {
305
261
 
306
262
  let backgroundNode = null;
307
263
 
308
- if ( background.isCubeTexture === true ) {
264
+ if ( background.isCubeTexture === true || ( background.mapping === EquirectangularReflectionMapping || background.mapping === EquirectangularRefractionMapping ) ) {
309
265
 
310
- backgroundNode = cubeTexture( background, normalWorld );
266
+ backgroundNode = pmremTexture( background, normalWorld );
311
267
 
312
268
  } else if ( background.isTexture === true ) {
313
269
 
314
- let nodeUV = null;
315
-
316
- if ( background.mapping === EquirectangularReflectionMapping || background.mapping === EquirectangularRefractionMapping ) {
317
-
318
- nodeUV = equirectUV();
319
- background.flipY = false;
320
-
321
- } else {
322
-
323
- nodeUV = viewportBottomLeft;
324
-
325
- }
326
-
327
- backgroundNode = texture( background, nodeUV ).setUpdateMatrix( true );
270
+ backgroundNode = texture( background, viewportBottomLeft ).setUpdateMatrix( true );
328
271
 
329
272
  } else if ( background.isColor !== true ) {
330
273
 
@@ -443,6 +386,34 @@ class Nodes extends DataMap {
443
386
 
444
387
  }
445
388
 
389
+ getOutputNode( outputTexture ) {
390
+
391
+ let output = texture( outputTexture, viewportTopLeft );
392
+
393
+ if ( this.isToneMappingState ) {
394
+
395
+ if ( this.renderer.toneMappingNode ) {
396
+
397
+ output = vec4( this.renderer.toneMappingNode.context( { color: output.rgb } ), output.a );
398
+
399
+ } else if ( this.renderer.toneMapping !== NoToneMapping ) {
400
+
401
+ output = output.toneMapping( this.renderer.toneMapping );
402
+
403
+ }
404
+
405
+ }
406
+
407
+ if ( this.renderer.currentColorSpace === SRGBColorSpace ) {
408
+
409
+ output = output.linearToColorSpace( this.renderer.currentColorSpace );
410
+
411
+ }
412
+
413
+ return output;
414
+
415
+ }
416
+
446
417
  updateBefore( renderObject ) {
447
418
 
448
419
  const nodeFrame = this.getNodeFrameForRender( renderObject );
@@ -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;
@@ -79,6 +174,8 @@ class WebGLBackend extends Backend {
79
174
 
80
175
  //
81
176
 
177
+ this.initTimestampQuery( renderContext );
178
+
82
179
  renderContextData.previousContext = this._currentContext;
83
180
  this._currentContext = renderContext;
84
181
 
@@ -219,6 +316,7 @@ class WebGLBackend extends Backend {
219
316
 
220
317
  }
221
318
 
319
+ this.prepareTimestampBuffer( renderContext );
222
320
 
223
321
  }
224
322
 
@@ -379,11 +477,12 @@ class WebGLBackend extends Backend {
379
477
 
380
478
  }
381
479
 
382
- beginCompute( /*computeGroup*/ ) {
480
+ beginCompute( computeGroup ) {
383
481
 
384
482
  const gl = this.gl;
385
483
 
386
484
  gl.bindFramebuffer( gl.FRAMEBUFFER, null );
485
+ this.initTimestampQuery( computeGroup );
387
486
 
388
487
  }
389
488
 
@@ -456,7 +555,7 @@ class WebGLBackend extends Backend {
456
555
 
457
556
  }
458
557
 
459
- finishCompute( /*computeGroup*/ ) {
558
+ finishCompute( computeGroup ) {
460
559
 
461
560
  const gl = this.gl;
462
561
 
@@ -464,11 +563,13 @@ class WebGLBackend extends Backend {
464
563
 
465
564
  gl.disable( gl.RASTERIZER_DISCARD );
466
565
 
566
+ this.prepareTimestampBuffer( computeGroup );
567
+
467
568
  }
468
569
 
469
570
  draw( renderObject, info ) {
470
571
 
471
- const { pipeline, material, context } = renderObject;
572
+ const { object, pipeline, material, context } = renderObject;
472
573
  const { programGPU } = this.get( pipeline );
473
574
 
474
575
  const { gl, state } = this;
@@ -479,7 +580,9 @@ class WebGLBackend extends Backend {
479
580
 
480
581
  this._bindUniforms( renderObject.getBindings() );
481
582
 
482
- state.setMaterial( material );
583
+ const frontFaceCW = ( object.isMesh && object.matrixWorld.determinant() < 0 );
584
+
585
+ state.setMaterial( material, frontFaceCW );
483
586
 
484
587
  gl.useProgram( programGPU );
485
588
 
@@ -511,9 +614,8 @@ class WebGLBackend extends Backend {
511
614
 
512
615
  const index = renderObject.getIndex();
513
616
 
514
- const object = renderObject.object;
515
617
  const geometry = renderObject.geometry;
516
- const drawRange = geometry.drawRange;
618
+ const drawRange = renderObject.drawRange;
517
619
  const firstVertex = drawRange.start;
518
620
 
519
621
  //
@@ -547,21 +649,22 @@ class WebGLBackend extends Backend {
547
649
 
548
650
  //
549
651
 
550
- let mode;
551
- if ( object.isPoints ) mode = gl.POINTS;
552
- else if ( object.isLineSegments ) mode = gl.LINES;
553
- else if ( object.isLine ) mode = gl.LINE_STRIP;
554
- else if ( object.isLineLoop ) mode = gl.LINE_LOOP;
652
+ const renderer = this.bufferRenderer;
653
+
654
+ if ( object.isPoints ) renderer.mode = gl.POINTS;
655
+ else if ( object.isLineSegments ) renderer.mode = gl.LINES;
656
+ else if ( object.isLine ) renderer.mode = gl.LINE_STRIP;
657
+ else if ( object.isLineLoop ) renderer.mode = gl.LINE_LOOP;
555
658
  else {
556
659
 
557
660
  if ( material.wireframe === true ) {
558
661
 
559
662
  state.setLineWidth( material.wireframeLinewidth * this.renderer.getPixelRatio() );
560
- mode = gl.LINES;
663
+ renderer.mode = gl.LINES;
561
664
 
562
665
  } else {
563
666
 
564
- mode = gl.TRIANGLES;
667
+ renderer.mode = gl.TRIANGLES;
565
668
 
566
669
  }
567
670
 
@@ -569,46 +672,54 @@ class WebGLBackend extends Backend {
569
672
 
570
673
  //
571
674
 
572
- const instanceCount = this.getInstanceCount( renderObject );
675
+
676
+ let count;
677
+
678
+ renderer.object = object;
573
679
 
574
680
  if ( index !== null ) {
575
681
 
576
682
  const indexData = this.get( index );
577
683
  const indexCount = ( drawRange.count !== Infinity ) ? drawRange.count : index.count;
578
684
 
579
- if ( instanceCount > 1 ) {
685
+ renderer.index = index.count;
686
+ renderer.type = indexData.type;
580
687
 
581
- gl.drawElementsInstanced( mode, index.count, indexData.type, firstVertex, instanceCount );
688
+ count = indexCount;
582
689
 
583
- } else {
690
+ } else {
584
691
 
585
- gl.drawElements( mode, index.count, indexData.type, firstVertex );
692
+ renderer.index = 0;
586
693
 
587
- }
694
+ const vertexCount = ( drawRange.count !== Infinity ) ? drawRange.count : geometry.attributes.position.count;
588
695
 
589
- info.update( object, indexCount, 1 );
696
+ count = vertexCount;
590
697
 
591
- } else {
698
+ }
699
+
700
+ const instanceCount = this.getInstanceCount( renderObject );
592
701
 
593
- const positionAttribute = geometry.attributes.position;
594
- const vertexCount = ( drawRange.count !== Infinity ) ? drawRange.count : positionAttribute.count;
702
+ if ( object.isBatchedMesh ) {
595
703
 
596
- if ( instanceCount > 1 ) {
704
+ if ( object._multiDrawInstances !== null ) {
597
705
 
598
- gl.drawArraysInstanced( mode, 0, vertexCount, instanceCount );
706
+ renderer.renderMultiDrawInstances( object._multiDrawStarts, object._multiDrawCounts, object._multiDrawCount, object._multiDrawInstances );
599
707
 
600
708
  } else {
601
709
 
602
- gl.drawArrays( mode, 0, vertexCount );
710
+ renderer.renderMultiDraw( object._multiDrawStarts, object._multiDrawCounts, object._multiDrawCount );
603
711
 
604
712
  }
605
713
 
606
- //gl.drawArrays( mode, vertexCount, gl.UNSIGNED_SHORT, firstVertex );
714
+ } else if ( instanceCount > 1 ) {
607
715
 
608
- info.update( object, vertexCount, 1 );
716
+ renderer.renderInstances( firstVertex, count, instanceCount );
609
717
 
610
- }
718
+ } else {
611
719
 
720
+ renderer.render( firstVertex, count );
721
+
722
+ }
612
723
  //
613
724
 
614
725
  gl.bindVertexArray( null );
@@ -997,12 +1108,6 @@ class WebGLBackend extends Backend {
997
1108
 
998
1109
  }
999
1110
 
1000
- async hasFeatureAsync( name ) {
1001
-
1002
- return this.hasFeature( name );
1003
-
1004
- }
1005
-
1006
1111
  hasFeature( name ) {
1007
1112
 
1008
1113
  const keysMatching = Object.keys( GLFeatureName ).filter( key => GLFeatureName[ key ] === name );
@@ -1011,7 +1116,6 @@ class WebGLBackend extends Backend {
1011
1116
 
1012
1117
  for ( let i = 0; i < keysMatching.length; i ++ ) {
1013
1118
 
1014
-
1015
1119
  if ( extensions.has( keysMatching[ i ] ) ) return true;
1016
1120
 
1017
1121
  }
@@ -1027,6 +1131,12 @@ class WebGLBackend extends Backend {
1027
1131
 
1028
1132
  }
1029
1133
 
1134
+ copyTextureToTexture( position, srcTexture, dstTexture, level ) {
1135
+
1136
+ this.textureUtils.copyTextureToTexture( position, srcTexture, dstTexture, level );
1137
+
1138
+ }
1139
+
1030
1140
  copyFramebufferToTexture( texture, renderContext ) {
1031
1141
 
1032
1142
  this.textureUtils.copyFramebufferToTexture( texture, renderContext );
@@ -0,0 +1,145 @@
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
+ for ( let i = 0; i < primcount.length; i ++ ) {
131
+
132
+ info.update( object, elementCount, mode, primcount[ i ] );
133
+
134
+ }
135
+
136
+ }
137
+
138
+ }
139
+
140
+ //
141
+
142
+ }
143
+
144
+
145
+ export { WebGLBufferRenderer };
@@ -5,7 +5,7 @@ import NodeUniformsGroup from '../../common/nodes/NodeUniformsGroup.js';
5
5
 
6
6
  import { NodeSampledTexture, NodeSampledCubeTexture } from '../../common/nodes/NodeSampledTexture.js';
7
7
 
8
- import { RedFormat, RGFormat, IntType, DataTexture, RGBAFormat, FloatType } from 'three';
8
+ import { RedFormat, RGFormat, IntType, DataTexture, RGBFormat, RGBAFormat, FloatType } from 'three';
9
9
 
10
10
  const glslMethods = {
11
11
  [ MathNode.ATAN2 ]: 'atan',
@@ -104,7 +104,7 @@ ${ flowData.code }
104
104
 
105
105
  } else if ( itemSize === 3 ) {
106
106
 
107
- format = 6407; // patch since legacy doesn't use RGBFormat for rendering but here it's needed for packing optimization
107
+ format = RGBFormat;
108
108
 
109
109
  } else if ( itemSize === 4 ) {
110
110
 
@@ -246,6 +246,12 @@ ${ flowData.code }
246
246
 
247
247
  }
248
248
 
249
+ generateTextureGrad( texture, textureProperty, uvSnippet, gradSnippet ) {
250
+
251
+ return `textureGrad( ${ textureProperty }, ${ uvSnippet }, ${ gradSnippet[ 0 ] }, ${ gradSnippet[ 1 ] } )`;
252
+
253
+ }
254
+
249
255
  generateTextureCompare( texture, textureProperty, uvSnippet, compareSnippet, depthSnippet, shaderStage = this.shaderStage ) {
250
256
 
251
257
  if ( shaderStage === 'fragment' ) {
@@ -390,7 +396,7 @@ ${ flowData.code }
390
396
 
391
397
  const array = dataAttribute.array;
392
398
 
393
- if ( ( array instanceof Uint32Array || array instanceof Int32Array ) === false ) {
399
+ if ( ( array instanceof Uint32Array || array instanceof Int32Array || array instanceof Uint16Array || array instanceof Int16Array ) === false ) {
394
400
 
395
401
  nodeType = nodeType.slice( 1 );
396
402
 
@@ -135,7 +135,7 @@ class WebGLAttributeUtils {
135
135
  bytesPerElement: array.BYTES_PER_ELEMENT,
136
136
  version: attribute.version,
137
137
  pbo: attribute.pbo,
138
- isInteger: type === gl.INT || type === gl.UNSIGNED_INT || attribute.gpuType === IntType,
138
+ isInteger: type === gl.INT || type === gl.UNSIGNED_INT || type === gl.UNSIGNED_SHORT || attribute.gpuType === IntType,
139
139
  id: _id ++
140
140
  };
141
141
 
@@ -7,5 +7,6 @@ export const GLFeatureName = {
7
7
  'WEBKIT_WEBGL_compressed_texture_pvrtc': 'texture-compression-pvrtc',
8
8
  'WEBGL_compressed_texture_s3tc': 'texture-compression-bc',
9
9
  'EXT_texture_compression_bptc': 'texture-compression-bptc',
10
+ 'EXT_disjoint_timer_query_webgl2': 'timestamp-query',
10
11
 
11
12
  };