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