super-three 0.172.0 → 0.173.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +1 -1
- package/build/three.cjs +439 -380
- package/build/three.core.js +413 -41
- package/build/three.core.min.js +2 -2
- package/build/three.module.js +28 -344
- package/build/three.module.min.js +2 -2
- package/build/three.tsl.js +11 -3
- package/build/three.tsl.min.js +2 -2
- package/build/three.webgpu.js +7550 -1798
- package/build/three.webgpu.min.js +2 -2
- package/build/three.webgpu.nodes.js +7551 -1798
- package/build/three.webgpu.nodes.min.js +2 -2
- package/examples/jsm/animation/CCDIKSolver.js +6 -5
- package/examples/jsm/capabilities/WebGPU.js +1 -1
- package/examples/jsm/controls/ArcballControls.js +23 -21
- package/examples/jsm/exporters/GLTFExporter.js +26 -25
- package/examples/jsm/geometries/TextGeometry.js +1 -12
- package/examples/jsm/interactive/InteractiveGroup.js +108 -51
- package/examples/jsm/libs/demuxer_mp4.js +109 -0
- package/examples/jsm/loaders/GCodeLoader.js +3 -1
- package/examples/jsm/loaders/GLTFLoader.js +0 -2
- package/examples/jsm/loaders/TDSLoader.js +0 -1
- package/examples/jsm/materials/MeshGouraudMaterial.js +2 -0
- package/examples/jsm/misc/GPUComputationRenderer.js +6 -7
- package/examples/jsm/misc/ProgressiveLightMap.js +4 -3
- package/examples/jsm/misc/ProgressiveLightMapGPU.js +4 -3
- package/examples/jsm/misc/Volume.js +7 -5
- package/examples/jsm/misc/VolumeSlice.js +5 -3
- package/examples/jsm/objects/WaterMesh.js +25 -20
- package/examples/jsm/physics/JoltPhysics.js +7 -7
- package/examples/jsm/physics/RapierPhysics.js +4 -4
- package/examples/jsm/postprocessing/EffectComposer.js +23 -2
- package/examples/jsm/postprocessing/OutputPass.js +2 -0
- package/examples/jsm/postprocessing/Pass.js +6 -1
- package/examples/jsm/shaders/OutputShader.js +5 -1
- package/examples/jsm/transpiler/GLSLDecoder.js +2 -2
- package/examples/jsm/transpiler/TSLEncoder.js +2 -0
- package/package.json +1 -1
- package/src/Three.Core.js +2 -0
- package/src/Three.TSL.js +9 -1
- package/src/cameras/ArrayCamera.js +1 -0
- package/src/constants.js +6 -1
- package/src/core/BufferAttribute.js +4 -0
- package/src/core/EventDispatcher.js +8 -6
- package/src/extras/ImageUtils.js +1 -11
- package/src/loaders/nodes/NodeObjectLoader.js +1 -1
- package/src/materials/nodes/MeshBasicNodeMaterial.js +1 -1
- package/src/materials/nodes/MeshPhysicalNodeMaterial.js +1 -1
- package/src/materials/nodes/NodeMaterial.js +5 -5
- package/src/materials/nodes/NodeMaterials.js +0 -1
- package/src/materials/nodes/PointsNodeMaterial.js +109 -7
- package/src/materials/nodes/SpriteNodeMaterial.js +1 -1
- package/src/materials/nodes/VolumeNodeMaterial.js +3 -3
- package/src/materials/nodes/manager/NodeMaterialObserver.js +8 -0
- package/src/nodes/Nodes.js +4 -0
- package/src/nodes/TSL.js +4 -0
- package/src/nodes/accessors/Arrays.js +30 -8
- package/src/nodes/accessors/BatchNode.js +3 -3
- package/src/nodes/accessors/BufferAttributeNode.js +1 -1
- package/src/nodes/accessors/Camera.js +64 -3
- package/src/nodes/accessors/InstanceNode.js +1 -1
- package/src/nodes/accessors/MaterialNode.js +9 -9
- package/src/nodes/accessors/ModelViewProjectionNode.js +1 -1
- package/src/nodes/accessors/Normal.js +6 -2
- package/src/nodes/accessors/Object3DNode.js +0 -1
- package/src/nodes/accessors/Position.js +6 -6
- package/src/nodes/accessors/ReferenceBaseNode.js +2 -4
- package/src/nodes/accessors/ReferenceNode.js +2 -3
- package/src/nodes/accessors/StorageBufferNode.js +42 -5
- package/src/nodes/accessors/Tangent.js +2 -2
- package/src/nodes/accessors/Texture3DNode.js +1 -1
- package/src/nodes/accessors/TextureNode.js +12 -5
- package/src/nodes/accessors/UniformArrayNode.js +9 -3
- package/src/nodes/accessors/VelocityNode.js +0 -2
- package/src/nodes/code/ScriptableNode.js +3 -3
- package/src/nodes/core/ArrayNode.js +125 -0
- package/src/nodes/core/ConstNode.js +8 -0
- package/src/nodes/core/Node.js +14 -1
- package/src/nodes/core/NodeBuilder.js +229 -19
- package/src/nodes/core/NodeUtils.js +11 -1
- package/src/nodes/core/NodeVar.js +17 -1
- package/src/nodes/core/OutputStructNode.js +19 -9
- package/src/nodes/core/StackNode.js +20 -1
- package/src/nodes/core/StructNode.js +121 -0
- package/src/nodes/core/StructType.js +13 -0
- package/src/nodes/core/StructTypeNode.js +82 -21
- package/src/nodes/core/TempNode.js +1 -1
- package/src/nodes/core/VarNode.js +94 -7
- package/src/nodes/core/VaryingNode.js +19 -3
- package/src/nodes/display/BlendModes.js +88 -1
- package/src/nodes/display/BumpMapNode.js +6 -6
- package/src/nodes/display/NormalMapNode.js +6 -6
- package/src/nodes/display/PassNode.js +3 -1
- package/src/nodes/display/ScreenNode.js +9 -0
- package/src/nodes/fog/Fog.js +17 -0
- package/src/nodes/gpgpu/AtomicFunctionNode.js +20 -4
- package/src/nodes/gpgpu/ComputeBuiltinNode.js +8 -0
- package/src/nodes/gpgpu/WorkgroupInfoNode.js +1 -1
- package/src/nodes/lighting/ShadowNode.js +1 -1
- package/src/nodes/math/ConditionalNode.js +8 -1
- package/src/nodes/math/MathNode.js +14 -1
- package/src/nodes/math/OperatorNode.js +96 -18
- package/src/nodes/pmrem/PMREMUtils.js +1 -1
- package/src/nodes/shapes/Shapes.js +33 -0
- package/src/nodes/tsl/TSLBase.js +1 -0
- package/src/nodes/tsl/TSLCore.js +22 -2
- package/src/nodes/utils/ArrayElementNode.js +1 -1
- package/src/nodes/utils/LoopNode.js +8 -1
- package/src/nodes/utils/MemberNode.js +68 -0
- package/src/nodes/utils/StorageArrayElementNode.js +14 -0
- package/src/nodes/utils/Timer.js +21 -0
- package/src/objects/BatchedMesh.js +1 -1
- package/src/objects/Line.js +6 -6
- package/src/renderers/WebGLRenderer.js +7 -0
- package/src/renderers/common/Animation.js +23 -1
- package/src/renderers/common/Backend.js +58 -15
- package/src/renderers/common/Background.js +14 -0
- package/src/renderers/common/Binding.js +1 -1
- package/src/renderers/common/BufferUtils.js +1 -1
- package/src/renderers/common/BundleGroup.js +1 -1
- package/src/renderers/common/ChainMap.js +9 -7
- package/src/renderers/common/ClippingContext.js +1 -1
- package/src/renderers/common/Color4.js +7 -3
- package/src/renderers/common/Geometries.js +2 -23
- package/src/renderers/common/Info.js +1 -45
- package/src/renderers/common/Lighting.js +8 -6
- package/src/renderers/common/Pipelines.js +3 -3
- package/src/renderers/common/PostProcessing.js +24 -8
- package/src/renderers/common/QuadMesh.js +1 -1
- package/src/renderers/common/RenderBundles.js +9 -3
- package/src/renderers/common/RenderContext.js +37 -3
- package/src/renderers/common/RenderContexts.js +30 -17
- package/src/renderers/common/RenderList.js +2 -2
- package/src/renderers/common/RenderLists.js +9 -3
- package/src/renderers/common/RenderObject.js +76 -17
- package/src/renderers/common/RenderObjects.js +9 -7
- package/src/renderers/common/Renderer.js +86 -67
- package/src/renderers/common/SampledTexture.js +0 -1
- package/src/renderers/common/StorageBufferAttribute.js +1 -1
- package/src/renderers/common/StorageInstancedBufferAttribute.js +1 -1
- package/src/renderers/common/StorageTexture.js +1 -1
- package/src/renderers/common/Textures.js +14 -7
- package/src/renderers/common/TimestampQueryPool.js +39 -0
- package/src/renderers/common/Uniform.js +37 -1
- package/src/renderers/common/UniformsGroup.js +2 -0
- package/src/renderers/common/XRManager.js +1193 -0
- package/src/renderers/common/XRRenderTarget.js +74 -0
- package/src/renderers/common/extras/PMREMGenerator.js +53 -8
- package/src/renderers/common/nodes/NodeBuilderState.js +4 -4
- package/src/renderers/common/nodes/NodeLibrary.js +5 -5
- package/src/renderers/common/nodes/NodeSampledTexture.js +0 -1
- package/src/renderers/common/nodes/NodeUniform.js +54 -2
- package/src/renderers/common/nodes/Nodes.js +25 -18
- package/src/renderers/webgl/WebGLBackground.js +4 -0
- package/src/renderers/webgl-fallback/WebGLBackend.js +295 -110
- package/src/renderers/webgl-fallback/nodes/GLSLNodeBuilder.js +347 -17
- package/src/renderers/webgl-fallback/utils/WebGLAttributeUtils.js +57 -0
- package/src/renderers/webgl-fallback/utils/WebGLCapabilities.js +28 -0
- package/src/renderers/webgl-fallback/utils/WebGLExtensions.js +45 -0
- package/src/renderers/webgl-fallback/utils/WebGLState.js +323 -11
- package/src/renderers/webgl-fallback/utils/WebGLTextureUtils.js +167 -21
- package/src/renderers/webgl-fallback/utils/WebGLTimestampQueryPool.js +359 -0
- package/src/renderers/webgl-fallback/utils/WebGLUtils.js +43 -0
- package/src/renderers/webgpu/WebGPUBackend.js +132 -149
- package/src/renderers/webgpu/WebGPURenderer.Nodes.js +6 -4
- package/src/renderers/webgpu/WebGPURenderer.js +5 -4
- package/src/renderers/webgpu/nodes/WGSLNodeBuilder.js +615 -41
- package/src/renderers/webgpu/utils/WebGPUAttributeUtils.js +85 -6
- package/src/renderers/webgpu/utils/WebGPUBindingUtils.js +85 -0
- package/src/renderers/webgpu/utils/WebGPUPipelineUtils.js +102 -3
- package/src/renderers/webgpu/utils/WebGPUTexturePassUtils.js +98 -1
- package/src/renderers/webgpu/utils/WebGPUTextureUtils.js +257 -9
- package/src/renderers/webgpu/utils/WebGPUTimestampQueryPool.js +274 -0
- package/src/renderers/webgpu/utils/WebGPUUtils.js +86 -4
- package/src/renderers/webxr/WebXRManager.js +13 -2
- package/src/textures/VideoFrameTexture.js +35 -0
- package/examples/jsm/geometries/InstancedPointsGeometry.js +0 -176
- package/examples/jsm/objects/InstancedPoints.js +0 -19
- package/src/materials/nodes/InstancedPointsNodeMaterial.js +0 -209
- package/src/nodes/accessors/InstancedPointsMaterialNode.js +0 -37
|
@@ -131,6 +131,14 @@ class RenderContext {
|
|
|
131
131
|
*/
|
|
132
132
|
this.scissorValue = new Vector4();
|
|
133
133
|
|
|
134
|
+
/**
|
|
135
|
+
* The active render target.
|
|
136
|
+
*
|
|
137
|
+
* @type {RenderTarget?}
|
|
138
|
+
* @default null
|
|
139
|
+
*/
|
|
140
|
+
this.renderTarget = null;
|
|
141
|
+
|
|
134
142
|
/**
|
|
135
143
|
* The textures of the active render target.
|
|
136
144
|
* `null` when no render target is set.
|
|
@@ -157,6 +165,14 @@ class RenderContext {
|
|
|
157
165
|
*/
|
|
158
166
|
this.activeCubeFace = 0;
|
|
159
167
|
|
|
168
|
+
/**
|
|
169
|
+
* The active mipmap level.
|
|
170
|
+
*
|
|
171
|
+
* @type {Number}
|
|
172
|
+
* @default 0
|
|
173
|
+
*/
|
|
174
|
+
this.activeMipmapLevel = 0;
|
|
175
|
+
|
|
160
176
|
/**
|
|
161
177
|
* The number of MSAA samples. This value is always `1` when
|
|
162
178
|
* MSAA isn't used.
|
|
@@ -167,7 +183,7 @@ class RenderContext {
|
|
|
167
183
|
this.sampleCount = 1;
|
|
168
184
|
|
|
169
185
|
/**
|
|
170
|
-
* The
|
|
186
|
+
* The active render target's width in physical pixels.
|
|
171
187
|
*
|
|
172
188
|
* @type {Number}
|
|
173
189
|
* @default 0
|
|
@@ -175,13 +191,29 @@ class RenderContext {
|
|
|
175
191
|
this.width = 0;
|
|
176
192
|
|
|
177
193
|
/**
|
|
178
|
-
* The
|
|
194
|
+
* The active render target's height in physical pixels.
|
|
179
195
|
*
|
|
180
196
|
* @type {Number}
|
|
181
197
|
* @default 0
|
|
182
198
|
*/
|
|
183
199
|
this.height = 0;
|
|
184
200
|
|
|
201
|
+
/**
|
|
202
|
+
* The occlusion query count.
|
|
203
|
+
*
|
|
204
|
+
* @type {Number}
|
|
205
|
+
* @default 0
|
|
206
|
+
*/
|
|
207
|
+
this.occlusionQueryCount = 0;
|
|
208
|
+
|
|
209
|
+
/**
|
|
210
|
+
* The current clipping context.
|
|
211
|
+
*
|
|
212
|
+
* @type {ClippingContext?}
|
|
213
|
+
* @default null
|
|
214
|
+
*/
|
|
215
|
+
this.clippingContext = null;
|
|
216
|
+
|
|
185
217
|
/**
|
|
186
218
|
* This flag can be used for type testing.
|
|
187
219
|
*
|
|
@@ -207,7 +239,9 @@ class RenderContext {
|
|
|
207
239
|
}
|
|
208
240
|
|
|
209
241
|
/**
|
|
210
|
-
* Computes a cache key for the given render context.
|
|
242
|
+
* Computes a cache key for the given render context. This key
|
|
243
|
+
* should identify the render target state so it is possible to
|
|
244
|
+
* configure the correct attachments in the respective backend.
|
|
211
245
|
*
|
|
212
246
|
* @param {RenderContext} renderContext - The render context.
|
|
213
247
|
* @return {Number} The cache key.
|
|
@@ -1,5 +1,11 @@
|
|
|
1
1
|
import ChainMap from './ChainMap.js';
|
|
2
2
|
import RenderContext from './RenderContext.js';
|
|
3
|
+
import { Scene } from '../../scenes/Scene.js';
|
|
4
|
+
import { Camera } from '../../cameras/Camera.js';
|
|
5
|
+
|
|
6
|
+
const _chainKeys = [];
|
|
7
|
+
const _defaultScene = /*@__PURE__*/ new Scene();
|
|
8
|
+
const _defaultCamera = /*@__PURE__*/ new Camera();
|
|
3
9
|
|
|
4
10
|
/**
|
|
5
11
|
* This module manages the render contexts of the renderer.
|
|
@@ -26,23 +32,15 @@ class RenderContexts {
|
|
|
26
32
|
/**
|
|
27
33
|
* Returns a render context for the given scene, camera and render target.
|
|
28
34
|
*
|
|
29
|
-
* @param {Scene
|
|
30
|
-
* @param {Camera
|
|
35
|
+
* @param {Scene} scene - The scene.
|
|
36
|
+
* @param {Camera} camera - The camera that is used to render the scene.
|
|
31
37
|
* @param {RenderTarget?} [renderTarget=null] - The active render target.
|
|
32
38
|
* @return {RenderContext} The render context.
|
|
33
39
|
*/
|
|
34
|
-
get( scene
|
|
35
|
-
|
|
36
|
-
const chainKey = [];
|
|
37
|
-
if ( scene !== null ) chainKey.push( scene );
|
|
38
|
-
if ( camera !== null ) chainKey.push( camera );
|
|
39
|
-
|
|
40
|
-
if ( chainKey.length === 0 ) {
|
|
41
|
-
|
|
42
|
-
chainKey.push( { id: 'default' } );
|
|
43
|
-
|
|
44
|
-
}
|
|
40
|
+
get( scene, camera, renderTarget = null ) {
|
|
45
41
|
|
|
42
|
+
_chainKeys[ 0 ] = scene;
|
|
43
|
+
_chainKeys[ 1 ] = camera;
|
|
46
44
|
|
|
47
45
|
let attachmentState;
|
|
48
46
|
|
|
@@ -59,31 +57,46 @@ class RenderContexts {
|
|
|
59
57
|
|
|
60
58
|
}
|
|
61
59
|
|
|
62
|
-
const chainMap = this.
|
|
60
|
+
const chainMap = this._getChainMap( attachmentState );
|
|
63
61
|
|
|
64
|
-
let renderState = chainMap.get(
|
|
62
|
+
let renderState = chainMap.get( _chainKeys );
|
|
65
63
|
|
|
66
64
|
if ( renderState === undefined ) {
|
|
67
65
|
|
|
68
66
|
renderState = new RenderContext();
|
|
69
67
|
|
|
70
|
-
chainMap.set(
|
|
68
|
+
chainMap.set( _chainKeys, renderState );
|
|
71
69
|
|
|
72
70
|
}
|
|
73
71
|
|
|
72
|
+
_chainKeys.length = 0;
|
|
73
|
+
|
|
74
74
|
if ( renderTarget !== null ) renderState.sampleCount = renderTarget.samples === 0 ? 1 : renderTarget.samples;
|
|
75
75
|
|
|
76
76
|
return renderState;
|
|
77
77
|
|
|
78
78
|
}
|
|
79
79
|
|
|
80
|
+
/**
|
|
81
|
+
* Returns a render context intended for clear operations.
|
|
82
|
+
*
|
|
83
|
+
* @param {RenderTarget?} [renderTarget=null] - The active render target.
|
|
84
|
+
* @return {RenderContext} The render context.
|
|
85
|
+
*/
|
|
86
|
+
getForClear( renderTarget = null ) {
|
|
87
|
+
|
|
88
|
+
return this.get( _defaultScene, _defaultCamera, renderTarget );
|
|
89
|
+
|
|
90
|
+
}
|
|
91
|
+
|
|
80
92
|
/**
|
|
81
93
|
* Returns a chain map for the given attachment state.
|
|
82
94
|
*
|
|
95
|
+
* @private
|
|
83
96
|
* @param {String} attachmentState - The attachment state.
|
|
84
97
|
* @return {ChainMap} The chain map.
|
|
85
98
|
*/
|
|
86
|
-
|
|
99
|
+
_getChainMap( attachmentState ) {
|
|
87
100
|
|
|
88
101
|
return this.chainMaps[ attachmentState ] || ( this.chainMaps[ attachmentState ] = new ChainMap() );
|
|
89
102
|
|
|
@@ -356,8 +356,8 @@ class RenderList {
|
|
|
356
356
|
/**
|
|
357
357
|
* Sorts the internal render lists.
|
|
358
358
|
*
|
|
359
|
-
* @param {
|
|
360
|
-
* @param {
|
|
359
|
+
* @param {function(Any, Any): Number} customOpaqueSort - A custom sort function for opaque objects.
|
|
360
|
+
* @param {function(Any, Any): Number} customTransparentSort - A custom sort function for transparent objects.
|
|
361
361
|
*/
|
|
362
362
|
sort( customOpaqueSort, customTransparentSort ) {
|
|
363
363
|
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import ChainMap from './ChainMap.js';
|
|
2
2
|
import RenderList from './RenderList.js';
|
|
3
3
|
|
|
4
|
+
const _chainKeys = [];
|
|
5
|
+
|
|
4
6
|
/**
|
|
5
7
|
* This renderer module manages the render lists which are unique
|
|
6
8
|
* per scene and camera combination.
|
|
@@ -42,17 +44,21 @@ class RenderLists {
|
|
|
42
44
|
get( scene, camera ) {
|
|
43
45
|
|
|
44
46
|
const lists = this.lists;
|
|
45
|
-
const keys = [ scene, camera ];
|
|
46
47
|
|
|
47
|
-
|
|
48
|
+
_chainKeys[ 0 ] = scene;
|
|
49
|
+
_chainKeys[ 1 ] = camera;
|
|
50
|
+
|
|
51
|
+
let list = lists.get( _chainKeys );
|
|
48
52
|
|
|
49
53
|
if ( list === undefined ) {
|
|
50
54
|
|
|
51
55
|
list = new RenderList( this.lighting, scene, camera );
|
|
52
|
-
lists.set(
|
|
56
|
+
lists.set( _chainKeys, list );
|
|
53
57
|
|
|
54
58
|
}
|
|
55
59
|
|
|
60
|
+
_chainKeys.length = 0;
|
|
61
|
+
|
|
56
62
|
return list;
|
|
57
63
|
|
|
58
64
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { hashString } from '../../nodes/core/NodeUtils.js';
|
|
1
|
+
import { hash, hashString } from '../../nodes/core/NodeUtils.js';
|
|
2
2
|
|
|
3
3
|
let _id = 0;
|
|
4
4
|
|
|
@@ -54,7 +54,7 @@ function getKeys( obj ) {
|
|
|
54
54
|
*
|
|
55
55
|
* @private
|
|
56
56
|
*/
|
|
57
|
-
|
|
57
|
+
class RenderObject {
|
|
58
58
|
|
|
59
59
|
/**
|
|
60
60
|
* Constructs a new render object.
|
|
@@ -180,6 +180,16 @@ export default class RenderObject {
|
|
|
180
180
|
*/
|
|
181
181
|
this.pipeline = null;
|
|
182
182
|
|
|
183
|
+
/**
|
|
184
|
+
* Only relevant for objects using
|
|
185
|
+
* multiple materials. This represents a group entry
|
|
186
|
+
* from the respective `BufferGeometry`.
|
|
187
|
+
*
|
|
188
|
+
* @type {{start: Number, count: Number}?}
|
|
189
|
+
* @default null
|
|
190
|
+
*/
|
|
191
|
+
this.group = null;
|
|
192
|
+
|
|
183
193
|
/**
|
|
184
194
|
* An array holding the vertex buffers which can
|
|
185
195
|
* be buffer attributes but also interleaved buffers.
|
|
@@ -336,7 +346,7 @@ export default class RenderObject {
|
|
|
336
346
|
/**
|
|
337
347
|
* Returns the node builder state of this render object.
|
|
338
348
|
*
|
|
339
|
-
* @return {NodeBuilderState} The node
|
|
349
|
+
* @return {NodeBuilderState} The node builder state.
|
|
340
350
|
*/
|
|
341
351
|
getNodeBuilderState() {
|
|
342
352
|
|
|
@@ -351,7 +361,7 @@ export default class RenderObject {
|
|
|
351
361
|
*/
|
|
352
362
|
getMonitor() {
|
|
353
363
|
|
|
354
|
-
return this._monitor || ( this._monitor = this.getNodeBuilderState().
|
|
364
|
+
return this._monitor || ( this._monitor = this.getNodeBuilderState().observer );
|
|
355
365
|
|
|
356
366
|
}
|
|
357
367
|
|
|
@@ -366,6 +376,26 @@ export default class RenderObject {
|
|
|
366
376
|
|
|
367
377
|
}
|
|
368
378
|
|
|
379
|
+
/**
|
|
380
|
+
* Returns a binding group by group name of this render object.
|
|
381
|
+
*
|
|
382
|
+
* @param {String} name - The name of the binding group.
|
|
383
|
+
* @return {BindGroup?} The bindings.
|
|
384
|
+
*/
|
|
385
|
+
getBindingGroup( name ) {
|
|
386
|
+
|
|
387
|
+
for ( const bindingGroup of this.getBindings() ) {
|
|
388
|
+
|
|
389
|
+
if ( bindingGroup.name === name ) {
|
|
390
|
+
|
|
391
|
+
return bindingGroup;
|
|
392
|
+
|
|
393
|
+
}
|
|
394
|
+
|
|
395
|
+
}
|
|
396
|
+
|
|
397
|
+
}
|
|
398
|
+
|
|
369
399
|
/**
|
|
370
400
|
* Returns the index of the render object's geometry.
|
|
371
401
|
*
|
|
@@ -558,6 +588,26 @@ export default class RenderObject {
|
|
|
558
588
|
|
|
559
589
|
}
|
|
560
590
|
|
|
591
|
+
// structural equality isn't sufficient for morph targets since the
|
|
592
|
+
// data are maintained in textures. only if the targets are all equal
|
|
593
|
+
// the texture and thus the instance of `MorphNode` can be shared.
|
|
594
|
+
|
|
595
|
+
for ( const name of Object.keys( geometry.morphAttributes ).sort() ) {
|
|
596
|
+
|
|
597
|
+
const targets = geometry.morphAttributes[ name ];
|
|
598
|
+
|
|
599
|
+
cacheKey += 'morph-' + name + ',';
|
|
600
|
+
|
|
601
|
+
for ( let i = 0, l = targets.length; i < l; i ++ ) {
|
|
602
|
+
|
|
603
|
+
const attribute = targets[ i ];
|
|
604
|
+
|
|
605
|
+
cacheKey += attribute.id + ',';
|
|
606
|
+
|
|
607
|
+
}
|
|
608
|
+
|
|
609
|
+
}
|
|
610
|
+
|
|
561
611
|
if ( geometry.index ) {
|
|
562
612
|
|
|
563
613
|
cacheKey += 'index,';
|
|
@@ -573,7 +623,7 @@ export default class RenderObject {
|
|
|
573
623
|
*
|
|
574
624
|
* The material cache key is part of the render object cache key.
|
|
575
625
|
*
|
|
576
|
-
* @return {
|
|
626
|
+
* @return {Number} The material cache key.
|
|
577
627
|
*/
|
|
578
628
|
getMaterialCacheKey() {
|
|
579
629
|
|
|
@@ -641,12 +691,6 @@ export default class RenderObject {
|
|
|
641
691
|
|
|
642
692
|
}
|
|
643
693
|
|
|
644
|
-
if ( object.morphTargetInfluences ) {
|
|
645
|
-
|
|
646
|
-
cacheKey += object.morphTargetInfluences.length + ',';
|
|
647
|
-
|
|
648
|
-
}
|
|
649
|
-
|
|
650
694
|
if ( object.isBatchedMesh ) {
|
|
651
695
|
|
|
652
696
|
cacheKey += object._matricesTexture.uuid + ',';
|
|
@@ -696,7 +740,7 @@ export default class RenderObject {
|
|
|
696
740
|
* `RenderObjects.get()`. The render object's NodeMaterialObserver is then used to detect
|
|
697
741
|
* a need for a refresh due to material, geometry or object related value changes.
|
|
698
742
|
*
|
|
699
|
-
* TODO: Investigate if it's possible to merge
|
|
743
|
+
* TODO: Investigate if it's possible to merge both steps so there is only a single place
|
|
700
744
|
* that performs the 'needsUpdate' check.
|
|
701
745
|
*
|
|
702
746
|
* @type {Boolean}
|
|
@@ -711,17 +755,30 @@ export default class RenderObject {
|
|
|
711
755
|
/**
|
|
712
756
|
* Returns the dynamic cache key which represents a key that is computed per draw command.
|
|
713
757
|
*
|
|
714
|
-
* @return {
|
|
758
|
+
* @return {Number} The cache key.
|
|
715
759
|
*/
|
|
716
760
|
getDynamicCacheKey() {
|
|
717
761
|
|
|
718
|
-
|
|
762
|
+
let cacheKey = 0;
|
|
763
|
+
|
|
764
|
+
// `Nodes.getCacheKey()` returns an environment cache key which is not relevant when
|
|
765
|
+
// the renderer is inside a shadow pass.
|
|
766
|
+
|
|
767
|
+
if ( this.material.isShadowPassMaterial !== true ) {
|
|
768
|
+
|
|
769
|
+
cacheKey = this._nodes.getCacheKey( this.scene, this.lightsNode );
|
|
770
|
+
|
|
771
|
+
}
|
|
772
|
+
|
|
773
|
+
if ( this.camera.isArrayCamera ) {
|
|
719
774
|
|
|
720
|
-
|
|
775
|
+
cacheKey = hash( cacheKey, this.camera.cameras.length );
|
|
776
|
+
|
|
777
|
+
}
|
|
721
778
|
|
|
722
779
|
if ( this.object.receiveShadow ) {
|
|
723
780
|
|
|
724
|
-
cacheKey
|
|
781
|
+
cacheKey = hash( cacheKey, 1 );
|
|
725
782
|
|
|
726
783
|
}
|
|
727
784
|
|
|
@@ -732,7 +789,7 @@ export default class RenderObject {
|
|
|
732
789
|
/**
|
|
733
790
|
* Returns the render object's cache key.
|
|
734
791
|
*
|
|
735
|
-
* @return {
|
|
792
|
+
* @return {Number} The cache key.
|
|
736
793
|
*/
|
|
737
794
|
getCacheKey() {
|
|
738
795
|
|
|
@@ -752,3 +809,5 @@ export default class RenderObject {
|
|
|
752
809
|
}
|
|
753
810
|
|
|
754
811
|
}
|
|
812
|
+
|
|
813
|
+
export default RenderObject;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import ChainMap from './ChainMap.js';
|
|
2
2
|
import RenderObject from './RenderObject.js';
|
|
3
3
|
|
|
4
|
-
const
|
|
4
|
+
const _chainKeys = [];
|
|
5
5
|
|
|
6
6
|
/**
|
|
7
7
|
* This module manages the render objects of the renderer.
|
|
@@ -92,18 +92,18 @@ class RenderObjects {
|
|
|
92
92
|
const chainMap = this.getChainMap( passId );
|
|
93
93
|
|
|
94
94
|
// reuse chainArray
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
95
|
+
_chainKeys[ 0 ] = object;
|
|
96
|
+
_chainKeys[ 1 ] = material;
|
|
97
|
+
_chainKeys[ 2 ] = renderContext;
|
|
98
|
+
_chainKeys[ 3 ] = lightsNode;
|
|
99
99
|
|
|
100
|
-
let renderObject = chainMap.get(
|
|
100
|
+
let renderObject = chainMap.get( _chainKeys );
|
|
101
101
|
|
|
102
102
|
if ( renderObject === undefined ) {
|
|
103
103
|
|
|
104
104
|
renderObject = this.createRenderObject( this.nodes, this.geometries, this.renderer, object, material, scene, camera, lightsNode, renderContext, clippingContext, passId );
|
|
105
105
|
|
|
106
|
-
chainMap.set(
|
|
106
|
+
chainMap.set( _chainKeys, renderObject );
|
|
107
107
|
|
|
108
108
|
} else {
|
|
109
109
|
|
|
@@ -133,6 +133,8 @@ class RenderObjects {
|
|
|
133
133
|
|
|
134
134
|
}
|
|
135
135
|
|
|
136
|
+
_chainKeys.length = 0;
|
|
137
|
+
|
|
136
138
|
return renderObject;
|
|
137
139
|
|
|
138
140
|
}
|