super-three 0.162.0 → 0.164.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/three.cjs +847 -1226
- package/build/three.module.js +846 -1225
- package/build/three.module.min.js +2 -2
- package/examples/jsm/animation/CCDIKSolver.js +4 -2
- package/examples/jsm/controls/TransformControls.js +3 -3
- package/examples/jsm/exporters/GLTFExporter.js +66 -5
- package/examples/jsm/exporters/USDZExporter.js +22 -1
- package/examples/jsm/geometries/TextGeometry.js +10 -2
- package/examples/jsm/interactive/HTMLMesh.js +7 -9
- package/examples/jsm/libs/draco/README.md +2 -2
- package/examples/jsm/libs/fflate.module.js +694 -496
- package/examples/jsm/lines/LineMaterial.js +0 -2
- package/examples/jsm/loaders/3MFLoader.js +2 -0
- package/examples/jsm/loaders/EXRLoader.js +351 -97
- package/examples/jsm/loaders/FBXLoader.js +1 -1
- package/examples/jsm/loaders/GLTFLoader.js +59 -0
- package/examples/jsm/loaders/KTX2Loader.js +3 -10
- 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/VRMLLoader.js +1 -1
- package/examples/jsm/loaders/lwo/IFFParser.js +8 -5
- package/examples/jsm/materials/MeshGouraudMaterial.js +7 -1
- package/examples/jsm/math/Octree.js +26 -20
- package/examples/jsm/misc/GPUComputationRenderer.js +0 -6
- package/examples/jsm/nodes/Nodes.js +10 -4
- package/examples/jsm/nodes/accessors/AccessorsUtils.js +16 -1
- package/examples/jsm/nodes/accessors/BatchNode.js +78 -0
- package/examples/jsm/nodes/accessors/ClippingNode.js +3 -2
- package/examples/jsm/nodes/accessors/InstanceNode.js +25 -2
- package/examples/jsm/nodes/accessors/MaterialNode.js +107 -3
- package/examples/jsm/nodes/accessors/MaterialReferenceNode.js +1 -1
- package/examples/jsm/nodes/accessors/MorphNode.js +13 -3
- package/examples/jsm/nodes/accessors/NormalNode.js +12 -2
- package/examples/jsm/nodes/accessors/ReferenceNode.js +1 -1
- package/examples/jsm/nodes/accessors/RendererReferenceNode.js +29 -0
- package/examples/jsm/nodes/accessors/StorageBufferNode.js +9 -0
- package/examples/jsm/nodes/accessors/TextureNode.js +51 -10
- package/examples/jsm/nodes/accessors/TextureSizeNode.js +1 -1
- package/examples/jsm/nodes/code/FunctionNode.js +0 -8
- package/examples/jsm/nodes/core/Node.js +63 -4
- package/examples/jsm/nodes/core/NodeBuilder.js +26 -25
- package/examples/jsm/nodes/core/NodeFrame.js +10 -10
- package/examples/jsm/nodes/core/NodeUtils.js +2 -2
- package/examples/jsm/nodes/core/OutputStructNode.js +2 -1
- package/examples/jsm/nodes/core/PropertyNode.js +10 -0
- package/examples/jsm/nodes/core/UniformNode.js +20 -0
- package/examples/jsm/nodes/display/BumpMapNode.js +7 -26
- package/examples/jsm/nodes/display/FrontFacingNode.js +13 -0
- package/examples/jsm/nodes/display/PassNode.js +17 -1
- package/examples/jsm/nodes/display/ToneMappingNode.js +8 -4
- package/examples/jsm/nodes/display/ViewportDepthNode.js +1 -1
- package/examples/jsm/nodes/display/ViewportNode.js +4 -2
- package/examples/jsm/nodes/display/ViewportSharedTextureNode.js +6 -0
- package/examples/jsm/nodes/display/ViewportTextureNode.js +4 -1
- 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/functions/BSDF/BRDF_GGX.js +26 -7
- package/examples/jsm/nodes/functions/BSDF/D_GGX_Anisotropic.js +28 -0
- package/examples/jsm/nodes/functions/BSDF/V_GGX_SmithCorrelated.js +1 -3
- package/examples/jsm/nodes/functions/BSDF/V_GGX_SmithCorrelated_Anisotropic.js +29 -0
- package/examples/jsm/nodes/functions/PhongLightingModel.js +1 -1
- package/examples/jsm/nodes/functions/PhysicalLightingModel.js +164 -10
- package/examples/jsm/nodes/functions/ShadowMaskModel.js +31 -0
- package/examples/jsm/nodes/lighting/AnalyticLightNode.js +19 -5
- package/examples/jsm/nodes/lighting/DirectionalLightNode.js +2 -1
- package/examples/jsm/nodes/lighting/EnvironmentNode.js +22 -70
- package/examples/jsm/nodes/lighting/IrradianceNode.js +24 -0
- package/examples/jsm/nodes/lighting/LightsNode.js +11 -1
- package/examples/jsm/nodes/lighting/PointLightNode.js +2 -1
- package/examples/jsm/nodes/lighting/SpotLightNode.js +2 -1
- package/examples/jsm/nodes/materials/Line2NodeMaterial.js +10 -6
- package/examples/jsm/nodes/materials/Materials.js +1 -0
- package/examples/jsm/nodes/materials/MeshNormalNodeMaterial.js +0 -2
- package/examples/jsm/nodes/materials/MeshPhongNodeMaterial.js +2 -2
- package/examples/jsm/nodes/materials/MeshPhysicalNodeMaterial.js +76 -5
- package/examples/jsm/nodes/materials/MeshStandardNodeMaterial.js +11 -4
- package/examples/jsm/nodes/materials/NodeMaterial.js +55 -43
- package/examples/jsm/nodes/materials/ShadowNodeMaterial.js +34 -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 +3 -9
- package/examples/jsm/nodes/utils/EquirectUVNode.js +1 -1
- package/examples/jsm/objects/QuadMesh.js +7 -23
- package/examples/jsm/physics/JoltPhysics.js +281 -0
- 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/RenderTransitionPass.js +193 -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 +8 -8
- package/examples/jsm/renderers/common/ClippingContext.js +1 -1
- 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 +1 -1
- package/examples/jsm/renderers/common/RenderList.js +1 -1
- package/examples/jsm/renderers/common/RenderObject.js +47 -5
- package/examples/jsm/renderers/common/RenderObjects.js +1 -1
- package/examples/jsm/renderers/common/Renderer.js +153 -21
- package/examples/jsm/renderers/common/Textures.js +1 -1
- package/examples/jsm/renderers/common/extras/PMREMGenerator.js +773 -0
- package/examples/jsm/renderers/common/nodes/Nodes.js +34 -63
- package/examples/jsm/renderers/webgl/WebGLBackend.js +146 -36
- package/examples/jsm/renderers/webgl/WebGLBufferRenderer.js +145 -0
- package/examples/jsm/renderers/webgl/nodes/GLSLNodeBuilder.js +9 -3
- package/examples/jsm/renderers/webgl/utils/WebGLAttributeUtils.js +1 -1
- package/examples/jsm/renderers/webgl/utils/WebGLConstants.js +1 -0
- package/examples/jsm/renderers/webgl/utils/WebGLTextureUtils.js +64 -7
- package/examples/jsm/renderers/webgl/utils/WebGLUtils.js +6 -23
- package/examples/jsm/renderers/webgpu/WebGPUBackend.js +77 -60
- package/examples/jsm/renderers/webgpu/nodes/WGSLNodeBuilder.js +21 -4
- package/examples/jsm/renderers/webgpu/utils/WebGPUAttributeUtils.js +29 -1
- package/examples/jsm/renderers/webgpu/utils/WebGPUBindingUtils.js +18 -4
- package/examples/jsm/renderers/webgpu/utils/WebGPUTextureUtils.js +92 -18
- package/examples/jsm/transpiler/GLSLDecoder.js +1 -1
- package/examples/jsm/transpiler/ShaderToyDecoder.js +1 -1
- package/examples/jsm/utils/GPUStatsPanel.js +10 -45
- package/examples/jsm/utils/SceneUtils.js +60 -1
- package/examples/jsm/utils/TextureUtils.js +1 -1
- package/examples/jsm/webxr/OculusHandModel.js +3 -2
- package/examples/jsm/webxr/XRHandModelFactory.js +4 -2
- package/package.json +1 -1
- package/src/Three.js +0 -1
- package/src/animation/AnimationClip.js +1 -1
- package/src/constants.js +3 -3
- package/src/core/Object3D.js +10 -7
- package/src/core/RenderTarget.js +8 -0
- package/src/extras/PMREMGenerator.js +21 -11
- package/src/loaders/FileLoader.js +1 -1
- package/src/loaders/MaterialLoader.js +1 -0
- package/src/loaders/ObjectLoader.js +2 -0
- package/src/materials/Material.js +2 -0
- package/src/materials/MeshPhysicalMaterial.js +20 -0
- package/src/materials/ShaderMaterial.js +0 -4
- package/src/math/Spherical.js +4 -5
- package/src/objects/BatchedMesh.js +27 -3
- package/src/objects/InstancedMesh.js +10 -0
- package/src/objects/Line.js +66 -43
- package/src/renderers/WebGLRenderer.js +130 -158
- package/src/renderers/shaders/ShaderChunk/lights_physical_fragment.glsl.js +6 -0
- package/src/renderers/shaders/ShaderChunk/lights_physical_pars_fragment.glsl.js +1 -0
- package/src/renderers/shaders/ShaderChunk/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/shadowmap_pars_fragment.glsl.js +32 -22
- package/src/renderers/shaders/ShaderChunk/tonemapping_pars_fragment.glsl.js +17 -9
- package/src/renderers/shaders/ShaderChunk/transmission_fragment.glsl.js +1 -1
- package/src/renderers/shaders/ShaderChunk/transmission_pars_fragment.glsl.js +47 -13
- package/src/renderers/shaders/ShaderChunk.js +0 -2
- package/src/renderers/shaders/ShaderLib/meshphysical.glsl.js +4 -0
- package/src/renderers/shaders/ShaderLib.js +2 -1
- package/src/renderers/shaders/UniformsUtils.js +10 -1
- package/src/renderers/webgl/WebGLAttributes.js +6 -33
- package/src/renderers/webgl/WebGLBackground.js +18 -3
- package/src/renderers/webgl/WebGLBindingStates.js +14 -51
- package/src/renderers/webgl/WebGLBufferRenderer.js +35 -21
- package/src/renderers/webgl/WebGLCapabilities.js +35 -13
- package/src/renderers/webgl/WebGLCubeUVMaps.js +10 -6
- package/src/renderers/webgl/WebGLExtensions.js +4 -19
- package/src/renderers/webgl/WebGLIndexedBufferRenderer.js +35 -21
- package/src/renderers/webgl/WebGLLights.js +6 -32
- package/src/renderers/webgl/WebGLMaterials.js +8 -3
- package/src/renderers/webgl/WebGLMorphtargets.js +79 -217
- package/src/renderers/webgl/WebGLProgram.js +21 -52
- package/src/renderers/webgl/WebGLPrograms.js +24 -31
- package/src/renderers/webgl/WebGLRenderStates.js +13 -7
- package/src/renderers/webgl/WebGLShadowMap.js +25 -25
- package/src/renderers/webgl/WebGLState.js +15 -59
- package/src/renderers/webgl/WebGLTextures.js +138 -292
- package/src/renderers/webgl/WebGLUniformsGroups.js +1 -1
- package/src/renderers/webgl/WebGLUtils.js +9 -78
- package/src/renderers/webxr/WebXRDepthSensing.js +2 -3
- package/src/renderers/webxr/WebXRManager.js +4 -6
- package/src/scenes/Scene.js +7 -1
- package/src/textures/Texture.js +11 -1
- package/examples/jsm/nodes/utils/SpecularMIPLevelNode.js +0 -37
- package/examples/jsm/renderers/webgl-legacy/nodes/GLSL1NodeBuilder.js +0 -320
- package/examples/jsm/renderers/webgl-legacy/nodes/SlotNode.js +0 -26
- package/examples/jsm/renderers/webgl-legacy/nodes/WebGLNodeBuilder.js +0 -794
- package/examples/jsm/renderers/webgl-legacy/nodes/WebGLNodes.js +0 -51
- package/src/renderers/WebGL1Renderer.js +0 -7
- package/src/renderers/shaders/ShaderChunk/lightmap_fragment.glsl.js +0 -10
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import DataMap from '../DataMap.js';
|
|
2
2
|
import ChainMap from '../ChainMap.js';
|
|
3
3
|
import NodeBuilderState from './NodeBuilderState.js';
|
|
4
|
-
import {
|
|
5
|
-
import { NodeFrame, objectGroup, renderGroup, frameGroup, cubeTexture, texture, rangeFog, densityFog, reference,
|
|
4
|
+
import { EquirectangularReflectionMapping, EquirectangularRefractionMapping, NoToneMapping, SRGBColorSpace } from 'three';
|
|
5
|
+
import { NodeFrame, vec4, objectGroup, renderGroup, frameGroup, cubeTexture, texture, rangeFog, densityFog, reference, viewportBottomLeft, normalWorld, pmremTexture, viewportTopLeft } from '../../../nodes/Nodes.js';
|
|
6
6
|
|
|
7
7
|
class Nodes extends DataMap {
|
|
8
8
|
|
|
@@ -113,7 +113,6 @@ class Nodes extends DataMap {
|
|
|
113
113
|
nodeBuilder.lightsNode = renderObject.lightsNode;
|
|
114
114
|
nodeBuilder.environmentNode = this.getEnvironmentNode( renderObject.scene );
|
|
115
115
|
nodeBuilder.fogNode = this.getFogNode( renderObject.scene );
|
|
116
|
-
nodeBuilder.toneMappingNode = this.getToneMappingNode();
|
|
117
116
|
nodeBuilder.clippingContext = renderObject.clippingContext;
|
|
118
117
|
nodeBuilder.build();
|
|
119
118
|
|
|
@@ -206,14 +205,6 @@ class Nodes extends DataMap {
|
|
|
206
205
|
|
|
207
206
|
}
|
|
208
207
|
|
|
209
|
-
getToneMappingNode() {
|
|
210
|
-
|
|
211
|
-
if ( this.isToneMappingState === false ) return null;
|
|
212
|
-
|
|
213
|
-
return this.renderer.toneMappingNode || this.get( this.renderer ).toneMappingNode || null;
|
|
214
|
-
|
|
215
|
-
}
|
|
216
|
-
|
|
217
208
|
getCacheKey( scene, lightsNode ) {
|
|
218
209
|
|
|
219
210
|
const chain = [ scene, lightsNode ];
|
|
@@ -225,14 +216,12 @@ class Nodes extends DataMap {
|
|
|
225
216
|
|
|
226
217
|
const environmentNode = this.getEnvironmentNode( scene );
|
|
227
218
|
const fogNode = this.getFogNode( scene );
|
|
228
|
-
const toneMappingNode = this.getToneMappingNode();
|
|
229
219
|
|
|
230
220
|
const cacheKey = [];
|
|
231
221
|
|
|
232
222
|
if ( lightsNode ) cacheKey.push( lightsNode.getCacheKey() );
|
|
233
223
|
if ( environmentNode ) cacheKey.push( environmentNode.getCacheKey() );
|
|
234
224
|
if ( fogNode ) cacheKey.push( fogNode.getCacheKey() );
|
|
235
|
-
if ( toneMappingNode ) cacheKey.push( toneMappingNode.getCacheKey() );
|
|
236
225
|
|
|
237
226
|
cacheKeyData = {
|
|
238
227
|
callId,
|
|
@@ -252,45 +241,12 @@ class Nodes extends DataMap {
|
|
|
252
241
|
this.updateEnvironment( scene );
|
|
253
242
|
this.updateFog( scene );
|
|
254
243
|
this.updateBackground( scene );
|
|
255
|
-
this.updateToneMapping();
|
|
256
244
|
|
|
257
245
|
}
|
|
258
246
|
|
|
259
247
|
get isToneMappingState() {
|
|
260
248
|
|
|
261
|
-
|
|
262
|
-
const renderTarget = renderer.getRenderTarget();
|
|
263
|
-
|
|
264
|
-
return renderTarget && renderTarget.isCubeRenderTarget ? false : true;
|
|
265
|
-
|
|
266
|
-
}
|
|
267
|
-
|
|
268
|
-
updateToneMapping() {
|
|
269
|
-
|
|
270
|
-
const renderer = this.renderer;
|
|
271
|
-
const rendererData = this.get( renderer );
|
|
272
|
-
const rendererToneMapping = renderer.toneMapping;
|
|
273
|
-
|
|
274
|
-
if ( this.isToneMappingState && rendererToneMapping !== NoToneMapping ) {
|
|
275
|
-
|
|
276
|
-
if ( rendererData.toneMapping !== rendererToneMapping ) {
|
|
277
|
-
|
|
278
|
-
const rendererToneMappingNode = rendererData.rendererToneMappingNode || toneMapping( rendererToneMapping, reference( 'toneMappingExposure', 'float', renderer ) );
|
|
279
|
-
rendererToneMappingNode.toneMapping = rendererToneMapping;
|
|
280
|
-
|
|
281
|
-
rendererData.rendererToneMappingNode = rendererToneMappingNode;
|
|
282
|
-
rendererData.toneMappingNode = rendererToneMappingNode;
|
|
283
|
-
rendererData.toneMapping = rendererToneMapping;
|
|
284
|
-
|
|
285
|
-
}
|
|
286
|
-
|
|
287
|
-
} else {
|
|
288
|
-
|
|
289
|
-
// Don't delete rendererData.rendererToneMappingNode
|
|
290
|
-
delete rendererData.toneMappingNode;
|
|
291
|
-
delete rendererData.toneMapping;
|
|
292
|
-
|
|
293
|
-
}
|
|
249
|
+
return this.renderer.getRenderTarget() ? false : true;
|
|
294
250
|
|
|
295
251
|
}
|
|
296
252
|
|
|
@@ -305,26 +261,13 @@ class Nodes extends DataMap {
|
|
|
305
261
|
|
|
306
262
|
let backgroundNode = null;
|
|
307
263
|
|
|
308
|
-
if ( background.isCubeTexture === true ) {
|
|
264
|
+
if ( background.isCubeTexture === true || ( background.mapping === EquirectangularReflectionMapping || background.mapping === EquirectangularRefractionMapping ) ) {
|
|
309
265
|
|
|
310
|
-
backgroundNode =
|
|
266
|
+
backgroundNode = pmremTexture( background, normalWorld );
|
|
311
267
|
|
|
312
268
|
} else if ( background.isTexture === true ) {
|
|
313
269
|
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
if ( background.mapping === EquirectangularReflectionMapping || background.mapping === EquirectangularRefractionMapping ) {
|
|
317
|
-
|
|
318
|
-
nodeUV = equirectUV();
|
|
319
|
-
background.flipY = false;
|
|
320
|
-
|
|
321
|
-
} else {
|
|
322
|
-
|
|
323
|
-
nodeUV = viewportBottomLeft;
|
|
324
|
-
|
|
325
|
-
}
|
|
326
|
-
|
|
327
|
-
backgroundNode = texture( background, nodeUV ).setUpdateMatrix( true );
|
|
270
|
+
backgroundNode = texture( background, viewportBottomLeft ).setUpdateMatrix( true );
|
|
328
271
|
|
|
329
272
|
} else if ( background.isColor !== true ) {
|
|
330
273
|
|
|
@@ -443,6 +386,34 @@ class Nodes extends DataMap {
|
|
|
443
386
|
|
|
444
387
|
}
|
|
445
388
|
|
|
389
|
+
getOutputNode( outputTexture ) {
|
|
390
|
+
|
|
391
|
+
let output = texture( outputTexture, viewportTopLeft );
|
|
392
|
+
|
|
393
|
+
if ( this.isToneMappingState ) {
|
|
394
|
+
|
|
395
|
+
if ( this.renderer.toneMappingNode ) {
|
|
396
|
+
|
|
397
|
+
output = vec4( this.renderer.toneMappingNode.context( { color: output.rgb } ), output.a );
|
|
398
|
+
|
|
399
|
+
} else if ( this.renderer.toneMapping !== NoToneMapping ) {
|
|
400
|
+
|
|
401
|
+
output = output.toneMapping( this.renderer.toneMapping );
|
|
402
|
+
|
|
403
|
+
}
|
|
404
|
+
|
|
405
|
+
}
|
|
406
|
+
|
|
407
|
+
if ( this.renderer.currentColorSpace === SRGBColorSpace ) {
|
|
408
|
+
|
|
409
|
+
output = output.linearToColorSpace( this.renderer.currentColorSpace );
|
|
410
|
+
|
|
411
|
+
}
|
|
412
|
+
|
|
413
|
+
return output;
|
|
414
|
+
|
|
415
|
+
}
|
|
416
|
+
|
|
446
417
|
updateBefore( renderObject ) {
|
|
447
418
|
|
|
448
419
|
const nodeFrame = this.getNodeFrameForRender( renderObject );
|
|
@@ -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;
|
|
@@ -79,6 +174,8 @@ class WebGLBackend extends Backend {
|
|
|
79
174
|
|
|
80
175
|
//
|
|
81
176
|
|
|
177
|
+
this.initTimestampQuery( renderContext );
|
|
178
|
+
|
|
82
179
|
renderContextData.previousContext = this._currentContext;
|
|
83
180
|
this._currentContext = renderContext;
|
|
84
181
|
|
|
@@ -219,6 +316,7 @@ class WebGLBackend extends Backend {
|
|
|
219
316
|
|
|
220
317
|
}
|
|
221
318
|
|
|
319
|
+
this.prepareTimestampBuffer( renderContext );
|
|
222
320
|
|
|
223
321
|
}
|
|
224
322
|
|
|
@@ -379,11 +477,12 @@ class WebGLBackend extends Backend {
|
|
|
379
477
|
|
|
380
478
|
}
|
|
381
479
|
|
|
382
|
-
beginCompute(
|
|
480
|
+
beginCompute( computeGroup ) {
|
|
383
481
|
|
|
384
482
|
const gl = this.gl;
|
|
385
483
|
|
|
386
484
|
gl.bindFramebuffer( gl.FRAMEBUFFER, null );
|
|
485
|
+
this.initTimestampQuery( computeGroup );
|
|
387
486
|
|
|
388
487
|
}
|
|
389
488
|
|
|
@@ -456,7 +555,7 @@ class WebGLBackend extends Backend {
|
|
|
456
555
|
|
|
457
556
|
}
|
|
458
557
|
|
|
459
|
-
finishCompute(
|
|
558
|
+
finishCompute( computeGroup ) {
|
|
460
559
|
|
|
461
560
|
const gl = this.gl;
|
|
462
561
|
|
|
@@ -464,11 +563,13 @@ class WebGLBackend extends Backend {
|
|
|
464
563
|
|
|
465
564
|
gl.disable( gl.RASTERIZER_DISCARD );
|
|
466
565
|
|
|
566
|
+
this.prepareTimestampBuffer( computeGroup );
|
|
567
|
+
|
|
467
568
|
}
|
|
468
569
|
|
|
469
570
|
draw( renderObject, info ) {
|
|
470
571
|
|
|
471
|
-
const { pipeline, material, context } = renderObject;
|
|
572
|
+
const { object, pipeline, material, context } = renderObject;
|
|
472
573
|
const { programGPU } = this.get( pipeline );
|
|
473
574
|
|
|
474
575
|
const { gl, state } = this;
|
|
@@ -479,7 +580,9 @@ class WebGLBackend extends Backend {
|
|
|
479
580
|
|
|
480
581
|
this._bindUniforms( renderObject.getBindings() );
|
|
481
582
|
|
|
482
|
-
|
|
583
|
+
const frontFaceCW = ( object.isMesh && object.matrixWorld.determinant() < 0 );
|
|
584
|
+
|
|
585
|
+
state.setMaterial( material, frontFaceCW );
|
|
483
586
|
|
|
484
587
|
gl.useProgram( programGPU );
|
|
485
588
|
|
|
@@ -511,9 +614,8 @@ class WebGLBackend extends Backend {
|
|
|
511
614
|
|
|
512
615
|
const index = renderObject.getIndex();
|
|
513
616
|
|
|
514
|
-
const object = renderObject.object;
|
|
515
617
|
const geometry = renderObject.geometry;
|
|
516
|
-
const drawRange =
|
|
618
|
+
const drawRange = renderObject.drawRange;
|
|
517
619
|
const firstVertex = drawRange.start;
|
|
518
620
|
|
|
519
621
|
//
|
|
@@ -547,21 +649,22 @@ class WebGLBackend extends Backend {
|
|
|
547
649
|
|
|
548
650
|
//
|
|
549
651
|
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
else if ( object.
|
|
554
|
-
else if ( object.
|
|
652
|
+
const renderer = this.bufferRenderer;
|
|
653
|
+
|
|
654
|
+
if ( object.isPoints ) renderer.mode = gl.POINTS;
|
|
655
|
+
else if ( object.isLineSegments ) renderer.mode = gl.LINES;
|
|
656
|
+
else if ( object.isLine ) renderer.mode = gl.LINE_STRIP;
|
|
657
|
+
else if ( object.isLineLoop ) renderer.mode = gl.LINE_LOOP;
|
|
555
658
|
else {
|
|
556
659
|
|
|
557
660
|
if ( material.wireframe === true ) {
|
|
558
661
|
|
|
559
662
|
state.setLineWidth( material.wireframeLinewidth * this.renderer.getPixelRatio() );
|
|
560
|
-
mode = gl.LINES;
|
|
663
|
+
renderer.mode = gl.LINES;
|
|
561
664
|
|
|
562
665
|
} else {
|
|
563
666
|
|
|
564
|
-
mode = gl.TRIANGLES;
|
|
667
|
+
renderer.mode = gl.TRIANGLES;
|
|
565
668
|
|
|
566
669
|
}
|
|
567
670
|
|
|
@@ -569,46 +672,54 @@ class WebGLBackend extends Backend {
|
|
|
569
672
|
|
|
570
673
|
//
|
|
571
674
|
|
|
572
|
-
|
|
675
|
+
|
|
676
|
+
let count;
|
|
677
|
+
|
|
678
|
+
renderer.object = object;
|
|
573
679
|
|
|
574
680
|
if ( index !== null ) {
|
|
575
681
|
|
|
576
682
|
const indexData = this.get( index );
|
|
577
683
|
const indexCount = ( drawRange.count !== Infinity ) ? drawRange.count : index.count;
|
|
578
684
|
|
|
579
|
-
|
|
685
|
+
renderer.index = index.count;
|
|
686
|
+
renderer.type = indexData.type;
|
|
580
687
|
|
|
581
|
-
|
|
688
|
+
count = indexCount;
|
|
582
689
|
|
|
583
|
-
|
|
690
|
+
} else {
|
|
584
691
|
|
|
585
|
-
|
|
692
|
+
renderer.index = 0;
|
|
586
693
|
|
|
587
|
-
|
|
694
|
+
const vertexCount = ( drawRange.count !== Infinity ) ? drawRange.count : geometry.attributes.position.count;
|
|
588
695
|
|
|
589
|
-
|
|
696
|
+
count = vertexCount;
|
|
590
697
|
|
|
591
|
-
}
|
|
698
|
+
}
|
|
699
|
+
|
|
700
|
+
const instanceCount = this.getInstanceCount( renderObject );
|
|
592
701
|
|
|
593
|
-
|
|
594
|
-
const vertexCount = ( drawRange.count !== Infinity ) ? drawRange.count : positionAttribute.count;
|
|
702
|
+
if ( object.isBatchedMesh ) {
|
|
595
703
|
|
|
596
|
-
if (
|
|
704
|
+
if ( object._multiDrawInstances !== null ) {
|
|
597
705
|
|
|
598
|
-
|
|
706
|
+
renderer.renderMultiDrawInstances( object._multiDrawStarts, object._multiDrawCounts, object._multiDrawCount, object._multiDrawInstances );
|
|
599
707
|
|
|
600
708
|
} else {
|
|
601
709
|
|
|
602
|
-
|
|
710
|
+
renderer.renderMultiDraw( object._multiDrawStarts, object._multiDrawCounts, object._multiDrawCount );
|
|
603
711
|
|
|
604
712
|
}
|
|
605
713
|
|
|
606
|
-
|
|
714
|
+
} else if ( instanceCount > 1 ) {
|
|
607
715
|
|
|
608
|
-
|
|
716
|
+
renderer.renderInstances( firstVertex, count, instanceCount );
|
|
609
717
|
|
|
610
|
-
}
|
|
718
|
+
} else {
|
|
611
719
|
|
|
720
|
+
renderer.render( firstVertex, count );
|
|
721
|
+
|
|
722
|
+
}
|
|
612
723
|
//
|
|
613
724
|
|
|
614
725
|
gl.bindVertexArray( null );
|
|
@@ -997,12 +1108,6 @@ class WebGLBackend extends Backend {
|
|
|
997
1108
|
|
|
998
1109
|
}
|
|
999
1110
|
|
|
1000
|
-
async hasFeatureAsync( name ) {
|
|
1001
|
-
|
|
1002
|
-
return this.hasFeature( name );
|
|
1003
|
-
|
|
1004
|
-
}
|
|
1005
|
-
|
|
1006
1111
|
hasFeature( name ) {
|
|
1007
1112
|
|
|
1008
1113
|
const keysMatching = Object.keys( GLFeatureName ).filter( key => GLFeatureName[ key ] === name );
|
|
@@ -1011,7 +1116,6 @@ class WebGLBackend extends Backend {
|
|
|
1011
1116
|
|
|
1012
1117
|
for ( let i = 0; i < keysMatching.length; i ++ ) {
|
|
1013
1118
|
|
|
1014
|
-
|
|
1015
1119
|
if ( extensions.has( keysMatching[ i ] ) ) return true;
|
|
1016
1120
|
|
|
1017
1121
|
}
|
|
@@ -1027,6 +1131,12 @@ class WebGLBackend extends Backend {
|
|
|
1027
1131
|
|
|
1028
1132
|
}
|
|
1029
1133
|
|
|
1134
|
+
copyTextureToTexture( position, srcTexture, dstTexture, level ) {
|
|
1135
|
+
|
|
1136
|
+
this.textureUtils.copyTextureToTexture( position, srcTexture, dstTexture, level );
|
|
1137
|
+
|
|
1138
|
+
}
|
|
1139
|
+
|
|
1030
1140
|
copyFramebufferToTexture( texture, renderContext ) {
|
|
1031
1141
|
|
|
1032
1142
|
this.textureUtils.copyFramebufferToTexture( texture, renderContext );
|
|
@@ -0,0 +1,145 @@
|
|
|
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
|
+
for ( let i = 0; i < primcount.length; i ++ ) {
|
|
131
|
+
|
|
132
|
+
info.update( object, elementCount, mode, primcount[ i ] );
|
|
133
|
+
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
//
|
|
141
|
+
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
|
|
145
|
+
export { WebGLBufferRenderer };
|
|
@@ -5,7 +5,7 @@ import NodeUniformsGroup from '../../common/nodes/NodeUniformsGroup.js';
|
|
|
5
5
|
|
|
6
6
|
import { NodeSampledTexture, NodeSampledCubeTexture } from '../../common/nodes/NodeSampledTexture.js';
|
|
7
7
|
|
|
8
|
-
import { RedFormat, RGFormat, IntType, DataTexture, RGBAFormat, FloatType } from 'three';
|
|
8
|
+
import { RedFormat, RGFormat, IntType, DataTexture, RGBFormat, RGBAFormat, FloatType } from 'three';
|
|
9
9
|
|
|
10
10
|
const glslMethods = {
|
|
11
11
|
[ MathNode.ATAN2 ]: 'atan',
|
|
@@ -104,7 +104,7 @@ ${ flowData.code }
|
|
|
104
104
|
|
|
105
105
|
} else if ( itemSize === 3 ) {
|
|
106
106
|
|
|
107
|
-
format =
|
|
107
|
+
format = RGBFormat;
|
|
108
108
|
|
|
109
109
|
} else if ( itemSize === 4 ) {
|
|
110
110
|
|
|
@@ -246,6 +246,12 @@ ${ flowData.code }
|
|
|
246
246
|
|
|
247
247
|
}
|
|
248
248
|
|
|
249
|
+
generateTextureGrad( texture, textureProperty, uvSnippet, gradSnippet ) {
|
|
250
|
+
|
|
251
|
+
return `textureGrad( ${ textureProperty }, ${ uvSnippet }, ${ gradSnippet[ 0 ] }, ${ gradSnippet[ 1 ] } )`;
|
|
252
|
+
|
|
253
|
+
}
|
|
254
|
+
|
|
249
255
|
generateTextureCompare( texture, textureProperty, uvSnippet, compareSnippet, depthSnippet, shaderStage = this.shaderStage ) {
|
|
250
256
|
|
|
251
257
|
if ( shaderStage === 'fragment' ) {
|
|
@@ -390,7 +396,7 @@ ${ flowData.code }
|
|
|
390
396
|
|
|
391
397
|
const array = dataAttribute.array;
|
|
392
398
|
|
|
393
|
-
if ( ( array instanceof Uint32Array || array instanceof Int32Array ) === false ) {
|
|
399
|
+
if ( ( array instanceof Uint32Array || array instanceof Int32Array || array instanceof Uint16Array || array instanceof Int16Array ) === false ) {
|
|
394
400
|
|
|
395
401
|
nodeType = nodeType.slice( 1 );
|
|
396
402
|
|
|
@@ -135,7 +135,7 @@ class WebGLAttributeUtils {
|
|
|
135
135
|
bytesPerElement: array.BYTES_PER_ELEMENT,
|
|
136
136
|
version: attribute.version,
|
|
137
137
|
pbo: attribute.pbo,
|
|
138
|
-
isInteger: type === gl.INT || type === gl.UNSIGNED_INT || attribute.gpuType === IntType,
|
|
138
|
+
isInteger: type === gl.INT || type === gl.UNSIGNED_INT || type === gl.UNSIGNED_SHORT || attribute.gpuType === IntType,
|
|
139
139
|
id: _id ++
|
|
140
140
|
};
|
|
141
141
|
|
|
@@ -7,5 +7,6 @@ export const GLFeatureName = {
|
|
|
7
7
|
'WEBKIT_WEBGL_compressed_texture_pvrtc': 'texture-compression-pvrtc',
|
|
8
8
|
'WEBGL_compressed_texture_s3tc': 'texture-compression-bc',
|
|
9
9
|
'EXT_texture_compression_bptc': 'texture-compression-bptc',
|
|
10
|
+
'EXT_disjoint_timer_query_webgl2': 'timestamp-query',
|
|
10
11
|
|
|
11
12
|
};
|