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,377 @@
1
+ import {
2
+ BufferAttribute,
3
+ BufferGeometry,
4
+ Mesh,
5
+ Vector3
6
+ } from 'three';
7
+
8
+ import { MeshStandardNodeMaterial } from 'three/webgpu';
9
+ import { color, float, mx_fractal_noise_float, positionLocal, vec3 } from 'three/tsl';
10
+
11
+ // the golden angle ( 137.5° ): rolling each sibling branch by this much around the
12
+ // parent axis spreads them like a real stem, so they never line up
13
+ const GOLDEN_ANGLE = Math.PI * ( 3 - Math.sqrt( 5 ) );
14
+ const DEG2RAD = Math.PI / 180;
15
+ const TAU = Math.PI * 2;
16
+
17
+ const UP = /*@__PURE__*/ new Vector3( 0, 1, 0 );
18
+ const _axis = /*@__PURE__*/ new Vector3();
19
+
20
+ // reusable scratch for one tube's ring vertices ( grows to the largest tube seen )
21
+ let _ring = new Float32Array( 0 );
22
+
23
+ /**
24
+ * Grows a procedural tree skeleton — trunk, branches and twigs, each swept as a tapered
25
+ * tube — and bakes it into one non-indexed {@link BufferGeometry} (position and normal
26
+ * only), ready to instance into a forest. It produces *branches only*; add foliage as a
27
+ * separate layer.
28
+ *
29
+ * The branching is deterministic for a given `seed`: a recursive sweep lays down gently
30
+ * curved tubes with a parallel-transport frame (so they never twist), forking by the
31
+ * pipe model (each child much thinner than its parent), spreading children along the
32
+ * upper part of each branch with a golden-angle roll, and pulling them back up toward
33
+ * the light. A flared root, non-linear taper and gravity droop fill in the character.
34
+ *
35
+ * Parameters are set with a fluent builder: a `set<Param>()` exists for every default
36
+ * ( `setSeed`, `setLevels`, `setChildren`, … ), each returning `this` for chaining.
37
+ *
38
+ * Each `build()` returns a fresh, independent mesh that the caller owns, so one
39
+ * generator can be re-parametrized and built repeatedly to grow a varied stand:
40
+ *
41
+ * ```js
42
+ * const generator = new TreeGenerator( material );
43
+ * const oak = generator.setSeed( 1 ).setLevels( 4 ).build();
44
+ * const pine = generator.setSeed( 2 ).setLevels( 5 ).build();
45
+ * ```
46
+ */
47
+ class TreeGenerator {
48
+
49
+ constructor( material = null ) {
50
+
51
+ this.material = material;
52
+ this.parameters = {}; // overrides; defaults fill the rest at build time
53
+
54
+ }
55
+
56
+ build() {
57
+
58
+ const p = Object.assign( {}, TreeGenerator.defaults, this.parameters );
59
+ const random = createRandom( p.seed );
60
+
61
+ // grow the skeleton into a flat list of tubes, then size and fill the geometry in
62
+ // one pass — no per-vertex objects, no array growth
63
+
64
+ const tubes = [];
65
+ growBranch( tubes, new Vector3(), UP, p.trunkLength, p.trunkRadius, 0, p, random );
66
+
67
+ let vertexCount = 0;
68
+ for ( const tube of tubes ) vertexCount += ( tube.rings.length - 1 ) * tube.radial * 6;
69
+
70
+ const positions = new Float32Array( vertexCount * 3 );
71
+ const normals = new Float32Array( vertexCount * 3 );
72
+
73
+ let offset = 0;
74
+ for ( const tube of tubes ) offset = emitTube( positions, normals, offset, tube.rings, tube.radial );
75
+
76
+ const geometry = new BufferGeometry();
77
+ geometry.setAttribute( 'position', new BufferAttribute( positions, 3 ) );
78
+ geometry.setAttribute( 'normal', new BufferAttribute( normals, 3 ) );
79
+ geometry.computeBoundingSphere();
80
+
81
+ const mesh = new Mesh( geometry, this.material || createTreeMaterial() );
82
+ mesh.name = 'Tree';
83
+
84
+ return mesh;
85
+
86
+ }
87
+
88
+ }
89
+
90
+ TreeGenerator.defaults = {
91
+ seed: 1,
92
+ levels: 4, // recursion depth: trunk, branch, twig, sub-twig
93
+ children: [ 3, 12, 8 ], // sub-branches per level; density comes from many children spread along each parent, not depth
94
+ branchAngle: [ 38, 50, 58 ], // degrees a child tilts off its parent axis, per level
95
+ angleVariance: 14, // degrees of random jitter on the branch angle, breaks fractal regularity
96
+ lengthRatio: 0.62, // child length / parent length
97
+ trunkLength: 9, // trunk length in world units; sets the tree's height
98
+ trunkRadius: 0.42, // base radius of the trunk
99
+ taper: 0.55, // a branch thins to ( 1 - taper ) of its base radius along its own length
100
+ taperCurve: 0.7, // < 1 keeps the bole full then tapers ( real trees ), 1 = straight cone
101
+ rootFlare: 0.6, // how much the trunk swells at the very base
102
+ flareFrac: 0.18, // fraction of the trunk over which the flare acts
103
+ radiusExponent: 2.3, // pipe model ( da Vinci ): childBase = parentBase × ( 1 / children )^( 1 / radiusExponent )
104
+ minRadius: 0.05, // hair-thin floor so twigs don't taper to a sliver
105
+ minLength: 0.6, // branches shorter than this stop recursing
106
+ droop: 0.05, // gravity sag per branch ( ≈ droop × length ); the trunk stays upright
107
+ upPull: 0.3, // phototropism: 0 = a bare spread cone ( many branches aim down ), 1 = straight up
108
+ gnarl: [ 0.05, 0.16, 0.26, 0.32 ], // per-level random wobble on each tube segment
109
+ radialSegments: 6, // ring vertices around a tube ( drops by one per level for thin twigs )
110
+ sectionLength: 1.3, // world units per tube segment, so a tall trunk stays smooth
111
+ childStart: 0.12, // fraction up a sub-branch before children appear
112
+ trunkClear: 0.25 // fraction of the trunk kept bare before the crown ( raise for a tall clean bole )
113
+ };
114
+
115
+ // a fluent setter for every default — setSeed(), setLevels(), setChildren(), … — each
116
+ // storing its value and returning `this`, so the API stays in sync with the parameters
117
+ for ( const key of Object.keys( TreeGenerator.defaults ) ) {
118
+
119
+ TreeGenerator.prototype[ 'set' + key[ 0 ].toUpperCase() + key.slice( 1 ) ] = function ( value ) {
120
+
121
+ this.parameters[ key ] = value;
122
+ return this;
123
+
124
+ };
125
+
126
+ }
127
+
128
+ // --- skeleton ------------------------------------------------------------
129
+
130
+ // Grows one branch as a gently curved, tapered tube and recurses, collecting the tube
131
+ // into `tubes`. The tube is swept with a parallel-transport frame ( rotated by the same
132
+ // rotation that bends the tangent each step ) so it never twists, unlike a naive Frenet
133
+ // frame. Children fork off the upper part of the branch by the pipe model.
134
+ function growBranch( tubes, base, dir, length, baseRadius, level, p, random ) {
135
+
136
+ const sections = Math.max( 3, Math.min( 24, Math.round( length / p.sectionLength ) ) ); // ring count tracks length
137
+ const radial = Math.max( 3, p.radialSegments - level );
138
+ const step = length / sections;
139
+ const gnarl = p.gnarl[ Math.min( level, p.gnarl.length - 1 ) ];
140
+ const start = level === 0 ? p.trunkClear : p.childStart; // the trunk carries a clean bole below its crown
141
+
142
+ let tangent = dir.clone().normalize();
143
+ const normal = perpendicular( tangent );
144
+
145
+ const rings = [];
146
+ const pos = base.clone();
147
+
148
+ for ( let s = 0; s <= sections; s ++ ) {
149
+
150
+ const t = s / sections;
151
+
152
+ // non-linear taper down to ( 1 - taper ) of the base, with a flared root on the trunk
153
+ let radius = baseRadius * ( ( 1 - p.taper ) + p.taper * Math.pow( 1 - t, p.taperCurve ) );
154
+ if ( level === 0 && p.rootFlare > 0 ) {
155
+
156
+ const flare = Math.max( 0, ( p.flareFrac - t ) / p.flareFrac );
157
+ radius *= 1 + p.rootFlare * flare * flare * flare; // sharp knee, confined to the base
158
+
159
+ }
160
+
161
+ rings.push( {
162
+ pos: pos.clone(),
163
+ tangent: tangent.clone(),
164
+ normal: normal.clone(),
165
+ binormal: new Vector3().crossVectors( tangent, normal ),
166
+ radius
167
+ } );
168
+
169
+ if ( s < sections ) {
170
+
171
+ const next = tangent.clone();
172
+ next.x += ( random() * 2 - 1 ) * gnarl;
173
+ next.y += ( random() * 2 - 1 ) * gnarl;
174
+ next.z += ( random() * 2 - 1 ) * gnarl;
175
+ if ( level > 0 ) next.y -= p.droop * step; // branches sag; the trunk stays vertical
176
+ next.normalize();
177
+
178
+ transport( tangent, next, normal ); // keep the frame torsion-free
179
+ pos.addScaledVector( next, step );
180
+ tangent = next;
181
+
182
+ }
183
+
184
+ }
185
+
186
+ tubes.push( { rings, radial } );
187
+
188
+ if ( level >= p.levels - 1 || length < p.minLength ) return;
189
+
190
+ // fork: children spread along the upper branch, each tilted off the local tangent,
191
+ // rolled by the golden angle, and much thinner than the parent ( pipe model )
192
+
193
+ const n = p.children[ Math.min( level, p.children.length - 1 ) ];
194
+ const angle = p.branchAngle[ Math.min( level, p.branchAngle.length - 1 ) ];
195
+ const pipeDrop = Math.pow( 1 / n, 1 / p.radiusExponent );
196
+
197
+ for ( let i = 0; i < n; i ++ ) {
198
+
199
+ const t = start + ( i + 0.5 + ( random() - 0.5 ) * 0.6 ) / n * ( 1 - start );
200
+ const ring = ringAt( rings, t );
201
+
202
+ const tilt = ( angle + ( random() * 2 - 1 ) * p.angleVariance ) * DEG2RAD;
203
+ const roll = i * GOLDEN_ANGLE + ( random() * 2 - 1 ) * 0.4;
204
+
205
+ // tilt off a perpendicular axis FIRST, then roll about the parent axis, then pull
206
+ // back toward the light ( else the roll sends half the children downward )
207
+ const childDir = ring.tangent.clone()
208
+ .applyAxisAngle( ring.normal, tilt )
209
+ .applyAxisAngle( ring.tangent, roll );
210
+ if ( p.upPull > 0 ) childDir.lerp( UP, p.upPull ).normalize();
211
+
212
+ // the pipe-model drop, but never fatter than the wood it leaves nor below the floor
213
+ const childBase = Math.max( p.minRadius, Math.min( baseRadius * pipeDrop, ring.radius ) );
214
+
215
+ growBranch( tubes, ring.pos, childDir, length * p.lengthRatio, childBase, level + 1, p, random );
216
+
217
+ }
218
+
219
+ }
220
+
221
+ // a unit vector perpendicular to v ( cross with the least-aligned axis )
222
+ function perpendicular( v ) {
223
+
224
+ const a = Math.abs( v.x ) < 0.9 ? _axis.set( 1, 0, 0 ) : _axis.set( 0, 1, 0 );
225
+ return new Vector3().crossVectors( v, a ).normalize();
226
+
227
+ }
228
+
229
+ // rotate frame vector n by the rotation that maps tangent t0 onto t1
230
+ function transport( t0, t1, n ) {
231
+
232
+ _axis.crossVectors( t0, t1 );
233
+ const sin = _axis.length();
234
+ if ( sin < 1e-6 ) return; // already parallel
235
+ _axis.divideScalar( sin );
236
+ n.applyAxisAngle( _axis, Math.atan2( sin, t0.dot( t1 ) ) );
237
+
238
+ }
239
+
240
+ // sample the branch frame at fraction t ( 0..1 ) for spawning a child
241
+ function ringAt( rings, t ) {
242
+
243
+ const f = Math.max( 0, Math.min( 0.999, t ) ) * ( rings.length - 1 );
244
+ const i = Math.floor( f );
245
+ const frac = f - i;
246
+ const a = rings[ i ];
247
+ const b = rings[ Math.min( i + 1, rings.length - 1 ) ];
248
+
249
+ return {
250
+ pos: a.pos.clone().lerp( b.pos, frac ),
251
+ tangent: a.tangent.clone().lerp( b.tangent, frac ).normalize(),
252
+ normal: a.normal.clone().lerp( b.normal, frac ).normalize(),
253
+ radius: a.radius + ( b.radius - a.radius ) * frac
254
+ };
255
+
256
+ }
257
+
258
+ // --- geometry ------------------------------------------------------------
259
+
260
+ // Sweeps a tube through the rings: each ring is a loop of `radial` vertices in its
261
+ // ( normal, binormal ) plane, the outward radial direction being the vertex normal.
262
+ // Ring vertices are computed once into a reused scratch, then stitched straight into the
263
+ // preallocated geometry arrays — no per-vertex objects.
264
+ function emitTube( positions, normals, offset, rings, radial ) {
265
+
266
+ const stride = ( radial + 1 ) * 6; // one ring loop: ( position, normal ) per vertex
267
+ const needed = rings.length * stride;
268
+ if ( _ring.length < needed ) _ring = new Float32Array( needed );
269
+
270
+ const ring = _ring;
271
+
272
+ for ( let r = 0; r < rings.length; r ++ ) {
273
+
274
+ const { pos, normal, binormal, radius } = rings[ r ];
275
+ let o = r * stride;
276
+
277
+ for ( let j = 0; j <= radial; j ++ ) {
278
+
279
+ const a = j / radial * TAU;
280
+ const c = Math.cos( a );
281
+ const s = Math.sin( a );
282
+ const nx = c * normal.x + s * binormal.x;
283
+ const ny = c * normal.y + s * binormal.y;
284
+ const nz = c * normal.z + s * binormal.z;
285
+
286
+ ring[ o ++ ] = pos.x + nx * radius;
287
+ ring[ o ++ ] = pos.y + ny * radius;
288
+ ring[ o ++ ] = pos.z + nz * radius;
289
+ ring[ o ++ ] = nx;
290
+ ring[ o ++ ] = ny;
291
+ ring[ o ++ ] = nz;
292
+
293
+ }
294
+
295
+ }
296
+
297
+ // stitch consecutive rings into quads ( two triangles ), wound so normals face out
298
+
299
+ for ( let r = 0; r < rings.length - 1; r ++ ) {
300
+
301
+ const a = r * stride;
302
+ const b = ( r + 1 ) * stride;
303
+
304
+ for ( let j = 0; j < radial; j ++ ) {
305
+
306
+ const aL = a + j * 6, aR = a + ( j + 1 ) * 6;
307
+ const bL = b + j * 6, bR = b + ( j + 1 ) * 6;
308
+
309
+ offset = copyVertex( positions, normals, offset, ring, aL );
310
+ offset = copyVertex( positions, normals, offset, ring, bR );
311
+ offset = copyVertex( positions, normals, offset, ring, bL );
312
+
313
+ offset = copyVertex( positions, normals, offset, ring, aL );
314
+ offset = copyVertex( positions, normals, offset, ring, aR );
315
+ offset = copyVertex( positions, normals, offset, ring, bR );
316
+
317
+ }
318
+
319
+ }
320
+
321
+ return offset;
322
+
323
+ }
324
+
325
+ // copies one ( position, normal ) vertex from the ring scratch into the geometry arrays
326
+ function copyVertex( positions, normals, offset, ring, i ) {
327
+
328
+ const o = offset * 3;
329
+ positions[ o ] = ring[ i ]; positions[ o + 1 ] = ring[ i + 1 ]; positions[ o + 2 ] = ring[ i + 2 ];
330
+ normals[ o ] = ring[ i + 3 ]; normals[ o + 1 ] = ring[ i + 4 ]; normals[ o + 2 ] = ring[ i + 5 ];
331
+
332
+ return offset + 1;
333
+
334
+ }
335
+
336
+ // --- deterministic PRNG ( mulberry32 ) -----------------------------------
337
+
338
+ function createRandom( seed ) {
339
+
340
+ let s = ( seed >>> 0 ) || 1;
341
+
342
+ return function () {
343
+
344
+ s = ( s + 0x6D2B79F5 ) | 0;
345
+ let t = Math.imul( s ^ ( s >>> 15 ), 1 | s );
346
+ t = ( t + Math.imul( t ^ ( t >>> 7 ), 61 | t ) ) ^ t;
347
+ return ( ( t ^ ( t >>> 14 ) ) >>> 0 ) / 4294967296;
348
+
349
+ };
350
+
351
+ }
352
+
353
+ // --- material ------------------------------------------------------------
354
+
355
+ /**
356
+ * A simple bark material for a {@link TreeGenerator} mesh: a low-saturation brown with a
357
+ * faint, vertically-stretched grain, so trunks read near-black against bright fog.
358
+ *
359
+ * @param {Object} [parameters] - `barkColor` ( a hex, THREE.Color or TSL node ).
360
+ * @return {MeshStandardNodeMaterial}
361
+ */
362
+ function createTreeMaterial( parameters = {} ) {
363
+
364
+ const c = parameters.barkColor;
365
+ const barkColor = c === undefined ? color( 0x4b3a2b ) : ( c.isColor || typeof c === 'number' ? color( c ) : c );
366
+
367
+ const material = new MeshStandardNodeMaterial();
368
+ const grain = mx_fractal_noise_float( positionLocal.mul( vec3( 2.5, 0.4, 2.5 ) ), 3 ).mul( 0.18 );
369
+ material.colorNode = barkColor.mul( grain.add( 0.9 ) );
370
+ material.roughnessNode = float( 0.95 );
371
+ material.metalnessNode = float( 0 );
372
+
373
+ return material;
374
+
375
+ }
376
+
377
+ export { TreeGenerator, createTreeMaterial };
@@ -0,0 +1,253 @@
1
+ import {
2
+ ExtrudeGeometry,
3
+ Group,
4
+ InstancedMesh,
5
+ MeshStandardNodeMaterial,
6
+ Shape
7
+ } from 'three/webgpu';
8
+
9
+ import { cameraPosition, color, float, floor, Fn, fract, fwidth, If, mix, mx_noise_float, normalView, normalWorldGeometry, positionView, positionWorld, sin, smoothstep } from 'three/tsl';
10
+
11
+ /**
12
+ * Generates the raised sidewalk for a city's blocks: per block, a rounded-corner concrete
13
+ * slab rimmed by a distinct granite kerbstone that stands proud of the walking surface and
14
+ * drops to the road. Instanced across a list of placements and dressed with its own
15
+ * procedural material ( poured concrete flags, scored expansion joints, granite curb ).
16
+ * Returns a `THREE.Group` of two instanced meshes — the walking slab and the curb.
17
+ *
18
+ * Unlike the building generator, this one owns its materials: the slab and curb
19
+ * geometry and the TSL that shades them live together here.
20
+ *
21
+ * ```js
22
+ * const sidewalk = new SidewalkGenerator( { width: 90, depth: 60, height: 0.5 } );
23
+ * scene.add( sidewalk.build( placements ) ); // placements: Matrix4[]
24
+ * ```
25
+ */
26
+ class SidewalkGenerator {
27
+
28
+ constructor( parameters = {} ) {
29
+
30
+ this.parameters = Object.assign( {}, SidewalkGenerator.defaults, parameters );
31
+
32
+ this.material = null; // the procedural concrete, built once and reused across rebuilds
33
+ this.curbMaterial = null; // the procedural granite curb, likewise
34
+ this.mesh = null;
35
+
36
+ }
37
+
38
+ build( placements ) {
39
+
40
+ this.dispose();
41
+
42
+ const { width, depth, height, radius, curbWidth, curbLip } = this.parameters;
43
+
44
+ if ( this.material === null ) this.material = createSidewalkMaterial();
45
+ if ( this.curbMaterial === null ) this.curbMaterial = createCurbMaterial();
46
+
47
+ // the walking slab and the curb are separate meshes so each carries its own material
48
+ const slab = new InstancedMesh( slabGeometry( width, depth, height, radius, curbWidth ), this.material, placements.length );
49
+ const curb = new InstancedMesh( curbGeometry( width, depth, height, radius, curbWidth, curbLip ), this.curbMaterial, placements.length );
50
+
51
+ for ( let i = 0; i < placements.length; i ++ ) {
52
+
53
+ slab.setMatrixAt( i, placements[ i ] );
54
+ curb.setMatrixAt( i, placements[ i ] );
55
+
56
+ }
57
+
58
+ slab.computeBoundingSphere();
59
+ curb.computeBoundingSphere();
60
+ slab.receiveShadow = curb.receiveShadow = true;
61
+
62
+ const group = new Group();
63
+ group.name = 'Sidewalk';
64
+ group.add( slab, curb );
65
+
66
+ this.mesh = group;
67
+
68
+ return group;
69
+
70
+ }
71
+
72
+ dispose() {
73
+
74
+ if ( this.mesh === null ) return;
75
+
76
+ this.mesh.traverse( ( o ) => o.geometry && o.geometry.dispose() );
77
+ this.mesh = null;
78
+
79
+ }
80
+
81
+ }
82
+
83
+ SidewalkGenerator.defaults = {
84
+ width: 90, // the block footprint each slab covers
85
+ depth: 60,
86
+ height: 0.5, // walking-surface height above the road
87
+ radius: 5, // corner radius, so the sidewalk turns each intersection instead of a hard 90°
88
+ curbWidth: 0.13, // top width of the granite kerbstone rimming the block ( ~5 in )
89
+ curbLip: 0.01 // how far the curb stands proud of the walking surface ( near-flush )
90
+ };
91
+
92
+ // --- geometry ------------------------------------------------------------
93
+
94
+ // the block footprint as a rounded-corner rectangle ( centred at the origin ), so the
95
+ // sidewalk turns each intersection instead of meeting the kerb at a hard 90°
96
+ function roundedRect( width, depth, radius ) {
97
+
98
+ const w = width / 2;
99
+ const d = depth / 2;
100
+ const r = Math.min( radius, w, d );
101
+
102
+ const shape = new Shape();
103
+ shape.moveTo( - w + r, - d );
104
+ shape.lineTo( w - r, - d );
105
+ shape.quadraticCurveTo( w, - d, w, - d + r );
106
+ shape.lineTo( w, d - r );
107
+ shape.quadraticCurveTo( w, d, w - r, d );
108
+ shape.lineTo( - w + r, d );
109
+ shape.quadraticCurveTo( - w, d, - w, d - r );
110
+ shape.lineTo( - w, - d + r );
111
+ shape.quadraticCurveTo( - w, - d, - w + r, - d );
112
+
113
+ return shape;
114
+
115
+ }
116
+
117
+ // extrude a footprint outline up by `height` ( the extrusion runs +Z; stand it up so height is +Y )
118
+ function extrudeUp( shape, height ) {
119
+
120
+ const geometry = new ExtrudeGeometry( shape, { depth: height, bevelEnabled: false, curveSegments: 6 } );
121
+ geometry.rotateX( - Math.PI / 2 );
122
+
123
+ return geometry;
124
+
125
+ }
126
+
127
+ // the walking slab: the inner concrete surface, inset to sit inside the curb and overlapping
128
+ // it slightly so the seam is buried. base at y = 0, walking surface at `height`.
129
+ function slabGeometry( width, depth, height, radius, curbWidth ) {
130
+
131
+ const innerRadius = Math.max( 0.5, radius - curbWidth );
132
+ return extrudeUp( roundedRect( width - 2 * curbWidth + 0.06, depth - 2 * curbWidth + 0.06, innerRadius ), height );
133
+
134
+ }
135
+
136
+ // the curb: a distinct full-height kerbstone band rimming the block ( the outline with an
137
+ // inset hole ), standing proud of the walking slab by `curbLip` and dropping to the road.
138
+ function curbGeometry( width, depth, height, radius, curbWidth, curbLip ) {
139
+
140
+ const innerRadius = Math.max( 0.5, radius - curbWidth );
141
+ const shape = roundedRect( width, depth, radius );
142
+ shape.holes.push( roundedRect( width - 2 * curbWidth, depth - 2 * curbWidth, innerRadius ) );
143
+ return extrudeUp( shape, height + curbLip );
144
+
145
+ }
146
+
147
+ // --- material ------------------------------------------------------------
148
+
149
+ // derivative-based bump for a procedural, world-space height field. the built-in bumpMap
150
+ // offsets the UV to read its height, so it returns a zero gradient for a height keyed off
151
+ // world position; this feeds the hardware screen-space derivatives of the height into
152
+ // Mikkelsen's surface-gradient method so the relief actually perturbs the normal.
153
+ function bumpNormal( height ) {
154
+
155
+ const dpdx = positionView.dFdx();
156
+ const dpdy = positionView.dFdy();
157
+ const r1 = dpdy.cross( normalView );
158
+ const r2 = normalView.cross( dpdx );
159
+ const det = dpdx.dot( r1 );
160
+ const grad = det.sign().mul( height.dFdx().mul( r1 ).add( height.dFdy().mul( r2 ) ) );
161
+
162
+ return det.abs().mul( normalView ).sub( grad ).normalize();
163
+
164
+ }
165
+
166
+ // an antialiased line repeated at every multiple of `period` ( the scored joints )
167
+ function gridLine( coord, period, halfWidth ) {
168
+
169
+ const g = coord.div( period );
170
+ const d = float( 0.5 ).sub( fract( g ).sub( 0.5 ).abs() ); // distance to nearest line, in periods
171
+ const aa = fwidth( g ).max( 0.0001 );
172
+ const hw = halfWidth / period;
173
+ return smoothstep( float( hw ).add( aa ), float( hw ).sub( aa ), d );
174
+
175
+ }
176
+
177
+ // a noise term that only resolves up close: sampled inside a detail branch ( and kept in its
178
+ // own single-output Fn, so it is evaluated only in the output flow that consumes it )
179
+ function detailNoise( p, detail, scale, amp ) {
180
+
181
+ return Fn( () => {
182
+
183
+ const n = float( 0 ).toVar();
184
+
185
+ If( detail.greaterThan( 0 ), () => {
186
+
187
+ n.assign( mx_noise_float( p.mul( scale ) ).mul( amp ) );
188
+
189
+ } );
190
+
191
+ return n;
192
+
193
+ } )();
194
+
195
+ }
196
+
197
+ function createSidewalkMaterial() {
198
+
199
+ // concrete flags: each poured slab a slightly different tone, fine aggregate speckle
200
+ // and expansion joints scored on a grid both ways
201
+
202
+ const p = positionWorld;
203
+ const detail = smoothstep( 200, 18, p.distance( cameraPosition ) );
204
+
205
+ const panel = 1.5; // flag size ( ~5 ft NYC sidewalk flags )
206
+ const panelHash = fract( sin( floor( p.x.div( panel ) ).mul( 127.1 ).add( floor( p.z.div( panel ) ).mul( 311.7 ) ) ).mul( 43758.5453 ) );
207
+
208
+ const tone = mx_noise_float( p.mul( 0.5 ) ).mul( 0.5 ).add( 0.5 );
209
+
210
+ // fine aggregate speckle ( grit, tinting the colour ) and grain relief ( driving the normal )
211
+ const grit = detailNoise( p, detail, 14, 0.07 ).mul( detail );
212
+ const grain = detailNoise( p, detail, 3, 0.003 );
213
+
214
+ const base = mix( color( 0x6f6f68 ), color( 0x8c8c82 ), tone ).mul( panelHash.sub( 0.5 ).mul( 0.16 ).add( 1 ) ); // per-flag tone
215
+ const concrete = base.add( grit );
216
+
217
+ const joints = gridLine( p.x, panel, 0.045 ).max( gridLine( p.z, panel, 0.045 ) ).mul( detail );
218
+
219
+ const material = new MeshStandardNodeMaterial();
220
+ material.colorNode = concrete.mul( joints.mul( 0.45 ).oneMinus() );
221
+ material.roughnessNode = float( 0.92 ).sub( panelHash.mul( 0.05 ) );
222
+ material.normalNode = bumpNormal( grain.sub( joints.mul( 0.012 ) ).mul( detail ) ); // world units: ~3 mm grain, ~12 mm scored joints
223
+
224
+ return material;
225
+
226
+ }
227
+
228
+ function createCurbMaterial() {
229
+
230
+ // granite kerbstone: a dense, cool grey stone — darker and smoother than the concrete
231
+ // flags — with a fine speckle, segment joints every ~1.5 m and a grimier road-facing face
232
+
233
+ const p = positionWorld;
234
+ const detail = smoothstep( 200, 18, p.distance( cameraPosition ) );
235
+
236
+ const tone = mx_noise_float( p.mul( 0.6 ) ).mul( 0.5 ).add( 0.5 );
237
+ const stone = mix( color( 0x46463f ), color( 0x5c5c54 ), tone ).add( detailNoise( p, detail, 18, 0.05 ).mul( detail ) ); // dark cool granite, fine speckle
238
+
239
+ const seg = 1.5; // kerbstone segment length
240
+ const joints = gridLine( p.x, seg, 0.04 ).max( gridLine( p.z, seg, 0.04 ) ).mul( detail );
241
+ const top = smoothstep( 0.5, 0.85, normalWorldGeometry.y ); // 1 on the curb top, 0 on its walls
242
+ const dressed = mix( stone.mul( 0.7 ), stone, top ).mul( joints.mul( 0.4 ).oneMinus() ); // grimier on the road-facing face
243
+
244
+ const material = new MeshStandardNodeMaterial();
245
+ material.colorNode = dressed;
246
+ material.roughnessNode = float( 0.7 ).add( tone.mul( 0.1 ) ); // flamed granite: matte, a touch smoother than the concrete sidewalk
247
+ material.normalNode = bumpNormal( detailNoise( p, detail, 4, 0.002 ).mul( detail ) ); // fine granite grain
248
+
249
+ return material;
250
+
251
+ }
252
+
253
+ export { SidewalkGenerator };