super-three 0.163.0 → 0.164.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/build/three.cjs +473 -245
- package/build/three.module.js +473 -245
- package/build/three.module.min.js +2 -2
- package/examples/jsm/animation/CCDIKSolver.js +4 -2
- package/examples/jsm/exporters/GLTFExporter.js +45 -1
- package/examples/jsm/exporters/USDZExporter.js +7 -1
- package/examples/jsm/libs/draco/README.md +2 -2
- package/examples/jsm/loaders/EXRLoader.js +283 -99
- package/examples/jsm/loaders/GLTFLoader.js +53 -0
- package/examples/jsm/loaders/KTX2Loader.js +3 -6
- 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/nodes/Nodes.js +4 -3
- package/examples/jsm/nodes/accessors/AccessorsUtils.js +16 -1
- package/examples/jsm/nodes/accessors/ClippingNode.js +3 -2
- package/examples/jsm/nodes/accessors/MaterialNode.js +107 -3
- package/examples/jsm/nodes/accessors/StorageBufferNode.js +9 -0
- package/examples/jsm/nodes/accessors/TextureNode.js +21 -3
- package/examples/jsm/nodes/accessors/TextureSizeNode.js +1 -1
- package/examples/jsm/nodes/code/FunctionNode.js +0 -8
- package/examples/jsm/nodes/core/Node.js +8 -0
- package/examples/jsm/nodes/core/NodeBuilder.js +5 -9
- package/examples/jsm/nodes/core/OutputStructNode.js +2 -1
- package/examples/jsm/nodes/core/PropertyNode.js +10 -0
- package/examples/jsm/nodes/display/BumpMapNode.js +7 -26
- package/examples/jsm/nodes/display/FrontFacingNode.js +13 -0
- package/examples/jsm/nodes/display/ViewportDepthNode.js +1 -1
- package/examples/jsm/nodes/display/ViewportNode.js +4 -2
- 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 +164 -10
- package/examples/jsm/nodes/functions/ShadowMaskModel.js +31 -0
- package/examples/jsm/nodes/lighting/AnalyticLightNode.js +18 -4
- 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 +11 -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 +10 -6
- package/examples/jsm/nodes/materials/Materials.js +1 -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 +76 -5
- package/examples/jsm/nodes/materials/MeshStandardNodeMaterial.js +11 -4
- package/examples/jsm/nodes/materials/NodeMaterial.js +31 -41
- package/examples/jsm/nodes/materials/ShadowNodeMaterial.js +34 -0
- package/examples/jsm/nodes/pmrem/PMREMUtils.js +1 -1
- package/examples/jsm/nodes/shadernode/ShaderNode.js +2 -8
- package/examples/jsm/physics/JoltPhysics.js +281 -0
- package/examples/jsm/postprocessing/RenderTransitionPass.js +193 -0
- package/examples/jsm/renderers/common/Background.js +3 -3
- package/examples/jsm/renderers/common/ClippingContext.js +1 -1
- package/examples/jsm/renderers/common/RenderList.js +1 -1
- package/examples/jsm/renderers/common/RenderObject.js +43 -1
- package/examples/jsm/renderers/common/Renderer.js +129 -14
- package/examples/jsm/renderers/common/Textures.js +1 -1
- package/examples/jsm/renderers/common/extras/PMREMGenerator.js +13 -17
- 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 +6 -0
- package/examples/jsm/renderers/webgl/utils/WebGLTextureUtils.js +21 -7
- package/examples/jsm/renderers/webgl/utils/WebGLUtils.js +3 -21
- package/examples/jsm/renderers/webgpu/WebGPUBackend.js +33 -45
- package/examples/jsm/renderers/webgpu/nodes/WGSLNodeBuilder.js +16 -1
- package/examples/jsm/renderers/webgpu/utils/WebGPUAttributeUtils.js +4 -1
- package/examples/jsm/transpiler/GLSLDecoder.js +1 -1
- package/examples/jsm/transpiler/ShaderToyDecoder.js +1 -1
- package/examples/jsm/utils/SceneUtils.js +60 -1
- package/examples/jsm/webxr/OculusHandModel.js +3 -2
- package/examples/jsm/webxr/XRHandModelFactory.js +4 -2
- package/package.json +1 -1
- package/src/constants.js +1 -1
- package/src/core/RenderTarget.js +8 -0
- package/src/extras/PMREMGenerator.js +12 -11
- package/src/loaders/FileLoader.js +1 -1
- package/src/loaders/MaterialLoader.js +1 -0
- package/src/materials/Material.js +2 -0
- package/src/materials/MeshPhysicalMaterial.js +20 -0
- package/src/objects/BatchedMesh.js +23 -0
- package/src/objects/Line.js +66 -43
- package/src/renderers/WebGLRenderer.js +92 -61
- 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/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 +18 -3
- package/src/renderers/webgl/WebGLBufferRenderer.js +36 -0
- package/src/renderers/webgl/WebGLCapabilities.js +33 -1
- package/src/renderers/webgl/WebGLIndexedBufferRenderer.js +36 -0
- package/src/renderers/webgl/WebGLMaterials.js +6 -0
- package/src/renderers/webgl/WebGLProgram.js +3 -5
- package/src/renderers/webgl/WebGLPrograms.js +5 -0
- package/src/renderers/webgl/WebGLRenderStates.js +6 -2
- package/src/renderers/webgl/WebGLShadowMap.js +25 -25
- package/src/renderers/webgl/WebGLTextures.js +68 -60
- package/src/renderers/webgl/WebGLUtils.js +3 -21
- package/src/renderers/webxr/WebXRManager.js +2 -4
- 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
|
@@ -12,7 +12,9 @@ import Background from './Background.js';
|
|
|
12
12
|
import Nodes from './nodes/Nodes.js';
|
|
13
13
|
import Color4 from './Color4.js';
|
|
14
14
|
import ClippingContext from './ClippingContext.js';
|
|
15
|
-
import { Scene, Frustum, Matrix4, Vector2, Vector3, Vector4, DoubleSide, BackSide, FrontSide, SRGBColorSpace, NoToneMapping } from 'three';
|
|
15
|
+
import { Scene, Frustum, Matrix4, Vector2, Vector3, Vector4, DoubleSide, BackSide, FrontSide, SRGBColorSpace, NoColorSpace, NoToneMapping, LinearFilter, LinearSRGBColorSpace, RenderTarget, HalfFloatType, RGBAFormat } from 'three';
|
|
16
|
+
import { NodeMaterial } from '../../nodes/Nodes.js';
|
|
17
|
+
import QuadMesh from '../../objects/QuadMesh.js';
|
|
16
18
|
|
|
17
19
|
const _scene = new Scene();
|
|
18
20
|
const _drawingBufferSize = new Vector2();
|
|
@@ -20,6 +22,7 @@ const _screen = new Vector4();
|
|
|
20
22
|
const _frustum = new Frustum();
|
|
21
23
|
const _projScreenMatrix = new Matrix4();
|
|
22
24
|
const _vector3 = new Vector3();
|
|
25
|
+
const _quad = new QuadMesh( new NodeMaterial() );
|
|
23
26
|
|
|
24
27
|
class Renderer {
|
|
25
28
|
|
|
@@ -63,6 +66,10 @@ class Renderer {
|
|
|
63
66
|
|
|
64
67
|
this.info = new Info();
|
|
65
68
|
|
|
69
|
+
// nodes
|
|
70
|
+
|
|
71
|
+
this.toneMappingNode = null;
|
|
72
|
+
|
|
66
73
|
// internals
|
|
67
74
|
|
|
68
75
|
this._pixelRatio = 1;
|
|
@@ -90,6 +97,7 @@ class Renderer {
|
|
|
90
97
|
this._opaqueSort = null;
|
|
91
98
|
this._transparentSort = null;
|
|
92
99
|
|
|
100
|
+
this._frameBufferTarget = null;
|
|
93
101
|
|
|
94
102
|
const alphaClear = this.alpha === true ? 0 : 1;
|
|
95
103
|
|
|
@@ -332,7 +340,56 @@ class Renderer {
|
|
|
332
340
|
|
|
333
341
|
}
|
|
334
342
|
|
|
335
|
-
|
|
343
|
+
_getFrameBufferTarget() {
|
|
344
|
+
|
|
345
|
+
const { currentColorSpace } = this;
|
|
346
|
+
|
|
347
|
+
const useToneMapping = this._renderTarget === null && ( this.toneMapping !== NoToneMapping || this.toneMappingNode !== null );
|
|
348
|
+
const useColorSpace = currentColorSpace !== LinearSRGBColorSpace && currentColorSpace !== NoColorSpace;
|
|
349
|
+
|
|
350
|
+
if ( useToneMapping === false && useColorSpace === false ) return null;
|
|
351
|
+
|
|
352
|
+
const { width, height } = this.getDrawingBufferSize( _drawingBufferSize );
|
|
353
|
+
const { depth, stencil } = this;
|
|
354
|
+
|
|
355
|
+
let frameBufferTarget = this._frameBufferTarget;
|
|
356
|
+
|
|
357
|
+
if ( frameBufferTarget === null ) {
|
|
358
|
+
|
|
359
|
+
frameBufferTarget = new RenderTarget( width, height, {
|
|
360
|
+
depthBuffer: depth,
|
|
361
|
+
stencilBuffer: stencil,
|
|
362
|
+
type: HalfFloatType, // FloatType
|
|
363
|
+
format: RGBAFormat,
|
|
364
|
+
colorSpace: LinearSRGBColorSpace,
|
|
365
|
+
generateMipmaps: false,
|
|
366
|
+
minFilter: LinearFilter,
|
|
367
|
+
magFilter: LinearFilter,
|
|
368
|
+
samples: this.backend.parameters.antialias ? 4 : 0
|
|
369
|
+
} );
|
|
370
|
+
|
|
371
|
+
frameBufferTarget.isPostProcessingRenderTarget = true;
|
|
372
|
+
|
|
373
|
+
this._frameBufferTarget = frameBufferTarget;
|
|
374
|
+
|
|
375
|
+
}
|
|
376
|
+
|
|
377
|
+
frameBufferTarget.depthBuffer = depth;
|
|
378
|
+
frameBufferTarget.stencilBuffer = stencil;
|
|
379
|
+
frameBufferTarget.setSize( width, height );
|
|
380
|
+
frameBufferTarget.viewport.copy( this._viewport );
|
|
381
|
+
frameBufferTarget.scissor.copy( this._scissor );
|
|
382
|
+
frameBufferTarget.viewport.multiplyScalar( this._pixelRatio );
|
|
383
|
+
frameBufferTarget.scissor.multiplyScalar( this._pixelRatio );
|
|
384
|
+
frameBufferTarget.scissorTest = this._scissorTest;
|
|
385
|
+
|
|
386
|
+
return frameBufferTarget;
|
|
387
|
+
|
|
388
|
+
}
|
|
389
|
+
|
|
390
|
+
_renderScene( scene, camera, useFrameBufferTarget = true ) {
|
|
391
|
+
|
|
392
|
+
const frameBufferTarget = useFrameBufferTarget ? this._getFrameBufferTarget() : null;
|
|
336
393
|
|
|
337
394
|
// preserve render tree
|
|
338
395
|
|
|
@@ -346,11 +403,31 @@ class Renderer {
|
|
|
346
403
|
|
|
347
404
|
const sceneRef = ( scene.isScene === true ) ? scene : _scene;
|
|
348
405
|
|
|
349
|
-
const
|
|
350
|
-
|
|
406
|
+
const outputRenderTarget = this._renderTarget;
|
|
407
|
+
|
|
351
408
|
const activeCubeFace = this._activeCubeFace;
|
|
352
409
|
const activeMipmapLevel = this._activeMipmapLevel;
|
|
353
410
|
|
|
411
|
+
//
|
|
412
|
+
|
|
413
|
+
let renderTarget;
|
|
414
|
+
|
|
415
|
+
if ( frameBufferTarget !== null ) {
|
|
416
|
+
|
|
417
|
+
renderTarget = frameBufferTarget;
|
|
418
|
+
|
|
419
|
+
this.setRenderTarget( renderTarget );
|
|
420
|
+
|
|
421
|
+
} else {
|
|
422
|
+
|
|
423
|
+
renderTarget = outputRenderTarget;
|
|
424
|
+
|
|
425
|
+
}
|
|
426
|
+
|
|
427
|
+
//
|
|
428
|
+
|
|
429
|
+
const renderContext = this._renderContexts.get( scene, camera, renderTarget );
|
|
430
|
+
|
|
354
431
|
this._currentRenderContext = renderContext;
|
|
355
432
|
this._currentRenderObjectFunction = this._renderObjectFunction || this.renderObject;
|
|
356
433
|
|
|
@@ -505,6 +582,18 @@ class Renderer {
|
|
|
505
582
|
|
|
506
583
|
//
|
|
507
584
|
|
|
585
|
+
if ( frameBufferTarget !== null ) {
|
|
586
|
+
|
|
587
|
+
this.setRenderTarget( outputRenderTarget, activeCubeFace, activeMipmapLevel );
|
|
588
|
+
|
|
589
|
+
_quad.material.fragmentNode = this._nodes.getOutputNode( renderTarget.texture );
|
|
590
|
+
|
|
591
|
+
this._renderScene( _quad, _quad.camera, false );
|
|
592
|
+
|
|
593
|
+
}
|
|
594
|
+
|
|
595
|
+
//
|
|
596
|
+
|
|
508
597
|
sceneRef.onAfterRender( this, scene, camera, renderTarget );
|
|
509
598
|
|
|
510
599
|
//
|
|
@@ -769,8 +858,9 @@ class Renderer {
|
|
|
769
858
|
|
|
770
859
|
}
|
|
771
860
|
|
|
861
|
+
const renderTarget = this._renderTarget || this._getFrameBufferTarget();
|
|
862
|
+
|
|
772
863
|
let renderTargetData = null;
|
|
773
|
-
const renderTarget = this._renderTarget;
|
|
774
864
|
|
|
775
865
|
if ( renderTarget !== null ) {
|
|
776
866
|
|
|
@@ -964,14 +1054,24 @@ class Renderer {
|
|
|
964
1054
|
|
|
965
1055
|
}
|
|
966
1056
|
|
|
967
|
-
hasFeatureAsync( name ) {
|
|
1057
|
+
async hasFeatureAsync( name ) {
|
|
1058
|
+
|
|
1059
|
+
if ( this._initialized === false ) await this.init();
|
|
968
1060
|
|
|
969
|
-
return this.backend.
|
|
1061
|
+
return this.backend.hasFeature( name );
|
|
970
1062
|
|
|
971
1063
|
}
|
|
972
1064
|
|
|
973
1065
|
hasFeature( name ) {
|
|
974
1066
|
|
|
1067
|
+
if ( this._initialized === false ) {
|
|
1068
|
+
|
|
1069
|
+
console.warn( 'THREE.Renderer: .hasFeature() called before the backend is initialized. Try using .hasFeatureAsync() instead.' );
|
|
1070
|
+
|
|
1071
|
+
return false;
|
|
1072
|
+
|
|
1073
|
+
}
|
|
1074
|
+
|
|
975
1075
|
return this.backend.hasFeature( name );
|
|
976
1076
|
|
|
977
1077
|
}
|
|
@@ -996,9 +1096,9 @@ class Renderer {
|
|
|
996
1096
|
}
|
|
997
1097
|
|
|
998
1098
|
|
|
999
|
-
readRenderTargetPixelsAsync( renderTarget, x, y, width, height ) {
|
|
1099
|
+
readRenderTargetPixelsAsync( renderTarget, x, y, width, height, index = 0 ) {
|
|
1000
1100
|
|
|
1001
|
-
return this.backend.copyTextureToBuffer( renderTarget.
|
|
1101
|
+
return this.backend.copyTextureToBuffer( renderTarget.textures[ index ], x, y, width, height );
|
|
1002
1102
|
|
|
1003
1103
|
}
|
|
1004
1104
|
|
|
@@ -1158,6 +1258,7 @@ class Renderer {
|
|
|
1158
1258
|
|
|
1159
1259
|
let overridePositionNode;
|
|
1160
1260
|
let overrideFragmentNode;
|
|
1261
|
+
let overrideDepthNode;
|
|
1161
1262
|
|
|
1162
1263
|
//
|
|
1163
1264
|
|
|
@@ -1174,7 +1275,6 @@ class Renderer {
|
|
|
1174
1275
|
if ( material.positionNode && material.positionNode.isNode ) {
|
|
1175
1276
|
|
|
1176
1277
|
overridePositionNode = overrideMaterial.positionNode;
|
|
1177
|
-
|
|
1178
1278
|
overrideMaterial.positionNode = material.positionNode;
|
|
1179
1279
|
|
|
1180
1280
|
}
|
|
@@ -1183,6 +1283,14 @@ class Renderer {
|
|
|
1183
1283
|
|
|
1184
1284
|
overrideMaterial.side = material.shadowSide === null ? material.side : material.shadowSide;
|
|
1185
1285
|
|
|
1286
|
+
if ( material.depthNode && material.depthNode.isNode ) {
|
|
1287
|
+
|
|
1288
|
+
overrideDepthNode = overrideMaterial.depthNode;
|
|
1289
|
+
overrideMaterial.depthNode = material.depthNode;
|
|
1290
|
+
|
|
1291
|
+
}
|
|
1292
|
+
|
|
1293
|
+
|
|
1186
1294
|
if ( material.shadowNode && material.shadowNode.isNode ) {
|
|
1187
1295
|
|
|
1188
1296
|
overrideFragmentNode = overrideMaterial.fragmentNode;
|
|
@@ -1227,16 +1335,16 @@ class Renderer {
|
|
|
1227
1335
|
if ( material.transparent === true && material.side === DoubleSide && material.forceSinglePass === false ) {
|
|
1228
1336
|
|
|
1229
1337
|
material.side = BackSide;
|
|
1230
|
-
this._handleObjectFunction( object, material, scene, camera, lightsNode, 'backSide' ); // create backSide pass id
|
|
1338
|
+
this._handleObjectFunction( object, material, scene, camera, lightsNode, group, 'backSide' ); // create backSide pass id
|
|
1231
1339
|
|
|
1232
1340
|
material.side = FrontSide;
|
|
1233
|
-
this._handleObjectFunction( object, material, scene, camera, lightsNode ); // use default pass id
|
|
1341
|
+
this._handleObjectFunction( object, material, scene, camera, lightsNode, group ); // use default pass id
|
|
1234
1342
|
|
|
1235
1343
|
material.side = DoubleSide;
|
|
1236
1344
|
|
|
1237
1345
|
} else {
|
|
1238
1346
|
|
|
1239
|
-
this._handleObjectFunction( object, material, scene, camera, lightsNode );
|
|
1347
|
+
this._handleObjectFunction( object, material, scene, camera, lightsNode, group );
|
|
1240
1348
|
|
|
1241
1349
|
}
|
|
1242
1350
|
|
|
@@ -1248,6 +1356,12 @@ class Renderer {
|
|
|
1248
1356
|
|
|
1249
1357
|
}
|
|
1250
1358
|
|
|
1359
|
+
if ( overrideDepthNode !== undefined ) {
|
|
1360
|
+
|
|
1361
|
+
scene.overrideMaterial.depthNode = overrideDepthNode;
|
|
1362
|
+
|
|
1363
|
+
}
|
|
1364
|
+
|
|
1251
1365
|
if ( overrideFragmentNode !== undefined ) {
|
|
1252
1366
|
|
|
1253
1367
|
scene.overrideMaterial.fragmentNode = overrideFragmentNode;
|
|
@@ -1260,9 +1374,10 @@ class Renderer {
|
|
|
1260
1374
|
|
|
1261
1375
|
}
|
|
1262
1376
|
|
|
1263
|
-
_renderObjectDirect( object, material, scene, camera, lightsNode, passId ) {
|
|
1377
|
+
_renderObjectDirect( object, material, scene, camera, lightsNode, group, passId ) {
|
|
1264
1378
|
|
|
1265
1379
|
const renderObject = this._objects.get( object, material, scene, camera, lightsNode, this._currentRenderContext, passId );
|
|
1380
|
+
renderObject.drawRange = group || object.geometry.drawRange;
|
|
1266
1381
|
|
|
1267
1382
|
//
|
|
1268
1383
|
|
|
@@ -38,7 +38,7 @@ class Textures extends DataMap {
|
|
|
38
38
|
|
|
39
39
|
depthTexture = new DepthTexture();
|
|
40
40
|
depthTexture.format = renderTarget.stencilBuffer ? DepthStencilFormat : DepthFormat;
|
|
41
|
-
depthTexture.type = renderTarget.stencilBuffer ? UnsignedInt248Type : UnsignedIntType;
|
|
41
|
+
depthTexture.type = renderTarget.stencilBuffer ? UnsignedInt248Type : UnsignedIntType; // FloatType
|
|
42
42
|
depthTexture.image.width = mipWidth;
|
|
43
43
|
depthTexture.image.height = mipHeight;
|
|
44
44
|
|
|
@@ -20,7 +20,6 @@ import {
|
|
|
20
20
|
CubeRefractionMapping,
|
|
21
21
|
CubeUVReflectionMapping,
|
|
22
22
|
LinearFilter,
|
|
23
|
-
NoToneMapping,
|
|
24
23
|
NoBlending,
|
|
25
24
|
RGBAFormat,
|
|
26
25
|
HalfFloatType,
|
|
@@ -57,16 +56,16 @@ const INV_PHI = 1 / PHI;
|
|
|
57
56
|
// Vertices of a dodecahedron (except the opposites, which represent the
|
|
58
57
|
// same axis), used as axis directions evenly spread on a sphere.
|
|
59
58
|
const _axisDirections = [
|
|
60
|
-
/*@__PURE__*/ new Vector3(
|
|
61
|
-
/*@__PURE__*/ new Vector3( - 1, 1, 1 ),
|
|
62
|
-
/*@__PURE__*/ new Vector3( 1, 1, - 1 ),
|
|
63
|
-
/*@__PURE__*/ new Vector3( - 1, 1, - 1 ),
|
|
64
|
-
/*@__PURE__*/ new Vector3( 0, PHI, INV_PHI ),
|
|
65
|
-
/*@__PURE__*/ new Vector3( 0, PHI, - INV_PHI ),
|
|
66
|
-
/*@__PURE__*/ new Vector3( INV_PHI, 0, PHI ),
|
|
67
|
-
/*@__PURE__*/ new Vector3( - INV_PHI, 0, PHI ),
|
|
59
|
+
/*@__PURE__*/ new Vector3( - PHI, INV_PHI, 0 ),
|
|
68
60
|
/*@__PURE__*/ new Vector3( PHI, INV_PHI, 0 ),
|
|
69
|
-
/*@__PURE__*/ new Vector3( -
|
|
61
|
+
/*@__PURE__*/ new Vector3( - INV_PHI, 0, PHI ),
|
|
62
|
+
/*@__PURE__*/ new Vector3( INV_PHI, 0, PHI ),
|
|
63
|
+
/*@__PURE__*/ new Vector3( 0, PHI, - INV_PHI ),
|
|
64
|
+
/*@__PURE__*/ new Vector3( 0, PHI, INV_PHI ),
|
|
65
|
+
/*@__PURE__*/ new Vector3( - 1, 1, - 1 ),
|
|
66
|
+
/*@__PURE__*/ new Vector3( 1, 1, - 1 ),
|
|
67
|
+
/*@__PURE__*/ new Vector3( - 1, 1, 1 ),
|
|
68
|
+
/*@__PURE__*/ new Vector3( 1, 1, 1 )
|
|
70
69
|
];
|
|
71
70
|
|
|
72
71
|
//
|
|
@@ -338,10 +337,9 @@ class PMREMGenerator {
|
|
|
338
337
|
const renderer = this._renderer;
|
|
339
338
|
|
|
340
339
|
const originalAutoClear = renderer.autoClear;
|
|
341
|
-
|
|
340
|
+
|
|
342
341
|
renderer.getClearColor( _clearColor );
|
|
343
342
|
|
|
344
|
-
renderer.toneMapping = NoToneMapping;
|
|
345
343
|
renderer.autoClear = false;
|
|
346
344
|
|
|
347
345
|
let backgroundBox = this._backgroundBox;
|
|
@@ -418,7 +416,6 @@ class PMREMGenerator {
|
|
|
418
416
|
|
|
419
417
|
}
|
|
420
418
|
|
|
421
|
-
renderer.toneMapping = toneMapping;
|
|
422
419
|
renderer.autoClear = originalAutoClear;
|
|
423
420
|
scene.background = background;
|
|
424
421
|
|
|
@@ -468,12 +465,13 @@ class PMREMGenerator {
|
|
|
468
465
|
const renderer = this._renderer;
|
|
469
466
|
const autoClear = renderer.autoClear;
|
|
470
467
|
renderer.autoClear = false;
|
|
468
|
+
const n = this._lodPlanes.length;
|
|
471
469
|
|
|
472
|
-
for ( let i = 1; i <
|
|
470
|
+
for ( let i = 1; i < n; i ++ ) {
|
|
473
471
|
|
|
474
472
|
const sigma = Math.sqrt( this._sigmas[ i ] * this._sigmas[ i ] - this._sigmas[ i - 1 ] * this._sigmas[ i - 1 ] );
|
|
475
473
|
|
|
476
|
-
const poleAxis = _axisDirections[ ( i - 1 ) % _axisDirections.length ];
|
|
474
|
+
const poleAxis = _axisDirections[ ( n - i - 1 ) % _axisDirections.length ];
|
|
477
475
|
|
|
478
476
|
this._blur( cubeUVRenderTarget, i - 1, i, sigma, poleAxis );
|
|
479
477
|
|
|
@@ -709,8 +707,6 @@ function _setViewport( target, x, y, width, height ) {
|
|
|
709
707
|
function _getMaterial() {
|
|
710
708
|
|
|
711
709
|
const material = new NodeMaterial();
|
|
712
|
-
material.colorSpaced = false;
|
|
713
|
-
material.toneMapped = false;
|
|
714
710
|
material.depthTest = false;
|
|
715
711
|
material.depthWrite = false;
|
|
716
712
|
material.blending = NoBlending;
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import DataMap from '../DataMap.js';
|
|
2
2
|
import ChainMap from '../ChainMap.js';
|
|
3
3
|
import NodeBuilderState from './NodeBuilderState.js';
|
|
4
|
-
import {
|
|
5
|
-
import { NodeFrame, objectGroup, renderGroup, frameGroup, cubeTexture, texture, rangeFog, densityFog, reference,
|
|
4
|
+
import { EquirectangularReflectionMapping, EquirectangularRefractionMapping, NoToneMapping, SRGBColorSpace } from 'three';
|
|
5
|
+
import { NodeFrame, vec4, objectGroup, renderGroup, frameGroup, cubeTexture, texture, rangeFog, densityFog, reference, viewportBottomLeft, normalWorld, pmremTexture, viewportTopLeft } from '../../../nodes/Nodes.js';
|
|
6
6
|
|
|
7
7
|
class Nodes extends DataMap {
|
|
8
8
|
|
|
@@ -113,7 +113,6 @@ class Nodes extends DataMap {
|
|
|
113
113
|
nodeBuilder.lightsNode = renderObject.lightsNode;
|
|
114
114
|
nodeBuilder.environmentNode = this.getEnvironmentNode( renderObject.scene );
|
|
115
115
|
nodeBuilder.fogNode = this.getFogNode( renderObject.scene );
|
|
116
|
-
nodeBuilder.toneMappingNode = this.getToneMappingNode();
|
|
117
116
|
nodeBuilder.clippingContext = renderObject.clippingContext;
|
|
118
117
|
nodeBuilder.build();
|
|
119
118
|
|
|
@@ -206,14 +205,6 @@ class Nodes extends DataMap {
|
|
|
206
205
|
|
|
207
206
|
}
|
|
208
207
|
|
|
209
|
-
getToneMappingNode() {
|
|
210
|
-
|
|
211
|
-
if ( this.isToneMappingState === false ) return null;
|
|
212
|
-
|
|
213
|
-
return this.renderer.toneMappingNode || this.get( this.renderer ).toneMappingNode || null;
|
|
214
|
-
|
|
215
|
-
}
|
|
216
|
-
|
|
217
208
|
getCacheKey( scene, lightsNode ) {
|
|
218
209
|
|
|
219
210
|
const chain = [ scene, lightsNode ];
|
|
@@ -225,14 +216,12 @@ class Nodes extends DataMap {
|
|
|
225
216
|
|
|
226
217
|
const environmentNode = this.getEnvironmentNode( scene );
|
|
227
218
|
const fogNode = this.getFogNode( scene );
|
|
228
|
-
const toneMappingNode = this.getToneMappingNode();
|
|
229
219
|
|
|
230
220
|
const cacheKey = [];
|
|
231
221
|
|
|
232
222
|
if ( lightsNode ) cacheKey.push( lightsNode.getCacheKey() );
|
|
233
223
|
if ( environmentNode ) cacheKey.push( environmentNode.getCacheKey() );
|
|
234
224
|
if ( fogNode ) cacheKey.push( fogNode.getCacheKey() );
|
|
235
|
-
if ( toneMappingNode ) cacheKey.push( toneMappingNode.getCacheKey() );
|
|
236
225
|
|
|
237
226
|
cacheKeyData = {
|
|
238
227
|
callId,
|
|
@@ -252,45 +241,12 @@ class Nodes extends DataMap {
|
|
|
252
241
|
this.updateEnvironment( scene );
|
|
253
242
|
this.updateFog( scene );
|
|
254
243
|
this.updateBackground( scene );
|
|
255
|
-
this.updateToneMapping();
|
|
256
244
|
|
|
257
245
|
}
|
|
258
246
|
|
|
259
247
|
get isToneMappingState() {
|
|
260
248
|
|
|
261
|
-
|
|
262
|
-
const renderTarget = renderer.getRenderTarget();
|
|
263
|
-
|
|
264
|
-
return renderTarget && renderTarget.isCubeRenderTarget ? false : true;
|
|
265
|
-
|
|
266
|
-
}
|
|
267
|
-
|
|
268
|
-
updateToneMapping() {
|
|
269
|
-
|
|
270
|
-
const renderer = this.renderer;
|
|
271
|
-
const rendererData = this.get( renderer );
|
|
272
|
-
const rendererToneMapping = renderer.toneMapping;
|
|
273
|
-
|
|
274
|
-
if ( this.isToneMappingState && rendererToneMapping !== NoToneMapping ) {
|
|
275
|
-
|
|
276
|
-
if ( rendererData.toneMapping !== rendererToneMapping ) {
|
|
277
|
-
|
|
278
|
-
const rendererToneMappingNode = rendererData.rendererToneMappingNode || toneMapping( rendererToneMapping );
|
|
279
|
-
rendererToneMappingNode.toneMapping = rendererToneMapping;
|
|
280
|
-
|
|
281
|
-
rendererData.rendererToneMappingNode = rendererToneMappingNode;
|
|
282
|
-
rendererData.toneMappingNode = rendererToneMappingNode;
|
|
283
|
-
rendererData.toneMapping = rendererToneMapping;
|
|
284
|
-
|
|
285
|
-
}
|
|
286
|
-
|
|
287
|
-
} else {
|
|
288
|
-
|
|
289
|
-
// Don't delete rendererData.rendererToneMappingNode
|
|
290
|
-
delete rendererData.toneMappingNode;
|
|
291
|
-
delete rendererData.toneMapping;
|
|
292
|
-
|
|
293
|
-
}
|
|
249
|
+
return this.renderer.getRenderTarget() ? false : true;
|
|
294
250
|
|
|
295
251
|
}
|
|
296
252
|
|
|
@@ -430,6 +386,34 @@ class Nodes extends DataMap {
|
|
|
430
386
|
|
|
431
387
|
}
|
|
432
388
|
|
|
389
|
+
getOutputNode( outputTexture ) {
|
|
390
|
+
|
|
391
|
+
let output = texture( outputTexture, viewportTopLeft );
|
|
392
|
+
|
|
393
|
+
if ( this.isToneMappingState ) {
|
|
394
|
+
|
|
395
|
+
if ( this.renderer.toneMappingNode ) {
|
|
396
|
+
|
|
397
|
+
output = vec4( this.renderer.toneMappingNode.context( { color: output.rgb } ), output.a );
|
|
398
|
+
|
|
399
|
+
} else if ( this.renderer.toneMapping !== NoToneMapping ) {
|
|
400
|
+
|
|
401
|
+
output = output.toneMapping( this.renderer.toneMapping );
|
|
402
|
+
|
|
403
|
+
}
|
|
404
|
+
|
|
405
|
+
}
|
|
406
|
+
|
|
407
|
+
if ( this.renderer.currentColorSpace === SRGBColorSpace ) {
|
|
408
|
+
|
|
409
|
+
output = output.linearToColorSpace( this.renderer.currentColorSpace );
|
|
410
|
+
|
|
411
|
+
}
|
|
412
|
+
|
|
413
|
+
return output;
|
|
414
|
+
|
|
415
|
+
}
|
|
416
|
+
|
|
433
417
|
updateBefore( renderObject ) {
|
|
434
418
|
|
|
435
419
|
const nodeFrame = this.getNodeFrameForRender( renderObject );
|
|
@@ -173,6 +173,7 @@ class WebGLBackend extends Backend {
|
|
|
173
173
|
//
|
|
174
174
|
|
|
175
175
|
//
|
|
176
|
+
|
|
176
177
|
this.initTimestampQuery( renderContext );
|
|
177
178
|
|
|
178
179
|
renderContextData.previousContext = this._currentContext;
|
|
@@ -568,7 +569,7 @@ class WebGLBackend extends Backend {
|
|
|
568
569
|
|
|
569
570
|
draw( renderObject, info ) {
|
|
570
571
|
|
|
571
|
-
const { pipeline, material, context } = renderObject;
|
|
572
|
+
const { object, pipeline, material, context } = renderObject;
|
|
572
573
|
const { programGPU } = this.get( pipeline );
|
|
573
574
|
|
|
574
575
|
const { gl, state } = this;
|
|
@@ -579,7 +580,9 @@ class WebGLBackend extends Backend {
|
|
|
579
580
|
|
|
580
581
|
this._bindUniforms( renderObject.getBindings() );
|
|
581
582
|
|
|
582
|
-
|
|
583
|
+
const frontFaceCW = ( object.isMesh && object.matrixWorld.determinant() < 0 );
|
|
584
|
+
|
|
585
|
+
state.setMaterial( material, frontFaceCW );
|
|
583
586
|
|
|
584
587
|
gl.useProgram( programGPU );
|
|
585
588
|
|
|
@@ -611,9 +614,8 @@ class WebGLBackend extends Backend {
|
|
|
611
614
|
|
|
612
615
|
const index = renderObject.getIndex();
|
|
613
616
|
|
|
614
|
-
const object = renderObject.object;
|
|
615
617
|
const geometry = renderObject.geometry;
|
|
616
|
-
const drawRange =
|
|
618
|
+
const drawRange = renderObject.drawRange;
|
|
617
619
|
const firstVertex = drawRange.start;
|
|
618
620
|
|
|
619
621
|
//
|
|
@@ -699,16 +701,7 @@ class WebGLBackend extends Backend {
|
|
|
699
701
|
|
|
700
702
|
if ( object.isBatchedMesh ) {
|
|
701
703
|
|
|
702
|
-
if (
|
|
703
|
-
|
|
704
|
-
// TODO: Better support with InstancedBatchedMesh
|
|
705
|
-
if ( object._multiDrawInstances === undefined ) {
|
|
706
|
-
|
|
707
|
-
object._multiDrawInstances = new Int32Array( object._maxGeometryCount );
|
|
708
|
-
|
|
709
|
-
}
|
|
710
|
-
|
|
711
|
-
object._multiDrawInstances.fill( instanceCount );
|
|
704
|
+
if ( object._multiDrawInstances !== null ) {
|
|
712
705
|
|
|
713
706
|
renderer.renderMultiDrawInstances( object._multiDrawStarts, object._multiDrawCounts, object._multiDrawCount, object._multiDrawInstances );
|
|
714
707
|
|
|
@@ -1115,12 +1108,6 @@ class WebGLBackend extends Backend {
|
|
|
1115
1108
|
|
|
1116
1109
|
}
|
|
1117
1110
|
|
|
1118
|
-
async hasFeatureAsync( name ) {
|
|
1119
|
-
|
|
1120
|
-
return this.hasFeature( name );
|
|
1121
|
-
|
|
1122
|
-
}
|
|
1123
|
-
|
|
1124
1111
|
hasFeature( name ) {
|
|
1125
1112
|
|
|
1126
1113
|
const keysMatching = Object.keys( GLFeatureName ).filter( key => GLFeatureName[ key ] === name );
|
|
@@ -1129,7 +1116,6 @@ class WebGLBackend extends Backend {
|
|
|
1129
1116
|
|
|
1130
1117
|
for ( let i = 0; i < keysMatching.length; i ++ ) {
|
|
1131
1118
|
|
|
1132
|
-
|
|
1133
1119
|
if ( extensions.has( keysMatching[ i ] ) ) return true;
|
|
1134
1120
|
|
|
1135
1121
|
}
|
|
@@ -246,6 +246,12 @@ ${ flowData.code }
|
|
|
246
246
|
|
|
247
247
|
}
|
|
248
248
|
|
|
249
|
+
generateTextureGrad( texture, textureProperty, uvSnippet, gradSnippet ) {
|
|
250
|
+
|
|
251
|
+
return `textureGrad( ${ textureProperty }, ${ uvSnippet }, ${ gradSnippet[ 0 ] }, ${ gradSnippet[ 1 ] } )`;
|
|
252
|
+
|
|
253
|
+
}
|
|
254
|
+
|
|
249
255
|
generateTextureCompare( texture, textureProperty, uvSnippet, compareSnippet, depthSnippet, shaderStage = this.shaderStage ) {
|
|
250
256
|
|
|
251
257
|
if ( shaderStage === 'fragment' ) {
|
|
@@ -576,20 +576,35 @@ class WebGLTextureUtils {
|
|
|
576
576
|
const width = texture.image.width;
|
|
577
577
|
const height = texture.image.height;
|
|
578
578
|
|
|
579
|
-
|
|
579
|
+
const requireDrawFrameBuffer = texture.isDepthTexture === true || ( renderContext.renderTarget && renderContext.renderTarget.samples > 0 );
|
|
580
580
|
|
|
581
|
-
|
|
581
|
+
if ( requireDrawFrameBuffer ) {
|
|
582
582
|
|
|
583
|
-
|
|
583
|
+
let mask;
|
|
584
|
+
let attachment;
|
|
584
585
|
|
|
585
|
-
|
|
586
|
+
if ( texture.isDepthTexture === true ) {
|
|
587
|
+
|
|
588
|
+
mask = gl.DEPTH_BUFFER_BIT;
|
|
589
|
+
attachment = gl.DEPTH_ATTACHMENT;
|
|
590
|
+
|
|
591
|
+
if ( renderContext.stencil ) {
|
|
592
|
+
|
|
593
|
+
mask |= gl.STENCIL_BUFFER_BIT;
|
|
594
|
+
|
|
595
|
+
}
|
|
596
|
+
|
|
597
|
+
} else {
|
|
598
|
+
|
|
599
|
+
mask = gl.COLOR_BUFFER_BIT;
|
|
600
|
+
attachment = gl.COLOR_ATTACHMENT0;
|
|
586
601
|
|
|
587
602
|
}
|
|
588
603
|
|
|
589
604
|
const fb = gl.createFramebuffer();
|
|
590
605
|
state.bindFramebuffer( gl.DRAW_FRAMEBUFFER, fb );
|
|
591
606
|
|
|
592
|
-
gl.framebufferTexture2D( gl.DRAW_FRAMEBUFFER,
|
|
607
|
+
gl.framebufferTexture2D( gl.DRAW_FRAMEBUFFER, attachment, gl.TEXTURE_2D, textureGPU, 0 );
|
|
593
608
|
|
|
594
609
|
gl.blitFramebuffer( 0, 0, width, height, 0, 0, width, height, mask, gl.NEAREST );
|
|
595
610
|
|
|
@@ -626,7 +641,6 @@ class WebGLTextureUtils {
|
|
|
626
641
|
|
|
627
642
|
if ( samples > 0 ) {
|
|
628
643
|
|
|
629
|
-
|
|
630
644
|
if ( depthTexture && depthTexture.isDepthTexture ) {
|
|
631
645
|
|
|
632
646
|
if ( depthTexture.type === gl.FLOAT ) {
|
|
@@ -692,7 +706,7 @@ class WebGLTextureUtils {
|
|
|
692
706
|
|
|
693
707
|
await backend.utils._clientWaitAsync();
|
|
694
708
|
|
|
695
|
-
const dstBuffer = new typedArrayType(
|
|
709
|
+
const dstBuffer = new typedArrayType( byteLength / typedArrayType.BYTES_PER_ELEMENT );
|
|
696
710
|
|
|
697
711
|
gl.bindBuffer( gl.PIXEL_PACK_BUFFER, buffer );
|
|
698
712
|
gl.getBufferSubData( gl.PIXEL_PACK_BUFFER, 0, dstBuffer );
|
|
@@ -114,33 +114,15 @@ class WebGLUtils {
|
|
|
114
114
|
|
|
115
115
|
}
|
|
116
116
|
|
|
117
|
-
//
|
|
117
|
+
// ETC
|
|
118
118
|
|
|
119
|
-
if ( p === RGB_ETC1_Format ) {
|
|
120
|
-
|
|
121
|
-
extension = extensions.get( 'WEBGL_compressed_texture_etc1' );
|
|
122
|
-
|
|
123
|
-
if ( extension !== null ) {
|
|
124
|
-
|
|
125
|
-
return extension.COMPRESSED_RGB_ETC1_WEBGL;
|
|
126
|
-
|
|
127
|
-
} else {
|
|
128
|
-
|
|
129
|
-
return null;
|
|
130
|
-
|
|
131
|
-
}
|
|
132
|
-
|
|
133
|
-
}
|
|
134
|
-
|
|
135
|
-
// ETC2
|
|
136
|
-
|
|
137
|
-
if ( p === RGB_ETC2_Format || p === RGBA_ETC2_EAC_Format ) {
|
|
119
|
+
if ( p === RGB_ETC1_Format || p === RGB_ETC2_Format || p === RGBA_ETC2_EAC_Format ) {
|
|
138
120
|
|
|
139
121
|
extension = extensions.get( 'WEBGL_compressed_texture_etc' );
|
|
140
122
|
|
|
141
123
|
if ( extension !== null ) {
|
|
142
124
|
|
|
143
|
-
if ( p === RGB_ETC2_Format ) return ( colorSpace === SRGBColorSpace ) ? extension.COMPRESSED_SRGB8_ETC2 : extension.COMPRESSED_RGB8_ETC2;
|
|
125
|
+
if ( p === RGB_ETC1_Format || p === RGB_ETC2_Format ) return ( colorSpace === SRGBColorSpace ) ? extension.COMPRESSED_SRGB8_ETC2 : extension.COMPRESSED_RGB8_ETC2;
|
|
144
126
|
if ( p === RGBA_ETC2_EAC_Format ) return ( colorSpace === SRGBColorSpace ) ? extension.COMPRESSED_SRGB8_ALPHA8_ETC2_EAC : extension.COMPRESSED_RGBA8_ETC2_EAC;
|
|
145
127
|
|
|
146
128
|
} else {
|