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