super-three 0.154.1 → 0.156.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 +360 -160
  2. package/build/three.js +360 -160
  3. package/build/three.min.js +1 -1
  4. package/build/three.module.js +355 -161
  5. package/build/three.module.min.js +1 -1
  6. package/examples/jsm/controls/OrbitControls.js +155 -25
  7. package/examples/jsm/csm/CSMShader.js +35 -1
  8. package/examples/jsm/environments/RoomEnvironment.js +1 -1
  9. package/examples/jsm/exporters/USDZExporter.js +1 -0
  10. package/examples/jsm/interactive/SelectionHelper.js +7 -0
  11. package/examples/jsm/libs/tween.module.js +790 -735
  12. package/examples/jsm/libs/utif.module.js +1644 -1558
  13. package/examples/jsm/loaders/DDSLoader.js +46 -3
  14. package/examples/jsm/loaders/EXRLoader.js +4 -4
  15. package/examples/jsm/loaders/FBXLoader.js +3 -1
  16. package/examples/jsm/loaders/GLTFLoader.js +25 -10
  17. package/examples/jsm/loaders/KTX2Loader.js +128 -79
  18. package/examples/jsm/loaders/LDrawLoader.js +1 -1
  19. package/examples/jsm/loaders/LogLuvLoader.js +2 -2
  20. package/examples/jsm/loaders/MMDLoader.js +10 -7
  21. package/examples/jsm/loaders/NRRDLoader.js +3 -3
  22. package/examples/jsm/loaders/PLYLoader.js +1 -1
  23. package/examples/jsm/loaders/RGBELoader.js +48 -66
  24. package/examples/jsm/loaders/STLLoader.js +7 -0
  25. package/examples/jsm/loaders/TGALoader.js +10 -10
  26. package/examples/jsm/loaders/VRMLLoader.js +1 -1
  27. package/examples/jsm/misc/GPUComputationRenderer.js +0 -9
  28. package/examples/jsm/misc/Volume.js +4 -6
  29. package/examples/jsm/nodes/Nodes.js +8 -6
  30. package/examples/jsm/nodes/accessors/BufferAttributeNode.js +29 -3
  31. package/examples/jsm/nodes/accessors/CubeTextureNode.js +20 -3
  32. package/examples/jsm/nodes/accessors/ExtendedMaterialNode.js +15 -4
  33. package/examples/jsm/nodes/accessors/InstanceNode.js +8 -8
  34. package/examples/jsm/nodes/accessors/LineMaterialNode.js +31 -0
  35. package/examples/jsm/nodes/accessors/MaterialNode.js +73 -61
  36. package/examples/jsm/nodes/accessors/MaterialReferenceNode.js +3 -0
  37. package/examples/jsm/nodes/accessors/Object3DNode.js +2 -2
  38. package/examples/jsm/nodes/accessors/SceneNode.js +6 -0
  39. package/examples/jsm/nodes/accessors/TextureNode.js +54 -9
  40. package/examples/jsm/nodes/accessors/TextureStoreNode.js +29 -0
  41. package/examples/jsm/nodes/core/AttributeNode.js +2 -2
  42. package/examples/jsm/nodes/core/LightingModel.js +7 -9
  43. package/examples/jsm/nodes/core/Node.js +28 -3
  44. package/examples/jsm/nodes/core/NodeBuilder.js +94 -12
  45. package/examples/jsm/nodes/core/NodeUniform.js +1 -1
  46. package/examples/jsm/nodes/core/OutputStructNode.js +58 -0
  47. package/examples/jsm/nodes/core/PropertyNode.js +6 -0
  48. package/examples/jsm/nodes/core/StackNode.js +4 -4
  49. package/examples/jsm/nodes/core/StructTypeNode.js +24 -0
  50. package/examples/jsm/nodes/display/BumpMapNode.js +77 -0
  51. package/examples/jsm/nodes/display/NormalMapNode.js +2 -2
  52. package/examples/jsm/nodes/display/ViewportNode.js +19 -5
  53. package/examples/jsm/nodes/functions/BSDF/BRDF_GGX.js +10 -2
  54. package/examples/jsm/nodes/functions/BSDF/Schlick_to_F0.js +13 -0
  55. package/examples/jsm/nodes/functions/PhongLightingModel.js +53 -14
  56. package/examples/jsm/nodes/functions/PhysicalLightingModel.js +236 -97
  57. package/examples/jsm/nodes/geometry/RangeNode.js +2 -2
  58. package/examples/jsm/nodes/gpgpu/ComputeNode.js +13 -0
  59. package/examples/jsm/nodes/lighting/AONode.js +1 -1
  60. package/examples/jsm/nodes/lighting/AnalyticLightNode.js +58 -20
  61. package/examples/jsm/nodes/lighting/DirectionalLightNode.js +7 -10
  62. package/examples/jsm/nodes/lighting/EnvironmentNode.js +22 -12
  63. package/examples/jsm/nodes/lighting/HemisphereLightNode.js +1 -1
  64. package/examples/jsm/nodes/lighting/LightingContextNode.js +12 -9
  65. package/examples/jsm/nodes/lighting/PointLightNode.js +7 -10
  66. package/examples/jsm/nodes/lighting/SpotLightNode.js +7 -10
  67. package/examples/jsm/nodes/materials/LineDashedNodeMaterial.js +54 -0
  68. package/examples/jsm/nodes/materials/Materials.js +2 -0
  69. package/examples/jsm/nodes/materials/MeshLambertNodeMaterial.js +34 -0
  70. package/examples/jsm/nodes/materials/MeshNormalNodeMaterial.js +2 -0
  71. package/examples/jsm/nodes/materials/MeshPhongNodeMaterial.js +2 -2
  72. package/examples/jsm/nodes/materials/MeshPhysicalNodeMaterial.js +19 -2
  73. package/examples/jsm/nodes/materials/MeshStandardNodeMaterial.js +2 -2
  74. package/examples/jsm/nodes/materials/NodeMaterial.js +61 -26
  75. package/examples/jsm/nodes/materials/SpriteNodeMaterial.js +2 -2
  76. package/examples/jsm/nodes/math/HashNode.js +35 -0
  77. package/examples/jsm/nodes/shadernode/ShaderNode.js +6 -2
  78. package/examples/jsm/nodes/utils/SplitNode.js +1 -1
  79. package/examples/jsm/objects/Reflector.js +1 -9
  80. package/examples/jsm/objects/Refractor.js +0 -8
  81. package/examples/jsm/offscreen/scene.js +0 -1
  82. package/examples/jsm/postprocessing/FilmPass.js +3 -5
  83. package/examples/jsm/postprocessing/MaskPass.js +4 -1
  84. package/examples/jsm/postprocessing/OutputPass.js +33 -14
  85. package/examples/jsm/postprocessing/RenderPass.js +30 -12
  86. package/examples/jsm/postprocessing/SAOPass.js +23 -98
  87. package/examples/jsm/postprocessing/SSAOPass.js +10 -30
  88. package/examples/jsm/postprocessing/UnrealBloomPass.js +21 -17
  89. package/examples/jsm/renderers/common/Backend.js +11 -8
  90. package/examples/jsm/renderers/common/Background.js +22 -20
  91. package/examples/jsm/renderers/common/Binding.js +14 -0
  92. package/examples/jsm/renderers/common/Bindings.js +7 -10
  93. package/examples/jsm/renderers/common/Geometries.js +1 -1
  94. package/examples/jsm/renderers/common/Pipelines.js +96 -47
  95. package/examples/jsm/renderers/common/RenderContext.js +1 -0
  96. package/examples/jsm/renderers/common/RenderContexts.js +41 -5
  97. package/examples/jsm/renderers/common/RenderList.js +12 -4
  98. package/examples/jsm/renderers/common/RenderObject.js +26 -6
  99. package/examples/jsm/renderers/common/RenderObjects.js +10 -7
  100. package/examples/jsm/renderers/common/Renderer.js +82 -42
  101. package/examples/jsm/renderers/common/SampledTexture.js +2 -1
  102. package/examples/jsm/renderers/common/Sampler.js +1 -1
  103. package/examples/jsm/renderers/common/StorageBuffer.js +1 -1
  104. package/examples/jsm/renderers/common/Textures.js +172 -20
  105. package/examples/jsm/renderers/common/nodes/NodeSampledTexture.js +2 -2
  106. package/examples/jsm/renderers/common/nodes/NodeSampler.js +1 -1
  107. package/examples/jsm/renderers/common/nodes/Nodes.js +58 -13
  108. package/examples/jsm/renderers/webgl/WebGLBackend.js +607 -0
  109. package/examples/jsm/renderers/webgl/nodes/GLSLNodeBuilder.js +118 -17
  110. package/examples/jsm/renderers/webgl/utils/WebGLAttributeUtils.js +84 -0
  111. package/examples/jsm/renderers/webgl/utils/WebGLExtensions.js +26 -0
  112. package/examples/jsm/renderers/webgl/utils/WebGLState.js +529 -0
  113. package/examples/jsm/renderers/webgl/utils/WebGLTextureUtils.js +199 -0
  114. package/examples/jsm/renderers/webgl/utils/WebGLUtils.js +242 -0
  115. package/examples/jsm/renderers/webgl-legacy/nodes/GLSL1NodeBuilder.js +340 -0
  116. package/examples/jsm/renderers/{webgl → webgl-legacy}/nodes/WebGLNodeBuilder.js +1 -1
  117. package/examples/jsm/renderers/webgpu/WebGPUBackend.js +320 -84
  118. package/examples/jsm/renderers/webgpu/WebGPURenderer.js +18 -2
  119. package/examples/jsm/renderers/webgpu/nodes/WGSLNodeBuilder.js +120 -66
  120. package/examples/jsm/renderers/webgpu/nodes/WGSLNodeFunction.js +2 -2
  121. package/examples/jsm/renderers/webgpu/utils/WebGPUAttributeUtils.js +55 -36
  122. package/examples/jsm/renderers/webgpu/utils/WebGPUBindingUtils.js +96 -5
  123. package/examples/jsm/renderers/webgpu/utils/WebGPUConstants.js +24 -22
  124. package/examples/jsm/renderers/webgpu/utils/WebGPUPipelineUtils.js +117 -139
  125. package/examples/jsm/renderers/webgpu/utils/WebGPUTextureUtils.js +60 -142
  126. package/examples/jsm/renderers/webgpu/utils/WebGPUUtils.js +7 -6
  127. package/examples/jsm/shaders/FilmShader.js +11 -54
  128. package/examples/jsm/shaders/OutputShader.js +19 -2
  129. package/examples/jsm/shaders/SAOShader.js +0 -13
  130. package/examples/jsm/shaders/SSAOShader.js +33 -26
  131. package/examples/jsm/utils/BufferGeometryUtils.js +13 -4
  132. package/examples/jsm/webxr/OculusHandPointerModel.js +2 -2
  133. package/package.json +2 -2
  134. package/src/Three.js +3 -0
  135. package/src/animation/PropertyBinding.js +1 -1
  136. package/src/audio/Audio.js +6 -0
  137. package/src/cameras/CubeCamera.js +1 -4
  138. package/src/constants.js +4 -1
  139. package/src/core/BufferAttribute.js +20 -0
  140. package/src/core/Object3D.js +2 -15
  141. package/src/core/RenderTarget.js +122 -0
  142. package/src/core/UniformsGroup.js +2 -2
  143. package/src/geometries/CapsuleGeometry.js +1 -1
  144. package/src/loaders/DataTextureLoader.js +19 -2
  145. package/src/materials/Material.js +2 -2
  146. package/src/math/Vector2.js +2 -2
  147. package/src/math/Vector3.js +3 -3
  148. package/src/math/Vector4.js +4 -4
  149. package/src/objects/Line.js +1 -1
  150. package/src/objects/Mesh.js +1 -1
  151. package/src/objects/Points.js +1 -1
  152. package/src/renderers/WebGLMultipleRenderTargets.js +0 -2
  153. package/src/renderers/WebGLRenderTarget.js +3 -110
  154. package/src/renderers/WebGLRenderer.js +83 -57
  155. package/src/renderers/shaders/ShaderChunk/iridescence_fragment.glsl.js +1 -2
  156. package/src/renderers/shaders/ShaderChunk/map_fragment.glsl.js +11 -1
  157. package/src/renderers/shaders/ShaderLib/background.glsl.js +8 -0
  158. package/src/renderers/webgl/WebGLBackground.js +5 -14
  159. package/src/renderers/webgl/WebGLGeometries.js +5 -1
  160. package/src/renderers/webgl/WebGLMaterials.js +1 -1
  161. package/src/renderers/webgl/WebGLProgram.js +2 -0
  162. package/src/renderers/webgl/WebGLPrograms.js +19 -3
  163. package/src/renderers/webgl/WebGLTextures.js +101 -16
  164. package/src/renderers/webgl/WebGLUtils.js +27 -20
  165. package/src/textures/CompressedCubeTexture.js +19 -0
  166. package/src/textures/Texture.js +2 -2
  167. package/src/utils.js +9 -1
  168. package/examples/jsm/nodes/functions/BSDF/BRDF_BlinnPhong.js +0 -30
  169. package/examples/jsm/renderers/common/RenderTarget.js +0 -15
  170. package/examples/jsm/renderers/common/nodes/NodeRender.js +0 -302
  171. /package/examples/jsm/renderers/{webgl → webgl-legacy}/nodes/SlotNode.js +0 -0
  172. /package/examples/jsm/renderers/{webgl → webgl-legacy}/nodes/WebGLNodes.js +0 -0
@@ -10,8 +10,9 @@ import RenderContexts from './RenderContexts.js';
10
10
  import Textures from './Textures.js';
11
11
  import Background from './Background.js';
12
12
  import Nodes from './nodes/Nodes.js';
13
- import { Frustum, Matrix4, Vector2, Vector3, Vector4, Color, DoubleSide, BackSide, FrontSide, SRGBColorSpace, NoToneMapping } from 'three';
13
+ import { Scene, Frustum, Matrix4, Vector2, Vector3, Vector4, Color, DoubleSide, BackSide, FrontSide, SRGBColorSpace, NoToneMapping } from 'three';
14
14
 
15
+ const _scene = new Scene();
15
16
  const _drawingBufferSize = new Vector2();
16
17
  const _screen = new Vector4();
17
18
  const _frustum = new Frustum();
@@ -137,7 +138,7 @@ class Renderer {
137
138
  this._textures = new Textures( backend, this._info );
138
139
  this._pipelines = new Pipelines( backend, this._nodes );
139
140
  this._bindings = new Bindings( backend, this._nodes, this._textures, this._attributes, this._pipelines, this._info );
140
- this._objects = new RenderObjects( this, this._nodes, this._geometries, this._pipelines, this._info );
141
+ this._objects = new RenderObjects( this, this._nodes, this._geometries, this._pipelines, this._bindings, this._info );
141
142
  this._renderLists = new RenderLists();
142
143
  this._renderContexts = new RenderContexts();
143
144
 
@@ -181,8 +182,10 @@ class Renderer {
181
182
 
182
183
  //
183
184
 
184
- const renderContext = this._renderContexts.get( scene, camera );
185
+ const sceneRef = ( scene.isScene === true ) ? scene : _scene;
186
+
185
187
  const renderTarget = this._renderTarget;
188
+ const renderContext = this._renderContexts.get( scene, camera, renderTarget );
186
189
  const activeCubeFace = this._activeCubeFace;
187
190
 
188
191
  this._currentRenderContext = renderContext;
@@ -247,11 +250,15 @@ class Renderer {
247
250
 
248
251
  //
249
252
 
253
+ sceneRef.onBeforeRender( this, scene, camera, renderTarget );
254
+
255
+ //
256
+
250
257
  _projScreenMatrix.multiplyMatrices( camera.projectionMatrix, camera.matrixWorldInverse );
251
258
  _frustum.setFromProjectionMatrix( _projScreenMatrix, coordinateSystem );
252
259
 
253
260
  const renderList = this._renderLists.get( scene, camera );
254
- renderList.init();
261
+ renderList.begin();
255
262
 
256
263
  this._projectObject( scene, camera, 0, renderList );
257
264
 
@@ -271,25 +278,26 @@ class Renderer {
271
278
 
272
279
  const renderTargetData = this._textures.get( renderTarget );
273
280
 
274
- renderContext.texture = renderTargetData.texture;
281
+ renderContext.textures = renderTargetData.textures;
275
282
  renderContext.depthTexture = renderTargetData.depthTexture;
276
283
 
277
284
  } else {
278
285
 
279
- renderContext.texture = null;
286
+ renderContext.textures = null;
280
287
  renderContext.depthTexture = null;
281
288
 
282
289
  }
283
290
 
284
291
  renderContext.activeCubeFace = activeCubeFace;
292
+ renderContext.occlusionQueryCount = renderList.occlusionQueryCount;
285
293
 
286
294
  //
287
295
 
288
- this._nodes.updateScene( scene );
296
+ this._nodes.updateScene( sceneRef );
289
297
 
290
298
  //
291
299
 
292
- this._background.update( scene, renderList, renderContext );
300
+ this._background.update( sceneRef, renderList, renderContext );
293
301
 
294
302
  //
295
303
 
@@ -301,8 +309,8 @@ class Renderer {
301
309
  const transparentObjects = renderList.transparent;
302
310
  const lightsNode = renderList.lightsNode;
303
311
 
304
- if ( opaqueObjects.length > 0 ) this._renderObjects( opaqueObjects, camera, scene, lightsNode );
305
- if ( transparentObjects.length > 0 ) this._renderObjects( transparentObjects, camera, scene, lightsNode );
312
+ if ( opaqueObjects.length > 0 ) this._renderObjects( opaqueObjects, camera, sceneRef, lightsNode );
313
+ if ( transparentObjects.length > 0 ) this._renderObjects( transparentObjects, camera, sceneRef, lightsNode );
306
314
 
307
315
  // finish render pass
308
316
 
@@ -315,6 +323,10 @@ class Renderer {
315
323
 
316
324
  this._lastRenderContext = renderContext;
317
325
 
326
+ //
327
+
328
+ sceneRef.onAfterRender( this, scene, camera, renderTarget );
329
+
318
330
  }
319
331
 
320
332
  setAnimationLoop( callback ) {
@@ -329,9 +341,17 @@ class Renderer {
329
341
 
330
342
  }
331
343
 
332
- async getArrayBuffer( attribute ) {
344
+ getArrayBuffer( attribute ) { // @deprecated, r155
345
+
346
+ console.warn( 'THREE.Renderer: getArrayBuffer() is deprecated. Use getArrayBufferAsync() instead.' );
347
+
348
+ return this.getArrayBufferAsync( attribute );
349
+
350
+ }
351
+
352
+ async getArrayBufferAsync( attribute ) {
333
353
 
334
- return await this.backend.getArrayBuffer( attribute );
354
+ return await this.backend.getArrayBufferAsync( attribute );
335
355
 
336
356
  }
337
357
 
@@ -531,6 +551,14 @@ class Renderer {
531
551
 
532
552
  }
533
553
 
554
+ isOccluded( object ) {
555
+
556
+ const renderContext = this._currentRenderContext || this._lastRenderContext;
557
+
558
+ return renderContext && this.backend.isOccluded( renderContext, object );
559
+
560
+ }
561
+
534
562
  clear( color = true, depth = true, stencil = true ) {
535
563
 
536
564
  const renderContext = this._currentRenderContext || this._lastRenderContext;
@@ -581,43 +609,59 @@ class Renderer {
581
609
 
582
610
  }
583
611
 
612
+ getRenderTarget() {
613
+
614
+ return this._renderTarget;
615
+
616
+ }
617
+
584
618
  async compute( computeNodes ) {
585
619
 
586
620
  if ( this._initialized === false ) await this.init();
587
621
 
588
622
  const backend = this.backend;
589
623
  const pipelines = this._pipelines;
590
- const computeGroup = Array.isArray( computeNodes ) ? computeNodes : [ computeNodes ];
624
+ const bindings = this._bindings;
625
+ const nodes = this._nodes;
626
+ const computeList = Array.isArray( computeNodes ) ? computeNodes : [ computeNodes ];
591
627
 
592
- backend.beginCompute( computeGroup );
628
+ backend.beginCompute( computeNodes );
593
629
 
594
- for ( const computeNode of computeGroup ) {
630
+ for ( const computeNode of computeList ) {
595
631
 
596
632
  // onInit
597
633
 
598
634
  if ( pipelines.has( computeNode ) === false ) {
599
635
 
600
- computeNode.onInit( { renderer: this } );
636
+ const dispose = () => {
601
637
 
602
- }
638
+ computeNode.removeEventListener( 'dispose', dispose );
603
639
 
604
- this._nodes.updateForCompute( computeNode );
605
- this._bindings.updateForCompute( computeNode );
640
+ pipelines.delete( computeNode );
641
+ bindings.delete( computeNode );
642
+ nodes.delete( computeNode );
606
643
 
607
- const computePipeline = pipelines.getForCompute( computeNode );
608
- const computeBindings = this._bindings.getForCompute( computeNode );
644
+ };
609
645
 
610
- backend.compute( computeGroup, computeNode, computeBindings, computePipeline );
646
+ computeNode.addEventListener( 'dispose', dispose );
611
647
 
612
- }
648
+ //
613
649
 
614
- backend.finishCompute( computeGroup );
650
+ computeNode.onInit( { renderer: this } );
615
651
 
616
- }
652
+ }
617
653
 
618
- getRenderTarget() {
654
+ nodes.updateForCompute( computeNode );
655
+ bindings.updateForCompute( computeNode );
619
656
 
620
- return this._renderTarget;
657
+ const computeBindings = bindings.getForCompute( computeNode );
658
+ const computePipeline = pipelines.getForCompute( computeNode, computeBindings );
659
+
660
+ backend.compute( computeNodes, computeNode, computeBindings, computePipeline );
661
+
662
+ }
663
+
664
+ backend.finishCompute( computeNodes );
621
665
 
622
666
  }
623
667
 
@@ -803,13 +847,6 @@ class Renderer {
803
847
 
804
848
  object.onBeforeRender( this, scene, camera, geometry, material, group );
805
849
 
806
- //
807
-
808
- object.modelViewMatrix.multiplyMatrices( camera.matrixWorldInverse, object.matrixWorld );
809
- object.normalMatrix.getNormalMatrix( object.modelViewMatrix );
810
-
811
- //
812
-
813
850
  material.onBeforeRender( this, scene, camera, geometry, material, group );
814
851
 
815
852
  //
@@ -817,16 +854,16 @@ class Renderer {
817
854
  if ( material.transparent === true && material.side === DoubleSide && material.forceSinglePass === false ) {
818
855
 
819
856
  material.side = BackSide;
820
- this._renderObjectDirect( object, scene, camera, geometry, material, group, lightsNode, 'backSide' ); // create backSide pass id
857
+ this._renderObjectDirect( object, material, scene, camera, lightsNode, 'backSide' ); // create backSide pass id
821
858
 
822
859
  material.side = FrontSide;
823
- this._renderObjectDirect( object, scene, camera, geometry, material, group, lightsNode ); // use default pass id
860
+ this._renderObjectDirect( object, material, scene, camera, lightsNode ); // use default pass id
824
861
 
825
862
  material.side = DoubleSide;
826
863
 
827
864
  } else {
828
865
 
829
- this._renderObjectDirect( object, scene, camera, geometry, material, group, lightsNode );
866
+ this._renderObjectDirect( object, material, scene, camera, lightsNode );
830
867
 
831
868
  }
832
869
 
@@ -836,22 +873,25 @@ class Renderer {
836
873
 
837
874
  }
838
875
 
839
- _renderObjectDirect( object, scene, camera, geometry, material, group, lightsNode, passId ) {
876
+ _renderObjectDirect( object, material, scene, camera, lightsNode, passId ) {
877
+
878
+ const renderObject = this._objects.get( object, material, scene, camera, lightsNode, this._currentRenderContext, passId );
840
879
 
841
880
  //
842
881
 
843
- const renderObject = this._objects.get( object, material, scene, camera, lightsNode, passId );
844
- renderObject.context = this._currentRenderContext;
882
+ this._nodes.updateBefore( renderObject );
845
883
 
846
884
  //
847
885
 
848
- this._nodes.updateBefore( renderObject );
886
+ object.modelViewMatrix.multiplyMatrices( camera.matrixWorldInverse, object.matrixWorld );
887
+ object.normalMatrix.getNormalMatrix( object.modelViewMatrix );
849
888
 
850
889
  //
851
890
 
852
891
  this._nodes.updateForRender( renderObject );
853
- this._geometries.update( renderObject );
892
+ this._geometries.updateForRender( renderObject );
854
893
  this._bindings.updateForRender( renderObject );
894
+ this._pipelines.updateForRender( renderObject );
855
895
 
856
896
  //
857
897
 
@@ -11,7 +11,8 @@ class SampledTexture extends Binding {
11
11
  this.id = id ++;
12
12
 
13
13
  this.texture = texture;
14
- this.version = texture.version;
14
+ this.version = texture ? texture.version : 0;
15
+ this.store = false;
15
16
 
16
17
  this.isSampledTexture = true;
17
18
 
@@ -7,7 +7,7 @@ class Sampler extends Binding {
7
7
  super( name );
8
8
 
9
9
  this.texture = texture;
10
- this.version = texture.version;
10
+ this.version = texture ? texture.version : 0;
11
11
 
12
12
  this.isSampler = true;
13
13
 
@@ -4,7 +4,7 @@ class StorageBuffer extends Buffer {
4
4
 
5
5
  constructor( name, attribute ) {
6
6
 
7
- super( name, attribute.array );
7
+ super( name, attribute ? attribute.array : null );
8
8
 
9
9
  this.attribute = attribute;
10
10
 
@@ -1,7 +1,8 @@
1
1
  import DataMap from './DataMap.js';
2
- import { Vector2, DepthTexture, DepthStencilFormat, UnsignedInt248Type } from 'three';
3
2
 
4
- const _size = new Vector2();
3
+ import { Vector3, DepthTexture, DepthStencilFormat, UnsignedInt248Type, LinearFilter, NearestFilter, EquirectangularReflectionMapping, EquirectangularRefractionMapping, CubeReflectionMapping, CubeRefractionMapping } from 'three';
4
+
5
+ const _size = new Vector3();
5
6
 
6
7
  class Textures extends DataMap {
7
8
 
@@ -17,11 +18,26 @@ class Textures extends DataMap {
17
18
  updateRenderTarget( renderTarget ) {
18
19
 
19
20
  const renderTargetData = this.get( renderTarget );
21
+ const sampleCount = renderTarget.samples === 0 ? 1 : renderTarget.samples;
22
+
23
+ let texture, textures;
24
+
25
+ if ( renderTarget.isWebGLMultipleRenderTargets ) {
26
+
27
+ textures = renderTarget.texture;
28
+ texture = renderTarget.texture[ 0 ];
29
+
30
+ } else {
31
+
32
+ textures = [ renderTarget.texture ];
33
+ texture = renderTarget.texture;
34
+
35
+ }
20
36
 
21
- const texture = renderTarget.texture;
22
37
  const size = this.getSize( texture );
23
38
 
24
39
  let depthTexture = renderTarget.depthTexture || renderTargetData.depthTexture;
40
+ let textureNeedsUpdate = false;
25
41
 
26
42
  if ( depthTexture === undefined ) {
27
43
 
@@ -35,7 +51,7 @@ class Textures extends DataMap {
35
51
 
36
52
  if ( renderTargetData.width !== size.width || size.height !== renderTargetData.height ) {
37
53
 
38
- texture.needsUpdate = true;
54
+ textureNeedsUpdate = true;
39
55
  depthTexture.needsUpdate = true;
40
56
 
41
57
  depthTexture.image.width = size.width;
@@ -45,11 +61,32 @@ class Textures extends DataMap {
45
61
 
46
62
  renderTargetData.width = size.width;
47
63
  renderTargetData.height = size.height;
48
- renderTargetData.texture = texture;
64
+ renderTargetData.textures = textures;
49
65
  renderTargetData.depthTexture = depthTexture;
50
66
 
51
- this.updateTexture( texture );
52
- this.updateTexture( depthTexture );
67
+ if ( renderTargetData.sampleCount !== sampleCount ) {
68
+
69
+ textureNeedsUpdate = true;
70
+ depthTexture.needsUpdate = true;
71
+
72
+ renderTargetData.sampleCount = sampleCount;
73
+
74
+ }
75
+
76
+ const options = { sampleCount };
77
+
78
+
79
+ for ( let i = 0; i < textures.length; i ++ ) {
80
+
81
+ const texture = textures[ i ];
82
+
83
+ if ( textureNeedsUpdate ) texture.needsUpdate = true;
84
+
85
+ this.updateTexture( texture, options );
86
+
87
+ }
88
+
89
+ this.updateTexture( depthTexture, options );
53
90
 
54
91
  // dispose handler
55
92
 
@@ -63,7 +100,20 @@ class Textures extends DataMap {
63
100
 
64
101
  renderTarget.removeEventListener( 'dispose', onDispose );
65
102
 
66
- this._destroyTexture( texture );
103
+ if ( textures !== undefined ) {
104
+
105
+ for ( let i = 0; i < textures.length; i ++ ) {
106
+
107
+ this._destroyTexture( textures[ i ] );
108
+
109
+ }
110
+
111
+ } else {
112
+
113
+ this._destroyTexture( texture );
114
+
115
+ }
116
+
67
117
  this._destroyTexture( depthTexture );
68
118
 
69
119
  };
@@ -74,15 +124,15 @@ class Textures extends DataMap {
74
124
 
75
125
  }
76
126
 
77
- updateTexture( texture ) {
127
+ updateTexture( texture, options = {} ) {
78
128
 
79
129
  const textureData = this.get( texture );
80
130
  if ( textureData.initialized === true && textureData.version === texture.version ) return;
81
131
 
82
- const isRenderTexture = texture.isRenderTargetTexture || texture.isDepthTexture || texture.isFramebufferTexture;
132
+ const isRenderTarget = texture.isRenderTargetTexture || texture.isDepthTexture || texture.isFramebufferTexture;
83
133
  const backend = this.backend;
84
134
 
85
- if ( isRenderTexture && textureData.initialized === true ) {
135
+ if ( isRenderTarget && textureData.initialized === true ) {
86
136
 
87
137
  // it's an update
88
138
 
@@ -93,10 +143,22 @@ class Textures extends DataMap {
93
143
 
94
144
  //
95
145
 
96
- if ( isRenderTexture ) {
146
+ const { width, height, depth } = this.getSize( texture );
147
+
148
+ options.width = width;
149
+ options.height = height;
150
+ options.depth = depth;
151
+ options.needsMipmaps = this.needsMipmaps( texture );
152
+ options.levels = options.needsMipmaps ? this.getMipLevels( texture, width, height ) : 1;
153
+
154
+ //
155
+
156
+ if ( isRenderTarget || options.store === true ) {
157
+
158
+ //if ( options.store === true ) options.levels = 1; /* no mipmaps? */
97
159
 
98
160
  backend.createSampler( texture );
99
- backend.createTexture( texture );
161
+ backend.createTexture( texture, options );
100
162
 
101
163
  } else {
102
164
 
@@ -118,15 +180,35 @@ class Textures extends DataMap {
118
180
 
119
181
  } else {
120
182
 
183
+ if ( texture.images ) {
184
+
185
+ const images = [];
186
+
187
+ for ( const image of texture.images ) {
188
+
189
+ images.push( this._getUploadImage( image ) );
190
+
191
+ }
192
+
193
+ options.images = images;
194
+
195
+ } else {
196
+
197
+ options.image = this._getUploadImage( image );
198
+
199
+ }
200
+
121
201
  if ( textureData.isDefaultTexture === undefined || textureData.isDefaultTexture === true ) {
122
202
 
123
- backend.createTexture( texture );
203
+ backend.createTexture( texture, options );
124
204
 
125
205
  textureData.isDefaultTexture = false;
126
206
 
127
207
  }
128
208
 
129
- backend.updateTexture( texture );
209
+ backend.updateTexture( texture, options );
210
+
211
+ if ( options.needsMipmaps ) backend.generateMipmaps( texture );
130
212
 
131
213
  }
132
214
 
@@ -176,15 +258,19 @@ class Textures extends DataMap {
176
258
 
177
259
  getSize( texture, target = _size ) {
178
260
 
179
- if ( texture.isCubeTexture ) {
261
+ let image = texture.images ? texture.images[ 0 ] : texture.image;
180
262
 
181
- target.width = texture.image[ 0 ].width;
182
- target.height = texture.image[ 0 ].height;
263
+ if ( image ) {
264
+
265
+ if ( image.image !== undefined ) image = image.image;
266
+
267
+ target.width = image.width;
268
+ target.height = image.height;
269
+ target.depth = texture.isCubeTexture ? 6 : ( image.depth || 1 );
183
270
 
184
271
  } else {
185
272
 
186
- target.width = texture.image.width;
187
- target.height = texture.image.height;
273
+ target.width = target.height = target.depth = 1;
188
274
 
189
275
  }
190
276
 
@@ -192,6 +278,72 @@ class Textures extends DataMap {
192
278
 
193
279
  }
194
280
 
281
+ getMipLevels( texture, width, height ) {
282
+
283
+ let mipLevelCount;
284
+
285
+ if ( texture.isCompressedTexture ) {
286
+
287
+ mipLevelCount = texture.mipmaps.length;
288
+
289
+ } else {
290
+
291
+ mipLevelCount = Math.floor( Math.log2( Math.max( width, height ) ) ) + 1;
292
+
293
+ }
294
+
295
+ return mipLevelCount;
296
+
297
+ }
298
+
299
+ needsMipmaps( texture ) {
300
+
301
+ if ( this.isEnvironmentTexture( texture ) ) return true;
302
+
303
+ return ( texture.isCompressedTexture !== true ) /*&& ( texture.generateMipmaps === true )*/ && ( texture.minFilter !== NearestFilter ) && ( texture.minFilter !== LinearFilter );
304
+
305
+ }
306
+
307
+ isEnvironmentTexture( texture ) {
308
+
309
+ const mapping = texture.mapping;
310
+
311
+ return ( mapping === EquirectangularReflectionMapping || mapping === EquirectangularRefractionMapping ) || ( mapping === CubeReflectionMapping || mapping === CubeRefractionMapping );
312
+
313
+ }
314
+
315
+ _getUploadImage( image ) {
316
+
317
+ if ( this._isHTMLImage( image ) ) {
318
+
319
+ return this._imageToCanvas( image );
320
+
321
+ }
322
+
323
+ return image;
324
+
325
+ }
326
+
327
+ _imageToCanvas( image ) {
328
+
329
+ const { width, height } = image;
330
+
331
+ // eslint-disable-next-line compat/compat
332
+ const canvas = new OffscreenCanvas( width, height );
333
+
334
+ const context = canvas.getContext( '2d' );
335
+ context.drawImage( image, 0, 0, width, height );
336
+
337
+ return canvas;
338
+
339
+ }
340
+
341
+ _isHTMLImage( image ) {
342
+
343
+ return ( typeof HTMLImageElement !== 'undefined' && image instanceof HTMLImageElement ) || ( typeof HTMLCanvasElement !== 'undefined' && image instanceof HTMLCanvasElement );
344
+
345
+ }
346
+
195
347
  _destroyTexture( texture ) {
196
348
 
197
349
  this.backend.destroySampler( texture );
@@ -4,7 +4,7 @@ class NodeSampledTexture extends SampledTexture {
4
4
 
5
5
  constructor( name, textureNode ) {
6
6
 
7
- super( name, textureNode.value );
7
+ super( name, textureNode ? textureNode.value : null );
8
8
 
9
9
  this.textureNode = textureNode;
10
10
 
@@ -22,7 +22,7 @@ class NodeSampledCubeTexture extends SampledCubeTexture {
22
22
 
23
23
  constructor( name, textureNode ) {
24
24
 
25
- super( name, textureNode.value );
25
+ super( name, textureNode ? textureNode.value : null );
26
26
 
27
27
  this.textureNode = textureNode;
28
28
 
@@ -4,7 +4,7 @@ class NodeSampler extends Sampler {
4
4
 
5
5
  constructor( name, textureNode ) {
6
6
 
7
- super( name, textureNode.value );
7
+ super( name, textureNode ? textureNode.value : null );
8
8
 
9
9
  this.textureNode = textureNode;
10
10