@needle-tools/three 0.162.12 → 0.169.2

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 (635) hide show
  1. package/README.md +3 -3
  2. package/build/three.cjs +29789 -1941
  3. package/build/three.module.js +29095 -1933
  4. package/build/three.module.min.js +2 -2
  5. package/build/three.webgpu.js +80003 -0
  6. package/build/three.webgpu.min.js +6 -0
  7. package/build/three.webgpu.nodes.js +79951 -0
  8. package/build/three.webgpu.nodes.min.js +6 -0
  9. package/examples/jsm/Addons.js +2 -5
  10. package/examples/jsm/animation/AnimationClipCreator.js +1 -1
  11. package/examples/jsm/animation/CCDIKSolver.js +4 -2
  12. package/examples/jsm/capabilities/WebGL.js +27 -21
  13. package/examples/jsm/controls/ArcballControls.js +174 -158
  14. package/examples/jsm/controls/DragControls.js +260 -132
  15. package/examples/jsm/controls/FirstPersonControls.js +175 -163
  16. package/examples/jsm/controls/FlyControls.js +194 -188
  17. package/examples/jsm/controls/OrbitControls.js +790 -797
  18. package/examples/jsm/controls/PointerLockControls.js +24 -15
  19. package/examples/jsm/controls/TrackballControls.js +469 -448
  20. package/examples/jsm/controls/TransformControls.js +98 -63
  21. package/examples/jsm/csm/CSMShader.js +4 -4
  22. package/examples/jsm/effects/AnaglyphEffect.js +6 -13
  23. package/examples/jsm/effects/ParallaxBarrierEffect.js +17 -11
  24. package/examples/jsm/effects/StereoEffect.js +6 -1
  25. package/examples/jsm/environments/RoomEnvironment.js +2 -6
  26. package/examples/jsm/exporters/DRACOExporter.js +4 -2
  27. package/examples/jsm/exporters/EXRExporter.js +19 -11
  28. package/examples/jsm/exporters/GLTFExporter.js +77 -8
  29. package/examples/jsm/exporters/KTX2Exporter.js +21 -13
  30. package/examples/jsm/exporters/OBJExporter.js +5 -1
  31. package/examples/jsm/exporters/PLYExporter.js +9 -7
  32. package/examples/jsm/exporters/USDZExporter.js +55 -11
  33. package/examples/jsm/geometries/DecalGeometry.js +4 -1
  34. package/examples/jsm/geometries/InstancedPointsGeometry.js +1 -1
  35. package/examples/jsm/geometries/TeapotGeometry.js +1 -1
  36. package/examples/jsm/geometries/TextGeometry.js +10 -2
  37. package/examples/jsm/helpers/LightProbeHelper.js +43 -44
  38. package/examples/jsm/helpers/LightProbeHelperGPU.js +65 -0
  39. package/examples/jsm/helpers/ViewHelper.js +75 -61
  40. package/examples/jsm/interactive/HTMLMesh.js +7 -9
  41. package/examples/jsm/libs/basis/basis_transcoder.js +8 -10
  42. package/examples/jsm/libs/basis/basis_transcoder.wasm +0 -0
  43. package/examples/jsm/libs/draco/README.md +2 -2
  44. package/examples/jsm/libs/fflate.module.js +694 -496
  45. package/examples/jsm/libs/ktx-parse.module.js +1 -1
  46. package/examples/jsm/lights/LightProbeGenerator.js +24 -10
  47. package/examples/jsm/lights/RectAreaLightTexturesLib.js +91 -0
  48. package/examples/jsm/lights/RectAreaLightUniformsLib.js +8 -63
  49. package/examples/jsm/lines/LineMaterial.js +1 -17
  50. package/examples/jsm/lines/LineSegments2.js +15 -0
  51. package/examples/jsm/lines/Wireframe.js +16 -1
  52. package/examples/jsm/lines/webgpu/Line2.js +20 -0
  53. package/examples/jsm/lines/webgpu/LineSegments2.js +376 -0
  54. package/examples/jsm/loaders/3MFLoader.js +2 -0
  55. package/examples/jsm/loaders/ColladaLoader.js +9 -6
  56. package/examples/jsm/loaders/DRACOLoader.js +4 -2
  57. package/examples/jsm/loaders/EXRLoader.js +351 -97
  58. package/examples/jsm/loaders/FBXLoader.js +77 -78
  59. package/examples/jsm/loaders/GLTFLoader.js +76 -14
  60. package/examples/jsm/loaders/KTX2Loader.js +30 -22
  61. package/examples/jsm/loaders/LDrawLoader.js +3 -2
  62. package/examples/jsm/loaders/LUT3dlLoader.js +0 -15
  63. package/examples/jsm/loaders/LUTCubeLoader.js +0 -14
  64. package/examples/jsm/loaders/LUTImageLoader.js +0 -14
  65. package/examples/jsm/loaders/MMDLoader.js +31 -12
  66. package/examples/jsm/loaders/MTLLoader.js +4 -3
  67. package/examples/jsm/loaders/MaterialXLoader.js +45 -21
  68. package/examples/jsm/loaders/OBJLoader.js +5 -3
  69. package/examples/jsm/loaders/PCDLoader.js +14 -13
  70. package/examples/jsm/loaders/PDBLoader.js +3 -2
  71. package/examples/jsm/loaders/PLYLoader.js +8 -5
  72. package/examples/jsm/loaders/RGBMLoader.js +16 -0
  73. package/examples/jsm/loaders/STLLoader.js +3 -2
  74. package/examples/jsm/loaders/USDZLoader.js +124 -76
  75. package/examples/jsm/loaders/UltraHDRLoader.js +583 -0
  76. package/examples/jsm/loaders/VRMLLoader.js +11 -11
  77. package/examples/jsm/loaders/VTKLoader.js +80 -6
  78. package/examples/jsm/loaders/XYZLoader.js +3 -2
  79. package/examples/jsm/loaders/lwo/IFFParser.js +8 -5
  80. package/examples/jsm/materials/MeshGouraudMaterial.js +7 -1
  81. package/examples/jsm/math/Octree.js +26 -20
  82. package/examples/jsm/misc/GPUComputationRenderer.js +9 -25
  83. package/examples/jsm/misc/Timer.js +1 -1
  84. package/examples/jsm/modifiers/CurveModifier.js +11 -9
  85. package/examples/jsm/modifiers/CurveModifierGPU.js +233 -0
  86. package/examples/jsm/modifiers/SimplifyModifier.js +2 -1
  87. package/examples/jsm/objects/InstancedPoints.js +2 -2
  88. package/examples/jsm/objects/Lensflare.js +2 -2
  89. package/examples/jsm/objects/LensflareMesh.js +322 -0
  90. package/examples/jsm/objects/SkyMesh.js +187 -0
  91. package/examples/jsm/objects/Water2Mesh.js +158 -0
  92. package/examples/jsm/objects/WaterMesh.js +101 -0
  93. package/examples/jsm/physics/JoltPhysics.js +281 -0
  94. package/examples/jsm/physics/RapierPhysics.js +25 -5
  95. package/examples/jsm/postprocessing/GlitchPass.js +0 -3
  96. package/examples/jsm/postprocessing/LUTPass.js +5 -71
  97. package/examples/jsm/postprocessing/OutlinePass.js +31 -46
  98. package/examples/jsm/postprocessing/RenderPass.js +1 -1
  99. package/examples/jsm/postprocessing/RenderTransitionPass.js +168 -0
  100. package/examples/jsm/postprocessing/SAOPass.js +0 -1
  101. package/examples/jsm/postprocessing/SSAARenderPass.js +3 -1
  102. package/examples/jsm/postprocessing/SSAOPass.js +6 -12
  103. package/examples/jsm/postprocessing/UnrealBloomPass.js +4 -4
  104. package/examples/jsm/renderers/CSS2DRenderer.js +25 -5
  105. package/examples/jsm/renderers/CSS3DRenderer.js +24 -3
  106. package/examples/jsm/renderers/webgl-legacy/nodes/GLSL1NodeBuilder.js +1 -3
  107. package/examples/jsm/renderers/webgl-legacy/nodes/SlotNode.js +1 -1
  108. package/examples/jsm/renderers/webgl-legacy/nodes/WebGLNodeBuilder.js +7 -4
  109. package/examples/jsm/renderers/webgl-legacy/nodes/WebGLNodes.js +19 -5
  110. package/examples/jsm/shaders/BleachBypassShader.js +1 -2
  111. package/examples/jsm/shaders/ColorifyShader.js +1 -2
  112. package/examples/jsm/shaders/FXAAShader.js +0 -2
  113. package/examples/jsm/shaders/GTAOShader.js +1 -1
  114. package/examples/jsm/shaders/LuminosityHighPassShader.js +1 -3
  115. package/examples/jsm/shaders/OutputShader.js +1 -1
  116. package/examples/jsm/transpiler/GLSLDecoder.js +47 -5
  117. package/examples/jsm/transpiler/ShaderToyDecoder.js +2 -2
  118. package/examples/jsm/transpiler/TSLEncoder.js +24 -22
  119. package/examples/jsm/utils/BufferGeometryUtils.js +18 -16
  120. package/examples/jsm/utils/GeometryCompressionUtils.js +37 -122
  121. package/examples/jsm/utils/SceneUtils.js +60 -1
  122. package/examples/jsm/utils/ShadowMapViewer.js +3 -8
  123. package/examples/jsm/utils/ShadowMapViewerGPU.js +201 -0
  124. package/examples/jsm/utils/SkeletonUtils.js +84 -66
  125. package/examples/jsm/utils/SortUtils.js +8 -5
  126. package/examples/jsm/utils/TextureUtils.js +3 -2
  127. package/examples/jsm/utils/TextureUtilsGPU.js +63 -0
  128. package/examples/jsm/webxr/OculusHandModel.js +3 -2
  129. package/examples/jsm/webxr/XRControllerModelFactory.js +1 -1
  130. package/examples/jsm/webxr/XRHandModelFactory.js +4 -2
  131. package/package.json +11 -8
  132. package/src/Three.WebGPU.Nodes.js +200 -0
  133. package/src/Three.WebGPU.js +201 -0
  134. package/src/Three.js +23 -1
  135. package/src/animation/AnimationClip.js +1 -1
  136. package/src/animation/tracks/BooleanKeyframeTrack.js +10 -1
  137. package/src/animation/tracks/QuaternionKeyframeTrack.js +1 -2
  138. package/src/animation/tracks/StringKeyframeTrack.js +10 -1
  139. package/src/audio/Audio.js +2 -2
  140. package/src/constants.js +6 -7
  141. package/src/core/BufferAttribute.js +0 -9
  142. package/src/core/Clock.js +1 -1
  143. package/src/core/InterleavedBuffer.js +0 -9
  144. package/src/core/Object3D.js +34 -29
  145. package/src/core/Raycaster.js +6 -2
  146. package/src/core/RenderTarget.js +8 -0
  147. package/src/extras/Controls.js +32 -0
  148. package/src/extras/PMREMGenerator.js +12 -11
  149. package/src/extras/TextureUtils.js +210 -0
  150. package/src/geometries/CylinderGeometry.js +11 -4
  151. package/src/lights/Light.js +1 -0
  152. package/src/lights/LightShadow.js +5 -0
  153. package/{examples/jsm/lights → src/lights/webgpu}/IESSpotLight.js +1 -1
  154. package/src/loaders/FileLoader.js +5 -1
  155. package/src/loaders/LoaderUtils.js +3 -1
  156. package/src/loaders/MaterialLoader.js +8 -1
  157. package/src/loaders/ObjectLoader.js +36 -2
  158. package/{examples/jsm/nodes/loaders → src/loaders/nodes}/NodeLoader.js +27 -5
  159. package/{examples/jsm/nodes/loaders → src/loaders/nodes}/NodeMaterialLoader.js +22 -18
  160. package/{examples/jsm/nodes/loaders → src/loaders/nodes}/NodeObjectLoader.js +21 -1
  161. package/src/materials/Material.js +4 -0
  162. package/src/materials/MeshPhysicalMaterial.js +20 -0
  163. package/src/materials/ShaderMaterial.js +0 -4
  164. package/src/materials/nodes/InstancedPointsNodeMaterial.js +156 -0
  165. package/{examples/jsm/nodes/materials → src/materials/nodes}/Line2NodeMaterial.js +69 -68
  166. package/src/materials/nodes/LineBasicNodeMaterial.js +31 -0
  167. package/{examples/jsm/nodes/materials → src/materials/nodes}/LineDashedNodeMaterial.js +15 -12
  168. package/src/materials/nodes/MeshBasicNodeMaterial.js +77 -0
  169. package/src/materials/nodes/MeshLambertNodeMaterial.js +47 -0
  170. package/src/materials/nodes/MeshMatcapNodeMaterial.js +57 -0
  171. package/src/materials/nodes/MeshNormalNodeMaterial.js +44 -0
  172. package/src/materials/nodes/MeshPhongNodeMaterial.js +78 -0
  173. package/src/materials/nodes/MeshPhysicalNodeMaterial.js +248 -0
  174. package/{examples/jsm/nodes/materials → src/materials/nodes}/MeshSSSNodeMaterial.js +10 -7
  175. package/src/materials/nodes/MeshStandardNodeMaterial.js +108 -0
  176. package/src/materials/nodes/MeshToonNodeMaterial.js +38 -0
  177. package/{examples/jsm/nodes/materials → src/materials/nodes}/NodeMaterial.js +198 -157
  178. package/{examples/jsm/nodes/materials/Materials.js → src/materials/nodes/NodeMaterials.js} +7 -1
  179. package/{examples/jsm/nodes/materials → src/materials/nodes}/PointsNodeMaterial.js +10 -7
  180. package/src/materials/nodes/ShadowNodeMaterial.js +38 -0
  181. package/src/materials/nodes/SpriteNodeMaterial.js +123 -0
  182. package/src/materials/nodes/VolumeNodeMaterial.js +108 -0
  183. package/src/materials/nodes/manager/NodeMaterialObserver.js +302 -0
  184. package/src/math/Box2.js +4 -4
  185. package/src/math/Box3.js +6 -6
  186. package/src/math/ColorManagement.js +10 -0
  187. package/src/math/Matrix2.js +54 -0
  188. package/src/math/Spherical.js +4 -5
  189. package/src/math/Triangle.js +24 -0
  190. package/src/math/Vector4.js +13 -0
  191. package/src/nodes/Nodes.js +164 -0
  192. package/src/nodes/TSL.js +179 -0
  193. package/src/nodes/accessors/AccessorsUtils.js +25 -0
  194. package/src/nodes/accessors/BatchNode.js +128 -0
  195. package/src/nodes/accessors/Bitangent.js +13 -0
  196. package/{examples/jsm → src}/nodes/accessors/BufferAttributeNode.js +44 -6
  197. package/{examples/jsm → src}/nodes/accessors/BufferNode.js +13 -4
  198. package/src/nodes/accessors/Camera.js +13 -0
  199. package/{examples/jsm → src}/nodes/accessors/ClippingNode.js +22 -15
  200. package/src/nodes/accessors/CubeTextureNode.js +79 -0
  201. package/src/nodes/accessors/InstanceNode.js +144 -0
  202. package/src/nodes/accessors/InstancedPointsMaterialNode.js +24 -0
  203. package/src/nodes/accessors/Lights.js +51 -0
  204. package/src/nodes/accessors/MaterialNode.js +441 -0
  205. package/src/nodes/accessors/MaterialProperties.js +3 -0
  206. package/{examples/jsm → src}/nodes/accessors/MaterialReferenceNode.js +10 -5
  207. package/src/nodes/accessors/ModelNode.js +72 -0
  208. package/src/nodes/accessors/ModelViewProjectionNode.js +42 -0
  209. package/{examples/jsm → src}/nodes/accessors/MorphNode.js +51 -33
  210. package/src/nodes/accessors/Normal.js +88 -0
  211. package/{examples/jsm → src}/nodes/accessors/Object3DNode.js +18 -34
  212. package/src/nodes/accessors/PointUVNode.js +30 -0
  213. package/src/nodes/accessors/Position.js +10 -0
  214. package/src/nodes/accessors/ReferenceBaseNode.js +171 -0
  215. package/{examples/jsm → src}/nodes/accessors/ReferenceNode.js +58 -9
  216. package/src/nodes/accessors/ReflectVector.js +10 -0
  217. package/src/nodes/accessors/RendererReferenceNode.js +35 -0
  218. package/{examples/jsm → src}/nodes/accessors/SceneNode.js +9 -6
  219. package/src/nodes/accessors/SkinningNode.js +191 -0
  220. package/src/nodes/accessors/StorageBufferNode.js +147 -0
  221. package/{examples/jsm/nodes/accessors/TextureStoreNode.js → src/nodes/accessors/StorageTextureNode.js} +35 -10
  222. package/src/nodes/accessors/Tangent.js +22 -0
  223. package/src/nodes/accessors/Texture3DNode.js +103 -0
  224. package/{examples/jsm/nodes/accessors/TextureBicubicNode.js → src/nodes/accessors/TextureBicubic.js} +3 -32
  225. package/{examples/jsm → src}/nodes/accessors/TextureNode.js +123 -39
  226. package/src/nodes/accessors/TextureSizeNode.js +36 -0
  227. package/src/nodes/accessors/UV.js +3 -0
  228. package/{examples/jsm/nodes/accessors/UniformsNode.js → src/nodes/accessors/UniformArrayNode.js} +33 -15
  229. package/{examples/jsm → src}/nodes/accessors/UserDataNode.js +10 -7
  230. package/src/nodes/accessors/VelocityNode.js +134 -0
  231. package/{examples/jsm → src}/nodes/accessors/VertexColorNode.js +9 -5
  232. package/{examples/jsm → src}/nodes/code/CodeNode.js +9 -5
  233. package/{examples/jsm → src}/nodes/code/ExpressionNode.js +10 -6
  234. package/{examples/jsm → src}/nodes/code/FunctionCallNode.js +8 -5
  235. package/{examples/jsm → src}/nodes/code/FunctionNode.js +8 -31
  236. package/{examples/jsm → src}/nodes/code/ScriptableNode.js +24 -7
  237. package/{examples/jsm → src}/nodes/code/ScriptableValueNode.js +11 -8
  238. package/{examples/jsm → src}/nodes/core/AssignNode.js +12 -9
  239. package/{examples/jsm → src}/nodes/core/AttributeNode.js +29 -12
  240. package/{examples/jsm → src}/nodes/core/BypassNode.js +11 -7
  241. package/src/nodes/core/CacheNode.js +50 -0
  242. package/{examples/jsm → src}/nodes/core/ConstNode.js +6 -3
  243. package/{examples/jsm → src}/nodes/core/ContextNode.js +27 -11
  244. package/src/nodes/core/IndexNode.js +99 -0
  245. package/{examples/jsm → src}/nodes/core/InputNode.js +7 -3
  246. package/{examples/jsm → src}/nodes/core/LightingModel.js +2 -2
  247. package/src/nodes/core/MRTNode.js +85 -0
  248. package/{examples/jsm → src}/nodes/core/Node.js +114 -57
  249. package/{examples/jsm → src}/nodes/core/NodeBuilder.js +327 -90
  250. package/src/nodes/core/NodeCache.js +36 -0
  251. package/{examples/jsm → src}/nodes/core/NodeFrame.js +52 -10
  252. package/{examples/jsm → src}/nodes/core/NodeFunction.js +2 -2
  253. package/{examples/jsm → src}/nodes/core/NodeUniform.js +1 -2
  254. package/{examples/jsm → src}/nodes/core/NodeUtils.js +56 -8
  255. package/{examples/jsm → src}/nodes/core/OutputStructNode.js +13 -12
  256. package/{examples/jsm → src}/nodes/core/ParameterNode.js +7 -4
  257. package/src/nodes/core/PropertyNode.js +88 -0
  258. package/{examples/jsm → src}/nodes/core/StackNode.js +31 -11
  259. package/{examples/jsm → src}/nodes/core/StructTypeNode.js +7 -3
  260. package/{examples/jsm → src}/nodes/core/TempNode.js +10 -6
  261. package/src/nodes/core/UniformGroupNode.js +59 -0
  262. package/{examples/jsm → src}/nodes/core/UniformNode.js +37 -5
  263. package/{examples/jsm → src}/nodes/core/VarNode.js +14 -14
  264. package/src/nodes/core/VaryingNode.js +108 -0
  265. package/{examples/jsm → src}/nodes/display/AfterImageNode.js +38 -28
  266. package/src/nodes/display/AnaglyphPassNode.js +67 -0
  267. package/{examples/jsm → src}/nodes/display/AnamorphicNode.js +33 -30
  268. package/src/nodes/display/BleachBypass.js +26 -0
  269. package/src/nodes/display/BlendMode.js +54 -0
  270. package/src/nodes/display/BloomNode.js +341 -0
  271. package/{examples/jsm → src}/nodes/display/BumpMapNode.js +20 -38
  272. package/src/nodes/display/ColorAdjustment.js +46 -0
  273. package/src/nodes/display/ColorSpaceFunctions.js +38 -0
  274. package/src/nodes/display/ColorSpaceNode.js +114 -0
  275. package/src/nodes/display/DenoiseNode.js +204 -0
  276. package/src/nodes/display/DepthOfFieldNode.js +124 -0
  277. package/src/nodes/display/DotScreenNode.js +66 -0
  278. package/src/nodes/display/FXAANode.js +332 -0
  279. package/src/nodes/display/FilmNode.js +56 -0
  280. package/src/nodes/display/FrontFacingNode.js +45 -0
  281. package/src/nodes/display/GTAONode.js +331 -0
  282. package/{examples/jsm → src}/nodes/display/GaussianBlurNode.js +47 -24
  283. package/src/nodes/display/Lut3DNode.js +57 -0
  284. package/src/nodes/display/MotionBlur.js +25 -0
  285. package/{examples/jsm → src}/nodes/display/NormalMapNode.js +14 -14
  286. package/src/nodes/display/ParallaxBarrierPassNode.js +58 -0
  287. package/src/nodes/display/PassNode.js +378 -0
  288. package/src/nodes/display/PixelationPassNode.js +213 -0
  289. package/{examples/jsm → src}/nodes/display/PosterizeNode.js +8 -7
  290. package/src/nodes/display/RGBShiftNode.js +53 -0
  291. package/src/nodes/display/RenderOutputNode.js +60 -0
  292. package/src/nodes/display/SSAAPassNode.js +287 -0
  293. package/src/nodes/display/ScreenNode.js +181 -0
  294. package/src/nodes/display/Sepia.js +17 -0
  295. package/src/nodes/display/SobelOperatorNode.js +126 -0
  296. package/src/nodes/display/StereoCompositePassNode.js +110 -0
  297. package/src/nodes/display/StereoPassNode.js +83 -0
  298. package/src/nodes/display/ToneMappingFunctions.js +190 -0
  299. package/src/nodes/display/ToneMappingNode.js +67 -0
  300. package/src/nodes/display/ToonOutlinePassNode.js +111 -0
  301. package/src/nodes/display/TransitionNode.js +80 -0
  302. package/src/nodes/display/ViewportDepthNode.js +125 -0
  303. package/src/nodes/display/ViewportDepthTextureNode.js +33 -0
  304. package/src/nodes/display/ViewportSharedTextureNode.js +39 -0
  305. package/{examples/jsm → src}/nodes/display/ViewportTextureNode.js +20 -14
  306. package/src/nodes/fog/FogExp2Node.js +35 -0
  307. package/src/nodes/fog/FogNode.js +50 -0
  308. package/src/nodes/fog/FogRangeNode.js +36 -0
  309. package/src/nodes/functions/BSDF/BRDF_GGX.js +59 -0
  310. package/{examples/jsm → src}/nodes/functions/BSDF/BRDF_Lambert.js +2 -2
  311. package/{examples/jsm → src}/nodes/functions/BSDF/BRDF_Sheen.js +6 -6
  312. package/{examples/jsm → src}/nodes/functions/BSDF/DFGApprox.js +2 -2
  313. package/{examples/jsm → src}/nodes/functions/BSDF/D_GGX.js +2 -2
  314. package/src/nodes/functions/BSDF/D_GGX_Anisotropic.js +28 -0
  315. package/{examples/jsm → src}/nodes/functions/BSDF/EnvironmentBRDF.js +2 -2
  316. package/{examples/jsm → src}/nodes/functions/BSDF/F_Schlick.js +2 -2
  317. package/src/nodes/functions/BSDF/LTC.js +131 -0
  318. package/{examples/jsm → src}/nodes/functions/BSDF/Schlick_to_F0.js +2 -2
  319. package/{examples/jsm → src}/nodes/functions/BSDF/V_GGX_SmithCorrelated.js +2 -4
  320. package/src/nodes/functions/BSDF/V_GGX_SmithCorrelated_Anisotropic.js +29 -0
  321. package/src/nodes/functions/BasicLightingModel.js +78 -0
  322. package/{examples/jsm → src}/nodes/functions/PhongLightingModel.js +11 -9
  323. package/src/nodes/functions/PhysicalLightingModel.js +633 -0
  324. package/src/nodes/functions/ShadowMaskModel.js +31 -0
  325. package/src/nodes/functions/ToonLightingModel.js +51 -0
  326. package/src/nodes/functions/material/getGeometryRoughness.js +13 -0
  327. package/{examples/jsm → src}/nodes/functions/material/getRoughness.js +2 -2
  328. package/src/nodes/functions/material/getShIrradianceAt.js +28 -0
  329. package/{examples/jsm → src}/nodes/geometry/RangeNode.js +28 -11
  330. package/src/nodes/gpgpu/AtomicFunctionNode.js +99 -0
  331. package/src/nodes/gpgpu/BarrierNode.js +40 -0
  332. package/src/nodes/gpgpu/ComputeBuiltinNode.js +98 -0
  333. package/{examples/jsm → src}/nodes/gpgpu/ComputeNode.js +10 -6
  334. package/src/nodes/gpgpu/WorkgroupInfoNode.js +100 -0
  335. package/src/nodes/lighting/AONode.js +27 -0
  336. package/{examples/jsm → src}/nodes/lighting/AmbientLightNode.js +6 -8
  337. package/src/nodes/lighting/AnalyticLightNode.js +522 -0
  338. package/src/nodes/lighting/BasicEnvironmentNode.js +30 -0
  339. package/src/nodes/lighting/BasicLightMapNode.js +32 -0
  340. package/{examples/jsm → src}/nodes/lighting/DirectionalLightNode.js +7 -9
  341. package/src/nodes/lighting/EnvironmentNode.js +138 -0
  342. package/{examples/jsm → src}/nodes/lighting/HemisphereLightNode.js +12 -11
  343. package/{examples/jsm → src}/nodes/lighting/IESSpotLightNode.js +7 -9
  344. package/src/nodes/lighting/IrradianceNode.js +27 -0
  345. package/src/nodes/lighting/LightProbeNode.js +53 -0
  346. package/{examples/jsm → src}/nodes/lighting/LightUtils.js +3 -3
  347. package/src/nodes/lighting/LightingContextNode.js +67 -0
  348. package/{examples/jsm → src}/nodes/lighting/LightingNode.js +9 -3
  349. package/src/nodes/lighting/LightsNode.js +250 -0
  350. package/{examples/jsm → src}/nodes/lighting/PointLightNode.js +12 -13
  351. package/src/nodes/lighting/RectAreaLightNode.js +97 -0
  352. package/{examples/jsm → src}/nodes/lighting/SpotLightNode.js +14 -16
  353. package/{examples/jsm → src}/nodes/materialx/MaterialXNodes.js +2 -2
  354. package/src/nodes/materialx/lib/mx_hsv.js +127 -0
  355. package/{examples/jsm → src}/nodes/materialx/lib/mx_noise.js +500 -603
  356. package/{examples/jsm → src}/nodes/materialx/lib/mx_transform_color.js +3 -9
  357. package/{examples/jsm/nodes/math/CondNode.js → src/nodes/math/ConditionalNode.js} +48 -13
  358. package/src/nodes/math/Hash.js +13 -0
  359. package/src/nodes/math/MathNode.js +407 -0
  360. package/{examples/jsm → src}/nodes/math/MathUtils.js +0 -7
  361. package/src/nodes/math/OperatorNode.js +319 -0
  362. package/{examples/jsm → src}/nodes/math/TriNoise3D.js +19 -29
  363. package/{examples/jsm → src}/nodes/parsers/GLSLNodeFunction.js +7 -7
  364. package/src/nodes/pmrem/PMREMNode.js +240 -0
  365. package/src/nodes/pmrem/PMREMUtils.js +288 -0
  366. package/src/nodes/procedural/Checker.js +14 -0
  367. package/src/nodes/tsl/TSLBase.js +30 -0
  368. package/{examples/jsm/nodes/shadernode/ShaderNode.js → src/nodes/tsl/TSLCore.js} +122 -96
  369. package/{examples/jsm → src}/nodes/utils/ArrayElementNode.js +9 -5
  370. package/{examples/jsm → src}/nodes/utils/ConvertNode.js +7 -3
  371. package/src/nodes/utils/CubeMapNode.js +160 -0
  372. package/src/nodes/utils/Discard.js +8 -0
  373. package/src/nodes/utils/EquirectUVNode.js +36 -0
  374. package/src/nodes/utils/FlipNode.js +68 -0
  375. package/{examples/jsm → src}/nodes/utils/FunctionOverloadingNode.js +11 -5
  376. package/{examples/jsm → src}/nodes/utils/JoinNode.js +6 -3
  377. package/{examples/jsm → src}/nodes/utils/LoopNode.js +23 -12
  378. package/src/nodes/utils/MatcapUVNode.js +33 -0
  379. package/{examples/jsm → src}/nodes/utils/MaxMipLevelNode.js +16 -7
  380. package/{examples/jsm → src}/nodes/utils/OscNode.js +12 -8
  381. package/src/nodes/utils/Packing.js +4 -0
  382. package/src/nodes/utils/RTTNode.js +133 -0
  383. package/{examples/jsm → src}/nodes/utils/ReflectorNode.js +21 -5
  384. package/{examples/jsm → src}/nodes/utils/RemapNode.js +12 -8
  385. package/{examples/jsm → src}/nodes/utils/RotateNode.js +8 -13
  386. package/{examples/jsm → src}/nodes/utils/SetNode.js +7 -4
  387. package/{examples/jsm → src}/nodes/utils/SplitNode.js +7 -3
  388. package/{examples/jsm → src}/nodes/utils/SpriteSheetUVNode.js +10 -6
  389. package/src/nodes/utils/SpriteUtils.js +47 -0
  390. package/{examples/jsm → src}/nodes/utils/StorageArrayElementNode.js +11 -12
  391. package/{examples/jsm → src}/nodes/utils/TimerNode.js +8 -5
  392. package/{examples/jsm → src}/nodes/utils/TriplanarTexturesNode.js +11 -9
  393. package/src/nodes/utils/UVUtils.js +19 -0
  394. package/src/nodes/utils/ViewportUtils.js +14 -0
  395. package/src/objects/BatchedMesh.js +302 -144
  396. package/src/objects/InstancedMesh.js +11 -1
  397. package/src/objects/LOD.js +21 -0
  398. package/src/objects/Line.js +67 -43
  399. package/src/objects/Mesh.js +7 -23
  400. package/src/objects/Points.js +2 -0
  401. package/src/renderers/WebGLRenderer.js +473 -224
  402. package/{examples/jsm → src}/renderers/common/Animation.js +3 -0
  403. package/{examples/jsm → src}/renderers/common/Attributes.js +4 -1
  404. package/{examples/jsm → src}/renderers/common/Backend.js +30 -27
  405. package/{examples/jsm → src}/renderers/common/Background.js +18 -10
  406. package/src/renderers/common/BindGroup.js +18 -0
  407. package/src/renderers/common/Bindings.js +203 -0
  408. package/src/renderers/common/BundleGroup.js +26 -0
  409. package/src/renderers/common/ChainMap.js +59 -0
  410. package/{examples/jsm → src}/renderers/common/ClippingContext.js +24 -12
  411. package/{examples/jsm → src}/renderers/common/Color4.js +1 -1
  412. package/{examples/jsm → src}/renderers/common/CubeRenderTarget.js +16 -4
  413. package/{examples/jsm → src}/renderers/common/Geometries.js +37 -5
  414. package/{examples/jsm → src}/renderers/common/Info.js +35 -15
  415. package/{examples/jsm → src}/renderers/common/Pipelines.js +2 -2
  416. package/src/renderers/common/PostProcessing.js +90 -0
  417. package/src/renderers/common/QuadMesh.js +55 -0
  418. package/src/renderers/common/RenderBundle.js +18 -0
  419. package/src/renderers/common/RenderBundles.js +38 -0
  420. package/{examples/jsm → src}/renderers/common/RenderContext.js +25 -2
  421. package/{examples/jsm → src}/renderers/common/RenderContexts.js +1 -1
  422. package/{examples/jsm → src}/renderers/common/RenderList.js +11 -2
  423. package/src/renderers/common/RenderObject.js +413 -0
  424. package/{examples/jsm → src}/renderers/common/RenderObjects.js +9 -2
  425. package/{examples/jsm → src}/renderers/common/Renderer.js +431 -83
  426. package/{examples/jsm → src}/renderers/common/SampledTexture.js +14 -5
  427. package/{examples/jsm → src}/renderers/common/StorageBufferAttribute.js +1 -1
  428. package/{examples/jsm → src}/renderers/common/StorageInstancedBufferAttribute.js +1 -1
  429. package/{examples/jsm → src}/renderers/common/StorageTexture.js +2 -1
  430. package/{examples/jsm → src}/renderers/common/Textures.js +15 -15
  431. package/{examples/jsm → src}/renderers/common/Uniform.js +10 -5
  432. package/{examples/jsm → src}/renderers/common/UniformsGroup.js +69 -31
  433. package/src/renderers/common/extras/PMREMGenerator.js +771 -0
  434. package/src/renderers/common/nodes/NodeBuilderState.js +58 -0
  435. package/src/renderers/common/nodes/NodeLibrary.js +118 -0
  436. package/src/renderers/common/nodes/NodeSampledTexture.js +64 -0
  437. package/{examples/jsm → src}/renderers/common/nodes/NodeSampler.js +8 -1
  438. package/{examples/jsm → src}/renderers/common/nodes/NodeStorageBuffer.js +5 -1
  439. package/{examples/jsm → src}/renderers/common/nodes/NodeUniform.js +3 -3
  440. package/{examples/jsm → src}/renderers/common/nodes/NodeUniformBuffer.js +2 -1
  441. package/{examples/jsm → src}/renderers/common/nodes/NodeUniformsGroup.js +2 -8
  442. package/{examples/jsm → src}/renderers/common/nodes/Nodes.js +106 -68
  443. package/src/renderers/shaders/ShaderChunk/batching_pars_vertex.glsl.js +31 -1
  444. package/src/renderers/shaders/ShaderChunk/batching_vertex.glsl.js +1 -1
  445. package/src/renderers/shaders/ShaderChunk/color_pars_vertex.glsl.js +1 -1
  446. package/src/renderers/shaders/ShaderChunk/color_vertex.glsl.js +9 -1
  447. package/src/renderers/shaders/ShaderChunk/colorspace_pars_fragment.glsl.js +0 -9
  448. package/src/renderers/shaders/ShaderChunk/common.glsl.js +0 -10
  449. package/src/renderers/shaders/ShaderChunk/lights_fragment_begin.glsl.js +3 -3
  450. package/src/renderers/shaders/ShaderChunk/lights_pars_begin.glsl.js +8 -22
  451. package/src/renderers/shaders/ShaderChunk/lights_physical_fragment.glsl.js +6 -0
  452. package/src/renderers/shaders/ShaderChunk/lights_physical_pars_fragment.glsl.js +1 -0
  453. package/src/renderers/shaders/ShaderChunk/logdepthbuf_fragment.glsl.js +2 -2
  454. package/src/renderers/shaders/ShaderChunk/logdepthbuf_pars_fragment.glsl.js +1 -1
  455. package/src/renderers/shaders/ShaderChunk/logdepthbuf_pars_vertex.glsl.js +2 -10
  456. package/src/renderers/shaders/ShaderChunk/logdepthbuf_vertex.glsl.js +2 -16
  457. package/src/renderers/shaders/ShaderChunk/morphcolor_vertex.glsl.js +1 -1
  458. package/src/renderers/shaders/ShaderChunk/morphinstance_vertex.glsl.js +1 -1
  459. package/src/renderers/shaders/ShaderChunk/morphnormal_vertex.glsl.js +3 -14
  460. package/src/renderers/shaders/ShaderChunk/morphtarget_pars_vertex.glsl.js +10 -31
  461. package/src/renderers/shaders/ShaderChunk/morphtarget_vertex.glsl.js +3 -23
  462. package/src/renderers/shaders/ShaderChunk/packing.glsl.js +45 -13
  463. package/src/renderers/shaders/ShaderChunk/shadowmap_pars_fragment.glsl.js +38 -25
  464. package/src/renderers/shaders/ShaderChunk/shadowmap_pars_vertex.glsl.js +3 -0
  465. package/src/renderers/shaders/ShaderChunk/shadowmask_pars_fragment.glsl.js +3 -3
  466. package/src/renderers/shaders/ShaderChunk/tonemapping_pars_fragment.glsl.js +19 -11
  467. package/src/renderers/shaders/ShaderChunk/transmission_fragment.glsl.js +1 -1
  468. package/src/renderers/shaders/ShaderChunk/transmission_pars_fragment.glsl.js +47 -13
  469. package/src/renderers/shaders/ShaderChunk.js +0 -2
  470. package/src/renderers/shaders/ShaderLib/depth.glsl.js +8 -0
  471. package/src/renderers/shaders/ShaderLib/meshphysical.glsl.js +4 -0
  472. package/src/renderers/shaders/ShaderLib/sprite.glsl.js +2 -4
  473. package/src/renderers/shaders/ShaderLib.js +2 -1
  474. package/src/renderers/shaders/UniformsLib.js +3 -0
  475. package/src/renderers/shaders/UniformsUtils.js +10 -1
  476. package/src/renderers/webgl/WebGLAttributes.js +42 -38
  477. package/src/renderers/webgl/WebGLBackground.js +24 -3
  478. package/src/renderers/webgl/WebGLBindingStates.js +14 -51
  479. package/src/renderers/webgl/WebGLBufferRenderer.js +23 -22
  480. package/src/renderers/webgl/WebGLCapabilities.js +44 -13
  481. package/src/renderers/webgl/WebGLCubeUVMaps.js +10 -6
  482. package/src/renderers/webgl/WebGLExtensions.js +7 -20
  483. package/src/renderers/webgl/WebGLIndexedBufferRenderer.js +23 -21
  484. package/src/renderers/webgl/WebGLLights.js +21 -44
  485. package/src/renderers/webgl/WebGLMaterials.js +9 -8
  486. package/src/renderers/webgl/WebGLMorphtargets.js +78 -217
  487. package/src/renderers/webgl/WebGLProgram.js +46 -78
  488. package/src/renderers/webgl/WebGLPrograms.js +37 -40
  489. package/src/renderers/webgl/WebGLProperties.js +7 -0
  490. package/src/renderers/webgl/WebGLRenderStates.js +15 -9
  491. package/src/renderers/webgl/WebGLShadowMap.js +25 -25
  492. package/src/renderers/webgl/WebGLState.js +35 -58
  493. package/src/renderers/webgl/WebGLTextures.js +313 -358
  494. package/src/renderers/webgl/WebGLUniforms.js +12 -2
  495. package/src/renderers/webgl/WebGLUniformsGroups.js +8 -8
  496. package/src/renderers/webgl/WebGLUtils.js +9 -78
  497. package/{examples/jsm/renderers/webgl → src/renderers/webgl-fallback}/WebGLBackend.js +389 -152
  498. package/src/renderers/webgl-fallback/WebGLBufferRenderer.js +145 -0
  499. package/{examples/jsm/renderers/webgl → src/renderers/webgl-fallback}/nodes/GLSLNodeBuilder.js +245 -44
  500. package/{examples/jsm/renderers/webgl → src/renderers/webgl-fallback}/utils/WebGLAttributeUtils.js +7 -1
  501. package/{examples/jsm/renderers/webgl → src/renderers/webgl-fallback}/utils/WebGLConstants.js +2 -0
  502. package/{examples/jsm/renderers/webgl → src/renderers/webgl-fallback}/utils/WebGLExtensions.js +2 -0
  503. package/{examples/jsm/renderers/webgl → src/renderers/webgl-fallback}/utils/WebGLState.js +21 -3
  504. package/{examples/jsm/renderers/webgl → src/renderers/webgl-fallback}/utils/WebGLTextureUtils.js +271 -43
  505. package/{examples/jsm/renderers/webgl → src/renderers/webgl-fallback}/utils/WebGLUtils.js +6 -23
  506. package/{examples/jsm → src}/renderers/webgpu/WebGPUBackend.js +318 -141
  507. package/src/renderers/webgpu/WebGPURenderer.Nodes.js +42 -0
  508. package/{examples/jsm → src}/renderers/webgpu/WebGPURenderer.js +10 -7
  509. package/src/renderers/webgpu/nodes/BasicNodeLibrary.js +59 -0
  510. package/src/renderers/webgpu/nodes/StandardNodeLibrary.js +105 -0
  511. package/{examples/jsm → src}/renderers/webgpu/nodes/WGSLNodeBuilder.js +424 -95
  512. package/src/renderers/webgpu/nodes/WGSLNodeFunction.js +159 -0
  513. package/{examples/jsm → src}/renderers/webgpu/utils/WebGPUAttributeUtils.js +37 -18
  514. package/{examples/jsm → src}/renderers/webgpu/utils/WebGPUBindingUtils.js +86 -32
  515. package/{examples/jsm → src}/renderers/webgpu/utils/WebGPUConstants.js +10 -1
  516. package/{examples/jsm → src}/renderers/webgpu/utils/WebGPUPipelineUtils.js +68 -27
  517. package/{examples/jsm → src}/renderers/webgpu/utils/WebGPUTexturePassUtils.js +62 -5
  518. package/{examples/jsm → src}/renderers/webgpu/utils/WebGPUTextureUtils.js +235 -68
  519. package/{examples/jsm → src}/renderers/webgpu/utils/WebGPUUtils.js +43 -5
  520. package/src/renderers/webxr/WebXRDepthSensing.js +11 -6
  521. package/src/renderers/webxr/WebXRManager.js +53 -38
  522. package/src/scenes/Scene.js +7 -1
  523. package/src/textures/CompressedArrayTexture.js +14 -0
  524. package/src/textures/DataArrayTexture.js +14 -0
  525. package/src/textures/DepthTexture.js +1 -3
  526. package/src/textures/Texture.js +12 -2
  527. package/src/utils.js +62 -1
  528. package/examples/jsm/geometries/SDFGeometryGenerator.js +0 -144
  529. package/examples/jsm/loaders/LogLuvLoader.js +0 -606
  530. package/examples/jsm/loaders/TiltLoader.js +0 -520
  531. package/examples/jsm/nodes/Nodes.js +0 -195
  532. package/examples/jsm/nodes/accessors/AccessorsUtils.js +0 -10
  533. package/examples/jsm/nodes/accessors/BitangentNode.js +0 -89
  534. package/examples/jsm/nodes/accessors/CameraNode.js +0 -119
  535. package/examples/jsm/nodes/accessors/CubeTextureNode.js +0 -61
  536. package/examples/jsm/nodes/accessors/InstanceNode.js +0 -71
  537. package/examples/jsm/nodes/accessors/InstancedPointsMaterialNode.js +0 -21
  538. package/examples/jsm/nodes/accessors/MaterialNode.js +0 -314
  539. package/examples/jsm/nodes/accessors/ModelNode.js +0 -33
  540. package/examples/jsm/nodes/accessors/ModelViewProjectionNode.js +0 -39
  541. package/examples/jsm/nodes/accessors/NormalNode.js +0 -96
  542. package/examples/jsm/nodes/accessors/PointUVNode.js +0 -26
  543. package/examples/jsm/nodes/accessors/PositionNode.js +0 -104
  544. package/examples/jsm/nodes/accessors/ReflectVectorNode.js +0 -35
  545. package/examples/jsm/nodes/accessors/SkinningNode.js +0 -124
  546. package/examples/jsm/nodes/accessors/StorageBufferNode.js +0 -72
  547. package/examples/jsm/nodes/accessors/TangentNode.js +0 -109
  548. package/examples/jsm/nodes/accessors/TextureSizeNode.js +0 -35
  549. package/examples/jsm/nodes/accessors/UVNode.js +0 -47
  550. package/examples/jsm/nodes/core/CacheNode.js +0 -49
  551. package/examples/jsm/nodes/core/IndexNode.js +0 -66
  552. package/examples/jsm/nodes/core/NodeCache.js +0 -26
  553. package/examples/jsm/nodes/core/NodeKeywords.js +0 -80
  554. package/examples/jsm/nodes/core/PropertyNode.js +0 -72
  555. package/examples/jsm/nodes/core/UniformGroupNode.js +0 -36
  556. package/examples/jsm/nodes/core/VaryingNode.js +0 -65
  557. package/examples/jsm/nodes/display/BlendModeNode.js +0 -128
  558. package/examples/jsm/nodes/display/ColorAdjustmentNode.js +0 -99
  559. package/examples/jsm/nodes/display/ColorSpaceNode.js +0 -108
  560. package/examples/jsm/nodes/display/FrontFacingNode.js +0 -27
  561. package/examples/jsm/nodes/display/PassNode.js +0 -183
  562. package/examples/jsm/nodes/display/ToneMappingNode.js +0 -184
  563. package/examples/jsm/nodes/display/ViewportDepthNode.js +0 -97
  564. package/examples/jsm/nodes/display/ViewportDepthTextureNode.js +0 -31
  565. package/examples/jsm/nodes/display/ViewportNode.js +0 -134
  566. package/examples/jsm/nodes/display/ViewportSharedTextureNode.js +0 -31
  567. package/examples/jsm/nodes/fog/FogExp2Node.js +0 -35
  568. package/examples/jsm/nodes/fog/FogNode.js +0 -38
  569. package/examples/jsm/nodes/fog/FogRangeNode.js +0 -34
  570. package/examples/jsm/nodes/functions/BSDF/BRDF_GGX.js +0 -40
  571. package/examples/jsm/nodes/functions/PhysicalLightingModel.js +0 -393
  572. package/examples/jsm/nodes/functions/material/getGeometryRoughness.js +0 -13
  573. package/examples/jsm/nodes/lighting/AONode.js +0 -27
  574. package/examples/jsm/nodes/lighting/AnalyticLightNode.js +0 -241
  575. package/examples/jsm/nodes/lighting/EnvironmentNode.js +0 -181
  576. package/examples/jsm/nodes/lighting/LightNode.js +0 -57
  577. package/examples/jsm/nodes/lighting/LightingContextNode.js +0 -66
  578. package/examples/jsm/nodes/lighting/LightsNode.js +0 -188
  579. package/examples/jsm/nodes/materials/InstancedPointsNodeMaterial.js +0 -162
  580. package/examples/jsm/nodes/materials/LineBasicNodeMaterial.js +0 -28
  581. package/examples/jsm/nodes/materials/MeshBasicNodeMaterial.js +0 -28
  582. package/examples/jsm/nodes/materials/MeshLambertNodeMaterial.js +0 -34
  583. package/examples/jsm/nodes/materials/MeshNormalNodeMaterial.js +0 -40
  584. package/examples/jsm/nodes/materials/MeshPhongNodeMaterial.js +0 -65
  585. package/examples/jsm/nodes/materials/MeshPhysicalNodeMaterial.js +0 -155
  586. package/examples/jsm/nodes/materials/MeshStandardNodeMaterial.js +0 -80
  587. package/examples/jsm/nodes/materials/SpriteNodeMaterial.js +0 -90
  588. package/examples/jsm/nodes/materialx/lib/mx_hsv.js +0 -130
  589. package/examples/jsm/nodes/math/HashNode.js +0 -34
  590. package/examples/jsm/nodes/math/MathNode.js +0 -391
  591. package/examples/jsm/nodes/math/OperatorNode.js +0 -274
  592. package/examples/jsm/nodes/procedural/CheckerNode.js +0 -42
  593. package/examples/jsm/nodes/utils/DiscardNode.js +0 -27
  594. package/examples/jsm/nodes/utils/EquirectUVNode.js +0 -33
  595. package/examples/jsm/nodes/utils/MatcapUVNode.js +0 -30
  596. package/examples/jsm/nodes/utils/PackingNode.js +0 -55
  597. package/examples/jsm/nodes/utils/RotateUVNode.js +0 -35
  598. package/examples/jsm/nodes/utils/SpecularMIPLevelNode.js +0 -37
  599. package/examples/jsm/objects/QuadMesh.js +0 -66
  600. package/examples/jsm/renderers/common/Bindings.js +0 -173
  601. package/examples/jsm/renderers/common/ChainMap.js +0 -89
  602. package/examples/jsm/renderers/common/PostProcessing.js +0 -25
  603. package/examples/jsm/renderers/common/RenderObject.js +0 -221
  604. package/examples/jsm/renderers/common/nodes/NodeBuilderState.js +0 -44
  605. package/examples/jsm/renderers/common/nodes/NodeSampledTexture.js +0 -49
  606. package/examples/jsm/renderers/webgpu/nodes/WGSLNodeFunction.js +0 -104
  607. package/examples/jsm/utils/GPUStatsPanel.js +0 -128
  608. package/examples/jsm/utils/PackedPhongMaterial.js +0 -178
  609. package/src/renderers/WebGL1Renderer.js +0 -7
  610. package/src/renderers/shaders/ShaderChunk/lightmap_fragment.glsl.js +0 -10
  611. /package/{examples/jsm → src}/nodes/core/NodeAttribute.js +0 -0
  612. /package/{examples/jsm → src}/nodes/core/NodeCode.js +0 -0
  613. /package/{examples/jsm → src}/nodes/core/NodeFunctionInput.js +0 -0
  614. /package/{examples/jsm → src}/nodes/core/NodeParser.js +0 -0
  615. /package/{examples/jsm → src}/nodes/core/NodeVar.js +0 -0
  616. /package/{examples/jsm → src}/nodes/core/NodeVarying.js +0 -0
  617. /package/{examples/jsm → src}/nodes/core/UniformGroup.js +0 -0
  618. /package/{examples/jsm → src}/nodes/core/constants.js +0 -0
  619. /package/{examples/jsm → src}/nodes/materialx/DISCLAIMER.md +0 -0
  620. /package/{examples/jsm → src}/nodes/parsers/GLSLNodeParser.js +0 -0
  621. /package/{examples/jsm → src}/renderers/common/Binding.js +0 -0
  622. /package/{examples/jsm → src}/renderers/common/Buffer.js +0 -0
  623. /package/{examples/jsm → src}/renderers/common/BufferUtils.js +0 -0
  624. /package/{examples/jsm → src}/renderers/common/ComputePipeline.js +0 -0
  625. /package/{examples/jsm → src}/renderers/common/Constants.js +0 -0
  626. /package/{examples/jsm → src}/renderers/common/DataMap.js +0 -0
  627. /package/{examples/jsm → src}/renderers/common/Pipeline.js +0 -0
  628. /package/{examples/jsm → src}/renderers/common/ProgrammableStage.js +0 -0
  629. /package/{examples/jsm → src}/renderers/common/RenderLists.js +0 -0
  630. /package/{examples/jsm → src}/renderers/common/RenderPipeline.js +0 -0
  631. /package/{examples/jsm → src}/renderers/common/Sampler.js +0 -0
  632. /package/{examples/jsm → src}/renderers/common/StorageBuffer.js +0 -0
  633. /package/{examples/jsm → src}/renderers/common/UniformBuffer.js +0 -0
  634. /package/{examples/jsm/renderers/webgl → src/renderers/webgl-fallback}/utils/WebGLCapabilities.js +0 -0
  635. /package/{examples/jsm → src}/renderers/webgpu/nodes/WGSLNodeParser.js +0 -0
@@ -1,14 +1,16 @@
1
1
  import { BufferAttribute } from '../core/BufferAttribute.js';
2
2
  import { BufferGeometry } from '../core/BufferGeometry.js';
3
3
  import { DataTexture } from '../textures/DataTexture.js';
4
- import { FloatType } from '../constants.js';
4
+ import { FloatType, RedIntegerFormat, UnsignedIntType } from '../constants.js';
5
5
  import { Matrix4 } from '../math/Matrix4.js';
6
6
  import { Mesh } from './Mesh.js';
7
7
  import { RGBAFormat } from '../constants.js';
8
+ import { ColorManagement } from '../math/ColorManagement.js';
8
9
  import { Box3 } from '../math/Box3.js';
9
10
  import { Sphere } from '../math/Sphere.js';
10
11
  import { Frustum } from '../math/Frustum.js';
11
12
  import { Vector3 } from '../math/Vector3.js';
13
+ import { Color } from '../math/Color.js';
12
14
 
13
15
  function sortOpaque( a, b ) {
14
16
 
@@ -32,7 +34,7 @@ class MultiDrawRenderList {
32
34
 
33
35
  }
34
36
 
35
- push( drawRange, z ) {
37
+ push( drawRange, z, index ) {
36
38
 
37
39
  const pool = this.pool;
38
40
  const list = this.list;
@@ -43,6 +45,7 @@ class MultiDrawRenderList {
43
45
  start: - 1,
44
46
  count: - 1,
45
47
  z: - 1,
48
+ index: - 1,
46
49
 
47
50
  } );
48
51
 
@@ -55,6 +58,7 @@ class MultiDrawRenderList {
55
58
  item.start = drawRange.start;
56
59
  item.count = drawRange.count;
57
60
  item.z = z;
61
+ item.index = index;
58
62
 
59
63
  }
60
64
 
@@ -67,15 +71,17 @@ class MultiDrawRenderList {
67
71
 
68
72
  }
69
73
 
70
- const ID_ATTR_NAME = 'batchId';
71
74
  const _matrix = /*@__PURE__*/ new Matrix4();
72
75
  const _invMatrixWorld = /*@__PURE__*/ new Matrix4();
73
76
  const _identityMatrix = /*@__PURE__*/ new Matrix4();
77
+ const _whiteColor = /*@__PURE__*/ new Color( 1, 1, 1 );
74
78
  const _projScreenMatrix = /*@__PURE__*/ new Matrix4();
75
79
  const _frustum = /*@__PURE__*/ new Frustum();
76
80
  const _box = /*@__PURE__*/ new Box3();
77
81
  const _sphere = /*@__PURE__*/ new Sphere();
78
82
  const _vector = /*@__PURE__*/ new Vector3();
83
+ const _forward = /*@__PURE__*/ new Vector3();
84
+ const _temp = /*@__PURE__*/ new Vector3();
79
85
  const _renderList = /*@__PURE__*/ new MultiDrawRenderList();
80
86
  const _mesh = /*@__PURE__*/ new Mesh();
81
87
  const _batchIntersects = [];
@@ -119,13 +125,13 @@ function copyAttributeData( src, target, targetOffset = 0 ) {
119
125
 
120
126
  class BatchedMesh extends Mesh {
121
127
 
122
- get maxGeometryCount() {
128
+ get maxInstanceCount() {
123
129
 
124
- return this._maxGeometryCount;
130
+ return this._maxInstanceCount;
125
131
 
126
132
  }
127
133
 
128
- constructor( maxGeometryCount, maxVertexCount, maxIndexCount = maxVertexCount * 2, material ) {
134
+ constructor( maxInstanceCount, maxVertexCount, maxIndexCount = maxVertexCount * 2, material ) {
129
135
 
130
136
  super( new BufferGeometry(), material );
131
137
 
@@ -136,28 +142,36 @@ class BatchedMesh extends Mesh {
136
142
  this.boundingSphere = null;
137
143
  this.customSort = null;
138
144
 
145
+ // stores visible, active, and geometry id per object
146
+ this._drawInfo = [];
147
+
148
+ // instance ids that have been set as inactive, and are available to be overwritten
149
+ this._availableInstanceIds = [];
150
+
151
+ // geometry information
139
152
  this._drawRanges = [];
140
153
  this._reservedRanges = [];
141
-
142
- this._visibility = [];
143
- this._active = [];
144
154
  this._bounds = [];
145
155
 
146
- this._maxGeometryCount = maxGeometryCount;
156
+ this._maxInstanceCount = maxInstanceCount;
147
157
  this._maxVertexCount = maxVertexCount;
148
158
  this._maxIndexCount = maxIndexCount;
149
159
 
150
160
  this._geometryInitialized = false;
151
161
  this._geometryCount = 0;
152
- this._multiDrawCounts = new Int32Array( maxGeometryCount );
153
- this._multiDrawStarts = new Int32Array( maxGeometryCount );
162
+ this._multiDrawCounts = new Int32Array( maxInstanceCount );
163
+ this._multiDrawStarts = new Int32Array( maxInstanceCount );
154
164
  this._multiDrawCount = 0;
165
+ this._multiDrawInstances = null;
155
166
  this._visibilityChanged = true;
156
167
 
157
168
  // Local matrix per geometry by using data texture
158
169
  this._matricesTexture = null;
170
+ this._indirectTexture = null;
171
+ this._colorsTexture = null;
159
172
 
160
173
  this._initMatricesTexture();
174
+ this._initIndirectTexture();
161
175
 
162
176
  }
163
177
 
@@ -170,7 +184,7 @@ class BatchedMesh extends Mesh {
170
184
  // 32x32 pixel texture max 256 matrices * 4 pixels = (32 * 32)
171
185
  // 64x64 pixel texture max 1024 matrices * 4 pixels = (64 * 64)
172
186
 
173
- let size = Math.sqrt( this._maxGeometryCount * 4 ); // 4 pixels needed for 1 matrix
187
+ let size = Math.sqrt( this._maxInstanceCount * 4 ); // 4 pixels needed for 1 matrix
174
188
  size = Math.ceil( size / 4 ) * 4;
175
189
  size = Math.max( size, 4 );
176
190
 
@@ -181,11 +195,36 @@ class BatchedMesh extends Mesh {
181
195
 
182
196
  }
183
197
 
198
+ _initIndirectTexture() {
199
+
200
+ let size = Math.sqrt( this._maxInstanceCount );
201
+ size = Math.ceil( size );
202
+
203
+ const indirectArray = new Uint32Array( size * size );
204
+ const indirectTexture = new DataTexture( indirectArray, size, size, RedIntegerFormat, UnsignedIntType );
205
+
206
+ this._indirectTexture = indirectTexture;
207
+
208
+ }
209
+
210
+ _initColorsTexture() {
211
+
212
+ let size = Math.sqrt( this._maxInstanceCount );
213
+ size = Math.ceil( size );
214
+
215
+ // 4 floats per RGBA pixel initialized to white
216
+ const colorsArray = new Float32Array( size * size * 4 ).fill( 1 );
217
+ const colorsTexture = new DataTexture( colorsArray, size, size, RGBAFormat, FloatType );
218
+ colorsTexture.colorSpace = ColorManagement.workingColorSpace;
219
+
220
+ this._colorsTexture = colorsTexture;
221
+
222
+ }
223
+
184
224
  _initializeGeometry( reference ) {
185
225
 
186
226
  const geometry = this.geometry;
187
227
  const maxVertexCount = this._maxVertexCount;
188
- const maxGeometryCount = this._maxGeometryCount;
189
228
  const maxIndexCount = this._maxIndexCount;
190
229
  if ( this._geometryInitialized === false ) {
191
230
 
@@ -203,7 +242,8 @@ class BatchedMesh extends Mesh {
203
242
 
204
243
  if ( reference.getIndex() !== null ) {
205
244
 
206
- const indexArray = maxVertexCount > 65536
245
+ // Reserve last u16 index for primitive restart.
246
+ const indexArray = maxVertexCount > 65535
207
247
  ? new Uint32Array( maxIndexCount )
208
248
  : new Uint16Array( maxIndexCount );
209
249
 
@@ -211,27 +251,15 @@ class BatchedMesh extends Mesh {
211
251
 
212
252
  }
213
253
 
214
- const idArray = maxGeometryCount > 65536
215
- ? new Uint32Array( maxVertexCount )
216
- : new Uint16Array( maxVertexCount );
217
- geometry.setAttribute( ID_ATTR_NAME, new BufferAttribute( idArray, 1 ) );
218
-
219
254
  this._geometryInitialized = true;
220
255
 
221
256
  }
222
257
 
223
258
  }
224
259
 
225
- // Make sure the geometry is compatible with the existing combined geometry atributes
260
+ // Make sure the geometry is compatible with the existing combined geometry attributes
226
261
  _validateGeometry( geometry ) {
227
262
 
228
- // check that the geometry doesn't have a version of our reserved id attribute
229
- if ( geometry.getAttribute( ID_ATTR_NAME ) ) {
230
-
231
- throw new Error( `BatchedMesh: Geometry cannot use attribute "${ ID_ATTR_NAME }"` );
232
-
233
- }
234
-
235
263
  // check to ensure the geometries are using consistent attributes and indices
236
264
  const batchGeometry = this.geometry;
237
265
  if ( Boolean( geometry.getIndex() ) !== Boolean( batchGeometry.getIndex() ) ) {
@@ -242,12 +270,6 @@ class BatchedMesh extends Mesh {
242
270
 
243
271
  for ( const attributeName in batchGeometry.attributes ) {
244
272
 
245
- if ( attributeName === ID_ATTR_NAME ) {
246
-
247
- continue;
248
-
249
- }
250
-
251
273
  if ( ! geometry.hasAttribute( attributeName ) ) {
252
274
 
253
275
  throw new Error( `BatchedMesh: Added geometry missing "${ attributeName }". All geometries must have consistent attributes.` );
@@ -281,17 +303,17 @@ class BatchedMesh extends Mesh {
281
303
 
282
304
  }
283
305
 
284
- const geometryCount = this._geometryCount;
285
306
  const boundingBox = this.boundingBox;
286
- const active = this._active;
307
+ const drawInfo = this._drawInfo;
287
308
 
288
309
  boundingBox.makeEmpty();
289
- for ( let i = 0; i < geometryCount; i ++ ) {
310
+ for ( let i = 0, l = drawInfo.length; i < l; i ++ ) {
290
311
 
291
- if ( active[ i ] === false ) continue;
312
+ if ( drawInfo[ i ].active === false ) continue;
292
313
 
314
+ const geometryId = drawInfo[ i ].geometryIndex;
293
315
  this.getMatrixAt( i, _matrix );
294
- this.getBoundingBoxAt( i, _box ).applyMatrix4( _matrix );
316
+ this.getBoundingBoxAt( geometryId, _box ).applyMatrix4( _matrix );
295
317
  boundingBox.union( _box );
296
318
 
297
319
  }
@@ -306,23 +328,72 @@ class BatchedMesh extends Mesh {
306
328
 
307
329
  }
308
330
 
309
- const geometryCount = this._geometryCount;
310
331
  const boundingSphere = this.boundingSphere;
311
- const active = this._active;
332
+ const drawInfo = this._drawInfo;
312
333
 
313
334
  boundingSphere.makeEmpty();
314
- for ( let i = 0; i < geometryCount; i ++ ) {
335
+ for ( let i = 0, l = drawInfo.length; i < l; i ++ ) {
315
336
 
316
- if ( active[ i ] === false ) continue;
337
+ if ( drawInfo[ i ].active === false ) continue;
317
338
 
339
+ const geometryId = drawInfo[ i ].geometryIndex;
318
340
  this.getMatrixAt( i, _matrix );
319
- this.getBoundingSphereAt( i, _sphere ).applyMatrix4( _matrix );
341
+ this.getBoundingSphereAt( geometryId, _sphere ).applyMatrix4( _matrix );
320
342
  boundingSphere.union( _sphere );
321
343
 
322
344
  }
323
345
 
324
346
  }
325
347
 
348
+ addInstance( geometryId ) {
349
+
350
+ const atCapacity = this._drawInfo.length >= this.maxInstanceCount;
351
+
352
+ // ensure we're not over geometry
353
+ if ( atCapacity && this._availableInstanceIds.length === 0 ) {
354
+
355
+ throw new Error( 'BatchedMesh: Maximum item count reached.' );
356
+
357
+ }
358
+
359
+ const instanceDrawInfo = {
360
+ visible: true,
361
+ active: true,
362
+ geometryIndex: geometryId,
363
+ };
364
+
365
+ let drawId = null;
366
+
367
+ // Prioritize using previously freed instance ids
368
+ if ( this._availableInstanceIds.length > 0 ) {
369
+
370
+ drawId = this._availableInstanceIds.pop();
371
+ this._drawInfo[ drawId ] = instanceDrawInfo;
372
+
373
+ } else {
374
+
375
+ drawId = this._drawInfo.length;
376
+ this._drawInfo.push( instanceDrawInfo );
377
+
378
+ }
379
+
380
+ const matricesTexture = this._matricesTexture;
381
+ const matricesArray = matricesTexture.image.data;
382
+ _identityMatrix.toArray( matricesArray, drawId * 16 );
383
+ matricesTexture.needsUpdate = true;
384
+
385
+ const colorsTexture = this._colorsTexture;
386
+ if ( colorsTexture ) {
387
+
388
+ _whiteColor.toArray( colorsTexture.image.data, drawId * 4 );
389
+ colorsTexture.needsUpdate = true;
390
+
391
+ }
392
+
393
+ return drawId;
394
+
395
+ }
396
+
326
397
  addGeometry( geometry, vertexCount = - 1, indexCount = - 1 ) {
327
398
 
328
399
  this._initializeGeometry( geometry );
@@ -330,9 +401,9 @@ class BatchedMesh extends Mesh {
330
401
  this._validateGeometry( geometry );
331
402
 
332
403
  // ensure we're not over geometry
333
- if ( this._geometryCount >= this._maxGeometryCount ) {
404
+ if ( this._drawInfo.length >= this._maxInstanceCount ) {
334
405
 
335
- throw new Error( 'BatchedMesh: Maximum geometry count reached.' );
406
+ throw new Error( 'BatchedMesh: Maximum item count reached.' );
336
407
 
337
408
  }
338
409
 
@@ -410,23 +481,10 @@ class BatchedMesh extends Mesh {
410
481
 
411
482
  }
412
483
 
413
- const visibility = this._visibility;
414
- const active = this._active;
415
- const matricesTexture = this._matricesTexture;
416
- const matricesArray = this._matricesTexture.image.data;
417
-
418
- // push new visibility states
419
- visibility.push( true );
420
- active.push( true );
421
-
422
484
  // update id
423
485
  const geometryId = this._geometryCount;
424
486
  this._geometryCount ++;
425
487
 
426
- // initialize matrix information
427
- _identityMatrix.toArray( matricesArray, geometryId * 16 );
428
- matricesTexture.needsUpdate = true;
429
-
430
488
  // add the reserved range and draw range objects
431
489
  reservedRanges.push( reservedRange );
432
490
  drawRanges.push( {
@@ -441,16 +499,6 @@ class BatchedMesh extends Mesh {
441
499
  sphere: new Sphere()
442
500
  } );
443
501
 
444
- // set the id for the geometry
445
- const idAttribute = this.geometry.getAttribute( ID_ATTR_NAME );
446
- for ( let i = 0; i < reservedRange.vertexCount; i ++ ) {
447
-
448
- idAttribute.setX( reservedRange.vertexStart + i, geometryId );
449
-
450
- }
451
-
452
- idAttribute.needsUpdate = true;
453
-
454
502
  // update the geometry
455
503
  this.setGeometryAt( geometryId, geometry );
456
504
 
@@ -458,9 +506,9 @@ class BatchedMesh extends Mesh {
458
506
 
459
507
  }
460
508
 
461
- setGeometryAt( id, geometry ) {
509
+ setGeometryAt( geometryId, geometry ) {
462
510
 
463
- if ( id >= this._geometryCount ) {
511
+ if ( geometryId >= this._geometryCount ) {
464
512
 
465
513
  throw new Error( 'BatchedMesh: Maximum geometry count reached.' );
466
514
 
@@ -472,7 +520,7 @@ class BatchedMesh extends Mesh {
472
520
  const hasIndex = batchGeometry.getIndex() !== null;
473
521
  const dstIndex = batchGeometry.getIndex();
474
522
  const srcIndex = geometry.getIndex();
475
- const reservedRange = this._reservedRanges[ id ];
523
+ const reservedRange = this._reservedRanges[ geometryId ];
476
524
  if (
477
525
  hasIndex &&
478
526
  srcIndex.count > reservedRange.indexCount ||
@@ -488,12 +536,6 @@ class BatchedMesh extends Mesh {
488
536
  const vertexCount = reservedRange.vertexCount;
489
537
  for ( const attributeName in batchGeometry.attributes ) {
490
538
 
491
- if ( attributeName === ID_ATTR_NAME ) {
492
-
493
- continue;
494
-
495
- }
496
-
497
539
  // copy attribute data
498
540
  const srcAttribute = geometry.getAttribute( attributeName );
499
541
  const dstAttribute = batchGeometry.getAttribute( attributeName );
@@ -542,7 +584,7 @@ class BatchedMesh extends Mesh {
542
584
  }
543
585
 
544
586
  // store the bounding boxes
545
- const bound = this._bounds[ id ];
587
+ const bound = this._bounds[ geometryId ];
546
588
  if ( geometry.boundingBox !== null ) {
547
589
 
548
590
  bound.box.copy( geometry.boundingBox );
@@ -566,27 +608,34 @@ class BatchedMesh extends Mesh {
566
608
  }
567
609
 
568
610
  // set drawRange count
569
- const drawRange = this._drawRanges[ id ];
611
+ const drawRange = this._drawRanges[ geometryId ];
570
612
  const posAttr = geometry.getAttribute( 'position' );
571
613
  drawRange.count = hasIndex ? srcIndex.count : posAttr.count;
572
614
  this._visibilityChanged = true;
573
615
 
574
- return id;
616
+ return geometryId;
575
617
 
576
618
  }
577
619
 
620
+ /*
578
621
  deleteGeometry( geometryId ) {
579
622
 
580
- // Note: User needs to call optimize() afterward to pack the data.
623
+ // TODO: delete geometry and associated instances
581
624
 
582
- const active = this._active;
583
- if ( geometryId >= active.length || active[ geometryId ] === false ) {
625
+ }
626
+ */
627
+
628
+ deleteInstance( instanceId ) {
629
+
630
+ const drawInfo = this._drawInfo;
631
+ if ( instanceId >= drawInfo.length || drawInfo[ instanceId ].active === false ) {
584
632
 
585
633
  return this;
586
634
 
587
635
  }
588
636
 
589
- active[ geometryId ] = false;
637
+ drawInfo[ instanceId ].active = false;
638
+ this._availableInstanceIds.push( instanceId );
590
639
  this._visibilityChanged = true;
591
640
 
592
641
  return this;
@@ -594,17 +643,16 @@ class BatchedMesh extends Mesh {
594
643
  }
595
644
 
596
645
  // get bounding box and compute it if it doesn't exist
597
- getBoundingBoxAt( id, target ) {
646
+ getBoundingBoxAt( geometryId, target ) {
598
647
 
599
- const active = this._active;
600
- if ( active[ id ] === false ) {
648
+ if ( geometryId >= this._geometryCount ) {
601
649
 
602
650
  return null;
603
651
 
604
652
  }
605
653
 
606
654
  // compute bounding box
607
- const bound = this._bounds[ id ];
655
+ const bound = this._bounds[ geometryId ];
608
656
  const box = bound.box;
609
657
  const geometry = this.geometry;
610
658
  if ( bound.boxInitialized === false ) {
@@ -613,7 +661,7 @@ class BatchedMesh extends Mesh {
613
661
 
614
662
  const index = geometry.index;
615
663
  const position = geometry.attributes.position;
616
- const drawRange = this._drawRanges[ id ];
664
+ const drawRange = this._drawRanges[ geometryId ];
617
665
  for ( let i = drawRange.start, l = drawRange.start + drawRange.count; i < l; i ++ ) {
618
666
 
619
667
  let iv = i;
@@ -637,29 +685,28 @@ class BatchedMesh extends Mesh {
637
685
  }
638
686
 
639
687
  // get bounding sphere and compute it if it doesn't exist
640
- getBoundingSphereAt( id, target ) {
688
+ getBoundingSphereAt( geometryId, target ) {
641
689
 
642
- const active = this._active;
643
- if ( active[ id ] === false ) {
690
+ if ( geometryId >= this._geometryCount ) {
644
691
 
645
692
  return null;
646
693
 
647
694
  }
648
695
 
649
696
  // compute bounding sphere
650
- const bound = this._bounds[ id ];
697
+ const bound = this._bounds[ geometryId ];
651
698
  const sphere = bound.sphere;
652
699
  const geometry = this.geometry;
653
700
  if ( bound.sphereInitialized === false ) {
654
701
 
655
702
  sphere.makeEmpty();
656
703
 
657
- this.getBoundingBoxAt( id, _box );
704
+ this.getBoundingBoxAt( geometryId, _box );
658
705
  _box.getCenter( sphere.center );
659
706
 
660
707
  const index = geometry.index;
661
708
  const position = geometry.attributes.position;
662
- const drawRange = this._drawRanges[ id ];
709
+ const drawRange = this._drawRanges[ geometryId ];
663
710
 
664
711
  let maxRadiusSq = 0;
665
712
  for ( let i = drawRange.start, l = drawRange.start + drawRange.count; i < l; i ++ ) {
@@ -686,91 +733,175 @@ class BatchedMesh extends Mesh {
686
733
 
687
734
  }
688
735
 
689
- setMatrixAt( geometryId, matrix ) {
736
+ setMatrixAt( instanceId, matrix ) {
690
737
 
691
738
  // @TODO: Map geometryId to index of the arrays because
692
739
  // optimize() can make geometryId mismatch the index
693
740
 
694
- const active = this._active;
741
+ const drawInfo = this._drawInfo;
695
742
  const matricesTexture = this._matricesTexture;
696
743
  const matricesArray = this._matricesTexture.image.data;
697
- const geometryCount = this._geometryCount;
698
- if ( geometryId >= geometryCount || active[ geometryId ] === false ) {
744
+ if ( instanceId >= drawInfo.length || drawInfo[ instanceId ].active === false ) {
699
745
 
700
746
  return this;
701
747
 
702
748
  }
703
749
 
704
- matrix.toArray( matricesArray, geometryId * 16 );
750
+ matrix.toArray( matricesArray, instanceId * 16 );
705
751
  matricesTexture.needsUpdate = true;
706
752
 
707
753
  return this;
708
754
 
709
755
  }
710
756
 
711
- getMatrixAt( geometryId, matrix ) {
757
+ getMatrixAt( instanceId, matrix ) {
712
758
 
713
- const active = this._active;
759
+ const drawInfo = this._drawInfo;
714
760
  const matricesArray = this._matricesTexture.image.data;
715
- const geometryCount = this._geometryCount;
716
- if ( geometryId >= geometryCount || active[ geometryId ] === false ) {
761
+ if ( instanceId >= drawInfo.length || drawInfo[ instanceId ].active === false ) {
717
762
 
718
763
  return null;
719
764
 
720
765
  }
721
766
 
722
- return matrix.fromArray( matricesArray, geometryId * 16 );
767
+ return matrix.fromArray( matricesArray, instanceId * 16 );
723
768
 
724
769
  }
725
770
 
726
- setVisibleAt( geometryId, value ) {
771
+ setColorAt( instanceId, color ) {
772
+
773
+ if ( this._colorsTexture === null ) {
727
774
 
728
- const visibility = this._visibility;
729
- const active = this._active;
730
- const geometryCount = this._geometryCount;
775
+ this._initColorsTexture();
776
+
777
+ }
778
+
779
+ // @TODO: Map id to index of the arrays because
780
+ // optimize() can make id mismatch the index
781
+
782
+ const colorsTexture = this._colorsTexture;
783
+ const colorsArray = this._colorsTexture.image.data;
784
+ const drawInfo = this._drawInfo;
785
+ if ( instanceId >= drawInfo.length || drawInfo[ instanceId ].active === false ) {
786
+
787
+ return this;
788
+
789
+ }
790
+
791
+ color.toArray( colorsArray, instanceId * 4 );
792
+ colorsTexture.needsUpdate = true;
793
+
794
+ return this;
795
+
796
+ }
797
+
798
+ getColorAt( instanceId, color ) {
799
+
800
+ const colorsArray = this._colorsTexture.image.data;
801
+ const drawInfo = this._drawInfo;
802
+ if ( instanceId >= drawInfo.length || drawInfo[ instanceId ].active === false ) {
803
+
804
+ return null;
805
+
806
+ }
807
+
808
+ return color.fromArray( colorsArray, instanceId * 4 );
809
+
810
+ }
811
+
812
+ setVisibleAt( instanceId, value ) {
731
813
 
732
814
  // if the geometry is out of range, not active, or visibility state
733
815
  // does not change then return early
816
+ const drawInfo = this._drawInfo;
734
817
  if (
735
- geometryId >= geometryCount ||
736
- active[ geometryId ] === false ||
737
- visibility[ geometryId ] === value
818
+ instanceId >= drawInfo.length ||
819
+ drawInfo[ instanceId ].active === false ||
820
+ drawInfo[ instanceId ].visible === value
738
821
  ) {
739
822
 
740
823
  return this;
741
824
 
742
825
  }
743
826
 
744
- visibility[ geometryId ] = value;
827
+ drawInfo[ instanceId ].visible = value;
745
828
  this._visibilityChanged = true;
746
829
 
747
830
  return this;
748
831
 
749
832
  }
750
833
 
751
- getVisibleAt( geometryId ) {
752
-
753
- const visibility = this._visibility;
754
- const active = this._active;
755
- const geometryCount = this._geometryCount;
834
+ getVisibleAt( instanceId ) {
756
835
 
757
836
  // return early if the geometry is out of range or not active
758
- if ( geometryId >= geometryCount || active[ geometryId ] === false ) {
837
+ const drawInfo = this._drawInfo;
838
+ if ( instanceId >= drawInfo.length || drawInfo[ instanceId ].active === false ) {
759
839
 
760
840
  return false;
761
841
 
762
842
  }
763
843
 
764
- return visibility[ geometryId ];
844
+ return drawInfo[ instanceId ].visible;
845
+
846
+ }
847
+
848
+ setGeometryIdAt( instanceId, geometryId ) {
849
+
850
+ // return early if the geometry is out of range or not active
851
+ const drawInfo = this._drawInfo;
852
+ if ( instanceId >= drawInfo.length || drawInfo[ instanceId ].active === false ) {
853
+
854
+ return null;
855
+
856
+ }
857
+
858
+ // check if the provided geometryId is within the valid range
859
+ if ( geometryId < 0 || geometryId >= this._geometryCount ) {
860
+
861
+ return null;
862
+
863
+ }
864
+
865
+ drawInfo[ instanceId ].geometryIndex = geometryId;
866
+
867
+ return this;
868
+
869
+ }
870
+
871
+ getGeometryIdAt( instanceId ) {
872
+
873
+ const drawInfo = this._drawInfo;
874
+ if ( instanceId >= drawInfo.length || drawInfo[ instanceId ].active === false ) {
875
+
876
+ return - 1;
877
+
878
+ }
879
+
880
+ return drawInfo[ instanceId ].geometryIndex;
881
+
882
+ }
883
+
884
+ getGeometryRangeAt( geometryId, target = {} ) {
885
+
886
+ if ( geometryId < 0 || geometryId >= this._geometryCount ) {
887
+
888
+ return null;
889
+
890
+ }
891
+
892
+ const drawRange = this._drawRanges[ geometryId ];
893
+
894
+ target.start = drawRange.start;
895
+ target.count = drawRange.count;
896
+
897
+ return target;
765
898
 
766
899
  }
767
900
 
768
901
  raycast( raycaster, intersects ) {
769
902
 
770
- const visibility = this._visibility;
771
- const active = this._active;
903
+ const drawInfo = this._drawInfo;
772
904
  const drawRanges = this._drawRanges;
773
- const geometryCount = this._geometryCount;
774
905
  const matrixWorld = this.matrixWorld;
775
906
  const batchGeometry = this.geometry;
776
907
 
@@ -790,21 +921,22 @@ class BatchedMesh extends Mesh {
790
921
 
791
922
  }
792
923
 
793
- for ( let i = 0; i < geometryCount; i ++ ) {
924
+ for ( let i = 0, l = drawInfo.length; i < l; i ++ ) {
794
925
 
795
- if ( ! visibility[ i ] || ! active[ i ] ) {
926
+ if ( ! drawInfo[ i ].visible || ! drawInfo[ i ].active ) {
796
927
 
797
928
  continue;
798
929
 
799
930
  }
800
931
 
801
- const drawRange = drawRanges[ i ];
932
+ const geometryId = drawInfo[ i ].geometryIndex;
933
+ const drawRange = drawRanges[ geometryId ];
802
934
  _mesh.geometry.setDrawRange( drawRange.start, drawRange.count );
803
935
 
804
936
  // ge the intersects
805
937
  this.getMatrixAt( i, _mesh.matrixWorld ).premultiply( matrixWorld );
806
- this.getBoundingBoxAt( i, _mesh.geometry.boundingBox );
807
- this.getBoundingSphereAt( i, _mesh.geometry.boundingSphere );
938
+ this.getBoundingBoxAt( geometryId, _mesh.geometry.boundingBox );
939
+ this.getBoundingSphereAt( geometryId, _mesh.geometry.boundingSphere );
808
940
  _mesh.raycast( raycaster, _batchIntersects );
809
941
 
810
942
  // add batch id to the intersects
@@ -841,8 +973,7 @@ class BatchedMesh extends Mesh {
841
973
  this._drawRanges = source._drawRanges.map( range => ( { ...range } ) );
842
974
  this._reservedRanges = source._reservedRanges.map( range => ( { ...range } ) );
843
975
 
844
- this._visibility = source._visibility.slice();
845
- this._active = source._active.slice();
976
+ this._drawInfo = source._drawInfo.map( inf => ( { ...inf } ) );
846
977
  this._bounds = source._bounds.map( bound => ( {
847
978
  boxInitialized: bound.boxInitialized,
848
979
  box: bound.box.clone(),
@@ -851,7 +982,7 @@ class BatchedMesh extends Mesh {
851
982
  sphere: bound.sphere.clone()
852
983
  } ) );
853
984
 
854
- this._maxGeometryCount = source._maxGeometryCount;
985
+ this._maxInstanceCount = source._maxInstanceCount;
855
986
  this._maxVertexCount = source._maxVertexCount;
856
987
  this._maxIndexCount = source._maxIndexCount;
857
988
 
@@ -861,7 +992,14 @@ class BatchedMesh extends Mesh {
861
992
  this._multiDrawStarts = source._multiDrawStarts.slice();
862
993
 
863
994
  this._matricesTexture = source._matricesTexture.clone();
864
- this._matricesTexture.image.data = this._matricesTexture.image.slice();
995
+ this._matricesTexture.image.data = this._matricesTexture.image.data.slice();
996
+
997
+ if ( this._colorsTexture !== null ) {
998
+
999
+ this._colorsTexture = source._colorsTexture.clone();
1000
+ this._colorsTexture.image.data = this._colorsTexture.image.data.slice();
1001
+
1002
+ }
865
1003
 
866
1004
  return this;
867
1005
 
@@ -874,6 +1012,17 @@ class BatchedMesh extends Mesh {
874
1012
 
875
1013
  this._matricesTexture.dispose();
876
1014
  this._matricesTexture = null;
1015
+
1016
+ this._indirectTexture.dispose();
1017
+ this._indirectTexture = null;
1018
+
1019
+ if ( this._colorsTexture !== null ) {
1020
+
1021
+ this._colorsTexture.dispose();
1022
+ this._colorsTexture = null;
1023
+
1024
+ }
1025
+
877
1026
  return this;
878
1027
 
879
1028
  }
@@ -893,12 +1042,13 @@ class BatchedMesh extends Mesh {
893
1042
  const index = geometry.getIndex();
894
1043
  const bytesPerElement = index === null ? 1 : index.array.BYTES_PER_ELEMENT;
895
1044
 
896
- const active = this._active;
897
- const visibility = this._visibility;
1045
+ const drawInfo = this._drawInfo;
898
1046
  const multiDrawStarts = this._multiDrawStarts;
899
1047
  const multiDrawCounts = this._multiDrawCounts;
900
1048
  const drawRanges = this._drawRanges;
901
1049
  const perObjectFrustumCulled = this.perObjectFrustumCulled;
1050
+ const indirectTexture = this._indirectTexture;
1051
+ const indirectArray = indirectTexture.image.data;
902
1052
 
903
1053
  // prepare the frustum in the local frame
904
1054
  if ( perObjectFrustumCulled ) {
@@ -919,14 +1069,17 @@ class BatchedMesh extends Mesh {
919
1069
  // get the camera position in the local frame
920
1070
  _invMatrixWorld.copy( this.matrixWorld ).invert();
921
1071
  _vector.setFromMatrixPosition( camera.matrixWorld ).applyMatrix4( _invMatrixWorld );
1072
+ _forward.set( 0, 0, - 1 ).transformDirection( camera.matrixWorld ).transformDirection( _invMatrixWorld );
922
1073
 
923
- for ( let i = 0, l = visibility.length; i < l; i ++ ) {
1074
+ for ( let i = 0, l = drawInfo.length; i < l; i ++ ) {
924
1075
 
925
- if ( visibility[ i ] && active[ i ] ) {
1076
+ if ( drawInfo[ i ].visible && drawInfo[ i ].active ) {
1077
+
1078
+ const geometryId = drawInfo[ i ].geometryIndex;
926
1079
 
927
1080
  // get the bounds in world space
928
1081
  this.getMatrixAt( i, _matrix );
929
- this.getBoundingSphereAt( i, _sphere ).applyMatrix4( _matrix );
1082
+ this.getBoundingSphereAt( geometryId, _sphere ).applyMatrix4( _matrix );
930
1083
 
931
1084
  // determine whether the batched geometry is within the frustum
932
1085
  let culled = false;
@@ -939,8 +1092,8 @@ class BatchedMesh extends Mesh {
939
1092
  if ( ! culled ) {
940
1093
 
941
1094
  // get the distance from camera used for sorting
942
- const z = _vector.distanceTo( _sphere.center );
943
- _renderList.push( drawRanges[ i ], z );
1095
+ const z = _temp.subVectors( _sphere.center, _vector ).dot( _forward );
1096
+ _renderList.push( drawRanges[ geometryId ], z, i );
944
1097
 
945
1098
  }
946
1099
 
@@ -966,6 +1119,7 @@ class BatchedMesh extends Mesh {
966
1119
  const item = list[ i ];
967
1120
  multiDrawStarts[ count ] = item.start * bytesPerElement;
968
1121
  multiDrawCounts[ count ] = item.count;
1122
+ indirectArray[ count ] = item.index;
969
1123
  count ++;
970
1124
 
971
1125
  }
@@ -974,9 +1128,11 @@ class BatchedMesh extends Mesh {
974
1128
 
975
1129
  } else {
976
1130
 
977
- for ( let i = 0, l = visibility.length; i < l; i ++ ) {
1131
+ for ( let i = 0, l = drawInfo.length; i < l; i ++ ) {
1132
+
1133
+ if ( drawInfo[ i ].visible && drawInfo[ i ].active ) {
978
1134
 
979
- if ( visibility[ i ] && active[ i ] ) {
1135
+ const geometryId = drawInfo[ i ].geometryIndex;
980
1136
 
981
1137
  // determine whether the batched geometry is within the frustum
982
1138
  let culled = false;
@@ -984,16 +1140,17 @@ class BatchedMesh extends Mesh {
984
1140
 
985
1141
  // get the bounds in world space
986
1142
  this.getMatrixAt( i, _matrix );
987
- this.getBoundingSphereAt( i, _sphere ).applyMatrix4( _matrix );
1143
+ this.getBoundingSphereAt( geometryId, _sphere ).applyMatrix4( _matrix );
988
1144
  culled = ! _frustum.intersectsSphere( _sphere );
989
1145
 
990
1146
  }
991
1147
 
992
1148
  if ( ! culled ) {
993
1149
 
994
- const range = drawRanges[ i ];
1150
+ const range = drawRanges[ geometryId ];
995
1151
  multiDrawStarts[ count ] = range.start * bytesPerElement;
996
1152
  multiDrawCounts[ count ] = range.count;
1153
+ indirectArray[ count ] = i;
997
1154
  count ++;
998
1155
 
999
1156
  }
@@ -1004,6 +1161,7 @@ class BatchedMesh extends Mesh {
1004
1161
 
1005
1162
  }
1006
1163
 
1164
+ indirectTexture.needsUpdate = true;
1007
1165
  this._multiDrawCount = count;
1008
1166
  this._visibilityChanged = false;
1009
1167