super-three 0.163.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 (197) hide show
  1. package/README.md +3 -3
  2. package/build/three.cjs +1127 -452
  3. package/build/three.module.js +1127 -452
  4. package/build/three.module.min.js +2 -2
  5. package/examples/jsm/animation/CCDIKSolver.js +4 -2
  6. package/examples/jsm/controls/TransformControls.js +1 -1
  7. package/examples/jsm/environments/RoomEnvironment.js +1 -5
  8. package/examples/jsm/exporters/GLTFExporter.js +45 -1
  9. package/examples/jsm/exporters/USDZExporter.js +13 -5
  10. package/examples/jsm/helpers/ViewHelper.js +32 -67
  11. package/examples/jsm/libs/draco/README.md +2 -2
  12. package/examples/jsm/libs/tween.module.js +75 -64
  13. package/examples/jsm/lines/LineMaterial.js +1 -15
  14. package/examples/jsm/lines/LineSegments2.js +15 -0
  15. package/examples/jsm/lines/Wireframe.js +16 -1
  16. package/examples/jsm/loaders/DRACOLoader.js +1 -1
  17. package/examples/jsm/loaders/EXRLoader.js +283 -99
  18. package/examples/jsm/loaders/FBXLoader.js +24 -13
  19. package/examples/jsm/loaders/GLTFLoader.js +55 -0
  20. package/examples/jsm/loaders/KTX2Loader.js +3 -6
  21. package/examples/jsm/loaders/LDrawLoader.js +3 -2
  22. package/examples/jsm/loaders/MMDLoader.js +31 -12
  23. package/examples/jsm/loaders/VRMLLoader.js +1 -1
  24. package/examples/jsm/loaders/lwo/IFFParser.js +8 -5
  25. package/examples/jsm/materials/MeshGouraudMaterial.js +7 -1
  26. package/examples/jsm/math/Octree.js +26 -20
  27. package/examples/jsm/modifiers/CurveModifier.js +11 -9
  28. package/examples/jsm/nodes/Nodes.js +15 -13
  29. package/examples/jsm/nodes/accessors/AccessorsUtils.js +16 -1
  30. package/examples/jsm/nodes/accessors/BitangentNode.js +7 -83
  31. package/examples/jsm/nodes/accessors/BufferNode.js +6 -0
  32. package/examples/jsm/nodes/accessors/CameraNode.js +12 -119
  33. package/examples/jsm/nodes/accessors/ClippingNode.js +3 -2
  34. package/examples/jsm/nodes/accessors/MaterialNode.js +109 -3
  35. package/examples/jsm/nodes/accessors/ModelNode.js +3 -0
  36. package/examples/jsm/nodes/accessors/NormalNode.js +9 -101
  37. package/examples/jsm/nodes/accessors/PositionNode.js +6 -100
  38. package/examples/jsm/nodes/accessors/ReferenceNode.js +6 -0
  39. package/examples/jsm/nodes/accessors/ReflectVectorNode.js +2 -31
  40. package/examples/jsm/nodes/accessors/StorageBufferNode.js +9 -0
  41. package/examples/jsm/nodes/accessors/{TextureStoreNode.js → StorageTextureNode.js} +19 -6
  42. package/examples/jsm/nodes/accessors/TangentNode.js +11 -97
  43. package/examples/jsm/nodes/accessors/Texture3DNode.js +100 -0
  44. package/examples/jsm/nodes/accessors/TextureNode.js +21 -3
  45. package/examples/jsm/nodes/accessors/TextureSizeNode.js +1 -1
  46. package/examples/jsm/nodes/accessors/UVNode.js +2 -46
  47. package/examples/jsm/nodes/code/FunctionNode.js +0 -8
  48. package/examples/jsm/nodes/core/AttributeNode.js +15 -3
  49. package/examples/jsm/nodes/core/ContextNode.js +6 -0
  50. package/examples/jsm/nodes/core/Node.js +23 -2
  51. package/examples/jsm/nodes/core/NodeBuilder.js +25 -18
  52. package/examples/jsm/nodes/core/NodeKeywords.js +1 -1
  53. package/examples/jsm/nodes/core/OutputStructNode.js +3 -6
  54. package/examples/jsm/nodes/core/PropertyNode.js +11 -0
  55. package/examples/jsm/nodes/core/VaryingNode.js +40 -9
  56. package/examples/jsm/nodes/display/AfterImageNode.js +14 -2
  57. package/examples/jsm/nodes/display/BumpMapNode.js +7 -26
  58. package/examples/jsm/nodes/display/FrontFacingNode.js +13 -0
  59. package/examples/jsm/nodes/display/PassNode.js +3 -1
  60. package/examples/jsm/nodes/display/ViewportDepthNode.js +1 -1
  61. package/examples/jsm/nodes/display/ViewportNode.js +5 -3
  62. package/examples/jsm/nodes/display/ViewportTextureNode.js +4 -1
  63. package/examples/jsm/nodes/functions/BSDF/BRDF_GGX.js +26 -7
  64. package/examples/jsm/nodes/functions/BSDF/D_GGX_Anisotropic.js +28 -0
  65. package/examples/jsm/nodes/functions/BSDF/V_GGX_SmithCorrelated.js +1 -3
  66. package/examples/jsm/nodes/functions/BSDF/V_GGX_SmithCorrelated_Anisotropic.js +29 -0
  67. package/examples/jsm/nodes/functions/PhongLightingModel.js +1 -1
  68. package/examples/jsm/nodes/functions/PhysicalLightingModel.js +210 -12
  69. package/examples/jsm/nodes/functions/ShadowMaskModel.js +31 -0
  70. package/examples/jsm/nodes/functions/ToonLightingModel.js +49 -0
  71. package/examples/jsm/nodes/lighting/AnalyticLightNode.js +20 -5
  72. package/examples/jsm/nodes/lighting/DirectionalLightNode.js +2 -1
  73. package/examples/jsm/nodes/lighting/EnvironmentNode.js +11 -2
  74. package/examples/jsm/nodes/lighting/IrradianceNode.js +24 -0
  75. package/examples/jsm/nodes/lighting/LightsNode.js +28 -1
  76. package/examples/jsm/nodes/lighting/PointLightNode.js +2 -1
  77. package/examples/jsm/nodes/lighting/SpotLightNode.js +2 -1
  78. package/examples/jsm/nodes/materials/Line2NodeMaterial.js +11 -7
  79. package/examples/jsm/nodes/materials/Materials.js +4 -0
  80. package/examples/jsm/nodes/materials/MeshMatcapNodeMaterial.js +52 -0
  81. package/examples/jsm/nodes/materials/MeshNormalNodeMaterial.js +0 -2
  82. package/examples/jsm/nodes/materials/MeshPhongNodeMaterial.js +2 -2
  83. package/examples/jsm/nodes/materials/MeshPhysicalNodeMaterial.js +94 -6
  84. package/examples/jsm/nodes/materials/MeshStandardNodeMaterial.js +11 -4
  85. package/examples/jsm/nodes/materials/MeshToonNodeMaterial.js +34 -0
  86. package/examples/jsm/nodes/materials/NodeMaterial.js +43 -45
  87. package/examples/jsm/nodes/materials/ShadowNodeMaterial.js +34 -0
  88. package/examples/jsm/nodes/materials/VolumeNodeMaterial.js +106 -0
  89. package/examples/jsm/nodes/math/HashNode.js +2 -2
  90. package/examples/jsm/nodes/pmrem/PMREMUtils.js +1 -1
  91. package/examples/jsm/nodes/shadernode/ShaderNode.js +57 -41
  92. package/examples/jsm/nodes/utils/ArrayElementNode.js +1 -1
  93. package/examples/jsm/nodes/utils/MatcapUVNode.js +1 -1
  94. package/examples/jsm/nodes/utils/TimerNode.js +1 -1
  95. package/examples/jsm/objects/Lensflare.js +2 -2
  96. package/examples/jsm/physics/JoltPhysics.js +281 -0
  97. package/examples/jsm/postprocessing/RenderPass.js +1 -1
  98. package/examples/jsm/postprocessing/RenderTransitionPass.js +193 -0
  99. package/examples/jsm/renderers/CSS2DRenderer.js +25 -5
  100. package/examples/jsm/renderers/CSS3DRenderer.js +24 -3
  101. package/examples/jsm/renderers/common/Attributes.js +2 -0
  102. package/examples/jsm/renderers/common/Background.js +3 -3
  103. package/examples/jsm/renderers/common/Bindings.js +17 -0
  104. package/examples/jsm/renderers/common/ChainMap.js +18 -48
  105. package/examples/jsm/renderers/common/ClippingContext.js +5 -5
  106. package/examples/jsm/renderers/common/Pipelines.js +2 -2
  107. package/examples/jsm/renderers/common/RenderBundle.js +18 -0
  108. package/examples/jsm/renderers/common/RenderBundles.js +38 -0
  109. package/examples/jsm/renderers/common/RenderList.js +10 -1
  110. package/examples/jsm/renderers/common/RenderObject.js +49 -1
  111. package/examples/jsm/renderers/common/Renderer.js +268 -25
  112. package/examples/jsm/renderers/common/Textures.js +1 -1
  113. package/examples/jsm/renderers/common/Uniform.js +1 -1
  114. package/examples/jsm/renderers/common/extras/PMREMGenerator.js +13 -17
  115. package/examples/jsm/renderers/common/nodes/NodeSampledTexture.js +18 -4
  116. package/examples/jsm/renderers/common/nodes/NodeSampler.js +6 -0
  117. package/examples/jsm/renderers/common/nodes/Nodes.js +31 -47
  118. package/examples/jsm/renderers/webgl/WebGLBackend.js +7 -21
  119. package/examples/jsm/renderers/webgl/WebGLBufferRenderer.js +5 -1
  120. package/examples/jsm/renderers/webgl/nodes/GLSLNodeBuilder.js +23 -5
  121. package/examples/jsm/renderers/webgl/utils/WebGLTextureUtils.js +114 -13
  122. package/examples/jsm/renderers/webgl/utils/WebGLUtils.js +3 -21
  123. package/examples/jsm/renderers/webgpu/WebGPUBackend.js +80 -46
  124. package/examples/jsm/renderers/webgpu/nodes/WGSLNodeBuilder.js +85 -12
  125. package/examples/jsm/renderers/webgpu/utils/WebGPUAttributeUtils.js +4 -1
  126. package/examples/jsm/renderers/webgpu/utils/WebGPUBindingUtils.js +10 -1
  127. package/examples/jsm/renderers/webgpu/utils/WebGPUConstants.js +6 -0
  128. package/examples/jsm/renderers/webgpu/utils/WebGPUPipelineUtils.js +62 -19
  129. package/examples/jsm/renderers/webgpu/utils/WebGPUTextureUtils.js +62 -3
  130. package/examples/jsm/transpiler/GLSLDecoder.js +1 -1
  131. package/examples/jsm/transpiler/ShaderToyDecoder.js +1 -1
  132. package/examples/jsm/utils/BufferGeometryUtils.js +18 -16
  133. package/examples/jsm/utils/GPUStatsPanel.js +2 -0
  134. package/examples/jsm/utils/SceneUtils.js +60 -1
  135. package/examples/jsm/utils/SortUtils.js +8 -5
  136. package/examples/jsm/webxr/OculusHandModel.js +3 -2
  137. package/examples/jsm/webxr/XRHandModelFactory.js +4 -2
  138. package/package.json +3 -2
  139. package/src/animation/tracks/BooleanKeyframeTrack.js +10 -1
  140. package/src/animation/tracks/QuaternionKeyframeTrack.js +1 -2
  141. package/src/animation/tracks/StringKeyframeTrack.js +10 -1
  142. package/src/constants.js +1 -1
  143. package/src/core/Object3D.js +2 -0
  144. package/src/core/Raycaster.js +6 -2
  145. package/src/core/RenderTarget.js +8 -0
  146. package/src/extras/PMREMGenerator.js +12 -11
  147. package/src/loaders/FileLoader.js +5 -1
  148. package/src/loaders/LoaderUtils.js +3 -1
  149. package/src/loaders/MaterialLoader.js +1 -0
  150. package/src/loaders/ObjectLoader.js +1 -0
  151. package/src/materials/Material.js +2 -0
  152. package/src/materials/MeshPhysicalMaterial.js +20 -0
  153. package/src/objects/BatchedMesh.js +114 -1
  154. package/src/objects/Line.js +66 -43
  155. package/src/renderers/WebGLRenderer.js +371 -109
  156. package/src/renderers/shaders/ShaderChunk/batching_pars_vertex.glsl.js +15 -0
  157. package/src/renderers/shaders/ShaderChunk/color_pars_vertex.glsl.js +1 -1
  158. package/src/renderers/shaders/ShaderChunk/color_vertex.glsl.js +9 -1
  159. package/src/renderers/shaders/ShaderChunk/lights_pars_begin.glsl.js +8 -22
  160. package/src/renderers/shaders/ShaderChunk/lights_physical_fragment.glsl.js +6 -0
  161. package/src/renderers/shaders/ShaderChunk/lights_physical_pars_fragment.glsl.js +1 -0
  162. package/src/renderers/shaders/ShaderChunk/morphcolor_vertex.glsl.js +1 -1
  163. package/src/renderers/shaders/ShaderChunk/morphinstance_vertex.glsl.js +1 -1
  164. package/src/renderers/shaders/ShaderChunk/morphnormal_vertex.glsl.js +3 -14
  165. package/src/renderers/shaders/ShaderChunk/morphtarget_pars_vertex.glsl.js +10 -31
  166. package/src/renderers/shaders/ShaderChunk/morphtarget_vertex.glsl.js +3 -23
  167. package/src/renderers/shaders/ShaderChunk/tonemapping_pars_fragment.glsl.js +17 -9
  168. package/src/renderers/shaders/ShaderChunk/transmission_fragment.glsl.js +1 -1
  169. package/src/renderers/shaders/ShaderChunk/transmission_pars_fragment.glsl.js +47 -13
  170. package/src/renderers/shaders/ShaderChunk.js +0 -2
  171. package/src/renderers/shaders/ShaderLib/meshphysical.glsl.js +4 -0
  172. package/src/renderers/shaders/ShaderLib.js +1 -0
  173. package/src/renderers/webgl/WebGLBackground.js +24 -3
  174. package/src/renderers/webgl/WebGLBufferRenderer.js +36 -0
  175. package/src/renderers/webgl/WebGLCapabilities.js +33 -1
  176. package/src/renderers/webgl/WebGLExtensions.js +3 -1
  177. package/src/renderers/webgl/WebGLIndexedBufferRenderer.js +36 -0
  178. package/src/renderers/webgl/WebGLLights.js +9 -12
  179. package/src/renderers/webgl/WebGLMaterials.js +7 -5
  180. package/src/renderers/webgl/WebGLMorphtargets.js +1 -2
  181. package/src/renderers/webgl/WebGLProgram.js +5 -36
  182. package/src/renderers/webgl/WebGLPrograms.js +19 -14
  183. package/src/renderers/webgl/WebGLRenderStates.js +8 -4
  184. package/src/renderers/webgl/WebGLShadowMap.js +25 -25
  185. package/src/renderers/webgl/WebGLTextures.js +206 -129
  186. package/src/renderers/webgl/WebGLUtils.js +3 -21
  187. package/src/renderers/webxr/WebXRDepthSensing.js +3 -3
  188. package/src/renderers/webxr/WebXRManager.js +8 -6
  189. package/src/textures/CompressedArrayTexture.js +14 -0
  190. package/src/textures/DataArrayTexture.js +14 -0
  191. package/src/textures/DepthTexture.js +1 -3
  192. package/src/utils.js +30 -1
  193. package/examples/jsm/renderers/webgl-legacy/nodes/GLSL1NodeBuilder.js +0 -318
  194. package/examples/jsm/renderers/webgl-legacy/nodes/SlotNode.js +0 -26
  195. package/examples/jsm/renderers/webgl-legacy/nodes/WebGLNodeBuilder.js +0 -792
  196. package/examples/jsm/renderers/webgl-legacy/nodes/WebGLNodes.js +0 -51
  197. package/src/renderers/shaders/ShaderChunk/lightmap_fragment.glsl.js +0 -10
@@ -3,9 +3,7 @@ import {
3
3
  BackSide,
4
4
  FrontSide,
5
5
  DoubleSide,
6
- RGBAFormat,
7
6
  HalfFloatType,
8
- FloatType,
9
7
  UnsignedByteType,
10
8
  NoToneMapping,
11
9
  LinearMipmapLinearFilter,
@@ -26,7 +24,6 @@ import {
26
24
  import { Color } from '../math/Color.js';
27
25
  import { Frustum } from '../math/Frustum.js';
28
26
  import { Matrix4 } from '../math/Matrix4.js';
29
- import { Vector2 } from '../math/Vector2.js';
30
27
  import { Vector3 } from '../math/Vector3.js';
31
28
  import { Vector4 } from '../math/Vector4.js';
32
29
  import { WebGLAnimation } from './webgl/WebGLAnimation.js';
@@ -59,7 +56,7 @@ import { WebVRManager } from './webvr/WebVRManager.js';
59
56
  import { WebXRManager } from './webxr/WebXRManager.js';
60
57
  import { WebGLMaterials } from './webgl/WebGLMaterials.js';
61
58
  import { WebGLUniformsGroups } from './webgl/WebGLUniformsGroups.js';
62
- import { createCanvasElement } from '../utils.js';
59
+ import { createCanvasElement, probeAsync } from '../utils.js';
63
60
  import { ColorManagement } from '../math/ColorManagement.js';
64
61
 
65
62
  class WebGLRenderer {
@@ -151,10 +148,6 @@ class WebGLRenderer {
151
148
 
152
149
  this._outputColorSpace = SRGBColorSpace;
153
150
 
154
- // physical lights
155
-
156
- this._useLegacyLights = false;
157
-
158
151
  // tone mapping
159
152
 
160
153
  this.toneMapping = NoToneMapping;
@@ -208,11 +201,12 @@ class WebGLRenderer {
208
201
 
209
202
  const _projScreenMatrix = new Matrix4();
210
203
 
211
- const _vector2 = new Vector2();
212
204
  const _vector3 = new Vector3();
213
205
 
214
206
  const _emptyScene = { background: null, fog: null, environment: null, overrideMaterial: null, isScene: true };
215
207
 
208
+ let _renderBackground = false;
209
+
216
210
  function getTargetPixelRatio() {
217
211
 
218
212
  return _currentRenderTarget === null ? _pixelRatio : 1;
@@ -225,10 +219,7 @@ class WebGLRenderer {
225
219
 
226
220
  function getContext( contextName, contextAttributes ) {
227
221
 
228
- const context = canvas.getContext( contextName, contextAttributes );
229
- if ( context !== null ) return context;
230
-
231
- return null;
222
+ return canvas.getContext( contextName, contextAttributes );
232
223
 
233
224
  }
234
225
 
@@ -296,10 +287,10 @@ class WebGLRenderer {
296
287
  extensions = new WebGLExtensions( _gl );
297
288
  extensions.init();
298
289
 
299
- capabilities = new WebGLCapabilities( _gl, extensions, parameters );
300
-
301
290
  utils = new WebGLUtils( _gl, extensions );
302
291
 
292
+ capabilities = new WebGLCapabilities( _gl, extensions, parameters, utils );
293
+
303
294
  state = new WebGLState( _gl );
304
295
 
305
296
  info = new WebGLInfo( _gl );
@@ -865,7 +856,15 @@ class WebGLRenderer {
865
856
 
866
857
  if ( object.isBatchedMesh ) {
867
858
 
868
- renderer.renderMultiDraw( object._multiDrawStarts, object._multiDrawCounts, object._multiDrawCount );
859
+ if ( object._multiDrawInstances !== null ) {
860
+
861
+ renderer.renderMultiDrawInstances( object._multiDrawStarts, object._multiDrawCounts, object._multiDrawCount, object._multiDrawInstances );
862
+
863
+ } else {
864
+
865
+ renderer.renderMultiDraw( object._multiDrawStarts, object._multiDrawCounts, object._multiDrawCount );
866
+
867
+ }
869
868
 
870
869
  } else if ( object.isInstancedMesh ) {
871
870
 
@@ -915,7 +914,7 @@ class WebGLRenderer {
915
914
  if ( targetScene === null ) targetScene = scene;
916
915
 
917
916
  currentRenderState = renderStates.get( targetScene );
918
- currentRenderState.init();
917
+ currentRenderState.init( camera );
919
918
 
920
919
  renderStateStack.push( currentRenderState );
921
920
 
@@ -957,7 +956,7 @@ class WebGLRenderer {
957
956
 
958
957
  }
959
958
 
960
- currentRenderState.setupLights( _this._useLegacyLights );
959
+ currentRenderState.setupLights();
961
960
 
962
961
  // Only initialize materials in the new scene, not the targetScene.
963
962
 
@@ -1132,7 +1131,7 @@ class WebGLRenderer {
1132
1131
  if ( scene.isScene === true ) scene.onBeforeRender( _this, scene, camera, _currentRenderTarget );
1133
1132
 
1134
1133
  currentRenderState = renderStates.get( scene, renderStateStack.length );
1135
- currentRenderState.init();
1134
+ currentRenderState.init( camera );
1136
1135
 
1137
1136
  renderStateStack.push( currentRenderState );
1138
1137
 
@@ -1147,6 +1146,18 @@ class WebGLRenderer {
1147
1146
 
1148
1147
  renderListStack.push( currentRenderList );
1149
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
+
1150
1161
  projectObject( scene, camera, 0, _this.sortObjects );
1151
1162
 
1152
1163
  currentRenderList.finish();
@@ -1157,6 +1168,13 @@ class WebGLRenderer {
1157
1168
 
1158
1169
  }
1159
1170
 
1171
+ _renderBackground = xr.enabled === false || xr.isPresenting === false || xr.hasDepthSensing() === false;
1172
+ if ( _renderBackground ) {
1173
+
1174
+ background.addToRenderList( currentRenderList, scene );
1175
+
1176
+ }
1177
+
1160
1178
  //
1161
1179
 
1162
1180
  this.info.render.frame ++;
@@ -1173,20 +1191,30 @@ class WebGLRenderer {
1173
1191
 
1174
1192
  if ( this.info.autoReset === true ) this.info.reset();
1175
1193
 
1194
+ // render scene
1195
+
1196
+ const opaqueObjects = currentRenderList.opaque;
1197
+ const transmissiveObjects = currentRenderList.transmissive;
1176
1198
 
1177
- //
1199
+ currentRenderState.setupLights();
1178
1200
 
1179
- if ( xr.enabled === false || xr.isPresenting === false || xr.hasDepthSensing() === false ) {
1201
+ if ( camera.isArrayCamera ) {
1180
1202
 
1181
- background.render( currentRenderList, scene );
1203
+ const cameras = camera.cameras;
1182
1204
 
1183
- }
1205
+ if ( transmissiveObjects.length > 0 ) {
1184
1206
 
1185
- // render scene
1207
+ for ( let i = 0, l = cameras.length; i < l; i ++ ) {
1186
1208
 
1187
- currentRenderState.setupLights( _this._useLegacyLights );
1209
+ const camera2 = cameras[ i ];
1188
1210
 
1189
- if ( camera.isArrayCamera ) {
1211
+ renderTransmissionPass( opaqueObjects, transmissiveObjects, scene, camera2 );
1212
+
1213
+ }
1214
+
1215
+ }
1216
+
1217
+ if ( _renderBackground ) background.render( scene );
1190
1218
 
1191
1219
  if ( xr.enabled && xr.isMultiview ) {
1192
1220
 
@@ -1196,8 +1224,6 @@ class WebGLRenderer {
1196
1224
 
1197
1225
  } else {
1198
1226
 
1199
- const cameras = camera.cameras;
1200
-
1201
1227
  for ( let i = 0, l = cameras.length; i < l; i ++ ) {
1202
1228
 
1203
1229
  const camera2 = cameras[ i ];
@@ -1210,6 +1236,10 @@ class WebGLRenderer {
1210
1236
 
1211
1237
  } else {
1212
1238
 
1239
+ if ( transmissiveObjects.length > 0 ) renderTransmissionPass( opaqueObjects, transmissiveObjects, scene, camera );
1240
+
1241
+ if ( _renderBackground ) background.render( scene );
1242
+
1213
1243
  renderScene( currentRenderList, scene, camera );
1214
1244
 
1215
1245
  }
@@ -1251,6 +1281,8 @@ class WebGLRenderer {
1251
1281
 
1252
1282
  currentRenderState = renderStateStack[ renderStateStack.length - 1 ];
1253
1283
 
1284
+ if ( _clippingEnabled === true ) clipping.setGlobalState( _this.clippingPlanes, currentRenderState.state.camera );
1285
+
1254
1286
  } else {
1255
1287
 
1256
1288
  currentRenderState = null;
@@ -1395,8 +1427,6 @@ class WebGLRenderer {
1395
1427
 
1396
1428
  if ( _clippingEnabled === true ) clipping.setGlobalState( _this.clippingPlanes, camera );
1397
1429
 
1398
- if ( transmissiveObjects.length > 0 ) renderTransmissionPass( opaqueObjects, transmissiveObjects, scene, camera );
1399
-
1400
1430
  if ( viewport ) state.viewport( _currentViewport.copy( viewport ) );
1401
1431
 
1402
1432
  if ( opaqueObjects.length > 0 ) renderObjects( opaqueObjects, scene, camera );
@@ -1423,19 +1453,19 @@ class WebGLRenderer {
1423
1453
 
1424
1454
  }
1425
1455
 
1426
- if ( currentRenderState.state.transmissionRenderTarget === null ) {
1456
+ if ( currentRenderState.state.transmissionRenderTarget[ camera.id ] === undefined ) {
1427
1457
 
1428
- currentRenderState.state.transmissionRenderTarget = new WebGLRenderTarget( 1, 1, {
1458
+ currentRenderState.state.transmissionRenderTarget[ camera.id ] = new WebGLRenderTarget( 1, 1, {
1429
1459
  generateMipmaps: true,
1430
1460
  type: ( extensions.has( 'EXT_color_buffer_half_float' ) || extensions.has( 'EXT_color_buffer_float' ) ) ? HalfFloatType : UnsignedByteType,
1431
1461
  minFilter: LinearMipmapLinearFilter,
1432
1462
  samples: 4,
1433
- stencilBuffer: stencil
1463
+ stencilBuffer: stencil,
1464
+ resolveDepthBuffer: false,
1465
+ resolveStencilBuffer: false,
1466
+ colorSpace: ColorManagement.workingColorSpace,
1434
1467
  } );
1435
1468
 
1436
- const renderTargetProperties = properties.get( currentRenderState.state.transmissionRenderTarget );
1437
- renderTargetProperties.__isTransmissionRenderTarget = true;
1438
-
1439
1469
  // debug
1440
1470
 
1441
1471
  /*
@@ -1448,10 +1478,10 @@ class WebGLRenderer {
1448
1478
 
1449
1479
  }
1450
1480
 
1451
- const transmissionRenderTarget = currentRenderState.state.transmissionRenderTarget;
1481
+ const transmissionRenderTarget = currentRenderState.state.transmissionRenderTarget[ camera.id ];
1452
1482
 
1453
- _this.getDrawingBufferSize( _vector2 );
1454
- transmissionRenderTarget.setSize( _vector2.x, _vector2.y );
1483
+ const activeViewport = camera.viewport || _currentViewport;
1484
+ transmissionRenderTarget.setSize( activeViewport.z, activeViewport.w );
1455
1485
 
1456
1486
  //
1457
1487
 
@@ -1462,51 +1492,72 @@ class WebGLRenderer {
1462
1492
  _currentClearAlpha = _this.getClearAlpha();
1463
1493
  if ( _currentClearAlpha < 1 ) _this.setClearColor( 0xffffff, 0.5 );
1464
1494
 
1465
- _this.clear();
1495
+ if ( _renderBackground ) {
1496
+
1497
+ background.render( scene );
1498
+
1499
+ } else {
1500
+
1501
+ _this.clear();
1502
+
1503
+ }
1466
1504
 
1467
1505
  // Turn off the features which can affect the frag color for opaque objects pass.
1468
1506
  // Otherwise they are applied twice in opaque objects pass and transmission objects pass.
1469
1507
  const currentToneMapping = _this.toneMapping;
1470
1508
  _this.toneMapping = NoToneMapping;
1471
1509
 
1510
+ // Remove viewport from camera to avoid nested render calls resetting viewport to it (e.g Reflector).
1511
+ // Transmission render pass requires viewport to match the transmissionRenderTarget.
1512
+ const currentCameraViewport = camera.viewport;
1513
+ if ( camera.viewport !== undefined ) camera.viewport = undefined;
1514
+
1515
+ currentRenderState.setupLightsView( camera );
1516
+
1517
+ if ( _clippingEnabled === true ) clipping.setGlobalState( _this.clippingPlanes, camera );
1518
+
1472
1519
  renderObjects( opaqueObjects, scene, camera );
1473
1520
 
1474
1521
  textures.updateMultisampleRenderTarget( transmissionRenderTarget );
1475
1522
  textures.updateRenderTargetMipmap( transmissionRenderTarget );
1476
1523
 
1477
- let renderTargetNeedsUpdate = false;
1524
+ if ( extensions.has( 'WEBGL_multisampled_render_to_texture' ) === false ) { // see #28131
1478
1525
 
1479
- for ( let i = 0, l = transmissiveObjects.length; i < l; i ++ ) {
1526
+ let renderTargetNeedsUpdate = false;
1480
1527
 
1481
- const renderItem = transmissiveObjects[ i ];
1528
+ for ( let i = 0, l = transmissiveObjects.length; i < l; i ++ ) {
1482
1529
 
1483
- const object = renderItem.object;
1484
- const geometry = renderItem.geometry;
1485
- const material = renderItem.material;
1486
- const group = renderItem.group;
1530
+ const renderItem = transmissiveObjects[ i ];
1487
1531
 
1488
- if ( material.side === DoubleSide && object.layers.test( camera.layers ) ) {
1532
+ const object = renderItem.object;
1533
+ const geometry = renderItem.geometry;
1534
+ const material = renderItem.material;
1535
+ const group = renderItem.group;
1489
1536
 
1490
- const currentSide = material.side;
1537
+ if ( material.side === DoubleSide && object.layers.test( camera.layers ) ) {
1491
1538
 
1492
- material.side = BackSide;
1493
- material.needsUpdate = true;
1539
+ const currentSide = material.side;
1494
1540
 
1495
- renderObject( object, scene, camera, geometry, material, group );
1541
+ material.side = BackSide;
1542
+ material.needsUpdate = true;
1496
1543
 
1497
- material.side = currentSide;
1498
- material.needsUpdate = true;
1544
+ renderObject( object, scene, camera, geometry, material, group );
1499
1545
 
1500
- renderTargetNeedsUpdate = true;
1546
+ material.side = currentSide;
1547
+ material.needsUpdate = true;
1548
+
1549
+ renderTargetNeedsUpdate = true;
1550
+
1551
+ }
1501
1552
 
1502
1553
  }
1503
1554
 
1504
- }
1555
+ if ( renderTargetNeedsUpdate === true ) {
1505
1556
 
1506
- if ( renderTargetNeedsUpdate === true ) {
1557
+ textures.updateMultisampleRenderTarget( transmissionRenderTarget );
1558
+ textures.updateRenderTargetMipmap( transmissionRenderTarget );
1507
1559
 
1508
- textures.updateMultisampleRenderTarget( transmissionRenderTarget );
1509
- textures.updateRenderTargetMipmap( transmissionRenderTarget );
1560
+ }
1510
1561
 
1511
1562
  }
1512
1563
 
@@ -1514,6 +1565,8 @@ class WebGLRenderer {
1514
1565
 
1515
1566
  _this.setClearColor( _currentClearColor, _currentClearAlpha );
1516
1567
 
1568
+ if ( currentCameraViewport !== undefined ) camera.viewport = currentCameraViewport;
1569
+
1517
1570
  _this.toneMapping = currentToneMapping;
1518
1571
 
1519
1572
  }
@@ -1704,6 +1757,7 @@ class WebGLRenderer {
1704
1757
 
1705
1758
  materialProperties.outputColorSpace = parameters.outputColorSpace;
1706
1759
  materialProperties.batching = parameters.batching;
1760
+ materialProperties.batchingColor = parameters.batchingColor;
1707
1761
  materialProperties.instancing = parameters.instancing;
1708
1762
  materialProperties.instancingColor = parameters.instancingColor;
1709
1763
  materialProperties.instancingMorph = parameters.instancingMorph;
@@ -1796,6 +1850,14 @@ class WebGLRenderer {
1796
1850
 
1797
1851
  needsProgramChange = true;
1798
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
+
1799
1861
  } else if ( object.isInstancedMesh && materialProperties.instancing === false ) {
1800
1862
 
1801
1863
  needsProgramChange = true;
@@ -2001,6 +2063,13 @@ class WebGLRenderer {
2001
2063
  p_uniforms.setOptional( _gl, object, 'batchingTexture' );
2002
2064
  p_uniforms.setValue( _gl, 'batchingTexture', object._matricesTexture, textures );
2003
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
+
2004
2073
  }
2005
2074
 
2006
2075
  const morphAttributes = geometry.morphAttributes;
@@ -2061,7 +2130,7 @@ class WebGLRenderer {
2061
2130
 
2062
2131
  }
2063
2132
 
2064
- materials.refreshMaterialUniforms( m_uniforms, material, _pixelRatio, _height, currentRenderState.state.transmissionRenderTarget );
2133
+ materials.refreshMaterialUniforms( m_uniforms, material, _pixelRatio, _height, currentRenderState.state.transmissionRenderTarget[ camera.id ] );
2065
2134
 
2066
2135
  WebGLUniforms.upload( _gl, getUniformList( materialProperties ), m_uniforms, textures );
2067
2136
 
@@ -2361,17 +2430,14 @@ class WebGLRenderer {
2361
2430
  const textureFormat = texture.format;
2362
2431
  const textureType = texture.type;
2363
2432
 
2364
- if ( textureFormat !== RGBAFormat && utils.convert( textureFormat ) !== _gl.getParameter( _gl.IMPLEMENTATION_COLOR_READ_FORMAT ) ) {
2433
+ if ( ! capabilities.textureFormatReadable( textureFormat ) ) {
2365
2434
 
2366
2435
  console.error( 'THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in RGBA or implementation defined format.' );
2367
2436
  return;
2368
2437
 
2369
2438
  }
2370
2439
 
2371
- const halfFloatSupportedByExt = ( textureType === HalfFloatType ) && ( extensions.has( 'EXT_color_buffer_half_float' ) || extensions.has( 'EXT_color_buffer_float' ) );
2372
-
2373
- if ( textureType !== UnsignedByteType && utils.convert( textureType ) !== _gl.getParameter( _gl.IMPLEMENTATION_COLOR_READ_TYPE ) && // Edge and Chrome Mac < 52 (#9513)
2374
- textureType !== FloatType && ! halfFloatSupportedByExt ) {
2440
+ if ( ! capabilities.textureTypeReadable( textureType ) ) {
2375
2441
 
2376
2442
  console.error( 'THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in UnsignedByteType or implementation defined type.' );
2377
2443
  return;
@@ -2399,24 +2465,159 @@ class WebGLRenderer {
2399
2465
 
2400
2466
  };
2401
2467
 
2402
- 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
+ }
2403
2559
 
2404
2560
  const levelScale = Math.pow( 2, - level );
2405
2561
  const width = Math.floor( texture.image.width * levelScale );
2406
2562
  const height = Math.floor( texture.image.height * levelScale );
2407
2563
 
2564
+ const x = position !== null ? position.x : 0;
2565
+ const y = position !== null ? position.y : 0;
2566
+
2408
2567
  textures.setTexture2D( texture, 0 );
2409
2568
 
2410
- _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 );
2411
2570
 
2412
2571
  state.unbindTexture();
2413
2572
 
2414
2573
  };
2415
2574
 
2416
- 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
+ }
2417
2620
 
2418
- const width = srcTexture.image.width;
2419
- const height = srcTexture.image.height;
2420
2621
  const glFormat = utils.convert( dstTexture.format );
2421
2622
  const glType = utils.convert( dstTexture.type );
2422
2623
 
@@ -2428,24 +2629,43 @@ class WebGLRenderer {
2428
2629
  _gl.pixelStorei( _gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, dstTexture.premultiplyAlpha );
2429
2630
  _gl.pixelStorei( _gl.UNPACK_ALIGNMENT, dstTexture.unpackAlignment );
2430
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
+
2431
2645
  if ( srcTexture.isDataTexture ) {
2432
2646
 
2433
- _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 );
2434
2648
 
2435
2649
  } else {
2436
2650
 
2437
2651
  if ( srcTexture.isCompressedTexture ) {
2438
2652
 
2439
- _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 );
2440
2654
 
2441
2655
  } else {
2442
2656
 
2443
- _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 );
2444
2658
 
2445
2659
  }
2446
2660
 
2447
2661
  }
2448
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
+
2449
2669
  // Generate mipmaps only when copying level 0
2450
2670
  if ( level === 0 && dstTexture.generateMipmaps ) _gl.generateMipmap( _gl.TEXTURE_2D );
2451
2671
 
@@ -2453,11 +2673,59 @@ class WebGLRenderer {
2453
2673
 
2454
2674
  };
2455
2675
 
2456
- 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
+ }
2457
2728
 
2458
- const width = Math.round( sourceBox.max.x - sourceBox.min.x );
2459
- const height = Math.round( sourceBox.max.y - sourceBox.min.y );
2460
- const depth = sourceBox.max.z - sourceBox.min.z + 1;
2461
2729
  const glFormat = utils.convert( dstTexture.format );
2462
2730
  const glType = utils.convert( dstTexture.type );
2463
2731
  let glTarget;
@@ -2483,43 +2751,41 @@ class WebGLRenderer {
2483
2751
  _gl.pixelStorei( _gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, dstTexture.premultiplyAlpha );
2484
2752
  _gl.pixelStorei( _gl.UNPACK_ALIGNMENT, dstTexture.unpackAlignment );
2485
2753
 
2486
- const unpackRowLen = _gl.getParameter( _gl.UNPACK_ROW_LENGTH );
2487
- const unpackImageHeight = _gl.getParameter( _gl.UNPACK_IMAGE_HEIGHT );
2488
- const unpackSkipPixels = _gl.getParameter( _gl.UNPACK_SKIP_PIXELS );
2489
- const unpackSkipRows = _gl.getParameter( _gl.UNPACK_SKIP_ROWS );
2490
- const unpackSkipImages = _gl.getParameter( _gl.UNPACK_SKIP_IMAGES );
2491
-
2492
- 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 );
2493
2759
 
2494
2760
  _gl.pixelStorei( _gl.UNPACK_ROW_LENGTH, image.width );
2495
2761
  _gl.pixelStorei( _gl.UNPACK_IMAGE_HEIGHT, image.height );
2496
- _gl.pixelStorei( _gl.UNPACK_SKIP_PIXELS, sourceBox.min.x );
2497
- _gl.pixelStorei( _gl.UNPACK_SKIP_ROWS, sourceBox.min.y );
2498
- _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 );
2499
2765
 
2500
2766
  if ( srcTexture.isDataTexture || srcTexture.isData3DTexture ) {
2501
2767
 
2502
- _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 );
2503
2769
 
2504
2770
  } else {
2505
2771
 
2506
2772
  if ( dstTexture.isCompressedArrayTexture ) {
2507
2773
 
2508
- _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 );
2509
2775
 
2510
2776
  } else {
2511
2777
 
2512
- _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 );
2513
2779
 
2514
2780
  }
2515
2781
 
2516
2782
  }
2517
2783
 
2518
- _gl.pixelStorei( _gl.UNPACK_ROW_LENGTH, unpackRowLen );
2519
- _gl.pixelStorei( _gl.UNPACK_IMAGE_HEIGHT, unpackImageHeight );
2520
- _gl.pixelStorei( _gl.UNPACK_SKIP_PIXELS, unpackSkipPixels );
2521
- _gl.pixelStorei( _gl.UNPACK_SKIP_ROWS, unpackSkipRows );
2522
- _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 );
2523
2789
 
2524
2790
  // Generate mipmaps only when copying level 0
2525
2791
  if ( level === 0 && dstTexture.generateMipmaps ) _gl.generateMipmap( glTarget );
@@ -2528,6 +2794,16 @@ class WebGLRenderer {
2528
2794
 
2529
2795
  };
2530
2796
 
2797
+ this.initRenderTarget = function ( target ) {
2798
+
2799
+ if ( properties.get( target ).__webglFramebuffer === undefined ) {
2800
+
2801
+ textures.setupRenderTarget( target );
2802
+
2803
+ }
2804
+
2805
+ };
2806
+
2531
2807
  this.initTexture = function ( texture ) {
2532
2808
 
2533
2809
  if ( texture.isCubeTexture ) {
@@ -2593,20 +2869,6 @@ class WebGLRenderer {
2593
2869
 
2594
2870
  }
2595
2871
 
2596
- get useLegacyLights() { // @deprecated, r155
2597
-
2598
- 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.' );
2599
- return this._useLegacyLights;
2600
-
2601
- }
2602
-
2603
- set useLegacyLights( value ) { // @deprecated, r155
2604
-
2605
- 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.' );
2606
- this._useLegacyLights = value;
2607
-
2608
- }
2609
-
2610
2872
  }
2611
2873
 
2612
2874