super-three 0.165.0 → 0.168.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 (462) hide show
  1. package/build/three.cjs +854 -410
  2. package/build/three.module.js +849 -411
  3. package/build/three.module.min.js +1 -1
  4. package/build/three.webgpu.js +77755 -0
  5. package/build/three.webgpu.min.js +6 -0
  6. package/examples/jsm/Addons.js +5 -2
  7. package/examples/jsm/animation/AnimationClipCreator.js +1 -1
  8. package/examples/jsm/capabilities/WebGL.js +27 -21
  9. package/examples/jsm/controls/ArcballControls.js +174 -158
  10. package/examples/jsm/controls/DragControls.js +260 -132
  11. package/examples/jsm/controls/FirstPersonControls.js +175 -163
  12. package/examples/jsm/controls/FlyControls.js +194 -188
  13. package/examples/jsm/controls/OrbitControls.js +777 -786
  14. package/examples/jsm/controls/PointerLockControls.js +24 -15
  15. package/examples/jsm/controls/TrackballControls.js +453 -452
  16. package/examples/jsm/csm/CSMShader.js +4 -4
  17. package/examples/jsm/effects/AnaglyphEffect.js +6 -13
  18. package/examples/jsm/effects/ParallaxBarrierEffect.js +17 -11
  19. package/examples/jsm/effects/StereoEffect.js +6 -1
  20. package/examples/jsm/environments/RoomEnvironment.js +1 -1
  21. package/examples/jsm/exporters/GLTFExporter.js +13 -4
  22. package/examples/jsm/exporters/USDZExporter.js +29 -8
  23. package/examples/jsm/geometries/TeapotGeometry.js +1 -1
  24. package/examples/jsm/helpers/LightProbeHelper.js +42 -43
  25. package/examples/jsm/helpers/ViewHelper.js +51 -2
  26. package/examples/jsm/libs/tween.module.js +64 -75
  27. package/examples/jsm/lights/RectAreaLightTexturesLib.js +91 -0
  28. package/examples/jsm/lights/RectAreaLightUniformsLib.js +8 -63
  29. package/examples/jsm/lines/webgpu/Line2.js +20 -0
  30. package/examples/jsm/lines/webgpu/LineSegments2.js +376 -0
  31. package/examples/jsm/loaders/FBXLoader.js +23 -45
  32. package/examples/jsm/loaders/GLTFLoader.js +10 -4
  33. package/examples/jsm/loaders/KTX2Loader.js +19 -7
  34. package/examples/jsm/loaders/MaterialXLoader.js +10 -10
  35. package/examples/jsm/loaders/PCDLoader.js +9 -9
  36. package/examples/jsm/loaders/USDZLoader.js +124 -76
  37. package/examples/jsm/loaders/UltraHDRLoader.js +583 -0
  38. package/examples/jsm/loaders/VTKLoader.js +76 -3
  39. package/examples/jsm/misc/GPUComputationRenderer.js +9 -19
  40. package/examples/jsm/modifiers/SimplifyModifier.js +2 -1
  41. package/examples/jsm/objects/InstancedPoints.js +2 -2
  42. package/examples/jsm/objects/SkyMesh.js +188 -0
  43. package/examples/jsm/objects/Water2Mesh.js +159 -0
  44. package/examples/jsm/objects/WaterMesh.js +102 -0
  45. package/examples/jsm/physics/RapierPhysics.js +20 -0
  46. package/examples/jsm/postprocessing/OutlinePass.js +31 -46
  47. package/examples/jsm/postprocessing/RenderTransitionPass.js +13 -38
  48. package/examples/jsm/postprocessing/SSAARenderPass.js +3 -1
  49. package/examples/jsm/postprocessing/SSAOPass.js +6 -9
  50. package/examples/jsm/postprocessing/UnrealBloomPass.js +4 -4
  51. package/examples/jsm/shaders/BleachBypassShader.js +1 -2
  52. package/examples/jsm/shaders/ColorifyShader.js +1 -2
  53. package/examples/jsm/shaders/FXAAShader.js +0 -2
  54. package/examples/jsm/shaders/GTAOShader.js +1 -1
  55. package/examples/jsm/shaders/LuminosityHighPassShader.js +1 -3
  56. package/examples/jsm/shaders/OutputShader.js +1 -1
  57. package/examples/jsm/transpiler/GLSLDecoder.js +46 -4
  58. package/examples/jsm/transpiler/TSLEncoder.js +24 -22
  59. package/examples/jsm/utils/TextureUtils.js +1 -1
  60. package/package.json +8 -6
  61. package/src/Three.WebGPU.js +200 -0
  62. package/src/Three.js +3 -0
  63. package/src/constants.js +4 -1
  64. package/src/core/Object3D.js +22 -22
  65. package/src/extras/Controls.js +32 -0
  66. package/src/extras/TextureUtils.js +210 -0
  67. package/src/lights/Light.js +1 -0
  68. package/src/lights/LightShadow.js +5 -0
  69. package/{examples/jsm/lights → src/lights/webgpu}/IESSpotLight.js +1 -1
  70. package/src/loaders/ObjectLoader.js +33 -2
  71. package/{examples/jsm/nodes/loaders → src/loaders/nodes}/NodeLoader.js +6 -4
  72. package/{examples/jsm/nodes/loaders → src/loaders/nodes}/NodeMaterialLoader.js +2 -2
  73. package/{examples/jsm/nodes/loaders → src/loaders/nodes}/NodeObjectLoader.js +2 -1
  74. package/src/materials/Material.js +7 -1
  75. package/{examples/jsm/nodes/materials → src/materials/nodes}/InstancedPointsNodeMaterial.js +36 -27
  76. package/{examples/jsm/nodes/materials → src/materials/nodes}/Line2NodeMaterial.js +37 -40
  77. package/src/materials/nodes/LineBasicNodeMaterial.js +27 -0
  78. package/{examples/jsm/nodes/materials → src/materials/nodes}/LineDashedNodeMaterial.js +10 -11
  79. package/src/materials/nodes/MeshBasicNodeMaterial.js +73 -0
  80. package/src/materials/nodes/MeshLambertNodeMaterial.js +43 -0
  81. package/src/materials/nodes/MeshMatcapNodeMaterial.js +53 -0
  82. package/src/materials/nodes/MeshNormalNodeMaterial.js +40 -0
  83. package/src/materials/nodes/MeshPhongNodeMaterial.js +74 -0
  84. package/{examples/jsm/nodes/materials → src/materials/nodes}/MeshPhysicalNodeMaterial.js +22 -20
  85. package/{examples/jsm/nodes/materials → src/materials/nodes}/MeshSSSNodeMaterial.js +6 -6
  86. package/{examples/jsm/nodes/materials → src/materials/nodes}/MeshStandardNodeMaterial.js +28 -11
  87. package/src/materials/nodes/MeshToonNodeMaterial.js +34 -0
  88. package/{examples/jsm/nodes/materials → src/materials/nodes}/NodeMaterial.js +142 -96
  89. package/{examples/jsm/nodes/materials/Materials.js → src/materials/nodes/NodeMaterials.js} +1 -1
  90. package/{examples/jsm/nodes/materials → src/materials/nodes}/PointsNodeMaterial.js +5 -6
  91. package/src/materials/nodes/ShadowNodeMaterial.js +34 -0
  92. package/{examples/jsm/nodes/materials → src/materials/nodes}/SpriteNodeMaterial.js +13 -13
  93. package/{examples/jsm/nodes/materials → src/materials/nodes}/VolumeNodeMaterial.js +14 -16
  94. package/src/math/Box2.js +4 -4
  95. package/src/math/Box3.js +6 -6
  96. package/src/math/ColorManagement.js +10 -0
  97. package/src/math/Matrix2.js +54 -0
  98. package/src/math/Vector4.js +13 -0
  99. package/src/nodes/Nodes.js +164 -0
  100. package/src/nodes/TSL.js +176 -0
  101. package/{examples/jsm → src}/nodes/accessors/AccessorsUtils.js +8 -8
  102. package/src/nodes/accessors/BatchNode.js +124 -0
  103. package/{examples/jsm/nodes/accessors/BitangentNode.js → src/nodes/accessors/Bitangent.js} +9 -9
  104. package/{examples/jsm → src}/nodes/accessors/BufferAttributeNode.js +41 -6
  105. package/{examples/jsm → src}/nodes/accessors/BufferNode.js +4 -4
  106. package/src/nodes/accessors/Camera.js +19 -0
  107. package/{examples/jsm → src}/nodes/accessors/ClippingNode.js +16 -14
  108. package/src/nodes/accessors/CubeTextureNode.js +76 -0
  109. package/src/nodes/accessors/InstanceNode.js +144 -0
  110. package/src/nodes/accessors/InstancedPointsMaterialNode.js +21 -0
  111. package/{examples/jsm → src}/nodes/accessors/MaterialNode.js +66 -49
  112. package/src/nodes/accessors/MaterialProperties.js +3 -0
  113. package/{examples/jsm → src}/nodes/accessors/MaterialReferenceNode.js +6 -4
  114. package/src/nodes/accessors/ModelNode.js +37 -0
  115. package/{examples/jsm → src}/nodes/accessors/ModelViewProjectionNode.js +6 -7
  116. package/{examples/jsm → src}/nodes/accessors/MorphNode.js +35 -31
  117. package/src/nodes/accessors/Normal.js +62 -0
  118. package/{examples/jsm → src}/nodes/accessors/Object3DNode.js +11 -11
  119. package/src/nodes/accessors/PointUVNode.js +26 -0
  120. package/src/nodes/accessors/Position.js +10 -0
  121. package/src/nodes/accessors/ReferenceBaseNode.js +143 -0
  122. package/{examples/jsm → src}/nodes/accessors/ReferenceNode.js +14 -8
  123. package/src/nodes/accessors/ReflectVector.js +10 -0
  124. package/{examples/jsm → src}/nodes/accessors/RendererReferenceNode.js +6 -6
  125. package/{examples/jsm → src}/nodes/accessors/SceneNode.js +5 -6
  126. package/src/nodes/accessors/SkinningNode.js +187 -0
  127. package/{examples/jsm → src}/nodes/accessors/StorageBufferNode.js +54 -6
  128. package/{examples/jsm → src}/nodes/accessors/StorageTextureNode.js +16 -7
  129. package/src/nodes/accessors/Tangent.js +22 -0
  130. package/{examples/jsm → src}/nodes/accessors/Texture3DNode.js +11 -11
  131. package/{examples/jsm/nodes/accessors/TextureBicubicNode.js → src/nodes/accessors/TextureBicubic.js} +3 -32
  132. package/{examples/jsm → src}/nodes/accessors/TextureNode.js +69 -37
  133. package/{examples/jsm → src}/nodes/accessors/TextureSizeNode.js +4 -6
  134. package/{examples/jsm/nodes/accessors/UniformsNode.js → src/nodes/accessors/UniformArrayNode.js} +24 -9
  135. package/{examples/jsm → src}/nodes/accessors/UserDataNode.js +4 -4
  136. package/src/nodes/accessors/VelocityNode.js +83 -0
  137. package/{examples/jsm → src}/nodes/accessors/VertexColorNode.js +6 -5
  138. package/{examples/jsm → src}/nodes/code/CodeNode.js +5 -5
  139. package/{examples/jsm → src}/nodes/code/ExpressionNode.js +4 -4
  140. package/{examples/jsm → src}/nodes/code/FunctionCallNode.js +5 -5
  141. package/{examples/jsm → src}/nodes/code/FunctionNode.js +5 -23
  142. package/{examples/jsm → src}/nodes/code/ScriptableNode.js +18 -6
  143. package/{examples/jsm → src}/nodes/code/ScriptableValueNode.js +6 -7
  144. package/{examples/jsm → src}/nodes/core/AssignNode.js +5 -5
  145. package/{examples/jsm → src}/nodes/core/AttributeNode.js +22 -21
  146. package/{examples/jsm → src}/nodes/core/BypassNode.js +5 -5
  147. package/src/nodes/core/CacheNode.js +46 -0
  148. package/{examples/jsm → src}/nodes/core/ConstNode.js +2 -2
  149. package/{examples/jsm → src}/nodes/core/ContextNode.js +17 -11
  150. package/{examples/jsm → src}/nodes/core/IndexNode.js +17 -6
  151. package/{examples/jsm → src}/nodes/core/InputNode.js +2 -2
  152. package/{examples/jsm → src}/nodes/core/LightingModel.js +2 -2
  153. package/src/nodes/core/MRTNode.js +82 -0
  154. package/{examples/jsm → src}/nodes/core/Node.js +57 -31
  155. package/{examples/jsm → src}/nodes/core/NodeBuilder.js +216 -65
  156. package/src/nodes/core/NodeCache.js +36 -0
  157. package/{examples/jsm → src}/nodes/core/NodeFrame.js +42 -0
  158. package/{examples/jsm → src}/nodes/core/NodeFunction.js +2 -2
  159. package/{examples/jsm → src}/nodes/core/NodeUniform.js +1 -2
  160. package/{examples/jsm → src}/nodes/core/NodeUtils.js +7 -1
  161. package/{examples/jsm → src}/nodes/core/OutputStructNode.js +4 -4
  162. package/{examples/jsm → src}/nodes/core/ParameterNode.js +4 -4
  163. package/src/nodes/core/PropertyNode.js +84 -0
  164. package/{examples/jsm → src}/nodes/core/StackNode.js +26 -10
  165. package/{examples/jsm → src}/nodes/core/StructTypeNode.js +2 -2
  166. package/{examples/jsm → src}/nodes/core/TempNode.js +4 -4
  167. package/src/nodes/core/UniformGroupNode.js +55 -0
  168. package/{examples/jsm → src}/nodes/core/UniformNode.js +14 -5
  169. package/{examples/jsm → src}/nodes/core/VarNode.js +8 -12
  170. package/{examples/jsm → src}/nodes/core/VaryingNode.js +13 -5
  171. package/{examples/jsm → src}/nodes/display/AfterImageNode.js +27 -35
  172. package/src/nodes/display/AnaglyphPassNode.js +61 -0
  173. package/{examples/jsm → src}/nodes/display/AnamorphicNode.js +27 -30
  174. package/src/nodes/display/BleachBypass.js +26 -0
  175. package/src/nodes/display/BlendMode.js +54 -0
  176. package/src/nodes/display/BloomNode.js +335 -0
  177. package/{examples/jsm → src}/nodes/display/BumpMapNode.js +7 -12
  178. package/src/nodes/display/ColorAdjustment.js +46 -0
  179. package/src/nodes/display/ColorSpaceFunctions.js +38 -0
  180. package/src/nodes/display/ColorSpaceNode.js +85 -0
  181. package/src/nodes/display/DenoiseNode.js +201 -0
  182. package/src/nodes/display/DepthOfFieldNode.js +121 -0
  183. package/src/nodes/display/DotScreenNode.js +63 -0
  184. package/src/nodes/display/FXAANode.js +329 -0
  185. package/src/nodes/display/FilmNode.js +53 -0
  186. package/src/nodes/display/FrontFacingNode.js +41 -0
  187. package/src/nodes/display/GTAONode.js +328 -0
  188. package/{examples/jsm → src}/nodes/display/GaussianBlurNode.js +44 -24
  189. package/src/nodes/display/Lut3DNode.js +54 -0
  190. package/src/nodes/display/MotionBlur.js +25 -0
  191. package/{examples/jsm → src}/nodes/display/NormalMapNode.js +9 -11
  192. package/src/nodes/display/ParallaxBarrierPassNode.js +55 -0
  193. package/src/nodes/display/PassNode.js +367 -0
  194. package/src/nodes/display/PixelationPassNode.js +206 -0
  195. package/{examples/jsm → src}/nodes/display/PosterizeNode.js +4 -6
  196. package/src/nodes/display/RGBShiftNode.js +50 -0
  197. package/src/nodes/display/RenderOutputNode.js +56 -0
  198. package/src/nodes/display/SSAAPassNode.js +284 -0
  199. package/src/nodes/display/Sepia.js +17 -0
  200. package/src/nodes/display/SobelOperatorNode.js +123 -0
  201. package/src/nodes/display/StereoCompositePassNode.js +107 -0
  202. package/src/nodes/display/StereoPassNode.js +80 -0
  203. package/src/nodes/display/ToneMappingFunctions.js +190 -0
  204. package/src/nodes/display/ToneMappingNode.js +66 -0
  205. package/src/nodes/display/TransitionNode.js +77 -0
  206. package/src/nodes/display/ViewportDepthNode.js +121 -0
  207. package/src/nodes/display/ViewportDepthTextureNode.js +30 -0
  208. package/{examples/jsm → src}/nodes/display/ViewportNode.js +28 -26
  209. package/src/nodes/display/ViewportSharedTextureNode.js +36 -0
  210. package/{examples/jsm → src}/nodes/display/ViewportTextureNode.js +12 -12
  211. package/{examples/jsm → src}/nodes/fog/FogExp2Node.js +4 -6
  212. package/{examples/jsm → src}/nodes/fog/FogNode.js +5 -7
  213. package/{examples/jsm → src}/nodes/fog/FogRangeNode.js +4 -6
  214. package/{examples/jsm → src}/nodes/functions/BSDF/BRDF_GGX.js +4 -4
  215. package/{examples/jsm → src}/nodes/functions/BSDF/BRDF_Lambert.js +2 -2
  216. package/{examples/jsm → src}/nodes/functions/BSDF/BRDF_Sheen.js +6 -6
  217. package/{examples/jsm → src}/nodes/functions/BSDF/DFGApprox.js +2 -2
  218. package/{examples/jsm → src}/nodes/functions/BSDF/D_GGX.js +2 -2
  219. package/{examples/jsm → src}/nodes/functions/BSDF/D_GGX_Anisotropic.js +3 -3
  220. package/{examples/jsm → src}/nodes/functions/BSDF/EnvironmentBRDF.js +2 -2
  221. package/{examples/jsm → src}/nodes/functions/BSDF/F_Schlick.js +2 -2
  222. package/src/nodes/functions/BSDF/LTC.js +131 -0
  223. package/{examples/jsm → src}/nodes/functions/BSDF/Schlick_to_F0.js +2 -2
  224. package/{examples/jsm → src}/nodes/functions/BSDF/V_GGX_SmithCorrelated.js +2 -2
  225. package/{examples/jsm → src}/nodes/functions/BSDF/V_GGX_SmithCorrelated_Anisotropic.js +2 -2
  226. package/src/nodes/functions/BasicLightingModel.js +78 -0
  227. package/{examples/jsm → src}/nodes/functions/PhongLightingModel.js +10 -8
  228. package/{examples/jsm → src}/nodes/functions/PhysicalLightingModel.js +73 -31
  229. package/{examples/jsm → src}/nodes/functions/ShadowMaskModel.js +1 -1
  230. package/{examples/jsm → src}/nodes/functions/ToonLightingModel.js +6 -4
  231. package/src/nodes/functions/material/getGeometryRoughness.js +13 -0
  232. package/{examples/jsm → src}/nodes/functions/material/getRoughness.js +2 -2
  233. package/{examples/jsm → src}/nodes/geometry/RangeNode.js +23 -10
  234. package/{examples/jsm → src}/nodes/gpgpu/ComputeNode.js +5 -5
  235. package/src/nodes/lighting/AONode.js +24 -0
  236. package/{examples/jsm → src}/nodes/lighting/AmbientLightNode.js +2 -7
  237. package/src/nodes/lighting/AnalyticLightNode.js +354 -0
  238. package/src/nodes/lighting/BasicEnvironmentNode.js +27 -0
  239. package/src/nodes/lighting/BasicLightMapNode.js +29 -0
  240. package/{examples/jsm → src}/nodes/lighting/DirectionalLightNode.js +3 -9
  241. package/{examples/jsm → src}/nodes/lighting/EnvironmentNode.js +23 -21
  242. package/{examples/jsm → src}/nodes/lighting/HemisphereLightNode.js +4 -7
  243. package/{examples/jsm → src}/nodes/lighting/IESSpotLightNode.js +3 -8
  244. package/{examples/jsm → src}/nodes/lighting/IrradianceNode.js +2 -2
  245. package/{examples/jsm → src}/nodes/lighting/LightNode.js +5 -5
  246. package/src/nodes/lighting/LightProbeNode.js +76 -0
  247. package/{examples/jsm → src}/nodes/lighting/LightUtils.js +3 -3
  248. package/src/nodes/lighting/LightingContextNode.js +64 -0
  249. package/{examples/jsm → src}/nodes/lighting/LightingNode.js +4 -2
  250. package/src/nodes/lighting/LightsNode.js +231 -0
  251. package/{examples/jsm → src}/nodes/lighting/PointLightNode.js +4 -10
  252. package/src/nodes/lighting/RectAreaLightNode.js +93 -0
  253. package/{examples/jsm → src}/nodes/lighting/SpotLightNode.js +4 -10
  254. package/{examples/jsm → src}/nodes/materialx/MaterialXNodes.js +2 -2
  255. package/{examples/jsm → src}/nodes/materialx/lib/mx_hsv.js +43 -46
  256. package/{examples/jsm → src}/nodes/materialx/lib/mx_noise.js +500 -603
  257. package/{examples/jsm → src}/nodes/materialx/lib/mx_transform_color.js +3 -9
  258. package/{examples/jsm/nodes/math/CondNode.js → src/nodes/math/ConditionalNode.js} +31 -13
  259. package/src/nodes/math/Hash.js +13 -0
  260. package/src/nodes/math/MathNode.js +404 -0
  261. package/{examples/jsm → src}/nodes/math/MathUtils.js +0 -7
  262. package/{examples/jsm → src}/nodes/math/OperatorNode.js +100 -58
  263. package/{examples/jsm → src}/nodes/math/TriNoise3D.js +19 -29
  264. package/{examples/jsm → src}/nodes/parsers/GLSLNodeFunction.js +7 -7
  265. package/{examples/jsm → src}/nodes/pmrem/PMREMNode.js +60 -16
  266. package/{examples/jsm → src}/nodes/pmrem/PMREMUtils.js +46 -46
  267. package/src/nodes/procedural/Checker.js +14 -0
  268. package/src/nodes/tsl/TSLBase.js +30 -0
  269. package/{examples/jsm/nodes/shadernode/ShaderNode.js → src/nodes/tsl/TSLCore.js} +106 -96
  270. package/{examples/jsm → src}/nodes/utils/ArrayElementNode.js +2 -2
  271. package/{examples/jsm → src}/nodes/utils/ConvertNode.js +2 -2
  272. package/src/nodes/utils/CubeMapNode.js +157 -0
  273. package/src/nodes/utils/Discard.js +8 -0
  274. package/{examples/jsm → src}/nodes/utils/EquirectUVNode.js +5 -5
  275. package/src/nodes/utils/FlipNode.js +65 -0
  276. package/{examples/jsm → src}/nodes/utils/FunctionOverloadingNode.js +7 -5
  277. package/{examples/jsm → src}/nodes/utils/JoinNode.js +2 -2
  278. package/{examples/jsm → src}/nodes/utils/LoopNode.js +19 -12
  279. package/{examples/jsm → src}/nodes/utils/MatcapUVNode.js +6 -6
  280. package/{examples/jsm → src}/nodes/utils/MaxMipLevelNode.js +12 -6
  281. package/{examples/jsm → src}/nodes/utils/OscNode.js +7 -7
  282. package/src/nodes/utils/Packing.js +4 -0
  283. package/src/nodes/utils/RTTNode.js +130 -0
  284. package/{examples/jsm → src}/nodes/utils/ReflectorNode.js +17 -4
  285. package/{examples/jsm → src}/nodes/utils/RemapNode.js +7 -7
  286. package/{examples/jsm → src}/nodes/utils/RotateNode.js +4 -12
  287. package/{examples/jsm → src}/nodes/utils/SetNode.js +2 -2
  288. package/{examples/jsm → src}/nodes/utils/SplitNode.js +2 -2
  289. package/{examples/jsm → src}/nodes/utils/SpriteSheetUVNode.js +5 -5
  290. package/src/nodes/utils/SpriteUtils.js +47 -0
  291. package/{examples/jsm → src}/nodes/utils/StorageArrayElementNode.js +4 -6
  292. package/{examples/jsm → src}/nodes/utils/TimerNode.js +5 -5
  293. package/{examples/jsm → src}/nodes/utils/TriplanarTexturesNode.js +7 -9
  294. package/src/nodes/utils/UVUtils.js +19 -0
  295. package/src/nodes/utils/ViewportUtils.js +14 -0
  296. package/src/objects/BatchedMesh.js +169 -190
  297. package/src/objects/InstancedMesh.js +1 -1
  298. package/src/renderers/WebGLRenderer.js +60 -23
  299. package/{examples/jsm → src}/renderers/common/Attributes.js +2 -1
  300. package/{examples/jsm → src}/renderers/common/Backend.js +30 -27
  301. package/{examples/jsm → src}/renderers/common/Background.js +12 -4
  302. package/src/renderers/common/BindGroup.js +18 -0
  303. package/{examples/jsm → src}/renderers/common/Bindings.js +45 -32
  304. package/{examples/jsm → src}/renderers/common/ClippingContext.js +18 -7
  305. package/{examples/jsm → src}/renderers/common/Color4.js +1 -1
  306. package/{examples/jsm → src}/renderers/common/CubeRenderTarget.js +16 -4
  307. package/{examples/jsm → src}/renderers/common/Geometries.js +37 -5
  308. package/{examples/jsm → src}/renderers/common/Info.js +34 -6
  309. package/src/renderers/common/PostProcessing.js +90 -0
  310. package/{examples/jsm/objects → src/renderers/common}/QuadMesh.js +8 -3
  311. package/{examples/jsm → src}/renderers/common/RenderContext.js +25 -1
  312. package/{examples/jsm → src}/renderers/common/RenderContexts.js +1 -1
  313. package/{examples/jsm → src}/renderers/common/RenderList.js +1 -1
  314. package/{examples/jsm → src}/renderers/common/RenderObject.js +45 -12
  315. package/{examples/jsm → src}/renderers/common/Renderer.js +151 -73
  316. package/{examples/jsm → src}/renderers/common/SampledTexture.js +14 -5
  317. package/src/renderers/common/StandardRenderer.js +18 -0
  318. package/{examples/jsm → src}/renderers/common/StorageBufferAttribute.js +1 -1
  319. package/{examples/jsm → src}/renderers/common/StorageInstancedBufferAttribute.js +1 -1
  320. package/{examples/jsm → src}/renderers/common/StorageTexture.js +2 -1
  321. package/{examples/jsm → src}/renderers/common/Textures.js +14 -14
  322. package/{examples/jsm → src}/renderers/common/Uniform.js +9 -4
  323. package/{examples/jsm → src}/renderers/common/UniformsGroup.js +69 -31
  324. package/{examples/jsm → src}/renderers/common/extras/PMREMGenerator.js +25 -25
  325. package/src/renderers/common/nodes/NodeBuilderState.js +58 -0
  326. package/src/renderers/common/nodes/NodeLibrary.js +118 -0
  327. package/{examples/jsm → src}/renderers/common/nodes/NodeSampledTexture.js +8 -7
  328. package/{examples/jsm → src}/renderers/common/nodes/NodeSampler.js +2 -1
  329. package/{examples/jsm → src}/renderers/common/nodes/NodeStorageBuffer.js +5 -1
  330. package/{examples/jsm → src}/renderers/common/nodes/NodeUniform.js +3 -3
  331. package/{examples/jsm → src}/renderers/common/nodes/NodeUniformBuffer.js +2 -1
  332. package/{examples/jsm → src}/renderers/common/nodes/NodeUniformsGroup.js +2 -8
  333. package/{examples/jsm → src}/renderers/common/nodes/Nodes.js +69 -21
  334. package/src/renderers/common/nodes/StandardNodeLibrary.js +105 -0
  335. package/src/renderers/shaders/ShaderChunk/batching_pars_vertex.glsl.js +16 -1
  336. package/src/renderers/shaders/ShaderChunk/batching_vertex.glsl.js +1 -1
  337. package/src/renderers/shaders/ShaderChunk/color_vertex.glsl.js +1 -1
  338. package/src/renderers/shaders/ShaderChunk/colorspace_pars_fragment.glsl.js +0 -9
  339. package/src/renderers/shaders/ShaderChunk/common.glsl.js +0 -10
  340. package/src/renderers/shaders/ShaderChunk/lights_fragment_begin.glsl.js +3 -3
  341. package/src/renderers/shaders/ShaderChunk/packing.glsl.js +45 -13
  342. package/src/renderers/shaders/ShaderChunk/shadowmap_pars_fragment.glsl.js +7 -4
  343. package/src/renderers/shaders/ShaderChunk/shadowmap_pars_vertex.glsl.js +3 -0
  344. package/src/renderers/shaders/ShaderChunk/shadowmask_pars_fragment.glsl.js +3 -3
  345. package/src/renderers/shaders/ShaderChunk/tonemapping_pars_fragment.glsl.js +2 -2
  346. package/src/renderers/shaders/ShaderLib/depth.glsl.js +8 -0
  347. package/src/renderers/shaders/UniformsLib.js +3 -0
  348. package/src/renderers/webgl/WebGLAttributes.js +2 -2
  349. package/src/renderers/webgl/WebGLBufferRenderer.js +6 -19
  350. package/src/renderers/webgl/WebGLIndexedBufferRenderer.js +6 -18
  351. package/src/renderers/webgl/WebGLLights.js +6 -0
  352. package/src/renderers/webgl/WebGLProgram.js +27 -1
  353. package/src/renderers/webgl/WebGLPrograms.js +1 -1
  354. package/src/renderers/webgl/WebGLProperties.js +7 -0
  355. package/src/renderers/webgl/WebGLTextures.js +75 -57
  356. package/src/renderers/webgl/WebGLUniforms.js +12 -2
  357. package/src/renderers/webgl/WebGLUniformsGroups.js +7 -7
  358. package/{examples/jsm/renderers/webgl → src/renderers/webgl-fallback}/WebGLBackend.js +242 -120
  359. package/{examples/jsm/renderers/webgl → src/renderers/webgl-fallback}/nodes/GLSLNodeBuilder.js +227 -44
  360. package/{examples/jsm/renderers/webgl → src/renderers/webgl-fallback}/utils/WebGLAttributeUtils.js +2 -2
  361. package/{examples/jsm/renderers/webgl → src/renderers/webgl-fallback}/utils/WebGLConstants.js +1 -0
  362. package/{examples/jsm/renderers/webgl → src/renderers/webgl-fallback}/utils/WebGLExtensions.js +2 -0
  363. package/{examples/jsm/renderers/webgl → src/renderers/webgl-fallback}/utils/WebGLState.js +22 -1
  364. package/{examples/jsm/renderers/webgl → src/renderers/webgl-fallback}/utils/WebGLTextureUtils.js +62 -23
  365. package/{examples/jsm/renderers/webgl → src/renderers/webgl-fallback}/utils/WebGLUtils.js +1 -1
  366. package/{examples/jsm → src}/renderers/webgpu/WebGPUBackend.js +242 -136
  367. package/{examples/jsm → src}/renderers/webgpu/WebGPURenderer.js +9 -9
  368. package/{examples/jsm → src}/renderers/webgpu/nodes/WGSLNodeBuilder.js +281 -107
  369. package/src/renderers/webgpu/nodes/WGSLNodeFunction.js +159 -0
  370. package/{examples/jsm → src}/renderers/webgpu/utils/WebGPUAttributeUtils.js +2 -1
  371. package/{examples/jsm → src}/renderers/webgpu/utils/WebGPUBindingUtils.js +64 -33
  372. package/{examples/jsm → src}/renderers/webgpu/utils/WebGPUConstants.js +4 -1
  373. package/{examples/jsm → src}/renderers/webgpu/utils/WebGPUPipelineUtils.js +34 -36
  374. package/{examples/jsm → src}/renderers/webgpu/utils/WebGPUTexturePassUtils.js +62 -5
  375. package/{examples/jsm → src}/renderers/webgpu/utils/WebGPUTextureUtils.js +76 -44
  376. package/{examples/jsm → src}/renderers/webgpu/utils/WebGPUUtils.js +42 -4
  377. package/src/renderers/webxr/WebXRDepthSensing.js +6 -0
  378. package/src/renderers/webxr/WebXRManager.js +37 -24
  379. package/src/textures/CompressedArrayTexture.js +1 -1
  380. package/examples/jsm/loaders/LogLuvLoader.js +0 -606
  381. package/examples/jsm/nodes/Nodes.js +0 -202
  382. package/examples/jsm/nodes/accessors/BatchNode.js +0 -78
  383. package/examples/jsm/nodes/accessors/CameraNode.js +0 -12
  384. package/examples/jsm/nodes/accessors/CubeTextureNode.js +0 -61
  385. package/examples/jsm/nodes/accessors/InstanceNode.js +0 -94
  386. package/examples/jsm/nodes/accessors/InstancedPointsMaterialNode.js +0 -21
  387. package/examples/jsm/nodes/accessors/ModelNode.js +0 -36
  388. package/examples/jsm/nodes/accessors/NormalNode.js +0 -14
  389. package/examples/jsm/nodes/accessors/PointUVNode.js +0 -26
  390. package/examples/jsm/nodes/accessors/PositionNode.js +0 -10
  391. package/examples/jsm/nodes/accessors/ReflectVectorNode.js +0 -6
  392. package/examples/jsm/nodes/accessors/SkinningNode.js +0 -124
  393. package/examples/jsm/nodes/accessors/TangentNode.js +0 -23
  394. package/examples/jsm/nodes/core/CacheNode.js +0 -49
  395. package/examples/jsm/nodes/core/NodeCache.js +0 -26
  396. package/examples/jsm/nodes/core/NodeKeywords.js +0 -80
  397. package/examples/jsm/nodes/core/PropertyNode.js +0 -83
  398. package/examples/jsm/nodes/core/UniformGroupNode.js +0 -36
  399. package/examples/jsm/nodes/display/BlendModeNode.js +0 -128
  400. package/examples/jsm/nodes/display/ColorAdjustmentNode.js +0 -99
  401. package/examples/jsm/nodes/display/ColorSpaceNode.js +0 -108
  402. package/examples/jsm/nodes/display/FrontFacingNode.js +0 -40
  403. package/examples/jsm/nodes/display/PassNode.js +0 -201
  404. package/examples/jsm/nodes/display/ToneMappingNode.js +0 -188
  405. package/examples/jsm/nodes/display/ViewportDepthNode.js +0 -97
  406. package/examples/jsm/nodes/display/ViewportDepthTextureNode.js +0 -31
  407. package/examples/jsm/nodes/display/ViewportSharedTextureNode.js +0 -37
  408. package/examples/jsm/nodes/functions/material/getGeometryRoughness.js +0 -13
  409. package/examples/jsm/nodes/lighting/AONode.js +0 -27
  410. package/examples/jsm/nodes/lighting/AnalyticLightNode.js +0 -256
  411. package/examples/jsm/nodes/lighting/LightingContextNode.js +0 -66
  412. package/examples/jsm/nodes/lighting/LightsNode.js +0 -215
  413. package/examples/jsm/nodes/materials/LineBasicNodeMaterial.js +0 -28
  414. package/examples/jsm/nodes/materials/MeshBasicNodeMaterial.js +0 -28
  415. package/examples/jsm/nodes/materials/MeshLambertNodeMaterial.js +0 -34
  416. package/examples/jsm/nodes/materials/MeshMatcapNodeMaterial.js +0 -52
  417. package/examples/jsm/nodes/materials/MeshNormalNodeMaterial.js +0 -38
  418. package/examples/jsm/nodes/materials/MeshPhongNodeMaterial.js +0 -65
  419. package/examples/jsm/nodes/materials/MeshToonNodeMaterial.js +0 -34
  420. package/examples/jsm/nodes/materials/ShadowNodeMaterial.js +0 -34
  421. package/examples/jsm/nodes/math/HashNode.js +0 -34
  422. package/examples/jsm/nodes/math/MathNode.js +0 -391
  423. package/examples/jsm/nodes/procedural/CheckerNode.js +0 -42
  424. package/examples/jsm/nodes/utils/DiscardNode.js +0 -27
  425. package/examples/jsm/nodes/utils/PackingNode.js +0 -55
  426. package/examples/jsm/nodes/utils/RotateUVNode.js +0 -35
  427. package/examples/jsm/renderers/common/PostProcessing.js +0 -33
  428. package/examples/jsm/renderers/common/nodes/NodeBuilderState.js +0 -44
  429. package/examples/jsm/renderers/webgpu/nodes/WGSLNodeFunction.js +0 -104
  430. /package/{examples/jsm/nodes/accessors/UVNode.js → src/nodes/accessors/UV.js} +0 -0
  431. /package/{examples/jsm → src}/nodes/core/NodeAttribute.js +0 -0
  432. /package/{examples/jsm → src}/nodes/core/NodeCode.js +0 -0
  433. /package/{examples/jsm → src}/nodes/core/NodeFunctionInput.js +0 -0
  434. /package/{examples/jsm → src}/nodes/core/NodeParser.js +0 -0
  435. /package/{examples/jsm → src}/nodes/core/NodeVar.js +0 -0
  436. /package/{examples/jsm → src}/nodes/core/NodeVarying.js +0 -0
  437. /package/{examples/jsm → src}/nodes/core/UniformGroup.js +0 -0
  438. /package/{examples/jsm → src}/nodes/core/constants.js +0 -0
  439. /package/{examples/jsm → src}/nodes/materialx/DISCLAIMER.md +0 -0
  440. /package/{examples/jsm → src}/nodes/parsers/GLSLNodeParser.js +0 -0
  441. /package/{examples/jsm → src}/renderers/common/Animation.js +0 -0
  442. /package/{examples/jsm → src}/renderers/common/Binding.js +0 -0
  443. /package/{examples/jsm → src}/renderers/common/Buffer.js +0 -0
  444. /package/{examples/jsm → src}/renderers/common/BufferUtils.js +0 -0
  445. /package/{examples/jsm → src}/renderers/common/ChainMap.js +0 -0
  446. /package/{examples/jsm → src}/renderers/common/ComputePipeline.js +0 -0
  447. /package/{examples/jsm → src}/renderers/common/Constants.js +0 -0
  448. /package/{examples/jsm → src}/renderers/common/DataMap.js +0 -0
  449. /package/{examples/jsm → src}/renderers/common/Pipeline.js +0 -0
  450. /package/{examples/jsm → src}/renderers/common/Pipelines.js +0 -0
  451. /package/{examples/jsm → src}/renderers/common/ProgrammableStage.js +0 -0
  452. /package/{examples/jsm → src}/renderers/common/RenderBundle.js +0 -0
  453. /package/{examples/jsm → src}/renderers/common/RenderBundles.js +0 -0
  454. /package/{examples/jsm → src}/renderers/common/RenderLists.js +0 -0
  455. /package/{examples/jsm → src}/renderers/common/RenderObjects.js +0 -0
  456. /package/{examples/jsm → src}/renderers/common/RenderPipeline.js +0 -0
  457. /package/{examples/jsm → src}/renderers/common/Sampler.js +0 -0
  458. /package/{examples/jsm → src}/renderers/common/StorageBuffer.js +0 -0
  459. /package/{examples/jsm → src}/renderers/common/UniformBuffer.js +0 -0
  460. /package/{examples/jsm/renderers/webgl → src/renderers/webgl-fallback}/WebGLBufferRenderer.js +0 -0
  461. /package/{examples/jsm/renderers/webgl → src/renderers/webgl-fallback}/utils/WebGLCapabilities.js +0 -0
  462. /package/{examples/jsm → src}/renderers/webgpu/nodes/WGSLNodeParser.js +0 -0
@@ -1,14 +1,15 @@
1
- import { MathNode, GLSLNodeParser, NodeBuilder, UniformNode, vectorComponents } from '../../../nodes/Nodes.js';
1
+ import { GLSLNodeParser, NodeBuilder, TextureNode, vectorComponents } from '../../../nodes/Nodes.js';
2
2
 
3
3
  import NodeUniformBuffer from '../../common/nodes/NodeUniformBuffer.js';
4
4
  import NodeUniformsGroup from '../../common/nodes/NodeUniformsGroup.js';
5
5
 
6
6
  import { NodeSampledTexture, NodeSampledCubeTexture, NodeSampledTexture3D } from '../../common/nodes/NodeSampledTexture.js';
7
7
 
8
- import { RedFormat, RGFormat, IntType, DataTexture, RGBFormat, RGBAFormat, FloatType } from 'three';
8
+ import { NoColorSpace, ByteType, ShortType, RGBAIntegerFormat, RGBIntegerFormat, RedIntegerFormat, RGIntegerFormat, UnsignedByteType, UnsignedIntType, UnsignedShortType, RedFormat, RGFormat, IntType, RGBFormat, RGBAFormat, FloatType } from '../../../constants.js';
9
+ import { DataTexture } from '../../../textures/DataTexture.js';
9
10
 
10
11
  const glslMethods = {
11
- [ MathNode.ATAN2 ]: 'atan',
12
+ atan2: 'atan',
12
13
  textureDimensions: 'textureSize',
13
14
  equals: 'equal'
14
15
  };
@@ -20,38 +21,56 @@ const precisionLib = {
20
21
  };
21
22
 
22
23
  const supports = {
23
- instance: true,
24
- swizzleAssign: true
24
+ swizzleAssign: true,
25
+ storageBuffer: false
25
26
  };
26
27
 
27
28
  const defaultPrecisions = `
28
29
  precision highp float;
29
30
  precision highp int;
31
+ precision highp sampler2D;
30
32
  precision highp sampler3D;
31
- precision mediump sampler2DArray;
33
+ precision highp samplerCube;
34
+ precision highp sampler2DArray;
35
+
36
+ precision highp usampler2D;
37
+ precision highp usampler3D;
38
+ precision highp usamplerCube;
39
+ precision highp usampler2DArray;
40
+
41
+ precision highp isampler2D;
42
+ precision highp isampler3D;
43
+ precision highp isamplerCube;
44
+ precision highp isampler2DArray;
45
+
32
46
  precision lowp sampler2DShadow;
33
47
  `;
34
48
 
35
49
  class GLSLNodeBuilder extends NodeBuilder {
36
50
 
37
- constructor( object, renderer, scene = null ) {
51
+ constructor( object, renderer ) {
38
52
 
39
- super( object, renderer, new GLSLNodeParser(), scene );
53
+ super( object, renderer, new GLSLNodeParser() );
40
54
 
41
55
  this.uniformGroups = {};
42
56
  this.transforms = [];
57
+ this.extensions = {};
58
+
59
+ this.instanceBindGroups = false;
60
+
61
+ this.useComparisonMethod = true;
43
62
 
44
63
  }
45
64
 
46
- getMethod( method ) {
65
+ needsColorSpaceToLinearSRGB( texture ) {
47
66
 
48
- return glslMethods[ method ] || method;
67
+ return texture.isVideoTexture === true && texture.colorSpace !== NoColorSpace;
49
68
 
50
69
  }
51
70
 
52
- getPropertyName( node, shaderStage ) {
71
+ getMethod( method ) {
53
72
 
54
- return super.getPropertyName( node, shaderStage );
73
+ return glslMethods[ method ] || method;
55
74
 
56
75
  }
57
76
 
@@ -101,39 +120,54 @@ ${ flowData.code }
101
120
  const numElements = attribute.count * attribute.itemSize;
102
121
 
103
122
  const { itemSize } = attribute;
104
- let format = RedFormat;
123
+
124
+ const isInteger = attribute.array.constructor.name.toLowerCase().includes( 'int' );
125
+
126
+ let format = isInteger ? RedIntegerFormat : RedFormat;
127
+
105
128
 
106
129
  if ( itemSize === 2 ) {
107
130
 
108
- format = RGFormat;
131
+ format = isInteger ? RGIntegerFormat : RGFormat;
109
132
 
110
133
  } else if ( itemSize === 3 ) {
111
134
 
112
- format = RGBFormat;
135
+ format = isInteger ? RGBIntegerFormat : RGBFormat;
113
136
 
114
137
  } else if ( itemSize === 4 ) {
115
138
 
116
- format = RGBAFormat;
139
+ format = isInteger ? RGBAIntegerFormat : RGBAFormat;
117
140
 
118
141
  }
119
142
 
143
+ const typeMap = {
144
+ Float32Array: FloatType,
145
+ Uint8Array: UnsignedByteType,
146
+ Uint16Array: UnsignedShortType,
147
+ Uint32Array: UnsignedIntType,
148
+ Int8Array: ByteType,
149
+ Int16Array: ShortType,
150
+ Int32Array: IntType,
151
+ Uint8ClampedArray: UnsignedByteType,
152
+ };
153
+
120
154
  const width = Math.pow( 2, Math.ceil( Math.log2( Math.sqrt( numElements / itemSize ) ) ) );
121
155
  let height = Math.ceil( ( numElements / itemSize ) / width );
122
156
  if ( width * height * itemSize < numElements ) height ++; // Ensure enough space
123
157
 
124
158
  const newSize = width * height * itemSize;
125
159
 
126
- const newArray = new Float32Array( newSize );
160
+ const newArray = new originalArray.constructor( newSize );
127
161
 
128
162
  newArray.set( originalArray, 0 );
129
163
 
130
164
  attribute.array = newArray;
131
165
 
132
- const pboTexture = new DataTexture( attribute.array, width, height, format, FloatType );
166
+ const pboTexture = new DataTexture( attribute.array, width, height, format, typeMap[ attribute.array.constructor.name ] || FloatType );
133
167
  pboTexture.needsUpdate = true;
134
168
  pboTexture.isPBOTexture = true;
135
169
 
136
- const pbo = new UniformNode( pboTexture );
170
+ const pbo = new TextureNode( pboTexture, null, null );
137
171
  pbo.setPrecision( 'high' );
138
172
 
139
173
  attribute.pboNode = pbo;
@@ -145,6 +179,18 @@ ${ flowData.code }
145
179
 
146
180
  }
147
181
 
182
+ getPropertyName( node, shaderStage = this.shaderStage ) {
183
+
184
+ if ( node.isNodeUniform && node.node.isTextureNode !== true && node.node.isBufferNode !== true ) {
185
+
186
+ return shaderStage.charAt( 0 ) + '_' + node.name;
187
+
188
+ }
189
+
190
+ return super.getPropertyName( node, shaderStage );
191
+
192
+ }
193
+
148
194
  generatePBO( storageArrayElementNode ) {
149
195
 
150
196
  const { node, indexNode } = storageArrayElementNode;
@@ -161,7 +207,7 @@ ${ flowData.code }
161
207
  const nodeUniform = this.getUniformFromNode( attribute.pboNode, 'texture', this.shaderStage, this.context.label );
162
208
  const textureName = this.getPropertyName( nodeUniform );
163
209
 
164
- indexNode.increaseUsage( this ); // force cache generate to be used as index in x,y
210
+ this.increaseUsage( indexNode ); // force cache generate to be used as index in x,y
165
211
  const indexSnippet = indexNode.build( this, 'uint' );
166
212
 
167
213
  const elementNodeData = this.getDataFromNode( storageArrayElementNode );
@@ -205,7 +251,20 @@ ${ flowData.code }
205
251
 
206
252
  //
207
253
 
208
- this.addLineFlowCode( `${ propertyName } = ${ snippet + channel }` );
254
+
255
+ let prefix = 'vec4';
256
+
257
+ if ( attribute.pbo.type === UnsignedIntType ) {
258
+
259
+ prefix = 'uvec4';
260
+
261
+ } else if ( attribute.pbo.type === IntType ) {
262
+
263
+ prefix = 'ivec4';
264
+
265
+ }
266
+
267
+ this.addLineFlowCode( `${ propertyName } = ${prefix}(${ snippet })${channel}` );
209
268
 
210
269
  elementNodeData.propertyName = propertyName;
211
270
 
@@ -251,6 +310,12 @@ ${ flowData.code }
251
310
 
252
311
  }
253
312
 
313
+ generateTextureBias( texture, textureProperty, uvSnippet, biasSnippet ) {
314
+
315
+ return `texture( ${ textureProperty }, ${ uvSnippet }, ${ biasSnippet } )`;
316
+
317
+ }
318
+
254
319
  generateTextureGrad( texture, textureProperty, uvSnippet, gradSnippet ) {
255
320
 
256
321
  return `textureGrad( ${ textureProperty }, ${ uvSnippet }, ${ gradSnippet[ 0 ] }, ${ gradSnippet[ 1 ] } )`;
@@ -307,17 +372,34 @@ ${ flowData.code }
307
372
 
308
373
  const texture = uniform.node.value;
309
374
 
375
+ let typePrefix = '';
376
+
377
+ if ( texture.isDataTexture === true ) {
378
+
379
+
380
+ if ( texture.type === UnsignedIntType ) {
381
+
382
+ typePrefix = 'u';
383
+
384
+ } else if ( texture.type === IntType ) {
385
+
386
+ typePrefix = 'i';
387
+
388
+ }
389
+
390
+ }
391
+
310
392
  if ( texture.compareFunction ) {
311
393
 
312
394
  snippet = `sampler2DShadow ${ uniform.name };`;
313
395
 
314
- } else if ( texture.isDataArrayTexture === true ) {
396
+ } else if ( texture.isDataArrayTexture === true || texture.isCompressedArrayTexture === true ) {
315
397
 
316
- snippet = `sampler2DArray ${ uniform.name };`;
398
+ snippet = `${typePrefix}sampler2DArray ${ uniform.name };`;
317
399
 
318
400
  } else {
319
401
 
320
- snippet = `sampler2D ${ uniform.name };`;
402
+ snippet = `${typePrefix}sampler2D ${ uniform.name };`;
321
403
 
322
404
  }
323
405
 
@@ -342,7 +424,7 @@ ${ flowData.code }
342
424
 
343
425
  const vectorType = this.getVectorType( uniform.type );
344
426
 
345
- snippet = `${vectorType} ${uniform.name};`;
427
+ snippet = `${ vectorType } ${ this.getPropertyName( uniform, shaderStage ) };`;
346
428
 
347
429
  group = true;
348
430
 
@@ -403,7 +485,7 @@ ${ flowData.code }
403
485
 
404
486
  const array = dataAttribute.array;
405
487
 
406
- if ( ( array instanceof Uint32Array || array instanceof Int32Array || array instanceof Uint16Array || array instanceof Int16Array ) === false ) {
488
+ if ( ( array instanceof Uint32Array || array instanceof Int32Array ) === false ) {
407
489
 
408
490
  nodeType = nodeType.slice( 1 );
409
491
 
@@ -492,7 +574,7 @@ ${ flowData.code }
492
574
 
493
575
  if ( shaderStage === 'compute' ) varying.needsInterpolation = true;
494
576
  const type = varying.type;
495
- const flat = type === 'int' || type === 'uint' ? 'flat ' : '';
577
+ const flat = type.includes( 'int' ) || type.includes( 'uv' ) || type.includes( 'iv' ) ? 'flat ' : '';
496
578
 
497
579
  snippet += `${flat}${varying.needsInterpolation ? 'out' : '/*out*/'} ${type} ${varying.name};\n`;
498
580
 
@@ -505,7 +587,7 @@ ${ flowData.code }
505
587
  if ( varying.needsInterpolation ) {
506
588
 
507
589
  const type = varying.type;
508
- const flat = type === 'int' || type === 'uint' ? 'flat ' : '';
590
+ const flat = type.includes( 'int' ) || type.includes( 'uv' ) || type.includes( 'iv' ) ? 'flat ' : '';
509
591
 
510
592
  snippet += `${flat}in ${type} ${varying.name};\n`;
511
593
 
@@ -531,6 +613,30 @@ ${ flowData.code }
531
613
 
532
614
  }
533
615
 
616
+ getInvocationLocalIndex() {
617
+
618
+ const workgroupSize = this.object.workgroupSize;
619
+
620
+ const size = workgroupSize.reduce( ( acc, curr ) => acc * curr, 1 );
621
+
622
+ return `uint( gl_InstanceID ) % ${size}u`;
623
+
624
+ }
625
+
626
+ getDrawIndex() {
627
+
628
+ const extensions = this.renderer.backend.extensions;
629
+
630
+ if ( extensions.has( 'WEBGL_multi_draw' ) ) {
631
+
632
+ return 'uint( gl_DrawID )';
633
+
634
+ }
635
+
636
+ return null;
637
+
638
+ }
639
+
534
640
  getFrontFacing() {
535
641
 
536
642
  return 'gl_FrontFacing';
@@ -539,7 +645,7 @@ ${ flowData.code }
539
645
 
540
646
  getFragCoord() {
541
647
 
542
- return 'gl_FragCoord';
648
+ return 'gl_FragCoord.xy';
543
649
 
544
650
  }
545
651
 
@@ -549,9 +655,82 @@ ${ flowData.code }
549
655
 
550
656
  }
551
657
 
658
+ enableExtension( name, behavior, shaderStage = this.shaderStage ) {
659
+
660
+ const map = this.extensions[ shaderStage ] || ( this.extensions[ shaderStage ] = new Map() );
661
+
662
+ if ( map.has( name ) === false ) {
663
+
664
+ map.set( name, {
665
+ name,
666
+ behavior
667
+ } );
668
+
669
+ }
670
+
671
+ }
672
+
673
+ getExtensions( shaderStage ) {
674
+
675
+ const snippets = [];
676
+
677
+ if ( shaderStage === 'vertex' ) {
678
+
679
+ const ext = this.renderer.backend.extensions;
680
+ const isBatchedMesh = this.object.isBatchedMesh;
681
+
682
+ if ( isBatchedMesh && ext.has( 'WEBGL_multi_draw' ) ) {
683
+
684
+ this.enableExtension( 'GL_ANGLE_multi_draw', 'require', shaderStage );
685
+
686
+ }
687
+
688
+ }
689
+
690
+ const extensions = this.extensions[ shaderStage ];
691
+
692
+ if ( extensions !== undefined ) {
693
+
694
+ for ( const { name, behavior } of extensions.values() ) {
695
+
696
+ snippets.push( `#extension ${name} : ${behavior}` );
697
+
698
+ }
699
+
700
+ }
701
+
702
+ return snippets.join( '\n' );
703
+
704
+ }
705
+
552
706
  isAvailable( name ) {
553
707
 
554
- return supports[ name ] === true;
708
+ let result = supports[ name ];
709
+
710
+ if ( result === undefined ) {
711
+
712
+ if ( name === 'float32Filterable' ) {
713
+
714
+ const extensions = this.renderer.backend.extensions;
715
+
716
+ if ( extensions.has( 'OES_texture_float_linear' ) ) {
717
+
718
+ extensions.get( 'OES_texture_float_linear' );
719
+ result = true;
720
+
721
+ } else {
722
+
723
+ result = false;
724
+
725
+ }
726
+
727
+ }
728
+
729
+ supports[ name ] = result;
730
+
731
+ }
732
+
733
+ return result;
555
734
 
556
735
  }
557
736
 
@@ -602,6 +781,9 @@ ${vars}
602
781
 
603
782
  ${ this.getSignature() }
604
783
 
784
+ // extensions
785
+ ${shaderData.extensions}
786
+
605
787
  // precision
606
788
  ${ defaultPrecisions }
607
789
 
@@ -721,6 +903,7 @@ void main() {
721
903
 
722
904
  const stageData = shadersData[ shaderStage ];
723
905
 
906
+ stageData.extensions = this.getExtensions( shaderStage );
724
907
  stageData.uniforms = this.getUniforms( shaderStage );
725
908
  stageData.attributes = this.getAttributes( shaderStage );
726
909
  stageData.varyings = this.getVaryings( shaderStage );
@@ -754,40 +937,40 @@ void main() {
754
937
 
755
938
  if ( uniformGPU === undefined ) {
756
939
 
757
- if ( type === 'texture' ) {
940
+ const group = node.groupNode;
941
+ const groupName = group.name;
758
942
 
759
- uniformGPU = new NodeSampledTexture( uniformNode.name, uniformNode.node );
943
+ const bindings = this.getBindGroupArray( groupName, shaderStage );
760
944
 
761
- this.bindings[ shaderStage ].push( uniformGPU );
945
+ if ( type === 'texture' ) {
762
946
 
763
- } else if ( type === 'cubeTexture' ) {
947
+ uniformGPU = new NodeSampledTexture( uniformNode.name, uniformNode.node, group );
948
+ bindings.push( uniformGPU );
764
949
 
765
- uniformGPU = new NodeSampledCubeTexture( uniformNode.name, uniformNode.node );
950
+ } else if ( type === 'cubeTexture' ) {
766
951
 
767
- this.bindings[ shaderStage ].push( uniformGPU );
952
+ uniformGPU = new NodeSampledCubeTexture( uniformNode.name, uniformNode.node, group );
953
+ bindings.push( uniformGPU );
768
954
 
769
955
  } else if ( type === 'texture3D' ) {
770
956
 
771
- uniformGPU = new NodeSampledTexture3D( uniformNode.name, uniformNode.node );
772
- this.bindings[ shaderStage ].push( uniformGPU );
957
+ uniformGPU = new NodeSampledTexture3D( uniformNode.name, uniformNode.node, group );
958
+ bindings.push( uniformGPU );
773
959
 
774
960
  } else if ( type === 'buffer' ) {
775
961
 
776
962
  node.name = `NodeBuffer_${ node.id }`;
777
963
  uniformNode.name = `buffer${ node.id }`;
778
964
 
779
- const buffer = new NodeUniformBuffer( node );
965
+ const buffer = new NodeUniformBuffer( node, group );
780
966
  buffer.name = node.name;
781
967
 
782
- this.bindings[ shaderStage ].push( buffer );
968
+ bindings.push( buffer );
783
969
 
784
970
  uniformGPU = buffer;
785
971
 
786
972
  } else {
787
973
 
788
- const group = node.groupNode;
789
- const groupName = group.name;
790
-
791
974
  const uniformsStage = this.uniformGroups[ shaderStage ] || ( this.uniformGroups[ shaderStage ] = {} );
792
975
 
793
976
  let uniformsGroup = uniformsStage[ groupName ];
@@ -799,7 +982,7 @@ void main() {
799
982
 
800
983
  uniformsStage[ groupName ] = uniformsGroup;
801
984
 
802
- this.bindings[ shaderStage ].push( uniformsGroup );
985
+ bindings.push( uniformsGroup );
803
986
 
804
987
  }
805
988
 
@@ -1,4 +1,4 @@
1
- import { IntType } from 'three';
1
+ import { IntType } from '../../../constants.js';
2
2
 
3
3
  let _id = 0;
4
4
 
@@ -135,7 +135,7 @@ class WebGLAttributeUtils {
135
135
  bytesPerElement: array.BYTES_PER_ELEMENT,
136
136
  version: attribute.version,
137
137
  pbo: attribute.pbo,
138
- isInteger: type === gl.INT || type === gl.UNSIGNED_INT || type === gl.UNSIGNED_SHORT || attribute.gpuType === IntType,
138
+ isInteger: type === gl.INT || type === gl.UNSIGNED_INT || attribute.gpuType === IntType,
139
139
  id: _id ++
140
140
  };
141
141
 
@@ -1,5 +1,6 @@
1
1
  export const GLFeatureName = {
2
2
 
3
+ 'WEBGL_multi_draw': 'WEBGL_multi_draw',
3
4
  'WEBGL_compressed_texture_astc': 'texture-compression-astc',
4
5
  'WEBGL_compressed_texture_etc': 'texture-compression-etc2',
5
6
  'WEBGL_compressed_texture_etc1': 'texture-compression-etc1',
@@ -19,6 +19,8 @@ class WebGLExtensions {
19
19
 
20
20
  extension = this.gl.getExtension( name );
21
21
 
22
+ this.extensions[ name ] = extension;
23
+
22
24
  }
23
25
 
24
26
  return extension;
@@ -5,7 +5,7 @@ import {
5
5
  ZeroFactor, OneFactor, SrcColorFactor, SrcAlphaFactor, SrcAlphaSaturateFactor, DstColorFactor, DstAlphaFactor,
6
6
  OneMinusSrcColorFactor, OneMinusSrcAlphaFactor, OneMinusDstColorFactor, OneMinusDstAlphaFactor,
7
7
  NeverDepth, AlwaysDepth, LessDepth, LessEqualDepth, EqualDepth, GreaterEqualDepth, GreaterDepth, NotEqualDepth
8
- } from 'three';
8
+ } from '../../../constants.js';
9
9
 
10
10
  let initialized = false, equationToGL, factorToGL;
11
11
 
@@ -48,6 +48,7 @@ class WebGLState {
48
48
  this.maxTextures = this.gl.getParameter( this.gl.MAX_TEXTURE_IMAGE_UNITS );
49
49
  this.currentTextureSlot = null;
50
50
  this.currentBoundTextures = {};
51
+ this.currentBoundBufferBases = {};
51
52
 
52
53
  if ( initialized === false ) {
53
54
 
@@ -716,6 +717,26 @@ class WebGLState {
716
717
 
717
718
  }
718
719
 
720
+ bindBufferBase( target, index, buffer ) {
721
+
722
+ const { gl } = this;
723
+
724
+ const key = `${target}-${index}`;
725
+
726
+ if ( this.currentBoundBufferBases[ key ] !== buffer ) {
727
+
728
+ gl.bindBufferBase( target, index, buffer );
729
+ this.currentBoundBufferBases[ key ] = buffer;
730
+
731
+ return true;
732
+
733
+ }
734
+
735
+ return false;
736
+
737
+ }
738
+
739
+
719
740
  unbindTexture() {
720
741
 
721
742
  const { gl, currentTextureSlot, currentBoundTextures } = this;