super-three 0.181.0 → 0.185.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 (693) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +3 -4
  3. package/build/three.cjs +21332 -19201
  4. package/build/three.core.js +20908 -19853
  5. package/build/three.core.min.js +2 -2
  6. package/build/three.module.js +1947 -862
  7. package/build/three.module.min.js +2 -2
  8. package/build/three.tsl.js +37 -16
  9. package/build/three.tsl.min.js +2 -2
  10. package/build/three.webgpu.js +33628 -25197
  11. package/build/three.webgpu.min.js +2 -2
  12. package/build/three.webgpu.nodes.js +33394 -25000
  13. package/build/three.webgpu.nodes.min.js +2 -2
  14. package/examples/jsm/Addons.js +14 -3
  15. package/examples/jsm/animation/CCDIKSolver.js +7 -3
  16. package/examples/jsm/controls/ArcballControls.js +13 -6
  17. package/examples/jsm/controls/DragControls.js +2 -2
  18. package/examples/jsm/controls/FirstPersonControls.js +127 -86
  19. package/examples/jsm/controls/FlyControls.js +4 -0
  20. package/examples/jsm/controls/MapControls.js +55 -1
  21. package/examples/jsm/controls/OrbitControls.js +111 -8
  22. package/examples/jsm/controls/TrackballControls.js +8 -8
  23. package/examples/jsm/controls/TransformControls.js +102 -17
  24. package/examples/jsm/csm/CSM.js +2 -1
  25. package/examples/jsm/csm/CSMFrustum.js +31 -6
  26. package/examples/jsm/csm/CSMShadowNode.js +10 -3
  27. package/examples/jsm/effects/AnaglyphEffect.js +102 -7
  28. package/examples/jsm/effects/AsciiEffect.js +14 -1
  29. package/examples/jsm/environments/ColorEnvironment.js +59 -0
  30. package/examples/jsm/environments/RoomEnvironment.js +3 -0
  31. package/examples/jsm/exporters/DRACOExporter.js +27 -6
  32. package/examples/jsm/exporters/EXRExporter.js +1 -1
  33. package/examples/jsm/exporters/GLTFExporter.js +266 -21
  34. package/examples/jsm/exporters/PLYExporter.js +286 -73
  35. package/examples/jsm/exporters/USDZExporter.js +353 -99
  36. package/examples/jsm/generators/CityGenerator.js +346 -0
  37. package/examples/jsm/generators/ForestGenerator.js +347 -0
  38. package/examples/jsm/generators/TerrainGenerator.js +504 -0
  39. package/examples/jsm/generators/TreeGenerator.js +377 -0
  40. package/examples/jsm/generators/city/SidewalkGenerator.js +253 -0
  41. package/examples/jsm/generators/city/SkyscraperGenerator.js +1357 -0
  42. package/examples/jsm/geometries/DecalGeometry.js +1 -1
  43. package/examples/jsm/geometries/LoftGeometry.js +355 -0
  44. package/examples/jsm/geometries/TextGeometry.js +18 -0
  45. package/examples/jsm/helpers/AnimationPathHelper.js +302 -0
  46. package/examples/jsm/helpers/LightProbeGridHelper.js +221 -0
  47. package/examples/jsm/helpers/LightProbeHelper.js +5 -4
  48. package/examples/jsm/helpers/LightProbeHelperGPU.js +1 -1
  49. package/examples/jsm/helpers/TextureHelperGPU.js +1 -1
  50. package/examples/jsm/helpers/ViewHelper.js +83 -14
  51. package/examples/jsm/inspector/Extension.js +13 -0
  52. package/examples/jsm/inspector/Inspector.js +244 -91
  53. package/examples/jsm/inspector/RendererInspector.js +165 -39
  54. package/examples/jsm/inspector/extensions/tsl-graph/TSLGraphEditor.js +916 -0
  55. package/examples/jsm/inspector/extensions/tsl-graph/TSLGraphLoader.js +281 -0
  56. package/examples/jsm/inspector/tabs/Console.js +241 -25
  57. package/examples/jsm/inspector/tabs/Memory.js +136 -0
  58. package/examples/jsm/inspector/tabs/Parameters.js +115 -7
  59. package/examples/jsm/inspector/tabs/Performance.js +24 -9
  60. package/examples/jsm/inspector/tabs/Settings.js +306 -0
  61. package/examples/jsm/inspector/tabs/Timeline.js +1696 -0
  62. package/examples/jsm/inspector/tabs/Viewer.js +723 -9
  63. package/examples/jsm/inspector/ui/Graph.js +162 -25
  64. package/examples/jsm/inspector/ui/Item.js +92 -13
  65. package/examples/jsm/inspector/ui/List.js +2 -2
  66. package/examples/jsm/inspector/ui/Profiler.js +1991 -44
  67. package/examples/jsm/inspector/ui/Style.js +1943 -543
  68. package/examples/jsm/inspector/ui/Tab.js +226 -5
  69. package/examples/jsm/inspector/ui/Values.js +126 -8
  70. package/examples/jsm/inspector/ui/utils.js +143 -10
  71. package/examples/jsm/interaction/InteractionManager.js +226 -0
  72. package/examples/jsm/libs/basis/README.md +0 -1
  73. package/examples/jsm/libs/demuxer_mp4.js +3 -3
  74. package/examples/jsm/libs/draco/README.md +0 -1
  75. package/examples/jsm/libs/meshopt_clusterizer.module.js +421 -0
  76. package/examples/jsm/libs/meshopt_decoder.module.js +9 -8
  77. package/examples/jsm/libs/meshopt_simplifier.module.js +627 -0
  78. package/examples/jsm/libs/mikktspace.module.js +34 -9
  79. package/examples/jsm/lighting/ClusteredLighting.js +55 -0
  80. package/examples/jsm/lighting/DynamicLighting.js +82 -0
  81. package/examples/jsm/lighting/LightProbeGrid.js +681 -0
  82. package/examples/jsm/lines/LineMaterial.js +45 -16
  83. package/examples/jsm/lines/LineSegments2.js +8 -0
  84. package/examples/jsm/lines/webgpu/LineSegments2.js +8 -0
  85. package/examples/jsm/loaders/3DMLoader.js +6 -5
  86. package/examples/jsm/loaders/3MFLoader.js +2 -2
  87. package/examples/jsm/loaders/AMFLoader.js +2 -2
  88. package/examples/jsm/loaders/ColladaLoader.js +24 -4026
  89. package/examples/jsm/loaders/DRACOLoader.js +51 -18
  90. package/examples/jsm/loaders/EXRLoader.js +701 -90
  91. package/examples/jsm/loaders/FBXLoader.js +235 -37
  92. package/examples/jsm/loaders/GCodeLoader.js +34 -8
  93. package/examples/jsm/loaders/GLTFLoader.js +146 -178
  94. package/examples/jsm/loaders/HDRLoader.js +7 -30
  95. package/examples/jsm/loaders/KMZLoader.js +5 -5
  96. package/examples/jsm/loaders/KTX2Loader.js +58 -17
  97. package/examples/jsm/loaders/LDrawLoader.js +49 -58
  98. package/examples/jsm/loaders/LUT3dlLoader.js +2 -2
  99. package/examples/jsm/loaders/LUTCubeLoader.js +2 -2
  100. package/examples/jsm/loaders/LWOLoader.js +11 -39
  101. package/examples/jsm/loaders/LottieLoader.js +1 -1
  102. package/examples/jsm/loaders/MaterialXLoader.js +31 -9
  103. package/examples/jsm/loaders/NRRDLoader.js +5 -5
  104. package/examples/jsm/loaders/PCDLoader.js +11 -9
  105. package/examples/jsm/loaders/PLYLoader.js +218 -55
  106. package/examples/jsm/loaders/SVGLoader.js +549 -497
  107. package/examples/jsm/loaders/TDSLoader.js +0 -2
  108. package/examples/jsm/loaders/TGALoader.js +0 -2
  109. package/examples/jsm/loaders/TTFLoader.js +1 -1
  110. package/examples/jsm/loaders/USDLoader.js +127 -43
  111. package/examples/jsm/loaders/UltraHDRLoader.js +285 -160
  112. package/examples/jsm/loaders/VOXLoader.js +660 -117
  113. package/examples/jsm/loaders/VRMLLoader.js +80 -3
  114. package/examples/jsm/loaders/VTKLoader.js +42 -25
  115. package/examples/jsm/loaders/collada/ColladaComposer.js +3044 -0
  116. package/examples/jsm/loaders/collada/ColladaParser.js +1977 -0
  117. package/examples/jsm/loaders/usd/USDAParser.js +504 -344
  118. package/examples/jsm/loaders/usd/USDCParser.js +1867 -6
  119. package/examples/jsm/loaders/usd/USDComposer.js +4627 -0
  120. package/examples/jsm/materials/LDrawConditionalLineNodeMaterial.js +2 -2
  121. package/examples/jsm/materials/WoodNodeMaterial.js +11 -11
  122. package/examples/jsm/math/Octree.js +131 -1
  123. package/examples/jsm/misc/GPUComputationRenderer.js +2 -0
  124. package/examples/jsm/misc/RollerCoaster.js +42 -4
  125. package/examples/jsm/misc/TileCreasedNormalsPlugin.js +270 -0
  126. package/examples/jsm/misc/Volume.js +2 -3
  127. package/examples/jsm/misc/VolumeSlice.js +0 -1
  128. package/examples/jsm/modifiers/TessellateModifier.js +1 -1
  129. package/examples/jsm/objects/GroundedSkybox.js +1 -1
  130. package/examples/jsm/objects/LensflareMesh.js +1 -1
  131. package/examples/jsm/objects/Reflector.js +72 -25
  132. package/examples/jsm/objects/Sky.js +90 -6
  133. package/examples/jsm/objects/SkyMesh.js +150 -16
  134. package/examples/jsm/objects/Water.js +4 -3
  135. package/examples/jsm/objects/Water2.js +5 -3
  136. package/examples/jsm/objects/Water2Mesh.js +1 -1
  137. package/examples/jsm/objects/WaterMesh.js +5 -7
  138. package/examples/jsm/physics/AmmoPhysics.js +27 -15
  139. package/examples/jsm/physics/JoltPhysics.js +10 -6
  140. package/examples/jsm/physics/RapierPhysics.js +36 -7
  141. package/examples/jsm/postprocessing/EffectComposer.js +7 -5
  142. package/examples/jsm/postprocessing/OutputPass.js +9 -0
  143. package/examples/jsm/postprocessing/RenderPass.js +10 -0
  144. package/examples/jsm/postprocessing/RenderTransitionPass.js +1 -1
  145. package/examples/jsm/postprocessing/UnrealBloomPass.js +48 -18
  146. package/examples/jsm/renderers/CSS3DRenderer.js +1 -1
  147. package/examples/jsm/renderers/Projector.js +246 -28
  148. package/examples/jsm/renderers/SVGRenderer.js +174 -60
  149. package/examples/jsm/shaders/GTAOShader.js +19 -6
  150. package/examples/jsm/shaders/HalftoneShader.js +12 -1
  151. package/examples/jsm/shaders/PoissonDenoiseShader.js +6 -2
  152. package/examples/jsm/shaders/SAOShader.js +17 -4
  153. package/examples/jsm/shaders/SSAOShader.js +11 -1
  154. package/examples/jsm/shaders/SSRShader.js +6 -5
  155. package/examples/jsm/shaders/UnpackDepthRGBAShader.js +2 -4
  156. package/examples/jsm/shaders/VignetteShader.js +1 -1
  157. package/examples/jsm/shaders/VolumeShader.js +31 -44
  158. package/examples/jsm/transpiler/AST.js +44 -0
  159. package/examples/jsm/transpiler/GLSLDecoder.js +65 -8
  160. package/examples/jsm/transpiler/Linker.js +1 -1
  161. package/examples/jsm/transpiler/ShaderToyDecoder.js +2 -0
  162. package/examples/jsm/transpiler/TSLEncoder.js +46 -3
  163. package/examples/jsm/transpiler/TranspilerUtils.js +3 -3
  164. package/examples/jsm/transpiler/WGSLEncoder.js +27 -0
  165. package/examples/jsm/tsl/WebGLNodesHandler.js +605 -0
  166. package/examples/jsm/tsl/display/AfterImageNode.js +11 -1
  167. package/examples/jsm/tsl/display/AnaglyphPassNode.js +458 -16
  168. package/examples/jsm/tsl/display/BilateralBlurNode.js +374 -0
  169. package/examples/jsm/tsl/display/BloomNode.js +75 -25
  170. package/examples/jsm/tsl/display/CRT.js +150 -0
  171. package/examples/jsm/tsl/display/ChromaticAberrationNode.js +3 -36
  172. package/examples/jsm/tsl/display/DenoiseNode.js +1 -1
  173. package/examples/jsm/tsl/display/DepthOfFieldNode.js +3 -3
  174. package/examples/jsm/tsl/display/DotScreenNode.js +1 -1
  175. package/examples/jsm/tsl/display/FSR1Node.js +477 -0
  176. package/examples/jsm/tsl/display/FXAANode.js +13 -14
  177. package/examples/jsm/tsl/display/GTAONode.js +40 -17
  178. package/examples/jsm/tsl/display/GaussianBlurNode.js +21 -2
  179. package/examples/jsm/tsl/display/GodraysNode.js +615 -0
  180. package/examples/jsm/tsl/display/ImportanceSampledEnvironment.js +560 -0
  181. package/examples/jsm/tsl/display/LensflareNode.js +1 -1
  182. package/examples/jsm/tsl/display/Lut3DNode.js +1 -1
  183. package/examples/jsm/tsl/display/OutlineNode.js +69 -19
  184. package/examples/jsm/tsl/display/ParallaxBarrierPassNode.js +2 -2
  185. package/examples/jsm/tsl/display/PixelationPassNode.js +9 -8
  186. package/examples/jsm/tsl/display/RGBShiftNode.js +2 -2
  187. package/examples/jsm/tsl/display/RecurrentDenoiseNode.js +912 -0
  188. package/examples/jsm/tsl/display/RetroPassNode.js +263 -0
  189. package/examples/jsm/tsl/display/SMAANode.js +2 -2
  190. package/examples/jsm/tsl/display/SSAAPassNode.js +15 -27
  191. package/examples/jsm/tsl/display/SSGINode.js +96 -62
  192. package/examples/jsm/tsl/display/SSRNode.js +831 -134
  193. package/examples/jsm/tsl/display/SSSNode.js +8 -6
  194. package/examples/jsm/tsl/display/Shape.js +29 -0
  195. package/examples/jsm/tsl/display/SharpenNode.js +283 -0
  196. package/examples/jsm/tsl/display/SobelOperatorNode.js +2 -2
  197. package/examples/jsm/tsl/display/StereoCompositePassNode.js +8 -1
  198. package/examples/jsm/tsl/display/StereoPassNode.js +1 -2
  199. package/examples/jsm/tsl/display/TAAUNode.js +835 -0
  200. package/examples/jsm/tsl/display/TRAANode.js +315 -126
  201. package/examples/jsm/tsl/display/TemporalReprojectNode.js +1023 -0
  202. package/examples/jsm/tsl/display/TransitionNode.js +1 -1
  203. package/examples/jsm/tsl/display/depthAwareBlend.js +80 -0
  204. package/examples/jsm/tsl/display/radialBlur.js +68 -0
  205. package/examples/jsm/tsl/lighting/ClusteredLightsNode.js +622 -0
  206. package/examples/jsm/tsl/lighting/DynamicLightsNode.js +300 -0
  207. package/examples/jsm/tsl/lighting/data/AmbientLightDataNode.js +61 -0
  208. package/examples/jsm/tsl/lighting/data/DirectionalLightDataNode.js +111 -0
  209. package/examples/jsm/tsl/lighting/data/HemisphereLightDataNode.js +99 -0
  210. package/examples/jsm/tsl/lighting/data/PointLightDataNode.js +134 -0
  211. package/examples/jsm/tsl/lighting/data/SpotLightDataNode.js +161 -0
  212. package/examples/jsm/tsl/math/Bayer.js +53 -3
  213. package/examples/jsm/tsl/math/curlNoise.js +107 -0
  214. package/examples/jsm/tsl/shadows/TileShadowNode.js +1 -1
  215. package/examples/jsm/tsl/shadows/TileShadowNodeHelper.js +3 -3
  216. package/examples/jsm/tsl/utils/GroundedSkybox.js +62 -0
  217. package/examples/jsm/tsl/utils/RNoise.js +51 -0
  218. package/examples/jsm/tsl/utils/SpecularHelpers.js +325 -0
  219. package/examples/jsm/utils/BufferGeometryUtils.js +128 -62
  220. package/examples/jsm/utils/ColorUtils.js +76 -0
  221. package/examples/jsm/utils/GeometryCompressionUtils.js +1 -1
  222. package/examples/jsm/utils/LDrawUtils.js +1 -1
  223. package/examples/jsm/utils/SceneOptimizer.js +1 -1
  224. package/examples/jsm/utils/ShadowMapViewer.js +24 -10
  225. package/examples/jsm/utils/ShadowMapViewerGPU.js +1 -1
  226. package/examples/jsm/utils/SkeletonUtils.js +14 -8
  227. package/examples/jsm/utils/WebGPUTextureUtils.js +1 -1
  228. package/examples/jsm/webxr/ARButton.js +1 -1
  229. package/examples/jsm/webxr/WebGLXRFallback.js +89 -0
  230. package/examples/jsm/webxr/XRControllerModelFactory.js +2 -2
  231. package/examples/jsm/webxr/XRHandMeshModel.js +36 -10
  232. package/examples/jsm/webxr/XRHandModelFactory.js +2 -1
  233. package/package.json +28 -34
  234. package/src/Three.Core.js +3 -1
  235. package/src/Three.TSL.js +35 -14
  236. package/src/Three.WebGPU.Nodes.js +5 -0
  237. package/src/Three.WebGPU.js +13 -0
  238. package/src/Three.js +1 -0
  239. package/src/animation/AnimationAction.js +18 -4
  240. package/src/animation/AnimationClip.js +0 -139
  241. package/src/animation/AnimationMixer.js +6 -0
  242. package/src/animation/AnimationUtils.js +1 -12
  243. package/src/animation/KeyframeTrack.js +47 -8
  244. package/src/animation/PropertyBinding.js +2 -2
  245. package/src/animation/PropertyMixer.js +4 -4
  246. package/src/animation/tracks/BooleanKeyframeTrack.js +1 -1
  247. package/src/animation/tracks/ColorKeyframeTrack.js +1 -1
  248. package/src/animation/tracks/NumberKeyframeTrack.js +1 -1
  249. package/src/animation/tracks/QuaternionKeyframeTrack.js +1 -1
  250. package/src/animation/tracks/StringKeyframeTrack.js +1 -1
  251. package/src/animation/tracks/VectorKeyframeTrack.js +1 -1
  252. package/src/audio/Audio.js +1 -1
  253. package/src/audio/AudioContext.js +2 -2
  254. package/src/audio/AudioListener.js +5 -3
  255. package/src/cameras/Camera.js +34 -4
  256. package/src/cameras/CubeCamera.js +20 -0
  257. package/src/cameras/StereoCamera.js +5 -2
  258. package/src/constants.js +90 -5
  259. package/src/core/BufferAttribute.js +13 -1
  260. package/src/core/BufferGeometry.js +43 -9
  261. package/src/core/Clock.js +7 -0
  262. package/src/core/Object3D.js +69 -11
  263. package/src/core/Raycaster.js +3 -3
  264. package/src/core/RenderTarget.js +19 -6
  265. package/src/extras/PMREMGenerator.js +13 -22
  266. package/src/extras/TextureUtils.js +6 -2
  267. package/src/extras/core/ShapePath.js +149 -160
  268. package/src/extras/curves/CatmullRomCurve3.js +3 -2
  269. package/src/geometries/ExtrudeGeometry.js +2 -2
  270. package/src/geometries/PolyhedronGeometry.js +1 -1
  271. package/src/geometries/SphereGeometry.js +8 -3
  272. package/src/geometries/TorusGeometry.js +8 -3
  273. package/src/helpers/CameraHelper.js +3 -0
  274. package/src/helpers/DirectionalLightHelper.js +6 -1
  275. package/src/helpers/HemisphereLightHelper.js +5 -0
  276. package/src/helpers/PointLightHelper.js +3 -25
  277. package/src/helpers/SpotLightHelper.js +4 -1
  278. package/src/lights/DirectionalLight.js +13 -0
  279. package/src/lights/HemisphereLight.js +10 -0
  280. package/src/lights/Light.js +1 -11
  281. package/src/lights/LightProbe.js +0 -15
  282. package/src/lights/LightShadow.js +15 -6
  283. package/src/lights/PointLight.js +15 -0
  284. package/src/lights/PointLightShadow.js +0 -86
  285. package/src/lights/SpotLight.js +22 -1
  286. package/src/lights/webgpu/IESSpotLight.js +2 -1
  287. package/src/loaders/AudioLoader.js +11 -1
  288. package/src/loaders/Cache.js +28 -0
  289. package/src/loaders/DataTextureLoader.js +75 -42
  290. package/src/loaders/FileLoader.js +2 -3
  291. package/src/loaders/ImageBitmapLoader.js +12 -9
  292. package/src/loaders/Loader.js +6 -0
  293. package/src/loaders/LoadingManager.js +5 -0
  294. package/src/loaders/MaterialLoader.js +37 -266
  295. package/src/loaders/ObjectLoader.js +48 -6
  296. package/src/loaders/nodes/NodeLoader.js +2 -2
  297. package/src/loaders/nodes/NodeObjectLoader.js +18 -0
  298. package/src/materials/LineBasicMaterial.js +4 -0
  299. package/src/materials/Material.js +198 -1
  300. package/src/materials/MeshBasicMaterial.js +24 -0
  301. package/src/materials/MeshDepthMaterial.js +10 -0
  302. package/src/materials/MeshDistanceMaterial.js +10 -0
  303. package/src/materials/MeshLambertMaterial.js +49 -1
  304. package/src/materials/MeshMatcapMaterial.js +25 -1
  305. package/src/materials/MeshNormalMaterial.js +9 -1
  306. package/src/materials/MeshPhongMaterial.js +49 -1
  307. package/src/materials/MeshPhysicalMaterial.js +38 -0
  308. package/src/materials/MeshStandardMaterial.js +42 -1
  309. package/src/materials/MeshToonMaterial.js +35 -2
  310. package/src/materials/PointsMaterial.js +7 -0
  311. package/src/materials/ShaderMaterial.js +106 -1
  312. package/src/materials/SpriteMaterial.js +7 -0
  313. package/src/materials/nodes/Line2NodeMaterial.js +380 -297
  314. package/src/materials/nodes/MeshBasicNodeMaterial.js +2 -2
  315. package/src/materials/nodes/MeshNormalNodeMaterial.js +2 -2
  316. package/src/materials/nodes/MeshPhongNodeMaterial.js +0 -9
  317. package/src/materials/nodes/MeshPhysicalNodeMaterial.js +3 -30
  318. package/src/materials/nodes/MeshSSSNodeMaterial.js +0 -13
  319. package/src/materials/nodes/MeshStandardNodeMaterial.js +5 -15
  320. package/src/materials/nodes/NodeMaterial.js +153 -89
  321. package/src/materials/nodes/SpriteNodeMaterial.js +0 -10
  322. package/src/materials/nodes/manager/NodeMaterialObserver.js +234 -100
  323. package/src/math/Box3.js +5 -0
  324. package/src/math/FrustumArray.js +103 -133
  325. package/src/math/Interpolant.js +1 -1
  326. package/src/math/Line3.js +6 -5
  327. package/src/math/MathUtils.js +12 -12
  328. package/src/math/Matrix2.js +13 -9
  329. package/src/math/Matrix3.js +24 -9
  330. package/src/math/Matrix4.js +112 -74
  331. package/src/math/Plane.js +4 -3
  332. package/src/math/Quaternion.js +3 -29
  333. package/src/math/Sphere.js +1 -1
  334. package/src/math/Triangle.js +1 -1
  335. package/src/math/Vector2.js +13 -9
  336. package/src/math/Vector3.js +17 -15
  337. package/src/math/Vector4.js +15 -11
  338. package/src/math/interpolants/BezierInterpolant.js +106 -0
  339. package/src/nodes/Nodes.js +86 -71
  340. package/src/nodes/TSL.js +15 -13
  341. package/src/nodes/accessors/Arrays.js +5 -5
  342. package/src/nodes/accessors/Batch.js +108 -0
  343. package/src/nodes/accessors/Bitangent.js +7 -7
  344. package/src/nodes/accessors/BufferAttributeNode.js +120 -17
  345. package/src/nodes/accessors/BufferNode.js +29 -2
  346. package/src/nodes/accessors/Camera.js +149 -28
  347. package/src/nodes/accessors/ClippingNode.js +5 -5
  348. package/src/nodes/accessors/CubeTextureNode.js +27 -2
  349. package/src/nodes/accessors/Instance.js +264 -0
  350. package/src/nodes/accessors/MaterialNode.js +27 -3
  351. package/src/nodes/accessors/MaterialProperties.js +6 -8
  352. package/src/nodes/accessors/MaterialReferenceNode.js +1 -2
  353. package/src/nodes/accessors/ModelNode.js +1 -1
  354. package/src/nodes/accessors/{MorphNode.js → Morph.js} +99 -112
  355. package/src/nodes/accessors/Normal.js +24 -24
  356. package/src/nodes/accessors/Object3DNode.js +1 -1
  357. package/src/nodes/accessors/Position.js +39 -3
  358. package/src/nodes/accessors/ReferenceBaseNode.js +6 -6
  359. package/src/nodes/accessors/ReferenceNode.js +9 -8
  360. package/src/nodes/accessors/ReflectVector.js +3 -3
  361. package/src/nodes/accessors/RendererReferenceNode.js +1 -2
  362. package/src/nodes/accessors/SceneProperties.js +47 -0
  363. package/src/nodes/accessors/Skinning.js +263 -0
  364. package/src/nodes/accessors/StorageBufferNode.js +16 -27
  365. package/src/nodes/accessors/StorageTexture3DNode.js +100 -0
  366. package/src/nodes/accessors/StorageTextureNode.js +74 -11
  367. package/src/nodes/accessors/Tangent.js +8 -18
  368. package/src/nodes/accessors/Texture3DNode.js +32 -35
  369. package/src/nodes/accessors/TextureNode.js +124 -25
  370. package/src/nodes/accessors/UniformArrayNode.js +6 -4
  371. package/src/nodes/accessors/UserDataNode.js +1 -2
  372. package/src/nodes/accessors/VertexColorNode.js +1 -2
  373. package/src/nodes/code/FunctionCallNode.js +1 -1
  374. package/src/nodes/code/FunctionNode.js +4 -19
  375. package/src/nodes/core/ArrayNode.js +21 -2
  376. package/src/nodes/core/AssignNode.js +3 -3
  377. package/src/nodes/core/AttributeNode.js +3 -3
  378. package/src/nodes/core/BypassNode.js +1 -1
  379. package/src/nodes/core/ContextNode.js +104 -5
  380. package/src/nodes/core/IndexNode.js +2 -1
  381. package/src/nodes/core/InputNode.js +1 -1
  382. package/src/nodes/core/InspectorNode.js +1 -1
  383. package/src/nodes/core/IsolateNode.js +1 -1
  384. package/src/nodes/core/MRTNode.js +55 -4
  385. package/src/nodes/core/Node.js +151 -17
  386. package/src/nodes/core/NodeBuilder.js +479 -101
  387. package/src/nodes/core/NodeError.js +28 -0
  388. package/src/nodes/core/NodeFrame.js +12 -4
  389. package/src/nodes/core/NodeUtils.js +20 -18
  390. package/src/nodes/core/OutputStructNode.js +13 -11
  391. package/src/nodes/core/OverrideContextNode.js +153 -0
  392. package/src/nodes/core/ParameterNode.js +4 -4
  393. package/src/nodes/core/PropertyNode.js +66 -4
  394. package/src/nodes/core/StackNode.js +91 -20
  395. package/src/nodes/core/StackTrace.js +139 -0
  396. package/src/nodes/core/StructNode.js +20 -8
  397. package/src/nodes/core/StructTypeNode.js +17 -23
  398. package/src/nodes/core/SubBuildNode.js +2 -2
  399. package/src/nodes/core/UniformGroupNode.js +36 -6
  400. package/src/nodes/core/UniformNode.js +21 -5
  401. package/src/nodes/core/VarNode.js +56 -23
  402. package/src/nodes/core/VaryingNode.js +14 -21
  403. package/src/nodes/display/BlendModes.js +1 -105
  404. package/src/nodes/display/BumpMapNode.js +6 -1
  405. package/src/nodes/display/ColorAdjustment.js +27 -9
  406. package/src/nodes/display/ColorSpaceNode.js +3 -3
  407. package/src/nodes/display/FrontFacingNode.js +38 -9
  408. package/src/nodes/display/NormalMapNode.js +41 -6
  409. package/src/nodes/display/PassNode.js +157 -56
  410. package/src/nodes/display/PremultiplyAlphaFunctions.js +39 -0
  411. package/src/nodes/display/RenderOutputNode.js +19 -10
  412. package/src/nodes/display/ScreenNode.js +4 -2
  413. package/src/nodes/display/ToneMappingNode.js +1 -1
  414. package/src/nodes/display/ToonOutlinePassNode.js +2 -2
  415. package/src/nodes/display/ViewportDepthNode.js +52 -4
  416. package/src/nodes/display/ViewportDepthTextureNode.js +11 -15
  417. package/src/nodes/display/ViewportTextureNode.js +39 -11
  418. package/src/nodes/fog/Fog.js +18 -35
  419. package/src/nodes/functions/BSDF/BRDF_GGX_Multiscatter.js +3 -3
  420. package/src/nodes/functions/BSDF/DFGLUT.js +56 -0
  421. package/src/nodes/functions/BSDF/EnvironmentBRDF.js +2 -2
  422. package/src/nodes/functions/BSDF/V_GGX_SmithCorrelated_Anisotropic.js +2 -2
  423. package/src/nodes/functions/PhysicalLightingModel.js +126 -45
  424. package/src/nodes/functions/VolumetricLightingModel.js +40 -7
  425. package/src/nodes/geometry/RangeNode.js +5 -3
  426. package/src/nodes/gpgpu/AtomicFunctionNode.js +1 -1
  427. package/src/nodes/gpgpu/BarrierNode.js +9 -0
  428. package/src/nodes/gpgpu/ComputeBuiltinNode.js +2 -3
  429. package/src/nodes/gpgpu/ComputeNode.js +74 -48
  430. package/src/nodes/gpgpu/SubgroupFunctionNode.js +2 -2
  431. package/src/nodes/gpgpu/WorkgroupInfoNode.js +5 -5
  432. package/src/nodes/lighting/AnalyticLightNode.js +53 -0
  433. package/src/nodes/lighting/EnvironmentNode.js +30 -5
  434. package/src/nodes/lighting/IESSpotLightNode.js +40 -2
  435. package/src/nodes/lighting/LightingContextNode.js +10 -2
  436. package/src/nodes/lighting/LightsNode.js +97 -65
  437. package/src/nodes/lighting/PointShadowNode.js +166 -148
  438. package/src/nodes/lighting/ShadowFilterNode.js +74 -117
  439. package/src/nodes/lighting/ShadowNode.js +149 -51
  440. package/src/nodes/materialx/lib/mx_noise.js +2 -2
  441. package/src/nodes/math/BitcastNode.js +1 -1
  442. package/src/nodes/math/BitcountNode.js +433 -0
  443. package/src/nodes/math/ConditionalNode.js +6 -6
  444. package/src/nodes/math/MathNode.js +115 -52
  445. package/src/nodes/math/OperatorNode.js +24 -23
  446. package/src/nodes/math/PackFloatNode.js +98 -0
  447. package/src/nodes/math/UnpackFloatNode.js +96 -0
  448. package/src/nodes/parsers/GLSLNodeFunction.js +1 -1
  449. package/src/nodes/pmrem/PMREMNode.js +34 -3
  450. package/src/nodes/pmrem/PMREMUtils.js +9 -15
  451. package/src/nodes/tsl/TSLBase.js +1 -1
  452. package/src/nodes/tsl/TSLCore.js +99 -33
  453. package/src/nodes/utils/ArrayElementNode.js +14 -1
  454. package/src/nodes/utils/ConvertNode.js +1 -1
  455. package/src/nodes/utils/DebugNode.js +12 -12
  456. package/src/nodes/utils/EquirectUV.js +30 -5
  457. package/src/nodes/utils/EventNode.js +31 -2
  458. package/src/nodes/utils/FlipNode.js +1 -1
  459. package/src/nodes/utils/FunctionOverloadingNode.js +2 -2
  460. package/src/nodes/utils/JoinNode.js +3 -3
  461. package/src/nodes/utils/LoopNode.js +1 -1
  462. package/src/nodes/utils/MemberNode.js +2 -2
  463. package/src/nodes/utils/Packing.js +48 -5
  464. package/src/nodes/utils/PostProcessingUtils.js +33 -1
  465. package/src/nodes/utils/RTTNode.js +41 -25
  466. package/src/nodes/utils/ReflectorNode.js +4 -4
  467. package/src/nodes/utils/Remap.js +48 -0
  468. package/src/nodes/utils/RotateNode.js +1 -1
  469. package/src/nodes/utils/SampleNode.js +1 -1
  470. package/src/nodes/utils/SetNode.js +1 -1
  471. package/src/nodes/utils/SplitNode.js +1 -1
  472. package/src/nodes/utils/SpriteSheetUV.js +35 -0
  473. package/src/nodes/utils/StorageArrayElementNode.js +1 -1
  474. package/src/nodes/utils/UVUtils.js +28 -0
  475. package/src/objects/BatchedMesh.js +66 -30
  476. package/src/objects/InstancedMesh.js +19 -3
  477. package/src/objects/Line.js +1 -1
  478. package/src/objects/Mesh.js +1 -1
  479. package/src/objects/Points.js +1 -1
  480. package/src/objects/SkinnedMesh.js +26 -9
  481. package/src/renderers/WebGLRenderer.js +344 -156
  482. package/src/renderers/common/Animation.js +3 -3
  483. package/src/renderers/common/Attributes.js +15 -1
  484. package/src/renderers/common/Backend.js +78 -13
  485. package/src/renderers/common/Background.js +26 -13
  486. package/src/renderers/common/BindGroup.js +1 -16
  487. package/src/renderers/common/Binding.js +11 -0
  488. package/src/renderers/common/Bindings.js +141 -57
  489. package/src/renderers/common/BlendMode.js +143 -0
  490. package/src/renderers/common/Buffer.js +49 -0
  491. package/src/renderers/common/BundleGroup.js +1 -1
  492. package/src/renderers/common/ChainMap.js +30 -6
  493. package/src/renderers/common/ClippingContext.js +10 -2
  494. package/src/renderers/common/ComputePipeline.js +1 -1
  495. package/src/renderers/common/CubeRenderTarget.js +51 -7
  496. package/src/renderers/common/Geometries.js +29 -3
  497. package/src/renderers/common/Info.js +374 -4
  498. package/src/renderers/common/InspectorBase.js +6 -1
  499. package/src/renderers/common/Lighting.js +51 -19
  500. package/src/renderers/common/Pipelines.js +40 -7
  501. package/src/renderers/common/PostProcessing.js +8 -206
  502. package/src/renderers/common/ReadbackBuffer.js +78 -0
  503. package/src/renderers/common/RenderBundle.js +3 -1
  504. package/src/renderers/common/RenderBundles.js +7 -3
  505. package/src/renderers/common/RenderContext.js +16 -0
  506. package/src/renderers/common/RenderContexts.js +33 -49
  507. package/src/renderers/common/RenderList.js +41 -4
  508. package/src/renderers/common/RenderLists.js +2 -1
  509. package/src/renderers/common/RenderObject.js +88 -16
  510. package/src/renderers/common/RenderObjectPipeline.js +40 -0
  511. package/src/renderers/common/RenderObjects.js +21 -5
  512. package/src/renderers/common/RenderPipeline.js +232 -17
  513. package/src/renderers/common/Renderer.js +700 -163
  514. package/src/renderers/common/Sampler.js +16 -48
  515. package/src/renderers/common/StorageBuffer.js +13 -1
  516. package/src/renderers/common/Textures.js +121 -9
  517. package/src/renderers/common/TimestampQueryPool.js +6 -4
  518. package/src/renderers/common/Uniform.js +8 -0
  519. package/src/renderers/common/UniformsGroup.js +84 -1
  520. package/src/renderers/common/XRManager.js +377 -51
  521. package/src/renderers/common/extras/PMREMGenerator.js +40 -61
  522. package/src/renderers/common/nodes/NodeBuilderState.js +10 -2
  523. package/src/renderers/common/nodes/NodeLibrary.js +4 -4
  524. package/src/renderers/common/nodes/{Nodes.js → NodeManager.js} +298 -106
  525. package/src/renderers/common/nodes/NodeStorageBuffer.js +13 -2
  526. package/src/renderers/common/nodes/NodeUniformBuffer.js +65 -0
  527. package/src/renderers/shaders/DFGLUTData.js +19 -34
  528. package/src/renderers/shaders/ShaderChunk/batching_pars_vertex.glsl.js +2 -2
  529. package/src/renderers/shaders/ShaderChunk/color_fragment.glsl.js +1 -5
  530. package/src/renderers/shaders/ShaderChunk/color_pars_fragment.glsl.js +1 -5
  531. package/src/renderers/shaders/ShaderChunk/color_pars_vertex.glsl.js +1 -5
  532. package/src/renderers/shaders/ShaderChunk/color_vertex.glsl.js +8 -10
  533. package/src/renderers/shaders/ShaderChunk/common.glsl.js +13 -4
  534. package/src/renderers/shaders/ShaderChunk/defaultnormal_vertex.glsl.js +0 -6
  535. package/src/renderers/shaders/ShaderChunk/envmap_common_pars_fragment.glsl.js +0 -1
  536. package/src/renderers/shaders/ShaderChunk/envmap_fragment.glsl.js +9 -13
  537. package/src/renderers/shaders/ShaderChunk/envmap_physical_pars_fragment.glsl.js +2 -2
  538. package/src/renderers/shaders/ShaderChunk/envmap_vertex.glsl.js +1 -1
  539. package/src/renderers/shaders/ShaderChunk/lightprobes_pars_fragment.glsl.js +80 -0
  540. package/src/renderers/shaders/ShaderChunk/lights_fragment_begin.glsl.js +13 -2
  541. package/src/renderers/shaders/ShaderChunk/lights_fragment_end.glsl.js +6 -0
  542. package/src/renderers/shaders/ShaderChunk/lights_fragment_maps.glsl.js +6 -2
  543. package/src/renderers/shaders/ShaderChunk/lights_pars_begin.glsl.js +3 -1
  544. package/src/renderers/shaders/ShaderChunk/lights_physical_fragment.glsl.js +8 -4
  545. package/src/renderers/shaders/ShaderChunk/lights_physical_pars_fragment.glsl.js +112 -53
  546. package/src/renderers/shaders/ShaderChunk/normal_fragment_begin.glsl.js +2 -2
  547. package/src/renderers/shaders/ShaderChunk/normal_fragment_maps.glsl.js +7 -0
  548. package/src/renderers/shaders/ShaderChunk/normal_vertex.glsl.js +6 -0
  549. package/src/renderers/shaders/ShaderChunk/packing.glsl.js +20 -4
  550. package/src/renderers/shaders/ShaderChunk/premultiplied_alpha_fragment.glsl.js +0 -1
  551. package/src/renderers/shaders/ShaderChunk/shadowmap_pars_fragment.glsl.js +225 -186
  552. package/src/renderers/shaders/ShaderChunk/shadowmap_vertex.glsl.js +12 -2
  553. package/src/renderers/shaders/ShaderChunk/shadowmask_pars_fragment.glsl.js +1 -1
  554. package/src/renderers/shaders/ShaderChunk/transmission_fragment.glsl.js +2 -2
  555. package/src/renderers/shaders/ShaderChunk.js +5 -3
  556. package/src/renderers/shaders/ShaderLib/backgroundCube.glsl.js +1 -2
  557. package/src/renderers/shaders/ShaderLib/depth.glsl.js +3 -0
  558. package/src/renderers/shaders/ShaderLib/{distanceRGBA.glsl.js → distance.glsl.js} +2 -3
  559. package/src/renderers/shaders/ShaderLib/meshlambert.glsl.js +2 -1
  560. package/src/renderers/shaders/ShaderLib/meshnormal.glsl.js +1 -2
  561. package/src/renderers/shaders/ShaderLib/meshphong.glsl.js +2 -1
  562. package/src/renderers/shaders/ShaderLib/meshphysical.glsl.js +4 -9
  563. package/src/renderers/shaders/ShaderLib/meshtoon.glsl.js +0 -1
  564. package/src/renderers/shaders/ShaderLib/shadow.glsl.js +1 -1
  565. package/src/renderers/shaders/ShaderLib/vsm.glsl.js +4 -6
  566. package/src/renderers/shaders/ShaderLib.js +7 -6
  567. package/src/renderers/shaders/UniformsLib.js +7 -5
  568. package/src/renderers/shaders/UniformsUtils.js +27 -5
  569. package/src/renderers/webgl/WebGLAnimation.js +2 -1
  570. package/src/renderers/webgl/WebGLBackground.js +15 -15
  571. package/src/renderers/webgl/WebGLBindingStates.js +99 -27
  572. package/src/renderers/webgl/WebGLBufferRenderer.js +0 -32
  573. package/src/renderers/webgl/WebGLCapabilities.js +9 -4
  574. package/src/renderers/webgl/WebGLEnvironments.js +228 -0
  575. package/src/renderers/webgl/WebGLGeometries.js +10 -7
  576. package/src/renderers/webgl/WebGLIndexedBufferRenderer.js +0 -32
  577. package/src/renderers/webgl/WebGLLights.js +18 -1
  578. package/src/renderers/webgl/WebGLMaterials.js +24 -13
  579. package/src/renderers/webgl/WebGLObjects.js +3 -1
  580. package/src/renderers/webgl/WebGLOutput.js +271 -0
  581. package/src/renderers/webgl/WebGLProgram.js +54 -113
  582. package/src/renderers/webgl/WebGLPrograms.js +74 -55
  583. package/src/renderers/webgl/WebGLRenderLists.js +24 -1
  584. package/src/renderers/webgl/WebGLRenderStates.js +13 -2
  585. package/src/renderers/webgl/WebGLShaderCache.js +5 -11
  586. package/src/renderers/webgl/WebGLShadowMap.js +188 -24
  587. package/src/renderers/webgl/WebGLState.js +75 -37
  588. package/src/renderers/webgl/WebGLTextures.js +230 -56
  589. package/src/renderers/webgl/WebGLUniforms.js +40 -3
  590. package/src/renderers/webgl/WebGLUniformsGroups.js +82 -35
  591. package/src/renderers/webgl/WebGLUtils.js +6 -2
  592. package/src/renderers/webgl-fallback/WebGLBackend.js +322 -92
  593. package/src/renderers/webgl-fallback/WebGLBufferRenderer.js +0 -41
  594. package/src/renderers/webgl-fallback/nodes/GLSLNodeBuilder.js +295 -66
  595. package/src/renderers/webgl-fallback/utils/WebGLAttributeUtils.js +53 -19
  596. package/src/renderers/webgl-fallback/utils/WebGLCapabilities.js +25 -0
  597. package/src/renderers/webgl-fallback/utils/WebGLState.js +223 -6
  598. package/src/renderers/webgl-fallback/utils/WebGLTextureUtils.js +118 -73
  599. package/src/renderers/webgl-fallback/utils/WebGLTimestampQueryPool.js +10 -10
  600. package/src/renderers/webgl-fallback/utils/WebGLUtils.js +9 -3
  601. package/src/renderers/webgpu/WebGPUBackend.js +733 -302
  602. package/src/renderers/webgpu/WebGPURenderer.js +2 -1
  603. package/src/renderers/webgpu/descriptors/GPUBindGroupDescriptor.js +48 -0
  604. package/src/renderers/webgpu/descriptors/GPUBufferDescriptor.js +57 -0
  605. package/src/renderers/webgpu/descriptors/GPUCommandEncoderDescriptor.js +30 -0
  606. package/src/renderers/webgpu/descriptors/GPUComputePassDescriptor.js +38 -0
  607. package/src/renderers/webgpu/descriptors/GPUComputePipelineDescriptor.js +48 -0
  608. package/src/renderers/webgpu/descriptors/GPUCopyExternalImageDestInfo.js +47 -0
  609. package/src/renderers/webgpu/descriptors/GPUCopyExternalImageSourceInfo.js +50 -0
  610. package/src/renderers/webgpu/descriptors/GPUExtent3D.js +51 -0
  611. package/src/renderers/webgpu/descriptors/GPUPipelineLayoutDescriptor.js +39 -0
  612. package/src/renderers/webgpu/descriptors/GPUQuerySetDescriptor.js +47 -0
  613. package/src/renderers/webgpu/descriptors/GPURenderBundleEncoderDescriptor.js +74 -0
  614. package/src/renderers/webgpu/descriptors/GPURenderPassColorAttachment.js +72 -0
  615. package/src/renderers/webgpu/descriptors/GPURenderPassDepthStencilAttachment.js +99 -0
  616. package/src/renderers/webgpu/descriptors/GPURenderPassDescriptor.js +72 -0
  617. package/src/renderers/webgpu/descriptors/GPURenderPassTimestampWrites.js +49 -0
  618. package/src/renderers/webgpu/descriptors/GPURenderPipelineDescriptor.js +130 -0
  619. package/src/renderers/webgpu/descriptors/GPUSamplerDescriptor.js +119 -0
  620. package/src/renderers/webgpu/descriptors/GPUShaderModuleDescriptor.js +46 -0
  621. package/src/renderers/webgpu/descriptors/GPUTexelCopyBufferInfo.js +57 -0
  622. package/src/renderers/webgpu/descriptors/GPUTexelCopyBufferLayout.js +48 -0
  623. package/src/renderers/webgpu/descriptors/GPUTexelCopyTextureInfo.js +61 -0
  624. package/src/renderers/webgpu/descriptors/GPUTextureDescriptor.js +99 -0
  625. package/src/renderers/webgpu/descriptors/GPUTextureViewDescriptor.js +108 -0
  626. package/src/renderers/webgpu/nodes/StandardNodeLibrary.js +0 -1
  627. package/src/renderers/webgpu/nodes/WGSLNodeBuilder.js +526 -93
  628. package/src/renderers/webgpu/nodes/WGSLNodeFunction.js +1 -1
  629. package/src/renderers/webgpu/utils/WebGPUAttributeUtils.js +194 -61
  630. package/src/renderers/webgpu/utils/WebGPUBindingUtils.js +395 -234
  631. package/src/renderers/webgpu/utils/WebGPUCapabilities.js +48 -0
  632. package/src/renderers/webgpu/utils/WebGPUConstants.js +10 -0
  633. package/src/renderers/webgpu/utils/WebGPUPipelineUtils.js +224 -91
  634. package/src/renderers/webgpu/utils/WebGPUTexturePassUtils.js +228 -213
  635. package/src/renderers/webgpu/utils/WebGPUTextureUtils.js +428 -175
  636. package/src/renderers/webgpu/utils/WebGPUTimestampQueryPool.js +40 -25
  637. package/src/renderers/webgpu/utils/WebGPUUtils.js +70 -13
  638. package/src/renderers/webxr/WebXRController.js +12 -0
  639. package/src/renderers/webxr/WebXRManager.js +4 -2
  640. package/src/textures/CubeDepthTexture.js +76 -0
  641. package/src/textures/DepthTexture.js +1 -1
  642. package/src/textures/ExternalTexture.js +0 -3
  643. package/src/textures/HTMLTexture.js +74 -0
  644. package/src/textures/Source.js +2 -2
  645. package/src/textures/Texture.js +16 -5
  646. package/src/utils.js +280 -3
  647. package/examples/fonts/LICENSE +0 -13
  648. package/examples/fonts/MPLUSRounded1c/MPLUSRounded1c-Regular.typeface.json.zip +0 -0
  649. package/examples/fonts/MPLUSRounded1c/OFL.txt +0 -91
  650. package/examples/fonts/README.md +0 -11
  651. package/examples/fonts/droid/NOTICE +0 -190
  652. package/examples/fonts/droid/README.txt +0 -18
  653. package/examples/fonts/droid/droid_sans_bold.typeface.json +0 -1
  654. package/examples/fonts/droid/droid_sans_mono_regular.typeface.json +0 -1
  655. package/examples/fonts/droid/droid_sans_regular.typeface.json +0 -1
  656. package/examples/fonts/droid/droid_serif_bold.typeface.json +0 -1
  657. package/examples/fonts/droid/droid_serif_regular.typeface.json +0 -1
  658. package/examples/fonts/gentilis_bold.typeface.json +0 -1
  659. package/examples/fonts/gentilis_regular.typeface.json +0 -1
  660. package/examples/fonts/helvetiker_bold.typeface.json +0 -1
  661. package/examples/fonts/helvetiker_regular.typeface.json +0 -1
  662. package/examples/fonts/optimer_bold.typeface.json +0 -1
  663. package/examples/fonts/optimer_regular.typeface.json +0 -1
  664. package/examples/fonts/ttf/README.md +0 -9
  665. package/examples/fonts/ttf/kenpixel.ttf +0 -0
  666. package/examples/jsm/libs/ammo.wasm.js +0 -822
  667. package/examples/jsm/libs/ammo.wasm.wasm +0 -0
  668. package/examples/jsm/libs/draco/draco_encoder.js +0 -33
  669. package/examples/jsm/libs/draco/gltf/draco_encoder.js +0 -33
  670. package/examples/jsm/libs/lottie_canvas.module.js +0 -14849
  671. package/examples/jsm/libs/opentype.module.js +0 -14506
  672. package/examples/jsm/libs/rhino3dm/rhino3dm.js +0 -21
  673. package/examples/jsm/libs/rhino3dm/rhino3dm.module.js +0 -16
  674. package/examples/jsm/libs/rhino3dm/rhino3dm.wasm +0 -0
  675. package/examples/jsm/lighting/TiledLighting.js +0 -42
  676. package/examples/jsm/materials/MeshGouraudMaterial.js +0 -434
  677. package/examples/jsm/materials/MeshPostProcessingMaterial.js +0 -167
  678. package/examples/jsm/shaders/GodRaysShader.js +0 -333
  679. package/examples/jsm/tsl/display/AnamorphicNode.js +0 -282
  680. package/examples/jsm/tsl/lighting/TiledLightsNode.js +0 -442
  681. package/src/nodes/accessors/BatchNode.js +0 -163
  682. package/src/nodes/accessors/InstanceNode.js +0 -244
  683. package/src/nodes/accessors/InstancedMeshNode.js +0 -50
  684. package/src/nodes/accessors/SceneNode.js +0 -145
  685. package/src/nodes/accessors/SkinningNode.js +0 -327
  686. package/src/nodes/code/ScriptableNode.js +0 -726
  687. package/src/nodes/code/ScriptableValueNode.js +0 -253
  688. package/src/nodes/display/PosterizeNode.js +0 -65
  689. package/src/nodes/functions/BSDF/DFGApprox.js +0 -71
  690. package/src/nodes/utils/RemapNode.js +0 -125
  691. package/src/nodes/utils/SpriteSheetUVNode.js +0 -90
  692. package/src/renderers/webgl/WebGLCubeMaps.js +0 -99
  693. package/src/renderers/webgl/WebGLCubeUVMaps.js +0 -134
@@ -0,0 +1,346 @@
1
+ import {
2
+ Group,
3
+ Matrix4
4
+ } from 'three';
5
+
6
+ import { MeshStandardNodeMaterial } from 'three/webgpu';
7
+ import { cameraPosition, color, float, floor, Fn, fract, fwidth, hash, If, mix, mod, mx_fractal_noise_float, mx_noise_float, normalView, positionView, positionWorld, smoothstep, step, uint, varying, vec4 } from 'three/tsl';
8
+
9
+ import { SkyscraperGenerator, createSkyscraperMaterial, buildingPalette } from './city/SkyscraperGenerator.js';
10
+ import { SidewalkGenerator } from './city/SidewalkGenerator.js';
11
+
12
+ /**
13
+ * Lays out a grid of city blocks and fills each lot with a {@link SkyscraperGenerator}
14
+ * tower of its own seed, height and footprint, optionally on raised sidewalk
15
+ * slabs (curbs). Returns a `THREE.Group` ready to add to a scene.
16
+ *
17
+ * Pass a building material to dress the towers; the sidewalks dress themselves
18
+ * via {@link SidewalkGenerator}. The layout is exposed as
19
+ * {@link CityGenerator#layout} so the surrounding scene (road markings, etc.)
20
+ * can align to the same grid.
21
+ *
22
+ * ```js
23
+ * const city = new CityGenerator( { seed: 1 } );
24
+ * scene.add( city.build( materials ) );
25
+ * ```
26
+ */
27
+ class CityGenerator {
28
+
29
+ constructor( parameters = {} ) {
30
+
31
+ this.parameters = Object.assign( {}, CityGenerator.defaults, parameters );
32
+ this.layout = cityLayout( this.parameters );
33
+
34
+ this.generators = [];
35
+ this.sidewalk = new SidewalkGenerator( {
36
+ width: this.layout.blockW,
37
+ depth: this.layout.blockD,
38
+ height: this.parameters.curbHeight,
39
+ radius: this.parameters.curbRadius
40
+ } );
41
+ this.group = null;
42
+
43
+ }
44
+
45
+ build( materials = {} ) {
46
+
47
+ this.dispose();
48
+
49
+ const group = new Group();
50
+ group.name = 'City';
51
+
52
+ const L = this.layout;
53
+ const random = createRandom( this.parameters.seed );
54
+
55
+ // raise the lots onto rounded sidewalk slabs ( curbs ) when curbHeight > 0
56
+
57
+ const curb = this.parameters.curbHeight;
58
+ const slabs = [];
59
+
60
+ for ( let bx = 0; bx < L.blocksX; bx ++ ) {
61
+
62
+ for ( let bz = 0; bz < L.blocksZ; bz ++ ) {
63
+
64
+ const blockX = - L.cityW / 2 + bx * ( L.blockW + L.street );
65
+ const blockZ = - L.cityD / 2 + bz * ( L.blockD + L.street );
66
+
67
+ if ( curb > 0 ) {
68
+
69
+ slabs.push( new Matrix4().makeTranslation( blockX + L.blockW / 2, 0, blockZ + L.blockD / 2 ) );
70
+
71
+ }
72
+
73
+ for ( let lx = 0; lx < L.lotsX; lx ++ ) {
74
+
75
+ for ( let lz = 0; lz < L.lotsZ; lz ++ ) {
76
+
77
+ // a chamfered corner only reads as architecture when it faces the
78
+ // block's corner ( the street intersection ), so only the four corner
79
+ // lots are cut, each toward its own outward corner; the rest stay square
80
+ const cornerX = lx === 0 ? - 1 : ( lx === L.lotsX - 1 ? 1 : 0 );
81
+ const cornerZ = lz === 0 ? - 1 : ( lz === L.lotsZ - 1 ? 1 : 0 );
82
+ const onCorner = cornerX !== 0 && cornerZ !== 0;
83
+
84
+ const tall = random();
85
+
86
+ const generator = new SkyscraperGenerator( {
87
+ seed: Math.floor( random() * 100000 ),
88
+ totalHeight: 38 + tall * tall * 114, // a few tall towers, mostly mid-rise
89
+ footprint: { width: L.lot - 1 - random() * 4, depth: L.lot - 1 - random() * 4 }, // nearly fill the lot so neighbours sit close; width and depth vary independently
90
+ floorHeight: 3.4 + random() * 1.8,
91
+ bayWidth: 1.9 + random() * 2.1,
92
+ pierWidth: 0.4 + random() * 0.5,
93
+ pierDepth: 0.3 + random() * 0.4,
94
+ chamferWidth: onCorner ? 3 + random() * 4 : 0,
95
+ chamferCornerX: cornerX,
96
+ chamferCornerZ: cornerZ,
97
+ setbackDepth: random() < 0.4 ? 0.8 + random() * 2 : 0, // only some towers step back at the crown; the rest rise flat
98
+ stringCourseEvery: random() < 0.85 ? 3 + Math.floor( random() * 6 ) : 0
99
+ }, materials.building );
100
+
101
+ const building = generator.build();
102
+ building.position.set( blockX + ( lx + 0.5 ) * L.lot, curb, blockZ + ( lz + 0.5 ) * L.lot );
103
+ building.castShadow = building.receiveShadow = true;
104
+
105
+ group.add( building );
106
+ this.generators.push( generator );
107
+
108
+ }
109
+
110
+ }
111
+
112
+ }
113
+
114
+ }
115
+
116
+ if ( slabs.length > 0 ) group.add( this.sidewalk.build( slabs ) );
117
+
118
+ this.group = group;
119
+
120
+ return group;
121
+
122
+ }
123
+
124
+ dispose() {
125
+
126
+ for ( const generator of this.generators ) generator.dispose();
127
+ this.generators.length = 0;
128
+
129
+ this.sidewalk.dispose();
130
+
131
+ this.group = null;
132
+
133
+ }
134
+
135
+ }
136
+
137
+ CityGenerator.defaults = {
138
+ seed: 1,
139
+ street: 22,
140
+ lot: 30,
141
+ lotsX: 3,
142
+ lotsZ: 2,
143
+ blocksX: 2,
144
+ blocksZ: 2,
145
+ curbHeight: 0.15, // ~6 in standard curb reveal / sidewalk height above the road
146
+ curbRadius: 5
147
+ };
148
+
149
+ // derives the block / street dimensions from the parameters
150
+ function cityLayout( parameters ) {
151
+
152
+ const { street, lot, lotsX, lotsZ, blocksX, blocksZ } = parameters;
153
+
154
+ const blockW = lotsX * lot;
155
+ const blockD = lotsZ * lot;
156
+
157
+ return {
158
+ street, lot, lotsX, lotsZ, blocksX, blocksZ, blockW, blockD,
159
+ cityW: blocksX * blockW + ( blocksX - 1 ) * street,
160
+ cityD: blocksZ * blockD + ( blocksZ - 1 ) * street
161
+ };
162
+
163
+ }
164
+
165
+ // deterministic PRNG (mulberry32) so a seed always lays out the same city
166
+ function createRandom( seed ) {
167
+
168
+ let s = ( seed >>> 0 ) || 1;
169
+
170
+ return function () {
171
+
172
+ s = ( s + 0x6D2B79F5 ) | 0;
173
+ let t = Math.imul( s ^ ( s >>> 15 ), 1 | s );
174
+ t = ( t + Math.imul( t ^ ( t >>> 7 ), 61 | t ) ) ^ t;
175
+ return ( ( t ^ ( t >>> 14 ) ) >>> 0 ) / 4294967296;
176
+
177
+ };
178
+
179
+ }
180
+
181
+ // --- road material -------------------------------------------------------
182
+
183
+ // derivative-based bump for a procedural, world-space height field. the built-in bumpMap
184
+ // offsets the UV to read its height, so it returns a zero gradient for a height keyed off
185
+ // world position; this feeds the hardware screen-space derivatives of the height into
186
+ // Mikkelsen's surface-gradient method so the relief actually perturbs the normal.
187
+ function bumpNormal( height ) {
188
+
189
+ const dpdx = positionView.dFdx();
190
+ const dpdy = positionView.dFdy();
191
+ const r1 = dpdy.cross( normalView );
192
+ const r2 = normalView.cross( dpdx );
193
+ const det = dpdx.dot( r1 );
194
+ const grad = det.sign().mul( height.dFdx().mul( r1 ).add( height.dFdy().mul( r2 ) ) );
195
+
196
+ return det.abs().mul( normalView ).sub( grad ).normalize();
197
+
198
+ }
199
+
200
+ // antialiased filled band: 1 where |coord| < halfWidth, edge sized to the
201
+ // pixel footprint ( fwidth ) so thin road paint stays crisp and doesn't shimmer
202
+ function lineAA( coord, halfWidth ) {
203
+
204
+ const aa = fwidth( coord ).max( 0.0001 );
205
+ return smoothstep( float( halfWidth ).add( aa ), float( halfWidth ).sub( aa ), coord.abs() );
206
+
207
+ }
208
+
209
+ // the same, repeated at every multiple of `period` ( stripes, joints )
210
+ function gridLine( coord, period, halfWidth ) {
211
+
212
+ const g = coord.div( period );
213
+ const d = float( 0.5 ).sub( fract( g ).sub( 0.5 ).abs() ); // distance to nearest line, in periods
214
+ const aa = fwidth( g ).max( 0.0001 );
215
+ const hw = halfWidth / period;
216
+ return smoothstep( float( hw ).add( aa ), float( hw ).sub( aa ), d );
217
+
218
+ }
219
+
220
+ /**
221
+ * The shared material every tower in a {@link CityGenerator} is dressed with: one flat
222
+ * masonry colour per lot, picked from a palette by hashing the lot's grid cell.
223
+ */
224
+ function createBuildingMaterial( layout, seed = 0 ) {
225
+
226
+ // every tower takes one flat colour, picked by hashing its lot — one shared material
227
+ // dresses the whole skyline; common tones repeat so the equal-probability pick feels real
228
+ const palette = buildingPalette.map( hex => color( hex ) );
229
+
230
+ const periodX = layout.blockW + layout.street;
231
+ const periodZ = layout.blockD + layout.street;
232
+ const gx = positionWorld.x.add( layout.cityW / 2 );
233
+ const gz = positionWorld.z.add( layout.cityD / 2 );
234
+ const blockIX = floor( gx.div( periodX ) );
235
+ const blockIZ = floor( gz.div( periodZ ) );
236
+ const cellX = blockIX.mul( layout.lotsX ).add( floor( gx.sub( blockIX.mul( periodX ) ).div( layout.lot ) ) );
237
+ const cellZ = blockIZ.mul( layout.lotsZ ).add( floor( gz.sub( blockIZ.mul( periodZ ) ).div( layout.lot ) ) );
238
+ const cellKey = uint( cellX.add( 4096 ) ).mul( uint( 73856093 ) ).bitXor( uint( cellZ.add( 4096 ) ).mul( uint( 19349663 ) ) ).bitXor( uint( ( seed * 2654435761 ) >>> 0 ) ).toVar();
239
+ const cellHash = ( a, b ) => hash( cellKey.add( uint( Math.round( ( a + b * 7 ) * 100 ) ) ) );
240
+
241
+ const pick = cellHash( 127.1, 311.7 );
242
+ let buildingBase = palette[ 0 ];
243
+ for ( let i = 1; i < palette.length; i ++ ) buildingBase = mix( buildingBase, palette[ i ], step( i / palette.length, pick ) );
244
+ buildingBase = buildingBase.mul( cellHash( 269.5, 183.3 ).mul( 0.12 ).add( 0.94 ) ); // subtle per-building brightness
245
+
246
+ // the pick is constant across a tower, so resolve it once per vertex ( varying )
247
+ return createSkyscraperMaterial( varying( buildingBase ) );
248
+
249
+ }
250
+
251
+ /**
252
+ * The road surface: wet asphalt with lane lines and crosswalks aligned to a
253
+ * {@link CityGenerator} layout. Apply it to a ground plane sized to the city.
254
+ */
255
+ function createRoadMaterial( layout ) {
256
+
257
+ // wet asphalt: a warm-grey base in patchwork pours, two-scale aggregate
258
+ // grit, oily wear stains, hairline cracks and low-frequency wet patches
259
+ // that turn glossy and mirror the sky. detail fades in as the camera nears.
260
+
261
+ const p = positionWorld;
262
+ const detail = smoothstep( 240, 25, p.distance( cameraPosition ) );
263
+
264
+ const blotch = mx_fractal_noise_float( p.mul( 0.2 ), 3 ).mul( 0.5 ).add( 0.5 );
265
+
266
+ // close-range detail — aggregate grit, oily wear pools, hairline cracks and worn
267
+ // paint — only resolves near the camera, so its noise is sampled ( inside the branch )
268
+ // only where detail is non-zero and skipped across the far majority of the road
269
+ const near = Fn( () => {
270
+
271
+ const grit = float( 0 ).toVar(); // two scales of aggregate, -1..1
272
+ const stain = float( 0 ).toVar(); // oily wear pools
273
+ const crack = float( 0 ).toVar();
274
+ const worn = float( 1 ).toVar(); // paint rubbed thin and patchy, more so where tyres cross it
275
+
276
+ If( detail.greaterThan( 0 ), () => {
277
+
278
+ grit.assign( mx_noise_float( p.mul( 7 ) ).add( mx_noise_float( p.mul( 23 ) ) ).mul( 0.5 ) );
279
+ stain.assign( smoothstep( 0.5, 0.85, mx_fractal_noise_float( p.mul( 0.45 ), 3 ).mul( 0.5 ).add( 0.5 ) ) );
280
+ crack.assign( smoothstep( 0.88, 1, mx_fractal_noise_float( p.mul( 1.1 ), 4 ).abs().oneMinus() ).mul( detail ) );
281
+ worn.assign( smoothstep( 0.25, 0.7, mx_fractal_noise_float( p.mul( 0.7 ), 3 ).mul( 0.5 ).add( 0.5 ) ).mul( 0.55 ).add( 0.35 ) );
282
+
283
+ } );
284
+
285
+ return vec4( grit, stain, crack, worn );
286
+
287
+ } )();
288
+
289
+ const grit = near.x;
290
+ const stain = near.y;
291
+ const crack = near.z;
292
+ const worn = near.w;
293
+
294
+ const base = mix( color( 0x24262b ), color( 0x3b3f46 ), blotch );
295
+ const gritty = base.mul( grit.mul( 0.22 ).mul( detail ).add( 1 ) );
296
+ const asphalt = mix( gritty, gritty.mul( 0.5 ), stain.mul( 0.5 ).mul( detail ) );
297
+
298
+ const wet = smoothstep( 0.6, 0.85, mx_fractal_noise_float( p.mul( 0.14 ), 2 ).mul( 0.5 ).add( 0.5 ) );
299
+
300
+ // markings, aligned to the block / street grid. fx, fz are the position
301
+ // within one block+street period; the street is the [ blockW, period ) part.
302
+
303
+ const periodX = layout.blockW + layout.street;
304
+ const periodZ = layout.blockD + layout.street;
305
+ const fx = mod( p.x.add( layout.cityW / 2 ), periodX );
306
+ const fz = mod( p.z.add( layout.cityD / 2 ), periodZ );
307
+ const inStreetX = step( layout.blockW, fx ); // in a vertical street ( gap in X )
308
+ const inStreetZ = step( layout.blockD, fz ); // in a horizontal street ( gap in Z )
309
+ const su = fx.sub( layout.blockW ); // across the vertical street
310
+ const sv = fz.sub( layout.blockD ); // across the horizontal street
311
+
312
+ // lane markings down each street ( not through intersections ): a solid
313
+ // centre line splitting the two directions, with a dashed divider in each
314
+ // half, so every street carries four lanes
315
+ const dashV = step( fract( p.z.div( 7 ) ), 0.5 );
316
+ const dashH = step( fract( p.x.div( 7 ) ), 0.5 );
317
+
318
+ const centreV = lineAA( su.sub( layout.street / 2 ), 0.12 );
319
+ const dividerV = lineAA( su.sub( layout.street / 4 ), 0.1 ).max( lineAA( su.sub( layout.street * 3 / 4 ), 0.1 ) ).mul( dashV );
320
+ const laneV = centreV.max( dividerV ).mul( inStreetX ).mul( inStreetZ.oneMinus() );
321
+
322
+ const centreH = lineAA( sv.sub( layout.street / 2 ), 0.12 );
323
+ const dividerH = lineAA( sv.sub( layout.street / 4 ), 0.1 ).max( lineAA( sv.sub( layout.street * 3 / 4 ), 0.1 ) ).mul( dashH );
324
+ const laneH = centreH.max( dividerH ).mul( inStreetZ ).mul( inStreetX.oneMinus() );
325
+
326
+ // continental crosswalk bars ( long in the travel direction ) in each
327
+ // street arm, near the block edges it meets
328
+ const cw = 5;
329
+ const nearZ = step( fz, cw ).max( step( layout.blockD - cw, fz ) );
330
+ const nearX = step( fx, cw ).max( step( layout.blockW - cw, fx ) );
331
+ const crossV = gridLine( su, 1.2, 0.38 ).mul( inStreetX ).mul( inStreetZ.oneMinus() ).mul( nearZ );
332
+ const crossH = gridLine( sv, 1.2, 0.38 ).mul( inStreetZ ).mul( inStreetX.oneMinus() ).mul( nearX );
333
+
334
+ const paint = laneV.max( laneH ).max( crossV ).max( crossH ).mul( detail ).mul( worn );
335
+
336
+ const material = new MeshStandardNodeMaterial();
337
+ const surface = mix( asphalt, asphalt.mul( 0.6 ), wet ).mul( crack.mul( 0.5 ).oneMinus() );
338
+ material.colorNode = mix( surface, color( 0xd0ccc0 ), paint ); // worn white paint
339
+ material.roughnessNode = mix( float( 0.95 ).sub( paint.mul( 0.2 ) ), float( 0.32 ), wet );
340
+ material.normalNode = bumpNormal( grit.mul( 0.003 ).sub( crack.mul( 0.01 ) ).mul( detail ) ); // world units: ~3 mm aggregate, ~10 mm cracks
341
+
342
+ return material;
343
+
344
+ }
345
+
346
+ export { CityGenerator, createBuildingMaterial, createRoadMaterial };
@@ -0,0 +1,347 @@
1
+ import {
2
+ BufferAttribute,
3
+ Group,
4
+ IcosahedronGeometry,
5
+ InstancedBufferAttribute,
6
+ InstancedMesh,
7
+ Object3D,
8
+ Vector3
9
+ } from 'three';
10
+
11
+ import { MeshStandardNodeMaterial } from 'three/webgpu';
12
+ import { attribute, color, float, Fn, If, mix, mx_noise_float, normalView, positionLocal, positionView, positionWorld, smoothstep, step, uniform } from 'three/tsl';
13
+
14
+ import { ImprovedNoise } from '../math/ImprovedNoise.js';
15
+ import { mergeVertices } from '../utils/BufferGeometryUtils.js';
16
+
17
+ /**
18
+ * Carpets a {@link TerrainGenerator} ( or anything exposing `sampleHeight`,
19
+ * `sampleSlope`, `minY`, `maxY` and `parameters.size` ) with a forest of hundreds
20
+ * of thousands of trees in a single draw call.
21
+ *
22
+ * Each tree is the cheapest thing that still reads as a tree: a ~20-face icosphere
23
+ * squashed into a tapered teardrop and lumped with a little noise, carrying a baked
24
+ * dark-base / bright-top gradient. Tens of triangles each, so a single
25
+ * {@link THREE.InstancedMesh} of half a million of them costs one draw call. Trees
26
+ * are placed by rejection sampling against ecological rules — a min/max altitude
27
+ * band ( above the mist floor, below the snowline ), a slope limit ( none on
28
+ * cliffs ) and a low-frequency density mask that opens clearings — then jittered in
29
+ * yaw, lean and ( squared-biased ) scale so the stand never reads as copies.
30
+ *
31
+ * ```js
32
+ * const forest = new ForestGenerator( { count: 500000 } );
33
+ * scene.add( forest.build( terrain ) );
34
+ * ```
35
+ */
36
+ class ForestGenerator {
37
+
38
+ constructor( parameters = {} ) {
39
+
40
+ this.parameters = Object.assign( {}, ForestGenerator.defaults, parameters );
41
+
42
+ // stochastic distance cull ( THREE.Fog-style near / far ): drawn within `from`, gone
43
+ // past `to`, the band between thinned by a baked random. live-tunable uniforms.
44
+ this.from = uniform( this.parameters.from );
45
+ this.to = uniform( this.parameters.to );
46
+
47
+ // main-camera position ( set via setCameraPosition ). NOT the TSL cameraPosition node:
48
+ // in the shadow pass that resolves to the light, which would cull the wrong trees.
49
+ this._cameraPosition = uniform( new Vector3() );
50
+
51
+ this.material = createForestMaterial( this.from, this.to, this._cameraPosition );
52
+ this.mesh = null;
53
+ this.group = null;
54
+
55
+ }
56
+
57
+ build( terrain ) {
58
+
59
+ this.dispose();
60
+
61
+ const p = this.parameters;
62
+ const geometry = blobGeometry( p );
63
+
64
+ const size = terrain.parameters.size;
65
+ const minY = terrain.minY;
66
+ const span = terrain.maxY - terrain.minY;
67
+
68
+ const random = createRandom( p.seed );
69
+
70
+ // a low-frequency field that breaks the forest into patches and clearings
71
+ const perlin = new ImprovedNoise();
72
+ const dOffX = random() * 256, dOffZ = random() * 256, dSlice = random() * 256;
73
+ const densityAt = ( x, z ) => smoothBlend( - 0.12, 0.22, perlin.noise( x * p.densityFrequency + dOffX, z * p.densityFrequency + dOffZ, dSlice ) );
74
+
75
+ const mesh = new InstancedMesh( geometry, this.material, p.count );
76
+ mesh.castShadow = mesh.receiveShadow = p.castShadow; // honoured on every rebuild
77
+
78
+ // per-instance cull data: xyz = tree position ( for its distance to the camera ),
79
+ // w = a threshold jitter from a separate PRNG, so it doesn't disturb placement
80
+ const cullData = new Float32Array( p.count * 4 );
81
+ const cullRandom = createRandom( ( p.seed ^ 0x9e3779b9 ) >>> 0 );
82
+
83
+ // per-instance regional colour drift, baked here so the vertex-bound shader taps no
84
+ // noise. offsets come from the cull PRNG, so placement is untouched.
85
+ const regionData = new Float32Array( p.count );
86
+ const rOffX = cullRandom() * 256, rOffZ = cullRandom() * 256, rSlice = cullRandom() * 256;
87
+
88
+ const dummy = new Object3D();
89
+ let placed = 0;
90
+ let attempts = 0;
91
+ const maxAttempts = p.count * 14; // give up rather than hang if the band is too small
92
+
93
+ while ( placed < p.count && attempts < maxAttempts ) {
94
+
95
+ attempts ++;
96
+
97
+ const x = ( random() - 0.5 ) * size;
98
+ const z = ( random() - 0.5 ) * size;
99
+
100
+ const y = terrain.sampleHeight( x, z );
101
+ const altitude = ( y - minY ) / span;
102
+ if ( altitude < p.altitudeMin || altitude > p.altitudeMax ) continue;
103
+
104
+ if ( terrain.sampleSlope( x, z ) < p.minSlope ) continue;
105
+
106
+ // density mask, feathered out at the top so the treeline scatters, not a clean line
107
+ let density = densityAt( x, z );
108
+ density *= smoothBlend( p.altitudeMax, p.altitudeMax - 0.14, altitude );
109
+ if ( random() >= density ) continue;
110
+
111
+ dummy.position.set( x, y - p.sink, z ); // sink the base point into the ground
112
+ dummy.rotation.set( ( random() - 0.5 ) * 0.12, random() * Math.PI * 2, ( random() - 0.5 ) * 0.12 ); // small lean + free yaw, trunk ~vertical
113
+
114
+ const s = p.minScale + random() * random() * ( p.maxScale - p.minScale ); // squared bias: mostly small, rare giants
115
+ dummy.scale.set( s * ( 0.85 + random() * 0.3 ), s, s * ( 0.85 + random() * 0.3 ) );
116
+
117
+ dummy.updateMatrix();
118
+ mesh.setMatrixAt( placed, dummy.matrix );
119
+
120
+ const c = placed * 4;
121
+ cullData[ c ] = x;
122
+ cullData[ c + 1 ] = dummy.position.y; // the sunk y, matching the drawn position
123
+ cullData[ c + 2 ] = z;
124
+ cullData[ c + 3 ] = cullRandom();
125
+
126
+ regionData[ placed ] = Math.min( 1, Math.max( 0, perlin.noise( x * 0.02 + rOffX, z * 0.02 + rOffZ, rSlice ) * 0.6 + 0.5 ) );
127
+
128
+ placed ++;
129
+
130
+ }
131
+
132
+ mesh.count = placed; // only what got planted
133
+ mesh.instanceMatrix.needsUpdate = true;
134
+ geometry.setAttribute( 'cull', new InstancedBufferAttribute( cullData, 4 ) );
135
+ geometry.setAttribute( 'region', new InstancedBufferAttribute( regionData, 1 ) );
136
+
137
+ const group = new Group();
138
+ group.name = 'Forest';
139
+ group.add( mesh );
140
+
141
+ this.mesh = mesh;
142
+ this.group = group;
143
+
144
+ return group;
145
+
146
+ }
147
+
148
+ // call each frame so the distance cull tracks the camera
149
+ setCameraPosition( position ) {
150
+
151
+ this._cameraPosition.value.copy( position );
152
+
153
+ }
154
+
155
+ dispose() {
156
+
157
+ if ( this.mesh ) this.mesh.geometry.dispose();
158
+ this.mesh = null;
159
+ this.group = null;
160
+
161
+ }
162
+
163
+ }
164
+
165
+ ForestGenerator.defaults = {
166
+ seed: 1,
167
+ count: 500000, // number of trees to plant ( a single instanced draw call )
168
+ detail: 0, // icosphere subdivision ( 0 = 20 faces, welds to 12 verts )
169
+ radius: 1.3, // base half-width of a tree blob, in world units
170
+ height: 4, // base height of a tree blob
171
+ distortion: 0.5, // lumpiness of the blob hull ( a rough conifer, not a smooth egg )
172
+ sink: 0.4, // how far the base point is pushed under the surface, to hide it
173
+ altitudeMin: 0.12, // normalised altitude band the forest occupies: above the mist floor...
174
+ altitudeMax: 0.46, // ...and safely below the snowline
175
+ minSlope: 0.55, // minimum surface flatness ( normal.y ); steeper ground stays bare rock
176
+ densityFrequency: 0.012, // patch / clearing scale ( world units )
177
+ minScale: 0.7,
178
+ maxScale: 1.8,
179
+ from: 300, // distance ( like THREE.Fog ) within which every tree is drawn...
180
+ to: 620, // ...past which none are; the band between thins out stochastically
181
+ castShadow: false // whether the canopy casts + receives shadows ( 500k casters is a real cost — opt in )
182
+ };
183
+
184
+ // deterministic PRNG ( mulberry32 ), matching the other generators
185
+ function createRandom( seed ) {
186
+
187
+ let s = ( seed >>> 0 ) || 1;
188
+
189
+ return function () {
190
+
191
+ s = ( s + 0x6D2B79F5 ) | 0;
192
+ let t = Math.imul( s ^ ( s >>> 15 ), 1 | s );
193
+ t = ( t + Math.imul( t ^ ( t >>> 7 ), 61 | t ) ) ^ t;
194
+ return ( ( t ^ ( t >>> 14 ) ) >>> 0 ) / 4294967296;
195
+
196
+ };
197
+
198
+ }
199
+
200
+ function smoothBlend( edge0, edge1, x ) {
201
+
202
+ const t = Math.max( 0, Math.min( 1, ( x - edge0 ) / ( edge1 - edge0 ) ) );
203
+ return t * t * ( 3 - 2 * t );
204
+
205
+ }
206
+
207
+ // smooth low-frequency lump over the unit sphere, so the blob hull is bumpy not spiky
208
+ function blobNoise( x, y, z ) {
209
+
210
+ return Math.sin( x * 3.1 ) * Math.sin( y * 2.7 + 1.3 ) * Math.sin( z * 3.5 + 2.1 );
211
+
212
+ }
213
+
214
+ // one tree blob: an icosphere squashed into a lumpy, tapered teardrop, base at y = 0.
215
+ // normals are re-pointed up-and-out so it shades as a soft canopy volume; a baked `ao`
216
+ // ( 0 base → 1 crown ) drives the dark-underside / bright-crown gradient.
217
+ function blobGeometry( p ) {
218
+
219
+ // IcosahedronGeometry is non-indexed ( 60 verts ); deleting uv + normal lets mergeVertices
220
+ // weld by position to 12 verts — ~5× fewer vertex-shader runs. normals are rebuilt below.
221
+ let geometry = new IcosahedronGeometry( 1, p.detail );
222
+ geometry.deleteAttribute( 'uv' );
223
+ geometry.deleteAttribute( 'normal' );
224
+ geometry = mergeVertices( geometry );
225
+
226
+ const position = geometry.attributes.position;
227
+ const count = position.count;
228
+
229
+ const normals = new Float32Array( count * 3 );
230
+ const ao = new Float32Array( count );
231
+
232
+ for ( let i = 0; i < count; i ++ ) {
233
+
234
+ const ux = position.getX( i );
235
+ const uy = position.getY( i );
236
+ const uz = position.getZ( i ); // a point on the unit sphere
237
+
238
+ const h = ( uy + 1 ) / 2; // 0 at the base, 1 at the top
239
+ const taper = 1 - 0.62 * h; // narrower toward a pointier crown
240
+ const lump = 1 + p.distortion * blobNoise( ux, uy, uz );
241
+ const r = taper * lump;
242
+
243
+ position.setXYZ( i, ux * r * p.radius, h * p.height, uz * r * p.radius );
244
+
245
+ // up-and-outward normal: a soft, dome-lit canopy rather than faceted rock
246
+ const inv = 1 / Math.hypot( ux, 0.55, uz );
247
+ normals[ i * 3 ] = ux * inv;
248
+ normals[ i * 3 + 1 ] = 0.55 * inv;
249
+ normals[ i * 3 + 2 ] = uz * inv;
250
+
251
+ ao[ i ] = h;
252
+
253
+ }
254
+
255
+ position.needsUpdate = true;
256
+ geometry.setAttribute( 'normal', new BufferAttribute( normals, 3 ) );
257
+ geometry.setAttribute( 'ao', new BufferAttribute( ao, 1 ) );
258
+ geometry.computeBoundingSphere();
259
+
260
+ return geometry;
261
+
262
+ }
263
+
264
+ // derivative-based bump ( surface-gradient method ): perturbs the view normal from a
265
+ // procedural height field, so the canopy reads as clustered foliage, not a smooth shell
266
+ function bumpNormal( height ) {
267
+
268
+ const dpdx = positionView.dFdx();
269
+ const dpdy = positionView.dFdy();
270
+ const r1 = dpdy.cross( normalView );
271
+ const r2 = normalView.cross( dpdx );
272
+ const det = dpdx.dot( r1 );
273
+ const grad = det.sign().mul( height.dFdx().mul( r1 ).add( height.dFdy().mul( r2 ) ) );
274
+
275
+ return det.abs().mul( normalView ).sub( grad ).normalize();
276
+
277
+ }
278
+
279
+ /**
280
+ * The single material shared by every tree in a {@link ForestGenerator}. A plain
281
+ * MeshStandardNodeMaterial lit by the scene — only the surface is authored: deep
282
+ * shadowed green in the recesses rising to a bright, yellow-green sunlit crown,
283
+ * mottled into needle clumps by 3D noise, with a matching bump so the clumps catch
284
+ * the light. Half a million instanced blobs makes this mesh vertex-bound, so the
285
+ * regional colour drift is baked to a per-instance attribute ( no shader noise for it ),
286
+ * and the costly clump noise + bump are **gated by distance** — full detail on the near
287
+ * trees ( where it reads ), skipped on the far canopy ( where it is sub-pixel ).
288
+ *
289
+ * @param {Node} from - distance within which every tree is drawn.
290
+ * @param {Node} to - distance past which no tree is drawn.
291
+ * @return {MeshStandardNodeMaterial}
292
+ */
293
+ function createForestMaterial( from, to, camPos ) {
294
+
295
+ const material = new MeshStandardNodeMaterial();
296
+ material.metalness = 0;
297
+ material.roughness = 0.88;
298
+
299
+ const cull = attribute( 'cull', 'vec4' ); // xyz = tree position, w = random 0..1
300
+ const d = cull.xyz.distance( camPos ); // per-tree distance to the ( main ) camera
301
+
302
+ // stochastic distance cull: past its jittered `from`→`to` threshold a tree collapses to a
303
+ // point, dropping the far canopy. `positionLocal` is already WORLD space here ( the instance
304
+ // transform runs before positionNode ), so the ×0 lands the whole blob on the origin.
305
+ const t = d.sub( from ).div( to.sub( from ) );
306
+ material.positionNode = positionLocal.mul( step( t, cull.w ) ); // keep where random ≥ t
307
+
308
+ const ao = attribute( 'ao', 'float' ); // 0 at the blob base, 1 at the crown
309
+
310
+ // regional drift, baked per tree ( see build ) so no stage taps a noise; a blob is small
311
+ // enough that one value per tree reads as a smooth field across the canopy
312
+ const region = attribute( 'region', 'float' );
313
+ const deep = mix( color( 0x1d3318 ), color( 0x2e4420 ), region ); // shadowed interior
314
+ const bright = mix( color( 0x4c6a2e ), color( 0x6e8a40 ), region ); // sunlit tips ( muted green, not neon )
315
+
316
+ // one 3D noise field ( coarse + fine ), shared by the colour and bump, near canopy only
317
+ const detailFade = smoothstep( 280, 25, positionWorld.distance( camPos ) );
318
+
319
+ // gated by an If ( which must sit inside an Fn ) so the far canopy skips the noise
320
+ const clump = Fn( () => {
321
+
322
+ const c = float( 0 ).toVar();
323
+
324
+ If( detailFade.greaterThan( 0.01 ), () => {
325
+
326
+ c.assign( mx_noise_float( positionWorld.mul( 0.9 ) )
327
+ .add( mx_noise_float( positionWorld.mul( 3.1 ) ).mul( 0.5 ) )
328
+ .mul( detailFade ) );
329
+
330
+ } );
331
+
332
+ return c;
333
+
334
+ } )();
335
+
336
+ // deep recesses → bright clumps / crown
337
+ const lit = ao.mul( 0.5 ).add( 0.32 ).add( clump.mul( 0.18 ) ).clamp();
338
+ material.colorNode = mix( deep, bright, lit );
339
+
340
+ // clumps catch the light ( clump is 0 far away, so the bump flattens there )
341
+ material.normalNode = bumpNormal( clump.mul( 0.22 ) );
342
+
343
+ return material;
344
+
345
+ }
346
+
347
+ export { ForestGenerator, createForestMaterial };