super-three 0.154.1 → 0.156.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 +360 -160
- package/build/three.js +360 -160
- package/build/three.min.js +1 -1
- package/build/three.module.js +355 -161
- package/build/three.module.min.js +1 -1
- package/examples/jsm/controls/OrbitControls.js +155 -25
- package/examples/jsm/csm/CSMShader.js +35 -1
- package/examples/jsm/environments/RoomEnvironment.js +1 -1
- package/examples/jsm/exporters/USDZExporter.js +1 -0
- package/examples/jsm/interactive/SelectionHelper.js +7 -0
- package/examples/jsm/libs/tween.module.js +790 -735
- package/examples/jsm/libs/utif.module.js +1644 -1558
- package/examples/jsm/loaders/DDSLoader.js +46 -3
- package/examples/jsm/loaders/EXRLoader.js +4 -4
- package/examples/jsm/loaders/FBXLoader.js +3 -1
- package/examples/jsm/loaders/GLTFLoader.js +25 -10
- package/examples/jsm/loaders/KTX2Loader.js +128 -79
- package/examples/jsm/loaders/LDrawLoader.js +1 -1
- package/examples/jsm/loaders/LogLuvLoader.js +2 -2
- package/examples/jsm/loaders/MMDLoader.js +10 -7
- package/examples/jsm/loaders/NRRDLoader.js +3 -3
- package/examples/jsm/loaders/PLYLoader.js +1 -1
- package/examples/jsm/loaders/RGBELoader.js +48 -66
- package/examples/jsm/loaders/STLLoader.js +7 -0
- package/examples/jsm/loaders/TGALoader.js +10 -10
- package/examples/jsm/loaders/VRMLLoader.js +1 -1
- package/examples/jsm/misc/GPUComputationRenderer.js +0 -9
- package/examples/jsm/misc/Volume.js +4 -6
- package/examples/jsm/nodes/Nodes.js +8 -6
- package/examples/jsm/nodes/accessors/BufferAttributeNode.js +29 -3
- package/examples/jsm/nodes/accessors/CubeTextureNode.js +20 -3
- package/examples/jsm/nodes/accessors/ExtendedMaterialNode.js +15 -4
- package/examples/jsm/nodes/accessors/InstanceNode.js +8 -8
- package/examples/jsm/nodes/accessors/LineMaterialNode.js +31 -0
- package/examples/jsm/nodes/accessors/MaterialNode.js +73 -61
- package/examples/jsm/nodes/accessors/MaterialReferenceNode.js +3 -0
- package/examples/jsm/nodes/accessors/Object3DNode.js +2 -2
- package/examples/jsm/nodes/accessors/SceneNode.js +6 -0
- package/examples/jsm/nodes/accessors/TextureNode.js +54 -9
- package/examples/jsm/nodes/accessors/TextureStoreNode.js +29 -0
- package/examples/jsm/nodes/core/AttributeNode.js +2 -2
- package/examples/jsm/nodes/core/LightingModel.js +7 -9
- package/examples/jsm/nodes/core/Node.js +28 -3
- package/examples/jsm/nodes/core/NodeBuilder.js +94 -12
- package/examples/jsm/nodes/core/NodeUniform.js +1 -1
- package/examples/jsm/nodes/core/OutputStructNode.js +58 -0
- package/examples/jsm/nodes/core/PropertyNode.js +6 -0
- package/examples/jsm/nodes/core/StackNode.js +4 -4
- package/examples/jsm/nodes/core/StructTypeNode.js +24 -0
- package/examples/jsm/nodes/display/BumpMapNode.js +77 -0
- package/examples/jsm/nodes/display/NormalMapNode.js +2 -2
- package/examples/jsm/nodes/display/ViewportNode.js +19 -5
- package/examples/jsm/nodes/functions/BSDF/BRDF_GGX.js +10 -2
- package/examples/jsm/nodes/functions/BSDF/Schlick_to_F0.js +13 -0
- package/examples/jsm/nodes/functions/PhongLightingModel.js +53 -14
- package/examples/jsm/nodes/functions/PhysicalLightingModel.js +236 -97
- package/examples/jsm/nodes/geometry/RangeNode.js +2 -2
- package/examples/jsm/nodes/gpgpu/ComputeNode.js +13 -0
- package/examples/jsm/nodes/lighting/AONode.js +1 -1
- package/examples/jsm/nodes/lighting/AnalyticLightNode.js +58 -20
- package/examples/jsm/nodes/lighting/DirectionalLightNode.js +7 -10
- package/examples/jsm/nodes/lighting/EnvironmentNode.js +22 -12
- package/examples/jsm/nodes/lighting/HemisphereLightNode.js +1 -1
- package/examples/jsm/nodes/lighting/LightingContextNode.js +12 -9
- package/examples/jsm/nodes/lighting/PointLightNode.js +7 -10
- package/examples/jsm/nodes/lighting/SpotLightNode.js +7 -10
- package/examples/jsm/nodes/materials/LineDashedNodeMaterial.js +54 -0
- package/examples/jsm/nodes/materials/Materials.js +2 -0
- package/examples/jsm/nodes/materials/MeshLambertNodeMaterial.js +34 -0
- package/examples/jsm/nodes/materials/MeshNormalNodeMaterial.js +2 -0
- package/examples/jsm/nodes/materials/MeshPhongNodeMaterial.js +2 -2
- package/examples/jsm/nodes/materials/MeshPhysicalNodeMaterial.js +19 -2
- package/examples/jsm/nodes/materials/MeshStandardNodeMaterial.js +2 -2
- package/examples/jsm/nodes/materials/NodeMaterial.js +61 -26
- package/examples/jsm/nodes/materials/SpriteNodeMaterial.js +2 -2
- package/examples/jsm/nodes/math/HashNode.js +35 -0
- package/examples/jsm/nodes/shadernode/ShaderNode.js +6 -2
- package/examples/jsm/nodes/utils/SplitNode.js +1 -1
- package/examples/jsm/objects/Reflector.js +1 -9
- package/examples/jsm/objects/Refractor.js +0 -8
- package/examples/jsm/offscreen/scene.js +0 -1
- package/examples/jsm/postprocessing/FilmPass.js +3 -5
- package/examples/jsm/postprocessing/MaskPass.js +4 -1
- package/examples/jsm/postprocessing/OutputPass.js +33 -14
- package/examples/jsm/postprocessing/RenderPass.js +30 -12
- package/examples/jsm/postprocessing/SAOPass.js +23 -98
- package/examples/jsm/postprocessing/SSAOPass.js +10 -30
- package/examples/jsm/postprocessing/UnrealBloomPass.js +21 -17
- package/examples/jsm/renderers/common/Backend.js +11 -8
- package/examples/jsm/renderers/common/Background.js +22 -20
- package/examples/jsm/renderers/common/Binding.js +14 -0
- package/examples/jsm/renderers/common/Bindings.js +7 -10
- package/examples/jsm/renderers/common/Geometries.js +1 -1
- package/examples/jsm/renderers/common/Pipelines.js +96 -47
- package/examples/jsm/renderers/common/RenderContext.js +1 -0
- package/examples/jsm/renderers/common/RenderContexts.js +41 -5
- package/examples/jsm/renderers/common/RenderList.js +12 -4
- package/examples/jsm/renderers/common/RenderObject.js +26 -6
- package/examples/jsm/renderers/common/RenderObjects.js +10 -7
- package/examples/jsm/renderers/common/Renderer.js +82 -42
- package/examples/jsm/renderers/common/SampledTexture.js +2 -1
- package/examples/jsm/renderers/common/Sampler.js +1 -1
- package/examples/jsm/renderers/common/StorageBuffer.js +1 -1
- package/examples/jsm/renderers/common/Textures.js +172 -20
- package/examples/jsm/renderers/common/nodes/NodeSampledTexture.js +2 -2
- package/examples/jsm/renderers/common/nodes/NodeSampler.js +1 -1
- package/examples/jsm/renderers/common/nodes/Nodes.js +58 -13
- package/examples/jsm/renderers/webgl/WebGLBackend.js +607 -0
- package/examples/jsm/renderers/webgl/nodes/GLSLNodeBuilder.js +118 -17
- package/examples/jsm/renderers/webgl/utils/WebGLAttributeUtils.js +84 -0
- package/examples/jsm/renderers/webgl/utils/WebGLExtensions.js +26 -0
- package/examples/jsm/renderers/webgl/utils/WebGLState.js +529 -0
- package/examples/jsm/renderers/webgl/utils/WebGLTextureUtils.js +199 -0
- package/examples/jsm/renderers/webgl/utils/WebGLUtils.js +242 -0
- package/examples/jsm/renderers/webgl-legacy/nodes/GLSL1NodeBuilder.js +340 -0
- package/examples/jsm/renderers/{webgl → webgl-legacy}/nodes/WebGLNodeBuilder.js +1 -1
- package/examples/jsm/renderers/webgpu/WebGPUBackend.js +320 -84
- package/examples/jsm/renderers/webgpu/WebGPURenderer.js +18 -2
- package/examples/jsm/renderers/webgpu/nodes/WGSLNodeBuilder.js +120 -66
- package/examples/jsm/renderers/webgpu/nodes/WGSLNodeFunction.js +2 -2
- package/examples/jsm/renderers/webgpu/utils/WebGPUAttributeUtils.js +55 -36
- package/examples/jsm/renderers/webgpu/utils/WebGPUBindingUtils.js +96 -5
- package/examples/jsm/renderers/webgpu/utils/WebGPUConstants.js +24 -22
- package/examples/jsm/renderers/webgpu/utils/WebGPUPipelineUtils.js +117 -139
- package/examples/jsm/renderers/webgpu/utils/WebGPUTextureUtils.js +60 -142
- package/examples/jsm/renderers/webgpu/utils/WebGPUUtils.js +7 -6
- package/examples/jsm/shaders/FilmShader.js +11 -54
- package/examples/jsm/shaders/OutputShader.js +19 -2
- package/examples/jsm/shaders/SAOShader.js +0 -13
- package/examples/jsm/shaders/SSAOShader.js +33 -26
- package/examples/jsm/utils/BufferGeometryUtils.js +13 -4
- package/examples/jsm/webxr/OculusHandPointerModel.js +2 -2
- package/package.json +2 -2
- package/src/Three.js +3 -0
- package/src/animation/PropertyBinding.js +1 -1
- package/src/audio/Audio.js +6 -0
- package/src/cameras/CubeCamera.js +1 -4
- package/src/constants.js +4 -1
- package/src/core/BufferAttribute.js +20 -0
- package/src/core/Object3D.js +2 -15
- package/src/core/RenderTarget.js +122 -0
- package/src/core/UniformsGroup.js +2 -2
- package/src/geometries/CapsuleGeometry.js +1 -1
- package/src/loaders/DataTextureLoader.js +19 -2
- package/src/materials/Material.js +2 -2
- package/src/math/Vector2.js +2 -2
- package/src/math/Vector3.js +3 -3
- package/src/math/Vector4.js +4 -4
- package/src/objects/Line.js +1 -1
- package/src/objects/Mesh.js +1 -1
- package/src/objects/Points.js +1 -1
- package/src/renderers/WebGLMultipleRenderTargets.js +0 -2
- package/src/renderers/WebGLRenderTarget.js +3 -110
- package/src/renderers/WebGLRenderer.js +83 -57
- package/src/renderers/shaders/ShaderChunk/iridescence_fragment.glsl.js +1 -2
- package/src/renderers/shaders/ShaderChunk/map_fragment.glsl.js +11 -1
- package/src/renderers/shaders/ShaderLib/background.glsl.js +8 -0
- package/src/renderers/webgl/WebGLBackground.js +5 -14
- package/src/renderers/webgl/WebGLGeometries.js +5 -1
- package/src/renderers/webgl/WebGLMaterials.js +1 -1
- package/src/renderers/webgl/WebGLProgram.js +2 -0
- package/src/renderers/webgl/WebGLPrograms.js +19 -3
- package/src/renderers/webgl/WebGLTextures.js +101 -16
- package/src/renderers/webgl/WebGLUtils.js +27 -20
- package/src/textures/CompressedCubeTexture.js +19 -0
- package/src/textures/Texture.js +2 -2
- package/src/utils.js +9 -1
- package/examples/jsm/nodes/functions/BSDF/BRDF_BlinnPhong.js +0 -30
- package/examples/jsm/renderers/common/RenderTarget.js +0 -15
- package/examples/jsm/renderers/common/nodes/NodeRender.js +0 -302
- /package/examples/jsm/renderers/{webgl → webgl-legacy}/nodes/SlotNode.js +0 -0
- /package/examples/jsm/renderers/{webgl → webgl-legacy}/nodes/WebGLNodes.js +0 -0
|
@@ -23,17 +23,22 @@ class Pipelines extends DataMap {
|
|
|
23
23
|
|
|
24
24
|
}
|
|
25
25
|
|
|
26
|
-
getForCompute( computeNode ) {
|
|
26
|
+
getForCompute( computeNode, bindings ) {
|
|
27
27
|
|
|
28
28
|
const { backend } = this;
|
|
29
29
|
|
|
30
30
|
const data = this.get( computeNode );
|
|
31
31
|
|
|
32
|
-
if (
|
|
32
|
+
if ( this._needsComputeUpdate( computeNode ) ) {
|
|
33
33
|
|
|
34
|
-
|
|
34
|
+
const previousPipeline = data.pipeline;
|
|
35
35
|
|
|
36
|
-
|
|
36
|
+
if ( previousPipeline ) {
|
|
37
|
+
|
|
38
|
+
previousPipeline.usedTimes --;
|
|
39
|
+
previousPipeline.computeProgram.usedTimes --;
|
|
40
|
+
|
|
41
|
+
}
|
|
37
42
|
|
|
38
43
|
// get shader
|
|
39
44
|
|
|
@@ -45,7 +50,7 @@ class Pipelines extends DataMap {
|
|
|
45
50
|
|
|
46
51
|
if ( stageCompute === undefined ) {
|
|
47
52
|
|
|
48
|
-
if ( previousPipeline ) this._releaseProgram( previousPipeline.
|
|
53
|
+
if ( previousPipeline && previousPipeline.computeProgram.usedTimes === 0 ) this._releaseProgram( previousPipeline.computeProgram );
|
|
49
54
|
|
|
50
55
|
stageCompute = new ProgrammableStage( nodeBuilder.computeShader, 'compute' );
|
|
51
56
|
this.programs.compute.set( nodeBuilder.computeShader, stageCompute );
|
|
@@ -56,7 +61,17 @@ class Pipelines extends DataMap {
|
|
|
56
61
|
|
|
57
62
|
// determine compute pipeline
|
|
58
63
|
|
|
59
|
-
const
|
|
64
|
+
const cacheKey = this._getComputeCacheKey( computeNode, stageCompute );
|
|
65
|
+
|
|
66
|
+
let pipeline = this.caches.get( cacheKey );
|
|
67
|
+
|
|
68
|
+
if ( pipeline === undefined ) {
|
|
69
|
+
|
|
70
|
+
if ( previousPipeline && previousPipeline.usedTimes === 0 ) this._releasePipeline( computeNode );
|
|
71
|
+
|
|
72
|
+
pipeline = this._getComputePipeline( computeNode, stageCompute, cacheKey, bindings );
|
|
73
|
+
|
|
74
|
+
}
|
|
60
75
|
|
|
61
76
|
// keep track of all used times
|
|
62
77
|
|
|
@@ -65,6 +80,7 @@ class Pipelines extends DataMap {
|
|
|
65
80
|
|
|
66
81
|
//
|
|
67
82
|
|
|
83
|
+
data.version = computeNode.version;
|
|
68
84
|
data.pipeline = pipeline;
|
|
69
85
|
|
|
70
86
|
}
|
|
@@ -79,11 +95,17 @@ class Pipelines extends DataMap {
|
|
|
79
95
|
|
|
80
96
|
const data = this.get( renderObject );
|
|
81
97
|
|
|
82
|
-
if ( this.
|
|
98
|
+
if ( this._needsRenderUpdate( renderObject ) ) {
|
|
99
|
+
|
|
100
|
+
const previousPipeline = data.pipeline;
|
|
83
101
|
|
|
84
|
-
|
|
102
|
+
if ( previousPipeline ) {
|
|
85
103
|
|
|
86
|
-
|
|
104
|
+
previousPipeline.usedTimes --;
|
|
105
|
+
previousPipeline.vertexProgram.usedTimes --;
|
|
106
|
+
previousPipeline.fragmentProgram.usedTimes --;
|
|
107
|
+
|
|
108
|
+
}
|
|
87
109
|
|
|
88
110
|
// get shader
|
|
89
111
|
|
|
@@ -95,7 +117,7 @@ class Pipelines extends DataMap {
|
|
|
95
117
|
|
|
96
118
|
if ( stageVertex === undefined ) {
|
|
97
119
|
|
|
98
|
-
if ( previousPipeline ) this._releaseProgram( previousPipeline.vertexProgram );
|
|
120
|
+
if ( previousPipeline && previousPipeline.vertexProgram.usedTimes === 0 ) this._releaseProgram( previousPipeline.vertexProgram );
|
|
99
121
|
|
|
100
122
|
stageVertex = new ProgrammableStage( nodeBuilder.vertexShader, 'vertex' );
|
|
101
123
|
this.programs.vertex.set( nodeBuilder.vertexShader, stageVertex );
|
|
@@ -108,7 +130,7 @@ class Pipelines extends DataMap {
|
|
|
108
130
|
|
|
109
131
|
if ( stageFragment === undefined ) {
|
|
110
132
|
|
|
111
|
-
if ( previousPipeline ) this._releaseProgram( previousPipeline.
|
|
133
|
+
if ( previousPipeline && previousPipeline.fragmentProgram.usedTimes === 0 ) this._releaseProgram( previousPipeline.fragmentProgram );
|
|
112
134
|
|
|
113
135
|
stageFragment = new ProgrammableStage( nodeBuilder.fragmentShader, 'fragment' );
|
|
114
136
|
this.programs.fragment.set( nodeBuilder.fragmentShader, stageFragment );
|
|
@@ -119,7 +141,21 @@ class Pipelines extends DataMap {
|
|
|
119
141
|
|
|
120
142
|
// determine render pipeline
|
|
121
143
|
|
|
122
|
-
const
|
|
144
|
+
const cacheKey = this._getRenderCacheKey( renderObject, stageVertex, stageFragment );
|
|
145
|
+
|
|
146
|
+
let pipeline = this.caches.get( cacheKey );
|
|
147
|
+
|
|
148
|
+
if ( pipeline === undefined ) {
|
|
149
|
+
|
|
150
|
+
if ( previousPipeline && previousPipeline.usedTimes === 0 ) this._releasePipeline( previousPipeline );
|
|
151
|
+
|
|
152
|
+
pipeline = this._getRenderPipeline( renderObject, stageVertex, stageFragment, cacheKey );
|
|
153
|
+
|
|
154
|
+
} else {
|
|
155
|
+
|
|
156
|
+
renderObject.pipeline = pipeline;
|
|
157
|
+
|
|
158
|
+
}
|
|
123
159
|
|
|
124
160
|
// keep track of all used times
|
|
125
161
|
|
|
@@ -139,18 +175,31 @@ class Pipelines extends DataMap {
|
|
|
139
175
|
|
|
140
176
|
delete( object ) {
|
|
141
177
|
|
|
142
|
-
const pipeline = this.
|
|
178
|
+
const pipeline = this.get( object ).pipeline;
|
|
179
|
+
|
|
180
|
+
if ( pipeline ) {
|
|
181
|
+
|
|
182
|
+
// pipeline
|
|
183
|
+
|
|
184
|
+
pipeline.usedTimes --;
|
|
143
185
|
|
|
144
|
-
|
|
186
|
+
if ( pipeline.usedTimes === 0 ) this._releasePipeline( pipeline );
|
|
187
|
+
|
|
188
|
+
// programs
|
|
145
189
|
|
|
146
190
|
if ( pipeline.isComputePipeline ) {
|
|
147
191
|
|
|
148
|
-
|
|
192
|
+
pipeline.computeProgram.usedTimes --;
|
|
193
|
+
|
|
194
|
+
if ( pipeline.computeProgram.usedTimes === 0 ) this._releaseProgram( pipeline.computeProgram );
|
|
149
195
|
|
|
150
196
|
} else {
|
|
151
197
|
|
|
152
|
-
|
|
153
|
-
|
|
198
|
+
pipeline.fragmentProgram.usedTimes --;
|
|
199
|
+
pipeline.vertexProgram.usedTimes --;
|
|
200
|
+
|
|
201
|
+
if ( pipeline.vertexProgram.usedTimes === 0 ) this._releaseProgram( pipeline.vertexProgram );
|
|
202
|
+
if ( pipeline.fragmentProgram.usedTimes === 0 ) this._releaseProgram( pipeline.fragmentProgram );
|
|
154
203
|
|
|
155
204
|
}
|
|
156
205
|
|
|
@@ -173,11 +222,17 @@ class Pipelines extends DataMap {
|
|
|
173
222
|
|
|
174
223
|
}
|
|
175
224
|
|
|
176
|
-
|
|
225
|
+
updateForRender( renderObject ) {
|
|
226
|
+
|
|
227
|
+
this.getForRender( renderObject );
|
|
228
|
+
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
_getComputePipeline( computeNode, stageCompute, cacheKey, bindings ) {
|
|
177
232
|
|
|
178
233
|
// check for existing pipeline
|
|
179
234
|
|
|
180
|
-
|
|
235
|
+
cacheKey = cacheKey || this._getComputeCacheKey( computeNode, stageCompute );
|
|
181
236
|
|
|
182
237
|
let pipeline = this.caches.get( cacheKey );
|
|
183
238
|
|
|
@@ -187,7 +242,7 @@ class Pipelines extends DataMap {
|
|
|
187
242
|
|
|
188
243
|
this.caches.set( cacheKey, pipeline );
|
|
189
244
|
|
|
190
|
-
this.backend.createComputePipeline( pipeline );
|
|
245
|
+
this.backend.createComputePipeline( pipeline, bindings );
|
|
191
246
|
|
|
192
247
|
}
|
|
193
248
|
|
|
@@ -195,11 +250,11 @@ class Pipelines extends DataMap {
|
|
|
195
250
|
|
|
196
251
|
}
|
|
197
252
|
|
|
198
|
-
_getRenderPipeline( renderObject, stageVertex, stageFragment ) {
|
|
253
|
+
_getRenderPipeline( renderObject, stageVertex, stageFragment, cacheKey ) {
|
|
199
254
|
|
|
200
255
|
// check for existing pipeline
|
|
201
256
|
|
|
202
|
-
|
|
257
|
+
cacheKey = cacheKey || this._getRenderCacheKey( renderObject, stageVertex, stageFragment );
|
|
203
258
|
|
|
204
259
|
let pipeline = this.caches.get( cacheKey );
|
|
205
260
|
|
|
@@ -213,15 +268,15 @@ class Pipelines extends DataMap {
|
|
|
213
268
|
|
|
214
269
|
this.backend.createRenderPipeline( renderObject );
|
|
215
270
|
|
|
216
|
-
}
|
|
271
|
+
}
|
|
217
272
|
|
|
218
|
-
|
|
273
|
+
return pipeline;
|
|
219
274
|
|
|
220
|
-
|
|
275
|
+
}
|
|
221
276
|
|
|
222
|
-
|
|
277
|
+
_getComputeCacheKey( computeNode, stageCompute ) {
|
|
223
278
|
|
|
224
|
-
return
|
|
279
|
+
return 'compute' + computeNode.id + stageCompute.id;
|
|
225
280
|
|
|
226
281
|
}
|
|
227
282
|
|
|
@@ -247,36 +302,30 @@ class Pipelines extends DataMap {
|
|
|
247
302
|
|
|
248
303
|
}
|
|
249
304
|
|
|
250
|
-
_releasePipeline(
|
|
251
|
-
|
|
252
|
-
const pipeline = this.get( object ).pipeline;
|
|
305
|
+
_releasePipeline( pipeline ) {
|
|
253
306
|
|
|
254
|
-
|
|
307
|
+
this.caches.delete( pipeline.cacheKey );
|
|
255
308
|
|
|
256
|
-
|
|
309
|
+
}
|
|
257
310
|
|
|
258
|
-
|
|
311
|
+
_releaseProgram( program ) {
|
|
259
312
|
|
|
260
|
-
|
|
313
|
+
const code = program.code;
|
|
314
|
+
const stage = program.stage;
|
|
261
315
|
|
|
262
|
-
|
|
316
|
+
this.programs[ stage ].delete( code );
|
|
263
317
|
|
|
264
318
|
}
|
|
265
319
|
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
if ( -- program.usedTimes === 0 ) {
|
|
320
|
+
_needsComputeUpdate( computeNode ) {
|
|
269
321
|
|
|
270
|
-
|
|
271
|
-
const stage = program.stage;
|
|
272
|
-
|
|
273
|
-
this.programs[ stage ].delete( code );
|
|
322
|
+
const data = this.get( computeNode );
|
|
274
323
|
|
|
275
|
-
|
|
324
|
+
return data.pipeline === undefined || data.version !== computeNode.version;
|
|
276
325
|
|
|
277
326
|
}
|
|
278
327
|
|
|
279
|
-
|
|
328
|
+
_needsRenderUpdate( renderObject ) {
|
|
280
329
|
|
|
281
330
|
const data = this.get( renderObject );
|
|
282
331
|
const material = renderObject.material;
|
|
@@ -294,7 +343,7 @@ class Pipelines extends DataMap {
|
|
|
294
343
|
data.stencilWrite !== material.stencilWrite || data.stencilFunc !== material.stencilFunc ||
|
|
295
344
|
data.stencilFail !== material.stencilFail || data.stencilZFail !== material.stencilZFail || data.stencilZPass !== material.stencilZPass ||
|
|
296
345
|
data.stencilFuncMask !== material.stencilFuncMask || data.stencilWriteMask !== material.stencilWriteMask ||
|
|
297
|
-
data.side !== material.side
|
|
346
|
+
data.side !== material.side || data.alphaToCoverage !== material.alphaToCoverage
|
|
298
347
|
) {
|
|
299
348
|
|
|
300
349
|
data.material = material; data.materialVersion = material.version;
|
|
@@ -306,13 +355,13 @@ class Pipelines extends DataMap {
|
|
|
306
355
|
data.stencilWrite = material.stencilWrite; data.stencilFunc = material.stencilFunc;
|
|
307
356
|
data.stencilFail = material.stencilFail; data.stencilZFail = material.stencilZFail; data.stencilZPass = material.stencilZPass;
|
|
308
357
|
data.stencilFuncMask = material.stencilFuncMask; data.stencilWriteMask = material.stencilWriteMask;
|
|
309
|
-
data.side = material.side;
|
|
358
|
+
data.side = material.side; data.alphaToCoverage = material.alphaToCoverage;
|
|
310
359
|
|
|
311
360
|
needsUpdate = true;
|
|
312
361
|
|
|
313
362
|
}
|
|
314
363
|
|
|
315
|
-
return needsUpdate || data.pipeline
|
|
364
|
+
return needsUpdate || data.pipeline === undefined;
|
|
316
365
|
|
|
317
366
|
}
|
|
318
367
|
|
|
@@ -5,31 +5,67 @@ class RenderContexts {
|
|
|
5
5
|
|
|
6
6
|
constructor() {
|
|
7
7
|
|
|
8
|
-
this.
|
|
8
|
+
this.chainMaps = {};
|
|
9
9
|
|
|
10
10
|
}
|
|
11
11
|
|
|
12
|
-
get( scene, camera ) {
|
|
12
|
+
get( scene, camera, renderTarget = null ) {
|
|
13
13
|
|
|
14
14
|
const chainKey = [ scene, camera ];
|
|
15
15
|
|
|
16
|
-
let
|
|
16
|
+
let attachmentState;
|
|
17
|
+
|
|
18
|
+
if ( renderTarget === null ) {
|
|
19
|
+
|
|
20
|
+
attachmentState = 'default';
|
|
21
|
+
|
|
22
|
+
} else {
|
|
23
|
+
|
|
24
|
+
let format, count;
|
|
25
|
+
|
|
26
|
+
if ( renderTarget.isWebGLMultipleRenderTargets ) {
|
|
27
|
+
|
|
28
|
+
format = renderTarget.texture[ 0 ].format;
|
|
29
|
+
count = renderTarget.texture.length;
|
|
30
|
+
|
|
31
|
+
} else {
|
|
32
|
+
|
|
33
|
+
format = renderTarget.texture.format;
|
|
34
|
+
count = 1;
|
|
35
|
+
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
attachmentState = `${count}:${format}:${renderTarget.samples}:${renderTarget.depthBuffer}:${renderTarget.stencilBuffer}`;
|
|
39
|
+
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
const chainMap = this.getChainMap( attachmentState );
|
|
43
|
+
|
|
44
|
+
let renderState = chainMap.get( chainKey );
|
|
17
45
|
|
|
18
46
|
if ( renderState === undefined ) {
|
|
19
47
|
|
|
20
48
|
renderState = new RenderContext();
|
|
21
49
|
|
|
22
|
-
|
|
50
|
+
chainMap.set( chainKey, renderState );
|
|
23
51
|
|
|
24
52
|
}
|
|
25
53
|
|
|
54
|
+
if ( renderTarget !== null ) renderState.sampleCount = renderTarget.samples === 0 ? 1 : renderTarget.samples;
|
|
55
|
+
|
|
26
56
|
return renderState;
|
|
27
57
|
|
|
28
58
|
}
|
|
29
59
|
|
|
60
|
+
getChainMap( attachmentState ) {
|
|
61
|
+
|
|
62
|
+
return this.chainMaps[ attachmentState ] || ( this.chainMaps[ attachmentState ] = new ChainMap() );
|
|
63
|
+
|
|
64
|
+
}
|
|
65
|
+
|
|
30
66
|
dispose() {
|
|
31
67
|
|
|
32
|
-
this.
|
|
68
|
+
this.chainMaps = {};
|
|
33
69
|
|
|
34
70
|
}
|
|
35
71
|
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { LightsNode } from '../../nodes/Nodes.js';
|
|
2
2
|
|
|
3
3
|
function painterSortStable( a, b ) {
|
|
4
4
|
|
|
@@ -58,12 +58,14 @@ class RenderList {
|
|
|
58
58
|
this.opaque = [];
|
|
59
59
|
this.transparent = [];
|
|
60
60
|
|
|
61
|
-
this.lightsNode =
|
|
61
|
+
this.lightsNode = new LightsNode( [] );
|
|
62
62
|
this.lightsArray = [];
|
|
63
63
|
|
|
64
|
+
this.occlusionQueryCount = 0;
|
|
65
|
+
|
|
64
66
|
}
|
|
65
67
|
|
|
66
|
-
|
|
68
|
+
begin() {
|
|
67
69
|
|
|
68
70
|
this.renderItemsIndex = 0;
|
|
69
71
|
|
|
@@ -71,6 +73,8 @@ class RenderList {
|
|
|
71
73
|
this.transparent.length = 0;
|
|
72
74
|
this.lightsArray.length = 0;
|
|
73
75
|
|
|
76
|
+
this.occlusionQueryCount = 0;
|
|
77
|
+
|
|
74
78
|
return this;
|
|
75
79
|
|
|
76
80
|
}
|
|
@@ -117,6 +121,8 @@ class RenderList {
|
|
|
117
121
|
|
|
118
122
|
const renderItem = this.getNextRenderItem( object, geometry, material, groupOrder, z, group );
|
|
119
123
|
|
|
124
|
+
if ( object.occlusionTest === true ) this.occlusionQueryCount ++;
|
|
125
|
+
|
|
120
126
|
( material.transparent === true ? this.transparent : this.opaque ).push( renderItem );
|
|
121
127
|
|
|
122
128
|
}
|
|
@@ -166,7 +172,9 @@ class RenderList {
|
|
|
166
172
|
renderItem.object = null;
|
|
167
173
|
renderItem.geometry = null;
|
|
168
174
|
renderItem.material = null;
|
|
169
|
-
renderItem.
|
|
175
|
+
renderItem.groupOrder = null;
|
|
176
|
+
renderItem.renderOrder = null;
|
|
177
|
+
renderItem.z = null;
|
|
170
178
|
renderItem.group = null;
|
|
171
179
|
|
|
172
180
|
}
|
|
@@ -2,7 +2,7 @@ let id = 0;
|
|
|
2
2
|
|
|
3
3
|
export default class RenderObject {
|
|
4
4
|
|
|
5
|
-
constructor( nodes, geometries, renderer, object, material, scene, camera, lightsNode ) {
|
|
5
|
+
constructor( nodes, geometries, renderer, object, material, scene, camera, lightsNode, renderContext ) {
|
|
6
6
|
|
|
7
7
|
this._nodes = nodes;
|
|
8
8
|
this._geometries = geometries;
|
|
@@ -15,18 +15,23 @@ export default class RenderObject {
|
|
|
15
15
|
this.scene = scene;
|
|
16
16
|
this.camera = camera;
|
|
17
17
|
this.lightsNode = lightsNode;
|
|
18
|
+
this.context = renderContext;
|
|
18
19
|
|
|
19
20
|
this.geometry = object.geometry;
|
|
20
21
|
|
|
21
22
|
this.attributes = null;
|
|
22
|
-
this.context = null;
|
|
23
23
|
this.pipeline = null;
|
|
24
|
+
this.vertexBuffers = null;
|
|
24
25
|
|
|
26
|
+
this._nodeBuilder = null;
|
|
27
|
+
this._bindings = null;
|
|
25
28
|
this._materialVersion = - 1;
|
|
26
29
|
this._materialCacheKey = '';
|
|
27
30
|
|
|
28
31
|
this.onDispose = null;
|
|
29
32
|
|
|
33
|
+
this.isRenderObject = true;
|
|
34
|
+
|
|
30
35
|
this.onMaterialDispose = () => {
|
|
31
36
|
|
|
32
37
|
this.dispose();
|
|
@@ -39,13 +44,13 @@ export default class RenderObject {
|
|
|
39
44
|
|
|
40
45
|
getNodeBuilder() {
|
|
41
46
|
|
|
42
|
-
return this._nodes.getForRender( this );
|
|
47
|
+
return this._nodeBuilder || ( this._nodeBuilder = this._nodes.getForRender( this ) );
|
|
43
48
|
|
|
44
49
|
}
|
|
45
50
|
|
|
46
51
|
getBindings() {
|
|
47
52
|
|
|
48
|
-
return this.getNodeBuilder().
|
|
53
|
+
return this._bindings || ( this._bindings = this.getNodeBuilder().createBindings() );
|
|
49
54
|
|
|
50
55
|
}
|
|
51
56
|
|
|
@@ -57,7 +62,7 @@ export default class RenderObject {
|
|
|
57
62
|
|
|
58
63
|
getChainArray() {
|
|
59
64
|
|
|
60
|
-
return [ this.object, this.material, this.
|
|
65
|
+
return [ this.object, this.material, this.context, this.lightsNode ];
|
|
61
66
|
|
|
62
67
|
}
|
|
63
68
|
|
|
@@ -69,19 +74,34 @@ export default class RenderObject {
|
|
|
69
74
|
const geometry = this.geometry;
|
|
70
75
|
|
|
71
76
|
const attributes = [];
|
|
77
|
+
const vertexBuffers = new Set();
|
|
72
78
|
|
|
73
79
|
for ( const nodeAttribute of nodeAttributes ) {
|
|
74
80
|
|
|
75
|
-
|
|
81
|
+
const attribute = nodeAttribute.node && nodeAttribute.node.attribute ? nodeAttribute.node.attribute : geometry.getAttribute( nodeAttribute.name );
|
|
82
|
+
|
|
83
|
+
attributes.push( attribute );
|
|
84
|
+
|
|
85
|
+
const bufferAttribute = attribute.isInterleavedBufferAttribute ? attribute.data : attribute;
|
|
86
|
+
vertexBuffers.add( bufferAttribute );
|
|
76
87
|
|
|
77
88
|
}
|
|
78
89
|
|
|
79
90
|
this.attributes = attributes;
|
|
91
|
+
this.vertexBuffers = Array.from( vertexBuffers.values() );
|
|
80
92
|
|
|
81
93
|
return attributes;
|
|
82
94
|
|
|
83
95
|
}
|
|
84
96
|
|
|
97
|
+
getVertexBuffers() {
|
|
98
|
+
|
|
99
|
+
if ( this.vertexBuffers === null ) this.getAttributes();
|
|
100
|
+
|
|
101
|
+
return this.vertexBuffers;
|
|
102
|
+
|
|
103
|
+
}
|
|
104
|
+
|
|
85
105
|
getCacheKey() {
|
|
86
106
|
|
|
87
107
|
const { material, scene, lightsNode } = this;
|
|
@@ -4,12 +4,13 @@ import RenderObject from './RenderObject.js';
|
|
|
4
4
|
|
|
5
5
|
class RenderObjects {
|
|
6
6
|
|
|
7
|
-
constructor( renderer, nodes, geometries, pipelines, info ) {
|
|
7
|
+
constructor( renderer, nodes, geometries, pipelines, bindings, info ) {
|
|
8
8
|
|
|
9
9
|
this.renderer = renderer;
|
|
10
10
|
this.nodes = nodes;
|
|
11
11
|
this.geometries = geometries;
|
|
12
12
|
this.pipelines = pipelines;
|
|
13
|
+
this.bindings = bindings;
|
|
13
14
|
this.info = info;
|
|
14
15
|
|
|
15
16
|
this.chainMaps = {};
|
|
@@ -17,16 +18,16 @@ class RenderObjects {
|
|
|
17
18
|
|
|
18
19
|
}
|
|
19
20
|
|
|
20
|
-
get( object, material, scene, camera, lightsNode, passId ) {
|
|
21
|
+
get( object, material, scene, camera, lightsNode, renderContext, passId ) {
|
|
21
22
|
|
|
22
23
|
const chainMap = this.getChainMap( passId );
|
|
23
|
-
const chainArray = [ object, material,
|
|
24
|
+
const chainArray = [ object, material, renderContext, lightsNode ];
|
|
24
25
|
|
|
25
26
|
let renderObject = chainMap.get( chainArray );
|
|
26
27
|
|
|
27
28
|
if ( renderObject === undefined ) {
|
|
28
29
|
|
|
29
|
-
renderObject = this.createRenderObject( this.nodes, this.geometries, this.renderer, object, material, scene, camera, lightsNode, passId );
|
|
30
|
+
renderObject = this.createRenderObject( this.nodes, this.geometries, this.renderer, object, material, scene, camera, lightsNode, renderContext, passId );
|
|
30
31
|
|
|
31
32
|
chainMap.set( chainArray, renderObject );
|
|
32
33
|
|
|
@@ -39,7 +40,7 @@ class RenderObjects {
|
|
|
39
40
|
|
|
40
41
|
renderObject.dispose();
|
|
41
42
|
|
|
42
|
-
renderObject = this.get( object, material, scene, camera, lightsNode );
|
|
43
|
+
renderObject = this.get( object, material, scene, camera, lightsNode, renderContext, passId );
|
|
43
44
|
|
|
44
45
|
}
|
|
45
46
|
|
|
@@ -62,11 +63,12 @@ class RenderObjects {
|
|
|
62
63
|
|
|
63
64
|
}
|
|
64
65
|
|
|
65
|
-
createRenderObject( nodes, geometries, renderer, object, material, scene, camera, lightsNode, passId ) {
|
|
66
|
+
createRenderObject( nodes, geometries, renderer, object, material, scene, camera, lightsNode, renderContext, passId ) {
|
|
66
67
|
|
|
67
68
|
const chainMap = this.getChainMap( passId );
|
|
68
69
|
const dataMap = this.dataMap;
|
|
69
|
-
|
|
70
|
+
|
|
71
|
+
const renderObject = new RenderObject( nodes, geometries, renderer, object, material, scene, camera, lightsNode, renderContext );
|
|
70
72
|
|
|
71
73
|
const data = dataMap.get( renderObject );
|
|
72
74
|
data.cacheKey = renderObject.getCacheKey();
|
|
@@ -76,6 +78,7 @@ class RenderObjects {
|
|
|
76
78
|
dataMap.delete( renderObject );
|
|
77
79
|
|
|
78
80
|
this.pipelines.delete( renderObject );
|
|
81
|
+
this.bindings.delete( renderObject );
|
|
79
82
|
this.nodes.delete( renderObject );
|
|
80
83
|
|
|
81
84
|
chainMap.delete( renderObject.getChainArray() );
|