super-three 0.164.0 → 0.167.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 (416) hide show
  1. package/README.md +3 -3
  2. package/build/three.cjs +1273 -503
  3. package/build/three.module.js +1269 -504
  4. package/build/three.module.min.js +1 -1
  5. package/build/three.webgpu.js +76086 -0
  6. package/build/three.webgpu.min.js +6 -0
  7. package/examples/jsm/Addons.js +2 -1
  8. package/examples/jsm/controls/TransformControls.js +1 -1
  9. package/examples/jsm/csm/CSMShader.js +4 -4
  10. package/examples/jsm/environments/RoomEnvironment.js +1 -5
  11. package/examples/jsm/exporters/GLTFExporter.js +8 -4
  12. package/examples/jsm/exporters/USDZExporter.js +6 -4
  13. package/examples/jsm/geometries/TeapotGeometry.js +1 -1
  14. package/examples/jsm/helpers/ViewHelper.js +75 -61
  15. package/examples/jsm/lights/RectAreaLightTexturesLib.js +91 -0
  16. package/examples/jsm/lights/RectAreaLightUniformsLib.js +8 -63
  17. package/examples/jsm/lines/LineMaterial.js +1 -15
  18. package/examples/jsm/lines/LineSegments2.js +15 -0
  19. package/examples/jsm/lines/Wireframe.js +16 -1
  20. package/examples/jsm/lines/webgpu/Line2.js +20 -0
  21. package/examples/jsm/lines/webgpu/LineSegments2.js +376 -0
  22. package/examples/jsm/loaders/DRACOLoader.js +1 -1
  23. package/examples/jsm/loaders/FBXLoader.js +47 -58
  24. package/examples/jsm/loaders/GLTFLoader.js +12 -4
  25. package/examples/jsm/loaders/LDrawLoader.js +3 -2
  26. package/examples/jsm/loaders/MMDLoader.js +31 -12
  27. package/examples/jsm/loaders/MaterialXLoader.js +2 -9
  28. package/examples/jsm/loaders/USDZLoader.js +124 -76
  29. package/examples/jsm/loaders/UltraHDRLoader.js +583 -0
  30. package/examples/jsm/loaders/VTKLoader.js +76 -3
  31. package/examples/jsm/misc/GPUComputationRenderer.js +9 -19
  32. package/examples/jsm/modifiers/CurveModifier.js +11 -9
  33. package/examples/jsm/modifiers/SimplifyModifier.js +2 -1
  34. package/examples/jsm/objects/InstancedPoints.js +2 -2
  35. package/examples/jsm/objects/Lensflare.js +2 -2
  36. package/examples/jsm/postprocessing/RenderPass.js +1 -1
  37. package/examples/jsm/postprocessing/RenderTransitionPass.js +13 -38
  38. package/examples/jsm/postprocessing/SSAOPass.js +6 -9
  39. package/examples/jsm/postprocessing/UnrealBloomPass.js +4 -4
  40. package/examples/jsm/renderers/CSS2DRenderer.js +25 -5
  41. package/examples/jsm/renderers/CSS3DRenderer.js +24 -3
  42. package/examples/jsm/shaders/ColorifyShader.js +1 -2
  43. package/examples/jsm/shaders/FXAAShader.js +0 -2
  44. package/examples/jsm/shaders/GTAOShader.js +1 -1
  45. package/examples/jsm/shaders/LuminosityHighPassShader.js +1 -3
  46. package/examples/jsm/transpiler/GLSLDecoder.js +46 -4
  47. package/examples/jsm/transpiler/TSLEncoder.js +17 -15
  48. package/examples/jsm/utils/BufferGeometryUtils.js +18 -16
  49. package/examples/jsm/utils/GPUStatsPanel.js +2 -0
  50. package/examples/jsm/utils/SortUtils.js +8 -5
  51. package/package.json +9 -7
  52. package/src/Three.WebGPU.js +194 -0
  53. package/src/Three.js +2 -0
  54. package/src/animation/tracks/BooleanKeyframeTrack.js +10 -1
  55. package/src/animation/tracks/QuaternionKeyframeTrack.js +1 -2
  56. package/src/animation/tracks/StringKeyframeTrack.js +10 -1
  57. package/src/constants.js +4 -1
  58. package/src/core/Object3D.js +24 -22
  59. package/src/core/Raycaster.js +6 -2
  60. package/src/extras/TextureUtils.js +210 -0
  61. package/src/lights/Light.js +1 -0
  62. package/src/lights/LightShadow.js +5 -0
  63. package/{examples/jsm/lights → src/lights/webgpu}/IESSpotLight.js +1 -1
  64. package/src/loaders/FileLoader.js +4 -0
  65. package/src/loaders/LoaderUtils.js +3 -1
  66. package/src/loaders/ObjectLoader.js +34 -2
  67. package/src/materials/Material.js +13 -4
  68. package/src/math/Box2.js +4 -4
  69. package/src/math/Box3.js +6 -6
  70. package/src/math/ColorManagement.js +10 -0
  71. package/src/math/Matrix2.js +54 -0
  72. package/src/math/Vector4.js +13 -0
  73. package/{examples/jsm → src}/nodes/Nodes.js +39 -20
  74. package/{examples/jsm → src}/nodes/accessors/BatchNode.js +28 -10
  75. package/src/nodes/accessors/BitangentNode.js +13 -0
  76. package/{examples/jsm → src}/nodes/accessors/BufferAttributeNode.js +36 -1
  77. package/{examples/jsm → src}/nodes/accessors/BufferNode.js +6 -0
  78. package/src/nodes/accessors/CameraNode.js +19 -0
  79. package/{examples/jsm → src}/nodes/accessors/CubeTextureNode.js +22 -5
  80. package/src/nodes/accessors/InstanceNode.js +140 -0
  81. package/{examples/jsm → src}/nodes/accessors/MaterialNode.js +24 -2
  82. package/{examples/jsm → src}/nodes/accessors/ModelNode.js +4 -0
  83. package/{examples/jsm → src}/nodes/accessors/MorphNode.js +24 -20
  84. package/src/nodes/accessors/NormalNode.js +14 -0
  85. package/{examples/jsm → src}/nodes/accessors/Object3DNode.js +1 -1
  86. package/src/nodes/accessors/PositionNode.js +10 -0
  87. package/{examples/jsm → src}/nodes/accessors/ReferenceNode.js +7 -1
  88. package/src/nodes/accessors/ReflectVectorNode.js +10 -0
  89. package/{examples/jsm → src}/nodes/accessors/StorageBufferNode.js +50 -1
  90. package/{examples/jsm/nodes/accessors/TextureStoreNode.js → src/nodes/accessors/StorageTextureNode.js} +28 -6
  91. package/src/nodes/accessors/TangentNode.js +23 -0
  92. package/src/nodes/accessors/Texture3DNode.js +100 -0
  93. package/{examples/jsm → src}/nodes/accessors/TextureNode.js +55 -18
  94. package/src/nodes/accessors/UVNode.js +3 -0
  95. package/{examples/jsm → src}/nodes/accessors/UniformsNode.js +7 -1
  96. package/{examples/jsm → src}/nodes/accessors/VertexColorNode.js +2 -1
  97. package/{examples/jsm → src}/nodes/code/ScriptableNode.js +14 -0
  98. package/{examples/jsm → src}/nodes/code/ScriptableValueNode.js +2 -1
  99. package/{examples/jsm → src}/nodes/core/AttributeNode.js +34 -8
  100. package/{examples/jsm → src}/nodes/core/CacheNode.js +7 -10
  101. package/{examples/jsm → src}/nodes/core/ContextNode.js +6 -0
  102. package/{examples/jsm → src}/nodes/core/IndexNode.js +6 -0
  103. package/{examples/jsm → src}/nodes/core/LightingModel.js +2 -2
  104. package/src/nodes/core/MRTNode.js +76 -0
  105. package/{examples/jsm → src}/nodes/core/Node.js +33 -14
  106. package/{examples/jsm → src}/nodes/core/NodeBuilder.js +194 -45
  107. package/src/nodes/core/NodeCache.js +36 -0
  108. package/{examples/jsm → src}/nodes/core/NodeFrame.js +42 -0
  109. package/{examples/jsm → src}/nodes/core/NodeFunction.js +2 -2
  110. package/{examples/jsm → src}/nodes/core/NodeKeywords.js +1 -1
  111. package/{examples/jsm → src}/nodes/core/NodeUniform.js +1 -2
  112. package/{examples/jsm → src}/nodes/core/NodeUtils.js +6 -1
  113. package/{examples/jsm → src}/nodes/core/OutputStructNode.js +1 -5
  114. package/{examples/jsm → src}/nodes/core/PropertyNode.js +2 -0
  115. package/{examples/jsm → src}/nodes/core/TempNode.js +2 -2
  116. package/{examples/jsm → src}/nodes/core/UniformGroupNode.js +20 -0
  117. package/{examples/jsm → src}/nodes/core/UniformNode.js +10 -1
  118. package/{examples/jsm → src}/nodes/core/VarNode.js +2 -6
  119. package/src/nodes/core/VaryingNode.js +104 -0
  120. package/{examples/jsm → src}/nodes/display/AfterImageNode.js +24 -20
  121. package/{examples/jsm → src}/nodes/display/AnamorphicNode.js +18 -21
  122. package/src/nodes/display/BloomNode.js +333 -0
  123. package/{examples/jsm → src}/nodes/display/ColorAdjustmentNode.js +7 -2
  124. package/{examples/jsm → src}/nodes/display/ColorSpaceNode.js +1 -1
  125. package/src/nodes/display/DenoiseNode.js +198 -0
  126. package/src/nodes/display/DepthOfFieldNode.js +119 -0
  127. package/src/nodes/display/DotScreenNode.js +75 -0
  128. package/src/nodes/display/FXAANode.js +327 -0
  129. package/src/nodes/display/FilmNode.js +52 -0
  130. package/{examples/jsm → src}/nodes/display/FrontFacingNode.js +2 -1
  131. package/src/nodes/display/GTAONode.js +324 -0
  132. package/{examples/jsm → src}/nodes/display/GaussianBlurNode.js +34 -17
  133. package/src/nodes/display/Lut3DNode.js +53 -0
  134. package/{examples/jsm → src}/nodes/display/NormalMapNode.js +1 -1
  135. package/src/nodes/display/PassNode.js +291 -0
  136. package/src/nodes/display/PixelationPassNode.js +201 -0
  137. package/src/nodes/display/RGBShiftNode.js +49 -0
  138. package/src/nodes/display/RenderOutputNode.js +56 -0
  139. package/src/nodes/display/SobelOperatorNode.js +121 -0
  140. package/{examples/jsm → src}/nodes/display/ToneMappingNode.js +44 -5
  141. package/src/nodes/display/TransitionNode.js +76 -0
  142. package/{examples/jsm → src}/nodes/display/ViewportDepthNode.js +39 -16
  143. package/{examples/jsm → src}/nodes/display/ViewportDepthTextureNode.js +2 -1
  144. package/{examples/jsm → src}/nodes/display/ViewportNode.js +3 -2
  145. package/{examples/jsm → src}/nodes/display/ViewportSharedTextureNode.js +2 -1
  146. package/{examples/jsm → src}/nodes/display/ViewportTextureNode.js +5 -2
  147. package/src/nodes/functions/BSDF/LTC.js +131 -0
  148. package/src/nodes/functions/BasicLightingModel.js +78 -0
  149. package/{examples/jsm → src}/nodes/functions/PhongLightingModel.js +5 -3
  150. package/{examples/jsm → src}/nodes/functions/PhysicalLightingModel.js +103 -18
  151. package/src/nodes/functions/ToonLightingModel.js +51 -0
  152. package/{examples/jsm → src}/nodes/geometry/RangeNode.js +19 -6
  153. package/{examples/jsm → src}/nodes/lighting/AONode.js +1 -4
  154. package/{examples/jsm → src}/nodes/lighting/AmbientLightNode.js +1 -1
  155. package/src/nodes/lighting/AnalyticLightNode.js +333 -0
  156. package/src/nodes/lighting/BasicEnvironmentNode.js +26 -0
  157. package/src/nodes/lighting/BasicLightMapNode.js +29 -0
  158. package/{examples/jsm → src}/nodes/lighting/DirectionalLightNode.js +2 -3
  159. package/{examples/jsm → src}/nodes/lighting/EnvironmentNode.js +5 -4
  160. package/{examples/jsm → src}/nodes/lighting/HemisphereLightNode.js +2 -1
  161. package/{examples/jsm → src}/nodes/lighting/IESSpotLightNode.js +1 -1
  162. package/{examples/jsm → src}/nodes/lighting/LightingNode.js +2 -0
  163. package/{examples/jsm → src}/nodes/lighting/LightsNode.js +18 -3
  164. package/{examples/jsm → src}/nodes/lighting/PointLightNode.js +2 -3
  165. package/src/nodes/lighting/RectAreaLightNode.js +97 -0
  166. package/{examples/jsm → src}/nodes/lighting/SpotLightNode.js +2 -3
  167. package/{examples/jsm → src}/nodes/loaders/NodeLoader.js +3 -1
  168. package/{examples/jsm → src}/nodes/loaders/NodeMaterialLoader.js +2 -1
  169. package/{examples/jsm → src}/nodes/loaders/NodeObjectLoader.js +2 -1
  170. package/{examples/jsm → src}/nodes/materials/InstancedPointsNodeMaterial.js +3 -3
  171. package/{examples/jsm → src}/nodes/materials/Line2NodeMaterial.js +4 -4
  172. package/{examples/jsm → src}/nodes/materials/LineBasicNodeMaterial.js +3 -3
  173. package/{examples/jsm → src}/nodes/materials/LineDashedNodeMaterial.js +4 -3
  174. package/{examples/jsm → src}/nodes/materials/Materials.js +3 -0
  175. package/src/nodes/materials/MeshBasicNodeMaterial.js +73 -0
  176. package/{examples/jsm → src}/nodes/materials/MeshLambertNodeMaterial.js +12 -3
  177. package/src/nodes/materials/MeshMatcapNodeMaterial.js +53 -0
  178. package/{examples/jsm → src}/nodes/materials/MeshNormalNodeMaterial.js +5 -3
  179. package/{examples/jsm → src}/nodes/materials/MeshPhongNodeMaterial.js +11 -3
  180. package/{examples/jsm → src}/nodes/materials/MeshPhysicalNodeMaterial.js +26 -8
  181. package/{examples/jsm → src}/nodes/materials/MeshStandardNodeMaterial.js +14 -3
  182. package/src/nodes/materials/MeshToonNodeMaterial.js +34 -0
  183. package/{examples/jsm → src}/nodes/materials/NodeMaterial.js +97 -24
  184. package/{examples/jsm → src}/nodes/materials/PointsNodeMaterial.js +3 -3
  185. package/{examples/jsm → src}/nodes/materials/ShadowNodeMaterial.js +3 -3
  186. package/{examples/jsm → src}/nodes/materials/SpriteNodeMaterial.js +3 -3
  187. package/src/nodes/materials/VolumeNodeMaterial.js +106 -0
  188. package/{examples/jsm → src}/nodes/materialx/lib/mx_hsv.js +9 -17
  189. package/{examples/jsm → src}/nodes/materialx/lib/mx_noise.js +474 -577
  190. package/{examples/jsm → src}/nodes/materialx/lib/mx_transform_color.js +2 -8
  191. package/{examples/jsm → src}/nodes/math/CondNode.js +13 -6
  192. package/{examples/jsm → src}/nodes/math/HashNode.js +2 -2
  193. package/{examples/jsm → src}/nodes/math/MathNode.js +14 -1
  194. package/{examples/jsm → src}/nodes/math/OperatorNode.js +6 -6
  195. package/{examples/jsm → src}/nodes/parsers/GLSLNodeFunction.js +7 -7
  196. package/{examples/jsm → src}/nodes/pmrem/PMREMNode.js +2 -1
  197. package/{examples/jsm → src}/nodes/shadernode/ShaderNode.js +57 -33
  198. package/{examples/jsm → src}/nodes/utils/ArrayElementNode.js +1 -1
  199. package/{examples/jsm → src}/nodes/utils/DiscardNode.js +1 -0
  200. package/{examples/jsm → src}/nodes/utils/FunctionOverloadingNode.js +2 -0
  201. package/{examples/jsm → src}/nodes/utils/LoopNode.js +7 -6
  202. package/{examples/jsm → src}/nodes/utils/MatcapUVNode.js +1 -1
  203. package/{examples/jsm → src}/nodes/utils/MaxMipLevelNode.js +8 -2
  204. package/src/nodes/utils/RTTNode.js +130 -0
  205. package/{examples/jsm → src}/nodes/utils/ReflectorNode.js +9 -1
  206. package/{examples/jsm → src}/nodes/utils/TimerNode.js +1 -1
  207. package/src/objects/BatchedMesh.js +232 -162
  208. package/src/objects/InstancedMesh.js +1 -1
  209. package/src/renderers/WebGLRenderer.js +312 -68
  210. package/{examples/jsm → src}/renderers/common/Attributes.js +4 -1
  211. package/{examples/jsm → src}/renderers/common/Backend.js +30 -27
  212. package/{examples/jsm → src}/renderers/common/Background.js +9 -3
  213. package/src/renderers/common/BindGroup.js +16 -0
  214. package/{examples/jsm → src}/renderers/common/Bindings.js +54 -22
  215. package/src/renderers/common/ChainMap.js +59 -0
  216. package/{examples/jsm → src}/renderers/common/ClippingContext.js +8 -6
  217. package/{examples/jsm → src}/renderers/common/Color4.js +1 -1
  218. package/{examples/jsm → src}/renderers/common/CubeRenderTarget.js +7 -1
  219. package/{examples/jsm → src}/renderers/common/Geometries.js +37 -5
  220. package/{examples/jsm → src}/renderers/common/Info.js +34 -6
  221. package/{examples/jsm → src}/renderers/common/Pipelines.js +2 -2
  222. package/src/renderers/common/PostProcessing.js +87 -0
  223. package/{examples/jsm/objects → src/renderers/common}/QuadMesh.js +6 -3
  224. package/src/renderers/common/RenderBundle.js +18 -0
  225. package/src/renderers/common/RenderBundles.js +38 -0
  226. package/{examples/jsm → src}/renderers/common/RenderContext.js +1 -1
  227. package/{examples/jsm → src}/renderers/common/RenderContexts.js +1 -1
  228. package/{examples/jsm → src}/renderers/common/RenderList.js +9 -0
  229. package/{examples/jsm → src}/renderers/common/RenderObject.js +50 -11
  230. package/{examples/jsm → src}/renderers/common/Renderer.js +220 -40
  231. package/{examples/jsm → src}/renderers/common/SampledTexture.js +2 -2
  232. package/{examples/jsm → src}/renderers/common/StorageBufferAttribute.js +1 -1
  233. package/{examples/jsm → src}/renderers/common/StorageInstancedBufferAttribute.js +1 -1
  234. package/{examples/jsm → src}/renderers/common/StorageTexture.js +2 -1
  235. package/{examples/jsm → src}/renderers/common/Textures.js +6 -2
  236. package/{examples/jsm → src}/renderers/common/Uniform.js +10 -5
  237. package/{examples/jsm → src}/renderers/common/UniformsGroup.js +69 -31
  238. package/{examples/jsm → src}/renderers/common/extras/PMREMGenerator.js +13 -12
  239. package/src/renderers/common/nodes/NodeBuilderState.js +58 -0
  240. package/{examples/jsm → src}/renderers/common/nodes/NodeSampledTexture.js +19 -4
  241. package/{examples/jsm → src}/renderers/common/nodes/NodeSampler.js +8 -1
  242. package/{examples/jsm → src}/renderers/common/nodes/NodeStorageBuffer.js +5 -1
  243. package/{examples/jsm → src}/renderers/common/nodes/NodeUniform.js +3 -3
  244. package/{examples/jsm → src}/renderers/common/nodes/NodeUniformBuffer.js +2 -1
  245. package/{examples/jsm → src}/renderers/common/nodes/NodeUniformsGroup.js +2 -8
  246. package/{examples/jsm → src}/renderers/common/nodes/Nodes.js +37 -16
  247. package/src/renderers/shaders/ShaderChunk/batching_pars_vertex.glsl.js +31 -1
  248. package/src/renderers/shaders/ShaderChunk/batching_vertex.glsl.js +1 -1
  249. package/src/renderers/shaders/ShaderChunk/color_pars_vertex.glsl.js +1 -1
  250. package/src/renderers/shaders/ShaderChunk/color_vertex.glsl.js +9 -1
  251. package/src/renderers/shaders/ShaderChunk/colorspace_pars_fragment.glsl.js +0 -9
  252. package/src/renderers/shaders/ShaderChunk/common.glsl.js +0 -10
  253. package/src/renderers/shaders/ShaderChunk/lights_fragment_begin.glsl.js +3 -3
  254. package/src/renderers/shaders/ShaderChunk/lights_pars_begin.glsl.js +8 -22
  255. package/src/renderers/shaders/ShaderChunk/morphcolor_vertex.glsl.js +1 -1
  256. package/src/renderers/shaders/ShaderChunk/morphinstance_vertex.glsl.js +1 -1
  257. package/src/renderers/shaders/ShaderChunk/morphnormal_vertex.glsl.js +3 -14
  258. package/src/renderers/shaders/ShaderChunk/morphtarget_pars_vertex.glsl.js +10 -31
  259. package/src/renderers/shaders/ShaderChunk/morphtarget_vertex.glsl.js +3 -23
  260. package/src/renderers/shaders/ShaderChunk/packing.glsl.js +45 -13
  261. package/src/renderers/shaders/ShaderChunk/shadowmap_pars_fragment.glsl.js +7 -4
  262. package/src/renderers/shaders/ShaderChunk/shadowmap_pars_vertex.glsl.js +3 -0
  263. package/src/renderers/shaders/ShaderChunk/shadowmask_pars_fragment.glsl.js +3 -3
  264. package/src/renderers/shaders/ShaderLib/depth.glsl.js +8 -0
  265. package/src/renderers/shaders/UniformsLib.js +3 -0
  266. package/src/renderers/webgl/WebGLAttributes.js +2 -2
  267. package/src/renderers/webgl/WebGLBackground.js +6 -0
  268. package/src/renderers/webgl/WebGLBufferRenderer.js +6 -19
  269. package/src/renderers/webgl/WebGLExtensions.js +3 -1
  270. package/src/renderers/webgl/WebGLIndexedBufferRenderer.js +6 -18
  271. package/src/renderers/webgl/WebGLLights.js +15 -12
  272. package/src/renderers/webgl/WebGLMaterials.js +1 -5
  273. package/src/renderers/webgl/WebGLMorphtargets.js +1 -2
  274. package/src/renderers/webgl/WebGLProgram.js +28 -31
  275. package/src/renderers/webgl/WebGLPrograms.js +15 -15
  276. package/src/renderers/webgl/WebGLRenderStates.js +2 -2
  277. package/src/renderers/webgl/WebGLTextures.js +100 -70
  278. package/src/renderers/webgl/WebGLUniforms.js +12 -2
  279. package/src/renderers/webgl/WebGLUniformsGroups.js +7 -7
  280. package/{examples/jsm/renderers/webgl → src/renderers/webgl-fallback}/WebGLBackend.js +156 -54
  281. package/{examples/jsm/renderers/webgl → src/renderers/webgl-fallback}/nodes/GLSLNodeBuilder.js +188 -41
  282. package/{examples/jsm/renderers/webgl → src/renderers/webgl-fallback}/utils/WebGLAttributeUtils.js +2 -2
  283. package/{examples/jsm/renderers/webgl → src/renderers/webgl-fallback}/utils/WebGLConstants.js +1 -0
  284. package/{examples/jsm/renderers/webgl → src/renderers/webgl-fallback}/utils/WebGLExtensions.js +2 -0
  285. package/{examples/jsm/renderers/webgl → src/renderers/webgl-fallback}/utils/WebGLState.js +1 -1
  286. package/{examples/jsm/renderers/webgl → src/renderers/webgl-fallback}/utils/WebGLTextureUtils.js +126 -7
  287. package/{examples/jsm/renderers/webgl → src/renderers/webgl-fallback}/utils/WebGLUtils.js +1 -1
  288. package/{examples/jsm → src}/renderers/webgpu/WebGPUBackend.js +212 -78
  289. package/{examples/jsm → src}/renderers/webgpu/WebGPURenderer.js +2 -2
  290. package/{examples/jsm → src}/renderers/webgpu/nodes/WGSLNodeBuilder.js +245 -49
  291. package/src/renderers/webgpu/nodes/WGSLNodeFunction.js +159 -0
  292. package/{examples/jsm → src}/renderers/webgpu/utils/WebGPUAttributeUtils.js +2 -1
  293. package/{examples/jsm → src}/renderers/webgpu/utils/WebGPUBindingUtils.js +30 -14
  294. package/{examples/jsm → src}/renderers/webgpu/utils/WebGPUConstants.js +9 -1
  295. package/{examples/jsm → src}/renderers/webgpu/utils/WebGPUPipelineUtils.js +74 -24
  296. package/{examples/jsm → src}/renderers/webgpu/utils/WebGPUTextureUtils.js +101 -25
  297. package/{examples/jsm → src}/renderers/webgpu/utils/WebGPUUtils.js +24 -3
  298. package/src/renderers/webxr/WebXRDepthSensing.js +9 -3
  299. package/src/renderers/webxr/WebXRManager.js +12 -2
  300. package/src/textures/CompressedArrayTexture.js +14 -0
  301. package/src/textures/DataArrayTexture.js +14 -0
  302. package/src/textures/DepthTexture.js +1 -3
  303. package/src/utils.js +30 -1
  304. package/examples/jsm/nodes/accessors/BitangentNode.js +0 -89
  305. package/examples/jsm/nodes/accessors/CameraNode.js +0 -119
  306. package/examples/jsm/nodes/accessors/InstanceNode.js +0 -94
  307. package/examples/jsm/nodes/accessors/NormalNode.js +0 -106
  308. package/examples/jsm/nodes/accessors/PositionNode.js +0 -104
  309. package/examples/jsm/nodes/accessors/ReflectVectorNode.js +0 -35
  310. package/examples/jsm/nodes/accessors/TangentNode.js +0 -109
  311. package/examples/jsm/nodes/accessors/UVNode.js +0 -47
  312. package/examples/jsm/nodes/core/NodeCache.js +0 -26
  313. package/examples/jsm/nodes/core/VaryingNode.js +0 -65
  314. package/examples/jsm/nodes/display/PassNode.js +0 -199
  315. package/examples/jsm/nodes/lighting/AnalyticLightNode.js +0 -255
  316. package/examples/jsm/nodes/materials/MeshBasicNodeMaterial.js +0 -28
  317. package/examples/jsm/renderers/common/ChainMap.js +0 -89
  318. package/examples/jsm/renderers/common/PostProcessing.js +0 -33
  319. package/examples/jsm/renderers/common/nodes/NodeBuilderState.js +0 -44
  320. package/examples/jsm/renderers/webgpu/nodes/WGSLNodeFunction.js +0 -104
  321. /package/{examples/jsm → src}/nodes/accessors/AccessorsUtils.js +0 -0
  322. /package/{examples/jsm → src}/nodes/accessors/ClippingNode.js +0 -0
  323. /package/{examples/jsm → src}/nodes/accessors/InstancedPointsMaterialNode.js +0 -0
  324. /package/{examples/jsm → src}/nodes/accessors/MaterialReferenceNode.js +0 -0
  325. /package/{examples/jsm → src}/nodes/accessors/ModelViewProjectionNode.js +0 -0
  326. /package/{examples/jsm → src}/nodes/accessors/PointUVNode.js +0 -0
  327. /package/{examples/jsm → src}/nodes/accessors/RendererReferenceNode.js +0 -0
  328. /package/{examples/jsm → src}/nodes/accessors/SceneNode.js +0 -0
  329. /package/{examples/jsm → src}/nodes/accessors/SkinningNode.js +0 -0
  330. /package/{examples/jsm → src}/nodes/accessors/TextureBicubicNode.js +0 -0
  331. /package/{examples/jsm → src}/nodes/accessors/TextureSizeNode.js +0 -0
  332. /package/{examples/jsm → src}/nodes/accessors/UserDataNode.js +0 -0
  333. /package/{examples/jsm → src}/nodes/code/CodeNode.js +0 -0
  334. /package/{examples/jsm → src}/nodes/code/ExpressionNode.js +0 -0
  335. /package/{examples/jsm → src}/nodes/code/FunctionCallNode.js +0 -0
  336. /package/{examples/jsm → src}/nodes/code/FunctionNode.js +0 -0
  337. /package/{examples/jsm → src}/nodes/core/AssignNode.js +0 -0
  338. /package/{examples/jsm → src}/nodes/core/BypassNode.js +0 -0
  339. /package/{examples/jsm → src}/nodes/core/ConstNode.js +0 -0
  340. /package/{examples/jsm → src}/nodes/core/InputNode.js +0 -0
  341. /package/{examples/jsm → src}/nodes/core/NodeAttribute.js +0 -0
  342. /package/{examples/jsm → src}/nodes/core/NodeCode.js +0 -0
  343. /package/{examples/jsm → src}/nodes/core/NodeFunctionInput.js +0 -0
  344. /package/{examples/jsm → src}/nodes/core/NodeParser.js +0 -0
  345. /package/{examples/jsm → src}/nodes/core/NodeVar.js +0 -0
  346. /package/{examples/jsm → src}/nodes/core/NodeVarying.js +0 -0
  347. /package/{examples/jsm → src}/nodes/core/ParameterNode.js +0 -0
  348. /package/{examples/jsm → src}/nodes/core/StackNode.js +0 -0
  349. /package/{examples/jsm → src}/nodes/core/StructTypeNode.js +0 -0
  350. /package/{examples/jsm → src}/nodes/core/UniformGroup.js +0 -0
  351. /package/{examples/jsm → src}/nodes/core/constants.js +0 -0
  352. /package/{examples/jsm → src}/nodes/display/BlendModeNode.js +0 -0
  353. /package/{examples/jsm → src}/nodes/display/BumpMapNode.js +0 -0
  354. /package/{examples/jsm → src}/nodes/display/PosterizeNode.js +0 -0
  355. /package/{examples/jsm → src}/nodes/fog/FogExp2Node.js +0 -0
  356. /package/{examples/jsm → src}/nodes/fog/FogNode.js +0 -0
  357. /package/{examples/jsm → src}/nodes/fog/FogRangeNode.js +0 -0
  358. /package/{examples/jsm → src}/nodes/functions/BSDF/BRDF_GGX.js +0 -0
  359. /package/{examples/jsm → src}/nodes/functions/BSDF/BRDF_Lambert.js +0 -0
  360. /package/{examples/jsm → src}/nodes/functions/BSDF/BRDF_Sheen.js +0 -0
  361. /package/{examples/jsm → src}/nodes/functions/BSDF/DFGApprox.js +0 -0
  362. /package/{examples/jsm → src}/nodes/functions/BSDF/D_GGX.js +0 -0
  363. /package/{examples/jsm → src}/nodes/functions/BSDF/D_GGX_Anisotropic.js +0 -0
  364. /package/{examples/jsm → src}/nodes/functions/BSDF/EnvironmentBRDF.js +0 -0
  365. /package/{examples/jsm → src}/nodes/functions/BSDF/F_Schlick.js +0 -0
  366. /package/{examples/jsm → src}/nodes/functions/BSDF/Schlick_to_F0.js +0 -0
  367. /package/{examples/jsm → src}/nodes/functions/BSDF/V_GGX_SmithCorrelated.js +0 -0
  368. /package/{examples/jsm → src}/nodes/functions/BSDF/V_GGX_SmithCorrelated_Anisotropic.js +0 -0
  369. /package/{examples/jsm → src}/nodes/functions/ShadowMaskModel.js +0 -0
  370. /package/{examples/jsm → src}/nodes/functions/material/getGeometryRoughness.js +0 -0
  371. /package/{examples/jsm → src}/nodes/functions/material/getRoughness.js +0 -0
  372. /package/{examples/jsm → src}/nodes/gpgpu/ComputeNode.js +0 -0
  373. /package/{examples/jsm → src}/nodes/lighting/IrradianceNode.js +0 -0
  374. /package/{examples/jsm → src}/nodes/lighting/LightNode.js +0 -0
  375. /package/{examples/jsm → src}/nodes/lighting/LightUtils.js +0 -0
  376. /package/{examples/jsm → src}/nodes/lighting/LightingContextNode.js +0 -0
  377. /package/{examples/jsm → src}/nodes/materials/MeshSSSNodeMaterial.js +0 -0
  378. /package/{examples/jsm → src}/nodes/materialx/DISCLAIMER.md +0 -0
  379. /package/{examples/jsm → src}/nodes/materialx/MaterialXNodes.js +0 -0
  380. /package/{examples/jsm → src}/nodes/math/MathUtils.js +0 -0
  381. /package/{examples/jsm → src}/nodes/math/TriNoise3D.js +0 -0
  382. /package/{examples/jsm → src}/nodes/parsers/GLSLNodeParser.js +0 -0
  383. /package/{examples/jsm → src}/nodes/pmrem/PMREMUtils.js +0 -0
  384. /package/{examples/jsm → src}/nodes/procedural/CheckerNode.js +0 -0
  385. /package/{examples/jsm → src}/nodes/utils/ConvertNode.js +0 -0
  386. /package/{examples/jsm → src}/nodes/utils/EquirectUVNode.js +0 -0
  387. /package/{examples/jsm → src}/nodes/utils/JoinNode.js +0 -0
  388. /package/{examples/jsm → src}/nodes/utils/OscNode.js +0 -0
  389. /package/{examples/jsm → src}/nodes/utils/PackingNode.js +0 -0
  390. /package/{examples/jsm → src}/nodes/utils/RemapNode.js +0 -0
  391. /package/{examples/jsm → src}/nodes/utils/RotateNode.js +0 -0
  392. /package/{examples/jsm → src}/nodes/utils/RotateUVNode.js +0 -0
  393. /package/{examples/jsm → src}/nodes/utils/SetNode.js +0 -0
  394. /package/{examples/jsm → src}/nodes/utils/SplitNode.js +0 -0
  395. /package/{examples/jsm → src}/nodes/utils/SpriteSheetUVNode.js +0 -0
  396. /package/{examples/jsm → src}/nodes/utils/StorageArrayElementNode.js +0 -0
  397. /package/{examples/jsm → src}/nodes/utils/TriplanarTexturesNode.js +0 -0
  398. /package/{examples/jsm → src}/renderers/common/Animation.js +0 -0
  399. /package/{examples/jsm → src}/renderers/common/Binding.js +0 -0
  400. /package/{examples/jsm → src}/renderers/common/Buffer.js +0 -0
  401. /package/{examples/jsm → src}/renderers/common/BufferUtils.js +0 -0
  402. /package/{examples/jsm → src}/renderers/common/ComputePipeline.js +0 -0
  403. /package/{examples/jsm → src}/renderers/common/Constants.js +0 -0
  404. /package/{examples/jsm → src}/renderers/common/DataMap.js +0 -0
  405. /package/{examples/jsm → src}/renderers/common/Pipeline.js +0 -0
  406. /package/{examples/jsm → src}/renderers/common/ProgrammableStage.js +0 -0
  407. /package/{examples/jsm → src}/renderers/common/RenderLists.js +0 -0
  408. /package/{examples/jsm → src}/renderers/common/RenderObjects.js +0 -0
  409. /package/{examples/jsm → src}/renderers/common/RenderPipeline.js +0 -0
  410. /package/{examples/jsm → src}/renderers/common/Sampler.js +0 -0
  411. /package/{examples/jsm → src}/renderers/common/StorageBuffer.js +0 -0
  412. /package/{examples/jsm → src}/renderers/common/UniformBuffer.js +0 -0
  413. /package/{examples/jsm/renderers/webgl → src/renderers/webgl-fallback}/WebGLBufferRenderer.js +0 -0
  414. /package/{examples/jsm/renderers/webgl → src/renderers/webgl-fallback}/utils/WebGLCapabilities.js +0 -0
  415. /package/{examples/jsm → src}/renderers/webgpu/nodes/WGSLNodeParser.js +0 -0
  416. /package/{examples/jsm → src}/renderers/webgpu/utils/WebGPUTexturePassUtils.js +0 -0
@@ -1,14 +1,16 @@
1
1
  import { BufferAttribute } from '../core/BufferAttribute.js';
2
2
  import { BufferGeometry } from '../core/BufferGeometry.js';
3
3
  import { DataTexture } from '../textures/DataTexture.js';
4
- import { FloatType } from '../constants.js';
4
+ import { FloatType, RedIntegerFormat, UnsignedIntType } from '../constants.js';
5
5
  import { Matrix4 } from '../math/Matrix4.js';
6
6
  import { Mesh } from './Mesh.js';
7
7
  import { RGBAFormat } from '../constants.js';
8
+ import { ColorManagement } from '../math/ColorManagement.js';
8
9
  import { Box3 } from '../math/Box3.js';
9
10
  import { Sphere } from '../math/Sphere.js';
10
11
  import { Frustum } from '../math/Frustum.js';
11
12
  import { Vector3 } from '../math/Vector3.js';
13
+ import { Color } from '../math/Color.js';
12
14
 
13
15
  function sortOpaque( a, b ) {
14
16
 
@@ -32,7 +34,7 @@ class MultiDrawRenderList {
32
34
 
33
35
  }
34
36
 
35
- push( drawRange, z ) {
37
+ push( drawRange, z, index ) {
36
38
 
37
39
  const pool = this.pool;
38
40
  const list = this.list;
@@ -43,6 +45,7 @@ class MultiDrawRenderList {
43
45
  start: - 1,
44
46
  count: - 1,
45
47
  z: - 1,
48
+ index: - 1,
46
49
 
47
50
  } );
48
51
 
@@ -55,6 +58,7 @@ class MultiDrawRenderList {
55
58
  item.start = drawRange.start;
56
59
  item.count = drawRange.count;
57
60
  item.z = z;
61
+ item.index = index;
58
62
 
59
63
  }
60
64
 
@@ -67,15 +71,17 @@ class MultiDrawRenderList {
67
71
 
68
72
  }
69
73
 
70
- const ID_ATTR_NAME = 'batchId';
71
74
  const _matrix = /*@__PURE__*/ new Matrix4();
72
75
  const _invMatrixWorld = /*@__PURE__*/ new Matrix4();
73
76
  const _identityMatrix = /*@__PURE__*/ new Matrix4();
77
+ const _whiteColor = /*@__PURE__*/ new Color( 1, 1, 1 );
74
78
  const _projScreenMatrix = /*@__PURE__*/ new Matrix4();
75
79
  const _frustum = /*@__PURE__*/ new Frustum();
76
80
  const _box = /*@__PURE__*/ new Box3();
77
81
  const _sphere = /*@__PURE__*/ new Sphere();
78
82
  const _vector = /*@__PURE__*/ new Vector3();
83
+ const _forward = /*@__PURE__*/ new Vector3();
84
+ const _temp = /*@__PURE__*/ new Vector3();
79
85
  const _renderList = /*@__PURE__*/ new MultiDrawRenderList();
80
86
  const _mesh = /*@__PURE__*/ new Mesh();
81
87
  const _batchIntersects = [];
@@ -119,13 +125,13 @@ function copyAttributeData( src, target, targetOffset = 0 ) {
119
125
 
120
126
  class BatchedMesh extends Mesh {
121
127
 
122
- get maxGeometryCount() {
128
+ get maxInstanceCount() {
123
129
 
124
- return this._maxGeometryCount;
130
+ return this._maxInstanceCount;
125
131
 
126
132
  }
127
133
 
128
- constructor( maxGeometryCount, maxVertexCount, maxIndexCount = maxVertexCount * 2, material ) {
134
+ constructor( maxInstanceCount, maxVertexCount, maxIndexCount = maxVertexCount * 2, material ) {
129
135
 
130
136
  super( new BufferGeometry(), material );
131
137
 
@@ -136,29 +142,33 @@ class BatchedMesh extends Mesh {
136
142
  this.boundingSphere = null;
137
143
  this.customSort = null;
138
144
 
145
+ // stores visible, active, and geometry id per object
146
+ this._drawInfo = [];
147
+
148
+ // geometry information
139
149
  this._drawRanges = [];
140
150
  this._reservedRanges = [];
141
-
142
- this._visibility = [];
143
- this._active = [];
144
151
  this._bounds = [];
145
152
 
146
- this._maxGeometryCount = maxGeometryCount;
153
+ this._maxInstanceCount = maxInstanceCount;
147
154
  this._maxVertexCount = maxVertexCount;
148
155
  this._maxIndexCount = maxIndexCount;
149
156
 
150
157
  this._geometryInitialized = false;
151
158
  this._geometryCount = 0;
152
- this._multiDrawCounts = new Int32Array( maxGeometryCount );
153
- this._multiDrawStarts = new Int32Array( maxGeometryCount );
159
+ this._multiDrawCounts = new Int32Array( maxInstanceCount );
160
+ this._multiDrawStarts = new Int32Array( maxInstanceCount );
154
161
  this._multiDrawCount = 0;
155
162
  this._multiDrawInstances = null;
156
163
  this._visibilityChanged = true;
157
164
 
158
165
  // Local matrix per geometry by using data texture
159
166
  this._matricesTexture = null;
167
+ this._indirectTexture = null;
168
+ this._colorsTexture = null;
160
169
 
161
170
  this._initMatricesTexture();
171
+ this._initIndirectTexture();
162
172
 
163
173
  }
164
174
 
@@ -171,7 +181,7 @@ class BatchedMesh extends Mesh {
171
181
  // 32x32 pixel texture max 256 matrices * 4 pixels = (32 * 32)
172
182
  // 64x64 pixel texture max 1024 matrices * 4 pixels = (64 * 64)
173
183
 
174
- let size = Math.sqrt( this._maxGeometryCount * 4 ); // 4 pixels needed for 1 matrix
184
+ let size = Math.sqrt( this._maxInstanceCount * 4 ); // 4 pixels needed for 1 matrix
175
185
  size = Math.ceil( size / 4 ) * 4;
176
186
  size = Math.max( size, 4 );
177
187
 
@@ -182,11 +192,36 @@ class BatchedMesh extends Mesh {
182
192
 
183
193
  }
184
194
 
195
+ _initIndirectTexture() {
196
+
197
+ let size = Math.sqrt( this._maxInstanceCount );
198
+ size = Math.ceil( size );
199
+
200
+ const indirectArray = new Uint32Array( size * size );
201
+ const indirectTexture = new DataTexture( indirectArray, size, size, RedIntegerFormat, UnsignedIntType );
202
+
203
+ this._indirectTexture = indirectTexture;
204
+
205
+ }
206
+
207
+ _initColorsTexture() {
208
+
209
+ let size = Math.sqrt( this._maxIndexCount );
210
+ size = Math.ceil( size );
211
+
212
+ // 4 floats per RGBA pixel initialized to white
213
+ const colorsArray = new Float32Array( size * size * 4 ).fill( 1 );
214
+ const colorsTexture = new DataTexture( colorsArray, size, size, RGBAFormat, FloatType );
215
+ colorsTexture.colorSpace = ColorManagement.workingColorSpace;
216
+
217
+ this._colorsTexture = colorsTexture;
218
+
219
+ }
220
+
185
221
  _initializeGeometry( reference ) {
186
222
 
187
223
  const geometry = this.geometry;
188
224
  const maxVertexCount = this._maxVertexCount;
189
- const maxGeometryCount = this._maxGeometryCount;
190
225
  const maxIndexCount = this._maxIndexCount;
191
226
  if ( this._geometryInitialized === false ) {
192
227
 
@@ -204,7 +239,8 @@ class BatchedMesh extends Mesh {
204
239
 
205
240
  if ( reference.getIndex() !== null ) {
206
241
 
207
- const indexArray = maxVertexCount > 65536
242
+ // Reserve last u16 index for primitive restart.
243
+ const indexArray = maxVertexCount > 65535
208
244
  ? new Uint32Array( maxIndexCount )
209
245
  : new Uint16Array( maxIndexCount );
210
246
 
@@ -212,11 +248,6 @@ class BatchedMesh extends Mesh {
212
248
 
213
249
  }
214
250
 
215
- const idArray = maxGeometryCount > 65536
216
- ? new Uint32Array( maxVertexCount )
217
- : new Uint16Array( maxVertexCount );
218
- geometry.setAttribute( ID_ATTR_NAME, new BufferAttribute( idArray, 1 ) );
219
-
220
251
  this._geometryInitialized = true;
221
252
 
222
253
  }
@@ -226,13 +257,6 @@ class BatchedMesh extends Mesh {
226
257
  // Make sure the geometry is compatible with the existing combined geometry attributes
227
258
  _validateGeometry( geometry ) {
228
259
 
229
- // check that the geometry doesn't have a version of our reserved id attribute
230
- if ( geometry.getAttribute( ID_ATTR_NAME ) ) {
231
-
232
- throw new Error( `BatchedMesh: Geometry cannot use attribute "${ ID_ATTR_NAME }"` );
233
-
234
- }
235
-
236
260
  // check to ensure the geometries are using consistent attributes and indices
237
261
  const batchGeometry = this.geometry;
238
262
  if ( Boolean( geometry.getIndex() ) !== Boolean( batchGeometry.getIndex() ) ) {
@@ -243,12 +267,6 @@ class BatchedMesh extends Mesh {
243
267
 
244
268
  for ( const attributeName in batchGeometry.attributes ) {
245
269
 
246
- if ( attributeName === ID_ATTR_NAME ) {
247
-
248
- continue;
249
-
250
- }
251
-
252
270
  if ( ! geometry.hasAttribute( attributeName ) ) {
253
271
 
254
272
  throw new Error( `BatchedMesh: Added geometry missing "${ attributeName }". All geometries must have consistent attributes.` );
@@ -284,15 +302,16 @@ class BatchedMesh extends Mesh {
284
302
 
285
303
  const geometryCount = this._geometryCount;
286
304
  const boundingBox = this.boundingBox;
287
- const active = this._active;
305
+ const drawInfo = this._drawInfo;
288
306
 
289
307
  boundingBox.makeEmpty();
290
308
  for ( let i = 0; i < geometryCount; i ++ ) {
291
309
 
292
- if ( active[ i ] === false ) continue;
310
+ if ( drawInfo[ i ].active === false ) continue;
293
311
 
312
+ const geometryId = drawInfo[ i ].geometryIndex;
294
313
  this.getMatrixAt( i, _matrix );
295
- this.getBoundingBoxAt( i, _box ).applyMatrix4( _matrix );
314
+ this.getBoundingBoxAt( geometryId, _box ).applyMatrix4( _matrix );
296
315
  boundingBox.union( _box );
297
316
 
298
317
  }
@@ -307,23 +326,59 @@ class BatchedMesh extends Mesh {
307
326
 
308
327
  }
309
328
 
310
- const geometryCount = this._geometryCount;
311
329
  const boundingSphere = this.boundingSphere;
312
- const active = this._active;
330
+ const drawInfo = this._drawInfo;
313
331
 
314
332
  boundingSphere.makeEmpty();
315
- for ( let i = 0; i < geometryCount; i ++ ) {
333
+ for ( let i = 0, l = drawInfo.length; i < l; i ++ ) {
316
334
 
317
- if ( active[ i ] === false ) continue;
335
+ if ( drawInfo[ i ].active === false ) continue;
318
336
 
337
+ const geometryId = drawInfo[ i ].geometryIndex;
319
338
  this.getMatrixAt( i, _matrix );
320
- this.getBoundingSphereAt( i, _sphere ).applyMatrix4( _matrix );
339
+ this.getBoundingSphereAt( geometryId, _sphere ).applyMatrix4( _matrix );
321
340
  boundingSphere.union( _sphere );
322
341
 
323
342
  }
324
343
 
325
344
  }
326
345
 
346
+ addInstance( geometryId ) {
347
+
348
+ // ensure we're not over geometry
349
+ if ( this._drawInfo.length >= this._maxInstanceCount ) {
350
+
351
+ throw new Error( 'BatchedMesh: Maximum item count reached.' );
352
+
353
+ }
354
+
355
+ this._drawInfo.push( {
356
+
357
+ visible: true,
358
+ active: true,
359
+ geometryIndex: geometryId,
360
+
361
+ } );
362
+
363
+ // initialize the matrix
364
+ const drawId = this._drawInfo.length - 1;
365
+ const matricesTexture = this._matricesTexture;
366
+ const matricesArray = matricesTexture.image.data;
367
+ _identityMatrix.toArray( matricesArray, drawId * 16 );
368
+ matricesTexture.needsUpdate = true;
369
+
370
+ const colorsTexture = this._colorsTexture;
371
+ if ( colorsTexture ) {
372
+
373
+ _whiteColor.toArray( colorsTexture.image.data, drawId * 4 );
374
+ colorsTexture.needsUpdate = true;
375
+
376
+ }
377
+
378
+ return drawId;
379
+
380
+ }
381
+
327
382
  addGeometry( geometry, vertexCount = - 1, indexCount = - 1 ) {
328
383
 
329
384
  this._initializeGeometry( geometry );
@@ -331,9 +386,9 @@ class BatchedMesh extends Mesh {
331
386
  this._validateGeometry( geometry );
332
387
 
333
388
  // ensure we're not over geometry
334
- if ( this._geometryCount >= this._maxGeometryCount ) {
389
+ if ( this._drawInfo.length >= this._maxInstanceCount ) {
335
390
 
336
- throw new Error( 'BatchedMesh: Maximum geometry count reached.' );
391
+ throw new Error( 'BatchedMesh: Maximum item count reached.' );
337
392
 
338
393
  }
339
394
 
@@ -411,23 +466,10 @@ class BatchedMesh extends Mesh {
411
466
 
412
467
  }
413
468
 
414
- const visibility = this._visibility;
415
- const active = this._active;
416
- const matricesTexture = this._matricesTexture;
417
- const matricesArray = this._matricesTexture.image.data;
418
-
419
- // push new visibility states
420
- visibility.push( true );
421
- active.push( true );
422
-
423
469
  // update id
424
470
  const geometryId = this._geometryCount;
425
471
  this._geometryCount ++;
426
472
 
427
- // initialize matrix information
428
- _identityMatrix.toArray( matricesArray, geometryId * 16 );
429
- matricesTexture.needsUpdate = true;
430
-
431
473
  // add the reserved range and draw range objects
432
474
  reservedRanges.push( reservedRange );
433
475
  drawRanges.push( {
@@ -442,16 +484,6 @@ class BatchedMesh extends Mesh {
442
484
  sphere: new Sphere()
443
485
  } );
444
486
 
445
- // set the id for the geometry
446
- const idAttribute = this.geometry.getAttribute( ID_ATTR_NAME );
447
- for ( let i = 0; i < reservedRange.vertexCount; i ++ ) {
448
-
449
- idAttribute.setX( reservedRange.vertexStart + i, geometryId );
450
-
451
- }
452
-
453
- idAttribute.needsUpdate = true;
454
-
455
487
  // update the geometry
456
488
  this.setGeometryAt( geometryId, geometry );
457
489
 
@@ -459,9 +491,9 @@ class BatchedMesh extends Mesh {
459
491
 
460
492
  }
461
493
 
462
- setGeometryAt( id, geometry ) {
494
+ setGeometryAt( geometryId, geometry ) {
463
495
 
464
- if ( id >= this._geometryCount ) {
496
+ if ( geometryId >= this._geometryCount ) {
465
497
 
466
498
  throw new Error( 'BatchedMesh: Maximum geometry count reached.' );
467
499
 
@@ -473,7 +505,7 @@ class BatchedMesh extends Mesh {
473
505
  const hasIndex = batchGeometry.getIndex() !== null;
474
506
  const dstIndex = batchGeometry.getIndex();
475
507
  const srcIndex = geometry.getIndex();
476
- const reservedRange = this._reservedRanges[ id ];
508
+ const reservedRange = this._reservedRanges[ geometryId ];
477
509
  if (
478
510
  hasIndex &&
479
511
  srcIndex.count > reservedRange.indexCount ||
@@ -489,12 +521,6 @@ class BatchedMesh extends Mesh {
489
521
  const vertexCount = reservedRange.vertexCount;
490
522
  for ( const attributeName in batchGeometry.attributes ) {
491
523
 
492
- if ( attributeName === ID_ATTR_NAME ) {
493
-
494
- continue;
495
-
496
- }
497
-
498
524
  // copy attribute data
499
525
  const srcAttribute = geometry.getAttribute( attributeName );
500
526
  const dstAttribute = batchGeometry.getAttribute( attributeName );
@@ -543,7 +569,7 @@ class BatchedMesh extends Mesh {
543
569
  }
544
570
 
545
571
  // store the bounding boxes
546
- const bound = this._bounds[ id ];
572
+ const bound = this._bounds[ geometryId ];
547
573
  if ( geometry.boundingBox !== null ) {
548
574
 
549
575
  bound.box.copy( geometry.boundingBox );
@@ -567,67 +593,54 @@ class BatchedMesh extends Mesh {
567
593
  }
568
594
 
569
595
  // set drawRange count
570
- const drawRange = this._drawRanges[ id ];
596
+ const drawRange = this._drawRanges[ geometryId ];
571
597
  const posAttr = geometry.getAttribute( 'position' );
572
598
  drawRange.count = hasIndex ? srcIndex.count : posAttr.count;
573
599
  this._visibilityChanged = true;
574
600
 
575
- return id;
601
+ return geometryId;
576
602
 
577
603
  }
578
604
 
605
+ /*
579
606
  deleteGeometry( geometryId ) {
580
607
 
581
- // Note: User needs to call optimize() afterward to pack the data.
582
-
583
- const active = this._active;
584
- if ( geometryId >= active.length || active[ geometryId ] === false ) {
585
-
586
- return this;
587
-
588
- }
589
-
590
- active[ geometryId ] = false;
591
- this._visibilityChanged = true;
592
-
593
- return this;
608
+ // TODO: delete geometry and associated instances
594
609
 
595
610
  }
611
+ */
596
612
 
597
- getInstanceCountAt( id ) {
598
-
599
- if ( this._multiDrawInstances === null ) return null;
613
+ /*
614
+ deleteInstance( instanceId ) {
600
615
 
601
- return this._multiDrawInstances[ id ];
602
-
603
- }
604
-
605
- setInstanceCountAt( id, instanceCount ) {
616
+ // Note: User needs to call optimize() afterward to pack the data.
606
617
 
607
- if ( this._multiDrawInstances === null ) {
618
+ const drawInfo = this._drawInfo;
619
+ if ( instanceId >= drawInfo.length || drawInfo[ instanceId ].active === false ) {
608
620
 
609
- this._multiDrawInstances = new Int32Array( this._maxGeometryCount ).fill( 1 );
621
+ return this;
610
622
 
611
623
  }
612
624
 
613
- this._multiDrawInstances[ id ] = instanceCount;
625
+ drawInfo[ instanceId ].active = false;
626
+ this._visibilityChanged = true;
614
627
 
615
- return id;
628
+ return this;
616
629
 
617
630
  }
631
+ */
618
632
 
619
633
  // get bounding box and compute it if it doesn't exist
620
- getBoundingBoxAt( id, target ) {
634
+ getBoundingBoxAt( geometryId, target ) {
621
635
 
622
- const active = this._active;
623
- if ( active[ id ] === false ) {
636
+ if ( geometryId >= this._geometryCount ) {
624
637
 
625
638
  return null;
626
639
 
627
640
  }
628
641
 
629
642
  // compute bounding box
630
- const bound = this._bounds[ id ];
643
+ const bound = this._bounds[ geometryId ];
631
644
  const box = bound.box;
632
645
  const geometry = this.geometry;
633
646
  if ( bound.boxInitialized === false ) {
@@ -636,7 +649,7 @@ class BatchedMesh extends Mesh {
636
649
 
637
650
  const index = geometry.index;
638
651
  const position = geometry.attributes.position;
639
- const drawRange = this._drawRanges[ id ];
652
+ const drawRange = this._drawRanges[ geometryId ];
640
653
  for ( let i = drawRange.start, l = drawRange.start + drawRange.count; i < l; i ++ ) {
641
654
 
642
655
  let iv = i;
@@ -660,29 +673,28 @@ class BatchedMesh extends Mesh {
660
673
  }
661
674
 
662
675
  // get bounding sphere and compute it if it doesn't exist
663
- getBoundingSphereAt( id, target ) {
676
+ getBoundingSphereAt( geometryId, target ) {
664
677
 
665
- const active = this._active;
666
- if ( active[ id ] === false ) {
678
+ if ( geometryId >= this._geometryCount ) {
667
679
 
668
680
  return null;
669
681
 
670
682
  }
671
683
 
672
684
  // compute bounding sphere
673
- const bound = this._bounds[ id ];
685
+ const bound = this._bounds[ geometryId ];
674
686
  const sphere = bound.sphere;
675
687
  const geometry = this.geometry;
676
688
  if ( bound.sphereInitialized === false ) {
677
689
 
678
690
  sphere.makeEmpty();
679
691
 
680
- this.getBoundingBoxAt( id, _box );
692
+ this.getBoundingBoxAt( geometryId, _box );
681
693
  _box.getCenter( sphere.center );
682
694
 
683
695
  const index = geometry.index;
684
696
  const position = geometry.attributes.position;
685
- const drawRange = this._drawRanges[ id ];
697
+ const drawRange = this._drawRanges[ geometryId ];
686
698
 
687
699
  let maxRadiusSq = 0;
688
700
  for ( let i = drawRange.start, l = drawRange.start + drawRange.count; i < l; i ++ ) {
@@ -709,91 +721,122 @@ class BatchedMesh extends Mesh {
709
721
 
710
722
  }
711
723
 
712
- setMatrixAt( geometryId, matrix ) {
724
+ setMatrixAt( instanceId, matrix ) {
713
725
 
714
726
  // @TODO: Map geometryId to index of the arrays because
715
727
  // optimize() can make geometryId mismatch the index
716
728
 
717
- const active = this._active;
729
+ const drawInfo = this._drawInfo;
718
730
  const matricesTexture = this._matricesTexture;
719
731
  const matricesArray = this._matricesTexture.image.data;
720
- const geometryCount = this._geometryCount;
721
- if ( geometryId >= geometryCount || active[ geometryId ] === false ) {
732
+ if ( instanceId >= drawInfo.length || drawInfo[ instanceId ].active === false ) {
722
733
 
723
734
  return this;
724
735
 
725
736
  }
726
737
 
727
- matrix.toArray( matricesArray, geometryId * 16 );
738
+ matrix.toArray( matricesArray, instanceId * 16 );
728
739
  matricesTexture.needsUpdate = true;
729
740
 
730
741
  return this;
731
742
 
732
743
  }
733
744
 
734
- getMatrixAt( geometryId, matrix ) {
745
+ getMatrixAt( instanceId, matrix ) {
735
746
 
736
- const active = this._active;
747
+ const drawInfo = this._drawInfo;
737
748
  const matricesArray = this._matricesTexture.image.data;
738
- const geometryCount = this._geometryCount;
739
- if ( geometryId >= geometryCount || active[ geometryId ] === false ) {
749
+ if ( instanceId >= drawInfo.length || drawInfo[ instanceId ].active === false ) {
740
750
 
741
751
  return null;
742
752
 
743
753
  }
744
754
 
745
- return matrix.fromArray( matricesArray, geometryId * 16 );
755
+ return matrix.fromArray( matricesArray, instanceId * 16 );
746
756
 
747
757
  }
748
758
 
749
- setVisibleAt( geometryId, value ) {
759
+ setColorAt( instanceId, color ) {
750
760
 
751
- const visibility = this._visibility;
752
- const active = this._active;
753
- const geometryCount = this._geometryCount;
761
+ if ( this._colorsTexture === null ) {
762
+
763
+ this._initColorsTexture();
764
+
765
+ }
766
+
767
+ // @TODO: Map id to index of the arrays because
768
+ // optimize() can make id mismatch the index
769
+
770
+ const colorsTexture = this._colorsTexture;
771
+ const colorsArray = this._colorsTexture.image.data;
772
+ const drawInfo = this._drawInfo;
773
+ if ( instanceId >= drawInfo.length || drawInfo[ instanceId ].active === false ) {
774
+
775
+ return this;
776
+
777
+ }
778
+
779
+ color.toArray( colorsArray, instanceId * 4 );
780
+ colorsTexture.needsUpdate = true;
781
+
782
+ return this;
783
+
784
+ }
785
+
786
+ getColorAt( instanceId, color ) {
787
+
788
+ const colorsArray = this._colorsTexture.image.data;
789
+ const drawInfo = this._drawInfo;
790
+ if ( instanceId >= drawInfo.length || drawInfo[ instanceId ].active === false ) {
791
+
792
+ return null;
793
+
794
+ }
795
+
796
+ return color.fromArray( colorsArray, instanceId * 4 );
797
+
798
+ }
799
+
800
+ setVisibleAt( instanceId, value ) {
754
801
 
755
802
  // if the geometry is out of range, not active, or visibility state
756
803
  // does not change then return early
804
+ const drawInfo = this._drawInfo;
757
805
  if (
758
- geometryId >= geometryCount ||
759
- active[ geometryId ] === false ||
760
- visibility[ geometryId ] === value
806
+ instanceId >= drawInfo.length ||
807
+ drawInfo[ instanceId ].active === false ||
808
+ drawInfo[ instanceId ].visible === value
761
809
  ) {
762
810
 
763
811
  return this;
764
812
 
765
813
  }
766
814
 
767
- visibility[ geometryId ] = value;
815
+ drawInfo[ instanceId ].visible = value;
768
816
  this._visibilityChanged = true;
769
817
 
770
818
  return this;
771
819
 
772
820
  }
773
821
 
774
- getVisibleAt( geometryId ) {
775
-
776
- const visibility = this._visibility;
777
- const active = this._active;
778
- const geometryCount = this._geometryCount;
822
+ getVisibleAt( instanceId ) {
779
823
 
780
824
  // return early if the geometry is out of range or not active
781
- if ( geometryId >= geometryCount || active[ geometryId ] === false ) {
825
+ const drawInfo = this._drawInfo;
826
+ if ( instanceId >= drawInfo.length || drawInfo[ instanceId ].active === false ) {
782
827
 
783
828
  return false;
784
829
 
785
830
  }
786
831
 
787
- return visibility[ geometryId ];
832
+ return drawInfo[ instanceId ].visible;
788
833
 
789
834
  }
790
835
 
791
836
  raycast( raycaster, intersects ) {
792
837
 
793
- const visibility = this._visibility;
794
- const active = this._active;
838
+ const drawInfo = this._drawInfo;
795
839
  const drawRanges = this._drawRanges;
796
- const geometryCount = this._geometryCount;
797
840
  const matrixWorld = this.matrixWorld;
798
841
  const batchGeometry = this.geometry;
799
842
 
@@ -813,21 +856,22 @@ class BatchedMesh extends Mesh {
813
856
 
814
857
  }
815
858
 
816
- for ( let i = 0; i < geometryCount; i ++ ) {
859
+ for ( let i = 0, l = drawInfo.length; i < l; i ++ ) {
817
860
 
818
- if ( ! visibility[ i ] || ! active[ i ] ) {
861
+ if ( ! drawInfo[ i ].visible || ! drawInfo[ i ].active ) {
819
862
 
820
863
  continue;
821
864
 
822
865
  }
823
866
 
824
- const drawRange = drawRanges[ i ];
867
+ const geometryId = drawInfo[ i ].geometryIndex;
868
+ const drawRange = drawRanges[ geometryId ];
825
869
  _mesh.geometry.setDrawRange( drawRange.start, drawRange.count );
826
870
 
827
871
  // ge the intersects
828
872
  this.getMatrixAt( i, _mesh.matrixWorld ).premultiply( matrixWorld );
829
- this.getBoundingBoxAt( i, _mesh.geometry.boundingBox );
830
- this.getBoundingSphereAt( i, _mesh.geometry.boundingSphere );
873
+ this.getBoundingBoxAt( geometryId, _mesh.geometry.boundingBox );
874
+ this.getBoundingSphereAt( geometryId, _mesh.geometry.boundingSphere );
831
875
  _mesh.raycast( raycaster, _batchIntersects );
832
876
 
833
877
  // add batch id to the intersects
@@ -864,8 +908,7 @@ class BatchedMesh extends Mesh {
864
908
  this._drawRanges = source._drawRanges.map( range => ( { ...range } ) );
865
909
  this._reservedRanges = source._reservedRanges.map( range => ( { ...range } ) );
866
910
 
867
- this._visibility = source._visibility.slice();
868
- this._active = source._active.slice();
911
+ this._drawInfo = source._drawInfo.map( inf => ( { ...inf } ) );
869
912
  this._bounds = source._bounds.map( bound => ( {
870
913
  boxInitialized: bound.boxInitialized,
871
914
  box: bound.box.clone(),
@@ -874,7 +917,7 @@ class BatchedMesh extends Mesh {
874
917
  sphere: bound.sphere.clone()
875
918
  } ) );
876
919
 
877
- this._maxGeometryCount = source._maxGeometryCount;
920
+ this._maxInstanceCount = source._maxInstanceCount;
878
921
  this._maxVertexCount = source._maxVertexCount;
879
922
  this._maxIndexCount = source._maxIndexCount;
880
923
 
@@ -884,7 +927,14 @@ class BatchedMesh extends Mesh {
884
927
  this._multiDrawStarts = source._multiDrawStarts.slice();
885
928
 
886
929
  this._matricesTexture = source._matricesTexture.clone();
887
- this._matricesTexture.image.data = this._matricesTexture.image.slice();
930
+ this._matricesTexture.image.data = this._matricesTexture.image.data.slice();
931
+
932
+ if ( this._colorsTexture !== null ) {
933
+
934
+ this._colorsTexture = source._colorsTexture.clone();
935
+ this._colorsTexture.image.data = this._colorsTexture.image.data.slice();
936
+
937
+ }
888
938
 
889
939
  return this;
890
940
 
@@ -897,6 +947,17 @@ class BatchedMesh extends Mesh {
897
947
 
898
948
  this._matricesTexture.dispose();
899
949
  this._matricesTexture = null;
950
+
951
+ this._indirectTexture.dispose();
952
+ this._indirectTexture = null;
953
+
954
+ if ( this._colorsTexture !== null ) {
955
+
956
+ this._colorsTexture.dispose();
957
+ this._colorsTexture = null;
958
+
959
+ }
960
+
900
961
  return this;
901
962
 
902
963
  }
@@ -916,12 +977,13 @@ class BatchedMesh extends Mesh {
916
977
  const index = geometry.getIndex();
917
978
  const bytesPerElement = index === null ? 1 : index.array.BYTES_PER_ELEMENT;
918
979
 
919
- const active = this._active;
920
- const visibility = this._visibility;
980
+ const drawInfo = this._drawInfo;
921
981
  const multiDrawStarts = this._multiDrawStarts;
922
982
  const multiDrawCounts = this._multiDrawCounts;
923
983
  const drawRanges = this._drawRanges;
924
984
  const perObjectFrustumCulled = this.perObjectFrustumCulled;
985
+ const indirectTexture = this._indirectTexture;
986
+ const indirectArray = indirectTexture.image.data;
925
987
 
926
988
  // prepare the frustum in the local frame
927
989
  if ( perObjectFrustumCulled ) {
@@ -942,14 +1004,17 @@ class BatchedMesh extends Mesh {
942
1004
  // get the camera position in the local frame
943
1005
  _invMatrixWorld.copy( this.matrixWorld ).invert();
944
1006
  _vector.setFromMatrixPosition( camera.matrixWorld ).applyMatrix4( _invMatrixWorld );
1007
+ _forward.set( 0, 0, - 1 ).transformDirection( camera.matrixWorld ).transformDirection( _invMatrixWorld );
1008
+
1009
+ for ( let i = 0, l = drawInfo.length; i < l; i ++ ) {
945
1010
 
946
- for ( let i = 0, l = visibility.length; i < l; i ++ ) {
1011
+ if ( drawInfo[ i ].visible && drawInfo[ i ].active ) {
947
1012
 
948
- if ( visibility[ i ] && active[ i ] ) {
1013
+ const geometryId = drawInfo[ i ].geometryIndex;
949
1014
 
950
1015
  // get the bounds in world space
951
1016
  this.getMatrixAt( i, _matrix );
952
- this.getBoundingSphereAt( i, _sphere ).applyMatrix4( _matrix );
1017
+ this.getBoundingSphereAt( geometryId, _sphere ).applyMatrix4( _matrix );
953
1018
 
954
1019
  // determine whether the batched geometry is within the frustum
955
1020
  let culled = false;
@@ -962,8 +1027,8 @@ class BatchedMesh extends Mesh {
962
1027
  if ( ! culled ) {
963
1028
 
964
1029
  // get the distance from camera used for sorting
965
- const z = _vector.distanceTo( _sphere.center );
966
- _renderList.push( drawRanges[ i ], z );
1030
+ const z = _temp.subVectors( _sphere.center, _vector ).dot( _forward );
1031
+ _renderList.push( drawRanges[ geometryId ], z, i );
967
1032
 
968
1033
  }
969
1034
 
@@ -989,6 +1054,7 @@ class BatchedMesh extends Mesh {
989
1054
  const item = list[ i ];
990
1055
  multiDrawStarts[ count ] = item.start * bytesPerElement;
991
1056
  multiDrawCounts[ count ] = item.count;
1057
+ indirectArray[ count ] = item.index;
992
1058
  count ++;
993
1059
 
994
1060
  }
@@ -997,9 +1063,11 @@ class BatchedMesh extends Mesh {
997
1063
 
998
1064
  } else {
999
1065
 
1000
- for ( let i = 0, l = visibility.length; i < l; i ++ ) {
1066
+ for ( let i = 0, l = drawInfo.length; i < l; i ++ ) {
1067
+
1068
+ if ( drawInfo[ i ].visible && drawInfo[ i ].active ) {
1001
1069
 
1002
- if ( visibility[ i ] && active[ i ] ) {
1070
+ const geometryId = drawInfo[ i ].geometryIndex;
1003
1071
 
1004
1072
  // determine whether the batched geometry is within the frustum
1005
1073
  let culled = false;
@@ -1007,16 +1075,17 @@ class BatchedMesh extends Mesh {
1007
1075
 
1008
1076
  // get the bounds in world space
1009
1077
  this.getMatrixAt( i, _matrix );
1010
- this.getBoundingSphereAt( i, _sphere ).applyMatrix4( _matrix );
1078
+ this.getBoundingSphereAt( geometryId, _sphere ).applyMatrix4( _matrix );
1011
1079
  culled = ! _frustum.intersectsSphere( _sphere );
1012
1080
 
1013
1081
  }
1014
1082
 
1015
1083
  if ( ! culled ) {
1016
1084
 
1017
- const range = drawRanges[ i ];
1085
+ const range = drawRanges[ geometryId ];
1018
1086
  multiDrawStarts[ count ] = range.start * bytesPerElement;
1019
1087
  multiDrawCounts[ count ] = range.count;
1088
+ indirectArray[ count ] = i;
1020
1089
  count ++;
1021
1090
 
1022
1091
  }
@@ -1027,6 +1096,7 @@ class BatchedMesh extends Mesh {
1027
1096
 
1028
1097
  }
1029
1098
 
1099
+ indirectTexture.needsUpdate = true;
1030
1100
  this._multiDrawCount = count;
1031
1101
  this._visibilityChanged = false;
1032
1102