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,8 +1,12 @@
1
1
  import { MathNode, GLSLNodeParser, NodeBuilder, NodeMaterial } from '../../../nodes/Nodes.js';
2
2
 
3
- import UniformsGroup from '../../common/UniformsGroup.js';
3
+ import UniformBuffer from '../../common/UniformBuffer.js';
4
+ import NodeUniformsGroup from '../../common/nodes/NodeUniformsGroup.js';
5
+
4
6
  import { NodeSampledTexture, NodeSampledCubeTexture } from '../../common/nodes/NodeSampledTexture.js';
5
7
 
8
+ import { IntType } from 'three';
9
+
6
10
  const glslMethods = {
7
11
  [ MathNode.ATAN2 ]: 'atan',
8
12
  textureDimensions: 'textureSize'
@@ -14,13 +18,24 @@ const precisionLib = {
14
18
  high: 'highp'
15
19
  };
16
20
 
21
+ const supports = {
22
+ instance: true
23
+ };
24
+
25
+ const defaultPrecisions = `
26
+ precision highp float;
27
+ precision highp int;
28
+ precision mediump sampler2DArray;
29
+ precision lowp sampler2DShadow;
30
+ `;
31
+
17
32
  class GLSLNodeBuilder extends NodeBuilder {
18
33
 
19
34
  constructor( object, renderer, scene = null ) {
20
35
 
21
36
  super( object, renderer, new GLSLNodeParser(), scene );
22
37
 
23
- this.uniformsGroup = {};
38
+ this.uniformGroups = {};
24
39
 
25
40
  }
26
41
 
@@ -38,35 +53,81 @@ class GLSLNodeBuilder extends NodeBuilder {
38
53
 
39
54
  }
40
55
 
41
- getTexture( texture, textureProperty, uvSnippet ) {
56
+ buildFunctionCode( shaderNode ) {
57
+
58
+ const layout = shaderNode.layout;
59
+ const flowData = this.flowShaderNode( shaderNode );
60
+
61
+ const parameters = [];
62
+
63
+ for ( const input of layout.inputs ) {
64
+
65
+ parameters.push( this.getType( input.type ) + ' ' + input.name );
66
+
67
+ }
68
+
69
+ //
70
+
71
+ const code = `${ this.getType( layout.type ) } ${ layout.name }( ${ parameters.join( ', ' ) } ) {
72
+
73
+ ${ flowData.vars }
74
+
75
+ ${ flowData.code }
76
+ return ${ flowData.result };
77
+
78
+ }`;
79
+
80
+ //
81
+
82
+ return code;
83
+
84
+ }
85
+
86
+ generateTextureLoad( texture, textureProperty, uvIndexSnippet, depthSnippet, levelSnippet = '0' ) {
87
+
88
+ if ( depthSnippet ) {
89
+
90
+ return `texelFetch( ${ textureProperty }, ivec3( ${ uvIndexSnippet }, ${ depthSnippet } ), ${ levelSnippet } )`;
91
+
92
+ } else {
93
+
94
+ return `texelFetch( ${ textureProperty }, ${ uvIndexSnippet }, ${ levelSnippet } )`;
95
+
96
+ }
97
+
98
+ }
99
+
100
+ generateTexture( texture, textureProperty, uvSnippet, depthSnippet ) {
42
101
 
43
102
  if ( texture.isTextureCube ) {
44
103
 
45
- return `textureCube( ${textureProperty}, ${uvSnippet} )`;
104
+ return `textureCube( ${ textureProperty }, ${ uvSnippet } )`;
46
105
 
47
106
  } else if ( texture.isDepthTexture ) {
48
107
 
49
- return `texture( ${textureProperty}, ${uvSnippet} ).x`;
108
+ return `texture( ${ textureProperty }, ${ uvSnippet } ).x`;
50
109
 
51
110
  } else {
52
111
 
53
- return `texture( ${textureProperty}, ${uvSnippet} )`;
112
+ if ( depthSnippet ) uvSnippet = `vec3( ${ uvSnippet }, ${ depthSnippet } )`;
113
+
114
+ return `texture( ${ textureProperty }, ${ uvSnippet } )`;
54
115
 
55
116
  }
56
117
 
57
118
  }
58
119
 
59
- getTextureLevel( texture, textureProperty, uvSnippet, biasSnippet ) {
120
+ generateTextureLevel( texture, textureProperty, uvSnippet, levelSnippet ) {
60
121
 
61
- return `textureLod( ${textureProperty}, ${uvSnippet}, ${biasSnippet} )`;
122
+ return `textureLod( ${ textureProperty }, ${ uvSnippet }, ${ levelSnippet } )`;
62
123
 
63
124
  }
64
125
 
65
- getTextureCompare( texture, textureProperty, uvSnippet, compareSnippet, shaderStage = this.shaderStage ) {
126
+ generateTextureCompare( texture, textureProperty, uvSnippet, compareSnippet, depthSnippet, shaderStage = this.shaderStage ) {
66
127
 
67
128
  if ( shaderStage === 'fragment' ) {
68
129
 
69
- return `texture( ${textureProperty}, vec3( ${uvSnippet}, ${compareSnippet} ) )`;
130
+ return `texture( ${ textureProperty }, vec3( ${ uvSnippet }, ${ compareSnippet } ) )`;
70
131
 
71
132
  } else {
72
133
 
@@ -82,11 +143,15 @@ class GLSLNodeBuilder extends NodeBuilder {
82
143
 
83
144
  const vars = this.vars[ shaderStage ];
84
145
 
85
- for ( const variable of vars ) {
146
+ if ( vars !== undefined ) {
147
+
148
+ for ( const variable of vars ) {
149
+
150
+ if ( variable.isOutputStructVar ) continue;
86
151
 
87
- if ( variable.isOutputStructVar ) continue;
152
+ snippets.push( `${ this.getVar( variable.type, variable.name ) };` );
88
153
 
89
- snippets.push( `${ this.getVar( variable.type, variable.name ) };` );
154
+ }
90
155
 
91
156
  }
92
157
 
@@ -99,7 +164,7 @@ class GLSLNodeBuilder extends NodeBuilder {
99
164
  const uniforms = this.uniforms[ shaderStage ];
100
165
 
101
166
  const bindingSnippets = [];
102
- const groupSnippets = [];
167
+ const uniformGroups = {};
103
168
 
104
169
  for ( const uniform of uniforms ) {
105
170
 
@@ -108,19 +173,34 @@ class GLSLNodeBuilder extends NodeBuilder {
108
173
 
109
174
  if ( uniform.type === 'texture' ) {
110
175
 
111
- if ( uniform.node.value.compareFunction ) {
176
+ const texture = uniform.node.value;
177
+
178
+ if ( texture.compareFunction ) {
179
+
180
+ snippet = `sampler2DShadow ${ uniform.name };`;
112
181
 
113
- snippet = `sampler2DShadow ${uniform.name};`;
182
+ } else if ( texture.isDataArrayTexture === true ) {
183
+
184
+ snippet = `sampler2DArray ${ uniform.name };`;
114
185
 
115
186
  } else {
116
187
 
117
- snippet = `sampler2D ${uniform.name};`;
188
+ snippet = `sampler2D ${ uniform.name };`;
118
189
 
119
190
  }
120
191
 
121
192
  } else if ( uniform.type === 'cubeTexture' ) {
122
193
 
123
- snippet = `samplerCube ${uniform.name};`;
194
+ snippet = `samplerCube ${ uniform.name };`;
195
+
196
+ } else if ( uniform.type === 'buffer' ) {
197
+
198
+ const bufferNode = uniform.node;
199
+ const bufferType = this.getType( bufferNode.bufferType );
200
+ const bufferCount = bufferNode.bufferCount;
201
+
202
+ const bufferCountSnippet = bufferCount > 0 ? bufferCount : '';
203
+ snippet = `${bufferNode.name} {\n\t${ bufferType } ${ uniform.name }[${ bufferCountSnippet }];\n};\n`;
124
204
 
125
205
  } else {
126
206
 
@@ -144,6 +224,9 @@ class GLSLNodeBuilder extends NodeBuilder {
144
224
 
145
225
  snippet = '\t' + snippet;
146
226
 
227
+ const groupName = uniform.groupNode.name;
228
+ const groupSnippets = uniformGroups[ groupName ] || ( uniformGroups[ groupName ] = [] );
229
+
147
230
  groupSnippets.push( snippet );
148
231
 
149
232
  } else {
@@ -158,9 +241,11 @@ class GLSLNodeBuilder extends NodeBuilder {
158
241
 
159
242
  let output = '';
160
243
 
161
- if ( groupSnippets.length > 0 ) {
244
+ for ( const name in uniformGroups ) {
162
245
 
163
- output += this._getGLSLUniformStruct( shaderStage + 'NodeUniforms', groupSnippets.join( '\n' ) ) + '\n';
246
+ const groupSnippets = uniformGroups[ name ];
247
+
248
+ output += this._getGLSLUniformStruct( shaderStage + '_' + name, groupSnippets.join( '\n' ) ) + '\n';
164
249
 
165
250
  }
166
251
 
@@ -170,13 +255,37 @@ class GLSLNodeBuilder extends NodeBuilder {
170
255
 
171
256
  }
172
257
 
258
+ getTypeFromAttribute( attribute ) {
259
+
260
+ let nodeType = super.getTypeFromAttribute( attribute );
261
+
262
+ if ( /^[iu]/.test( nodeType ) && attribute.gpuType !== IntType ) {
263
+
264
+ let dataAttribute = attribute;
265
+
266
+ if ( attribute.isInterleavedBufferAttribute ) dataAttribute = attribute.data;
267
+
268
+ const array = dataAttribute.array;
269
+
270
+ if ( ( array instanceof Uint32Array || array instanceof Int32Array ) === false ) {
271
+
272
+ nodeType = nodeType.slice( 1 );
273
+
274
+ }
275
+
276
+ }
277
+
278
+ return nodeType;
279
+
280
+ }
281
+
173
282
  getAttributes( shaderStage ) {
174
283
 
175
284
  let snippet = '';
176
285
 
177
286
  if ( shaderStage === 'vertex' ) {
178
287
 
179
- const attributes = this.attributes;
288
+ const attributes = this.getAttributesArray();
180
289
 
181
290
  let location = 0;
182
291
 
@@ -215,7 +324,7 @@ class GLSLNodeBuilder extends NodeBuilder {
215
324
 
216
325
  if ( structs.length === 0 ) {
217
326
 
218
- return "layout( location = 0 ) out vec4 fragColor;\n";
327
+ return 'layout( location = 0 ) out vec4 fragColor;\n';
219
328
 
220
329
  }
221
330
 
@@ -223,7 +332,7 @@ class GLSLNodeBuilder extends NodeBuilder {
223
332
 
224
333
  const struct = structs[ index ];
225
334
 
226
- let snippet = `\n`;
335
+ let snippet = '\n';
227
336
  snippet += this.getStructMembers( struct );
228
337
  snippet += '\n';
229
338
 
@@ -245,7 +354,10 @@ class GLSLNodeBuilder extends NodeBuilder {
245
354
 
246
355
  for ( const varying of varyings ) {
247
356
 
248
- snippet += `${varying.needsInterpolation ? 'out' : '/*out*/'} ${varying.type} ${varying.name};\n`;
357
+ const type = varying.type;
358
+ const flat = type === 'int' || type === 'uint' ? 'flat ' : '';
359
+
360
+ snippet += `${flat}${varying.needsInterpolation ? 'out' : '/*out*/'} ${type} ${varying.name};\n`;
249
361
 
250
362
  }
251
363
 
@@ -255,7 +367,10 @@ class GLSLNodeBuilder extends NodeBuilder {
255
367
 
256
368
  if ( varying.needsInterpolation ) {
257
369
 
258
- snippet += `in ${varying.type} ${varying.name};\n`;
370
+ const type = varying.type;
371
+ const flat = type === 'int' || type === 'uint' ? 'flat ' : '';
372
+
373
+ snippet += `${flat}in ${type} ${varying.name};\n`;
259
374
 
260
375
  }
261
376
 
@@ -269,7 +384,13 @@ class GLSLNodeBuilder extends NodeBuilder {
269
384
 
270
385
  getVertexIndex() {
271
386
 
272
- return 'gl_VertexID';
387
+ return 'uint( gl_VertexID )';
388
+
389
+ }
390
+
391
+ getInstanceIndex() {
392
+
393
+ return 'uint( gl_InstanceID )';
273
394
 
274
395
  }
275
396
 
@@ -285,6 +406,19 @@ class GLSLNodeBuilder extends NodeBuilder {
285
406
 
286
407
  }
287
408
 
409
+ getFragDepth() {
410
+
411
+ return 'gl_FragDepth';
412
+
413
+ }
414
+
415
+ isAvailable( name ) {
416
+
417
+ return supports[ name ] === true;
418
+
419
+ }
420
+
421
+
288
422
  isFlipY() {
289
423
 
290
424
  return true;
@@ -307,8 +441,7 @@ ${vars}
307
441
  ${ this.getSignature() }
308
442
 
309
443
  // precision
310
- precision highp float;
311
- precision highp int;
444
+ ${ defaultPrecisions }
312
445
 
313
446
  // uniforms
314
447
  ${shaderData.uniforms}
@@ -344,9 +477,7 @@ void main() {
344
477
  ${ this.getSignature() }
345
478
 
346
479
  // precision
347
- precision highp float;
348
- precision highp int;
349
- precision lowp sampler2DShadow;
480
+ ${ defaultPrecisions }
350
481
 
351
482
  // uniforms
352
483
  ${shaderData.uniforms}
@@ -440,9 +571,6 @@ void main() {
440
571
  this.vertexShader = this._getGLSLVertexCode( shadersData.vertex );
441
572
  this.fragmentShader = this._getGLSLFragmentCode( shadersData.fragment );
442
573
 
443
- //console.log( this.vertexShader );
444
- //console.log( this.fragmentShader );
445
-
446
574
  } else {
447
575
 
448
576
  console.warn( 'GLSLNodeBuilder: compute shaders are not supported.' );
@@ -455,7 +583,7 @@ void main() {
455
583
  getUniformFromNode( node, type, shaderStage, name = null ) {
456
584
 
457
585
  const uniformNode = super.getUniformFromNode( node, type, shaderStage, name );
458
- const nodeData = this.getDataFromNode( node, shaderStage );
586
+ const nodeData = this.getDataFromNode( node, shaderStage, this.globalCache );
459
587
 
460
588
  let uniformGPU = nodeData.uniformGPU;
461
589
 
@@ -473,16 +601,33 @@ void main() {
473
601
 
474
602
  this.bindings[ shaderStage ].push( uniformGPU );
475
603
 
604
+ } else if ( type === 'buffer' ) {
605
+
606
+ node.name = `NodeBuffer_${node.id}`;
607
+
608
+ const buffer = new UniformBuffer( node.name, node.value );
609
+
610
+ uniformNode.name = `buffer${node.id}`;
611
+
612
+ this.bindings[ shaderStage ].push( buffer );
613
+
614
+ uniformGPU = buffer;
615
+
476
616
  } else {
477
617
 
478
- let uniformsGroup = this.uniformsGroup[ shaderStage ];
618
+ const group = node.groupNode;
619
+ const groupName = group.name;
620
+
621
+ const uniformsStage = this.uniformGroups[ shaderStage ] || ( this.uniformGroups[ shaderStage ] = {} );
622
+
623
+ let uniformsGroup = uniformsStage[ groupName ];
479
624
 
480
625
  if ( uniformsGroup === undefined ) {
481
626
 
482
- uniformsGroup = new UniformsGroup( shaderStage + 'NodeUniforms' );
627
+ uniformsGroup = new NodeUniformsGroup( shaderStage + '_' + groupName, group );
483
628
  //uniformsGroup.setVisibility( gpuShaderStageLib[ shaderStage ] );
484
629
 
485
- this.uniformsGroup[ shaderStage ] = uniformsGroup;
630
+ uniformsStage[ groupName ] = uniformsGroup;
486
631
 
487
632
  this.bindings[ shaderStage ].push( uniformsGroup );
488
633
 
@@ -1,3 +1,5 @@
1
+ import { IntType } from 'three';
2
+
1
3
  class WebGLAttributeUtils {
2
4
 
3
5
  constructor( backend ) {
@@ -14,11 +16,24 @@ class WebGLAttributeUtils {
14
16
  const array = attribute.array;
15
17
  const usage = attribute.usage || gl.STATIC_DRAW;
16
18
 
17
- const bufferGPU = gl.createBuffer();
19
+ const bufferAttribute = attribute.isInterleavedBufferAttribute ? attribute.data : attribute;
20
+ const bufferData = backend.get( bufferAttribute );
18
21
 
19
- gl.bindBuffer( bufferType, bufferGPU );
20
- gl.bufferData( bufferType, array, usage );
21
- gl.bindBuffer( bufferType, null );
22
+ let bufferGPU = bufferData.bufferGPU;
23
+
24
+ if ( bufferGPU === undefined ) {
25
+
26
+ bufferGPU = gl.createBuffer();
27
+
28
+ gl.bindBuffer( bufferType, bufferGPU );
29
+ gl.bufferData( bufferType, array, usage );
30
+ gl.bindBuffer( bufferType, null );
31
+
32
+ bufferData.bufferGPU = bufferGPU;
33
+ bufferData.bufferType = bufferType;
34
+ bufferData.version = bufferAttribute.version;
35
+
36
+ }
22
37
 
23
38
  //attribute.onUploadCallback();
24
39
 
@@ -74,11 +89,83 @@ class WebGLAttributeUtils {
74
89
  bufferGPU,
75
90
  type,
76
91
  bytesPerElement: array.BYTES_PER_ELEMENT,
77
- version: attribute.version
92
+ version: attribute.version,
93
+ isInteger: type === gl.INT || type === gl.UNSIGNED_INT || attribute.gpuType === IntType
78
94
  } );
79
95
 
80
96
  }
81
97
 
98
+ updateAttribute( attribute ) {
99
+
100
+ const backend = this.backend;
101
+ const { gl } = backend;
102
+
103
+ const array = attribute.array;
104
+ const bufferAttribute = attribute.isInterleavedBufferAttribute ? attribute.data : attribute;
105
+ const bufferData = backend.get( bufferAttribute );
106
+ const bufferType = bufferData.bufferType;
107
+ const updateRanges = attribute.isInterleavedBufferAttribute ? attribute.data.updateRanges : attribute.updateRanges;
108
+
109
+ gl.bindBuffer( bufferType, bufferData.bufferGPU );
110
+
111
+ if ( updateRanges.length === 0 ) {
112
+
113
+ // Not using update ranges
114
+
115
+ gl.bufferSubData( bufferType, 0, array );
116
+
117
+ } else {
118
+
119
+ for ( let i = 0, l = updateRanges.length; i < l; i ++ ) {
120
+
121
+ const range = updateRanges[ i ];
122
+ gl.bufferSubData( bufferType, range.start * array.BYTES_PER_ELEMENT,
123
+ array, range.start, range.count );
124
+
125
+ }
126
+
127
+ bufferAttribute.clearUpdateRanges();
128
+
129
+ }
130
+
131
+ gl.bindBuffer( bufferType, null );
132
+
133
+ bufferData.version = bufferAttribute.version;
134
+
135
+ }
136
+
137
+ async getArrayBufferAsync( attribute ) {
138
+
139
+ const backend = this.backend;
140
+ const { gl } = backend;
141
+
142
+ const bufferAttribute = attribute.isInterleavedBufferAttribute ? attribute.data : attribute;
143
+ const { bufferGPU } = backend.get( bufferAttribute );
144
+
145
+ const array = attribute.array;
146
+ const byteLength = array.byteLength;
147
+
148
+ gl.bindBuffer( gl.COPY_READ_BUFFER, bufferGPU );
149
+
150
+ const writeBuffer = gl.createBuffer();
151
+
152
+ gl.bindBuffer( gl.COPY_WRITE_BUFFER, writeBuffer );
153
+ gl.bufferData( gl.COPY_WRITE_BUFFER, byteLength, gl.STREAM_READ );
154
+
155
+ gl.copyBufferSubData( gl.COPY_READ_BUFFER, gl.COPY_WRITE_BUFFER, 0, 0, byteLength );
156
+
157
+ await backend.utils._clientWaitAsync();
158
+
159
+ const dstBuffer = new attribute.array.constructor( array.length );
160
+
161
+ gl.getBufferSubData( gl.COPY_WRITE_BUFFER, 0, dstBuffer );
162
+
163
+ gl.deleteBuffer( writeBuffer );
164
+
165
+ return dstBuffer.buffer;
166
+
167
+ }
168
+
82
169
  }
83
170
 
84
171
  export default WebGLAttributeUtils;
@@ -0,0 +1,36 @@
1
+ class WebGLCapabilities {
2
+
3
+ constructor( backend ) {
4
+
5
+ this.backend = backend;
6
+
7
+ this.maxAnisotropy = null;
8
+
9
+ }
10
+
11
+ getMaxAnisotropy() {
12
+
13
+ if ( this.maxAnisotropy !== null ) return this.maxAnisotropy;
14
+
15
+ const gl = this.backend.gl;
16
+ const extensions = this.backend.extensions;
17
+
18
+ if ( extensions.has( 'EXT_texture_filter_anisotropic' ) === true ) {
19
+
20
+ const extension = extensions.get( 'EXT_texture_filter_anisotropic' );
21
+
22
+ this.maxAnisotropy = gl.getParameter( extension.MAX_TEXTURE_MAX_ANISOTROPY_EXT );
23
+
24
+ } else {
25
+
26
+ this.maxAnisotropy = 0;
27
+
28
+ }
29
+
30
+ return this.maxAnisotropy;
31
+
32
+ }
33
+
34
+ }
35
+
36
+ export default WebGLCapabilities;
@@ -7,11 +7,21 @@ class WebGLExtensions {
7
7
  this.gl = this.backend.gl;
8
8
  this.availableExtensions = this.gl.getSupportedExtensions();
9
9
 
10
+ this.extensions = {};
11
+
10
12
  }
11
13
 
12
14
  get( name ) {
13
15
 
14
- return this.gl.getExtension( name );
16
+ let extension = this.extensions[ name ];
17
+
18
+ if ( extension === undefined ) {
19
+
20
+ extension = this.gl.getExtension( name );
21
+
22
+ }
23
+
24
+ return extension;
15
25
 
16
26
  }
17
27
 
@@ -21,7 +21,7 @@ class WebGLState {
21
21
  this.currentFlipSided = null;
22
22
  this.currentCullFace = null;
23
23
  this.currentProgram = null;
24
- this.currentBlendingEnabled = null;
24
+ this.currentBlendingEnabled = false;
25
25
  this.currentBlending = null;
26
26
  this.currentBlendSrc = null;
27
27
  this.currentBlendDst = null;
@@ -30,6 +30,7 @@ class WebGLState {
30
30
  this.currentPremultipledAlpha = null;
31
31
  this.currentPolygonOffsetFactor = null;
32
32
  this.currentPolygonOffsetUnits = null;
33
+ this.currentColorMask = null;
33
34
  this.currentDepthFunc = null;
34
35
  this.currentDepthMask = null;
35
36
  this.currentStencilFunc = null;
@@ -296,6 +297,17 @@ class WebGLState {
296
297
 
297
298
  }
298
299
 
300
+ setColorMask( colorMask ) {
301
+
302
+ if ( this.currentColorMask !== colorMask ) {
303
+
304
+ this.gl.colorMask( colorMask, colorMask, colorMask, colorMask );
305
+ this.currentColorMask = colorMask;
306
+
307
+ }
308
+
309
+ }
310
+
299
311
  setDepthTest( depthTest ) {
300
312
 
301
313
  const { gl } = this;
@@ -462,7 +474,7 @@ class WebGLState {
462
474
  this.setDepthFunc( material.depthFunc );
463
475
  this.setDepthTest( material.depthTest );
464
476
  this.setDepthMask( material.depthWrite );
465
- this.setDepthMask( material.colorWrite );
477
+ this.setColorMask( material.colorWrite );
466
478
 
467
479
  const stencilWrite = material.stencilWrite;
468
480
  this.setStencilTest( stencilWrite );