super-three 0.158.0 → 0.160.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 +1719 -379
- package/build/three.js +1719 -379
- package/build/three.min.js +1 -1
- package/build/three.module.js +1718 -380
- package/build/three.module.min.js +1 -1
- package/examples/jsm/Addons.js +2 -1
- package/examples/jsm/controls/OrbitControls.js +50 -40
- package/examples/jsm/csm/CSMShader.js +52 -47
- package/examples/jsm/exporters/GLTFExporter.js +79 -1
- package/examples/jsm/exporters/USDZExporter.js +27 -19
- package/examples/jsm/helpers/TextureHelper.js +237 -0
- package/examples/jsm/interactive/HTMLMesh.js +9 -2
- package/examples/jsm/lines/LineMaterial.js +16 -33
- package/examples/jsm/loaders/ColladaLoader.js +0 -6
- package/examples/jsm/loaders/DRACOLoader.js +4 -3
- package/examples/jsm/loaders/FBXLoader.js +294 -124
- package/examples/jsm/loaders/GLTFLoader.js +71 -3
- package/examples/jsm/loaders/MaterialXLoader.js +73 -54
- package/examples/jsm/loaders/NRRDLoader.js +0 -13
- package/examples/jsm/loaders/SVGLoader.js +4 -4
- package/examples/jsm/loaders/USDZLoader.js +3 -17
- package/examples/jsm/math/Octree.js +15 -4
- package/examples/jsm/misc/Timer.js +119 -0
- package/examples/jsm/misc/TubePainter.js +3 -6
- package/examples/jsm/modifiers/CurveModifier.js +20 -2
- package/examples/jsm/nodes/Nodes.js +11 -7
- package/examples/jsm/nodes/accessors/CameraNode.js +18 -2
- package/examples/jsm/nodes/accessors/CubeTextureNode.js +5 -73
- package/examples/jsm/nodes/accessors/MaterialReferenceNode.js +11 -2
- package/examples/jsm/nodes/accessors/ModelNode.js +1 -1
- package/examples/jsm/nodes/accessors/ModelViewProjectionNode.js +12 -3
- package/examples/jsm/nodes/accessors/MorphNode.js +191 -16
- package/examples/jsm/nodes/accessors/ReferenceNode.js +25 -1
- package/examples/jsm/nodes/accessors/TextureNode.js +122 -36
- package/examples/jsm/nodes/code/CodeNode.js +3 -3
- package/examples/jsm/nodes/core/AttributeNode.js +7 -1
- package/examples/jsm/nodes/core/CacheNode.js +4 -1
- package/examples/jsm/nodes/core/ConstNode.js +1 -1
- package/examples/jsm/nodes/core/Node.js +6 -3
- package/examples/jsm/nodes/core/NodeBuilder.js +84 -27
- package/examples/jsm/nodes/core/NodeFrame.js +10 -8
- package/examples/jsm/nodes/core/NodeUniform.js +12 -0
- package/examples/jsm/nodes/core/NodeUtils.js +3 -7
- package/examples/jsm/nodes/core/OutputStructNode.js +3 -3
- package/examples/jsm/nodes/core/PropertyNode.js +17 -2
- package/examples/jsm/nodes/core/StructTypeNode.js +4 -4
- package/examples/jsm/nodes/core/UniformGroup.js +13 -0
- package/examples/jsm/nodes/core/UniformGroupNode.js +36 -0
- package/examples/jsm/nodes/core/UniformNode.js +17 -0
- package/examples/jsm/nodes/core/VarNode.js +2 -0
- package/examples/jsm/nodes/core/VaryingNode.js +1 -7
- package/examples/jsm/nodes/display/BumpMapNode.js +1 -1
- package/examples/jsm/nodes/display/ColorAdjustmentNode.js +6 -10
- package/examples/jsm/nodes/display/GaussianBlurNode.js +170 -0
- package/examples/jsm/nodes/display/PassNode.js +182 -0
- package/examples/jsm/nodes/display/ViewportDepthNode.js +31 -3
- package/examples/jsm/nodes/display/ViewportDepthTextureNode.js +2 -2
- package/examples/jsm/nodes/display/ViewportNode.js +5 -8
- package/examples/jsm/nodes/functions/PhysicalLightingModel.js +1 -1
- package/examples/jsm/nodes/lighting/AnalyticLightNode.js +52 -17
- package/examples/jsm/nodes/lighting/EnvironmentNode.js +8 -12
- package/examples/jsm/nodes/lighting/LightsNode.js +34 -32
- package/examples/jsm/nodes/materials/InstancedPointsNodeMaterial.js +1 -1
- package/examples/jsm/nodes/materials/Line2NodeMaterial.js +12 -12
- package/examples/jsm/nodes/materials/MeshBasicNodeMaterial.js +1 -0
- package/examples/jsm/nodes/materials/MeshNormalNodeMaterial.js +1 -1
- package/examples/jsm/nodes/materials/NodeMaterial.js +66 -41
- package/examples/jsm/nodes/materials/PointsNodeMaterial.js +0 -10
- package/examples/jsm/nodes/materials/SpriteNodeMaterial.js +0 -7
- package/examples/jsm/nodes/materialx/MaterialXNodes.js +10 -10
- package/examples/jsm/nodes/materialx/lib/mx_hsv.js +128 -54
- package/examples/jsm/nodes/materialx/lib/mx_noise.js +1430 -618
- package/examples/jsm/nodes/materialx/lib/mx_transform_color.js +24 -14
- package/examples/jsm/nodes/math/MathNode.js +2 -0
- package/examples/jsm/nodes/math/OperatorNode.js +19 -6
- package/examples/jsm/nodes/shadernode/ShaderNode.js +32 -3
- package/examples/jsm/nodes/utils/FunctionOverloadingNode.js +95 -0
- package/examples/jsm/nodes/utils/RemapNode.js +2 -2
- package/examples/jsm/nodes/utils/SplitNode.js +8 -2
- package/examples/jsm/nodes/utils/TriplanarTexturesNode.js +3 -3
- package/examples/jsm/objects/QuadMesh.js +60 -0
- package/examples/jsm/postprocessing/GTAOPass.js +572 -0
- package/examples/jsm/postprocessing/OutputPass.js +2 -0
- package/examples/jsm/renderers/common/Animation.js +10 -21
- package/examples/jsm/renderers/common/Backend.js +19 -3
- package/examples/jsm/renderers/common/Background.js +20 -22
- package/examples/jsm/renderers/common/Bindings.js +30 -21
- package/examples/jsm/renderers/common/ChainMap.js +3 -3
- package/examples/jsm/renderers/common/Color4.js +37 -0
- package/examples/jsm/renderers/common/Geometries.js +4 -4
- package/examples/jsm/renderers/common/Info.js +12 -2
- package/examples/jsm/renderers/common/Pipelines.js +3 -51
- package/examples/jsm/renderers/common/PostProcessing.js +25 -0
- package/examples/jsm/renderers/common/RenderContext.js +1 -1
- package/examples/jsm/renderers/common/RenderContexts.js +1 -1
- package/examples/jsm/renderers/common/RenderObject.js +13 -1
- package/examples/jsm/renderers/common/RenderObjects.js +4 -2
- package/examples/jsm/renderers/common/Renderer.js +137 -37
- package/examples/jsm/renderers/common/StorageTexture.js +1 -0
- package/examples/jsm/renderers/common/Textures.js +4 -1
- package/examples/jsm/renderers/common/nodes/NodeBuilderState.js +10 -2
- package/examples/jsm/renderers/common/nodes/NodeUniformsGroup.js +44 -0
- package/examples/jsm/renderers/common/nodes/Nodes.js +74 -7
- package/examples/jsm/renderers/webgl/WebGLBackend.js +91 -33
- package/examples/jsm/renderers/webgl/nodes/GLSLNodeBuilder.js +100 -31
- package/examples/jsm/renderers/webgl/utils/WebGLAttributeUtils.js +57 -5
- package/examples/jsm/renderers/webgl/utils/WebGLCapabilities.js +36 -0
- package/examples/jsm/renderers/webgl/utils/WebGLExtensions.js +11 -1
- package/examples/jsm/renderers/webgl/utils/WebGLTextureUtils.js +71 -2
- package/examples/jsm/renderers/webgl/utils/WebGLUtils.js +42 -0
- package/examples/jsm/renderers/webgl-legacy/nodes/SlotNode.js +1 -1
- package/examples/jsm/renderers/webgl-legacy/nodes/WebGLNodeBuilder.js +33 -3
- package/examples/jsm/renderers/webgl-legacy/nodes/WebGLNodes.js +4 -14
- package/examples/jsm/renderers/webgpu/WebGPUBackend.js +186 -137
- package/examples/jsm/renderers/webgpu/WebGPURenderer.js +1 -1
- package/examples/jsm/renderers/webgpu/nodes/WGSLNodeBuilder.js +209 -90
- package/examples/jsm/renderers/webgpu/utils/WebGPUAttributeUtils.js +15 -10
- package/examples/jsm/renderers/webgpu/utils/WebGPUBindingUtils.js +11 -3
- package/examples/jsm/renderers/webgpu/utils/WebGPUPipelineUtils.js +2 -3
- package/examples/jsm/renderers/webgpu/utils/WebGPUTextureUtils.js +88 -6
- package/examples/jsm/shaders/FXAAShader.js +133 -133
- package/examples/jsm/shaders/GTAOShader.js +424 -0
- package/examples/jsm/shaders/OutputShader.js +4 -0
- package/examples/jsm/shaders/PoissonDenoiseShader.js +226 -0
- package/examples/jsm/shaders/SAOShader.js +2 -3
- package/examples/jsm/shaders/SSAOShader.js +2 -3
- package/examples/jsm/transpiler/AST.js +40 -1
- package/examples/jsm/transpiler/GLSLDecoder.js +50 -8
- package/examples/jsm/transpiler/ShaderToyDecoder.js +4 -4
- package/examples/jsm/transpiler/TSLEncoder.js +124 -20
- package/examples/jsm/utils/SortUtils.js +158 -0
- package/examples/jsm/utils/TextureUtils.js +33 -21
- package/examples/jsm/webxr/ARButton.js +14 -0
- package/examples/jsm/webxr/VRButton.js +23 -8
- package/examples/jsm/webxr/XRButton.js +25 -11
- package/package.json +5 -6
- package/src/Three.js +1 -0
- package/src/constants.js +2 -1
- package/src/core/BufferAttribute.js +21 -2
- package/src/core/InterleavedBuffer.js +21 -1
- package/src/core/Object3D.js +60 -12
- package/src/core/UniformsGroup.js +7 -1
- package/src/extras/curves/LineCurve3.js +4 -0
- package/src/loaders/AudioLoader.js +1 -1
- package/src/loaders/BufferGeometryLoader.js +0 -7
- package/src/loaders/ImageBitmapLoader.js +25 -1
- package/src/loaders/ObjectLoader.js +49 -0
- package/src/materials/ShaderMaterial.js +2 -1
- package/src/math/ColorManagement.js +0 -16
- package/src/math/Quaternion.js +5 -4
- package/src/math/Sphere.js +2 -0
- package/src/math/Triangle.js +17 -5
- package/src/objects/BatchedMesh.js +1020 -0
- package/src/objects/Skeleton.js +1 -3
- package/src/renderers/WebGL3DRenderTarget.js +2 -2
- package/src/renderers/WebGLArrayRenderTarget.js +2 -2
- package/src/renderers/WebGLRenderer.js +23 -18
- package/src/renderers/shaders/ShaderChunk/batching_pars_vertex.glsl.js +19 -0
- package/src/renderers/shaders/ShaderChunk/batching_vertex.glsl.js +5 -0
- package/src/renderers/shaders/ShaderChunk/cube_uv_reflection_fragment.glsl.js +0 -5
- package/src/renderers/shaders/ShaderChunk/defaultnormal_vertex.glsl.js +31 -4
- package/src/renderers/shaders/ShaderChunk/lights_physical_fragment.glsl.js +9 -4
- package/src/renderers/shaders/ShaderChunk/project_vertex.glsl.js +6 -0
- package/src/renderers/shaders/ShaderChunk/skinning_pars_vertex.glsl.js +9 -17
- package/src/renderers/shaders/ShaderChunk/tonemapping_pars_fragment.glsl.js +84 -0
- package/src/renderers/shaders/ShaderChunk/worldpos_vertex.glsl.js +6 -0
- package/src/renderers/shaders/ShaderChunk.js +4 -0
- 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/meshbasic.glsl.js +2 -0
- package/src/renderers/shaders/ShaderLib/meshlambert.glsl.js +2 -0
- package/src/renderers/shaders/ShaderLib/meshmatcap.glsl.js +3 -0
- package/src/renderers/shaders/ShaderLib/meshnormal.glsl.js +2 -0
- package/src/renderers/shaders/ShaderLib/meshphong.glsl.js +2 -0
- package/src/renderers/shaders/ShaderLib/meshphysical.glsl.js +2 -0
- package/src/renderers/shaders/ShaderLib/meshtoon.glsl.js +2 -0
- package/src/renderers/shaders/ShaderLib/shadow.glsl.js +3 -0
- package/src/renderers/webgl/WebGLAttributes.js +39 -5
- package/src/renderers/webgl/WebGLBufferRenderer.js +31 -0
- package/src/renderers/webgl/WebGLCubeMaps.js +1 -1
- package/src/renderers/webgl/WebGLExtensions.js +1 -0
- package/src/renderers/webgl/WebGLIndexedBufferRenderer.js +31 -0
- package/src/renderers/webgl/WebGLLights.js +11 -2
- package/src/renderers/webgl/WebGLProgram.js +20 -1
- package/src/renderers/webgl/WebGLPrograms.js +5 -0
- package/src/renderers/webgl/WebGLShadowMap.js +35 -0
- package/src/renderers/webgl/WebGLTextures.js +7 -11
- package/src/renderers/webgl/WebGLUniforms.js +11 -1
- package/src/renderers/webgl/WebGLUniformsGroups.js +72 -93
- package/src/renderers/webxr/WebXRManager.js +16 -0
- package/examples/jsm/objects/BatchedMesh.js +0 -586
|
@@ -10,7 +10,8 @@ import RenderContexts from './RenderContexts.js';
|
|
|
10
10
|
import Textures from './Textures.js';
|
|
11
11
|
import Background from './Background.js';
|
|
12
12
|
import Nodes from './nodes/Nodes.js';
|
|
13
|
-
import
|
|
13
|
+
import Color4 from './Color4.js';
|
|
14
|
+
import { Scene, Frustum, Matrix4, Vector2, Vector3, Vector4, DoubleSide, BackSide, FrontSide, SRGBColorSpace, NoToneMapping } from 'three';
|
|
14
15
|
|
|
15
16
|
const _scene = new Scene();
|
|
16
17
|
const _drawingBufferSize = new Vector2();
|
|
@@ -21,10 +22,16 @@ const _vector3 = new Vector3();
|
|
|
21
22
|
|
|
22
23
|
class Renderer {
|
|
23
24
|
|
|
24
|
-
constructor( backend ) {
|
|
25
|
+
constructor( backend, parameters = {} ) {
|
|
25
26
|
|
|
26
27
|
this.isRenderer = true;
|
|
27
28
|
|
|
29
|
+
//
|
|
30
|
+
|
|
31
|
+
const {
|
|
32
|
+
logarithmicDepthBuffer = false,
|
|
33
|
+
} = parameters;
|
|
34
|
+
|
|
28
35
|
// public
|
|
29
36
|
|
|
30
37
|
this.domElement = backend.getDomElement();
|
|
@@ -36,6 +43,8 @@ class Renderer {
|
|
|
36
43
|
this.autoClearDepth = true;
|
|
37
44
|
this.autoClearStencil = true;
|
|
38
45
|
|
|
46
|
+
this.logarithmicDepthBuffer = logarithmicDepthBuffer;
|
|
47
|
+
|
|
39
48
|
this.outputColorSpace = SRGBColorSpace;
|
|
40
49
|
|
|
41
50
|
this.toneMapping = NoToneMapping;
|
|
@@ -62,6 +71,7 @@ class Renderer {
|
|
|
62
71
|
this._attributes = null;
|
|
63
72
|
this._geometries = null;
|
|
64
73
|
this._nodes = null;
|
|
74
|
+
this._animation = null;
|
|
65
75
|
this._bindings = null;
|
|
66
76
|
this._objects = null;
|
|
67
77
|
this._pipelines = null;
|
|
@@ -70,16 +80,12 @@ class Renderer {
|
|
|
70
80
|
this._textures = null;
|
|
71
81
|
this._background = null;
|
|
72
82
|
|
|
73
|
-
this._animation = new Animation();
|
|
74
|
-
|
|
75
83
|
this._currentRenderContext = null;
|
|
76
|
-
this._lastRenderContext = null;
|
|
77
84
|
|
|
78
85
|
this._opaqueSort = null;
|
|
79
86
|
this._transparentSort = null;
|
|
80
87
|
|
|
81
|
-
this.
|
|
82
|
-
this._clearColor = new Color( 0x000000 );
|
|
88
|
+
this._clearColor = new Color4( 0x000000 );
|
|
83
89
|
this._clearDepth = 1;
|
|
84
90
|
this._clearStencil = 0;
|
|
85
91
|
|
|
@@ -87,6 +93,9 @@ class Renderer {
|
|
|
87
93
|
this._activeCubeFace = 0;
|
|
88
94
|
this._activeMipmapLevel = 0;
|
|
89
95
|
|
|
96
|
+
this._renderObjectFunction = null;
|
|
97
|
+
this._currentRenderObjectFunction = null;
|
|
98
|
+
|
|
90
99
|
this._initialized = false;
|
|
91
100
|
this._initPromise = null;
|
|
92
101
|
|
|
@@ -133,6 +142,7 @@ class Renderer {
|
|
|
133
142
|
}
|
|
134
143
|
|
|
135
144
|
this._nodes = new Nodes( this, backend );
|
|
145
|
+
this._animation = new Animation( this._nodes, this.info );
|
|
136
146
|
this._attributes = new Attributes( backend );
|
|
137
147
|
this._background = new Background( this, this._nodes );
|
|
138
148
|
this._geometries = new Geometries( this._attributes, this.info );
|
|
@@ -145,9 +155,6 @@ class Renderer {
|
|
|
145
155
|
|
|
146
156
|
//
|
|
147
157
|
|
|
148
|
-
this._animation.setNodes( this._nodes );
|
|
149
|
-
this._animation.start();
|
|
150
|
-
|
|
151
158
|
this._initialized = true;
|
|
152
159
|
|
|
153
160
|
resolve();
|
|
@@ -179,7 +186,8 @@ class Renderer {
|
|
|
179
186
|
const nodeFrame = this._nodes.nodeFrame;
|
|
180
187
|
|
|
181
188
|
const previousRenderId = nodeFrame.renderId;
|
|
182
|
-
const
|
|
189
|
+
const previousRenderContext = this._currentRenderContext;
|
|
190
|
+
const previousRenderObjectFunction = this._currentRenderObjectFunction;
|
|
183
191
|
|
|
184
192
|
//
|
|
185
193
|
|
|
@@ -191,8 +199,14 @@ class Renderer {
|
|
|
191
199
|
const activeMipmapLevel = this._activeMipmapLevel;
|
|
192
200
|
|
|
193
201
|
this._currentRenderContext = renderContext;
|
|
202
|
+
this._currentRenderObjectFunction = this._renderObjectFunction || this.renderObject;
|
|
203
|
+
|
|
204
|
+
//
|
|
194
205
|
|
|
195
|
-
|
|
206
|
+
this.info.calls ++;
|
|
207
|
+
this.info.render.calls ++;
|
|
208
|
+
|
|
209
|
+
nodeFrame.renderId = this.info.calls;
|
|
196
210
|
|
|
197
211
|
//
|
|
198
212
|
|
|
@@ -208,16 +222,12 @@ class Renderer {
|
|
|
208
222
|
|
|
209
223
|
//
|
|
210
224
|
|
|
211
|
-
if ( this._animation.isAnimating === false ) nodeFrame.update();
|
|
212
|
-
|
|
213
225
|
if ( scene.matrixWorldAutoUpdate === true ) scene.updateMatrixWorld();
|
|
214
226
|
|
|
215
227
|
if ( camera.parent === null && camera.matrixWorldAutoUpdate === true ) camera.updateMatrixWorld();
|
|
216
228
|
|
|
217
229
|
if ( this.info.autoReset === true ) this.info.reset();
|
|
218
230
|
|
|
219
|
-
this.info.render.frame ++;
|
|
220
|
-
|
|
221
231
|
//
|
|
222
232
|
|
|
223
233
|
let viewport = this._viewport;
|
|
@@ -288,6 +298,7 @@ class Renderer {
|
|
|
288
298
|
renderContext.depthTexture = renderTargetData.depthTexture;
|
|
289
299
|
renderContext.width = renderTargetData.width;
|
|
290
300
|
renderContext.height = renderTargetData.height;
|
|
301
|
+
renderContext.renderTarget = renderTarget;
|
|
291
302
|
|
|
292
303
|
} else {
|
|
293
304
|
|
|
@@ -332,9 +343,9 @@ class Renderer {
|
|
|
332
343
|
// restore render tree
|
|
333
344
|
|
|
334
345
|
nodeFrame.renderId = previousRenderId;
|
|
335
|
-
this._currentRenderContext = previousRenderState;
|
|
336
346
|
|
|
337
|
-
this.
|
|
347
|
+
this._currentRenderContext = previousRenderContext;
|
|
348
|
+
this._currentRenderObjectFunction = previousRenderObjectFunction;
|
|
338
349
|
|
|
339
350
|
//
|
|
340
351
|
|
|
@@ -342,6 +353,12 @@ class Renderer {
|
|
|
342
353
|
|
|
343
354
|
}
|
|
344
355
|
|
|
356
|
+
getMaxAnisotropy() {
|
|
357
|
+
|
|
358
|
+
return this.backend.getMaxAnisotropy();
|
|
359
|
+
|
|
360
|
+
}
|
|
361
|
+
|
|
345
362
|
getActiveCubeFace() {
|
|
346
363
|
|
|
347
364
|
return this._activeCubeFace;
|
|
@@ -354,15 +371,11 @@ class Renderer {
|
|
|
354
371
|
|
|
355
372
|
}
|
|
356
373
|
|
|
357
|
-
setAnimationLoop( callback ) {
|
|
374
|
+
async setAnimationLoop( callback ) {
|
|
358
375
|
|
|
359
|
-
if ( this._initialized === false ) this.init();
|
|
360
|
-
|
|
361
|
-
const animation = this._animation;
|
|
362
|
-
|
|
363
|
-
animation.setAnimationLoop( callback );
|
|
376
|
+
if ( this._initialized === false ) await this.init();
|
|
364
377
|
|
|
365
|
-
( callback
|
|
378
|
+
this._animation.setAnimationLoop( callback );
|
|
366
379
|
|
|
367
380
|
}
|
|
368
381
|
|
|
@@ -536,19 +549,19 @@ class Renderer {
|
|
|
536
549
|
setClearColor( color, alpha = 1 ) {
|
|
537
550
|
|
|
538
551
|
this._clearColor.set( color );
|
|
539
|
-
this.
|
|
552
|
+
this._clearColor.a = alpha;
|
|
540
553
|
|
|
541
554
|
}
|
|
542
555
|
|
|
543
556
|
getClearAlpha() {
|
|
544
557
|
|
|
545
|
-
return this.
|
|
558
|
+
return this._clearColor.a;
|
|
546
559
|
|
|
547
560
|
}
|
|
548
561
|
|
|
549
562
|
setClearAlpha( alpha ) {
|
|
550
563
|
|
|
551
|
-
this.
|
|
564
|
+
this._clearColor.a = alpha;
|
|
552
565
|
|
|
553
566
|
}
|
|
554
567
|
|
|
@@ -578,7 +591,7 @@ class Renderer {
|
|
|
578
591
|
|
|
579
592
|
isOccluded( object ) {
|
|
580
593
|
|
|
581
|
-
const renderContext = this._currentRenderContext
|
|
594
|
+
const renderContext = this._currentRenderContext;
|
|
582
595
|
|
|
583
596
|
return renderContext && this.backend.isOccluded( renderContext, object );
|
|
584
597
|
|
|
@@ -586,9 +599,18 @@ class Renderer {
|
|
|
586
599
|
|
|
587
600
|
clear( color = true, depth = true, stencil = true ) {
|
|
588
601
|
|
|
589
|
-
|
|
602
|
+
let renderTargetData = null;
|
|
603
|
+
const renderTarget = this._renderTarget;
|
|
590
604
|
|
|
591
|
-
if (
|
|
605
|
+
if ( renderTarget !== null ) {
|
|
606
|
+
|
|
607
|
+
this._textures.updateRenderTarget( renderTarget );
|
|
608
|
+
|
|
609
|
+
renderTargetData = this._textures.get( renderTarget );
|
|
610
|
+
|
|
611
|
+
}
|
|
612
|
+
|
|
613
|
+
this.backend.clear( color, depth, stencil, renderTargetData );
|
|
592
614
|
|
|
593
615
|
}
|
|
594
616
|
|
|
@@ -610,10 +632,27 @@ class Renderer {
|
|
|
610
632
|
|
|
611
633
|
}
|
|
612
634
|
|
|
635
|
+
get currentColorSpace() {
|
|
636
|
+
|
|
637
|
+
const renderTarget = this._renderTarget;
|
|
638
|
+
|
|
639
|
+
if ( renderTarget !== null ) {
|
|
640
|
+
|
|
641
|
+
const texture = renderTarget.texture;
|
|
642
|
+
|
|
643
|
+
return ( Array.isArray( texture ) ? texture[ 0 ] : texture ).colorSpace;
|
|
644
|
+
|
|
645
|
+
}
|
|
646
|
+
|
|
647
|
+
return this.outputColorSpace;
|
|
648
|
+
|
|
649
|
+
}
|
|
650
|
+
|
|
613
651
|
dispose() {
|
|
614
652
|
|
|
615
653
|
this.info.dispose();
|
|
616
654
|
|
|
655
|
+
this._animation.dispose();
|
|
617
656
|
this._objects.dispose();
|
|
618
657
|
this._properties.dispose();
|
|
619
658
|
this._pipelines.dispose();
|
|
@@ -642,16 +681,47 @@ class Renderer {
|
|
|
642
681
|
|
|
643
682
|
}
|
|
644
683
|
|
|
684
|
+
setRenderObjectFunction( renderObjectFunction ) {
|
|
685
|
+
|
|
686
|
+
this._renderObjectFunction = renderObjectFunction;
|
|
687
|
+
|
|
688
|
+
}
|
|
689
|
+
|
|
690
|
+
getRenderObjectFunction() {
|
|
691
|
+
|
|
692
|
+
return this._renderObjectFunction;
|
|
693
|
+
|
|
694
|
+
}
|
|
695
|
+
|
|
645
696
|
async compute( computeNodes ) {
|
|
646
697
|
|
|
647
698
|
if ( this._initialized === false ) await this.init();
|
|
648
699
|
|
|
700
|
+
const nodeFrame = this._nodes.nodeFrame;
|
|
701
|
+
|
|
702
|
+
const previousRenderId = nodeFrame.renderId;
|
|
703
|
+
|
|
704
|
+
//
|
|
705
|
+
|
|
706
|
+
this.info.calls ++;
|
|
707
|
+
this.info.compute.calls ++;
|
|
708
|
+
|
|
709
|
+
nodeFrame.renderId = this.info.calls;
|
|
710
|
+
|
|
711
|
+
//
|
|
712
|
+
|
|
649
713
|
const backend = this.backend;
|
|
650
714
|
const pipelines = this._pipelines;
|
|
651
715
|
const bindings = this._bindings;
|
|
652
716
|
const nodes = this._nodes;
|
|
653
717
|
const computeList = Array.isArray( computeNodes ) ? computeNodes : [ computeNodes ];
|
|
654
718
|
|
|
719
|
+
if ( computeList[ 0 ] === undefined || computeList[ 0 ].isComputeNode !== true ) {
|
|
720
|
+
|
|
721
|
+
throw new Error( 'THREE.Renderer: .compute() expects a ComputeNode.' );
|
|
722
|
+
|
|
723
|
+
}
|
|
724
|
+
|
|
655
725
|
backend.beginCompute( computeNodes );
|
|
656
726
|
|
|
657
727
|
for ( const computeNode of computeList ) {
|
|
@@ -690,6 +760,10 @@ class Renderer {
|
|
|
690
760
|
|
|
691
761
|
backend.finishCompute( computeNodes );
|
|
692
762
|
|
|
763
|
+
//
|
|
764
|
+
|
|
765
|
+
nodeFrame.renderId = previousRenderId;
|
|
766
|
+
|
|
693
767
|
}
|
|
694
768
|
|
|
695
769
|
hasFeature( name ) {
|
|
@@ -700,7 +774,7 @@ class Renderer {
|
|
|
700
774
|
|
|
701
775
|
copyFramebufferToTexture( framebufferTexture ) {
|
|
702
776
|
|
|
703
|
-
const renderContext = this._currentRenderContext
|
|
777
|
+
const renderContext = this._currentRenderContext;
|
|
704
778
|
|
|
705
779
|
this._textures.updateTexture( framebufferTexture );
|
|
706
780
|
|
|
@@ -825,7 +899,7 @@ class Renderer {
|
|
|
825
899
|
const renderItem = renderList[ i ];
|
|
826
900
|
|
|
827
901
|
// @TODO: Add support for multiple materials per object. This will require to extract
|
|
828
|
-
// the material from the renderItem object and pass it with its group data to
|
|
902
|
+
// the material from the renderItem object and pass it with its group data to renderObject().
|
|
829
903
|
|
|
830
904
|
const { object, geometry, material, group } = renderItem;
|
|
831
905
|
|
|
@@ -850,7 +924,7 @@ class Renderer {
|
|
|
850
924
|
|
|
851
925
|
this.backend.updateViewport( this._currentRenderContext );
|
|
852
926
|
|
|
853
|
-
this.
|
|
927
|
+
this._currentRenderObjectFunction( object, scene, camera2, geometry, material, group, lightsNode );
|
|
854
928
|
|
|
855
929
|
}
|
|
856
930
|
|
|
@@ -858,7 +932,7 @@ class Renderer {
|
|
|
858
932
|
|
|
859
933
|
} else {
|
|
860
934
|
|
|
861
|
-
this.
|
|
935
|
+
this._currentRenderObjectFunction( object, scene, camera, geometry, material, group, lightsNode );
|
|
862
936
|
|
|
863
937
|
}
|
|
864
938
|
|
|
@@ -866,9 +940,9 @@ class Renderer {
|
|
|
866
940
|
|
|
867
941
|
}
|
|
868
942
|
|
|
869
|
-
|
|
943
|
+
renderObject( object, scene, camera, geometry, material, group, lightsNode ) {
|
|
870
944
|
|
|
871
|
-
|
|
945
|
+
let overridePositionNode;
|
|
872
946
|
|
|
873
947
|
//
|
|
874
948
|
|
|
@@ -878,6 +952,24 @@ class Renderer {
|
|
|
878
952
|
|
|
879
953
|
//
|
|
880
954
|
|
|
955
|
+
if ( scene.overrideMaterial !== null ) {
|
|
956
|
+
|
|
957
|
+
const overrideMaterial = scene.overrideMaterial;
|
|
958
|
+
|
|
959
|
+
if ( material.positionNode && material.positionNode.isNode ) {
|
|
960
|
+
|
|
961
|
+
overridePositionNode = overrideMaterial.positionNode;
|
|
962
|
+
|
|
963
|
+
overrideMaterial.positionNode = material.positionNode;
|
|
964
|
+
|
|
965
|
+
}
|
|
966
|
+
|
|
967
|
+
material = overrideMaterial;
|
|
968
|
+
|
|
969
|
+
}
|
|
970
|
+
|
|
971
|
+
//
|
|
972
|
+
|
|
881
973
|
if ( material.transparent === true && material.side === DoubleSide && material.forceSinglePass === false ) {
|
|
882
974
|
|
|
883
975
|
material.side = BackSide;
|
|
@@ -896,6 +988,14 @@ class Renderer {
|
|
|
896
988
|
|
|
897
989
|
//
|
|
898
990
|
|
|
991
|
+
if ( overridePositionNode !== undefined ) {
|
|
992
|
+
|
|
993
|
+
scene.overrideMaterial.positionNode = overridePositionNode;
|
|
994
|
+
|
|
995
|
+
}
|
|
996
|
+
|
|
997
|
+
//
|
|
998
|
+
|
|
899
999
|
object.onAfterRender( this, scene, camera, geometry, material, group );
|
|
900
1000
|
|
|
901
1001
|
}
|
|
@@ -70,6 +70,8 @@ class Textures extends DataMap {
|
|
|
70
70
|
renderTargetData.height = size.height;
|
|
71
71
|
renderTargetData.textures = textures;
|
|
72
72
|
renderTargetData.depthTexture = depthTexture;
|
|
73
|
+
renderTargetData.depth = renderTarget.depthBuffer;
|
|
74
|
+
renderTargetData.stencil = renderTarget.stencilBuffer;
|
|
73
75
|
|
|
74
76
|
if ( renderTargetData.sampleCount !== sampleCount ) {
|
|
75
77
|
|
|
@@ -80,8 +82,9 @@ class Textures extends DataMap {
|
|
|
80
82
|
|
|
81
83
|
}
|
|
82
84
|
|
|
83
|
-
|
|
85
|
+
//
|
|
84
86
|
|
|
87
|
+
const options = { sampleCount };
|
|
85
88
|
|
|
86
89
|
for ( let i = 0; i < textures.length; i ++ ) {
|
|
87
90
|
|
|
@@ -20,9 +20,17 @@ class NodeBuilderState {
|
|
|
20
20
|
|
|
21
21
|
const bindingsArray = [];
|
|
22
22
|
|
|
23
|
-
for ( const
|
|
23
|
+
for ( const instanceBinding of this.bindings ) {
|
|
24
24
|
|
|
25
|
-
|
|
25
|
+
let binding = instanceBinding;
|
|
26
|
+
|
|
27
|
+
if ( instanceBinding.shared !== true ) {
|
|
28
|
+
|
|
29
|
+
binding = instanceBinding.clone();
|
|
30
|
+
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
bindingsArray.push( binding );
|
|
26
34
|
|
|
27
35
|
}
|
|
28
36
|
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import UniformsGroup from '../UniformsGroup.js';
|
|
2
|
+
|
|
3
|
+
let id = 0;
|
|
4
|
+
|
|
5
|
+
class NodeUniformsGroup extends UniformsGroup {
|
|
6
|
+
|
|
7
|
+
constructor( name, groupNode ) {
|
|
8
|
+
|
|
9
|
+
super( name );
|
|
10
|
+
|
|
11
|
+
this.id = id ++;
|
|
12
|
+
this.groupNode = groupNode;
|
|
13
|
+
|
|
14
|
+
this.isNodeUniformsGroup = true;
|
|
15
|
+
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
get shared() {
|
|
19
|
+
|
|
20
|
+
return this.groupNode.shared;
|
|
21
|
+
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
getNodes() {
|
|
25
|
+
|
|
26
|
+
const nodes = [];
|
|
27
|
+
|
|
28
|
+
for ( const uniform of this.uniforms ) {
|
|
29
|
+
|
|
30
|
+
const node = uniform.nodeUniform.node;
|
|
31
|
+
|
|
32
|
+
if ( ! node ) throw new Error( 'NodeUniformsGroup: Uniform has no node.' );
|
|
33
|
+
|
|
34
|
+
nodes.push( node );
|
|
35
|
+
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
return nodes;
|
|
39
|
+
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
export default NodeUniformsGroup;
|
|
@@ -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, cubeTexture, texture, rangeFog, densityFog, reference, toneMapping, equirectUV, viewportBottomLeft, normalWorld } from '../../../nodes/Nodes.js';
|
|
5
|
+
import { NodeFrame, objectGroup, renderGroup, frameGroup, cubeTexture, texture, rangeFog, densityFog, reference, toneMapping, equirectUV, viewportBottomLeft, normalWorld } from '../../../nodes/Nodes.js';
|
|
6
6
|
|
|
7
7
|
class Nodes extends DataMap {
|
|
8
8
|
|
|
@@ -14,7 +14,74 @@ class Nodes extends DataMap {
|
|
|
14
14
|
this.backend = backend;
|
|
15
15
|
this.nodeFrame = new NodeFrame();
|
|
16
16
|
this.nodeBuilderCache = new Map();
|
|
17
|
-
this.
|
|
17
|
+
this.callHashCache = new ChainMap();
|
|
18
|
+
this.groupsData = new ChainMap();
|
|
19
|
+
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
updateGroup( nodeUniformsGroup ) {
|
|
23
|
+
|
|
24
|
+
const groupNode = nodeUniformsGroup.groupNode;
|
|
25
|
+
const name = groupNode.name;
|
|
26
|
+
|
|
27
|
+
// objectGroup is every updated
|
|
28
|
+
|
|
29
|
+
if ( name === objectGroup.name ) return true;
|
|
30
|
+
|
|
31
|
+
// renderGroup is updated once per render/compute call
|
|
32
|
+
|
|
33
|
+
if ( name === renderGroup.name ) {
|
|
34
|
+
|
|
35
|
+
const uniformsGroupData = this.get( nodeUniformsGroup );
|
|
36
|
+
const renderId = this.nodeFrame.renderId;
|
|
37
|
+
|
|
38
|
+
if ( uniformsGroupData.renderId !== renderId ) {
|
|
39
|
+
|
|
40
|
+
uniformsGroupData.renderId = renderId;
|
|
41
|
+
|
|
42
|
+
return true;
|
|
43
|
+
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
return false;
|
|
47
|
+
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
// frameGroup is updated once per frame
|
|
51
|
+
|
|
52
|
+
if ( name === frameGroup.name ) {
|
|
53
|
+
|
|
54
|
+
const uniformsGroupData = this.get( nodeUniformsGroup );
|
|
55
|
+
const frameId = this.nodeFrame.frameId;
|
|
56
|
+
|
|
57
|
+
if ( uniformsGroupData.frameId !== frameId ) {
|
|
58
|
+
|
|
59
|
+
uniformsGroupData.frameId = frameId;
|
|
60
|
+
|
|
61
|
+
return true;
|
|
62
|
+
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
return false;
|
|
66
|
+
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
// other groups are updated just when groupNode.needsUpdate is true
|
|
70
|
+
|
|
71
|
+
const groupChain = [ groupNode, nodeUniformsGroup ];
|
|
72
|
+
|
|
73
|
+
let groupData = this.groupsData.get( groupChain );
|
|
74
|
+
if ( groupData === undefined ) this.groupsData.set( groupChain, groupData = {} );
|
|
75
|
+
|
|
76
|
+
if ( groupData.version !== groupNode.version ) {
|
|
77
|
+
|
|
78
|
+
groupData.version = groupNode.version;
|
|
79
|
+
|
|
80
|
+
return true;
|
|
81
|
+
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
return false;
|
|
18
85
|
|
|
19
86
|
}
|
|
20
87
|
|
|
@@ -148,11 +215,11 @@ class Nodes extends DataMap {
|
|
|
148
215
|
getCacheKey( scene, lightsNode ) {
|
|
149
216
|
|
|
150
217
|
const chain = [ scene, lightsNode ];
|
|
151
|
-
const
|
|
218
|
+
const callId = this.renderer.info.calls;
|
|
152
219
|
|
|
153
|
-
let cacheKeyData = this.
|
|
220
|
+
let cacheKeyData = this.callHashCache.get( chain );
|
|
154
221
|
|
|
155
|
-
if ( cacheKeyData === undefined || cacheKeyData.
|
|
222
|
+
if ( cacheKeyData === undefined || cacheKeyData.callId !== callId ) {
|
|
156
223
|
|
|
157
224
|
const environmentNode = this.getEnvironmentNode( scene );
|
|
158
225
|
const fogNode = this.getFogNode( scene );
|
|
@@ -166,11 +233,11 @@ class Nodes extends DataMap {
|
|
|
166
233
|
if ( toneMappingNode ) cacheKey.push( toneMappingNode.getCacheKey() );
|
|
167
234
|
|
|
168
235
|
cacheKeyData = {
|
|
169
|
-
|
|
236
|
+
callId,
|
|
170
237
|
cacheKey: cacheKey.join( ',' )
|
|
171
238
|
};
|
|
172
239
|
|
|
173
|
-
this.
|
|
240
|
+
this.callHashCache.set( chain, cacheKeyData );
|
|
174
241
|
|
|
175
242
|
}
|
|
176
243
|
|