@gnsx/three 0.185.16 → 0.186.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (417) hide show
  1. package/build/three.cjs +10 -82600
  2. package/build/three.core.js +1303 -728
  3. package/build/three.module.js +439 -338
  4. package/build/three.tsl.js +74 -44
  5. package/build/three.webgpu.js +6036 -2184
  6. package/build/three.webgpu.nodes.js +6020 -2184
  7. package/examples/jsm/Addons.js +6 -6
  8. package/examples/jsm/controls/ArcballControls.js +1 -1
  9. package/examples/jsm/controls/FirstPersonControls.js +44 -20
  10. package/examples/jsm/controls/OrbitControls.js +9 -0
  11. package/examples/jsm/controls/TrackballControls.js +109 -4
  12. package/examples/jsm/csm/CSMShadowNode.js +13 -0
  13. package/examples/jsm/exporters/GLTFExporter.js +23 -7
  14. package/examples/jsm/exporters/USDZExporter.js +2 -2
  15. package/examples/jsm/generators/CityGenerator.js +377 -45
  16. package/examples/jsm/generators/ForestGenerator.js +12 -12
  17. package/examples/jsm/generators/TerrainGenerator.js +49 -37
  18. package/examples/jsm/generators/TreeGenerator.js +70 -76
  19. package/examples/jsm/generators/city/BenchGenerator.js +127 -0
  20. package/examples/jsm/generators/city/CarGenerator.js +479 -0
  21. package/examples/jsm/generators/city/CityGeneratorUtils.js +31 -0
  22. package/examples/jsm/generators/city/HydrantGenerator.js +106 -0
  23. package/examples/jsm/generators/city/InstancedMeshGenerator.js +86 -0
  24. package/examples/jsm/generators/city/PersonGenerator.js +447 -0
  25. package/examples/jsm/generators/city/SidewalkGenerator.js +33 -38
  26. package/examples/jsm/generators/city/SkyscraperGenerator.js +448 -48
  27. package/examples/jsm/generators/city/StreetTreeGenerator.js +231 -0
  28. package/examples/jsm/generators/city/StreetlightGenerator.js +100 -0
  29. package/examples/jsm/generators/city/TrafficlightGenerator.js +106 -0
  30. package/examples/jsm/generators/city/TrashcanGenerator.js +100 -0
  31. package/examples/jsm/geometries/BoxLineGeometry.js +1 -1
  32. package/examples/jsm/geometries/ParametricGeometry.js +1 -1
  33. package/examples/jsm/geometries/RoundedBoxGeometry.js +1 -1
  34. package/examples/jsm/gpgpu/CountingSort.js +271 -0
  35. package/examples/jsm/helpers/LightProbeGridHelper.js +60 -239
  36. package/examples/jsm/helpers/LightProbeGridHelperWebGL.js +221 -0
  37. package/examples/jsm/inspector/Extension.js +94 -0
  38. package/examples/jsm/inspector/Inspector.js +145 -41
  39. package/examples/jsm/inspector/RendererInspector.js +100 -52
  40. package/examples/jsm/inspector/extensions/color-grading/ColorGrading.js +2609 -0
  41. package/examples/jsm/inspector/extensions/color-grading/ColorWheel.js +352 -0
  42. package/examples/jsm/inspector/extensions/color-grading/CurveEditor.js +599 -0
  43. package/examples/jsm/inspector/extensions/color-grading/LUT3DStyle.js +1201 -0
  44. package/examples/jsm/inspector/extensions/color-grading/LUTMath.js +788 -0
  45. package/examples/jsm/inspector/extensions/color-grading/modules/BrightnessModule.js +72 -0
  46. package/examples/jsm/inspector/extensions/color-grading/modules/ColorWheelModule.js +112 -0
  47. package/examples/jsm/inspector/extensions/color-grading/modules/ContrastModule.js +82 -0
  48. package/examples/jsm/inspector/extensions/color-grading/modules/CurvesModule.js +109 -0
  49. package/examples/jsm/inspector/extensions/color-grading/modules/ExposureHueModule.js +110 -0
  50. package/examples/jsm/inspector/extensions/color-grading/modules/ExposureModule.js +73 -0
  51. package/examples/jsm/inspector/extensions/color-grading/modules/HueModule.js +78 -0
  52. package/examples/jsm/inspector/extensions/color-grading/modules/ImportedCubeModule.js +89 -0
  53. package/examples/jsm/inspector/extensions/color-grading/modules/Module.js +285 -0
  54. package/examples/jsm/inspector/extensions/color-grading/modules/OutputModule.js +101 -0
  55. package/examples/jsm/inspector/extensions/color-grading/modules/RendererModule.js +225 -0
  56. package/examples/jsm/inspector/extensions/color-grading/modules/SatVibranceModule.js +102 -0
  57. package/examples/jsm/inspector/extensions/color-grading/modules/SaturationModule.js +76 -0
  58. package/examples/jsm/inspector/extensions/color-grading/modules/VibranceModule.js +76 -0
  59. package/examples/jsm/inspector/extensions/color-grading/modules/WhiteBalanceModule.js +86 -0
  60. package/examples/jsm/inspector/extensions/tsl-graph/TSLGraphEditor.js +26 -31
  61. package/examples/jsm/inspector/extensions/tsl-graph/TSLGraphLoader.js +1 -0
  62. package/examples/jsm/inspector/tabs/Memory.js +0 -2
  63. package/examples/jsm/inspector/tabs/Settings.js +4 -0
  64. package/examples/jsm/inspector/tabs/Timeline.js +223 -171
  65. package/examples/jsm/inspector/tabs/Viewer.js +515 -21
  66. package/examples/jsm/inspector/ui/List.js +15 -9
  67. package/examples/jsm/inspector/ui/Profiler.js +170 -14
  68. package/examples/jsm/inspector/ui/Style.js +269 -23
  69. package/examples/jsm/inspector/ui/Tab.js +2 -0
  70. package/examples/jsm/inspector/ui/Values.js +14 -2
  71. package/examples/jsm/interactive/HTMLMesh.js +19 -3
  72. package/examples/jsm/lighting/LightProbeGrid.js +484 -889
  73. package/examples/jsm/lighting/LightProbeGridUtils.js +107 -0
  74. package/examples/jsm/lighting/LightProbeGridWebGL.js +841 -0
  75. package/examples/jsm/lighting/vxgi/VXGIConeTracer.js +194 -0
  76. package/examples/jsm/lighting/vxgi/VXGINode.js +660 -0
  77. package/examples/jsm/lighting/vxgi/VXGISceneCollector.js +478 -0
  78. package/examples/jsm/lighting/vxgi/VXGIVolume.js +1430 -0
  79. package/examples/jsm/lights/SunLight.js +95 -0
  80. package/examples/jsm/lights/SunLightNode.js +56 -0
  81. package/examples/jsm/lights/SunLightShadow.js +319 -0
  82. package/examples/jsm/lights/SunShadowNode.js +312 -0
  83. package/examples/jsm/loaders/3DMLoader.js +150 -49
  84. package/examples/jsm/loaders/3MFLoader.js +202 -1
  85. package/examples/jsm/loaders/FBXLoader.js +81 -5
  86. package/examples/jsm/loaders/GLTFGaussianSplatLoaderExtension.js +330 -0
  87. package/examples/jsm/loaders/GLTFLoader.js +79 -14
  88. package/examples/jsm/loaders/GaussianSplatPLYLoader.js +386 -0
  89. package/examples/jsm/loaders/KSPLATLoader.js +463 -0
  90. package/examples/jsm/loaders/MaterialXLoader.js +111 -1010
  91. package/examples/jsm/loaders/PCDLoader.js +1 -1
  92. package/examples/jsm/loaders/SPLATLoader.js +139 -0
  93. package/examples/jsm/loaders/SPZLoader.js +561 -0
  94. package/examples/jsm/loaders/materialx/MaterialXArchive.js +108 -0
  95. package/examples/jsm/loaders/materialx/MaterialXDocument.js +878 -0
  96. package/examples/jsm/loaders/materialx/MaterialXHextile.js +183 -0
  97. package/examples/jsm/loaders/materialx/MaterialXInterfaceValidation.js +376 -0
  98. package/examples/jsm/loaders/materialx/MaterialXLog.js +75 -0
  99. package/examples/jsm/loaders/materialx/MaterialXNodeInterfaceRegistry.js +4 -0
  100. package/examples/jsm/loaders/materialx/MaterialXNodeLibrary.js +1021 -0
  101. package/examples/jsm/loaders/materialx/MaterialXSurfaceMappings.js +661 -0
  102. package/examples/jsm/loaders/materialx/MaterialXUtils.js +57 -0
  103. package/examples/jsm/loaders/materialx/compile/MaterialXCompileRegistry.js +997 -0
  104. package/examples/jsm/loaders/materialx/parse/MaterialXParser.js +28 -0
  105. package/examples/jsm/loaders/usd/USDAParser.js +15 -2
  106. package/examples/jsm/loaders/usd/USDCParser.js +1 -4
  107. package/examples/jsm/loaders/usd/USDComposer.js +80 -42
  108. package/examples/jsm/materials/WoodNodeMaterial.js +6 -108
  109. package/examples/jsm/misc/RollerCoaster.js +2 -2
  110. package/examples/jsm/misc/SculptGL.LICENSE.txt +21 -0
  111. package/examples/jsm/misc/Sculptor.js +1679 -0
  112. package/examples/jsm/misc/SculptorMesh.js +1504 -0
  113. package/examples/jsm/misc/SculptorTools.js +1180 -0
  114. package/examples/jsm/misc/SculptorUtils.js +345 -0
  115. package/examples/jsm/misc/TubePainter.js +28 -16
  116. package/examples/jsm/misc/VolumeSlice.js +24 -24
  117. package/examples/jsm/modifiers/SimplifyModifier.js +63 -556
  118. package/examples/jsm/objects/GaussianSplat.js +1039 -0
  119. package/examples/jsm/objects/Sky.js +66 -45
  120. package/examples/jsm/objects/SkyMesh.js +70 -51
  121. package/examples/jsm/physics/JoltPhysics.js +1 -1
  122. package/examples/jsm/postprocessing/AfterimagePass.js +4 -2
  123. package/examples/jsm/postprocessing/BloomPass.js +2 -2
  124. package/examples/jsm/postprocessing/GTAOPass.js +1 -1
  125. package/examples/jsm/postprocessing/OutlinePass.js +5 -5
  126. package/examples/jsm/postprocessing/SAOPass.js +1 -1
  127. package/examples/jsm/postprocessing/SSAOPass.js +1 -1
  128. package/examples/jsm/postprocessing/SSRPass.js +4 -2
  129. package/examples/jsm/postprocessing/SavePass.js +1 -1
  130. package/examples/jsm/postprocessing/TAARenderPass.js +1 -1
  131. package/examples/jsm/postprocessing/UnrealBloomPass.js +30 -13
  132. package/examples/jsm/renderers/CSS2DRenderer.js +29 -5
  133. package/examples/jsm/shaders/DepthLimitedBlurShader.js +4 -1
  134. package/examples/jsm/shaders/ExposureShader.js +1 -1
  135. package/examples/jsm/shaders/FilmShader.js +2 -1
  136. package/examples/jsm/transpiler/AST.js +21 -2
  137. package/examples/jsm/transpiler/GLSLDecoder.js +498 -8
  138. package/examples/jsm/transpiler/TSLEncoder.js +82 -10
  139. package/examples/jsm/transpiler/WGSLEncoder.js +33 -4
  140. package/examples/jsm/tsl/WebGLNodesHandler.js +29 -39
  141. package/examples/jsm/tsl/display/AfterImageNode.js +2 -0
  142. package/examples/jsm/tsl/display/AnaglyphPassNode.js +3 -2
  143. package/examples/jsm/tsl/display/BilateralBlurNode.js +5 -2
  144. package/examples/jsm/tsl/display/BloomNode.js +55 -30
  145. package/examples/jsm/tsl/display/DenoiseNode.js +21 -1
  146. package/examples/jsm/tsl/display/DepthOfFieldNode.js +24 -6
  147. package/examples/jsm/tsl/display/DotScreenNode.js +11 -11
  148. package/examples/jsm/tsl/display/FSR1Node.js +8 -4
  149. package/examples/jsm/tsl/display/GTAONode.js +199 -86
  150. package/examples/jsm/tsl/display/GaussianBlurNode.js +65 -52
  151. package/examples/jsm/tsl/display/GodraysNode.js +5 -2
  152. package/examples/jsm/tsl/display/ImportanceSampledEnvironment.js +2 -2
  153. package/examples/jsm/tsl/display/LensflareNode.js +5 -2
  154. package/examples/jsm/tsl/display/OITPassNode.js +352 -0
  155. package/examples/jsm/tsl/display/OutlineNode.js +2 -0
  156. package/examples/jsm/tsl/display/ParallaxBarrierPassNode.js +3 -2
  157. package/examples/jsm/tsl/display/RGBShiftNode.js +9 -9
  158. package/examples/jsm/tsl/display/RecurrentDenoiseNode.js +7 -4
  159. package/examples/jsm/tsl/display/RetroPassNode.js +1 -1
  160. package/examples/jsm/tsl/display/SMAANode.js +22 -61
  161. package/examples/jsm/tsl/display/SSAAPassNode.js +2 -4
  162. package/examples/jsm/tsl/display/SSAONode.js +436 -0
  163. package/examples/jsm/tsl/display/SSGINode.js +5 -2
  164. package/examples/jsm/tsl/display/SSRNode.js +7 -2
  165. package/examples/jsm/tsl/display/SSSNode.js +5 -2
  166. package/examples/jsm/tsl/display/SharpenNode.js +5 -4
  167. package/examples/jsm/tsl/display/StereoCompositePassNode.js +1 -3
  168. package/examples/jsm/tsl/display/StereoPassNode.js +1 -3
  169. package/examples/jsm/tsl/display/TAAUNode.js +22 -125
  170. package/examples/jsm/tsl/display/TRAANode.js +16 -142
  171. package/examples/jsm/tsl/display/TemporalReprojectNode.js +21 -15
  172. package/examples/jsm/tsl/display/depthAwareBlur.js +63 -0
  173. package/examples/jsm/tsl/display/hashBlur.js +3 -2
  174. package/examples/jsm/tsl/lighting/ClusteredLightsNode.js +38 -27
  175. package/examples/jsm/tsl/lighting/LightProbeGridNode.js +136 -0
  176. package/examples/jsm/tsl/math/voronoiNoise.js +112 -0
  177. package/examples/jsm/tsl/shadows/TileShadowNode.js +4 -6
  178. package/examples/jsm/tsl/utils/Raymarching.js +5 -5
  179. package/examples/jsm/tsl/utils/SoftParticles.js +60 -0
  180. package/examples/jsm/tsl/utils/TAAUtils.js +195 -0
  181. package/examples/jsm/utils/BufferGeometryUtils.js +14 -14
  182. package/examples/jsm/utils/GaussianSplatUtils.js +229 -0
  183. package/examples/jsm/utils/WebGLTextureUtils.js +1 -1
  184. package/examples/jsm/utils/WebGPUTextureUtils.js +1 -1
  185. package/examples/jsm/webxr/WebGLXRFallback.js +2 -16
  186. package/examples/jsm/webxr/XRControllerModelFactory.js +16 -4
  187. package/package.json +9 -16
  188. package/src/Three.Core.js +2 -1
  189. package/src/Three.TSL.js +73 -43
  190. package/src/Three.WebGPU.Nodes.js +1 -0
  191. package/src/Three.WebGPU.js +1 -0
  192. package/src/animation/AnimationClip.js +15 -2
  193. package/src/animation/AnimationObjectGroup.js +18 -6
  194. package/src/animation/AnimationUtils.js +26 -0
  195. package/src/animation/KeyframeTrack.js +37 -0
  196. package/src/constants.js +23 -1
  197. package/src/core/BufferAttribute.js +3 -2
  198. package/src/core/BufferGeometry.js +1 -1
  199. package/src/core/InterleavedBuffer.js +5 -1
  200. package/src/core/Object3D.js +40 -12
  201. package/src/core/Raycaster.js +4 -0
  202. package/src/core/RenderTarget.js +99 -9
  203. package/src/core/RenderTarget3D.js +12 -8
  204. package/src/extras/Controls.js +0 -8
  205. package/src/extras/PMREMGenerator.js +99 -205
  206. package/src/geometries/TorusGeometry.js +1 -1
  207. package/src/helpers/ArrowHelper.js +2 -0
  208. package/src/helpers/AxesHelper.js +2 -0
  209. package/src/helpers/Box3Helper.js +2 -0
  210. package/src/helpers/BoxHelper.js +2 -0
  211. package/src/helpers/CameraHelper.js +2 -0
  212. package/src/helpers/DirectionalLightHelper.js +2 -0
  213. package/src/helpers/GridHelper.js +2 -0
  214. package/src/helpers/HemisphereLightHelper.js +2 -0
  215. package/src/helpers/PlaneHelper.js +2 -0
  216. package/src/helpers/PointLightHelper.js +2 -0
  217. package/src/helpers/PolarGridHelper.js +2 -0
  218. package/src/helpers/SkeletonHelper.js +2 -0
  219. package/src/helpers/SpotLightHelper.js +2 -0
  220. package/src/lights/Light.js +0 -10
  221. package/src/lights/LightShadow.js +43 -12
  222. package/src/lights/SpotLightShadow.js +18 -0
  223. package/src/loaders/BufferGeometryLoader.js +5 -0
  224. package/src/loaders/ImageBitmapLoader.js +3 -1
  225. package/src/loaders/ObjectLoader.js +8 -5
  226. package/src/materials/Material.js +80 -57
  227. package/src/materials/MeshPhysicalMaterial.js +32 -0
  228. package/src/materials/nodes/Line2NodeMaterial.js +17 -8
  229. package/src/materials/nodes/MeshPhysicalNodeMaterial.js +42 -5
  230. package/src/materials/nodes/NodeMaterial.js +19 -13
  231. package/src/materials/nodes/PointsNodeMaterial.js +2 -1
  232. package/src/materials/nodes/manager/NodeMaterialObserver.js +282 -55
  233. package/src/math/Frustum.js +9 -0
  234. package/src/math/FrustumArray.js +1 -1
  235. package/src/math/MathUtils.js +5 -3
  236. package/src/math/Matrix4.js +2 -9
  237. package/src/math/Plane.js +30 -1
  238. package/src/math/Quaternion.js +0 -10
  239. package/src/math/Ray.js +95 -45
  240. package/src/math/Triangle.js +0 -2
  241. package/src/math/Vector3.js +2 -2
  242. package/src/math/Vector4.js +0 -4
  243. package/src/math/interpolants/BezierInterpolant.js +36 -23
  244. package/src/nodes/Nodes.js +2 -0
  245. package/src/nodes/TSL.js +11 -3
  246. package/src/nodes/accessors/Batch.js +85 -13
  247. package/src/nodes/accessors/BufferAttributeNode.js +1 -1
  248. package/src/nodes/accessors/BuiltinNode.js +1 -1
  249. package/src/nodes/accessors/Instance.js +19 -18
  250. package/src/nodes/accessors/MaterialNode.js +9 -0
  251. package/src/nodes/accessors/ModelNode.js +85 -9
  252. package/src/nodes/accessors/ReferenceBaseNode.js +1 -70
  253. package/src/nodes/accessors/ReferenceElementNode.js +72 -0
  254. package/src/nodes/accessors/ReferenceNode.js +1 -70
  255. package/src/nodes/accessors/Skinning.js +124 -12
  256. package/src/nodes/accessors/StorageTextureNode.js +7 -3
  257. package/src/nodes/accessors/Texture3DNode.js +1 -1
  258. package/src/nodes/accessors/TextureNode.js +51 -21
  259. package/src/nodes/accessors/TextureSizeNode.js +4 -2
  260. package/src/nodes/accessors/UniformArrayNode.js +30 -5
  261. package/src/nodes/code/CodeNode.js +1 -1
  262. package/src/nodes/code/FunctionNode.js +12 -2
  263. package/src/nodes/core/ArrayNode.js +2 -2
  264. package/src/nodes/core/ContextNode.js +57 -4
  265. package/src/nodes/core/IndexNode.js +69 -4
  266. package/src/nodes/core/InspectorNode.js +2 -2
  267. package/src/nodes/core/MRTNode.js +44 -2
  268. package/src/nodes/core/Node.js +6 -3
  269. package/src/nodes/core/NodeBuilder.js +65 -50
  270. package/src/nodes/core/NodeFrame.js +11 -3
  271. package/src/nodes/core/NodeUtils.js +88 -0
  272. package/src/nodes/core/PropertyNode.js +8 -0
  273. package/src/nodes/core/StackNode.js +0 -1
  274. package/src/nodes/core/StructNode.js +4 -3
  275. package/src/nodes/core/UniformGroupNode.js +3 -2
  276. package/src/nodes/core/UniformNode.js +26 -12
  277. package/src/nodes/core/VarNode.js +0 -1
  278. package/src/nodes/display/BumpMapNode.js +2 -2
  279. package/src/nodes/display/ColorAdjustment.js +1 -1
  280. package/src/nodes/display/PassNode.js +76 -15
  281. package/src/nodes/display/ScreenNode.js +22 -65
  282. package/src/nodes/fog/Fog.js +4 -4
  283. package/src/nodes/functions/BSDF/BRDF_GGX.js +6 -6
  284. package/src/nodes/functions/BSDF/BRDF_Sheen.js +1 -1
  285. package/src/nodes/functions/BSDF/DFGLUT.js +2 -1
  286. package/src/nodes/functions/BSDF/LTC.js +1 -1
  287. package/src/nodes/functions/PhongLightingModel.js +1 -1
  288. package/src/nodes/functions/PhysicalLightingModel.js +83 -25
  289. package/src/nodes/functions/ToonLightingModel.js +2 -2
  290. package/src/nodes/functions/material/getParallaxCorrectNormal.js +3 -3
  291. package/src/nodes/gpgpu/AtomicFunctionNode.js +64 -13
  292. package/src/nodes/gpgpu/BarrierNode.js +13 -4
  293. package/src/nodes/gpgpu/ComputeBuiltinNode.js +1 -1
  294. package/src/nodes/gpgpu/ComputeNode.js +20 -17
  295. package/src/nodes/gpgpu/SubgroupFunctionNode.js +165 -37
  296. package/src/nodes/gpgpu/WorkgroupInfoNode.js +44 -6
  297. package/src/nodes/lighting/EnvironmentNode.js +40 -4
  298. package/src/nodes/lighting/LightsNode.js +20 -4
  299. package/src/nodes/lighting/ShadowBaseNode.js +158 -1
  300. package/src/nodes/lighting/ShadowFilterNode.js +2 -106
  301. package/src/nodes/lighting/ShadowNode.js +22 -91
  302. package/src/nodes/materialx/{lib/mx_hsv.js → MaterialXColor.js} +3 -6
  303. package/src/nodes/materialx/{lib/mx_transform_color.js → MaterialXColorTransform.js} +3 -6
  304. package/src/nodes/materialx/MaterialXCore.js +37 -0
  305. package/src/nodes/materialx/MaterialXNodes.js +64 -72
  306. package/src/nodes/materialx/{lib/mx_noise.js → MaterialXNoise.js} +426 -197
  307. package/src/nodes/math/BitcountNode.js +24 -4
  308. package/src/nodes/math/MathNode.js +4 -4
  309. package/src/nodes/math/MathUtils.js +15 -4
  310. package/src/nodes/math/OperatorNode.js +2 -2
  311. package/src/nodes/math/PackFloatNode.js +29 -1
  312. package/src/nodes/math/Packed4x8IntegerNode.js +433 -0
  313. package/src/nodes/math/UnpackFloatNode.js +30 -2
  314. package/src/nodes/parsers/GLSLNodeFunction.js +1 -1
  315. package/src/nodes/pmrem/PMREMNode.js +1 -1
  316. package/src/nodes/pmrem/PMREMUtils.js +31 -74
  317. package/src/nodes/shapes/Shapes.js +1 -1
  318. package/src/nodes/tsl/TSLCore.js +1 -31
  319. package/src/nodes/utils/EventNode.js +75 -0
  320. package/src/nodes/utils/LoopNode.js +54 -13
  321. package/src/nodes/utils/PostProcessingUtils.js +23 -2
  322. package/src/nodes/utils/RTTNode.js +97 -32
  323. package/src/nodes/utils/ReflectorNode.js +8 -4
  324. package/src/nodes/utils/RotateNode.js +85 -8
  325. package/src/nodes/utils/SpriteUtils.js +58 -23
  326. package/src/objects/BatchedMesh.js +6 -0
  327. package/src/objects/InstancedMesh.js +1 -1
  328. package/src/objects/LOD.js +1 -1
  329. package/src/objects/Line.js +12 -0
  330. package/src/objects/Mesh.js +12 -0
  331. package/src/objects/Points.js +12 -0
  332. package/src/objects/Sprite.js +12 -0
  333. package/src/renderers/WebGLRenderer.js +93 -27
  334. package/src/renderers/common/Animation.js +12 -2
  335. package/src/renderers/common/Backend.js +38 -10
  336. package/src/renderers/common/BindGroup.js +0 -1
  337. package/src/renderers/common/Bindings.js +50 -4
  338. package/src/renderers/common/BundleGroup.js +4 -0
  339. package/src/renderers/common/ClippingContext.js +11 -1
  340. package/src/renderers/common/Color4.js +9 -0
  341. package/src/renderers/common/Constants.js +0 -5
  342. package/src/renderers/common/DirectRenderPipeline.js +233 -0
  343. package/src/renderers/common/Geometries.js +24 -3
  344. package/src/renderers/common/Info.js +3 -3
  345. package/src/renderers/common/InspectorBase.js +37 -8
  346. package/src/renderers/common/Lighting.js +11 -4
  347. package/src/renderers/common/Pipelines.js +6 -4
  348. package/src/renderers/common/QuadMesh.js +16 -2
  349. package/src/renderers/common/RenderContext.js +8 -0
  350. package/src/renderers/common/RenderList.js +53 -19
  351. package/src/renderers/common/RenderLists.js +58 -11
  352. package/src/renderers/common/RenderObject.js +14 -0
  353. package/src/renderers/common/RenderObjects.js +14 -9
  354. package/src/renderers/common/RenderPipeline.js +52 -44
  355. package/src/renderers/common/Renderer.js +226 -55
  356. package/src/renderers/common/Storage3DTexture.js +16 -0
  357. package/src/renderers/common/Textures.js +3 -3
  358. package/src/renderers/common/XRManager.js +79 -72
  359. package/src/renderers/common/extras/PMREMGenerator.js +76 -144
  360. package/src/renderers/common/nodes/NodeManager.js +144 -6
  361. package/src/renderers/common/nodes/NodeStorageBuffer.js +3 -1
  362. package/src/renderers/common/nodes/NodeUniformBuffer.js +3 -1
  363. package/src/renderers/shaders/DFGLUTData.js +2 -1
  364. package/src/renderers/shaders/ShaderChunk/defaultnormal_vertex.glsl.js +4 -2
  365. package/src/renderers/shaders/ShaderChunk/envmap_physical_pars_fragment.glsl.js +48 -0
  366. package/src/renderers/shaders/ShaderChunk/lights_fragment_begin.glsl.js +53 -4
  367. package/src/renderers/shaders/ShaderChunk/lights_fragment_maps.glsl.js +20 -2
  368. package/src/renderers/shaders/ShaderChunk/lights_pars_begin.glsl.js +20 -0
  369. package/src/renderers/shaders/ShaderChunk/lights_physical_fragment.glsl.js +6 -0
  370. package/src/renderers/shaders/ShaderChunk/lights_physical_pars_fragment.glsl.js +61 -57
  371. package/src/renderers/shaders/ShaderChunk/shadowmap_pars_fragment.glsl.js +82 -0
  372. package/src/renderers/shaders/ShaderChunk/shadowmap_pars_vertex.glsl.js +9 -0
  373. package/src/renderers/shaders/ShaderChunk/shadowmap_vertex.glsl.js +8 -1
  374. package/src/renderers/shaders/ShaderChunk/shadowmask_pars_fragment.glsl.js +15 -0
  375. package/src/renderers/shaders/ShaderLib/meshphysical.glsl.js +4 -0
  376. package/src/renderers/shaders/ShaderLib.js +1 -0
  377. package/src/renderers/shaders/UniformsLib.js +16 -0
  378. package/src/renderers/webgl/WebGLAnimation.js +2 -2
  379. package/src/renderers/webgl/WebGLCapabilities.js +2 -2
  380. package/src/renderers/webgl/WebGLLights.js +74 -4
  381. package/src/renderers/webgl/WebGLMaterials.js +6 -0
  382. package/src/renderers/webgl/WebGLOutput.js +36 -24
  383. package/src/renderers/webgl/WebGLProgram.js +3 -0
  384. package/src/renderers/webgl/WebGLPrograms.js +8 -0
  385. package/src/renderers/webgl/WebGLRenderLists.js +6 -10
  386. package/src/renderers/webgl/WebGLShadowMap.js +47 -44
  387. package/src/renderers/webgl/WebGLTextures.js +7 -7
  388. package/src/renderers/webgl-fallback/WebGLBackend.js +153 -45
  389. package/src/renderers/webgl-fallback/nodes/GLSLNodeBuilder.js +83 -29
  390. package/src/renderers/webgl-fallback/utils/WebGLState.js +163 -17
  391. package/src/renderers/webgl-fallback/utils/WebGLTextureUtils.js +32 -5
  392. package/src/renderers/webgl-fallback/utils/WebGLTimestampQueryPool.js +11 -4
  393. package/src/renderers/webgpu/WebGPUBackend.js +513 -145
  394. package/src/renderers/webgpu/nodes/WGSLNodeBuilder.js +99 -20
  395. package/src/renderers/webgpu/nodes/WGSLNodeFunction.js +2 -1
  396. package/src/renderers/webgpu/utils/WebGPUAttributeUtils.js +3 -12
  397. package/src/renderers/webgpu/utils/WebGPUBindingUtils.js +24 -14
  398. package/src/renderers/webgpu/utils/WebGPUPipelineUtils.js +80 -14
  399. package/src/renderers/webgpu/utils/WebGPUTextureUtils.js +62 -7
  400. package/src/renderers/webgpu/utils/WebGPUTimestampQueryPool.js +9 -3
  401. package/src/renderers/webgpu/utils/WebGPUUtils.js +16 -4
  402. package/src/renderers/webxr/WebXRManager.js +25 -2
  403. package/src/scenes/Scene.js +3 -3
  404. package/src/textures/CompressedArrayTexture.js +16 -0
  405. package/src/textures/Data3DTexture.js +16 -0
  406. package/src/textures/DataArrayTexture.js +16 -0
  407. package/src/textures/DepthTexture.js +3 -3
  408. package/src/textures/Texture.js +3 -3
  409. package/src/textures/{Source.js → TextureSource.js} +39 -8
  410. package/build/three.core.min.js +0 -6
  411. package/build/three.module.min.js +0 -6
  412. package/build/three.tsl.min.js +0 -6
  413. package/build/three.webgpu.min.js +0 -6
  414. package/build/three.webgpu.nodes.min.js +0 -6
  415. package/examples/jsm/libs/ecsy.module.js +0 -1792
  416. package/examples/jsm/loaders/LottieLoader.js +0 -130
  417. package/src/nodes/functions/BSDF/BRDF_GGX_Multiscatter.js +0 -52
@@ -0,0 +1,1021 @@
1
+ import {
2
+ abs,
3
+ add,
4
+ clamp,
5
+ floor,
6
+ ceil,
7
+ round,
8
+ sign,
9
+ sin,
10
+ cos,
11
+ tan,
12
+ asin,
13
+ acos,
14
+ sqrt,
15
+ log,
16
+ exp,
17
+ min,
18
+ max,
19
+ normalize,
20
+ length,
21
+ dot,
22
+ cross,
23
+ mul,
24
+ div,
25
+ pow,
26
+ distance,
27
+ remap,
28
+ luminance,
29
+ mx_rgbtohsv,
30
+ mx_hsvtorgb,
31
+ mix,
32
+ saturation as mx_saturation,
33
+ transpose,
34
+ determinant,
35
+ inverse,
36
+ mat3,
37
+ mx_ramp4,
38
+ mx_ramplr,
39
+ mx_ramptb,
40
+ mx_splitlr,
41
+ mx_splittb,
42
+ mx_fractal_noise_float,
43
+ mx_fractal_noise_vec3,
44
+ mx_noise_float,
45
+ mx_noise_vec3,
46
+ mx_cell_noise_float,
47
+ mx_cell_noise_vec3,
48
+ mx_smoothstep,
49
+ mx_worley_noise_float_2d,
50
+ mx_worley_noise_float_3d,
51
+ mx_worley_noise_vec3_style,
52
+ mx_unifiednoise2d,
53
+ mx_unifiednoise3d,
54
+ mx_modulo,
55
+ mx_invert,
56
+ mx_place2d,
57
+ mx_rotate2d,
58
+ mx_rotate3d,
59
+ mx_safepower,
60
+ mx_contrast,
61
+ element,
62
+ reflect,
63
+ refract,
64
+ mx_timer,
65
+ mx_frame,
66
+ mx_ifgreater,
67
+ mx_ifgreatereq,
68
+ mx_ifequal,
69
+ mx_atan2,
70
+ positionLocal,
71
+ positionWorld,
72
+ normalWorld,
73
+ tangentWorld,
74
+ bitangentWorld,
75
+ cameraPosition,
76
+ mx_heighttonormal,
77
+ float,
78
+ int,
79
+ bool,
80
+ color,
81
+ modelNormalMatrix,
82
+ modelWorldMatrix,
83
+ modelWorldMatrixInverse,
84
+ vec2,
85
+ vec3,
86
+ vec4,
87
+ fract,
88
+ sub,
89
+ step,
90
+ and as tslAnd,
91
+ or as tslOr,
92
+ xor as tslXor,
93
+ not as tslNot,
94
+ Fn,
95
+ Loop,
96
+ } from '@gnsx/three/tsl';
97
+ import { normalizeSpaceName, toBooleanNode, toVec3Channels } from './MaterialXUtils.js';
98
+
99
+ const createMXElement = ( name, nodeFunc, params = [], defaults = {}, usesNode = false ) => ( { name, nodeFunc, params, defaults, usesNode } );
100
+
101
+ const mx_range = ( inNode, inLow, inHigh, outLow, outHigh, gamma = 1 ) => {
102
+
103
+ const inSpan = max( sub( inHigh, inLow ), 1e-6 );
104
+ const normalized = div( sub( inNode, inLow ), inSpan );
105
+ const reciprocalGamma = div( 1, gamma );
106
+ const gammaApplied = mul( pow( abs( normalized ), reciprocalGamma ), sign( normalized ) );
107
+ return add( outLow, mul( gammaApplied, sub( outHigh, outLow ) ) );
108
+
109
+ };
110
+
111
+ const mx_open_pbr_anisotropy = ( roughness = 0, anisotropy = 0 ) => {
112
+
113
+ const anisoInvert = sub( float( 1 ), anisotropy );
114
+ const anisoInvertSq = mul( anisoInvert, anisoInvert );
115
+ const denom = add( anisoInvertSq, float( 1 ) );
116
+ const fraction = div( float( 2 ), denom );
117
+ const sqrtFraction = sqrt( fraction );
118
+ const roughSq = mul( roughness, roughness );
119
+ const alphaX = mul( roughSq, sqrtFraction );
120
+ const alphaY = mul( anisoInvert, alphaX );
121
+ return vec2( alphaX, alphaY );
122
+
123
+ };
124
+
125
+ const mx_boolean = ( inNode ) => toBooleanNode( inNode );
126
+ const mx_and = ( in1, in2 ) => tslAnd( mx_boolean( in1 ), mx_boolean( in2 ) );
127
+ const mx_or = ( in1, in2 ) => tslOr( mx_boolean( in1 ), mx_boolean( in2 ) );
128
+ const mx_xor = ( in1, in2 ) => tslXor( mx_boolean( in1 ), mx_boolean( in2 ) );
129
+ const mx_not = ( inNode ) => tslNot( mx_boolean( inNode ) );
130
+ const mx_checkerboard = ( color1, color2, uvtiling, uvoffset, texcoord ) => {
131
+
132
+ const tiledUv = sub( mul( texcoord, uvtiling ), uvoffset );
133
+ const checkerMix = mx_modulo( dot( floor( tiledUv ), vec2( 1, 1 ) ), float( 2 ) );
134
+ return mix( color2, color1, checkerMix );
135
+
136
+ };
137
+
138
+ const mx_circle = ( texcoord, center, radius ) => {
139
+
140
+ const delta = sub( texcoord, center );
141
+ const distanceSquared = dot( delta, delta );
142
+ const radiusSquared = mul( radius, radius );
143
+ return mx_ifgreater( distanceSquared, radiusSquared, 0, 1 );
144
+
145
+ };
146
+
147
+ const mx_normalmap = (
148
+ value = vec3( 0.5, 0.5, 1.0 ),
149
+ scale = 1.0,
150
+ normal = vec3( 0.0, 0.0, 1.0 ),
151
+ tangent = vec3( 1.0, 0.0, 0.0 ),
152
+ bitangent = vec3( 0.0, 1.0, 0.0 ),
153
+ ) => {
154
+
155
+ const mapValue = toVec3Channels( value );
156
+ const decoded = sub( mul( mapValue, 2.0 ), vec3( 1.0, 1.0, 1.0 ) );
157
+ const safeValue = dot( mapValue, mapValue ).equal( 0 ).mix( decoded, vec3( 0.0, 0.0, 1.0 ) );
158
+ const normalScale = vec2( scale );
159
+ const blended =
160
+ add(
161
+ add(
162
+ mul( tangent, mul( element( safeValue, 0 ), element( normalScale, 0 ) ) ),
163
+ mul( bitangent, mul( element( safeValue, 1 ), element( normalScale, 1 ) ) ),
164
+ ),
165
+ mul( normal, element( safeValue, 2 ) ),
166
+ );
167
+ return normalize( blended );
168
+
169
+ };
170
+
171
+ const mx_bump = (
172
+ height,
173
+ scale = 1,
174
+ normal = vec3( 0.0, 0.0, 1.0 ),
175
+ tangent = vec3( 1.0, 0.0, 0.0 ),
176
+ bitangent = vec3( 0.0, 1.0, 0.0 ),
177
+ ) => mx_normalmap( mx_heighttonormal( height, 1 ), scale, normal, tangent, bitangent );
178
+ const mx_dot = ( inNode ) => inNode;
179
+
180
+ const mx_viewdirection = ( space = 'world' ) => {
181
+
182
+ const outputSpace = normalizeSpaceName( space, 'world' );
183
+ const worldDirection = normalize( sub( positionWorld, cameraPosition ) );
184
+
185
+ if ( outputSpace === 'world' ) {
186
+
187
+ return worldDirection;
188
+
189
+ }
190
+
191
+ return mx_transformnormal( worldDirection, 'world', outputSpace );
192
+
193
+ };
194
+
195
+ const mx_blackbody = ( temperature = 5000 ) => {
196
+
197
+ const temperatureKelvin = clamp( temperature, float( 800 ), float( 25000 ) );
198
+ const t = div( float( 1000 ), temperatureKelvin );
199
+ const t2 = mul( t, t );
200
+ const t3 = mul( t2, t );
201
+ const lowX = add( add( mul( float( - 0.2661239 ), t3 ), mul( float( - 0.234358 ), t2 ) ), add( mul( float( 0.8776956 ), t ), float( 0.17991 ) ) );
202
+ const highX = add(
203
+ add( mul( float( - 3.0258469 ), t3 ), mul( float( 2.1070379 ), t2 ) ),
204
+ add( mul( float( 0.2226347 ), t ), float( 0.24039 ) ),
205
+ );
206
+ const xc = mx_ifgreatereq( temperatureKelvin, float( 4000 ), highX, lowX );
207
+ const xc2 = mul( xc, xc );
208
+ const xc3 = mul( xc2, xc );
209
+ const ycLow = add(
210
+ add( mul( float( - 1.1063814 ), xc3 ), mul( float( - 1.3481102 ), xc2 ) ),
211
+ add( mul( float( 2.18555832 ), xc ), float( - 0.20219683 ) ),
212
+ );
213
+ const ycMid = add(
214
+ add( mul( float( - 0.9549476 ), xc3 ), mul( float( - 1.37418593 ), xc2 ) ),
215
+ add( mul( float( 2.09137015 ), xc ), float( - 0.16748867 ) ),
216
+ );
217
+ const ycHigh = add(
218
+ add( mul( float( 3.081758 ), xc3 ), mul( float( - 5.8733867 ), xc2 ) ),
219
+ add( mul( float( 3.75112997 ), xc ), float( - 0.37001483 ) ),
220
+ );
221
+ const ycLowMid = mx_ifgreatereq( temperatureKelvin, float( 2222 ), ycMid, ycLow );
222
+ const yc = mx_ifgreatereq( temperatureKelvin, float( 4000 ), ycHigh, ycLowMid );
223
+ const safeYc = max( yc, float( 1e-6 ) );
224
+ const xyz = vec3( div( xc, safeYc ), float( 1 ), div( sub( sub( float( 1 ), xc ), yc ), safeYc ) );
225
+ const rgb = vec3(
226
+ add( add( mul( float( 3.2406 ), element( xyz, 0 ) ), mul( float( - 1.5372 ), element( xyz, 1 ) ) ), mul( float( - 0.4986 ), element( xyz, 2 ) ) ),
227
+ add( add( mul( float( - 0.9689 ), element( xyz, 0 ) ), mul( float( 1.8758 ), element( xyz, 1 ) ) ), mul( float( 0.0415 ), element( xyz, 2 ) ) ),
228
+ add( add( mul( float( 0.0557 ), element( xyz, 0 ) ), mul( float( - 0.204 ), element( xyz, 1 ) ) ), mul( float( 1.057 ), element( xyz, 2 ) ) ),
229
+ );
230
+ const clampedRgb = max( rgb, vec3( 0, 0, 0 ) );
231
+ const validYcMask = step( float( 1e-6 ), yc );
232
+ return mix( vec3( 1, 1, 1 ), clampedRgb, validYcMask );
233
+
234
+ };
235
+
236
+ const mx_unpremult = ( input ) => {
237
+
238
+ const alpha = element( input, 3 );
239
+ const rgb = toVec3Channels( input );
240
+ const unpremultiplied = alpha.equal( 0 ).mix( rgb, div( rgb, alpha ) );
241
+ return vec4( unpremultiplied, alpha );
242
+
243
+ };
244
+
245
+ const mx_colorcorrect = (
246
+ input,
247
+ hue = 0,
248
+ saturationAmount = 1,
249
+ gamma = 1,
250
+ lift = 0,
251
+ gain = 1,
252
+ contrast = 1,
253
+ contrastPivot = 0.5,
254
+ exposure = 0,
255
+ ) => {
256
+
257
+ const rgbInput = toVec3Channels( input );
258
+ const hsv = mx_rgbtohsv( rgbInput );
259
+ const hueAdjusted = mx_hsvtorgb( add( hsv, vec3( hue, 0, 0 ) ) );
260
+ const saturationAdjusted = mx_saturation( hueAdjusted, saturationAmount );
261
+ const gammaAdjusted = mx_range( saturationAdjusted, 0, 1, 0, 1, gamma );
262
+ const liftApplied = add( mul( gammaAdjusted, sub( 1, lift ) ), lift );
263
+ const gainApplied = mul( liftApplied, gain );
264
+ const contrastApplied = mx_contrast( gainApplied, contrast, contrastPivot );
265
+ const exposureApplied = mul( contrastApplied, pow( 2, exposure ) );
266
+ const preserveAlpha = input && ( input.nodeType === 'vec4' || input.nodeType === 'color4' );
267
+ return preserveAlpha ? vec4( exposureApplied, element( input, 3 ) ) : exposureApplied;
268
+
269
+ };
270
+
271
+ const mx_minus = ( fg, bg, mixval = 1 ) => add( mul( mixval, sub( bg, fg ) ), mul( sub( 1, mixval ), bg ) );
272
+ const mx_difference = ( fg, bg, mixval = 1 ) => add( mul( mixval, abs( sub( bg, fg ) ) ), mul( sub( 1, mixval ), bg ) );
273
+ const mx_screen = ( fg, bg, mixval = 1 ) => {
274
+
275
+ const screened = sub( 1, mul( sub( 1, fg ), sub( 1, bg ) ) );
276
+ return mix( bg, screened, mixval );
277
+
278
+ };
279
+
280
+ const mx_overlay = ( fg, bg, mixval = 1 ) => {
281
+
282
+ const lowBranch = mul( mul( 2, fg ), bg );
283
+ const highBranch = sub( 1, mul( mul( 2, sub( 1, fg ) ), sub( 1, bg ) ) );
284
+ const overlayed = mix( lowBranch, highBranch, step( 0.5, bg ) );
285
+ return mix( bg, overlayed, mixval );
286
+
287
+ };
288
+
289
+ const mx_transformnormal = ( inNode = vec3( 0, 0, 1 ), fromspace = 'world', tospace = 'world' ) => {
290
+
291
+ const from = normalizeSpaceName( fromspace, 'world' );
292
+ const to = normalizeSpaceName( tospace, 'world' );
293
+ const inNormal = vec3( inNode );
294
+
295
+ if ( from === to ) {
296
+
297
+ return normalize( inNormal );
298
+
299
+ }
300
+
301
+ if ( from === 'object' && to === 'world' ) {
302
+
303
+ return normalize( mul( inNormal, modelNormalMatrix ) );
304
+
305
+ }
306
+
307
+ return normalize( mul( inNormal, mat3( modelWorldMatrix ) ) );
308
+
309
+ };
310
+
311
+ const mx_transformvector = ( inNode = vec3( 0, 0, 0 ), fromspace = 'world', tospace = 'world' ) => {
312
+
313
+ const from = normalizeSpaceName( fromspace, 'world' );
314
+ const to = normalizeSpaceName( tospace, 'world' );
315
+ const inVector = vec3( inNode );
316
+
317
+ if ( from === to ) {
318
+
319
+ return inVector;
320
+
321
+ }
322
+
323
+ if ( from === 'object' && to === 'world' ) {
324
+
325
+ return mul( inVector, mat3( modelWorldMatrix ) );
326
+
327
+ }
328
+
329
+ return mul( inVector, mat3( modelWorldMatrixInverse ) );
330
+
331
+ };
332
+
333
+ const mx_transformpoint = ( inNode = vec3( 0, 0, 0 ), fromspace = 'world', tospace = 'world' ) => {
334
+
335
+ const from = normalizeSpaceName( fromspace, 'world' );
336
+ const to = normalizeSpaceName( tospace, 'world' );
337
+ const inPoint = vec3( inNode );
338
+
339
+ if ( from === to ) {
340
+
341
+ return inPoint;
342
+
343
+ }
344
+
345
+ const point4 = vec4( inPoint, 1 );
346
+ const matrix = from === 'object' && to === 'world' ? modelWorldMatrix : modelWorldMatrixInverse;
347
+ const transformed4 = mul( matrix, point4 );
348
+ return vec3( element( transformed4, 0 ), element( transformed4, 1 ), element( transformed4, 2 ) );
349
+
350
+ };
351
+
352
+ const mx_burn_channel = ( fg, bg, mixval = 1 ) => {
353
+
354
+ const composed = add( mul( mixval, sub( 1, div( sub( 1, bg ), fg ) ) ), mul( sub( 1, mixval ), bg ) );
355
+ return mul( composed, step( float( 1e-6 ), abs( fg ) ) );
356
+
357
+ };
358
+
359
+ const mx_dodge_channel = ( fg, bg, mixval = 1 ) => {
360
+
361
+ const composed = add( mul( mixval, div( bg, sub( 1, fg ) ) ), mul( sub( 1, mixval ), bg ) );
362
+ return mul( composed, step( float( 1e-6 ), abs( sub( 1, fg ) ) ) );
363
+
364
+ };
365
+
366
+ const isVec3Like = ( node ) =>
367
+ node && ( node.nodeType === 'vec3' || node.nodeType === 'color' || node.nodeType === 'color3' );
368
+ const isVec4Like = ( node ) => node && ( node.nodeType === 'vec4' || node.nodeType === 'color4' );
369
+
370
+ const applyBlendByChannel = ( channelFunc, fg, bg, mixval = 1 ) => {
371
+
372
+ if ( isVec4Like( fg ) || isVec4Like( bg ) ) {
373
+
374
+ return vec4(
375
+ channelFunc( element( fg, 0 ), element( bg, 0 ), mixval ),
376
+ channelFunc( element( fg, 1 ), element( bg, 1 ), mixval ),
377
+ channelFunc( element( fg, 2 ), element( bg, 2 ), mixval ),
378
+ channelFunc( element( fg, 3 ), element( bg, 3 ), mixval ),
379
+ );
380
+
381
+ }
382
+
383
+ if ( isVec3Like( fg ) || isVec3Like( bg ) ) {
384
+
385
+ return vec3(
386
+ channelFunc( element( fg, 0 ), element( bg, 0 ), mixval ),
387
+ channelFunc( element( fg, 1 ), element( bg, 1 ), mixval ),
388
+ channelFunc( element( fg, 2 ), element( bg, 2 ), mixval ),
389
+ );
390
+
391
+ }
392
+
393
+ return channelFunc( fg, bg, mixval );
394
+
395
+ };
396
+
397
+ const mx_burn = ( fg, bg, mixval = 1 ) => applyBlendByChannel( mx_burn_channel, fg, bg, mixval );
398
+ const mx_dodge = ( fg, bg, mixval = 1 ) => applyBlendByChannel( mx_dodge_channel, fg, bg, mixval );
399
+
400
+ const mixColor4 = ( bg, fg, factor ) =>
401
+ vec4(
402
+ mix( element( bg, 0 ), element( fg, 0 ), factor ),
403
+ mix( element( bg, 1 ), element( fg, 1 ), factor ),
404
+ mix( element( bg, 2 ), element( fg, 2 ), factor ),
405
+ mix( element( bg, 3 ), element( fg, 3 ), factor ),
406
+ );
407
+
408
+ const mxRampSegment = ( x, color1, color2, interval1, interval2, interpolation ) => {
409
+
410
+ const linearClamped = clamp( x, interval1, interval2 );
411
+ const rangeSize = sub( interval2, interval1 );
412
+ const safeRange = max( rangeSize, float( 1e-6 ) );
413
+ const linearRemap = div( sub( linearClamped, interval1 ), safeRange );
414
+ const smoothVal = mx_smoothstep( x, interval1, interval2 );
415
+ const interpolationDistanceToLinear = abs( sub( interpolation, float( 0 ) ) );
416
+ const useLinear = sub( float( 1 ), step( float( 0.5 ), interpolationDistanceToLinear ) );
417
+ const interpFactor = mix( smoothVal, linearRemap, useLinear );
418
+ const mixedColor = mixColor4( color1, color2, interpFactor );
419
+ const stepColor = mixColor4( color1, color2, step( interval2, x ) );
420
+ const interpolationDistanceToStep = abs( sub( interpolation, float( 2 ) ) );
421
+ const useStep = sub( float( 1 ), step( float( 0.5 ), interpolationDistanceToStep ) );
422
+ return mixColor4( mixedColor, stepColor, useStep );
423
+
424
+ };
425
+
426
+ const mx_ramp_gradient = (
427
+ x = 0,
428
+ interval1 = 0,
429
+ interval2 = 1,
430
+ color1 = vec4( 0, 0, 0, 1 ),
431
+ color2 = vec4( 1, 1, 1, 1 ),
432
+ interpolation = 1,
433
+ prevColor = vec4( 0, 0, 0, 1 ),
434
+ intervalNum = 1,
435
+ numIntervals = 2,
436
+ ) => {
437
+
438
+ const xFloat = float( x );
439
+ const interval1Float = float( interval1 );
440
+ const interval2Float = float( interval2 );
441
+ const interpolationFloat = float( interpolation );
442
+ const intervalNumFloat = float( intervalNum );
443
+ const numIntervalsFloat = float( numIntervals );
444
+ const interpolated = mxRampSegment( xFloat, color1, color2, interval1Float, interval2Float, interpolationFloat );
445
+ const withinInterval = mixColor4( prevColor, interpolated, step( add( interval1Float, float( 1e-6 ) ), xFloat ) );
446
+ return mixColor4( withinInterval, prevColor, step( numIntervalsFloat, intervalNumFloat ) );
447
+
448
+ };
449
+
450
+ const mx_ramp = ( texcoord = vec2( 0, 0 ), type = 0, interpolation = 1, numIntervals = 2, ...rest ) => {
451
+
452
+ const rampTypeFloat = float( type );
453
+ const interpolationFloat = float( interpolation );
454
+ const numIntervalsFloat = float( numIntervals );
455
+
456
+ const clamped = clamp( texcoord, vec2( 0, 0 ), vec2( 1, 1 ) );
457
+ const s = element( clamped, 0 );
458
+ const t = element( clamped, 1 );
459
+
460
+ const centeredS = sub( s, float( 0.5 ) );
461
+ const centeredT = sub( t, float( 0.5 ) );
462
+
463
+ const radialDist = sqrt( add( mul( centeredS, centeredS ), mul( centeredT, centeredT ) ) );
464
+ const radialVal = clamp( mul( radialDist, float( 2 ) ), float( 0 ), float( 1 ) );
465
+ const circularAngle = add( div( mx_atan2( centeredT, centeredS ), float( Math.PI * 2 ) ), float( 0.5 ) );
466
+ const boxVal = clamp( mul( max( abs( centeredS ), abs( centeredT ) ), float( 2 ) ), float( 0 ), float( 1 ) );
467
+
468
+ const typeDistanceToRadial = abs( sub( rampTypeFloat, float( 1 ) ) );
469
+ const typeDistanceToCircular = abs( sub( rampTypeFloat, float( 2 ) ) );
470
+ const typeDistanceToBox = abs( sub( rampTypeFloat, float( 3 ) ) );
471
+ const useRadial = sub( float( 1 ), step( float( 0.5 ), typeDistanceToRadial ) );
472
+ const useCircular = sub( float( 1 ), step( float( 0.5 ), typeDistanceToCircular ) );
473
+ const useBox = sub( float( 1 ), step( float( 0.5 ), typeDistanceToBox ) );
474
+ const afterRadial = mix( s, radialVal, useRadial );
475
+ const afterCircular = mix( afterRadial, circularAngle, useCircular );
476
+ const rampX = mix( afterCircular, boxVal, useBox );
477
+
478
+ const intervals = [];
479
+ const colors = [];
480
+ for ( let i = 0; i < 10; i += 1 ) {
481
+
482
+ const intervalInput = rest[ i * 2 ];
483
+ const colorInput = rest[ i * 2 + 1 ];
484
+ intervals.push( intervalInput ?? float( i <= 1 ? i : 1 ) );
485
+ colors.push( colorInput ?? vec4( i === 0 ? 0 : 1, i === 0 ? 0 : 1, i === 0 ? 0 : 1, 1 ) );
486
+
487
+ }
488
+
489
+ let result = colors[ 0 ];
490
+ for ( let i = 0; i < 9; i += 1 ) {
491
+
492
+ const iv1 = intervals[ i ];
493
+ const iv2 = intervals[ i + 1 ];
494
+ const c1 = colors[ i ];
495
+ const c2 = colors[ i + 1 ];
496
+ const intNum = float( i + 1 );
497
+
498
+ const interpolated = mxRampSegment( rampX, c1, c2, iv1, iv2, interpolationFloat );
499
+ const withinInterval = mixColor4( result, interpolated, step( add( iv1, float( 1e-6 ) ), rampX ) );
500
+ result = mixColor4( withinInterval, result, step( numIntervalsFloat, intNum ) );
501
+
502
+ }
503
+
504
+ return result;
505
+
506
+ };
507
+
508
+ const defaultFloat = ( value ) => () => float( value );
509
+ const defaultInt = ( value ) => () => int( value );
510
+ const defaultBool = ( value ) => () => bool( value );
511
+ const defaultColor = ( r, g, b ) => () => color( r, g, b );
512
+ const defaultVec2 = ( x, y ) => () => vec2( x, y );
513
+ const defaultVec3 = ( x, y, z ) => () => vec3( x, y, z );
514
+ const defaultVec4 = ( x, y, z, w ) => () => vec4( x, y, z, w );
515
+ const usesVec2Noise = ( nodeX ) => nodeX && nodeX.type === 'vector2';
516
+ const usesVec3Noise = ( nodeX ) => nodeX && ( nodeX.type === 'vector3' || nodeX.type === 'color3' );
517
+
518
+ const mx_noise_materialx = ( texcoord, amplitude, pivot, nodeX ) =>
519
+ usesVec3Noise( nodeX ) ? mx_noise_vec3( texcoord, vec3( amplitude ), pivot ) : mx_noise_float( texcoord, amplitude, pivot );
520
+
521
+ const mx_fractal_noise_materialx_2d = ( texcoord, octaves, lacunarity, diminish, amplitude, nodeX ) =>
522
+ usesVec3Noise( nodeX ) ? mx_fractal_noise_vec3_materialx_2d( texcoord, octaves, lacunarity, diminish, amplitude ) : mx_fractal_noise_float_materialx_2d( texcoord, octaves, lacunarity, diminish, amplitude );
523
+
524
+ const mx_fractal_noise_materialx_3d = ( position, octaves, lacunarity, diminish, amplitude, nodeX ) =>
525
+ usesVec3Noise( nodeX ) ? mx_fractal_noise_vec3( position, octaves, lacunarity, diminish, vec3( amplitude ) ) : mx_fractal_noise_float( position, octaves, lacunarity, diminish, amplitude );
526
+
527
+ const mx_cell_noise_materialx = ( position, nodeX ) =>
528
+ usesVec3Noise( nodeX ) ? mx_cell_noise_vec3( position ) : mx_cell_noise_float( position );
529
+
530
+ const mx_worley_noise_vec2_style = ( position, jitter, style ) => {
531
+
532
+ const result = mx_worley_noise_vec3_style( position, jitter, style, 0 );
533
+ return vec2( element( result, 0 ), element( result, 1 ) );
534
+
535
+ };
536
+
537
+ const mx_worley_noise_materialx_2d = ( texcoord, jitter, style, nodeX ) =>
538
+ usesVec3Noise( nodeX ) ? mx_worley_noise_vec3_style( texcoord, jitter, style, 0 ) : usesVec2Noise( nodeX ) ? mx_worley_noise_vec2_style( texcoord, jitter, style ) : mx_worley_noise_float_2d( texcoord, jitter, style );
539
+
540
+ const mx_worley_noise_materialx_3d = ( position, jitter, style, nodeX ) =>
541
+ usesVec3Noise( nodeX ) ? mx_worley_noise_vec3_style( position, jitter, style, 0 ) : usesVec2Noise( nodeX ) ? mx_worley_noise_vec2_style( position, jitter, style ) : mx_worley_noise_float_3d( position, jitter, style );
542
+
543
+ const mx_fractal_noise_float_materialx_2d = Fn( ( [ texcoordInput, octavesInput, lacunarityInput, diminishInput, amplitudeInput ] ) => {
544
+
545
+ const texcoord = vec2( texcoordInput ).toVar();
546
+ const octaves = int( octavesInput ).toVar();
547
+ const lacunarity = float( lacunarityInput ).toVar();
548
+ const diminish = float( diminishInput ).toVar();
549
+ const amplitude = float( amplitudeInput ).toVar();
550
+ const result = float( 0 ).toVar();
551
+ const octaveAmplitude = float( 1 ).toVar();
552
+
553
+ Loop( octaves, () => {
554
+
555
+ result.addAssign( mul( octaveAmplitude, mx_noise_float( texcoord, float( 1 ), float( 0 ) ) ) );
556
+ octaveAmplitude.mulAssign( diminish );
557
+ texcoord.mulAssign( lacunarity );
558
+
559
+ } );
560
+
561
+ return mul( result, amplitude );
562
+
563
+ } );
564
+
565
+ const mx_fractal_noise_vec3_materialx_2d = Fn( ( [ texcoordInput, octavesInput, lacunarityInput, diminishInput, amplitudeInput ] ) => {
566
+
567
+ const texcoord = vec2( texcoordInput ).toVar();
568
+ const octaves = int( octavesInput ).toVar();
569
+ const lacunarity = float( lacunarityInput ).toVar();
570
+ const diminish = float( diminishInput ).toVar();
571
+ const amplitude = vec3( amplitudeInput ).toVar();
572
+ const result = vec3( 0 ).toVar();
573
+ const octaveAmplitude = float( 1 ).toVar();
574
+
575
+ Loop( octaves, () => {
576
+
577
+ result.addAssign( mul( octaveAmplitude, mx_noise_vec3( texcoord, vec3( 1 ), float( 0 ) ) ) );
578
+ octaveAmplitude.mulAssign( diminish );
579
+ texcoord.mulAssign( lacunarity );
580
+
581
+ } );
582
+
583
+ return mul( result, amplitude );
584
+
585
+ } );
586
+
587
+ const MXElements = [
588
+ createMXElement( 'add', add, [ 'in1', 'in2' ], { in1: defaultFloat( 0 ), in2: defaultFloat( 0 ) } ),
589
+ createMXElement( 'subtract', sub, [ 'in1', 'in2' ], { in1: defaultFloat( 0 ), in2: defaultFloat( 0 ) } ),
590
+ createMXElement( 'multiply', mul, [ 'in1', 'in2' ], { in1: defaultFloat( 0 ), in2: defaultFloat( 1 ) } ),
591
+ createMXElement( 'divide', div, [ 'in1', 'in2' ], { in1: defaultFloat( 0 ), in2: defaultFloat( 1 ) } ),
592
+ createMXElement( 'modulo', mx_modulo, [ 'in1', 'in2' ], { in1: defaultFloat( 0 ), in2: defaultFloat( 1 ) } ),
593
+ createMXElement( 'absval', abs, [ 'in' ], { in: defaultFloat( 0 ) } ),
594
+ createMXElement( 'sign', sign, [ 'in' ], { in: defaultFloat( 0 ) } ),
595
+ createMXElement( 'floor', floor, [ 'in' ], { in: defaultFloat( 0 ) } ),
596
+ createMXElement( 'ceil', ceil, [ 'in' ], { in: defaultFloat( 0 ) } ),
597
+ createMXElement( 'round', round, [ 'in' ], { in: defaultFloat( 0 ) } ),
598
+ createMXElement( 'power', pow, [ 'in1', 'in2' ], { in1: defaultFloat( 0 ), in2: defaultFloat( 1 ) } ),
599
+ createMXElement( 'sin', sin, [ 'in' ], { in: defaultFloat( 0 ) } ),
600
+ createMXElement( 'cos', cos, [ 'in' ], { in: defaultFloat( 0 ) } ),
601
+ createMXElement( 'tan', tan, [ 'in' ], { in: defaultFloat( 0 ) } ),
602
+ createMXElement( 'asin', asin, [ 'in' ], { in: defaultFloat( 0 ) } ),
603
+ createMXElement( 'acos', acos, [ 'in' ], { in: defaultFloat( 0 ) } ),
604
+ createMXElement( 'atan2', mx_atan2, [ 'iny', 'inx' ], { iny: defaultFloat( 0 ), inx: defaultFloat( 1 ) } ),
605
+ createMXElement( 'sqrt', sqrt, [ 'in' ], { in: defaultFloat( 0 ) } ),
606
+ createMXElement( 'ln', log, [ 'in' ], { in: defaultFloat( 1 ) } ),
607
+ createMXElement( 'exp', exp, [ 'in' ], { in: defaultFloat( 0 ) } ),
608
+ createMXElement( 'fract', fract, [ 'in' ], { in: defaultFloat( 0 ) } ),
609
+ createMXElement( 'clamp', clamp, [ 'in', 'low', 'high' ], {
610
+ in: defaultFloat( 0 ),
611
+ low: defaultFloat( 0 ),
612
+ high: defaultFloat( 1 ),
613
+ } ),
614
+ createMXElement( 'min', min, [ 'in1', 'in2' ], { in1: defaultFloat( 0 ), in2: defaultFloat( 0 ) } ),
615
+ createMXElement( 'max', max, [ 'in1', 'in2' ], { in1: defaultFloat( 0 ), in2: defaultFloat( 0 ) } ),
616
+ createMXElement( 'normalize', normalize, [ 'in' ], { in: defaultFloat( 0 ) } ),
617
+ createMXElement( 'magnitude', length, [ 'in' ], { in: defaultFloat( 0 ) } ),
618
+ createMXElement( 'length', length, [ 'in' ], { in: defaultFloat( 0 ) } ),
619
+ createMXElement( 'dot', mx_dot, [ 'in' ], { in: defaultFloat( 0 ) } ),
620
+ createMXElement( 'dotproduct', dot, [ 'in1', 'in2' ], { in1: defaultFloat( 0 ), in2: defaultFloat( 0 ) } ),
621
+ createMXElement( 'viewdirection', mx_viewdirection, [ 'space' ], { space: () => 'world' } ),
622
+ createMXElement( 'crossproduct', cross, [ 'in1', 'in2' ], { in1: defaultVec3( 0, 0, 0 ), in2: defaultVec3( 0, 0, 0 ) } ),
623
+ createMXElement( 'distance', distance, [ 'in1', 'in2' ], { in1: defaultFloat( 0 ), in2: defaultFloat( 0 ) } ),
624
+ createMXElement( 'invert', mx_invert, [ 'in', 'amount' ], { in: defaultFloat( 0 ), amount: defaultFloat( 1 ) } ),
625
+ createMXElement( 'transformmatrix', mul, [ 'in', 'mat' ], { in: defaultFloat( 0 ) } ),
626
+ createMXElement( 'transformnormal', mx_transformnormal, [ 'in', 'fromspace', 'tospace' ], {
627
+ in: defaultVec3( 0, 0, 1 ),
628
+ fromspace: () => 'world',
629
+ tospace: () => 'world',
630
+ } ),
631
+ createMXElement( 'transformpoint', mx_transformpoint, [ 'in', 'fromspace', 'tospace' ], {
632
+ in: defaultVec3( 0, 0, 0 ),
633
+ fromspace: () => 'world',
634
+ tospace: () => 'world',
635
+ } ),
636
+ createMXElement( 'transformvector', mx_transformvector, [ 'in', 'fromspace', 'tospace' ], {
637
+ in: defaultVec3( 0, 0, 0 ),
638
+ fromspace: () => 'world',
639
+ tospace: () => 'world',
640
+ } ),
641
+ createMXElement( 'normalmap', mx_normalmap, [ 'in', 'scale', 'normal', 'tangent', 'bitangent' ], {
642
+ in: defaultVec3( 0.5, 0.5, 1.0 ),
643
+ scale: defaultFloat( 1 ),
644
+ normal: () => normalWorld,
645
+ tangent: () => tangentWorld,
646
+ bitangent: () => bitangentWorld,
647
+ } ),
648
+ createMXElement( 'transpose', transpose, [ 'in' ] ),
649
+ createMXElement( 'determinant', determinant, [ 'in' ] ),
650
+ createMXElement( 'invertmatrix', inverse, [ 'in' ] ),
651
+ createMXElement( 'creatematrix', mat3, [ 'in1', 'in2', 'in3' ], {
652
+ in1: defaultVec3( 1, 0, 0 ),
653
+ in2: defaultVec3( 0, 1, 0 ),
654
+ in3: defaultVec3( 0, 0, 1 ),
655
+ } ),
656
+ createMXElement( 'remap', remap, [ 'in', 'inlow', 'inhigh', 'outlow', 'outhigh' ], {
657
+ in: defaultFloat( 0 ),
658
+ inlow: defaultFloat( 0 ),
659
+ inhigh: defaultFloat( 1 ),
660
+ outlow: defaultFloat( 0 ),
661
+ outhigh: defaultFloat( 1 ),
662
+ } ),
663
+ createMXElement( 'range', mx_range, [ 'in', 'inlow', 'inhigh', 'outlow', 'outhigh', 'gamma' ], {
664
+ in: defaultFloat( 0 ),
665
+ inlow: defaultFloat( 0 ),
666
+ inhigh: defaultFloat( 1 ),
667
+ outlow: defaultFloat( 0 ),
668
+ outhigh: defaultFloat( 1 ),
669
+ gamma: defaultFloat( 1 ),
670
+ } ),
671
+ createMXElement( 'open_pbr_anisotropy', mx_open_pbr_anisotropy, [ 'roughness', 'anisotropy' ], {
672
+ roughness: defaultFloat( 0 ),
673
+ anisotropy: defaultFloat( 0 ),
674
+ } ),
675
+ createMXElement( 'smoothstep', mx_smoothstep, [ 'in', 'low', 'high' ], {
676
+ in: defaultFloat( 0 ),
677
+ low: defaultFloat( 0 ),
678
+ high: defaultFloat( 1 ),
679
+ } ),
680
+ createMXElement( 'luminance', luminance, [ 'in', 'lumacoeffs' ], {
681
+ in: defaultColor( 0, 0, 0 ),
682
+ lumacoeffs: defaultColor( 0.2722287, 0.6740818, 0.0536895 ),
683
+ } ),
684
+ createMXElement( 'rgbtohsv', mx_rgbtohsv, [ 'in' ], { in: defaultColor( 0, 0, 0 ) } ),
685
+ createMXElement( 'hsvtorgb', mx_hsvtorgb, [ 'in' ], { in: defaultColor( 0, 0, 0 ) } ),
686
+ createMXElement( 'mix', mix, [ 'bg', 'fg', 'mix' ], { bg: defaultFloat( 0 ), fg: defaultFloat( 0 ), mix: defaultFloat( 0 ) } ),
687
+ createMXElement( 'minus', mx_minus, [ 'fg', 'bg', 'mix' ], {
688
+ fg: defaultFloat( 0 ),
689
+ bg: defaultFloat( 0 ),
690
+ mix: defaultFloat( 1 ),
691
+ } ),
692
+ createMXElement( 'difference', mx_difference, [ 'fg', 'bg', 'mix' ], {
693
+ fg: defaultFloat( 0 ),
694
+ bg: defaultFloat( 0 ),
695
+ mix: defaultFloat( 1 ),
696
+ } ),
697
+ createMXElement( 'screen', mx_screen, [ 'fg', 'bg', 'mix' ], {
698
+ fg: defaultFloat( 0 ),
699
+ bg: defaultFloat( 0 ),
700
+ mix: defaultFloat( 1 ),
701
+ } ),
702
+ createMXElement( 'overlay', mx_overlay, [ 'fg', 'bg', 'mix' ], {
703
+ fg: defaultFloat( 0 ),
704
+ bg: defaultFloat( 0 ),
705
+ mix: defaultFloat( 1 ),
706
+ } ),
707
+ createMXElement( 'burn', mx_burn, [ 'fg', 'bg', 'mix' ], {
708
+ fg: defaultFloat( 0 ),
709
+ bg: defaultFloat( 0 ),
710
+ mix: defaultFloat( 1 ),
711
+ } ),
712
+ createMXElement( 'dodge', mx_dodge, [ 'fg', 'bg', 'mix' ], {
713
+ fg: defaultFloat( 0 ),
714
+ bg: defaultFloat( 0 ),
715
+ mix: defaultFloat( 1 ),
716
+ } ),
717
+ createMXElement(
718
+ 'colorcorrect',
719
+ mx_colorcorrect,
720
+ [ 'in', 'hue', 'saturation', 'gamma', 'lift', 'gain', 'contrast', 'contrastpivot', 'exposure' ],
721
+ {
722
+ in: defaultColor( 1, 1, 1 ),
723
+ hue: defaultFloat( 0 ),
724
+ saturation: defaultFloat( 1 ),
725
+ gamma: defaultFloat( 1 ),
726
+ lift: defaultFloat( 0 ),
727
+ gain: defaultFloat( 1 ),
728
+ contrast: defaultFloat( 1 ),
729
+ contrastpivot: defaultFloat( 0.5 ),
730
+ exposure: defaultFloat( 0 ),
731
+ },
732
+ ),
733
+ createMXElement( 'unpremult', mx_unpremult, [ 'in' ], { in: defaultVec4( 0, 0, 0, 1 ) } ),
734
+ createMXElement( 'combine2', vec2, [ 'in1', 'in2' ], { in1: defaultFloat( 0 ), in2: defaultFloat( 0 ) } ),
735
+ createMXElement( 'combine3', vec3, [ 'in1', 'in2', 'in3' ], {
736
+ in1: defaultFloat( 0 ),
737
+ in2: defaultFloat( 0 ),
738
+ in3: defaultFloat( 0 ),
739
+ } ),
740
+ createMXElement( 'combine4', vec4, [ 'in1', 'in2', 'in3', 'in4' ], {
741
+ in1: defaultFloat( 0 ),
742
+ in2: defaultFloat( 0 ),
743
+ in3: defaultFloat( 0 ),
744
+ in4: defaultFloat( 0 ),
745
+ } ),
746
+ createMXElement( 'ramplr', mx_ramplr, [ 'valuel', 'valuer', 'texcoord' ], {
747
+ valuel: defaultFloat( 0 ),
748
+ valuer: defaultFloat( 0 ),
749
+ } ),
750
+ createMXElement( 'ramptb', mx_ramptb, [ 'valueb', 'valuet', 'texcoord' ], {
751
+ valueb: defaultFloat( 0 ),
752
+ valuet: defaultFloat( 0 ),
753
+ } ),
754
+ createMXElement( 'ramp4', mx_ramp4, [ 'valuetl', 'valuetr', 'valuebl', 'valuebr', 'texcoord' ], {
755
+ valuetl: defaultColor( 0, 0, 0 ),
756
+ valuetr: defaultColor( 0, 0, 0 ),
757
+ valuebl: defaultColor( 0, 0, 0 ),
758
+ valuebr: defaultColor( 0, 0, 0 ),
759
+ texcoord: defaultVec2( 0, 0 ),
760
+ } ),
761
+ createMXElement(
762
+ 'ramp_gradient',
763
+ mx_ramp_gradient,
764
+ [ 'x', 'interval1', 'interval2', 'color1', 'color2', 'interpolation', 'prev_color', 'interval_num', 'num_intervals' ],
765
+ {
766
+ x: defaultFloat( 0 ),
767
+ interval1: defaultFloat( 0 ),
768
+ interval2: defaultFloat( 1 ),
769
+ color1: defaultVec4( 0, 0, 0, 1 ),
770
+ color2: defaultVec4( 1, 1, 1, 1 ),
771
+ interpolation: defaultFloat( 1 ),
772
+ prev_color: defaultVec4( 0, 0, 0, 1 ),
773
+ interval_num: defaultFloat( 1 ),
774
+ num_intervals: defaultFloat( 2 ),
775
+ },
776
+ ),
777
+ createMXElement(
778
+ 'ramp',
779
+ mx_ramp,
780
+ [
781
+ 'texcoord',
782
+ 'type',
783
+ 'interpolation',
784
+ 'num_intervals',
785
+ 'interval1',
786
+ 'color1',
787
+ 'interval2',
788
+ 'color2',
789
+ 'interval3',
790
+ 'color3',
791
+ 'interval4',
792
+ 'color4',
793
+ 'interval5',
794
+ 'color5',
795
+ 'interval6',
796
+ 'color6',
797
+ 'interval7',
798
+ 'color7',
799
+ 'interval8',
800
+ 'color8',
801
+ 'interval9',
802
+ 'color9',
803
+ 'interval10',
804
+ 'color10',
805
+ ],
806
+ {
807
+ texcoord: defaultVec2( 0, 0 ),
808
+ type: defaultFloat( 0 ),
809
+ interpolation: defaultFloat( 1 ),
810
+ num_intervals: defaultFloat( 2 ),
811
+ interval1: defaultFloat( 0 ),
812
+ color1: defaultVec4( 0, 0, 0, 1 ),
813
+ interval2: defaultFloat( 1 ),
814
+ color2: defaultVec4( 1, 1, 1, 1 ),
815
+ interval3: defaultFloat( 1 ),
816
+ color3: defaultVec4( 1, 1, 1, 1 ),
817
+ interval4: defaultFloat( 1 ),
818
+ color4: defaultVec4( 1, 1, 1, 1 ),
819
+ interval5: defaultFloat( 1 ),
820
+ color5: defaultVec4( 1, 1, 1, 1 ),
821
+ interval6: defaultFloat( 1 ),
822
+ color6: defaultVec4( 1, 1, 1, 1 ),
823
+ interval7: defaultFloat( 1 ),
824
+ color7: defaultVec4( 1, 1, 1, 1 ),
825
+ interval8: defaultFloat( 1 ),
826
+ color8: defaultVec4( 1, 1, 1, 1 ),
827
+ interval9: defaultFloat( 1 ),
828
+ color9: defaultVec4( 1, 1, 1, 1 ),
829
+ interval10: defaultFloat( 1 ),
830
+ color10: defaultVec4( 1, 1, 1, 1 ),
831
+ },
832
+ ),
833
+ createMXElement( 'splitlr', mx_splitlr, [ 'valuel', 'valuer', 'center', 'texcoord' ], {
834
+ valuel: defaultFloat( 0 ),
835
+ valuer: defaultFloat( 0 ),
836
+ center: defaultFloat( 0.5 ),
837
+ } ),
838
+ createMXElement( 'splittb', mx_splittb, [ 'valueb', 'valuet', 'center', 'texcoord' ], {
839
+ valueb: defaultFloat( 0 ),
840
+ valuet: defaultFloat( 0 ),
841
+ center: defaultFloat( 0.5 ),
842
+ } ),
843
+ createMXElement( 'noise2d', mx_noise_materialx, [ 'texcoord', 'amplitude', 'pivot' ], {
844
+ texcoord: defaultVec2( 0, 0 ),
845
+ amplitude: defaultFloat( 1 ),
846
+ pivot: defaultFloat( 0 ),
847
+ }, true ),
848
+ createMXElement( 'noise3d', mx_noise_materialx, [ 'position', 'amplitude', 'pivot' ], {
849
+ position: () => positionLocal,
850
+ amplitude: defaultFloat( 1 ),
851
+ pivot: defaultFloat( 0 ),
852
+ }, true ),
853
+ createMXElement( 'fractal2d', mx_fractal_noise_materialx_2d, [ 'texcoord', 'octaves', 'lacunarity', 'diminish', 'amplitude' ], {
854
+ texcoord: defaultVec2( 0, 0 ),
855
+ octaves: defaultInt( 3 ),
856
+ lacunarity: defaultFloat( 2.0 ),
857
+ diminish: defaultFloat( 0.5 ),
858
+ amplitude: defaultFloat( 1.0 ),
859
+ }, true ),
860
+ createMXElement( 'fractal3d', mx_fractal_noise_materialx_3d, [ 'position', 'octaves', 'lacunarity', 'diminish', 'amplitude' ], {
861
+ position: () => positionLocal,
862
+ octaves: defaultInt( 3 ),
863
+ lacunarity: defaultFloat( 2.0 ),
864
+ diminish: defaultFloat( 0.5 ),
865
+ amplitude: defaultFloat( 1.0 ),
866
+ }, true ),
867
+ createMXElement( 'cellnoise2d', mx_cell_noise_materialx, [ 'texcoord' ], { texcoord: defaultVec2( 0, 0 ) }, true ),
868
+ createMXElement( 'cellnoise3d', mx_cell_noise_materialx, [ 'position' ], { position: () => positionLocal }, true ),
869
+ createMXElement( 'worleynoise2d', mx_worley_noise_materialx_2d, [ 'texcoord', 'jitter', 'style' ], {
870
+ texcoord: defaultVec2( 0, 0 ),
871
+ jitter: defaultFloat( 1 ),
872
+ style: defaultInt( 0 ),
873
+ }, true ),
874
+ createMXElement( 'worleynoise3d', mx_worley_noise_materialx_3d, [ 'position', 'jitter', 'style' ], {
875
+ position: () => positionLocal,
876
+ jitter: defaultFloat( 1 ),
877
+ style: defaultInt( 0 ),
878
+ }, true ),
879
+ createMXElement(
880
+ 'unifiednoise2d',
881
+ mx_unifiednoise2d,
882
+ [
883
+ 'type',
884
+ 'texcoord',
885
+ 'freq',
886
+ 'offset',
887
+ 'jitter',
888
+ 'outmin',
889
+ 'outmax',
890
+ 'clampoutput',
891
+ 'octaves',
892
+ 'lacunarity',
893
+ 'diminish',
894
+ 'style',
895
+ ],
896
+ {
897
+ type: defaultInt( 0 ),
898
+ texcoord: defaultVec2( 0, 0 ),
899
+ freq: defaultVec2( 1, 1 ),
900
+ offset: defaultVec2( 0, 0 ),
901
+ jitter: defaultFloat( 1 ),
902
+ outmin: defaultFloat( 0 ),
903
+ outmax: defaultFloat( 1 ),
904
+ clampoutput: defaultBool( true ),
905
+ octaves: defaultInt( 3 ),
906
+ lacunarity: defaultFloat( 2 ),
907
+ diminish: defaultFloat( 0.5 ),
908
+ style: defaultInt( 0 ),
909
+ },
910
+ ),
911
+ createMXElement(
912
+ 'unifiednoise3d',
913
+ mx_unifiednoise3d,
914
+ [
915
+ 'type',
916
+ 'position',
917
+ 'freq',
918
+ 'offset',
919
+ 'jitter',
920
+ 'outmin',
921
+ 'outmax',
922
+ 'clampoutput',
923
+ 'octaves',
924
+ 'lacunarity',
925
+ 'diminish',
926
+ 'style',
927
+ ],
928
+ {
929
+ type: defaultInt( 0 ),
930
+ position: () => positionLocal,
931
+ freq: defaultVec3( 1, 1, 1 ),
932
+ offset: defaultVec3( 0, 0, 0 ),
933
+ jitter: defaultFloat( 1 ),
934
+ outmin: defaultFloat( 0 ),
935
+ outmax: defaultFloat( 1 ),
936
+ clampoutput: defaultBool( true ),
937
+ octaves: defaultInt( 3 ),
938
+ lacunarity: defaultFloat( 2 ),
939
+ diminish: defaultFloat( 0.5 ),
940
+ style: defaultInt( 0 ),
941
+ },
942
+ ),
943
+ createMXElement( 'place2d', mx_place2d, [ 'texcoord', 'pivot', 'scale', 'rotate', 'offset', 'operationorder' ], {
944
+ texcoord: defaultVec2( 0, 0 ),
945
+ pivot: defaultVec2( 0, 0 ),
946
+ scale: defaultVec2( 1, 1 ),
947
+ rotate: defaultFloat( 0 ),
948
+ offset: defaultVec2( 0, 0 ),
949
+ operationorder: defaultInt( 0 ),
950
+ } ),
951
+ createMXElement( 'safepower', mx_safepower, [ 'in1', 'in2' ], { in1: defaultFloat( 0 ), in2: defaultFloat( 1 ) } ),
952
+ createMXElement( 'contrast', mx_contrast, [ 'in', 'amount', 'pivot' ], {
953
+ in: defaultFloat( 0 ),
954
+ amount: defaultFloat( 1 ),
955
+ pivot: defaultFloat( 0.5 ),
956
+ } ),
957
+ createMXElement( 'saturate', mx_saturation, [ 'in', 'amount' ], { in: defaultColor( 0, 0, 0 ), amount: defaultFloat( 1 ) } ),
958
+ createMXElement( 'extract', element, [ 'in', 'index' ], { in: defaultFloat( 0 ), index: defaultInt( 0 ) } ),
959
+ createMXElement( 'separate2', element, [ 'in' ], { in: defaultVec2( 0, 0 ) } ),
960
+ createMXElement( 'separate3', element, [ 'in' ], { in: defaultVec3( 0, 0, 0 ) } ),
961
+ createMXElement( 'separate4', element, [ 'in' ], { in: defaultVec4( 0, 0, 0, 0 ) } ),
962
+ createMXElement( 'reflect', reflect, [ 'in', 'normal' ], { in: defaultVec3( 1, 0, 0 ) } ),
963
+ createMXElement( 'refract', refract, [ 'in', 'normal', 'ior' ], { in: defaultVec3( 1, 0, 0 ), ior: defaultFloat( 1 ) } ),
964
+ createMXElement( 'time', mx_timer ),
965
+ createMXElement( 'frame', mx_frame ),
966
+ createMXElement( 'ifgreater', mx_ifgreater, [ 'value1', 'value2', 'in1', 'in2' ], {
967
+ value1: defaultFloat( 1 ),
968
+ value2: defaultFloat( 0 ),
969
+ in1: defaultFloat( 0 ),
970
+ in2: defaultFloat( 0 ),
971
+ } ),
972
+ createMXElement( 'ifgreatereq', mx_ifgreatereq, [ 'value1', 'value2', 'in1', 'in2' ], {
973
+ value1: defaultFloat( 1 ),
974
+ value2: defaultFloat( 0 ),
975
+ in1: defaultFloat( 0 ),
976
+ in2: defaultFloat( 0 ),
977
+ } ),
978
+ createMXElement( 'ifequal', mx_ifequal, [ 'value1', 'value2', 'in1', 'in2' ], {
979
+ value1: defaultFloat( 0 ),
980
+ value2: defaultFloat( 0 ),
981
+ in1: defaultFloat( 0 ),
982
+ in2: defaultFloat( 0 ),
983
+ } ),
984
+ createMXElement( 'rotate2d', mx_rotate2d, [ 'in', 'amount' ], { in: defaultVec2( 0, 0 ), amount: defaultFloat( 0 ) } ),
985
+ createMXElement( 'rotate3d', mx_rotate3d, [ 'in', 'amount', 'axis' ], {
986
+ in: defaultVec3( 0, 0, 0 ),
987
+ amount: defaultFloat( 0 ),
988
+ axis: defaultVec3( 0, 1, 0 ),
989
+ } ),
990
+ createMXElement( 'heighttonormal', mx_heighttonormal, [ 'in', 'scale', 'texcoord' ], {
991
+ in: defaultFloat( 0 ),
992
+ scale: defaultFloat( 1 ),
993
+ } ),
994
+ createMXElement( 'and', mx_and, [ 'in1', 'in2' ], { in1: defaultBool( false ), in2: defaultBool( false ) } ),
995
+ createMXElement( 'or', mx_or, [ 'in1', 'in2' ], { in1: defaultBool( false ), in2: defaultBool( false ) } ),
996
+ createMXElement( 'xor', mx_xor, [ 'in1', 'in2' ], { in1: defaultBool( false ), in2: defaultBool( false ) } ),
997
+ createMXElement( 'not', mx_not, [ 'in' ], { in: defaultBool( false ) } ),
998
+ createMXElement( 'checkerboard', mx_checkerboard, [ 'color1', 'color2', 'uvtiling', 'uvoffset', 'texcoord' ], {
999
+ color1: defaultColor( 1, 1, 1 ),
1000
+ color2: defaultColor( 0, 0, 0 ),
1001
+ uvtiling: defaultVec2( 8, 8 ),
1002
+ uvoffset: defaultVec2( 0, 0 ),
1003
+ texcoord: defaultVec2( 0, 0 ),
1004
+ } ),
1005
+ createMXElement( 'circle', mx_circle, [ 'texcoord', 'center', 'radius' ], {
1006
+ center: defaultVec2( 0, 0 ),
1007
+ radius: defaultFloat( 0.5 ),
1008
+ } ),
1009
+ createMXElement( 'bump', mx_bump, [ 'height', 'scale', 'normal', 'tangent', 'bitangent' ], {
1010
+ height: defaultFloat( 0 ),
1011
+ scale: defaultFloat( 1 ),
1012
+ normal: () => normalWorld,
1013
+ tangent: () => tangentWorld,
1014
+ bitangent: () => bitangentWorld,
1015
+ } ),
1016
+ createMXElement( 'blackbody', mx_blackbody, [ 'temperature' ], { temperature: defaultFloat( 5000 ) } ),
1017
+ ];
1018
+
1019
+ const MtlXLibrary = Object.fromEntries( MXElements.map( ( entry ) => [ entry.name, entry ] ) );
1020
+
1021
+ export { MtlXLibrary };