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,7 +1,6 @@
1
- import { WebGLCoordinateSystem } from 'three';
2
-
3
1
  import GLSLNodeBuilder from './nodes/GLSLNodeBuilder.js';
4
2
  import Backend from '../common/Backend.js';
3
+ import { getCacheKey } from '../common/RenderContext.js';
5
4
 
6
5
  import WebGLAttributeUtils from './utils/WebGLAttributeUtils.js';
7
6
  import WebGLState from './utils/WebGLState.js';
@@ -12,6 +11,9 @@ import WebGLCapabilities from './utils/WebGLCapabilities.js';
12
11
  import { GLFeatureName } from './utils/WebGLConstants.js';
13
12
  import { WebGLBufferRenderer } from './WebGLBufferRenderer.js';
14
13
 
14
+ import { warnOnce } from '../../utils.js';
15
+ import { WebGLCoordinateSystem } from '../../constants.js';
16
+
15
17
  //
16
18
 
17
19
  class WebGLBackend extends Backend {
@@ -51,6 +53,13 @@ class WebGLBackend extends Backend {
51
53
  this.trackTimestamp = ( parameters.trackTimestamp === true );
52
54
 
53
55
  this.extensions.get( 'EXT_color_buffer_float' );
56
+ this.extensions.get( 'WEBGL_clip_cull_distance' );
57
+ this.extensions.get( 'OES_texture_float_linear' );
58
+ this.extensions.get( 'EXT_color_buffer_half_float' );
59
+ this.extensions.get( 'WEBGL_multisampled_render_to_texture' );
60
+ this.extensions.get( 'WEBGL_render_shared_exponent' );
61
+ this.extensions.get( 'WEBGL_multi_draw' );
62
+
54
63
  this.disjoint = this.extensions.get( 'EXT_disjoint_timer_query_webgl2' );
55
64
  this.parallel = this.extensions.get( 'KHR_parallel_shader_compile' );
56
65
  this._currentContext = null;
@@ -104,7 +113,7 @@ class WebGLBackend extends Backend {
104
113
 
105
114
  // timestamp utils
106
115
 
107
- prepareTimestampBuffer( renderContext ) {
116
+ prepareTimestampBuffer( renderContext ) {
108
117
 
109
118
  if ( ! this.disjoint || ! this.trackTimestamp ) return;
110
119
 
@@ -198,7 +207,7 @@ class WebGLBackend extends Backend {
198
207
 
199
208
  const { x, y, width, height } = renderContext.scissorValue;
200
209
 
201
- gl.scissor( x, y, width, height );
210
+ gl.scissor( x, renderContext.height - height - y, width, height );
202
211
 
203
212
  }
204
213
 
@@ -226,6 +235,20 @@ class WebGLBackend extends Backend {
226
235
  const renderContextData = this.get( renderContext );
227
236
  const previousContext = renderContextData.previousContext;
228
237
 
238
+ const occlusionQueryCount = renderContext.occlusionQueryCount;
239
+
240
+ if ( occlusionQueryCount > 0 ) {
241
+
242
+ if ( occlusionQueryCount > renderContextData.occlusionQueryIndex ) {
243
+
244
+ gl.endQuery( gl.ANY_SAMPLES_PASSED );
245
+
246
+ }
247
+
248
+ this.resolveOccludedAsync( renderContext );
249
+
250
+ }
251
+
229
252
  const textures = renderContext.textures;
230
253
 
231
254
  if ( textures !== null ) {
@@ -246,18 +269,18 @@ class WebGLBackend extends Backend {
246
269
 
247
270
  this._currentContext = previousContext;
248
271
 
249
-
250
272
  if ( renderContext.textures !== null && renderContext.renderTarget ) {
251
273
 
252
274
  const renderTargetContextData = this.get( renderContext.renderTarget );
253
275
 
254
276
  const { samples } = renderContext.renderTarget;
255
- const fb = renderTargetContextData.framebuffer;
256
-
257
- const mask = gl.COLOR_BUFFER_BIT;
258
277
 
259
278
  if ( samples > 0 ) {
260
279
 
280
+ const fb = renderTargetContextData.framebuffers[ renderContext.getCacheKey() ];
281
+
282
+ const mask = gl.COLOR_BUFFER_BIT;
283
+
261
284
  const msaaFrameBuffer = renderTargetContextData.msaaFrameBuffer;
262
285
 
263
286
  const textures = renderContext.textures;
@@ -269,9 +292,21 @@ class WebGLBackend extends Backend {
269
292
 
270
293
  // TODO Add support for MRT
271
294
 
272
- gl.blitFramebuffer( 0, 0, renderContext.width, renderContext.height, 0, 0, renderContext.width, renderContext.height, mask, gl.NEAREST );
295
+ if ( renderContext.scissor ) {
296
+
297
+ const { x, y, width, height } = renderContext.scissorValue;
298
+
299
+ const viewY = renderContext.height - height - y;
300
+
301
+ gl.blitFramebuffer( x, viewY, x + width, viewY + height, x, viewY, x + width, viewY + height, mask, gl.NEAREST );
302
+ gl.invalidateSubFramebuffer( gl.READ_FRAMEBUFFER, renderTargetContextData.invalidationArray, x, viewY, width, height );
303
+
304
+ } else {
273
305
 
274
- gl.invalidateFramebuffer( gl.READ_FRAMEBUFFER, renderTargetContextData.invalidationArray );
306
+ gl.blitFramebuffer( 0, 0, renderContext.width, renderContext.height, 0, 0, renderContext.width, renderContext.height, mask, gl.NEAREST );
307
+ gl.invalidateFramebuffer( gl.READ_FRAMEBUFFER, renderTargetContextData.invalidationArray );
308
+
309
+ }
275
310
 
276
311
  }
277
312
 
@@ -290,32 +325,12 @@ class WebGLBackend extends Backend {
290
325
 
291
326
  } else {
292
327
 
293
- const gl = this.gl;
294
-
295
328
  gl.viewport( 0, 0, gl.drawingBufferWidth, gl.drawingBufferHeight );
296
329
 
297
330
  }
298
331
 
299
332
  }
300
333
 
301
- const occlusionQueryCount = renderContext.occlusionQueryCount;
302
-
303
- if ( occlusionQueryCount > 0 ) {
304
-
305
- const renderContextData = this.get( renderContext );
306
-
307
- if ( occlusionQueryCount > renderContextData.occlusionQueryIndex ) {
308
-
309
- const { gl } = this;
310
-
311
- gl.endQuery( gl.ANY_SAMPLES_PASSED );
312
-
313
- }
314
-
315
- this.resolveOccludedAsync( renderContext );
316
-
317
- }
318
-
319
334
  this.prepareTimestampBuffer( renderContext );
320
335
 
321
336
  }
@@ -391,7 +406,7 @@ class WebGLBackend extends Backend {
391
406
  const gl = this.gl;
392
407
  const { x, y, width, height } = renderContext.viewportValue;
393
408
 
394
- gl.viewport( x, y, width, height );
409
+ gl.viewport( x, renderContext.height - height - y, width, height );
395
410
 
396
411
  }
397
412
 
@@ -436,6 +451,12 @@ class WebGLBackend extends Backend {
436
451
 
437
452
  const clearColor = descriptor.clearColorValue || this.getClearColor();
438
453
 
454
+ // premultiply alpha
455
+
456
+ clearColor.r *= clearColor.a;
457
+ clearColor.g *= clearColor.a;
458
+ clearColor.b *= clearColor.a;
459
+
439
460
  if ( depth ) this.state.setDepthMask( true );
440
461
 
441
462
  if ( descriptor.textures === null ) {
@@ -479,16 +500,16 @@ class WebGLBackend extends Backend {
479
500
 
480
501
  beginCompute( computeGroup ) {
481
502
 
482
- const gl = this.gl;
503
+ const { state, gl } = this;
483
504
 
484
- gl.bindFramebuffer( gl.FRAMEBUFFER, null );
505
+ state.bindFramebuffer( gl.FRAMEBUFFER, null );
485
506
  this.initTimestampQuery( computeGroup );
486
507
 
487
508
  }
488
509
 
489
510
  compute( computeGroup, computeNode, bindings, pipeline ) {
490
511
 
491
- const gl = this.gl;
512
+ const { state, gl } = this;
492
513
 
493
514
  if ( ! this.discard ) {
494
515
 
@@ -514,7 +535,7 @@ class WebGLBackend extends Backend {
514
535
 
515
536
  }
516
537
 
517
- gl.useProgram( programGPU );
538
+ state.useProgram( programGPU );
518
539
 
519
540
  this._bindUniforms( bindings );
520
541
 
@@ -567,7 +588,7 @@ class WebGLBackend extends Backend {
567
588
 
568
589
  }
569
590
 
570
- draw( renderObject, info ) {
591
+ draw( renderObject/*, info*/ ) {
571
592
 
572
593
  const { object, pipeline, material, context } = renderObject;
573
594
  const { programGPU } = this.get( pipeline );
@@ -584,7 +605,7 @@ class WebGLBackend extends Backend {
584
605
 
585
606
  state.setMaterial( material, frontFaceCW );
586
607
 
587
- gl.useProgram( programGPU );
608
+ state.useProgram( programGPU );
588
609
 
589
610
  //
590
611
 
@@ -705,6 +726,10 @@ class WebGLBackend extends Backend {
705
726
 
706
727
  renderer.renderMultiDrawInstances( object._multiDrawStarts, object._multiDrawCounts, object._multiDrawCount, object._multiDrawInstances );
707
728
 
729
+ } else if ( ! this.hasFeature( 'WEBGL_multi_draw' ) ) {
730
+
731
+ warnOnce( 'THREE.WebGLRenderer: WEBGL_multi_draw not supported.' );
732
+
708
733
  } else {
709
734
 
710
735
  renderer.renderMultiDraw( object._multiDrawStarts, object._multiDrawCounts, object._multiDrawCount );
@@ -732,9 +757,9 @@ class WebGLBackend extends Backend {
732
757
 
733
758
  }
734
759
 
735
- getRenderCacheKey( renderObject ) {
760
+ getRenderCacheKey( /*renderObject*/ ) {
736
761
 
737
- return renderObject.id;
762
+ return '';
738
763
 
739
764
  }
740
765
 
@@ -787,9 +812,9 @@ class WebGLBackend extends Backend {
787
812
 
788
813
  // node builder
789
814
 
790
- createNodeBuilder( object, renderer, scene = null ) {
815
+ createNodeBuilder( object, renderer ) {
791
816
 
792
- return new GLSLNodeBuilder( object, renderer, scene );
817
+ return new GLSLNodeBuilder( object, renderer );
793
818
 
794
819
  }
795
820
 
@@ -875,26 +900,107 @@ class WebGLBackend extends Backend {
875
900
 
876
901
  }
877
902
 
903
+ _handleSource( string, errorLine ) {
904
+
905
+ const lines = string.split( '\n' );
906
+ const lines2 = [];
907
+
908
+ const from = Math.max( errorLine - 6, 0 );
909
+ const to = Math.min( errorLine + 6, lines.length );
910
+
911
+ for ( let i = from; i < to; i ++ ) {
912
+
913
+ const line = i + 1;
914
+ lines2.push( `${line === errorLine ? '>' : ' '} ${line}: ${lines[ i ]}` );
915
+
916
+ }
917
+
918
+ return lines2.join( '\n' );
919
+
920
+ }
921
+
922
+ _getShaderErrors( gl, shader, type ) {
923
+
924
+ const status = gl.getShaderParameter( shader, gl.COMPILE_STATUS );
925
+ const errors = gl.getShaderInfoLog( shader ).trim();
926
+
927
+ if ( status && errors === '' ) return '';
928
+
929
+ const errorMatches = /ERROR: 0:(\d+)/.exec( errors );
930
+ if ( errorMatches ) {
931
+
932
+ const errorLine = parseInt( errorMatches[ 1 ] );
933
+ return type.toUpperCase() + '\n\n' + errors + '\n\n' + this._handleSource( gl.getShaderSource( shader ), errorLine );
934
+
935
+ } else {
936
+
937
+ return errors;
938
+
939
+ }
940
+
941
+ }
942
+
943
+ _logProgramError( programGPU, glFragmentShader, glVertexShader ) {
944
+
945
+ if ( this.renderer.debug.checkShaderErrors ) {
946
+
947
+ const gl = this.gl;
948
+
949
+ const programLog = gl.getProgramInfoLog( programGPU ).trim();
950
+
951
+ if ( gl.getProgramParameter( programGPU, gl.LINK_STATUS ) === false ) {
952
+
953
+
954
+ if ( typeof this.renderer.debug.onShaderError === 'function' ) {
955
+
956
+ this.renderer.debug.onShaderError( gl, programGPU, glVertexShader, glFragmentShader );
957
+
958
+ } else {
959
+
960
+ // default error reporting
961
+
962
+ const vertexErrors = this._getShaderErrors( gl, glVertexShader, 'vertex' );
963
+ const fragmentErrors = this._getShaderErrors( gl, glFragmentShader, 'fragment' );
964
+
965
+ console.error(
966
+ 'THREE.WebGLProgram: Shader Error ' + gl.getError() + ' - ' +
967
+ 'VALIDATE_STATUS ' + gl.getProgramParameter( programGPU, gl.VALIDATE_STATUS ) + '\n\n' +
968
+ 'Program Info Log: ' + programLog + '\n' +
969
+ vertexErrors + '\n' +
970
+ fragmentErrors
971
+ );
972
+
973
+ }
974
+
975
+ } else if ( programLog !== '' ) {
976
+
977
+ console.warn( 'THREE.WebGLProgram: Program Info Log:', programLog );
978
+
979
+ }
980
+
981
+ }
982
+
983
+ }
984
+
878
985
  _completeCompile( renderObject, pipeline ) {
879
986
 
880
- const gl = this.gl;
987
+ const { state, gl } = this;
881
988
  const pipelineData = this.get( pipeline );
882
989
  const { programGPU, fragmentShader, vertexShader } = pipelineData;
883
990
 
884
991
  if ( gl.getProgramParameter( programGPU, gl.LINK_STATUS ) === false ) {
885
992
 
886
- console.error( 'THREE.WebGLBackend:', gl.getProgramInfoLog( programGPU ) );
887
-
888
- console.error( 'THREE.WebGLBackend:', gl.getShaderInfoLog( fragmentShader ) );
889
- console.error( 'THREE.WebGLBackend:', gl.getShaderInfoLog( vertexShader ) );
993
+ this._logProgramError( programGPU, fragmentShader, vertexShader );
890
994
 
891
995
  }
892
996
 
893
- gl.useProgram( programGPU );
997
+ state.useProgram( programGPU );
894
998
 
895
999
  // Bindings
896
1000
 
897
- this._setupBindings( renderObject.getBindings(), programGPU );
1001
+ const bindings = renderObject.getBindings();
1002
+
1003
+ this._setupBindings( bindings, programGPU );
898
1004
 
899
1005
  //
900
1006
 
@@ -906,7 +1012,7 @@ class WebGLBackend extends Backend {
906
1012
 
907
1013
  createComputePipeline( computePipeline, bindings ) {
908
1014
 
909
- const gl = this.gl;
1015
+ const { state, gl } = this;
910
1016
 
911
1017
  // Program
912
1018
 
@@ -944,25 +1050,23 @@ class WebGLBackend extends Backend {
944
1050
  gl.transformFeedbackVaryings(
945
1051
  programGPU,
946
1052
  transformVaryingNames,
947
- gl.SEPARATE_ATTRIBS,
1053
+ gl.SEPARATE_ATTRIBS
948
1054
  );
949
1055
 
950
1056
  gl.linkProgram( programGPU );
951
1057
 
952
1058
  if ( gl.getProgramParameter( programGPU, gl.LINK_STATUS ) === false ) {
953
1059
 
954
- console.error( 'THREE.WebGLBackend:', gl.getProgramInfoLog( programGPU ) );
1060
+ this._logProgramError( programGPU, fragmentShader, vertexShader );
955
1061
 
956
- console.error( 'THREE.WebGLBackend:', gl.getShaderInfoLog( fragmentShader ) );
957
- console.error( 'THREE.WebGLBackend:', gl.getShaderInfoLog( vertexShader ) );
958
1062
 
959
1063
  }
960
1064
 
961
- gl.useProgram( programGPU );
1065
+ state.useProgram( programGPU );
962
1066
 
963
1067
  // Bindings
964
1068
 
965
- this.createBindings( bindings );
1069
+ this.createBindings( null, bindings );
966
1070
 
967
1071
  this._setupBindings( bindings, programGPU );
968
1072
 
@@ -1002,44 +1106,48 @@ class WebGLBackend extends Backend {
1002
1106
 
1003
1107
  }
1004
1108
 
1005
- createBindings( bindings ) {
1109
+ createBindings( bindGroup, bindings ) {
1006
1110
 
1007
- this.updateBindings( bindings );
1111
+ this.updateBindings( bindGroup, bindings );
1008
1112
 
1009
1113
  }
1010
1114
 
1011
- updateBindings( bindings ) {
1115
+ updateBindings( bindGroup, bindings ) {
1012
1116
 
1013
- const { gl } = this;
1117
+ const { state, gl } = this;
1014
1118
 
1015
1119
  let groupIndex = 0;
1016
1120
  let textureIndex = 0;
1017
1121
 
1018
- for ( const binding of bindings ) {
1122
+ for ( const bindGroup of bindings ) {
1123
+
1124
+ for ( const binding of bindGroup.bindings ) {
1019
1125
 
1020
- if ( binding.isUniformsGroup || binding.isUniformBuffer ) {
1126
+ if ( binding.isUniformsGroup || binding.isUniformBuffer ) {
1021
1127
 
1022
- const bufferGPU = gl.createBuffer();
1023
- const data = binding.buffer;
1128
+ const bufferGPU = gl.createBuffer();
1129
+ const data = binding.buffer;
1024
1130
 
1025
- gl.bindBuffer( gl.UNIFORM_BUFFER, bufferGPU );
1026
- gl.bufferData( gl.UNIFORM_BUFFER, data, gl.DYNAMIC_DRAW );
1027
- gl.bindBufferBase( gl.UNIFORM_BUFFER, groupIndex, bufferGPU );
1131
+ gl.bindBuffer( gl.UNIFORM_BUFFER, bufferGPU );
1132
+ gl.bufferData( gl.UNIFORM_BUFFER, data, gl.DYNAMIC_DRAW );
1133
+ state.bindBufferBase( gl.UNIFORM_BUFFER, groupIndex, bufferGPU );
1028
1134
 
1029
- this.set( binding, {
1030
- index: groupIndex ++,
1031
- bufferGPU
1032
- } );
1135
+ this.set( binding, {
1136
+ index: groupIndex ++,
1137
+ bufferGPU
1138
+ } );
1033
1139
 
1034
- } else if ( binding.isSampledTexture ) {
1140
+ } else if ( binding.isSampledTexture ) {
1035
1141
 
1036
- const { textureGPU, glTextureType } = this.get( binding.texture );
1142
+ const { textureGPU, glTextureType } = this.get( binding.texture );
1037
1143
 
1038
- this.set( binding, {
1039
- index: textureIndex ++,
1040
- textureGPU,
1041
- glTextureType
1042
- } );
1144
+ this.set( binding, {
1145
+ index: textureIndex ++,
1146
+ textureGPU,
1147
+ glTextureType
1148
+ } );
1149
+
1150
+ }
1043
1151
 
1044
1152
  }
1045
1153
 
@@ -1086,7 +1194,11 @@ class WebGLBackend extends Backend {
1086
1194
 
1087
1195
  createStorageAttribute( attribute ) {
1088
1196
 
1089
- //console.warn( 'Abstract class.' );
1197
+ if ( this.has( attribute ) ) return;
1198
+
1199
+ const gl = this.gl;
1200
+
1201
+ this.attributeUtils.createAttribute( attribute, gl.ARRAY_BUFFER );
1090
1202
 
1091
1203
  }
1092
1204
 
@@ -1124,7 +1236,6 @@ class WebGLBackend extends Backend {
1124
1236
 
1125
1237
  }
1126
1238
 
1127
-
1128
1239
  getMaxAnisotropy() {
1129
1240
 
1130
1241
  return this.capabilities.getMaxAnisotropy();
@@ -1143,38 +1254,38 @@ class WebGLBackend extends Backend {
1143
1254
 
1144
1255
  }
1145
1256
 
1146
- _setFramebuffer( renderContext ) {
1257
+ _setFramebuffer( descriptor ) {
1147
1258
 
1148
1259
  const { gl, state } = this;
1149
1260
 
1150
1261
  let currentFrameBuffer = null;
1151
1262
 
1152
- if ( renderContext.textures !== null ) {
1263
+ if ( descriptor.textures !== null ) {
1153
1264
 
1154
- const renderTarget = renderContext.renderTarget;
1265
+ const renderTarget = descriptor.renderTarget;
1155
1266
  const renderTargetContextData = this.get( renderTarget );
1156
1267
  const { samples, depthBuffer, stencilBuffer } = renderTarget;
1157
- const cubeFace = this.renderer._activeCubeFace;
1268
+
1158
1269
  const isCube = renderTarget.isWebGLCubeRenderTarget === true;
1159
1270
 
1160
1271
  let msaaFb = renderTargetContextData.msaaFrameBuffer;
1161
1272
  let depthRenderbuffer = renderTargetContextData.depthRenderbuffer;
1162
1273
 
1274
+ const cacheKey = getCacheKey( descriptor );
1275
+
1163
1276
  let fb;
1164
1277
 
1165
1278
  if ( isCube ) {
1166
1279
 
1167
- if ( renderTargetContextData.cubeFramebuffers === undefined ) {
1280
+ renderTargetContextData.cubeFramebuffers || ( renderTargetContextData.cubeFramebuffers = {} );
1168
1281
 
1169
- renderTargetContextData.cubeFramebuffers = [];
1170
-
1171
- }
1172
-
1173
- fb = renderTargetContextData.cubeFramebuffers[ cubeFace ];
1282
+ fb = renderTargetContextData.cubeFramebuffers[ cacheKey ];
1174
1283
 
1175
1284
  } else {
1176
1285
 
1177
- fb = renderTargetContextData.framebuffer;
1286
+ renderTargetContextData.framebuffers || ( renderTargetContextData.framebuffers = {} );
1287
+
1288
+ fb = renderTargetContextData.framebuffers[ cacheKey ];
1178
1289
 
1179
1290
  }
1180
1291
 
@@ -1184,22 +1295,27 @@ class WebGLBackend extends Backend {
1184
1295
 
1185
1296
  state.bindFramebuffer( gl.FRAMEBUFFER, fb );
1186
1297
 
1187
- const textures = renderContext.textures;
1298
+ const textures = descriptor.textures;
1188
1299
 
1189
1300
  if ( isCube ) {
1190
1301
 
1191
- renderTargetContextData.cubeFramebuffers[ cubeFace ] = fb;
1302
+ renderTargetContextData.cubeFramebuffers[ cacheKey ] = fb;
1303
+
1192
1304
  const { textureGPU } = this.get( textures[ 0 ] );
1193
1305
 
1306
+ const cubeFace = this.renderer._activeCubeFace;
1307
+
1194
1308
  gl.framebufferTexture2D( gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_CUBE_MAP_POSITIVE_X + cubeFace, textureGPU, 0 );
1195
1309
 
1196
1310
  } else {
1197
1311
 
1312
+ renderTargetContextData.framebuffers[ cacheKey ] = fb;
1313
+
1198
1314
  for ( let i = 0; i < textures.length; i ++ ) {
1199
1315
 
1200
1316
  const texture = textures[ i ];
1201
1317
  const textureData = this.get( texture );
1202
- textureData.renderTarget = renderContext.renderTarget;
1318
+ textureData.renderTarget = descriptor.renderTarget;
1203
1319
 
1204
1320
  const attachment = gl.COLOR_ATTACHMENT0 + i;
1205
1321
 
@@ -1207,15 +1323,13 @@ class WebGLBackend extends Backend {
1207
1323
 
1208
1324
  }
1209
1325
 
1210
- renderTargetContextData.framebuffer = fb;
1211
-
1212
- state.drawBuffers( renderContext, fb );
1326
+ state.drawBuffers( descriptor, fb );
1213
1327
 
1214
1328
  }
1215
1329
 
1216
- if ( renderContext.depthTexture !== null ) {
1330
+ if ( descriptor.depthTexture !== null ) {
1217
1331
 
1218
- const textureData = this.get( renderContext.depthTexture );
1332
+ const textureData = this.get( descriptor.depthTexture );
1219
1333
  const depthStyle = stencilBuffer ? gl.DEPTH_STENCIL_ATTACHMENT : gl.DEPTH_ATTACHMENT;
1220
1334
 
1221
1335
  gl.framebufferTexture2D( gl.FRAMEBUFFER, depthStyle, gl.TEXTURE_2D, textureData.textureGPU, 0 );
@@ -1236,11 +1350,10 @@ class WebGLBackend extends Backend {
1236
1350
 
1237
1351
  const msaaRenderbuffers = [];
1238
1352
 
1239
- const textures = renderContext.textures;
1353
+ const textures = descriptor.textures;
1240
1354
 
1241
1355
  for ( let i = 0; i < textures.length; i ++ ) {
1242
1356
 
1243
-
1244
1357
  msaaRenderbuffers[ i ] = gl.createRenderbuffer();
1245
1358
 
1246
1359
  gl.bindRenderbuffer( gl.RENDERBUFFER, msaaRenderbuffers[ i ] );
@@ -1254,10 +1367,10 @@ class WebGLBackend extends Backend {
1254
1367
 
1255
1368
  }
1256
1369
 
1257
- const texture = renderContext.textures[ i ];
1370
+ const texture = descriptor.textures[ i ];
1258
1371
  const textureData = this.get( texture );
1259
1372
 
1260
- gl.renderbufferStorageMultisample( gl.RENDERBUFFER, samples, textureData.glInternalFormat, renderContext.width, renderContext.height );
1373
+ gl.renderbufferStorageMultisample( gl.RENDERBUFFER, samples, textureData.glInternalFormat, descriptor.width, descriptor.height );
1261
1374
  gl.framebufferRenderbuffer( gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0 + i, gl.RENDERBUFFER, msaaRenderbuffers[ i ] );
1262
1375
 
1263
1376
 
@@ -1269,7 +1382,7 @@ class WebGLBackend extends Backend {
1269
1382
  if ( depthRenderbuffer === undefined ) {
1270
1383
 
1271
1384
  depthRenderbuffer = gl.createRenderbuffer();
1272
- this.textureUtils.setupRenderBufferStorage( depthRenderbuffer, renderContext );
1385
+ this.textureUtils.setupRenderBufferStorage( depthRenderbuffer, descriptor );
1273
1386
 
1274
1387
  renderTargetContextData.depthRenderbuffer = depthRenderbuffer;
1275
1388
 
@@ -1416,7 +1529,7 @@ class WebGLBackend extends Backend {
1416
1529
 
1417
1530
  }
1418
1531
 
1419
- const gl = this.gl;
1532
+ const { gl } = this;
1420
1533
 
1421
1534
  transformFeedbackGPU = gl.createTransformFeedback();
1422
1535
 
@@ -1443,20 +1556,24 @@ class WebGLBackend extends Backend {
1443
1556
 
1444
1557
  const gl = this.gl;
1445
1558
 
1446
- for ( const binding of bindings ) {
1559
+ for ( const bindGroup of bindings ) {
1447
1560
 
1448
- const bindingData = this.get( binding );
1449
- const index = bindingData.index;
1561
+ for ( const binding of bindGroup.bindings ) {
1562
+
1563
+ const bindingData = this.get( binding );
1564
+ const index = bindingData.index;
1450
1565
 
1451
- if ( binding.isUniformsGroup || binding.isUniformBuffer ) {
1566
+ if ( binding.isUniformsGroup || binding.isUniformBuffer ) {
1452
1567
 
1453
- const location = gl.getUniformBlockIndex( programGPU, binding.name );
1454
- gl.uniformBlockBinding( programGPU, location, index );
1568
+ const location = gl.getUniformBlockIndex( programGPU, binding.name );
1569
+ gl.uniformBlockBinding( programGPU, location, index );
1455
1570
 
1456
- } else if ( binding.isSampledTexture ) {
1571
+ } else if ( binding.isSampledTexture ) {
1457
1572
 
1458
- const location = gl.getUniformLocation( programGPU, binding.name );
1459
- gl.uniform1i( location, index );
1573
+ const location = gl.getUniformLocation( programGPU, binding.name );
1574
+ gl.uniform1i( location, index );
1575
+
1576
+ }
1460
1577
 
1461
1578
  }
1462
1579
 
@@ -1468,18 +1585,23 @@ class WebGLBackend extends Backend {
1468
1585
 
1469
1586
  const { gl, state } = this;
1470
1587
 
1471
- for ( const binding of bindings ) {
1588
+ for ( const bindGroup of bindings ) {
1472
1589
 
1473
- const bindingData = this.get( binding );
1474
- const index = bindingData.index;
1590
+ for ( const binding of bindGroup.bindings ) {
1591
+
1592
+ const bindingData = this.get( binding );
1593
+ const index = bindingData.index;
1475
1594
 
1476
- if ( binding.isUniformsGroup || binding.isUniformBuffer ) {
1595
+ if ( binding.isUniformsGroup || binding.isUniformBuffer ) {
1477
1596
 
1478
- gl.bindBufferBase( gl.UNIFORM_BUFFER, index, bindingData.bufferGPU );
1597
+ // TODO USE bindBufferRange to group multiple uniform buffers
1598
+ state.bindBufferBase( gl.UNIFORM_BUFFER, index, bindingData.bufferGPU );
1479
1599
 
1480
- } else if ( binding.isSampledTexture ) {
1600
+ } else if ( binding.isSampledTexture ) {
1481
1601
 
1482
- state.bindTexture( bindingData.glTextureType, bindingData.textureGPU, gl.TEXTURE0 + index );
1602
+ state.bindTexture( bindingData.glTextureType, bindingData.textureGPU, gl.TEXTURE0 + index );
1603
+
1604
+ }
1483
1605
 
1484
1606
  }
1485
1607