super-three 0.169.1 → 0.170.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 (193) hide show
  1. package/build/three.cjs +974 -562
  2. package/build/three.module.js +975 -559
  3. package/build/three.module.min.js +1 -1
  4. package/build/three.webgpu.js +8398 -9842
  5. package/build/three.webgpu.min.js +1 -1
  6. package/build/three.webgpu.nodes.js +8398 -9842
  7. package/build/three.webgpu.nodes.min.js +1 -1
  8. package/examples/jsm/Addons.js +3 -3
  9. package/examples/jsm/animation/MMDAnimationHelper.js +2 -0
  10. package/examples/jsm/animation/MMDPhysics.js +2 -0
  11. package/examples/jsm/controls/TransformControls.js +22 -6
  12. package/examples/jsm/csm/CSM.js +2 -2
  13. package/examples/jsm/csm/CSMFrustum.js +7 -4
  14. package/examples/jsm/csm/CSMHelper.js +2 -0
  15. package/examples/jsm/csm/CSMShadowNode.js +435 -0
  16. package/examples/jsm/curves/NURBSCurve.js +34 -3
  17. package/examples/jsm/exporters/GLTFExporter.js +138 -71
  18. package/examples/jsm/exporters/KTX2Exporter.js +35 -12
  19. package/examples/jsm/exporters/MMDExporter.js +6 -0
  20. package/examples/jsm/exporters/USDZExporter.js +21 -3
  21. package/examples/jsm/geometries/DecalGeometry.js +65 -20
  22. package/examples/jsm/geometries/InstancedPointsGeometry.js +2 -0
  23. package/examples/jsm/helpers/TextureHelperGPU.js +175 -0
  24. package/examples/jsm/interactive/HTMLMesh.js +1 -0
  25. package/examples/jsm/lighting/TiledLighting.js +18 -0
  26. package/examples/jsm/lights/RectAreaLightTexturesLib.js +1 -1
  27. package/examples/jsm/lines/LineMaterial.js +7 -2
  28. package/examples/jsm/lines/LineSegmentsGeometry.js +2 -0
  29. package/examples/jsm/lines/webgpu/LineSegments2.js +0 -15
  30. package/examples/jsm/lines/webgpu/Wireframe.js +56 -0
  31. package/examples/jsm/loaders/3DMLoader.js +1 -0
  32. package/examples/jsm/loaders/3MFLoader.js +91 -0
  33. package/examples/jsm/loaders/FBXLoader.js +12 -2
  34. package/examples/jsm/loaders/GLTFLoader.js +2 -0
  35. package/examples/jsm/loaders/KTX2Loader.js +140 -49
  36. package/examples/jsm/loaders/LDrawLoader.js +22 -136
  37. package/examples/jsm/loaders/LottieLoader.js +1 -0
  38. package/examples/jsm/loaders/MMDLoader.js +9 -2
  39. package/examples/jsm/materials/LDrawConditionalLineMaterial.js +143 -0
  40. package/examples/jsm/materials/LDrawConditionalLineNodeMaterial.js +114 -0
  41. package/examples/jsm/materials/MeshGouraudMaterial.js +6 -2
  42. package/examples/jsm/math/ColorSpaces.js +76 -0
  43. package/examples/jsm/misc/ProgressiveLightMap.js +52 -40
  44. package/examples/jsm/misc/ProgressiveLightMapGPU.js +293 -0
  45. package/examples/jsm/misc/VolumeSlice.js +1 -0
  46. package/examples/jsm/objects/WaterMesh.js +8 -8
  47. package/examples/jsm/postprocessing/AfterimagePass.js +14 -3
  48. package/examples/jsm/postprocessing/SSRPass.js +6 -0
  49. package/examples/jsm/renderers/CSS2DRenderer.js +6 -3
  50. package/examples/jsm/renderers/CSS3DRenderer.js +7 -4
  51. package/examples/jsm/shaders/FXAAShader.js +225 -224
  52. package/examples/jsm/transpiler/ShaderToyDecoder.js +1 -1
  53. package/{src/nodes → examples/jsm/tsl}/display/AfterImageNode.js +17 -20
  54. package/{src/nodes → examples/jsm/tsl}/display/AnaglyphPassNode.js +2 -6
  55. package/{src/nodes → examples/jsm/tsl}/display/AnamorphicNode.js +12 -18
  56. package/{src/nodes → examples/jsm/tsl}/display/BleachBypass.js +1 -3
  57. package/{src/nodes → examples/jsm/tsl}/display/BloomNode.js +11 -40
  58. package/{src/nodes → examples/jsm/tsl}/display/DenoiseNode.js +18 -41
  59. package/{src/nodes → examples/jsm/tsl}/display/DepthOfFieldNode.js +2 -8
  60. package/{src/nodes → examples/jsm/tsl}/display/DotScreenNode.js +2 -9
  61. package/examples/jsm/tsl/display/FXAANode.js +316 -0
  62. package/{src/nodes → examples/jsm/tsl}/display/FilmNode.js +2 -6
  63. package/{src/nodes → examples/jsm/tsl}/display/GTAONode.js +30 -70
  64. package/{src/nodes → examples/jsm/tsl}/display/GaussianBlurNode.js +74 -36
  65. package/examples/jsm/tsl/display/LensflareNode.js +161 -0
  66. package/{src/nodes → examples/jsm/tsl}/display/Lut3DNode.js +1 -4
  67. package/{src/nodes → examples/jsm/tsl}/display/MotionBlur.js +2 -3
  68. package/examples/jsm/tsl/display/OutlineNode.js +434 -0
  69. package/{src/nodes → examples/jsm/tsl}/display/ParallaxBarrierPassNode.js +1 -5
  70. package/{src/nodes → examples/jsm/tsl}/display/PixelationPassNode.js +3 -15
  71. package/{src/nodes → examples/jsm/tsl}/display/RGBShiftNode.js +1 -6
  72. package/examples/jsm/tsl/display/SMAANode.js +620 -0
  73. package/{src/nodes → examples/jsm/tsl}/display/SSAAPassNode.js +10 -25
  74. package/examples/jsm/tsl/display/SSRNode.js +343 -0
  75. package/{src/nodes → examples/jsm/tsl}/display/Sepia.js +1 -2
  76. package/{src/nodes → examples/jsm/tsl}/display/SobelOperatorNode.js +3 -11
  77. package/{src/nodes → examples/jsm/tsl}/display/StereoCompositePassNode.js +9 -11
  78. package/{src/nodes → examples/jsm/tsl}/display/StereoPassNode.js +10 -11
  79. package/examples/jsm/tsl/display/TRAAPassNode.js +355 -0
  80. package/{src/nodes → examples/jsm/tsl}/display/TransitionNode.js +1 -6
  81. package/examples/jsm/tsl/display/hashBlur.js +24 -0
  82. package/examples/jsm/tsl/lighting/TiledLightsNode.js +392 -0
  83. package/examples/jsm/utils/{TextureUtilsGPU.js → WebGPUTextureUtils.js} +2 -1
  84. package/examples/jsm/webxr/OculusHandPointerModel.js +21 -21
  85. package/examples/jsm/webxr/Text2D.js +6 -6
  86. package/package.json +2 -2
  87. package/src/Three.WebGPU.Nodes.js +4 -0
  88. package/src/Three.WebGPU.js +4 -0
  89. package/src/constants.js +1 -6
  90. package/src/core/BufferGeometry.js +44 -6
  91. package/src/geometries/CylinderGeometry.js +2 -2
  92. package/src/materials/LineBasicMaterial.js +6 -2
  93. package/src/materials/LineDashedMaterial.js +6 -2
  94. package/src/materials/Material.js +14 -1
  95. package/src/materials/MeshBasicMaterial.js +6 -2
  96. package/src/materials/MeshDepthMaterial.js +6 -2
  97. package/src/materials/MeshDistanceMaterial.js +6 -2
  98. package/src/materials/MeshLambertMaterial.js +6 -2
  99. package/src/materials/MeshMatcapMaterial.js +6 -2
  100. package/src/materials/MeshNormalMaterial.js +6 -2
  101. package/src/materials/MeshPhongMaterial.js +6 -2
  102. package/src/materials/MeshPhysicalMaterial.js +6 -2
  103. package/src/materials/MeshStandardMaterial.js +6 -2
  104. package/src/materials/MeshToonMaterial.js +6 -2
  105. package/src/materials/PointsMaterial.js +6 -2
  106. package/src/materials/RawShaderMaterial.js +6 -2
  107. package/src/materials/ShaderMaterial.js +6 -2
  108. package/src/materials/ShadowMaterial.js +6 -2
  109. package/src/materials/SpriteMaterial.js +6 -2
  110. package/src/materials/nodes/NodeMaterial.js +31 -9
  111. package/src/materials/nodes/SpriteNodeMaterial.js +11 -2
  112. package/src/materials/nodes/manager/NodeMaterialObserver.js +111 -2
  113. package/src/math/ColorManagement.js +118 -85
  114. package/src/math/Vector4.js +11 -0
  115. package/src/nodes/Nodes.js +1 -21
  116. package/src/nodes/TSL.js +6 -24
  117. package/src/nodes/accessors/Camera.js +0 -1
  118. package/src/nodes/accessors/SceneNode.js +35 -1
  119. package/src/nodes/accessors/StorageBufferNode.js +32 -10
  120. package/src/nodes/accessors/VelocityNode.js +13 -3
  121. package/src/nodes/code/FunctionCallNode.js +16 -5
  122. package/src/nodes/code/ScriptableNode.js +4 -4
  123. package/src/nodes/core/Node.js +1 -0
  124. package/src/nodes/core/NodeBuilder.js +29 -5
  125. package/src/nodes/core/VarNode.js +15 -3
  126. package/src/nodes/display/ColorAdjustment.js +53 -4
  127. package/src/nodes/display/ColorSpaceFunctions.js +5 -5
  128. package/src/nodes/display/ColorSpaceNode.js +27 -39
  129. package/src/nodes/display/PassNode.js +6 -4
  130. package/src/nodes/display/ToneMappingNode.js +1 -1
  131. package/src/nodes/display/ViewportDepthNode.js +33 -1
  132. package/src/nodes/functions/PhysicalLightingModel.js +21 -15
  133. package/src/nodes/functions/material/getAlphaHashThreshold.js +64 -0
  134. package/src/nodes/functions/material/getGeometryRoughness.js +8 -2
  135. package/src/nodes/functions/material/getParallaxCorrectNormal.js +22 -0
  136. package/src/nodes/gpgpu/ComputeNode.js +9 -1
  137. package/src/nodes/lighting/AnalyticLightNode.js +12 -416
  138. package/src/nodes/lighting/LightsNode.js +24 -12
  139. package/src/nodes/lighting/PointLightNode.js +36 -26
  140. package/src/nodes/lighting/RectAreaLightNode.js +3 -0
  141. package/src/nodes/lighting/ShadowNode.js +484 -0
  142. package/src/nodes/utils/LoopNode.js +2 -2
  143. package/src/nodes/utils/Oscillators.js +6 -0
  144. package/src/nodes/utils/PostProcessingUtils.js +89 -0
  145. package/src/nodes/utils/ReflectorNode.js +101 -15
  146. package/src/nodes/utils/Timer.js +29 -0
  147. package/src/objects/BatchedMesh.js +458 -241
  148. package/src/renderers/WebGLRenderer.js +120 -117
  149. package/src/renderers/common/Attributes.js +4 -0
  150. package/src/renderers/common/Backend.js +2 -0
  151. package/src/renderers/common/Background.js +14 -4
  152. package/src/renderers/common/Bindings.js +3 -2
  153. package/src/renderers/common/Constants.js +2 -1
  154. package/src/renderers/common/Geometries.js +20 -0
  155. package/src/renderers/common/IndirectStorageBufferAttribute.js +15 -0
  156. package/src/renderers/common/Lighting.js +45 -0
  157. package/src/renderers/common/PostProcessingUtils.js +86 -0
  158. package/src/renderers/common/RenderList.js +39 -11
  159. package/src/renderers/common/RenderLists.js +4 -2
  160. package/src/renderers/common/RenderObject.js +18 -1
  161. package/src/renderers/common/Renderer.js +165 -26
  162. package/src/renderers/common/Textures.js +30 -14
  163. package/src/renderers/common/nodes/NodeLibrary.js +1 -14
  164. package/src/renderers/common/nodes/Nodes.js +2 -2
  165. package/src/renderers/shaders/ShaderChunk/colorspace_pars_fragment.glsl.js +4 -24
  166. package/src/renderers/shaders/ShaderChunk/emissivemap_fragment.glsl.js +8 -0
  167. package/src/renderers/shaders/ShaderChunk/map_fragment.glsl.js +2 -2
  168. package/src/renderers/webgl/WebGLBufferRenderer.js +2 -6
  169. package/src/renderers/webgl/WebGLCapabilities.js +0 -7
  170. package/src/renderers/webgl/WebGLIndexedBufferRenderer.js +2 -6
  171. package/src/renderers/webgl/WebGLProgram.js +24 -28
  172. package/src/renderers/webgl/WebGLPrograms.js +5 -2
  173. package/src/renderers/webgl/WebGLState.js +37 -1
  174. package/src/renderers/webgl/WebGLTextures.js +29 -12
  175. package/src/renderers/webgl-fallback/WebGLBackend.js +98 -31
  176. package/src/renderers/webgl-fallback/WebGLBufferRenderer.js +2 -7
  177. package/src/renderers/webgl-fallback/utils/WebGLTextureUtils.js +33 -8
  178. package/src/renderers/webgpu/WebGPUBackend.js +105 -25
  179. package/src/renderers/webgpu/WebGPURenderer.Nodes.js +1 -1
  180. package/src/renderers/webgpu/WebGPURenderer.js +1 -1
  181. package/src/renderers/webgpu/nodes/BasicNodeLibrary.js +0 -8
  182. package/src/renderers/webgpu/nodes/StandardNodeLibrary.js +0 -8
  183. package/src/renderers/webgpu/nodes/WGSLNodeBuilder.js +10 -20
  184. package/src/renderers/webgpu/nodes/WGSLNodeFunction.js +12 -4
  185. package/src/renderers/webgpu/utils/WebGPUPipelineUtils.js +29 -9
  186. package/src/renderers/webgpu/utils/WebGPUTextureUtils.js +24 -6
  187. package/src/renderers/webgpu/utils/WebGPUUtils.js +0 -1
  188. package/src/renderers/webxr/WebXRManager.js +4 -4
  189. package/examples/jsm/cameras/CinematicCamera.js +0 -208
  190. package/src/nodes/display/FXAANode.js +0 -332
  191. package/src/nodes/utils/OscNode.js +0 -85
  192. package/src/nodes/utils/TimerNode.js +0 -97
  193. /package/examples/jsm/utils/{TextureUtils.js → WebGLTextureUtils.js} +0 -0
@@ -17,9 +17,7 @@ import {
17
17
  UnsignedInt248Type,
18
18
  UnsignedShort4444Type,
19
19
  UnsignedShort5551Type,
20
- WebGLCoordinateSystem,
21
- DisplayP3ColorSpace,
22
- LinearDisplayP3ColorSpace
20
+ WebGLCoordinateSystem
23
21
  } from '../constants.js';
24
22
  import { Color } from '../math/Color.js';
25
23
  import { Frustum } from '../math/Frustum.js';
@@ -73,6 +71,7 @@ class WebGLRenderer {
73
71
  preserveDrawingBuffer = false,
74
72
  powerPreference = 'default',
75
73
  failIfMajorPerformanceCaveat = false,
74
+ reverseDepthBuffer = false,
76
75
  multiviewStereo = false,
77
76
  } = parameters;
78
77
 
@@ -293,9 +292,13 @@ class WebGLRenderer {
293
292
 
294
293
  capabilities = new WebGLCapabilities( _gl, extensions, parameters, utils );
295
294
 
296
- state = new WebGLState( _gl );
295
+ state = new WebGLState( _gl, extensions );
297
296
 
298
- if ( capabilities.reverseDepthBuffer ) state.buffers.depth.setReversed( true );
297
+ if ( capabilities.reverseDepthBuffer && reverseDepthBuffer ) {
298
+
299
+ state.buffers.depth.setReversed( true );
300
+
301
+ }
299
302
 
300
303
  info = new WebGLInfo( _gl );
301
304
  properties = new WebGLProperties();
@@ -600,7 +603,6 @@ class WebGLRenderer {
600
603
  if ( depth ) {
601
604
 
602
605
  bits |= _gl.DEPTH_BUFFER_BIT;
603
- _gl.clearDepth( this.capabilities.reverseDepthBuffer ? 0 : 1 );
604
606
 
605
607
  }
606
608
 
@@ -2008,7 +2010,9 @@ class WebGLRenderer {
2008
2010
 
2009
2011
  } else {
2010
2012
 
2011
- if ( capabilities.reverseDepthBuffer ) {
2013
+ const reverseDepthBuffer = state.buffers.depth.getReversed();
2014
+
2015
+ if ( reverseDepthBuffer ) {
2012
2016
 
2013
2017
  _currentProjectionMatrix.copy( camera.projectionMatrix );
2014
2018
 
@@ -2640,21 +2644,27 @@ class WebGLRenderer {
2640
2644
 
2641
2645
  }
2642
2646
 
2643
- let width, height, minX, minY;
2644
- let dstX, dstY;
2647
+ // gather the necessary dimensions to copy
2648
+ let width, height, depth, minX, minY, minZ;
2649
+ let dstX, dstY, dstZ;
2650
+ const image = srcTexture.isCompressedTexture ? srcTexture.mipmaps[ level ] : srcTexture.image;
2645
2651
  if ( srcRegion !== null ) {
2646
2652
 
2647
2653
  width = srcRegion.max.x - srcRegion.min.x;
2648
2654
  height = srcRegion.max.y - srcRegion.min.y;
2655
+ depth = srcRegion.isBox3 ? srcRegion.max.z - srcRegion.min.z : 1;
2649
2656
  minX = srcRegion.min.x;
2650
2657
  minY = srcRegion.min.y;
2658
+ minZ = srcRegion.isBox3 ? srcRegion.min.z : 0;
2651
2659
 
2652
2660
  } else {
2653
2661
 
2654
- width = srcTexture.image.width;
2655
- height = srcTexture.image.height;
2662
+ width = image.width;
2663
+ height = image.height;
2664
+ depth = image.depth || 1;
2656
2665
  minX = 0;
2657
2666
  minY = 0;
2667
+ minZ = 0;
2658
2668
 
2659
2669
  }
2660
2670
 
@@ -2662,177 +2672,143 @@ class WebGLRenderer {
2662
2672
 
2663
2673
  dstX = dstPosition.x;
2664
2674
  dstY = dstPosition.y;
2675
+ dstZ = dstPosition.z;
2665
2676
 
2666
2677
  } else {
2667
2678
 
2668
2679
  dstX = 0;
2669
2680
  dstY = 0;
2681
+ dstZ = 0;
2670
2682
 
2671
2683
  }
2672
2684
 
2685
+ // Set up the destination target
2673
2686
  const glFormat = utils.convert( dstTexture.format );
2674
2687
  const glType = utils.convert( dstTexture.type );
2688
+ let glTarget;
2689
+
2690
+ if ( dstTexture.isData3DTexture ) {
2675
2691
 
2676
- textures.setTexture2D( dstTexture, 0 );
2692
+ textures.setTexture3D( dstTexture, 0 );
2693
+ glTarget = _gl.TEXTURE_3D;
2694
+
2695
+ } else if ( dstTexture.isDataArrayTexture || dstTexture.isCompressedArrayTexture ) {
2696
+
2697
+ textures.setTexture2DArray( dstTexture, 0 );
2698
+ glTarget = _gl.TEXTURE_2D_ARRAY;
2699
+
2700
+ } else {
2701
+
2702
+ textures.setTexture2D( dstTexture, 0 );
2703
+ glTarget = _gl.TEXTURE_2D;
2704
+
2705
+ }
2677
2706
 
2678
- // As another texture upload may have changed pixelStorei
2679
- // parameters, make sure they are correct for the dstTexture
2680
2707
  _gl.pixelStorei( _gl.UNPACK_FLIP_Y_WEBGL, dstTexture.flipY );
2681
2708
  _gl.pixelStorei( _gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, dstTexture.premultiplyAlpha );
2682
2709
  _gl.pixelStorei( _gl.UNPACK_ALIGNMENT, dstTexture.unpackAlignment );
2683
2710
 
2711
+ // used for copying data from cpu
2684
2712
  const currentUnpackRowLen = _gl.getParameter( _gl.UNPACK_ROW_LENGTH );
2685
2713
  const currentUnpackImageHeight = _gl.getParameter( _gl.UNPACK_IMAGE_HEIGHT );
2686
2714
  const currentUnpackSkipPixels = _gl.getParameter( _gl.UNPACK_SKIP_PIXELS );
2687
2715
  const currentUnpackSkipRows = _gl.getParameter( _gl.UNPACK_SKIP_ROWS );
2688
2716
  const currentUnpackSkipImages = _gl.getParameter( _gl.UNPACK_SKIP_IMAGES );
2689
2717
 
2690
- const image = srcTexture.isCompressedTexture ? srcTexture.mipmaps[ level ] : srcTexture.image;
2691
-
2692
2718
  _gl.pixelStorei( _gl.UNPACK_ROW_LENGTH, image.width );
2693
2719
  _gl.pixelStorei( _gl.UNPACK_IMAGE_HEIGHT, image.height );
2694
2720
  _gl.pixelStorei( _gl.UNPACK_SKIP_PIXELS, minX );
2695
2721
  _gl.pixelStorei( _gl.UNPACK_SKIP_ROWS, minY );
2722
+ _gl.pixelStorei( _gl.UNPACK_SKIP_IMAGES, minZ );
2696
2723
 
2697
- if ( srcTexture.isDataTexture ) {
2698
-
2699
- _gl.texSubImage2D( _gl.TEXTURE_2D, level, dstX, dstY, width, height, glFormat, glType, image.data );
2700
-
2701
- } else {
2702
-
2703
- if ( srcTexture.isCompressedTexture ) {
2704
-
2705
- _gl.compressedTexSubImage2D( _gl.TEXTURE_2D, level, dstX, dstY, image.width, image.height, glFormat, image.data );
2706
-
2707
- } else {
2708
-
2709
- _gl.texSubImage2D( _gl.TEXTURE_2D, level, dstX, dstY, width, height, glFormat, glType, image );
2724
+ // set up the src texture
2725
+ const isSrc3D = srcTexture.isDataArrayTexture || srcTexture.isData3DTexture;
2726
+ const isDst3D = dstTexture.isDataArrayTexture || dstTexture.isData3DTexture;
2727
+ if ( srcTexture.isRenderTargetTexture || srcTexture.isDepthTexture ) {
2710
2728
 
2711
- }
2729
+ const srcTextureProperties = properties.get( srcTexture );
2730
+ const dstTextureProperties = properties.get( dstTexture );
2731
+ const srcRenderTargetProperties = properties.get( srcTextureProperties.__renderTarget );
2732
+ const dstRenderTargetProperties = properties.get( dstTextureProperties.__renderTarget );
2712
2733
 
2713
- }
2734
+ state.bindFramebuffer( _gl.READ_FRAMEBUFFER, srcRenderTargetProperties.__webglFramebuffer );
2735
+ state.bindFramebuffer( _gl.DRAW_FRAMEBUFFER, dstRenderTargetProperties.__webglFramebuffer );
2714
2736
 
2715
- _gl.pixelStorei( _gl.UNPACK_ROW_LENGTH, currentUnpackRowLen );
2716
- _gl.pixelStorei( _gl.UNPACK_IMAGE_HEIGHT, currentUnpackImageHeight );
2717
- _gl.pixelStorei( _gl.UNPACK_SKIP_PIXELS, currentUnpackSkipPixels );
2718
- _gl.pixelStorei( _gl.UNPACK_SKIP_ROWS, currentUnpackSkipRows );
2719
- _gl.pixelStorei( _gl.UNPACK_SKIP_IMAGES, currentUnpackSkipImages );
2737
+ for ( let i = 0; i < depth; i ++ ) {
2720
2738
 
2721
- // Generate mipmaps only when copying level 0
2722
- if ( level === 0 && dstTexture.generateMipmaps ) _gl.generateMipmap( _gl.TEXTURE_2D );
2739
+ // if the source or destination are a 3d target then a layer needs to be bound
2740
+ if ( isSrc3D ) {
2723
2741
 
2724
- state.unbindTexture();
2742
+ _gl.framebufferTextureLayer( _gl.READ_FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, properties.get( srcTexture ).__webglTexture, level, minZ + i );
2725
2743
 
2726
- };
2744
+ }
2727
2745
 
2728
- this.copyTextureToTexture3D = function ( srcTexture, dstTexture, srcRegion = null, dstPosition = null, level = 0 ) {
2746
+ if ( srcTexture.isDepthTexture ) {
2729
2747
 
2730
- // support previous signature with source box first
2731
- if ( srcTexture.isTexture !== true ) {
2748
+ if ( isDst3D ) {
2732
2749
 
2733
- // @deprecated, r165
2734
- warnOnce( 'WebGLRenderer: copyTextureToTexture3D function signature has changed.' );
2750
+ _gl.framebufferTextureLayer( _gl.DRAW_FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, properties.get( dstTexture ).__webglTexture, level, dstZ + i );
2735
2751
 
2736
- srcRegion = arguments[ 0 ] || null;
2737
- dstPosition = arguments[ 1 ] || null;
2738
- srcTexture = arguments[ 2 ];
2739
- dstTexture = arguments[ 3 ];
2740
- level = arguments[ 4 ] || 0;
2752
+ }
2741
2753
 
2742
- }
2754
+ _gl.blitFramebuffer( minX, minY, width, height, dstX, dstY, width, height, _gl.DEPTH_BUFFER_BIT, _gl.NEAREST );
2743
2755
 
2744
- let width, height, depth, minX, minY, minZ;
2745
- let dstX, dstY, dstZ;
2746
- const image = srcTexture.isCompressedTexture ? srcTexture.mipmaps[ level ] : srcTexture.image;
2747
- if ( srcRegion !== null ) {
2756
+ } else if ( isDst3D ) {
2748
2757
 
2749
- width = srcRegion.max.x - srcRegion.min.x;
2750
- height = srcRegion.max.y - srcRegion.min.y;
2751
- depth = srcRegion.max.z - srcRegion.min.z;
2752
- minX = srcRegion.min.x;
2753
- minY = srcRegion.min.y;
2754
- minZ = srcRegion.min.z;
2758
+ _gl.copyTexSubImage3D( glTarget, level, dstX, dstY, dstZ + i, minX, minY, width, height );
2755
2759
 
2756
- } else {
2760
+ } else {
2757
2761
 
2758
- width = image.width;
2759
- height = image.height;
2760
- depth = image.depth;
2761
- minX = 0;
2762
- minY = 0;
2763
- minZ = 0;
2762
+ _gl.copyTexSubImage2D( glTarget, level, dstX, dstY, dstZ + i, minX, minY, width, height );
2764
2763
 
2765
- }
2764
+ }
2766
2765
 
2767
- if ( dstPosition !== null ) {
2766
+ }
2768
2767
 
2769
- dstX = dstPosition.x;
2770
- dstY = dstPosition.y;
2771
- dstZ = dstPosition.z;
2768
+ state.bindFramebuffer( _gl.READ_FRAMEBUFFER, null );
2769
+ state.bindFramebuffer( _gl.DRAW_FRAMEBUFFER, null );
2772
2770
 
2773
2771
  } else {
2774
2772
 
2775
- dstX = 0;
2776
- dstY = 0;
2777
- dstZ = 0;
2773
+ if ( isDst3D ) {
2778
2774
 
2779
- }
2775
+ // copy data into the 3d texture
2776
+ if ( srcTexture.isDataTexture || srcTexture.isData3DTexture ) {
2780
2777
 
2781
- const glFormat = utils.convert( dstTexture.format );
2782
- const glType = utils.convert( dstTexture.type );
2783
- let glTarget;
2778
+ _gl.texSubImage3D( glTarget, level, dstX, dstY, dstZ, width, height, depth, glFormat, glType, image.data );
2784
2779
 
2785
- if ( dstTexture.isData3DTexture ) {
2780
+ } else if ( dstTexture.isCompressedArrayTexture ) {
2786
2781
 
2787
- textures.setTexture3D( dstTexture, 0 );
2788
- glTarget = _gl.TEXTURE_3D;
2789
-
2790
- } else if ( dstTexture.isDataArrayTexture || dstTexture.isCompressedArrayTexture ) {
2791
-
2792
- textures.setTexture2DArray( dstTexture, 0 );
2793
- glTarget = _gl.TEXTURE_2D_ARRAY;
2794
-
2795
- } else {
2796
-
2797
- console.warn( 'THREE.WebGLRenderer.copyTextureToTexture3D: only supports THREE.DataTexture3D and THREE.DataTexture2DArray.' );
2798
- return;
2782
+ _gl.compressedTexSubImage3D( glTarget, level, dstX, dstY, dstZ, width, height, depth, glFormat, image.data );
2799
2783
 
2800
- }
2784
+ } else {
2801
2785
 
2802
- _gl.pixelStorei( _gl.UNPACK_FLIP_Y_WEBGL, dstTexture.flipY );
2803
- _gl.pixelStorei( _gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, dstTexture.premultiplyAlpha );
2804
- _gl.pixelStorei( _gl.UNPACK_ALIGNMENT, dstTexture.unpackAlignment );
2786
+ _gl.texSubImage3D( glTarget, level, dstX, dstY, dstZ, width, height, depth, glFormat, glType, image );
2805
2787
 
2806
- const currentUnpackRowLen = _gl.getParameter( _gl.UNPACK_ROW_LENGTH );
2807
- const currentUnpackImageHeight = _gl.getParameter( _gl.UNPACK_IMAGE_HEIGHT );
2808
- const currentUnpackSkipPixels = _gl.getParameter( _gl.UNPACK_SKIP_PIXELS );
2809
- const currentUnpackSkipRows = _gl.getParameter( _gl.UNPACK_SKIP_ROWS );
2810
- const currentUnpackSkipImages = _gl.getParameter( _gl.UNPACK_SKIP_IMAGES );
2788
+ }
2811
2789
 
2812
- _gl.pixelStorei( _gl.UNPACK_ROW_LENGTH, image.width );
2813
- _gl.pixelStorei( _gl.UNPACK_IMAGE_HEIGHT, image.height );
2814
- _gl.pixelStorei( _gl.UNPACK_SKIP_PIXELS, minX );
2815
- _gl.pixelStorei( _gl.UNPACK_SKIP_ROWS, minY );
2816
- _gl.pixelStorei( _gl.UNPACK_SKIP_IMAGES, minZ );
2790
+ } else {
2817
2791
 
2818
- if ( srcTexture.isDataTexture || srcTexture.isData3DTexture ) {
2792
+ // copy data into the 2d texture
2793
+ if ( srcTexture.isDataTexture ) {
2819
2794
 
2820
- _gl.texSubImage3D( glTarget, level, dstX, dstY, dstZ, width, height, depth, glFormat, glType, image.data );
2795
+ _gl.texSubImage2D( _gl.TEXTURE_2D, level, dstX, dstY, width, height, glFormat, glType, image.data );
2821
2796
 
2822
- } else {
2797
+ } else if ( srcTexture.isCompressedTexture ) {
2823
2798
 
2824
- if ( dstTexture.isCompressedArrayTexture ) {
2799
+ _gl.compressedTexSubImage2D( _gl.TEXTURE_2D, level, dstX, dstY, image.width, image.height, glFormat, image.data );
2825
2800
 
2826
- _gl.compressedTexSubImage3D( glTarget, level, dstX, dstY, dstZ, width, height, depth, glFormat, image.data );
2801
+ } else {
2827
2802
 
2828
- } else {
2803
+ _gl.texSubImage2D( _gl.TEXTURE_2D, level, dstX, dstY, width, height, glFormat, glType, image );
2829
2804
 
2830
- _gl.texSubImage3D( glTarget, level, dstX, dstY, dstZ, width, height, depth, glFormat, glType, image );
2805
+ }
2831
2806
 
2832
2807
  }
2833
2808
 
2834
2809
  }
2835
2810
 
2811
+ // reset values
2836
2812
  _gl.pixelStorei( _gl.UNPACK_ROW_LENGTH, currentUnpackRowLen );
2837
2813
  _gl.pixelStorei( _gl.UNPACK_IMAGE_HEIGHT, currentUnpackImageHeight );
2838
2814
  _gl.pixelStorei( _gl.UNPACK_SKIP_PIXELS, currentUnpackSkipPixels );
@@ -2840,12 +2816,39 @@ class WebGLRenderer {
2840
2816
  _gl.pixelStorei( _gl.UNPACK_SKIP_IMAGES, currentUnpackSkipImages );
2841
2817
 
2842
2818
  // Generate mipmaps only when copying level 0
2843
- if ( level === 0 && dstTexture.generateMipmaps ) _gl.generateMipmap( glTarget );
2819
+ if ( level === 0 && dstTexture.generateMipmaps ) {
2820
+
2821
+ _gl.generateMipmap( glTarget );
2822
+
2823
+ }
2844
2824
 
2845
2825
  state.unbindTexture();
2846
2826
 
2847
2827
  };
2848
2828
 
2829
+ this.copyTextureToTexture3D = function ( srcTexture, dstTexture, srcRegion = null, dstPosition = null, level = 0 ) {
2830
+
2831
+ // support previous signature with source box first
2832
+ if ( srcTexture.isTexture !== true ) {
2833
+
2834
+ // @deprecated, r165
2835
+ warnOnce( 'WebGLRenderer: copyTextureToTexture3D function signature has changed.' );
2836
+
2837
+ srcRegion = arguments[ 0 ] || null;
2838
+ dstPosition = arguments[ 1 ] || null;
2839
+ srcTexture = arguments[ 2 ];
2840
+ dstTexture = arguments[ 3 ];
2841
+ level = arguments[ 4 ] || 0;
2842
+
2843
+ }
2844
+
2845
+ // @deprecated, r170
2846
+ warnOnce( 'WebGLRenderer: copyTextureToTexture3D function has been deprecated. Use "copyTextureToTexture" instead.' );
2847
+
2848
+ return this.copyTextureToTexture( srcTexture, dstTexture, srcRegion, dstPosition, level );
2849
+
2850
+ };
2851
+
2849
2852
  this.initRenderTarget = function ( target ) {
2850
2853
 
2851
2854
  if ( properties.get( target ).__webglFramebuffer === undefined ) {
@@ -2916,8 +2919,8 @@ class WebGLRenderer {
2916
2919
  this._outputColorSpace = colorSpace;
2917
2920
 
2918
2921
  const gl = this.getContext();
2919
- gl.drawingBufferColorSpace = colorSpace === DisplayP3ColorSpace ? 'display-p3' : 'srgb';
2920
- gl.unpackColorSpace = ColorManagement.workingColorSpace === LinearDisplayP3ColorSpace ? 'display-p3' : 'srgb';
2922
+ gl.drawingBufferColorspace = ColorManagement._getDrawingBufferColorSpace( colorSpace );
2923
+ gl.unpackColorSpace = ColorManagement._getUnpackColorSpace();
2921
2924
 
2922
2925
  }
2923
2926
 
@@ -45,6 +45,10 @@ class Attributes extends DataMap {
45
45
 
46
46
  this.backend.createStorageAttribute( attribute );
47
47
 
48
+ } else if ( type === AttributeType.INDIRECT ) {
49
+
50
+ this.backend.createIndirectStorageAttribute( attribute );
51
+
48
52
  }
49
53
 
50
54
  data.version = this._getBufferAttribute( attribute ).version;
@@ -193,6 +193,8 @@ class Backend {
193
193
 
194
194
  }
195
195
 
196
+ dispose() { }
197
+
196
198
  }
197
199
 
198
200
  export default Backend;
@@ -1,6 +1,6 @@
1
1
  import DataMap from './DataMap.js';
2
2
  import Color4 from './Color4.js';
3
- import { vec4, context, normalWorld, backgroundBlurriness, backgroundIntensity, modelViewProjection } from '../../nodes/TSL.js';
3
+ import { vec4, context, normalWorld, backgroundBlurriness, backgroundIntensity, backgroundRotation, modelViewProjection } from '../../nodes/TSL.js';
4
4
  import NodeMaterial from '../../materials/nodes/NodeMaterial.js';
5
5
 
6
6
  import { Mesh } from '../../objects/Mesh.js';
@@ -56,7 +56,7 @@ class Background extends DataMap {
56
56
 
57
57
  const backgroundMeshNode = context( vec4( backgroundNode ).mul( backgroundIntensity ), {
58
58
  // @TODO: Add Texture2D support using node context
59
- getUV: () => normalWorld,
59
+ getUV: () => backgroundRotation.mul( normalWorld ),
60
60
  getTextureLevel: () => backgroundBlurriness
61
61
  } );
62
62
 
@@ -111,8 +111,6 @@ class Background extends DataMap {
111
111
 
112
112
  if ( renderer.autoClear === true || forceClear === true ) {
113
113
 
114
- _clearColor.multiplyScalar( _clearColor.a );
115
-
116
114
  const clearColorValue = renderContext.clearColorValue;
117
115
 
118
116
  clearColorValue.r = _clearColor.r;
@@ -120,6 +118,18 @@ class Background extends DataMap {
120
118
  clearColorValue.b = _clearColor.b;
121
119
  clearColorValue.a = _clearColor.a;
122
120
 
121
+ // premultiply alpha
122
+
123
+ if ( renderer.backend.isWebGLBackend === true || renderer.alpha === true ) {
124
+
125
+ clearColorValue.r *= clearColorValue.a;
126
+ clearColorValue.g *= clearColorValue.a;
127
+ clearColorValue.b *= clearColorValue.a;
128
+
129
+ }
130
+
131
+ //
132
+
123
133
  renderContext.depthClearValue = renderer._clearDepth;
124
134
  renderContext.stencilClearValue = renderer._clearStencil;
125
135
 
@@ -101,8 +101,9 @@ class Bindings extends DataMap {
101
101
  } else if ( binding.isStorageBuffer ) {
102
102
 
103
103
  const attribute = binding.attribute;
104
+ const attributeType = attribute.isIndirectStorageBufferAttribute ? AttributeType.INDIRECT : AttributeType.STORAGE;
104
105
 
105
- this.attributes.update( attribute, AttributeType.STORAGE );
106
+ this.attributes.update( attribute, attributeType );
106
107
 
107
108
  }
108
109
 
@@ -176,7 +177,7 @@ class Bindings extends DataMap {
176
177
 
177
178
  textureData.needsMipmap = true;
178
179
 
179
- } else if ( texture.generateMipmaps === true && this.textures.needsMipmaps( texture ) && textureData.needsMipmap === true ) {
180
+ } else if ( this.textures.needsMipmaps( texture ) && textureData.needsMipmap === true ) {
180
181
 
181
182
  this.backend.generateMipmaps( texture );
182
183
 
@@ -1,7 +1,8 @@
1
1
  export const AttributeType = {
2
2
  VERTEX: 1,
3
3
  INDEX: 2,
4
- STORAGE: 4
4
+ STORAGE: 3,
5
+ INDIRECT: 4
5
6
  };
6
7
 
7
8
  // size of a chunk in bytes (STD140 layout)
@@ -144,6 +144,8 @@ class Geometries extends DataMap {
144
144
 
145
145
  updateAttributes( renderObject ) {
146
146
 
147
+ // attributes
148
+
147
149
  const attributes = renderObject.getAttributes();
148
150
 
149
151
  for ( const attribute of attributes ) {
@@ -160,6 +162,8 @@ class Geometries extends DataMap {
160
162
 
161
163
  }
162
164
 
165
+ // indexes
166
+
163
167
  const index = this.getIndex( renderObject );
164
168
 
165
169
  if ( index !== null ) {
@@ -168,6 +172,16 @@ class Geometries extends DataMap {
168
172
 
169
173
  }
170
174
 
175
+ // indirect
176
+
177
+ const indirect = renderObject.geometry.indirect;
178
+
179
+ if ( indirect !== null ) {
180
+
181
+ this.updateAttribute( indirect, AttributeType.INDIRECT );
182
+
183
+ }
184
+
171
185
  }
172
186
 
173
187
  updateAttribute( attribute, type ) {
@@ -206,6 +220,12 @@ class Geometries extends DataMap {
206
220
 
207
221
  }
208
222
 
223
+ getIndirect( renderObject ) {
224
+
225
+ return renderObject.geometry.indirect;
226
+
227
+ }
228
+
209
229
  getIndex( renderObject ) {
210
230
 
211
231
  const { geometry, material } = renderObject;
@@ -0,0 +1,15 @@
1
+ import StorageBufferAttribute from './StorageBufferAttribute.js';
2
+
3
+ class IndirectStorageBufferAttribute extends StorageBufferAttribute {
4
+
5
+ constructor( array, itemSize ) {
6
+
7
+ super( array, itemSize, Uint32Array );
8
+
9
+ this.isIndirectStorageBufferAttribute = true;
10
+
11
+ }
12
+
13
+ }
14
+
15
+ export default IndirectStorageBufferAttribute;
@@ -0,0 +1,45 @@
1
+ import { LightsNode } from '../../nodes/Nodes.js';
2
+ import ChainMap from './ChainMap.js';
3
+
4
+ const _defaultLights = /*@__PURE__*/ new LightsNode();
5
+
6
+ class Lighting extends ChainMap {
7
+
8
+ constructor() {
9
+
10
+ super();
11
+
12
+ }
13
+
14
+ createNode( lights = [] ) {
15
+
16
+ return new LightsNode().setLights( lights );
17
+
18
+ }
19
+
20
+ getNode( scene, camera ) {
21
+
22
+ // ignore post-processing
23
+
24
+ if ( scene.isQuadMesh ) return _defaultLights;
25
+
26
+ // tiled lighting
27
+
28
+ const keys = [ scene, camera ];
29
+
30
+ let node = this.get( keys );
31
+
32
+ if ( node === undefined ) {
33
+
34
+ node = this.createNode();
35
+ this.set( keys, node );
36
+
37
+ }
38
+
39
+ return node;
40
+
41
+ }
42
+
43
+ }
44
+
45
+ export default Lighting;
@@ -0,0 +1,86 @@
1
+ import { Color } from '../../math/Color.js';
2
+
3
+ // renderer state
4
+
5
+ export function saveRendererState( renderer, state = {} ) {
6
+
7
+ state.toneMapping = renderer.toneMapping;
8
+ state.toneMappingExposure = renderer.toneMappingExposure;
9
+ state.outputColorSpace = renderer.outputColorSpace;
10
+ state.renderTarget = renderer.getRenderTarget();
11
+ state.activeCubeFace = renderer.getActiveCubeFace();
12
+ state.activeMipmapLevel = renderer.getActiveMipmapLevel();
13
+ state.renderObjectFunction = renderer.getRenderObjectFunction();
14
+ state.pixelRatio = renderer.getPixelRatio();
15
+ state.mrt = renderer.getMRT();
16
+ state.clearColor = renderer.getClearColor( state.clearColor || new Color() );
17
+ state.clearAlpha = renderer.getClearAlpha();
18
+ state.autoClear = renderer.autoClear;
19
+ state.scissorTest = renderer.getScissorTest();
20
+
21
+ return state;
22
+
23
+ }
24
+
25
+ export function resetRendererState( renderer, state ) {
26
+
27
+ state = saveRendererState( renderer, state );
28
+
29
+ renderer.setMRT( null );
30
+ renderer.setRenderObjectFunction( null );
31
+ renderer.setClearColor( 0x000000, 1 );
32
+ renderer.autoClear = true;
33
+
34
+ return state;
35
+
36
+ }
37
+
38
+ export function restoreRendererState( renderer, state ) {
39
+
40
+ renderer.toneMapping = state.toneMapping;
41
+ renderer.toneMappingExposure = state.toneMappingExposure;
42
+ renderer.outputColorSpace = state.outputColorSpace;
43
+ renderer.setRenderTarget( state.renderTarget, state.activeCubeFace, state.activeMipmapLevel );
44
+ renderer.setRenderObjectFunction( state.renderObjectFunction );
45
+ renderer.setPixelRatio( state.pixelRatio );
46
+ renderer.setMRT( state.mrt );
47
+ renderer.setClearColor( state.clearColor, state.clearAlpha );
48
+ renderer.autoClear = state.autoClear;
49
+ renderer.setScissorTest( state.scissorTest );
50
+
51
+ }
52
+
53
+ // renderer and scene state
54
+
55
+ export function saveRendererAndSceneState( renderer, scene, state = {} ) {
56
+
57
+ state = saveRendererState( renderer, state );
58
+ state.background = scene.background;
59
+ state.backgroundNode = scene.backgroundNode;
60
+ state.overrideMaterial = scene.overrideMaterial;
61
+
62
+ return state;
63
+
64
+ }
65
+
66
+ export function resetRendererAndSceneState( renderer, scene, state ) {
67
+
68
+ state = saveRendererAndSceneState( renderer, scene, state );
69
+
70
+ scene.background = null;
71
+ scene.backgroundNode = null;
72
+ scene.overrideMaterial = null;
73
+
74
+ return state;
75
+
76
+ }
77
+
78
+ export function restoreRendererAndSceneState( renderer, scene, state ) {
79
+
80
+ restoreRendererState( renderer, state );
81
+
82
+ scene.background = state.background;
83
+ scene.backgroundNode = state.backgroundNode;
84
+ scene.overrideMaterial = state.overrideMaterial;
85
+
86
+ }