super-three 0.170.0 → 0.171.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 (172) hide show
  1. package/build/three.cjs +24410 -24422
  2. package/build/three.core.js +37002 -0
  3. package/build/three.core.min.js +6 -0
  4. package/build/three.module.js +10573 -47578
  5. package/build/three.module.min.js +1 -1
  6. package/build/three.tsl.js +533 -0
  7. package/build/three.tsl.min.js +6 -0
  8. package/build/three.webgpu.js +2907 -37975
  9. package/build/three.webgpu.min.js +1 -1
  10. package/build/three.webgpu.nodes.js +2914 -37959
  11. package/build/three.webgpu.nodes.min.js +1 -1
  12. package/examples/jsm/capabilities/WebGPU.js +1 -10
  13. package/examples/jsm/controls/ArcballControls.js +25 -21
  14. package/examples/jsm/controls/OrbitControls.js +41 -9
  15. package/examples/jsm/controls/PointerLockControls.js +2 -5
  16. package/examples/jsm/csm/CSMShadowNode.js +7 -5
  17. package/examples/jsm/geometries/DecalGeometry.js +5 -1
  18. package/examples/jsm/lighting/TiledLighting.js +1 -1
  19. package/examples/jsm/lines/LineGeometry.js +25 -0
  20. package/examples/jsm/lines/LineMaterial.js +1 -7
  21. package/examples/jsm/lines/webgpu/Line2.js +2 -1
  22. package/examples/jsm/lines/webgpu/LineSegments2.js +2 -1
  23. package/examples/jsm/lines/webgpu/Wireframe.js +2 -1
  24. package/examples/jsm/loaders/KTX2Loader.js +3 -0
  25. package/examples/jsm/loaders/MMDLoader.js +2 -6
  26. package/examples/jsm/loaders/MaterialXLoader.js +2 -2
  27. package/examples/jsm/materials/MeshGouraudMaterial.js +2 -6
  28. package/examples/jsm/misc/ProgressiveLightMapGPU.js +2 -2
  29. package/examples/jsm/objects/InstancedPoints.js +2 -4
  30. package/examples/jsm/objects/LensflareMesh.js +4 -2
  31. package/examples/jsm/objects/SkyMesh.js +5 -3
  32. package/examples/jsm/objects/Water2Mesh.js +7 -3
  33. package/examples/jsm/objects/WaterMesh.js +5 -3
  34. package/examples/jsm/transpiler/AST.js +2 -2
  35. package/examples/jsm/transpiler/GLSLDecoder.js +57 -25
  36. package/examples/jsm/transpiler/TSLEncoder.js +11 -6
  37. package/examples/jsm/tsl/display/AfterImageNode.js +3 -3
  38. package/examples/jsm/tsl/display/AnaglyphPassNode.js +2 -2
  39. package/examples/jsm/tsl/display/AnamorphicNode.js +2 -2
  40. package/examples/jsm/tsl/display/BloomNode.js +3 -3
  41. package/examples/jsm/tsl/display/DenoiseNode.js +48 -12
  42. package/examples/jsm/tsl/display/DepthOfFieldNode.js +3 -2
  43. package/examples/jsm/tsl/display/DotScreenNode.js +2 -2
  44. package/examples/jsm/tsl/display/FXAANode.js +3 -3
  45. package/examples/jsm/tsl/display/FilmNode.js +3 -2
  46. package/examples/jsm/tsl/display/GTAONode.js +62 -27
  47. package/examples/jsm/tsl/display/GaussianBlurNode.js +6 -8
  48. package/examples/jsm/tsl/display/LensflareNode.js +3 -3
  49. package/examples/jsm/tsl/display/Lut3DNode.js +3 -2
  50. package/examples/jsm/tsl/display/OutlineNode.js +2 -2
  51. package/examples/jsm/tsl/display/ParallaxBarrierPassNode.js +2 -1
  52. package/examples/jsm/tsl/display/PixelationPassNode.js +4 -4
  53. package/examples/jsm/tsl/display/RGBShiftNode.js +2 -1
  54. package/examples/jsm/tsl/display/SMAANode.js +3 -3
  55. package/examples/jsm/tsl/display/SSAAPassNode.js +2 -2
  56. package/examples/jsm/tsl/display/SSRNode.js +31 -8
  57. package/examples/jsm/tsl/display/SobelOperatorNode.js +3 -3
  58. package/examples/jsm/tsl/display/StereoCompositePassNode.js +4 -4
  59. package/examples/jsm/tsl/display/StereoPassNode.js +2 -2
  60. package/examples/jsm/tsl/display/TRAAPassNode.js +2 -2
  61. package/examples/jsm/tsl/display/TransitionNode.js +3 -2
  62. package/examples/jsm/tsl/lighting/TiledLightsNode.js +6 -9
  63. package/examples/jsm/utils/SceneOptimizer.js +410 -0
  64. package/examples/jsm/utils/UVsDebug.js +1 -1
  65. package/package.json +3 -3
  66. package/src/Three.Core.js +178 -0
  67. package/src/Three.TSL.js +526 -0
  68. package/src/Three.WebGPU.Nodes.js +5 -186
  69. package/src/Three.WebGPU.js +4 -186
  70. package/src/Three.js +1 -177
  71. package/src/animation/AnimationClip.js +2 -2
  72. package/src/animation/AnimationObjectGroup.js +2 -2
  73. package/src/audio/Audio.js +38 -0
  74. package/src/cameras/PerspectiveCamera.js +6 -6
  75. package/src/cameras/StereoCamera.js +2 -2
  76. package/src/constants.js +1 -1
  77. package/src/core/BufferGeometry.js +5 -3
  78. package/src/core/InterleavedBuffer.js +4 -4
  79. package/src/core/Object3D.js +2 -2
  80. package/src/extras/core/Curve.js +3 -3
  81. package/src/extras/core/Shape.js +2 -2
  82. package/src/geometries/EdgesGeometry.js +2 -2
  83. package/src/geometries/LatheGeometry.js +2 -2
  84. package/src/lights/SpotLightShadow.js +2 -2
  85. package/src/materials/LineBasicMaterial.js +2 -6
  86. package/src/materials/LineDashedMaterial.js +1 -6
  87. package/src/materials/Material.js +3 -16
  88. package/src/materials/MeshBasicMaterial.js +2 -6
  89. package/src/materials/MeshDepthMaterial.js +2 -6
  90. package/src/materials/MeshDistanceMaterial.js +2 -6
  91. package/src/materials/MeshLambertMaterial.js +2 -6
  92. package/src/materials/MeshMatcapMaterial.js +2 -6
  93. package/src/materials/MeshNormalMaterial.js +2 -6
  94. package/src/materials/MeshPhongMaterial.js +3 -7
  95. package/src/materials/MeshPhysicalMaterial.js +4 -8
  96. package/src/materials/MeshStandardMaterial.js +2 -6
  97. package/src/materials/MeshToonMaterial.js +2 -6
  98. package/src/materials/PointsMaterial.js +2 -6
  99. package/src/materials/RawShaderMaterial.js +2 -6
  100. package/src/materials/ShaderMaterial.js +2 -6
  101. package/src/materials/ShadowMaterial.js +2 -6
  102. package/src/materials/SpriteMaterial.js +2 -6
  103. package/src/materials/nodes/Line2NodeMaterial.js +32 -13
  104. package/src/materials/nodes/LineDashedNodeMaterial.js +4 -2
  105. package/src/materials/nodes/NodeMaterial.js +64 -16
  106. package/src/materials/nodes/manager/NodeMaterialObserver.js +13 -10
  107. package/src/math/ColorManagement.js +130 -122
  108. package/src/math/Line3.js +2 -2
  109. package/src/math/Quaternion.js +2 -2
  110. package/src/math/Spherical.js +3 -3
  111. package/src/math/Vector2.js +7 -7
  112. package/src/math/Vector3.js +9 -9
  113. package/src/math/Vector4.js +11 -9
  114. package/src/nodes/Nodes.js +1 -0
  115. package/src/nodes/TSL.js +3 -1
  116. package/src/nodes/accessors/Arrays.js +27 -0
  117. package/src/nodes/accessors/BuiltinNode.js +26 -0
  118. package/src/nodes/accessors/ClippingNode.js +76 -42
  119. package/src/nodes/accessors/InstanceNode.js +17 -20
  120. package/src/nodes/accessors/InstancedMeshNode.js +26 -0
  121. package/src/nodes/accessors/Lights.js +32 -0
  122. package/src/nodes/accessors/StorageBufferNode.js +29 -9
  123. package/src/nodes/accessors/StorageTextureNode.js +10 -4
  124. package/src/nodes/accessors/TextureNode.js +1 -1
  125. package/src/nodes/core/NodeBuilder.js +2 -9
  126. package/src/nodes/core/NodeUtils.js +28 -0
  127. package/src/nodes/core/constants.js +6 -0
  128. package/src/nodes/display/BlendModes.js +99 -0
  129. package/src/nodes/display/ToonOutlinePassNode.js +3 -3
  130. package/src/nodes/display/ViewportDepthNode.js +21 -6
  131. package/src/nodes/functions/material/getAlphaHashThreshold.js +13 -7
  132. package/src/nodes/functions/material/getParallaxCorrectNormal.js +1 -1
  133. package/src/nodes/lighting/AnalyticLightNode.js +12 -4
  134. package/src/nodes/lighting/PointLightNode.js +10 -1
  135. package/src/nodes/lighting/PointShadowNode.js +254 -0
  136. package/src/nodes/lighting/ShadowNode.js +176 -67
  137. package/src/nodes/lighting/SpotLightNode.js +14 -2
  138. package/src/nodes/utils/RTTNode.js +9 -1
  139. package/src/nodes/utils/StorageArrayElementNode.js +2 -2
  140. package/src/objects/BatchedMesh.js +54 -95
  141. package/src/objects/ClippingGroup.js +19 -0
  142. package/src/objects/Skeleton.js +2 -2
  143. package/src/renderers/WebGLRenderer.js +94 -23
  144. package/src/renderers/common/Animation.js +23 -11
  145. package/src/renderers/common/Background.js +1 -1
  146. package/src/renderers/common/Bindings.js +20 -4
  147. package/src/renderers/common/ClippingContext.js +77 -85
  148. package/src/renderers/common/RenderList.js +9 -6
  149. package/src/renderers/common/RenderObject.js +27 -27
  150. package/src/renderers/common/RenderObjects.js +12 -6
  151. package/src/renderers/common/Renderer.js +63 -57
  152. package/src/renderers/common/Textures.js +11 -3
  153. package/src/renderers/common/UniformsGroup.js +16 -4
  154. package/src/renderers/common/extras/PMREMGenerator.js +89 -13
  155. package/src/renderers/common/nodes/NodeLibrary.js +2 -2
  156. package/src/renderers/common/nodes/NodeStorageBuffer.js +2 -3
  157. package/src/renderers/common/nodes/NodeUniform.js +42 -0
  158. package/src/renderers/webgl/WebGLBackground.js +20 -1
  159. package/src/renderers/webgl/WebGLGeometries.js +0 -28
  160. package/src/renderers/webgl-fallback/WebGLBackend.js +13 -6
  161. package/src/renderers/webgl-fallback/nodes/GLSLNodeBuilder.js +43 -12
  162. package/src/renderers/webgl-fallback/utils/WebGLState.js +26 -1
  163. package/src/renderers/webgl-fallback/utils/WebGLTextureUtils.js +4 -1
  164. package/src/renderers/webgpu/WebGPUBackend.js +47 -31
  165. package/src/renderers/webgpu/nodes/StandardNodeLibrary.js +13 -26
  166. package/src/renderers/webgpu/nodes/WGSLNodeBuilder.js +184 -74
  167. package/src/renderers/webgpu/utils/WebGPUAttributeUtils.js +15 -2
  168. package/src/renderers/webgpu/utils/WebGPUBindingUtils.js +72 -7
  169. package/src/renderers/webgpu/utils/WebGPUTextureUtils.js +5 -1
  170. package/src/textures/Source.js +2 -2
  171. package/src/textures/Texture.js +2 -2
  172. package/src/nodes/display/BlendMode.js +0 -54
@@ -78,8 +78,6 @@ class Renderer {
78
78
  this.depth = depth;
79
79
  this.stencil = stencil;
80
80
 
81
- this.clippingPlanes = [];
82
-
83
81
  this.info = new Info();
84
82
 
85
83
  this.nodes = {
@@ -175,7 +173,7 @@ class Renderer {
175
173
 
176
174
  const material = scene.overrideMaterial || object.material;
177
175
 
178
- const renderObject = this._objects.get( object, material, scene, camera, renderList.lightsNode, renderContext );
176
+ const renderObject = this._objects.get( object, material, scene, camera, renderList.lightsNode, renderContext, renderContext.clippingContext );
179
177
 
180
178
  const { fragmentShader, vertexShader } = renderObject.getNodeBuilderState();
181
179
 
@@ -250,6 +248,7 @@ class Renderer {
250
248
 
251
249
  //
252
250
 
251
+ this._animation.start();
253
252
  this._initialized = true;
254
253
 
255
254
  resolve();
@@ -312,7 +311,7 @@ class Renderer {
312
311
  renderContext.stencil = this.stencil;
313
312
 
314
313
  if ( ! renderContext.clippingContext ) renderContext.clippingContext = new ClippingContext();
315
- renderContext.clippingContext.updateGlobal( this, camera );
314
+ renderContext.clippingContext.updateGlobal( sceneRef, camera );
316
315
 
317
316
  //
318
317
 
@@ -323,7 +322,7 @@ class Renderer {
323
322
  const renderList = this._renderLists.get( scene, camera );
324
323
  renderList.begin();
325
324
 
326
- this._projectObject( scene, camera, 0, renderList );
325
+ this._projectObject( scene, camera, 0, renderList, renderContext.clippingContext );
327
326
 
328
327
  // include lights from target scene
329
328
  if ( targetScene !== scene ) {
@@ -372,10 +371,11 @@ class Renderer {
372
371
 
373
372
  const opaqueObjects = renderList.opaque;
374
373
  const transparentObjects = renderList.transparent;
374
+ const transparentDoublePassObjects = renderList.transparentDoublePass;
375
375
  const lightsNode = renderList.lightsNode;
376
376
 
377
377
  if ( this.opaque === true && opaqueObjects.length > 0 ) this._renderObjects( opaqueObjects, camera, sceneRef, lightsNode );
378
- if ( this.transparent === true && transparentObjects.length > 0 ) this._renderTransparents( transparentObjects, camera, sceneRef, lightsNode );
378
+ if ( this.transparent === true && transparentObjects.length > 0 ) this._renderTransparents( transparentObjects, transparentDoublePassObjects, camera, sceneRef, lightsNode );
379
379
 
380
380
  // restore render tree
381
381
 
@@ -678,7 +678,7 @@ class Renderer {
678
678
  renderContext.scissorValue.height >>= activeMipmapLevel;
679
679
 
680
680
  if ( ! renderContext.clippingContext ) renderContext.clippingContext = new ClippingContext();
681
- renderContext.clippingContext.updateGlobal( this, camera );
681
+ renderContext.clippingContext.updateGlobal( sceneRef, camera );
682
682
 
683
683
  //
684
684
 
@@ -692,7 +692,7 @@ class Renderer {
692
692
  const renderList = this._renderLists.get( scene, camera );
693
693
  renderList.begin();
694
694
 
695
- this._projectObject( scene, camera, 0, renderList );
695
+ this._projectObject( scene, camera, 0, renderList, renderContext.clippingContext );
696
696
 
697
697
  renderList.finish();
698
698
 
@@ -1309,6 +1309,34 @@ class Renderer {
1309
1309
 
1310
1310
  }
1311
1311
 
1312
+ hasInitialized() {
1313
+
1314
+ return this._initialized;
1315
+
1316
+ }
1317
+
1318
+ async initTextureAsync( texture ) {
1319
+
1320
+ if ( this._initialized === false ) await this.init();
1321
+
1322
+ this._textures.updateTexture( texture );
1323
+
1324
+ }
1325
+
1326
+ initTexture( texture ) {
1327
+
1328
+ if ( this._initialized === false ) {
1329
+
1330
+ console.warn( 'THREE.Renderer: .initTexture() called before the backend is initialized. Try using .initTextureAsync() instead.' );
1331
+
1332
+ return false;
1333
+
1334
+ }
1335
+
1336
+ this._textures.updateTexture( texture );
1337
+
1338
+ }
1339
+
1312
1340
  copyFramebufferToTexture( framebufferTexture, rectangle = null ) {
1313
1341
 
1314
1342
  if ( rectangle !== null ) {
@@ -1381,7 +1409,7 @@ class Renderer {
1381
1409
 
1382
1410
  }
1383
1411
 
1384
- _projectObject( object, camera, groupOrder, renderList ) {
1412
+ _projectObject( object, camera, groupOrder, renderList, clippingContext ) {
1385
1413
 
1386
1414
  if ( object.visible === false ) return;
1387
1415
 
@@ -1393,6 +1421,8 @@ class Renderer {
1393
1421
 
1394
1422
  groupOrder = object.renderOrder;
1395
1423
 
1424
+ if ( object.isClippingGroup && object.enabled ) clippingContext = clippingContext.getGroupContext( object );
1425
+
1396
1426
  } else if ( object.isLOD ) {
1397
1427
 
1398
1428
  if ( object.autoUpdate === true ) object.update( camera );
@@ -1415,7 +1445,7 @@ class Renderer {
1415
1445
 
1416
1446
  if ( material.visible ) {
1417
1447
 
1418
- renderList.push( object, geometry, material, groupOrder, _vector4.z, null );
1448
+ renderList.push( object, geometry, material, groupOrder, _vector4.z, null, clippingContext );
1419
1449
 
1420
1450
  }
1421
1451
 
@@ -1453,7 +1483,7 @@ class Renderer {
1453
1483
 
1454
1484
  if ( groupMaterial && groupMaterial.visible ) {
1455
1485
 
1456
- renderList.push( object, geometry, groupMaterial, groupOrder, _vector4.z, group );
1486
+ renderList.push( object, geometry, groupMaterial, groupOrder, _vector4.z, group, clippingContext );
1457
1487
 
1458
1488
  }
1459
1489
 
@@ -1461,7 +1491,7 @@ class Renderer {
1461
1491
 
1462
1492
  } else if ( material.visible ) {
1463
1493
 
1464
- renderList.push( object, geometry, material, groupOrder, _vector4.z, null );
1494
+ renderList.push( object, geometry, material, groupOrder, _vector4.z, null, clippingContext );
1465
1495
 
1466
1496
  }
1467
1497
 
@@ -1494,7 +1524,7 @@ class Renderer {
1494
1524
 
1495
1525
  for ( let i = 0, l = children.length; i < l; i ++ ) {
1496
1526
 
1497
- this._projectObject( children[ i ], camera, groupOrder, renderList );
1527
+ this._projectObject( children[ i ], camera, groupOrder, renderList, clippingContext );
1498
1528
 
1499
1529
  }
1500
1530
 
@@ -1561,7 +1591,7 @@ class Renderer {
1561
1591
  // @TODO: Add support for multiple materials per object. This will require to extract
1562
1592
  // the material from the renderItem object and pass it with its group data to renderObject().
1563
1593
 
1564
- const { object, geometry, material, group } = renderItem;
1594
+ const { object, geometry, material, group, clippingContext } = renderItem;
1565
1595
 
1566
1596
  if ( camera.isArrayCamera ) {
1567
1597
 
@@ -1584,7 +1614,7 @@ class Renderer {
1584
1614
 
1585
1615
  this.backend.updateViewport( this._currentRenderContext );
1586
1616
 
1587
- this._currentRenderObjectFunction( object, scene, camera2, geometry, material, group, lightsNode, passId );
1617
+ this._currentRenderObjectFunction( object, scene, camera2, geometry, material, group, lightsNode, clippingContext, passId );
1588
1618
 
1589
1619
  }
1590
1620
 
@@ -1592,7 +1622,7 @@ class Renderer {
1592
1622
 
1593
1623
  } else {
1594
1624
 
1595
- this._currentRenderObjectFunction( object, scene, camera, geometry, material, group, lightsNode, passId );
1625
+ this._currentRenderObjectFunction( object, scene, camera, geometry, material, group, lightsNode, clippingContext, passId );
1596
1626
 
1597
1627
  }
1598
1628
 
@@ -1600,10 +1630,10 @@ class Renderer {
1600
1630
 
1601
1631
  }
1602
1632
 
1603
- renderObject( object, scene, camera, geometry, material, group, lightsNode, passId = null ) {
1633
+ renderObject( object, scene, camera, geometry, material, group, lightsNode, clippingContext = null, passId = null ) {
1604
1634
 
1605
1635
  let overridePositionNode;
1606
- let overrideFragmentNode;
1636
+ let overrideColorNode;
1607
1637
  let overrideDepthNode;
1608
1638
 
1609
1639
  //
@@ -1623,6 +1653,9 @@ class Renderer {
1623
1653
 
1624
1654
  }
1625
1655
 
1656
+ overrideMaterial.alphaTest = material.alphaTest;
1657
+ overrideMaterial.alphaMap = material.alphaMap;
1658
+
1626
1659
  if ( overrideMaterial.isShadowNodeMaterial ) {
1627
1660
 
1628
1661
  overrideMaterial.side = material.shadowSide === null ? material.side : material.shadowSide;
@@ -1634,37 +1667,10 @@ class Renderer {
1634
1667
 
1635
1668
  }
1636
1669
 
1670
+ if ( material.castShadowNode && material.castShadowNode.isNode ) {
1637
1671
 
1638
- if ( material.shadowNode && material.shadowNode.isNode ) {
1639
-
1640
- overrideFragmentNode = overrideMaterial.fragmentNode;
1641
- overrideMaterial.fragmentNode = material.shadowNode;
1642
-
1643
- }
1644
-
1645
- if ( this.localClippingEnabled ) {
1646
-
1647
- if ( material.clipShadows ) {
1648
-
1649
- if ( overrideMaterial.clippingPlanes !== material.clippingPlanes ) {
1650
-
1651
- overrideMaterial.clippingPlanes = material.clippingPlanes;
1652
- overrideMaterial.needsUpdate = true;
1653
-
1654
- }
1655
-
1656
- if ( overrideMaterial.clipIntersection !== material.clipIntersection ) {
1657
-
1658
- overrideMaterial.clipIntersection = material.clipIntersection;
1659
-
1660
- }
1661
-
1662
- } else if ( Array.isArray( overrideMaterial.clippingPlanes ) ) {
1663
-
1664
- overrideMaterial.clippingPlanes = null;
1665
- overrideMaterial.needsUpdate = true;
1666
-
1667
- }
1672
+ overrideColorNode = overrideMaterial.colorNode;
1673
+ overrideMaterial.colorNode = material.castShadowNode;
1668
1674
 
1669
1675
  }
1670
1676
 
@@ -1679,16 +1685,16 @@ class Renderer {
1679
1685
  if ( material.transparent === true && material.side === DoubleSide && material.forceSinglePass === false ) {
1680
1686
 
1681
1687
  material.side = BackSide;
1682
- this._handleObjectFunction( object, material, scene, camera, lightsNode, group, 'backSide' ); // create backSide pass id
1688
+ this._handleObjectFunction( object, material, scene, camera, lightsNode, group, clippingContext, 'backSide' ); // create backSide pass id
1683
1689
 
1684
1690
  material.side = FrontSide;
1685
- this._handleObjectFunction( object, material, scene, camera, lightsNode, group, passId ); // use default pass id
1691
+ this._handleObjectFunction( object, material, scene, camera, lightsNode, group, clippingContext, passId ); // use default pass id
1686
1692
 
1687
1693
  material.side = DoubleSide;
1688
1694
 
1689
1695
  } else {
1690
1696
 
1691
- this._handleObjectFunction( object, material, scene, camera, lightsNode, group, passId );
1697
+ this._handleObjectFunction( object, material, scene, camera, lightsNode, group, clippingContext, passId );
1692
1698
 
1693
1699
  }
1694
1700
 
@@ -1706,9 +1712,9 @@ class Renderer {
1706
1712
 
1707
1713
  }
1708
1714
 
1709
- if ( overrideFragmentNode !== undefined ) {
1715
+ if ( overrideColorNode !== undefined ) {
1710
1716
 
1711
- scene.overrideMaterial.fragmentNode = overrideFragmentNode;
1717
+ scene.overrideMaterial.colorNode = overrideColorNode;
1712
1718
 
1713
1719
  }
1714
1720
 
@@ -1718,9 +1724,9 @@ class Renderer {
1718
1724
 
1719
1725
  }
1720
1726
 
1721
- _renderObjectDirect( object, material, scene, camera, lightsNode, group, passId ) {
1727
+ _renderObjectDirect( object, material, scene, camera, lightsNode, group, clippingContext, passId ) {
1722
1728
 
1723
- const renderObject = this._objects.get( object, material, scene, camera, lightsNode, this._currentRenderContext, passId );
1729
+ const renderObject = this._objects.get( object, material, scene, camera, lightsNode, this._currentRenderContext, clippingContext, passId );
1724
1730
  renderObject.drawRange = object.geometry.drawRange;
1725
1731
  renderObject.group = group;
1726
1732
 
@@ -1759,9 +1765,9 @@ class Renderer {
1759
1765
 
1760
1766
  }
1761
1767
 
1762
- _createObjectPipeline( object, material, scene, camera, lightsNode, passId ) {
1768
+ _createObjectPipeline( object, material, scene, camera, lightsNode, clippingContext, passId ) {
1763
1769
 
1764
- const renderObject = this._objects.get( object, material, scene, camera, lightsNode, this._currentRenderContext, passId );
1770
+ const renderObject = this._objects.get( object, material, scene, camera, lightsNode, this._currentRenderContext, clippingContext, passId );
1765
1771
 
1766
1772
  //
1767
1773
 
@@ -300,8 +300,8 @@ class Textures extends DataMap {
300
300
 
301
301
  if ( image.image !== undefined ) image = image.image;
302
302
 
303
- target.width = image.width;
304
- target.height = image.height;
303
+ target.width = image.width || 1;
304
+ target.height = image.height || 1;
305
305
  target.depth = texture.isCubeTexture ? 6 : ( image.depth || 1 );
306
306
 
307
307
  } else {
@@ -320,7 +320,15 @@ class Textures extends DataMap {
320
320
 
321
321
  if ( texture.isCompressedTexture ) {
322
322
 
323
- mipLevelCount = texture.mipmaps.length;
323
+ if ( texture.mipmaps ) {
324
+
325
+ mipLevelCount = texture.mipmaps.length;
326
+
327
+ } else {
328
+
329
+ mipLevelCount = 1;
330
+
331
+ }
324
332
 
325
333
  } else {
326
334
 
@@ -149,10 +149,11 @@ class UniformsGroup extends UniformBuffer {
149
149
  const a = this.values;
150
150
  const v = uniform.getValue();
151
151
  const offset = uniform.offset;
152
+ const type = uniform.getType();
152
153
 
153
154
  if ( a[ offset ] !== v ) {
154
155
 
155
- const b = this.buffer;
156
+ const b = this._getBufferForType( type );
156
157
 
157
158
  b[ offset ] = a[ offset ] = v;
158
159
  updated = true;
@@ -170,10 +171,11 @@ class UniformsGroup extends UniformBuffer {
170
171
  const a = this.values;
171
172
  const v = uniform.getValue();
172
173
  const offset = uniform.offset;
174
+ const type = uniform.getType();
173
175
 
174
176
  if ( a[ offset + 0 ] !== v.x || a[ offset + 1 ] !== v.y ) {
175
177
 
176
- const b = this.buffer;
178
+ const b = this._getBufferForType( type );
177
179
 
178
180
  b[ offset + 0 ] = a[ offset + 0 ] = v.x;
179
181
  b[ offset + 1 ] = a[ offset + 1 ] = v.y;
@@ -193,10 +195,11 @@ class UniformsGroup extends UniformBuffer {
193
195
  const a = this.values;
194
196
  const v = uniform.getValue();
195
197
  const offset = uniform.offset;
198
+ const type = uniform.getType();
196
199
 
197
200
  if ( a[ offset + 0 ] !== v.x || a[ offset + 1 ] !== v.y || a[ offset + 2 ] !== v.z ) {
198
201
 
199
- const b = this.buffer;
202
+ const b = this._getBufferForType( type );
200
203
 
201
204
  b[ offset + 0 ] = a[ offset + 0 ] = v.x;
202
205
  b[ offset + 1 ] = a[ offset + 1 ] = v.y;
@@ -217,10 +220,11 @@ class UniformsGroup extends UniformBuffer {
217
220
  const a = this.values;
218
221
  const v = uniform.getValue();
219
222
  const offset = uniform.offset;
223
+ const type = uniform.getType();
220
224
 
221
225
  if ( a[ offset + 0 ] !== v.x || a[ offset + 1 ] !== v.y || a[ offset + 2 ] !== v.z || a[ offset + 4 ] !== v.w ) {
222
226
 
223
- const b = this.buffer;
227
+ const b = this._getBufferForType( type );
224
228
 
225
229
  b[ offset + 0 ] = a[ offset + 0 ] = v.x;
226
230
  b[ offset + 1 ] = a[ offset + 1 ] = v.y;
@@ -312,6 +316,14 @@ class UniformsGroup extends UniformBuffer {
312
316
 
313
317
  }
314
318
 
319
+ _getBufferForType( type ) {
320
+
321
+ if ( type === 'int' || type === 'ivec2' || type === 'ivec3' || type === 'ivec4' ) return new Int32Array( this.buffer.buffer );
322
+ if ( type === 'uint' || type === 'uvec2' || type === 'uvec3' || type === 'uvec4' ) return new Uint32Array( this.buffer.buffer );
323
+ return this.buffer;
324
+
325
+ }
326
+
315
327
  }
316
328
 
317
329
  function setArray( a, b, offset ) {
@@ -116,6 +116,12 @@ class PMREMGenerator {
116
116
 
117
117
  }
118
118
 
119
+ get _hasInitialized() {
120
+
121
+ return this._renderer.hasInitialized();
122
+
123
+ }
124
+
119
125
  /**
120
126
  * Generates a PMREM from a supplied Scene, which can be faster than using an
121
127
  * image if networking bandwidth is low. Optional sigma specifies a blur radius
@@ -123,15 +129,27 @@ class PMREMGenerator {
123
129
  * and far planes ensure the scene is rendered in its entirety (the cubeCamera
124
130
  * is placed at the origin).
125
131
  */
126
- fromScene( scene, sigma = 0, near = 0.1, far = 100 ) {
132
+ fromScene( scene, sigma = 0, near = 0.1, far = 100, renderTarget = null ) {
133
+
134
+ this._setSize( 256 );
135
+
136
+ if ( this._hasInitialized === false ) {
137
+
138
+ console.warn( 'THREE.PMREMGenerator: .fromScene() called before the backend is initialized. Try using .fromSceneAsync() instead.' );
139
+
140
+ const cubeUVRenderTarget = renderTarget || this._allocateTargets();
141
+
142
+ this.fromSceneAsync( scene, sigma, near, far, cubeUVRenderTarget );
143
+
144
+ return cubeUVRenderTarget;
145
+
146
+ }
127
147
 
128
148
  _oldTarget = this._renderer.getRenderTarget();
129
149
  _oldActiveCubeFace = this._renderer.getActiveCubeFace();
130
150
  _oldActiveMipmapLevel = this._renderer.getActiveMipmapLevel();
131
151
 
132
- this._setSize( 256 );
133
-
134
- const cubeUVRenderTarget = this._allocateTargets();
152
+ const cubeUVRenderTarget = renderTarget || this._allocateTargets();
135
153
  cubeUVRenderTarget.depthBuffer = true;
136
154
 
137
155
  this._sceneToCubeUV( scene, near, far, cubeUVRenderTarget );
@@ -150,6 +168,14 @@ class PMREMGenerator {
150
168
 
151
169
  }
152
170
 
171
+ async fromSceneAsync( scene, sigma = 0, near = 0.1, far = 100, renderTarget = null ) {
172
+
173
+ if ( this._hasInitialized === false ) await this._renderer.init();
174
+
175
+ return this.fromScene( scene, sigma, near, far, renderTarget );
176
+
177
+ }
178
+
153
179
  /**
154
180
  * Generates a PMREM from an equirectangular texture, which can be either LDR
155
181
  * or HDR. The ideal input image size is 1k (1024 x 512),
@@ -157,6 +183,28 @@ class PMREMGenerator {
157
183
  */
158
184
  fromEquirectangular( equirectangular, renderTarget = null ) {
159
185
 
186
+ if ( this._hasInitialized === false ) {
187
+
188
+ console.warn( 'THREE.PMREMGenerator: .fromEquirectangular() called before the backend is initialized. Try using .fromEquirectangularAsync() instead.' );
189
+
190
+ this._setSizeFromTexture( equirectangular );
191
+
192
+ const cubeUVRenderTarget = renderTarget || this._allocateTargets();
193
+
194
+ this.fromEquirectangularAsync( equirectangular, cubeUVRenderTarget );
195
+
196
+ return cubeUVRenderTarget;
197
+
198
+ }
199
+
200
+ return this._fromTexture( equirectangular, renderTarget );
201
+
202
+ }
203
+
204
+ async fromEquirectangularAsync( equirectangular, renderTarget = null ) {
205
+
206
+ if ( this._hasInitialized === false ) await this._renderer.init();
207
+
160
208
  return this._fromTexture( equirectangular, renderTarget );
161
209
 
162
210
  }
@@ -168,6 +216,28 @@ class PMREMGenerator {
168
216
  */
169
217
  fromCubemap( cubemap, renderTarget = null ) {
170
218
 
219
+ if ( this._hasInitialized === false ) {
220
+
221
+ console.warn( 'THREE.PMREMGenerator: .fromCubemap() called before the backend is initialized. Try using .fromCubemapAsync() instead.' );
222
+
223
+ this._setSizeFromTexture( cubemap );
224
+
225
+ const cubeUVRenderTarget = renderTarget || this._allocateTargets();
226
+
227
+ this.fromCubemapAsync( cubemap, renderTarget );
228
+
229
+ return cubeUVRenderTarget;
230
+
231
+ }
232
+
233
+ return this._fromTexture( cubemap, renderTarget );
234
+
235
+ }
236
+
237
+ async fromCubemapAsync( cubemap, renderTarget = null ) {
238
+
239
+ if ( this._hasInitialized === false ) await this._renderer.init();
240
+
171
241
  return this._fromTexture( cubemap, renderTarget );
172
242
 
173
243
  }
@@ -224,6 +294,20 @@ class PMREMGenerator {
224
294
 
225
295
  // private interface
226
296
 
297
+ _setSizeFromTexture( texture ) {
298
+
299
+ if ( texture.mapping === CubeReflectionMapping || texture.mapping === CubeRefractionMapping ) {
300
+
301
+ this._setSize( texture.image.length === 0 ? 16 : ( texture.image[ 0 ].width || texture.image[ 0 ].image.width ) );
302
+
303
+ } else { // Equirectangular
304
+
305
+ this._setSize( texture.image.width / 4 );
306
+
307
+ }
308
+
309
+ }
310
+
227
311
  _setSize( cubeSize ) {
228
312
 
229
313
  this._lodMax = Math.floor( Math.log2( cubeSize ) );
@@ -255,15 +339,7 @@ class PMREMGenerator {
255
339
 
256
340
  _fromTexture( texture, renderTarget ) {
257
341
 
258
- if ( texture.mapping === CubeReflectionMapping || texture.mapping === CubeRefractionMapping ) {
259
-
260
- this._setSize( texture.image.length === 0 ? 16 : ( texture.image[ 0 ].width || texture.image[ 0 ].image.width ) );
261
-
262
- } else { // Equirectangular
263
-
264
- this._setSize( texture.image.width / 4 );
265
-
266
- }
342
+ this._setSizeFromTexture( texture );
267
343
 
268
344
  _oldTarget = this._renderer.getRenderTarget();
269
345
  _oldActiveCubeFace = this._renderer.getActiveCubeFace();
@@ -50,9 +50,9 @@ class NodeLibrary {
50
50
 
51
51
  }
52
52
 
53
- addMaterial( materialNodeClass, materialClass ) {
53
+ addMaterial( materialNodeClass, materialClassType ) {
54
54
 
55
- this.addType( materialNodeClass, materialClass.type, this.materialNodes );
55
+ this.addType( materialNodeClass, materialClassType, this.materialNodes );
56
56
 
57
57
  }
58
58
 
@@ -1,5 +1,5 @@
1
1
  import StorageBuffer from '../StorageBuffer.js';
2
- import { GPUBufferBindingType } from '../../webgpu/utils/WebGPUConstants.js';
2
+ import { NodeAccess } from '../../../nodes/core/constants.js';
3
3
 
4
4
  let _id = 0;
5
5
 
@@ -10,10 +10,9 @@ class NodeStorageBuffer extends StorageBuffer {
10
10
  super( 'StorageBuffer_' + _id ++, nodeUniform ? nodeUniform.value : null );
11
11
 
12
12
  this.nodeUniform = nodeUniform;
13
- this.access = nodeUniform ? nodeUniform.access : GPUBufferBindingType.Storage;
13
+ this.access = nodeUniform ? nodeUniform.access : NodeAccess.READ_WRITE;
14
14
  this.groupNode = groupNode;
15
15
 
16
-
17
16
  }
18
17
 
19
18
  get buffer() {
@@ -19,6 +19,12 @@ class NumberNodeUniform extends NumberUniform {
19
19
 
20
20
  }
21
21
 
22
+ getType() {
23
+
24
+ return this.nodeUniform.type;
25
+
26
+ }
27
+
22
28
  }
23
29
 
24
30
  class Vector2NodeUniform extends Vector2Uniform {
@@ -37,6 +43,12 @@ class Vector2NodeUniform extends Vector2Uniform {
37
43
 
38
44
  }
39
45
 
46
+ getType() {
47
+
48
+ return this.nodeUniform.type;
49
+
50
+ }
51
+
40
52
  }
41
53
 
42
54
  class Vector3NodeUniform extends Vector3Uniform {
@@ -55,6 +67,12 @@ class Vector3NodeUniform extends Vector3Uniform {
55
67
 
56
68
  }
57
69
 
70
+ getType() {
71
+
72
+ return this.nodeUniform.type;
73
+
74
+ }
75
+
58
76
  }
59
77
 
60
78
  class Vector4NodeUniform extends Vector4Uniform {
@@ -73,6 +91,12 @@ class Vector4NodeUniform extends Vector4Uniform {
73
91
 
74
92
  }
75
93
 
94
+ getType() {
95
+
96
+ return this.nodeUniform.type;
97
+
98
+ }
99
+
76
100
  }
77
101
 
78
102
  class ColorNodeUniform extends ColorUniform {
@@ -91,6 +115,12 @@ class ColorNodeUniform extends ColorUniform {
91
115
 
92
116
  }
93
117
 
118
+ getType() {
119
+
120
+ return this.nodeUniform.type;
121
+
122
+ }
123
+
94
124
  }
95
125
 
96
126
  class Matrix3NodeUniform extends Matrix3Uniform {
@@ -109,6 +139,12 @@ class Matrix3NodeUniform extends Matrix3Uniform {
109
139
 
110
140
  }
111
141
 
142
+ getType() {
143
+
144
+ return this.nodeUniform.type;
145
+
146
+ }
147
+
112
148
  }
113
149
 
114
150
  class Matrix4NodeUniform extends Matrix4Uniform {
@@ -127,6 +163,12 @@ class Matrix4NodeUniform extends Matrix4Uniform {
127
163
 
128
164
  }
129
165
 
166
+ getType() {
167
+
168
+ return this.nodeUniform.type;
169
+
170
+ }
171
+
130
172
  }
131
173
 
132
174
  export {
@@ -242,6 +242,24 @@ function WebGLBackground( renderer, cubemaps, cubeuvmaps, state, objects, alpha,
242
242
 
243
243
  }
244
244
 
245
+ function dispose() {
246
+
247
+ if ( boxMesh !== undefined ) {
248
+
249
+ boxMesh.geometry.dispose();
250
+ boxMesh.material.dispose();
251
+
252
+ }
253
+
254
+ if ( planeMesh !== undefined ) {
255
+
256
+ planeMesh.geometry.dispose();
257
+ planeMesh.material.dispose();
258
+
259
+ }
260
+
261
+ }
262
+
245
263
  return {
246
264
 
247
265
  getClearColor: function () {
@@ -268,7 +286,8 @@ function WebGLBackground( renderer, cubemaps, cubeuvmaps, state, objects, alpha,
268
286
 
269
287
  },
270
288
  render: render,
271
- addToRenderList: addToRenderList
289
+ addToRenderList: addToRenderList,
290
+ dispose: dispose
272
291
 
273
292
  };
274
293