super-three 0.170.0 → 0.171.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 +24410 -24422
- package/build/three.core.js +37002 -0
- package/build/three.core.min.js +6 -0
- package/build/three.module.js +10573 -47578
- package/build/three.module.min.js +1 -1
- package/build/three.tsl.js +533 -0
- package/build/three.tsl.min.js +6 -0
- package/build/three.webgpu.js +2907 -37975
- package/build/three.webgpu.min.js +1 -1
- package/build/three.webgpu.nodes.js +2914 -37959
- package/build/three.webgpu.nodes.min.js +1 -1
- package/examples/jsm/capabilities/WebGPU.js +1 -10
- package/examples/jsm/controls/ArcballControls.js +25 -21
- package/examples/jsm/controls/OrbitControls.js +41 -9
- package/examples/jsm/controls/PointerLockControls.js +2 -5
- package/examples/jsm/csm/CSMShadowNode.js +7 -5
- package/examples/jsm/geometries/DecalGeometry.js +5 -1
- package/examples/jsm/lighting/TiledLighting.js +1 -1
- package/examples/jsm/lines/LineGeometry.js +25 -0
- package/examples/jsm/lines/LineMaterial.js +1 -7
- package/examples/jsm/lines/webgpu/Line2.js +2 -1
- package/examples/jsm/lines/webgpu/LineSegments2.js +2 -1
- package/examples/jsm/lines/webgpu/Wireframe.js +2 -1
- package/examples/jsm/loaders/KTX2Loader.js +3 -0
- package/examples/jsm/loaders/MMDLoader.js +2 -6
- package/examples/jsm/loaders/MaterialXLoader.js +2 -2
- package/examples/jsm/materials/MeshGouraudMaterial.js +2 -6
- package/examples/jsm/misc/ProgressiveLightMapGPU.js +2 -2
- package/examples/jsm/objects/InstancedPoints.js +2 -4
- package/examples/jsm/objects/LensflareMesh.js +4 -2
- package/examples/jsm/objects/SkyMesh.js +5 -3
- package/examples/jsm/objects/Water2Mesh.js +7 -3
- package/examples/jsm/objects/WaterMesh.js +5 -3
- package/examples/jsm/transpiler/AST.js +2 -2
- package/examples/jsm/transpiler/GLSLDecoder.js +57 -25
- package/examples/jsm/transpiler/TSLEncoder.js +11 -6
- package/examples/jsm/tsl/display/AfterImageNode.js +3 -3
- package/examples/jsm/tsl/display/AnaglyphPassNode.js +2 -2
- package/examples/jsm/tsl/display/AnamorphicNode.js +2 -2
- package/examples/jsm/tsl/display/BloomNode.js +3 -3
- package/examples/jsm/tsl/display/DenoiseNode.js +48 -12
- package/examples/jsm/tsl/display/DepthOfFieldNode.js +3 -2
- package/examples/jsm/tsl/display/DotScreenNode.js +2 -2
- package/examples/jsm/tsl/display/FXAANode.js +3 -3
- package/examples/jsm/tsl/display/FilmNode.js +3 -2
- package/examples/jsm/tsl/display/GTAONode.js +62 -27
- package/examples/jsm/tsl/display/GaussianBlurNode.js +6 -8
- package/examples/jsm/tsl/display/LensflareNode.js +3 -3
- package/examples/jsm/tsl/display/Lut3DNode.js +3 -2
- package/examples/jsm/tsl/display/OutlineNode.js +2 -2
- package/examples/jsm/tsl/display/ParallaxBarrierPassNode.js +2 -1
- package/examples/jsm/tsl/display/PixelationPassNode.js +4 -4
- package/examples/jsm/tsl/display/RGBShiftNode.js +2 -1
- package/examples/jsm/tsl/display/SMAANode.js +3 -3
- package/examples/jsm/tsl/display/SSAAPassNode.js +2 -2
- package/examples/jsm/tsl/display/SSRNode.js +31 -8
- package/examples/jsm/tsl/display/SobelOperatorNode.js +3 -3
- package/examples/jsm/tsl/display/StereoCompositePassNode.js +4 -4
- package/examples/jsm/tsl/display/StereoPassNode.js +2 -2
- package/examples/jsm/tsl/display/TRAAPassNode.js +2 -2
- package/examples/jsm/tsl/display/TransitionNode.js +3 -2
- package/examples/jsm/tsl/lighting/TiledLightsNode.js +6 -9
- package/examples/jsm/utils/SceneOptimizer.js +410 -0
- package/examples/jsm/utils/UVsDebug.js +1 -1
- package/package.json +3 -3
- package/src/Three.Core.js +178 -0
- package/src/Three.TSL.js +526 -0
- package/src/Three.WebGPU.Nodes.js +5 -186
- package/src/Three.WebGPU.js +4 -186
- package/src/Three.js +1 -177
- package/src/animation/AnimationClip.js +2 -2
- package/src/animation/AnimationObjectGroup.js +2 -2
- package/src/audio/Audio.js +38 -0
- package/src/cameras/PerspectiveCamera.js +6 -6
- package/src/cameras/StereoCamera.js +2 -2
- package/src/constants.js +1 -1
- package/src/core/BufferGeometry.js +5 -3
- package/src/core/InterleavedBuffer.js +4 -4
- package/src/core/Object3D.js +2 -2
- package/src/extras/core/Curve.js +3 -3
- package/src/extras/core/Shape.js +2 -2
- package/src/geometries/EdgesGeometry.js +2 -2
- package/src/geometries/LatheGeometry.js +2 -2
- package/src/lights/SpotLightShadow.js +2 -2
- package/src/materials/LineBasicMaterial.js +2 -6
- package/src/materials/LineDashedMaterial.js +1 -6
- package/src/materials/Material.js +3 -16
- package/src/materials/MeshBasicMaterial.js +2 -6
- package/src/materials/MeshDepthMaterial.js +2 -6
- package/src/materials/MeshDistanceMaterial.js +2 -6
- package/src/materials/MeshLambertMaterial.js +2 -6
- package/src/materials/MeshMatcapMaterial.js +2 -6
- package/src/materials/MeshNormalMaterial.js +2 -6
- package/src/materials/MeshPhongMaterial.js +3 -7
- package/src/materials/MeshPhysicalMaterial.js +4 -8
- package/src/materials/MeshStandardMaterial.js +2 -6
- package/src/materials/MeshToonMaterial.js +2 -6
- package/src/materials/PointsMaterial.js +2 -6
- package/src/materials/RawShaderMaterial.js +2 -6
- package/src/materials/ShaderMaterial.js +2 -6
- package/src/materials/ShadowMaterial.js +2 -6
- package/src/materials/SpriteMaterial.js +2 -6
- package/src/materials/nodes/Line2NodeMaterial.js +32 -13
- package/src/materials/nodes/LineDashedNodeMaterial.js +4 -2
- package/src/materials/nodes/NodeMaterial.js +64 -16
- package/src/materials/nodes/manager/NodeMaterialObserver.js +13 -10
- package/src/math/ColorManagement.js +130 -122
- package/src/math/Line3.js +2 -2
- package/src/math/Quaternion.js +2 -2
- package/src/math/Spherical.js +3 -3
- package/src/math/Vector2.js +7 -7
- package/src/math/Vector3.js +9 -9
- package/src/math/Vector4.js +11 -9
- package/src/nodes/Nodes.js +1 -0
- package/src/nodes/TSL.js +3 -1
- package/src/nodes/accessors/Arrays.js +27 -0
- package/src/nodes/accessors/BuiltinNode.js +26 -0
- package/src/nodes/accessors/ClippingNode.js +76 -42
- package/src/nodes/accessors/InstanceNode.js +17 -20
- package/src/nodes/accessors/InstancedMeshNode.js +26 -0
- package/src/nodes/accessors/Lights.js +32 -0
- package/src/nodes/accessors/StorageBufferNode.js +29 -9
- package/src/nodes/accessors/StorageTextureNode.js +10 -4
- package/src/nodes/accessors/TextureNode.js +1 -1
- package/src/nodes/core/NodeBuilder.js +2 -9
- package/src/nodes/core/NodeUtils.js +28 -0
- package/src/nodes/core/constants.js +6 -0
- package/src/nodes/display/BlendModes.js +99 -0
- package/src/nodes/display/ToonOutlinePassNode.js +3 -3
- package/src/nodes/display/ViewportDepthNode.js +21 -6
- package/src/nodes/functions/material/getAlphaHashThreshold.js +13 -7
- package/src/nodes/functions/material/getParallaxCorrectNormal.js +1 -1
- package/src/nodes/lighting/AnalyticLightNode.js +12 -4
- package/src/nodes/lighting/PointLightNode.js +10 -1
- package/src/nodes/lighting/PointShadowNode.js +254 -0
- package/src/nodes/lighting/ShadowNode.js +176 -67
- package/src/nodes/lighting/SpotLightNode.js +14 -2
- package/src/nodes/utils/RTTNode.js +9 -1
- package/src/nodes/utils/StorageArrayElementNode.js +2 -2
- package/src/objects/BatchedMesh.js +54 -95
- package/src/objects/ClippingGroup.js +19 -0
- package/src/objects/Skeleton.js +2 -2
- package/src/renderers/WebGLRenderer.js +94 -23
- package/src/renderers/common/Animation.js +23 -11
- package/src/renderers/common/Background.js +1 -1
- package/src/renderers/common/Bindings.js +20 -4
- package/src/renderers/common/ClippingContext.js +77 -85
- package/src/renderers/common/RenderList.js +9 -6
- package/src/renderers/common/RenderObject.js +27 -27
- package/src/renderers/common/RenderObjects.js +12 -6
- package/src/renderers/common/Renderer.js +63 -57
- package/src/renderers/common/Textures.js +11 -3
- package/src/renderers/common/UniformsGroup.js +16 -4
- package/src/renderers/common/extras/PMREMGenerator.js +89 -13
- package/src/renderers/common/nodes/NodeLibrary.js +2 -2
- package/src/renderers/common/nodes/NodeStorageBuffer.js +2 -3
- package/src/renderers/common/nodes/NodeUniform.js +42 -0
- package/src/renderers/webgl/WebGLBackground.js +20 -1
- package/src/renderers/webgl/WebGLGeometries.js +0 -28
- package/src/renderers/webgl-fallback/WebGLBackend.js +13 -6
- package/src/renderers/webgl-fallback/nodes/GLSLNodeBuilder.js +43 -12
- package/src/renderers/webgl-fallback/utils/WebGLState.js +26 -1
- package/src/renderers/webgl-fallback/utils/WebGLTextureUtils.js +4 -1
- package/src/renderers/webgpu/WebGPUBackend.js +47 -31
- package/src/renderers/webgpu/nodes/StandardNodeLibrary.js +13 -26
- package/src/renderers/webgpu/nodes/WGSLNodeBuilder.js +184 -74
- package/src/renderers/webgpu/utils/WebGPUAttributeUtils.js +15 -2
- package/src/renderers/webgpu/utils/WebGPUBindingUtils.js +72 -7
- package/src/renderers/webgpu/utils/WebGPUTextureUtils.js +5 -1
- package/src/textures/Source.js +2 -2
- package/src/textures/Texture.js +2 -2
- package/src/nodes/display/BlendMode.js +0 -54
|
@@ -78,8 +78,6 @@ class Renderer {
|
|
|
78
78
|
this.depth = depth;
|
|
79
79
|
this.stencil = stencil;
|
|
80
80
|
|
|
81
|
-
this.clippingPlanes = [];
|
|
82
|
-
|
|
83
81
|
this.info = new Info();
|
|
84
82
|
|
|
85
83
|
this.nodes = {
|
|
@@ -175,7 +173,7 @@ class Renderer {
|
|
|
175
173
|
|
|
176
174
|
const material = scene.overrideMaterial || object.material;
|
|
177
175
|
|
|
178
|
-
const renderObject = this._objects.get( object, material, scene, camera, renderList.lightsNode, renderContext );
|
|
176
|
+
const renderObject = this._objects.get( object, material, scene, camera, renderList.lightsNode, renderContext, renderContext.clippingContext );
|
|
179
177
|
|
|
180
178
|
const { fragmentShader, vertexShader } = renderObject.getNodeBuilderState();
|
|
181
179
|
|
|
@@ -250,6 +248,7 @@ class Renderer {
|
|
|
250
248
|
|
|
251
249
|
//
|
|
252
250
|
|
|
251
|
+
this._animation.start();
|
|
253
252
|
this._initialized = true;
|
|
254
253
|
|
|
255
254
|
resolve();
|
|
@@ -312,7 +311,7 @@ class Renderer {
|
|
|
312
311
|
renderContext.stencil = this.stencil;
|
|
313
312
|
|
|
314
313
|
if ( ! renderContext.clippingContext ) renderContext.clippingContext = new ClippingContext();
|
|
315
|
-
renderContext.clippingContext.updateGlobal(
|
|
314
|
+
renderContext.clippingContext.updateGlobal( sceneRef, camera );
|
|
316
315
|
|
|
317
316
|
//
|
|
318
317
|
|
|
@@ -323,7 +322,7 @@ class Renderer {
|
|
|
323
322
|
const renderList = this._renderLists.get( scene, camera );
|
|
324
323
|
renderList.begin();
|
|
325
324
|
|
|
326
|
-
this._projectObject( scene, camera, 0, renderList );
|
|
325
|
+
this._projectObject( scene, camera, 0, renderList, renderContext.clippingContext );
|
|
327
326
|
|
|
328
327
|
// include lights from target scene
|
|
329
328
|
if ( targetScene !== scene ) {
|
|
@@ -372,10 +371,11 @@ class Renderer {
|
|
|
372
371
|
|
|
373
372
|
const opaqueObjects = renderList.opaque;
|
|
374
373
|
const transparentObjects = renderList.transparent;
|
|
374
|
+
const transparentDoublePassObjects = renderList.transparentDoublePass;
|
|
375
375
|
const lightsNode = renderList.lightsNode;
|
|
376
376
|
|
|
377
377
|
if ( this.opaque === true && opaqueObjects.length > 0 ) this._renderObjects( opaqueObjects, camera, sceneRef, lightsNode );
|
|
378
|
-
if ( this.transparent === true && transparentObjects.length > 0 ) this._renderTransparents( transparentObjects, camera, sceneRef, lightsNode );
|
|
378
|
+
if ( this.transparent === true && transparentObjects.length > 0 ) this._renderTransparents( transparentObjects, transparentDoublePassObjects, camera, sceneRef, lightsNode );
|
|
379
379
|
|
|
380
380
|
// restore render tree
|
|
381
381
|
|
|
@@ -678,7 +678,7 @@ class Renderer {
|
|
|
678
678
|
renderContext.scissorValue.height >>= activeMipmapLevel;
|
|
679
679
|
|
|
680
680
|
if ( ! renderContext.clippingContext ) renderContext.clippingContext = new ClippingContext();
|
|
681
|
-
renderContext.clippingContext.updateGlobal(
|
|
681
|
+
renderContext.clippingContext.updateGlobal( sceneRef, camera );
|
|
682
682
|
|
|
683
683
|
//
|
|
684
684
|
|
|
@@ -692,7 +692,7 @@ class Renderer {
|
|
|
692
692
|
const renderList = this._renderLists.get( scene, camera );
|
|
693
693
|
renderList.begin();
|
|
694
694
|
|
|
695
|
-
this._projectObject( scene, camera, 0, renderList );
|
|
695
|
+
this._projectObject( scene, camera, 0, renderList, renderContext.clippingContext );
|
|
696
696
|
|
|
697
697
|
renderList.finish();
|
|
698
698
|
|
|
@@ -1309,6 +1309,34 @@ class Renderer {
|
|
|
1309
1309
|
|
|
1310
1310
|
}
|
|
1311
1311
|
|
|
1312
|
+
hasInitialized() {
|
|
1313
|
+
|
|
1314
|
+
return this._initialized;
|
|
1315
|
+
|
|
1316
|
+
}
|
|
1317
|
+
|
|
1318
|
+
async initTextureAsync( texture ) {
|
|
1319
|
+
|
|
1320
|
+
if ( this._initialized === false ) await this.init();
|
|
1321
|
+
|
|
1322
|
+
this._textures.updateTexture( texture );
|
|
1323
|
+
|
|
1324
|
+
}
|
|
1325
|
+
|
|
1326
|
+
initTexture( texture ) {
|
|
1327
|
+
|
|
1328
|
+
if ( this._initialized === false ) {
|
|
1329
|
+
|
|
1330
|
+
console.warn( 'THREE.Renderer: .initTexture() called before the backend is initialized. Try using .initTextureAsync() instead.' );
|
|
1331
|
+
|
|
1332
|
+
return false;
|
|
1333
|
+
|
|
1334
|
+
}
|
|
1335
|
+
|
|
1336
|
+
this._textures.updateTexture( texture );
|
|
1337
|
+
|
|
1338
|
+
}
|
|
1339
|
+
|
|
1312
1340
|
copyFramebufferToTexture( framebufferTexture, rectangle = null ) {
|
|
1313
1341
|
|
|
1314
1342
|
if ( rectangle !== null ) {
|
|
@@ -1381,7 +1409,7 @@ class Renderer {
|
|
|
1381
1409
|
|
|
1382
1410
|
}
|
|
1383
1411
|
|
|
1384
|
-
_projectObject( object, camera, groupOrder, renderList ) {
|
|
1412
|
+
_projectObject( object, camera, groupOrder, renderList, clippingContext ) {
|
|
1385
1413
|
|
|
1386
1414
|
if ( object.visible === false ) return;
|
|
1387
1415
|
|
|
@@ -1393,6 +1421,8 @@ class Renderer {
|
|
|
1393
1421
|
|
|
1394
1422
|
groupOrder = object.renderOrder;
|
|
1395
1423
|
|
|
1424
|
+
if ( object.isClippingGroup && object.enabled ) clippingContext = clippingContext.getGroupContext( object );
|
|
1425
|
+
|
|
1396
1426
|
} else if ( object.isLOD ) {
|
|
1397
1427
|
|
|
1398
1428
|
if ( object.autoUpdate === true ) object.update( camera );
|
|
@@ -1415,7 +1445,7 @@ class Renderer {
|
|
|
1415
1445
|
|
|
1416
1446
|
if ( material.visible ) {
|
|
1417
1447
|
|
|
1418
|
-
renderList.push( object, geometry, material, groupOrder, _vector4.z, null );
|
|
1448
|
+
renderList.push( object, geometry, material, groupOrder, _vector4.z, null, clippingContext );
|
|
1419
1449
|
|
|
1420
1450
|
}
|
|
1421
1451
|
|
|
@@ -1453,7 +1483,7 @@ class Renderer {
|
|
|
1453
1483
|
|
|
1454
1484
|
if ( groupMaterial && groupMaterial.visible ) {
|
|
1455
1485
|
|
|
1456
|
-
renderList.push( object, geometry, groupMaterial, groupOrder, _vector4.z, group );
|
|
1486
|
+
renderList.push( object, geometry, groupMaterial, groupOrder, _vector4.z, group, clippingContext );
|
|
1457
1487
|
|
|
1458
1488
|
}
|
|
1459
1489
|
|
|
@@ -1461,7 +1491,7 @@ class Renderer {
|
|
|
1461
1491
|
|
|
1462
1492
|
} else if ( material.visible ) {
|
|
1463
1493
|
|
|
1464
|
-
renderList.push( object, geometry, material, groupOrder, _vector4.z, null );
|
|
1494
|
+
renderList.push( object, geometry, material, groupOrder, _vector4.z, null, clippingContext );
|
|
1465
1495
|
|
|
1466
1496
|
}
|
|
1467
1497
|
|
|
@@ -1494,7 +1524,7 @@ class Renderer {
|
|
|
1494
1524
|
|
|
1495
1525
|
for ( let i = 0, l = children.length; i < l; i ++ ) {
|
|
1496
1526
|
|
|
1497
|
-
this._projectObject( children[ i ], camera, groupOrder, renderList );
|
|
1527
|
+
this._projectObject( children[ i ], camera, groupOrder, renderList, clippingContext );
|
|
1498
1528
|
|
|
1499
1529
|
}
|
|
1500
1530
|
|
|
@@ -1561,7 +1591,7 @@ class Renderer {
|
|
|
1561
1591
|
// @TODO: Add support for multiple materials per object. This will require to extract
|
|
1562
1592
|
// the material from the renderItem object and pass it with its group data to renderObject().
|
|
1563
1593
|
|
|
1564
|
-
const { object, geometry, material, group } = renderItem;
|
|
1594
|
+
const { object, geometry, material, group, clippingContext } = renderItem;
|
|
1565
1595
|
|
|
1566
1596
|
if ( camera.isArrayCamera ) {
|
|
1567
1597
|
|
|
@@ -1584,7 +1614,7 @@ class Renderer {
|
|
|
1584
1614
|
|
|
1585
1615
|
this.backend.updateViewport( this._currentRenderContext );
|
|
1586
1616
|
|
|
1587
|
-
this._currentRenderObjectFunction( object, scene, camera2, geometry, material, group, lightsNode, passId );
|
|
1617
|
+
this._currentRenderObjectFunction( object, scene, camera2, geometry, material, group, lightsNode, clippingContext, passId );
|
|
1588
1618
|
|
|
1589
1619
|
}
|
|
1590
1620
|
|
|
@@ -1592,7 +1622,7 @@ class Renderer {
|
|
|
1592
1622
|
|
|
1593
1623
|
} else {
|
|
1594
1624
|
|
|
1595
|
-
this._currentRenderObjectFunction( object, scene, camera, geometry, material, group, lightsNode, passId );
|
|
1625
|
+
this._currentRenderObjectFunction( object, scene, camera, geometry, material, group, lightsNode, clippingContext, passId );
|
|
1596
1626
|
|
|
1597
1627
|
}
|
|
1598
1628
|
|
|
@@ -1600,10 +1630,10 @@ class Renderer {
|
|
|
1600
1630
|
|
|
1601
1631
|
}
|
|
1602
1632
|
|
|
1603
|
-
renderObject( object, scene, camera, geometry, material, group, lightsNode, passId = null ) {
|
|
1633
|
+
renderObject( object, scene, camera, geometry, material, group, lightsNode, clippingContext = null, passId = null ) {
|
|
1604
1634
|
|
|
1605
1635
|
let overridePositionNode;
|
|
1606
|
-
let
|
|
1636
|
+
let overrideColorNode;
|
|
1607
1637
|
let overrideDepthNode;
|
|
1608
1638
|
|
|
1609
1639
|
//
|
|
@@ -1623,6 +1653,9 @@ class Renderer {
|
|
|
1623
1653
|
|
|
1624
1654
|
}
|
|
1625
1655
|
|
|
1656
|
+
overrideMaterial.alphaTest = material.alphaTest;
|
|
1657
|
+
overrideMaterial.alphaMap = material.alphaMap;
|
|
1658
|
+
|
|
1626
1659
|
if ( overrideMaterial.isShadowNodeMaterial ) {
|
|
1627
1660
|
|
|
1628
1661
|
overrideMaterial.side = material.shadowSide === null ? material.side : material.shadowSide;
|
|
@@ -1634,37 +1667,10 @@ class Renderer {
|
|
|
1634
1667
|
|
|
1635
1668
|
}
|
|
1636
1669
|
|
|
1670
|
+
if ( material.castShadowNode && material.castShadowNode.isNode ) {
|
|
1637
1671
|
|
|
1638
|
-
|
|
1639
|
-
|
|
1640
|
-
overrideFragmentNode = overrideMaterial.fragmentNode;
|
|
1641
|
-
overrideMaterial.fragmentNode = material.shadowNode;
|
|
1642
|
-
|
|
1643
|
-
}
|
|
1644
|
-
|
|
1645
|
-
if ( this.localClippingEnabled ) {
|
|
1646
|
-
|
|
1647
|
-
if ( material.clipShadows ) {
|
|
1648
|
-
|
|
1649
|
-
if ( overrideMaterial.clippingPlanes !== material.clippingPlanes ) {
|
|
1650
|
-
|
|
1651
|
-
overrideMaterial.clippingPlanes = material.clippingPlanes;
|
|
1652
|
-
overrideMaterial.needsUpdate = true;
|
|
1653
|
-
|
|
1654
|
-
}
|
|
1655
|
-
|
|
1656
|
-
if ( overrideMaterial.clipIntersection !== material.clipIntersection ) {
|
|
1657
|
-
|
|
1658
|
-
overrideMaterial.clipIntersection = material.clipIntersection;
|
|
1659
|
-
|
|
1660
|
-
}
|
|
1661
|
-
|
|
1662
|
-
} else if ( Array.isArray( overrideMaterial.clippingPlanes ) ) {
|
|
1663
|
-
|
|
1664
|
-
overrideMaterial.clippingPlanes = null;
|
|
1665
|
-
overrideMaterial.needsUpdate = true;
|
|
1666
|
-
|
|
1667
|
-
}
|
|
1672
|
+
overrideColorNode = overrideMaterial.colorNode;
|
|
1673
|
+
overrideMaterial.colorNode = material.castShadowNode;
|
|
1668
1674
|
|
|
1669
1675
|
}
|
|
1670
1676
|
|
|
@@ -1679,16 +1685,16 @@ class Renderer {
|
|
|
1679
1685
|
if ( material.transparent === true && material.side === DoubleSide && material.forceSinglePass === false ) {
|
|
1680
1686
|
|
|
1681
1687
|
material.side = BackSide;
|
|
1682
|
-
this._handleObjectFunction( object, material, scene, camera, lightsNode, group, 'backSide' ); // create backSide pass id
|
|
1688
|
+
this._handleObjectFunction( object, material, scene, camera, lightsNode, group, clippingContext, 'backSide' ); // create backSide pass id
|
|
1683
1689
|
|
|
1684
1690
|
material.side = FrontSide;
|
|
1685
|
-
this._handleObjectFunction( object, material, scene, camera, lightsNode, group, passId ); // use default pass id
|
|
1691
|
+
this._handleObjectFunction( object, material, scene, camera, lightsNode, group, clippingContext, passId ); // use default pass id
|
|
1686
1692
|
|
|
1687
1693
|
material.side = DoubleSide;
|
|
1688
1694
|
|
|
1689
1695
|
} else {
|
|
1690
1696
|
|
|
1691
|
-
this._handleObjectFunction( object, material, scene, camera, lightsNode, group, passId );
|
|
1697
|
+
this._handleObjectFunction( object, material, scene, camera, lightsNode, group, clippingContext, passId );
|
|
1692
1698
|
|
|
1693
1699
|
}
|
|
1694
1700
|
|
|
@@ -1706,9 +1712,9 @@ class Renderer {
|
|
|
1706
1712
|
|
|
1707
1713
|
}
|
|
1708
1714
|
|
|
1709
|
-
if (
|
|
1715
|
+
if ( overrideColorNode !== undefined ) {
|
|
1710
1716
|
|
|
1711
|
-
scene.overrideMaterial.
|
|
1717
|
+
scene.overrideMaterial.colorNode = overrideColorNode;
|
|
1712
1718
|
|
|
1713
1719
|
}
|
|
1714
1720
|
|
|
@@ -1718,9 +1724,9 @@ class Renderer {
|
|
|
1718
1724
|
|
|
1719
1725
|
}
|
|
1720
1726
|
|
|
1721
|
-
_renderObjectDirect( object, material, scene, camera, lightsNode, group, passId ) {
|
|
1727
|
+
_renderObjectDirect( object, material, scene, camera, lightsNode, group, clippingContext, passId ) {
|
|
1722
1728
|
|
|
1723
|
-
const renderObject = this._objects.get( object, material, scene, camera, lightsNode, this._currentRenderContext, passId );
|
|
1729
|
+
const renderObject = this._objects.get( object, material, scene, camera, lightsNode, this._currentRenderContext, clippingContext, passId );
|
|
1724
1730
|
renderObject.drawRange = object.geometry.drawRange;
|
|
1725
1731
|
renderObject.group = group;
|
|
1726
1732
|
|
|
@@ -1759,9 +1765,9 @@ class Renderer {
|
|
|
1759
1765
|
|
|
1760
1766
|
}
|
|
1761
1767
|
|
|
1762
|
-
_createObjectPipeline( object, material, scene, camera, lightsNode, passId ) {
|
|
1768
|
+
_createObjectPipeline( object, material, scene, camera, lightsNode, clippingContext, passId ) {
|
|
1763
1769
|
|
|
1764
|
-
const renderObject = this._objects.get( object, material, scene, camera, lightsNode, this._currentRenderContext, passId );
|
|
1770
|
+
const renderObject = this._objects.get( object, material, scene, camera, lightsNode, this._currentRenderContext, clippingContext, passId );
|
|
1765
1771
|
|
|
1766
1772
|
//
|
|
1767
1773
|
|
|
@@ -300,8 +300,8 @@ class Textures extends DataMap {
|
|
|
300
300
|
|
|
301
301
|
if ( image.image !== undefined ) image = image.image;
|
|
302
302
|
|
|
303
|
-
target.width = image.width;
|
|
304
|
-
target.height = image.height;
|
|
303
|
+
target.width = image.width || 1;
|
|
304
|
+
target.height = image.height || 1;
|
|
305
305
|
target.depth = texture.isCubeTexture ? 6 : ( image.depth || 1 );
|
|
306
306
|
|
|
307
307
|
} else {
|
|
@@ -320,7 +320,15 @@ class Textures extends DataMap {
|
|
|
320
320
|
|
|
321
321
|
if ( texture.isCompressedTexture ) {
|
|
322
322
|
|
|
323
|
-
|
|
323
|
+
if ( texture.mipmaps ) {
|
|
324
|
+
|
|
325
|
+
mipLevelCount = texture.mipmaps.length;
|
|
326
|
+
|
|
327
|
+
} else {
|
|
328
|
+
|
|
329
|
+
mipLevelCount = 1;
|
|
330
|
+
|
|
331
|
+
}
|
|
324
332
|
|
|
325
333
|
} else {
|
|
326
334
|
|
|
@@ -149,10 +149,11 @@ class UniformsGroup extends UniformBuffer {
|
|
|
149
149
|
const a = this.values;
|
|
150
150
|
const v = uniform.getValue();
|
|
151
151
|
const offset = uniform.offset;
|
|
152
|
+
const type = uniform.getType();
|
|
152
153
|
|
|
153
154
|
if ( a[ offset ] !== v ) {
|
|
154
155
|
|
|
155
|
-
const b = this.
|
|
156
|
+
const b = this._getBufferForType( type );
|
|
156
157
|
|
|
157
158
|
b[ offset ] = a[ offset ] = v;
|
|
158
159
|
updated = true;
|
|
@@ -170,10 +171,11 @@ class UniformsGroup extends UniformBuffer {
|
|
|
170
171
|
const a = this.values;
|
|
171
172
|
const v = uniform.getValue();
|
|
172
173
|
const offset = uniform.offset;
|
|
174
|
+
const type = uniform.getType();
|
|
173
175
|
|
|
174
176
|
if ( a[ offset + 0 ] !== v.x || a[ offset + 1 ] !== v.y ) {
|
|
175
177
|
|
|
176
|
-
const b = this.
|
|
178
|
+
const b = this._getBufferForType( type );
|
|
177
179
|
|
|
178
180
|
b[ offset + 0 ] = a[ offset + 0 ] = v.x;
|
|
179
181
|
b[ offset + 1 ] = a[ offset + 1 ] = v.y;
|
|
@@ -193,10 +195,11 @@ class UniformsGroup extends UniformBuffer {
|
|
|
193
195
|
const a = this.values;
|
|
194
196
|
const v = uniform.getValue();
|
|
195
197
|
const offset = uniform.offset;
|
|
198
|
+
const type = uniform.getType();
|
|
196
199
|
|
|
197
200
|
if ( a[ offset + 0 ] !== v.x || a[ offset + 1 ] !== v.y || a[ offset + 2 ] !== v.z ) {
|
|
198
201
|
|
|
199
|
-
const b = this.
|
|
202
|
+
const b = this._getBufferForType( type );
|
|
200
203
|
|
|
201
204
|
b[ offset + 0 ] = a[ offset + 0 ] = v.x;
|
|
202
205
|
b[ offset + 1 ] = a[ offset + 1 ] = v.y;
|
|
@@ -217,10 +220,11 @@ class UniformsGroup extends UniformBuffer {
|
|
|
217
220
|
const a = this.values;
|
|
218
221
|
const v = uniform.getValue();
|
|
219
222
|
const offset = uniform.offset;
|
|
223
|
+
const type = uniform.getType();
|
|
220
224
|
|
|
221
225
|
if ( a[ offset + 0 ] !== v.x || a[ offset + 1 ] !== v.y || a[ offset + 2 ] !== v.z || a[ offset + 4 ] !== v.w ) {
|
|
222
226
|
|
|
223
|
-
const b = this.
|
|
227
|
+
const b = this._getBufferForType( type );
|
|
224
228
|
|
|
225
229
|
b[ offset + 0 ] = a[ offset + 0 ] = v.x;
|
|
226
230
|
b[ offset + 1 ] = a[ offset + 1 ] = v.y;
|
|
@@ -312,6 +316,14 @@ class UniformsGroup extends UniformBuffer {
|
|
|
312
316
|
|
|
313
317
|
}
|
|
314
318
|
|
|
319
|
+
_getBufferForType( type ) {
|
|
320
|
+
|
|
321
|
+
if ( type === 'int' || type === 'ivec2' || type === 'ivec3' || type === 'ivec4' ) return new Int32Array( this.buffer.buffer );
|
|
322
|
+
if ( type === 'uint' || type === 'uvec2' || type === 'uvec3' || type === 'uvec4' ) return new Uint32Array( this.buffer.buffer );
|
|
323
|
+
return this.buffer;
|
|
324
|
+
|
|
325
|
+
}
|
|
326
|
+
|
|
315
327
|
}
|
|
316
328
|
|
|
317
329
|
function setArray( a, b, offset ) {
|
|
@@ -116,6 +116,12 @@ class PMREMGenerator {
|
|
|
116
116
|
|
|
117
117
|
}
|
|
118
118
|
|
|
119
|
+
get _hasInitialized() {
|
|
120
|
+
|
|
121
|
+
return this._renderer.hasInitialized();
|
|
122
|
+
|
|
123
|
+
}
|
|
124
|
+
|
|
119
125
|
/**
|
|
120
126
|
* Generates a PMREM from a supplied Scene, which can be faster than using an
|
|
121
127
|
* image if networking bandwidth is low. Optional sigma specifies a blur radius
|
|
@@ -123,15 +129,27 @@ class PMREMGenerator {
|
|
|
123
129
|
* and far planes ensure the scene is rendered in its entirety (the cubeCamera
|
|
124
130
|
* is placed at the origin).
|
|
125
131
|
*/
|
|
126
|
-
fromScene( scene, sigma = 0, near = 0.1, far = 100 ) {
|
|
132
|
+
fromScene( scene, sigma = 0, near = 0.1, far = 100, renderTarget = null ) {
|
|
133
|
+
|
|
134
|
+
this._setSize( 256 );
|
|
135
|
+
|
|
136
|
+
if ( this._hasInitialized === false ) {
|
|
137
|
+
|
|
138
|
+
console.warn( 'THREE.PMREMGenerator: .fromScene() called before the backend is initialized. Try using .fromSceneAsync() instead.' );
|
|
139
|
+
|
|
140
|
+
const cubeUVRenderTarget = renderTarget || this._allocateTargets();
|
|
141
|
+
|
|
142
|
+
this.fromSceneAsync( scene, sigma, near, far, cubeUVRenderTarget );
|
|
143
|
+
|
|
144
|
+
return cubeUVRenderTarget;
|
|
145
|
+
|
|
146
|
+
}
|
|
127
147
|
|
|
128
148
|
_oldTarget = this._renderer.getRenderTarget();
|
|
129
149
|
_oldActiveCubeFace = this._renderer.getActiveCubeFace();
|
|
130
150
|
_oldActiveMipmapLevel = this._renderer.getActiveMipmapLevel();
|
|
131
151
|
|
|
132
|
-
this.
|
|
133
|
-
|
|
134
|
-
const cubeUVRenderTarget = this._allocateTargets();
|
|
152
|
+
const cubeUVRenderTarget = renderTarget || this._allocateTargets();
|
|
135
153
|
cubeUVRenderTarget.depthBuffer = true;
|
|
136
154
|
|
|
137
155
|
this._sceneToCubeUV( scene, near, far, cubeUVRenderTarget );
|
|
@@ -150,6 +168,14 @@ class PMREMGenerator {
|
|
|
150
168
|
|
|
151
169
|
}
|
|
152
170
|
|
|
171
|
+
async fromSceneAsync( scene, sigma = 0, near = 0.1, far = 100, renderTarget = null ) {
|
|
172
|
+
|
|
173
|
+
if ( this._hasInitialized === false ) await this._renderer.init();
|
|
174
|
+
|
|
175
|
+
return this.fromScene( scene, sigma, near, far, renderTarget );
|
|
176
|
+
|
|
177
|
+
}
|
|
178
|
+
|
|
153
179
|
/**
|
|
154
180
|
* Generates a PMREM from an equirectangular texture, which can be either LDR
|
|
155
181
|
* or HDR. The ideal input image size is 1k (1024 x 512),
|
|
@@ -157,6 +183,28 @@ class PMREMGenerator {
|
|
|
157
183
|
*/
|
|
158
184
|
fromEquirectangular( equirectangular, renderTarget = null ) {
|
|
159
185
|
|
|
186
|
+
if ( this._hasInitialized === false ) {
|
|
187
|
+
|
|
188
|
+
console.warn( 'THREE.PMREMGenerator: .fromEquirectangular() called before the backend is initialized. Try using .fromEquirectangularAsync() instead.' );
|
|
189
|
+
|
|
190
|
+
this._setSizeFromTexture( equirectangular );
|
|
191
|
+
|
|
192
|
+
const cubeUVRenderTarget = renderTarget || this._allocateTargets();
|
|
193
|
+
|
|
194
|
+
this.fromEquirectangularAsync( equirectangular, cubeUVRenderTarget );
|
|
195
|
+
|
|
196
|
+
return cubeUVRenderTarget;
|
|
197
|
+
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
return this._fromTexture( equirectangular, renderTarget );
|
|
201
|
+
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
async fromEquirectangularAsync( equirectangular, renderTarget = null ) {
|
|
205
|
+
|
|
206
|
+
if ( this._hasInitialized === false ) await this._renderer.init();
|
|
207
|
+
|
|
160
208
|
return this._fromTexture( equirectangular, renderTarget );
|
|
161
209
|
|
|
162
210
|
}
|
|
@@ -168,6 +216,28 @@ class PMREMGenerator {
|
|
|
168
216
|
*/
|
|
169
217
|
fromCubemap( cubemap, renderTarget = null ) {
|
|
170
218
|
|
|
219
|
+
if ( this._hasInitialized === false ) {
|
|
220
|
+
|
|
221
|
+
console.warn( 'THREE.PMREMGenerator: .fromCubemap() called before the backend is initialized. Try using .fromCubemapAsync() instead.' );
|
|
222
|
+
|
|
223
|
+
this._setSizeFromTexture( cubemap );
|
|
224
|
+
|
|
225
|
+
const cubeUVRenderTarget = renderTarget || this._allocateTargets();
|
|
226
|
+
|
|
227
|
+
this.fromCubemapAsync( cubemap, renderTarget );
|
|
228
|
+
|
|
229
|
+
return cubeUVRenderTarget;
|
|
230
|
+
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
return this._fromTexture( cubemap, renderTarget );
|
|
234
|
+
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
async fromCubemapAsync( cubemap, renderTarget = null ) {
|
|
238
|
+
|
|
239
|
+
if ( this._hasInitialized === false ) await this._renderer.init();
|
|
240
|
+
|
|
171
241
|
return this._fromTexture( cubemap, renderTarget );
|
|
172
242
|
|
|
173
243
|
}
|
|
@@ -224,6 +294,20 @@ class PMREMGenerator {
|
|
|
224
294
|
|
|
225
295
|
// private interface
|
|
226
296
|
|
|
297
|
+
_setSizeFromTexture( texture ) {
|
|
298
|
+
|
|
299
|
+
if ( texture.mapping === CubeReflectionMapping || texture.mapping === CubeRefractionMapping ) {
|
|
300
|
+
|
|
301
|
+
this._setSize( texture.image.length === 0 ? 16 : ( texture.image[ 0 ].width || texture.image[ 0 ].image.width ) );
|
|
302
|
+
|
|
303
|
+
} else { // Equirectangular
|
|
304
|
+
|
|
305
|
+
this._setSize( texture.image.width / 4 );
|
|
306
|
+
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
}
|
|
310
|
+
|
|
227
311
|
_setSize( cubeSize ) {
|
|
228
312
|
|
|
229
313
|
this._lodMax = Math.floor( Math.log2( cubeSize ) );
|
|
@@ -255,15 +339,7 @@ class PMREMGenerator {
|
|
|
255
339
|
|
|
256
340
|
_fromTexture( texture, renderTarget ) {
|
|
257
341
|
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
this._setSize( texture.image.length === 0 ? 16 : ( texture.image[ 0 ].width || texture.image[ 0 ].image.width ) );
|
|
261
|
-
|
|
262
|
-
} else { // Equirectangular
|
|
263
|
-
|
|
264
|
-
this._setSize( texture.image.width / 4 );
|
|
265
|
-
|
|
266
|
-
}
|
|
342
|
+
this._setSizeFromTexture( texture );
|
|
267
343
|
|
|
268
344
|
_oldTarget = this._renderer.getRenderTarget();
|
|
269
345
|
_oldActiveCubeFace = this._renderer.getActiveCubeFace();
|
|
@@ -50,9 +50,9 @@ class NodeLibrary {
|
|
|
50
50
|
|
|
51
51
|
}
|
|
52
52
|
|
|
53
|
-
addMaterial( materialNodeClass,
|
|
53
|
+
addMaterial( materialNodeClass, materialClassType ) {
|
|
54
54
|
|
|
55
|
-
this.addType( materialNodeClass,
|
|
55
|
+
this.addType( materialNodeClass, materialClassType, this.materialNodes );
|
|
56
56
|
|
|
57
57
|
}
|
|
58
58
|
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import StorageBuffer from '../StorageBuffer.js';
|
|
2
|
-
import {
|
|
2
|
+
import { NodeAccess } from '../../../nodes/core/constants.js';
|
|
3
3
|
|
|
4
4
|
let _id = 0;
|
|
5
5
|
|
|
@@ -10,10 +10,9 @@ class NodeStorageBuffer extends StorageBuffer {
|
|
|
10
10
|
super( 'StorageBuffer_' + _id ++, nodeUniform ? nodeUniform.value : null );
|
|
11
11
|
|
|
12
12
|
this.nodeUniform = nodeUniform;
|
|
13
|
-
this.access = nodeUniform ? nodeUniform.access :
|
|
13
|
+
this.access = nodeUniform ? nodeUniform.access : NodeAccess.READ_WRITE;
|
|
14
14
|
this.groupNode = groupNode;
|
|
15
15
|
|
|
16
|
-
|
|
17
16
|
}
|
|
18
17
|
|
|
19
18
|
get buffer() {
|
|
@@ -19,6 +19,12 @@ class NumberNodeUniform extends NumberUniform {
|
|
|
19
19
|
|
|
20
20
|
}
|
|
21
21
|
|
|
22
|
+
getType() {
|
|
23
|
+
|
|
24
|
+
return this.nodeUniform.type;
|
|
25
|
+
|
|
26
|
+
}
|
|
27
|
+
|
|
22
28
|
}
|
|
23
29
|
|
|
24
30
|
class Vector2NodeUniform extends Vector2Uniform {
|
|
@@ -37,6 +43,12 @@ class Vector2NodeUniform extends Vector2Uniform {
|
|
|
37
43
|
|
|
38
44
|
}
|
|
39
45
|
|
|
46
|
+
getType() {
|
|
47
|
+
|
|
48
|
+
return this.nodeUniform.type;
|
|
49
|
+
|
|
50
|
+
}
|
|
51
|
+
|
|
40
52
|
}
|
|
41
53
|
|
|
42
54
|
class Vector3NodeUniform extends Vector3Uniform {
|
|
@@ -55,6 +67,12 @@ class Vector3NodeUniform extends Vector3Uniform {
|
|
|
55
67
|
|
|
56
68
|
}
|
|
57
69
|
|
|
70
|
+
getType() {
|
|
71
|
+
|
|
72
|
+
return this.nodeUniform.type;
|
|
73
|
+
|
|
74
|
+
}
|
|
75
|
+
|
|
58
76
|
}
|
|
59
77
|
|
|
60
78
|
class Vector4NodeUniform extends Vector4Uniform {
|
|
@@ -73,6 +91,12 @@ class Vector4NodeUniform extends Vector4Uniform {
|
|
|
73
91
|
|
|
74
92
|
}
|
|
75
93
|
|
|
94
|
+
getType() {
|
|
95
|
+
|
|
96
|
+
return this.nodeUniform.type;
|
|
97
|
+
|
|
98
|
+
}
|
|
99
|
+
|
|
76
100
|
}
|
|
77
101
|
|
|
78
102
|
class ColorNodeUniform extends ColorUniform {
|
|
@@ -91,6 +115,12 @@ class ColorNodeUniform extends ColorUniform {
|
|
|
91
115
|
|
|
92
116
|
}
|
|
93
117
|
|
|
118
|
+
getType() {
|
|
119
|
+
|
|
120
|
+
return this.nodeUniform.type;
|
|
121
|
+
|
|
122
|
+
}
|
|
123
|
+
|
|
94
124
|
}
|
|
95
125
|
|
|
96
126
|
class Matrix3NodeUniform extends Matrix3Uniform {
|
|
@@ -109,6 +139,12 @@ class Matrix3NodeUniform extends Matrix3Uniform {
|
|
|
109
139
|
|
|
110
140
|
}
|
|
111
141
|
|
|
142
|
+
getType() {
|
|
143
|
+
|
|
144
|
+
return this.nodeUniform.type;
|
|
145
|
+
|
|
146
|
+
}
|
|
147
|
+
|
|
112
148
|
}
|
|
113
149
|
|
|
114
150
|
class Matrix4NodeUniform extends Matrix4Uniform {
|
|
@@ -127,6 +163,12 @@ class Matrix4NodeUniform extends Matrix4Uniform {
|
|
|
127
163
|
|
|
128
164
|
}
|
|
129
165
|
|
|
166
|
+
getType() {
|
|
167
|
+
|
|
168
|
+
return this.nodeUniform.type;
|
|
169
|
+
|
|
170
|
+
}
|
|
171
|
+
|
|
130
172
|
}
|
|
131
173
|
|
|
132
174
|
export {
|
|
@@ -242,6 +242,24 @@ function WebGLBackground( renderer, cubemaps, cubeuvmaps, state, objects, alpha,
|
|
|
242
242
|
|
|
243
243
|
}
|
|
244
244
|
|
|
245
|
+
function dispose() {
|
|
246
|
+
|
|
247
|
+
if ( boxMesh !== undefined ) {
|
|
248
|
+
|
|
249
|
+
boxMesh.geometry.dispose();
|
|
250
|
+
boxMesh.material.dispose();
|
|
251
|
+
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
if ( planeMesh !== undefined ) {
|
|
255
|
+
|
|
256
|
+
planeMesh.geometry.dispose();
|
|
257
|
+
planeMesh.material.dispose();
|
|
258
|
+
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
}
|
|
262
|
+
|
|
245
263
|
return {
|
|
246
264
|
|
|
247
265
|
getClearColor: function () {
|
|
@@ -268,7 +286,8 @@ function WebGLBackground( renderer, cubemaps, cubeuvmaps, state, objects, alpha,
|
|
|
268
286
|
|
|
269
287
|
},
|
|
270
288
|
render: render,
|
|
271
|
-
addToRenderList: addToRenderList
|
|
289
|
+
addToRenderList: addToRenderList,
|
|
290
|
+
dispose: dispose
|
|
272
291
|
|
|
273
292
|
};
|
|
274
293
|
|