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,6 +1,6 @@
1
1
  import { NoColorSpace, FloatType } from 'three';
2
2
 
3
- import UniformsGroup from '../../common/UniformsGroup.js';
3
+ import NodeUniformsGroup from '../../common/nodes/NodeUniformsGroup.js';
4
4
 
5
5
  import NodeSampler from '../../common/nodes/NodeSampler.js';
6
6
  import { NodeSampledTexture, NodeSampledCubeTexture } from '../../common/nodes/NodeSampledTexture.js';
@@ -25,6 +25,10 @@ const supports = {
25
25
  instance: true
26
26
  };
27
27
 
28
+ const wgslFnOpLib = {
29
+ '^^': 'threejs_xor'
30
+ };
31
+
28
32
  const wgslTypeLib = {
29
33
  float: 'f32',
30
34
  int: 'i32',
@@ -63,15 +67,31 @@ const wgslMethods = {
63
67
  dFdy: '- dpdy',
64
68
  mod: 'threejs_mod',
65
69
  lessThanEqual: 'threejs_lessThanEqual',
66
- inversesqrt: 'inverseSqrt'
70
+ greaterThan: 'threejs_greaterThan',
71
+ inversesqrt: 'inverseSqrt',
72
+ bitcast: 'bitcast<f32>'
67
73
  };
68
74
 
69
75
  const wgslPolyfill = {
76
+ threejs_xor: new CodeNode( `
77
+ fn threejs_xor( a : bool, b : bool ) -> bool {
78
+
79
+ return ( a || b ) && !( a && b );
80
+
81
+ }
82
+ ` ),
70
83
  lessThanEqual: new CodeNode( `
71
84
  fn threejs_lessThanEqual( a : vec3<f32>, b : vec3<f32> ) -> vec3<bool> {
72
85
 
73
86
  return vec3<bool>( a.x <= b.x, a.y <= b.y, a.z <= b.z );
74
87
 
88
+ }
89
+ ` ),
90
+ greaterThan: new CodeNode( `
91
+ fn threejs_greaterThan( a : vec3<f32>, b : vec3<f32> ) -> vec3<bool> {
92
+
93
+ return vec3<bool>( a.x > b.x, a.y > b.y, a.z > b.z );
94
+
75
95
  }
76
96
  ` ),
77
97
  mod: new CodeNode( `
@@ -98,14 +118,9 @@ class WGSLNodeBuilder extends NodeBuilder {
98
118
 
99
119
  super( object, renderer, new WGSLNodeParser(), scene );
100
120
 
101
- this.uniformsGroup = {};
121
+ this.uniformGroups = {};
102
122
 
103
- this.builtins = {
104
- vertex: new Map(),
105
- fragment: new Map(),
106
- compute: new Map(),
107
- attribute: new Map()
108
- };
123
+ this.builtins = {};
109
124
 
110
125
  }
111
126
 
@@ -133,25 +148,33 @@ class WGSLNodeBuilder extends NodeBuilder {
133
148
 
134
149
  }
135
150
 
136
- _getSampler( texture, textureProperty, uvSnippet, shaderStage = this.shaderStage ) {
151
+ _generateTextureSample( texture, textureProperty, uvSnippet, depthSnippet, shaderStage = this.shaderStage ) {
137
152
 
138
153
  if ( shaderStage === 'fragment' ) {
139
154
 
140
- return `textureSample( ${textureProperty}, ${textureProperty}_sampler, ${uvSnippet} )`;
155
+ if ( depthSnippet ) {
156
+
157
+ return `textureSample( ${ textureProperty }, ${ textureProperty }_sampler, ${ uvSnippet }, ${ depthSnippet } )`;
158
+
159
+ } else {
160
+
161
+ return `textureSample( ${ textureProperty }, ${ textureProperty }_sampler, ${ uvSnippet } )`;
162
+
163
+ }
141
164
 
142
165
  } else {
143
166
 
144
- return this.getTextureLoad( texture, textureProperty, uvSnippet );
167
+ return this.generateTextureLod( texture, textureProperty, uvSnippet );
145
168
 
146
169
  }
147
170
 
148
171
  }
149
172
 
150
- _getVideoSampler( textureProperty, uvSnippet, shaderStage = this.shaderStage ) {
173
+ _generateVideoSample( textureProperty, uvSnippet, shaderStage = this.shaderStage ) {
151
174
 
152
175
  if ( shaderStage === 'fragment' ) {
153
176
 
154
- return `textureSampleBaseClampToEdge( ${textureProperty}, ${textureProperty}_sampler, vec2<f32>( ${uvSnippet}.x, 1.0 - ${uvSnippet}.y ) )`;
177
+ return `textureSampleBaseClampToEdge( ${ textureProperty }, ${ textureProperty }_sampler, vec2<f32>( ${ uvSnippet }.x, 1.0 - ${ uvSnippet }.y ) )`;
155
178
 
156
179
  } else {
157
180
 
@@ -161,27 +184,41 @@ class WGSLNodeBuilder extends NodeBuilder {
161
184
 
162
185
  }
163
186
 
164
- _getSamplerLevel( texture, textureProperty, uvSnippet, biasSnippet, shaderStage = this.shaderStage ) {
187
+ _generateTextureSampleLevel( texture, textureProperty, uvSnippet, levelSnippet, depthSnippet, shaderStage = this.shaderStage ) {
165
188
 
166
189
  if ( shaderStage === 'fragment' && this.isUnfilterable( texture ) === false ) {
167
190
 
168
- return `textureSampleLevel( ${textureProperty}, ${textureProperty}_sampler, ${uvSnippet}, ${biasSnippet} )`;
191
+ return `textureSampleLevel( ${ textureProperty }, ${ textureProperty }_sampler, ${ uvSnippet }, ${ levelSnippet } )`;
169
192
 
170
193
  } else {
171
194
 
172
- return this.getTextureLoad( texture, textureProperty, uvSnippet, biasSnippet );
195
+ return this.generateTextureLod( texture, textureProperty, uvSnippet, levelSnippet );
173
196
 
174
197
  }
175
198
 
176
199
  }
177
200
 
178
- getTextureLoad( texture, textureProperty, uvSnippet, biasSnippet = '0' ) {
201
+ generateTextureLod( texture, textureProperty, uvSnippet, levelSnippet = '0' ) {
179
202
 
180
203
  this._include( 'repeatWrapping' );
181
204
 
182
- const dimension = `textureDimensions( ${textureProperty}, 0 )`;
205
+ const dimension = `textureDimensions( ${ textureProperty }, 0 )`;
183
206
 
184
- return `textureLoad( ${textureProperty}, threejs_repeatWrapping( ${uvSnippet}, ${dimension} ), i32( ${biasSnippet} ) )`;
207
+ return `textureLoad( ${ textureProperty }, threejs_repeatWrapping( ${ uvSnippet }, ${ dimension } ), i32( ${ levelSnippet } ) )`;
208
+
209
+ }
210
+
211
+ generateTextureLoad( texture, textureProperty, uvIndexSnippet, depthSnippet, levelSnippet = '0u' ) {
212
+
213
+ if ( depthSnippet ) {
214
+
215
+ return `textureLoad( ${ textureProperty }, ${ uvIndexSnippet }, ${ depthSnippet }, ${ levelSnippet } )`;
216
+
217
+ } else {
218
+
219
+ return `textureLoad( ${ textureProperty }, ${ uvIndexSnippet }, ${ levelSnippet } )`;
220
+
221
+ }
185
222
 
186
223
  }
187
224
 
@@ -191,21 +228,21 @@ class WGSLNodeBuilder extends NodeBuilder {
191
228
 
192
229
  }
193
230
 
194
- getTexture( texture, textureProperty, uvSnippet, shaderStage = this.shaderStage ) {
231
+ generateTexture( texture, textureProperty, uvSnippet, depthSnippet, shaderStage = this.shaderStage ) {
195
232
 
196
233
  let snippet = null;
197
234
 
198
235
  if ( texture.isVideoTexture === true ) {
199
236
 
200
- snippet = this._getVideoSampler( textureProperty, uvSnippet, shaderStage );
237
+ snippet = this._generateVideoSample( textureProperty, uvSnippet, shaderStage );
201
238
 
202
239
  } else if ( this.isUnfilterable( texture ) ) {
203
240
 
204
- snippet = this.getTextureLoad( texture, textureProperty, uvSnippet );
241
+ snippet = this.generateTextureLod( texture, textureProperty, uvSnippet, '0', depthSnippet, shaderStage );
205
242
 
206
243
  } else {
207
244
 
208
- snippet = this._getSampler( texture, textureProperty, uvSnippet, shaderStage );
245
+ snippet = this._generateTextureSample( texture, textureProperty, uvSnippet, depthSnippet, shaderStage );
209
246
 
210
247
  }
211
248
 
@@ -213,11 +250,11 @@ class WGSLNodeBuilder extends NodeBuilder {
213
250
 
214
251
  }
215
252
 
216
- getTextureCompare( texture, textureProperty, uvSnippet, compareSnippet, shaderStage = this.shaderStage ) {
253
+ generateTextureCompare( texture, textureProperty, uvSnippet, compareSnippet, depthSnippet, shaderStage = this.shaderStage ) {
217
254
 
218
255
  if ( shaderStage === 'fragment' ) {
219
256
 
220
- return `textureSampleCompare( ${textureProperty}, ${textureProperty}_sampler, ${uvSnippet}, ${compareSnippet} )`;
257
+ return `textureSampleCompare( ${ textureProperty }, ${ textureProperty }_sampler, ${ uvSnippet }, ${ compareSnippet } )`;
221
258
 
222
259
  } else {
223
260
 
@@ -227,17 +264,17 @@ class WGSLNodeBuilder extends NodeBuilder {
227
264
 
228
265
  }
229
266
 
230
- getTextureLevel( texture, textureProperty, uvSnippet, biasSnippet, shaderStage = this.shaderStage ) {
267
+ generateTextureLevel( texture, textureProperty, uvSnippet, levelSnippet, depthSnippet, shaderStage = this.shaderStage ) {
231
268
 
232
269
  let snippet = null;
233
270
 
234
271
  if ( texture.isVideoTexture === true ) {
235
272
 
236
- snippet = this._getVideoSampler( textureProperty, uvSnippet, shaderStage );
273
+ snippet = this._generateVideoSample( textureProperty, uvSnippet, shaderStage );
237
274
 
238
275
  } else {
239
276
 
240
- snippet = this._getSamplerLevel( texture, textureProperty, uvSnippet, biasSnippet, shaderStage );
277
+ snippet = this._generateTextureSampleLevel( texture, textureProperty, uvSnippet, levelSnippet, depthSnippet, shaderStage );
241
278
 
242
279
  }
243
280
 
@@ -251,7 +288,7 @@ class WGSLNodeBuilder extends NodeBuilder {
251
288
 
252
289
  if ( shaderStage === 'vertex' ) {
253
290
 
254
- return `NodeVaryings.${ node.name }`;
291
+ return `varyings.${ node.name }`;
255
292
 
256
293
  }
257
294
 
@@ -266,11 +303,11 @@ class WGSLNodeBuilder extends NodeBuilder {
266
303
 
267
304
  } else if ( type === 'buffer' || type === 'storageBuffer' ) {
268
305
 
269
- return `NodeBuffer_${node.node.id}.${name}`;
306
+ return `NodeBuffer_${ node.id }.${name}`;
270
307
 
271
308
  } else {
272
309
 
273
- return `NodeUniforms.${name}`;
310
+ return node.groupNode.name + '.' + name;
274
311
 
275
312
  }
276
313
 
@@ -280,10 +317,32 @@ class WGSLNodeBuilder extends NodeBuilder {
280
317
 
281
318
  }
282
319
 
320
+ _getUniformGroupCount( shaderStage ) {
321
+
322
+ return Object.keys( this.uniforms[ shaderStage ] ).length;
323
+
324
+ }
325
+
326
+ getFunctionOperator( op ) {
327
+
328
+ const fnOp = wgslFnOpLib[ op ];
329
+
330
+ if ( fnOp !== undefined ) {
331
+
332
+ this._include( fnOp );
333
+
334
+ return fnOp;
335
+
336
+ }
337
+
338
+ return null;
339
+
340
+ }
341
+
283
342
  getUniformFromNode( node, type, shaderStage, name = null ) {
284
343
 
285
344
  const uniformNode = super.getUniformFromNode( node, type, shaderStage, name );
286
- const nodeData = this.getDataFromNode( node, shaderStage );
345
+ const nodeData = this.getDataFromNode( node, shaderStage, this.globalCache );
287
346
 
288
347
  if ( nodeData.uniformGPU === undefined ) {
289
348
 
@@ -308,22 +367,18 @@ class WGSLNodeBuilder extends NodeBuilder {
308
367
  texture.store = node.isStoreTextureNode === true;
309
368
  texture.setVisibility( gpuShaderStageLib[ shaderStage ] );
310
369
 
311
- // add first textures in sequence and group for last
312
- const lastBinding = bindings[ bindings.length - 1 ];
313
- const index = lastBinding && lastBinding.isUniformsGroup ? bindings.length - 1 : bindings.length;
314
-
315
370
  if ( shaderStage === 'fragment' && this.isUnfilterable( node.value ) === false && texture.store === false ) {
316
371
 
317
372
  const sampler = new NodeSampler( `${uniformNode.name}_sampler`, uniformNode.node );
318
373
  sampler.setVisibility( gpuShaderStageLib[ shaderStage ] );
319
374
 
320
- bindings.splice( index, 0, sampler, texture );
375
+ bindings.push( sampler, texture );
321
376
 
322
377
  uniformGPU = [ sampler, texture ];
323
378
 
324
379
  } else {
325
380
 
326
- bindings.splice( index, 0, texture );
381
+ bindings.push( texture );
327
382
 
328
383
  uniformGPU = [ texture ];
329
384
 
@@ -335,24 +390,25 @@ class WGSLNodeBuilder extends NodeBuilder {
335
390
  const buffer = new bufferClass( 'NodeBuffer_' + node.id, node.value );
336
391
  buffer.setVisibility( gpuShaderStageLib[ shaderStage ] );
337
392
 
338
- // add first textures in sequence and group for last
339
- const lastBinding = bindings[ bindings.length - 1 ];
340
- const index = lastBinding && lastBinding.isUniformsGroup ? bindings.length - 1 : bindings.length;
341
-
342
- bindings.splice( index, 0, buffer );
393
+ bindings.push( buffer );
343
394
 
344
395
  uniformGPU = buffer;
345
396
 
346
397
  } else {
347
398
 
348
- let uniformsGroup = this.uniformsGroup[ shaderStage ];
399
+ const group = node.groupNode;
400
+ const groupName = group.name;
401
+
402
+ const uniformsStage = this.uniformGroups[ shaderStage ] || ( this.uniformGroups[ shaderStage ] = {} );
403
+
404
+ let uniformsGroup = uniformsStage[ groupName ];
349
405
 
350
406
  if ( uniformsGroup === undefined ) {
351
407
 
352
- uniformsGroup = new UniformsGroup( 'nodeUniforms' );
408
+ uniformsGroup = new NodeUniformsGroup( groupName, group );
353
409
  uniformsGroup.setVisibility( gpuShaderStageLib[ shaderStage ] );
354
410
 
355
- this.uniformsGroup[ shaderStage ] = uniformsGroup;
411
+ uniformsStage[ groupName ] = uniformsGroup;
356
412
 
357
413
  bindings.push( uniformsGroup );
358
414
 
@@ -402,13 +458,13 @@ class WGSLNodeBuilder extends NodeBuilder {
402
458
 
403
459
  isReference( type ) {
404
460
 
405
- return super.isReference( type ) || type === 'texture_2d' || type === 'texture_cube' || type === 'texture_storage_2d';
461
+ return super.isReference( type ) || type === 'texture_2d' || type === 'texture_cube' || type === 'texture_depth_2d' || type === 'texture_storage_2d';
406
462
 
407
463
  }
408
464
 
409
465
  getBuiltin( name, property, type, shaderStage = this.shaderStage ) {
410
466
 
411
- const map = this.builtins[ shaderStage ];
467
+ const map = this.builtins[ shaderStage ] || ( this.builtins[ shaderStage ] = new Map() );
412
468
 
413
469
  if ( map.has( name ) === false ) {
414
470
 
@@ -436,6 +492,34 @@ class WGSLNodeBuilder extends NodeBuilder {
436
492
 
437
493
  }
438
494
 
495
+ buildFunctionCode( shaderNode ) {
496
+
497
+ const layout = shaderNode.layout;
498
+ const flowData = this.flowShaderNode( shaderNode );
499
+
500
+ const parameters = [];
501
+
502
+ for ( const input of layout.inputs ) {
503
+
504
+ parameters.push( input.name + ' : ' + this.getType( input.type ) );
505
+
506
+ }
507
+
508
+ //
509
+
510
+ const code = `fn ${ layout.name }( ${ parameters.join( ', ' ) } ) -> ${ this.getType( layout.type ) } {
511
+ ${ flowData.vars }
512
+ ${ flowData.code }
513
+ return ${ flowData.result };
514
+
515
+ }`;
516
+
517
+ //
518
+
519
+ return code;
520
+
521
+ }
522
+
439
523
  getInstanceIndex() {
440
524
 
441
525
  if ( this.shaderStage === 'vertex' ) {
@@ -456,7 +540,13 @@ class WGSLNodeBuilder extends NodeBuilder {
456
540
 
457
541
  getFragCoord() {
458
542
 
459
- return this.getBuiltin( 'position', 'fragCoord', 'vec4<f32>', 'fragment' );
543
+ return this.getBuiltin( 'position', 'fragCoord', 'vec4<f32>' ) + '.xy';
544
+
545
+ }
546
+
547
+ getFragDepth() {
548
+
549
+ return 'output.' + this.getBuiltin( 'frag_depth', 'depth', 'f32', 'output' );
460
550
 
461
551
  }
462
552
 
@@ -466,6 +556,25 @@ class WGSLNodeBuilder extends NodeBuilder {
466
556
 
467
557
  }
468
558
 
559
+ getBuiltins( shaderStage ) {
560
+
561
+ const snippets = [];
562
+ const builtins = this.builtins[ shaderStage ];
563
+
564
+ if ( builtins !== undefined ) {
565
+
566
+ for ( const { name, property, type } of builtins.values() ) {
567
+
568
+ snippets.push( `@builtin( ${name} ) ${property} : ${type}` );
569
+
570
+ }
571
+
572
+ }
573
+
574
+ return snippets.join( ',\n\t' );
575
+
576
+ }
577
+
469
578
  getAttributes( shaderStage ) {
470
579
 
471
580
  const snippets = [];
@@ -478,11 +587,9 @@ class WGSLNodeBuilder extends NodeBuilder {
478
587
 
479
588
  if ( shaderStage === 'vertex' || shaderStage === 'compute' ) {
480
589
 
481
- for ( const { name, property, type } of this.builtins.attribute.values() ) {
482
-
483
- snippets.push( `@builtin( ${name} ) ${property} : ${type}` );
590
+ const builtins = this.getBuiltins( 'attribute' );
484
591
 
485
- }
592
+ if ( builtins ) snippets.push( builtins );
486
593
 
487
594
  const attributes = this.getAttributesArray();
488
595
 
@@ -551,9 +658,13 @@ class WGSLNodeBuilder extends NodeBuilder {
551
658
  const snippets = [];
552
659
  const vars = this.vars[ shaderStage ];
553
660
 
554
- for ( const variable of vars ) {
661
+ if ( vars !== undefined ) {
555
662
 
556
- snippets.push( `\t${ this.getVar( variable.type, variable.name ) };` );
663
+ for ( const variable of vars ) {
664
+
665
+ snippets.push( `\t${ this.getVar( variable.type, variable.name ) };` );
666
+
667
+ }
557
668
 
558
669
  }
559
670
 
@@ -584,7 +695,7 @@ class WGSLNodeBuilder extends NodeBuilder {
584
695
 
585
696
  let attributesSnippet = `@location( ${index} )`;
586
697
 
587
- if ( varying.type === 'int' || varying.type === 'uint' ) {
698
+ if ( /^(int|uint|ivec|uvec)/.test( varying.type ) ) {
588
699
 
589
700
  attributesSnippet += ' @interpolate( flat )';
590
701
 
@@ -603,15 +714,13 @@ class WGSLNodeBuilder extends NodeBuilder {
603
714
 
604
715
  }
605
716
 
606
- for ( const { name, property, type } of this.builtins[ shaderStage ].values() ) {
607
-
608
- snippets.push( `@builtin( ${name} ) ${property} : ${type}` );
717
+ const builtins = this.getBuiltins( shaderStage );
609
718
 
610
- }
719
+ if ( builtins ) snippets.push( builtins );
611
720
 
612
721
  const code = snippets.join( ',\n\t' );
613
722
 
614
- return shaderStage === 'vertex' ? this._getWGSLStruct( 'NodeVaryingsStruct', '\t' + code ) : code;
723
+ return shaderStage === 'vertex' ? this._getWGSLStruct( 'VaryingsStruct', '\t' + code ) : code;
615
724
 
616
725
  }
617
726
 
@@ -621,7 +730,8 @@ class WGSLNodeBuilder extends NodeBuilder {
621
730
 
622
731
  const bindingSnippets = [];
623
732
  const bufferSnippets = [];
624
- const groupSnippets = [];
733
+ const structSnippets = [];
734
+ const uniformGroups = {};
625
735
 
626
736
  let index = this.bindingsOffset[ shaderStage ];
627
737
 
@@ -651,6 +761,10 @@ class WGSLNodeBuilder extends NodeBuilder {
651
761
 
652
762
  textureType = 'texture_cube<f32>';
653
763
 
764
+ } else if ( texture.isDataArrayTexture === true ) {
765
+
766
+ textureType = 'texture_2d_array<f32>';
767
+
654
768
  } else if ( texture.isDepthTexture === true ) {
655
769
 
656
770
  textureType = 'texture_depth_2d';
@@ -688,16 +802,22 @@ class WGSLNodeBuilder extends NodeBuilder {
688
802
  } else {
689
803
 
690
804
  const vectorType = this.getType( this.getVectorType( uniform.type ) );
805
+ const groupName = uniform.groupNode.name;
806
+
807
+ const group = uniformGroups[ groupName ] || ( uniformGroups[ groupName ] = {
808
+ index: index ++,
809
+ snippets: []
810
+ } );
691
811
 
692
812
  if ( Array.isArray( uniform.value ) === true ) {
693
813
 
694
814
  const length = uniform.value.length;
695
815
 
696
- groupSnippets.push( `uniform ${vectorType}[ ${length} ] ${uniform.name}` );
816
+ group.snippets.push( `uniform ${vectorType}[ ${length} ] ${uniform.name}` );
697
817
 
698
818
  } else {
699
819
 
700
- groupSnippets.push( `\t${uniform.name} : ${ vectorType}` );
820
+ group.snippets.push( `\t${uniform.name} : ${ vectorType}` );
701
821
 
702
822
  }
703
823
 
@@ -705,15 +825,18 @@ class WGSLNodeBuilder extends NodeBuilder {
705
825
 
706
826
  }
707
827
 
708
- let code = bindingSnippets.join( '\n' );
709
- code += bufferSnippets.join( '\n' );
828
+ for ( const name in uniformGroups ) {
710
829
 
711
- if ( groupSnippets.length > 0 ) {
830
+ const group = uniformGroups[ name ];
712
831
 
713
- code += this._getWGSLStructBinding( 'NodeUniforms', groupSnippets.join( ',\n' ), 'uniform', index ++ );
832
+ structSnippets.push( this._getWGSLStructBinding( name, group.snippets.join( ',\n' ), 'uniform', group.index ) );
714
833
 
715
834
  }
716
835
 
836
+ let code = bindingSnippets.join( '\n' );
837
+ code += bufferSnippets.join( '\n' );
838
+ code += structSnippets.join( '\n' );
839
+
717
840
  return code;
718
841
 
719
842
  }
@@ -724,12 +847,25 @@ class WGSLNodeBuilder extends NodeBuilder {
724
847
 
725
848
  for ( const shaderStage in shadersData ) {
726
849
 
850
+ const stageData = shadersData[ shaderStage ];
851
+ stageData.uniforms = this.getUniforms( shaderStage );
852
+ stageData.attributes = this.getAttributes( shaderStage );
853
+ stageData.varyings = this.getVaryings( shaderStage );
854
+ stageData.structs = this.getStructs( shaderStage );
855
+ stageData.vars = this.getVars( shaderStage );
856
+ stageData.codes = this.getCodes( shaderStage );
857
+
858
+ //
859
+
727
860
  let flow = '// code\n\n';
728
861
  flow += this.flowCode[ shaderStage ];
729
862
 
730
863
  const flowNodes = this.flowNodes[ shaderStage ];
731
864
  const mainNode = flowNodes[ flowNodes.length - 1 ];
732
865
 
866
+ const outputNode = mainNode.outputNode;
867
+ const isOutputStruct = ( outputNode !== undefined && outputNode.isOutputStructNode === true );
868
+
733
869
  for ( const node of flowNodes ) {
734
870
 
735
871
  const flowSlotData = this.getFlowData( node/*, shaderStage*/ );
@@ -747,34 +883,42 @@ class WGSLNodeBuilder extends NodeBuilder {
747
883
 
748
884
  if ( node === mainNode && shaderStage !== 'compute' ) {
749
885
 
750
- flow += '// result\n\t';
886
+ flow += '// result\n\n\t';
751
887
 
752
888
  if ( shaderStage === 'vertex' ) {
753
889
 
754
- flow += 'NodeVaryings.Vertex = ';
890
+ flow += `varyings.Vertex = ${ flowSlotData.result };`;
755
891
 
756
892
  } else if ( shaderStage === 'fragment' ) {
757
893
 
758
- flow += 'return ';
894
+ if ( isOutputStruct ) {
759
895
 
760
- }
896
+ stageData.returnType = outputNode.nodeType;
897
+
898
+ flow += `return ${ flowSlotData.result };`;
761
899
 
762
- flow += `${ flowSlotData.result };`;
900
+ } else {
901
+
902
+ let structSnippet = '\t@location(0) color: vec4<f32>';
903
+
904
+ const builtins = this.getBuiltins( 'output' );
905
+
906
+ if ( builtins ) structSnippet += ',\n\t' + builtins;
907
+
908
+ stageData.returnType = 'OutputStruct';
909
+ stageData.structs += this._getWGSLStruct( 'OutputStruct', structSnippet );
910
+ stageData.structs += '\nvar<private> output : OutputStruct;\n\n';
911
+
912
+ flow += `output.color = ${ flowSlotData.result };\n\n\treturn output;`;
913
+
914
+ }
915
+
916
+ }
763
917
 
764
918
  }
765
919
 
766
920
  }
767
921
 
768
- const outputNode = mainNode.outputNode;
769
- const stageData = shadersData[ shaderStage ];
770
-
771
- stageData.uniforms = this.getUniforms( shaderStage );
772
- stageData.attributes = this.getAttributes( shaderStage );
773
- stageData.varyings = this.getVaryings( shaderStage );
774
- stageData.structs = this.getStructs( shaderStage );
775
- stageData.vars = this.getVars( shaderStage );
776
- stageData.codes = this.getCodes( shaderStage );
777
- stageData.returnType = ( outputNode !== undefined && outputNode.isOutputStructNode === true ) ? outputNode.nodeType : '@location( 0 ) vec4<f32>';
778
922
  stageData.flow = flow;
779
923
 
780
924
  }
@@ -818,7 +962,16 @@ class WGSLNodeBuilder extends NodeBuilder {
818
962
 
819
963
  _include( name ) {
820
964
 
821
- wgslPolyfill[ name ].build( this );
965
+ const codeNode = wgslPolyfill[ name ];
966
+ codeNode.build( this );
967
+
968
+ if ( this.currentFunctionNode !== null ) {
969
+
970
+ this.currentFunctionNode.includes.push( codeNode );
971
+
972
+ }
973
+
974
+ return codeNode;
822
975
 
823
976
  }
824
977
 
@@ -831,15 +984,13 @@ ${shaderData.uniforms}
831
984
 
832
985
  // varyings
833
986
  ${shaderData.varyings}
987
+ var<private> varyings : VaryingsStruct;
834
988
 
835
989
  // codes
836
990
  ${shaderData.codes}
837
991
 
838
992
  @vertex
839
- fn main( ${shaderData.attributes} ) -> NodeVaryingsStruct {
840
-
841
- // system
842
- var NodeVaryings: NodeVaryingsStruct;
993
+ fn main( ${shaderData.attributes} ) -> VaryingsStruct {
843
994
 
844
995
  // vars
845
996
  ${shaderData.vars}
@@ -847,7 +998,7 @@ fn main( ${shaderData.attributes} ) -> NodeVaryingsStruct {
847
998
  // flow
848
999
  ${shaderData.flow}
849
1000
 
850
- return NodeVaryings;
1001
+ return varyings;
851
1002
 
852
1003
  }
853
1004
  `;