super-three 0.168.0 → 0.169.1
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 +384 -700
- package/build/three.module.js +384 -700
- package/build/three.module.min.js +1 -1
- package/build/three.webgpu.js +24644 -22406
- package/build/three.webgpu.min.js +1 -1
- package/build/three.webgpu.nodes.js +79941 -0
- package/build/three.webgpu.nodes.min.js +6 -0
- package/examples/jsm/Addons.js +0 -6
- package/examples/jsm/controls/TrackballControls.js +32 -12
- package/examples/jsm/controls/TransformControls.js +97 -62
- package/examples/jsm/exporters/DRACOExporter.js +4 -2
- package/examples/jsm/exporters/EXRExporter.js +19 -11
- package/examples/jsm/exporters/KTX2Exporter.js +21 -13
- package/examples/jsm/exporters/OBJExporter.js +5 -1
- package/examples/jsm/exporters/PLYExporter.js +9 -7
- package/examples/jsm/geometries/DecalGeometry.js +4 -1
- package/examples/jsm/geometries/InstancedPointsGeometry.js +1 -1
- package/examples/jsm/helpers/LightProbeHelper.js +1 -1
- package/examples/jsm/helpers/LightProbeHelperGPU.js +65 -0
- package/examples/jsm/libs/basis/basis_transcoder.js +8 -10
- package/examples/jsm/libs/basis/basis_transcoder.wasm +0 -0
- package/examples/jsm/libs/ktx-parse.module.js +1 -1
- package/examples/jsm/lights/LightProbeGenerator.js +24 -10
- package/examples/jsm/loaders/ColladaLoader.js +9 -6
- package/examples/jsm/loaders/DRACOLoader.js +3 -1
- package/examples/jsm/loaders/FBXLoader.js +30 -20
- package/examples/jsm/loaders/GLTFLoader.js +5 -10
- package/examples/jsm/loaders/KTX2Loader.js +10 -7
- package/examples/jsm/loaders/MTLLoader.js +4 -3
- package/examples/jsm/loaders/MaterialXLoader.js +29 -10
- package/examples/jsm/loaders/OBJLoader.js +5 -3
- package/examples/jsm/loaders/PCDLoader.js +5 -4
- package/examples/jsm/loaders/PDBLoader.js +3 -2
- package/examples/jsm/loaders/PLYLoader.js +8 -5
- package/examples/jsm/loaders/STLLoader.js +3 -2
- package/examples/jsm/loaders/VRMLLoader.js +10 -10
- package/examples/jsm/loaders/VTKLoader.js +4 -3
- package/examples/jsm/loaders/XYZLoader.js +3 -2
- package/examples/jsm/misc/Timer.js +1 -1
- package/examples/jsm/modifiers/CurveModifierGPU.js +233 -0
- package/examples/jsm/objects/LensflareMesh.js +322 -0
- package/examples/jsm/objects/SkyMesh.js +1 -2
- package/examples/jsm/objects/Water2Mesh.js +2 -3
- package/examples/jsm/objects/WaterMesh.js +1 -2
- package/examples/jsm/physics/JoltPhysics.js +1 -1
- package/examples/jsm/physics/RapierPhysics.js +1 -1
- package/examples/jsm/transpiler/GLSLDecoder.js +1 -1
- package/examples/jsm/transpiler/ShaderToyDecoder.js +2 -2
- package/examples/jsm/utils/GeometryCompressionUtils.js +37 -122
- package/examples/jsm/utils/ShadowMapViewer.js +3 -8
- package/examples/jsm/utils/ShadowMapViewerGPU.js +201 -0
- package/examples/jsm/utils/SkeletonUtils.js +84 -66
- package/examples/jsm/utils/TextureUtils.js +1 -0
- package/examples/jsm/utils/TextureUtilsGPU.js +63 -0
- package/examples/jsm/webxr/XRControllerModelFactory.js +1 -1
- package/package.json +2 -2
- package/src/Three.WebGPU.Nodes.js +200 -0
- package/src/Three.WebGPU.js +2 -1
- package/src/audio/Audio.js +2 -2
- package/src/constants.js +1 -1
- package/src/core/BufferAttribute.js +0 -9
- package/src/core/Clock.js +1 -1
- package/src/core/InterleavedBuffer.js +0 -9
- package/src/extras/Controls.js +1 -1
- package/src/geometries/CylinderGeometry.js +11 -4
- package/src/loaders/MaterialLoader.js +7 -1
- package/src/loaders/nodes/NodeLoader.js +24 -4
- package/src/loaders/nodes/NodeMaterialLoader.js +21 -17
- package/src/loaders/nodes/NodeObjectLoader.js +19 -0
- package/src/materials/nodes/InstancedPointsNodeMaterial.js +19 -34
- package/src/materials/nodes/Line2NodeMaterial.js +26 -26
- package/src/materials/nodes/LineBasicNodeMaterial.js +7 -3
- package/src/materials/nodes/LineDashedNodeMaterial.js +7 -3
- package/src/materials/nodes/MeshBasicNodeMaterial.js +7 -3
- package/src/materials/nodes/MeshLambertNodeMaterial.js +7 -3
- package/src/materials/nodes/MeshMatcapNodeMaterial.js +7 -3
- package/src/materials/nodes/MeshNormalNodeMaterial.js +7 -3
- package/src/materials/nodes/MeshPhongNodeMaterial.js +7 -3
- package/src/materials/nodes/MeshPhysicalNodeMaterial.js +6 -3
- package/src/materials/nodes/MeshSSSNodeMaterial.js +6 -3
- package/src/materials/nodes/MeshStandardNodeMaterial.js +7 -3
- package/src/materials/nodes/MeshToonNodeMaterial.js +7 -3
- package/src/materials/nodes/NodeMaterial.js +20 -45
- package/src/materials/nodes/NodeMaterials.js +2 -0
- package/src/materials/nodes/PointsNodeMaterial.js +7 -3
- package/src/materials/nodes/ShadowNodeMaterial.js +7 -3
- package/src/materials/nodes/SpriteNodeMaterial.js +39 -6
- package/src/materials/nodes/VolumeNodeMaterial.js +13 -9
- package/src/materials/nodes/manager/NodeMaterialObserver.js +302 -0
- package/src/math/Triangle.js +24 -0
- package/src/nodes/Nodes.js +3 -3
- package/src/nodes/TSL.js +96 -93
- package/src/nodes/accessors/BatchNode.js +7 -3
- package/src/nodes/accessors/BufferAttributeNode.js +6 -3
- package/src/nodes/accessors/BufferNode.js +6 -3
- package/src/nodes/accessors/Camera.js +10 -16
- package/src/nodes/accessors/ClippingNode.js +7 -3
- package/src/nodes/accessors/CubeTextureNode.js +6 -3
- package/src/nodes/accessors/InstanceNode.js +11 -11
- package/src/nodes/accessors/InstancedPointsMaterialNode.js +6 -3
- package/src/nodes/accessors/Lights.js +51 -0
- package/src/nodes/accessors/MaterialNode.js +8 -4
- package/src/nodes/accessors/MaterialReferenceNode.js +6 -3
- package/src/nodes/accessors/ModelNode.js +42 -7
- package/src/nodes/accessors/ModelViewProjectionNode.js +9 -5
- package/src/nodes/accessors/MorphNode.js +7 -3
- package/src/nodes/accessors/Normal.js +32 -6
- package/src/nodes/accessors/Object3DNode.js +11 -27
- package/src/nodes/accessors/PointUVNode.js +7 -3
- package/src/nodes/accessors/ReferenceBaseNode.js +32 -4
- package/src/nodes/accessors/ReferenceNode.js +40 -3
- package/src/nodes/accessors/RendererReferenceNode.js +9 -3
- package/src/nodes/accessors/SceneNode.js +7 -3
- package/src/nodes/accessors/SkinningNode.js +7 -3
- package/src/nodes/accessors/StorageBufferNode.js +21 -3
- package/src/nodes/accessors/StorageTextureNode.js +7 -4
- package/src/nodes/accessors/Texture3DNode.js +7 -4
- package/src/nodes/accessors/TextureNode.js +19 -8
- package/src/nodes/accessors/TextureSizeNode.js +8 -5
- package/src/nodes/accessors/UniformArrayNode.js +12 -9
- package/src/nodes/accessors/UserDataNode.js +9 -6
- package/src/nodes/accessors/VelocityNode.js +74 -23
- package/src/nodes/accessors/VertexColorNode.js +6 -3
- package/src/nodes/code/CodeNode.js +7 -3
- package/src/nodes/code/ExpressionNode.js +8 -4
- package/src/nodes/code/FunctionCallNode.js +6 -3
- package/src/nodes/code/FunctionNode.js +6 -3
- package/src/nodes/code/ScriptableNode.js +11 -6
- package/src/nodes/code/ScriptableValueNode.js +7 -3
- package/src/nodes/core/AssignNode.js +9 -6
- package/src/nodes/core/AttributeNode.js +7 -3
- package/src/nodes/core/BypassNode.js +8 -4
- package/src/nodes/core/CacheNode.js +8 -4
- package/src/nodes/core/ConstNode.js +6 -3
- package/src/nodes/core/ContextNode.js +7 -3
- package/src/nodes/core/IndexNode.js +25 -3
- package/src/nodes/core/InputNode.js +7 -3
- package/src/nodes/core/MRTNode.js +6 -3
- package/src/nodes/core/Node.js +10 -51
- package/src/nodes/core/NodeBuilder.js +71 -5
- package/src/nodes/core/NodeUtils.js +48 -6
- package/src/nodes/core/OutputStructNode.js +8 -4
- package/src/nodes/core/ParameterNode.js +6 -3
- package/src/nodes/core/PropertyNode.js +7 -3
- package/src/nodes/core/StackNode.js +7 -3
- package/src/nodes/core/StructTypeNode.js +7 -3
- package/src/nodes/core/TempNode.js +8 -4
- package/src/nodes/core/UniformGroupNode.js +10 -6
- package/src/nodes/core/UniformNode.js +6 -3
- package/src/nodes/core/VarNode.js +8 -4
- package/src/nodes/core/VaryingNode.js +7 -3
- package/src/nodes/display/AfterImageNode.js +6 -0
- package/src/nodes/display/AnaglyphPassNode.js +6 -0
- package/src/nodes/display/AnamorphicNode.js +6 -0
- package/src/nodes/display/BloomNode.js +6 -0
- package/src/nodes/display/BumpMapNode.js +6 -0
- package/src/nodes/display/ColorSpaceFunctions.js +4 -4
- package/src/nodes/display/ColorSpaceNode.js +43 -14
- package/src/nodes/display/DenoiseNode.js +6 -3
- package/src/nodes/display/DepthOfFieldNode.js +6 -3
- package/src/nodes/display/DotScreenNode.js +8 -5
- package/src/nodes/display/FXAANode.js +6 -3
- package/src/nodes/display/FilmNode.js +6 -3
- package/src/nodes/display/FrontFacingNode.js +7 -3
- package/src/nodes/display/GTAONode.js +6 -3
- package/src/nodes/display/GaussianBlurNode.js +6 -3
- package/src/nodes/display/Lut3DNode.js +6 -3
- package/src/nodes/display/NormalMapNode.js +8 -6
- package/src/nodes/display/ParallaxBarrierPassNode.js +8 -5
- package/src/nodes/display/PassNode.js +18 -7
- package/src/nodes/display/PixelationPassNode.js +12 -5
- package/src/nodes/display/PosterizeNode.js +6 -3
- package/src/nodes/display/RGBShiftNode.js +6 -3
- package/src/nodes/display/RenderOutputNode.js +12 -8
- package/src/nodes/display/SSAAPassNode.js +6 -3
- package/src/nodes/display/ScreenNode.js +181 -0
- package/src/nodes/display/SobelOperatorNode.js +6 -3
- package/src/nodes/display/StereoCompositePassNode.js +6 -3
- package/src/nodes/display/StereoPassNode.js +6 -3
- package/src/nodes/display/ToneMappingFunctions.js +12 -12
- package/src/nodes/display/ToneMappingNode.js +8 -7
- package/src/nodes/display/ToonOutlinePassNode.js +111 -0
- package/src/nodes/display/TransitionNode.js +6 -3
- package/src/nodes/display/ViewportDepthNode.js +7 -3
- package/src/nodes/display/ViewportDepthTextureNode.js +8 -5
- package/src/nodes/display/ViewportSharedTextureNode.js +8 -5
- package/src/nodes/display/ViewportTextureNode.js +8 -5
- package/src/nodes/fog/FogExp2Node.js +6 -3
- package/src/nodes/fog/FogNode.js +7 -3
- package/src/nodes/fog/FogRangeNode.js +6 -3
- package/src/nodes/functions/PhysicalLightingModel.js +2 -2
- package/src/nodes/functions/material/getShIrradianceAt.js +28 -0
- package/src/nodes/geometry/RangeNode.js +7 -3
- package/src/nodes/gpgpu/AtomicFunctionNode.js +99 -0
- package/src/nodes/gpgpu/BarrierNode.js +40 -0
- package/src/nodes/gpgpu/ComputeBuiltinNode.js +98 -0
- package/src/nodes/gpgpu/ComputeNode.js +8 -4
- package/src/nodes/gpgpu/WorkgroupInfoNode.js +100 -0
- package/src/nodes/lighting/AONode.js +6 -3
- package/src/nodes/lighting/AmbientLightNode.js +6 -3
- package/src/nodes/lighting/AnalyticLightNode.js +198 -30
- package/src/nodes/lighting/BasicEnvironmentNode.js +6 -3
- package/src/nodes/lighting/BasicLightMapNode.js +6 -3
- package/src/nodes/lighting/DirectionalLightNode.js +7 -4
- package/src/nodes/lighting/EnvironmentNode.js +6 -3
- package/src/nodes/lighting/HemisphereLightNode.js +10 -6
- package/src/nodes/lighting/IESSpotLightNode.js +6 -3
- package/src/nodes/lighting/IrradianceNode.js +6 -3
- package/src/nodes/lighting/LightProbeNode.js +8 -31
- package/src/nodes/lighting/LightingContextNode.js +6 -3
- package/src/nodes/lighting/LightingNode.js +7 -3
- package/src/nodes/lighting/LightsNode.js +24 -5
- package/src/nodes/lighting/PointLightNode.js +11 -7
- package/src/nodes/lighting/RectAreaLightNode.js +11 -7
- package/src/nodes/lighting/SpotLightNode.js +13 -10
- package/src/nodes/math/ConditionalNode.js +23 -6
- package/src/nodes/math/MathNode.js +6 -3
- package/src/nodes/math/OperatorNode.js +6 -3
- package/src/nodes/pmrem/PMREMNode.js +6 -3
- package/src/nodes/utils/ArrayElementNode.js +8 -4
- package/src/nodes/utils/ConvertNode.js +7 -3
- package/src/nodes/utils/CubeMapNode.js +6 -3
- package/src/nodes/utils/EquirectUVNode.js +6 -3
- package/src/nodes/utils/FlipNode.js +7 -4
- package/src/nodes/utils/FunctionOverloadingNode.js +7 -3
- package/src/nodes/utils/JoinNode.js +6 -3
- package/src/nodes/utils/LoopNode.js +7 -3
- package/src/nodes/utils/MatcapUVNode.js +6 -3
- package/src/nodes/utils/MaxMipLevelNode.js +6 -3
- package/src/nodes/utils/OscNode.js +7 -3
- package/src/nodes/utils/RTTNode.js +6 -3
- package/src/nodes/utils/ReflectorNode.js +8 -5
- package/src/nodes/utils/RemapNode.js +7 -3
- package/src/nodes/utils/RotateNode.js +6 -3
- package/src/nodes/utils/SetNode.js +7 -4
- package/src/nodes/utils/SplitNode.js +7 -3
- package/src/nodes/utils/SpriteSheetUVNode.js +7 -3
- package/src/nodes/utils/StorageArrayElementNode.js +9 -8
- package/src/nodes/utils/TimerNode.js +6 -3
- package/src/nodes/utils/TriplanarTexturesNode.js +7 -3
- package/src/nodes/utils/ViewportUtils.js +2 -2
- package/src/objects/BatchedMesh.js +76 -10
- package/src/objects/LOD.js +21 -0
- package/src/objects/Line.js +1 -0
- package/src/objects/Mesh.js +7 -23
- package/src/objects/Points.js +2 -0
- package/src/renderers/WebGLRenderer.js +65 -50
- package/src/renderers/common/BundleGroup.js +26 -0
- package/src/renderers/common/ClippingContext.js +4 -3
- package/src/renderers/common/RenderContext.js +4 -5
- package/src/renderers/common/RenderObject.js +116 -5
- package/src/renderers/common/RenderObjects.js +8 -1
- package/src/renderers/common/Renderer.js +57 -49
- package/src/renderers/common/extras/PMREMGenerator.js +7 -9
- package/src/renderers/common/nodes/NodeBuilderState.js +3 -3
- package/src/renderers/common/nodes/Nodes.js +33 -14
- package/src/renderers/shaders/ShaderLib/sprite.glsl.js +2 -4
- package/src/renderers/webgl/WebGLAttributes.js +45 -14
- package/src/renderers/webgl/WebGLCapabilities.js +9 -0
- package/src/renderers/webgl/WebGLProgram.js +2 -0
- package/src/renderers/webgl/WebGLPrograms.js +21 -17
- package/src/renderers/webgl/WebGLState.js +21 -0
- package/src/renderers/webgl/WebGLTextures.js +22 -0
- package/src/renderers/webgl-fallback/WebGLBackend.js +50 -45
- package/src/renderers/webgl-fallback/nodes/GLSLNodeBuilder.js +4 -4
- package/src/renderers/webgl-fallback/utils/WebGLAttributeUtils.js +6 -0
- package/src/renderers/webgl-fallback/utils/WebGLState.js +1 -4
- package/src/renderers/webgl-fallback/utils/WebGLTextureUtils.js +61 -16
- package/src/renderers/webgpu/WebGPUBackend.js +33 -25
- package/src/renderers/webgpu/WebGPURenderer.Nodes.js +42 -0
- package/src/renderers/webgpu/WebGPURenderer.js +5 -2
- package/src/renderers/webgpu/nodes/BasicNodeLibrary.js +59 -0
- package/src/renderers/{common → webgpu}/nodes/StandardNodeLibrary.js +11 -11
- package/src/renderers/webgpu/nodes/WGSLNodeBuilder.js +91 -11
- package/src/renderers/webgpu/utils/WebGPUAttributeUtils.js +6 -16
- package/src/renderers/webgpu/utils/WebGPUPipelineUtils.js +1 -1
- package/src/renderers/webgpu/utils/WebGPUTextureUtils.js +7 -5
- package/src/renderers/webgpu/utils/WebGPUUtils.js +1 -1
- package/src/utils.js +33 -1
- package/examples/jsm/geometries/SDFGeometryGenerator.js +0 -144
- package/examples/jsm/loaders/TiltLoader.js +0 -520
- package/examples/jsm/utils/GPUStatsPanel.js +0 -95
- package/examples/jsm/utils/PackedPhongMaterial.js +0 -178
- package/src/nodes/display/ViewportNode.js +0 -138
- package/src/nodes/lighting/LightNode.js +0 -57
- package/src/renderers/common/StandardRenderer.js +0 -18
- package/src/renderers/webvr/WebVRManager.js +0 -495
- package/src/renderers/webvr/WebVRUtils.js +0 -66
|
@@ -22,7 +22,6 @@ import { Scene } from '../../scenes/Scene.js';
|
|
|
22
22
|
import { Frustum } from '../../math/Frustum.js';
|
|
23
23
|
import { Matrix4 } from '../../math/Matrix4.js';
|
|
24
24
|
import { Vector2 } from '../../math/Vector2.js';
|
|
25
|
-
import { Vector3 } from '../../math/Vector3.js';
|
|
26
25
|
import { Vector4 } from '../../math/Vector4.js';
|
|
27
26
|
import { RenderTarget } from '../../core/RenderTarget.js';
|
|
28
27
|
import { DoubleSide, BackSide, FrontSide, SRGBColorSpace, NoToneMapping, LinearFilter, LinearSRGBColorSpace, HalfFloatType, RGBAFormat, PCFShadowMap } from '../../constants.js';
|
|
@@ -32,7 +31,7 @@ const _drawingBufferSize = /*@__PURE__*/ new Vector2();
|
|
|
32
31
|
const _screen = /*@__PURE__*/ new Vector4();
|
|
33
32
|
const _frustum = /*@__PURE__*/ new Frustum();
|
|
34
33
|
const _projScreenMatrix = /*@__PURE__*/ new Matrix4();
|
|
35
|
-
const
|
|
34
|
+
const _vector4 = /*@__PURE__*/ new Vector4();
|
|
36
35
|
|
|
37
36
|
class Renderer {
|
|
38
37
|
|
|
@@ -45,6 +44,8 @@ class Renderer {
|
|
|
45
44
|
const {
|
|
46
45
|
logarithmicDepthBuffer = false,
|
|
47
46
|
alpha = true,
|
|
47
|
+
depth = true,
|
|
48
|
+
stencil = false,
|
|
48
49
|
antialias = false,
|
|
49
50
|
samples = 0,
|
|
50
51
|
getFallback = null
|
|
@@ -73,15 +74,17 @@ class Renderer {
|
|
|
73
74
|
|
|
74
75
|
this.sortObjects = true;
|
|
75
76
|
|
|
76
|
-
this.depth =
|
|
77
|
-
this.stencil =
|
|
77
|
+
this.depth = depth;
|
|
78
|
+
this.stencil = stencil;
|
|
78
79
|
|
|
79
80
|
this.clippingPlanes = [];
|
|
80
81
|
|
|
81
82
|
this.info = new Info();
|
|
82
83
|
|
|
83
84
|
this.nodes = {
|
|
84
|
-
library: new NodeLibrary()
|
|
85
|
+
library: new NodeLibrary(),
|
|
86
|
+
modelViewMatrix: null,
|
|
87
|
+
modelNormalViewMatrix: null
|
|
85
88
|
};
|
|
86
89
|
|
|
87
90
|
// internals
|
|
@@ -408,20 +411,21 @@ class Renderer {
|
|
|
408
411
|
|
|
409
412
|
_renderBundle( bundle, sceneRef, lightsNode ) {
|
|
410
413
|
|
|
411
|
-
const {
|
|
414
|
+
const { bundleGroup, camera, renderList } = bundle;
|
|
412
415
|
|
|
413
416
|
const renderContext = this._currentRenderContext;
|
|
414
417
|
|
|
415
418
|
//
|
|
416
419
|
|
|
417
|
-
const renderBundle = this._bundles.get(
|
|
420
|
+
const renderBundle = this._bundles.get( bundleGroup, camera );
|
|
418
421
|
const renderBundleData = this.backend.get( renderBundle );
|
|
419
422
|
|
|
420
423
|
if ( renderBundleData.renderContexts === undefined ) renderBundleData.renderContexts = new Set();
|
|
421
424
|
|
|
422
425
|
//
|
|
423
426
|
|
|
424
|
-
const
|
|
427
|
+
const needsUpdate = bundleGroup.version !== renderBundleData.version;
|
|
428
|
+
const renderBundleNeedsUpdate = renderBundleData.renderContexts.has( renderContext ) === false || needsUpdate;
|
|
425
429
|
|
|
426
430
|
renderBundleData.renderContexts.add( renderContext );
|
|
427
431
|
|
|
@@ -429,7 +433,7 @@ class Renderer {
|
|
|
429
433
|
|
|
430
434
|
this.backend.beginBundle( renderContext );
|
|
431
435
|
|
|
432
|
-
if ( renderBundleData.renderObjects === undefined ||
|
|
436
|
+
if ( renderBundleData.renderObjects === undefined || needsUpdate ) {
|
|
433
437
|
|
|
434
438
|
renderBundleData.renderObjects = [];
|
|
435
439
|
|
|
@@ -447,27 +451,26 @@ class Renderer {
|
|
|
447
451
|
|
|
448
452
|
this.backend.finishBundle( renderContext, renderBundle );
|
|
449
453
|
|
|
450
|
-
|
|
454
|
+
renderBundleData.version = bundleGroup.version;
|
|
451
455
|
|
|
452
456
|
} else {
|
|
453
457
|
|
|
454
|
-
const renderObjects = renderBundleData
|
|
458
|
+
const { renderObjects } = renderBundleData;
|
|
455
459
|
|
|
456
460
|
for ( let i = 0, l = renderObjects.length; i < l; i ++ ) {
|
|
457
461
|
|
|
458
462
|
const renderObject = renderObjects[ i ];
|
|
459
463
|
|
|
460
|
-
this._nodes.
|
|
464
|
+
if ( this._nodes.needsRefresh( renderObject ) ) {
|
|
461
465
|
|
|
462
|
-
|
|
466
|
+
this._nodes.updateBefore( renderObject );
|
|
463
467
|
|
|
464
|
-
|
|
465
|
-
|
|
468
|
+
this._nodes.updateForRender( renderObject );
|
|
469
|
+
this._bindings.updateForRender( renderObject );
|
|
466
470
|
|
|
467
|
-
|
|
468
|
-
this._bindings.updateForRender( renderObject );
|
|
471
|
+
this._nodes.updateAfter( renderObject );
|
|
469
472
|
|
|
470
|
-
|
|
473
|
+
}
|
|
471
474
|
|
|
472
475
|
}
|
|
473
476
|
|
|
@@ -713,10 +716,12 @@ class Renderer {
|
|
|
713
716
|
|
|
714
717
|
// process render lists
|
|
715
718
|
|
|
716
|
-
const
|
|
717
|
-
|
|
718
|
-
|
|
719
|
-
|
|
719
|
+
const {
|
|
720
|
+
bundles,
|
|
721
|
+
lightsNode,
|
|
722
|
+
transparent: transparentObjects,
|
|
723
|
+
opaque: opaqueObjects
|
|
724
|
+
} = renderList;
|
|
720
725
|
|
|
721
726
|
if ( bundles.length > 0 ) this._renderBundles( bundles, sceneRef, lightsNode );
|
|
722
727
|
if ( this.opaque === true && opaqueObjects.length > 0 ) this._renderObjects( opaqueObjects, camera, sceneRef, lightsNode );
|
|
@@ -1243,13 +1248,15 @@ class Renderer {
|
|
|
1243
1248
|
|
|
1244
1249
|
}
|
|
1245
1250
|
|
|
1246
|
-
copyFramebufferToTexture( framebufferTexture ) {
|
|
1251
|
+
copyFramebufferToTexture( framebufferTexture, rectangle = null ) {
|
|
1247
1252
|
|
|
1248
1253
|
const renderContext = this._currentRenderContext;
|
|
1249
1254
|
|
|
1250
1255
|
this._textures.updateTexture( framebufferTexture );
|
|
1251
1256
|
|
|
1252
|
-
|
|
1257
|
+
rectangle = rectangle === null ? _vector4.set( 0, 0, framebufferTexture.image.width, framebufferTexture.image.height ) : rectangle;
|
|
1258
|
+
|
|
1259
|
+
this.backend.copyFramebufferToTexture( framebufferTexture, renderContext, rectangle );
|
|
1253
1260
|
|
|
1254
1261
|
}
|
|
1255
1262
|
|
|
@@ -1263,9 +1270,9 @@ class Renderer {
|
|
|
1263
1270
|
}
|
|
1264
1271
|
|
|
1265
1272
|
|
|
1266
|
-
readRenderTargetPixelsAsync( renderTarget, x, y, width, height, index = 0 ) {
|
|
1273
|
+
readRenderTargetPixelsAsync( renderTarget, x, y, width, height, index = 0, faceIndex = 0 ) {
|
|
1267
1274
|
|
|
1268
|
-
return this.backend.copyTextureToBuffer( renderTarget.textures[ index ], x, y, width, height );
|
|
1275
|
+
return this.backend.copyTextureToBuffer( renderTarget.textures[ index ], x, y, width, height, faceIndex );
|
|
1269
1276
|
|
|
1270
1277
|
}
|
|
1271
1278
|
|
|
@@ -1295,16 +1302,15 @@ class Renderer {
|
|
|
1295
1302
|
|
|
1296
1303
|
if ( this.sortObjects === true ) {
|
|
1297
1304
|
|
|
1298
|
-
|
|
1305
|
+
_vector4.setFromMatrixPosition( object.matrixWorld ).applyMatrix4( _projScreenMatrix );
|
|
1299
1306
|
|
|
1300
1307
|
}
|
|
1301
1308
|
|
|
1302
|
-
const geometry = object
|
|
1303
|
-
const material = object.material;
|
|
1309
|
+
const { geometry, material } = object;
|
|
1304
1310
|
|
|
1305
1311
|
if ( material.visible ) {
|
|
1306
1312
|
|
|
1307
|
-
renderList.push( object, geometry, material, groupOrder,
|
|
1313
|
+
renderList.push( object, geometry, material, groupOrder, _vector4.z, null );
|
|
1308
1314
|
|
|
1309
1315
|
}
|
|
1310
1316
|
|
|
@@ -1318,14 +1324,13 @@ class Renderer {
|
|
|
1318
1324
|
|
|
1319
1325
|
if ( ! object.frustumCulled || _frustum.intersectsObject( object ) ) {
|
|
1320
1326
|
|
|
1321
|
-
const geometry = object
|
|
1322
|
-
const material = object.material;
|
|
1327
|
+
const { geometry, material } = object;
|
|
1323
1328
|
|
|
1324
1329
|
if ( this.sortObjects === true ) {
|
|
1325
1330
|
|
|
1326
1331
|
if ( geometry.boundingSphere === null ) geometry.computeBoundingSphere();
|
|
1327
1332
|
|
|
1328
|
-
|
|
1333
|
+
_vector4
|
|
1329
1334
|
.copy( geometry.boundingSphere.center )
|
|
1330
1335
|
.applyMatrix4( object.matrixWorld )
|
|
1331
1336
|
.applyMatrix4( _projScreenMatrix );
|
|
@@ -1343,7 +1348,7 @@ class Renderer {
|
|
|
1343
1348
|
|
|
1344
1349
|
if ( groupMaterial && groupMaterial.visible ) {
|
|
1345
1350
|
|
|
1346
|
-
renderList.push( object, geometry, groupMaterial, groupOrder,
|
|
1351
|
+
renderList.push( object, geometry, groupMaterial, groupOrder, _vector4.z, group );
|
|
1347
1352
|
|
|
1348
1353
|
}
|
|
1349
1354
|
|
|
@@ -1351,7 +1356,7 @@ class Renderer {
|
|
|
1351
1356
|
|
|
1352
1357
|
} else if ( material.visible ) {
|
|
1353
1358
|
|
|
1354
|
-
renderList.push( object, geometry, material, groupOrder,
|
|
1359
|
+
renderList.push( object, geometry, material, groupOrder, _vector4.z, null );
|
|
1355
1360
|
|
|
1356
1361
|
}
|
|
1357
1362
|
|
|
@@ -1361,7 +1366,7 @@ class Renderer {
|
|
|
1361
1366
|
|
|
1362
1367
|
}
|
|
1363
1368
|
|
|
1364
|
-
if ( object.
|
|
1369
|
+
if ( object.isBundleGroup === true && this.backend.beginBundle !== undefined ) {
|
|
1365
1370
|
|
|
1366
1371
|
const baseRenderList = renderList;
|
|
1367
1372
|
|
|
@@ -1371,7 +1376,7 @@ class Renderer {
|
|
|
1371
1376
|
renderList.begin();
|
|
1372
1377
|
|
|
1373
1378
|
baseRenderList.pushBundle( {
|
|
1374
|
-
object,
|
|
1379
|
+
bundleGroup: object,
|
|
1375
1380
|
camera,
|
|
1376
1381
|
renderList,
|
|
1377
1382
|
} );
|
|
@@ -1571,22 +1576,24 @@ class Renderer {
|
|
|
1571
1576
|
_renderObjectDirect( object, material, scene, camera, lightsNode, group, passId ) {
|
|
1572
1577
|
|
|
1573
1578
|
const renderObject = this._objects.get( object, material, scene, camera, lightsNode, this._currentRenderContext, passId );
|
|
1574
|
-
renderObject.drawRange =
|
|
1579
|
+
renderObject.drawRange = object.geometry.drawRange;
|
|
1580
|
+
renderObject.group = group;
|
|
1575
1581
|
|
|
1576
1582
|
//
|
|
1577
1583
|
|
|
1578
|
-
this._nodes.
|
|
1584
|
+
const needsRefresh = this._nodes.needsRefresh( renderObject );
|
|
1579
1585
|
|
|
1580
|
-
|
|
1586
|
+
if ( needsRefresh ) {
|
|
1581
1587
|
|
|
1582
|
-
|
|
1583
|
-
object.normalMatrix.getNormalMatrix( object.modelViewMatrix );
|
|
1588
|
+
this._nodes.updateBefore( renderObject );
|
|
1584
1589
|
|
|
1585
|
-
|
|
1590
|
+
this._geometries.updateForRender( renderObject );
|
|
1591
|
+
|
|
1592
|
+
this._nodes.updateForRender( renderObject );
|
|
1593
|
+
this._bindings.updateForRender( renderObject );
|
|
1594
|
+
|
|
1595
|
+
}
|
|
1586
1596
|
|
|
1587
|
-
this._nodes.updateForRender( renderObject );
|
|
1588
|
-
this._geometries.updateForRender( renderObject );
|
|
1589
|
-
this._bindings.updateForRender( renderObject );
|
|
1590
1597
|
this._pipelines.updateForRender( renderObject );
|
|
1591
1598
|
|
|
1592
1599
|
//
|
|
@@ -1597,11 +1604,13 @@ class Renderer {
|
|
|
1597
1604
|
|
|
1598
1605
|
renderBundleData.renderObjects.push( renderObject );
|
|
1599
1606
|
|
|
1607
|
+
renderObject.bundle = this._currentRenderBundle.scene;
|
|
1608
|
+
|
|
1600
1609
|
}
|
|
1601
1610
|
|
|
1602
1611
|
this.backend.draw( renderObject, this.info );
|
|
1603
1612
|
|
|
1604
|
-
this._nodes.updateAfter( renderObject );
|
|
1613
|
+
if ( needsRefresh ) this._nodes.updateAfter( renderObject );
|
|
1605
1614
|
|
|
1606
1615
|
}
|
|
1607
1616
|
|
|
@@ -1613,10 +1622,9 @@ class Renderer {
|
|
|
1613
1622
|
|
|
1614
1623
|
this._nodes.updateBefore( renderObject );
|
|
1615
1624
|
|
|
1616
|
-
|
|
1625
|
+
this._geometries.updateForRender( renderObject );
|
|
1617
1626
|
|
|
1618
1627
|
this._nodes.updateForRender( renderObject );
|
|
1619
|
-
this._geometries.updateForRender( renderObject );
|
|
1620
1628
|
this._bindings.updateForRender( renderObject );
|
|
1621
1629
|
|
|
1622
1630
|
this._pipelines.getForRender( renderObject, this._compilationPromises );
|
|
@@ -176,12 +176,12 @@ class PMREMGenerator {
|
|
|
176
176
|
* Pre-compiles the cubemap shader. You can get faster start-up by invoking this method during
|
|
177
177
|
* your texture's network fetch for increased concurrency.
|
|
178
178
|
*/
|
|
179
|
-
compileCubemapShader() {
|
|
179
|
+
async compileCubemapShader() {
|
|
180
180
|
|
|
181
181
|
if ( this._cubemapMaterial === null ) {
|
|
182
182
|
|
|
183
183
|
this._cubemapMaterial = _getCubemapMaterial();
|
|
184
|
-
this._compileMaterial( this._cubemapMaterial );
|
|
184
|
+
await this._compileMaterial( this._cubemapMaterial );
|
|
185
185
|
|
|
186
186
|
}
|
|
187
187
|
|
|
@@ -191,12 +191,12 @@ class PMREMGenerator {
|
|
|
191
191
|
* Pre-compiles the equirectangular shader. You can get faster start-up by invoking this method during
|
|
192
192
|
* your texture's network fetch for increased concurrency.
|
|
193
193
|
*/
|
|
194
|
-
compileEquirectangularShader() {
|
|
194
|
+
async compileEquirectangularShader() {
|
|
195
195
|
|
|
196
196
|
if ( this._equirectMaterial === null ) {
|
|
197
197
|
|
|
198
198
|
this._equirectMaterial = _getEquirectMaterial();
|
|
199
|
-
this._compileMaterial( this._equirectMaterial );
|
|
199
|
+
await this._compileMaterial( this._equirectMaterial );
|
|
200
200
|
|
|
201
201
|
}
|
|
202
202
|
|
|
@@ -316,12 +316,10 @@ class PMREMGenerator {
|
|
|
316
316
|
|
|
317
317
|
}
|
|
318
318
|
|
|
319
|
-
_compileMaterial( material ) {
|
|
319
|
+
async _compileMaterial( material ) {
|
|
320
320
|
|
|
321
|
-
const tmpMesh = this.
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
this._renderer.compile( tmpMesh, _flatCamera );
|
|
321
|
+
const tmpMesh = new Mesh( this._lodPlanes[ 0 ], material );
|
|
322
|
+
await this._renderer.compile( tmpMesh, _flatCamera );
|
|
325
323
|
|
|
326
324
|
}
|
|
327
325
|
|
|
@@ -2,7 +2,7 @@ import BindGroup from '../BindGroup.js';
|
|
|
2
2
|
|
|
3
3
|
class NodeBuilderState {
|
|
4
4
|
|
|
5
|
-
constructor( vertexShader, fragmentShader, computeShader, nodeAttributes, bindings, updateNodes, updateBeforeNodes, updateAfterNodes,
|
|
5
|
+
constructor( vertexShader, fragmentShader, computeShader, nodeAttributes, bindings, updateNodes, updateBeforeNodes, updateAfterNodes, monitor, transforms = [] ) {
|
|
6
6
|
|
|
7
7
|
this.vertexShader = vertexShader;
|
|
8
8
|
this.fragmentShader = fragmentShader;
|
|
@@ -16,7 +16,7 @@ class NodeBuilderState {
|
|
|
16
16
|
this.updateBeforeNodes = updateBeforeNodes;
|
|
17
17
|
this.updateAfterNodes = updateAfterNodes;
|
|
18
18
|
|
|
19
|
-
this.
|
|
19
|
+
this.monitor = monitor;
|
|
20
20
|
|
|
21
21
|
this.usedTimes = 0;
|
|
22
22
|
|
|
@@ -28,7 +28,7 @@ class NodeBuilderState {
|
|
|
28
28
|
|
|
29
29
|
for ( const instanceGroup of this.bindings ) {
|
|
30
30
|
|
|
31
|
-
const shared =
|
|
31
|
+
const shared = instanceGroup.bindings[ 0 ].groupNode.shared;
|
|
32
32
|
|
|
33
33
|
if ( shared !== true ) {
|
|
34
34
|
|
|
@@ -3,9 +3,10 @@ import ChainMap from '../ChainMap.js';
|
|
|
3
3
|
import NodeBuilderState from './NodeBuilderState.js';
|
|
4
4
|
import { cubeMapNode } from '../../../nodes/utils/CubeMapNode.js';
|
|
5
5
|
import { NodeFrame } from '../../../nodes/Nodes.js';
|
|
6
|
-
import { objectGroup, renderGroup, frameGroup, cubeTexture, texture, rangeFog, densityFog, reference, normalWorld, pmremTexture,
|
|
6
|
+
import { objectGroup, renderGroup, frameGroup, cubeTexture, texture, rangeFog, densityFog, reference, normalWorld, pmremTexture, screenUV } from '../../../nodes/TSL.js';
|
|
7
7
|
|
|
8
|
-
import { EquirectangularReflectionMapping, EquirectangularRefractionMapping } from '../../../constants.js';
|
|
8
|
+
import { CubeUVReflectionMapping, EquirectangularReflectionMapping, EquirectangularRefractionMapping } from '../../../constants.js';
|
|
9
|
+
import { hashArray } from '../../../nodes/core/NodeUtils.js';
|
|
9
10
|
|
|
10
11
|
const outputNodeMap = new WeakMap();
|
|
11
12
|
|
|
@@ -190,7 +191,7 @@ class Nodes extends DataMap {
|
|
|
190
191
|
nodeBuilder.updateNodes,
|
|
191
192
|
nodeBuilder.updateBeforeNodes,
|
|
192
193
|
nodeBuilder.updateAfterNodes,
|
|
193
|
-
nodeBuilder.
|
|
194
|
+
nodeBuilder.monitor,
|
|
194
195
|
nodeBuilder.transforms
|
|
195
196
|
);
|
|
196
197
|
|
|
@@ -226,15 +227,17 @@ class Nodes extends DataMap {
|
|
|
226
227
|
const environmentNode = this.getEnvironmentNode( scene );
|
|
227
228
|
const fogNode = this.getFogNode( scene );
|
|
228
229
|
|
|
229
|
-
const
|
|
230
|
+
const values = [];
|
|
230
231
|
|
|
231
|
-
if ( lightsNode )
|
|
232
|
-
if ( environmentNode )
|
|
233
|
-
if ( fogNode )
|
|
232
|
+
if ( lightsNode ) values.push( lightsNode.getCacheKey( true ) );
|
|
233
|
+
if ( environmentNode ) values.push( environmentNode.getCacheKey() );
|
|
234
|
+
if ( fogNode ) values.push( fogNode.getCacheKey() );
|
|
235
|
+
|
|
236
|
+
values.push( this.renderer.shadowMap.enabled ? 1 : 0 );
|
|
234
237
|
|
|
235
238
|
cacheKeyData = {
|
|
236
239
|
callId,
|
|
237
|
-
cacheKey:
|
|
240
|
+
cacheKey: hashArray( values )
|
|
238
241
|
};
|
|
239
242
|
|
|
240
243
|
this.callHashCache.set( chain, cacheKeyData );
|
|
@@ -272,9 +275,9 @@ class Nodes extends DataMap {
|
|
|
272
275
|
|
|
273
276
|
let backgroundNode = null;
|
|
274
277
|
|
|
275
|
-
if ( background.isCubeTexture === true || ( background.mapping === EquirectangularReflectionMapping || background.mapping === EquirectangularRefractionMapping ) ) {
|
|
278
|
+
if ( background.isCubeTexture === true || ( background.mapping === EquirectangularReflectionMapping || background.mapping === EquirectangularRefractionMapping || background.mapping === CubeUVReflectionMapping ) ) {
|
|
276
279
|
|
|
277
|
-
if ( scene.backgroundBlurriness > 0 ) {
|
|
280
|
+
if ( scene.backgroundBlurriness > 0 || background.mapping === CubeUVReflectionMapping ) {
|
|
278
281
|
|
|
279
282
|
backgroundNode = pmremTexture( background, normalWorld );
|
|
280
283
|
|
|
@@ -298,7 +301,7 @@ class Nodes extends DataMap {
|
|
|
298
301
|
|
|
299
302
|
} else if ( background.isTexture === true ) {
|
|
300
303
|
|
|
301
|
-
backgroundNode = texture( background,
|
|
304
|
+
backgroundNode = texture( background, screenUV.flipY() ).setUpdateMatrix( true );
|
|
302
305
|
|
|
303
306
|
} else if ( background.isColor !== true ) {
|
|
304
307
|
|
|
@@ -334,11 +337,18 @@ class Nodes extends DataMap {
|
|
|
334
337
|
|
|
335
338
|
if ( fog.isFogExp2 ) {
|
|
336
339
|
|
|
337
|
-
|
|
340
|
+
const color = reference( 'color', 'color', fog ).setGroup( renderGroup );
|
|
341
|
+
const density = reference( 'density', 'float', fog ).setGroup( renderGroup );
|
|
342
|
+
|
|
343
|
+
fogNode = densityFog( color, density );
|
|
338
344
|
|
|
339
345
|
} else if ( fog.isFog ) {
|
|
340
346
|
|
|
341
|
-
|
|
347
|
+
const color = reference( 'color', 'color', fog ).setGroup( renderGroup );
|
|
348
|
+
const near = reference( 'near', 'float', fog ).setGroup( renderGroup );
|
|
349
|
+
const far = reference( 'far', 'float', fog ).setGroup( renderGroup );
|
|
350
|
+
|
|
351
|
+
fogNode = rangeFog( color, near, far );
|
|
342
352
|
|
|
343
353
|
} else {
|
|
344
354
|
|
|
@@ -439,7 +449,7 @@ class Nodes extends DataMap {
|
|
|
439
449
|
const renderer = this.renderer;
|
|
440
450
|
const cacheKey = this.getOutputCacheKey();
|
|
441
451
|
|
|
442
|
-
const output = texture( outputTexture,
|
|
452
|
+
const output = texture( outputTexture, screenUV ).renderOutput( renderer.toneMapping, renderer.currentColorSpace );
|
|
443
453
|
|
|
444
454
|
outputNodeMap.set( outputTexture, cacheKey );
|
|
445
455
|
|
|
@@ -501,6 +511,15 @@ class Nodes extends DataMap {
|
|
|
501
511
|
|
|
502
512
|
}
|
|
503
513
|
|
|
514
|
+
needsRefresh( renderObject ) {
|
|
515
|
+
|
|
516
|
+
const nodeFrame = this.getNodeFrameForRender( renderObject );
|
|
517
|
+
const monitor = renderObject.getMonitor();
|
|
518
|
+
|
|
519
|
+
return monitor.needsRefresh( renderObject, nodeFrame );
|
|
520
|
+
|
|
521
|
+
}
|
|
522
|
+
|
|
504
523
|
dispose() {
|
|
505
524
|
|
|
506
525
|
super.dispose();
|
|
@@ -12,11 +12,9 @@ void main() {
|
|
|
12
12
|
|
|
13
13
|
#include <uv_vertex>
|
|
14
14
|
|
|
15
|
-
vec4 mvPosition = modelViewMatrix
|
|
15
|
+
vec4 mvPosition = modelViewMatrix[ 3 ];
|
|
16
16
|
|
|
17
|
-
vec2 scale;
|
|
18
|
-
scale.x = length( vec3( modelMatrix[ 0 ].x, modelMatrix[ 0 ].y, modelMatrix[ 0 ].z ) );
|
|
19
|
-
scale.y = length( vec3( modelMatrix[ 1 ].x, modelMatrix[ 1 ].y, modelMatrix[ 1 ].z ) );
|
|
17
|
+
vec2 scale = vec2( length( modelMatrix[ 0 ].xyz ), length( modelMatrix[ 1 ].xyz ) );
|
|
20
18
|
|
|
21
19
|
#ifndef USE_SIZEATTENUATION
|
|
22
20
|
|
|
@@ -76,40 +76,71 @@ function WebGLAttributes( gl ) {
|
|
|
76
76
|
function updateBuffer( buffer, attribute, bufferType ) {
|
|
77
77
|
|
|
78
78
|
const array = attribute.array;
|
|
79
|
-
const updateRange = attribute._updateRange; // @deprecated, r159
|
|
80
79
|
const updateRanges = attribute.updateRanges;
|
|
81
80
|
|
|
82
81
|
gl.bindBuffer( bufferType, buffer );
|
|
83
82
|
|
|
84
|
-
if (
|
|
83
|
+
if ( updateRanges.length === 0 ) {
|
|
85
84
|
|
|
86
85
|
// Not using update ranges
|
|
87
86
|
gl.bufferSubData( bufferType, 0, array );
|
|
88
87
|
|
|
89
|
-
}
|
|
88
|
+
} else {
|
|
90
89
|
|
|
91
|
-
|
|
90
|
+
// Before applying update ranges, we merge any adjacent / overlapping
|
|
91
|
+
// ranges to reduce load on `gl.bufferSubData`. Empirically, this has led
|
|
92
|
+
// to performance improvements for applications which make heavy use of
|
|
93
|
+
// update ranges. Likely due to GPU command overhead.
|
|
94
|
+
//
|
|
95
|
+
// Note that to reduce garbage collection between frames, we merge the
|
|
96
|
+
// update ranges in-place. This is safe because this method will clear the
|
|
97
|
+
// update ranges once updated.
|
|
92
98
|
|
|
93
|
-
|
|
99
|
+
updateRanges.sort( ( a, b ) => a.start - b.start );
|
|
100
|
+
|
|
101
|
+
// To merge the update ranges in-place, we work from left to right in the
|
|
102
|
+
// existing updateRanges array, merging ranges. This may result in a final
|
|
103
|
+
// array which is smaller than the original. This index tracks the last
|
|
104
|
+
// index representing a merged range, any data after this index can be
|
|
105
|
+
// trimmed once the merge algorithm is completed.
|
|
106
|
+
let mergeIndex = 0;
|
|
107
|
+
|
|
108
|
+
for ( let i = 1; i < updateRanges.length; i ++ ) {
|
|
94
109
|
|
|
110
|
+
const previousRange = updateRanges[ mergeIndex ];
|
|
95
111
|
const range = updateRanges[ i ];
|
|
96
112
|
|
|
97
|
-
|
|
98
|
-
|
|
113
|
+
// We add one here to merge adjacent ranges. This is safe because ranges
|
|
114
|
+
// operate over positive integers.
|
|
115
|
+
if ( range.start <= previousRange.start + previousRange.count + 1 ) {
|
|
116
|
+
|
|
117
|
+
previousRange.count = Math.max(
|
|
118
|
+
previousRange.count,
|
|
119
|
+
range.start + range.count - previousRange.start
|
|
120
|
+
);
|
|
121
|
+
|
|
122
|
+
} else {
|
|
123
|
+
|
|
124
|
+
++ mergeIndex;
|
|
125
|
+
updateRanges[ mergeIndex ] = range;
|
|
126
|
+
|
|
127
|
+
}
|
|
99
128
|
|
|
100
129
|
}
|
|
101
130
|
|
|
102
|
-
|
|
131
|
+
// Trim the array to only contain the merged ranges.
|
|
132
|
+
updateRanges.length = mergeIndex + 1;
|
|
103
133
|
|
|
104
|
-
|
|
134
|
+
for ( let i = 0, l = updateRanges.length; i < l; i ++ ) {
|
|
135
|
+
|
|
136
|
+
const range = updateRanges[ i ];
|
|
105
137
|
|
|
106
|
-
|
|
107
|
-
|
|
138
|
+
gl.bufferSubData( bufferType, range.start * array.BYTES_PER_ELEMENT,
|
|
139
|
+
array, range.start, range.count );
|
|
108
140
|
|
|
109
|
-
|
|
110
|
-
array, updateRange.offset, updateRange.count );
|
|
141
|
+
}
|
|
111
142
|
|
|
112
|
-
|
|
143
|
+
attribute.clearUpdateRanges();
|
|
113
144
|
|
|
114
145
|
}
|
|
115
146
|
|
|
@@ -92,6 +92,14 @@ function WebGLCapabilities( gl, extensions, parameters, utils ) {
|
|
|
92
92
|
}
|
|
93
93
|
|
|
94
94
|
const logarithmicDepthBuffer = parameters.logarithmicDepthBuffer === true;
|
|
95
|
+
const reverseDepthBuffer = parameters.reverseDepthBuffer === true && extensions.has( 'EXT_clip_control' );
|
|
96
|
+
|
|
97
|
+
if ( reverseDepthBuffer === true ) {
|
|
98
|
+
|
|
99
|
+
const ext = extensions.get( 'EXT_clip_control' );
|
|
100
|
+
ext.clipControlEXT( ext.LOWER_LEFT_EXT, ext.ZERO_TO_ONE_EXT );
|
|
101
|
+
|
|
102
|
+
}
|
|
95
103
|
|
|
96
104
|
const maxTextures = gl.getParameter( gl.MAX_TEXTURE_IMAGE_UNITS );
|
|
97
105
|
const maxVertexTextures = gl.getParameter( gl.MAX_VERTEX_TEXTURE_IMAGE_UNITS );
|
|
@@ -119,6 +127,7 @@ function WebGLCapabilities( gl, extensions, parameters, utils ) {
|
|
|
119
127
|
|
|
120
128
|
precision: precision,
|
|
121
129
|
logarithmicDepthBuffer: logarithmicDepthBuffer,
|
|
130
|
+
reverseDepthBuffer: reverseDepthBuffer,
|
|
122
131
|
|
|
123
132
|
maxTextures: maxTextures,
|
|
124
133
|
maxVertexTextures: maxVertexTextures,
|
|
@@ -659,6 +659,7 @@ function WebGLProgram( renderer, cacheKey, parameters, bindingStates ) {
|
|
|
659
659
|
parameters.numLightProbes > 0 ? '#define USE_LIGHT_PROBES' : '',
|
|
660
660
|
|
|
661
661
|
parameters.logarithmicDepthBuffer ? '#define USE_LOGDEPTHBUF' : '',
|
|
662
|
+
parameters.reverseDepthBuffer ? '#define USE_REVERSEDEPTHBUF' : '',
|
|
662
663
|
|
|
663
664
|
'uniform mat4 modelMatrix;',
|
|
664
665
|
'uniform mat4 modelViewMatrix;',
|
|
@@ -824,6 +825,7 @@ function WebGLProgram( renderer, cacheKey, parameters, bindingStates ) {
|
|
|
824
825
|
parameters.decodeVideoTexture ? '#define DECODE_VIDEO_TEXTURE' : '',
|
|
825
826
|
|
|
826
827
|
parameters.logarithmicDepthBuffer ? '#define USE_LOGDEPTHBUF' : '',
|
|
828
|
+
parameters.reverseDepthBuffer ? '#define USE_REVERSEDEPTHBUF' : '',
|
|
827
829
|
|
|
828
830
|
'uniform mat4 viewMatrix;',
|
|
829
831
|
'uniform vec3 cameraPosition;',
|