super-three 0.157.1 → 0.160.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (303) hide show
  1. package/README.md +6 -4
  2. package/build/three.cjs +3100 -1537
  3. package/build/three.js +3100 -1537
  4. package/build/three.min.js +1 -1
  5. package/build/three.module.js +3093 -1538
  6. package/build/three.module.min.js +1 -1
  7. package/examples/jsm/Addons.js +291 -0
  8. package/examples/jsm/controls/FlyControls.js +26 -0
  9. package/examples/jsm/controls/OrbitControls.js +62 -41
  10. package/examples/jsm/controls/TransformControls.js +27 -11
  11. package/examples/jsm/csm/CSMShader.js +53 -48
  12. package/examples/jsm/exporters/GLTFExporter.js +151 -3
  13. package/examples/jsm/exporters/USDZExporter.js +27 -19
  14. package/examples/jsm/geometries/InstancedPointsGeometry.js +174 -0
  15. package/examples/jsm/geometries/SDFGeometryGenerator.js +144 -0
  16. package/examples/jsm/helpers/TextureHelper.js +237 -0
  17. package/examples/jsm/interactive/HTMLMesh.js +9 -2
  18. package/examples/jsm/libs/lottie_canvas.module.js +6 -1
  19. package/examples/jsm/libs/opentype.module.js +13 -75
  20. package/examples/jsm/libs/surfaceNet.js +201 -0
  21. package/examples/jsm/lines/LineMaterial.js +16 -33
  22. package/examples/jsm/loaders/ColladaLoader.js +0 -6
  23. package/examples/jsm/loaders/DRACOLoader.js +4 -3
  24. package/examples/jsm/loaders/FBXLoader.js +294 -124
  25. package/examples/jsm/loaders/GLTFLoader.js +83 -6
  26. package/examples/jsm/loaders/LUTImageLoader.js +162 -0
  27. package/examples/jsm/loaders/MaterialXLoader.js +73 -54
  28. package/examples/jsm/loaders/NRRDLoader.js +0 -13
  29. package/examples/jsm/loaders/SVGLoader.js +4 -4
  30. package/examples/jsm/loaders/USDZLoader.js +3 -17
  31. package/examples/jsm/loaders/lwo/IFFParser.js +89 -93
  32. package/examples/jsm/materials/MeshGouraudMaterial.js +2 -0
  33. package/examples/jsm/math/Capsule.js +0 -55
  34. package/examples/jsm/math/Octree.js +85 -7
  35. package/examples/jsm/misc/Timer.js +119 -0
  36. package/examples/jsm/misc/TubePainter.js +3 -6
  37. package/examples/jsm/modifiers/CurveModifier.js +20 -2
  38. package/examples/jsm/modifiers/SimplifyModifier.js +103 -11
  39. package/examples/jsm/modifiers/TessellateModifier.js +3 -3
  40. package/examples/jsm/nodes/Nodes.js +16 -12
  41. package/examples/jsm/nodes/accessors/CameraNode.js +18 -2
  42. package/examples/jsm/nodes/accessors/CubeTextureNode.js +5 -73
  43. package/examples/jsm/nodes/accessors/InstanceNode.js +3 -3
  44. package/examples/jsm/nodes/accessors/InstancedPointsMaterialNode.js +21 -0
  45. package/examples/jsm/nodes/accessors/MaterialNode.js +68 -31
  46. package/examples/jsm/nodes/accessors/MaterialReferenceNode.js +11 -2
  47. package/examples/jsm/nodes/accessors/ModelNode.js +1 -2
  48. package/examples/jsm/nodes/accessors/ModelViewProjectionNode.js +12 -3
  49. package/examples/jsm/nodes/accessors/MorphNode.js +191 -16
  50. package/examples/jsm/nodes/accessors/NormalNode.js +1 -1
  51. package/examples/jsm/nodes/accessors/PositionNode.js +1 -1
  52. package/examples/jsm/nodes/accessors/ReferenceNode.js +25 -1
  53. package/examples/jsm/nodes/accessors/SkinningNode.js +13 -3
  54. package/examples/jsm/nodes/accessors/TextureNode.js +123 -37
  55. package/examples/jsm/nodes/code/CodeNode.js +3 -3
  56. package/examples/jsm/nodes/code/FunctionNode.js +1 -1
  57. package/examples/jsm/nodes/core/AssignNode.js +72 -0
  58. package/examples/jsm/nodes/core/AttributeNode.js +7 -1
  59. package/examples/jsm/nodes/core/CacheNode.js +4 -1
  60. package/examples/jsm/nodes/core/ConstNode.js +1 -1
  61. package/examples/jsm/nodes/core/LightingModel.js +3 -1
  62. package/examples/jsm/nodes/core/Node.js +13 -15
  63. package/examples/jsm/nodes/core/NodeBuilder.js +209 -42
  64. package/examples/jsm/nodes/core/NodeFrame.js +10 -8
  65. package/examples/jsm/nodes/core/NodeUniform.js +12 -0
  66. package/examples/jsm/nodes/core/NodeUtils.js +7 -9
  67. package/examples/jsm/nodes/core/OutputStructNode.js +4 -4
  68. package/examples/jsm/nodes/core/ParameterNode.js +33 -0
  69. package/examples/jsm/nodes/core/PropertyNode.js +15 -6
  70. package/examples/jsm/nodes/core/StackNode.js +7 -17
  71. package/examples/jsm/nodes/core/StructTypeNode.js +4 -4
  72. package/examples/jsm/nodes/core/TempNode.js +1 -1
  73. package/examples/jsm/nodes/core/UniformGroup.js +13 -0
  74. package/examples/jsm/nodes/core/UniformGroupNode.js +36 -0
  75. package/examples/jsm/nodes/core/UniformNode.js +17 -0
  76. package/examples/jsm/nodes/core/VarNode.js +7 -34
  77. package/examples/jsm/nodes/core/VaryingNode.js +3 -7
  78. package/examples/jsm/nodes/display/BumpMapNode.js +35 -13
  79. package/examples/jsm/nodes/display/ColorAdjustmentNode.js +6 -10
  80. package/examples/jsm/nodes/display/GaussianBlurNode.js +170 -0
  81. package/examples/jsm/nodes/display/NormalMapNode.js +3 -1
  82. package/examples/jsm/nodes/display/PassNode.js +182 -0
  83. package/examples/jsm/nodes/display/ViewportDepthNode.js +31 -3
  84. package/examples/jsm/nodes/display/ViewportDepthTextureNode.js +2 -2
  85. package/examples/jsm/nodes/display/ViewportNode.js +17 -10
  86. package/examples/jsm/nodes/functions/BSDF/BRDF_Sheen.js +20 -6
  87. package/examples/jsm/nodes/functions/BSDF/DFGApprox.js +8 -7
  88. package/examples/jsm/nodes/functions/BSDF/D_GGX.js +8 -3
  89. package/examples/jsm/nodes/functions/BSDF/Schlick_to_F0.js +8 -0
  90. package/examples/jsm/nodes/functions/BSDF/V_GGX_SmithCorrelated.js +8 -0
  91. package/examples/jsm/nodes/functions/PhysicalLightingModel.js +93 -43
  92. package/examples/jsm/nodes/gpgpu/ComputeNode.js +2 -2
  93. package/examples/jsm/nodes/lighting/AmbientLightNode.js +1 -1
  94. package/examples/jsm/nodes/lighting/AnalyticLightNode.js +55 -6
  95. package/examples/jsm/nodes/lighting/DirectionalLightNode.js +1 -1
  96. package/examples/jsm/nodes/lighting/EnvironmentNode.js +8 -18
  97. package/examples/jsm/nodes/lighting/LightingContextNode.js +21 -57
  98. package/examples/jsm/nodes/lighting/LightsNode.js +80 -20
  99. package/examples/jsm/nodes/lighting/PointLightNode.js +1 -1
  100. package/examples/jsm/nodes/lighting/SpotLightNode.js +1 -1
  101. package/examples/jsm/nodes/materials/InstancedPointsNodeMaterial.js +162 -0
  102. package/examples/jsm/nodes/materials/Line2NodeMaterial.js +76 -77
  103. package/examples/jsm/nodes/materials/LineDashedNodeMaterial.js +5 -5
  104. package/examples/jsm/nodes/materials/Materials.js +1 -0
  105. package/examples/jsm/nodes/materials/MeshBasicNodeMaterial.js +1 -0
  106. package/examples/jsm/nodes/materials/MeshNormalNodeMaterial.js +3 -3
  107. package/examples/jsm/nodes/materials/MeshPhongNodeMaterial.js +3 -3
  108. package/examples/jsm/nodes/materials/MeshPhysicalNodeMaterial.js +47 -20
  109. package/examples/jsm/nodes/materials/MeshStandardNodeMaterial.js +6 -6
  110. package/examples/jsm/nodes/materials/NodeMaterial.js +82 -60
  111. package/examples/jsm/nodes/materials/PointsNodeMaterial.js +0 -10
  112. package/examples/jsm/nodes/materials/SpriteNodeMaterial.js +0 -7
  113. package/examples/jsm/nodes/materialx/MaterialXNodes.js +10 -10
  114. package/examples/jsm/nodes/materialx/lib/mx_hsv.js +128 -54
  115. package/examples/jsm/nodes/materialx/lib/mx_noise.js +1430 -618
  116. package/examples/jsm/nodes/materialx/lib/mx_transform_color.js +24 -14
  117. package/examples/jsm/nodes/math/MathNode.js +2 -0
  118. package/examples/jsm/nodes/math/OperatorNode.js +24 -27
  119. package/examples/jsm/nodes/shadernode/ShaderNode.js +158 -10
  120. package/examples/jsm/nodes/utils/ArrayElementNode.js +2 -0
  121. package/examples/jsm/nodes/utils/DiscardNode.js +3 -2
  122. package/examples/jsm/nodes/utils/FunctionOverloadingNode.js +95 -0
  123. package/examples/jsm/nodes/utils/JoinNode.js +11 -1
  124. package/examples/jsm/nodes/utils/LoopNode.js +36 -24
  125. package/examples/jsm/nodes/utils/RemapNode.js +2 -2
  126. package/examples/jsm/nodes/utils/SplitNode.js +10 -2
  127. package/examples/jsm/nodes/utils/TriplanarTexturesNode.js +3 -3
  128. package/examples/jsm/objects/InstancedPoints.js +21 -0
  129. package/examples/jsm/objects/Lensflare.js +20 -0
  130. package/examples/jsm/objects/QuadMesh.js +60 -0
  131. package/examples/jsm/objects/ReflectorForSSRPass.js +3 -0
  132. package/examples/jsm/objects/Refractor.js +3 -0
  133. package/examples/jsm/objects/Sky.js +5 -3
  134. package/examples/jsm/objects/Water.js +5 -2
  135. package/examples/jsm/objects/Water2.js +3 -0
  136. package/examples/jsm/physics/AmmoPhysics.js +21 -0
  137. package/examples/jsm/physics/RapierPhysics.js +21 -0
  138. package/examples/jsm/postprocessing/BokehPass.js +3 -2
  139. package/examples/jsm/postprocessing/GTAOPass.js +572 -0
  140. package/examples/jsm/postprocessing/LUTPass.js +2 -1
  141. package/examples/jsm/postprocessing/OutputPass.js +3 -0
  142. package/examples/jsm/postprocessing/Pass.js +14 -3
  143. package/examples/jsm/postprocessing/SAOPass.js +0 -1
  144. package/examples/jsm/postprocessing/SMAAPass.js +0 -2
  145. package/examples/jsm/postprocessing/TAARenderPass.js +1 -2
  146. package/examples/jsm/renderers/CSS3DRenderer.js +3 -9
  147. package/examples/jsm/renderers/SVGRenderer.js +9 -6
  148. package/examples/jsm/renderers/common/Animation.js +10 -21
  149. package/examples/jsm/renderers/common/Backend.js +19 -3
  150. package/examples/jsm/renderers/common/Background.js +20 -22
  151. package/examples/jsm/renderers/common/Bindings.js +31 -22
  152. package/examples/jsm/renderers/common/ChainMap.js +3 -3
  153. package/examples/jsm/renderers/common/Color4.js +37 -0
  154. package/examples/jsm/renderers/common/Geometries.js +4 -4
  155. package/examples/jsm/renderers/common/Info.js +12 -2
  156. package/examples/jsm/renderers/common/Pipelines.js +3 -51
  157. package/examples/jsm/renderers/common/PostProcessing.js +25 -0
  158. package/examples/jsm/renderers/common/RenderContext.js +1 -1
  159. package/examples/jsm/renderers/common/RenderContexts.js +1 -1
  160. package/examples/jsm/renderers/common/RenderObject.js +21 -2
  161. package/examples/jsm/renderers/common/RenderObjects.js +5 -3
  162. package/examples/jsm/renderers/common/Renderer.js +137 -37
  163. package/examples/jsm/renderers/common/StorageTexture.js +1 -0
  164. package/examples/jsm/renderers/common/Textures.js +8 -37
  165. package/examples/jsm/renderers/common/nodes/NodeBuilderState.js +10 -2
  166. package/examples/jsm/renderers/common/nodes/NodeUniformsGroup.js +44 -0
  167. package/examples/jsm/renderers/common/nodes/Nodes.js +121 -19
  168. package/examples/jsm/renderers/webgl/WebGLBackend.js +366 -67
  169. package/examples/jsm/renderers/webgl/nodes/GLSLNodeBuilder.js +183 -38
  170. package/examples/jsm/renderers/webgl/utils/WebGLAttributeUtils.js +92 -5
  171. package/examples/jsm/renderers/webgl/utils/WebGLCapabilities.js +36 -0
  172. package/examples/jsm/renderers/webgl/utils/WebGLExtensions.js +11 -1
  173. package/examples/jsm/renderers/webgl/utils/WebGLState.js +14 -2
  174. package/examples/jsm/renderers/webgl/utils/WebGLTextureUtils.js +71 -2
  175. package/examples/jsm/renderers/webgl/utils/WebGLUtils.js +42 -0
  176. package/examples/jsm/renderers/webgl-legacy/nodes/SlotNode.js +1 -1
  177. package/examples/jsm/renderers/webgl-legacy/nodes/WebGLNodeBuilder.js +33 -3
  178. package/examples/jsm/renderers/webgl-legacy/nodes/WebGLNodes.js +4 -14
  179. package/examples/jsm/renderers/webgpu/WebGPUBackend.js +188 -137
  180. package/examples/jsm/renderers/webgpu/WebGPURenderer.js +1 -1
  181. package/examples/jsm/renderers/webgpu/nodes/WGSLNodeBuilder.js +241 -90
  182. package/examples/jsm/renderers/webgpu/utils/WebGPUAttributeUtils.js +15 -10
  183. package/examples/jsm/renderers/webgpu/utils/WebGPUBindingUtils.js +11 -3
  184. package/examples/jsm/renderers/webgpu/utils/WebGPUPipelineUtils.js +2 -3
  185. package/examples/jsm/renderers/webgpu/utils/WebGPUTextureUtils.js +88 -6
  186. package/examples/jsm/shaders/ACESFilmicToneMappingShader.js +2 -0
  187. package/examples/jsm/shaders/AfterimageShader.js +2 -0
  188. package/examples/jsm/shaders/BasicShader.js +2 -0
  189. package/examples/jsm/shaders/BlendShader.js +2 -0
  190. package/examples/jsm/shaders/BokehShader.js +2 -0
  191. package/examples/jsm/shaders/BokehShader2.js +4 -0
  192. package/examples/jsm/shaders/BrightnessContrastShader.js +2 -0
  193. package/examples/jsm/shaders/ColorCorrectionShader.js +2 -0
  194. package/examples/jsm/shaders/DOFMipMapShader.js +2 -0
  195. package/examples/jsm/shaders/DepthLimitedBlurShader.js +5 -0
  196. package/examples/jsm/shaders/FXAAShader.js +135 -133
  197. package/examples/jsm/shaders/FilmShader.js +1 -1
  198. package/examples/jsm/shaders/FocusShader.js +2 -0
  199. package/examples/jsm/shaders/FreiChenShader.js +2 -0
  200. package/examples/jsm/shaders/GTAOShader.js +424 -0
  201. package/examples/jsm/shaders/GodRaysShader.js +8 -0
  202. package/examples/jsm/shaders/HalftoneShader.js +2 -0
  203. package/examples/jsm/shaders/HorizontalTiltShiftShader.js +2 -0
  204. package/examples/jsm/shaders/HueSaturationShader.js +2 -0
  205. package/examples/jsm/shaders/KaleidoShader.js +2 -0
  206. package/examples/jsm/shaders/LuminosityHighPassShader.js +2 -0
  207. package/examples/jsm/shaders/LuminosityShader.js +2 -0
  208. package/examples/jsm/shaders/MMDToonShader.js +2 -0
  209. package/examples/jsm/shaders/MirrorShader.js +2 -0
  210. package/examples/jsm/shaders/NormalMapShader.js +2 -0
  211. package/examples/jsm/shaders/OutputShader.js +8 -5
  212. package/examples/jsm/shaders/PoissonDenoiseShader.js +226 -0
  213. package/examples/jsm/shaders/SAOShader.js +7 -3
  214. package/examples/jsm/shaders/SMAAShader.js +6 -0
  215. package/examples/jsm/shaders/SSAOShader.js +8 -3
  216. package/examples/jsm/shaders/SSRShader.js +6 -0
  217. package/examples/jsm/shaders/SobelOperatorShader.js +2 -0
  218. package/examples/jsm/shaders/SubsurfaceScatteringShader.js +2 -0
  219. package/examples/jsm/shaders/TechnicolorShader.js +2 -0
  220. package/examples/jsm/shaders/TriangleBlurShader.js +2 -0
  221. package/examples/jsm/shaders/UnpackDepthRGBAShader.js +2 -0
  222. package/examples/jsm/shaders/VelocityShader.js +2 -0
  223. package/examples/jsm/shaders/VerticalTiltShiftShader.js +2 -0
  224. package/examples/jsm/shaders/WaterRefractionShader.js +2 -0
  225. package/examples/jsm/transpiler/AST.js +270 -0
  226. package/examples/jsm/transpiler/GLSLDecoder.js +941 -0
  227. package/examples/jsm/transpiler/ShaderToyDecoder.js +49 -0
  228. package/examples/jsm/transpiler/TSLEncoder.js +715 -0
  229. package/examples/jsm/transpiler/Transpiler.js +18 -0
  230. package/examples/jsm/utils/SortUtils.js +158 -0
  231. package/examples/jsm/utils/TextureUtils.js +33 -21
  232. package/examples/jsm/webxr/ARButton.js +14 -0
  233. package/examples/jsm/webxr/VRButton.js +24 -9
  234. package/examples/jsm/webxr/XRButton.js +27 -11
  235. package/examples/jsm/webxr/XREstimatedLight.js +1 -1
  236. package/package.json +8 -6
  237. package/src/Three.js +1 -0
  238. package/src/constants.js +8 -1
  239. package/src/core/BufferAttribute.js +21 -2
  240. package/src/core/InterleavedBuffer.js +21 -1
  241. package/src/core/Object3D.js +60 -12
  242. package/src/core/UniformsGroup.js +7 -1
  243. package/src/extras/PMREMGenerator.js +7 -1
  244. package/src/extras/curves/LineCurve3.js +4 -0
  245. package/src/loaders/AudioLoader.js +1 -1
  246. package/src/loaders/BufferGeometryLoader.js +0 -7
  247. package/src/loaders/ImageBitmapLoader.js +25 -1
  248. package/src/loaders/MaterialLoader.js +10 -2
  249. package/src/loaders/ObjectLoader.js +49 -0
  250. package/src/materials/Material.js +27 -13
  251. package/src/materials/ShaderMaterial.js +2 -1
  252. package/src/math/Box3.js +35 -18
  253. package/src/math/ColorManagement.js +0 -16
  254. package/src/math/Quaternion.js +5 -4
  255. package/src/math/Sphere.js +2 -0
  256. package/src/math/Triangle.js +17 -5
  257. package/src/math/Vector3.js +11 -12
  258. package/src/objects/BatchedMesh.js +1020 -0
  259. package/src/objects/Skeleton.js +1 -3
  260. package/src/objects/SkinnedMesh.js +6 -7
  261. package/src/renderers/WebGL3DRenderTarget.js +2 -2
  262. package/src/renderers/WebGLArrayRenderTarget.js +2 -2
  263. package/src/renderers/WebGLRenderer.js +165 -43
  264. package/src/renderers/shaders/ShaderChunk/aomap_fragment.glsl.js +8 -0
  265. package/src/renderers/shaders/ShaderChunk/batching_pars_vertex.glsl.js +19 -0
  266. package/src/renderers/shaders/ShaderChunk/batching_vertex.glsl.js +5 -0
  267. package/src/renderers/shaders/ShaderChunk/bumpmap_pars_fragment.glsl.js +3 -2
  268. package/src/renderers/shaders/ShaderChunk/cube_uv_reflection_fragment.glsl.js +0 -5
  269. package/src/renderers/shaders/ShaderChunk/defaultnormal_vertex.glsl.js +31 -4
  270. package/src/renderers/shaders/ShaderChunk/lights_fragment_begin.glsl.js +1 -1
  271. package/src/renderers/shaders/ShaderChunk/lights_physical_fragment.glsl.js +9 -4
  272. package/src/renderers/shaders/ShaderChunk/lights_physical_pars_fragment.glsl.js +8 -6
  273. package/src/renderers/shaders/ShaderChunk/project_vertex.glsl.js +6 -0
  274. package/src/renderers/shaders/ShaderChunk/skinning_pars_vertex.glsl.js +9 -17
  275. package/src/renderers/shaders/ShaderChunk/tonemapping_pars_fragment.glsl.js +84 -0
  276. package/src/renderers/shaders/ShaderChunk/worldpos_vertex.glsl.js +6 -0
  277. package/src/renderers/shaders/ShaderChunk.js +4 -0
  278. package/src/renderers/shaders/ShaderLib/depth.glsl.js +2 -0
  279. package/src/renderers/shaders/ShaderLib/distanceRGBA.glsl.js +2 -0
  280. package/src/renderers/shaders/ShaderLib/meshbasic.glsl.js +2 -0
  281. package/src/renderers/shaders/ShaderLib/meshlambert.glsl.js +2 -0
  282. package/src/renderers/shaders/ShaderLib/meshmatcap.glsl.js +3 -0
  283. package/src/renderers/shaders/ShaderLib/meshnormal.glsl.js +2 -0
  284. package/src/renderers/shaders/ShaderLib/meshphong.glsl.js +2 -0
  285. package/src/renderers/shaders/ShaderLib/meshphysical.glsl.js +4 -2
  286. package/src/renderers/shaders/ShaderLib/meshtoon.glsl.js +2 -0
  287. package/src/renderers/shaders/ShaderLib/shadow.glsl.js +3 -0
  288. package/src/renderers/webgl/WebGLAttributes.js +39 -5
  289. package/src/renderers/webgl/WebGLBufferRenderer.js +31 -0
  290. package/src/renderers/webgl/WebGLCubeMaps.js +1 -1
  291. package/src/renderers/webgl/WebGLExtensions.js +1 -0
  292. package/src/renderers/webgl/WebGLIndexedBufferRenderer.js +31 -0
  293. package/src/renderers/webgl/WebGLLights.js +11 -2
  294. package/src/renderers/webgl/WebGLProgram.js +100 -51
  295. package/src/renderers/webgl/WebGLPrograms.js +8 -0
  296. package/src/renderers/webgl/WebGLShadowMap.js +35 -0
  297. package/src/renderers/webgl/WebGLState.js +25 -4
  298. package/src/renderers/webgl/WebGLTextures.js +7 -11
  299. package/src/renderers/webgl/WebGLUniforms.js +11 -1
  300. package/src/renderers/webgl/WebGLUniformsGroups.js +72 -93
  301. package/src/renderers/webxr/WebXRManager.js +16 -0
  302. package/examples/jsm/nodes/accessors/ExtendedMaterialNode.js +0 -76
  303. package/examples/jsm/nodes/accessors/LineMaterialNode.js +0 -29
@@ -1,19 +1,29 @@
1
- import { glsl } from '../../code/CodeNode.js';
2
- import { glslFn } from '../../code/FunctionNode.js';
3
-
4
- // Original shader code from:
1
+ // Three.js Transpiler
5
2
  // https://github.com/AcademySoftwareFoundation/MaterialX/blob/main/libraries/stdlib/genglsl/lib/mx_transform_color.glsl
6
3
 
7
- export const mx_transform_color = glsl( `#define M_AP1_TO_REC709 mat3(1.705079555511475, -0.1297005265951157, -0.02416634373366833, -0.6242334842681885, 1.138468623161316, -0.1246141716837883, -0.0808461606502533, -0.008768022060394287, 1.148780584335327)
4
+ import { bvec3, vec3, tslFn } from '../../shadernode/ShaderNode.js';
5
+ import { greaterThan } from '../../math/OperatorNode.js';
6
+ import { max, pow, mix } from '../../math/MathNode.js';
7
+
8
+ const mx_srgb_texture_to_lin_rec709 = tslFn( ( [ color_immutable ] ) => {
9
+
10
+ const color = vec3( color_immutable ).toVar();
11
+ const isAbove = bvec3( greaterThan( color, vec3( 0.04045 ) ) ).toVar();
12
+ const linSeg = vec3( color.div( 12.92 ) ).toVar();
13
+ const powSeg = vec3( pow( max( color.add( vec3( 0.055 ) ), vec3( 0.0 ) ).div( 1.055 ), vec3( 2.4 ) ) ).toVar();
14
+
15
+ return mix( linSeg, powSeg, isAbove );
16
+
17
+ } );
8
18
 
9
- vec3 mx_srgb_texture_to_lin_rec709(vec3 color)
10
- {
11
- bvec3 isAbove = greaterThan(color, vec3(0.04045));
12
- vec3 linSeg = color / 12.92;
13
- vec3 powSeg = pow(max(color + vec3(0.055), vec3(0.0)) / 1.055, vec3(2.4));
14
- return mix(linSeg, powSeg, isAbove);
15
- }` );
19
+ // layouts
16
20
 
17
- const includes = [ mx_transform_color ];
21
+ mx_srgb_texture_to_lin_rec709.setLayout( {
22
+ name: 'mx_srgb_texture_to_lin_rec709',
23
+ type: 'vec3',
24
+ inputs: [
25
+ { name: 'color', type: 'vec3' }
26
+ ]
27
+ } );
18
28
 
19
- export const mx_srgb_texture_to_lin_rec709 = glslFn( 'vec3 mx_srgb_texture_to_lin_rec709( vec3 color )', includes );
29
+ export { mx_srgb_texture_to_lin_rec709 };
@@ -220,6 +220,7 @@ MathNode.ROUND = 'round';
220
220
  MathNode.RECIPROCAL = 'reciprocal';
221
221
  MathNode.TRUNC = 'trunc';
222
222
  MathNode.FWIDTH = 'fwidth';
223
+ MathNode.BITCAST = 'bitcast';
223
224
 
224
225
  // 2 inputs
225
226
 
@@ -278,6 +279,7 @@ export const round = nodeProxy( MathNode, MathNode.ROUND );
278
279
  export const reciprocal = nodeProxy( MathNode, MathNode.RECIPROCAL );
279
280
  export const trunc = nodeProxy( MathNode, MathNode.TRUNC );
280
281
  export const fwidth = nodeProxy( MathNode, MathNode.FWIDTH );
282
+ export const bitcast = nodeProxy( MathNode, MathNode.BITCAST );
281
283
 
282
284
  export const atan2 = nodeProxy( MathNode, MathNode.ATAN2 );
283
285
  export const min = nodeProxy( MathNode, MathNode.MIN );
@@ -29,12 +29,6 @@ class OperatorNode extends TempNode {
29
29
 
30
30
  }
31
31
 
32
- hasDependencies( builder ) {
33
-
34
- return this.op !== '=' ? super.hasDependencies( builder ) : false;
35
-
36
- }
37
-
38
32
  getNodeType( builder, output ) {
39
33
 
40
34
  const op = this.op;
@@ -49,7 +43,7 @@ class OperatorNode extends TempNode {
49
43
 
50
44
  return 'void';
51
45
 
52
- } else if ( op === '=' || op === '%' ) {
46
+ } else if ( op === '%' ) {
53
47
 
54
48
  return typeA;
55
49
 
@@ -116,11 +110,7 @@ class OperatorNode extends TempNode {
116
110
  typeA = aNode.getNodeType( builder );
117
111
  typeB = bNode.getNodeType( builder );
118
112
 
119
- if ( op === '=' ) {
120
-
121
- typeB = typeA;
122
-
123
- } else if ( op === '<' || op === '>' || op === '<=' || op === '>=' || op === '==' ) {
113
+ if ( op === '<' || op === '>' || op === '<=' || op === '>=' || op === '==' ) {
124
114
 
125
115
  if ( builder.isVector( typeA ) ) {
126
116
 
@@ -167,40 +157,47 @@ class OperatorNode extends TempNode {
167
157
  const b = bNode.build( builder, typeB );
168
158
 
169
159
  const outputLength = builder.getTypeLength( output );
160
+ const fnOpSnippet = builder.getFunctionOperator( op );
170
161
 
171
162
  if ( output !== 'void' ) {
172
163
 
173
- if ( op === '=' ) {
174
-
175
- builder.addLineFlowCode( `${a} ${this.op} ${b}` );
176
-
177
- return a;
178
-
179
- } else if ( op === '<' && outputLength > 1 ) {
164
+ if ( op === '<' && outputLength > 1 ) {
180
165
 
181
- return builder.format( `${ builder.getMethod( 'lessThan' ) }( ${a}, ${b} )`, type, output );
166
+ return builder.format( `${ builder.getMethod( 'lessThan' ) }( ${ a }, ${ b } )`, type, output );
182
167
 
183
168
  } else if ( op === '<=' && outputLength > 1 ) {
184
169
 
185
- return builder.format( `${ builder.getMethod( 'lessThanEqual' ) }( ${a}, ${b} )`, type, output );
170
+ return builder.format( `${ builder.getMethod( 'lessThanEqual' ) }( ${ a }, ${ b } )`, type, output );
186
171
 
187
172
  } else if ( op === '>' && outputLength > 1 ) {
188
173
 
189
- return builder.format( `${ builder.getMethod( 'greaterThan' ) }( ${a}, ${b} )`, type, output );
174
+ return builder.format( `${ builder.getMethod( 'greaterThan' ) }( ${ a }, ${ b } )`, type, output );
190
175
 
191
176
  } else if ( op === '>=' && outputLength > 1 ) {
192
177
 
193
- return builder.format( `${ builder.getMethod( 'greaterThanEqual' ) }( ${a}, ${b} )`, type, output );
178
+ return builder.format( `${ builder.getMethod( 'greaterThanEqual' ) }( ${ a }, ${ b } )`, type, output );
179
+
180
+ } else if ( fnOpSnippet ) {
181
+
182
+ return builder.format( `${ fnOpSnippet }( ${ a }, ${ b } )`, type, output );
194
183
 
195
184
  } else {
196
185
 
197
- return builder.format( `( ${a} ${this.op} ${b} )`, type, output );
186
+ return builder.format( `( ${ a } ${ op } ${ b } )`, type, output );
198
187
 
199
188
  }
200
189
 
201
190
  } else if ( typeA !== 'void' ) {
202
191
 
203
- return builder.format( `${a} ${this.op} ${b}`, type, output );
192
+ if ( fnOpSnippet ) {
193
+
194
+ return builder.format( `${ fnOpSnippet }( ${ a }, ${ b } )`, type, output );
195
+
196
+ } else {
197
+
198
+ return builder.format( `${ a } ${ op } ${ b }`, type, output );
199
+
200
+ }
204
201
 
205
202
  }
206
203
 
@@ -232,7 +229,7 @@ export const mul = nodeProxy( OperatorNode, '*' );
232
229
  export const div = nodeProxy( OperatorNode, '/' );
233
230
  export const remainder = nodeProxy( OperatorNode, '%' );
234
231
  export const equal = nodeProxy( OperatorNode, '==' );
235
- export const assign = nodeProxy( OperatorNode, '=' );
232
+ export const notEqual = nodeProxy( OperatorNode, '!=' );
236
233
  export const lessThan = nodeProxy( OperatorNode, '<' );
237
234
  export const greaterThan = nodeProxy( OperatorNode, '>' );
238
235
  export const lessThanEqual = nodeProxy( OperatorNode, '<=' );
@@ -252,7 +249,7 @@ addNodeElement( 'mul', mul );
252
249
  addNodeElement( 'div', div );
253
250
  addNodeElement( 'remainder', remainder );
254
251
  addNodeElement( 'equal', equal );
255
- addNodeElement( 'assign', assign );
252
+ addNodeElement( 'notEqual', notEqual );
256
253
  addNodeElement( 'lessThan', lessThan );
257
254
  addNodeElement( 'greaterThan', greaterThan );
258
255
  addNodeElement( 'lessThanEqual', lessThanEqual );
@@ -7,11 +7,21 @@ import SetNode from '../utils/SetNode.js';
7
7
  import ConstNode from '../core/ConstNode.js';
8
8
  import { getValueFromType, getValueType } from '../core/NodeUtils.js';
9
9
 
10
+ //
11
+
12
+ let currentStack = null;
13
+
10
14
  const NodeElements = new Map(); // @TODO: Currently only a few nodes are added, probably also add others
11
15
 
12
16
  export function addNodeElement( name, nodeElement ) {
13
17
 
14
- if ( NodeElements.has( name ) ) throw new Error( `Redefinition of node element ${ name }` );
18
+ if ( NodeElements.has( name ) ) {
19
+
20
+ console.warn( `Redefinition of node element ${ name }` );
21
+ return;
22
+
23
+ }
24
+
15
25
  if ( typeof nodeElement !== 'function' ) throw new Error( `Node element ${ name } is not a function` );
16
26
 
17
27
  NodeElements.set( name, nodeElement );
@@ -30,15 +40,25 @@ const shaderNodeHandler = {
30
40
 
31
41
  },
32
42
 
33
- get: function ( node, prop, nodeObj ) {
43
+ get( node, prop, nodeObj ) {
34
44
 
35
45
  if ( typeof prop === 'string' && node[ prop ] === undefined ) {
36
46
 
37
- if ( NodeElements.has( prop ) ) {
47
+ if ( node.isStackNode !== true && prop === 'assign' ) {
48
+
49
+ return ( ...params ) => {
50
+
51
+ currentStack.assign( nodeObj, ...params );
52
+
53
+ return nodeObj;
54
+
55
+ };
56
+
57
+ } else if ( NodeElements.has( prop ) ) {
38
58
 
39
59
  const nodeElement = NodeElements.get( prop );
40
60
 
41
- return ( ...params ) => nodeElement( nodeObj, ...params );
61
+ return node.isStackNode ? ( ...params ) => nodeObj.add( nodeElement( ...params ) ) : ( ...params ) => nodeElement( nodeObj, ...params );
42
62
 
43
63
  } else if ( prop === 'self' ) {
44
64
 
@@ -48,7 +68,7 @@ const shaderNodeHandler = {
48
68
 
49
69
  const nodeElement = NodeElements.get( prop.slice( 0, prop.length - 'Assign'.length ) );
50
70
 
51
- return ( ...params ) => nodeObj.assign( nodeElement( nodeObj, ...params ) );
71
+ return node.isStackNode ? ( ...params ) => nodeObj.assign( params[ 0 ], nodeElement( ...params ) ) : ( ...params ) => nodeObj.assign( nodeElement( nodeObj, ...params ) );
52
72
 
53
73
  } else if ( /^[xyzwrgbastpq]{1,4}$/.test( prop ) === true ) {
54
74
 
@@ -56,7 +76,7 @@ const shaderNodeHandler = {
56
76
 
57
77
  prop = parseSwizzle( prop );
58
78
 
59
- return nodeObject( new SplitNode( node, prop ) );
79
+ return nodeObject( new SplitNode( nodeObj, prop ) );
60
80
 
61
81
  } else if ( /^set[XYZWRGBASTPQ]{1,4}$/.test( prop ) === true ) {
62
82
 
@@ -84,19 +104,40 @@ const shaderNodeHandler = {
84
104
 
85
105
  // accessing array
86
106
 
87
- return nodeObject( new ArrayElementNode( node, new ConstNode( Number( prop ), 'uint' ) ) );
107
+ return nodeObject( new ArrayElementNode( nodeObj, new ConstNode( Number( prop ), 'uint' ) ) );
108
+
109
+ }
110
+
111
+ }
112
+
113
+ return Reflect.get( node, prop, nodeObj );
114
+
115
+ },
116
+
117
+ set( node, prop, value, nodeObj ) {
118
+
119
+ if ( typeof prop === 'string' && node[ prop ] === undefined ) {
120
+
121
+ // setting properties
122
+
123
+ if ( /^[xyzwrgbastpq]{1,4}$/.test( prop ) === true || prop === 'width' || prop === 'height' || prop === 'depth' || /^\d+$/.test( prop ) === true ) {
124
+
125
+ nodeObj[ prop ].assign( value );
126
+
127
+ return true;
88
128
 
89
129
  }
90
130
 
91
131
  }
92
132
 
93
- return node[ prop ];
133
+ return Reflect.set( node, prop, value, nodeObj );
94
134
 
95
135
  }
96
136
 
97
137
  };
98
138
 
99
139
  const nodeObjectsCacheMap = new WeakMap();
140
+ const nodeBuilderFunctionsCacheMap = new WeakMap();
100
141
 
101
142
  const ShaderNodeObject = function ( obj, altType = null ) {
102
143
 
@@ -109,6 +150,7 @@ const ShaderNodeObject = function ( obj, altType = null ) {
109
150
  if ( nodeObject === undefined ) {
110
151
 
111
152
  nodeObject = new Proxy( obj, shaderNodeHandler );
153
+
112
154
  nodeObjectsCacheMap.set( obj, nodeObject );
113
155
  nodeObjectsCacheMap.set( nodeObject, nodeObject );
114
156
 
@@ -219,8 +261,40 @@ class ShaderCallNodeInternal extends Node {
219
261
 
220
262
  const { shaderNode, inputNodes } = this;
221
263
 
264
+ if ( shaderNode.layout ) {
265
+
266
+ let functionNodesCacheMap = nodeBuilderFunctionsCacheMap.get( builder.constructor );
267
+
268
+ if ( functionNodesCacheMap === undefined ) {
269
+
270
+ functionNodesCacheMap = new WeakMap();
271
+
272
+ nodeBuilderFunctionsCacheMap.set( builder.constructor, functionNodesCacheMap );
273
+
274
+ }
275
+
276
+ let functionNode = functionNodesCacheMap.get( shaderNode );
277
+
278
+ if ( functionNode === undefined ) {
279
+
280
+ functionNode = nodeObject( builder.buildFunctionNode( shaderNode ) );
281
+
282
+ functionNodesCacheMap.set( shaderNode, functionNode );
283
+
284
+ }
285
+
286
+ if ( builder.currentFunctionNode !== null ) {
287
+
288
+ builder.currentFunctionNode.includes.push( functionNode );
289
+
290
+ }
291
+
292
+ return nodeObject( functionNode.call( inputNodes ) );
293
+
294
+ }
295
+
222
296
  const jsFunc = shaderNode.jsFunc;
223
- const outputNode = inputNodes !== null ? jsFunc( nodeObjects( inputNodes ), builder.stack, builder ) : jsFunc( builder.stack, builder );
297
+ const outputNode = inputNodes !== null ? jsFunc( inputNodes, builder.stack, builder ) : jsFunc( builder.stack, builder );
224
298
 
225
299
  return nodeObject( outputNode );
226
300
 
@@ -261,11 +335,28 @@ class ShaderNodeInternal extends Node {
261
335
  super();
262
336
 
263
337
  this.jsFunc = jsFunc;
338
+ this.layout = null;
339
+
340
+ }
341
+
342
+ get isArrayInput() {
343
+
344
+ return /^\(\s+?\[/.test( this.jsFunc.toString() );
345
+
346
+ }
347
+
348
+ setLayout( layout ) {
349
+
350
+ this.layout = layout;
351
+
352
+ return this;
264
353
 
265
354
  }
266
355
 
267
356
  call( inputs = null ) {
268
357
 
358
+ nodeObjects( inputs );
359
+
269
360
  return nodeObject( new ShaderCallNodeInternal( this, inputs ) );
270
361
 
271
362
  }
@@ -395,12 +486,69 @@ export const tslFn = ( jsFunc ) => {
395
486
 
396
487
  const shaderNode = new ShaderNode( jsFunc );
397
488
 
398
- return ( inputs ) => shaderNode.call( inputs );
489
+ const fn = ( ...params ) => {
490
+
491
+ let inputs;
492
+
493
+ nodeObjects( params );
494
+
495
+ if ( params[ 0 ] && params[ 0 ].isNode ) {
496
+
497
+ inputs = [ ...params ];
498
+
499
+ } else {
500
+
501
+ inputs = params[ 0 ];
502
+
503
+ }
504
+
505
+ return shaderNode.call( inputs );
506
+
507
+ };
508
+
509
+ fn.shaderNode = shaderNode;
510
+ fn.setLayout = ( layout ) => {
511
+
512
+ shaderNode.setLayout( layout );
513
+
514
+ return fn;
515
+
516
+ };
517
+
518
+ return fn;
399
519
 
400
520
  };
401
521
 
402
522
  addNodeClass( 'ShaderNode', ShaderNode );
403
523
 
524
+ //
525
+
526
+ export const setCurrentStack = ( stack ) => {
527
+
528
+ if ( currentStack === stack ) {
529
+
530
+ //throw new Error( 'Stack already defined.' );
531
+
532
+ }
533
+
534
+ currentStack = stack;
535
+
536
+ };
537
+
538
+ export const getCurrentStack = () => currentStack;
539
+
540
+ export const If = ( ...params ) => currentStack.if( ...params );
541
+
542
+ export function append( node ) {
543
+
544
+ if ( currentStack ) currentStack.add( node );
545
+
546
+ return node;
547
+
548
+ }
549
+
550
+ addNodeElement( 'append', append );
551
+
404
552
  // types
405
553
  // @TODO: Maybe export from ConstNode.js?
406
554
 
@@ -9,6 +9,8 @@ class ArrayElementNode extends Node { // @TODO: If extending from TempNode it br
9
9
  this.node = node;
10
10
  this.indexNode = indexNode;
11
11
 
12
+ this.isArrayElementNode = true;
13
+
12
14
  }
13
15
 
14
16
  getNodeType( builder ) {
@@ -19,8 +19,9 @@ class DiscardNode extends CondNode {
19
19
 
20
20
  export default DiscardNode;
21
21
 
22
- export const discard = nodeProxy( DiscardNode );
22
+ export const inlineDiscard = nodeProxy( DiscardNode );
23
+ export const discard = ( condNode ) => inlineDiscard( condNode ).append();
23
24
 
24
- addNodeElement( 'discard', discard );
25
+ addNodeElement( 'discard', discard ); // @TODO: Check... this cause a little confusing using in chaining
25
26
 
26
27
  addNodeClass( 'DiscardNode', DiscardNode );
@@ -0,0 +1,95 @@
1
+ import Node, { addNodeClass } from '../core/Node.js';
2
+ import { nodeProxy } from '../shadernode/ShaderNode.js';
3
+
4
+ class FunctionOverloadingNode extends Node {
5
+
6
+ constructor( functionNodes = [], ...parametersNodes ) {
7
+
8
+ super();
9
+
10
+ this.functionNodes = functionNodes;
11
+ this.parametersNodes = parametersNodes;
12
+
13
+ this._candidateFnCall = null;
14
+
15
+ }
16
+
17
+ getNodeType() {
18
+
19
+ return this.functionNodes[ 0 ].shaderNode.layout.type;
20
+
21
+ }
22
+
23
+ setup( builder ) {
24
+
25
+ const params = this.parametersNodes;
26
+
27
+ let candidateFnCall = this._candidateFnCall;
28
+
29
+ if ( candidateFnCall === null ) {
30
+
31
+ let candidateFn = null;
32
+ let candidateScore = - 1;
33
+
34
+ for ( const functionNode of this.functionNodes ) {
35
+
36
+ const shaderNode = functionNode.shaderNode;
37
+ const layout = shaderNode.layout;
38
+
39
+ if ( layout === null ) {
40
+
41
+ throw new Error( 'FunctionOverloadingNode: FunctionNode must be a layout.' );
42
+
43
+ }
44
+
45
+ const inputs = layout.inputs;
46
+
47
+ if ( params.length === inputs.length ) {
48
+
49
+ let score = 0;
50
+
51
+ for ( let i = 0; i < params.length; i ++ ) {
52
+
53
+ const param = params[ i ];
54
+ const input = inputs[ i ];
55
+
56
+ if ( param.getNodeType( builder ) === input.type ) {
57
+
58
+ score ++;
59
+
60
+ } else {
61
+
62
+ score = 0;
63
+
64
+ }
65
+
66
+ }
67
+
68
+ if ( score > candidateScore ) {
69
+
70
+ candidateFn = functionNode;
71
+ candidateScore = score;
72
+
73
+ }
74
+
75
+ }
76
+
77
+ }
78
+
79
+ this._candidateFnCall = candidateFnCall = candidateFn( ...params );
80
+
81
+ }
82
+
83
+ return candidateFnCall;
84
+
85
+ }
86
+
87
+ }
88
+
89
+ export default FunctionOverloadingNode;
90
+
91
+ const overloadingBaseFn = nodeProxy( FunctionOverloadingNode );
92
+
93
+ export const overloadingFn = ( functionNodes ) => ( ...params ) => overloadingBaseFn( functionNodes, ...params );
94
+
95
+ addNodeClass( 'FunctionOverloadingNode', FunctionOverloadingNode );
@@ -28,11 +28,21 @@ class JoinNode extends TempNode {
28
28
  const type = this.getNodeType( builder );
29
29
  const nodes = this.nodes;
30
30
 
31
+ const primitiveType = builder.getPrimitiveType( type );
32
+
31
33
  const snippetValues = [];
32
34
 
33
35
  for ( const input of nodes ) {
34
36
 
35
- const inputSnippet = input.build( builder );
37
+ let inputSnippet = input.build( builder );
38
+
39
+ const inputPrimitiveType = builder.getPrimitiveType( input.getNodeType( builder ) );
40
+
41
+ if ( inputPrimitiveType !== primitiveType ) {
42
+
43
+ inputSnippet = builder.format( inputSnippet, inputPrimitiveType, primitiveType );
44
+
45
+ }
36
46
 
37
47
  snippetValues.push( inputSnippet );
38
48