@needle-tools/three 0.145.4 → 0.146.2

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 (393) hide show
  1. package/README.md +1 -1
  2. package/build/three.cjs +32586 -35951
  3. package/build/three.js +32600 -35965
  4. package/build/three.min.js +6 -7
  5. package/build/three.module.js +1547 -1154
  6. package/examples/js/animation/AnimationClipCreator.js +0 -8
  7. package/examples/js/animation/CCDIKSolver.js +49 -66
  8. package/examples/js/animation/MMDAnimationHelper.js +66 -137
  9. package/examples/js/animation/MMDPhysics.js +70 -134
  10. package/examples/js/cameras/CinematicCamera.js +33 -22
  11. package/examples/js/controls/ArcballControls.js +138 -405
  12. package/examples/js/controls/DragControls.js +8 -33
  13. package/examples/js/controls/FirstPersonControls.js +32 -54
  14. package/examples/js/controls/FlyControls.js +29 -55
  15. package/examples/js/controls/OrbitControls.js +85 -95
  16. package/examples/js/controls/PointerLockControls.js +5 -14
  17. package/examples/js/controls/TrackballControls.js +33 -86
  18. package/examples/js/controls/TransformControls.js +84 -169
  19. package/examples/js/csm/CSM.js +4 -39
  20. package/examples/js/csm/CSMFrustum.js +3 -9
  21. package/examples/js/csm/CSMHelper.js +24 -4
  22. package/examples/js/csm/CSMShader.js +2 -6
  23. package/examples/js/curves/CurveExtras.js +27 -27
  24. package/examples/js/curves/NURBSCurve.js +4 -16
  25. package/examples/js/curves/NURBSSurface.js +3 -9
  26. package/examples/js/curves/NURBSUtils.js +8 -45
  27. package/examples/js/effects/AnaglyphEffect.js +4 -18
  28. package/examples/js/effects/AsciiEffect.js +32 -31
  29. package/examples/js/effects/OutlineEffect.js +26 -30
  30. package/examples/js/effects/ParallaxBarrierEffect.js +0 -13
  31. package/examples/js/effects/PeppersGhostEffect.js +12 -39
  32. package/examples/js/effects/StereoEffect.js +0 -4
  33. package/examples/js/environments/RoomEnvironment.js +12 -10
  34. package/examples/js/exporters/ColladaExporter.js +48 -65
  35. package/examples/js/exporters/DRACOExporter.js +22 -22
  36. package/examples/js/exporters/EXRExporter.js +15 -18
  37. package/examples/js/exporters/GLTFExporter.js +143 -261
  38. package/examples/js/exporters/MMDExporter.js +5 -12
  39. package/examples/js/exporters/OBJExporter.js +42 -33
  40. package/examples/js/exporters/PLYExporter.js +38 -33
  41. package/examples/js/exporters/STLExporter.js +5 -7
  42. package/examples/js/exporters/USDZExporter.js +110 -25
  43. package/examples/js/geometries/BoxLineGeometry.js +0 -1
  44. package/examples/js/geometries/ConvexGeometry.js +11 -6
  45. package/examples/js/geometries/DecalGeometry.js +53 -20
  46. package/examples/js/geometries/LightningStrike.js +54 -67
  47. package/examples/js/geometries/ParametricGeometries.js +8 -7
  48. package/examples/js/geometries/ParametricGeometry.js +25 -12
  49. package/examples/js/geometries/RoundedBoxGeometry.js +21 -19
  50. package/examples/js/geometries/TeapotGeometry.js +54 -50
  51. package/examples/js/geometries/TextGeometry.js +6 -4
  52. package/examples/js/helpers/LightProbeHelper.js +1 -2
  53. package/examples/js/helpers/OctreeHelper.js +22 -20
  54. package/examples/js/helpers/PositionalAudioHelper.js +8 -6
  55. package/examples/js/helpers/RectAreaLightHelper.js +6 -7
  56. package/examples/js/helpers/VertexNormalsHelper.js +15 -13
  57. package/examples/js/helpers/VertexTangentsHelper.js +15 -9
  58. package/examples/js/helpers/ViewHelper.js +31 -16
  59. package/examples/js/interactive/HTMLMesh.js +22 -33
  60. package/examples/js/interactive/InteractiveGroup.js +6 -12
  61. package/examples/js/interactive/SelectionBox.js +3 -70
  62. package/examples/js/interactive/SelectionHelper.js +0 -8
  63. package/examples/js/lights/LightProbeGenerator.js +32 -39
  64. package/examples/js/lights/RectAreaLightUniformsLib.js +5 -1
  65. package/examples/js/lines/LineGeometry.js +3 -5
  66. package/examples/js/lines/LineMaterial.js +4 -11
  67. package/examples/js/lines/LineSegments2.js +38 -89
  68. package/examples/js/lines/LineSegmentsGeometry.js +7 -28
  69. package/examples/js/lines/Wireframe.js +2 -7
  70. package/examples/js/lines/WireframeGeometry2.js +3 -1
  71. package/examples/js/loaders/3DMLoader.js +58 -155
  72. package/examples/js/loaders/3MFLoader.js +72 -106
  73. package/examples/js/loaders/AMFLoader.js +0 -25
  74. package/examples/js/loaders/BVHLoader.js +44 -43
  75. package/examples/js/loaders/BasisTextureLoader.js +16 -46
  76. package/examples/js/loaders/ColladaLoader.js +201 -359
  77. package/examples/js/loaders/DDSLoader.js +24 -25
  78. package/examples/js/loaders/DRACOLoader.js +29 -66
  79. package/examples/js/loaders/EXRLoader.js +67 -164
  80. package/examples/js/loaders/FBXLoader.js +286 -441
  81. package/examples/js/loaders/FontLoader.js +6 -15
  82. package/examples/js/loaders/GCodeLoader.js +15 -16
  83. package/examples/js/loaders/GLTFLoader.js +354 -405
  84. package/examples/js/loaders/HDRCubeTextureLoader.js +0 -6
  85. package/examples/js/loaders/KMZLoader.js +3 -7
  86. package/examples/js/loaders/KTXLoader.js +12 -30
  87. package/examples/js/loaders/LDrawLoader.js +178 -289
  88. package/examples/js/loaders/LUT3dlLoader.js +7 -11
  89. package/examples/js/loaders/LUTCubeLoader.js +0 -8
  90. package/examples/js/loaders/LWOLoader.js +59 -124
  91. package/examples/js/loaders/LogLuvLoader.js +27 -77
  92. package/examples/js/loaders/LottieLoader.js +4 -4
  93. package/examples/js/loaders/MD2Loader.js +26 -27
  94. package/examples/js/loaders/MDDLoader.js +6 -10
  95. package/examples/js/loaders/MMDLoader.js +180 -189
  96. package/examples/js/loaders/MTLLoader.js +18 -47
  97. package/examples/js/loaders/MaterialXLoader.js +392 -0
  98. package/examples/js/loaders/NRRDLoader.js +44 -84
  99. package/examples/js/loaders/OBJLoader.js +50 -65
  100. package/examples/js/loaders/PCDLoader.js +34 -29
  101. package/examples/js/loaders/PDBLoader.js +17 -13
  102. package/examples/js/loaders/PLYLoader.js +9 -39
  103. package/examples/js/loaders/PRWMLoader.js +11 -22
  104. package/examples/js/loaders/PVRLoader.js +7 -16
  105. package/examples/js/loaders/RGBELoader.js +36 -61
  106. package/examples/js/loaders/RGBMLoader.js +26 -87
  107. package/examples/js/loaders/STLLoader.js +20 -27
  108. package/examples/js/loaders/SVGLoader.js +361 -233
  109. package/examples/js/loaders/TDSLoader.js +81 -118
  110. package/examples/js/loaders/TGALoader.js +39 -41
  111. package/examples/js/loaders/TIFFLoader.js +0 -1
  112. package/examples/js/loaders/TTFLoader.js +0 -8
  113. package/examples/js/loaders/TiltLoader.js +14 -15
  114. package/examples/js/loaders/VOXLoader.js +8 -16
  115. package/examples/js/loaders/VRMLLoader.js +243 -340
  116. package/examples/js/loaders/VTKLoader.js +101 -118
  117. package/examples/js/loaders/XYZLoader.js +2 -4
  118. package/examples/js/loaders/lwo/IFFParser.js +55 -136
  119. package/examples/js/loaders/lwo/LWO2Parser.js +32 -83
  120. package/examples/js/loaders/lwo/LWO3Parser.js +31 -73
  121. package/examples/js/materials/MeshGouraudMaterial.js +15 -13
  122. package/examples/js/math/Capsule.js +0 -17
  123. package/examples/js/math/ColorConverter.js +3 -3
  124. package/examples/js/math/ConvexHull.js +183 -139
  125. package/examples/js/math/ImprovedNoise.js +1 -1
  126. package/examples/js/math/Lut.js +8 -15
  127. package/examples/js/math/MeshSurfaceSampler.js +6 -28
  128. package/examples/js/math/OBB.js +90 -49
  129. package/examples/js/math/Octree.js +2 -57
  130. package/examples/js/math/SimplexNoise.js +74 -88
  131. package/examples/js/misc/ConvexObjectBreaker.js +37 -48
  132. package/examples/js/misc/GPUComputationRenderer.js +14 -18
  133. package/examples/js/misc/Gyroscope.js +5 -9
  134. package/examples/js/misc/MD2Character.js +14 -23
  135. package/examples/js/misc/MD2CharacterComplex.js +73 -54
  136. package/examples/js/misc/MorphAnimMesh.js +0 -6
  137. package/examples/js/misc/MorphBlendMesh.js +3 -30
  138. package/examples/js/misc/ProgressiveLightMap.js +47 -43
  139. package/examples/js/misc/RollerCoaster.js +17 -24
  140. package/examples/js/misc/TubePainter.js +18 -12
  141. package/examples/js/misc/Volume.js +16 -45
  142. package/examples/js/misc/VolumeSlice.js +14 -24
  143. package/examples/js/modifiers/CurveModifier.js +19 -21
  144. package/examples/js/modifiers/EdgeSplitModifier.js +0 -30
  145. package/examples/js/modifiers/SimplifyModifier.js +56 -59
  146. package/examples/js/modifiers/TessellateModifier.js +2 -9
  147. package/examples/js/objects/GroundProjectedEnv.js +2 -14
  148. package/examples/js/objects/Lensflare.js +47 -38
  149. package/examples/js/objects/LightningStorm.js +10 -13
  150. package/examples/js/objects/MarchingCubes.js +80 -59
  151. package/examples/js/objects/Reflector.js +22 -20
  152. package/examples/js/objects/ReflectorForSSRPass.js +19 -23
  153. package/examples/js/objects/Refractor.js +52 -30
  154. package/examples/js/objects/ShadowMesh.js +1 -2
  155. package/examples/js/objects/Sky.js +2 -7
  156. package/examples/js/objects/Water.js +23 -18
  157. package/examples/js/objects/Water2.js +20 -19
  158. package/examples/js/physics/AmmoPhysics.js +23 -20
  159. package/examples/js/physics/OimoPhysics.js +19 -17
  160. package/examples/js/postprocessing/AdaptiveToneMappingPass.js +13 -20
  161. package/examples/js/postprocessing/AfterimagePass.js +19 -12
  162. package/examples/js/postprocessing/BloomPass.js +38 -17
  163. package/examples/js/postprocessing/BokehPass.js +29 -12
  164. package/examples/js/postprocessing/ClearPass.js +1 -6
  165. package/examples/js/postprocessing/CubeTexturePass.js +12 -9
  166. package/examples/js/postprocessing/DotScreenPass.js +7 -5
  167. package/examples/js/postprocessing/EffectComposer.js +25 -32
  168. package/examples/js/postprocessing/FilmPass.js +7 -5
  169. package/examples/js/postprocessing/GlitchPass.js +10 -11
  170. package/examples/js/postprocessing/HalftonePass.js +9 -9
  171. package/examples/js/postprocessing/LUTPass.js +2 -15
  172. package/examples/js/postprocessing/MaskPass.js +20 -17
  173. package/examples/js/postprocessing/OutlinePass.js +45 -36
  174. package/examples/js/postprocessing/Pass.js +11 -14
  175. package/examples/js/postprocessing/RenderPass.js +3 -7
  176. package/examples/js/postprocessing/SAOPass.js +40 -32
  177. package/examples/js/postprocessing/SMAAPass.js +34 -17
  178. package/examples/js/postprocessing/SSAARenderPass.js +14 -14
  179. package/examples/js/postprocessing/SSAOPass.js +56 -42
  180. package/examples/js/postprocessing/SSRPass.js +78 -61
  181. package/examples/js/postprocessing/SavePass.js +14 -6
  182. package/examples/js/postprocessing/ShaderPass.js +9 -8
  183. package/examples/js/postprocessing/TAARenderPass.js +11 -9
  184. package/examples/js/postprocessing/TexturePass.js +7 -4
  185. package/examples/js/postprocessing/UnrealBloomPass.js +43 -25
  186. package/examples/js/renderers/CSS2DRenderer.js +2 -21
  187. package/examples/js/renderers/CSS3DRenderer.js +3 -24
  188. package/examples/js/renderers/Projector.js +29 -85
  189. package/examples/js/renderers/SVGRenderer.js +4 -50
  190. package/examples/js/shaders/ACESFilmicToneMappingShader.js +3 -6
  191. package/examples/js/shaders/AfterimageShader.js +3 -6
  192. package/examples/js/shaders/BasicShader.js +3 -6
  193. package/examples/js/shaders/BleachBypassShader.js +3 -6
  194. package/examples/js/shaders/BlendShader.js +3 -6
  195. package/examples/js/shaders/BokehShader.js +3 -6
  196. package/examples/js/shaders/BokehShader2.js +4 -13
  197. package/examples/js/shaders/BrightnessContrastShader.js +3 -6
  198. package/examples/js/shaders/ColorCorrectionShader.js +2 -6
  199. package/examples/js/shaders/ColorifyShader.js +2 -6
  200. package/examples/js/shaders/ConvolutionShader.js +5 -10
  201. package/examples/js/shaders/CopyShader.js +3 -6
  202. package/examples/js/shaders/DOFMipMapShader.js +3 -6
  203. package/examples/js/shaders/DepthLimitedBlurShader.js +2 -9
  204. package/examples/js/shaders/DigitalGlitch.js +3 -6
  205. package/examples/js/shaders/DotScreenShader.js +2 -6
  206. package/examples/js/shaders/FXAAShader.js +1 -3
  207. package/examples/js/shaders/FilmShader.js +3 -6
  208. package/examples/js/shaders/FocusShader.js +3 -6
  209. package/examples/js/shaders/FreiChenShader.js +2 -6
  210. package/examples/js/shaders/GammaCorrectionShader.js +3 -6
  211. package/examples/js/shaders/GodRaysShader.js +11 -24
  212. package/examples/js/shaders/HalftoneShader.js +3 -6
  213. package/examples/js/shaders/HorizontalBlurShader.js +3 -6
  214. package/examples/js/shaders/HorizontalTiltShiftShader.js +3 -6
  215. package/examples/js/shaders/HueSaturationShader.js +3 -6
  216. package/examples/js/shaders/KaleidoShader.js +3 -6
  217. package/examples/js/shaders/LuminosityHighPassShader.js +2 -6
  218. package/examples/js/shaders/LuminosityShader.js +3 -6
  219. package/examples/js/shaders/MMDToonShader.js +2 -6
  220. package/examples/js/shaders/MirrorShader.js +3 -6
  221. package/examples/js/shaders/NormalMapShader.js +2 -6
  222. package/examples/js/shaders/RGBShiftShader.js +3 -6
  223. package/examples/js/shaders/SAOShader.js +2 -6
  224. package/examples/js/shaders/SMAAShader.js +6 -18
  225. package/examples/js/shaders/SSAOShader.js +2 -6
  226. package/examples/js/shaders/SSRShader.js +6 -18
  227. package/examples/js/shaders/SepiaShader.js +3 -6
  228. package/examples/js/shaders/SobelOperatorShader.js +2 -6
  229. package/examples/js/shaders/TechnicolorShader.js +3 -6
  230. package/examples/js/shaders/ToneMapShader.js +3 -6
  231. package/examples/js/shaders/ToonShader.js +8 -24
  232. package/examples/js/shaders/TriangleBlurShader.js +2 -6
  233. package/examples/js/shaders/UnpackDepthRGBAShader.js +3 -6
  234. package/examples/js/shaders/VelocityShader.js +126 -0
  235. package/examples/js/shaders/VerticalBlurShader.js +3 -6
  236. package/examples/js/shaders/VerticalTiltShiftShader.js +3 -6
  237. package/examples/js/shaders/VignetteShader.js +3 -6
  238. package/examples/js/shaders/VolumeShader.js +2 -6
  239. package/examples/js/shaders/WaterRefractionShader.js +2 -6
  240. package/examples/js/textures/FlakesTexture.js +0 -1
  241. package/examples/js/utils/BufferGeometryUtils.js +234 -168
  242. package/examples/js/utils/CameraUtils.js +5 -20
  243. package/examples/js/utils/GPUStatsPanel.js +3 -12
  244. package/examples/js/utils/GeometryCompressionUtils.js +19 -44
  245. package/examples/js/utils/GeometryUtils.js +13 -18
  246. package/examples/js/utils/LDrawUtils.js +8 -11
  247. package/examples/js/utils/PackedPhongMaterial.js +6 -4
  248. package/examples/js/utils/SceneUtils.js +117 -6
  249. package/examples/js/utils/ShadowMapViewer.js +17 -14
  250. package/examples/js/utils/SkeletonUtils.js +13 -27
  251. package/examples/js/utils/UVsDebug.js +20 -12
  252. package/examples/js/utils/WorkerPool.js +1 -11
  253. package/examples/jsm/animation/CCDIKSolver.js +1 -1
  254. package/examples/jsm/capabilities/WebGPU.js +3 -1
  255. package/examples/jsm/controls/OrbitControls.js +44 -4
  256. package/examples/jsm/exporters/GLTFExporter.js +17 -131
  257. package/examples/jsm/exporters/USDZExporter.js +75 -19
  258. package/examples/jsm/interactive/HTMLMesh.js +2 -0
  259. package/examples/jsm/libs/lottie_canvas.module.js +14844 -0
  260. package/examples/jsm/loaders/3DMLoader.js +1 -2
  261. package/examples/jsm/loaders/ColladaLoader.js +28 -0
  262. package/examples/jsm/loaders/FBXLoader.js +16 -2
  263. package/examples/jsm/loaders/GLTFLoader.js +204 -377
  264. package/examples/jsm/loaders/KTX2Loader.js +68 -29
  265. package/examples/jsm/loaders/LDrawLoader.js +14 -13
  266. package/examples/jsm/loaders/LottieLoader.js +4 -2
  267. package/examples/jsm/loaders/MaterialXLoader.js +728 -0
  268. package/examples/jsm/loaders/PCDLoader.js +1 -1
  269. package/examples/jsm/loaders/PLYLoader.js +68 -16
  270. package/examples/jsm/loaders/SVGLoader.js +227 -14
  271. package/examples/jsm/loaders/USDZLoader.js +31 -16
  272. package/examples/jsm/nodes/Nodes.js +14 -2
  273. package/examples/jsm/nodes/accessors/Object3DNode.js +1 -1
  274. package/examples/jsm/nodes/accessors/PositionNode.js +6 -0
  275. package/examples/jsm/nodes/accessors/ReferenceNode.js +1 -1
  276. package/examples/jsm/nodes/accessors/SkinningNode.js +1 -1
  277. package/examples/jsm/nodes/core/Node.js +1 -1
  278. package/examples/jsm/nodes/core/NodeBuilder.js +36 -4
  279. package/examples/jsm/nodes/core/NodeFrame.js +2 -2
  280. package/examples/jsm/nodes/core/NodeVarying.js +7 -4
  281. package/examples/jsm/nodes/core/VaryingNode.js +6 -4
  282. package/examples/jsm/nodes/core/constants.js +13 -13
  283. package/examples/jsm/nodes/display/PosterizeNode.js +25 -0
  284. package/examples/jsm/nodes/display/ViewportNode.js +106 -0
  285. package/examples/jsm/nodes/gpgpu/ComputeNode.js +1 -1
  286. package/examples/jsm/nodes/lighting/AnalyticLightNode.js +1 -1
  287. package/examples/jsm/nodes/loaders/NodeMaterialLoader.js +3 -1
  288. package/examples/jsm/nodes/materials/Materials.js +9 -7
  289. package/examples/jsm/nodes/materials/NodeMaterial.js +9 -1
  290. package/examples/jsm/nodes/materialx/MaterialXNodes.js +6 -2
  291. package/examples/jsm/nodes/materialx/lib/mx_transform_color.js +18 -0
  292. package/examples/jsm/nodes/math/MathNode.js +5 -0
  293. package/examples/jsm/nodes/math/OperatorNode.js +6 -1
  294. package/examples/jsm/nodes/shadernode/ShaderNode.js +26 -13
  295. package/examples/jsm/nodes/shadernode/ShaderNodeBaseElements.js +2 -0
  296. package/examples/jsm/nodes/shadernode/ShaderNodeElements.js +18 -0
  297. package/examples/jsm/nodes/utils/EquirectUVNode.js +27 -0
  298. package/examples/jsm/nodes/utils/JoinNode.js +8 -2
  299. package/examples/jsm/nodes/utils/MatcapUVNode.js +2 -4
  300. package/examples/jsm/nodes/utils/MaxMipLevelNode.js +1 -1
  301. package/examples/jsm/nodes/utils/SpriteSheetUVNode.js +8 -10
  302. package/examples/jsm/nodes/utils/TimerNode.js +1 -1
  303. package/examples/jsm/nodes/utils/TriplanarTexturesNode.js +51 -0
  304. package/examples/jsm/postprocessing/AfterimagePass.js +17 -4
  305. package/examples/jsm/postprocessing/BloomPass.js +22 -3
  306. package/examples/jsm/postprocessing/BokehPass.js +18 -4
  307. package/examples/jsm/postprocessing/CubeTexturePass.js +12 -5
  308. package/examples/jsm/postprocessing/DotScreenPass.js +8 -0
  309. package/examples/jsm/postprocessing/EffectComposer.js +9 -0
  310. package/examples/jsm/postprocessing/FilmPass.js +8 -0
  311. package/examples/jsm/postprocessing/GlitchPass.js +13 -1
  312. package/examples/jsm/postprocessing/HalftonePass.js +8 -0
  313. package/examples/jsm/postprocessing/OutlinePass.js +10 -0
  314. package/examples/jsm/postprocessing/Pass.js +2 -0
  315. package/examples/jsm/postprocessing/RenderPixelatedPass.js +234 -0
  316. package/examples/jsm/postprocessing/SAOPass.js +20 -0
  317. package/examples/jsm/postprocessing/SMAAPass.js +16 -0
  318. package/examples/jsm/postprocessing/SSAARenderPass.js +4 -0
  319. package/examples/jsm/postprocessing/SavePass.js +17 -1
  320. package/examples/jsm/postprocessing/ShaderPass.js +8 -0
  321. package/examples/jsm/postprocessing/TAARenderPass.js +9 -0
  322. package/examples/jsm/postprocessing/TexturePass.js +8 -0
  323. package/examples/jsm/postprocessing/UnrealBloomPass.js +16 -0
  324. package/examples/jsm/renderers/webgl/nodes/WebGLNodeBuilder.js +39 -16
  325. package/examples/jsm/renderers/webgpu/WebGPUAnimation.js +58 -0
  326. package/examples/jsm/renderers/webgpu/WebGPUAttributes.js +63 -5
  327. package/examples/jsm/renderers/webgpu/WebGPUBackground.js +36 -7
  328. package/examples/jsm/renderers/webgpu/WebGPURenderer.js +47 -12
  329. package/examples/jsm/renderers/webgpu/nodes/WebGPUNodeBuilder.js +35 -5
  330. package/examples/jsm/shaders/MMDToonShader.js +0 -2
  331. package/examples/jsm/shaders/VelocityShader.js +128 -0
  332. package/examples/jsm/utils/BufferGeometryUtils.js +130 -6
  333. package/examples/jsm/utils/SceneUtils.js +129 -4
  334. package/examples/jsm/utils/TextureUtils.js +85 -0
  335. package/examples/jsm/webxr/OculusHandModel.js +1 -1
  336. package/examples/jsm/webxr/XRHandMeshModel.js +6 -3
  337. package/package.json +11 -12
  338. package/src/Three.js +1 -0
  339. package/src/audio/AudioContext.js +5 -5
  340. package/src/cameras/CubeCamera.js +14 -14
  341. package/src/constants.js +1 -1
  342. package/src/core/InstancedBufferGeometry.js +1 -7
  343. package/src/extras/Earcut.js +67 -67
  344. package/src/helpers/DirectionalLightHelper.js +5 -1
  345. package/src/helpers/HemisphereLightHelper.js +4 -1
  346. package/src/helpers/PointLightHelper.js +2 -1
  347. package/src/helpers/SpotLightHelper.js +4 -2
  348. package/src/lights/PointLight.js +2 -2
  349. package/src/lights/SpotLight.js +2 -2
  350. package/src/loaders/FileLoader.js +4 -1
  351. package/src/loaders/ObjectLoader.js +5 -1
  352. package/src/materials/Material.js +1 -1
  353. package/src/math/Color.js +5 -5
  354. package/src/math/Matrix3.js +53 -18
  355. package/src/math/Ray.js +2 -5
  356. package/src/math/Sphere.js +19 -26
  357. package/src/objects/InstancedMesh.js +7 -0
  358. package/src/objects/LOD.js +25 -6
  359. package/src/renderers/WebGL3DRenderTarget.js +1 -1
  360. package/src/renderers/WebGLArrayRenderTarget.js +1 -1
  361. package/src/renderers/WebGLCubeRenderTarget.js +1 -1
  362. package/src/renderers/WebGLMultipleRenderTargets.js +1 -1
  363. package/src/renderers/WebGLRenderTarget.js +1 -1
  364. package/src/renderers/WebGLRenderer.js +36 -62
  365. package/src/renderers/shaders/ShaderChunk/envmap_fragment.glsl.js +0 -4
  366. package/src/renderers/shaders/ShaderChunk/lights_fragment_begin.glsl.js +0 -1
  367. package/src/renderers/shaders/ShaderChunk/lights_lambert_pars_fragment.glsl.js +0 -2
  368. package/src/renderers/shaders/ShaderChunk/lights_phong_pars_fragment.glsl.js +0 -2
  369. package/src/renderers/shaders/ShaderChunk/lights_toon_pars_fragment.glsl.js +0 -2
  370. package/src/renderers/shaders/ShaderChunk/packing.glsl.js +8 -0
  371. package/src/renderers/shaders/ShaderChunk.js +3 -0
  372. package/src/renderers/shaders/ShaderLib/background.glsl.js +7 -2
  373. package/src/renderers/shaders/ShaderLib/backgroundCube.glsl.js +62 -0
  374. package/src/renderers/shaders/ShaderLib/cube.glsl.js +4 -6
  375. package/src/renderers/shaders/ShaderLib.js +20 -6
  376. package/src/renderers/shaders/UniformsLib.js +1 -1
  377. package/src/renderers/shaders/UniformsUtils.js +15 -0
  378. package/src/renderers/webgl/WebGLAttributes.js +2 -0
  379. package/src/renderers/webgl/WebGLBackground.js +15 -7
  380. package/src/renderers/webgl/WebGLLights.js +0 -4
  381. package/src/renderers/webgl/WebGLMaterials.js +2 -1
  382. package/src/renderers/webgl/WebGLShadowMap.js +3 -1
  383. package/src/renderers/webgl/WebGLState.js +31 -1
  384. package/src/renderers/webgl/WebGLTextures.js +71 -18
  385. package/src/renderers/webgl/WebGLUniforms.js +116 -20
  386. package/src/renderers/webgl/WebGLUtils.js +1 -1
  387. package/src/renderers/webxr/WebXRController.js +46 -13
  388. package/src/renderers/webxr/WebXRManager.js +85 -3
  389. package/src/scenes/Scene.js +8 -0
  390. package/src/textures/CompressedArrayTexture.js +18 -0
  391. package/examples/js/libs/lottie_canvas.js +0 -12751
  392. package/examples/js/shaders/PixelShader.js +0 -51
  393. package/examples/jsm/shaders/PixelShader.js +0 -44
@@ -12,7 +12,7 @@ class Node {
12
12
 
13
13
  this.nodeType = nodeType;
14
14
 
15
- this.updateType = NodeUpdateType.None;
15
+ this.updateType = NodeUpdateType.NONE;
16
16
 
17
17
  this.uuid = MathUtils.generateUUID();
18
18
 
@@ -13,7 +13,6 @@ export const shaderStages = [ ...defaultShaderStages, 'compute' ];
13
13
  export const vector = [ 'x', 'y', 'z', 'w' ];
14
14
 
15
15
  const typeFromLength = new Map();
16
- typeFromLength.set( 1, 'float' );
17
16
  typeFromLength.set( 2, 'vec2' );
18
17
  typeFromLength.set( 3, 'vec3' );
19
18
  typeFromLength.set( 4, 'vec4' );
@@ -117,7 +116,7 @@ class NodeBuilder {
117
116
 
118
117
  const updateType = node.getUpdateType( this );
119
118
 
120
- if ( updateType !== NodeUpdateType.None ) {
119
+ if ( updateType !== NodeUpdateType.NONE ) {
121
120
 
122
121
  this.updateNodes.push( node );
123
122
 
@@ -181,6 +180,18 @@ class NodeBuilder {
181
180
 
182
181
  }
183
182
 
183
+ getFragCoord() {
184
+
185
+ console.warn( 'Abstract function.' );
186
+
187
+ }
188
+
189
+ isFlipY() {
190
+
191
+ return false;
192
+
193
+ }
194
+
184
195
  getTexture( /* textureProperty, uvSnippet */ ) {
185
196
 
186
197
  console.warn( 'Abstract function.' );
@@ -353,6 +364,8 @@ class NodeBuilder {
353
364
 
354
365
  type = this.getVectorType( type );
355
366
 
367
+ if ( type === 'float' || type === 'bool' || type === 'int' || type === 'uint' ) return type;
368
+
356
369
  const componentType = /(b|i|u|)(vec|mat)([2-4])/.exec( type );
357
370
 
358
371
  if ( componentType === null ) return null;
@@ -374,9 +387,12 @@ class NodeBuilder {
374
387
 
375
388
  }
376
389
 
377
- getTypeFromLength( length ) {
390
+ getTypeFromLength( length, componentType = 'float' ) {
378
391
 
379
- return typeFromLength.get( length );
392
+ if ( length === 1 ) return componentType;
393
+ const baseType = typeFromLength.get( length );
394
+ const prefix = componentType === 'float' ? '' : componentType[ 0 ];
395
+ return prefix + baseType;
380
396
 
381
397
  }
382
398
 
@@ -400,6 +416,22 @@ class NodeBuilder {
400
416
 
401
417
  }
402
418
 
419
+ changeComponentType( type, newComponentType ) {
420
+
421
+ return this.getTypeFromLength( this.getTypeLength( type ), newComponentType );
422
+
423
+ }
424
+
425
+ getIntegerType( type ) {
426
+
427
+ const componentType = this.getComponentType( type );
428
+
429
+ if ( componentType === 'int' || componentType === 'uint' ) return type;
430
+
431
+ return this.changeComponentType( type, 'int' );
432
+
433
+ }
434
+
403
435
  getDataFromNode( node, shaderStage = this.shaderStage ) {
404
436
 
405
437
  let nodeData = this.nodesData.get( node );
@@ -22,7 +22,7 @@ class NodeFrame {
22
22
 
23
23
  updateNode( node ) {
24
24
 
25
- if ( node.updateType === NodeUpdateType.Frame ) {
25
+ if ( node.updateType === NodeUpdateType.FRAME ) {
26
26
 
27
27
  if ( this.updateMap.get( node ) !== this.frameId ) {
28
28
 
@@ -32,7 +32,7 @@ class NodeFrame {
32
32
 
33
33
  }
34
34
 
35
- } else if ( node.updateType === NodeUpdateType.Object ) {
35
+ } else if ( node.updateType === NodeUpdateType.OBJECT ) {
36
36
 
37
37
  node.update( this );
38
38
 
@@ -1,11 +1,14 @@
1
- class NodeVarying {
1
+ import NodeVar from './NodeVar.js';
2
+
3
+ class NodeVarying extends NodeVar {
2
4
 
3
5
  constructor( name, type ) {
4
6
 
5
- this.isNodeVarying = true;
7
+ super( name, type );
6
8
 
7
- this.name = name;
8
- this.type = type;
9
+ this.needsInterpolation = false;
10
+
11
+ this.isNodeVarying = true;
9
12
 
10
13
  }
11
14
 
@@ -28,22 +28,24 @@ class VaryingNode extends Node {
28
28
 
29
29
  generate( builder ) {
30
30
 
31
+ const { name, node } = this;
31
32
  const type = this.getNodeType( builder );
32
- const node = this.node;
33
- const name = this.name;
34
33
 
35
34
  const nodeVarying = builder.getVaryingFromNode( this, type );
36
35
 
36
+ // this property can be used to check if the varying can be optimized for a var
37
+ nodeVarying.needsInterpolation ||= builder.shaderStage === 'fragment';
38
+
37
39
  if ( name !== null ) {
38
40
 
39
41
  nodeVarying.name = name;
40
42
 
41
43
  }
42
44
 
43
- const propertyName = builder.getPropertyName( nodeVarying, NodeShaderStage.Vertex );
45
+ const propertyName = builder.getPropertyName( nodeVarying, NodeShaderStage.VERTEX );
44
46
 
45
47
  // force node run in vertex stage
46
- builder.flowNodeFromShaderStage( NodeShaderStage.Vertex, node, type, propertyName );
48
+ builder.flowNodeFromShaderStage( NodeShaderStage.VERTEX, node, type, propertyName );
47
49
 
48
50
  return builder.getPropertyName( nodeVarying );
49
51
 
@@ -1,21 +1,21 @@
1
1
  export const NodeShaderStage = {
2
- Vertex: 'vertex',
3
- Fragment: 'fragment'
2
+ VERTEX: 'vertex',
3
+ FRAGMENT: 'fragment'
4
4
  };
5
5
 
6
6
  export const NodeUpdateType = {
7
- None: 'none',
8
- Frame: 'frame',
9
- Object: 'object'
7
+ NONE: 'none',
8
+ FRAME: 'frame',
9
+ OBJECT: 'object'
10
10
  };
11
11
 
12
12
  export const NodeType = {
13
- Boolean: 'bool',
14
- Integer: 'int',
15
- Float: 'float',
16
- Vector2: 'vec2',
17
- Vector3: 'vec3',
18
- Vector4: 'vec4',
19
- Matrix3: 'mat3',
20
- Matrix4: 'mat4'
13
+ BOOLEAN: 'bool',
14
+ INTEGER: 'int',
15
+ FLOAT: 'float',
16
+ VECTOR2: 'vec2',
17
+ VECTOR3: 'vec3',
18
+ VECTOR4: 'vec4',
19
+ MATRIX3: 'mat3',
20
+ MATRIX4: 'mat4'
21
21
  };
@@ -0,0 +1,25 @@
1
+ import TempNode from '../core/Node.js';
2
+ import { mul, floor, reciprocal } from '../shadernode/ShaderNodeBaseElements.js';
3
+
4
+ class PosterizeNode extends TempNode {
5
+
6
+ constructor( sourceNode, stepsNode ) {
7
+
8
+ super();
9
+
10
+ this.sourceNode = sourceNode;
11
+ this.stepsNode = stepsNode;
12
+
13
+ }
14
+
15
+ construct() {
16
+
17
+ const { sourceNode, stepsNode } = this;
18
+
19
+ return mul( floor( mul( sourceNode, stepsNode ) ), reciprocal( stepsNode ) );
20
+
21
+ }
22
+
23
+ }
24
+
25
+ export default PosterizeNode;
@@ -0,0 +1,106 @@
1
+ import Node from '../core/Node.js';
2
+ import { uniform, div, vec2, invert } from '../shadernode/ShaderNodeBaseElements.js';
3
+ import { Vector2 } from 'three';
4
+ import { NodeUpdateType } from '../core/constants.js';
5
+
6
+ let resolution;
7
+
8
+ class ViewportNode extends Node {
9
+
10
+ static COORDINATE = 'coordinate';
11
+ static RESOLUTION = 'resolution';
12
+ static TOP_LEFT = 'topLeft';
13
+ static BOTTOM_LEFT = 'bottomLeft';
14
+ static TOP_RIGHT = 'topRight';
15
+ static BOTTOM_RIGHT = 'bottomRight';
16
+
17
+ constructor( scope ) {
18
+
19
+ super();
20
+
21
+ this.scope = scope;
22
+
23
+ this.isViewportNode = true;
24
+
25
+ }
26
+
27
+ getNodeType() {
28
+
29
+ return this.scope === ViewportNode.COORDINATE ? 'vec4' : 'vec2';
30
+
31
+ }
32
+
33
+ getUpdateType() {
34
+
35
+ let updateType = NodeUpdateType.NONE;
36
+
37
+ if ( this.scope === ViewportNode.RESOLUTION ) {
38
+
39
+ updateType = NodeUpdateType.FRAME;
40
+
41
+ }
42
+
43
+ this.updateType = updateType;
44
+
45
+ return updateType;
46
+
47
+ }
48
+
49
+ update( { renderer } ) {
50
+
51
+ renderer.getSize( resolution );
52
+
53
+ }
54
+
55
+ construct( builder ) {
56
+
57
+ const scope = this.scope;
58
+
59
+ if ( scope === ViewportNode.COORDINATE ) return;
60
+
61
+ let output = null;
62
+
63
+ if ( scope === ViewportNode.RESOLUTION ) {
64
+
65
+ resolution ||= new Vector2();
66
+
67
+ output = uniform( resolution );
68
+
69
+ } else {
70
+
71
+ const coordinateNode = vec2( new ViewportNode( ViewportNode.COORDINATE ) );
72
+ const resolutionNode = new ViewportNode( ViewportNode.RESOLUTION );
73
+
74
+ output = div( coordinateNode, resolutionNode );
75
+
76
+ let outX = output.x;
77
+ let outY = output.y;
78
+
79
+ if ( /top/i.test( scope ) && builder.isFlipY() ) outY = invert( outY );
80
+ else if ( /bottom/i.test( scope ) && builder.isFlipY() === false ) outY = invert( outY );
81
+
82
+ if ( /right/i.test( scope ) ) outX = invert( outX );
83
+
84
+ output = vec2( outX, outY );
85
+
86
+ }
87
+
88
+ return output;
89
+
90
+ }
91
+
92
+ generate( builder ) {
93
+
94
+ if ( this.scope === ViewportNode.COORDINATE ) {
95
+
96
+ return builder.getFragCoord();
97
+
98
+ }
99
+
100
+ return super.generate( builder );
101
+
102
+ }
103
+
104
+ }
105
+
106
+ export default ViewportNode;
@@ -15,7 +15,7 @@ class ComputeNode extends Node {
15
15
  this.workgroupSize = workgroupSize;
16
16
  this.dispatchCount = 0;
17
17
 
18
- this.updateType = NodeUpdateType.Object;
18
+ this.updateType = NodeUpdateType.OBJECT;
19
19
 
20
20
  this.updateDispatchCount();
21
21
 
@@ -10,7 +10,7 @@ class AnalyticLightNode extends LightingNode {
10
10
 
11
11
  super();
12
12
 
13
- this.updateType = NodeUpdateType.Object;
13
+ this.updateType = NodeUpdateType.OBJECT;
14
14
 
15
15
  this.light = light;
16
16
 
@@ -4,6 +4,7 @@ import {
4
4
  LineBasicNodeMaterial,
5
5
  MeshBasicNodeMaterial,
6
6
  MeshStandardNodeMaterial,
7
+ MeshPhysicalNodeMaterial,
7
8
  PointsNodeMaterial,
8
9
  SpriteNodeMaterial
9
10
  } from '../materials/Materials.js';
@@ -17,8 +18,9 @@ MaterialLoader.createMaterialFromType = function ( type ) {
17
18
  LineBasicNodeMaterial,
18
19
  MeshBasicNodeMaterial,
19
20
  MeshStandardNodeMaterial,
21
+ MeshPhysicalNodeMaterial,
20
22
  PointsNodeMaterial,
21
- SpriteNodeMaterial,
23
+ SpriteNodeMaterial
22
24
  };
23
25
 
24
26
  if ( materialLib[ type ] !== undefined ) {
@@ -32,19 +32,21 @@ NodeMaterial.fromMaterial = function ( material ) {
32
32
 
33
33
  if ( materialLib[ type ] === undefined ) {
34
34
 
35
- return material; // is already a node material or cannot be converted
35
+ if ( material.isNodeMaterial !== true ) {
36
36
 
37
- }
37
+ throw new Error( `NodeMaterial: Material "${ material.type }" is not compatible.` );
38
38
 
39
- const nodeMaterial = new materialLib[ type ]( material );
39
+ }
40
40
 
41
- for ( const key in material ) {
41
+ return material; // is already a node material
42
42
 
43
- if ( nodeMaterial[ key ] === undefined ) {
43
+ }
44
44
 
45
- nodeMaterial[ key ] = material[ key ]; // currently this is needed only for material.alphaTest
45
+ const nodeMaterial = new materialLib[ type ]();
46
46
 
47
- }
47
+ for ( const key in material ) {
48
+
49
+ nodeMaterial[ key ] = material[ key ];
48
50
 
49
51
  }
50
52
 
@@ -3,7 +3,7 @@ import { getNodesKeys, getCacheKey } from '../core/NodeUtils.js';
3
3
  import ExpressionNode from '../core/ExpressionNode.js';
4
4
  import {
5
5
  float, vec3, vec4,
6
- assign, label, mul, bypass,
6
+ assign, label, mul, bypass, attribute,
7
7
  positionLocal, skinning, instance, modelViewProjection, lightingContext, colorSpace,
8
8
  materialAlphaTest, materialColor, materialOpacity
9
9
  } from '../shadernode/ShaderNodeElements.js';
@@ -80,6 +80,14 @@ class NodeMaterial extends ShaderMaterial {
80
80
  let colorNode = vec4( this.colorNode || materialColor );
81
81
  let opacityNode = this.opacityNode ? float( this.opacityNode ) : materialOpacity;
82
82
 
83
+ // VERTEX COLORS
84
+
85
+ if ( this.vertexColors === true && builder.geometry.hasAttribute( 'color' ) ) {
86
+
87
+ colorNode = vec4( mul( colorNode.xyz, attribute( 'color' ) ), colorNode.a );
88
+
89
+ }
90
+
83
91
  // COLOR
84
92
 
85
93
  colorNode = builder.addFlow( 'fragment', label( colorNode, 'Color' ) );
@@ -5,7 +5,8 @@ import {
5
5
  mx_fractal_noise_float as fractal_noise_float, mx_fractal_noise_vec2 as fractal_noise_vec2, mx_fractal_noise_vec3 as fractal_noise_vec3, mx_fractal_noise_vec4 as fractal_noise_vec4
6
6
  } from './lib/mx_noise.js';
7
7
  import { mx_hsvtorgb, mx_rgbtohsv } from './lib/mx_hsv.js';
8
- import { nodeObject, float, vec2, vec4, add, sub, mul, mix, clamp, uv, length, smoothstep, dFdx, dFdy, convert } from '../shadernode/ShaderNodeElements.js';
8
+ import { mx_srgb_texture_to_lin_rec709 } from './lib/mx_transform_color.js';
9
+ import { nodeObject, float, vec2, vec4, add, sub, mul, mix, clamp, uv, length, smoothstep, dFdx, dFdy, sign, pow, abs, convert } from '../shadernode/ShaderNodeElements.js';
9
10
 
10
11
  export const mx_aastep = ( threshold, value ) => {
11
12
 
@@ -28,6 +29,9 @@ export const mx_splittb = ( valuet, valueb, center, texcoord = uv() ) => _split(
28
29
 
29
30
  export const mx_transform_uv = ( uv_scale = 1, uv_offset = 0, uv_geo = uv() ) => add( mul( uv_geo, uv_scale ), uv_offset );
30
31
 
32
+ export const mx_safepower = ( in1, in2 = 1 ) => mul( sign( in1 ), pow( abs( in1 ), in2 ) );
33
+ export const mx_contrast = ( input, amount = 1, pivot = .5 ) => add( mul( sub( input, pivot ), amount ), pivot );
34
+
31
35
  export const mx_noise_float = ( texcoord = uv(), amplitude = 1, pivot = 0 ) => add( mul( amplitude, mx_perlin_noise_float( convert( texcoord, 'vec2|vec3' ) ) ), pivot );
32
36
  export const mx_noise_vec2 = ( texcoord = uv(), amplitude = 1, pivot = 0 ) => add( mul( amplitude, mx_perlin_noise_vec2( convert( texcoord, 'vec2|vec3' ) ) ), pivot );
33
37
  export const mx_noise_vec3 = ( texcoord = uv(), amplitude = 1, pivot = 0 ) => add( mul( amplitude, mx_perlin_noise_vec3( convert( texcoord, 'vec2|vec3' ) ) ), pivot );
@@ -52,4 +56,4 @@ export const mx_fractal_noise_vec2 = ( position = uv(), octaves = 3, lacunarity
52
56
  export const mx_fractal_noise_vec3 = ( position = uv(), octaves = 3, lacunarity = 2, diminish = .5, amplitude = 1 ) => mul( fractal_noise_vec3( position, octaves, lacunarity, diminish ), amplitude );
53
57
  export const mx_fractal_noise_vec4 = ( position = uv(), octaves = 3, lacunarity = 2, diminish = .5, amplitude = 1 ) => mul( fractal_noise_vec4( position, octaves, lacunarity, diminish ), amplitude );
54
58
 
55
- export { mx_hsvtorgb, mx_rgbtohsv };
59
+ export { mx_hsvtorgb, mx_rgbtohsv, mx_srgb_texture_to_lin_rec709 };
@@ -0,0 +1,18 @@
1
+ import { code, fn } from '../../Nodes.js';
2
+
3
+ // Original shader code from:
4
+ // https://github.com/AcademySoftwareFoundation/MaterialX/blob/main/libraries/stdlib/genglsl/lib/mx_transform_color.glsl
5
+
6
+ export const mx_transform_color = code( `#define M_AP1_TO_REC709 mat3(1.705079555511475, -0.1297005265951157, -0.02416634373366833, -0.6242334842681885, 1.138468623161316, -0.1246141716837883, -0.0808461606502533, -0.008768022060394287, 1.148780584335327)
7
+
8
+ vec3 mx_srgb_texture_to_lin_rec709(vec3 color)
9
+ {
10
+ bvec3 isAbove = greaterThan(color, vec3(0.04045));
11
+ vec3 linSeg = color / 12.92;
12
+ vec3 powSeg = pow(max(color + vec3(0.055), vec3(0.0)) / 1.055, vec3(2.4));
13
+ return mix(linSeg, powSeg, isAbove);
14
+ }` );
15
+
16
+ const includes = [ mx_transform_color ];
17
+
18
+ export const mx_srgb_texture_to_lin_rec709 = fn( 'vec3 mx_srgb_texture_to_lin_rec709( vec3 color )', includes );
@@ -33,6 +33,7 @@ class MathNode extends TempNode {
33
33
  static DFDX = 'dFdx';
34
34
  static DFDY = 'dFdy';
35
35
  static ROUND = 'round';
36
+ static RECIPROCAL = 'reciprocal';
36
37
 
37
38
  // 2 inputs
38
39
 
@@ -159,6 +160,10 @@ class MathNode extends TempNode {
159
160
 
160
161
  return builder.format( '( 1.0 - ' + a.build( builder, inputType ) + ' )', type, output );
161
162
 
163
+ } else if ( method === MathNode.RECIPROCAL ) {
164
+
165
+ return builder.format( '( 1.0 / ' + a.build( builder, inputType ) + ' )', type, output );
166
+
162
167
  } else {
163
168
 
164
169
  const params = [];
@@ -47,7 +47,7 @@ class OperatorNode extends TempNode {
47
47
 
48
48
  } else if ( op === '&' || op === '|' || op === '^' || op === '>>' || op === '<<' ) {
49
49
 
50
- return 'int';
50
+ return builder.getIntegerType( typeA );
51
51
 
52
52
  } else if ( op === '==' || op === '&&' || op === '||' || op === '^^' ) {
53
53
 
@@ -124,6 +124,11 @@ class OperatorNode extends TempNode {
124
124
 
125
125
  }
126
126
 
127
+ } else if ( op === '>>' || op === '<<' ) {
128
+
129
+ typeA = type;
130
+ typeB = builder.changeComponentType( typeB, 'uint' );
131
+
127
132
  } else if ( builder.isMatrix( typeA ) && builder.isVector( typeB ) ) {
128
133
 
129
134
  // matrix x vector
@@ -1,3 +1,4 @@
1
+ import Node from '../core/Node.js';
1
2
  import ArrayElementNode from '../utils/ArrayElementNode.js';
2
3
  import ConvertNode from '../utils/ConvertNode.js';
3
4
  import JoinNode from '../utils/JoinNode.js';
@@ -147,31 +148,43 @@ const ShaderNodeImmutable = function ( NodeClass, ...params ) {
147
148
 
148
149
  };
149
150
 
150
- const ShaderNodeScript = function ( jsFunc ) {
151
+ class ShaderNodeInternal extends Node {
152
+
153
+ constructor( jsFunc ) {
151
154
 
152
- // @TODO: Move this to Node extended class
155
+ super();
153
156
 
154
- const self = {
157
+ this._jsFunc = jsFunc;
155
158
 
156
- build: ( builder ) => {
159
+ }
157
160
 
158
- self.call( {}, builder );
161
+ call( inputs, builder ) {
159
162
 
160
- return '';
163
+ inputs = nodeObjects( inputs );
164
+
165
+ return nodeObject( this._jsFunc( inputs, builder ) );
166
+
167
+ }
161
168
 
162
- },
169
+ generate( builder, output ) {
163
170
 
164
- call: ( inputs, builder ) => {
171
+ const nodeCall = this.call( {}, builder );
165
172
 
166
- inputs = nodeObjects( inputs );
173
+ if ( nodeCall === undefined ) {
167
174
 
168
- return nodeObject( jsFunc( inputs, builder ) );
175
+ return '';
169
176
 
170
177
  }
171
178
 
172
- };
179
+ return builder.format( nodeCall.build( builder ), nodeCall.getNodeType( builder ), output );
180
+
181
+ }
182
+
183
+ }
184
+
185
+ const ShaderNodeScript = function ( jsFunc ) {
173
186
 
174
- return self;
187
+ return new ShaderNodeInternal( jsFunc );
175
188
 
176
189
  };
177
190
 
@@ -253,7 +266,7 @@ export const ConvertType = function ( type, cacheMap = null ) {
253
266
 
254
267
  }
255
268
 
256
- return nodeObject( new ConvertNode( new JoinNode( nodes ), type ) );
269
+ return nodeObject( new JoinNode( nodes, type ) );
257
270
 
258
271
  }
259
272
 
@@ -181,6 +181,7 @@ export const invert = nodeProxy( MathNode, MathNode.INVERT );
181
181
  export const dFdx = nodeProxy( MathNode, MathNode.DFDX );
182
182
  export const dFdy = nodeProxy( MathNode, MathNode.DFDY );
183
183
  export const round = nodeProxy( MathNode, MathNode.ROUND );
184
+ export const reciprocal = nodeProxy( MathNode, MathNode.RECIPROCAL );
184
185
 
185
186
  export const atan2 = nodeProxy( MathNode, MathNode.ATAN2 );
186
187
  export const min = nodeProxy( MathNode, MathNode.MIN );
@@ -265,6 +266,7 @@ export const modelViewPosition = nodeImmutable( ModelNode, ModelNode.VIEW_POSITI
265
266
  export const positionGeometry = nodeImmutable( PositionNode, PositionNode.GEOMETRY );
266
267
  export const positionLocal = nodeImmutable( PositionNode, PositionNode.LOCAL );
267
268
  export const positionWorld = nodeImmutable( PositionNode, PositionNode.WORLD );
269
+ export const positionWorldDirection = nodeImmutable( PositionNode, PositionNode.WORLD_DIRECTION );
268
270
  export const positionView = nodeImmutable( PositionNode, PositionNode.VIEW );
269
271
  export const positionViewDirection = nodeImmutable( PositionNode, PositionNode.VIEW_DIRECTION );
270
272
 
@@ -9,7 +9,9 @@ import BlendModeNode from '../display/BlendModeNode.js';
9
9
  import ColorAdjustmentNode from '../display/ColorAdjustmentNode.js';
10
10
  import ColorSpaceNode from '../display/ColorSpaceNode.js';
11
11
  import NormalMapNode from '../display/NormalMapNode.js';
12
+ import PosterizeNode from '../display/PosterizeNode.js';
12
13
  import ToneMappingNode from '../display/ToneMappingNode.js';
14
+ import ViewportNode from '../display/ViewportNode.js';
13
15
 
14
16
  // lighting
15
17
  import LightsNode from '../lighting/LightsNode.js';
@@ -17,6 +19,7 @@ import LightsNode from '../lighting/LightsNode.js';
17
19
  import LightingContextNode from '../lighting/LightingContextNode.js';
18
20
 
19
21
  // utils
22
+ import EquirectUVNode from '../utils/EquirectUVNode.js';
20
23
  import MatcapUVNode from '../utils/MatcapUVNode.js';
21
24
  import MaxMipLevelNode from '../utils/MaxMipLevelNode.js';
22
25
  import OscNode from '../utils/OscNode.js';
@@ -24,6 +27,7 @@ import RemapNode from '../utils/RemapNode.js';
24
27
  import RotateUVNode from '../utils/RotateUVNode.js';
25
28
  import SpriteSheetUVNode from '../utils/SpriteSheetUVNode.js';
26
29
  import TimerNode from '../utils/TimerNode.js';
30
+ import TriplanarTexturesNode from '../utils/TriplanarTexturesNode.js';
27
31
 
28
32
  // geometry
29
33
  import RangeNode from '../geometry/RangeNode.js';
@@ -87,6 +91,15 @@ export const colorSpace = ( node, encoding ) => nodeObject( new ColorSpaceNode(
87
91
  export const normalMap = nodeProxy( NormalMapNode );
88
92
  export const toneMapping = ( mapping, exposure, color ) => nodeObject( new ToneMappingNode( mapping, nodeObject( exposure ), nodeObject( color ) ) );
89
93
 
94
+ export const posterize = nodeProxy( PosterizeNode );
95
+
96
+ export const viewportCoordinate = nodeImmutable( ViewportNode, ViewportNode.COORDINATE );
97
+ export const viewportResolution = nodeImmutable( ViewportNode, ViewportNode.RESOLUTION );
98
+ export const viewportTopLeft = nodeImmutable( ViewportNode, ViewportNode.TOP_LEFT );
99
+ export const viewportBottomLeft = nodeImmutable( ViewportNode, ViewportNode.BOTTOM_LEFT );
100
+ export const viewportTopRight = nodeImmutable( ViewportNode, ViewportNode.TOP_RIGHT );
101
+ export const viewportBottomRight = nodeImmutable( ViewportNode, ViewportNode.BOTTOM_RIGHT );
102
+
90
103
  // lighting
91
104
 
92
105
  //export const lighting = nodeProxy( LightingNode ); // abstract
@@ -97,6 +110,8 @@ export const lightingContext = nodeProxy( LightingContextNode );
97
110
  // utils
98
111
 
99
112
  export const matcapUV = nodeImmutable( MatcapUVNode );
113
+ export const equirectUV = nodeProxy( EquirectUVNode );
114
+
100
115
  export const maxMipLevel = nodeProxy( MaxMipLevelNode );
101
116
 
102
117
  export const oscSine = nodeProxy( OscNode, OscNode.SINE );
@@ -117,6 +132,9 @@ export const timerGlobal = ( timeScale, value = 0 ) => nodeObject( new TimerNode
117
132
  export const timerDelta = ( timeScale, value = 0 ) => nodeObject( new TimerNode( TimerNode.DELTA, timeScale, value ) );
118
133
  export const frameId = nodeImmutable( TimerNode, TimerNode.FRAME );
119
134
 
135
+ export const triplanarTextures = nodeProxy( TriplanarTexturesNode );
136
+ export const triplanarTexture = ( texture, ...params ) => triplanarTextures( texture, texture, texture, ...params );
137
+
120
138
  // geometry
121
139
 
122
140
  export const range = ( min, max ) => nodeObject( new RangeNode( min, max ) );