super-three 0.161.0 → 0.163.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 +822 -1332
- package/build/three.module.js +820 -1328
- package/build/three.module.min.js +1 -1
- package/examples/jsm/controls/DragControls.js +91 -30
- package/examples/jsm/controls/OrbitControls.js +32 -6
- package/examples/jsm/controls/TransformControls.js +9 -9
- package/examples/jsm/exporters/GLTFExporter.js +30 -3
- package/examples/jsm/exporters/USDZExporter.js +15 -0
- package/examples/jsm/geometries/TextGeometry.js +10 -2
- package/examples/jsm/interactive/HTMLMesh.js +7 -9
- package/examples/jsm/interactive/InteractiveGroup.js +15 -25
- package/examples/jsm/libs/fflate.module.js +694 -496
- package/examples/jsm/libs/rhino3dm/rhino3dm.js +1 -8723
- package/examples/jsm/libs/rhino3dm/rhino3dm.module.js +1 -8734
- package/examples/jsm/libs/rhino3dm/rhino3dm.wasm +0 -0
- package/examples/jsm/libs/tween.module.js +32 -14
- package/examples/jsm/lines/LineMaterial.js +0 -2
- package/examples/jsm/loaders/3DMLoader.js +13 -21
- package/examples/jsm/loaders/3MFLoader.js +2 -0
- package/examples/jsm/loaders/EXRLoader.js +89 -19
- package/examples/jsm/loaders/FBXLoader.js +1 -1
- package/examples/jsm/loaders/GLTFLoader.js +6 -0
- package/examples/jsm/loaders/KTX2Loader.js +2 -6
- package/examples/jsm/loaders/LUT3dlLoader.js +0 -15
- package/examples/jsm/loaders/LUTCubeLoader.js +0 -14
- package/examples/jsm/loaders/LUTImageLoader.js +0 -14
- package/examples/jsm/loaders/RGBMLoader.js +16 -0
- package/examples/jsm/loaders/VOXLoader.js +9 -2
- package/examples/jsm/loaders/VRMLLoader.js +6 -2
- package/examples/jsm/misc/GPUComputationRenderer.js +0 -6
- package/examples/jsm/misc/ProgressiveLightMap.js +1 -0
- package/examples/jsm/nodes/Nodes.js +15 -8
- package/examples/jsm/nodes/accessors/AccessorsUtils.js +10 -0
- package/examples/jsm/nodes/accessors/BatchNode.js +78 -0
- package/examples/jsm/nodes/accessors/ClippingNode.js +144 -0
- package/examples/jsm/nodes/accessors/InstanceNode.js +25 -2
- package/examples/jsm/nodes/accessors/MaterialNode.js +2 -2
- package/examples/jsm/nodes/accessors/MaterialReferenceNode.js +2 -12
- package/examples/jsm/nodes/accessors/MorphNode.js +20 -10
- package/examples/jsm/nodes/accessors/NormalNode.js +12 -2
- package/examples/jsm/nodes/accessors/ReferenceNode.js +87 -29
- package/examples/jsm/nodes/accessors/RendererReferenceNode.js +29 -0
- package/examples/jsm/nodes/accessors/SkinningNode.js +31 -10
- package/examples/jsm/nodes/accessors/StorageBufferNode.js +18 -0
- package/examples/jsm/nodes/accessors/TangentNode.js +8 -2
- package/examples/jsm/nodes/accessors/TextureNode.js +30 -7
- package/examples/jsm/nodes/accessors/UniformsNode.js +140 -0
- package/examples/jsm/nodes/code/CodeNode.js +6 -0
- package/examples/jsm/nodes/core/AssignNode.js +68 -12
- package/examples/jsm/nodes/core/Node.js +67 -6
- package/examples/jsm/nodes/core/NodeBuilder.js +23 -24
- package/examples/jsm/nodes/core/NodeFrame.js +8 -8
- package/examples/jsm/nodes/core/NodeUtils.js +2 -2
- package/examples/jsm/nodes/core/TempNode.js +1 -1
- package/examples/jsm/nodes/core/UniformNode.js +20 -0
- package/examples/jsm/nodes/display/BlendModeNode.js +30 -1
- package/examples/jsm/nodes/display/NormalMapNode.js +3 -5
- package/examples/jsm/nodes/display/PassNode.js +17 -1
- package/examples/jsm/nodes/display/ToneMappingNode.js +8 -4
- package/examples/jsm/nodes/display/ViewportSharedTextureNode.js +6 -0
- package/examples/jsm/nodes/fog/FogExp2Node.js +4 -5
- package/examples/jsm/nodes/fog/FogNode.js +13 -3
- package/examples/jsm/nodes/fog/FogRangeNode.js +4 -3
- package/examples/jsm/nodes/lighting/AnalyticLightNode.js +1 -1
- package/examples/jsm/nodes/lighting/EnvironmentNode.js +12 -69
- package/examples/jsm/nodes/materials/NodeMaterial.js +70 -17
- package/examples/jsm/nodes/math/CondNode.js +42 -7
- package/examples/jsm/nodes/math/MathNode.js +20 -0
- package/examples/jsm/nodes/pmrem/PMREMNode.js +193 -0
- package/examples/jsm/nodes/pmrem/PMREMUtils.js +288 -0
- package/examples/jsm/nodes/shadernode/ShaderNode.js +1 -1
- package/examples/jsm/nodes/utils/ArrayElementNode.js +0 -6
- package/examples/jsm/nodes/utils/EquirectUVNode.js +1 -1
- package/examples/jsm/nodes/utils/LoopNode.js +2 -0
- package/examples/jsm/nodes/utils/StorageArrayElementNode.js +91 -0
- package/examples/jsm/objects/QuadMesh.js +7 -23
- package/examples/jsm/physics/RapierPhysics.js +4 -4
- package/examples/jsm/postprocessing/GlitchPass.js +0 -3
- package/examples/jsm/postprocessing/LUTPass.js +5 -71
- package/examples/jsm/postprocessing/OutputPass.js +2 -0
- package/examples/jsm/postprocessing/SAOPass.js +0 -1
- package/examples/jsm/postprocessing/SSAOPass.js +0 -3
- package/examples/jsm/renderers/common/Animation.js +3 -0
- package/examples/jsm/renderers/common/Background.js +3 -3
- package/examples/jsm/renderers/common/ClippingContext.js +165 -0
- package/examples/jsm/renderers/common/Info.js +11 -19
- package/examples/jsm/renderers/common/PostProcessing.js +12 -4
- package/examples/jsm/renderers/common/RenderContext.js +3 -1
- package/examples/jsm/renderers/common/RenderContexts.js +2 -13
- package/examples/jsm/renderers/common/RenderObject.js +46 -3
- package/examples/jsm/renderers/common/RenderObjects.js +2 -0
- package/examples/jsm/renderers/common/Renderer.js +113 -39
- package/examples/jsm/renderers/common/StorageBufferAttribute.js +2 -2
- package/examples/jsm/renderers/common/StorageInstancedBufferAttribute.js +17 -0
- package/examples/jsm/renderers/common/Textures.js +3 -13
- package/examples/jsm/renderers/common/UniformsGroup.js +6 -4
- package/examples/jsm/renderers/common/extras/PMREMGenerator.js +777 -0
- package/examples/jsm/renderers/common/nodes/NodeStorageBuffer.js +23 -0
- package/examples/jsm/renderers/common/nodes/NodeUniformBuffer.js +23 -0
- package/examples/jsm/renderers/common/nodes/Nodes.js +6 -18
- package/examples/jsm/renderers/webgl/WebGLBackend.js +174 -30
- package/examples/jsm/renderers/webgl/WebGLBufferRenderer.js +141 -0
- package/examples/jsm/renderers/webgl/nodes/GLSLNodeBuilder.js +136 -11
- package/examples/jsm/renderers/webgl/utils/WebGLAttributeUtils.js +8 -2
- package/examples/jsm/renderers/webgl/utils/WebGLConstants.js +1 -0
- package/examples/jsm/renderers/webgl/utils/WebGLTextureUtils.js +90 -0
- package/examples/jsm/renderers/webgl/utils/WebGLUtils.js +3 -1
- package/examples/jsm/renderers/webgl-legacy/nodes/GLSL1NodeBuilder.js +0 -2
- package/examples/jsm/renderers/webgl-legacy/nodes/WebGLNodeBuilder.js +0 -2
- package/examples/jsm/renderers/webgpu/WebGPUBackend.js +67 -37
- package/examples/jsm/renderers/webgpu/nodes/WGSLNodeBuilder.js +20 -43
- package/examples/jsm/renderers/webgpu/utils/WebGPUAttributeUtils.js +32 -1
- package/examples/jsm/renderers/webgpu/utils/WebGPUBindingUtils.js +18 -4
- package/examples/jsm/renderers/webgpu/utils/WebGPUTextureUtils.js +94 -20
- package/examples/jsm/shaders/OutputShader.js +4 -0
- package/examples/jsm/utils/GPUStatsPanel.js +10 -45
- package/examples/jsm/utils/SkeletonUtils.js +14 -3
- package/examples/jsm/utils/TextureUtils.js +1 -1
- package/examples/jsm/webxr/VRButton.js +13 -5
- package/examples/jsm/webxr/XRButton.js +0 -1
- package/examples/jsm/webxr/XRControllerModelFactory.js +8 -0
- package/package.json +4 -3
- package/src/Three.Legacy.js +20 -0
- package/src/Three.js +0 -2
- package/src/animation/AnimationClip.js +1 -1
- package/src/constants.js +4 -7
- package/src/core/BufferAttribute.js +0 -11
- package/src/core/BufferGeometry.js +23 -29
- package/src/core/Object3D.js +21 -7
- package/src/core/Raycaster.js +18 -4
- package/src/core/RenderTarget.js +44 -21
- package/src/extras/PMREMGenerator.js +11 -0
- package/src/extras/curves/EllipseCurve.js +2 -2
- package/src/helpers/SpotLightHelper.js +18 -1
- package/src/loaders/DataTextureLoader.js +0 -4
- package/src/loaders/MaterialLoader.js +1 -0
- package/src/loaders/ObjectLoader.js +4 -1
- package/src/materials/Material.js +2 -1
- package/src/materials/MeshBasicMaterial.js +3 -0
- package/src/materials/MeshLambertMaterial.js +3 -0
- package/src/materials/MeshPhongMaterial.js +3 -0
- package/src/materials/MeshStandardMaterial.js +3 -0
- package/src/materials/ShaderMaterial.js +0 -4
- package/src/math/Quaternion.js +13 -12
- package/src/math/Spherical.js +4 -5
- package/src/math/Vector3.js +7 -7
- package/src/objects/BatchedMesh.js +4 -3
- package/src/objects/InstancedMesh.js +63 -0
- package/src/objects/Mesh.js +0 -1
- package/src/renderers/WebGLCubeRenderTarget.js +1 -10
- package/src/renderers/WebGLRenderer.js +70 -136
- package/src/renderers/shaders/ShaderChunk/envmap_common_pars_fragment.glsl.js +1 -0
- package/src/renderers/shaders/ShaderChunk/envmap_fragment.glsl.js +1 -1
- package/src/renderers/shaders/ShaderChunk/envmap_physical_pars_fragment.glsl.js +2 -2
- package/src/renderers/shaders/ShaderChunk/logdepthbuf_fragment.glsl.js +2 -2
- package/src/renderers/shaders/ShaderChunk/logdepthbuf_pars_fragment.glsl.js +1 -1
- package/src/renderers/shaders/ShaderChunk/logdepthbuf_pars_vertex.glsl.js +2 -10
- package/src/renderers/shaders/ShaderChunk/logdepthbuf_vertex.glsl.js +2 -16
- package/src/renderers/shaders/ShaderChunk/map_fragment.glsl.js +1 -1
- package/src/renderers/shaders/ShaderChunk/morphinstance_vertex.glsl.js +14 -0
- package/src/renderers/shaders/ShaderChunk/morphtarget_pars_vertex.glsl.js +11 -2
- package/src/renderers/shaders/ShaderChunk/shadowmap_pars_fragment.glsl.js +32 -22
- package/src/renderers/shaders/ShaderChunk/tonemapping_pars_fragment.glsl.js +23 -0
- package/src/renderers/shaders/ShaderChunk.js +2 -0
- package/src/renderers/shaders/ShaderLib/backgroundCube.glsl.js +3 -2
- package/src/renderers/shaders/ShaderLib/depth.glsl.js +2 -0
- package/src/renderers/shaders/ShaderLib/distanceRGBA.glsl.js +2 -0
- package/src/renderers/shaders/ShaderLib/linedashed.glsl.js +1 -0
- package/src/renderers/shaders/ShaderLib/meshbasic.glsl.js +1 -0
- package/src/renderers/shaders/ShaderLib/meshlambert.glsl.js +1 -0
- package/src/renderers/shaders/ShaderLib/meshmatcap.glsl.js +1 -0
- package/src/renderers/shaders/ShaderLib/meshnormal.glsl.js +1 -0
- package/src/renderers/shaders/ShaderLib/meshphong.glsl.js +1 -0
- package/src/renderers/shaders/ShaderLib/meshphysical.glsl.js +1 -0
- package/src/renderers/shaders/ShaderLib/meshtoon.glsl.js +1 -0
- package/src/renderers/shaders/ShaderLib/points.glsl.js +1 -0
- package/src/renderers/shaders/ShaderLib/shadow.glsl.js +1 -0
- package/src/renderers/shaders/ShaderLib.js +3 -2
- package/src/renderers/shaders/UniformsLib.js +1 -0
- package/src/renderers/shaders/UniformsUtils.js +10 -1
- package/src/renderers/webgl/WebGLAttributes.js +6 -33
- package/src/renderers/webgl/WebGLBackground.js +18 -0
- package/src/renderers/webgl/WebGLBindingStates.js +14 -51
- package/src/renderers/webgl/WebGLBufferRenderer.js +3 -25
- package/src/renderers/webgl/WebGLCapabilities.js +2 -12
- package/src/renderers/webgl/WebGLCubeUVMaps.js +10 -6
- package/src/renderers/webgl/WebGLExtensions.js +4 -19
- package/src/renderers/webgl/WebGLIndexedBufferRenderer.js +3 -25
- package/src/renderers/webgl/WebGLLights.js +6 -32
- package/src/renderers/webgl/WebGLMaterials.js +26 -4
- package/src/renderers/webgl/WebGLMorphtargets.js +79 -210
- package/src/renderers/webgl/WebGLProgram.js +30 -48
- package/src/renderers/webgl/WebGLPrograms.js +5 -14
- package/src/renderers/webgl/WebGLRenderStates.js +8 -6
- package/src/renderers/webgl/WebGLState.js +21 -75
- package/src/renderers/webgl/WebGLTextures.js +143 -275
- package/src/renderers/webgl/WebGLUniformsGroups.js +1 -1
- package/src/renderers/webgl/WebGLUtils.js +6 -57
- package/src/renderers/webxr/WebXRDepthSensing.js +2 -3
- package/src/renderers/webxr/WebXRManager.js +2 -2
- package/src/scenes/Scene.js +14 -0
- package/src/textures/Texture.js +6 -24
- package/examples/jsm/nodes/core/ArrayUniformNode.js +0 -26
- package/examples/jsm/nodes/utils/SpecularMIPLevelNode.js +0 -37
- package/src/renderers/WebGL1Renderer.js +0 -7
- package/src/renderers/WebGLMultipleRenderTargets.js +0 -82
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import StorageBuffer from '../StorageBuffer.js';
|
|
2
|
+
|
|
3
|
+
let _id = 0;
|
|
4
|
+
|
|
5
|
+
class NodeStorageBuffer extends StorageBuffer {
|
|
6
|
+
|
|
7
|
+
constructor( nodeUniform ) {
|
|
8
|
+
|
|
9
|
+
super( 'StorageBuffer_' + _id ++, nodeUniform ? nodeUniform.value : null );
|
|
10
|
+
|
|
11
|
+
this.nodeUniform = nodeUniform;
|
|
12
|
+
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
get buffer() {
|
|
16
|
+
|
|
17
|
+
return this.nodeUniform.value;
|
|
18
|
+
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export default NodeStorageBuffer;
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import UniformBuffer from '../UniformBuffer.js';
|
|
2
|
+
|
|
3
|
+
let _id = 0;
|
|
4
|
+
|
|
5
|
+
class NodeUniformBuffer extends UniformBuffer {
|
|
6
|
+
|
|
7
|
+
constructor( nodeUniform ) {
|
|
8
|
+
|
|
9
|
+
super( 'UniformBuffer_' + _id ++, nodeUniform ? nodeUniform.value : null );
|
|
10
|
+
|
|
11
|
+
this.nodeUniform = nodeUniform;
|
|
12
|
+
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
get buffer() {
|
|
16
|
+
|
|
17
|
+
return this.nodeUniform.value;
|
|
18
|
+
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export default NodeUniformBuffer;
|
|
@@ -2,7 +2,7 @@ import DataMap from '../DataMap.js';
|
|
|
2
2
|
import ChainMap from '../ChainMap.js';
|
|
3
3
|
import NodeBuilderState from './NodeBuilderState.js';
|
|
4
4
|
import { NoToneMapping, EquirectangularReflectionMapping, EquirectangularRefractionMapping } from 'three';
|
|
5
|
-
import { NodeFrame, objectGroup, renderGroup, frameGroup, cubeTexture, texture, rangeFog, densityFog, reference, toneMapping,
|
|
5
|
+
import { NodeFrame, objectGroup, renderGroup, frameGroup, cubeTexture, texture, rangeFog, densityFog, reference, toneMapping, viewportBottomLeft, normalWorld, pmremTexture } from '../../../nodes/Nodes.js';
|
|
6
6
|
|
|
7
7
|
class Nodes extends DataMap {
|
|
8
8
|
|
|
@@ -114,6 +114,7 @@ class Nodes extends DataMap {
|
|
|
114
114
|
nodeBuilder.environmentNode = this.getEnvironmentNode( renderObject.scene );
|
|
115
115
|
nodeBuilder.fogNode = this.getFogNode( renderObject.scene );
|
|
116
116
|
nodeBuilder.toneMappingNode = this.getToneMappingNode();
|
|
117
|
+
nodeBuilder.clippingContext = renderObject.clippingContext;
|
|
117
118
|
nodeBuilder.build();
|
|
118
119
|
|
|
119
120
|
nodeBuilderState = this._createNodeBuilderState( nodeBuilder );
|
|
@@ -274,7 +275,7 @@ class Nodes extends DataMap {
|
|
|
274
275
|
|
|
275
276
|
if ( rendererData.toneMapping !== rendererToneMapping ) {
|
|
276
277
|
|
|
277
|
-
const rendererToneMappingNode = rendererData.rendererToneMappingNode || toneMapping( rendererToneMapping
|
|
278
|
+
const rendererToneMappingNode = rendererData.rendererToneMappingNode || toneMapping( rendererToneMapping );
|
|
278
279
|
rendererToneMappingNode.toneMapping = rendererToneMapping;
|
|
279
280
|
|
|
280
281
|
rendererData.rendererToneMappingNode = rendererToneMappingNode;
|
|
@@ -304,26 +305,13 @@ class Nodes extends DataMap {
|
|
|
304
305
|
|
|
305
306
|
let backgroundNode = null;
|
|
306
307
|
|
|
307
|
-
if ( background.isCubeTexture === true ) {
|
|
308
|
+
if ( background.isCubeTexture === true || ( background.mapping === EquirectangularReflectionMapping || background.mapping === EquirectangularRefractionMapping ) ) {
|
|
308
309
|
|
|
309
|
-
backgroundNode =
|
|
310
|
+
backgroundNode = pmremTexture( background, normalWorld );
|
|
310
311
|
|
|
311
312
|
} else if ( background.isTexture === true ) {
|
|
312
313
|
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
if ( background.mapping === EquirectangularReflectionMapping || background.mapping === EquirectangularRefractionMapping ) {
|
|
316
|
-
|
|
317
|
-
nodeUV = equirectUV();
|
|
318
|
-
background.flipY = false;
|
|
319
|
-
|
|
320
|
-
} else {
|
|
321
|
-
|
|
322
|
-
nodeUV = viewportBottomLeft;
|
|
323
|
-
|
|
324
|
-
}
|
|
325
|
-
|
|
326
|
-
backgroundNode = texture( background, nodeUV ).setUpdateMatrix( true );
|
|
314
|
+
backgroundNode = texture( background, viewportBottomLeft ).setUpdateMatrix( true );
|
|
327
315
|
|
|
328
316
|
} else if ( background.isColor !== true ) {
|
|
329
317
|
|
|
@@ -10,6 +10,7 @@ import WebGLTextureUtils from './utils/WebGLTextureUtils.js';
|
|
|
10
10
|
import WebGLExtensions from './utils/WebGLExtensions.js';
|
|
11
11
|
import WebGLCapabilities from './utils/WebGLCapabilities.js';
|
|
12
12
|
import { GLFeatureName } from './utils/WebGLConstants.js';
|
|
13
|
+
import { WebGLBufferRenderer } from './WebGLBufferRenderer.js';
|
|
13
14
|
|
|
14
15
|
//
|
|
15
16
|
|
|
@@ -39,14 +40,18 @@ class WebGLBackend extends Backend {
|
|
|
39
40
|
this.capabilities = new WebGLCapabilities( this );
|
|
40
41
|
this.attributeUtils = new WebGLAttributeUtils( this );
|
|
41
42
|
this.textureUtils = new WebGLTextureUtils( this );
|
|
43
|
+
this.bufferRenderer = new WebGLBufferRenderer( this );
|
|
44
|
+
|
|
42
45
|
this.state = new WebGLState( this );
|
|
43
46
|
this.utils = new WebGLUtils( this );
|
|
44
47
|
|
|
45
48
|
this.vaoCache = {};
|
|
46
49
|
this.transformFeedbackCache = {};
|
|
47
50
|
this.discard = false;
|
|
51
|
+
this.trackTimestamp = ( parameters.trackTimestamp === true );
|
|
48
52
|
|
|
49
53
|
this.extensions.get( 'EXT_color_buffer_float' );
|
|
54
|
+
this.disjoint = this.extensions.get( 'EXT_disjoint_timer_query_webgl2' );
|
|
50
55
|
this.parallel = this.extensions.get( 'KHR_parallel_shader_compile' );
|
|
51
56
|
this._currentContext = null;
|
|
52
57
|
|
|
@@ -64,6 +69,96 @@ class WebGLBackend extends Backend {
|
|
|
64
69
|
|
|
65
70
|
}
|
|
66
71
|
|
|
72
|
+
|
|
73
|
+
initTimestampQuery( renderContext ) {
|
|
74
|
+
|
|
75
|
+
if ( ! this.disjoint || ! this.trackTimestamp ) return;
|
|
76
|
+
|
|
77
|
+
const renderContextData = this.get( renderContext );
|
|
78
|
+
|
|
79
|
+
if ( this.queryRunning ) {
|
|
80
|
+
|
|
81
|
+
if ( ! renderContextData.queryQueue ) renderContextData.queryQueue = [];
|
|
82
|
+
renderContextData.queryQueue.push( renderContext );
|
|
83
|
+
return;
|
|
84
|
+
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
if ( renderContextData.activeQuery ) {
|
|
88
|
+
|
|
89
|
+
this.gl.endQuery( this.disjoint.TIME_ELAPSED_EXT );
|
|
90
|
+
renderContextData.activeQuery = null;
|
|
91
|
+
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
renderContextData.activeQuery = this.gl.createQuery();
|
|
95
|
+
|
|
96
|
+
if ( renderContextData.activeQuery !== null ) {
|
|
97
|
+
|
|
98
|
+
this.gl.beginQuery( this.disjoint.TIME_ELAPSED_EXT, renderContextData.activeQuery );
|
|
99
|
+
this.queryRunning = true;
|
|
100
|
+
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
// timestamp utils
|
|
106
|
+
|
|
107
|
+
prepareTimestampBuffer( renderContext ) {
|
|
108
|
+
|
|
109
|
+
if ( ! this.disjoint || ! this.trackTimestamp ) return;
|
|
110
|
+
|
|
111
|
+
const renderContextData = this.get( renderContext );
|
|
112
|
+
|
|
113
|
+
if ( renderContextData.activeQuery ) {
|
|
114
|
+
|
|
115
|
+
this.gl.endQuery( this.disjoint.TIME_ELAPSED_EXT );
|
|
116
|
+
|
|
117
|
+
if ( ! renderContextData.gpuQueries ) renderContextData.gpuQueries = [];
|
|
118
|
+
renderContextData.gpuQueries.push( { query: renderContextData.activeQuery } );
|
|
119
|
+
renderContextData.activeQuery = null;
|
|
120
|
+
this.queryRunning = false;
|
|
121
|
+
|
|
122
|
+
if ( renderContextData.queryQueue && renderContextData.queryQueue.length > 0 ) {
|
|
123
|
+
|
|
124
|
+
const nextRenderContext = renderContextData.queryQueue.shift();
|
|
125
|
+
this.initTimestampQuery( nextRenderContext );
|
|
126
|
+
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
async resolveTimestampAsync( renderContext, type = 'render' ) {
|
|
134
|
+
|
|
135
|
+
if ( ! this.disjoint || ! this.trackTimestamp ) return;
|
|
136
|
+
|
|
137
|
+
const renderContextData = this.get( renderContext );
|
|
138
|
+
|
|
139
|
+
if ( ! renderContextData.gpuQueries ) renderContextData.gpuQueries = [];
|
|
140
|
+
|
|
141
|
+
for ( let i = 0; i < renderContextData.gpuQueries.length; i ++ ) {
|
|
142
|
+
|
|
143
|
+
const queryInfo = renderContextData.gpuQueries[ i ];
|
|
144
|
+
const available = this.gl.getQueryParameter( queryInfo.query, this.gl.QUERY_RESULT_AVAILABLE );
|
|
145
|
+
const disjoint = this.gl.getParameter( this.disjoint.GPU_DISJOINT_EXT );
|
|
146
|
+
|
|
147
|
+
if ( available && ! disjoint ) {
|
|
148
|
+
|
|
149
|
+
const elapsed = this.gl.getQueryParameter( queryInfo.query, this.gl.QUERY_RESULT );
|
|
150
|
+
const duration = Number( elapsed ) / 1000000; // Convert nanoseconds to milliseconds
|
|
151
|
+
this.gl.deleteQuery( queryInfo.query );
|
|
152
|
+
renderContextData.gpuQueries.splice( i, 1 ); // Remove the processed query
|
|
153
|
+
i --;
|
|
154
|
+
this.renderer.info.updateTimestamp( type, duration );
|
|
155
|
+
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
}
|
|
161
|
+
|
|
67
162
|
getContext() {
|
|
68
163
|
|
|
69
164
|
return this.gl;
|
|
@@ -78,13 +173,14 @@ class WebGLBackend extends Backend {
|
|
|
78
173
|
//
|
|
79
174
|
|
|
80
175
|
//
|
|
176
|
+
this.initTimestampQuery( renderContext );
|
|
81
177
|
|
|
82
178
|
renderContextData.previousContext = this._currentContext;
|
|
83
179
|
this._currentContext = renderContext;
|
|
84
180
|
|
|
85
181
|
this._setFramebuffer( renderContext );
|
|
86
182
|
|
|
87
|
-
this.clear( renderContext.clearColor, renderContext.clearDepth, renderContext.clearStencil, renderContext );
|
|
183
|
+
this.clear( renderContext.clearColor, renderContext.clearDepth, renderContext.clearStencil, renderContext, false );
|
|
88
184
|
|
|
89
185
|
//
|
|
90
186
|
if ( renderContext.viewport ) {
|
|
@@ -219,6 +315,7 @@ class WebGLBackend extends Backend {
|
|
|
219
315
|
|
|
220
316
|
}
|
|
221
317
|
|
|
318
|
+
this.prepareTimestampBuffer( renderContext );
|
|
222
319
|
|
|
223
320
|
}
|
|
224
321
|
|
|
@@ -313,7 +410,7 @@ class WebGLBackend extends Backend {
|
|
|
313
410
|
|
|
314
411
|
}
|
|
315
412
|
|
|
316
|
-
clear( color, depth, stencil, descriptor = null ) {
|
|
413
|
+
clear( color, depth, stencil, descriptor = null, setFrameBuffer = true ) {
|
|
317
414
|
|
|
318
415
|
const { gl } = this;
|
|
319
416
|
|
|
@@ -336,7 +433,7 @@ class WebGLBackend extends Backend {
|
|
|
336
433
|
|
|
337
434
|
if ( clear !== 0 ) {
|
|
338
435
|
|
|
339
|
-
const clearColor = descriptor.clearColorValue;
|
|
436
|
+
const clearColor = descriptor.clearColorValue || this.getClearColor();
|
|
340
437
|
|
|
341
438
|
if ( depth ) this.state.setDepthMask( true );
|
|
342
439
|
|
|
@@ -347,6 +444,8 @@ class WebGLBackend extends Backend {
|
|
|
347
444
|
|
|
348
445
|
} else {
|
|
349
446
|
|
|
447
|
+
if ( setFrameBuffer ) this._setFramebuffer( descriptor );
|
|
448
|
+
|
|
350
449
|
if ( color ) {
|
|
351
450
|
|
|
352
451
|
for ( let i = 0; i < descriptor.textures.length; i ++ ) {
|
|
@@ -377,11 +476,12 @@ class WebGLBackend extends Backend {
|
|
|
377
476
|
|
|
378
477
|
}
|
|
379
478
|
|
|
380
|
-
beginCompute(
|
|
479
|
+
beginCompute( computeGroup ) {
|
|
381
480
|
|
|
382
481
|
const gl = this.gl;
|
|
383
482
|
|
|
384
483
|
gl.bindFramebuffer( gl.FRAMEBUFFER, null );
|
|
484
|
+
this.initTimestampQuery( computeGroup );
|
|
385
485
|
|
|
386
486
|
}
|
|
387
487
|
|
|
@@ -422,21 +522,39 @@ class WebGLBackend extends Backend {
|
|
|
422
522
|
gl.bindTransformFeedback( gl.TRANSFORM_FEEDBACK, transformFeedbackGPU );
|
|
423
523
|
gl.beginTransformFeedback( gl.POINTS );
|
|
424
524
|
|
|
425
|
-
|
|
525
|
+
if ( attributes[ 0 ].isStorageInstancedBufferAttribute ) {
|
|
526
|
+
|
|
527
|
+
gl.drawArraysInstanced( gl.POINTS, 0, 1, computeNode.count );
|
|
528
|
+
|
|
529
|
+
} else {
|
|
530
|
+
|
|
531
|
+
gl.drawArrays( gl.POINTS, 0, computeNode.count );
|
|
532
|
+
|
|
533
|
+
}
|
|
426
534
|
|
|
427
535
|
gl.endTransformFeedback();
|
|
428
536
|
gl.bindTransformFeedback( gl.TRANSFORM_FEEDBACK, null );
|
|
429
537
|
|
|
430
538
|
// switch active buffers
|
|
539
|
+
|
|
431
540
|
for ( let i = 0; i < transformBuffers.length; i ++ ) {
|
|
432
541
|
|
|
433
|
-
transformBuffers[ i ]
|
|
542
|
+
const dualAttributeData = transformBuffers[ i ];
|
|
543
|
+
|
|
544
|
+
if ( dualAttributeData.pbo ) {
|
|
545
|
+
|
|
546
|
+
this.textureUtils.copyBufferToTexture( dualAttributeData.transformBuffer, dualAttributeData.pbo );
|
|
547
|
+
|
|
548
|
+
}
|
|
549
|
+
|
|
550
|
+
dualAttributeData.switchBuffers();
|
|
551
|
+
|
|
434
552
|
|
|
435
553
|
}
|
|
436
554
|
|
|
437
555
|
}
|
|
438
556
|
|
|
439
|
-
finishCompute(
|
|
557
|
+
finishCompute( computeGroup ) {
|
|
440
558
|
|
|
441
559
|
const gl = this.gl;
|
|
442
560
|
|
|
@@ -444,6 +562,8 @@ class WebGLBackend extends Backend {
|
|
|
444
562
|
|
|
445
563
|
gl.disable( gl.RASTERIZER_DISCARD );
|
|
446
564
|
|
|
565
|
+
this.prepareTimestampBuffer( computeGroup );
|
|
566
|
+
|
|
447
567
|
}
|
|
448
568
|
|
|
449
569
|
draw( renderObject, info ) {
|
|
@@ -527,21 +647,22 @@ class WebGLBackend extends Backend {
|
|
|
527
647
|
|
|
528
648
|
//
|
|
529
649
|
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
else if ( object.
|
|
534
|
-
else if ( object.
|
|
650
|
+
const renderer = this.bufferRenderer;
|
|
651
|
+
|
|
652
|
+
if ( object.isPoints ) renderer.mode = gl.POINTS;
|
|
653
|
+
else if ( object.isLineSegments ) renderer.mode = gl.LINES;
|
|
654
|
+
else if ( object.isLine ) renderer.mode = gl.LINE_STRIP;
|
|
655
|
+
else if ( object.isLineLoop ) renderer.mode = gl.LINE_LOOP;
|
|
535
656
|
else {
|
|
536
657
|
|
|
537
658
|
if ( material.wireframe === true ) {
|
|
538
659
|
|
|
539
660
|
state.setLineWidth( material.wireframeLinewidth * this.renderer.getPixelRatio() );
|
|
540
|
-
mode = gl.LINES;
|
|
661
|
+
renderer.mode = gl.LINES;
|
|
541
662
|
|
|
542
663
|
} else {
|
|
543
664
|
|
|
544
|
-
mode = gl.TRIANGLES;
|
|
665
|
+
renderer.mode = gl.TRIANGLES;
|
|
545
666
|
|
|
546
667
|
}
|
|
547
668
|
|
|
@@ -549,46 +670,63 @@ class WebGLBackend extends Backend {
|
|
|
549
670
|
|
|
550
671
|
//
|
|
551
672
|
|
|
552
|
-
|
|
673
|
+
|
|
674
|
+
let count;
|
|
675
|
+
|
|
676
|
+
renderer.object = object;
|
|
553
677
|
|
|
554
678
|
if ( index !== null ) {
|
|
555
679
|
|
|
556
680
|
const indexData = this.get( index );
|
|
557
681
|
const indexCount = ( drawRange.count !== Infinity ) ? drawRange.count : index.count;
|
|
558
682
|
|
|
559
|
-
|
|
683
|
+
renderer.index = index.count;
|
|
684
|
+
renderer.type = indexData.type;
|
|
560
685
|
|
|
561
|
-
|
|
686
|
+
count = indexCount;
|
|
562
687
|
|
|
563
|
-
|
|
688
|
+
} else {
|
|
564
689
|
|
|
565
|
-
|
|
690
|
+
renderer.index = 0;
|
|
566
691
|
|
|
567
|
-
|
|
692
|
+
const vertexCount = ( drawRange.count !== Infinity ) ? drawRange.count : geometry.attributes.position.count;
|
|
568
693
|
|
|
569
|
-
|
|
694
|
+
count = vertexCount;
|
|
570
695
|
|
|
571
|
-
}
|
|
696
|
+
}
|
|
697
|
+
|
|
698
|
+
const instanceCount = this.getInstanceCount( renderObject );
|
|
572
699
|
|
|
573
|
-
|
|
574
|
-
const vertexCount = ( drawRange.count !== Infinity ) ? drawRange.count : positionAttribute.count;
|
|
700
|
+
if ( object.isBatchedMesh ) {
|
|
575
701
|
|
|
576
702
|
if ( instanceCount > 1 ) {
|
|
577
703
|
|
|
578
|
-
|
|
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 );
|
|
712
|
+
|
|
713
|
+
renderer.renderMultiDrawInstances( object._multiDrawStarts, object._multiDrawCounts, object._multiDrawCount, object._multiDrawInstances );
|
|
579
714
|
|
|
580
715
|
} else {
|
|
581
716
|
|
|
582
|
-
|
|
717
|
+
renderer.renderMultiDraw( object._multiDrawStarts, object._multiDrawCounts, object._multiDrawCount );
|
|
583
718
|
|
|
584
719
|
}
|
|
585
720
|
|
|
586
|
-
|
|
721
|
+
} else if ( instanceCount > 1 ) {
|
|
587
722
|
|
|
588
|
-
|
|
723
|
+
renderer.renderInstances( firstVertex, count, instanceCount );
|
|
589
724
|
|
|
590
|
-
}
|
|
725
|
+
} else {
|
|
726
|
+
|
|
727
|
+
renderer.render( firstVertex, count );
|
|
591
728
|
|
|
729
|
+
}
|
|
592
730
|
//
|
|
593
731
|
|
|
594
732
|
gl.bindVertexArray( null );
|
|
@@ -1007,6 +1145,12 @@ class WebGLBackend extends Backend {
|
|
|
1007
1145
|
|
|
1008
1146
|
}
|
|
1009
1147
|
|
|
1148
|
+
copyTextureToTexture( position, srcTexture, dstTexture, level ) {
|
|
1149
|
+
|
|
1150
|
+
this.textureUtils.copyTextureToTexture( position, srcTexture, dstTexture, level );
|
|
1151
|
+
|
|
1152
|
+
}
|
|
1153
|
+
|
|
1010
1154
|
copyFramebufferToTexture( texture, renderContext ) {
|
|
1011
1155
|
|
|
1012
1156
|
this.textureUtils.copyFramebufferToTexture( texture, renderContext );
|
|
@@ -1222,7 +1366,7 @@ class WebGLBackend extends Backend {
|
|
|
1222
1366
|
gl.bindBuffer( gl.ARRAY_BUFFER, attributeData.bufferGPU );
|
|
1223
1367
|
gl.enableVertexAttribArray( i );
|
|
1224
1368
|
|
|
1225
|
-
if ( attribute.isStorageBufferAttribute ) staticVao = false;
|
|
1369
|
+
if ( attribute.isStorageBufferAttribute || attribute.isStorageInstancedBufferAttribute ) staticVao = false;
|
|
1226
1370
|
|
|
1227
1371
|
let stride, offset;
|
|
1228
1372
|
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
class WebGLBufferRenderer {
|
|
2
|
+
|
|
3
|
+
constructor( backend ) {
|
|
4
|
+
|
|
5
|
+
this.gl = backend.gl;
|
|
6
|
+
this.extensions = backend.extensions;
|
|
7
|
+
this.info = backend.renderer.info;
|
|
8
|
+
this.mode = null;
|
|
9
|
+
this.index = 0;
|
|
10
|
+
this.type = null;
|
|
11
|
+
this.object = null;
|
|
12
|
+
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
render( start, count ) {
|
|
16
|
+
|
|
17
|
+
const { gl, mode, object, type, info, index } = this;
|
|
18
|
+
|
|
19
|
+
if ( index !== 0 ) {
|
|
20
|
+
|
|
21
|
+
gl.drawElements( mode, count, type, start );
|
|
22
|
+
|
|
23
|
+
} else {
|
|
24
|
+
|
|
25
|
+
gl.drawArrays( mode, start, count );
|
|
26
|
+
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
info.update( object, count, mode, 1 );
|
|
30
|
+
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
renderInstances( start, count, primcount ) {
|
|
34
|
+
|
|
35
|
+
const { gl, mode, type, index, object, info } = this;
|
|
36
|
+
|
|
37
|
+
if ( primcount === 0 ) return;
|
|
38
|
+
|
|
39
|
+
if ( index !== 0 ) {
|
|
40
|
+
|
|
41
|
+
gl.drawElementsInstanced( mode, count, type, start, primcount );
|
|
42
|
+
|
|
43
|
+
} else {
|
|
44
|
+
|
|
45
|
+
gl.drawArraysInstanced( mode, start, count, primcount );
|
|
46
|
+
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
info.update( object, count, mode, primcount );
|
|
50
|
+
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
renderMultiDraw( starts, counts, drawCount ) {
|
|
54
|
+
|
|
55
|
+
const { extensions, mode, object, info } = this;
|
|
56
|
+
|
|
57
|
+
if ( drawCount === 0 ) return;
|
|
58
|
+
|
|
59
|
+
const extension = extensions.get( 'WEBGL_multi_draw' );
|
|
60
|
+
|
|
61
|
+
if ( extension === null ) {
|
|
62
|
+
|
|
63
|
+
for ( let i = 0; i < drawCount; i ++ ) {
|
|
64
|
+
|
|
65
|
+
this.render( starts[ i ], counts[ i ] );
|
|
66
|
+
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
} else {
|
|
70
|
+
|
|
71
|
+
if ( this.index !== 0 ) {
|
|
72
|
+
|
|
73
|
+
extension.multiDrawElementsWEBGL( mode, counts, 0, this.type, starts, 0, drawCount );
|
|
74
|
+
|
|
75
|
+
} else {
|
|
76
|
+
|
|
77
|
+
extension.multiDrawArraysWEBGL( mode, starts, 0, counts, 0, drawCount );
|
|
78
|
+
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
let elementCount = 0;
|
|
82
|
+
for ( let i = 0; i < drawCount; i ++ ) {
|
|
83
|
+
|
|
84
|
+
elementCount += counts[ i ];
|
|
85
|
+
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
info.update( object, elementCount, mode, 1 );
|
|
89
|
+
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
renderMultiDrawInstances( starts, counts, drawCount, primcount ) {
|
|
95
|
+
|
|
96
|
+
const { extensions, mode, object, info } = this;
|
|
97
|
+
|
|
98
|
+
if ( drawCount === 0 ) return;
|
|
99
|
+
|
|
100
|
+
const extension = extensions.get( 'WEBGL_multi_draw' );
|
|
101
|
+
|
|
102
|
+
if ( extension === null ) {
|
|
103
|
+
|
|
104
|
+
for ( let i = 0; i < drawCount; i ++ ) {
|
|
105
|
+
|
|
106
|
+
this.renderInstances( starts[ i ], counts[ i ], primcount[ i ] );
|
|
107
|
+
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
} else {
|
|
111
|
+
|
|
112
|
+
if ( this.index !== 0 ) {
|
|
113
|
+
|
|
114
|
+
extension.multiDrawElementsInstancedWEBGL( mode, counts, 0, this.type, starts, 0, primcount, 0, drawCount );
|
|
115
|
+
|
|
116
|
+
} else {
|
|
117
|
+
|
|
118
|
+
extension.multiDrawArraysInstancedWEBGL( mode, starts, 0, counts, 0, primcount, 0, drawCount );
|
|
119
|
+
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
let elementCount = 0;
|
|
123
|
+
|
|
124
|
+
for ( let i = 0; i < drawCount; i ++ ) {
|
|
125
|
+
|
|
126
|
+
elementCount += counts[ i ];
|
|
127
|
+
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
info.update( object, elementCount, mode, primcount );
|
|
131
|
+
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
//
|
|
137
|
+
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
|
|
141
|
+
export { WebGLBufferRenderer };
|