super-three 0.163.0 → 0.165.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.
Files changed (197) hide show
  1. package/README.md +3 -3
  2. package/build/three.cjs +1127 -452
  3. package/build/three.module.js +1127 -452
  4. package/build/three.module.min.js +2 -2
  5. package/examples/jsm/animation/CCDIKSolver.js +4 -2
  6. package/examples/jsm/controls/TransformControls.js +1 -1
  7. package/examples/jsm/environments/RoomEnvironment.js +1 -5
  8. package/examples/jsm/exporters/GLTFExporter.js +45 -1
  9. package/examples/jsm/exporters/USDZExporter.js +13 -5
  10. package/examples/jsm/helpers/ViewHelper.js +32 -67
  11. package/examples/jsm/libs/draco/README.md +2 -2
  12. package/examples/jsm/libs/tween.module.js +75 -64
  13. package/examples/jsm/lines/LineMaterial.js +1 -15
  14. package/examples/jsm/lines/LineSegments2.js +15 -0
  15. package/examples/jsm/lines/Wireframe.js +16 -1
  16. package/examples/jsm/loaders/DRACOLoader.js +1 -1
  17. package/examples/jsm/loaders/EXRLoader.js +283 -99
  18. package/examples/jsm/loaders/FBXLoader.js +24 -13
  19. package/examples/jsm/loaders/GLTFLoader.js +55 -0
  20. package/examples/jsm/loaders/KTX2Loader.js +3 -6
  21. package/examples/jsm/loaders/LDrawLoader.js +3 -2
  22. package/examples/jsm/loaders/MMDLoader.js +31 -12
  23. package/examples/jsm/loaders/VRMLLoader.js +1 -1
  24. package/examples/jsm/loaders/lwo/IFFParser.js +8 -5
  25. package/examples/jsm/materials/MeshGouraudMaterial.js +7 -1
  26. package/examples/jsm/math/Octree.js +26 -20
  27. package/examples/jsm/modifiers/CurveModifier.js +11 -9
  28. package/examples/jsm/nodes/Nodes.js +15 -13
  29. package/examples/jsm/nodes/accessors/AccessorsUtils.js +16 -1
  30. package/examples/jsm/nodes/accessors/BitangentNode.js +7 -83
  31. package/examples/jsm/nodes/accessors/BufferNode.js +6 -0
  32. package/examples/jsm/nodes/accessors/CameraNode.js +12 -119
  33. package/examples/jsm/nodes/accessors/ClippingNode.js +3 -2
  34. package/examples/jsm/nodes/accessors/MaterialNode.js +109 -3
  35. package/examples/jsm/nodes/accessors/ModelNode.js +3 -0
  36. package/examples/jsm/nodes/accessors/NormalNode.js +9 -101
  37. package/examples/jsm/nodes/accessors/PositionNode.js +6 -100
  38. package/examples/jsm/nodes/accessors/ReferenceNode.js +6 -0
  39. package/examples/jsm/nodes/accessors/ReflectVectorNode.js +2 -31
  40. package/examples/jsm/nodes/accessors/StorageBufferNode.js +9 -0
  41. package/examples/jsm/nodes/accessors/{TextureStoreNode.js → StorageTextureNode.js} +19 -6
  42. package/examples/jsm/nodes/accessors/TangentNode.js +11 -97
  43. package/examples/jsm/nodes/accessors/Texture3DNode.js +100 -0
  44. package/examples/jsm/nodes/accessors/TextureNode.js +21 -3
  45. package/examples/jsm/nodes/accessors/TextureSizeNode.js +1 -1
  46. package/examples/jsm/nodes/accessors/UVNode.js +2 -46
  47. package/examples/jsm/nodes/code/FunctionNode.js +0 -8
  48. package/examples/jsm/nodes/core/AttributeNode.js +15 -3
  49. package/examples/jsm/nodes/core/ContextNode.js +6 -0
  50. package/examples/jsm/nodes/core/Node.js +23 -2
  51. package/examples/jsm/nodes/core/NodeBuilder.js +25 -18
  52. package/examples/jsm/nodes/core/NodeKeywords.js +1 -1
  53. package/examples/jsm/nodes/core/OutputStructNode.js +3 -6
  54. package/examples/jsm/nodes/core/PropertyNode.js +11 -0
  55. package/examples/jsm/nodes/core/VaryingNode.js +40 -9
  56. package/examples/jsm/nodes/display/AfterImageNode.js +14 -2
  57. package/examples/jsm/nodes/display/BumpMapNode.js +7 -26
  58. package/examples/jsm/nodes/display/FrontFacingNode.js +13 -0
  59. package/examples/jsm/nodes/display/PassNode.js +3 -1
  60. package/examples/jsm/nodes/display/ViewportDepthNode.js +1 -1
  61. package/examples/jsm/nodes/display/ViewportNode.js +5 -3
  62. package/examples/jsm/nodes/display/ViewportTextureNode.js +4 -1
  63. package/examples/jsm/nodes/functions/BSDF/BRDF_GGX.js +26 -7
  64. package/examples/jsm/nodes/functions/BSDF/D_GGX_Anisotropic.js +28 -0
  65. package/examples/jsm/nodes/functions/BSDF/V_GGX_SmithCorrelated.js +1 -3
  66. package/examples/jsm/nodes/functions/BSDF/V_GGX_SmithCorrelated_Anisotropic.js +29 -0
  67. package/examples/jsm/nodes/functions/PhongLightingModel.js +1 -1
  68. package/examples/jsm/nodes/functions/PhysicalLightingModel.js +210 -12
  69. package/examples/jsm/nodes/functions/ShadowMaskModel.js +31 -0
  70. package/examples/jsm/nodes/functions/ToonLightingModel.js +49 -0
  71. package/examples/jsm/nodes/lighting/AnalyticLightNode.js +20 -5
  72. package/examples/jsm/nodes/lighting/DirectionalLightNode.js +2 -1
  73. package/examples/jsm/nodes/lighting/EnvironmentNode.js +11 -2
  74. package/examples/jsm/nodes/lighting/IrradianceNode.js +24 -0
  75. package/examples/jsm/nodes/lighting/LightsNode.js +28 -1
  76. package/examples/jsm/nodes/lighting/PointLightNode.js +2 -1
  77. package/examples/jsm/nodes/lighting/SpotLightNode.js +2 -1
  78. package/examples/jsm/nodes/materials/Line2NodeMaterial.js +11 -7
  79. package/examples/jsm/nodes/materials/Materials.js +4 -0
  80. package/examples/jsm/nodes/materials/MeshMatcapNodeMaterial.js +52 -0
  81. package/examples/jsm/nodes/materials/MeshNormalNodeMaterial.js +0 -2
  82. package/examples/jsm/nodes/materials/MeshPhongNodeMaterial.js +2 -2
  83. package/examples/jsm/nodes/materials/MeshPhysicalNodeMaterial.js +94 -6
  84. package/examples/jsm/nodes/materials/MeshStandardNodeMaterial.js +11 -4
  85. package/examples/jsm/nodes/materials/MeshToonNodeMaterial.js +34 -0
  86. package/examples/jsm/nodes/materials/NodeMaterial.js +43 -45
  87. package/examples/jsm/nodes/materials/ShadowNodeMaterial.js +34 -0
  88. package/examples/jsm/nodes/materials/VolumeNodeMaterial.js +106 -0
  89. package/examples/jsm/nodes/math/HashNode.js +2 -2
  90. package/examples/jsm/nodes/pmrem/PMREMUtils.js +1 -1
  91. package/examples/jsm/nodes/shadernode/ShaderNode.js +57 -41
  92. package/examples/jsm/nodes/utils/ArrayElementNode.js +1 -1
  93. package/examples/jsm/nodes/utils/MatcapUVNode.js +1 -1
  94. package/examples/jsm/nodes/utils/TimerNode.js +1 -1
  95. package/examples/jsm/objects/Lensflare.js +2 -2
  96. package/examples/jsm/physics/JoltPhysics.js +281 -0
  97. package/examples/jsm/postprocessing/RenderPass.js +1 -1
  98. package/examples/jsm/postprocessing/RenderTransitionPass.js +193 -0
  99. package/examples/jsm/renderers/CSS2DRenderer.js +25 -5
  100. package/examples/jsm/renderers/CSS3DRenderer.js +24 -3
  101. package/examples/jsm/renderers/common/Attributes.js +2 -0
  102. package/examples/jsm/renderers/common/Background.js +3 -3
  103. package/examples/jsm/renderers/common/Bindings.js +17 -0
  104. package/examples/jsm/renderers/common/ChainMap.js +18 -48
  105. package/examples/jsm/renderers/common/ClippingContext.js +5 -5
  106. package/examples/jsm/renderers/common/Pipelines.js +2 -2
  107. package/examples/jsm/renderers/common/RenderBundle.js +18 -0
  108. package/examples/jsm/renderers/common/RenderBundles.js +38 -0
  109. package/examples/jsm/renderers/common/RenderList.js +10 -1
  110. package/examples/jsm/renderers/common/RenderObject.js +49 -1
  111. package/examples/jsm/renderers/common/Renderer.js +268 -25
  112. package/examples/jsm/renderers/common/Textures.js +1 -1
  113. package/examples/jsm/renderers/common/Uniform.js +1 -1
  114. package/examples/jsm/renderers/common/extras/PMREMGenerator.js +13 -17
  115. package/examples/jsm/renderers/common/nodes/NodeSampledTexture.js +18 -4
  116. package/examples/jsm/renderers/common/nodes/NodeSampler.js +6 -0
  117. package/examples/jsm/renderers/common/nodes/Nodes.js +31 -47
  118. package/examples/jsm/renderers/webgl/WebGLBackend.js +7 -21
  119. package/examples/jsm/renderers/webgl/WebGLBufferRenderer.js +5 -1
  120. package/examples/jsm/renderers/webgl/nodes/GLSLNodeBuilder.js +23 -5
  121. package/examples/jsm/renderers/webgl/utils/WebGLTextureUtils.js +114 -13
  122. package/examples/jsm/renderers/webgl/utils/WebGLUtils.js +3 -21
  123. package/examples/jsm/renderers/webgpu/WebGPUBackend.js +80 -46
  124. package/examples/jsm/renderers/webgpu/nodes/WGSLNodeBuilder.js +85 -12
  125. package/examples/jsm/renderers/webgpu/utils/WebGPUAttributeUtils.js +4 -1
  126. package/examples/jsm/renderers/webgpu/utils/WebGPUBindingUtils.js +10 -1
  127. package/examples/jsm/renderers/webgpu/utils/WebGPUConstants.js +6 -0
  128. package/examples/jsm/renderers/webgpu/utils/WebGPUPipelineUtils.js +62 -19
  129. package/examples/jsm/renderers/webgpu/utils/WebGPUTextureUtils.js +62 -3
  130. package/examples/jsm/transpiler/GLSLDecoder.js +1 -1
  131. package/examples/jsm/transpiler/ShaderToyDecoder.js +1 -1
  132. package/examples/jsm/utils/BufferGeometryUtils.js +18 -16
  133. package/examples/jsm/utils/GPUStatsPanel.js +2 -0
  134. package/examples/jsm/utils/SceneUtils.js +60 -1
  135. package/examples/jsm/utils/SortUtils.js +8 -5
  136. package/examples/jsm/webxr/OculusHandModel.js +3 -2
  137. package/examples/jsm/webxr/XRHandModelFactory.js +4 -2
  138. package/package.json +3 -2
  139. package/src/animation/tracks/BooleanKeyframeTrack.js +10 -1
  140. package/src/animation/tracks/QuaternionKeyframeTrack.js +1 -2
  141. package/src/animation/tracks/StringKeyframeTrack.js +10 -1
  142. package/src/constants.js +1 -1
  143. package/src/core/Object3D.js +2 -0
  144. package/src/core/Raycaster.js +6 -2
  145. package/src/core/RenderTarget.js +8 -0
  146. package/src/extras/PMREMGenerator.js +12 -11
  147. package/src/loaders/FileLoader.js +5 -1
  148. package/src/loaders/LoaderUtils.js +3 -1
  149. package/src/loaders/MaterialLoader.js +1 -0
  150. package/src/loaders/ObjectLoader.js +1 -0
  151. package/src/materials/Material.js +2 -0
  152. package/src/materials/MeshPhysicalMaterial.js +20 -0
  153. package/src/objects/BatchedMesh.js +114 -1
  154. package/src/objects/Line.js +66 -43
  155. package/src/renderers/WebGLRenderer.js +371 -109
  156. package/src/renderers/shaders/ShaderChunk/batching_pars_vertex.glsl.js +15 -0
  157. package/src/renderers/shaders/ShaderChunk/color_pars_vertex.glsl.js +1 -1
  158. package/src/renderers/shaders/ShaderChunk/color_vertex.glsl.js +9 -1
  159. package/src/renderers/shaders/ShaderChunk/lights_pars_begin.glsl.js +8 -22
  160. package/src/renderers/shaders/ShaderChunk/lights_physical_fragment.glsl.js +6 -0
  161. package/src/renderers/shaders/ShaderChunk/lights_physical_pars_fragment.glsl.js +1 -0
  162. package/src/renderers/shaders/ShaderChunk/morphcolor_vertex.glsl.js +1 -1
  163. package/src/renderers/shaders/ShaderChunk/morphinstance_vertex.glsl.js +1 -1
  164. package/src/renderers/shaders/ShaderChunk/morphnormal_vertex.glsl.js +3 -14
  165. package/src/renderers/shaders/ShaderChunk/morphtarget_pars_vertex.glsl.js +10 -31
  166. package/src/renderers/shaders/ShaderChunk/morphtarget_vertex.glsl.js +3 -23
  167. package/src/renderers/shaders/ShaderChunk/tonemapping_pars_fragment.glsl.js +17 -9
  168. package/src/renderers/shaders/ShaderChunk/transmission_fragment.glsl.js +1 -1
  169. package/src/renderers/shaders/ShaderChunk/transmission_pars_fragment.glsl.js +47 -13
  170. package/src/renderers/shaders/ShaderChunk.js +0 -2
  171. package/src/renderers/shaders/ShaderLib/meshphysical.glsl.js +4 -0
  172. package/src/renderers/shaders/ShaderLib.js +1 -0
  173. package/src/renderers/webgl/WebGLBackground.js +24 -3
  174. package/src/renderers/webgl/WebGLBufferRenderer.js +36 -0
  175. package/src/renderers/webgl/WebGLCapabilities.js +33 -1
  176. package/src/renderers/webgl/WebGLExtensions.js +3 -1
  177. package/src/renderers/webgl/WebGLIndexedBufferRenderer.js +36 -0
  178. package/src/renderers/webgl/WebGLLights.js +9 -12
  179. package/src/renderers/webgl/WebGLMaterials.js +7 -5
  180. package/src/renderers/webgl/WebGLMorphtargets.js +1 -2
  181. package/src/renderers/webgl/WebGLProgram.js +5 -36
  182. package/src/renderers/webgl/WebGLPrograms.js +19 -14
  183. package/src/renderers/webgl/WebGLRenderStates.js +8 -4
  184. package/src/renderers/webgl/WebGLShadowMap.js +25 -25
  185. package/src/renderers/webgl/WebGLTextures.js +206 -129
  186. package/src/renderers/webgl/WebGLUtils.js +3 -21
  187. package/src/renderers/webxr/WebXRDepthSensing.js +3 -3
  188. package/src/renderers/webxr/WebXRManager.js +8 -6
  189. package/src/textures/CompressedArrayTexture.js +14 -0
  190. package/src/textures/DataArrayTexture.js +14 -0
  191. package/src/textures/DepthTexture.js +1 -3
  192. package/src/utils.js +30 -1
  193. package/examples/jsm/renderers/webgl-legacy/nodes/GLSL1NodeBuilder.js +0 -318
  194. package/examples/jsm/renderers/webgl-legacy/nodes/SlotNode.js +0 -26
  195. package/examples/jsm/renderers/webgl-legacy/nodes/WebGLNodeBuilder.js +0 -792
  196. package/examples/jsm/renderers/webgl-legacy/nodes/WebGLNodes.js +0 -51
  197. package/src/renderers/shaders/ShaderChunk/lightmap_fragment.glsl.js +0 -10
@@ -114,22 +114,42 @@ class CSS2DRenderer {
114
114
 
115
115
  };
116
116
 
117
+ function hideObject( object ) {
118
+
119
+ if ( object.isCSS2DObject ) object.element.style.display = 'none';
120
+
121
+ for ( let i = 0, l = object.children.length; i < l; i ++ ) {
122
+
123
+ hideObject( object.children[ i ] );
124
+
125
+ }
126
+
127
+ }
128
+
117
129
  function renderObject( object, scene, camera ) {
118
130
 
131
+ if ( object.visible === false ) {
132
+
133
+ hideObject( object );
134
+
135
+ return;
136
+
137
+ }
138
+
119
139
  if ( object.isCSS2DObject ) {
120
140
 
121
141
  _vector.setFromMatrixPosition( object.matrixWorld );
122
142
  _vector.applyMatrix4( _viewProjectionMatrix );
123
143
 
124
- const visible = ( object.visible === true ) && ( _vector.z >= - 1 && _vector.z <= 1 ) && ( object.layers.test( camera.layers ) === true );
125
- object.element.style.display = ( visible === true ) ? '' : 'none';
144
+ const visible = ( _vector.z >= - 1 && _vector.z <= 1 ) && ( object.layers.test( camera.layers ) === true );
145
+
146
+ const element = object.element;
147
+ element.style.display = visible === true ? '' : 'none';
126
148
 
127
149
  if ( visible === true ) {
128
150
 
129
151
  object.onBeforeRender( _this, scene, camera );
130
152
 
131
- const element = object.element;
132
-
133
153
  element.style.transform = 'translate(' + ( - 100 * object.center.x ) + '%,' + ( - 100 * object.center.y ) + '%)' + 'translate(' + ( _vector.x * _widthHalf + _widthHalf ) + 'px,' + ( - _vector.y * _heightHalf + _heightHalf ) + 'px)';
134
154
 
135
155
  if ( element.parentNode !== domElement ) {
@@ -171,7 +191,7 @@ class CSS2DRenderer {
171
191
 
172
192
  const result = [];
173
193
 
174
- scene.traverse( function ( object ) {
194
+ scene.traverseVisible( function ( object ) {
175
195
 
176
196
  if ( object.isCSS2DObject ) result.push( object );
177
197
 
@@ -251,12 +251,34 @@ class CSS3DRenderer {
251
251
 
252
252
  }
253
253
 
254
+ function hideObject( object ) {
255
+
256
+ if ( object.isCSS3DObject ) object.element.style.display = 'none';
257
+
258
+ for ( let i = 0, l = object.children.length; i < l; i ++ ) {
259
+
260
+ hideObject( object.children[ i ] );
261
+
262
+ }
263
+
264
+ }
265
+
254
266
  function renderObject( object, scene, camera, cameraCSSMatrix ) {
255
267
 
268
+ if ( object.visible === false ) {
269
+
270
+ hideObject( object );
271
+
272
+ return;
273
+
274
+ }
275
+
256
276
  if ( object.isCSS3DObject ) {
257
277
 
258
- const visible = ( object.visible === true ) && ( object.layers.test( camera.layers ) === true );
259
- object.element.style.display = ( visible === true ) ? '' : 'none';
278
+ const visible = ( object.layers.test( camera.layers ) === true );
279
+
280
+ const element = object.element;
281
+ element.style.display = visible === true ? '' : 'none';
260
282
 
261
283
  if ( visible === true ) {
262
284
 
@@ -290,7 +312,6 @@ class CSS3DRenderer {
290
312
 
291
313
  }
292
314
 
293
- const element = object.element;
294
315
  const cachedObject = cache.objects.get( object );
295
316
 
296
317
  if ( cachedObject === undefined || cachedObject.style !== style ) {
@@ -22,6 +22,8 @@ class Attributes extends DataMap {
22
22
 
23
23
  }
24
24
 
25
+ return attributeData;
26
+
25
27
  }
26
28
 
27
29
  update( attribute, type ) {
@@ -1,6 +1,6 @@
1
1
  import DataMap from './DataMap.js';
2
2
  import Color4 from './Color4.js';
3
- import { Mesh, SphereGeometry, BackSide } from 'three';
3
+ import { Mesh, SphereGeometry, BackSide, LinearSRGBColorSpace } from 'three';
4
4
  import { vec4, context, normalWorld, backgroundBlurriness, backgroundIntensity, NodeMaterial, modelViewProjection } from '../../nodes/Nodes.js';
5
5
 
6
6
  const _clearColor = new Color4();
@@ -27,14 +27,14 @@ class Background extends DataMap {
27
27
 
28
28
  // no background settings, use clear color configuration from the renderer
29
29
 
30
- renderer._clearColor.getRGB( _clearColor, this.renderer.currentColorSpace );
30
+ renderer._clearColor.getRGB( _clearColor, LinearSRGBColorSpace );
31
31
  _clearColor.a = renderer._clearColor.a;
32
32
 
33
33
  } else if ( background.isColor === true ) {
34
34
 
35
35
  // background is an opaque color
36
36
 
37
- background.getRGB( _clearColor, this.renderer.currentColorSpace );
37
+ background.getRGB( _clearColor, LinearSRGBColorSpace );
38
38
  _clearColor.a = 1;
39
39
 
40
40
  forceClear = true;
@@ -122,6 +122,10 @@ class Bindings extends DataMap {
122
122
 
123
123
  }
124
124
 
125
+ } else if ( binding.isSampler ) {
126
+
127
+ binding.update();
128
+
125
129
  } else if ( binding.isSampledTexture ) {
126
130
 
127
131
  const texture = binding.texture;
@@ -136,6 +140,19 @@ class Bindings extends DataMap {
136
140
 
137
141
  }
138
142
 
143
+ const textureData = backend.get( binding.texture );
144
+
145
+ if ( backend.isWebGPUBackend === true && textureData.texture === undefined && textureData.externalTexture === undefined ) {
146
+
147
+ // TODO: Remove this once we found why updated === false isn't bound to a texture in the WebGPU backend
148
+ console.error( 'Bindings._update: binding should be available:', binding, updated, binding.texture, binding.textureNode.value );
149
+
150
+ this.textures.updateTexture( binding.texture );
151
+ needsBindingsUpdate = true;
152
+
153
+ }
154
+
155
+
139
156
  if ( texture.isStorageTexture === true ) {
140
157
 
141
158
  const textureData = this.get( texture );
@@ -8,81 +8,51 @@ export default class ChainMap {
8
8
 
9
9
  get( keys ) {
10
10
 
11
- if ( Array.isArray( keys ) ) {
11
+ let map = this.weakMap;
12
12
 
13
- let map = this.weakMap;
13
+ for ( let i = 0; i < keys.length; i ++ ) {
14
14
 
15
- for ( let i = 0; i < keys.length; i ++ ) {
15
+ map = map.get( keys[ i ] );
16
16
 
17
- map = map.get( keys[ i ] );
18
-
19
- if ( map === undefined ) return undefined;
20
-
21
- }
22
-
23
- return map.get( keys[ keys.length - 1 ] );
24
-
25
- } else {
26
-
27
- return super.get( keys );
17
+ if ( map === undefined ) return undefined;
28
18
 
29
19
  }
30
20
 
21
+ return map.get( keys[ keys.length - 1 ] );
22
+
31
23
  }
32
24
 
33
25
  set( keys, value ) {
34
26
 
35
- if ( Array.isArray( keys ) ) {
36
-
37
- let map = this.weakMap;
38
-
39
- for ( let i = 0; i < keys.length; i ++ ) {
40
-
41
- const key = keys[ i ];
42
-
43
- if ( map.has( key ) === false ) map.set( key, new WeakMap() );
27
+ let map = this.weakMap;
44
28
 
45
- map = map.get( key );
29
+ for ( let i = 0; i < keys.length; i ++ ) {
46
30
 
47
- }
31
+ const key = keys[ i ];
48
32
 
49
- return map.set( keys[ keys.length - 1 ], value );
33
+ if ( map.has( key ) === false ) map.set( key, new WeakMap() );
50
34
 
51
- } else {
52
-
53
- return super.set( keys, value );
35
+ map = map.get( key );
54
36
 
55
37
  }
56
38
 
39
+ return map.set( keys[ keys.length - 1 ], value );
40
+
57
41
  }
58
42
 
59
43
  delete( keys ) {
60
44
 
61
- if ( Array.isArray( keys ) ) {
62
-
63
- let map = this.weakMap;
64
-
65
- for ( let i = 0; i < keys.length; i ++ ) {
66
-
67
- map = map.get( keys[ i ] );
45
+ let map = this.weakMap;
68
46
 
69
- if ( map === undefined ) return false;
47
+ for ( let i = 0; i < keys.length; i ++ ) {
70
48
 
71
- }
49
+ map = map.get( keys[ i ] );
72
50
 
73
- return map.delete( keys[ keys.length - 1 ] );
74
-
75
- } else {
76
-
77
- return super.delete( keys );
51
+ if ( map === undefined ) return false;
78
52
 
79
53
  }
80
54
 
81
- }
82
-
83
- dispose() {
84
-
85
- this.weakMap.clear();
55
+ return map.delete( keys[ keys.length - 1 ] );
86
56
 
87
57
  }
88
58
 
@@ -1,7 +1,6 @@
1
1
  import { Matrix3, Plane, Vector4 } from 'three';
2
2
 
3
3
  const _plane = new Plane();
4
- const _viewNormalMatrix = new Matrix3();
5
4
 
6
5
  let _clippingContextVersion = 0;
7
6
 
@@ -20,6 +19,7 @@ class ClippingContext {
20
19
  this.planes = [];
21
20
 
22
21
  this.parentVersion = 0;
22
+ this.viewNormalMatrix = new Matrix3();
23
23
 
24
24
  }
25
25
 
@@ -30,7 +30,7 @@ class ClippingContext {
30
30
 
31
31
  for ( let i = 0; i < l; i ++ ) {
32
32
 
33
- _plane.copy( source[ i ] ).applyMatrix4( this.viewMatrix, _viewNormalMatrix );
33
+ _plane.copy( source[ i ] ).applyMatrix4( this.viewMatrix, this.viewNormalMatrix );
34
34
 
35
35
  const v = planes[ offset + i ];
36
36
  const normal = _plane.normal;
@@ -49,7 +49,7 @@ class ClippingContext {
49
49
  const rendererClippingPlanes = renderer.clippingPlanes;
50
50
  this.viewMatrix = camera.matrixWorldInverse;
51
51
 
52
- _viewNormalMatrix.getNormalMatrix( this.viewMatrix );
52
+ this.viewNormalMatrix.getNormalMatrix( this.viewMatrix );
53
53
 
54
54
  let update = false;
55
55
 
@@ -101,12 +101,12 @@ class ClippingContext {
101
101
 
102
102
  if ( this !== parent && parent.version !== this.parentVersion ) {
103
103
 
104
- this.globalClippingCount = material.isShadowNodeMaterial ? 0 : parent.globalClippingCount;
104
+ this.globalClippingCount = material.isShadowNodeMaterial ? 0 : parent.globalClippingCount;
105
105
  this.localClippingEnabled = parent.localClippingEnabled;
106
106
  this.planes = Array.from( parent.planes );
107
107
  this.parentVersion = parent.version;
108
108
  this.viewMatrix = parent.viewMatrix;
109
-
109
+ this.viewNormalMatrix = parent.viewNormalMatrix;
110
110
 
111
111
  update = true;
112
112
 
@@ -67,7 +67,7 @@ class Pipelines extends DataMap {
67
67
 
68
68
  if ( pipeline === undefined ) {
69
69
 
70
- if ( previousPipeline && previousPipeline.usedTimes === 0 ) this._releasePipeline( computeNode );
70
+ if ( previousPipeline && previousPipeline.usedTimes === 0 ) this._releasePipeline( previousPipeline );
71
71
 
72
72
  pipeline = this._getComputePipeline( computeNode, stageCompute, cacheKey, bindings );
73
73
 
@@ -205,7 +205,7 @@ class Pipelines extends DataMap {
205
205
 
206
206
  }
207
207
 
208
- super.delete( object );
208
+ return super.delete( object );
209
209
 
210
210
  }
211
211
 
@@ -0,0 +1,18 @@
1
+ class RenderBundle {
2
+
3
+ constructor( scene, camera ) {
4
+
5
+ this.scene = scene;
6
+ this.camera = camera;
7
+
8
+ }
9
+
10
+ clone() {
11
+
12
+ return Object.assign( new this.constructor(), this );
13
+
14
+ }
15
+
16
+ }
17
+
18
+ export default RenderBundle;
@@ -0,0 +1,38 @@
1
+ import ChainMap from './ChainMap.js';
2
+ import RenderBundle from './RenderBundle.js';
3
+
4
+ class RenderBundles {
5
+
6
+ constructor() {
7
+
8
+ this.lists = new ChainMap();
9
+
10
+ }
11
+
12
+ get( scene, camera ) {
13
+
14
+ const lists = this.lists;
15
+ const keys = [ scene, camera ];
16
+
17
+ let list = lists.get( keys );
18
+
19
+ if ( list === undefined ) {
20
+
21
+ list = new RenderBundle( scene, camera );
22
+ lists.set( keys, list );
23
+
24
+ }
25
+
26
+ return list;
27
+
28
+ }
29
+
30
+ dispose() {
31
+
32
+ this.lists = new ChainMap();
33
+
34
+ }
35
+
36
+ }
37
+
38
+ export default RenderBundles;
@@ -57,6 +57,7 @@ class RenderList {
57
57
 
58
58
  this.opaque = [];
59
59
  this.transparent = [];
60
+ this.bundles = [];
60
61
 
61
62
  this.lightsNode = new LightsNode( [] );
62
63
  this.lightsArray = [];
@@ -71,6 +72,8 @@ class RenderList {
71
72
 
72
73
  this.opaque.length = 0;
73
74
  this.transparent.length = 0;
75
+ this.bundles.length = 0;
76
+
74
77
  this.lightsArray.length = 0;
75
78
 
76
79
  this.occlusionQueryCount = 0;
@@ -123,7 +126,7 @@ class RenderList {
123
126
 
124
127
  if ( object.occlusionTest === true ) this.occlusionQueryCount ++;
125
128
 
126
- ( material.transparent === true ? this.transparent : this.opaque ).push( renderItem );
129
+ ( material.transparent === true || material.transmission > 0 ? this.transparent : this.opaque ).push( renderItem );
127
130
 
128
131
  }
129
132
 
@@ -135,6 +138,12 @@ class RenderList {
135
138
 
136
139
  }
137
140
 
141
+ pushBundle( group ) {
142
+
143
+ this.bundles.push( group );
144
+
145
+ }
146
+
138
147
  pushLight( light ) {
139
148
 
140
149
  this.lightsArray.push( light );
@@ -2,6 +2,40 @@ import ClippingContext from './ClippingContext.js';
2
2
 
3
3
  let id = 0;
4
4
 
5
+ function getKeys( obj ) {
6
+
7
+ const keys = Object.keys( obj );
8
+
9
+ let proto = Object.getPrototypeOf( obj );
10
+
11
+ while ( proto ) {
12
+
13
+ const descriptors = Object.getOwnPropertyDescriptors( proto );
14
+
15
+ for ( const key in descriptors ) {
16
+
17
+ if ( descriptors[ key ] !== undefined ) {
18
+
19
+ const descriptor = descriptors[ key ];
20
+
21
+ if ( descriptor && typeof descriptor.get === 'function' ) {
22
+
23
+ keys.push( key );
24
+
25
+ }
26
+
27
+ }
28
+
29
+ }
30
+
31
+ proto = Object.getPrototypeOf( proto );
32
+
33
+ }
34
+
35
+ return keys;
36
+
37
+ }
38
+
5
39
  export default class RenderObject {
6
40
 
7
41
  constructor( nodes, geometries, renderer, object, material, scene, camera, lightsNode, renderContext ) {
@@ -22,6 +56,8 @@ export default class RenderObject {
22
56
  this.geometry = object.geometry;
23
57
  this.version = material.version;
24
58
 
59
+ this.drawRange = null;
60
+
25
61
  this.attributes = null;
26
62
  this.pipeline = null;
27
63
  this.vertexBuffers = null;
@@ -153,7 +189,7 @@ export default class RenderObject {
153
189
 
154
190
  let cacheKey = material.customProgramCacheKey();
155
191
 
156
- for ( const property in material ) {
192
+ for ( const property of getKeys( material ) ) {
157
193
 
158
194
  if ( /^(is[A-Z]|_)|^(visible|version|uuid|name|opacity|userData)$/.test( property ) ) continue;
159
195
 
@@ -186,6 +222,18 @@ export default class RenderObject {
186
222
 
187
223
  }
188
224
 
225
+ if ( object.isBatchedMesh ) {
226
+
227
+ cacheKey += object._matricesTexture.uuid + ',';
228
+
229
+ if ( object._colorsTexture !== null ) {
230
+
231
+ cacheKey += object._colorsTexture.uuid + ',';
232
+
233
+ }
234
+
235
+ }
236
+
189
237
  return cacheKey;
190
238
 
191
239
  }