super-three 0.168.0 → 0.169.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 (286) hide show
  1. package/build/three.cjs +369 -131
  2. package/build/three.module.js +369 -131
  3. package/build/three.module.min.js +1 -1
  4. package/build/three.webgpu.js +24644 -22406
  5. package/build/three.webgpu.min.js +1 -1
  6. package/build/three.webgpu.nodes.js +79941 -0
  7. package/build/three.webgpu.nodes.min.js +6 -0
  8. package/examples/jsm/Addons.js +0 -6
  9. package/examples/jsm/controls/TrackballControls.js +32 -12
  10. package/examples/jsm/controls/TransformControls.js +97 -62
  11. package/examples/jsm/exporters/DRACOExporter.js +4 -2
  12. package/examples/jsm/exporters/EXRExporter.js +19 -11
  13. package/examples/jsm/exporters/KTX2Exporter.js +21 -13
  14. package/examples/jsm/exporters/OBJExporter.js +5 -1
  15. package/examples/jsm/exporters/PLYExporter.js +9 -7
  16. package/examples/jsm/geometries/DecalGeometry.js +4 -1
  17. package/examples/jsm/geometries/InstancedPointsGeometry.js +1 -1
  18. package/examples/jsm/helpers/LightProbeHelper.js +1 -1
  19. package/examples/jsm/helpers/LightProbeHelperGPU.js +65 -0
  20. package/examples/jsm/libs/basis/basis_transcoder.js +8 -10
  21. package/examples/jsm/libs/basis/basis_transcoder.wasm +0 -0
  22. package/examples/jsm/libs/ktx-parse.module.js +1 -1
  23. package/examples/jsm/lights/LightProbeGenerator.js +24 -10
  24. package/examples/jsm/loaders/ColladaLoader.js +9 -6
  25. package/examples/jsm/loaders/DRACOLoader.js +3 -1
  26. package/examples/jsm/loaders/FBXLoader.js +30 -20
  27. package/examples/jsm/loaders/GLTFLoader.js +5 -10
  28. package/examples/jsm/loaders/KTX2Loader.js +10 -7
  29. package/examples/jsm/loaders/MTLLoader.js +4 -3
  30. package/examples/jsm/loaders/MaterialXLoader.js +29 -10
  31. package/examples/jsm/loaders/OBJLoader.js +5 -3
  32. package/examples/jsm/loaders/PCDLoader.js +5 -4
  33. package/examples/jsm/loaders/PDBLoader.js +3 -2
  34. package/examples/jsm/loaders/PLYLoader.js +8 -5
  35. package/examples/jsm/loaders/STLLoader.js +3 -2
  36. package/examples/jsm/loaders/VRMLLoader.js +10 -10
  37. package/examples/jsm/loaders/VTKLoader.js +4 -3
  38. package/examples/jsm/loaders/XYZLoader.js +3 -2
  39. package/examples/jsm/misc/Timer.js +1 -1
  40. package/examples/jsm/modifiers/CurveModifierGPU.js +233 -0
  41. package/examples/jsm/objects/LensflareMesh.js +322 -0
  42. package/examples/jsm/objects/SkyMesh.js +1 -2
  43. package/examples/jsm/objects/Water2Mesh.js +2 -3
  44. package/examples/jsm/objects/WaterMesh.js +1 -2
  45. package/examples/jsm/physics/JoltPhysics.js +1 -1
  46. package/examples/jsm/physics/RapierPhysics.js +1 -1
  47. package/examples/jsm/transpiler/GLSLDecoder.js +1 -1
  48. package/examples/jsm/transpiler/ShaderToyDecoder.js +2 -2
  49. package/examples/jsm/utils/GeometryCompressionUtils.js +37 -122
  50. package/examples/jsm/utils/ShadowMapViewer.js +3 -8
  51. package/examples/jsm/utils/ShadowMapViewerGPU.js +201 -0
  52. package/examples/jsm/utils/SkeletonUtils.js +84 -66
  53. package/examples/jsm/utils/TextureUtils.js +1 -0
  54. package/examples/jsm/utils/TextureUtilsGPU.js +63 -0
  55. package/examples/jsm/webxr/XRControllerModelFactory.js +1 -1
  56. package/package.json +2 -2
  57. package/src/Three.WebGPU.Nodes.js +200 -0
  58. package/src/Three.WebGPU.js +2 -1
  59. package/src/audio/Audio.js +2 -2
  60. package/src/constants.js +1 -1
  61. package/src/core/BufferAttribute.js +0 -9
  62. package/src/core/Clock.js +1 -1
  63. package/src/core/InterleavedBuffer.js +0 -9
  64. package/src/extras/Controls.js +1 -1
  65. package/src/geometries/CylinderGeometry.js +11 -4
  66. package/src/loaders/MaterialLoader.js +7 -1
  67. package/src/loaders/nodes/NodeLoader.js +24 -4
  68. package/src/loaders/nodes/NodeMaterialLoader.js +21 -17
  69. package/src/loaders/nodes/NodeObjectLoader.js +19 -0
  70. package/src/materials/nodes/InstancedPointsNodeMaterial.js +19 -34
  71. package/src/materials/nodes/Line2NodeMaterial.js +26 -26
  72. package/src/materials/nodes/LineBasicNodeMaterial.js +7 -3
  73. package/src/materials/nodes/LineDashedNodeMaterial.js +7 -3
  74. package/src/materials/nodes/MeshBasicNodeMaterial.js +7 -3
  75. package/src/materials/nodes/MeshLambertNodeMaterial.js +7 -3
  76. package/src/materials/nodes/MeshMatcapNodeMaterial.js +7 -3
  77. package/src/materials/nodes/MeshNormalNodeMaterial.js +7 -3
  78. package/src/materials/nodes/MeshPhongNodeMaterial.js +7 -3
  79. package/src/materials/nodes/MeshPhysicalNodeMaterial.js +6 -3
  80. package/src/materials/nodes/MeshSSSNodeMaterial.js +6 -3
  81. package/src/materials/nodes/MeshStandardNodeMaterial.js +7 -3
  82. package/src/materials/nodes/MeshToonNodeMaterial.js +7 -3
  83. package/src/materials/nodes/NodeMaterial.js +20 -45
  84. package/src/materials/nodes/NodeMaterials.js +2 -0
  85. package/src/materials/nodes/PointsNodeMaterial.js +7 -3
  86. package/src/materials/nodes/ShadowNodeMaterial.js +7 -3
  87. package/src/materials/nodes/SpriteNodeMaterial.js +39 -6
  88. package/src/materials/nodes/VolumeNodeMaterial.js +13 -9
  89. package/src/materials/nodes/manager/NodeMaterialObserver.js +302 -0
  90. package/src/math/Triangle.js +24 -0
  91. package/src/nodes/Nodes.js +3 -3
  92. package/src/nodes/TSL.js +96 -93
  93. package/src/nodes/accessors/BatchNode.js +7 -3
  94. package/src/nodes/accessors/BufferAttributeNode.js +6 -3
  95. package/src/nodes/accessors/BufferNode.js +6 -3
  96. package/src/nodes/accessors/Camera.js +10 -16
  97. package/src/nodes/accessors/ClippingNode.js +7 -3
  98. package/src/nodes/accessors/CubeTextureNode.js +6 -3
  99. package/src/nodes/accessors/InstanceNode.js +11 -11
  100. package/src/nodes/accessors/InstancedPointsMaterialNode.js +6 -3
  101. package/src/nodes/accessors/Lights.js +51 -0
  102. package/src/nodes/accessors/MaterialNode.js +8 -4
  103. package/src/nodes/accessors/MaterialReferenceNode.js +6 -3
  104. package/src/nodes/accessors/ModelNode.js +42 -7
  105. package/src/nodes/accessors/ModelViewProjectionNode.js +9 -5
  106. package/src/nodes/accessors/MorphNode.js +7 -3
  107. package/src/nodes/accessors/Normal.js +32 -6
  108. package/src/nodes/accessors/Object3DNode.js +11 -27
  109. package/src/nodes/accessors/PointUVNode.js +7 -3
  110. package/src/nodes/accessors/ReferenceBaseNode.js +32 -4
  111. package/src/nodes/accessors/ReferenceNode.js +40 -3
  112. package/src/nodes/accessors/RendererReferenceNode.js +9 -3
  113. package/src/nodes/accessors/SceneNode.js +7 -3
  114. package/src/nodes/accessors/SkinningNode.js +7 -3
  115. package/src/nodes/accessors/StorageBufferNode.js +21 -3
  116. package/src/nodes/accessors/StorageTextureNode.js +7 -4
  117. package/src/nodes/accessors/Texture3DNode.js +7 -4
  118. package/src/nodes/accessors/TextureNode.js +19 -8
  119. package/src/nodes/accessors/TextureSizeNode.js +8 -5
  120. package/src/nodes/accessors/UniformArrayNode.js +12 -9
  121. package/src/nodes/accessors/UserDataNode.js +9 -6
  122. package/src/nodes/accessors/VelocityNode.js +74 -23
  123. package/src/nodes/accessors/VertexColorNode.js +6 -3
  124. package/src/nodes/code/CodeNode.js +7 -3
  125. package/src/nodes/code/ExpressionNode.js +8 -4
  126. package/src/nodes/code/FunctionCallNode.js +6 -3
  127. package/src/nodes/code/FunctionNode.js +6 -3
  128. package/src/nodes/code/ScriptableNode.js +11 -6
  129. package/src/nodes/code/ScriptableValueNode.js +7 -3
  130. package/src/nodes/core/AssignNode.js +9 -6
  131. package/src/nodes/core/AttributeNode.js +7 -3
  132. package/src/nodes/core/BypassNode.js +8 -4
  133. package/src/nodes/core/CacheNode.js +8 -4
  134. package/src/nodes/core/ConstNode.js +6 -3
  135. package/src/nodes/core/ContextNode.js +7 -3
  136. package/src/nodes/core/IndexNode.js +25 -3
  137. package/src/nodes/core/InputNode.js +7 -3
  138. package/src/nodes/core/MRTNode.js +6 -3
  139. package/src/nodes/core/Node.js +10 -51
  140. package/src/nodes/core/NodeBuilder.js +71 -5
  141. package/src/nodes/core/NodeUtils.js +48 -6
  142. package/src/nodes/core/OutputStructNode.js +8 -4
  143. package/src/nodes/core/ParameterNode.js +6 -3
  144. package/src/nodes/core/PropertyNode.js +7 -3
  145. package/src/nodes/core/StackNode.js +7 -3
  146. package/src/nodes/core/StructTypeNode.js +7 -3
  147. package/src/nodes/core/TempNode.js +8 -4
  148. package/src/nodes/core/UniformGroupNode.js +10 -6
  149. package/src/nodes/core/UniformNode.js +6 -3
  150. package/src/nodes/core/VarNode.js +8 -4
  151. package/src/nodes/core/VaryingNode.js +7 -3
  152. package/src/nodes/display/AfterImageNode.js +6 -0
  153. package/src/nodes/display/AnaglyphPassNode.js +6 -0
  154. package/src/nodes/display/AnamorphicNode.js +6 -0
  155. package/src/nodes/display/BloomNode.js +6 -0
  156. package/src/nodes/display/BumpMapNode.js +6 -0
  157. package/src/nodes/display/ColorSpaceFunctions.js +4 -4
  158. package/src/nodes/display/ColorSpaceNode.js +43 -14
  159. package/src/nodes/display/DenoiseNode.js +6 -3
  160. package/src/nodes/display/DepthOfFieldNode.js +6 -3
  161. package/src/nodes/display/DotScreenNode.js +8 -5
  162. package/src/nodes/display/FXAANode.js +6 -3
  163. package/src/nodes/display/FilmNode.js +6 -3
  164. package/src/nodes/display/FrontFacingNode.js +7 -3
  165. package/src/nodes/display/GTAONode.js +6 -3
  166. package/src/nodes/display/GaussianBlurNode.js +6 -3
  167. package/src/nodes/display/Lut3DNode.js +6 -3
  168. package/src/nodes/display/NormalMapNode.js +8 -6
  169. package/src/nodes/display/ParallaxBarrierPassNode.js +8 -5
  170. package/src/nodes/display/PassNode.js +18 -7
  171. package/src/nodes/display/PixelationPassNode.js +12 -5
  172. package/src/nodes/display/PosterizeNode.js +6 -3
  173. package/src/nodes/display/RGBShiftNode.js +6 -3
  174. package/src/nodes/display/RenderOutputNode.js +12 -8
  175. package/src/nodes/display/SSAAPassNode.js +6 -3
  176. package/src/nodes/display/ScreenNode.js +181 -0
  177. package/src/nodes/display/SobelOperatorNode.js +6 -3
  178. package/src/nodes/display/StereoCompositePassNode.js +6 -3
  179. package/src/nodes/display/StereoPassNode.js +6 -3
  180. package/src/nodes/display/ToneMappingFunctions.js +12 -12
  181. package/src/nodes/display/ToneMappingNode.js +8 -7
  182. package/src/nodes/display/ToonOutlinePassNode.js +111 -0
  183. package/src/nodes/display/TransitionNode.js +6 -3
  184. package/src/nodes/display/ViewportDepthNode.js +7 -3
  185. package/src/nodes/display/ViewportDepthTextureNode.js +8 -5
  186. package/src/nodes/display/ViewportSharedTextureNode.js +8 -5
  187. package/src/nodes/display/ViewportTextureNode.js +8 -5
  188. package/src/nodes/fog/FogExp2Node.js +6 -3
  189. package/src/nodes/fog/FogNode.js +7 -3
  190. package/src/nodes/fog/FogRangeNode.js +6 -3
  191. package/src/nodes/functions/PhysicalLightingModel.js +2 -2
  192. package/src/nodes/functions/material/getShIrradianceAt.js +28 -0
  193. package/src/nodes/geometry/RangeNode.js +7 -3
  194. package/src/nodes/gpgpu/AtomicFunctionNode.js +99 -0
  195. package/src/nodes/gpgpu/BarrierNode.js +40 -0
  196. package/src/nodes/gpgpu/ComputeBuiltinNode.js +98 -0
  197. package/src/nodes/gpgpu/ComputeNode.js +8 -4
  198. package/src/nodes/gpgpu/WorkgroupInfoNode.js +100 -0
  199. package/src/nodes/lighting/AONode.js +6 -3
  200. package/src/nodes/lighting/AmbientLightNode.js +6 -3
  201. package/src/nodes/lighting/AnalyticLightNode.js +198 -30
  202. package/src/nodes/lighting/BasicEnvironmentNode.js +6 -3
  203. package/src/nodes/lighting/BasicLightMapNode.js +6 -3
  204. package/src/nodes/lighting/DirectionalLightNode.js +7 -4
  205. package/src/nodes/lighting/EnvironmentNode.js +6 -3
  206. package/src/nodes/lighting/HemisphereLightNode.js +10 -6
  207. package/src/nodes/lighting/IESSpotLightNode.js +6 -3
  208. package/src/nodes/lighting/IrradianceNode.js +6 -3
  209. package/src/nodes/lighting/LightProbeNode.js +8 -31
  210. package/src/nodes/lighting/LightingContextNode.js +6 -3
  211. package/src/nodes/lighting/LightingNode.js +7 -3
  212. package/src/nodes/lighting/LightsNode.js +24 -5
  213. package/src/nodes/lighting/PointLightNode.js +11 -7
  214. package/src/nodes/lighting/RectAreaLightNode.js +11 -7
  215. package/src/nodes/lighting/SpotLightNode.js +13 -10
  216. package/src/nodes/math/ConditionalNode.js +23 -6
  217. package/src/nodes/math/MathNode.js +6 -3
  218. package/src/nodes/math/OperatorNode.js +6 -3
  219. package/src/nodes/pmrem/PMREMNode.js +6 -3
  220. package/src/nodes/utils/ArrayElementNode.js +8 -4
  221. package/src/nodes/utils/ConvertNode.js +7 -3
  222. package/src/nodes/utils/CubeMapNode.js +6 -3
  223. package/src/nodes/utils/EquirectUVNode.js +6 -3
  224. package/src/nodes/utils/FlipNode.js +7 -4
  225. package/src/nodes/utils/FunctionOverloadingNode.js +7 -3
  226. package/src/nodes/utils/JoinNode.js +6 -3
  227. package/src/nodes/utils/LoopNode.js +7 -3
  228. package/src/nodes/utils/MatcapUVNode.js +6 -3
  229. package/src/nodes/utils/MaxMipLevelNode.js +6 -3
  230. package/src/nodes/utils/OscNode.js +7 -3
  231. package/src/nodes/utils/RTTNode.js +6 -3
  232. package/src/nodes/utils/ReflectorNode.js +8 -5
  233. package/src/nodes/utils/RemapNode.js +7 -3
  234. package/src/nodes/utils/RotateNode.js +6 -3
  235. package/src/nodes/utils/SetNode.js +7 -4
  236. package/src/nodes/utils/SplitNode.js +7 -3
  237. package/src/nodes/utils/SpriteSheetUVNode.js +7 -3
  238. package/src/nodes/utils/StorageArrayElementNode.js +9 -8
  239. package/src/nodes/utils/TimerNode.js +6 -3
  240. package/src/nodes/utils/TriplanarTexturesNode.js +7 -3
  241. package/src/nodes/utils/ViewportUtils.js +2 -2
  242. package/src/objects/BatchedMesh.js +76 -10
  243. package/src/objects/LOD.js +21 -0
  244. package/src/objects/Line.js +1 -0
  245. package/src/objects/Mesh.js +7 -23
  246. package/src/objects/Points.js +2 -0
  247. package/src/renderers/WebGLRenderer.js +64 -41
  248. package/src/renderers/common/BundleGroup.js +26 -0
  249. package/src/renderers/common/ClippingContext.js +4 -3
  250. package/src/renderers/common/RenderContext.js +4 -5
  251. package/src/renderers/common/RenderObject.js +116 -5
  252. package/src/renderers/common/RenderObjects.js +8 -1
  253. package/src/renderers/common/Renderer.js +57 -49
  254. package/src/renderers/common/extras/PMREMGenerator.js +7 -9
  255. package/src/renderers/common/nodes/NodeBuilderState.js +3 -3
  256. package/src/renderers/common/nodes/Nodes.js +33 -14
  257. package/src/renderers/shaders/ShaderLib/sprite.glsl.js +2 -4
  258. package/src/renderers/webgl/WebGLAttributes.js +45 -14
  259. package/src/renderers/webgl/WebGLCapabilities.js +9 -0
  260. package/src/renderers/webgl/WebGLProgram.js +2 -0
  261. package/src/renderers/webgl/WebGLPrograms.js +21 -17
  262. package/src/renderers/webgl/WebGLState.js +21 -0
  263. package/src/renderers/webgl/WebGLTextures.js +22 -0
  264. package/src/renderers/webgl-fallback/WebGLBackend.js +50 -45
  265. package/src/renderers/webgl-fallback/nodes/GLSLNodeBuilder.js +4 -4
  266. package/src/renderers/webgl-fallback/utils/WebGLAttributeUtils.js +6 -0
  267. package/src/renderers/webgl-fallback/utils/WebGLState.js +1 -4
  268. package/src/renderers/webgl-fallback/utils/WebGLTextureUtils.js +61 -16
  269. package/src/renderers/webgpu/WebGPUBackend.js +33 -25
  270. package/src/renderers/webgpu/WebGPURenderer.Nodes.js +42 -0
  271. package/src/renderers/webgpu/WebGPURenderer.js +5 -2
  272. package/src/renderers/webgpu/nodes/BasicNodeLibrary.js +59 -0
  273. package/src/renderers/{common → webgpu}/nodes/StandardNodeLibrary.js +11 -11
  274. package/src/renderers/webgpu/nodes/WGSLNodeBuilder.js +91 -11
  275. package/src/renderers/webgpu/utils/WebGPUAttributeUtils.js +6 -16
  276. package/src/renderers/webgpu/utils/WebGPUPipelineUtils.js +1 -1
  277. package/src/renderers/webgpu/utils/WebGPUTextureUtils.js +7 -5
  278. package/src/renderers/webgpu/utils/WebGPUUtils.js +1 -1
  279. package/src/utils.js +33 -1
  280. package/examples/jsm/geometries/SDFGeometryGenerator.js +0 -144
  281. package/examples/jsm/loaders/TiltLoader.js +0 -520
  282. package/examples/jsm/utils/GPUStatsPanel.js +0 -95
  283. package/examples/jsm/utils/PackedPhongMaterial.js +0 -178
  284. package/src/nodes/display/ViewportNode.js +0 -138
  285. package/src/nodes/lighting/LightNode.js +0 -57
  286. package/src/renderers/common/StandardRenderer.js +0 -18
@@ -0,0 +1,26 @@
1
+ import { Group } from '../../objects/Group.js';
2
+
3
+ class BundleGroup extends Group {
4
+
5
+ constructor() {
6
+
7
+ super();
8
+
9
+ this.isBundleGroup = true;
10
+
11
+ this.type = 'BundleGroup';
12
+
13
+ this.static = true;
14
+ this.version = 0;
15
+
16
+ }
17
+
18
+ set needsUpdate( value ) {
19
+
20
+ if ( value === true ) this.version ++;
21
+
22
+ }
23
+
24
+ }
25
+
26
+ export default BundleGroup;
@@ -1,6 +1,7 @@
1
1
  import { Matrix3 } from '../../math/Matrix3.js';
2
2
  import { Plane } from '../../math/Plane.js';
3
3
  import { Vector4 } from '../../math/Vector4.js';
4
+ import { hash } from '../../nodes/core/NodeUtils.js';
4
5
 
5
6
  const _plane = /*@__PURE__*/ new Plane();
6
7
 
@@ -20,7 +21,7 @@ class ClippingContext {
20
21
 
21
22
  this.parentVersion = 0;
22
23
  this.viewNormalMatrix = new Matrix3();
23
- this.cacheKey = '';
24
+ this.cacheKey = 0;
24
25
 
25
26
  }
26
27
 
@@ -95,7 +96,7 @@ class ClippingContext {
95
96
  if ( update ) {
96
97
 
97
98
  this.version ++;
98
- this.cacheKey = `${ this.globalClippingCount }:${ this.localClippingEnabled === undefined ? false : this.localClippingEnabled }:`;
99
+ this.cacheKey = hash( this.globalClippingCount, this.localClippingEnabled === true ? 1 : 0 );
99
100
 
100
101
  }
101
102
 
@@ -165,7 +166,7 @@ class ClippingContext {
165
166
  if ( update ) {
166
167
 
167
168
  this.version += parent.version;
168
- this.cacheKey = parent.cacheKey + `:${ this.localClippingCount }:${ this.localClipIntersection === undefined ? false : this.localClipIntersection }`;
169
+ this.cacheKey = hash( parent.cacheKey, this.localClippingCount, this.localClipIntersection === true ? 1 : 0 );
169
170
 
170
171
  }
171
172
 
@@ -1,4 +1,5 @@
1
1
  import { Vector4 } from '../../math/Vector4.js';
2
+ import { hashArray } from '../../nodes/core/NodeUtils.js';
2
3
 
3
4
  let id = 0;
4
5
 
@@ -50,17 +51,15 @@ export function getCacheKey( renderContext ) {
50
51
 
51
52
  const { textures, activeCubeFace } = renderContext;
52
53
 
53
- let key = '';
54
+ const values = [ activeCubeFace ];
54
55
 
55
56
  for ( const texture of textures ) {
56
57
 
57
- key += texture.id + ',';
58
+ values.push( texture.id );
58
59
 
59
60
  }
60
61
 
61
- key += activeCubeFace;
62
-
63
- return key;
62
+ return hashArray( values );
64
63
 
65
64
  }
66
65
 
@@ -1,3 +1,4 @@
1
+ import { hashString } from '../../nodes/core/NodeUtils.js';
1
2
  import ClippingContext from './ClippingContext.js';
2
3
 
3
4
  let _id = 0;
@@ -61,6 +62,9 @@ export default class RenderObject {
61
62
  this.attributes = null;
62
63
  this.pipeline = null;
63
64
  this.vertexBuffers = null;
65
+ this.drawParams = null;
66
+
67
+ this.bundle = null;
64
68
 
65
69
  this.updateClipping( renderContext.clippingContext );
66
70
 
@@ -71,6 +75,7 @@ export default class RenderObject {
71
75
 
72
76
  this._nodeBuilderState = null;
73
77
  this._bindings = null;
78
+ this._monitor = null;
74
79
 
75
80
  this.onDispose = null;
76
81
 
@@ -127,6 +132,12 @@ export default class RenderObject {
127
132
 
128
133
  }
129
134
 
135
+ getMonitor() {
136
+
137
+ return this._monitor || ( this._monitor = this.getNodeBuilderState().monitor );
138
+
139
+ }
140
+
130
141
  getBindings() {
131
142
 
132
143
  return this._bindings || ( this._bindings = this.getNodeBuilderState().createBindings() );
@@ -183,6 +194,90 @@ export default class RenderObject {
183
194
 
184
195
  }
185
196
 
197
+ getDrawParameters() {
198
+
199
+ const { object, material, geometry, group, drawRange } = this;
200
+
201
+ const drawParams = this.drawParams || ( this.drawParams = {
202
+ vertexCount: 0,
203
+ firstVertex: 0,
204
+ instanceCount: 0,
205
+ firstInstance: 0
206
+ } );
207
+
208
+ const index = this.getIndex();
209
+ const hasIndex = ( index !== null );
210
+ const instanceCount = geometry.isInstancedBufferGeometry ? geometry.instanceCount : ( object.count > 1 ? object.count : 1 );
211
+
212
+ if ( instanceCount === 0 ) return null;
213
+
214
+ drawParams.instanceCount = instanceCount;
215
+
216
+ if ( object.isBatchedMesh === true ) return drawParams;
217
+
218
+ let rangeFactor = 1;
219
+
220
+ if ( material.wireframe === true && ! object.isPoints && ! object.isLineSegments && ! object.isLine && ! object.isLineLoop ) {
221
+
222
+ rangeFactor = 2;
223
+
224
+ }
225
+
226
+ let firstVertex = drawRange.start * rangeFactor;
227
+ let lastVertex = ( drawRange.start + drawRange.count ) * rangeFactor;
228
+
229
+ if ( group !== null ) {
230
+
231
+ firstVertex = Math.max( firstVertex, group.start * rangeFactor );
232
+ lastVertex = Math.min( lastVertex, ( group.start + group.count ) * rangeFactor );
233
+
234
+ }
235
+
236
+ const itemCount = hasIndex === true ? index.count : geometry.attributes.position.count;
237
+
238
+ firstVertex = Math.max( firstVertex, 0 );
239
+ lastVertex = Math.min( lastVertex, itemCount );
240
+
241
+ const count = lastVertex - firstVertex;
242
+
243
+ if ( count < 0 || count === Infinity ) return null;
244
+
245
+ drawParams.vertexCount = count;
246
+ drawParams.firstVertex = firstVertex;
247
+
248
+ return drawParams;
249
+
250
+ }
251
+
252
+ getGeometryCacheKey() {
253
+
254
+ const { geometry } = this;
255
+
256
+ let cacheKey = '';
257
+
258
+ for ( const name of Object.keys( geometry.attributes ).sort() ) {
259
+
260
+ const attribute = geometry.attributes[ name ];
261
+
262
+ cacheKey += name + ',';
263
+
264
+ if ( attribute.data ) cacheKey += attribute.data.stride + ',';
265
+ if ( attribute.offset ) cacheKey += attribute.offset + ',';
266
+ if ( attribute.itemSize ) cacheKey += attribute.itemSize + ',';
267
+ if ( attribute.normalized ) cacheKey += 'n,';
268
+
269
+ }
270
+
271
+ if ( geometry.index ) {
272
+
273
+ cacheKey += 'index,';
274
+
275
+ }
276
+
277
+ return cacheKey;
278
+
279
+ }
280
+
186
281
  getMaterialCacheKey() {
187
282
 
188
283
  const { object, material } = this;
@@ -237,6 +332,12 @@ export default class RenderObject {
237
332
 
238
333
  cacheKey += this.clippingContext.cacheKey + ',';
239
334
 
335
+ if ( object.geometry ) {
336
+
337
+ cacheKey += this.getGeometryCacheKey();
338
+
339
+ }
340
+
240
341
  if ( object.skeleton ) {
241
342
 
242
343
  cacheKey += object.skeleton.bones.length + ',';
@@ -263,17 +364,19 @@ export default class RenderObject {
263
364
 
264
365
  if ( object.count > 1 ) {
265
366
 
266
- cacheKey += object.count + ',' + object.uuid + ',';
367
+ // TODO: https://github.com/mrdoob/three.js/pull/29066#issuecomment-2269400850
368
+
369
+ cacheKey += object.uuid + ',';
267
370
 
268
371
  }
269
372
 
270
- return cacheKey;
373
+ return hashString( cacheKey );
271
374
 
272
375
  }
273
376
 
274
377
  get needsUpdate() {
275
378
 
276
- return this.initialNodesCacheKey !== this.getDynamicCacheKey() || this.clippingNeedsUpdate;
379
+ return /*this.object.static !== true &&*/ ( this.initialNodesCacheKey !== this.getDynamicCacheKey() || this.clippingNeedsUpdate );
277
380
 
278
381
  }
279
382
 
@@ -281,13 +384,21 @@ export default class RenderObject {
281
384
 
282
385
  // Environment Nodes Cache Key
283
386
 
284
- return this.object.receiveShadow + ',' + this._nodes.getCacheKey( this.scene, this.lightsNode );
387
+ let cacheKey = this._nodes.getCacheKey( this.scene, this.lightsNode );
388
+
389
+ if ( this.object.receiveShadow ) {
390
+
391
+ cacheKey += 1;
392
+
393
+ }
394
+
395
+ return cacheKey;
285
396
 
286
397
  }
287
398
 
288
399
  getCacheKey() {
289
400
 
290
- return this.getMaterialCacheKey() + ',' + this.getDynamicCacheKey();
401
+ return this.getMaterialCacheKey() + this.getDynamicCacheKey();
291
402
 
292
403
  }
293
404
 
@@ -1,6 +1,8 @@
1
1
  import ChainMap from './ChainMap.js';
2
2
  import RenderObject from './RenderObject.js';
3
3
 
4
+ const chainArray = [];
5
+
4
6
  class RenderObjects {
5
7
 
6
8
  constructor( renderer, nodes, geometries, pipelines, bindings, info ) {
@@ -19,7 +21,12 @@ class RenderObjects {
19
21
  get( object, material, scene, camera, lightsNode, renderContext, passId ) {
20
22
 
21
23
  const chainMap = this.getChainMap( passId );
22
- const chainArray = [ object, material, renderContext, lightsNode ];
24
+
25
+ // reuse chainArray
26
+ chainArray[ 0 ] = object;
27
+ chainArray[ 1 ] = material;
28
+ chainArray[ 2 ] = renderContext;
29
+ chainArray[ 3 ] = lightsNode;
23
30
 
24
31
  let renderObject = chainMap.get( chainArray );
25
32
 
@@ -22,7 +22,6 @@ import { Scene } from '../../scenes/Scene.js';
22
22
  import { Frustum } from '../../math/Frustum.js';
23
23
  import { Matrix4 } from '../../math/Matrix4.js';
24
24
  import { Vector2 } from '../../math/Vector2.js';
25
- import { Vector3 } from '../../math/Vector3.js';
26
25
  import { Vector4 } from '../../math/Vector4.js';
27
26
  import { RenderTarget } from '../../core/RenderTarget.js';
28
27
  import { DoubleSide, BackSide, FrontSide, SRGBColorSpace, NoToneMapping, LinearFilter, LinearSRGBColorSpace, HalfFloatType, RGBAFormat, PCFShadowMap } from '../../constants.js';
@@ -32,7 +31,7 @@ const _drawingBufferSize = /*@__PURE__*/ new Vector2();
32
31
  const _screen = /*@__PURE__*/ new Vector4();
33
32
  const _frustum = /*@__PURE__*/ new Frustum();
34
33
  const _projScreenMatrix = /*@__PURE__*/ new Matrix4();
35
- const _vector3 = /*@__PURE__*/ new Vector3();
34
+ const _vector4 = /*@__PURE__*/ new Vector4();
36
35
 
37
36
  class Renderer {
38
37
 
@@ -45,6 +44,8 @@ class Renderer {
45
44
  const {
46
45
  logarithmicDepthBuffer = false,
47
46
  alpha = true,
47
+ depth = true,
48
+ stencil = false,
48
49
  antialias = false,
49
50
  samples = 0,
50
51
  getFallback = null
@@ -73,15 +74,17 @@ class Renderer {
73
74
 
74
75
  this.sortObjects = true;
75
76
 
76
- this.depth = true;
77
- this.stencil = false;
77
+ this.depth = depth;
78
+ this.stencil = stencil;
78
79
 
79
80
  this.clippingPlanes = [];
80
81
 
81
82
  this.info = new Info();
82
83
 
83
84
  this.nodes = {
84
- library: new NodeLibrary()
85
+ library: new NodeLibrary(),
86
+ modelViewMatrix: null,
87
+ modelNormalViewMatrix: null
85
88
  };
86
89
 
87
90
  // internals
@@ -408,20 +411,21 @@ class Renderer {
408
411
 
409
412
  _renderBundle( bundle, sceneRef, lightsNode ) {
410
413
 
411
- const { object, camera, renderList } = bundle;
414
+ const { bundleGroup, camera, renderList } = bundle;
412
415
 
413
416
  const renderContext = this._currentRenderContext;
414
417
 
415
418
  //
416
419
 
417
- const renderBundle = this._bundles.get( object, camera );
420
+ const renderBundle = this._bundles.get( bundleGroup, camera );
418
421
  const renderBundleData = this.backend.get( renderBundle );
419
422
 
420
423
  if ( renderBundleData.renderContexts === undefined ) renderBundleData.renderContexts = new Set();
421
424
 
422
425
  //
423
426
 
424
- const renderBundleNeedsUpdate = renderBundleData.renderContexts.has( renderContext ) === false || object.needsUpdate === true;
427
+ const needsUpdate = bundleGroup.version !== renderBundleData.version;
428
+ const renderBundleNeedsUpdate = renderBundleData.renderContexts.has( renderContext ) === false || needsUpdate;
425
429
 
426
430
  renderBundleData.renderContexts.add( renderContext );
427
431
 
@@ -429,7 +433,7 @@ class Renderer {
429
433
 
430
434
  this.backend.beginBundle( renderContext );
431
435
 
432
- if ( renderBundleData.renderObjects === undefined || object.needsUpdate === true ) {
436
+ if ( renderBundleData.renderObjects === undefined || needsUpdate ) {
433
437
 
434
438
  renderBundleData.renderObjects = [];
435
439
 
@@ -447,27 +451,26 @@ class Renderer {
447
451
 
448
452
  this.backend.finishBundle( renderContext, renderBundle );
449
453
 
450
- object.needsUpdate = false;
454
+ renderBundleData.version = bundleGroup.version;
451
455
 
452
456
  } else {
453
457
 
454
- const renderObjects = renderBundleData.renderObjects;
458
+ const { renderObjects } = renderBundleData;
455
459
 
456
460
  for ( let i = 0, l = renderObjects.length; i < l; i ++ ) {
457
461
 
458
462
  const renderObject = renderObjects[ i ];
459
463
 
460
- this._nodes.updateBefore( renderObject );
464
+ if ( this._nodes.needsRefresh( renderObject ) ) {
461
465
 
462
- //
466
+ this._nodes.updateBefore( renderObject );
463
467
 
464
- renderObject.object.modelViewMatrix.multiplyMatrices( camera.matrixWorldInverse, renderObject.object.matrixWorld );
465
- renderObject.object.normalMatrix.getNormalMatrix( renderObject.object.modelViewMatrix );
468
+ this._nodes.updateForRender( renderObject );
469
+ this._bindings.updateForRender( renderObject );
466
470
 
467
- this._nodes.updateForRender( renderObject );
468
- this._bindings.updateForRender( renderObject );
471
+ this._nodes.updateAfter( renderObject );
469
472
 
470
- this._nodes.updateAfter( renderObject );
473
+ }
471
474
 
472
475
  }
473
476
 
@@ -713,10 +716,12 @@ class Renderer {
713
716
 
714
717
  // process render lists
715
718
 
716
- const opaqueObjects = renderList.opaque;
717
- const transparentObjects = renderList.transparent;
718
- const bundles = renderList.bundles;
719
- const lightsNode = renderList.lightsNode;
719
+ const {
720
+ bundles,
721
+ lightsNode,
722
+ transparent: transparentObjects,
723
+ opaque: opaqueObjects
724
+ } = renderList;
720
725
 
721
726
  if ( bundles.length > 0 ) this._renderBundles( bundles, sceneRef, lightsNode );
722
727
  if ( this.opaque === true && opaqueObjects.length > 0 ) this._renderObjects( opaqueObjects, camera, sceneRef, lightsNode );
@@ -1243,13 +1248,15 @@ class Renderer {
1243
1248
 
1244
1249
  }
1245
1250
 
1246
- copyFramebufferToTexture( framebufferTexture ) {
1251
+ copyFramebufferToTexture( framebufferTexture, rectangle = null ) {
1247
1252
 
1248
1253
  const renderContext = this._currentRenderContext;
1249
1254
 
1250
1255
  this._textures.updateTexture( framebufferTexture );
1251
1256
 
1252
- this.backend.copyFramebufferToTexture( framebufferTexture, renderContext );
1257
+ rectangle = rectangle === null ? _vector4.set( 0, 0, framebufferTexture.image.width, framebufferTexture.image.height ) : rectangle;
1258
+
1259
+ this.backend.copyFramebufferToTexture( framebufferTexture, renderContext, rectangle );
1253
1260
 
1254
1261
  }
1255
1262
 
@@ -1263,9 +1270,9 @@ class Renderer {
1263
1270
  }
1264
1271
 
1265
1272
 
1266
- readRenderTargetPixelsAsync( renderTarget, x, y, width, height, index = 0 ) {
1273
+ readRenderTargetPixelsAsync( renderTarget, x, y, width, height, index = 0, faceIndex = 0 ) {
1267
1274
 
1268
- return this.backend.copyTextureToBuffer( renderTarget.textures[ index ], x, y, width, height );
1275
+ return this.backend.copyTextureToBuffer( renderTarget.textures[ index ], x, y, width, height, faceIndex );
1269
1276
 
1270
1277
  }
1271
1278
 
@@ -1295,16 +1302,15 @@ class Renderer {
1295
1302
 
1296
1303
  if ( this.sortObjects === true ) {
1297
1304
 
1298
- _vector3.setFromMatrixPosition( object.matrixWorld ).applyMatrix4( _projScreenMatrix );
1305
+ _vector4.setFromMatrixPosition( object.matrixWorld ).applyMatrix4( _projScreenMatrix );
1299
1306
 
1300
1307
  }
1301
1308
 
1302
- const geometry = object.geometry;
1303
- const material = object.material;
1309
+ const { geometry, material } = object;
1304
1310
 
1305
1311
  if ( material.visible ) {
1306
1312
 
1307
- renderList.push( object, geometry, material, groupOrder, _vector3.z, null );
1313
+ renderList.push( object, geometry, material, groupOrder, _vector4.z, null );
1308
1314
 
1309
1315
  }
1310
1316
 
@@ -1318,14 +1324,13 @@ class Renderer {
1318
1324
 
1319
1325
  if ( ! object.frustumCulled || _frustum.intersectsObject( object ) ) {
1320
1326
 
1321
- const geometry = object.geometry;
1322
- const material = object.material;
1327
+ const { geometry, material } = object;
1323
1328
 
1324
1329
  if ( this.sortObjects === true ) {
1325
1330
 
1326
1331
  if ( geometry.boundingSphere === null ) geometry.computeBoundingSphere();
1327
1332
 
1328
- _vector3
1333
+ _vector4
1329
1334
  .copy( geometry.boundingSphere.center )
1330
1335
  .applyMatrix4( object.matrixWorld )
1331
1336
  .applyMatrix4( _projScreenMatrix );
@@ -1343,7 +1348,7 @@ class Renderer {
1343
1348
 
1344
1349
  if ( groupMaterial && groupMaterial.visible ) {
1345
1350
 
1346
- renderList.push( object, geometry, groupMaterial, groupOrder, _vector3.z, group );
1351
+ renderList.push( object, geometry, groupMaterial, groupOrder, _vector4.z, group );
1347
1352
 
1348
1353
  }
1349
1354
 
@@ -1351,7 +1356,7 @@ class Renderer {
1351
1356
 
1352
1357
  } else if ( material.visible ) {
1353
1358
 
1354
- renderList.push( object, geometry, material, groupOrder, _vector3.z, null );
1359
+ renderList.push( object, geometry, material, groupOrder, _vector4.z, null );
1355
1360
 
1356
1361
  }
1357
1362
 
@@ -1361,7 +1366,7 @@ class Renderer {
1361
1366
 
1362
1367
  }
1363
1368
 
1364
- if ( object.static === true && this.backend.beginBundle !== undefined ) {
1369
+ if ( object.isBundleGroup === true && this.backend.beginBundle !== undefined ) {
1365
1370
 
1366
1371
  const baseRenderList = renderList;
1367
1372
 
@@ -1371,7 +1376,7 @@ class Renderer {
1371
1376
  renderList.begin();
1372
1377
 
1373
1378
  baseRenderList.pushBundle( {
1374
- object,
1379
+ bundleGroup: object,
1375
1380
  camera,
1376
1381
  renderList,
1377
1382
  } );
@@ -1571,22 +1576,24 @@ class Renderer {
1571
1576
  _renderObjectDirect( object, material, scene, camera, lightsNode, group, passId ) {
1572
1577
 
1573
1578
  const renderObject = this._objects.get( object, material, scene, camera, lightsNode, this._currentRenderContext, passId );
1574
- renderObject.drawRange = group || object.geometry.drawRange;
1579
+ renderObject.drawRange = object.geometry.drawRange;
1580
+ renderObject.group = group;
1575
1581
 
1576
1582
  //
1577
1583
 
1578
- this._nodes.updateBefore( renderObject );
1584
+ const needsRefresh = this._nodes.needsRefresh( renderObject );
1579
1585
 
1580
- //
1586
+ if ( needsRefresh ) {
1581
1587
 
1582
- object.modelViewMatrix.multiplyMatrices( camera.matrixWorldInverse, object.matrixWorld );
1583
- object.normalMatrix.getNormalMatrix( object.modelViewMatrix );
1588
+ this._nodes.updateBefore( renderObject );
1584
1589
 
1585
- //
1590
+ this._geometries.updateForRender( renderObject );
1591
+
1592
+ this._nodes.updateForRender( renderObject );
1593
+ this._bindings.updateForRender( renderObject );
1594
+
1595
+ }
1586
1596
 
1587
- this._nodes.updateForRender( renderObject );
1588
- this._geometries.updateForRender( renderObject );
1589
- this._bindings.updateForRender( renderObject );
1590
1597
  this._pipelines.updateForRender( renderObject );
1591
1598
 
1592
1599
  //
@@ -1597,11 +1604,13 @@ class Renderer {
1597
1604
 
1598
1605
  renderBundleData.renderObjects.push( renderObject );
1599
1606
 
1607
+ renderObject.bundle = this._currentRenderBundle.scene;
1608
+
1600
1609
  }
1601
1610
 
1602
1611
  this.backend.draw( renderObject, this.info );
1603
1612
 
1604
- this._nodes.updateAfter( renderObject );
1613
+ if ( needsRefresh ) this._nodes.updateAfter( renderObject );
1605
1614
 
1606
1615
  }
1607
1616
 
@@ -1613,10 +1622,9 @@ class Renderer {
1613
1622
 
1614
1623
  this._nodes.updateBefore( renderObject );
1615
1624
 
1616
- //
1625
+ this._geometries.updateForRender( renderObject );
1617
1626
 
1618
1627
  this._nodes.updateForRender( renderObject );
1619
- this._geometries.updateForRender( renderObject );
1620
1628
  this._bindings.updateForRender( renderObject );
1621
1629
 
1622
1630
  this._pipelines.getForRender( renderObject, this._compilationPromises );
@@ -176,12 +176,12 @@ class PMREMGenerator {
176
176
  * Pre-compiles the cubemap shader. You can get faster start-up by invoking this method during
177
177
  * your texture's network fetch for increased concurrency.
178
178
  */
179
- compileCubemapShader() {
179
+ async compileCubemapShader() {
180
180
 
181
181
  if ( this._cubemapMaterial === null ) {
182
182
 
183
183
  this._cubemapMaterial = _getCubemapMaterial();
184
- this._compileMaterial( this._cubemapMaterial );
184
+ await this._compileMaterial( this._cubemapMaterial );
185
185
 
186
186
  }
187
187
 
@@ -191,12 +191,12 @@ class PMREMGenerator {
191
191
  * Pre-compiles the equirectangular shader. You can get faster start-up by invoking this method during
192
192
  * your texture's network fetch for increased concurrency.
193
193
  */
194
- compileEquirectangularShader() {
194
+ async compileEquirectangularShader() {
195
195
 
196
196
  if ( this._equirectMaterial === null ) {
197
197
 
198
198
  this._equirectMaterial = _getEquirectMaterial();
199
- this._compileMaterial( this._equirectMaterial );
199
+ await this._compileMaterial( this._equirectMaterial );
200
200
 
201
201
  }
202
202
 
@@ -316,12 +316,10 @@ class PMREMGenerator {
316
316
 
317
317
  }
318
318
 
319
- _compileMaterial( material ) {
319
+ async _compileMaterial( material ) {
320
320
 
321
- const tmpMesh = this._lodMeshes[ 0 ];
322
- tmpMesh.material = material;
323
-
324
- this._renderer.compile( tmpMesh, _flatCamera );
321
+ const tmpMesh = new Mesh( this._lodPlanes[ 0 ], material );
322
+ await this._renderer.compile( tmpMesh, _flatCamera );
325
323
 
326
324
  }
327
325
 
@@ -2,7 +2,7 @@ import BindGroup from '../BindGroup.js';
2
2
 
3
3
  class NodeBuilderState {
4
4
 
5
- constructor( vertexShader, fragmentShader, computeShader, nodeAttributes, bindings, updateNodes, updateBeforeNodes, updateAfterNodes, instanceBindGroups = true, transforms = [] ) {
5
+ constructor( vertexShader, fragmentShader, computeShader, nodeAttributes, bindings, updateNodes, updateBeforeNodes, updateAfterNodes, monitor, transforms = [] ) {
6
6
 
7
7
  this.vertexShader = vertexShader;
8
8
  this.fragmentShader = fragmentShader;
@@ -16,7 +16,7 @@ class NodeBuilderState {
16
16
  this.updateBeforeNodes = updateBeforeNodes;
17
17
  this.updateAfterNodes = updateAfterNodes;
18
18
 
19
- this.instanceBindGroups = instanceBindGroups;
19
+ this.monitor = monitor;
20
20
 
21
21
  this.usedTimes = 0;
22
22
 
@@ -28,7 +28,7 @@ class NodeBuilderState {
28
28
 
29
29
  for ( const instanceGroup of this.bindings ) {
30
30
 
31
- const shared = this.instanceBindGroups && instanceGroup.bindings[ 0 ].groupNode.shared;
31
+ const shared = instanceGroup.bindings[ 0 ].groupNode.shared;
32
32
 
33
33
  if ( shared !== true ) {
34
34