@unikia/upe-renderer 0.186.110 → 0.187.11

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 (506) hide show
  1. package/README.md +5 -7
  2. package/UPSTREAM.md +4 -4
  3. package/build/three.core.js +853 -277
  4. package/build/three.module.js +1098 -1280
  5. package/build/three.tsl.js +41938 -686
  6. package/build/three.webgpu.js +10604 -49055
  7. package/build/three.webgpu.nodes.js +9249 -5788
  8. package/examples/jsm/Addons.js +2 -0
  9. package/examples/jsm/animation/CCDIKSolver.js +17 -5
  10. package/examples/jsm/controls/FirstPersonControls.js +1 -1
  11. package/examples/jsm/controls/OrbitControls.js +27 -14
  12. package/examples/jsm/csm/CSMShader.js +74 -3
  13. package/examples/jsm/curves/CurveExtras.js +4 -4
  14. package/examples/jsm/curves/NURBSCurve.js +14 -0
  15. package/examples/jsm/exporters/EXRExporter.js +673 -16
  16. package/examples/jsm/exporters/GLTFExporter.js +4 -4
  17. package/examples/jsm/exporters/KTX2Exporter.js +1 -1
  18. package/examples/jsm/exporters/OBJExporter.js +48 -5
  19. package/examples/jsm/exporters/PLYExporter.js +22 -11
  20. package/examples/jsm/generators/CityGenerator.js +3 -2
  21. package/examples/jsm/generators/city/SkyscraperGenerator.js +63 -21
  22. package/examples/jsm/gpgpu/BitonicSort.js +30 -23
  23. package/examples/jsm/helpers/VertexTangentsHelper.js +1 -1
  24. package/examples/jsm/inspector/Extension.js +1 -1
  25. package/examples/jsm/inspector/Inspector.js +6 -46
  26. package/examples/jsm/inspector/RendererInspector.js +43 -8
  27. package/examples/jsm/inspector/Storage.js +49 -0
  28. package/examples/jsm/inspector/extensions/color-grading/ColorGrading.js +32 -27
  29. package/examples/jsm/inspector/tabs/Parameters.js +5 -1
  30. package/examples/jsm/inspector/tabs/Performance.js +22 -7
  31. package/examples/jsm/inspector/tabs/Settings.js +1 -1
  32. package/examples/jsm/inspector/tabs/Timeline.js +83 -7
  33. package/examples/jsm/inspector/tabs/Viewer.js +25 -10
  34. package/examples/jsm/inspector/ui/Profiler.js +1 -1
  35. package/examples/jsm/inspector/ui/Style.js +21 -53
  36. package/examples/jsm/inspector/ui/Values.js +28 -3
  37. package/examples/jsm/libs/fflate.module.js +83 -56
  38. package/examples/jsm/libs/mikktspace.README.md +27 -0
  39. package/examples/jsm/libs/mikktspace.module.js +721 -109
  40. package/examples/jsm/lighting/ClusteredLighting.js +100 -2
  41. package/examples/jsm/lighting/LightMapper.js +295 -0
  42. package/examples/jsm/lighting/LightProbeGrid.js +242 -139
  43. package/examples/jsm/lighting/LightProbeGridWebGL.js +30 -14
  44. package/examples/jsm/lighting/vxgi/VXGIConeTracer.js +54 -5
  45. package/examples/jsm/lighting/vxgi/VXGIIrradiance.js +43 -0
  46. package/examples/jsm/lighting/vxgi/VXGINode.js +13 -56
  47. package/examples/jsm/lighting/vxgi/VXGISceneCollector.js +316 -1
  48. package/examples/jsm/lighting/vxgi/VXGIVolume.js +69 -59
  49. package/examples/jsm/lights/SunLight.js +9 -4
  50. package/examples/jsm/lights/SunLightNode.js +3 -3
  51. package/examples/jsm/lines/LineMaterial.js +26 -10
  52. package/examples/jsm/loaders/3DMLoader.js +10 -1
  53. package/examples/jsm/loaders/3MFLoader.js +5 -1
  54. package/examples/jsm/loaders/AMFLoader.js +2 -0
  55. package/examples/jsm/loaders/BVHLoader.js +2 -0
  56. package/examples/jsm/loaders/ColladaLoader.js +8 -0
  57. package/examples/jsm/loaders/DDSLoader.js +1 -1
  58. package/examples/jsm/loaders/DRACOLoader.js +5 -1
  59. package/examples/jsm/loaders/EXRLoader.js +120 -104
  60. package/examples/jsm/loaders/FBXLoader.js +4 -0
  61. package/examples/jsm/loaders/FontLoader.js +2 -0
  62. package/examples/jsm/loaders/GCodeLoader.js +5 -9
  63. package/examples/jsm/loaders/GLTFLoader.js +112 -31
  64. package/examples/jsm/loaders/GaussianSplatPLYLoader.js +2 -0
  65. package/examples/jsm/loaders/HDRCubeTextureLoader.js +3 -0
  66. package/examples/jsm/loaders/IESLoader.js +46 -12
  67. package/examples/jsm/loaders/JXLLoader.js +159 -0
  68. package/examples/jsm/loaders/KMZLoader.js +6 -0
  69. package/examples/jsm/loaders/KSPLATLoader.js +2 -0
  70. package/examples/jsm/loaders/KTX2Loader.js +49 -4
  71. package/examples/jsm/loaders/KTXLoader.js +5 -3
  72. package/examples/jsm/loaders/LDrawLoader.js +15 -22
  73. package/examples/jsm/loaders/LUT3dlLoader.js +5 -1
  74. package/examples/jsm/loaders/LUTCubeLoader.js +6 -2
  75. package/examples/jsm/loaders/LUTImageLoader.js +2 -0
  76. package/examples/jsm/loaders/LWOLoader.js +6 -0
  77. package/examples/jsm/loaders/MD2Loader.js +2 -0
  78. package/examples/jsm/loaders/MDDLoader.js +4 -0
  79. package/examples/jsm/loaders/MTLLoader.js +8 -0
  80. package/examples/jsm/loaders/MaterialXLoader.js +57 -5
  81. package/examples/jsm/loaders/NRRDLoader.js +4 -2
  82. package/examples/jsm/loaders/OBJLoader.js +10 -4
  83. package/examples/jsm/loaders/PCDLoader.js +6 -2
  84. package/examples/jsm/loaders/PDBLoader.js +5 -3
  85. package/examples/jsm/loaders/PLYLoader.js +39 -15
  86. package/examples/jsm/loaders/PVRLoader.js +2 -2
  87. package/examples/jsm/loaders/SPLATLoader.js +2 -0
  88. package/examples/jsm/loaders/SPZLoader.js +2 -0
  89. package/examples/jsm/loaders/STLLoader.js +3 -1
  90. package/examples/jsm/loaders/SVGLoader.js +27 -49
  91. package/examples/jsm/loaders/TDSLoader.js +4 -0
  92. package/examples/jsm/loaders/TGALoader.js +6 -5
  93. package/examples/jsm/loaders/TTFLoader.js +2 -0
  94. package/examples/jsm/loaders/USDLoader.js +14 -0
  95. package/examples/jsm/loaders/UltraHDRLoader.js +2 -0
  96. package/examples/jsm/loaders/VOXLoader.js +3 -0
  97. package/examples/jsm/loaders/VRMLLoader.js +4 -0
  98. package/examples/jsm/loaders/VTKLoader.js +2 -0
  99. package/examples/jsm/loaders/XYZLoader.js +2 -0
  100. package/examples/jsm/loaders/collada/ColladaComposer.js +15 -8
  101. package/examples/jsm/loaders/materialx/MaterialXDocument.js +610 -138
  102. package/examples/jsm/loaders/materialx/MaterialXInterfaceValidation.js +12 -95
  103. package/examples/jsm/loaders/materialx/MaterialXLog.js +4 -0
  104. package/examples/jsm/loaders/materialx/MaterialXNodeDefs.js +99 -0
  105. package/examples/jsm/loaders/materialx/MaterialXNodeInterfaceRegistry.js +760 -1
  106. package/examples/jsm/loaders/materialx/MaterialXNodeLibrary.js +222 -372
  107. package/examples/jsm/loaders/materialx/MaterialXSurfaceMappings.js +163 -259
  108. package/examples/jsm/loaders/materialx/MaterialXUtils.js +25 -0
  109. package/examples/jsm/loaders/materialx/compile/MaterialXCompileRegistry.js +161 -159
  110. package/examples/jsm/loaders/usd/USDAParser.js +56 -47
  111. package/examples/jsm/loaders/usd/USDComposer.js +25 -30
  112. package/examples/jsm/math/ColorConverter.js +7 -3
  113. package/examples/jsm/math/Lut.js +2 -2
  114. package/examples/jsm/math/OBB.js +3 -3
  115. package/examples/jsm/math/Octree.js +20 -17
  116. package/examples/jsm/objects/GaussianSplat.js +5 -4
  117. package/examples/jsm/objects/Reflector.js +5 -0
  118. package/examples/jsm/objects/SkyMesh.js +14 -7
  119. package/examples/jsm/objects/Water2Mesh.js +2 -2
  120. package/examples/jsm/physics/RapierPhysics.js +2 -2
  121. package/examples/jsm/pipelines/MeshletDrawingPipeline.js +5571 -0
  122. package/examples/jsm/pipelines/VisibilityBufferDrawingPipeline.js +954 -0
  123. package/examples/jsm/postprocessing/BokehPass.js +1 -1
  124. package/examples/jsm/postprocessing/GTAOPass.js +26 -18
  125. package/examples/jsm/renderers/SVGRenderer.js +3 -2
  126. package/examples/jsm/shaders/GTAOShader.js +7 -4
  127. package/examples/jsm/shaders/PoissonDenoiseShader.js +1 -10
  128. package/examples/jsm/tsl/WebGLNodesHandler.js +21 -9
  129. package/examples/jsm/tsl/display/AfterImageNode.js +3 -3
  130. package/examples/jsm/tsl/display/BilateralBlurNode.js +3 -3
  131. package/examples/jsm/tsl/display/BloomNode.js +3 -3
  132. package/examples/jsm/tsl/display/ChromaticAberrationNode.js +8 -19
  133. package/examples/jsm/tsl/display/DenoiseNode.js +5 -5
  134. package/examples/jsm/tsl/display/DepthOfFieldNode.js +3 -3
  135. package/examples/jsm/tsl/display/DotScreenNode.js +3 -3
  136. package/examples/jsm/tsl/display/FSR1Node.js +3 -3
  137. package/examples/jsm/tsl/display/FXAANode.js +3 -10
  138. package/examples/jsm/tsl/display/FilmNode.js +3 -3
  139. package/examples/jsm/tsl/display/GTAONode.js +33 -25
  140. package/examples/jsm/tsl/display/GaussianBlurNode.js +3 -3
  141. package/examples/jsm/tsl/display/GodraysNode.js +5 -19
  142. package/examples/jsm/tsl/display/ImportanceSampledEnvironment.js +8 -4
  143. package/examples/jsm/tsl/display/LensflareNode.js +3 -3
  144. package/examples/jsm/tsl/display/Lut3DNode.js +3 -3
  145. package/examples/jsm/tsl/display/OITPassNode.js +0 -11
  146. package/examples/jsm/tsl/display/OutlineNode.js +107 -5
  147. package/examples/jsm/tsl/display/PixelationPassNode.js +85 -193
  148. package/examples/jsm/tsl/display/RGBShiftNode.js +3 -3
  149. package/examples/jsm/tsl/display/RecurrentDenoiseNode.js +23 -126
  150. package/examples/jsm/tsl/display/SMAANode.js +3 -3
  151. package/examples/jsm/tsl/display/SSAONode.js +6 -20
  152. package/examples/jsm/tsl/display/SSGINode.js +36 -29
  153. package/examples/jsm/tsl/display/SSRNode.js +135 -63
  154. package/examples/jsm/tsl/display/SSSNode.js +6 -20
  155. package/examples/jsm/tsl/display/SharpenNode.js +3 -3
  156. package/examples/jsm/tsl/display/SobelOperatorNode.js +3 -3
  157. package/examples/jsm/tsl/display/TAAUNode.js +10 -42
  158. package/examples/jsm/tsl/display/TRAANode.js +11 -43
  159. package/examples/jsm/tsl/display/TemporalReprojectNode.js +42 -47
  160. package/examples/jsm/tsl/display/TransitionNode.js +3 -3
  161. package/examples/jsm/tsl/display/lensDirt.js +30 -0
  162. package/examples/jsm/tsl/lighting/ClusteredLightsNode.js +482 -121
  163. package/examples/jsm/tsl/lighting/DynamicLightsNode.js +41 -140
  164. package/examples/jsm/tsl/lighting/LightProbeGridNode.js +72 -25
  165. package/examples/jsm/tsl/lighting/data/AmbientLightDataNode.js +6 -0
  166. package/examples/jsm/tsl/lighting/data/DirectionalLightDataNode.js +6 -0
  167. package/examples/jsm/tsl/lighting/data/HemisphereLightDataNode.js +6 -0
  168. package/examples/jsm/tsl/lighting/data/PointLightDataNode.js +6 -0
  169. package/examples/jsm/tsl/lighting/data/SpotLightDataNode.js +6 -0
  170. package/examples/jsm/tsl/shadows/TileShadowNode.js +102 -14
  171. package/examples/jsm/tsl/utils/Raymarching.js +1 -1
  172. package/examples/jsm/tsl/utils/SoftParticles.js +5 -12
  173. package/examples/jsm/tsl/utils/SpecularHelpers.js +47 -70
  174. package/examples/jsm/tsl/utils/TAAUtils.js +6 -17
  175. package/examples/jsm/utils/BufferGeometryUtils.js +110 -88
  176. package/examples/jsm/utils/MeshletGeometryUtils.js +417 -0
  177. package/examples/jsm/utils/SceneOptimizer.js +2 -1
  178. package/examples/jsm/utils/SceneUtils.js +1 -1
  179. package/examples/jsm/utils/unwrapUVs.js +865 -0
  180. package/examples/jsm/webxr/XREstimatedLight.js +11 -4
  181. package/package.json +3 -3
  182. package/src/Three.TSL.js +2 -683
  183. package/src/Three.WebGPU.Nodes.js +2 -1
  184. package/src/Three.WebGPU.js +2 -1
  185. package/src/animation/AnimationAction.js +1 -1
  186. package/src/animation/AnimationUtils.js +1 -3
  187. package/src/animation/KeyframeTrack.js +19 -0
  188. package/src/cameras/ArrayCamera.js +12 -0
  189. package/src/cameras/CubeCamera.js +3 -3
  190. package/src/constants.js +1 -9
  191. package/src/core/BufferAttribute.js +57 -21
  192. package/src/core/BufferGeometry.js +5 -13
  193. package/src/core/Clock.js +1 -1
  194. package/src/core/InterleavedBuffer.js +28 -18
  195. package/src/core/InterleavedBufferAttribute.js +54 -20
  196. package/src/core/Object3D.js +19 -9
  197. package/src/core/Raycaster.js +2 -0
  198. package/src/core/RenderTarget.js +11 -5
  199. package/src/core/UniformsGroup.js +7 -3
  200. package/src/extras/PMREMGenerator.js +392 -685
  201. package/src/extras/core/Curve.js +4 -0
  202. package/src/extras/core/CurvePath.js +13 -0
  203. package/src/extras/core/ShapePath.js +1 -1
  204. package/src/geometries/EdgesGeometry.js +12 -10
  205. package/src/geometries/LatheGeometry.js +2 -0
  206. package/src/helpers/PolarGridHelper.js +1 -1
  207. package/src/lights/Light.js +11 -0
  208. package/src/lights/LightProbe.js +2 -0
  209. package/src/lights/LightShadow.js +2 -0
  210. package/src/loaders/AnimationLoader.js +2 -0
  211. package/src/loaders/AudioLoader.js +2 -0
  212. package/src/loaders/BufferGeometryLoader.js +2 -0
  213. package/src/loaders/CompressedTextureLoader.js +2 -0
  214. package/src/loaders/CubeTextureLoader.js +2 -0
  215. package/src/loaders/DataTextureLoader.js +2 -0
  216. package/src/loaders/FileLoader.js +2 -0
  217. package/src/loaders/ImageBitmapLoader.js +3 -1
  218. package/src/loaders/ImageLoader.js +1 -0
  219. package/src/loaders/Loader.js +47 -0
  220. package/src/loaders/MaterialLoader.js +2 -0
  221. package/src/loaders/ObjectLoader.js +27 -8
  222. package/src/loaders/TextureLoader.js +5 -3
  223. package/src/loaders/nodes/NodeLoader.js +2 -0
  224. package/src/materials/Material.js +21 -2
  225. package/src/materials/MeshDepthMaterial.js +1 -1
  226. package/src/materials/MeshDistanceMaterial.js +1 -1
  227. package/src/materials/MeshLambertMaterial.js +1 -1
  228. package/src/materials/MeshMatcapMaterial.js +1 -1
  229. package/src/materials/MeshNormalMaterial.js +1 -1
  230. package/src/materials/MeshPhongMaterial.js +1 -1
  231. package/src/materials/MeshPhysicalMaterial.js +90 -11
  232. package/src/materials/MeshStandardMaterial.js +1 -1
  233. package/src/materials/MeshToonMaterial.js +1 -1
  234. package/src/materials/nodes/Line2NodeMaterial.js +32 -10
  235. package/src/materials/nodes/MeshLambertNodeMaterial.js +13 -0
  236. package/src/materials/nodes/MeshPhongNodeMaterial.js +13 -0
  237. package/src/materials/nodes/MeshPhysicalNodeMaterial.js +40 -5
  238. package/src/materials/nodes/MeshToonNodeMaterial.js +13 -0
  239. package/src/materials/nodes/NodeMaterial.js +36 -16
  240. package/src/materials/nodes/NodeMaterialInstance.js +193 -0
  241. package/src/materials/nodes/NodeMaterials.js +1 -0
  242. package/src/materials/nodes/PointsNodeMaterial.js +1 -1
  243. package/src/materials/nodes/SpriteNodeMaterial.js +3 -3
  244. package/src/materials/nodes/manager/NodeMaterialObserver.js +191 -22
  245. package/src/math/Box3.js +2 -2
  246. package/src/math/Color.js +8 -8
  247. package/src/math/ColorManagement.js +2 -21
  248. package/src/math/FrustumArray.js +12 -0
  249. package/src/math/Interpolant.js +1 -1
  250. package/src/math/Line3.js +2 -4
  251. package/src/math/MathUtils.js +33 -46
  252. package/src/math/Matrix2.js +1 -1
  253. package/src/math/Matrix3.js +1 -1
  254. package/src/math/Matrix4.js +1 -1
  255. package/src/math/Triangle.js +2 -1
  256. package/src/math/Vector2.js +1 -1
  257. package/src/math/Vector3.js +1 -1
  258. package/src/math/Vector4.js +1 -1
  259. package/src/nodes/Nodes.js +1 -0
  260. package/src/nodes/TSL.js +2 -0
  261. package/src/nodes/accessors/Arrays.js +1 -1
  262. package/src/nodes/accessors/Batch.js +29 -23
  263. package/src/nodes/accessors/BufferAttributeNode.js +21 -1
  264. package/src/nodes/accessors/BuiltinNode.js +6 -0
  265. package/src/nodes/accessors/Camera.js +100 -93
  266. package/src/nodes/accessors/ClippingNode.js +17 -6
  267. package/src/nodes/accessors/CubeTextureNode.js +12 -24
  268. package/src/nodes/accessors/Instance.js +198 -160
  269. package/src/nodes/accessors/Lights.js +19 -6
  270. package/src/nodes/accessors/MaterialNode.js +33 -4
  271. package/src/nodes/accessors/Morph.js +81 -22
  272. package/src/nodes/accessors/Normal.js +0 -42
  273. package/src/nodes/accessors/Object3DNode.js +6 -0
  274. package/src/nodes/accessors/PointUVNode.js +6 -0
  275. package/src/nodes/accessors/ReferenceAttributeNode.js +279 -0
  276. package/src/nodes/accessors/ReferenceBaseNode.js +6 -0
  277. package/src/nodes/accessors/ReferenceNode.js +6 -0
  278. package/src/nodes/accessors/Skinning.js +57 -52
  279. package/src/nodes/accessors/StorageBufferNode.js +3 -12
  280. package/src/nodes/accessors/TextureBicubic.js +30 -27
  281. package/src/nodes/accessors/TextureNode.js +164 -78
  282. package/src/nodes/accessors/TextureSizeNode.js +6 -0
  283. package/src/nodes/accessors/UniformArrayNode.js +8 -15
  284. package/src/nodes/accessors/VelocityNode.js +13 -8
  285. package/src/nodes/code/CodeNode.js +6 -0
  286. package/src/nodes/code/ExpressionNode.js +6 -0
  287. package/src/nodes/code/FunctionCallNode.js +3 -3
  288. package/src/nodes/code/FunctionNode.js +15 -13
  289. package/src/nodes/core/ArrayNode.js +3 -3
  290. package/src/nodes/core/AssignNode.js +10 -9
  291. package/src/nodes/core/AttributeNode.js +39 -0
  292. package/src/nodes/core/BypassNode.js +6 -0
  293. package/src/nodes/core/ConstNode.js +31 -1
  294. package/src/nodes/core/ContextNode.js +11 -6
  295. package/src/nodes/core/IndexNode.js +6 -0
  296. package/src/nodes/core/InputNode.js +6 -0
  297. package/src/nodes/core/InspectorNode.js +17 -31
  298. package/src/nodes/core/IsolateNode.js +8 -0
  299. package/src/nodes/core/Node.js +367 -67
  300. package/src/nodes/core/NodeBuilder.js +664 -222
  301. package/src/nodes/core/NodeUtils.js +25 -0
  302. package/src/nodes/core/NodeVar.js +10 -1
  303. package/src/nodes/core/OutputStructNode.js +6 -0
  304. package/src/nodes/core/OverrideContextNode.js +38 -37
  305. package/src/nodes/core/PropertyNode.js +14 -0
  306. package/src/nodes/core/StackNode.js +33 -21
  307. package/src/nodes/core/StructNode.js +6 -0
  308. package/src/nodes/core/StructTypeNode.js +6 -0
  309. package/src/nodes/core/SubBuildNode.js +8 -0
  310. package/src/nodes/core/TempNode.js +10 -35
  311. package/src/nodes/core/UniformGroupNode.js +6 -0
  312. package/src/nodes/core/VarNode.js +43 -135
  313. package/src/nodes/core/VaryingNode.js +33 -2
  314. package/src/nodes/display/BlendModes.js +5 -40
  315. package/src/nodes/display/BumpMapNode.js +17 -7
  316. package/src/nodes/display/ColorAdjustment.js +22 -10
  317. package/src/nodes/display/ColorSpaceFunctions.js +2 -14
  318. package/src/nodes/display/ColorSpaceNode.js +3 -3
  319. package/src/nodes/display/FrontFacingNode.js +6 -0
  320. package/src/nodes/display/NormalMapNode.js +3 -3
  321. package/src/nodes/display/PassNode.js +75 -16
  322. package/src/nodes/display/RenderOutputNode.js +22 -5
  323. package/src/nodes/display/ScreenNode.js +6 -0
  324. package/src/nodes/display/ToneMappingFunctions.js +9 -51
  325. package/src/nodes/display/ToneMappingNode.js +3 -3
  326. package/src/nodes/display/ToonOutlinePassNode.js +66 -2
  327. package/src/nodes/display/ViewportDepthNode.js +34 -4
  328. package/src/nodes/functions/BSDF/BRDF_EON.js +65 -0
  329. package/src/nodes/functions/BSDF/BRDF_GGX.js +5 -3
  330. package/src/nodes/functions/BSDF/BRDF_Sheen.js +2 -16
  331. package/src/nodes/functions/BSDF/D_GGX.js +1 -8
  332. package/src/nodes/functions/BSDF/D_GGX_Anisotropic.js +7 -10
  333. package/src/nodes/functions/BSDF/LTC.js +20 -47
  334. package/src/nodes/functions/BSDF/Schlick_to_F0.js +1 -9
  335. package/src/nodes/functions/BSDF/V_GGX_SmithCorrelated.js +1 -9
  336. package/src/nodes/functions/BSDF/V_GGX_SmithCorrelated_Anisotropic.js +10 -13
  337. package/src/nodes/functions/PhysicalLightingModel.js +84 -51
  338. package/src/nodes/functions/VolumetricLightingModel.js +1 -1
  339. package/src/nodes/functions/material/getAlphaHashThreshold.js +3 -9
  340. package/src/nodes/functions/material/getParallaxCorrectNormal.js +10 -11
  341. package/src/nodes/functions/material/getRoughness.js +3 -1
  342. package/src/nodes/geometry/RangeNode.js +52 -69
  343. package/src/nodes/gpgpu/AtomicFunctionNode.js +11 -6
  344. package/src/nodes/gpgpu/BarrierNode.js +6 -0
  345. package/src/nodes/gpgpu/ComputeBuiltinNode.js +6 -0
  346. package/src/nodes/gpgpu/ComputeNode.js +6 -0
  347. package/src/nodes/gpgpu/SubgroupFunctionNode.js +38 -29
  348. package/src/nodes/gpgpu/WorkgroupInfoNode.js +6 -0
  349. package/src/nodes/lighting/AnalyticLightNode.js +7 -14
  350. package/src/nodes/lighting/BasicEnvironmentNode.js +5 -1
  351. package/src/nodes/lighting/EnvironmentNode.js +58 -8
  352. package/src/nodes/lighting/IESSpotLightNode.js +19 -4
  353. package/src/nodes/lighting/LightProbeNode.js +2 -1
  354. package/src/nodes/lighting/LightUtils.js +2 -2
  355. package/src/nodes/lighting/LightingNode.js +6 -0
  356. package/src/nodes/lighting/LightsNode.js +26 -32
  357. package/src/nodes/lighting/PointShadowNode.js +92 -48
  358. package/src/nodes/lighting/ProjectorLightNode.js +1 -1
  359. package/src/nodes/lighting/RectAreaLightNode.js +13 -14
  360. package/src/nodes/lighting/ShadowBaseNode.js +9 -17
  361. package/src/nodes/lighting/ShadowFilterNode.js +26 -3
  362. package/src/nodes/lighting/ShadowNode.js +13 -11
  363. package/src/nodes/materialx/MaterialXColor.js +2 -14
  364. package/src/nodes/materialx/MaterialXColorTransform.js +1 -7
  365. package/src/nodes/materialx/MaterialXNodes.js +8 -11
  366. package/src/nodes/materialx/MaterialXNoise.js +195 -454
  367. package/src/nodes/math/BitcastNode.js +5 -5
  368. package/src/nodes/math/BitcountNode.js +18 -46
  369. package/src/nodes/math/ConditionalNode.js +92 -22
  370. package/src/nodes/math/Hash.js +1 -1
  371. package/src/nodes/math/MathNode.js +86 -64
  372. package/src/nodes/math/MathUtils.js +2 -2
  373. package/src/nodes/math/OperatorNode.js +42 -59
  374. package/src/nodes/math/PackFloatNode.js +9 -9
  375. package/src/nodes/math/Packed4x8IntegerNode.js +20 -52
  376. package/src/nodes/math/TriNoise3D.js +3 -23
  377. package/src/nodes/math/UnpackFloatNode.js +9 -9
  378. package/src/nodes/pmrem/PMREMNode.js +38 -75
  379. package/src/nodes/pmrem/PMREMUtils.js +108 -272
  380. package/src/nodes/procedural/Checker.js +1 -1
  381. package/src/nodes/tsl/TSLCore.js +199 -74
  382. package/src/nodes/utils/ArrayElementNode.js +19 -1
  383. package/src/nodes/utils/CubeMapNode.js +3 -3
  384. package/src/nodes/utils/DebugNode.js +2 -2
  385. package/src/nodes/utils/EventNode.js +6 -0
  386. package/src/nodes/utils/FlipNode.js +3 -3
  387. package/src/nodes/utils/FunctionOverloadingNode.js +7 -1
  388. package/src/nodes/utils/JoinNode.js +3 -3
  389. package/src/nodes/utils/LoopNode.js +14 -9
  390. package/src/nodes/utils/MemberNode.js +18 -0
  391. package/src/nodes/utils/PostProcessingUtils.js +20 -25
  392. package/src/nodes/utils/RTTNode.js +2 -0
  393. package/src/nodes/utils/ReflectorNode.js +24 -0
  394. package/src/nodes/utils/RotateNode.js +3 -3
  395. package/src/nodes/utils/SampleNode.js +6 -0
  396. package/src/nodes/utils/SetNode.js +3 -3
  397. package/src/nodes/utils/SplitNode.js +6 -0
  398. package/src/nodes/utils/UVUtils.js +2 -2
  399. package/src/objects/BatchedMesh.js +146 -15
  400. package/src/objects/InstancedMesh.js +12 -4
  401. package/src/objects/Line.js +20 -0
  402. package/src/objects/Mesh.js +8 -0
  403. package/src/objects/Points.js +20 -0
  404. package/src/objects/Skeleton.js +26 -0
  405. package/src/objects/SkinnedMesh.js +3 -3
  406. package/src/objects/Sprite.js +10 -0
  407. package/src/renderers/WebGLRenderer.js +104 -70
  408. package/src/renderers/common/Animation.js +5 -1
  409. package/src/renderers/common/Attributes.js +67 -57
  410. package/src/renderers/common/Backend.js +78 -3
  411. package/src/renderers/common/BindGroup.js +11 -0
  412. package/src/renderers/common/Binding.js +0 -11
  413. package/src/renderers/common/Bindings.js +116 -10
  414. package/src/renderers/common/Buffer.js +1 -1
  415. package/src/renderers/common/ClippingContext.js +12 -1
  416. package/src/renderers/common/ComputePipeline.js +17 -1
  417. package/src/renderers/common/DirectRenderPipeline.js +7 -3
  418. package/src/renderers/common/Geometries.js +170 -132
  419. package/src/renderers/common/Info.js +1 -1
  420. package/src/renderers/common/InspectorBase.js +5 -5
  421. package/src/renderers/common/Lighting.js +59 -0
  422. package/src/renderers/common/Pipelines.js +26 -12
  423. package/src/renderers/common/ProgrammableStage.js +1 -17
  424. package/src/renderers/common/RenderContext.js +21 -0
  425. package/src/renderers/common/RenderContexts.js +13 -4
  426. package/src/renderers/common/RenderObject.js +111 -35
  427. package/src/renderers/common/RenderObjects.js +37 -19
  428. package/src/renderers/common/Renderer.js +537 -295
  429. package/src/renderers/common/RendererUtils.js +15 -0
  430. package/src/renderers/common/StandardDrawingPipeline.js +343 -0
  431. package/src/renderers/common/Storage3DTexture.js +11 -0
  432. package/src/renderers/common/StorageArrayTexture.js +10 -0
  433. package/src/renderers/common/StorageTexture.js +0 -9
  434. package/src/renderers/common/Textures.js +144 -37
  435. package/src/renderers/common/UniformsGroup.js +19 -0
  436. package/src/renderers/common/XRManager.js +10 -91
  437. package/src/renderers/common/extras/PMREMGenerator.js +298 -576
  438. package/src/renderers/common/nodes/NodeBuilderState.js +7 -5
  439. package/src/renderers/common/nodes/NodeLibrary.js +11 -35
  440. package/src/renderers/common/nodes/NodeManager.js +80 -31
  441. package/src/renderers/common/nodes/NodeSampledTexture.js +14 -0
  442. package/src/renderers/common/nodes/NodeSampler.js +14 -0
  443. package/src/renderers/common/nodes/NodeStorageBuffer.js +1 -1
  444. package/src/renderers/common/nodes/NodeUniformBuffer.js +1 -14
  445. package/src/renderers/shaders/ShaderChunk/envmap_common_pars_fragment.glsl.js +13 -4
  446. package/src/renderers/shaders/ShaderChunk/envmap_physical_pars_fragment.glsl.js +8 -8
  447. package/src/renderers/shaders/ShaderChunk/lightprobes_pars_fragment.glsl.js +23 -11
  448. package/src/renderers/shaders/ShaderChunk/lights_fragment_begin.glsl.js +21 -2
  449. package/src/renderers/shaders/ShaderChunk/lights_fragment_maps.glsl.js +1 -1
  450. package/src/renderers/shaders/ShaderChunk/lights_physical_fragment.glsl.js +18 -2
  451. package/src/renderers/shaders/ShaderChunk/lights_physical_pars_fragment.glsl.js +104 -7
  452. package/src/renderers/shaders/ShaderChunk/morphcolor_vertex.glsl.js +11 -2
  453. package/src/renderers/shaders/ShaderChunk/shadowmap_pars_fragment.glsl.js +36 -20
  454. package/src/renderers/shaders/ShaderChunk/uv_pars_fragment.glsl.js +5 -0
  455. package/src/renderers/shaders/ShaderChunk/uv_pars_vertex.glsl.js +6 -0
  456. package/src/renderers/shaders/ShaderChunk/uv_vertex.glsl.js +5 -0
  457. package/src/renderers/shaders/ShaderChunk.js +0 -2
  458. package/src/renderers/shaders/ShaderLib/backgroundCube.glsl.js +4 -18
  459. package/src/renderers/shaders/ShaderLib/meshlambert.glsl.js +0 -1
  460. package/src/renderers/shaders/ShaderLib/meshphong.glsl.js +0 -1
  461. package/src/renderers/shaders/ShaderLib/meshphysical.glsl.js +8 -1
  462. package/src/renderers/shaders/ShaderLib.js +3 -0
  463. package/src/renderers/shaders/UniformsLib.js +4 -5
  464. package/src/renderers/webgl/WebGLBackground.js +3 -3
  465. package/src/renderers/webgl/WebGLBindingStates.js +4 -2
  466. package/src/renderers/webgl/WebGLCapabilities.js +7 -1
  467. package/src/renderers/webgl/WebGLEnvironments.js +2 -2
  468. package/src/renderers/webgl/WebGLGeometries.js +42 -14
  469. package/src/renderers/webgl/WebGLMaterials.js +15 -2
  470. package/src/renderers/webgl/WebGLOutput.js +37 -1
  471. package/src/renderers/webgl/WebGLProgram.js +13 -54
  472. package/src/renderers/webgl/WebGLPrograms.js +22 -8
  473. package/src/renderers/webgl/WebGLRenderStates.js +11 -8
  474. package/src/renderers/webgl/WebGLShadowMap.js +6 -4
  475. package/src/renderers/webgl/WebGLState.js +10 -6
  476. package/src/renderers/webgl/WebGLTextures.js +129 -77
  477. package/src/renderers/webgl/WebGLUniforms.js +44 -6
  478. package/src/renderers/webgl/WebGLUniformsGroups.js +75 -69
  479. package/src/renderers/webgl-fallback/WebGLBackend.js +206 -278
  480. package/src/renderers/webgl-fallback/nodes/GLSLNodeBuilder.js +154 -20
  481. package/src/renderers/webgl-fallback/utils/WebGLAttributeUtils.js +45 -42
  482. package/src/renderers/webgl-fallback/utils/WebGLState.js +29 -4
  483. package/src/renderers/webgl-fallback/utils/WebGLTextureUtils.js +129 -49
  484. package/src/renderers/webgl-fallback/utils/WebGLVertexArrayUtils.js +346 -0
  485. package/src/renderers/webgpu/WebGPUBackend.js +140 -82
  486. package/src/renderers/webgpu/WebGPURenderer.js +1 -1
  487. package/src/renderers/webgpu/nodes/BasicNodeLibrary.js +10 -10
  488. package/src/renderers/webgpu/nodes/StandardNodeLibrary.js +10 -10
  489. package/src/renderers/webgpu/nodes/WGSLNodeBuilder.js +135 -60
  490. package/src/renderers/webgpu/utils/WebGPUAttributeUtils.js +128 -55
  491. package/src/renderers/webgpu/utils/WebGPUBindingUtils.js +1 -1
  492. package/src/renderers/webgpu/utils/WebGPUPipelineUtils.js +15 -12
  493. package/src/renderers/webgpu/utils/WebGPUTextureUtils.js +55 -19
  494. package/src/renderers/webgpu/utils/WebGPUUtils.js +20 -3
  495. package/src/renderers/webxr/WebXRController.js +3 -3
  496. package/src/renderers/webxr/WebXRManager.js +5 -90
  497. package/src/scenes/Scene.js +4 -4
  498. package/src/textures/CompressedTexture.js +2 -2
  499. package/src/textures/DepthTexture.js +2 -2
  500. package/src/textures/FramebufferTexture.js +11 -0
  501. package/src/textures/Texture.js +29 -1
  502. package/src/textures/TextureSource.js +1 -1
  503. package/src/upe.js +1 -1
  504. package/src/utils.js +4 -4
  505. package/examples/jsm/libs/surfaceNet.js +0 -201
  506. package/src/renderers/shaders/ShaderChunk/cube_uv_reflection_fragment.glsl.js +0 -186
@@ -1,3 +1,9 @@
1
+ import {
2
+ RepeatWrapping,
3
+ ClampToEdgeWrapping,
4
+ MirroredRepeatWrapping,
5
+ } from 'three/webgpu';
6
+
1
7
  import {
2
8
  bool,
3
9
  element,
@@ -6,6 +12,12 @@ import {
6
12
  } from 'three/tsl';
7
13
 
8
14
  const BOOLEAN_OPERATOR_OPS = new Set( [ '&&', '||', '^^', '!', '==', '!=', '<', '>', '<=', '>=' ] );
15
+ const TEXTURE_ADDRESS_MODE_WRAPPING = {
16
+ constant: ClampToEdgeWrapping,
17
+ clamp: ClampToEdgeWrapping,
18
+ periodic: RepeatWrapping,
19
+ mirror: MirroredRepeatWrapping,
20
+ };
9
21
 
10
22
  function normalizeSpaceName( value, fallback = 'world' ) {
11
23
 
@@ -48,10 +60,23 @@ function toVec3Channels( input ) {
48
60
 
49
61
  }
50
62
 
63
+ // Normalizes a raw `*addressmode` attribute value, defaulting to `'periodic'`
64
+ // when unset and returning `null` when the value isn't a recognized mode.
65
+ function resolveTextureAddressMode( value ) {
66
+
67
+ if ( typeof value !== 'string' || value === '' ) return 'periodic';
68
+
69
+ const mode = value.trim().toLowerCase();
70
+ return mode in TEXTURE_ADDRESS_MODE_WRAPPING ? mode : null;
71
+
72
+ }
73
+
51
74
  export {
52
75
  getComponentCountForType,
53
76
  isBooleanNode,
54
77
  normalizeSpaceName,
78
+ resolveTextureAddressMode,
79
+ TEXTURE_ADDRESS_MODE_WRAPPING,
55
80
  toBooleanNode,
56
81
  toVec3Channels,
57
82
  };
@@ -7,7 +7,6 @@ import {
7
7
  mul,
8
8
  normalMap,
9
9
  texture,
10
- uv,
11
10
  vec2,
12
11
  vec3,
13
12
  vec4,
@@ -54,32 +53,13 @@ const register = ( registry, categories, handler ) => {
54
53
 
55
54
  };
56
55
 
57
- const UV_FALLBACK_CATEGORIES = new Set( [ 'checkerboard', 'noise2d', 'fractal2d', 'cellnoise2d', 'worleynoise2d', 'unifiednoise2d', 'heighttonormal' ] );
58
56
  const SCALAR_TYPES = new Set( [ 'boolean', 'integer', 'float' ] );
59
57
  const THREE_COMPONENT_TYPES = new Set( [ 'vector2', 'vector3', 'vector4', 'color3', 'color4' ] );
60
- const TEXTURE_ADDRESS_MODES = new Set( [ 'constant', 'clamp', 'periodic', 'mirror' ] );
61
58
  const SWITCH_MIN_INDEX = 1;
62
59
  const SWITCH_MAX_INDEX = 10;
63
60
 
64
- const getDefaultUvNode = ( compileContext ) => compileContext.mxToBottomLeftUvSpace( uv( 0 ) );
65
-
66
61
  const toBooleanMaskNode = ( node ) => toBooleanNode( node ).select( float( 1 ), float( 0 ) );
67
62
 
68
- const getTextureAddressMode = ( nodeX, inputName ) => {
69
-
70
- const value = nodeX.getInputValueByName( inputName );
71
- if ( value === null || value === undefined || value === '' ) return 'periodic';
72
-
73
- const mode = value.trim().toLowerCase();
74
- return TEXTURE_ADDRESS_MODES.has( mode ) ? mode : 'periodic';
75
-
76
- };
77
-
78
- const getTextureAddressModes = ( nodeX ) => ( {
79
- u: getTextureAddressMode( nodeX, 'uaddressmode' ),
80
- v: getTextureAddressMode( nodeX, 'vaddressmode' ),
81
- } );
82
-
83
63
  const getZeroNodeForType = ( type ) => {
84
64
 
85
65
  if ( type === 'vector2' ) return vec2( 0, 0 );
@@ -98,13 +78,13 @@ const toTextureDefaultNode = ( node, type ) => {
98
78
 
99
79
  };
100
80
 
101
- const getTextureInputs = ( nodeX, compileContext ) => {
81
+ const getTextureInputs = ( nodeX ) => {
102
82
 
103
83
  const file = nodeX.getChildByName( 'file' );
104
- const uvNode = nodeX.getNodeByName( 'texcoord' ) || getDefaultUvNode( compileContext );
84
+ const uvNode = nodeX.getNodeByName( 'texcoord' );
105
85
  const textureFile = file ? file.getTexture() : null;
106
- const defaultNode = nodeX.getNodeByName( 'default' ) || getZeroNodeForType( nodeX.type );
107
- const addressModes = getTextureAddressModes( nodeX );
86
+ const defaultNode = nodeX.getNodeByName( 'default' );
87
+ const addressModes = nodeX.getTextureAddressModes();
108
88
  return { file, uvNode, textureFile, defaultNode, addressModes };
109
89
 
110
90
  };
@@ -153,7 +133,7 @@ const compileConvertNode = ( nodeX ) => {
153
133
 
154
134
  const input = nodeX.getNodeByName( 'in' );
155
135
  const inputElement = nodeX.getChildByName( 'in' );
156
- const inputType = inputElement ? inputElement.type : null;
136
+ const inputType = inputElement && inputElement.type ? inputElement.type : nodeX.getNodeDefInputType( 'in' );
157
137
  const nodeClass = nodeX.getClassFromType( nodeX.type ) || float;
158
138
 
159
139
  if ( nodeX.type === 'boolean' ) {
@@ -198,11 +178,11 @@ const compileConstantNode = ( nodeX ) => nodeX.getNodeByName( 'value' );
198
178
  const compileArtisticIorNode = ( nodeX, out ) => {
199
179
 
200
180
  const reflectivity = clamp(
201
- nodeX.getNodeByName( 'reflectivity' ) || vec3( 0.944, 0.776, 0.373 ),
181
+ nodeX.getNodeByName( 'reflectivity' ),
202
182
  vec3( 0, 0, 0 ),
203
183
  vec3( 0.99, 0.99, 0.99 ),
204
184
  );
205
- const edgeColor = nodeX.getNodeByName( 'edge_color' ) || vec3( 0.998, 0.981, 0.751 );
185
+ const edgeColor = nodeX.getNodeByName( 'edge_color' );
206
186
  const one = vec3( 1, 1, 1 );
207
187
  const nMin = div( sub( one, reflectivity ), add( one, reflectivity ) );
208
188
  const nMax = div( add( one, sqrt( reflectivity ) ), sub( one, sqrt( reflectivity ) ) );
@@ -227,11 +207,10 @@ const compileArtisticIorNode = ( nodeX, out ) => {
227
207
  const compileBooleanConditionalNode = ( nodeX ) => {
228
208
 
229
209
  if ( nodeX.type !== 'boolean' ) return null;
210
+ if ( nodeX.element !== 'ifgreater' && nodeX.element !== 'ifgreatereq' && nodeX.element !== 'ifequal' ) return null;
230
211
 
231
- const value1Default = nodeX.element === 'ifequal' ? float( 0 ) : float( 1 );
232
- const value2Default = float( 0 );
233
- const value1 = nodeX.getNodeByName( 'value1' ) || value1Default;
234
- const value2 = nodeX.getNodeByName( 'value2' ) || value2Default;
212
+ const value1 = nodeX.getNodeByName( 'value1' );
213
+ const value2 = nodeX.getNodeByName( 'value2' );
235
214
 
236
215
  if ( nodeX.element === 'ifgreater' ) return value1.greaterThan( value2 );
237
216
  if ( nodeX.element === 'ifgreatereq' ) return value1.greaterThanEqual( value2 );
@@ -243,16 +222,16 @@ const compileBooleanConditionalNode = ( nodeX ) => {
243
222
 
244
223
  const compileClampNode = ( nodeX ) => {
245
224
 
246
- const inNode = nodeX.getNodeByName( 'in' ) || float( 0 );
247
- const low = nodeX.getNodeByName( 'low' ) || float( 0 );
248
- const high = nodeX.getNodeByName( 'high' ) || float( 1 );
225
+ const inNode = nodeX.getNodeByName( 'in' );
226
+ const low = nodeX.getNodeByName( 'low' );
227
+ const high = nodeX.getNodeByName( 'high' );
249
228
  return min( max( inNode, low ), high );
250
229
 
251
230
  };
252
231
 
253
232
  const compileNormalizeNode = ( nodeX ) => {
254
233
 
255
- const inNode = nodeX.getNodeByName( 'in' ) || getZeroNodeForType( nodeX.type );
234
+ const inNode = nodeX.getNodeByName( 'in' );
256
235
  const zeroNode = getZeroNodeForType( nodeX.type );
257
236
  const lengthSquared = dot( inNode, inNode );
258
237
  const safeLengthSquared = max( lengthSquared, float( 1e-8 ) );
@@ -263,11 +242,11 @@ const compileNormalizeNode = ( nodeX ) => {
263
242
 
264
243
  const compileRemapNode = ( nodeX ) => {
265
244
 
266
- const inNode = nodeX.getNodeByName( 'in' ) || float( 0 );
267
- const inLow = nodeX.getNodeByName( 'inlow' ) || float( 0 );
268
- const inHigh = nodeX.getNodeByName( 'inhigh' ) || float( 1 );
269
- const outLow = nodeX.getNodeByName( 'outlow' ) || float( 0 );
270
- const outHigh = nodeX.getNodeByName( 'outhigh' ) || float( 1 );
245
+ const inNode = nodeX.getNodeByName( 'in' );
246
+ const inLow = nodeX.getNodeByName( 'inlow' );
247
+ const inHigh = nodeX.getNodeByName( 'inhigh' );
248
+ const outLow = nodeX.getNodeByName( 'outlow' );
249
+ const outHigh = nodeX.getNodeByName( 'outhigh' );
271
250
  const denominator = sub( inHigh, inLow );
272
251
  const isDegenerate = abs( denominator ).lessThan( float( 1e-8 ) );
273
252
  const safeDenominator = isDegenerate.select( float( 1 ), denominator );
@@ -281,13 +260,13 @@ const compileRemapNode = ( nodeX ) => {
281
260
 
282
261
  const compileRangeNode = ( nodeX ) => {
283
262
 
284
- const inNode = nodeX.getNodeByName( 'in' ) || float( 0 );
285
- const inLow = nodeX.getNodeByName( 'inlow' ) || float( 0 );
286
- const inHigh = nodeX.getNodeByName( 'inhigh' ) || float( 1 );
287
- const outLow = nodeX.getNodeByName( 'outlow' ) || float( 0 );
288
- const outHigh = nodeX.getNodeByName( 'outhigh' ) || float( 1 );
289
- const gamma = nodeX.getNodeByName( 'gamma' ) || float( 1 );
290
- const doClamp = nodeX.getNodeByName( 'doclamp' ) || int( 0 );
263
+ const inNode = nodeX.getNodeByName( 'in' );
264
+ const inLow = nodeX.getNodeByName( 'inlow' );
265
+ const inHigh = nodeX.getNodeByName( 'inhigh' );
266
+ const outLow = nodeX.getNodeByName( 'outlow' );
267
+ const outHigh = nodeX.getNodeByName( 'outhigh' );
268
+ const gamma = nodeX.getNodeByName( 'gamma' );
269
+ const doClamp = nodeX.getNodeByName( 'doclamp' );
291
270
 
292
271
  const denominator = sub( inHigh, inLow );
293
272
  const isDegenerate = abs( denominator ).lessThan( float( 1e-8 ) );
@@ -305,13 +284,12 @@ const compileRangeNode = ( nodeX ) => {
305
284
 
306
285
  };
307
286
 
308
- const getSwitchBranchNode = ( nodeX, index ) => nodeX.getNodeByName( `in${index}` ) || getZeroNodeForType( nodeX.type );
287
+ const getSwitchBranchNode = ( nodeX, index ) => nodeX.getNodeByName( `in${index}` );
309
288
 
310
289
  const compileSwitchNode = ( nodeX ) => {
311
290
 
312
291
  const fallbackNode = getSwitchBranchNode( nodeX, SWITCH_MIN_INDEX );
313
- const whichInput = nodeX.getNodeByName( 'which' );
314
- const switchIndex = add( floor( float( whichInput === undefined || whichInput === null ? 0 : whichInput ) ), 1 );
292
+ const switchIndex = add( floor( float( nodeX.getNodeByName( 'which' ) ) ), 1 );
315
293
  const whichNode = clamp(
316
294
  float( switchIndex ),
317
295
  float( SWITCH_MIN_INDEX ),
@@ -332,8 +310,7 @@ const compileSwitchNode = ( nodeX ) => {
332
310
 
333
311
  const compileSpaceInputNode = ( nodeX, objectNode, worldNode ) => {
334
312
 
335
- const rawSpace = nodeX.getInputValueByName( 'space' ) ?? nodeX.getAttribute( 'space' );
336
- const space = normalizeSpaceName( rawSpace, 'object' );
313
+ const space = normalizeSpaceName( nodeX.getNodeByName( 'space' ), 'object' );
337
314
  return space === 'world' ? worldNode : objectNode;
338
315
 
339
316
  };
@@ -344,7 +321,7 @@ const compileTexcoordNode = ( nodeX, compileContext ) => {
344
321
 
345
322
  const indexNode = nodeX.getChildByName( 'index' );
346
323
  const index = indexNode ? parseInt( indexNode.value, 10 ) : 0;
347
- return compileContext.mxToBottomLeftUvSpace( uv( index ) );
324
+ return compileContext.getTexcoordNode( index );
348
325
 
349
326
  };
350
327
 
@@ -358,7 +335,7 @@ const compileGeomColorNode = ( nodeX ) => {
358
335
 
359
336
  const compileImageLikeNode = ( nodeX, compileContext ) => {
360
337
 
361
- const { file, uvNode, textureFile, defaultNode, addressModes } = getTextureInputs( nodeX, compileContext );
338
+ const { file, uvNode, textureFile, defaultNode, addressModes } = getTextureInputs( nodeX );
362
339
  const textureDefault = toTextureDefaultNode( defaultNode, nodeX.type );
363
340
  const node = sampleTexture( textureFile, uvNode, compileContext, textureDefault, addressModes, textureDefault );
364
341
  return applyTextureColorSpace( node, file );
@@ -367,7 +344,7 @@ const compileImageLikeNode = ( nodeX, compileContext ) => {
367
344
 
368
345
  const compileTiledImageNode = ( nodeX, compileContext ) => {
369
346
 
370
- const { file, uvNode, textureFile, defaultNode, addressModes } = getTextureInputs( nodeX, compileContext );
347
+ const { file, uvNode, textureFile, defaultNode, addressModes } = getTextureInputs( nodeX );
371
348
  const textureDefault = toTextureDefaultNode( defaultNode, nodeX.type );
372
349
  if ( ! textureFile ) {
373
350
 
@@ -383,10 +360,52 @@ const compileTiledImageNode = ( nodeX, compileContext ) => {
383
360
 
384
361
  };
385
362
 
363
+ const compileTriplanarProjectionNode = ( nodeX, compileContext ) => {
364
+
365
+ const position = nodeX.getNodeByName( 'position' );
366
+ const normal = nodeX.getNodeByName( 'normal' );
367
+ const upAxis = nodeX.getNodeByName( 'upaxis' );
368
+ const blend = nodeX.getNodeByName( 'blend' );
369
+ const defaultNode = nodeX.getNodeByName( 'default' );
370
+ const textureDefault = toTextureDefaultNode( defaultNode, nodeX.type );
371
+
372
+ const x = element( position, 0 );
373
+ const y = element( position, 1 );
374
+ const z = element( position, 2 );
375
+ const xUp = upAxis.equal( int( 0 ) );
376
+ const zUp = upAxis.equal( int( 2 ) );
377
+ const texcoords = {
378
+ filex: zUp.select( vec2( y, z ), vec2( z, y ) ),
379
+ filey: xUp.select( vec2( z, x ), vec2( x, z ) ),
380
+ filez: xUp.select( vec2( mul( y, - 1 ), x ), vec2( x, y ) ),
381
+ };
382
+
383
+ // color4 and vector4 keep the alpha of the textures.
384
+ const fourChannels = nodeX.type === 'color4' || nodeX.type === 'vector4';
385
+ const samples = Object.entries( texcoords ).map( ( [ fileInput, texcoord ] ) => {
386
+
387
+ const file = nodeX.getChildByName( fileInput );
388
+ const textureFile = file && file.getValue() !== '' ? file.getTexture() : null;
389
+ const sample = applyTextureColorSpace( sampleTexture( textureFile, texcoord, compileContext, textureDefault ), file );
390
+ return fourChannels ? sample : toVec3Channels( sample );
391
+
392
+ } );
393
+
394
+ const absNormal = abs( normalize( normal ) );
395
+ const weights = pow( div( absNormal, dot( absNormal, vec3( 1, 1, 1 ) ) ), div( 1, clamp( blend, float( 0.03 ), float( 1 ) ) ) );
396
+ const normalizedWeights = div( weights, dot( weights, vec3( 1, 1, 1 ) ) );
397
+
398
+ return add(
399
+ add( mul( samples[ 0 ], element( normalizedWeights, 0 ) ), mul( samples[ 1 ], element( normalizedWeights, 1 ) ) ),
400
+ mul( samples[ 2 ], element( normalizedWeights, 2 ) ),
401
+ );
402
+
403
+ };
404
+
386
405
  const compileHexTiledNormalMapNode = ( nodeX, compileContext, sampleNode ) => {
387
406
 
388
407
  const normalMapNodeElement = compileContext.nodeLibrary.normalmap;
389
- const strengthNode = nodeX.getNodeByName( 'strength' ) || float( 1 );
408
+ const strengthNode = nodeX.getNodeByName( 'strength' );
390
409
 
391
410
  if ( ! normalMapNodeElement || typeof normalMapNodeElement.nodeFunc !== 'function' ) {
392
411
 
@@ -420,6 +439,32 @@ const compileHexTiledNormalMapNode = ( nodeX, compileContext, sampleNode ) => {
420
439
 
421
440
  };
422
441
 
442
+ const getHextileLuminanceWeights = ( nodeX, c0, c1, c2 ) => {
443
+
444
+ const falloffContrast = nodeX.getNodeByName( 'falloffcontrast' );
445
+ let lumaCoeffs = nodeX.getNodeByName( 'lumacoeffs' );
446
+ const lumaCoeffsInput = nodeX.getChildByName( 'lumacoeffs' );
447
+ if ( lumaCoeffsInput && lumaCoeffsInput.isConst ) {
448
+
449
+ const lumaCoeffValues = lumaCoeffsInput.getVector();
450
+ if ( lumaCoeffValues.length === 3 ) {
451
+
452
+ // Treat luminance coefficients as raw numeric values, not display colors.
453
+ lumaCoeffs = vec3( lumaCoeffValues[ 0 ], lumaCoeffValues[ 1 ], lumaCoeffValues[ 2 ] );
454
+
455
+ }
456
+
457
+ }
458
+
459
+ const falloffContrastWeight = mul( falloffContrast, 0.5 );
460
+ return mix(
461
+ vec3( 1, 1, 1 ),
462
+ vec3( dot( c0, lumaCoeffs ), dot( c1, lumaCoeffs ), dot( c2, lumaCoeffs ) ),
463
+ vec3( falloffContrastWeight, falloffContrastWeight, falloffContrastWeight ),
464
+ );
465
+
466
+ };
467
+
423
468
  const compileHexTiledTextureNode = ( nodeX, compileContext, category ) => {
424
469
 
425
470
  const file = nodeX.getChildByName( 'file' );
@@ -432,7 +477,7 @@ const compileHexTiledTextureNode = ( nodeX, compileContext, category ) => {
432
477
  );
433
478
  if ( category === 'hextilednormalmap' ) {
434
479
 
435
- return normalize( nodeX.getNodeByName( 'normal' ) || normalLocal );
480
+ return normalize( nodeX.getNodeByName( 'normal' ) );
436
481
 
437
482
  }
438
483
 
@@ -445,7 +490,7 @@ const compileHexTiledTextureNode = ( nodeX, compileContext, category ) => {
445
490
 
446
491
  if ( category === 'hextilednormalmap' ) {
447
492
 
448
- return normalize( nodeX.getNodeByName( 'normal' ) || normalLocal );
493
+ return normalize( nodeX.getNodeByName( 'normal' ) );
449
494
 
450
495
  }
451
496
 
@@ -453,29 +498,15 @@ const compileHexTiledTextureNode = ( nodeX, compileContext, category ) => {
453
498
 
454
499
  }
455
500
 
456
- const uvNode = nodeX.getNodeByName( 'texcoord' ) || getDefaultUvNode( compileContext );
457
- const tiling = nodeX.getNodeByName( 'tiling' ) || vec2( 1, 1 );
458
- const rotation = nodeX.getNodeByName( 'rotation' ) || float( 1 );
459
- const rotationRange = nodeX.getNodeByName( 'rotationrange' ) || vec2( 0, 360 );
460
- const scale = nodeX.getNodeByName( 'scale' ) || float( 1 );
461
- const scaleRange = nodeX.getNodeByName( 'scalerange' ) || vec2( 0.5, 2 );
462
- const offset = nodeX.getNodeByName( 'offset' ) || float( 1 );
463
- const offsetRange = nodeX.getNodeByName( 'offsetrange' ) || vec2( 0, 1 );
464
- const falloff = nodeX.getNodeByName( 'falloff' ) || float( 0.5 );
465
- const falloffContrast = nodeX.getNodeByName( 'falloffcontrast' ) || float( 0.5 );
466
- let lumaCoeffs = nodeX.getNodeByName( 'lumacoeffs' ) || vec3( 0.2722287, 0.6740818, 0.0536895 );
467
- const lumaCoeffsInput = nodeX.getChildByName( 'lumacoeffs' );
468
- if ( lumaCoeffsInput && lumaCoeffsInput.isConst ) {
469
-
470
- const lumaCoeffValues = lumaCoeffsInput.getVector();
471
- if ( lumaCoeffValues.length === 3 ) {
472
-
473
- // Treat luminance coefficients as raw numeric values, not display colors.
474
- lumaCoeffs = vec3( lumaCoeffValues[ 0 ], lumaCoeffValues[ 1 ], lumaCoeffValues[ 2 ] );
475
-
476
- }
477
-
478
- }
501
+ const uvNode = nodeX.getNodeByName( 'texcoord' );
502
+ const tiling = nodeX.getNodeByName( 'tiling' );
503
+ const rotation = nodeX.getNodeByName( 'rotation' );
504
+ const rotationRange = nodeX.getNodeByName( 'rotationrange' );
505
+ const scale = nodeX.getNodeByName( 'scale' );
506
+ const scaleRange = nodeX.getNodeByName( 'scalerange' );
507
+ const offset = nodeX.getNodeByName( 'offset' );
508
+ const offsetRange = nodeX.getNodeByName( 'offsetrange' );
509
+ const falloff = nodeX.getNodeByName( 'falloff' );
479
510
 
480
511
  const transformedUv = compileContext.mxFromBottomLeftUvSpace( mul( uvNode, tiling ) );
481
512
  const tileData = compileContext.mxHextileCoord( transformedUv, rotation, rotationRange, scale, scaleRange, offset, offsetRange );
@@ -508,12 +539,8 @@ const compileHexTiledTextureNode = ( nodeX, compileContext, category ) => {
508
539
  const c0 = toVec3Channels( sample0 );
509
540
  const c1 = toVec3Channels( sample1 );
510
541
  const c2 = toVec3Channels( sample2 );
511
- const falloffContrastWeight = mul( falloffContrast, 0.5 );
512
- const cw = mix(
513
- vec3( 1, 1, 1 ),
514
- vec3( dot( c0, lumaCoeffs ), dot( c1, lumaCoeffs ), dot( c2, lumaCoeffs ) ),
515
- vec3( falloffContrastWeight, falloffContrastWeight, falloffContrastWeight ),
516
- );
542
+ // hextilednormalmap blends with unit weights, as in MaterialX
543
+ const cw = category === 'hextilednormalmap' ? vec3( 1, 1, 1 ) : getHextileLuminanceWeights( nodeX, c0, c1, c2 );
517
544
  const blendWeights = compileContext.mxHextileComputeBlendWeights( cw, tileData.weights, falloff );
518
545
  const alphaWeights = compileContext.mxHextileComputeBlendWeights( vec3( 1, 1, 1 ), tileData.weights, falloff );
519
546
  const blendedRgb = add( add( mul( element( blendWeights, 0 ), c0 ), mul( element( blendWeights, 1 ), c1 ) ), mul( element( blendWeights, 2 ), c2 ) );
@@ -550,17 +577,17 @@ const compileHexTiledTextureNode = ( nodeX, compileContext, category ) => {
550
577
 
551
578
  const compileGltfTextureNode = ( nodeX, compileContext, category ) => {
552
579
 
553
- const { file, uvNode, textureFile, addressModes } = getTextureInputs( nodeX, compileContext );
580
+ const { file, uvNode, textureFile, addressModes } = getTextureInputs( nodeX );
554
581
  let transformedUv = uvNode;
555
582
  const place2d = compileContext.nodeLibrary.place2d;
556
583
 
557
584
  if ( place2d ) {
558
585
 
559
- const pivot = nodeX.getNodeByName( 'pivot' ) || vec2( 0, 1 );
560
- const scale = nodeX.getNodeByName( 'scale' ) || vec2( 1, 1 );
561
- const rotate = nodeX.getNodeByName( 'rotate' ) || float( 0 );
562
- const offset = nodeX.getNodeByName( 'offset' ) || vec2( 0, 0 );
563
- const operationorder = nodeX.getNodeByName( 'operationorder' ) || int( 0 );
586
+ const pivot = nodeX.getNodeByName( 'pivot' );
587
+ const scale = nodeX.getNodeByName( 'scale' );
588
+ const rotate = nodeX.getNodeByName( 'rotate' );
589
+ const offset = nodeX.getNodeByName( 'offset' );
590
+ const operationorder = nodeX.getNodeByName( 'operationorder' );
564
591
  transformedUv = place2d.nodeFunc(
565
592
  uvNode,
566
593
  pivot,
@@ -595,12 +622,12 @@ const compileGltfTextureNode = ( nodeX, compileContext, category ) => {
595
622
 
596
623
  if ( category === 'gltf_normalmap' ) {
597
624
 
598
- const normalScale = nodeX.getNodeByName( 'scale' ) || float( 1 );
625
+ const normalScale = nodeX.getNodeByName( 'scale' );
599
626
  return normalMap( node, normalScale );
600
627
 
601
628
  }
602
629
 
603
- const factor = nodeX.getNodeByName( 'factor' );
630
+ const factor = nodeX.declaresInput( 'factor' ) ? nodeX.getNodeByName( 'factor' ) : null;
604
631
 
605
632
  if ( factor ) {
606
633
 
@@ -620,16 +647,16 @@ const compileGltfTextureNode = ( nodeX, compileContext, category ) => {
620
647
 
621
648
  const compileGltfColorImageNode = ( nodeX, out, compileContext ) => {
622
649
 
623
- const { file, uvNode, textureFile, addressModes } = getTextureInputs( nodeX, compileContext );
650
+ const { file, uvNode, textureFile, addressModes } = getTextureInputs( nodeX );
624
651
  let transformedUv = uvNode;
625
652
  const place2d = compileContext.nodeLibrary.place2d;
626
653
 
627
654
  if ( place2d ) {
628
655
 
629
- const pivot = nodeX.getNodeByName( 'pivot' ) || vec2( 0, 1 );
630
- const scale = nodeX.getNodeByName( 'scale' ) || vec2( 1, 1 );
631
- const rotate = nodeX.getNodeByName( 'rotate' ) || float( 0 );
632
- const offset = nodeX.getNodeByName( 'offset' ) || vec2( 0, 0 );
656
+ const pivot = nodeX.getNodeByName( 'pivot' );
657
+ const scale = nodeX.getNodeByName( 'scale' );
658
+ const rotate = nodeX.getNodeByName( 'rotate' );
659
+ const offset = nodeX.getNodeByName( 'offset' );
633
660
  // Match MaterialX's ND_gltf_colorimage graph implementation, which wires gltf_image with operationorder=0.
634
661
  const operationorder = int( 0 );
635
662
  transformedUv = place2d.nodeFunc(
@@ -643,12 +670,12 @@ const compileGltfColorImageNode = ( nodeX, out, compileContext ) => {
643
670
 
644
671
  }
645
672
 
646
- const defaultInput = nodeX.getNodeByName( 'default' ) || vec4( 0, 0, 0, 0 );
673
+ const defaultInput = nodeX.getNodeByName( 'default' );
647
674
  const fallback = vec4( defaultInput );
648
675
  const sampled = sampleTexture( textureFile, transformedUv, compileContext, fallback, addressModes, fallback );
649
676
  const converted = applyTextureColorSpace( sampled, file );
650
- const color = nodeX.getNodeByName( 'color' ) || vec4( 1, 1, 1, 1 );
651
- const geomcolor = nodeX.getNodeByName( 'geomcolor' ) || vec4( 1, 1, 1, 1 );
677
+ const color = nodeX.getNodeByName( 'color' );
678
+ const geomcolor = nodeX.getNodeByName( 'geomcolor' );
652
679
  const modulated = mul( mul( converted, color ), geomcolor );
653
680
 
654
681
  if ( out === 'outa' ) {
@@ -663,12 +690,12 @@ const compileGltfColorImageNode = ( nodeX, out, compileContext ) => {
663
690
 
664
691
  const compileGltfAnisotropyImageNode = ( nodeX, out, compileContext ) => {
665
692
 
666
- const { uvNode, textureFile, addressModes } = getTextureInputs( nodeX, compileContext );
667
- const defaultInput = nodeX.getNodeByName( 'default' ) || vec3( 1, 0.5, 1 );
693
+ const { uvNode, textureFile, addressModes } = getTextureInputs( nodeX );
694
+ const defaultInput = nodeX.getNodeByName( 'default' );
668
695
  const fallback = vec4( element( defaultInput, 0 ), element( defaultInput, 1 ), element( defaultInput, 2 ), 1 );
669
696
  const sampled = sampleTexture( textureFile, uvNode, compileContext, fallback, addressModes, fallback );
670
- const anisotropyStrengthFactor = nodeX.getNodeByName( 'anisotropy_strength' ) || float( 1 );
671
- const anisotropyRotationFactor = nodeX.getNodeByName( 'anisotropy_rotation' ) || float( 0 );
697
+ const anisotropyStrengthFactor = nodeX.getNodeByName( 'anisotropy_strength' );
698
+ const anisotropyRotationFactor = nodeX.getNodeByName( 'anisotropy_rotation' );
672
699
  const encodedDirection = vec2( sub( mul( element( sampled, 0 ), 2 ), 1 ), sub( mul( element( sampled, 1 ), 2 ), 1 ) );
673
700
  const textureRotation = mx_atan2( element( encodedDirection, 1 ), element( encodedDirection, 0 ) );
674
701
  const anisotropyStrengthOut = clamp( mul( anisotropyStrengthFactor, element( sampled, 2 ) ), 0, 1 );
@@ -686,40 +713,37 @@ const compileGltfAnisotropyImageNode = ( nodeX, out, compileContext ) => {
686
713
 
687
714
  const compileGltfIridescenceThicknessNode = ( nodeX, compileContext ) => {
688
715
 
689
- const { uvNode, textureFile, addressModes } = getTextureInputs( nodeX, compileContext );
716
+ const { uvNode, textureFile, addressModes } = getTextureInputs( nodeX );
690
717
  const fallback = vec4( 0, 0, 0, 1 );
691
718
  const sampled = sampleTexture( textureFile, uvNode, compileContext, fallback, addressModes, fallback );
692
719
  const sampledThickness = element( sampled, 0 );
693
- const thicknessMin = nodeX.getNodeByName( 'thicknessMin' ) || float( 100 );
694
- const thicknessMax = nodeX.getNodeByName( 'thicknessMax' ) || float( 400 );
720
+ const thicknessMin = nodeX.getNodeByName( 'thicknessMin' );
721
+ const thicknessMax = nodeX.getNodeByName( 'thicknessMax' );
695
722
  return add( thicknessMin, mul( sampledThickness, sub( thicknessMax, thicknessMin ) ) );
696
723
 
697
724
  };
698
725
 
699
- const compileTransformMatrixNode = ( nodeX, compileContext ) => {
726
+ const compileTransformMatrixNode = ( nodeX ) => {
700
727
 
701
- const nodeDefName = nodeX.getAttribute( 'nodedef' );
702
- const inNode = nodeX.getNodeByName( 'in' ) || float( 0 );
703
- const matrixNode =
704
- nodeX.getNodeByName( 'mat' ) ||
705
- ( nodeDefName === 'ND_transformmatrix_vector2M3' || nodeDefName === 'ND_transformmatrix_vector3'
706
- ? mat3( ...compileContext.IDENTITY_MAT3_VALUES )
707
- : mat4( ...compileContext.IDENTITY_MAT4_VALUES ) );
728
+ const inputType = nodeX.getNodeDefInputType( 'in' );
729
+ const matrixType = nodeX.getNodeDefInputType( 'mat' );
730
+ const inNode = nodeX.getNodeByName( 'in' );
731
+ const matrixNode = nodeX.getNodeByName( 'mat' );
708
732
 
709
- if ( nodeDefName === 'ND_transformmatrix_vector2M3' ) {
733
+ if ( inputType === 'vector2' ) {
710
734
 
711
735
  const transformed = mul( matrixNode, vec3( element( inNode, 0 ), element( inNode, 1 ), 1 ) );
712
736
  return vec2( element( transformed, 0 ), element( transformed, 1 ) );
713
737
 
714
738
  }
715
739
 
716
- if ( nodeDefName === 'ND_transformmatrix_vector3' ) {
740
+ if ( inputType === 'vector3' && matrixType === 'matrix33' ) {
717
741
 
718
742
  return mul( matrixNode, vec3( element( inNode, 0 ), element( inNode, 1 ), element( inNode, 2 ) ) );
719
743
 
720
744
  }
721
745
 
722
- if ( nodeDefName === 'ND_transformmatrix_vector3M4' ) {
746
+ if ( inputType === 'vector3' ) {
723
747
 
724
748
  const transformed = mul( matrixNode, vec4( element( inNode, 0 ), element( inNode, 1 ), element( inNode, 2 ), 1 ) );
725
749
  return vec3( element( transformed, 0 ), element( transformed, 1 ), element( transformed, 2 ) );
@@ -734,25 +758,25 @@ const compileCreateMatrixNode = ( nodeX ) => {
734
758
 
735
759
  if ( nodeX.type === 'matrix44' ) {
736
760
 
737
- const vector3Input = nodeX.getAttribute( 'nodedef' ) === 'ND_creatematrix_vector3_matrix44';
738
- const toVec4Input = ( name, fallback, w ) => {
761
+ const vector3Input = nodeX.getNodeDefInputType( 'in1' ) === 'vector3';
762
+ const toVec4Input = ( name, w ) => {
739
763
 
740
- const input = nodeX.getNodeByName( name ) || fallback;
764
+ const input = nodeX.getNodeByName( name );
741
765
  return vector3Input ? vec4( element( input, 0 ), element( input, 1 ), element( input, 2 ), w ) : input;
742
766
 
743
767
  };
744
768
 
745
- const in1 = toVec4Input( 'in1', vector3Input ? vec3( 1, 0, 0 ) : vec4( 1, 0, 0, 0 ), 0 );
746
- const in2 = toVec4Input( 'in2', vector3Input ? vec3( 0, 1, 0 ) : vec4( 0, 1, 0, 0 ), 0 );
747
- const in3 = toVec4Input( 'in3', vector3Input ? vec3( 0, 0, 1 ) : vec4( 0, 0, 1, 0 ), 0 );
748
- const in4 = toVec4Input( 'in4', vector3Input ? vec3( 0, 0, 0 ) : vec4( 0, 0, 0, 1 ), 1 );
769
+ const in1 = toVec4Input( 'in1', 0 );
770
+ const in2 = toVec4Input( 'in2', 0 );
771
+ const in3 = toVec4Input( 'in3', 0 );
772
+ const in4 = toVec4Input( 'in4', 1 );
749
773
  return mat4( in1, in2, in3, in4 );
750
774
 
751
775
  }
752
776
 
753
- const in1 = nodeX.getNodeByName( 'in1' ) || vec3( 1, 0, 0 );
754
- const in2 = nodeX.getNodeByName( 'in2' ) || vec3( 0, 1, 0 );
755
- const in3 = nodeX.getNodeByName( 'in3' ) || vec3( 0, 0, 1 );
777
+ const in1 = nodeX.getNodeByName( 'in1' );
778
+ const in2 = nodeX.getNodeByName( 'in2' );
779
+ const in3 = nodeX.getNodeByName( 'in3' );
756
780
  return mat3( in1, in2, in3 );
757
781
 
758
782
  };
@@ -887,14 +911,11 @@ const compileInvertMatrixNode = ( nodeX, compileContext ) => {
887
911
  const inNode = nodeX.getNodeByName( 'in' );
888
912
  if ( isMatrixType ) {
889
913
 
890
- const size = matrixType === 'matrix33' ? 3 : 4;
891
- const fallback = size === 3 ? mat3( ...compileContext.IDENTITY_MAT3_VALUES ) : mat4( ...compileContext.IDENTITY_MAT4_VALUES );
892
- const matrixNode = inNode === undefined || inNode === null ? fallback : inNode;
893
- return size === 3 ? compileInvertMatrix3Node( matrixNode ) : compileInvertMatrix4Node( matrixNode );
914
+ return matrixType === 'matrix33' ? compileInvertMatrix3Node( inNode ) : compileInvertMatrix4Node( inNode );
894
915
 
895
916
  }
896
917
 
897
- return inNode === undefined || inNode === null ? float( 0 ) : inNode;
918
+ return inNode;
898
919
 
899
920
  };
900
921
 
@@ -916,6 +937,7 @@ function createMaterialXCompileRegistry() {
916
937
  register( registry, [ 'geomcolor' ], ( nodeX ) => compileGeomColorNode( nodeX ) );
917
938
  register( registry, [ 'tiledimage' ], ( nodeX, out, compileContext ) => compileTiledImageNode( nodeX, compileContext ) );
918
939
  register( registry, [ 'image' ], ( nodeX, out, compileContext ) => compileImageLikeNode( nodeX, compileContext ) );
940
+ register( registry, [ 'triplanarprojection' ], ( nodeX, out, compileContext ) => compileTriplanarProjectionNode( nodeX, compileContext ) );
919
941
  register( registry, [ 'hextiledimage', 'hextilednormalmap' ], ( nodeX, out, compileContext ) =>
920
942
  compileHexTiledTextureNode( nodeX, compileContext, nodeX.element ) );
921
943
  register( registry, [ 'gltf_image', 'gltf_normalmap' ], ( nodeX, out, compileContext ) =>
@@ -926,7 +948,7 @@ function createMaterialXCompileRegistry() {
926
948
  register( registry, [ 'gltf_iridescence_thickness' ], ( nodeX, out, compileContext ) =>
927
949
  compileGltfIridescenceThicknessNode( nodeX, compileContext ) );
928
950
  register( registry, [ 'switch' ], ( nodeX ) => compileSwitchNode( nodeX ) );
929
- register( registry, [ 'transformmatrix' ], ( nodeX, out, compileContext ) => compileTransformMatrixNode( nodeX, compileContext ) );
951
+ register( registry, [ 'transformmatrix' ], compileTransformMatrixNode );
930
952
  register( registry, [ 'creatematrix' ], ( nodeX ) => compileCreateMatrixNode( nodeX ) );
931
953
  register( registry, [ 'invertmatrix' ], ( nodeX, out, compileContext ) => compileInvertMatrixNode( nodeX, compileContext ) );
932
954
  return registry;
@@ -959,31 +981,11 @@ function compileNodeFromRegistry( nodeX, out, compileContext ) {
959
981
  const args = nodeX.getNodesByNames( ...nodeElement.params );
960
982
  for ( let i = 0; i < nodeElement.params.length; i += 1 ) {
961
983
 
962
- if ( args[ i ] !== undefined && args[ i ] !== null ) {
963
-
964
- continue;
965
-
966
- }
967
-
968
- const paramName = nodeElement.params[ i ];
969
- if ( paramName === 'texcoord' && UV_FALLBACK_CATEGORIES.has( nodeX.element ) ) {
970
-
971
- args[ i ] = getDefaultUvNode( compileContext );
972
- continue;
973
-
974
- }
975
-
976
- const defaultValue = nodeElement.defaults ? nodeElement.defaults[ paramName ] : undefined;
977
- if ( defaultValue !== undefined ) {
978
-
979
- args[ i ] = typeof defaultValue === 'function' ? defaultValue() : float( defaultValue );
980
- continue;
981
-
982
- }
984
+ if ( args[ i ] !== undefined && args[ i ] !== null ) continue;
983
985
 
984
986
  nodeX.materialX.log.add(
985
987
  MaterialXLogCodes.INVALID_VALUE,
986
- `Missing input "${paramName}" for node "${nodeX.name || nodeX.element}" (${nodeX.element}). Using fallback 0.`,
988
+ `Missing input "${nodeElement.params[ i ]}" for node "${nodeX.name || nodeX.element}" (${nodeX.element}) and no nodedef default. Using fallback 0.`,
987
989
  nodeX.name,
988
990
  );
989
991
  args[ i ] = float( 0 );