super-three 0.179.0 → 0.184.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 (696) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +3 -4
  3. package/build/three.cjs +14522 -12207
  4. package/build/three.core.js +12005 -10954
  5. package/build/three.core.min.js +2 -2
  6. package/build/three.module.js +2270 -1005
  7. package/build/three.module.min.js +2 -2
  8. package/build/three.tsl.js +63 -18
  9. package/build/three.tsl.min.js +2 -2
  10. package/build/three.webgpu.js +16573 -7890
  11. package/build/three.webgpu.min.js +2 -2
  12. package/build/three.webgpu.nodes.js +16533 -7888
  13. package/build/three.webgpu.nodes.min.js +2 -2
  14. package/examples/fonts/MPLUSRounded1c/MPLUSRounded1c-Regular.typeface.json.zip +0 -0
  15. package/examples/fonts/MPLUSRounded1c/OFL.txt +91 -0
  16. package/examples/jsm/Addons.js +12 -4
  17. package/examples/jsm/animation/CCDIKSolver.js +8 -4
  18. package/examples/jsm/controls/ArcballControls.js +15 -12
  19. package/examples/jsm/controls/DragControls.js +9 -59
  20. package/examples/jsm/controls/FirstPersonControls.js +61 -57
  21. package/examples/jsm/controls/FlyControls.js +5 -1
  22. package/examples/jsm/controls/MapControls.js +55 -1
  23. package/examples/jsm/controls/OrbitControls.js +113 -10
  24. package/examples/jsm/controls/PointerLockControls.js +2 -10
  25. package/examples/jsm/controls/TrackballControls.js +9 -9
  26. package/examples/jsm/controls/TransformControls.js +35 -3
  27. package/examples/jsm/csm/CSM.js +2 -1
  28. package/examples/jsm/csm/CSMShadowNode.js +6 -2
  29. package/examples/jsm/effects/AnaglyphEffect.js +102 -7
  30. package/examples/jsm/effects/AsciiEffect.js +8 -8
  31. package/examples/jsm/environments/ColorEnvironment.js +59 -0
  32. package/examples/jsm/environments/RoomEnvironment.js +3 -0
  33. package/examples/jsm/exporters/DRACOExporter.js +2 -2
  34. package/examples/jsm/exporters/EXRExporter.js +2 -2
  35. package/examples/jsm/exporters/GLTFExporter.js +185 -34
  36. package/examples/jsm/exporters/KTX2Exporter.js +4 -2
  37. package/examples/jsm/exporters/PLYExporter.js +1 -1
  38. package/examples/jsm/exporters/USDZExporter.js +31 -5
  39. package/examples/jsm/geometries/DecalGeometry.js +3 -3
  40. package/examples/jsm/geometries/ParametricGeometry.js +1 -1
  41. package/examples/jsm/geometries/TeapotGeometry.js +2 -2
  42. package/examples/jsm/geometries/TextGeometry.js +21 -2
  43. package/examples/jsm/gpgpu/BitonicSort.js +715 -0
  44. package/examples/jsm/helpers/AnimationPathHelper.js +302 -0
  45. package/examples/jsm/helpers/LightProbeGridHelper.js +221 -0
  46. package/examples/jsm/helpers/LightProbeHelperGPU.js +1 -1
  47. package/examples/jsm/helpers/TextureHelperGPU.js +1 -1
  48. package/examples/jsm/helpers/ViewHelper.js +110 -13
  49. package/examples/jsm/inspector/Extension.js +13 -0
  50. package/examples/jsm/inspector/Inspector.js +542 -0
  51. package/examples/jsm/inspector/RendererInspector.js +425 -0
  52. package/examples/jsm/inspector/extensions/extensions.json +6 -0
  53. package/examples/jsm/inspector/extensions/tsl-graph/TSLGraphEditor.js +916 -0
  54. package/examples/jsm/inspector/extensions/tsl-graph/TSLGraphLoader.js +281 -0
  55. package/examples/jsm/inspector/tabs/Console.js +238 -0
  56. package/examples/jsm/inspector/tabs/Memory.js +128 -0
  57. package/examples/jsm/inspector/tabs/Parameters.js +380 -0
  58. package/examples/jsm/inspector/tabs/Performance.js +268 -0
  59. package/examples/jsm/inspector/tabs/Settings.js +264 -0
  60. package/examples/jsm/inspector/tabs/Timeline.js +1611 -0
  61. package/examples/jsm/inspector/tabs/Viewer.js +268 -0
  62. package/examples/jsm/inspector/ui/Graph.js +95 -0
  63. package/examples/jsm/inspector/ui/Item.js +170 -0
  64. package/examples/jsm/inspector/ui/List.js +75 -0
  65. package/examples/jsm/inspector/ui/Profiler.js +2072 -0
  66. package/examples/jsm/inspector/ui/Style.js +1667 -0
  67. package/examples/jsm/inspector/ui/Tab.js +265 -0
  68. package/examples/jsm/inspector/ui/Values.js +476 -0
  69. package/examples/jsm/inspector/ui/utils.js +69 -0
  70. package/examples/jsm/interaction/InteractionManager.js +226 -0
  71. package/examples/jsm/interactive/HTMLMesh.js +6 -10
  72. package/examples/jsm/interactive/InteractiveGroup.js +1 -1
  73. package/examples/jsm/interactive/SelectionBox.js +30 -0
  74. package/examples/jsm/libs/ktx-parse.module.js +1 -1
  75. package/examples/jsm/libs/meshopt_decoder.module.js +9 -8
  76. package/examples/jsm/lighting/DynamicLighting.js +82 -0
  77. package/examples/jsm/lighting/LightProbeGrid.js +651 -0
  78. package/examples/jsm/lights/RectAreaLightTexturesLib.js +1 -1
  79. package/examples/jsm/lines/Line2.js +3 -3
  80. package/examples/jsm/lines/LineGeometry.js +1 -1
  81. package/examples/jsm/lines/LineMaterial.js +7 -1
  82. package/examples/jsm/lines/LineSegments2.js +2 -2
  83. package/examples/jsm/lines/Wireframe.js +2 -2
  84. package/examples/jsm/lines/WireframeGeometry2.js +1 -1
  85. package/examples/jsm/lines/webgpu/LineSegments2.js +1 -1
  86. package/examples/jsm/lines/webgpu/Wireframe.js +1 -1
  87. package/examples/jsm/loaders/3DMLoader.js +5 -4
  88. package/examples/jsm/loaders/3MFLoader.js +3 -3
  89. package/examples/jsm/loaders/AMFLoader.js +2 -2
  90. package/examples/jsm/loaders/ColladaLoader.js +27 -4029
  91. package/examples/jsm/loaders/DDSLoader.js +1 -1
  92. package/examples/jsm/loaders/DRACOLoader.js +73 -22
  93. package/examples/jsm/loaders/EXRLoader.js +692 -53
  94. package/examples/jsm/loaders/FBXLoader.js +237 -39
  95. package/examples/jsm/loaders/FontLoader.js +23 -5
  96. package/examples/jsm/loaders/GCodeLoader.js +34 -8
  97. package/examples/jsm/loaders/GLTFLoader.js +159 -185
  98. package/examples/jsm/loaders/HDRCubeTextureLoader.js +5 -5
  99. package/examples/jsm/loaders/HDRLoader.js +485 -0
  100. package/examples/jsm/loaders/KMZLoader.js +5 -5
  101. package/examples/jsm/loaders/KTX2Loader.js +162 -53
  102. package/examples/jsm/loaders/KTXLoader.js +2 -2
  103. package/examples/jsm/loaders/LDrawLoader.js +41 -50
  104. package/examples/jsm/loaders/LUT3dlLoader.js +2 -2
  105. package/examples/jsm/loaders/LUTCubeLoader.js +1 -1
  106. package/examples/jsm/loaders/LWOLoader.js +9 -41
  107. package/examples/jsm/loaders/MaterialXLoader.js +22 -5
  108. package/examples/jsm/loaders/NRRDLoader.js +2 -2
  109. package/examples/jsm/loaders/OBJLoader.js +1 -1
  110. package/examples/jsm/loaders/PCDLoader.js +4 -2
  111. package/examples/jsm/loaders/PDBLoader.js +1 -1
  112. package/examples/jsm/loaders/RGBELoader.js +7 -473
  113. package/examples/jsm/loaders/SVGLoader.js +4 -4
  114. package/examples/jsm/loaders/TDSLoader.js +0 -2
  115. package/examples/jsm/loaders/TGALoader.js +0 -2
  116. package/examples/jsm/loaders/TTFLoader.js +4 -4
  117. package/examples/jsm/loaders/USDLoader.js +100 -40
  118. package/examples/jsm/loaders/UltraHDRLoader.js +287 -162
  119. package/examples/jsm/loaders/VOXLoader.js +660 -117
  120. package/examples/jsm/loaders/VRMLLoader.js +79 -2
  121. package/examples/jsm/loaders/VTKLoader.js +42 -25
  122. package/examples/jsm/loaders/collada/ColladaComposer.js +3044 -0
  123. package/examples/jsm/loaders/collada/ColladaParser.js +1977 -0
  124. package/examples/jsm/loaders/lwo/IFFParser.js +1 -1
  125. package/examples/jsm/loaders/usd/USDAParser.js +450 -363
  126. package/examples/jsm/loaders/usd/USDCParser.js +1867 -6
  127. package/examples/jsm/loaders/usd/USDComposer.js +4594 -0
  128. package/examples/jsm/materials/LDrawConditionalLineNodeMaterial.js +2 -2
  129. package/examples/jsm/materials/WoodNodeMaterial.js +533 -0
  130. package/examples/jsm/math/ColorSpaces.js +19 -1
  131. package/examples/jsm/math/ConvexHull.js +3 -3
  132. package/examples/jsm/math/ImprovedNoise.js +1 -1
  133. package/examples/jsm/math/Lut.js +2 -2
  134. package/examples/jsm/math/Octree.js +131 -1
  135. package/examples/jsm/math/SimplexNoise.js +1 -1
  136. package/examples/jsm/misc/GPUComputationRenderer.js +2 -0
  137. package/examples/jsm/misc/MD2CharacterComplex.js +1 -1
  138. package/examples/jsm/misc/ProgressiveLightMap.js +9 -3
  139. package/examples/jsm/misc/ProgressiveLightMapGPU.js +7 -1
  140. package/examples/jsm/misc/RollerCoaster.js +42 -4
  141. package/examples/jsm/misc/TubePainter.js +383 -40
  142. package/examples/jsm/misc/Volume.js +1 -2
  143. package/examples/jsm/misc/VolumeSlice.js +0 -1
  144. package/examples/jsm/modifiers/SimplifyModifier.js +1 -1
  145. package/examples/jsm/modifiers/TessellateModifier.js +1 -1
  146. package/examples/jsm/objects/LensflareMesh.js +1 -1
  147. package/examples/jsm/objects/Reflector.js +73 -25
  148. package/examples/jsm/objects/ReflectorForSSRPass.js +1 -0
  149. package/examples/jsm/objects/Sky.js +91 -7
  150. package/examples/jsm/objects/SkyMesh.js +151 -17
  151. package/examples/jsm/objects/Water.js +7 -6
  152. package/examples/jsm/objects/Water2.js +5 -3
  153. package/examples/jsm/objects/WaterMesh.js +11 -13
  154. package/examples/jsm/physics/AmmoPhysics.js +12 -7
  155. package/examples/jsm/physics/JoltPhysics.js +10 -6
  156. package/examples/jsm/physics/RapierPhysics.js +9 -5
  157. package/examples/jsm/postprocessing/EffectComposer.js +7 -5
  158. package/examples/jsm/postprocessing/GlitchPass.js +2 -2
  159. package/examples/jsm/postprocessing/OutlinePass.js +1 -1
  160. package/examples/jsm/postprocessing/OutputPass.js +9 -0
  161. package/examples/jsm/postprocessing/RenderPass.js +10 -0
  162. package/examples/jsm/postprocessing/RenderTransitionPass.js +1 -1
  163. package/examples/jsm/postprocessing/SSRPass.js +37 -8
  164. package/examples/jsm/postprocessing/UnrealBloomPass.js +56 -24
  165. package/examples/jsm/renderers/CSS2DRenderer.js +16 -5
  166. package/examples/jsm/renderers/CSS3DRenderer.js +8 -7
  167. package/examples/jsm/renderers/Projector.js +246 -28
  168. package/examples/jsm/renderers/SVGRenderer.js +175 -61
  169. package/examples/jsm/shaders/ACESFilmicToneMappingShader.js +1 -1
  170. package/examples/jsm/shaders/AfterimageShader.js +1 -1
  171. package/examples/jsm/shaders/BleachBypassShader.js +1 -1
  172. package/examples/jsm/shaders/BokehShader.js +1 -1
  173. package/examples/jsm/shaders/BokehShader2.js +1 -1
  174. package/examples/jsm/shaders/DotScreenShader.js +1 -1
  175. package/examples/jsm/shaders/FocusShader.js +1 -1
  176. package/examples/jsm/shaders/GTAOShader.js +21 -8
  177. package/examples/jsm/shaders/HalftoneShader.js +12 -1
  178. package/examples/jsm/shaders/KaleidoShader.js +1 -1
  179. package/examples/jsm/shaders/PoissonDenoiseShader.js +8 -4
  180. package/examples/jsm/shaders/SAOShader.js +17 -4
  181. package/examples/jsm/shaders/SSAOShader.js +11 -1
  182. package/examples/jsm/shaders/SSRShader.js +7 -6
  183. package/examples/jsm/shaders/SepiaShader.js +1 -1
  184. package/examples/jsm/shaders/SubsurfaceScatteringShader.js +1 -1
  185. package/examples/jsm/shaders/TriangleBlurShader.js +1 -1
  186. package/examples/jsm/shaders/UnpackDepthRGBAShader.js +3 -5
  187. package/examples/jsm/shaders/VignetteShader.js +1 -1
  188. package/examples/jsm/transpiler/AST.js +44 -0
  189. package/examples/jsm/transpiler/GLSLDecoder.js +85 -25
  190. package/examples/jsm/transpiler/ShaderToyDecoder.js +2 -0
  191. package/examples/jsm/transpiler/TSLEncoder.js +52 -10
  192. package/examples/jsm/transpiler/TranspilerUtils.js +3 -3
  193. package/examples/jsm/transpiler/WGSLEncoder.js +51 -0
  194. package/examples/jsm/tsl/WebGLNodesHandler.js +605 -0
  195. package/examples/jsm/tsl/display/AfterImageNode.js +36 -24
  196. package/examples/jsm/tsl/display/AnaglyphPassNode.js +458 -16
  197. package/examples/jsm/tsl/display/AnamorphicNode.js +40 -5
  198. package/examples/jsm/tsl/display/BilateralBlurNode.js +374 -0
  199. package/examples/jsm/tsl/display/BloomNode.js +23 -9
  200. package/examples/jsm/tsl/display/CRT.js +150 -0
  201. package/examples/jsm/tsl/display/ChromaticAberrationNode.js +5 -37
  202. package/examples/jsm/tsl/display/DenoiseNode.js +3 -1
  203. package/examples/jsm/tsl/display/DepthOfFieldNode.js +446 -90
  204. package/examples/jsm/tsl/display/DotScreenNode.js +1 -1
  205. package/examples/jsm/tsl/display/FSR1Node.js +477 -0
  206. package/examples/jsm/tsl/display/FXAANode.js +2 -2
  207. package/examples/jsm/tsl/display/GTAONode.js +59 -9
  208. package/examples/jsm/tsl/display/GaussianBlurNode.js +68 -35
  209. package/examples/jsm/tsl/display/GodraysNode.js +615 -0
  210. package/examples/jsm/tsl/display/LensflareNode.js +1 -1
  211. package/examples/jsm/tsl/display/Lut3DNode.js +1 -1
  212. package/examples/jsm/tsl/display/OutlineNode.js +81 -20
  213. package/examples/jsm/tsl/display/ParallaxBarrierPassNode.js +2 -2
  214. package/examples/jsm/tsl/display/PixelationPassNode.js +7 -6
  215. package/examples/jsm/tsl/display/RGBShiftNode.js +2 -2
  216. package/examples/jsm/tsl/display/RetroPassNode.js +263 -0
  217. package/examples/jsm/tsl/display/SMAANode.js +2 -2
  218. package/examples/jsm/tsl/display/SSAAPassNode.js +2 -2
  219. package/examples/jsm/tsl/display/SSGINode.js +638 -0
  220. package/examples/jsm/tsl/display/SSRNode.js +186 -69
  221. package/examples/jsm/tsl/display/SSSNode.js +490 -0
  222. package/examples/jsm/tsl/display/Shape.js +29 -0
  223. package/examples/jsm/tsl/display/SharpenNode.js +283 -0
  224. package/examples/jsm/tsl/display/SobelOperatorNode.js +2 -2
  225. package/examples/jsm/tsl/display/StereoCompositePassNode.js +8 -1
  226. package/examples/jsm/tsl/display/StereoPassNode.js +1 -2
  227. package/examples/jsm/tsl/display/TAAUNode.js +835 -0
  228. package/examples/jsm/tsl/display/TRAANode.js +381 -75
  229. package/examples/jsm/tsl/display/TransitionNode.js +1 -1
  230. package/examples/jsm/tsl/display/boxBlur.js +65 -0
  231. package/examples/jsm/tsl/display/depthAwareBlend.js +80 -0
  232. package/examples/jsm/tsl/display/hashBlur.js +16 -18
  233. package/examples/jsm/tsl/display/radialBlur.js +68 -0
  234. package/examples/jsm/tsl/lighting/DynamicLightsNode.js +300 -0
  235. package/examples/jsm/tsl/lighting/TiledLightsNode.js +21 -1
  236. package/examples/jsm/tsl/lighting/data/AmbientLightDataNode.js +61 -0
  237. package/examples/jsm/tsl/lighting/data/DirectionalLightDataNode.js +111 -0
  238. package/examples/jsm/tsl/lighting/data/HemisphereLightDataNode.js +99 -0
  239. package/examples/jsm/tsl/lighting/data/PointLightDataNode.js +134 -0
  240. package/examples/jsm/tsl/lighting/data/SpotLightDataNode.js +161 -0
  241. package/examples/jsm/tsl/math/Bayer.js +53 -3
  242. package/examples/jsm/utils/BufferGeometryUtils.js +3 -4
  243. package/examples/jsm/utils/ColorUtils.js +76 -0
  244. package/examples/jsm/utils/LDrawUtils.js +1 -1
  245. package/examples/jsm/utils/ShadowMapViewer.js +24 -10
  246. package/examples/jsm/utils/ShadowMapViewerGPU.js +13 -6
  247. package/examples/jsm/utils/SkeletonUtils.js +14 -8
  248. package/examples/jsm/utils/WebGPUTextureUtils.js +1 -1
  249. package/examples/jsm/webxr/OculusHandModel.js +1 -1
  250. package/examples/jsm/webxr/XRControllerModelFactory.js +1 -1
  251. package/examples/jsm/webxr/XRHandMeshModel.js +36 -10
  252. package/examples/jsm/webxr/XRHandModelFactory.js +4 -7
  253. package/package.json +27 -38
  254. package/src/Three.Core.js +7 -3
  255. package/src/Three.TSL.js +61 -16
  256. package/src/Three.WebGPU.Nodes.js +7 -0
  257. package/src/Three.WebGPU.js +11 -0
  258. package/src/Three.js +1 -0
  259. package/src/animation/AnimationAction.js +12 -2
  260. package/src/animation/AnimationClip.js +21 -5
  261. package/src/animation/AnimationMixer.js +9 -3
  262. package/src/animation/AnimationObjectGroup.js +2 -1
  263. package/src/animation/AnimationUtils.js +1 -12
  264. package/src/animation/KeyframeTrack.js +54 -14
  265. package/src/animation/PropertyBinding.js +12 -11
  266. package/src/animation/PropertyMixer.js +4 -4
  267. package/src/animation/tracks/BooleanKeyframeTrack.js +1 -1
  268. package/src/animation/tracks/ColorKeyframeTrack.js +1 -1
  269. package/src/animation/tracks/NumberKeyframeTrack.js +1 -1
  270. package/src/animation/tracks/QuaternionKeyframeTrack.js +1 -1
  271. package/src/animation/tracks/StringKeyframeTrack.js +1 -1
  272. package/src/animation/tracks/VectorKeyframeTrack.js +1 -1
  273. package/src/audio/Audio.js +11 -10
  274. package/src/audio/AudioContext.js +2 -2
  275. package/src/audio/AudioListener.js +5 -3
  276. package/src/audio/PositionalAudio.js +1 -1
  277. package/src/cameras/Camera.js +32 -2
  278. package/src/cameras/CubeCamera.js +20 -0
  279. package/src/cameras/OrthographicCamera.js +1 -1
  280. package/src/cameras/PerspectiveCamera.js +1 -1
  281. package/src/cameras/StereoCamera.js +2 -2
  282. package/src/constants.js +100 -7
  283. package/src/core/BufferAttribute.js +13 -1
  284. package/src/core/BufferGeometry.js +24 -12
  285. package/src/core/Clock.js +7 -0
  286. package/src/core/EventDispatcher.js +1 -1
  287. package/src/core/InterleavedBuffer.js +1 -1
  288. package/src/core/InterleavedBufferAttribute.js +3 -2
  289. package/src/core/Object3D.js +55 -6
  290. package/src/core/Raycaster.js +4 -3
  291. package/src/core/RenderTarget.js +14 -5
  292. package/src/extras/Controls.js +5 -4
  293. package/src/extras/DataUtils.js +2 -1
  294. package/src/extras/Earcut.js +6 -0
  295. package/src/extras/ImageUtils.js +2 -2
  296. package/src/extras/PMREMGenerator.js +259 -57
  297. package/src/extras/TextureUtils.js +6 -1
  298. package/src/extras/core/Curve.js +2 -1
  299. package/src/extras/core/Interpolations.js +7 -1
  300. package/src/extras/core/ShapePath.js +4 -4
  301. package/src/extras/curves/CatmullRomCurve3.js +3 -2
  302. package/src/extras/lib/earcut.js +8 -8
  303. package/src/geometries/BoxGeometry.js +1 -0
  304. package/src/geometries/CapsuleGeometry.js +1 -0
  305. package/src/geometries/CircleGeometry.js +1 -0
  306. package/src/geometries/ConeGeometry.js +1 -0
  307. package/src/geometries/CylinderGeometry.js +1 -0
  308. package/src/geometries/DodecahedronGeometry.js +1 -0
  309. package/src/geometries/ExtrudeGeometry.js +10 -8
  310. package/src/geometries/IcosahedronGeometry.js +1 -0
  311. package/src/geometries/LatheGeometry.js +1 -0
  312. package/src/geometries/OctahedronGeometry.js +1 -0
  313. package/src/geometries/PlaneGeometry.js +1 -0
  314. package/src/geometries/PolyhedronGeometry.js +1 -1
  315. package/src/geometries/RingGeometry.js +1 -0
  316. package/src/geometries/ShapeGeometry.js +1 -0
  317. package/src/geometries/SphereGeometry.js +1 -0
  318. package/src/geometries/TetrahedronGeometry.js +1 -0
  319. package/src/geometries/TorusGeometry.js +9 -3
  320. package/src/geometries/TorusKnotGeometry.js +1 -0
  321. package/src/geometries/TubeGeometry.js +1 -0
  322. package/src/helpers/CameraHelper.js +4 -1
  323. package/src/helpers/DirectionalLightHelper.js +4 -1
  324. package/src/helpers/HemisphereLightHelper.js +3 -0
  325. package/src/helpers/PointLightHelper.js +1 -25
  326. package/src/helpers/SpotLightHelper.js +3 -0
  327. package/src/lights/DirectionalLight.js +13 -0
  328. package/src/lights/HemisphereLight.js +10 -0
  329. package/src/lights/Light.js +1 -11
  330. package/src/lights/LightProbe.js +0 -15
  331. package/src/lights/LightShadow.js +15 -6
  332. package/src/lights/PointLight.js +15 -0
  333. package/src/lights/PointLightShadow.js +0 -86
  334. package/src/lights/SpotLight.js +22 -1
  335. package/src/lights/webgpu/IESSpotLight.js +2 -1
  336. package/src/lights/webgpu/ProjectorLight.js +1 -1
  337. package/src/loaders/AnimationLoader.js +2 -1
  338. package/src/loaders/AudioLoader.js +13 -2
  339. package/src/loaders/BufferGeometryLoader.js +2 -2
  340. package/src/loaders/Cache.js +30 -2
  341. package/src/loaders/DataTextureLoader.js +6 -4
  342. package/src/loaders/FileLoader.js +4 -4
  343. package/src/loaders/ImageBitmapLoader.js +17 -13
  344. package/src/loaders/ImageLoader.js +1 -1
  345. package/src/loaders/Loader.js +9 -3
  346. package/src/loaders/LoadingManager.js +25 -3
  347. package/src/loaders/MaterialLoader.js +6 -4
  348. package/src/loaders/ObjectLoader.js +57 -17
  349. package/src/loaders/TextureLoader.js +1 -1
  350. package/src/loaders/nodes/NodeLoader.js +5 -4
  351. package/src/loaders/nodes/NodeObjectLoader.js +18 -0
  352. package/src/materials/Material.js +18 -3
  353. package/src/materials/MeshBasicMaterial.js +1 -0
  354. package/src/materials/MeshDepthMaterial.js +1 -0
  355. package/src/materials/MeshDistanceMaterial.js +1 -1
  356. package/src/materials/MeshLambertMaterial.js +11 -1
  357. package/src/materials/MeshMatcapMaterial.js +22 -0
  358. package/src/materials/MeshNormalMaterial.js +1 -0
  359. package/src/materials/MeshPhongMaterial.js +11 -1
  360. package/src/materials/MeshPhysicalMaterial.js +2 -1
  361. package/src/materials/MeshStandardMaterial.js +8 -7
  362. package/src/materials/MeshToonMaterial.js +2 -1
  363. package/src/materials/PointsMaterial.js +1 -1
  364. package/src/materials/ShaderMaterial.js +22 -3
  365. package/src/materials/nodes/Line2NodeMaterial.js +36 -9
  366. package/src/materials/nodes/MeshPhysicalNodeMaterial.js +5 -2
  367. package/src/materials/nodes/MeshSSSNodeMaterial.js +1 -1
  368. package/src/materials/nodes/MeshStandardNodeMaterial.js +5 -4
  369. package/src/materials/nodes/NodeMaterial.js +95 -35
  370. package/src/materials/nodes/PointsNodeMaterial.js +81 -28
  371. package/src/materials/nodes/SpriteNodeMaterial.js +3 -15
  372. package/src/materials/nodes/manager/NodeMaterialObserver.js +194 -88
  373. package/src/math/Color.js +6 -5
  374. package/src/math/ColorManagement.js +9 -3
  375. package/src/math/Cylindrical.js +1 -1
  376. package/src/math/Euler.js +2 -1
  377. package/src/math/Line3.js +6 -5
  378. package/src/math/MathUtils.js +23 -21
  379. package/src/math/Matrix2.js +14 -10
  380. package/src/math/Matrix3.js +15 -11
  381. package/src/math/Matrix4.js +94 -81
  382. package/src/math/Plane.js +5 -4
  383. package/src/math/Quaternion.js +60 -84
  384. package/src/math/Sphere.js +1 -1
  385. package/src/math/Spherical.js +1 -1
  386. package/src/math/Triangle.js +1 -1
  387. package/src/math/Vector2.js +11 -7
  388. package/src/math/Vector3.js +15 -13
  389. package/src/math/Vector4.js +13 -9
  390. package/src/math/interpolants/BezierInterpolant.js +108 -0
  391. package/src/nodes/Nodes.js +86 -65
  392. package/src/nodes/TSL.js +11 -8
  393. package/src/nodes/accessors/Arrays.js +1 -1
  394. package/src/nodes/accessors/BatchNode.js +10 -10
  395. package/src/nodes/accessors/Bitangent.js +5 -5
  396. package/src/nodes/accessors/BufferAttributeNode.js +107 -15
  397. package/src/nodes/accessors/BufferNode.js +30 -3
  398. package/src/nodes/accessors/Camera.js +260 -13
  399. package/src/nodes/accessors/ClippingNode.js +10 -9
  400. package/src/nodes/accessors/CubeTextureNode.js +32 -6
  401. package/src/nodes/accessors/InstanceNode.js +164 -39
  402. package/src/nodes/accessors/Lights.js +10 -0
  403. package/src/nodes/accessors/MaterialNode.js +9 -1
  404. package/src/nodes/accessors/MaterialProperties.js +2 -5
  405. package/src/nodes/accessors/MaterialReferenceNode.js +1 -2
  406. package/src/nodes/accessors/ModelNode.js +1 -1
  407. package/src/nodes/accessors/Normal.js +16 -15
  408. package/src/nodes/accessors/Object3DNode.js +2 -2
  409. package/src/nodes/accessors/Position.js +51 -3
  410. package/src/nodes/accessors/ReferenceBaseNode.js +7 -7
  411. package/src/nodes/accessors/ReferenceNode.js +11 -10
  412. package/src/nodes/accessors/RendererReferenceNode.js +1 -2
  413. package/src/nodes/accessors/SceneProperties.js +47 -0
  414. package/src/nodes/accessors/SkinningNode.js +27 -26
  415. package/src/nodes/accessors/StorageBufferNode.js +14 -24
  416. package/src/nodes/accessors/StorageTextureNode.js +62 -9
  417. package/src/nodes/accessors/Tangent.js +4 -14
  418. package/src/nodes/accessors/Texture3DNode.js +41 -31
  419. package/src/nodes/accessors/TextureNode.js +193 -63
  420. package/src/nodes/accessors/UniformArrayNode.js +6 -4
  421. package/src/nodes/accessors/UserDataNode.js +1 -2
  422. package/src/nodes/accessors/VertexColorNode.js +1 -2
  423. package/src/nodes/code/FunctionCallNode.js +25 -5
  424. package/src/nodes/code/FunctionNode.js +25 -3
  425. package/src/nodes/core/ArrayNode.js +22 -2
  426. package/src/nodes/core/AssignNode.js +6 -5
  427. package/src/nodes/core/AttributeNode.js +5 -4
  428. package/src/nodes/core/BypassNode.js +1 -1
  429. package/src/nodes/core/ContextNode.js +133 -15
  430. package/src/nodes/core/IndexNode.js +4 -3
  431. package/src/nodes/core/InputNode.js +3 -2
  432. package/src/nodes/core/InspectorNode.js +128 -0
  433. package/src/nodes/core/{CacheNode.js → IsolateNode.js} +41 -8
  434. package/src/nodes/core/MRTNode.js +48 -2
  435. package/src/nodes/core/Node.js +264 -46
  436. package/src/nodes/core/NodeBuilder.js +453 -87
  437. package/src/nodes/core/NodeError.js +28 -0
  438. package/src/nodes/core/NodeFrame.js +31 -23
  439. package/src/nodes/core/NodeFunction.js +2 -1
  440. package/src/nodes/core/NodeParser.js +2 -1
  441. package/src/nodes/core/NodeUniform.js +1 -1
  442. package/src/nodes/core/NodeUtils.js +25 -97
  443. package/src/nodes/core/OutputStructNode.js +12 -10
  444. package/src/nodes/core/ParameterNode.js +34 -3
  445. package/src/nodes/core/PropertyNode.js +26 -3
  446. package/src/nodes/core/StackNode.js +99 -23
  447. package/src/nodes/core/StackTrace.js +139 -0
  448. package/src/nodes/core/StructNode.js +22 -8
  449. package/src/nodes/core/StructTypeNode.js +13 -18
  450. package/src/nodes/core/SubBuildNode.js +4 -4
  451. package/src/nodes/core/UniformGroupNode.js +36 -6
  452. package/src/nodes/core/UniformNode.js +37 -13
  453. package/src/nodes/core/VarNode.js +96 -34
  454. package/src/nodes/core/VaryingNode.js +2 -18
  455. package/src/nodes/display/BlendModes.js +0 -63
  456. package/src/nodes/display/BumpMapNode.js +1 -1
  457. package/src/nodes/display/ColorAdjustment.js +18 -1
  458. package/src/nodes/display/ColorSpaceNode.js +3 -3
  459. package/src/nodes/display/FrontFacingNode.js +4 -8
  460. package/src/nodes/display/NormalMapNode.js +41 -5
  461. package/src/nodes/display/PassNode.js +175 -25
  462. package/src/nodes/display/RenderOutputNode.js +35 -9
  463. package/src/nodes/display/ScreenNode.js +47 -15
  464. package/src/nodes/display/ToneMappingNode.js +32 -5
  465. package/src/nodes/display/ToonOutlinePassNode.js +10 -2
  466. package/src/nodes/display/ViewportDepthNode.js +52 -4
  467. package/src/nodes/display/ViewportDepthTextureNode.js +14 -6
  468. package/src/nodes/display/ViewportSharedTextureNode.js +12 -0
  469. package/src/nodes/display/ViewportTextureNode.js +72 -14
  470. package/src/nodes/fog/Fog.js +18 -34
  471. package/src/nodes/functions/BSDF/BRDF_GGX_Multiscatter.js +52 -0
  472. package/src/nodes/functions/BSDF/DFGLUT.js +56 -0
  473. package/src/nodes/functions/BSDF/EnvironmentBRDF.js +2 -2
  474. package/src/nodes/functions/BSDF/V_GGX_SmithCorrelated_Anisotropic.js +2 -2
  475. package/src/nodes/functions/BasicLightingModel.js +2 -1
  476. package/src/nodes/functions/PhysicalLightingModel.js +128 -46
  477. package/src/nodes/functions/VolumetricLightingModel.js +5 -5
  478. package/src/nodes/geometry/RangeNode.js +44 -6
  479. package/src/nodes/gpgpu/AtomicFunctionNode.js +1 -1
  480. package/src/nodes/gpgpu/BarrierNode.js +9 -0
  481. package/src/nodes/gpgpu/ComputeBuiltinNode.js +4 -4
  482. package/src/nodes/gpgpu/ComputeNode.js +76 -38
  483. package/src/nodes/gpgpu/SubgroupFunctionNode.js +455 -0
  484. package/src/nodes/gpgpu/WorkgroupInfoNode.js +5 -4
  485. package/src/nodes/lighting/AnalyticLightNode.js +53 -0
  486. package/src/nodes/lighting/EnvironmentNode.js +34 -9
  487. package/src/nodes/lighting/LightsNode.js +10 -32
  488. package/src/nodes/lighting/PointShadowNode.js +167 -148
  489. package/src/nodes/lighting/ShadowFilterNode.js +55 -65
  490. package/src/nodes/lighting/ShadowNode.js +189 -44
  491. package/src/nodes/math/BitcastNode.js +156 -0
  492. package/src/nodes/math/BitcountNode.js +433 -0
  493. package/src/nodes/math/ConditionalNode.js +25 -8
  494. package/src/nodes/math/MathNode.js +98 -57
  495. package/src/nodes/math/OperatorNode.js +8 -5
  496. package/src/nodes/math/PackFloatNode.js +98 -0
  497. package/src/nodes/math/UnpackFloatNode.js +96 -0
  498. package/src/nodes/pmrem/PMREMNode.js +1 -1
  499. package/src/nodes/pmrem/PMREMUtils.js +111 -2
  500. package/src/nodes/shapes/Shapes.js +1 -1
  501. package/src/nodes/tsl/TSLBase.js +6 -3
  502. package/src/nodes/tsl/TSLCore.js +488 -166
  503. package/src/nodes/utils/ArrayElementNode.js +14 -1
  504. package/src/nodes/utils/ConvertNode.js +1 -1
  505. package/src/nodes/utils/DebugNode.js +14 -13
  506. package/src/nodes/utils/EventNode.js +67 -2
  507. package/src/nodes/utils/FlipNode.js +1 -1
  508. package/src/nodes/utils/FunctionOverloadingNode.js +37 -19
  509. package/src/nodes/utils/JoinNode.js +7 -4
  510. package/src/nodes/utils/LoopNode.js +20 -24
  511. package/src/nodes/utils/MemberNode.js +60 -8
  512. package/src/nodes/utils/Packing.js +13 -1
  513. package/src/nodes/utils/PostProcessingUtils.js +60 -1
  514. package/src/nodes/utils/RTTNode.js +14 -4
  515. package/src/nodes/utils/ReflectorNode.js +61 -11
  516. package/src/nodes/utils/Remap.js +48 -0
  517. package/src/nodes/utils/RotateNode.js +1 -1
  518. package/src/nodes/utils/SampleNode.js +12 -2
  519. package/src/nodes/utils/SetNode.js +1 -1
  520. package/src/nodes/utils/SplitNode.js +12 -1
  521. package/src/nodes/utils/SpriteSheetUV.js +35 -0
  522. package/src/nodes/utils/Timer.js +0 -47
  523. package/src/nodes/utils/UVUtils.js +28 -0
  524. package/src/objects/BatchedMesh.js +46 -18
  525. package/src/objects/InstancedMesh.js +30 -3
  526. package/src/objects/LOD.js +1 -1
  527. package/src/objects/Line.js +3 -2
  528. package/src/objects/LineSegments.js +2 -1
  529. package/src/objects/Mesh.js +1 -1
  530. package/src/objects/Points.js +1 -1
  531. package/src/objects/Skeleton.js +12 -2
  532. package/src/objects/SkinnedMesh.js +29 -10
  533. package/src/objects/Sprite.js +4 -3
  534. package/src/renderers/WebGLRenderer.js +372 -179
  535. package/src/renderers/common/Animation.js +16 -4
  536. package/src/renderers/common/Attributes.js +16 -2
  537. package/src/renderers/common/Backend.js +137 -35
  538. package/src/renderers/common/Background.js +28 -14
  539. package/src/renderers/common/BindGroup.js +1 -16
  540. package/src/renderers/common/Binding.js +11 -0
  541. package/src/renderers/common/Bindings.js +83 -12
  542. package/src/renderers/common/BlendMode.js +143 -0
  543. package/src/renderers/common/Buffer.js +40 -0
  544. package/src/renderers/common/BundleGroup.js +1 -1
  545. package/src/renderers/common/CanvasTarget.js +341 -0
  546. package/src/renderers/common/ChainMap.js +30 -6
  547. package/src/renderers/common/ComputePipeline.js +1 -1
  548. package/src/renderers/common/CubeRenderTarget.js +51 -7
  549. package/src/renderers/common/DataMap.js +1 -1
  550. package/src/renderers/common/Geometries.js +55 -3
  551. package/src/renderers/common/Info.js +337 -6
  552. package/src/renderers/common/InspectorBase.js +151 -0
  553. package/src/renderers/common/Lighting.js +5 -21
  554. package/src/renderers/common/Pipelines.js +41 -8
  555. package/src/renderers/common/PostProcessing.js +9 -226
  556. package/src/renderers/common/QuadMesh.js +7 -1
  557. package/src/renderers/common/ReadbackBuffer.js +78 -0
  558. package/src/renderers/common/RenderBundle.js +3 -1
  559. package/src/renderers/common/RenderBundles.js +7 -3
  560. package/src/renderers/common/RenderContext.js +18 -2
  561. package/src/renderers/common/RenderContexts.js +33 -49
  562. package/src/renderers/common/RenderList.js +7 -3
  563. package/src/renderers/common/RenderLists.js +2 -1
  564. package/src/renderers/common/RenderObject.js +32 -6
  565. package/src/renderers/common/RenderObjectPipeline.js +40 -0
  566. package/src/renderers/common/RenderObjects.js +22 -6
  567. package/src/renderers/common/RenderPipeline.js +232 -17
  568. package/src/renderers/common/Renderer.js +927 -335
  569. package/src/renderers/common/RendererUtils.js +9 -0
  570. package/src/renderers/common/SampledTexture.js +9 -1
  571. package/src/renderers/common/Sampler.js +52 -14
  572. package/src/renderers/common/StorageBuffer.js +13 -1
  573. package/src/renderers/common/StorageTexture.js +9 -1
  574. package/src/renderers/common/Textures.js +208 -47
  575. package/src/renderers/common/TimestampQueryPool.js +70 -6
  576. package/src/renderers/common/Uniform.js +8 -0
  577. package/src/renderers/common/UniformsGroup.js +64 -2
  578. package/src/renderers/common/XRManager.js +79 -51
  579. package/src/renderers/common/extras/PMREMGenerator.js +176 -79
  580. package/src/renderers/common/nodes/NodeBuilderState.js +1 -1
  581. package/src/renderers/common/nodes/NodeLibrary.js +9 -7
  582. package/src/renderers/common/nodes/{Nodes.js → NodeManager.js} +260 -95
  583. package/src/renderers/common/nodes/NodeSampler.js +13 -1
  584. package/src/renderers/common/nodes/NodeStorageBuffer.js +13 -2
  585. package/src/renderers/common/nodes/NodeUniformBuffer.js +52 -0
  586. package/src/renderers/shaders/DFGLUTData.js +49 -0
  587. package/src/renderers/shaders/ShaderChunk/batching_pars_vertex.glsl.js +2 -2
  588. package/src/renderers/shaders/ShaderChunk/color_fragment.glsl.js +1 -5
  589. package/src/renderers/shaders/ShaderChunk/color_pars_fragment.glsl.js +1 -5
  590. package/src/renderers/shaders/ShaderChunk/color_pars_vertex.glsl.js +1 -5
  591. package/src/renderers/shaders/ShaderChunk/color_vertex.glsl.js +8 -10
  592. package/src/renderers/shaders/ShaderChunk/common.glsl.js +0 -12
  593. package/src/renderers/shaders/ShaderChunk/envmap_common_pars_fragment.glsl.js +1 -2
  594. package/src/renderers/shaders/ShaderChunk/envmap_fragment.glsl.js +8 -12
  595. package/src/renderers/shaders/ShaderChunk/envmap_physical_pars_fragment.glsl.js +1 -1
  596. package/src/renderers/shaders/ShaderChunk/lightprobes_pars_fragment.glsl.js +80 -0
  597. package/src/renderers/shaders/ShaderChunk/lights_fragment_begin.glsl.js +13 -2
  598. package/src/renderers/shaders/ShaderChunk/lights_fragment_end.glsl.js +6 -0
  599. package/src/renderers/shaders/ShaderChunk/lights_fragment_maps.glsl.js +6 -2
  600. package/src/renderers/shaders/ShaderChunk/lights_pars_begin.glsl.js +2 -0
  601. package/src/renderers/shaders/ShaderChunk/lights_physical_fragment.glsl.js +8 -4
  602. package/src/renderers/shaders/ShaderChunk/lights_physical_pars_fragment.glsl.js +152 -59
  603. package/src/renderers/shaders/ShaderChunk/logdepthbuf_fragment.glsl.js +1 -1
  604. package/src/renderers/shaders/ShaderChunk/logdepthbuf_pars_fragment.glsl.js +1 -1
  605. package/src/renderers/shaders/ShaderChunk/logdepthbuf_pars_vertex.glsl.js +1 -1
  606. package/src/renderers/shaders/ShaderChunk/logdepthbuf_vertex.glsl.js +1 -1
  607. package/src/renderers/shaders/ShaderChunk/normal_fragment_maps.glsl.js +7 -0
  608. package/src/renderers/shaders/ShaderChunk/packing.glsl.js +20 -4
  609. package/src/renderers/shaders/ShaderChunk/premultiplied_alpha_fragment.glsl.js +0 -1
  610. package/src/renderers/shaders/ShaderChunk/shadowmap_pars_fragment.glsl.js +221 -190
  611. package/src/renderers/shaders/ShaderChunk/shadowmap_vertex.glsl.js +12 -2
  612. package/src/renderers/shaders/ShaderChunk/shadowmask_pars_fragment.glsl.js +1 -1
  613. package/src/renderers/shaders/ShaderChunk/transmission_fragment.glsl.js +1 -1
  614. package/src/renderers/shaders/ShaderChunk.js +5 -3
  615. package/src/renderers/shaders/ShaderLib/backgroundCube.glsl.js +1 -2
  616. package/src/renderers/shaders/ShaderLib/depth.glsl.js +4 -1
  617. package/src/renderers/shaders/ShaderLib/{distanceRGBA.glsl.js → distance.glsl.js} +1 -2
  618. package/src/renderers/shaders/ShaderLib/meshlambert.glsl.js +2 -1
  619. package/src/renderers/shaders/ShaderLib/meshnormal.glsl.js +1 -2
  620. package/src/renderers/shaders/ShaderLib/meshphong.glsl.js +2 -1
  621. package/src/renderers/shaders/ShaderLib/meshphysical.glsl.js +4 -9
  622. package/src/renderers/shaders/ShaderLib/meshtoon.glsl.js +0 -1
  623. package/src/renderers/shaders/ShaderLib/shadow.glsl.js +1 -1
  624. package/src/renderers/shaders/ShaderLib/vsm.glsl.js +4 -6
  625. package/src/renderers/shaders/ShaderLib.js +7 -6
  626. package/src/renderers/shaders/UniformsLib.js +8 -5
  627. package/src/renderers/shaders/UniformsUtils.js +52 -9
  628. package/src/renderers/webgl/WebGLAnimation.js +2 -1
  629. package/src/renderers/webgl/WebGLBackground.js +15 -15
  630. package/src/renderers/webgl/WebGLBindingStates.js +99 -27
  631. package/src/renderers/webgl/WebGLBufferRenderer.js +0 -32
  632. package/src/renderers/webgl/WebGLCapabilities.js +11 -5
  633. package/src/renderers/webgl/WebGLEnvironments.js +228 -0
  634. package/src/renderers/webgl/WebGLExtensions.js +2 -25
  635. package/src/renderers/webgl/WebGLGeometries.js +10 -7
  636. package/src/renderers/webgl/WebGLIndexedBufferRenderer.js +0 -32
  637. package/src/renderers/webgl/WebGLInfo.js +3 -1
  638. package/src/renderers/webgl/WebGLLights.js +18 -1
  639. package/src/renderers/webgl/WebGLMaterials.js +24 -13
  640. package/src/renderers/webgl/WebGLObjects.js +3 -1
  641. package/src/renderers/webgl/WebGLOutput.js +270 -0
  642. package/src/renderers/webgl/WebGLProgram.js +63 -122
  643. package/src/renderers/webgl/WebGLPrograms.js +65 -52
  644. package/src/renderers/webgl/WebGLRenderLists.js +15 -0
  645. package/src/renderers/webgl/WebGLRenderStates.js +13 -2
  646. package/src/renderers/webgl/WebGLShadowMap.js +191 -26
  647. package/src/renderers/webgl/WebGLState.js +79 -40
  648. package/src/renderers/webgl/WebGLTextures.js +234 -68
  649. package/src/renderers/webgl/WebGLUniforms.js +40 -3
  650. package/src/renderers/webgl/WebGLUniformsGroups.js +24 -3
  651. package/src/renderers/webgl/WebGLUtils.js +8 -3
  652. package/src/renderers/webgl-fallback/WebGLBackend.js +438 -235
  653. package/src/renderers/webgl-fallback/WebGLBufferRenderer.js +0 -41
  654. package/src/renderers/webgl-fallback/nodes/GLSLNodeBuilder.js +339 -84
  655. package/src/renderers/webgl-fallback/utils/WebGLAttributeUtils.js +53 -19
  656. package/src/renderers/webgl-fallback/utils/WebGLCapabilities.js +25 -0
  657. package/src/renderers/webgl-fallback/utils/WebGLConstants.js +2 -3
  658. package/src/renderers/webgl-fallback/utils/WebGLState.js +229 -11
  659. package/src/renderers/webgl-fallback/utils/WebGLTextureUtils.js +237 -72
  660. package/src/renderers/webgl-fallback/utils/WebGLTimestampQueryPool.js +56 -27
  661. package/src/renderers/webgl-fallback/utils/WebGLUtils.js +8 -3
  662. package/src/renderers/webgpu/WebGPUBackend.js +403 -253
  663. package/src/renderers/webgpu/WebGPURenderer.Nodes.js +2 -1
  664. package/src/renderers/webgpu/WebGPURenderer.js +5 -3
  665. package/src/renderers/webgpu/nodes/WGSLNodeBuilder.js +491 -123
  666. package/src/renderers/webgpu/utils/WebGPUAttributeUtils.js +108 -34
  667. package/src/renderers/webgpu/utils/WebGPUBindingUtils.js +360 -201
  668. package/src/renderers/webgpu/utils/WebGPUCapabilities.js +48 -0
  669. package/src/renderers/webgpu/utils/WebGPUConstants.js +17 -2
  670. package/src/renderers/webgpu/utils/WebGPUPipelineUtils.js +111 -54
  671. package/src/renderers/webgpu/utils/WebGPUTexturePassUtils.js +155 -205
  672. package/src/renderers/webgpu/utils/WebGPUTextureUtils.js +407 -149
  673. package/src/renderers/webgpu/utils/WebGPUTimestampQueryPool.js +36 -13
  674. package/src/renderers/webgpu/utils/WebGPUUtils.js +55 -13
  675. package/src/renderers/webxr/WebXRController.js +12 -0
  676. package/src/renderers/webxr/WebXRManager.js +45 -29
  677. package/src/textures/CubeDepthTexture.js +76 -0
  678. package/src/textures/ExternalTexture.js +15 -4
  679. package/src/textures/HTMLTexture.js +74 -0
  680. package/src/textures/Source.js +5 -4
  681. package/src/textures/Texture.js +19 -7
  682. package/src/textures/VideoTexture.js +2 -3
  683. package/src/utils.js +344 -3
  684. package/examples/jsm/loaders/RGBMLoader.js +0 -1148
  685. package/examples/jsm/materials/MeshGouraudMaterial.js +0 -434
  686. package/examples/jsm/materials/MeshPostProcessingMaterial.js +0 -167
  687. package/examples/jsm/shaders/GodRaysShader.js +0 -333
  688. package/src/nodes/accessors/SceneNode.js +0 -144
  689. package/src/nodes/code/ScriptableNode.js +0 -726
  690. package/src/nodes/code/ScriptableValueNode.js +0 -253
  691. package/src/nodes/display/PosterizeNode.js +0 -65
  692. package/src/nodes/functions/BSDF/DFGApprox.js +0 -30
  693. package/src/nodes/utils/RemapNode.js +0 -125
  694. package/src/nodes/utils/SpriteSheetUVNode.js +0 -90
  695. package/src/renderers/webgl/WebGLCubeMaps.js +0 -99
  696. package/src/renderers/webgl/WebGLCubeUVMaps.js +0 -134
@@ -0,0 +1,916 @@
1
+ import { Raycaster, Vector2, BoxHelper, error, warn } from 'three/webgpu';
2
+ import { Extension } from 'three/addons/inspector/Extension.js';
3
+ import { TSLGraphLoader } from './TSLGraphLoader.js';
4
+
5
+ const HOST_SOURCE = 'tsl-graph-host';
6
+ const EDITOR_SOURCE = 'tsl-graph-editor';
7
+
8
+ const _resposeByCommand = {
9
+ 'tsl:command:get-code': 'tsl:response:get-code',
10
+ 'tsl:command:set-root-material': 'tsl:response:set-root-material',
11
+ 'tsl:command:get-graph': 'tsl:response:get-graph',
12
+ 'tsl:command:load': 'tsl:response:load',
13
+ 'tsl:command:clear-graph': 'tsl:response:clear-graph'
14
+ };
15
+
16
+ const _refMaterials = new WeakMap();
17
+
18
+ class TSLGraphEditor extends Extension {
19
+
20
+ constructor( options = {} ) {
21
+
22
+ super( 'TSL Graph', options );
23
+
24
+ const editorUrl = new URL( 'https://www.tsl-graph.xyz/editor/standalone' );
25
+ editorUrl.searchParams.set( 'graphs', 'material' );
26
+ editorUrl.searchParams.set( 'targetOrigin', '*' );
27
+
28
+ // UI Setup
29
+ this.content.style.display = 'flex';
30
+ this.content.style.flexDirection = 'column';
31
+ this.content.style.position = 'relative';
32
+
33
+ const headerDiv = document.createElement( 'div' );
34
+ headerDiv.style.padding = '4px';
35
+ headerDiv.style.backgroundColor = 'var(--profiler-header-bg, #2a2a33aa)';
36
+ headerDiv.style.borderBottom = '1px solid var(--profiler-border, #4a4a5a)';
37
+ headerDiv.style.display = 'flex';
38
+ headerDiv.style.justifyContent = 'center';
39
+ headerDiv.style.gap = '4px';
40
+ headerDiv.style.position = 'relative';
41
+
42
+ const importBtn = document.createElement( 'button' );
43
+ importBtn.innerHTML = '<svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4"></path><polyline points="17 8 12 3 7 8"></polyline><line x1="12" y1="3" x2="12" y2="15"></line></svg>';
44
+ importBtn.className = 'panel-action-btn';
45
+ importBtn.title = 'Import';
46
+ importBtn.style.padding = '5px 8px';
47
+ importBtn.onclick = () => this._importData();
48
+
49
+ const exportBtn = document.createElement( 'button' );
50
+ exportBtn.innerHTML = '<svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4"></path><polyline points="7 10 12 15 17 10"></polyline><line x1="12" y1="15" x2="12" y2="3"></line></svg>';
51
+ exportBtn.className = 'panel-action-btn';
52
+ exportBtn.title = 'Export';
53
+ exportBtn.style.padding = '5px 8px';
54
+ exportBtn.onclick = () => this._exportData();
55
+
56
+ const manageBtn = document.createElement( 'button' );
57
+ manageBtn.innerHTML = '<svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect x="3" y="14" width="7" height="7" rx="1"></rect><rect x="3" y="3" width="7" height="7" rx="1"></rect><path d="M14 4h7"></path><path d="M14 9h7"></path><path d="M14 15h7"></path><path d="M14 20h7"></path></svg>';
58
+ manageBtn.className = 'panel-action-btn';
59
+ manageBtn.title = 'Saved Materials';
60
+ manageBtn.style.padding = '5px 8px';
61
+ manageBtn.onclick = () => this._showManagerModal();
62
+
63
+ const autoIdBtn = document.createElement( 'button' );
64
+ autoIdBtn.innerHTML = '<svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M12 3c.132 5.466 2.534 7.868 8 8-5.466.132-7.868 2.534-8 8-.132-5.466-2.534-7.868-8-8 5.466-.132 7.868-2.534 8-8z"></path></svg>';
65
+ autoIdBtn.className = 'panel-action-btn';
66
+ autoIdBtn.title = 'Auto-Generate Graph ID';
67
+ autoIdBtn.style.padding = '5px 8px';
68
+ autoIdBtn.style.position = 'absolute';
69
+ autoIdBtn.style.right = '4px';
70
+ autoIdBtn.style.top = '4px';
71
+
72
+ this.autoGraphId = false;
73
+
74
+ autoIdBtn.onclick = () => {
75
+
76
+ this.autoGraphId = ! this.autoGraphId;
77
+
78
+ if ( this.autoGraphId ) {
79
+
80
+ autoIdBtn.style.backgroundColor = 'rgba(255, 255, 255, 0.1)';
81
+ autoIdBtn.style.color = '#fff';
82
+
83
+ } else {
84
+
85
+ autoIdBtn.style.backgroundColor = '';
86
+ autoIdBtn.style.color = '';
87
+
88
+ }
89
+
90
+ };
91
+
92
+ headerDiv.appendChild( importBtn );
93
+ headerDiv.appendChild( exportBtn );
94
+ headerDiv.appendChild( manageBtn );
95
+ headerDiv.appendChild( autoIdBtn );
96
+
97
+ this.content.appendChild( headerDiv );
98
+
99
+ this.iframe = document.createElement( 'iframe' );
100
+ this.iframe.style.width = '100%';
101
+ this.iframe.style.height = '100%';
102
+ this.iframe.style.border = 'none';
103
+ this.iframe.src = editorUrl.toString();
104
+ this.editorOrigin = new URL( this.iframe.src ).origin;
105
+
106
+ this.content.appendChild( this.iframe );
107
+
108
+ this.material = null;
109
+ this.uniforms = null;
110
+
111
+ this.isReady = false;
112
+
113
+ this._codeData = null;
114
+ this._codeSaveTimeout = null;
115
+
116
+ this._pending = new Map();
117
+
118
+ this._resolveReady = null;
119
+ this._editorReady = new Promise( ( resolve ) => {
120
+
121
+ this._resolveReady = resolve;
122
+
123
+ } );
124
+
125
+ window.addEventListener( 'message', this.onMessage.bind( this ) );
126
+
127
+ }
128
+
129
+ get hasGraphs() {
130
+
131
+ return TSLGraphLoader.hasGraphs;
132
+
133
+ }
134
+
135
+ _initPicker( inspector ) {
136
+
137
+ const renderer = inspector.getRenderer();
138
+
139
+ let boundingBox = null;
140
+
141
+ const raycaster = new Raycaster();
142
+ const pointer = new Vector2();
143
+
144
+ const removeBoundingBox = () => {
145
+
146
+ if ( boundingBox ) {
147
+
148
+ boundingBox.removeFromParent();
149
+ boundingBox.dispose();
150
+ boundingBox = null;
151
+
152
+ }
153
+
154
+ };
155
+
156
+ this.addEventListener( 'change', ( { material } ) => {
157
+
158
+ if ( material === null ) {
159
+
160
+ removeBoundingBox();
161
+
162
+ }
163
+
164
+ } );
165
+
166
+ this.addEventListener( 'remove', ( { graphId } ) => {
167
+
168
+ const frame = inspector.getFrame();
169
+ const scene = frame && frame.renders.length > 0 ? frame.renders[ 0 ].scene : null;
170
+
171
+ if ( scene ) {
172
+
173
+ scene.traverse( ( object ) => {
174
+
175
+ if ( object.material && object.material.userData && object.material.userData.graphId === graphId ) {
176
+
177
+ this.restoreMaterial( object.material );
178
+
179
+ }
180
+
181
+ } );
182
+
183
+ }
184
+
185
+ } );
186
+
187
+ const pointerDownPosition = new Vector2();
188
+
189
+ renderer.domElement.addEventListener( 'pointerdown', ( e ) => {
190
+
191
+ pointerDownPosition.set( e.clientX, e.clientY );
192
+
193
+ } );
194
+
195
+ renderer.domElement.addEventListener( 'pointerup', ( e ) => {
196
+
197
+ const frame = inspector.getFrame();
198
+
199
+ for ( const render of frame.renders ) {
200
+
201
+ const scene = render.scene;
202
+
203
+ if ( scene.isScene !== true ) continue;
204
+
205
+ const camera = render.camera;
206
+
207
+ if ( pointerDownPosition.distanceTo( pointer.set( e.clientX, e.clientY ) ) > 2 ) return;
208
+
209
+ const rect = renderer.domElement.getBoundingClientRect();
210
+ pointer.x = ( ( e.clientX - rect.left ) / rect.width ) * 2 - 1;
211
+ pointer.y = - ( ( e.clientY - rect.top ) / rect.height ) * 2 + 1;
212
+
213
+ raycaster.setFromCamera( pointer, camera );
214
+
215
+ const intersects = raycaster.intersectObjects( scene.children, true );
216
+
217
+ let graphMaterial = null;
218
+
219
+ if ( intersects.length > 0 ) {
220
+
221
+ for ( const intersect of intersects ) {
222
+
223
+ const object = intersect.object;
224
+ const material = object.material;
225
+
226
+ if ( material && material.isNodeMaterial ) {
227
+
228
+ removeBoundingBox();
229
+
230
+ boundingBox = new BoxHelper( object, 0xffff00 );
231
+ scene.add( boundingBox );
232
+
233
+ graphMaterial = material;
234
+
235
+ }
236
+
237
+ if ( object.isMesh || object.isSprite ) {
238
+
239
+ break;
240
+
241
+ }
242
+
243
+ }
244
+
245
+ }
246
+
247
+ this.setMaterial( graphMaterial );
248
+
249
+ }
250
+
251
+ } );
252
+
253
+ }
254
+
255
+ apply( scene ) {
256
+
257
+ const loader = new TSLGraphLoader();
258
+ const applier = loader.parse( TSLGraphLoader.getCodes() );
259
+ applier.apply( scene );
260
+
261
+ return this;
262
+
263
+ }
264
+
265
+ restoreMaterial( material ) {
266
+
267
+ material.copy( new material.constructor() );
268
+ material.needsUpdate = true;
269
+
270
+ }
271
+
272
+ init( inspector ) {
273
+
274
+ this._initPicker( inspector );
275
+
276
+ }
277
+
278
+ async setMaterial( material ) {
279
+
280
+ if ( this.material === material ) return;
281
+
282
+ await this._setMaterial( material );
283
+
284
+ this.dispatchEvent( { type: 'change', material } );
285
+
286
+ }
287
+
288
+ async loadGraph( graphData ) {
289
+
290
+ await this.command( 'load', { graphData } );
291
+
292
+ }
293
+
294
+ async command( type, payload ) {
295
+
296
+ type = 'tsl:command:' + type;
297
+
298
+ await this._editorReady;
299
+
300
+ const requestId = this._makeRequestId();
301
+ const expectedType = _resposeByCommand[ type ];
302
+
303
+ return new Promise( ( resolve, reject ) => {
304
+
305
+ const timer = window.setTimeout( () => {
306
+
307
+ if ( ! this._pending.has( requestId ) ) return;
308
+ this._pending.delete( requestId );
309
+ reject( new Error( `Timeout for ${type}` ) );
310
+
311
+ }, 5000 );
312
+
313
+ this._pending.set( requestId, { expectedType, resolve, reject, timer } );
314
+
315
+ const message = { source: HOST_SOURCE, type, requestId };
316
+ if ( payload !== undefined ) message.payload = payload;
317
+
318
+ this._post( message );
319
+
320
+ } );
321
+
322
+ }
323
+
324
+ async getCode() {
325
+
326
+ return this.command( 'get-code' );
327
+
328
+ }
329
+
330
+ async getTSLFunction() {
331
+
332
+ const graphLoader = new TSLGraphLoader();
333
+ const applier = graphLoader.parse( await this.getCode() );
334
+
335
+ return applier.tslGraphFns[ 'tslGraph' ];
336
+
337
+ }
338
+
339
+ async getGraph() {
340
+
341
+ return ( await this.command( 'get-graph' ) ).graphData;
342
+
343
+ }
344
+
345
+ async onResponse( /*type, payload*/ ) {
346
+
347
+
348
+
349
+ }
350
+
351
+ async onEvent( type, payload ) {
352
+
353
+ if ( type === 'ready' ) {
354
+
355
+ if ( ! this.isReady ) {
356
+
357
+ this.isReady = true;
358
+
359
+ this._resolveReady();
360
+
361
+ }
362
+
363
+ } else if ( type === 'graph-changed' ) {
364
+
365
+ if ( this.material === null ) return;
366
+
367
+ await this._updateMaterial();
368
+
369
+ const graphData = await this.getGraph();
370
+
371
+ const graphId = this.material.userData.graphId;
372
+
373
+ TSLGraphLoader.setGraph( graphId, graphData );
374
+
375
+ } else if ( type === 'uniforms-changed' ) {
376
+
377
+ this._updateUniforms( payload.uniforms );
378
+
379
+ }
380
+
381
+ }
382
+
383
+ async onMessage( event ) {
384
+
385
+ if ( event.origin !== this.editorOrigin ) return;
386
+ if ( ! this._isEditorMessage( event.data ) ) return;
387
+
388
+ const msg = event.data;
389
+
390
+ if ( msg.requestId && msg.type.startsWith( 'tsl:response:' ) ) {
391
+
392
+ const waiter = this._pending.get( msg.requestId );
393
+ if ( ! waiter ) return;
394
+ if ( msg.type !== waiter.expectedType ) return;
395
+
396
+ this._pending.delete( msg.requestId );
397
+ window.clearTimeout( waiter.timer );
398
+
399
+ if ( msg.error ) waiter.reject( new Error( msg.error ) );
400
+ else waiter.resolve( msg.payload );
401
+
402
+ this.onResponse( msg.type.substring( 'tsl:response:'.length ), msg.payload );
403
+
404
+ } else if ( msg.type.startsWith( 'tsl:event:' ) ) {
405
+
406
+ this.onEvent( msg.type.substring( 'tsl:event:'.length ), msg.payload );
407
+
408
+ }
409
+
410
+ }
411
+
412
+ async _setMaterial( material ) {
413
+
414
+ if ( ! material ) {
415
+
416
+ this.material = null;
417
+ this.materialDefault = null;
418
+ this.uniforms = null;
419
+
420
+ await this.command( 'clear-graph' );
421
+
422
+ return;
423
+
424
+ }
425
+
426
+ if ( material.isNodeMaterial !== true ) {
427
+
428
+ error( 'TSLGraphEditor: "Material" needs be a "NodeMaterial".' );
429
+
430
+ return;
431
+
432
+ }
433
+
434
+ if ( material.userData.graphId === undefined ) {
435
+
436
+ if ( this.autoGraphId ) {
437
+
438
+ material.userData.graphId = material.name || 'id:' + material.id;
439
+
440
+ } else {
441
+
442
+ warn( 'TSLGraphEditor: "NodeMaterial" has no graphId. Set a "graphId" for the material in "material.userData.graphId".' );
443
+
444
+ return;
445
+
446
+ }
447
+
448
+ }
449
+
450
+ let materialDefault = _refMaterials.get( material );
451
+
452
+ if ( materialDefault === undefined ) {
453
+
454
+ //materialDefault = material.clone();
455
+ materialDefault = new material.constructor();
456
+ materialDefault.userData = material.userData;
457
+
458
+ _refMaterials.set( material, materialDefault );
459
+
460
+ }
461
+
462
+ this.material = material;
463
+ this.materialDefault = materialDefault;
464
+ this.uniforms = null;
465
+
466
+ const graphData = TSLGraphLoader.getGraph( this.material.userData.graphId );
467
+
468
+ if ( graphData ) {
469
+
470
+ await this.loadGraph( graphData );
471
+
472
+ } else {
473
+
474
+ await this.command( 'clear-graph' );
475
+
476
+ await this.command( 'set-root-material', { materialType: this._getGraphType( this.material ) } );
477
+
478
+ }
479
+
480
+ }
481
+
482
+ _getGraphType( material ) {
483
+
484
+ if ( material.isMeshPhysicalNodeMaterial ) return 'material/physical';
485
+ if ( material.isMeshStandardNodeMaterial ) return 'material/standard';
486
+ if ( material.isMeshPhongNodeMaterial ) return 'material/phong';
487
+ if ( material.isMeshBasicNodeMaterial ) return 'material/basic';
488
+ if ( material.isSpriteNodeMaterial ) return 'material/sprite';
489
+
490
+ return 'material/node';
491
+
492
+ }
493
+
494
+ _showManagerModal() {
495
+
496
+ const overlay = document.createElement( 'div' );
497
+ overlay.style.position = 'absolute';
498
+ overlay.style.top = '0';
499
+ overlay.style.left = '0';
500
+ overlay.style.width = '100%';
501
+ overlay.style.height = '100%';
502
+ overlay.style.backgroundColor = 'rgba(0, 0, 0, 0.7)';
503
+ overlay.style.zIndex = '100';
504
+ overlay.style.display = 'flex';
505
+ overlay.style.justifyContent = 'center';
506
+ overlay.style.alignItems = 'center';
507
+ overlay.onclick = ( e ) => {
508
+
509
+ if ( e.target === overlay ) {
510
+
511
+ this.content.removeChild( overlay );
512
+
513
+ }
514
+
515
+ };
516
+
517
+ const modal = document.createElement( 'div' );
518
+ modal.style.width = '80%';
519
+ modal.style.maxWidth = '500px';
520
+ modal.style.height = '400px';
521
+ modal.style.backgroundColor = 'var(--profiler-bg, #1e1e24f5)';
522
+ modal.style.border = '1px solid var(--profiler-border, #4a4a5a)';
523
+ modal.style.borderRadius = '8px';
524
+ modal.style.display = 'flex';
525
+ modal.style.flexDirection = 'column';
526
+
527
+ const header = document.createElement( 'div' );
528
+ header.style.padding = '15px';
529
+ header.style.borderBottom = '1px solid var(--profiler-border, #4a4a5a)';
530
+ header.style.display = 'flex';
531
+ header.style.justifyContent = 'space-between';
532
+ header.style.alignItems = 'center';
533
+ header.style.gap = '15px';
534
+
535
+ const filterInput = document.createElement( 'input' );
536
+ filterInput.type = 'text';
537
+ filterInput.className = 'console-filter-input';
538
+ filterInput.placeholder = 'Filter...';
539
+ filterInput.style.flex = '1';
540
+
541
+ const closeBtn = document.createElement( 'button' );
542
+ closeBtn.innerHTML = '&#x2715;';
543
+ closeBtn.style.background = 'transparent';
544
+ closeBtn.style.border = 'none';
545
+ closeBtn.style.color = 'var(--text-secondary, #9a9aab)';
546
+ closeBtn.style.cursor = 'pointer';
547
+ closeBtn.style.fontSize = '16px';
548
+ closeBtn.onmouseover = () => closeBtn.style.color = 'var(--text-primary, #e0e0e0)';
549
+ closeBtn.onmouseout = () => closeBtn.style.color = 'var(--text-secondary, #9a9aab)';
550
+ closeBtn.onclick = () => this.content.removeChild( overlay );
551
+
552
+ header.appendChild( filterInput );
553
+ header.appendChild( closeBtn );
554
+
555
+ const codes = this.getCodes();
556
+ const materialIds = Object.keys( codes.materials || {} );
557
+
558
+ if ( materialIds.length === 0 ) {
559
+
560
+ const listContainer = document.createElement( 'div' );
561
+ listContainer.style.padding = '10px';
562
+ listContainer.style.flex = '1';
563
+
564
+ const emptyMsg = document.createElement( 'div' );
565
+ emptyMsg.textContent = 'No saved materials found.';
566
+ emptyMsg.style.color = 'var(--text-secondary, #9a9aab)';
567
+ emptyMsg.style.padding = '10px';
568
+ emptyMsg.style.textAlign = 'center';
569
+ emptyMsg.style.fontFamily = 'var(--font-family, sans-serif)';
570
+ emptyMsg.style.fontSize = '12px';
571
+ listContainer.appendChild( emptyMsg );
572
+
573
+ modal.appendChild( header );
574
+ modal.appendChild( listContainer );
575
+
576
+ } else {
577
+
578
+ const listHeaderContainer = document.createElement( 'div' );
579
+ listHeaderContainer.style.display = 'grid';
580
+ listHeaderContainer.style.gridTemplateColumns = '1fr 80px';
581
+ listHeaderContainer.style.gap = '10px';
582
+ listHeaderContainer.style.padding = '10px 15px 8px 15px';
583
+ listHeaderContainer.style.borderBottom = '1px solid var(--profiler-border, #4a4a5a)';
584
+ listHeaderContainer.style.backgroundColor = 'var(--profiler-bg, #1e1e24f5)';
585
+ listHeaderContainer.style.fontFamily = 'var(--font-family, sans-serif)';
586
+ listHeaderContainer.style.fontSize = '11px';
587
+ listHeaderContainer.style.fontWeight = 'bold';
588
+ listHeaderContainer.style.textTransform = 'uppercase';
589
+ listHeaderContainer.style.letterSpacing = '0.5px';
590
+ listHeaderContainer.style.color = 'var(--text-secondary, #9a9aab)';
591
+ listHeaderContainer.style.boxShadow = '0 2px 4px rgba(0,0,0,0.1)';
592
+ listHeaderContainer.style.zIndex = '1';
593
+
594
+ const col1 = document.createElement( 'div' );
595
+ col1.textContent = 'Material Name / ID';
596
+ const col2 = document.createElement( 'div' );
597
+ col2.textContent = 'Action';
598
+ col2.style.textAlign = 'right';
599
+
600
+ listHeaderContainer.appendChild( col1 );
601
+ listHeaderContainer.appendChild( col2 );
602
+
603
+ const scrollWrapper = document.createElement( 'div' );
604
+ scrollWrapper.style.flex = '1';
605
+ scrollWrapper.style.overflowY = 'auto';
606
+ scrollWrapper.style.padding = '0';
607
+
608
+ const rows = [];
609
+
610
+ for ( const id of materialIds ) {
611
+
612
+ const itemRow = document.createElement( 'div' );
613
+ itemRow.style.display = 'grid';
614
+ itemRow.style.gridTemplateColumns = '1fr 80px';
615
+ itemRow.style.gap = '10px';
616
+ itemRow.style.alignItems = 'center';
617
+ itemRow.style.padding = '8px 15px';
618
+ itemRow.style.borderBottom = '1px solid rgba(74, 74, 90, 0.4)';
619
+ itemRow.onmouseover = () => itemRow.style.backgroundColor = 'rgba(255, 255, 255, 0.04)';
620
+ itemRow.onmouseout = () => itemRow.style.backgroundColor = 'transparent';
621
+
622
+ const nameSpan = document.createElement( 'span' );
623
+ const materialData = codes.materials[ id ];
624
+ const materialName = materialData.name || id;
625
+ nameSpan.textContent = materialName;
626
+ nameSpan.style.fontFamily = 'var(--font-mono, monospace)';
627
+ nameSpan.style.fontSize = '12px';
628
+ nameSpan.style.color = 'var(--text-primary, #e0e0e0)';
629
+ nameSpan.style.userSelect = 'all';
630
+ nameSpan.style.overflow = 'hidden';
631
+ nameSpan.style.textOverflow = 'ellipsis';
632
+ nameSpan.style.whiteSpace = 'nowrap';
633
+
634
+ const actionContainer = document.createElement( 'div' );
635
+ actionContainer.style.textAlign = 'right';
636
+
637
+ const removeBtn = document.createElement( 'button' );
638
+ removeBtn.textContent = 'Remove';
639
+ removeBtn.style.background = 'rgba(244, 67, 54, 0.1)';
640
+ removeBtn.style.border = '1px solid var(--color-red, #f44336)';
641
+ removeBtn.style.color = 'var(--color-red, #f44336)';
642
+ removeBtn.style.borderRadius = '4px';
643
+ removeBtn.style.padding = '4px 8px';
644
+ removeBtn.style.cursor = 'pointer';
645
+ removeBtn.style.fontSize = '11px';
646
+ removeBtn.onmouseover = () => removeBtn.style.background = 'rgba(244, 67, 54, 0.2)';
647
+ removeBtn.onmouseout = () => removeBtn.style.background = 'rgba(244, 67, 54, 0.1)';
648
+
649
+ actionContainer.appendChild( removeBtn );
650
+
651
+ itemRow.appendChild( nameSpan );
652
+ itemRow.appendChild( actionContainer );
653
+
654
+ scrollWrapper.appendChild( itemRow );
655
+
656
+ rows.push( { element: itemRow, text: materialName.toLowerCase() } );
657
+
658
+ removeBtn.onclick = async () => {
659
+
660
+ delete codes.materials[ id ];
661
+ TSLGraphLoader.setCodes( codes );
662
+ TSLGraphLoader.deleteGraph( id );
663
+ scrollWrapper.removeChild( itemRow );
664
+
665
+ const index = rows.findIndex( r => r.element === itemRow );
666
+ if ( index > - 1 ) rows.splice( index, 1 );
667
+
668
+ if ( rows.length === 0 ) {
669
+
670
+ modal.removeChild( listHeaderContainer );
671
+ modal.removeChild( scrollWrapper );
672
+
673
+ const listContainer = document.createElement( 'div' );
674
+ listContainer.style.padding = '10px';
675
+ listContainer.style.flex = '1';
676
+
677
+ const emptyMsg = document.createElement( 'div' );
678
+ emptyMsg.textContent = 'No saved materials found.';
679
+ emptyMsg.style.color = 'var(--text-secondary, #9a9aab)';
680
+ emptyMsg.style.padding = '10px';
681
+ emptyMsg.style.textAlign = 'center';
682
+ emptyMsg.style.fontFamily = 'var(--font-family, sans-serif)';
683
+ emptyMsg.style.fontSize = '12px';
684
+
685
+ listContainer.appendChild( emptyMsg );
686
+ modal.appendChild( listContainer );
687
+
688
+ }
689
+
690
+ _refMaterials.delete( this.material );
691
+
692
+ if ( this.material && this.material.userData.graphId === id ) {
693
+
694
+ this.restoreMaterial( this.material );
695
+
696
+ await this.setMaterial( null );
697
+
698
+ }
699
+
700
+ this.dispatchEvent( { type: 'remove', graphId: id } );
701
+
702
+ };
703
+
704
+ }
705
+
706
+ filterInput.addEventListener( 'input', ( e ) => {
707
+
708
+ const term = e.target.value.toLowerCase();
709
+ for ( const row of rows ) {
710
+
711
+ row.element.style.display = row.text.includes( term ) ? 'grid' : 'none';
712
+
713
+ }
714
+
715
+ } );
716
+
717
+ modal.appendChild( header );
718
+ modal.appendChild( listHeaderContainer );
719
+ modal.appendChild( scrollWrapper );
720
+
721
+ }
722
+
723
+ overlay.appendChild( modal );
724
+
725
+ this.content.appendChild( overlay );
726
+
727
+ }
728
+
729
+ _exportData() {
730
+
731
+ const codes = this.getCodes();
732
+ const materialIds = Object.keys( codes.materials || {} );
733
+
734
+ const exportPayload = {
735
+ codes: codes,
736
+ graphs: {}
737
+ };
738
+
739
+ for ( const id of materialIds ) {
740
+
741
+ const graphData = TSLGraphLoader.getGraph( id );
742
+
743
+ if ( graphData ) {
744
+
745
+ exportPayload.graphs[ id ] = graphData;
746
+
747
+ }
748
+
749
+ }
750
+
751
+ const dataStr = 'data:text/json;charset=utf-8,' + encodeURIComponent( JSON.stringify( exportPayload, null, '\t' ) );
752
+ const downloadAnchorNode = document.createElement( 'a' );
753
+ downloadAnchorNode.setAttribute( 'href', dataStr );
754
+ downloadAnchorNode.setAttribute( 'download', 'tsl-graphs.json' );
755
+ document.body.appendChild( downloadAnchorNode );
756
+ downloadAnchorNode.click();
757
+ downloadAnchorNode.remove();
758
+
759
+ }
760
+
761
+ _importData() {
762
+
763
+ const fileInput = document.createElement( 'input' );
764
+ fileInput.type = 'file';
765
+ fileInput.accept = '.json';
766
+
767
+ fileInput.onchange = e => {
768
+
769
+ const file = e.target.files[ 0 ];
770
+
771
+ if ( ! file ) return;
772
+
773
+ const reader = new FileReader();
774
+ reader.onload = async ( event ) => {
775
+
776
+ try {
777
+
778
+ const importedData = TSLGraphLoader.setGraphs( JSON.parse( event.target.result ) );
779
+
780
+ this._codeData = importedData.codes;
781
+
782
+ // Reload visual state if we have a material open
783
+ if ( this.material ) {
784
+
785
+ // refresh material
786
+ await this._setMaterial( this.material );
787
+
788
+ }
789
+
790
+ } catch ( err ) {
791
+
792
+ error( 'TSLGraphEditor: Failed to parse or load imported JSON.', err );
793
+
794
+ }
795
+
796
+ };
797
+
798
+ reader.readAsText( file );
799
+
800
+ };
801
+
802
+ fileInput.click();
803
+
804
+ }
805
+
806
+ getCodes() {
807
+
808
+ if ( this._codeData === null ) {
809
+
810
+ this._codeData = TSLGraphLoader.getCodes();
811
+
812
+ }
813
+
814
+ return this._codeData;
815
+
816
+ }
817
+
818
+ _saveCode() {
819
+
820
+ const graphId = this.material.userData.graphId;
821
+
822
+ clearTimeout( this._codeSaveTimeout );
823
+
824
+ this._codeSaveTimeout = setTimeout( async () => {
825
+
826
+ if ( this.material === null || graphId !== this.material.userData.graphId ) return;
827
+
828
+ const codes = this.getCodes();
829
+ const codeData = await this.getCode();
830
+
831
+ codes.materials[ graphId ] = codeData.material;
832
+
833
+ TSLGraphLoader.setCodes( codes );
834
+
835
+ }, 1000 );
836
+
837
+ }
838
+
839
+ _restoreMaterial() {
840
+
841
+ this.material.copy( this.materialDefault );
842
+
843
+ }
844
+
845
+ async _updateMaterial() {
846
+
847
+ this._restoreMaterial();
848
+
849
+ const applyNodes = await this.getTSLFunction();
850
+
851
+ const { uniforms } = applyNodes( this.material );
852
+
853
+ this.uniforms = uniforms;
854
+ this.material.needsUpdate = true;
855
+
856
+ this._saveCode();
857
+
858
+ }
859
+
860
+ _updateUniforms( uniforms ) {
861
+
862
+ if ( this.uniforms === null ) return;
863
+
864
+ for ( const uniform of uniforms ) {
865
+
866
+ const uniformNode = this.uniforms[ uniform.name ];
867
+ const uniformType = uniform.uniformType;
868
+
869
+ const value = uniform.value;
870
+
871
+ if ( uniformType.startsWith( 'vec' ) ) {
872
+
873
+ uniformNode.value.fromArray( value );
874
+
875
+ } else if ( uniformType.startsWith( 'color' ) ) {
876
+
877
+ uniformNode.value.setHex( parseInt( value.slice( 1 ), 16 ) );
878
+
879
+ } else {
880
+
881
+ uniformNode.value = value;
882
+
883
+ }
884
+
885
+ }
886
+
887
+ this._saveCode();
888
+
889
+ }
890
+
891
+ _isEditorMessage( value ) {
892
+
893
+ if ( ! value || typeof value !== 'object' ) return false;
894
+ return value.source === EDITOR_SOURCE && typeof value.type === 'string';
895
+
896
+ }
897
+
898
+ _makeRequestId() {
899
+
900
+ return `${Date.now()}-${Math.random().toString( 36 ).slice( 2, 10 )}`;
901
+
902
+ }
903
+
904
+ _post( message ) {
905
+
906
+ if ( this.iframe.contentWindow ) {
907
+
908
+ this.iframe.contentWindow.postMessage( message, this.editorOrigin );
909
+
910
+ }
911
+
912
+ }
913
+
914
+ }
915
+
916
+ export default TSLGraphEditor;