@gnsx/three 0.185.15 → 0.186.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 (417) hide show
  1. package/build/three.cjs +10 -82600
  2. package/build/three.core.js +1303 -728
  3. package/build/three.module.js +439 -338
  4. package/build/three.tsl.js +74 -44
  5. package/build/three.webgpu.js +6036 -2184
  6. package/build/three.webgpu.nodes.js +6020 -2184
  7. package/examples/jsm/Addons.js +6 -6
  8. package/examples/jsm/controls/ArcballControls.js +1 -1
  9. package/examples/jsm/controls/FirstPersonControls.js +44 -20
  10. package/examples/jsm/controls/OrbitControls.js +9 -0
  11. package/examples/jsm/controls/TrackballControls.js +109 -4
  12. package/examples/jsm/csm/CSMShadowNode.js +13 -0
  13. package/examples/jsm/exporters/GLTFExporter.js +23 -7
  14. package/examples/jsm/exporters/USDZExporter.js +2 -2
  15. package/examples/jsm/generators/CityGenerator.js +377 -45
  16. package/examples/jsm/generators/ForestGenerator.js +12 -12
  17. package/examples/jsm/generators/TerrainGenerator.js +49 -37
  18. package/examples/jsm/generators/TreeGenerator.js +70 -76
  19. package/examples/jsm/generators/city/BenchGenerator.js +127 -0
  20. package/examples/jsm/generators/city/CarGenerator.js +479 -0
  21. package/examples/jsm/generators/city/CityGeneratorUtils.js +31 -0
  22. package/examples/jsm/generators/city/HydrantGenerator.js +106 -0
  23. package/examples/jsm/generators/city/InstancedMeshGenerator.js +86 -0
  24. package/examples/jsm/generators/city/PersonGenerator.js +447 -0
  25. package/examples/jsm/generators/city/SidewalkGenerator.js +33 -38
  26. package/examples/jsm/generators/city/SkyscraperGenerator.js +448 -48
  27. package/examples/jsm/generators/city/StreetTreeGenerator.js +231 -0
  28. package/examples/jsm/generators/city/StreetlightGenerator.js +100 -0
  29. package/examples/jsm/generators/city/TrafficlightGenerator.js +106 -0
  30. package/examples/jsm/generators/city/TrashcanGenerator.js +100 -0
  31. package/examples/jsm/geometries/BoxLineGeometry.js +1 -1
  32. package/examples/jsm/geometries/ParametricGeometry.js +1 -1
  33. package/examples/jsm/geometries/RoundedBoxGeometry.js +1 -1
  34. package/examples/jsm/gpgpu/CountingSort.js +271 -0
  35. package/examples/jsm/helpers/LightProbeGridHelper.js +60 -239
  36. package/examples/jsm/helpers/LightProbeGridHelperWebGL.js +221 -0
  37. package/examples/jsm/inspector/Extension.js +94 -0
  38. package/examples/jsm/inspector/Inspector.js +145 -41
  39. package/examples/jsm/inspector/RendererInspector.js +100 -52
  40. package/examples/jsm/inspector/extensions/color-grading/ColorGrading.js +2609 -0
  41. package/examples/jsm/inspector/extensions/color-grading/ColorWheel.js +352 -0
  42. package/examples/jsm/inspector/extensions/color-grading/CurveEditor.js +599 -0
  43. package/examples/jsm/inspector/extensions/color-grading/LUT3DStyle.js +1201 -0
  44. package/examples/jsm/inspector/extensions/color-grading/LUTMath.js +788 -0
  45. package/examples/jsm/inspector/extensions/color-grading/modules/BrightnessModule.js +72 -0
  46. package/examples/jsm/inspector/extensions/color-grading/modules/ColorWheelModule.js +112 -0
  47. package/examples/jsm/inspector/extensions/color-grading/modules/ContrastModule.js +82 -0
  48. package/examples/jsm/inspector/extensions/color-grading/modules/CurvesModule.js +109 -0
  49. package/examples/jsm/inspector/extensions/color-grading/modules/ExposureHueModule.js +110 -0
  50. package/examples/jsm/inspector/extensions/color-grading/modules/ExposureModule.js +73 -0
  51. package/examples/jsm/inspector/extensions/color-grading/modules/HueModule.js +78 -0
  52. package/examples/jsm/inspector/extensions/color-grading/modules/ImportedCubeModule.js +89 -0
  53. package/examples/jsm/inspector/extensions/color-grading/modules/Module.js +285 -0
  54. package/examples/jsm/inspector/extensions/color-grading/modules/OutputModule.js +101 -0
  55. package/examples/jsm/inspector/extensions/color-grading/modules/RendererModule.js +225 -0
  56. package/examples/jsm/inspector/extensions/color-grading/modules/SatVibranceModule.js +102 -0
  57. package/examples/jsm/inspector/extensions/color-grading/modules/SaturationModule.js +76 -0
  58. package/examples/jsm/inspector/extensions/color-grading/modules/VibranceModule.js +76 -0
  59. package/examples/jsm/inspector/extensions/color-grading/modules/WhiteBalanceModule.js +86 -0
  60. package/examples/jsm/inspector/extensions/tsl-graph/TSLGraphEditor.js +26 -31
  61. package/examples/jsm/inspector/extensions/tsl-graph/TSLGraphLoader.js +1 -0
  62. package/examples/jsm/inspector/tabs/Memory.js +0 -2
  63. package/examples/jsm/inspector/tabs/Settings.js +4 -0
  64. package/examples/jsm/inspector/tabs/Timeline.js +223 -171
  65. package/examples/jsm/inspector/tabs/Viewer.js +515 -21
  66. package/examples/jsm/inspector/ui/List.js +15 -9
  67. package/examples/jsm/inspector/ui/Profiler.js +170 -14
  68. package/examples/jsm/inspector/ui/Style.js +269 -23
  69. package/examples/jsm/inspector/ui/Tab.js +2 -0
  70. package/examples/jsm/inspector/ui/Values.js +14 -2
  71. package/examples/jsm/interactive/HTMLMesh.js +19 -3
  72. package/examples/jsm/lighting/LightProbeGrid.js +484 -889
  73. package/examples/jsm/lighting/LightProbeGridUtils.js +107 -0
  74. package/examples/jsm/lighting/LightProbeGridWebGL.js +841 -0
  75. package/examples/jsm/lighting/vxgi/VXGIConeTracer.js +194 -0
  76. package/examples/jsm/lighting/vxgi/VXGINode.js +660 -0
  77. package/examples/jsm/lighting/vxgi/VXGISceneCollector.js +478 -0
  78. package/examples/jsm/lighting/vxgi/VXGIVolume.js +1430 -0
  79. package/examples/jsm/lights/SunLight.js +95 -0
  80. package/examples/jsm/lights/SunLightNode.js +56 -0
  81. package/examples/jsm/lights/SunLightShadow.js +319 -0
  82. package/examples/jsm/lights/SunShadowNode.js +312 -0
  83. package/examples/jsm/loaders/3DMLoader.js +150 -49
  84. package/examples/jsm/loaders/3MFLoader.js +202 -1
  85. package/examples/jsm/loaders/FBXLoader.js +81 -5
  86. package/examples/jsm/loaders/GLTFGaussianSplatLoaderExtension.js +330 -0
  87. package/examples/jsm/loaders/GLTFLoader.js +79 -14
  88. package/examples/jsm/loaders/GaussianSplatPLYLoader.js +386 -0
  89. package/examples/jsm/loaders/KSPLATLoader.js +463 -0
  90. package/examples/jsm/loaders/MaterialXLoader.js +111 -1010
  91. package/examples/jsm/loaders/PCDLoader.js +1 -1
  92. package/examples/jsm/loaders/SPLATLoader.js +139 -0
  93. package/examples/jsm/loaders/SPZLoader.js +561 -0
  94. package/examples/jsm/loaders/materialx/MaterialXArchive.js +108 -0
  95. package/examples/jsm/loaders/materialx/MaterialXDocument.js +878 -0
  96. package/examples/jsm/loaders/materialx/MaterialXHextile.js +183 -0
  97. package/examples/jsm/loaders/materialx/MaterialXInterfaceValidation.js +376 -0
  98. package/examples/jsm/loaders/materialx/MaterialXLog.js +75 -0
  99. package/examples/jsm/loaders/materialx/MaterialXNodeInterfaceRegistry.js +4 -0
  100. package/examples/jsm/loaders/materialx/MaterialXNodeLibrary.js +1021 -0
  101. package/examples/jsm/loaders/materialx/MaterialXSurfaceMappings.js +661 -0
  102. package/examples/jsm/loaders/materialx/MaterialXUtils.js +57 -0
  103. package/examples/jsm/loaders/materialx/compile/MaterialXCompileRegistry.js +997 -0
  104. package/examples/jsm/loaders/materialx/parse/MaterialXParser.js +28 -0
  105. package/examples/jsm/loaders/usd/USDAParser.js +15 -2
  106. package/examples/jsm/loaders/usd/USDCParser.js +1 -4
  107. package/examples/jsm/loaders/usd/USDComposer.js +80 -42
  108. package/examples/jsm/materials/WoodNodeMaterial.js +6 -108
  109. package/examples/jsm/misc/RollerCoaster.js +2 -2
  110. package/examples/jsm/misc/SculptGL.LICENSE.txt +21 -0
  111. package/examples/jsm/misc/Sculptor.js +1679 -0
  112. package/examples/jsm/misc/SculptorMesh.js +1504 -0
  113. package/examples/jsm/misc/SculptorTools.js +1180 -0
  114. package/examples/jsm/misc/SculptorUtils.js +345 -0
  115. package/examples/jsm/misc/TubePainter.js +28 -16
  116. package/examples/jsm/misc/VolumeSlice.js +24 -24
  117. package/examples/jsm/modifiers/SimplifyModifier.js +63 -556
  118. package/examples/jsm/objects/GaussianSplat.js +1039 -0
  119. package/examples/jsm/objects/Sky.js +66 -45
  120. package/examples/jsm/objects/SkyMesh.js +70 -51
  121. package/examples/jsm/physics/JoltPhysics.js +1 -1
  122. package/examples/jsm/postprocessing/AfterimagePass.js +4 -2
  123. package/examples/jsm/postprocessing/BloomPass.js +2 -2
  124. package/examples/jsm/postprocessing/GTAOPass.js +1 -1
  125. package/examples/jsm/postprocessing/OutlinePass.js +5 -5
  126. package/examples/jsm/postprocessing/SAOPass.js +1 -1
  127. package/examples/jsm/postprocessing/SSAOPass.js +1 -1
  128. package/examples/jsm/postprocessing/SSRPass.js +4 -2
  129. package/examples/jsm/postprocessing/SavePass.js +1 -1
  130. package/examples/jsm/postprocessing/TAARenderPass.js +1 -1
  131. package/examples/jsm/postprocessing/UnrealBloomPass.js +30 -13
  132. package/examples/jsm/renderers/CSS2DRenderer.js +29 -5
  133. package/examples/jsm/shaders/DepthLimitedBlurShader.js +4 -1
  134. package/examples/jsm/shaders/ExposureShader.js +1 -1
  135. package/examples/jsm/shaders/FilmShader.js +2 -1
  136. package/examples/jsm/transpiler/AST.js +21 -2
  137. package/examples/jsm/transpiler/GLSLDecoder.js +498 -8
  138. package/examples/jsm/transpiler/TSLEncoder.js +82 -10
  139. package/examples/jsm/transpiler/WGSLEncoder.js +33 -4
  140. package/examples/jsm/tsl/WebGLNodesHandler.js +29 -39
  141. package/examples/jsm/tsl/display/AfterImageNode.js +2 -0
  142. package/examples/jsm/tsl/display/AnaglyphPassNode.js +3 -2
  143. package/examples/jsm/tsl/display/BilateralBlurNode.js +5 -2
  144. package/examples/jsm/tsl/display/BloomNode.js +55 -30
  145. package/examples/jsm/tsl/display/DenoiseNode.js +21 -1
  146. package/examples/jsm/tsl/display/DepthOfFieldNode.js +24 -6
  147. package/examples/jsm/tsl/display/DotScreenNode.js +11 -11
  148. package/examples/jsm/tsl/display/FSR1Node.js +8 -4
  149. package/examples/jsm/tsl/display/GTAONode.js +199 -86
  150. package/examples/jsm/tsl/display/GaussianBlurNode.js +65 -52
  151. package/examples/jsm/tsl/display/GodraysNode.js +5 -2
  152. package/examples/jsm/tsl/display/ImportanceSampledEnvironment.js +2 -2
  153. package/examples/jsm/tsl/display/LensflareNode.js +5 -2
  154. package/examples/jsm/tsl/display/OITPassNode.js +352 -0
  155. package/examples/jsm/tsl/display/OutlineNode.js +2 -0
  156. package/examples/jsm/tsl/display/ParallaxBarrierPassNode.js +3 -2
  157. package/examples/jsm/tsl/display/RGBShiftNode.js +9 -9
  158. package/examples/jsm/tsl/display/RecurrentDenoiseNode.js +7 -4
  159. package/examples/jsm/tsl/display/RetroPassNode.js +1 -1
  160. package/examples/jsm/tsl/display/SMAANode.js +22 -61
  161. package/examples/jsm/tsl/display/SSAAPassNode.js +2 -4
  162. package/examples/jsm/tsl/display/SSAONode.js +436 -0
  163. package/examples/jsm/tsl/display/SSGINode.js +5 -2
  164. package/examples/jsm/tsl/display/SSRNode.js +7 -2
  165. package/examples/jsm/tsl/display/SSSNode.js +5 -2
  166. package/examples/jsm/tsl/display/SharpenNode.js +5 -4
  167. package/examples/jsm/tsl/display/StereoCompositePassNode.js +1 -3
  168. package/examples/jsm/tsl/display/StereoPassNode.js +1 -3
  169. package/examples/jsm/tsl/display/TAAUNode.js +22 -125
  170. package/examples/jsm/tsl/display/TRAANode.js +16 -142
  171. package/examples/jsm/tsl/display/TemporalReprojectNode.js +21 -15
  172. package/examples/jsm/tsl/display/depthAwareBlur.js +63 -0
  173. package/examples/jsm/tsl/display/hashBlur.js +3 -2
  174. package/examples/jsm/tsl/lighting/ClusteredLightsNode.js +38 -27
  175. package/examples/jsm/tsl/lighting/LightProbeGridNode.js +136 -0
  176. package/examples/jsm/tsl/math/voronoiNoise.js +112 -0
  177. package/examples/jsm/tsl/shadows/TileShadowNode.js +4 -6
  178. package/examples/jsm/tsl/utils/Raymarching.js +5 -5
  179. package/examples/jsm/tsl/utils/SoftParticles.js +60 -0
  180. package/examples/jsm/tsl/utils/TAAUtils.js +195 -0
  181. package/examples/jsm/utils/BufferGeometryUtils.js +14 -14
  182. package/examples/jsm/utils/GaussianSplatUtils.js +229 -0
  183. package/examples/jsm/utils/WebGLTextureUtils.js +1 -1
  184. package/examples/jsm/utils/WebGPUTextureUtils.js +1 -1
  185. package/examples/jsm/webxr/WebGLXRFallback.js +2 -16
  186. package/examples/jsm/webxr/XRControllerModelFactory.js +16 -4
  187. package/package.json +9 -16
  188. package/src/Three.Core.js +2 -1
  189. package/src/Three.TSL.js +73 -43
  190. package/src/Three.WebGPU.Nodes.js +1 -0
  191. package/src/Three.WebGPU.js +1 -0
  192. package/src/animation/AnimationClip.js +15 -2
  193. package/src/animation/AnimationObjectGroup.js +18 -6
  194. package/src/animation/AnimationUtils.js +26 -0
  195. package/src/animation/KeyframeTrack.js +37 -0
  196. package/src/constants.js +23 -1
  197. package/src/core/BufferAttribute.js +3 -2
  198. package/src/core/BufferGeometry.js +1 -1
  199. package/src/core/InterleavedBuffer.js +5 -1
  200. package/src/core/Object3D.js +40 -12
  201. package/src/core/Raycaster.js +4 -0
  202. package/src/core/RenderTarget.js +99 -9
  203. package/src/core/RenderTarget3D.js +12 -8
  204. package/src/extras/Controls.js +0 -8
  205. package/src/extras/PMREMGenerator.js +99 -205
  206. package/src/geometries/TorusGeometry.js +1 -1
  207. package/src/helpers/ArrowHelper.js +2 -0
  208. package/src/helpers/AxesHelper.js +2 -0
  209. package/src/helpers/Box3Helper.js +2 -0
  210. package/src/helpers/BoxHelper.js +2 -0
  211. package/src/helpers/CameraHelper.js +2 -0
  212. package/src/helpers/DirectionalLightHelper.js +2 -0
  213. package/src/helpers/GridHelper.js +2 -0
  214. package/src/helpers/HemisphereLightHelper.js +2 -0
  215. package/src/helpers/PlaneHelper.js +2 -0
  216. package/src/helpers/PointLightHelper.js +2 -0
  217. package/src/helpers/PolarGridHelper.js +2 -0
  218. package/src/helpers/SkeletonHelper.js +2 -0
  219. package/src/helpers/SpotLightHelper.js +2 -0
  220. package/src/lights/Light.js +0 -10
  221. package/src/lights/LightShadow.js +43 -12
  222. package/src/lights/SpotLightShadow.js +18 -0
  223. package/src/loaders/BufferGeometryLoader.js +5 -0
  224. package/src/loaders/ImageBitmapLoader.js +3 -1
  225. package/src/loaders/ObjectLoader.js +8 -5
  226. package/src/materials/Material.js +80 -57
  227. package/src/materials/MeshPhysicalMaterial.js +32 -0
  228. package/src/materials/nodes/Line2NodeMaterial.js +17 -8
  229. package/src/materials/nodes/MeshPhysicalNodeMaterial.js +42 -5
  230. package/src/materials/nodes/NodeMaterial.js +19 -13
  231. package/src/materials/nodes/PointsNodeMaterial.js +2 -1
  232. package/src/materials/nodes/manager/NodeMaterialObserver.js +282 -55
  233. package/src/math/Frustum.js +9 -0
  234. package/src/math/FrustumArray.js +1 -1
  235. package/src/math/MathUtils.js +5 -3
  236. package/src/math/Matrix4.js +2 -9
  237. package/src/math/Plane.js +30 -1
  238. package/src/math/Quaternion.js +0 -10
  239. package/src/math/Ray.js +95 -45
  240. package/src/math/Triangle.js +0 -2
  241. package/src/math/Vector3.js +2 -2
  242. package/src/math/Vector4.js +0 -4
  243. package/src/math/interpolants/BezierInterpolant.js +36 -23
  244. package/src/nodes/Nodes.js +2 -0
  245. package/src/nodes/TSL.js +11 -3
  246. package/src/nodes/accessors/Batch.js +85 -13
  247. package/src/nodes/accessors/BufferAttributeNode.js +1 -1
  248. package/src/nodes/accessors/BuiltinNode.js +1 -1
  249. package/src/nodes/accessors/Instance.js +19 -18
  250. package/src/nodes/accessors/MaterialNode.js +9 -0
  251. package/src/nodes/accessors/ModelNode.js +85 -9
  252. package/src/nodes/accessors/ReferenceBaseNode.js +1 -70
  253. package/src/nodes/accessors/ReferenceElementNode.js +72 -0
  254. package/src/nodes/accessors/ReferenceNode.js +1 -70
  255. package/src/nodes/accessors/Skinning.js +124 -12
  256. package/src/nodes/accessors/StorageTextureNode.js +7 -3
  257. package/src/nodes/accessors/Texture3DNode.js +1 -1
  258. package/src/nodes/accessors/TextureNode.js +51 -21
  259. package/src/nodes/accessors/TextureSizeNode.js +4 -2
  260. package/src/nodes/accessors/UniformArrayNode.js +30 -5
  261. package/src/nodes/code/CodeNode.js +1 -1
  262. package/src/nodes/code/FunctionNode.js +12 -2
  263. package/src/nodes/core/ArrayNode.js +2 -2
  264. package/src/nodes/core/ContextNode.js +57 -4
  265. package/src/nodes/core/IndexNode.js +69 -4
  266. package/src/nodes/core/InspectorNode.js +2 -2
  267. package/src/nodes/core/MRTNode.js +44 -2
  268. package/src/nodes/core/Node.js +6 -3
  269. package/src/nodes/core/NodeBuilder.js +65 -50
  270. package/src/nodes/core/NodeFrame.js +11 -3
  271. package/src/nodes/core/NodeUtils.js +88 -0
  272. package/src/nodes/core/PropertyNode.js +8 -0
  273. package/src/nodes/core/StackNode.js +0 -1
  274. package/src/nodes/core/StructNode.js +4 -3
  275. package/src/nodes/core/UniformGroupNode.js +3 -2
  276. package/src/nodes/core/UniformNode.js +26 -12
  277. package/src/nodes/core/VarNode.js +0 -1
  278. package/src/nodes/display/BumpMapNode.js +2 -2
  279. package/src/nodes/display/ColorAdjustment.js +1 -1
  280. package/src/nodes/display/PassNode.js +76 -15
  281. package/src/nodes/display/ScreenNode.js +22 -65
  282. package/src/nodes/fog/Fog.js +4 -4
  283. package/src/nodes/functions/BSDF/BRDF_GGX.js +6 -6
  284. package/src/nodes/functions/BSDF/BRDF_Sheen.js +1 -1
  285. package/src/nodes/functions/BSDF/DFGLUT.js +2 -1
  286. package/src/nodes/functions/BSDF/LTC.js +1 -1
  287. package/src/nodes/functions/PhongLightingModel.js +1 -1
  288. package/src/nodes/functions/PhysicalLightingModel.js +83 -25
  289. package/src/nodes/functions/ToonLightingModel.js +2 -2
  290. package/src/nodes/functions/material/getParallaxCorrectNormal.js +3 -3
  291. package/src/nodes/gpgpu/AtomicFunctionNode.js +64 -13
  292. package/src/nodes/gpgpu/BarrierNode.js +13 -4
  293. package/src/nodes/gpgpu/ComputeBuiltinNode.js +1 -1
  294. package/src/nodes/gpgpu/ComputeNode.js +20 -17
  295. package/src/nodes/gpgpu/SubgroupFunctionNode.js +165 -37
  296. package/src/nodes/gpgpu/WorkgroupInfoNode.js +44 -6
  297. package/src/nodes/lighting/EnvironmentNode.js +40 -4
  298. package/src/nodes/lighting/LightsNode.js +20 -4
  299. package/src/nodes/lighting/ShadowBaseNode.js +158 -1
  300. package/src/nodes/lighting/ShadowFilterNode.js +2 -106
  301. package/src/nodes/lighting/ShadowNode.js +22 -91
  302. package/src/nodes/materialx/{lib/mx_hsv.js → MaterialXColor.js} +3 -6
  303. package/src/nodes/materialx/{lib/mx_transform_color.js → MaterialXColorTransform.js} +3 -6
  304. package/src/nodes/materialx/MaterialXCore.js +37 -0
  305. package/src/nodes/materialx/MaterialXNodes.js +64 -72
  306. package/src/nodes/materialx/{lib/mx_noise.js → MaterialXNoise.js} +426 -197
  307. package/src/nodes/math/BitcountNode.js +24 -4
  308. package/src/nodes/math/MathNode.js +4 -4
  309. package/src/nodes/math/MathUtils.js +15 -4
  310. package/src/nodes/math/OperatorNode.js +2 -2
  311. package/src/nodes/math/PackFloatNode.js +29 -1
  312. package/src/nodes/math/Packed4x8IntegerNode.js +433 -0
  313. package/src/nodes/math/UnpackFloatNode.js +30 -2
  314. package/src/nodes/parsers/GLSLNodeFunction.js +1 -1
  315. package/src/nodes/pmrem/PMREMNode.js +1 -1
  316. package/src/nodes/pmrem/PMREMUtils.js +31 -74
  317. package/src/nodes/shapes/Shapes.js +1 -1
  318. package/src/nodes/tsl/TSLCore.js +1 -31
  319. package/src/nodes/utils/EventNode.js +75 -0
  320. package/src/nodes/utils/LoopNode.js +54 -13
  321. package/src/nodes/utils/PostProcessingUtils.js +23 -2
  322. package/src/nodes/utils/RTTNode.js +97 -32
  323. package/src/nodes/utils/ReflectorNode.js +8 -4
  324. package/src/nodes/utils/RotateNode.js +85 -8
  325. package/src/nodes/utils/SpriteUtils.js +58 -23
  326. package/src/objects/BatchedMesh.js +6 -0
  327. package/src/objects/InstancedMesh.js +1 -1
  328. package/src/objects/LOD.js +1 -1
  329. package/src/objects/Line.js +12 -0
  330. package/src/objects/Mesh.js +12 -0
  331. package/src/objects/Points.js +12 -0
  332. package/src/objects/Sprite.js +12 -0
  333. package/src/renderers/WebGLRenderer.js +93 -27
  334. package/src/renderers/common/Animation.js +12 -2
  335. package/src/renderers/common/Backend.js +38 -10
  336. package/src/renderers/common/BindGroup.js +0 -1
  337. package/src/renderers/common/Bindings.js +50 -4
  338. package/src/renderers/common/BundleGroup.js +4 -0
  339. package/src/renderers/common/ClippingContext.js +11 -1
  340. package/src/renderers/common/Color4.js +9 -0
  341. package/src/renderers/common/Constants.js +0 -5
  342. package/src/renderers/common/DirectRenderPipeline.js +233 -0
  343. package/src/renderers/common/Geometries.js +24 -3
  344. package/src/renderers/common/Info.js +3 -3
  345. package/src/renderers/common/InspectorBase.js +37 -8
  346. package/src/renderers/common/Lighting.js +11 -4
  347. package/src/renderers/common/Pipelines.js +6 -4
  348. package/src/renderers/common/QuadMesh.js +16 -2
  349. package/src/renderers/common/RenderContext.js +8 -0
  350. package/src/renderers/common/RenderList.js +53 -19
  351. package/src/renderers/common/RenderLists.js +58 -11
  352. package/src/renderers/common/RenderObject.js +14 -0
  353. package/src/renderers/common/RenderObjects.js +14 -9
  354. package/src/renderers/common/RenderPipeline.js +52 -44
  355. package/src/renderers/common/Renderer.js +226 -55
  356. package/src/renderers/common/Storage3DTexture.js +16 -0
  357. package/src/renderers/common/Textures.js +3 -3
  358. package/src/renderers/common/XRManager.js +79 -72
  359. package/src/renderers/common/extras/PMREMGenerator.js +76 -144
  360. package/src/renderers/common/nodes/NodeManager.js +144 -6
  361. package/src/renderers/common/nodes/NodeStorageBuffer.js +3 -1
  362. package/src/renderers/common/nodes/NodeUniformBuffer.js +3 -1
  363. package/src/renderers/shaders/DFGLUTData.js +2 -1
  364. package/src/renderers/shaders/ShaderChunk/defaultnormal_vertex.glsl.js +4 -2
  365. package/src/renderers/shaders/ShaderChunk/envmap_physical_pars_fragment.glsl.js +48 -0
  366. package/src/renderers/shaders/ShaderChunk/lights_fragment_begin.glsl.js +53 -4
  367. package/src/renderers/shaders/ShaderChunk/lights_fragment_maps.glsl.js +20 -2
  368. package/src/renderers/shaders/ShaderChunk/lights_pars_begin.glsl.js +20 -0
  369. package/src/renderers/shaders/ShaderChunk/lights_physical_fragment.glsl.js +6 -0
  370. package/src/renderers/shaders/ShaderChunk/lights_physical_pars_fragment.glsl.js +61 -57
  371. package/src/renderers/shaders/ShaderChunk/shadowmap_pars_fragment.glsl.js +82 -0
  372. package/src/renderers/shaders/ShaderChunk/shadowmap_pars_vertex.glsl.js +9 -0
  373. package/src/renderers/shaders/ShaderChunk/shadowmap_vertex.glsl.js +8 -1
  374. package/src/renderers/shaders/ShaderChunk/shadowmask_pars_fragment.glsl.js +15 -0
  375. package/src/renderers/shaders/ShaderLib/meshphysical.glsl.js +4 -0
  376. package/src/renderers/shaders/ShaderLib.js +1 -0
  377. package/src/renderers/shaders/UniformsLib.js +16 -0
  378. package/src/renderers/webgl/WebGLAnimation.js +2 -2
  379. package/src/renderers/webgl/WebGLCapabilities.js +2 -2
  380. package/src/renderers/webgl/WebGLLights.js +74 -4
  381. package/src/renderers/webgl/WebGLMaterials.js +6 -0
  382. package/src/renderers/webgl/WebGLOutput.js +36 -24
  383. package/src/renderers/webgl/WebGLProgram.js +3 -0
  384. package/src/renderers/webgl/WebGLPrograms.js +8 -0
  385. package/src/renderers/webgl/WebGLRenderLists.js +6 -10
  386. package/src/renderers/webgl/WebGLShadowMap.js +47 -44
  387. package/src/renderers/webgl/WebGLTextures.js +7 -7
  388. package/src/renderers/webgl-fallback/WebGLBackend.js +153 -45
  389. package/src/renderers/webgl-fallback/nodes/GLSLNodeBuilder.js +83 -29
  390. package/src/renderers/webgl-fallback/utils/WebGLState.js +163 -17
  391. package/src/renderers/webgl-fallback/utils/WebGLTextureUtils.js +32 -5
  392. package/src/renderers/webgl-fallback/utils/WebGLTimestampQueryPool.js +11 -4
  393. package/src/renderers/webgpu/WebGPUBackend.js +513 -145
  394. package/src/renderers/webgpu/nodes/WGSLNodeBuilder.js +99 -20
  395. package/src/renderers/webgpu/nodes/WGSLNodeFunction.js +2 -1
  396. package/src/renderers/webgpu/utils/WebGPUAttributeUtils.js +3 -12
  397. package/src/renderers/webgpu/utils/WebGPUBindingUtils.js +24 -14
  398. package/src/renderers/webgpu/utils/WebGPUPipelineUtils.js +80 -14
  399. package/src/renderers/webgpu/utils/WebGPUTextureUtils.js +62 -7
  400. package/src/renderers/webgpu/utils/WebGPUTimestampQueryPool.js +9 -3
  401. package/src/renderers/webgpu/utils/WebGPUUtils.js +16 -4
  402. package/src/renderers/webxr/WebXRManager.js +25 -2
  403. package/src/scenes/Scene.js +3 -3
  404. package/src/textures/CompressedArrayTexture.js +16 -0
  405. package/src/textures/Data3DTexture.js +16 -0
  406. package/src/textures/DataArrayTexture.js +16 -0
  407. package/src/textures/DepthTexture.js +3 -3
  408. package/src/textures/Texture.js +3 -3
  409. package/src/textures/{Source.js → TextureSource.js} +39 -8
  410. package/build/three.core.min.js +0 -6
  411. package/build/three.module.min.js +0 -6
  412. package/build/three.tsl.min.js +0 -6
  413. package/build/three.webgpu.min.js +0 -6
  414. package/build/three.webgpu.nodes.min.js +0 -6
  415. package/examples/jsm/libs/ecsy.module.js +0 -1792
  416. package/examples/jsm/loaders/LottieLoader.js +0 -130
  417. package/src/nodes/functions/BSDF/BRDF_GGX_Multiscatter.js +0 -52
@@ -2,12 +2,15 @@ import { nodeObject } from '../tsl/TSLCore.js';
2
2
  import TextureNode from '../accessors/TextureNode.js';
3
3
  import { NodeUpdateType } from '../core/constants.js';
4
4
  import { uv } from '../accessors/UV.js';
5
+ import { context } from '../core/ContextNode.js';
5
6
  import NodeMaterial from '../../materials/nodes/NodeMaterial.js';
6
7
  import QuadMesh from '../../renderers/common/QuadMesh.js';
7
8
 
8
9
  import { RenderTarget } from '../../core/RenderTarget.js';
9
10
  import { Vector2 } from '../../math/Vector2.js';
10
11
  import { HalfFloatType } from '../../constants.js';
12
+ import { error } from '../../utils.js';
13
+ import { resetRendererState, restoreRendererState } from '../../renderers/common/RendererUtils.js';
11
14
 
12
15
  const _size = /*@__PURE__*/ new Vector2();
13
16
 
@@ -31,13 +34,21 @@ class RTTNode extends TextureNode {
31
34
  * Constructs a new RTT node.
32
35
  *
33
36
  * @param {Node} node - The node to render a texture with.
34
- * @param {?number} [width=null] - The width of the internal render target. If not width is applied, the render target is automatically resized.
37
+ * @param {?number} [width=null] - The width of the internal render target. If no width is applied, the render target is automatically resized.
35
38
  * @param {?number} [height=null] - The height of the internal render target.
36
- * @param {Object} [options={type:HalfFloatType}] - The options for the internal render target.
39
+ * @param {Object} [options={}] - The options for the internal render target.
40
+ * @param {number} [options.type=HalfFloatType] - The texture type.
41
+ * @param {boolean} [options.autoUpdate=true] - Whether the texture should automatically be updated or not.
42
+ * @param {number} [options.resolutionScale=1] - The resolution scale.
37
43
  */
38
- constructor( node, width = null, height = null, options = { type: HalfFloatType } ) {
44
+ constructor( node, width = null, height = null, options = {} ) {
39
45
 
40
- const renderTarget = new RenderTarget( width, height, options );
46
+ const {
47
+ autoUpdate = true,
48
+ resolutionScale = 1
49
+ } = options;
50
+
51
+ const renderTarget = new RenderTarget( width ?? 1, height ?? 1, { type: HalfFloatType, ...options } );
41
52
 
42
53
  super( renderTarget.texture, uv() );
43
54
 
@@ -95,7 +106,7 @@ class RTTNode extends TextureNode {
95
106
  * @type {boolean}
96
107
  * @default true
97
108
  */
98
- this.autoUpdate = true;
109
+ this.autoUpdate = autoUpdate;
99
110
 
100
111
  /**
101
112
  * The resolution scale
@@ -104,33 +115,33 @@ class RTTNode extends TextureNode {
104
115
  * @type {number}
105
116
  * @default 1
106
117
  */
107
- this._resolutionScale = 1;
118
+ this._resolutionScale = resolutionScale;
108
119
 
109
120
  /**
110
- * The node which is used with the quad mesh for RTT.
121
+ * The internal quad mesh for RTT.
111
122
  *
112
123
  * @private
113
- * @type {Node}
114
- * @default null
124
+ * @type {QuadMesh}
115
125
  */
116
- this._rttNode = null;
126
+ this._quadMesh = new QuadMesh( new NodeMaterial() );
117
127
 
118
128
  /**
119
- * The internal quad mesh for RTT.
129
+ * The renderer state saved and restored around the RTT render.
130
+ * Kept per instance because nested RTT nodes must not share it.
120
131
  *
121
132
  * @private
122
- * @type {QuadMesh}
133
+ * @type {Object}
123
134
  */
124
- this._quadMesh = new QuadMesh( new NodeMaterial() );
135
+ this._rendererState = {};
125
136
 
126
137
  /**
127
- * The `updateBeforeType` is set to `NodeUpdateType.RENDER` since the node updates
128
- * the texture once per render in its {@link RTTNode#updateBefore} method.
138
+ * The `updateBeforeType` is set to `NodeUpdateType.FRAME` since the node updates
139
+ * the texture once per frame in its {@link RTTNode#updateBefore} method.
129
140
  *
130
141
  * @type {string}
131
- * @default 'render'
142
+ * @default 'frame'
132
143
  */
133
- this.updateBeforeType = NodeUpdateType.RENDER;
144
+ this.updateBeforeType = NodeUpdateType.FRAME;
134
145
 
135
146
  }
136
147
 
@@ -149,7 +160,8 @@ class RTTNode extends TextureNode {
149
160
 
150
161
  setup( builder ) {
151
162
 
152
- this._rttNode = this.node.context( builder.getSharedContext() );
163
+ this._quadMesh.material.contextNode = context( builder.getSharedContext() );
164
+ this._quadMesh.material.fragmentNode = this.node;
153
165
  this._quadMesh.material.name = 'RTT';
154
166
  this._quadMesh.material.needsUpdate = true;
155
167
 
@@ -158,10 +170,10 @@ class RTTNode extends TextureNode {
158
170
  }
159
171
 
160
172
  /**
161
- * Sets the size of the internal render target
173
+ * Sets the size of the internal render target.
162
174
  *
163
175
  * @param {number} width - The width to set.
164
- * @param {number} height - The width to set.
176
+ * @param {number} height - The height to set.
165
177
  */
166
178
  setSize( width, height ) {
167
179
 
@@ -206,7 +218,42 @@ class RTTNode extends TextureNode {
206
218
 
207
219
  }
208
220
 
209
- updateBefore( { renderer } ) {
221
+ /**
222
+ * Overwritten since the value is defined by the internal render target.
223
+ *
224
+ * @param {Texture} value - The texture value.
225
+ */
226
+ set value( value ) {
227
+
228
+ if ( this.renderTarget && value !== this.renderTarget.texture ) {
229
+
230
+ error( 'TSL: "rtt()" does not allow overwriting the value.' );
231
+
232
+ }
233
+
234
+ }
235
+
236
+ /**
237
+ * The texture of the internal render target.
238
+ *
239
+ * @type {Texture}
240
+ */
241
+ get value() {
242
+
243
+ return this.renderTarget ? this.renderTarget.texture : null;
244
+
245
+ }
246
+
247
+ /**
248
+ * Renders the node's output into the internal render target before the main render pass.
249
+ * Handles automatic resizing of the render target when `autoResize` is enabled,
250
+ * and skips rendering if neither `textureNeedsUpdate` nor `autoUpdate` is true.
251
+ *
252
+ * @param {NodeFrame} frame - The current node frame, providing access to the renderer and other frame data.
253
+ */
254
+ updateBefore( frame ) {
255
+
256
+ const { renderer } = frame;
210
257
 
211
258
  if ( this.textureNeedsUpdate === false && this.autoUpdate === false ) return;
212
259
 
@@ -214,8 +261,6 @@ class RTTNode extends TextureNode {
214
261
 
215
262
  //
216
263
 
217
- const currentRenderTarget = renderer.getRenderTarget();
218
-
219
264
  if ( this.autoResize === true ) {
220
265
 
221
266
  const size = renderer.getDrawingBufferSize( _size );
@@ -237,23 +282,25 @@ class RTTNode extends TextureNode {
237
282
 
238
283
  let name = 'RTT';
239
284
 
240
- if ( this.node.name ) {
285
+ const callName = this.name || this.node.name;
241
286
 
242
- name = this.node.name + ' [ ' + name + ' ]';
287
+ if ( callName ) {
243
288
 
244
- }
289
+ name = callName + ' [ ' + name + ' ]';
245
290
 
291
+ }
246
292
 
247
- this._quadMesh.material.fragmentNode = this._rttNode;
248
293
  this._quadMesh.name = name;
249
294
 
250
295
  //
251
296
 
297
+ resetRendererState( renderer, this._rendererState );
298
+
252
299
  renderer.setRenderTarget( this.renderTarget );
253
300
 
254
301
  this._quadMesh.render( renderer );
255
302
 
256
- renderer.setRenderTarget( currentRenderTarget );
303
+ restoreRendererState( renderer, this._rendererState );
257
304
 
258
305
  }
259
306
 
@@ -267,6 +314,18 @@ class RTTNode extends TextureNode {
267
314
 
268
315
  }
269
316
 
317
+ /**
318
+ * Frees internal resources. Should be called when the node is no longer in use.
319
+ */
320
+ dispose() {
321
+
322
+ this.renderTarget.dispose();
323
+ this._quadMesh.material.dispose();
324
+
325
+ super.dispose();
326
+
327
+ }
328
+
270
329
  }
271
330
 
272
331
  export default RTTNode;
@@ -277,9 +336,12 @@ export default RTTNode;
277
336
  * @tsl
278
337
  * @function
279
338
  * @param {Node} node - The node to render a texture with.
280
- * @param {?number} [width=null] - The width of the internal render target. If not width is applied, the render target is automatically resized.
339
+ * @param {?number} [width=null] - The width of the internal render target. If no width is applied, the render target is automatically resized.
281
340
  * @param {?number} [height=null] - The height of the internal render target.
282
- * @param {Object} [options={type:HalfFloatType}] - The options for the internal render target.
341
+ * @param {Object} [options={}] - The options for the internal render target.
342
+ * @param {number} [options.type=HalfFloatType] - The texture type.
343
+ * @param {boolean} [options.autoUpdate=true] - Whether the texture should automatically be updated or not.
344
+ * @param {number} [options.resolutionScale=1] - The resolution scale.
283
345
  * @returns {RTTNode}
284
346
  */
285
347
  export const rtt = ( node, ...params ) => new RTTNode( nodeObject( node ), ...params );
@@ -290,9 +352,12 @@ export const rtt = ( node, ...params ) => new RTTNode( nodeObject( node ), ...pa
290
352
  * @tsl
291
353
  * @function
292
354
  * @param {Node} node - The node to render a texture with.
293
- * @param {?number} [width=null] - The width of the internal render target. If not width is applied, the render target is automatically resized.
355
+ * @param {?number} [width=null] - The width of the internal render target. If no width is applied, the render target is automatically resized.
294
356
  * @param {?number} [height=null] - The height of the internal render target.
295
- * @param {Object} [options={type:HalfFloatType}] - The options for the internal render target.
357
+ * @param {Object} [options={}] - The options for the internal render target.
358
+ * @param {number} [options.type=HalfFloatType] - The texture type.
359
+ * @param {boolean} [options.autoUpdate=true] - Whether the texture should automatically be updated or not.
360
+ * @param {number} [options.resolutionScale=1] - The resolution scale.
296
361
  * @returns {RTTNode}
297
362
  */
298
363
  export const convertToTexture = ( node, ...params ) => {
@@ -185,10 +185,14 @@ class ReflectorNode extends TextureNode {
185
185
  }
186
186
 
187
187
  /**
188
- * Holds the actual implementation of the reflector.
188
+ * Holds the actual implementation of the reflector (virtual cameras, render
189
+ * targets and the reflection rendering).
189
190
  *
190
- * TODO: Explain why `ReflectorBaseNode`. Originally the entire logic was implemented
191
- * in `ReflectorNode`, see #29619.
191
+ * This logic is kept separate from {@link ReflectorNode} because the latter is
192
+ * a {@link TextureNode} representing a single texture view. A reflector can be
193
+ * sampled by multiple texture nodes at once - e.g. one for color and one for
194
+ * depth (see {@link ReflectorNode#getDepthNode}) - which all reference the same
195
+ * base node so the reflection is rendered only once.
192
196
  *
193
197
  * @private
194
198
  * @augments Node
@@ -409,7 +413,7 @@ class ReflectorBaseNode extends Node {
409
413
 
410
414
  if ( renderTarget === undefined ) {
411
415
 
412
- renderTarget = new RenderTarget( 0, 0, { type: HalfFloatType, samples: this.samples } );
416
+ renderTarget = new RenderTarget( 1, 1, { type: HalfFloatType, samples: this.samples } );
413
417
 
414
418
  if ( this.generateMipmaps === true ) {
415
419
 
@@ -1,6 +1,7 @@
1
1
  import TempNode from '../core/TempNode.js';
2
2
  import { nodeProxy, vec4, mat2, mat4 } from '../tsl/TSLBase.js';
3
3
  import { cos, sin } from '../math/MathNode.js';
4
+ import { hashString } from '../core/NodeUtils.js';
4
5
 
5
6
  /**
6
7
  * Applies a rotation to the given position node.
@@ -21,8 +22,9 @@ class RotateNode extends TempNode {
21
22
  * @param {Node} positionNode - The position node.
22
23
  * @param {Node} rotationNode - Represents the rotation that is applied to the position node. Depending
23
24
  * on whether the position data are 2D or 3D, the rotation is expressed a single float value or an Euler value.
25
+ * @param {string} [order='XYZ'] - The Euler rotation order. Only used for 3D rotation.
24
26
  */
25
- constructor( positionNode, rotationNode ) {
27
+ constructor( positionNode, rotationNode, order = 'XYZ' ) {
26
28
 
27
29
  super();
28
30
 
@@ -34,13 +36,59 @@ class RotateNode extends TempNode {
34
36
  this.positionNode = positionNode;
35
37
 
36
38
  /**
37
- * Represents the rotation that is applied to the position node.
38
- * Depending on whether the position data are 2D or 3D, the rotation is expressed a single float value or an Euler value.
39
+ * Represents the rotation that is applied to the position node.
40
+ * Depending on whether the position data are 2D or 3D, the rotation is expressed a single float value or an Euler value.
39
41
  *
40
42
  * @type {Node}
41
43
  */
42
44
  this.rotationNode = rotationNode;
43
45
 
46
+ /**
47
+ * The Euler rotation order.
48
+ *
49
+ * @private
50
+ * @type {string}
51
+ * @default 'XYZ'
52
+ */
53
+ this._order = order;
54
+
55
+ }
56
+
57
+ /**
58
+ * Overwrites the default `customCacheKey()` implementation by including the
59
+ * Euler order into the cache key.
60
+ *
61
+ * @return {number} The hash.
62
+ */
63
+ customCacheKey() {
64
+
65
+ return hashString( this._order );
66
+
67
+ }
68
+
69
+ /**
70
+ * Sets the Euler rotation order.
71
+ *
72
+ * @param {string} value - The Euler rotation order.
73
+ * @return {RotateNode} A reference to this node.
74
+ */
75
+ setOrder( value ) {
76
+
77
+ this._order = value;
78
+
79
+ return this;
80
+
81
+ }
82
+
83
+ /**
84
+ * Gets the Euler rotation order.
85
+ *
86
+ * @return {string} The Euler rotation order.
87
+ */
88
+ getOrder() {
89
+
90
+ return this._order;
91
+
44
92
  }
45
93
 
46
94
  /**
@@ -76,16 +124,44 @@ class RotateNode extends TempNode {
76
124
  } else {
77
125
 
78
126
  const rotation = rotationNode;
79
- const rotationXMatrix = mat4( vec4( 1.0, 0.0, 0.0, 0.0 ), vec4( 0.0, cos( rotation.x ), sin( rotation.x ).negate(), 0.0 ), vec4( 0.0, sin( rotation.x ), cos( rotation.x ), 0.0 ), vec4( 0.0, 0.0, 0.0, 1.0 ) );
80
- const rotationYMatrix = mat4( vec4( cos( rotation.y ), 0.0, sin( rotation.y ), 0.0 ), vec4( 0.0, 1.0, 0.0, 0.0 ), vec4( sin( rotation.y ).negate(), 0.0, cos( rotation.y ), 0.0 ), vec4( 0.0, 0.0, 0.0, 1.0 ) );
81
- const rotationZMatrix = mat4( vec4( cos( rotation.z ), sin( rotation.z ).negate(), 0.0, 0.0 ), vec4( sin( rotation.z ), cos( rotation.z ), 0.0, 0.0 ), vec4( 0.0, 0.0, 1.0, 0.0 ), vec4( 0.0, 0.0, 0.0, 1.0 ) );
127
+ const order = this._order;
128
+
129
+ const rotationXMatrix = mat4( vec4( 1.0, 0.0, 0.0, 0.0 ), vec4( 0.0, cos( rotation.x ), sin( rotation.x ), 0.0 ), vec4( 0.0, sin( rotation.x ).negate(), cos( rotation.x ), 0.0 ), vec4( 0.0, 0.0, 0.0, 1.0 ) );
130
+ const rotationYMatrix = mat4( vec4( cos( rotation.y ), 0.0, sin( rotation.y ).negate(), 0.0 ), vec4( 0.0, 1.0, 0.0, 0.0 ), vec4( sin( rotation.y ), 0.0, cos( rotation.y ), 0.0 ), vec4( 0.0, 0.0, 0.0, 1.0 ) );
131
+ const rotationZMatrix = mat4( vec4( cos( rotation.z ), sin( rotation.z ), 0.0, 0.0 ), vec4( sin( rotation.z ).negate(), cos( rotation.z ), 0.0, 0.0 ), vec4( 0.0, 0.0, 1.0, 0.0 ), vec4( 0.0, 0.0, 0.0, 1.0 ) );
132
+
133
+ const matrixMap = {
134
+ 'X': rotationXMatrix,
135
+ 'Y': rotationYMatrix,
136
+ 'Z': rotationZMatrix
137
+ };
82
138
 
83
- return rotationXMatrix.mul( rotationYMatrix ).mul( rotationZMatrix ).mul( vec4( positionNode, 1.0 ) ).xyz;
139
+ const matrixChain = matrixMap[ order.charAt( 0 ) ]
140
+ .mul( matrixMap[ order.charAt( 1 ) ] )
141
+ .mul( matrixMap[ order.charAt( 2 ) ] );
142
+
143
+ return matrixChain.mul( vec4( positionNode, 1.0 ) ).xyz;
84
144
 
85
145
  }
86
146
 
87
147
  }
88
148
 
149
+ serialize( data ) {
150
+
151
+ super.serialize( data );
152
+
153
+ data.order = this._order;
154
+
155
+ }
156
+
157
+ deserialize( data ) {
158
+
159
+ super.deserialize( data );
160
+
161
+ this._order = data.order;
162
+
163
+ }
164
+
89
165
  }
90
166
 
91
167
  export default RotateNode;
@@ -98,6 +174,7 @@ export default RotateNode;
98
174
  * @param {Node} positionNode - The position node.
99
175
  * @param {Node} rotationNode - Represents the rotation that is applied to the position node. Depending
100
176
  * on whether the position data are 2D or 3D, the rotation is expressed a single float value or an Euler value.
177
+ * @param {string} [order='XYZ'] - The Euler rotation order. Only used for 3D rotation.
101
178
  * @returns {RotateNode}
102
179
  */
103
- export const rotate = /*@__PURE__*/ nodeProxy( RotateNode ).setParameterLength( 2 );
180
+ export const rotate = /*@__PURE__*/ nodeProxy( RotateNode ).setParameterLength( 2, 3 );
@@ -1,7 +1,7 @@
1
1
  import { modelWorldMatrix } from '../accessors/ModelNode.js';
2
- import { cameraViewMatrix, cameraProjectionMatrix } from '../accessors/Camera.js';
3
- import { positionLocal } from '../accessors/Position.js';
4
- import { Fn, defined } from '../tsl/TSLBase.js';
2
+ import { cameraViewMatrix, cameraProjectionMatrix, cameraPosition } from '../accessors/Camera.js';
3
+ import { positionGeometry, positionWorld } from '../accessors/Position.js';
4
+ import { Fn, defined, nodeObject, vec3, vec4 } from '../tsl/TSLBase.js';
5
5
 
6
6
  /**
7
7
  * This can be used to achieve a billboarding behavior for flat meshes. That means they are
@@ -14,50 +14,85 @@ import { Fn, defined } from '../tsl/TSLBase.js';
14
14
  * @tsl
15
15
  * @function
16
16
  * @param {Object} config - The configuration object.
17
- * @param {?Node<vec3>} [config.position=null] - Can be used to define the vertex positions in world space.
17
+ * @param {?Node<vec3>} [config.position=null] - Can be used to define the billboard center position directly.
18
+ * When null, the center is derived automatically from `positionWorld`.
18
19
  * @param {boolean} [config.horizontal=true] - Whether to follow the camera rotation horizontally or not.
19
20
  * @param {boolean} [config.vertical=false] - Whether to follow the camera rotation vertically or not.
21
+ * @param {boolean} [config.horizontalRotation=false] - Whether to rotate around the Y axis to face the camera.
20
22
  * @return {Node<vec3>} The updated vertex position in clip space.
21
23
  */
22
- export const billboarding = /*@__PURE__*/ Fn( ( { position = null, horizontal = true, vertical = false } ) => {
24
+ export const billboarding = /*@__PURE__*/ Fn( ( { position = null, horizontal = true, vertical = false, horizontalRotation = false } ) => {
23
25
 
24
- let worldMatrix;
26
+ let center;
25
27
 
26
28
  if ( position !== null ) {
27
29
 
28
- worldMatrix = modelWorldMatrix.toVar();
29
- worldMatrix[ 3 ][ 0 ] = position.x;
30
- worldMatrix[ 3 ][ 1 ] = position.y;
31
- worldMatrix[ 3 ][ 2 ] = position.z;
30
+ center = nodeObject( position );
32
31
 
33
32
  } else {
34
33
 
35
- worldMatrix = modelWorldMatrix;
34
+ center = positionWorld.sub( modelWorldMatrix.mul( vec4( positionGeometry, 0 ) ).xyz );
36
35
 
37
36
  }
38
37
 
38
+ const worldMatrix = modelWorldMatrix.toVar();
39
+ worldMatrix[ 3 ][ 0 ] = center.x;
40
+ worldMatrix[ 3 ][ 1 ] = center.y;
41
+ worldMatrix[ 3 ][ 2 ] = center.z;
42
+
39
43
  const modelViewMatrix = cameraViewMatrix.mul( worldMatrix );
40
44
 
41
- if ( defined( horizontal ) ) {
45
+ const scaleX = modelWorldMatrix[ 0 ].length();
46
+ const scaleY = modelWorldMatrix[ 1 ].length();
47
+ const scaleZ = modelWorldMatrix[ 2 ].length();
48
+
49
+ let right, up, forward;
50
+
51
+ if ( defined( horizontalRotation ) ) {
52
+
53
+ const worldPosition = worldMatrix[ 3 ].xyz;
54
+ const look = cameraPosition.sub( worldPosition );
55
+ const lookXZ = vec3( look.x, 0, look.z ).normalize();
56
+
57
+ const right_w = vec3( lookXZ.z, 0, lookXZ.x.negate() );
58
+
59
+ right = cameraViewMatrix.mul( vec4( right_w, 0 ) ).xyz.mul( scaleX );
60
+ up = cameraViewMatrix[ 1 ].xyz.mul( scaleY );
61
+ forward = cameraViewMatrix.mul( vec4( lookXZ, 0 ) ).xyz.mul( scaleZ );
62
+
63
+ } else {
64
+
65
+ if ( defined( horizontal ) ) right = vec3( scaleX, 0, 0 );
66
+ if ( defined( vertical ) ) up = vec3( 0, scaleY, 0 );
67
+
68
+ forward = vec3( 0, 0, 1 );
69
+
70
+ }
71
+
72
+ if ( right ) {
42
73
 
43
- modelViewMatrix[ 0 ][ 0 ] = modelWorldMatrix[ 0 ].length();
44
- modelViewMatrix[ 0 ][ 1 ] = 0;
45
- modelViewMatrix[ 0 ][ 2 ] = 0;
74
+ modelViewMatrix[ 0 ][ 0 ] = right.x;
75
+ modelViewMatrix[ 0 ][ 1 ] = right.y;
76
+ modelViewMatrix[ 0 ][ 2 ] = right.z;
46
77
 
47
78
  }
48
79
 
49
- if ( defined( vertical ) ) {
80
+ if ( up ) {
50
81
 
51
- modelViewMatrix[ 1 ][ 0 ] = 0;
52
- modelViewMatrix[ 1 ][ 1 ] = modelWorldMatrix[ 1 ].length();
53
- modelViewMatrix[ 1 ][ 2 ] = 0;
82
+ modelViewMatrix[ 1 ][ 0 ] = up.x;
83
+ modelViewMatrix[ 1 ][ 1 ] = up.y;
84
+ modelViewMatrix[ 1 ][ 2 ] = up.z;
54
85
 
55
86
  }
56
87
 
57
- modelViewMatrix[ 2 ][ 0 ] = 0;
58
- modelViewMatrix[ 2 ][ 1 ] = 0;
59
- modelViewMatrix[ 2 ][ 2 ] = 1;
88
+ if ( forward ) {
89
+
90
+ modelViewMatrix[ 2 ][ 0 ] = forward.x;
91
+ modelViewMatrix[ 2 ][ 1 ] = forward.y;
92
+ modelViewMatrix[ 2 ][ 2 ] = forward.z;
93
+
94
+ }
60
95
 
61
- return cameraProjectionMatrix.mul( modelViewMatrix ).mul( positionLocal );
96
+ return cameraProjectionMatrix.mul( modelViewMatrix ).mul( positionGeometry );
62
97
 
63
98
  } );
@@ -272,6 +272,7 @@ class BatchedMesh extends Mesh {
272
272
  this._multiDrawCounts = new Int32Array( maxInstanceCount );
273
273
  this._multiDrawStarts = new Int32Array( maxInstanceCount );
274
274
  this._multiDrawCount = 0;
275
+ this._multiDrawBytesPerElement = 1;
275
276
 
276
277
  // Local matrix per geometry by using data texture
277
278
  this._matricesTexture = null;
@@ -1203,6 +1204,7 @@ class BatchedMesh extends Mesh {
1203
1204
  this.validateGeometryId( geometryId );
1204
1205
 
1205
1206
  this._instanceInfo[ instanceId ].geometryIndex = geometryId;
1207
+ this._visibilityChanged = true;
1206
1208
 
1207
1209
  return this;
1208
1210
 
@@ -1473,6 +1475,7 @@ class BatchedMesh extends Mesh {
1473
1475
  this._geometryInitialized = source._geometryInitialized;
1474
1476
  this._multiDrawCounts = source._multiDrawCounts.slice();
1475
1477
  this._multiDrawStarts = source._multiDrawStarts.slice();
1478
+ this._multiDrawBytesPerElement = source._multiDrawBytesPerElement;
1476
1479
 
1477
1480
  this._indirectTexture = source._indirectTexture.clone();
1478
1481
  this._indirectTexture.image.data = this._indirectTexture.image.data.slice();
@@ -1497,6 +1500,8 @@ class BatchedMesh extends Mesh {
1497
1500
  */
1498
1501
  dispose() {
1499
1502
 
1503
+ super.dispose();
1504
+
1500
1505
  // Assuming the geometry is not shared with other meshes
1501
1506
  this.geometry.dispose();
1502
1507
 
@@ -1675,6 +1680,7 @@ class BatchedMesh extends Mesh {
1675
1680
 
1676
1681
  indirectTexture.needsUpdate = true;
1677
1682
  this._multiDrawCount = multiDrawCount;
1683
+ this._multiDrawBytesPerElement = bytesPerElement;
1678
1684
  this._visibilityChanged = false;
1679
1685
 
1680
1686
  }
@@ -395,7 +395,7 @@ class InstancedMesh extends Mesh {
395
395
  */
396
396
  dispose() {
397
397
 
398
- this.dispatchEvent( { type: 'dispose' } );
398
+ super.dispose();
399
399
 
400
400
  if ( this.morphTexture !== null ) {
401
401
 
@@ -301,7 +301,7 @@ class LOD extends Object3D {
301
301
 
302
302
  const data = super.toJSON( meta );
303
303
 
304
- if ( this.autoUpdate === false ) data.object.autoUpdate = false;
304
+ data.object.autoUpdate = this.autoUpdate;
305
305
 
306
306
  data.object.levels = [];
307
307
 
@@ -151,6 +151,18 @@ class Line extends Object3D {
151
151
 
152
152
  }
153
153
 
154
+ /**
155
+ * Returns `true` if this line intersects the given frustum.
156
+ *
157
+ * @param {Frustum|FrustumArray} frustum - The frustum to test.
158
+ * @return {boolean} Whether this line intersects the given frustum or not.
159
+ */
160
+ intersectsFrustum( frustum ) {
161
+
162
+ return frustum.intersectsObject( this );
163
+
164
+ }
165
+
154
166
  /**
155
167
  * Computes intersection points between a casted ray and this line.
156
168
  *
@@ -217,6 +217,18 @@ class Mesh extends Object3D {
217
217
 
218
218
  }
219
219
 
220
+ /**
221
+ * Returns `true` if this mesh intersects the given frustum.
222
+ *
223
+ * @param {Frustum|FrustumArray} frustum - The frustum to test.
224
+ * @return {boolean} Whether this mesh intersects the given frustum or not.
225
+ */
226
+ intersectsFrustum( frustum ) {
227
+
228
+ return frustum.intersectsObject( this );
229
+
230
+ }
231
+
220
232
  /**
221
233
  * Computes intersection points between a casted ray and this line.
222
234
  *
@@ -89,6 +89,18 @@ class Points extends Object3D {
89
89
 
90
90
  }
91
91
 
92
+ /**
93
+ * Returns `true` if this point cloud intersects the given frustum.
94
+ *
95
+ * @param {Frustum|FrustumArray} frustum - The frustum to test.
96
+ * @return {boolean} Whether this point cloud intersects the given frustum or not.
97
+ */
98
+ intersectsFrustum( frustum ) {
99
+
100
+ return frustum.intersectsObject( this );
101
+
102
+ }
103
+
92
104
  /**
93
105
  * Computes intersection points between a casted ray and this point cloud.
94
106
  *
@@ -120,6 +120,18 @@ class Sprite extends Object3D {
120
120
 
121
121
  }
122
122
 
123
+ /**
124
+ * Returns `true` if this sprite intersects the given frustum.
125
+ *
126
+ * @param {Frustum|FrustumArray} frustum - The frustum to test.
127
+ * @return {boolean} Whether this sprite intersects the given frustum or not.
128
+ */
129
+ intersectsFrustum( frustum ) {
130
+
131
+ return frustum.intersectsSprite( this );
132
+
133
+ }
134
+
123
135
  /**
124
136
  * Computes intersection points between a casted ray and this sprite.
125
137
  *