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.
- package/README.md +3 -3
- package/build/three.cjs +664 -217
- package/build/three.module.js +664 -217
- package/build/three.module.min.js +1 -1
- package/examples/jsm/controls/TransformControls.js +1 -1
- package/examples/jsm/environments/RoomEnvironment.js +1 -5
- package/examples/jsm/exporters/GLTFExporter.js +1 -1
- package/examples/jsm/exporters/USDZExporter.js +6 -4
- package/examples/jsm/helpers/ViewHelper.js +32 -67
- 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/FBXLoader.js +24 -13
- package/examples/jsm/loaders/GLTFLoader.js +2 -0
- package/examples/jsm/loaders/LDrawLoader.js +3 -2
- package/examples/jsm/loaders/MMDLoader.js +31 -12
- package/examples/jsm/modifiers/CurveModifier.js +11 -9
- package/examples/jsm/nodes/Nodes.js +12 -11
- 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/MaterialNode.js +2 -0
- 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/{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/UVNode.js +2 -46
- 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 +15 -2
- package/examples/jsm/nodes/core/NodeBuilder.js +20 -9
- package/examples/jsm/nodes/core/NodeKeywords.js +1 -1
- package/examples/jsm/nodes/core/OutputStructNode.js +1 -5
- package/examples/jsm/nodes/core/PropertyNode.js +1 -0
- package/examples/jsm/nodes/core/VaryingNode.js +40 -9
- package/examples/jsm/nodes/display/AfterImageNode.js +14 -2
- package/examples/jsm/nodes/display/PassNode.js +3 -1
- package/examples/jsm/nodes/display/ViewportNode.js +1 -1
- package/examples/jsm/nodes/functions/PhysicalLightingModel.js +61 -17
- package/examples/jsm/nodes/functions/ToonLightingModel.js +49 -0
- package/examples/jsm/nodes/lighting/AnalyticLightNode.js +2 -1
- package/examples/jsm/nodes/lighting/LightsNode.js +17 -0
- package/examples/jsm/nodes/materials/Line2NodeMaterial.js +1 -1
- package/examples/jsm/nodes/materials/Materials.js +3 -0
- package/examples/jsm/nodes/materials/MeshMatcapNodeMaterial.js +52 -0
- package/examples/jsm/nodes/materials/MeshPhysicalNodeMaterial.js +21 -4
- package/examples/jsm/nodes/materials/MeshToonNodeMaterial.js +34 -0
- package/examples/jsm/nodes/materials/NodeMaterial.js +13 -5
- package/examples/jsm/nodes/materials/VolumeNodeMaterial.js +106 -0
- package/examples/jsm/nodes/math/HashNode.js +2 -2
- package/examples/jsm/nodes/shadernode/ShaderNode.js +55 -33
- 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/postprocessing/RenderPass.js +1 -1
- 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/Bindings.js +17 -0
- package/examples/jsm/renderers/common/ChainMap.js +18 -48
- package/examples/jsm/renderers/common/ClippingContext.js +4 -4
- 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 +9 -0
- package/examples/jsm/renderers/common/RenderObject.js +6 -0
- package/examples/jsm/renderers/common/Renderer.js +139 -11
- package/examples/jsm/renderers/common/Uniform.js +1 -1
- package/examples/jsm/renderers/common/nodes/NodeSampledTexture.js +18 -4
- package/examples/jsm/renderers/common/nodes/NodeSampler.js +6 -0
- package/examples/jsm/renderers/webgl/nodes/GLSLNodeBuilder.js +17 -5
- package/examples/jsm/renderers/webgl/utils/WebGLTextureUtils.js +93 -6
- package/examples/jsm/renderers/webgpu/WebGPUBackend.js +50 -4
- package/examples/jsm/renderers/webgpu/nodes/WGSLNodeBuilder.js +69 -11
- 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/utils/BufferGeometryUtils.js +18 -16
- package/examples/jsm/utils/GPUStatsPanel.js +2 -0
- package/examples/jsm/utils/SortUtils.js +8 -5
- 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/loaders/FileLoader.js +4 -0
- package/src/loaders/LoaderUtils.js +3 -1
- package/src/loaders/ObjectLoader.js +1 -0
- package/src/objects/BatchedMesh.js +91 -1
- package/src/renderers/WebGLRenderer.js +288 -57
- 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/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/webgl/WebGLBackground.js +6 -0
- package/src/renderers/webgl/WebGLExtensions.js +3 -1
- package/src/renderers/webgl/WebGLLights.js +9 -12
- package/src/renderers/webgl/WebGLMaterials.js +1 -5
- package/src/renderers/webgl/WebGLMorphtargets.js +1 -2
- package/src/renderers/webgl/WebGLProgram.js +2 -31
- package/src/renderers/webgl/WebGLPrograms.js +14 -14
- package/src/renderers/webgl/WebGLRenderStates.js +2 -2
- package/src/renderers/webgl/WebGLTextures.js +139 -70
- package/src/renderers/webxr/WebXRDepthSensing.js +3 -3
- package/src/renderers/webxr/WebXRManager.js +6 -2
- 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
|
@@ -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(
|
|
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
|
-
|
|
1162
|
-
if (
|
|
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(
|
|
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 (
|
|
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 (
|
|
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
|
-
|
|
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.
|
|
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,
|
|
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 (
|
|
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,
|
|
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,
|
|
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,
|
|
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 (
|
|
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
|
|
2518
|
-
const
|
|
2519
|
-
const
|
|
2520
|
-
const
|
|
2521
|
-
const
|
|
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,
|
|
2528
|
-
_gl.pixelStorei( _gl.UNPACK_SKIP_ROWS,
|
|
2529
|
-
_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 );
|
|
2530
2765
|
|
|
2531
2766
|
if ( srcTexture.isDataTexture || srcTexture.isData3DTexture ) {
|
|
2532
2767
|
|
|
2533
|
-
_gl.texSubImage3D( glTarget, level,
|
|
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,
|
|
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,
|
|
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,
|
|
2550
|
-
_gl.pixelStorei( _gl.UNPACK_IMAGE_HEIGHT,
|
|
2551
|
-
_gl.pixelStorei( _gl.UNPACK_SKIP_PIXELS,
|
|
2552
|
-
_gl.pixelStorei( _gl.UNPACK_SKIP_ROWS,
|
|
2553
|
-
_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 );
|
|
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
|
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
|
-
|
|
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
|
-
|
|
63
|
+
if ( cutoffDistance > 0.0 ) {
|
|
61
64
|
|
|
62
|
-
|
|
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
|
-
|
|
69
|
+
return distanceFalloff;
|
|
84
70
|
|
|
85
71
|
}
|
|
86
72
|
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
export default /* glsl */`
|
|
2
|
-
#if defined( USE_MORPHCOLORS )
|
|
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)
|
|
@@ -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
|
-
|
|
9
|
+
for ( int i = 0; i < MORPHTARGETS_COUNT; i ++ ) {
|
|
10
10
|
|
|
11
|
-
|
|
11
|
+
if ( morphTargetInfluences[ i ] != 0.0 ) objectNormal += getMorph( gl_VertexID, i, 1 ).xyz * morphTargetInfluences[ i ];
|
|
12
12
|
|
|
13
|
-
|
|
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
|
`;
|