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.
- package/README.md +3 -3
- package/build/three.cjs +1127 -452
- package/build/three.module.js +1127 -452
- package/build/three.module.min.js +2 -2
- package/examples/jsm/animation/CCDIKSolver.js +4 -2
- package/examples/jsm/controls/TransformControls.js +1 -1
- package/examples/jsm/environments/RoomEnvironment.js +1 -5
- package/examples/jsm/exporters/GLTFExporter.js +45 -1
- package/examples/jsm/exporters/USDZExporter.js +13 -5
- package/examples/jsm/helpers/ViewHelper.js +32 -67
- package/examples/jsm/libs/draco/README.md +2 -2
- package/examples/jsm/libs/tween.module.js +75 -64
- package/examples/jsm/lines/LineMaterial.js +1 -15
- package/examples/jsm/lines/LineSegments2.js +15 -0
- package/examples/jsm/lines/Wireframe.js +16 -1
- package/examples/jsm/loaders/DRACOLoader.js +1 -1
- package/examples/jsm/loaders/EXRLoader.js +283 -99
- package/examples/jsm/loaders/FBXLoader.js +24 -13
- package/examples/jsm/loaders/GLTFLoader.js +55 -0
- package/examples/jsm/loaders/KTX2Loader.js +3 -6
- package/examples/jsm/loaders/LDrawLoader.js +3 -2
- package/examples/jsm/loaders/MMDLoader.js +31 -12
- package/examples/jsm/loaders/VRMLLoader.js +1 -1
- package/examples/jsm/loaders/lwo/IFFParser.js +8 -5
- package/examples/jsm/materials/MeshGouraudMaterial.js +7 -1
- package/examples/jsm/math/Octree.js +26 -20
- package/examples/jsm/modifiers/CurveModifier.js +11 -9
- package/examples/jsm/nodes/Nodes.js +15 -13
- package/examples/jsm/nodes/accessors/AccessorsUtils.js +16 -1
- package/examples/jsm/nodes/accessors/BitangentNode.js +7 -83
- package/examples/jsm/nodes/accessors/BufferNode.js +6 -0
- package/examples/jsm/nodes/accessors/CameraNode.js +12 -119
- package/examples/jsm/nodes/accessors/ClippingNode.js +3 -2
- package/examples/jsm/nodes/accessors/MaterialNode.js +109 -3
- package/examples/jsm/nodes/accessors/ModelNode.js +3 -0
- package/examples/jsm/nodes/accessors/NormalNode.js +9 -101
- package/examples/jsm/nodes/accessors/PositionNode.js +6 -100
- package/examples/jsm/nodes/accessors/ReferenceNode.js +6 -0
- package/examples/jsm/nodes/accessors/ReflectVectorNode.js +2 -31
- package/examples/jsm/nodes/accessors/StorageBufferNode.js +9 -0
- package/examples/jsm/nodes/accessors/{TextureStoreNode.js → StorageTextureNode.js} +19 -6
- package/examples/jsm/nodes/accessors/TangentNode.js +11 -97
- package/examples/jsm/nodes/accessors/Texture3DNode.js +100 -0
- package/examples/jsm/nodes/accessors/TextureNode.js +21 -3
- package/examples/jsm/nodes/accessors/TextureSizeNode.js +1 -1
- package/examples/jsm/nodes/accessors/UVNode.js +2 -46
- package/examples/jsm/nodes/code/FunctionNode.js +0 -8
- package/examples/jsm/nodes/core/AttributeNode.js +15 -3
- package/examples/jsm/nodes/core/ContextNode.js +6 -0
- package/examples/jsm/nodes/core/Node.js +23 -2
- package/examples/jsm/nodes/core/NodeBuilder.js +25 -18
- package/examples/jsm/nodes/core/NodeKeywords.js +1 -1
- package/examples/jsm/nodes/core/OutputStructNode.js +3 -6
- package/examples/jsm/nodes/core/PropertyNode.js +11 -0
- package/examples/jsm/nodes/core/VaryingNode.js +40 -9
- package/examples/jsm/nodes/display/AfterImageNode.js +14 -2
- package/examples/jsm/nodes/display/BumpMapNode.js +7 -26
- package/examples/jsm/nodes/display/FrontFacingNode.js +13 -0
- package/examples/jsm/nodes/display/PassNode.js +3 -1
- package/examples/jsm/nodes/display/ViewportDepthNode.js +1 -1
- package/examples/jsm/nodes/display/ViewportNode.js +5 -3
- package/examples/jsm/nodes/display/ViewportTextureNode.js +4 -1
- package/examples/jsm/nodes/functions/BSDF/BRDF_GGX.js +26 -7
- package/examples/jsm/nodes/functions/BSDF/D_GGX_Anisotropic.js +28 -0
- package/examples/jsm/nodes/functions/BSDF/V_GGX_SmithCorrelated.js +1 -3
- package/examples/jsm/nodes/functions/BSDF/V_GGX_SmithCorrelated_Anisotropic.js +29 -0
- package/examples/jsm/nodes/functions/PhongLightingModel.js +1 -1
- package/examples/jsm/nodes/functions/PhysicalLightingModel.js +210 -12
- package/examples/jsm/nodes/functions/ShadowMaskModel.js +31 -0
- package/examples/jsm/nodes/functions/ToonLightingModel.js +49 -0
- package/examples/jsm/nodes/lighting/AnalyticLightNode.js +20 -5
- package/examples/jsm/nodes/lighting/DirectionalLightNode.js +2 -1
- package/examples/jsm/nodes/lighting/EnvironmentNode.js +11 -2
- package/examples/jsm/nodes/lighting/IrradianceNode.js +24 -0
- package/examples/jsm/nodes/lighting/LightsNode.js +28 -1
- package/examples/jsm/nodes/lighting/PointLightNode.js +2 -1
- package/examples/jsm/nodes/lighting/SpotLightNode.js +2 -1
- package/examples/jsm/nodes/materials/Line2NodeMaterial.js +11 -7
- package/examples/jsm/nodes/materials/Materials.js +4 -0
- package/examples/jsm/nodes/materials/MeshMatcapNodeMaterial.js +52 -0
- package/examples/jsm/nodes/materials/MeshNormalNodeMaterial.js +0 -2
- package/examples/jsm/nodes/materials/MeshPhongNodeMaterial.js +2 -2
- package/examples/jsm/nodes/materials/MeshPhysicalNodeMaterial.js +94 -6
- package/examples/jsm/nodes/materials/MeshStandardNodeMaterial.js +11 -4
- package/examples/jsm/nodes/materials/MeshToonNodeMaterial.js +34 -0
- package/examples/jsm/nodes/materials/NodeMaterial.js +43 -45
- package/examples/jsm/nodes/materials/ShadowNodeMaterial.js +34 -0
- package/examples/jsm/nodes/materials/VolumeNodeMaterial.js +106 -0
- package/examples/jsm/nodes/math/HashNode.js +2 -2
- package/examples/jsm/nodes/pmrem/PMREMUtils.js +1 -1
- package/examples/jsm/nodes/shadernode/ShaderNode.js +57 -41
- package/examples/jsm/nodes/utils/ArrayElementNode.js +1 -1
- package/examples/jsm/nodes/utils/MatcapUVNode.js +1 -1
- package/examples/jsm/nodes/utils/TimerNode.js +1 -1
- package/examples/jsm/objects/Lensflare.js +2 -2
- package/examples/jsm/physics/JoltPhysics.js +281 -0
- package/examples/jsm/postprocessing/RenderPass.js +1 -1
- package/examples/jsm/postprocessing/RenderTransitionPass.js +193 -0
- package/examples/jsm/renderers/CSS2DRenderer.js +25 -5
- package/examples/jsm/renderers/CSS3DRenderer.js +24 -3
- package/examples/jsm/renderers/common/Attributes.js +2 -0
- package/examples/jsm/renderers/common/Background.js +3 -3
- package/examples/jsm/renderers/common/Bindings.js +17 -0
- package/examples/jsm/renderers/common/ChainMap.js +18 -48
- package/examples/jsm/renderers/common/ClippingContext.js +5 -5
- package/examples/jsm/renderers/common/Pipelines.js +2 -2
- package/examples/jsm/renderers/common/RenderBundle.js +18 -0
- package/examples/jsm/renderers/common/RenderBundles.js +38 -0
- package/examples/jsm/renderers/common/RenderList.js +10 -1
- package/examples/jsm/renderers/common/RenderObject.js +49 -1
- package/examples/jsm/renderers/common/Renderer.js +268 -25
- package/examples/jsm/renderers/common/Textures.js +1 -1
- package/examples/jsm/renderers/common/Uniform.js +1 -1
- package/examples/jsm/renderers/common/extras/PMREMGenerator.js +13 -17
- package/examples/jsm/renderers/common/nodes/NodeSampledTexture.js +18 -4
- package/examples/jsm/renderers/common/nodes/NodeSampler.js +6 -0
- package/examples/jsm/renderers/common/nodes/Nodes.js +31 -47
- package/examples/jsm/renderers/webgl/WebGLBackend.js +7 -21
- package/examples/jsm/renderers/webgl/WebGLBufferRenderer.js +5 -1
- package/examples/jsm/renderers/webgl/nodes/GLSLNodeBuilder.js +23 -5
- package/examples/jsm/renderers/webgl/utils/WebGLTextureUtils.js +114 -13
- package/examples/jsm/renderers/webgl/utils/WebGLUtils.js +3 -21
- package/examples/jsm/renderers/webgpu/WebGPUBackend.js +80 -46
- package/examples/jsm/renderers/webgpu/nodes/WGSLNodeBuilder.js +85 -12
- package/examples/jsm/renderers/webgpu/utils/WebGPUAttributeUtils.js +4 -1
- package/examples/jsm/renderers/webgpu/utils/WebGPUBindingUtils.js +10 -1
- package/examples/jsm/renderers/webgpu/utils/WebGPUConstants.js +6 -0
- package/examples/jsm/renderers/webgpu/utils/WebGPUPipelineUtils.js +62 -19
- package/examples/jsm/renderers/webgpu/utils/WebGPUTextureUtils.js +62 -3
- package/examples/jsm/transpiler/GLSLDecoder.js +1 -1
- package/examples/jsm/transpiler/ShaderToyDecoder.js +1 -1
- package/examples/jsm/utils/BufferGeometryUtils.js +18 -16
- package/examples/jsm/utils/GPUStatsPanel.js +2 -0
- package/examples/jsm/utils/SceneUtils.js +60 -1
- package/examples/jsm/utils/SortUtils.js +8 -5
- package/examples/jsm/webxr/OculusHandModel.js +3 -2
- package/examples/jsm/webxr/XRHandModelFactory.js +4 -2
- package/package.json +3 -2
- package/src/animation/tracks/BooleanKeyframeTrack.js +10 -1
- package/src/animation/tracks/QuaternionKeyframeTrack.js +1 -2
- package/src/animation/tracks/StringKeyframeTrack.js +10 -1
- package/src/constants.js +1 -1
- package/src/core/Object3D.js +2 -0
- package/src/core/Raycaster.js +6 -2
- package/src/core/RenderTarget.js +8 -0
- package/src/extras/PMREMGenerator.js +12 -11
- package/src/loaders/FileLoader.js +5 -1
- package/src/loaders/LoaderUtils.js +3 -1
- package/src/loaders/MaterialLoader.js +1 -0
- package/src/loaders/ObjectLoader.js +1 -0
- package/src/materials/Material.js +2 -0
- package/src/materials/MeshPhysicalMaterial.js +20 -0
- package/src/objects/BatchedMesh.js +114 -1
- package/src/objects/Line.js +66 -43
- package/src/renderers/WebGLRenderer.js +371 -109
- package/src/renderers/shaders/ShaderChunk/batching_pars_vertex.glsl.js +15 -0
- package/src/renderers/shaders/ShaderChunk/color_pars_vertex.glsl.js +1 -1
- package/src/renderers/shaders/ShaderChunk/color_vertex.glsl.js +9 -1
- package/src/renderers/shaders/ShaderChunk/lights_pars_begin.glsl.js +8 -22
- package/src/renderers/shaders/ShaderChunk/lights_physical_fragment.glsl.js +6 -0
- package/src/renderers/shaders/ShaderChunk/lights_physical_pars_fragment.glsl.js +1 -0
- package/src/renderers/shaders/ShaderChunk/morphcolor_vertex.glsl.js +1 -1
- package/src/renderers/shaders/ShaderChunk/morphinstance_vertex.glsl.js +1 -1
- package/src/renderers/shaders/ShaderChunk/morphnormal_vertex.glsl.js +3 -14
- package/src/renderers/shaders/ShaderChunk/morphtarget_pars_vertex.glsl.js +10 -31
- package/src/renderers/shaders/ShaderChunk/morphtarget_vertex.glsl.js +3 -23
- package/src/renderers/shaders/ShaderChunk/tonemapping_pars_fragment.glsl.js +17 -9
- package/src/renderers/shaders/ShaderChunk/transmission_fragment.glsl.js +1 -1
- package/src/renderers/shaders/ShaderChunk/transmission_pars_fragment.glsl.js +47 -13
- package/src/renderers/shaders/ShaderChunk.js +0 -2
- package/src/renderers/shaders/ShaderLib/meshphysical.glsl.js +4 -0
- package/src/renderers/shaders/ShaderLib.js +1 -0
- package/src/renderers/webgl/WebGLBackground.js +24 -3
- package/src/renderers/webgl/WebGLBufferRenderer.js +36 -0
- package/src/renderers/webgl/WebGLCapabilities.js +33 -1
- package/src/renderers/webgl/WebGLExtensions.js +3 -1
- package/src/renderers/webgl/WebGLIndexedBufferRenderer.js +36 -0
- package/src/renderers/webgl/WebGLLights.js +9 -12
- package/src/renderers/webgl/WebGLMaterials.js +7 -5
- package/src/renderers/webgl/WebGLMorphtargets.js +1 -2
- package/src/renderers/webgl/WebGLProgram.js +5 -36
- package/src/renderers/webgl/WebGLPrograms.js +19 -14
- package/src/renderers/webgl/WebGLRenderStates.js +8 -4
- package/src/renderers/webgl/WebGLShadowMap.js +25 -25
- package/src/renderers/webgl/WebGLTextures.js +206 -129
- package/src/renderers/webgl/WebGLUtils.js +3 -21
- package/src/renderers/webxr/WebXRDepthSensing.js +3 -3
- package/src/renderers/webxr/WebXRManager.js +8 -6
- package/src/textures/CompressedArrayTexture.js +14 -0
- package/src/textures/DataArrayTexture.js +14 -0
- package/src/textures/DepthTexture.js +1 -3
- package/src/utils.js +30 -1
- package/examples/jsm/renderers/webgl-legacy/nodes/GLSL1NodeBuilder.js +0 -318
- package/examples/jsm/renderers/webgl-legacy/nodes/SlotNode.js +0 -26
- package/examples/jsm/renderers/webgl-legacy/nodes/WebGLNodeBuilder.js +0 -792
- package/examples/jsm/renderers/webgl-legacy/nodes/WebGLNodes.js +0 -51
- 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
|
-
|
|
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
|
-
|
|
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(
|
|
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 (
|
|
1201
|
+
if ( camera.isArrayCamera ) {
|
|
1180
1202
|
|
|
1181
|
-
|
|
1203
|
+
const cameras = camera.cameras;
|
|
1182
1204
|
|
|
1183
|
-
|
|
1205
|
+
if ( transmissiveObjects.length > 0 ) {
|
|
1184
1206
|
|
|
1185
|
-
|
|
1207
|
+
for ( let i = 0, l = cameras.length; i < l; i ++ ) {
|
|
1186
1208
|
|
|
1187
|
-
|
|
1209
|
+
const camera2 = cameras[ i ];
|
|
1188
1210
|
|
|
1189
|
-
|
|
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 ===
|
|
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
|
-
|
|
1454
|
-
transmissionRenderTarget.setSize(
|
|
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
|
-
|
|
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
|
-
|
|
1524
|
+
if ( extensions.has( 'WEBGL_multisampled_render_to_texture' ) === false ) { // see #28131
|
|
1478
1525
|
|
|
1479
|
-
|
|
1526
|
+
let renderTargetNeedsUpdate = false;
|
|
1480
1527
|
|
|
1481
|
-
|
|
1528
|
+
for ( let i = 0, l = transmissiveObjects.length; i < l; i ++ ) {
|
|
1482
1529
|
|
|
1483
|
-
|
|
1484
|
-
const geometry = renderItem.geometry;
|
|
1485
|
-
const material = renderItem.material;
|
|
1486
|
-
const group = renderItem.group;
|
|
1530
|
+
const renderItem = transmissiveObjects[ i ];
|
|
1487
1531
|
|
|
1488
|
-
|
|
1532
|
+
const object = renderItem.object;
|
|
1533
|
+
const geometry = renderItem.geometry;
|
|
1534
|
+
const material = renderItem.material;
|
|
1535
|
+
const group = renderItem.group;
|
|
1489
1536
|
|
|
1490
|
-
|
|
1537
|
+
if ( material.side === DoubleSide && object.layers.test( camera.layers ) ) {
|
|
1491
1538
|
|
|
1492
|
-
|
|
1493
|
-
material.needsUpdate = true;
|
|
1539
|
+
const currentSide = material.side;
|
|
1494
1540
|
|
|
1495
|
-
|
|
1541
|
+
material.side = BackSide;
|
|
1542
|
+
material.needsUpdate = true;
|
|
1496
1543
|
|
|
1497
|
-
|
|
1498
|
-
material.needsUpdate = true;
|
|
1544
|
+
renderObject( object, scene, camera, geometry, material, group );
|
|
1499
1545
|
|
|
1500
|
-
|
|
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
|
-
|
|
1557
|
+
textures.updateMultisampleRenderTarget( transmissionRenderTarget );
|
|
1558
|
+
textures.updateRenderTargetMipmap( transmissionRenderTarget );
|
|
1507
1559
|
|
|
1508
|
-
|
|
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 (
|
|
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
|
-
|
|
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.
|
|
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,
|
|
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 (
|
|
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,
|
|
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,
|
|
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,
|
|
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 (
|
|
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
|
|
2487
|
-
const
|
|
2488
|
-
const
|
|
2489
|
-
const
|
|
2490
|
-
const
|
|
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,
|
|
2497
|
-
_gl.pixelStorei( _gl.UNPACK_SKIP_ROWS,
|
|
2498
|
-
_gl.pixelStorei( _gl.UNPACK_SKIP_IMAGES,
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
2519
|
-
_gl.pixelStorei( _gl.UNPACK_IMAGE_HEIGHT,
|
|
2520
|
-
_gl.pixelStorei( _gl.UNPACK_SKIP_PIXELS,
|
|
2521
|
-
_gl.pixelStorei( _gl.UNPACK_SKIP_ROWS,
|
|
2522
|
-
_gl.pixelStorei( _gl.UNPACK_SKIP_IMAGES,
|
|
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
|
|