super-three 0.164.0 → 0.165.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 (124) hide show
  1. package/README.md +3 -3
  2. package/build/three.cjs +664 -217
  3. package/build/three.module.js +664 -217
  4. package/build/three.module.min.js +1 -1
  5. package/examples/jsm/controls/TransformControls.js +1 -1
  6. package/examples/jsm/environments/RoomEnvironment.js +1 -5
  7. package/examples/jsm/exporters/GLTFExporter.js +1 -1
  8. package/examples/jsm/exporters/USDZExporter.js +6 -4
  9. package/examples/jsm/helpers/ViewHelper.js +32 -67
  10. package/examples/jsm/libs/tween.module.js +75 -64
  11. package/examples/jsm/lines/LineMaterial.js +1 -15
  12. package/examples/jsm/lines/LineSegments2.js +15 -0
  13. package/examples/jsm/lines/Wireframe.js +16 -1
  14. package/examples/jsm/loaders/DRACOLoader.js +1 -1
  15. package/examples/jsm/loaders/FBXLoader.js +24 -13
  16. package/examples/jsm/loaders/GLTFLoader.js +2 -0
  17. package/examples/jsm/loaders/LDrawLoader.js +3 -2
  18. package/examples/jsm/loaders/MMDLoader.js +31 -12
  19. package/examples/jsm/modifiers/CurveModifier.js +11 -9
  20. package/examples/jsm/nodes/Nodes.js +12 -11
  21. package/examples/jsm/nodes/accessors/BitangentNode.js +7 -83
  22. package/examples/jsm/nodes/accessors/BufferNode.js +6 -0
  23. package/examples/jsm/nodes/accessors/CameraNode.js +12 -119
  24. package/examples/jsm/nodes/accessors/MaterialNode.js +2 -0
  25. package/examples/jsm/nodes/accessors/ModelNode.js +3 -0
  26. package/examples/jsm/nodes/accessors/NormalNode.js +9 -101
  27. package/examples/jsm/nodes/accessors/PositionNode.js +6 -100
  28. package/examples/jsm/nodes/accessors/ReferenceNode.js +6 -0
  29. package/examples/jsm/nodes/accessors/ReflectVectorNode.js +2 -31
  30. package/examples/jsm/nodes/accessors/{TextureStoreNode.js → StorageTextureNode.js} +19 -6
  31. package/examples/jsm/nodes/accessors/TangentNode.js +11 -97
  32. package/examples/jsm/nodes/accessors/Texture3DNode.js +100 -0
  33. package/examples/jsm/nodes/accessors/UVNode.js +2 -46
  34. package/examples/jsm/nodes/core/AttributeNode.js +15 -3
  35. package/examples/jsm/nodes/core/ContextNode.js +6 -0
  36. package/examples/jsm/nodes/core/Node.js +15 -2
  37. package/examples/jsm/nodes/core/NodeBuilder.js +20 -9
  38. package/examples/jsm/nodes/core/NodeKeywords.js +1 -1
  39. package/examples/jsm/nodes/core/OutputStructNode.js +1 -5
  40. package/examples/jsm/nodes/core/PropertyNode.js +1 -0
  41. package/examples/jsm/nodes/core/VaryingNode.js +40 -9
  42. package/examples/jsm/nodes/display/AfterImageNode.js +14 -2
  43. package/examples/jsm/nodes/display/PassNode.js +3 -1
  44. package/examples/jsm/nodes/display/ViewportNode.js +1 -1
  45. package/examples/jsm/nodes/functions/PhysicalLightingModel.js +61 -17
  46. package/examples/jsm/nodes/functions/ToonLightingModel.js +49 -0
  47. package/examples/jsm/nodes/lighting/AnalyticLightNode.js +2 -1
  48. package/examples/jsm/nodes/lighting/LightsNode.js +17 -0
  49. package/examples/jsm/nodes/materials/Line2NodeMaterial.js +1 -1
  50. package/examples/jsm/nodes/materials/Materials.js +3 -0
  51. package/examples/jsm/nodes/materials/MeshMatcapNodeMaterial.js +52 -0
  52. package/examples/jsm/nodes/materials/MeshPhysicalNodeMaterial.js +21 -4
  53. package/examples/jsm/nodes/materials/MeshToonNodeMaterial.js +34 -0
  54. package/examples/jsm/nodes/materials/NodeMaterial.js +13 -5
  55. package/examples/jsm/nodes/materials/VolumeNodeMaterial.js +106 -0
  56. package/examples/jsm/nodes/math/HashNode.js +2 -2
  57. package/examples/jsm/nodes/shadernode/ShaderNode.js +55 -33
  58. package/examples/jsm/nodes/utils/ArrayElementNode.js +1 -1
  59. package/examples/jsm/nodes/utils/MatcapUVNode.js +1 -1
  60. package/examples/jsm/nodes/utils/TimerNode.js +1 -1
  61. package/examples/jsm/objects/Lensflare.js +2 -2
  62. package/examples/jsm/postprocessing/RenderPass.js +1 -1
  63. package/examples/jsm/renderers/CSS2DRenderer.js +25 -5
  64. package/examples/jsm/renderers/CSS3DRenderer.js +24 -3
  65. package/examples/jsm/renderers/common/Attributes.js +2 -0
  66. package/examples/jsm/renderers/common/Bindings.js +17 -0
  67. package/examples/jsm/renderers/common/ChainMap.js +18 -48
  68. package/examples/jsm/renderers/common/ClippingContext.js +4 -4
  69. package/examples/jsm/renderers/common/Pipelines.js +2 -2
  70. package/examples/jsm/renderers/common/RenderBundle.js +18 -0
  71. package/examples/jsm/renderers/common/RenderBundles.js +38 -0
  72. package/examples/jsm/renderers/common/RenderList.js +9 -0
  73. package/examples/jsm/renderers/common/RenderObject.js +6 -0
  74. package/examples/jsm/renderers/common/Renderer.js +139 -11
  75. package/examples/jsm/renderers/common/Uniform.js +1 -1
  76. package/examples/jsm/renderers/common/nodes/NodeSampledTexture.js +18 -4
  77. package/examples/jsm/renderers/common/nodes/NodeSampler.js +6 -0
  78. package/examples/jsm/renderers/webgl/nodes/GLSLNodeBuilder.js +17 -5
  79. package/examples/jsm/renderers/webgl/utils/WebGLTextureUtils.js +93 -6
  80. package/examples/jsm/renderers/webgpu/WebGPUBackend.js +50 -4
  81. package/examples/jsm/renderers/webgpu/nodes/WGSLNodeBuilder.js +69 -11
  82. package/examples/jsm/renderers/webgpu/utils/WebGPUBindingUtils.js +10 -1
  83. package/examples/jsm/renderers/webgpu/utils/WebGPUConstants.js +6 -0
  84. package/examples/jsm/renderers/webgpu/utils/WebGPUPipelineUtils.js +62 -19
  85. package/examples/jsm/renderers/webgpu/utils/WebGPUTextureUtils.js +62 -3
  86. package/examples/jsm/utils/BufferGeometryUtils.js +18 -16
  87. package/examples/jsm/utils/GPUStatsPanel.js +2 -0
  88. package/examples/jsm/utils/SortUtils.js +8 -5
  89. package/package.json +3 -2
  90. package/src/animation/tracks/BooleanKeyframeTrack.js +10 -1
  91. package/src/animation/tracks/QuaternionKeyframeTrack.js +1 -2
  92. package/src/animation/tracks/StringKeyframeTrack.js +10 -1
  93. package/src/constants.js +1 -1
  94. package/src/core/Object3D.js +2 -0
  95. package/src/core/Raycaster.js +6 -2
  96. package/src/loaders/FileLoader.js +4 -0
  97. package/src/loaders/LoaderUtils.js +3 -1
  98. package/src/loaders/ObjectLoader.js +1 -0
  99. package/src/objects/BatchedMesh.js +91 -1
  100. package/src/renderers/WebGLRenderer.js +288 -57
  101. package/src/renderers/shaders/ShaderChunk/batching_pars_vertex.glsl.js +15 -0
  102. package/src/renderers/shaders/ShaderChunk/color_pars_vertex.glsl.js +1 -1
  103. package/src/renderers/shaders/ShaderChunk/color_vertex.glsl.js +9 -1
  104. package/src/renderers/shaders/ShaderChunk/lights_pars_begin.glsl.js +8 -22
  105. package/src/renderers/shaders/ShaderChunk/morphcolor_vertex.glsl.js +1 -1
  106. package/src/renderers/shaders/ShaderChunk/morphinstance_vertex.glsl.js +1 -1
  107. package/src/renderers/shaders/ShaderChunk/morphnormal_vertex.glsl.js +3 -14
  108. package/src/renderers/shaders/ShaderChunk/morphtarget_pars_vertex.glsl.js +10 -31
  109. package/src/renderers/shaders/ShaderChunk/morphtarget_vertex.glsl.js +3 -23
  110. package/src/renderers/webgl/WebGLBackground.js +6 -0
  111. package/src/renderers/webgl/WebGLExtensions.js +3 -1
  112. package/src/renderers/webgl/WebGLLights.js +9 -12
  113. package/src/renderers/webgl/WebGLMaterials.js +1 -5
  114. package/src/renderers/webgl/WebGLMorphtargets.js +1 -2
  115. package/src/renderers/webgl/WebGLProgram.js +2 -31
  116. package/src/renderers/webgl/WebGLPrograms.js +14 -14
  117. package/src/renderers/webgl/WebGLRenderStates.js +2 -2
  118. package/src/renderers/webgl/WebGLTextures.js +139 -70
  119. package/src/renderers/webxr/WebXRDepthSensing.js +3 -3
  120. package/src/renderers/webxr/WebXRManager.js +6 -2
  121. package/src/textures/CompressedArrayTexture.js +14 -0
  122. package/src/textures/DataArrayTexture.js +14 -0
  123. package/src/textures/DepthTexture.js +1 -3
  124. package/src/utils.js +30 -1
@@ -56,7 +56,7 @@ import { WebVRManager } from './webvr/WebVRManager.js';
56
56
  import { WebXRManager } from './webxr/WebXRManager.js';
57
57
  import { WebGLMaterials } from './webgl/WebGLMaterials.js';
58
58
  import { WebGLUniformsGroups } from './webgl/WebGLUniformsGroups.js';
59
- import { createCanvasElement } from '../utils.js';
59
+ import { createCanvasElement, probeAsync } from '../utils.js';
60
60
  import { ColorManagement } from '../math/ColorManagement.js';
61
61
 
62
62
  class WebGLRenderer {
@@ -148,10 +148,6 @@ class WebGLRenderer {
148
148
 
149
149
  this._outputColorSpace = SRGBColorSpace;
150
150
 
151
- // physical lights
152
-
153
- this._useLegacyLights = false;
154
-
155
151
  // tone mapping
156
152
 
157
153
  this.toneMapping = NoToneMapping;
@@ -209,6 +205,8 @@ class WebGLRenderer {
209
205
 
210
206
  const _emptyScene = { background: null, fog: null, environment: null, overrideMaterial: null, isScene: true };
211
207
 
208
+ let _renderBackground = false;
209
+
212
210
  function getTargetPixelRatio() {
213
211
 
214
212
  return _currentRenderTarget === null ? _pixelRatio : 1;
@@ -958,7 +956,7 @@ class WebGLRenderer {
958
956
 
959
957
  }
960
958
 
961
- currentRenderState.setupLights( _this._useLegacyLights );
959
+ currentRenderState.setupLights();
962
960
 
963
961
  // Only initialize materials in the new scene, not the targetScene.
964
962
 
@@ -1148,6 +1146,18 @@ class WebGLRenderer {
1148
1146
 
1149
1147
  renderListStack.push( currentRenderList );
1150
1148
 
1149
+ if ( xr.enabled === true && xr.isPresenting === true ) {
1150
+
1151
+ const depthSensingMesh = _this.xr.getDepthSensingMesh();
1152
+
1153
+ if ( depthSensingMesh !== null ) {
1154
+
1155
+ projectObject( depthSensingMesh, camera, - Infinity, _this.sortObjects );
1156
+
1157
+ }
1158
+
1159
+ }
1160
+
1151
1161
  projectObject( scene, camera, 0, _this.sortObjects );
1152
1162
 
1153
1163
  currentRenderList.finish();
@@ -1158,8 +1168,8 @@ class WebGLRenderer {
1158
1168
 
1159
1169
  }
1160
1170
 
1161
- const renderBackground = xr.enabled === false || xr.isPresenting === false || xr.hasDepthSensing() === false;
1162
- if ( renderBackground ) {
1171
+ _renderBackground = xr.enabled === false || xr.isPresenting === false || xr.hasDepthSensing() === false;
1172
+ if ( _renderBackground ) {
1163
1173
 
1164
1174
  background.addToRenderList( currentRenderList, scene );
1165
1175
 
@@ -1186,7 +1196,7 @@ class WebGLRenderer {
1186
1196
  const opaqueObjects = currentRenderList.opaque;
1187
1197
  const transmissiveObjects = currentRenderList.transmissive;
1188
1198
 
1189
- currentRenderState.setupLights( _this._useLegacyLights );
1199
+ currentRenderState.setupLights();
1190
1200
 
1191
1201
  if ( camera.isArrayCamera ) {
1192
1202
 
@@ -1204,7 +1214,7 @@ class WebGLRenderer {
1204
1214
 
1205
1215
  }
1206
1216
 
1207
- if ( renderBackground ) background.render( scene );
1217
+ if ( _renderBackground ) background.render( scene );
1208
1218
 
1209
1219
  if ( xr.enabled && xr.isMultiview ) {
1210
1220
 
@@ -1228,7 +1238,7 @@ class WebGLRenderer {
1228
1238
 
1229
1239
  if ( transmissiveObjects.length > 0 ) renderTransmissionPass( opaqueObjects, transmissiveObjects, scene, camera );
1230
1240
 
1231
- if ( renderBackground ) background.render( scene );
1241
+ if ( _renderBackground ) background.render( scene );
1232
1242
 
1233
1243
  renderScene( currentRenderList, scene, camera );
1234
1244
 
@@ -1452,7 +1462,8 @@ class WebGLRenderer {
1452
1462
  samples: 4,
1453
1463
  stencilBuffer: stencil,
1454
1464
  resolveDepthBuffer: false,
1455
- resolveStencilBuffer: false
1465
+ resolveStencilBuffer: false,
1466
+ colorSpace: ColorManagement.workingColorSpace,
1456
1467
  } );
1457
1468
 
1458
1469
  // debug
@@ -1481,7 +1492,15 @@ class WebGLRenderer {
1481
1492
  _currentClearAlpha = _this.getClearAlpha();
1482
1493
  if ( _currentClearAlpha < 1 ) _this.setClearColor( 0xffffff, 0.5 );
1483
1494
 
1484
- _this.clear();
1495
+ if ( _renderBackground ) {
1496
+
1497
+ background.render( scene );
1498
+
1499
+ } else {
1500
+
1501
+ _this.clear();
1502
+
1503
+ }
1485
1504
 
1486
1505
  // Turn off the features which can affect the frag color for opaque objects pass.
1487
1506
  // Otherwise they are applied twice in opaque objects pass and transmission objects pass.
@@ -1738,6 +1757,7 @@ class WebGLRenderer {
1738
1757
 
1739
1758
  materialProperties.outputColorSpace = parameters.outputColorSpace;
1740
1759
  materialProperties.batching = parameters.batching;
1760
+ materialProperties.batchingColor = parameters.batchingColor;
1741
1761
  materialProperties.instancing = parameters.instancing;
1742
1762
  materialProperties.instancingColor = parameters.instancingColor;
1743
1763
  materialProperties.instancingMorph = parameters.instancingMorph;
@@ -1830,6 +1850,14 @@ class WebGLRenderer {
1830
1850
 
1831
1851
  needsProgramChange = true;
1832
1852
 
1853
+ } else if ( object.isBatchedMesh && materialProperties.batchingColor === true && object.colorTexture === null ) {
1854
+
1855
+ needsProgramChange = true;
1856
+
1857
+ } else if ( object.isBatchedMesh && materialProperties.batchingColor === false && object.colorTexture !== null ) {
1858
+
1859
+ needsProgramChange = true;
1860
+
1833
1861
  } else if ( object.isInstancedMesh && materialProperties.instancing === false ) {
1834
1862
 
1835
1863
  needsProgramChange = true;
@@ -2035,6 +2063,13 @@ class WebGLRenderer {
2035
2063
  p_uniforms.setOptional( _gl, object, 'batchingTexture' );
2036
2064
  p_uniforms.setValue( _gl, 'batchingTexture', object._matricesTexture, textures );
2037
2065
 
2066
+ p_uniforms.setOptional( _gl, object, 'batchingColorTexture' );
2067
+ if ( object._colorsTexture !== null ) {
2068
+
2069
+ p_uniforms.setValue( _gl, 'batchingColorTexture', object._colorsTexture, textures );
2070
+
2071
+ }
2072
+
2038
2073
  }
2039
2074
 
2040
2075
  const morphAttributes = geometry.morphAttributes;
@@ -2430,24 +2465,159 @@ class WebGLRenderer {
2430
2465
 
2431
2466
  };
2432
2467
 
2433
- this.copyFramebufferToTexture = function ( position, texture, level = 0 ) {
2468
+ this.readRenderTargetPixelsAsync = async function ( renderTarget, x, y, width, height, buffer, activeCubeFaceIndex ) {
2469
+
2470
+ if ( ! ( renderTarget && renderTarget.isWebGLRenderTarget ) ) {
2471
+
2472
+ throw new Error( 'THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not THREE.WebGLRenderTarget.' );
2473
+
2474
+ }
2475
+
2476
+ let framebuffer = properties.get( renderTarget ).__webglFramebuffer;
2477
+ if ( renderTarget.isWebGLCubeRenderTarget && activeCubeFaceIndex !== undefined ) {
2478
+
2479
+ framebuffer = framebuffer[ activeCubeFaceIndex ];
2480
+
2481
+ }
2482
+
2483
+ if ( framebuffer ) {
2484
+
2485
+ state.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer );
2486
+
2487
+ try {
2488
+
2489
+ const texture = renderTarget.texture;
2490
+ const textureFormat = texture.format;
2491
+ const textureType = texture.type;
2492
+
2493
+ if ( ! capabilities.textureFormatReadable( textureFormat ) ) {
2494
+
2495
+ throw new Error( 'THREE.WebGLRenderer.readRenderTargetPixelsAsync: renderTarget is not in RGBA or implementation defined format.' );
2496
+
2497
+ }
2498
+
2499
+ if ( ! capabilities.textureTypeReadable( textureType ) ) {
2500
+
2501
+ throw new Error( 'THREE.WebGLRenderer.readRenderTargetPixelsAsync: renderTarget is not in UnsignedByteType or implementation defined type.' );
2502
+
2503
+ }
2504
+
2505
+ // the following if statement ensures valid read requests (no out-of-bounds pixels, see #8604)
2506
+ if ( ( x >= 0 && x <= ( renderTarget.width - width ) ) && ( y >= 0 && y <= ( renderTarget.height - height ) ) ) {
2507
+
2508
+ const glBuffer = _gl.createBuffer();
2509
+ _gl.bindBuffer( _gl.PIXEL_PACK_BUFFER, glBuffer );
2510
+ _gl.bufferData( _gl.PIXEL_PACK_BUFFER, buffer.byteLength, _gl.STREAM_READ );
2511
+ _gl.readPixels( x, y, width, height, utils.convert( textureFormat ), utils.convert( textureType ), 0 );
2512
+ _gl.flush();
2513
+
2514
+ // check if the commands have finished every 8 ms
2515
+ const sync = _gl.fenceSync( _gl.SYNC_GPU_COMMANDS_COMPLETE, 0 );
2516
+ await probeAsync( _gl, sync, 4 );
2517
+
2518
+ try {
2519
+
2520
+ _gl.bindBuffer( _gl.PIXEL_PACK_BUFFER, glBuffer );
2521
+ _gl.getBufferSubData( _gl.PIXEL_PACK_BUFFER, 0, buffer );
2522
+
2523
+ } finally {
2524
+
2525
+ _gl.deleteBuffer( glBuffer );
2526
+ _gl.deleteSync( sync );
2527
+
2528
+ }
2529
+
2530
+ return buffer;
2531
+
2532
+ }
2533
+
2534
+ } finally {
2535
+
2536
+ // restore framebuffer of current render target if necessary
2537
+
2538
+ const framebuffer = ( _currentRenderTarget !== null ) ? properties.get( _currentRenderTarget ).__webglFramebuffer : null;
2539
+ state.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer );
2540
+
2541
+ }
2542
+
2543
+ }
2544
+
2545
+ };
2546
+
2547
+ this.copyFramebufferToTexture = function ( texture, position = null, level = 0 ) {
2548
+
2549
+ // support previous signature with position first
2550
+ if ( texture.isTexture !== true ) {
2551
+
2552
+ // @deprecated, r165
2553
+ console.warn( 'WebGLRenderer: copyFramebufferToTexture function signature has changed.' );
2554
+
2555
+ position = arguments[ 0 ] || null;
2556
+ texture = arguments[ 1 ];
2557
+
2558
+ }
2434
2559
 
2435
2560
  const levelScale = Math.pow( 2, - level );
2436
2561
  const width = Math.floor( texture.image.width * levelScale );
2437
2562
  const height = Math.floor( texture.image.height * levelScale );
2438
2563
 
2564
+ const x = position !== null ? position.x : 0;
2565
+ const y = position !== null ? position.y : 0;
2566
+
2439
2567
  textures.setTexture2D( texture, 0 );
2440
2568
 
2441
- _gl.copyTexSubImage2D( _gl.TEXTURE_2D, level, 0, 0, position.x, position.y, width, height );
2569
+ _gl.copyTexSubImage2D( _gl.TEXTURE_2D, level, 0, 0, x, y, width, height );
2442
2570
 
2443
2571
  state.unbindTexture();
2444
2572
 
2445
2573
  };
2446
2574
 
2447
- this.copyTextureToTexture = function ( position, srcTexture, dstTexture, level = 0 ) {
2575
+ this.copyTextureToTexture = function ( srcTexture, dstTexture, srcRegion = null, dstPosition = null, level = 0 ) {
2576
+
2577
+ // support previous signature with dstPosition first
2578
+ if ( srcTexture.isTexture !== true ) {
2579
+
2580
+ // @deprecated, r165
2581
+ console.warn( 'WebGLRenderer: copyTextureToTexture function signature has changed.' );
2582
+
2583
+ dstPosition = arguments[ 0 ] || null;
2584
+ srcTexture = arguments[ 1 ];
2585
+ dstTexture = arguments[ 2 ];
2586
+ level = arguments[ 3 ] || 0;
2587
+ srcRegion = null;
2588
+
2589
+ }
2590
+
2591
+ let width, height, minX, minY;
2592
+ let dstX, dstY;
2593
+ if ( srcRegion !== null ) {
2594
+
2595
+ width = srcRegion.max.x - srcRegion.min.x;
2596
+ height = srcRegion.max.y - srcRegion.min.y;
2597
+ minX = srcRegion.min.x;
2598
+ minY = srcRegion.min.y;
2599
+
2600
+ } else {
2601
+
2602
+ width = srcTexture.image.width;
2603
+ height = srcTexture.image.height;
2604
+ minX = 0;
2605
+ minY = 0;
2606
+
2607
+ }
2608
+
2609
+ if ( dstPosition !== null ) {
2610
+
2611
+ dstX = dstPosition.x;
2612
+ dstY = dstPosition.y;
2613
+
2614
+ } else {
2615
+
2616
+ dstX = 0;
2617
+ dstY = 0;
2618
+
2619
+ }
2448
2620
 
2449
- const width = srcTexture.image.width;
2450
- const height = srcTexture.image.height;
2451
2621
  const glFormat = utils.convert( dstTexture.format );
2452
2622
  const glType = utils.convert( dstTexture.type );
2453
2623
 
@@ -2459,24 +2629,43 @@ class WebGLRenderer {
2459
2629
  _gl.pixelStorei( _gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, dstTexture.premultiplyAlpha );
2460
2630
  _gl.pixelStorei( _gl.UNPACK_ALIGNMENT, dstTexture.unpackAlignment );
2461
2631
 
2632
+ const currentUnpackRowLen = _gl.getParameter( _gl.UNPACK_ROW_LENGTH );
2633
+ const currentUnpackImageHeight = _gl.getParameter( _gl.UNPACK_IMAGE_HEIGHT );
2634
+ const currentUnpackSkipPixels = _gl.getParameter( _gl.UNPACK_SKIP_PIXELS );
2635
+ const currentUnpackSkipRows = _gl.getParameter( _gl.UNPACK_SKIP_ROWS );
2636
+ const currentUnpackSkipImages = _gl.getParameter( _gl.UNPACK_SKIP_IMAGES );
2637
+
2638
+ const image = srcTexture.isCompressedTexture ? srcTexture.mipmaps[ level ] : srcTexture.image;
2639
+
2640
+ _gl.pixelStorei( _gl.UNPACK_ROW_LENGTH, image.width );
2641
+ _gl.pixelStorei( _gl.UNPACK_IMAGE_HEIGHT, image.height );
2642
+ _gl.pixelStorei( _gl.UNPACK_SKIP_PIXELS, minX );
2643
+ _gl.pixelStorei( _gl.UNPACK_SKIP_ROWS, minY );
2644
+
2462
2645
  if ( srcTexture.isDataTexture ) {
2463
2646
 
2464
- _gl.texSubImage2D( _gl.TEXTURE_2D, level, position.x, position.y, width, height, glFormat, glType, srcTexture.image.data );
2647
+ _gl.texSubImage2D( _gl.TEXTURE_2D, level, dstX, dstY, width, height, glFormat, glType, image.data );
2465
2648
 
2466
2649
  } else {
2467
2650
 
2468
2651
  if ( srcTexture.isCompressedTexture ) {
2469
2652
 
2470
- _gl.compressedTexSubImage2D( _gl.TEXTURE_2D, level, position.x, position.y, srcTexture.mipmaps[ 0 ].width, srcTexture.mipmaps[ 0 ].height, glFormat, srcTexture.mipmaps[ 0 ].data );
2653
+ _gl.compressedTexSubImage2D( _gl.TEXTURE_2D, level, dstX, dstY, image.width, image.height, glFormat, image.data );
2471
2654
 
2472
2655
  } else {
2473
2656
 
2474
- _gl.texSubImage2D( _gl.TEXTURE_2D, level, position.x, position.y, glFormat, glType, srcTexture.image );
2657
+ _gl.texSubImage2D( _gl.TEXTURE_2D, level, dstX, dstY, glFormat, glType, image );
2475
2658
 
2476
2659
  }
2477
2660
 
2478
2661
  }
2479
2662
 
2663
+ _gl.pixelStorei( _gl.UNPACK_ROW_LENGTH, currentUnpackRowLen );
2664
+ _gl.pixelStorei( _gl.UNPACK_IMAGE_HEIGHT, currentUnpackImageHeight );
2665
+ _gl.pixelStorei( _gl.UNPACK_SKIP_PIXELS, currentUnpackSkipPixels );
2666
+ _gl.pixelStorei( _gl.UNPACK_SKIP_ROWS, currentUnpackSkipRows );
2667
+ _gl.pixelStorei( _gl.UNPACK_SKIP_IMAGES, currentUnpackSkipImages );
2668
+
2480
2669
  // Generate mipmaps only when copying level 0
2481
2670
  if ( level === 0 && dstTexture.generateMipmaps ) _gl.generateMipmap( _gl.TEXTURE_2D );
2482
2671
 
@@ -2484,11 +2673,59 @@ class WebGLRenderer {
2484
2673
 
2485
2674
  };
2486
2675
 
2487
- this.copyTextureToTexture3D = function ( sourceBox, position, srcTexture, dstTexture, level = 0 ) {
2676
+ this.copyTextureToTexture3D = function ( srcTexture, dstTexture, srcRegion = null, dstPosition = null, level = 0 ) {
2677
+
2678
+ // support previous signature with source box first
2679
+ if ( srcTexture.isTexture !== true ) {
2680
+
2681
+ // @deprecated, r165
2682
+ console.warn( 'WebGLRenderer: copyTextureToTexture3D function signature has changed.' );
2683
+
2684
+ srcRegion = arguments[ 0 ] || null;
2685
+ dstPosition = arguments[ 1 ] || null;
2686
+ srcTexture = arguments[ 2 ];
2687
+ dstTexture = arguments[ 3 ];
2688
+ level = arguments[ 4 ] || 0;
2689
+
2690
+ }
2691
+
2692
+ let width, height, depth, minX, minY, minZ;
2693
+ let dstX, dstY, dstZ;
2694
+ const image = srcTexture.isCompressedTexture ? srcTexture.mipmaps[ level ] : srcTexture.image;
2695
+ if ( srcRegion !== null ) {
2696
+
2697
+ width = srcRegion.max.x - srcRegion.min.x;
2698
+ height = srcRegion.max.y - srcRegion.min.y;
2699
+ depth = srcRegion.max.z - srcRegion.min.z;
2700
+ minX = srcRegion.min.x;
2701
+ minY = srcRegion.min.y;
2702
+ minZ = srcRegion.min.z;
2703
+
2704
+ } else {
2705
+
2706
+ width = image.width;
2707
+ height = image.height;
2708
+ depth = image.depth;
2709
+ minX = 0;
2710
+ minY = 0;
2711
+ minZ = 0;
2712
+
2713
+ }
2714
+
2715
+ if ( dstPosition !== null ) {
2716
+
2717
+ dstX = dstPosition.x;
2718
+ dstY = dstPosition.y;
2719
+ dstZ = dstPosition.z;
2720
+
2721
+ } else {
2722
+
2723
+ dstX = 0;
2724
+ dstY = 0;
2725
+ dstZ = 0;
2726
+
2727
+ }
2488
2728
 
2489
- const width = sourceBox.max.x - sourceBox.min.x;
2490
- const height = sourceBox.max.y - sourceBox.min.y;
2491
- const depth = sourceBox.max.z - sourceBox.min.z;
2492
2729
  const glFormat = utils.convert( dstTexture.format );
2493
2730
  const glType = utils.convert( dstTexture.type );
2494
2731
  let glTarget;
@@ -2514,43 +2751,41 @@ class WebGLRenderer {
2514
2751
  _gl.pixelStorei( _gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, dstTexture.premultiplyAlpha );
2515
2752
  _gl.pixelStorei( _gl.UNPACK_ALIGNMENT, dstTexture.unpackAlignment );
2516
2753
 
2517
- const unpackRowLen = _gl.getParameter( _gl.UNPACK_ROW_LENGTH );
2518
- const unpackImageHeight = _gl.getParameter( _gl.UNPACK_IMAGE_HEIGHT );
2519
- const unpackSkipPixels = _gl.getParameter( _gl.UNPACK_SKIP_PIXELS );
2520
- const unpackSkipRows = _gl.getParameter( _gl.UNPACK_SKIP_ROWS );
2521
- const unpackSkipImages = _gl.getParameter( _gl.UNPACK_SKIP_IMAGES );
2522
-
2523
- const image = srcTexture.isCompressedTexture ? srcTexture.mipmaps[ level ] : srcTexture.image;
2754
+ const currentUnpackRowLen = _gl.getParameter( _gl.UNPACK_ROW_LENGTH );
2755
+ const currentUnpackImageHeight = _gl.getParameter( _gl.UNPACK_IMAGE_HEIGHT );
2756
+ const currentUnpackSkipPixels = _gl.getParameter( _gl.UNPACK_SKIP_PIXELS );
2757
+ const currentUnpackSkipRows = _gl.getParameter( _gl.UNPACK_SKIP_ROWS );
2758
+ const currentUnpackSkipImages = _gl.getParameter( _gl.UNPACK_SKIP_IMAGES );
2524
2759
 
2525
2760
  _gl.pixelStorei( _gl.UNPACK_ROW_LENGTH, image.width );
2526
2761
  _gl.pixelStorei( _gl.UNPACK_IMAGE_HEIGHT, image.height );
2527
- _gl.pixelStorei( _gl.UNPACK_SKIP_PIXELS, sourceBox.min.x );
2528
- _gl.pixelStorei( _gl.UNPACK_SKIP_ROWS, sourceBox.min.y );
2529
- _gl.pixelStorei( _gl.UNPACK_SKIP_IMAGES, sourceBox.min.z );
2762
+ _gl.pixelStorei( _gl.UNPACK_SKIP_PIXELS, minX );
2763
+ _gl.pixelStorei( _gl.UNPACK_SKIP_ROWS, minY );
2764
+ _gl.pixelStorei( _gl.UNPACK_SKIP_IMAGES, minZ );
2530
2765
 
2531
2766
  if ( srcTexture.isDataTexture || srcTexture.isData3DTexture ) {
2532
2767
 
2533
- _gl.texSubImage3D( glTarget, level, position.x, position.y, position.z, width, height, depth, glFormat, glType, image.data );
2768
+ _gl.texSubImage3D( glTarget, level, dstX, dstY, dstZ, width, height, depth, glFormat, glType, image.data );
2534
2769
 
2535
2770
  } else {
2536
2771
 
2537
2772
  if ( dstTexture.isCompressedArrayTexture ) {
2538
2773
 
2539
- _gl.compressedTexSubImage3D( glTarget, level, position.x, position.y, position.z, width, height, depth, glFormat, image.data );
2774
+ _gl.compressedTexSubImage3D( glTarget, level, dstX, dstY, dstZ, width, height, depth, glFormat, image.data );
2540
2775
 
2541
2776
  } else {
2542
2777
 
2543
- _gl.texSubImage3D( glTarget, level, position.x, position.y, position.z, width, height, depth, glFormat, glType, image );
2778
+ _gl.texSubImage3D( glTarget, level, dstX, dstY, dstZ, width, height, depth, glFormat, glType, image );
2544
2779
 
2545
2780
  }
2546
2781
 
2547
2782
  }
2548
2783
 
2549
- _gl.pixelStorei( _gl.UNPACK_ROW_LENGTH, unpackRowLen );
2550
- _gl.pixelStorei( _gl.UNPACK_IMAGE_HEIGHT, unpackImageHeight );
2551
- _gl.pixelStorei( _gl.UNPACK_SKIP_PIXELS, unpackSkipPixels );
2552
- _gl.pixelStorei( _gl.UNPACK_SKIP_ROWS, unpackSkipRows );
2553
- _gl.pixelStorei( _gl.UNPACK_SKIP_IMAGES, unpackSkipImages );
2784
+ _gl.pixelStorei( _gl.UNPACK_ROW_LENGTH, currentUnpackRowLen );
2785
+ _gl.pixelStorei( _gl.UNPACK_IMAGE_HEIGHT, currentUnpackImageHeight );
2786
+ _gl.pixelStorei( _gl.UNPACK_SKIP_PIXELS, currentUnpackSkipPixels );
2787
+ _gl.pixelStorei( _gl.UNPACK_SKIP_ROWS, currentUnpackSkipRows );
2788
+ _gl.pixelStorei( _gl.UNPACK_SKIP_IMAGES, currentUnpackSkipImages );
2554
2789
 
2555
2790
  // Generate mipmaps only when copying level 0
2556
2791
  if ( level === 0 && dstTexture.generateMipmaps ) _gl.generateMipmap( glTarget );
@@ -2559,6 +2794,16 @@ class WebGLRenderer {
2559
2794
 
2560
2795
  };
2561
2796
 
2797
+ this.initRenderTarget = function ( target ) {
2798
+
2799
+ if ( properties.get( target ).__webglFramebuffer === undefined ) {
2800
+
2801
+ textures.setupRenderTarget( target );
2802
+
2803
+ }
2804
+
2805
+ };
2806
+
2562
2807
  this.initTexture = function ( texture ) {
2563
2808
 
2564
2809
  if ( texture.isCubeTexture ) {
@@ -2624,20 +2869,6 @@ class WebGLRenderer {
2624
2869
 
2625
2870
  }
2626
2871
 
2627
- get useLegacyLights() { // @deprecated, r155
2628
-
2629
- console.warn( 'THREE.WebGLRenderer: The property .useLegacyLights has been deprecated. Migrate your lighting according to the following guide: https://discourse.threejs.org/t/updates-to-lighting-in-three-js-r155/53733.' );
2630
- return this._useLegacyLights;
2631
-
2632
- }
2633
-
2634
- set useLegacyLights( value ) { // @deprecated, r155
2635
-
2636
- console.warn( 'THREE.WebGLRenderer: The property .useLegacyLights has been deprecated. Migrate your lighting according to the following guide: https://discourse.threejs.org/t/updates-to-lighting-in-three-js-r155/53733.' );
2637
- this._useLegacyLights = value;
2638
-
2639
- }
2640
-
2641
2872
  }
2642
2873
 
2643
2874
 
@@ -16,4 +16,19 @@ export default /* glsl */`
16
16
 
17
17
  }
18
18
  #endif
19
+
20
+ #ifdef USE_BATCHING_COLOR
21
+
22
+ uniform sampler2D batchingColorTexture;
23
+ vec3 getBatchingColor( const in float i ) {
24
+
25
+ int size = textureSize( batchingColorTexture, 0 ).x;
26
+ int j = int( i );
27
+ int x = j % size;
28
+ int y = j / size;
29
+ return texelFetch( batchingColorTexture, ivec2( x, y ), 0 ).rgb;
30
+
31
+ }
32
+
33
+ #endif
19
34
  `;
@@ -3,7 +3,7 @@ export default /* glsl */`
3
3
 
4
4
  varying vec4 vColor;
5
5
 
6
- #elif defined( USE_COLOR ) || defined( USE_INSTANCING_COLOR )
6
+ #elif defined( USE_COLOR ) || defined( USE_INSTANCING_COLOR ) || defined( USE_BATCHING_COLOR )
7
7
 
8
8
  varying vec3 vColor;
9
9
 
@@ -3,7 +3,7 @@ export default /* glsl */`
3
3
 
4
4
  vColor = vec4( 1.0 );
5
5
 
6
- #elif defined( USE_COLOR ) || defined( USE_INSTANCING_COLOR )
6
+ #elif defined( USE_COLOR ) || defined( USE_INSTANCING_COLOR ) || defined( USE_BATCHING_COLOR )
7
7
 
8
8
  vColor = vec3( 1.0 );
9
9
 
@@ -19,5 +19,13 @@ export default /* glsl */`
19
19
 
20
20
  vColor.xyz *= instanceColor.xyz;
21
21
 
22
+ #endif
23
+
24
+ #ifdef USE_BATCHING_COLOR
25
+
26
+ vec3 batchingColor = getBatchingColor( batchId );
27
+
28
+ vColor.xyz *= batchingColor.xyz;
29
+
22
30
  #endif
23
31
  `;
@@ -55,32 +55,18 @@ vec3 getAmbientLightIrradiance( const in vec3 ambientLightColor ) {
55
55
 
56
56
  float getDistanceAttenuation( const in float lightDistance, const in float cutoffDistance, const in float decayExponent ) {
57
57
 
58
- #if defined ( LEGACY_LIGHTS )
58
+ // based upon Frostbite 3 Moving to Physically-based Rendering
59
+ // page 32, equation 26: E[window1]
60
+ // https://seblagarde.files.wordpress.com/2015/07/course_notes_moving_frostbite_to_pbr_v32.pdf
61
+ float distanceFalloff = 1.0 / max( pow( lightDistance, decayExponent ), 0.01 );
59
62
 
60
- if ( cutoffDistance > 0.0 && decayExponent > 0.0 ) {
63
+ if ( cutoffDistance > 0.0 ) {
61
64
 
62
- return pow( saturate( - lightDistance / cutoffDistance + 1.0 ), decayExponent );
65
+ distanceFalloff *= pow2( saturate( 1.0 - pow4( lightDistance / cutoffDistance ) ) );
63
66
 
64
- }
65
-
66
- return 1.0;
67
-
68
- #else
69
-
70
- // based upon Frostbite 3 Moving to Physically-based Rendering
71
- // page 32, equation 26: E[window1]
72
- // https://seblagarde.files.wordpress.com/2015/07/course_notes_moving_frostbite_to_pbr_v32.pdf
73
- float distanceFalloff = 1.0 / max( pow( lightDistance, decayExponent ), 0.01 );
74
-
75
- if ( cutoffDistance > 0.0 ) {
76
-
77
- distanceFalloff *= pow2( saturate( 1.0 - pow4( lightDistance / cutoffDistance ) ) );
78
-
79
- }
80
-
81
- return distanceFalloff;
67
+ }
82
68
 
83
- #endif
69
+ return distanceFalloff;
84
70
 
85
71
  }
86
72
 
@@ -1,5 +1,5 @@
1
1
  export default /* glsl */`
2
- #if defined( USE_MORPHCOLORS ) && defined( MORPHTARGETS_TEXTURE )
2
+ #if defined( USE_MORPHCOLORS )
3
3
 
4
4
  // morphTargetBaseInfluence is set based on BufferGeometry.morphTargetsRelative value:
5
5
  // When morphTargetsRelative is false, this is set to 1 - sum(influences); this results in normal = sum((target - base) * influence)
@@ -1,7 +1,7 @@
1
1
  export default /* glsl */`
2
2
  #ifdef USE_INSTANCING_MORPH
3
3
 
4
- float morphTargetInfluences[MORPHTARGETS_COUNT];
4
+ float morphTargetInfluences[ MORPHTARGETS_COUNT ];
5
5
 
6
6
  float morphTargetBaseInfluence = texelFetch( morphTexture, ivec2( 0, gl_InstanceID ), 0 ).r;
7
7
 
@@ -6,22 +6,11 @@ export default /* glsl */`
6
6
  // When morphTargetsRelative is true, this is set to 1; as a result, all morph targets are simply added to the base after weighting
7
7
  objectNormal *= morphTargetBaseInfluence;
8
8
 
9
- #ifdef MORPHTARGETS_TEXTURE
9
+ for ( int i = 0; i < MORPHTARGETS_COUNT; i ++ ) {
10
10
 
11
- for ( int i = 0; i < MORPHTARGETS_COUNT; i ++ ) {
11
+ if ( morphTargetInfluences[ i ] != 0.0 ) objectNormal += getMorph( gl_VertexID, i, 1 ).xyz * morphTargetInfluences[ i ];
12
12
 
13
- if ( morphTargetInfluences[ i ] != 0.0 ) objectNormal += getMorph( gl_VertexID, i, 1 ).xyz * morphTargetInfluences[ i ];
14
-
15
- }
16
-
17
- #else
18
-
19
- objectNormal += morphNormal0 * morphTargetInfluences[ 0 ];
20
- objectNormal += morphNormal1 * morphTargetInfluences[ 1 ];
21
- objectNormal += morphNormal2 * morphTargetInfluences[ 2 ];
22
- objectNormal += morphNormal3 * morphTargetInfluences[ 3 ];
23
-
24
- #endif
13
+ }
25
14
 
26
15
  #endif
27
16
  `;