@unikia/upe-renderer 0.186.110 → 0.187.11

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 (506) hide show
  1. package/README.md +5 -7
  2. package/UPSTREAM.md +4 -4
  3. package/build/three.core.js +853 -277
  4. package/build/three.module.js +1098 -1280
  5. package/build/three.tsl.js +41938 -686
  6. package/build/three.webgpu.js +10604 -49055
  7. package/build/three.webgpu.nodes.js +9249 -5788
  8. package/examples/jsm/Addons.js +2 -0
  9. package/examples/jsm/animation/CCDIKSolver.js +17 -5
  10. package/examples/jsm/controls/FirstPersonControls.js +1 -1
  11. package/examples/jsm/controls/OrbitControls.js +27 -14
  12. package/examples/jsm/csm/CSMShader.js +74 -3
  13. package/examples/jsm/curves/CurveExtras.js +4 -4
  14. package/examples/jsm/curves/NURBSCurve.js +14 -0
  15. package/examples/jsm/exporters/EXRExporter.js +673 -16
  16. package/examples/jsm/exporters/GLTFExporter.js +4 -4
  17. package/examples/jsm/exporters/KTX2Exporter.js +1 -1
  18. package/examples/jsm/exporters/OBJExporter.js +48 -5
  19. package/examples/jsm/exporters/PLYExporter.js +22 -11
  20. package/examples/jsm/generators/CityGenerator.js +3 -2
  21. package/examples/jsm/generators/city/SkyscraperGenerator.js +63 -21
  22. package/examples/jsm/gpgpu/BitonicSort.js +30 -23
  23. package/examples/jsm/helpers/VertexTangentsHelper.js +1 -1
  24. package/examples/jsm/inspector/Extension.js +1 -1
  25. package/examples/jsm/inspector/Inspector.js +6 -46
  26. package/examples/jsm/inspector/RendererInspector.js +43 -8
  27. package/examples/jsm/inspector/Storage.js +49 -0
  28. package/examples/jsm/inspector/extensions/color-grading/ColorGrading.js +32 -27
  29. package/examples/jsm/inspector/tabs/Parameters.js +5 -1
  30. package/examples/jsm/inspector/tabs/Performance.js +22 -7
  31. package/examples/jsm/inspector/tabs/Settings.js +1 -1
  32. package/examples/jsm/inspector/tabs/Timeline.js +83 -7
  33. package/examples/jsm/inspector/tabs/Viewer.js +25 -10
  34. package/examples/jsm/inspector/ui/Profiler.js +1 -1
  35. package/examples/jsm/inspector/ui/Style.js +21 -53
  36. package/examples/jsm/inspector/ui/Values.js +28 -3
  37. package/examples/jsm/libs/fflate.module.js +83 -56
  38. package/examples/jsm/libs/mikktspace.README.md +27 -0
  39. package/examples/jsm/libs/mikktspace.module.js +721 -109
  40. package/examples/jsm/lighting/ClusteredLighting.js +100 -2
  41. package/examples/jsm/lighting/LightMapper.js +295 -0
  42. package/examples/jsm/lighting/LightProbeGrid.js +242 -139
  43. package/examples/jsm/lighting/LightProbeGridWebGL.js +30 -14
  44. package/examples/jsm/lighting/vxgi/VXGIConeTracer.js +54 -5
  45. package/examples/jsm/lighting/vxgi/VXGIIrradiance.js +43 -0
  46. package/examples/jsm/lighting/vxgi/VXGINode.js +13 -56
  47. package/examples/jsm/lighting/vxgi/VXGISceneCollector.js +316 -1
  48. package/examples/jsm/lighting/vxgi/VXGIVolume.js +69 -59
  49. package/examples/jsm/lights/SunLight.js +9 -4
  50. package/examples/jsm/lights/SunLightNode.js +3 -3
  51. package/examples/jsm/lines/LineMaterial.js +26 -10
  52. package/examples/jsm/loaders/3DMLoader.js +10 -1
  53. package/examples/jsm/loaders/3MFLoader.js +5 -1
  54. package/examples/jsm/loaders/AMFLoader.js +2 -0
  55. package/examples/jsm/loaders/BVHLoader.js +2 -0
  56. package/examples/jsm/loaders/ColladaLoader.js +8 -0
  57. package/examples/jsm/loaders/DDSLoader.js +1 -1
  58. package/examples/jsm/loaders/DRACOLoader.js +5 -1
  59. package/examples/jsm/loaders/EXRLoader.js +120 -104
  60. package/examples/jsm/loaders/FBXLoader.js +4 -0
  61. package/examples/jsm/loaders/FontLoader.js +2 -0
  62. package/examples/jsm/loaders/GCodeLoader.js +5 -9
  63. package/examples/jsm/loaders/GLTFLoader.js +112 -31
  64. package/examples/jsm/loaders/GaussianSplatPLYLoader.js +2 -0
  65. package/examples/jsm/loaders/HDRCubeTextureLoader.js +3 -0
  66. package/examples/jsm/loaders/IESLoader.js +46 -12
  67. package/examples/jsm/loaders/JXLLoader.js +159 -0
  68. package/examples/jsm/loaders/KMZLoader.js +6 -0
  69. package/examples/jsm/loaders/KSPLATLoader.js +2 -0
  70. package/examples/jsm/loaders/KTX2Loader.js +49 -4
  71. package/examples/jsm/loaders/KTXLoader.js +5 -3
  72. package/examples/jsm/loaders/LDrawLoader.js +15 -22
  73. package/examples/jsm/loaders/LUT3dlLoader.js +5 -1
  74. package/examples/jsm/loaders/LUTCubeLoader.js +6 -2
  75. package/examples/jsm/loaders/LUTImageLoader.js +2 -0
  76. package/examples/jsm/loaders/LWOLoader.js +6 -0
  77. package/examples/jsm/loaders/MD2Loader.js +2 -0
  78. package/examples/jsm/loaders/MDDLoader.js +4 -0
  79. package/examples/jsm/loaders/MTLLoader.js +8 -0
  80. package/examples/jsm/loaders/MaterialXLoader.js +57 -5
  81. package/examples/jsm/loaders/NRRDLoader.js +4 -2
  82. package/examples/jsm/loaders/OBJLoader.js +10 -4
  83. package/examples/jsm/loaders/PCDLoader.js +6 -2
  84. package/examples/jsm/loaders/PDBLoader.js +5 -3
  85. package/examples/jsm/loaders/PLYLoader.js +39 -15
  86. package/examples/jsm/loaders/PVRLoader.js +2 -2
  87. package/examples/jsm/loaders/SPLATLoader.js +2 -0
  88. package/examples/jsm/loaders/SPZLoader.js +2 -0
  89. package/examples/jsm/loaders/STLLoader.js +3 -1
  90. package/examples/jsm/loaders/SVGLoader.js +27 -49
  91. package/examples/jsm/loaders/TDSLoader.js +4 -0
  92. package/examples/jsm/loaders/TGALoader.js +6 -5
  93. package/examples/jsm/loaders/TTFLoader.js +2 -0
  94. package/examples/jsm/loaders/USDLoader.js +14 -0
  95. package/examples/jsm/loaders/UltraHDRLoader.js +2 -0
  96. package/examples/jsm/loaders/VOXLoader.js +3 -0
  97. package/examples/jsm/loaders/VRMLLoader.js +4 -0
  98. package/examples/jsm/loaders/VTKLoader.js +2 -0
  99. package/examples/jsm/loaders/XYZLoader.js +2 -0
  100. package/examples/jsm/loaders/collada/ColladaComposer.js +15 -8
  101. package/examples/jsm/loaders/materialx/MaterialXDocument.js +610 -138
  102. package/examples/jsm/loaders/materialx/MaterialXInterfaceValidation.js +12 -95
  103. package/examples/jsm/loaders/materialx/MaterialXLog.js +4 -0
  104. package/examples/jsm/loaders/materialx/MaterialXNodeDefs.js +99 -0
  105. package/examples/jsm/loaders/materialx/MaterialXNodeInterfaceRegistry.js +760 -1
  106. package/examples/jsm/loaders/materialx/MaterialXNodeLibrary.js +222 -372
  107. package/examples/jsm/loaders/materialx/MaterialXSurfaceMappings.js +163 -259
  108. package/examples/jsm/loaders/materialx/MaterialXUtils.js +25 -0
  109. package/examples/jsm/loaders/materialx/compile/MaterialXCompileRegistry.js +161 -159
  110. package/examples/jsm/loaders/usd/USDAParser.js +56 -47
  111. package/examples/jsm/loaders/usd/USDComposer.js +25 -30
  112. package/examples/jsm/math/ColorConverter.js +7 -3
  113. package/examples/jsm/math/Lut.js +2 -2
  114. package/examples/jsm/math/OBB.js +3 -3
  115. package/examples/jsm/math/Octree.js +20 -17
  116. package/examples/jsm/objects/GaussianSplat.js +5 -4
  117. package/examples/jsm/objects/Reflector.js +5 -0
  118. package/examples/jsm/objects/SkyMesh.js +14 -7
  119. package/examples/jsm/objects/Water2Mesh.js +2 -2
  120. package/examples/jsm/physics/RapierPhysics.js +2 -2
  121. package/examples/jsm/pipelines/MeshletDrawingPipeline.js +5571 -0
  122. package/examples/jsm/pipelines/VisibilityBufferDrawingPipeline.js +954 -0
  123. package/examples/jsm/postprocessing/BokehPass.js +1 -1
  124. package/examples/jsm/postprocessing/GTAOPass.js +26 -18
  125. package/examples/jsm/renderers/SVGRenderer.js +3 -2
  126. package/examples/jsm/shaders/GTAOShader.js +7 -4
  127. package/examples/jsm/shaders/PoissonDenoiseShader.js +1 -10
  128. package/examples/jsm/tsl/WebGLNodesHandler.js +21 -9
  129. package/examples/jsm/tsl/display/AfterImageNode.js +3 -3
  130. package/examples/jsm/tsl/display/BilateralBlurNode.js +3 -3
  131. package/examples/jsm/tsl/display/BloomNode.js +3 -3
  132. package/examples/jsm/tsl/display/ChromaticAberrationNode.js +8 -19
  133. package/examples/jsm/tsl/display/DenoiseNode.js +5 -5
  134. package/examples/jsm/tsl/display/DepthOfFieldNode.js +3 -3
  135. package/examples/jsm/tsl/display/DotScreenNode.js +3 -3
  136. package/examples/jsm/tsl/display/FSR1Node.js +3 -3
  137. package/examples/jsm/tsl/display/FXAANode.js +3 -10
  138. package/examples/jsm/tsl/display/FilmNode.js +3 -3
  139. package/examples/jsm/tsl/display/GTAONode.js +33 -25
  140. package/examples/jsm/tsl/display/GaussianBlurNode.js +3 -3
  141. package/examples/jsm/tsl/display/GodraysNode.js +5 -19
  142. package/examples/jsm/tsl/display/ImportanceSampledEnvironment.js +8 -4
  143. package/examples/jsm/tsl/display/LensflareNode.js +3 -3
  144. package/examples/jsm/tsl/display/Lut3DNode.js +3 -3
  145. package/examples/jsm/tsl/display/OITPassNode.js +0 -11
  146. package/examples/jsm/tsl/display/OutlineNode.js +107 -5
  147. package/examples/jsm/tsl/display/PixelationPassNode.js +85 -193
  148. package/examples/jsm/tsl/display/RGBShiftNode.js +3 -3
  149. package/examples/jsm/tsl/display/RecurrentDenoiseNode.js +23 -126
  150. package/examples/jsm/tsl/display/SMAANode.js +3 -3
  151. package/examples/jsm/tsl/display/SSAONode.js +6 -20
  152. package/examples/jsm/tsl/display/SSGINode.js +36 -29
  153. package/examples/jsm/tsl/display/SSRNode.js +135 -63
  154. package/examples/jsm/tsl/display/SSSNode.js +6 -20
  155. package/examples/jsm/tsl/display/SharpenNode.js +3 -3
  156. package/examples/jsm/tsl/display/SobelOperatorNode.js +3 -3
  157. package/examples/jsm/tsl/display/TAAUNode.js +10 -42
  158. package/examples/jsm/tsl/display/TRAANode.js +11 -43
  159. package/examples/jsm/tsl/display/TemporalReprojectNode.js +42 -47
  160. package/examples/jsm/tsl/display/TransitionNode.js +3 -3
  161. package/examples/jsm/tsl/display/lensDirt.js +30 -0
  162. package/examples/jsm/tsl/lighting/ClusteredLightsNode.js +482 -121
  163. package/examples/jsm/tsl/lighting/DynamicLightsNode.js +41 -140
  164. package/examples/jsm/tsl/lighting/LightProbeGridNode.js +72 -25
  165. package/examples/jsm/tsl/lighting/data/AmbientLightDataNode.js +6 -0
  166. package/examples/jsm/tsl/lighting/data/DirectionalLightDataNode.js +6 -0
  167. package/examples/jsm/tsl/lighting/data/HemisphereLightDataNode.js +6 -0
  168. package/examples/jsm/tsl/lighting/data/PointLightDataNode.js +6 -0
  169. package/examples/jsm/tsl/lighting/data/SpotLightDataNode.js +6 -0
  170. package/examples/jsm/tsl/shadows/TileShadowNode.js +102 -14
  171. package/examples/jsm/tsl/utils/Raymarching.js +1 -1
  172. package/examples/jsm/tsl/utils/SoftParticles.js +5 -12
  173. package/examples/jsm/tsl/utils/SpecularHelpers.js +47 -70
  174. package/examples/jsm/tsl/utils/TAAUtils.js +6 -17
  175. package/examples/jsm/utils/BufferGeometryUtils.js +110 -88
  176. package/examples/jsm/utils/MeshletGeometryUtils.js +417 -0
  177. package/examples/jsm/utils/SceneOptimizer.js +2 -1
  178. package/examples/jsm/utils/SceneUtils.js +1 -1
  179. package/examples/jsm/utils/unwrapUVs.js +865 -0
  180. package/examples/jsm/webxr/XREstimatedLight.js +11 -4
  181. package/package.json +3 -3
  182. package/src/Three.TSL.js +2 -683
  183. package/src/Three.WebGPU.Nodes.js +2 -1
  184. package/src/Three.WebGPU.js +2 -1
  185. package/src/animation/AnimationAction.js +1 -1
  186. package/src/animation/AnimationUtils.js +1 -3
  187. package/src/animation/KeyframeTrack.js +19 -0
  188. package/src/cameras/ArrayCamera.js +12 -0
  189. package/src/cameras/CubeCamera.js +3 -3
  190. package/src/constants.js +1 -9
  191. package/src/core/BufferAttribute.js +57 -21
  192. package/src/core/BufferGeometry.js +5 -13
  193. package/src/core/Clock.js +1 -1
  194. package/src/core/InterleavedBuffer.js +28 -18
  195. package/src/core/InterleavedBufferAttribute.js +54 -20
  196. package/src/core/Object3D.js +19 -9
  197. package/src/core/Raycaster.js +2 -0
  198. package/src/core/RenderTarget.js +11 -5
  199. package/src/core/UniformsGroup.js +7 -3
  200. package/src/extras/PMREMGenerator.js +392 -685
  201. package/src/extras/core/Curve.js +4 -0
  202. package/src/extras/core/CurvePath.js +13 -0
  203. package/src/extras/core/ShapePath.js +1 -1
  204. package/src/geometries/EdgesGeometry.js +12 -10
  205. package/src/geometries/LatheGeometry.js +2 -0
  206. package/src/helpers/PolarGridHelper.js +1 -1
  207. package/src/lights/Light.js +11 -0
  208. package/src/lights/LightProbe.js +2 -0
  209. package/src/lights/LightShadow.js +2 -0
  210. package/src/loaders/AnimationLoader.js +2 -0
  211. package/src/loaders/AudioLoader.js +2 -0
  212. package/src/loaders/BufferGeometryLoader.js +2 -0
  213. package/src/loaders/CompressedTextureLoader.js +2 -0
  214. package/src/loaders/CubeTextureLoader.js +2 -0
  215. package/src/loaders/DataTextureLoader.js +2 -0
  216. package/src/loaders/FileLoader.js +2 -0
  217. package/src/loaders/ImageBitmapLoader.js +3 -1
  218. package/src/loaders/ImageLoader.js +1 -0
  219. package/src/loaders/Loader.js +47 -0
  220. package/src/loaders/MaterialLoader.js +2 -0
  221. package/src/loaders/ObjectLoader.js +27 -8
  222. package/src/loaders/TextureLoader.js +5 -3
  223. package/src/loaders/nodes/NodeLoader.js +2 -0
  224. package/src/materials/Material.js +21 -2
  225. package/src/materials/MeshDepthMaterial.js +1 -1
  226. package/src/materials/MeshDistanceMaterial.js +1 -1
  227. package/src/materials/MeshLambertMaterial.js +1 -1
  228. package/src/materials/MeshMatcapMaterial.js +1 -1
  229. package/src/materials/MeshNormalMaterial.js +1 -1
  230. package/src/materials/MeshPhongMaterial.js +1 -1
  231. package/src/materials/MeshPhysicalMaterial.js +90 -11
  232. package/src/materials/MeshStandardMaterial.js +1 -1
  233. package/src/materials/MeshToonMaterial.js +1 -1
  234. package/src/materials/nodes/Line2NodeMaterial.js +32 -10
  235. package/src/materials/nodes/MeshLambertNodeMaterial.js +13 -0
  236. package/src/materials/nodes/MeshPhongNodeMaterial.js +13 -0
  237. package/src/materials/nodes/MeshPhysicalNodeMaterial.js +40 -5
  238. package/src/materials/nodes/MeshToonNodeMaterial.js +13 -0
  239. package/src/materials/nodes/NodeMaterial.js +36 -16
  240. package/src/materials/nodes/NodeMaterialInstance.js +193 -0
  241. package/src/materials/nodes/NodeMaterials.js +1 -0
  242. package/src/materials/nodes/PointsNodeMaterial.js +1 -1
  243. package/src/materials/nodes/SpriteNodeMaterial.js +3 -3
  244. package/src/materials/nodes/manager/NodeMaterialObserver.js +191 -22
  245. package/src/math/Box3.js +2 -2
  246. package/src/math/Color.js +8 -8
  247. package/src/math/ColorManagement.js +2 -21
  248. package/src/math/FrustumArray.js +12 -0
  249. package/src/math/Interpolant.js +1 -1
  250. package/src/math/Line3.js +2 -4
  251. package/src/math/MathUtils.js +33 -46
  252. package/src/math/Matrix2.js +1 -1
  253. package/src/math/Matrix3.js +1 -1
  254. package/src/math/Matrix4.js +1 -1
  255. package/src/math/Triangle.js +2 -1
  256. package/src/math/Vector2.js +1 -1
  257. package/src/math/Vector3.js +1 -1
  258. package/src/math/Vector4.js +1 -1
  259. package/src/nodes/Nodes.js +1 -0
  260. package/src/nodes/TSL.js +2 -0
  261. package/src/nodes/accessors/Arrays.js +1 -1
  262. package/src/nodes/accessors/Batch.js +29 -23
  263. package/src/nodes/accessors/BufferAttributeNode.js +21 -1
  264. package/src/nodes/accessors/BuiltinNode.js +6 -0
  265. package/src/nodes/accessors/Camera.js +100 -93
  266. package/src/nodes/accessors/ClippingNode.js +17 -6
  267. package/src/nodes/accessors/CubeTextureNode.js +12 -24
  268. package/src/nodes/accessors/Instance.js +198 -160
  269. package/src/nodes/accessors/Lights.js +19 -6
  270. package/src/nodes/accessors/MaterialNode.js +33 -4
  271. package/src/nodes/accessors/Morph.js +81 -22
  272. package/src/nodes/accessors/Normal.js +0 -42
  273. package/src/nodes/accessors/Object3DNode.js +6 -0
  274. package/src/nodes/accessors/PointUVNode.js +6 -0
  275. package/src/nodes/accessors/ReferenceAttributeNode.js +279 -0
  276. package/src/nodes/accessors/ReferenceBaseNode.js +6 -0
  277. package/src/nodes/accessors/ReferenceNode.js +6 -0
  278. package/src/nodes/accessors/Skinning.js +57 -52
  279. package/src/nodes/accessors/StorageBufferNode.js +3 -12
  280. package/src/nodes/accessors/TextureBicubic.js +30 -27
  281. package/src/nodes/accessors/TextureNode.js +164 -78
  282. package/src/nodes/accessors/TextureSizeNode.js +6 -0
  283. package/src/nodes/accessors/UniformArrayNode.js +8 -15
  284. package/src/nodes/accessors/VelocityNode.js +13 -8
  285. package/src/nodes/code/CodeNode.js +6 -0
  286. package/src/nodes/code/ExpressionNode.js +6 -0
  287. package/src/nodes/code/FunctionCallNode.js +3 -3
  288. package/src/nodes/code/FunctionNode.js +15 -13
  289. package/src/nodes/core/ArrayNode.js +3 -3
  290. package/src/nodes/core/AssignNode.js +10 -9
  291. package/src/nodes/core/AttributeNode.js +39 -0
  292. package/src/nodes/core/BypassNode.js +6 -0
  293. package/src/nodes/core/ConstNode.js +31 -1
  294. package/src/nodes/core/ContextNode.js +11 -6
  295. package/src/nodes/core/IndexNode.js +6 -0
  296. package/src/nodes/core/InputNode.js +6 -0
  297. package/src/nodes/core/InspectorNode.js +17 -31
  298. package/src/nodes/core/IsolateNode.js +8 -0
  299. package/src/nodes/core/Node.js +367 -67
  300. package/src/nodes/core/NodeBuilder.js +664 -222
  301. package/src/nodes/core/NodeUtils.js +25 -0
  302. package/src/nodes/core/NodeVar.js +10 -1
  303. package/src/nodes/core/OutputStructNode.js +6 -0
  304. package/src/nodes/core/OverrideContextNode.js +38 -37
  305. package/src/nodes/core/PropertyNode.js +14 -0
  306. package/src/nodes/core/StackNode.js +33 -21
  307. package/src/nodes/core/StructNode.js +6 -0
  308. package/src/nodes/core/StructTypeNode.js +6 -0
  309. package/src/nodes/core/SubBuildNode.js +8 -0
  310. package/src/nodes/core/TempNode.js +10 -35
  311. package/src/nodes/core/UniformGroupNode.js +6 -0
  312. package/src/nodes/core/VarNode.js +43 -135
  313. package/src/nodes/core/VaryingNode.js +33 -2
  314. package/src/nodes/display/BlendModes.js +5 -40
  315. package/src/nodes/display/BumpMapNode.js +17 -7
  316. package/src/nodes/display/ColorAdjustment.js +22 -10
  317. package/src/nodes/display/ColorSpaceFunctions.js +2 -14
  318. package/src/nodes/display/ColorSpaceNode.js +3 -3
  319. package/src/nodes/display/FrontFacingNode.js +6 -0
  320. package/src/nodes/display/NormalMapNode.js +3 -3
  321. package/src/nodes/display/PassNode.js +75 -16
  322. package/src/nodes/display/RenderOutputNode.js +22 -5
  323. package/src/nodes/display/ScreenNode.js +6 -0
  324. package/src/nodes/display/ToneMappingFunctions.js +9 -51
  325. package/src/nodes/display/ToneMappingNode.js +3 -3
  326. package/src/nodes/display/ToonOutlinePassNode.js +66 -2
  327. package/src/nodes/display/ViewportDepthNode.js +34 -4
  328. package/src/nodes/functions/BSDF/BRDF_EON.js +65 -0
  329. package/src/nodes/functions/BSDF/BRDF_GGX.js +5 -3
  330. package/src/nodes/functions/BSDF/BRDF_Sheen.js +2 -16
  331. package/src/nodes/functions/BSDF/D_GGX.js +1 -8
  332. package/src/nodes/functions/BSDF/D_GGX_Anisotropic.js +7 -10
  333. package/src/nodes/functions/BSDF/LTC.js +20 -47
  334. package/src/nodes/functions/BSDF/Schlick_to_F0.js +1 -9
  335. package/src/nodes/functions/BSDF/V_GGX_SmithCorrelated.js +1 -9
  336. package/src/nodes/functions/BSDF/V_GGX_SmithCorrelated_Anisotropic.js +10 -13
  337. package/src/nodes/functions/PhysicalLightingModel.js +84 -51
  338. package/src/nodes/functions/VolumetricLightingModel.js +1 -1
  339. package/src/nodes/functions/material/getAlphaHashThreshold.js +3 -9
  340. package/src/nodes/functions/material/getParallaxCorrectNormal.js +10 -11
  341. package/src/nodes/functions/material/getRoughness.js +3 -1
  342. package/src/nodes/geometry/RangeNode.js +52 -69
  343. package/src/nodes/gpgpu/AtomicFunctionNode.js +11 -6
  344. package/src/nodes/gpgpu/BarrierNode.js +6 -0
  345. package/src/nodes/gpgpu/ComputeBuiltinNode.js +6 -0
  346. package/src/nodes/gpgpu/ComputeNode.js +6 -0
  347. package/src/nodes/gpgpu/SubgroupFunctionNode.js +38 -29
  348. package/src/nodes/gpgpu/WorkgroupInfoNode.js +6 -0
  349. package/src/nodes/lighting/AnalyticLightNode.js +7 -14
  350. package/src/nodes/lighting/BasicEnvironmentNode.js +5 -1
  351. package/src/nodes/lighting/EnvironmentNode.js +58 -8
  352. package/src/nodes/lighting/IESSpotLightNode.js +19 -4
  353. package/src/nodes/lighting/LightProbeNode.js +2 -1
  354. package/src/nodes/lighting/LightUtils.js +2 -2
  355. package/src/nodes/lighting/LightingNode.js +6 -0
  356. package/src/nodes/lighting/LightsNode.js +26 -32
  357. package/src/nodes/lighting/PointShadowNode.js +92 -48
  358. package/src/nodes/lighting/ProjectorLightNode.js +1 -1
  359. package/src/nodes/lighting/RectAreaLightNode.js +13 -14
  360. package/src/nodes/lighting/ShadowBaseNode.js +9 -17
  361. package/src/nodes/lighting/ShadowFilterNode.js +26 -3
  362. package/src/nodes/lighting/ShadowNode.js +13 -11
  363. package/src/nodes/materialx/MaterialXColor.js +2 -14
  364. package/src/nodes/materialx/MaterialXColorTransform.js +1 -7
  365. package/src/nodes/materialx/MaterialXNodes.js +8 -11
  366. package/src/nodes/materialx/MaterialXNoise.js +195 -454
  367. package/src/nodes/math/BitcastNode.js +5 -5
  368. package/src/nodes/math/BitcountNode.js +18 -46
  369. package/src/nodes/math/ConditionalNode.js +92 -22
  370. package/src/nodes/math/Hash.js +1 -1
  371. package/src/nodes/math/MathNode.js +86 -64
  372. package/src/nodes/math/MathUtils.js +2 -2
  373. package/src/nodes/math/OperatorNode.js +42 -59
  374. package/src/nodes/math/PackFloatNode.js +9 -9
  375. package/src/nodes/math/Packed4x8IntegerNode.js +20 -52
  376. package/src/nodes/math/TriNoise3D.js +3 -23
  377. package/src/nodes/math/UnpackFloatNode.js +9 -9
  378. package/src/nodes/pmrem/PMREMNode.js +38 -75
  379. package/src/nodes/pmrem/PMREMUtils.js +108 -272
  380. package/src/nodes/procedural/Checker.js +1 -1
  381. package/src/nodes/tsl/TSLCore.js +199 -74
  382. package/src/nodes/utils/ArrayElementNode.js +19 -1
  383. package/src/nodes/utils/CubeMapNode.js +3 -3
  384. package/src/nodes/utils/DebugNode.js +2 -2
  385. package/src/nodes/utils/EventNode.js +6 -0
  386. package/src/nodes/utils/FlipNode.js +3 -3
  387. package/src/nodes/utils/FunctionOverloadingNode.js +7 -1
  388. package/src/nodes/utils/JoinNode.js +3 -3
  389. package/src/nodes/utils/LoopNode.js +14 -9
  390. package/src/nodes/utils/MemberNode.js +18 -0
  391. package/src/nodes/utils/PostProcessingUtils.js +20 -25
  392. package/src/nodes/utils/RTTNode.js +2 -0
  393. package/src/nodes/utils/ReflectorNode.js +24 -0
  394. package/src/nodes/utils/RotateNode.js +3 -3
  395. package/src/nodes/utils/SampleNode.js +6 -0
  396. package/src/nodes/utils/SetNode.js +3 -3
  397. package/src/nodes/utils/SplitNode.js +6 -0
  398. package/src/nodes/utils/UVUtils.js +2 -2
  399. package/src/objects/BatchedMesh.js +146 -15
  400. package/src/objects/InstancedMesh.js +12 -4
  401. package/src/objects/Line.js +20 -0
  402. package/src/objects/Mesh.js +8 -0
  403. package/src/objects/Points.js +20 -0
  404. package/src/objects/Skeleton.js +26 -0
  405. package/src/objects/SkinnedMesh.js +3 -3
  406. package/src/objects/Sprite.js +10 -0
  407. package/src/renderers/WebGLRenderer.js +104 -70
  408. package/src/renderers/common/Animation.js +5 -1
  409. package/src/renderers/common/Attributes.js +67 -57
  410. package/src/renderers/common/Backend.js +78 -3
  411. package/src/renderers/common/BindGroup.js +11 -0
  412. package/src/renderers/common/Binding.js +0 -11
  413. package/src/renderers/common/Bindings.js +116 -10
  414. package/src/renderers/common/Buffer.js +1 -1
  415. package/src/renderers/common/ClippingContext.js +12 -1
  416. package/src/renderers/common/ComputePipeline.js +17 -1
  417. package/src/renderers/common/DirectRenderPipeline.js +7 -3
  418. package/src/renderers/common/Geometries.js +170 -132
  419. package/src/renderers/common/Info.js +1 -1
  420. package/src/renderers/common/InspectorBase.js +5 -5
  421. package/src/renderers/common/Lighting.js +59 -0
  422. package/src/renderers/common/Pipelines.js +26 -12
  423. package/src/renderers/common/ProgrammableStage.js +1 -17
  424. package/src/renderers/common/RenderContext.js +21 -0
  425. package/src/renderers/common/RenderContexts.js +13 -4
  426. package/src/renderers/common/RenderObject.js +111 -35
  427. package/src/renderers/common/RenderObjects.js +37 -19
  428. package/src/renderers/common/Renderer.js +537 -295
  429. package/src/renderers/common/RendererUtils.js +15 -0
  430. package/src/renderers/common/StandardDrawingPipeline.js +343 -0
  431. package/src/renderers/common/Storage3DTexture.js +11 -0
  432. package/src/renderers/common/StorageArrayTexture.js +10 -0
  433. package/src/renderers/common/StorageTexture.js +0 -9
  434. package/src/renderers/common/Textures.js +144 -37
  435. package/src/renderers/common/UniformsGroup.js +19 -0
  436. package/src/renderers/common/XRManager.js +10 -91
  437. package/src/renderers/common/extras/PMREMGenerator.js +298 -576
  438. package/src/renderers/common/nodes/NodeBuilderState.js +7 -5
  439. package/src/renderers/common/nodes/NodeLibrary.js +11 -35
  440. package/src/renderers/common/nodes/NodeManager.js +80 -31
  441. package/src/renderers/common/nodes/NodeSampledTexture.js +14 -0
  442. package/src/renderers/common/nodes/NodeSampler.js +14 -0
  443. package/src/renderers/common/nodes/NodeStorageBuffer.js +1 -1
  444. package/src/renderers/common/nodes/NodeUniformBuffer.js +1 -14
  445. package/src/renderers/shaders/ShaderChunk/envmap_common_pars_fragment.glsl.js +13 -4
  446. package/src/renderers/shaders/ShaderChunk/envmap_physical_pars_fragment.glsl.js +8 -8
  447. package/src/renderers/shaders/ShaderChunk/lightprobes_pars_fragment.glsl.js +23 -11
  448. package/src/renderers/shaders/ShaderChunk/lights_fragment_begin.glsl.js +21 -2
  449. package/src/renderers/shaders/ShaderChunk/lights_fragment_maps.glsl.js +1 -1
  450. package/src/renderers/shaders/ShaderChunk/lights_physical_fragment.glsl.js +18 -2
  451. package/src/renderers/shaders/ShaderChunk/lights_physical_pars_fragment.glsl.js +104 -7
  452. package/src/renderers/shaders/ShaderChunk/morphcolor_vertex.glsl.js +11 -2
  453. package/src/renderers/shaders/ShaderChunk/shadowmap_pars_fragment.glsl.js +36 -20
  454. package/src/renderers/shaders/ShaderChunk/uv_pars_fragment.glsl.js +5 -0
  455. package/src/renderers/shaders/ShaderChunk/uv_pars_vertex.glsl.js +6 -0
  456. package/src/renderers/shaders/ShaderChunk/uv_vertex.glsl.js +5 -0
  457. package/src/renderers/shaders/ShaderChunk.js +0 -2
  458. package/src/renderers/shaders/ShaderLib/backgroundCube.glsl.js +4 -18
  459. package/src/renderers/shaders/ShaderLib/meshlambert.glsl.js +0 -1
  460. package/src/renderers/shaders/ShaderLib/meshphong.glsl.js +0 -1
  461. package/src/renderers/shaders/ShaderLib/meshphysical.glsl.js +8 -1
  462. package/src/renderers/shaders/ShaderLib.js +3 -0
  463. package/src/renderers/shaders/UniformsLib.js +4 -5
  464. package/src/renderers/webgl/WebGLBackground.js +3 -3
  465. package/src/renderers/webgl/WebGLBindingStates.js +4 -2
  466. package/src/renderers/webgl/WebGLCapabilities.js +7 -1
  467. package/src/renderers/webgl/WebGLEnvironments.js +2 -2
  468. package/src/renderers/webgl/WebGLGeometries.js +42 -14
  469. package/src/renderers/webgl/WebGLMaterials.js +15 -2
  470. package/src/renderers/webgl/WebGLOutput.js +37 -1
  471. package/src/renderers/webgl/WebGLProgram.js +13 -54
  472. package/src/renderers/webgl/WebGLPrograms.js +22 -8
  473. package/src/renderers/webgl/WebGLRenderStates.js +11 -8
  474. package/src/renderers/webgl/WebGLShadowMap.js +6 -4
  475. package/src/renderers/webgl/WebGLState.js +10 -6
  476. package/src/renderers/webgl/WebGLTextures.js +129 -77
  477. package/src/renderers/webgl/WebGLUniforms.js +44 -6
  478. package/src/renderers/webgl/WebGLUniformsGroups.js +75 -69
  479. package/src/renderers/webgl-fallback/WebGLBackend.js +206 -278
  480. package/src/renderers/webgl-fallback/nodes/GLSLNodeBuilder.js +154 -20
  481. package/src/renderers/webgl-fallback/utils/WebGLAttributeUtils.js +45 -42
  482. package/src/renderers/webgl-fallback/utils/WebGLState.js +29 -4
  483. package/src/renderers/webgl-fallback/utils/WebGLTextureUtils.js +129 -49
  484. package/src/renderers/webgl-fallback/utils/WebGLVertexArrayUtils.js +346 -0
  485. package/src/renderers/webgpu/WebGPUBackend.js +140 -82
  486. package/src/renderers/webgpu/WebGPURenderer.js +1 -1
  487. package/src/renderers/webgpu/nodes/BasicNodeLibrary.js +10 -10
  488. package/src/renderers/webgpu/nodes/StandardNodeLibrary.js +10 -10
  489. package/src/renderers/webgpu/nodes/WGSLNodeBuilder.js +135 -60
  490. package/src/renderers/webgpu/utils/WebGPUAttributeUtils.js +128 -55
  491. package/src/renderers/webgpu/utils/WebGPUBindingUtils.js +1 -1
  492. package/src/renderers/webgpu/utils/WebGPUPipelineUtils.js +15 -12
  493. package/src/renderers/webgpu/utils/WebGPUTextureUtils.js +55 -19
  494. package/src/renderers/webgpu/utils/WebGPUUtils.js +20 -3
  495. package/src/renderers/webxr/WebXRController.js +3 -3
  496. package/src/renderers/webxr/WebXRManager.js +5 -90
  497. package/src/scenes/Scene.js +4 -4
  498. package/src/textures/CompressedTexture.js +2 -2
  499. package/src/textures/DepthTexture.js +2 -2
  500. package/src/textures/FramebufferTexture.js +11 -0
  501. package/src/textures/Texture.js +29 -1
  502. package/src/textures/TextureSource.js +1 -1
  503. package/src/upe.js +1 -1
  504. package/src/utils.js +4 -4
  505. package/examples/jsm/libs/surfaceNet.js +0 -201
  506. package/src/renderers/shaders/ShaderChunk/cube_uv_reflection_fragment.glsl.js +0 -186
@@ -1,4 +1,4 @@
1
- import { LinearFilter, LinearMipmapLinearFilter, LinearMipmapNearestFilter, NearestFilter, NearestMipmapLinearFilter, NearestMipmapNearestFilter, FloatType, MirroredRepeatWrapping, ClampToEdgeWrapping, RepeatWrapping, NeverCompare, AlwaysCompare, LessCompare, LessEqualCompare, EqualCompare, GreaterEqualCompare, GreaterCompare, NotEqualCompare, NoColorSpace, LinearTransfer, SRGBTransfer } from '../../../constants.js';
1
+ import { LinearFilter, LinearMipmapLinearFilter, LinearMipmapNearestFilter, NearestFilter, NearestMipmapLinearFilter, NearestMipmapNearestFilter, FloatType, MirroredRepeatWrapping, ClampToEdgeWrapping, RepeatWrapping, NeverCompare, AlwaysCompare, LessCompare, LessEqualCompare, EqualCompare, GreaterEqualCompare, GreaterCompare, NotEqualCompare, NoColorSpace, LinearTransfer, SRGBTransfer, DepthStencilFormat } from '../../../constants.js';
2
2
  import { ColorManagement } from '../../../math/ColorManagement.js';
3
3
  import { getByteLength } from '../../../extras/TextureUtils.js';
4
4
  import { warn } from '../../../utils.js';
@@ -300,6 +300,7 @@ class WebGLTextureUtils {
300
300
  if ( glFormat === gl.DEPTH_STENCIL ) {
301
301
 
302
302
  if ( glType === gl.UNSIGNED_INT_24_8 ) internalFormat = gl.DEPTH24_STENCIL8;
303
+ if ( glType === gl.FLOAT ) internalFormat = gl.DEPTH32F_STENCIL8;
303
304
 
304
305
  }
305
306
 
@@ -352,7 +353,7 @@ class WebGLTextureUtils {
352
353
  gl.texParameteri( textureType, gl.TEXTURE_MAG_FILTER, filterToGL[ texture.magFilter ] );
353
354
 
354
355
 
355
- const hasMipmaps = texture.mipmaps !== undefined && texture.mipmaps.length > 0;
356
+ const hasMipmaps = texture.mipmaps.length > 0;
356
357
 
357
358
  // follow WebGPU backend mapping for texture filtering
358
359
  const minFilter = texture.minFilter === LinearFilter && hasMipmaps ? LinearMipmapLinearFilter : texture.minFilter;
@@ -539,10 +540,39 @@ class WebGLTextureUtils {
539
540
 
540
541
  this.setTextureParameters( glTextureType, texture );
541
542
 
542
- if ( texture.isCompressedTexture ) {
543
+ if ( texture.isCompressedCubeTexture ) {
544
+
545
+ for ( let i = 0; i < 6; i ++ ) {
546
+
547
+ const mipmaps = texture.image[ i ].mipmaps;
548
+
549
+ for ( let j = 0; j < mipmaps.length; j ++ ) {
550
+
551
+ const mipmap = mipmaps[ j ];
552
+
553
+ if ( glFormat === gl.RGBA ) {
554
+
555
+ gl.texSubImage2D( gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j, 0, 0, mipmap.width, mipmap.height, glFormat, glType, mipmap.data );
556
+
557
+ } else if ( glFormat !== null ) {
558
+
559
+ gl.compressedTexSubImage2D( gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j, 0, 0, mipmap.width, mipmap.height, glFormat, mipmap.data );
560
+
561
+ } else {
562
+
563
+ warn( 'WebGLBackend: Unsupported compressed texture format' );
564
+
565
+ }
566
+
567
+ }
568
+
569
+ }
570
+
571
+ } else if ( texture.isCompressedTexture ) {
543
572
 
544
573
  const mipmaps = texture.mipmaps;
545
574
  const image = options.image;
575
+ const isCompressedFormat = ( glFormat !== null && glFormat !== gl.RGBA );
546
576
 
547
577
  for ( let i = 0; i < mipmaps.length; i ++ ) {
548
578
 
@@ -550,51 +580,51 @@ class WebGLTextureUtils {
550
580
 
551
581
  if ( texture.isCompressedArrayTexture ) {
552
582
 
553
- if ( texture.format !== gl.RGBA ) {
554
-
555
- if ( glFormat !== null ) {
583
+ if ( isCompressedFormat ) {
556
584
 
557
- if ( texture.layerUpdates.size > 0 ) {
585
+ if ( texture.layerUpdates.size > 0 ) {
558
586
 
559
- const layerByteLength = getByteLength( mipmap.width, mipmap.height, texture.format, texture.type );
587
+ const layerByteLength = getByteLength( mipmap.width, mipmap.height, texture.format, texture.type );
560
588
 
561
- for ( const layerIndex of texture.layerUpdates ) {
589
+ for ( const layerIndex of texture.layerUpdates ) {
562
590
 
563
- const layerData = mipmap.data.subarray(
564
- layerIndex * layerByteLength / mipmap.data.BYTES_PER_ELEMENT,
565
- ( layerIndex + 1 ) * layerByteLength / mipmap.data.BYTES_PER_ELEMENT
566
- );
567
- gl.compressedTexSubImage3D( gl.TEXTURE_2D_ARRAY, i, 0, 0, layerIndex, mipmap.width, mipmap.height, 1, glFormat, layerData );
568
-
569
- }
570
-
571
- } else {
572
-
573
- gl.compressedTexSubImage3D( gl.TEXTURE_2D_ARRAY, i, 0, 0, 0, mipmap.width, mipmap.height, image.depth, glFormat, mipmap.data );
591
+ const layerData = mipmap.data.subarray(
592
+ layerIndex * layerByteLength / mipmap.data.BYTES_PER_ELEMENT,
593
+ ( layerIndex + 1 ) * layerByteLength / mipmap.data.BYTES_PER_ELEMENT
594
+ );
595
+ gl.compressedTexSubImage3D( gl.TEXTURE_2D_ARRAY, i, 0, 0, layerIndex, mipmap.width, mipmap.height, 1, glFormat, layerData );
574
596
 
575
597
  }
576
598
 
577
599
  } else {
578
600
 
579
- warn( 'WebGLBackend: Attempt to load unsupported compressed texture format in .uploadTexture()' );
601
+ gl.compressedTexSubImage3D( gl.TEXTURE_2D_ARRAY, i, 0, 0, 0, mipmap.width, mipmap.height, image.depth, glFormat, mipmap.data );
580
602
 
581
603
  }
582
604
 
583
- } else {
605
+ } else if ( glFormat === gl.RGBA ) {
584
606
 
585
607
  gl.texSubImage3D( gl.TEXTURE_2D_ARRAY, i, 0, 0, 0, mipmap.width, mipmap.height, image.depth, glFormat, glType, mipmap.data );
586
608
 
609
+ } else {
610
+
611
+ warn( 'WebGLBackend: Unsupported compressed texture format.' );
612
+
587
613
  }
588
614
 
589
615
  } else {
590
616
 
591
- if ( glFormat !== null ) {
617
+ if ( isCompressedFormat ) {
592
618
 
593
619
  gl.compressedTexSubImage2D( gl.TEXTURE_2D, i, 0, 0, mipmap.width, mipmap.height, glFormat, mipmap.data );
594
620
 
621
+ } else if ( glFormat === gl.RGBA ) {
622
+
623
+ gl.texSubImage2D( gl.TEXTURE_2D, i, 0, 0, mipmap.width, mipmap.height, glFormat, glType, mipmap.data );
624
+
595
625
  } else {
596
626
 
597
- warn( 'WebGLBackend: Unsupported compressed texture format' );
627
+ warn( 'WebGLBackend: Unsupported compressed texture format.' );
598
628
 
599
629
  }
600
630
 
@@ -905,40 +935,61 @@ class WebGLTextureUtils {
905
935
  state.pixelStorei( gl.UNPACK_SKIP_IMAGES, minZ );
906
936
 
907
937
  // set up the src texture
908
- const isSrc3D = srcTexture.isDataArrayTexture || srcTexture.isData3DTexture || dstTexture.isArrayTexture;
938
+ const isSrc3D = srcTexture.isDataArrayTexture || srcTexture.isData3DTexture || srcTexture.isArrayTexture;
909
939
  const isDst3D = dstTexture.isDataArrayTexture || dstTexture.isData3DTexture || dstTexture.isArrayTexture;
910
940
 
911
941
  if ( srcTexture.isDepthTexture ) {
912
942
 
913
943
  const srcTextureData = backend.get( srcTexture );
914
- const dstTextureData = backend.get( dstTexture );
915
944
 
916
- const srcRenderContextData = backend.get( srcTextureData.renderTarget );
917
- const dstRenderContextData = backend.get( dstTextureData.renderTarget );
945
+ if ( this._srcFramebuffer === null ) this._srcFramebuffer = gl.createFramebuffer();
946
+ if ( this._dstFramebuffer === null ) this._dstFramebuffer = gl.createFramebuffer();
918
947
 
919
- const srcFramebuffer = srcRenderContextData.framebuffers[ srcTextureData.cacheKey ];
920
- const dstFramebuffer = dstRenderContextData.framebuffers[ dstTextureData.cacheKey ];
948
+ const attachment = srcTexture.format === DepthStencilFormat ? gl.DEPTH_STENCIL_ATTACHMENT : gl.DEPTH_ATTACHMENT;
921
949
 
922
950
  const prevReadFramebuffer = state.currentBoundFramebuffers[ gl.READ_FRAMEBUFFER ] ?? null;
923
951
  const prevDrawFramebuffer = state.currentBoundFramebuffers[ gl.DRAW_FRAMEBUFFER ] ?? null;
924
952
 
925
- state.bindFramebuffer( gl.READ_FRAMEBUFFER, srcFramebuffer );
926
- state.bindFramebuffer( gl.DRAW_FRAMEBUFFER, dstFramebuffer );
953
+ state.bindFramebuffer( gl.READ_FRAMEBUFFER, this._srcFramebuffer );
954
+ state.bindFramebuffer( gl.DRAW_FRAMEBUFFER, this._dstFramebuffer );
955
+
956
+ // color attachments of previous copies would make the framebuffers incomplete
957
+
958
+ gl.framebufferTexture2D( gl.READ_FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, null, 0 );
959
+ gl.framebufferTexture2D( gl.DRAW_FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, null, 0 );
927
960
 
928
961
  for ( let i = 0; i < depth; i ++ ) {
929
962
 
930
963
  // if the source or destination are a 3d target then a layer needs to be bound
931
964
  if ( isSrc3D ) {
932
965
 
933
- gl.framebufferTextureLayer( gl.READ_FRAMEBUFFER, gl.COLOR_ATTACHMENT0, srcTextureData.textureGPU, srcLevel, minZ + i );
934
- gl.framebufferTextureLayer( gl.DRAW_FRAMEBUFFER, gl.COLOR_ATTACHMENT0, dstTextureGPU, dstLevel, dstZ + i );
966
+ gl.framebufferTextureLayer( gl.READ_FRAMEBUFFER, attachment, srcTextureData.textureGPU, srcLevel, minZ + i );
967
+
968
+ } else {
969
+
970
+ gl.framebufferTexture2D( gl.READ_FRAMEBUFFER, attachment, gl.TEXTURE_2D, srcTextureData.textureGPU, srcLevel );
971
+
972
+ }
973
+
974
+ if ( isDst3D ) {
975
+
976
+ gl.framebufferTextureLayer( gl.DRAW_FRAMEBUFFER, attachment, dstTextureGPU, dstLevel, dstZ + i );
977
+
978
+ } else {
979
+
980
+ gl.framebufferTexture2D( gl.DRAW_FRAMEBUFFER, attachment, gl.TEXTURE_2D, dstTextureGPU, dstLevel );
935
981
 
936
982
  }
937
983
 
938
- gl.blitFramebuffer( minX, minY, width, height, dstX, dstY, width, height, gl.DEPTH_BUFFER_BIT, gl.NEAREST );
984
+ gl.blitFramebuffer( minX, minY, minX + width, minY + height, dstX, dstY, dstX + width, dstY + height, gl.DEPTH_BUFFER_BIT, gl.NEAREST );
939
985
 
940
986
  }
941
987
 
988
+ // detach the depth textures so subsequent color copies can reuse the framebuffers
989
+
990
+ gl.framebufferTexture2D( gl.READ_FRAMEBUFFER, attachment, gl.TEXTURE_2D, null, 0 );
991
+ gl.framebufferTexture2D( gl.DRAW_FRAMEBUFFER, attachment, gl.TEXTURE_2D, null, 0 );
992
+
942
993
  state.bindFramebuffer( gl.READ_FRAMEBUFFER, prevReadFramebuffer );
943
994
  state.bindFramebuffer( gl.DRAW_FRAMEBUFFER, prevDrawFramebuffer );
944
995
 
@@ -983,7 +1034,7 @@ class WebGLTextureUtils {
983
1034
  // copy the data using the fastest function that can achieve the copy
984
1035
  if ( srcLevel !== 0 ) {
985
1036
 
986
- gl.blitFramebuffer( minX, minY, width, height, dstX, dstY, width, height, gl.COLOR_BUFFER_BIT, gl.NEAREST );
1037
+ gl.blitFramebuffer( minX, minY, minX + width, minY + height, dstX, dstY, dstX + width, dstY + height, gl.COLOR_BUFFER_BIT, gl.NEAREST );
987
1038
 
988
1039
  } else if ( isDst3D ) {
989
1040
 
@@ -1049,7 +1100,7 @@ class WebGLTextureUtils {
1049
1100
  state.pixelStorei( gl.UNPACK_SKIP_IMAGES, currentUnpackSkipImages );
1050
1101
 
1051
1102
  // Generate mipmaps only when copying level 0
1052
- if ( dstLevel === 0 && dstTexture.generateMipmaps ) {
1103
+ if ( dstLevel === 0 && dstTexture.generateMipmaps === true && dstTexture.mipmapsAutoUpdate === true ) {
1053
1104
 
1054
1105
  gl.generateMipmap( glTextureType );
1055
1106
 
@@ -1148,7 +1199,7 @@ class WebGLTextureUtils {
1148
1199
 
1149
1200
  }
1150
1201
 
1151
- if ( texture.generateMipmaps ) this.generateMipmaps( texture );
1202
+ if ( texture.generateMipmaps === true && texture.mipmapsAutoUpdate === true ) this.generateMipmaps( texture );
1152
1203
 
1153
1204
  this.backend._setFramebuffer( renderContext );
1154
1205
 
@@ -1165,9 +1216,9 @@ class WebGLTextureUtils {
1165
1216
  setupRenderBufferStorage( renderbuffer, renderContext, samples, useMultisampledRTT = false ) {
1166
1217
 
1167
1218
  const { gl } = this;
1168
- const renderTarget = renderContext.renderTarget;
1219
+ const { depthTexture, renderTarget } = renderContext;
1169
1220
 
1170
- const { depthTexture, depthBuffer, stencilBuffer, width, height } = renderTarget;
1221
+ const { depthBuffer, stencilBuffer, width, height } = renderTarget;
1171
1222
 
1172
1223
  gl.bindRenderbuffer( gl.RENDERBUFFER, renderbuffer );
1173
1224
 
@@ -1185,7 +1236,7 @@ class WebGLTextureUtils {
1185
1236
 
1186
1237
  if ( depthTexture && depthTexture.isDepthTexture ) {
1187
1238
 
1188
- if ( depthTexture.type === gl.FLOAT ) {
1239
+ if ( depthTexture.type === FloatType ) {
1189
1240
 
1190
1241
  glInternalFormat = gl.DEPTH_COMPONENT32F;
1191
1242
 
@@ -1207,7 +1258,19 @@ class WebGLTextureUtils {
1207
1258
 
1208
1259
  if ( samples > 0 ) {
1209
1260
 
1210
- gl.renderbufferStorageMultisample( gl.RENDERBUFFER, samples, gl.DEPTH24_STENCIL8, width, height );
1261
+ let glInternalFormat = gl.DEPTH24_STENCIL8;
1262
+
1263
+ if ( depthTexture && depthTexture.isDepthTexture ) {
1264
+
1265
+ if ( depthTexture.type === FloatType ) {
1266
+
1267
+ glInternalFormat = gl.DEPTH32F_STENCIL8;
1268
+
1269
+ }
1270
+
1271
+ }
1272
+
1273
+ gl.renderbufferStorageMultisample( gl.RENDERBUFFER, samples, glInternalFormat, width, height );
1211
1274
 
1212
1275
  } else {
1213
1276
 
@@ -1266,6 +1329,8 @@ class WebGLTextureUtils {
1266
1329
 
1267
1330
  const buffer = gl.createBuffer();
1268
1331
 
1332
+ backend.state.pixelStorei( gl.PACK_ALIGNMENT, 1 );
1333
+
1269
1334
  gl.bindBuffer( gl.PIXEL_PACK_BUFFER, buffer );
1270
1335
  gl.bufferData( gl.PIXEL_PACK_BUFFER, byteLength, gl.STREAM_READ );
1271
1336
  gl.readPixels( x, y, width, height, glFormat, glType, 0 );
@@ -1300,12 +1365,17 @@ class WebGLTextureUtils {
1300
1365
  const { gl } = this;
1301
1366
 
1302
1367
  if ( glType === gl.UNSIGNED_BYTE ) return Uint8Array;
1368
+ if ( glType === gl.BYTE ) return Int8Array;
1303
1369
 
1304
1370
  if ( glType === gl.UNSIGNED_SHORT_4_4_4_4 ) return Uint16Array;
1305
1371
  if ( glType === gl.UNSIGNED_SHORT_5_5_5_1 ) return Uint16Array;
1306
1372
  if ( glType === gl.UNSIGNED_SHORT_5_6_5 ) return Uint16Array;
1307
1373
  if ( glType === gl.UNSIGNED_SHORT ) return Uint16Array;
1374
+ if ( glType === gl.SHORT ) return Int16Array;
1308
1375
  if ( glType === gl.UNSIGNED_INT ) return Uint32Array;
1376
+ if ( glType === gl.INT ) return Int32Array;
1377
+ if ( glType === gl.UNSIGNED_INT_5_9_9_9_REV ) return Uint32Array;
1378
+ if ( glType === gl.UNSIGNED_INT_10F_11F_11F_REV ) return Uint32Array;
1309
1379
 
1310
1380
  if ( glType === gl.HALF_FLOAT ) return Uint16Array;
1311
1381
  if ( glType === gl.FLOAT ) return Float32Array;
@@ -1326,22 +1396,32 @@ class WebGLTextureUtils {
1326
1396
 
1327
1397
  const { gl } = this;
1328
1398
 
1329
- let bytesPerComponent = 0;
1330
-
1331
- if ( glType === gl.UNSIGNED_BYTE ) bytesPerComponent = 1;
1399
+ // packed types store all components of a texel in a single value
1332
1400
 
1333
1401
  if ( glType === gl.UNSIGNED_SHORT_4_4_4_4 ||
1334
1402
  glType === gl.UNSIGNED_SHORT_5_5_5_1 ||
1335
- glType === gl.UNSIGNED_SHORT_5_6_5 ||
1336
- glType === gl.UNSIGNED_SHORT ||
1403
+ glType === gl.UNSIGNED_SHORT_5_6_5 ) return 2;
1404
+
1405
+ if ( glType === gl.UNSIGNED_INT_5_9_9_9_REV ||
1406
+ glType === gl.UNSIGNED_INT_10F_11F_11F_REV ) return 4;
1407
+
1408
+ let bytesPerComponent = 0;
1409
+
1410
+ if ( glType === gl.UNSIGNED_BYTE ||
1411
+ glType === gl.BYTE ) bytesPerComponent = 1;
1412
+
1413
+ if ( glType === gl.UNSIGNED_SHORT ||
1414
+ glType === gl.SHORT ||
1337
1415
  glType === gl.HALF_FLOAT ) bytesPerComponent = 2;
1338
1416
 
1339
1417
  if ( glType === gl.UNSIGNED_INT ||
1418
+ glType === gl.INT ||
1340
1419
  glType === gl.FLOAT ) bytesPerComponent = 4;
1341
1420
 
1342
- if ( glFormat === gl.RGBA ) return bytesPerComponent * 4;
1421
+ if ( glFormat === gl.RGBA || glFormat === gl.RGBA_INTEGER ) return bytesPerComponent * 4;
1343
1422
  if ( glFormat === gl.RGB ) return bytesPerComponent * 3;
1344
- if ( glFormat === gl.ALPHA ) return bytesPerComponent;
1423
+ if ( glFormat === gl.RG || glFormat === gl.RG_INTEGER ) return bytesPerComponent * 2;
1424
+ if ( glFormat === gl.RED || glFormat === gl.RED_INTEGER || glFormat === gl.ALPHA ) return bytesPerComponent;
1345
1425
 
1346
1426
  }
1347
1427
 
@@ -0,0 +1,346 @@
1
+ /**
2
+ * A WebGL 2 backend utility module for managing vertex array objects (VAOs).
3
+ *
4
+ * VAOs are shared between all owners (render objects and compute pipelines)
5
+ * that use the same GPU buffers and deleted when the last owner releases them
6
+ * or when one of their buffers is destroyed.
7
+ *
8
+ * @private
9
+ */
10
+ class WebGLVertexArrayUtils {
11
+
12
+ /**
13
+ * Constructs a new utility object.
14
+ *
15
+ * @param {WebGLBackend} backend - The WebGL 2 backend.
16
+ */
17
+ constructor( backend ) {
18
+
19
+ /**
20
+ * A reference to the WebGL 2 backend.
21
+ *
22
+ * @type {WebGLBackend}
23
+ */
24
+ this.backend = backend;
25
+
26
+ /**
27
+ * The VAO cache. Entries are keyed by the IDs of the attribute buffers
28
+ * and hold one VAO per combination of active storage buffers as well
29
+ * as a usage counter.
30
+ *
31
+ * @type {Map<string,Object>}
32
+ */
33
+ this.cache = new Map();
34
+
35
+ }
36
+
37
+ /**
38
+ * Returns a VAO for the given attributes.
39
+ *
40
+ * @param {RenderObject|ComputePipeline} owner - The render object or compute pipeline using the VAO.
41
+ * @param {Array<BufferAttribute>} attributes - An array of buffer attributes.
42
+ * @param {?BufferAttribute} [index=null] - The index attribute.
43
+ * @return {WebGLVertexArrayObject} The VAO.
44
+ */
45
+ getVAO( owner, attributes, index = null ) {
46
+
47
+ const backend = this.backend;
48
+ const ownerData = backend.get( owner );
49
+
50
+ const indexData = ( index !== null ) ? backend.get( index ) : null;
51
+ const indexGPU = ( indexData !== null ) ? indexData.bufferGPU : null;
52
+
53
+ if ( this._needsUpdate( ownerData, attributes, indexGPU ) === false ) return ownerData.vaoGPU;
54
+
55
+ // determine key, variant and attribute buffers
56
+
57
+ let key = '';
58
+ let variant = '';
59
+
60
+ const buffers = [];
61
+ const buffersData = [];
62
+
63
+ for ( let i = 0; i < attributes.length; i ++ ) {
64
+
65
+ const attribute = attributes[ i ];
66
+ const attributeData = backend.get( backend.getBufferAttribute( attribute ) );
67
+
68
+ key += ':' + attributeData.id;
69
+
70
+ if ( attribute.isInterleavedBufferAttribute ) key += '.' + attribute.offset;
71
+
72
+ variant += ':' + ( attributeData.activeBufferIndex || 0 );
73
+
74
+ buffers.push( attributeData.bufferGPU );
75
+ buffersData.push( attributeData );
76
+
77
+ }
78
+
79
+ // the element buffer binding is part of the VAO state
80
+
81
+ if ( indexData !== null ) {
82
+
83
+ key += '|' + indexData.id;
84
+
85
+ buffersData.push( indexData );
86
+
87
+ }
88
+
89
+ // get cache entry
90
+
91
+ let entry = this.cache.get( key );
92
+
93
+ if ( key !== ownerData.vaoKey ) {
94
+
95
+ if ( ownerData.vaoKey !== undefined ) this._releaseEntry( ownerData.vaoKey ); // release old VAO
96
+
97
+ if ( entry === undefined ) {
98
+
99
+ entry = { vaos: new Map(), buffersData, usedTimes: 0 };
100
+
101
+ this.cache.set( key, entry );
102
+
103
+ // each buffer knows its VAOs so they can be deleted with the buffer
104
+
105
+ for ( const bufferData of buffersData ) {
106
+
107
+ if ( bufferData.vaoKeys === undefined ) bufferData.vaoKeys = new Set();
108
+
109
+ bufferData.vaoKeys.add( key );
110
+
111
+ }
112
+
113
+ }
114
+
115
+ entry.usedTimes ++;
116
+
117
+ ownerData.vaoKey = key;
118
+
119
+ }
120
+
121
+ // get correct VAO variant (variants are needed for dual buffer attributes)
122
+
123
+ let vaoGPU = entry.vaos.get( variant );
124
+
125
+ if ( vaoGPU === undefined ) {
126
+
127
+ vaoGPU = this._createVAO( attributes, indexGPU );
128
+
129
+ entry.vaos.set( variant, vaoGPU );
130
+
131
+ }
132
+
133
+ ownerData.vaoGPU = vaoGPU;
134
+ ownerData.vertexBuffers = buffers;
135
+ ownerData.indexBuffer = indexGPU;
136
+
137
+ return vaoGPU;
138
+
139
+ }
140
+
141
+ /**
142
+ * Releases the VAO used by the given owner.
143
+ *
144
+ * @param {RenderObject|ComputePipeline} owner - The render object or compute pipeline.
145
+ */
146
+ releaseVAO( owner ) {
147
+
148
+ const ownerData = this.backend.get( owner );
149
+
150
+ if ( ownerData.vaoKey === undefined ) return;
151
+
152
+ this._releaseEntry( ownerData.vaoKey );
153
+
154
+ ownerData.vaoKey = undefined;
155
+ ownerData.vaoGPU = undefined;
156
+ ownerData.vertexBuffers = undefined;
157
+ ownerData.indexBuffer = undefined;
158
+
159
+ }
160
+
161
+ /**
162
+ * Deletes all VAOs referencing the given attribute buffer. Must be called
163
+ * when the buffer is destroyed since VAOs keep the memory of attached buffers
164
+ * allocated. Owners of deleted VAOs request a new one with their next draw.
165
+ *
166
+ * @param {Object} bufferData - The backend data of the attribute buffer.
167
+ */
168
+ releaseBuffer( bufferData ) {
169
+
170
+ if ( bufferData.vaoKeys === undefined ) return;
171
+
172
+ for ( const key of bufferData.vaoKeys ) {
173
+
174
+ this._deleteEntry( key );
175
+
176
+ }
177
+
178
+ }
179
+
180
+ /**
181
+ * Frees internal resources.
182
+ */
183
+ dispose() {
184
+
185
+ const { gl } = this.backend;
186
+
187
+ for ( const entry of this.cache.values() ) {
188
+
189
+ for ( const vaoGPU of entry.vaos.values() ) {
190
+
191
+ gl.deleteVertexArray( vaoGPU );
192
+
193
+ }
194
+
195
+ }
196
+
197
+ this.cache.clear();
198
+
199
+ }
200
+
201
+ /**
202
+ * Returns `true` if the given attributes refer to other GPU buffers than
203
+ * the VAO of the given owner.
204
+ *
205
+ * @private
206
+ * @param {Object} ownerData - The backend data of the owner.
207
+ * @param {Array<BufferAttribute>} attributes - An array of buffer attributes.
208
+ * @param {?WebGLBuffer} indexGPU - The index buffer.
209
+ * @return {boolean} Whether the owner requires a different VAO or not.
210
+ */
211
+ _needsUpdate( ownerData, attributes, indexGPU ) {
212
+
213
+ const buffers = ownerData.vertexBuffers;
214
+
215
+ if ( buffers === undefined || buffers.length !== attributes.length || ownerData.indexBuffer !== indexGPU ) return true;
216
+
217
+ for ( let i = 0; i < attributes.length; i ++ ) {
218
+
219
+ const bufferAttribute = this.backend.getBufferAttribute( attributes[ i ] );
220
+
221
+ if ( this.backend.get( bufferAttribute ).bufferGPU !== buffers[ i ] ) return true;
222
+
223
+ }
224
+
225
+ return false;
226
+
227
+ }
228
+
229
+ /**
230
+ * Releases the VAO entry. If possible, the all VAO variants are deleted.
231
+ *
232
+ * @private
233
+ * @param {string} key - The cache key.
234
+ */
235
+ _releaseEntry( key ) {
236
+
237
+ const entry = this.cache.get( key );
238
+
239
+ if ( entry === undefined ) return; // already deleted with one of its buffers
240
+
241
+ entry.usedTimes --;
242
+
243
+ if ( entry.usedTimes === 0 ) this._deleteEntry( key );
244
+
245
+ }
246
+
247
+ /**
248
+ * Deletes all VAO variants of the given cache entry.
249
+ *
250
+ * @private
251
+ * @param {string} key - The cache key.
252
+ */
253
+ _deleteEntry( key ) {
254
+
255
+ const { gl, state } = this.backend;
256
+
257
+ const entry = this.cache.get( key );
258
+
259
+ for ( const vaoGPU of entry.vaos.values() ) {
260
+
261
+ if ( state.currentVAO === vaoGPU ) state.resetVertexState();
262
+
263
+ gl.deleteVertexArray( vaoGPU );
264
+
265
+ }
266
+
267
+ for ( const bufferData of entry.buffersData ) {
268
+
269
+ bufferData.vaoKeys.delete( key );
270
+
271
+ }
272
+
273
+ this.cache.delete( key );
274
+
275
+ }
276
+
277
+ /**
278
+ * Creates a VAO from the given attributes.
279
+ *
280
+ * @private
281
+ * @param {Array<BufferAttribute>} attributes - An array of buffer attributes.
282
+ * @param {?WebGLBuffer} indexGPU - The index buffer.
283
+ * @return {WebGLVertexArrayObject} The VAO.
284
+ */
285
+ _createVAO( attributes, indexGPU ) {
286
+
287
+ const { gl, state } = this.backend;
288
+
289
+ const vaoGPU = gl.createVertexArray();
290
+
291
+ state.setVertexState( vaoGPU, indexGPU );
292
+
293
+ for ( let i = 0; i < attributes.length; i ++ ) {
294
+
295
+ const attribute = attributes[ i ];
296
+ const bufferAttribute = this.backend.getBufferAttribute( attribute );
297
+ const attributeData = this.backend.get( bufferAttribute );
298
+
299
+ gl.bindBuffer( gl.ARRAY_BUFFER, attributeData.bufferGPU );
300
+ gl.enableVertexAttribArray( i );
301
+
302
+ let stride, offset;
303
+
304
+ if ( attribute.isInterleavedBufferAttribute === true ) {
305
+
306
+ // interleaved attributes can also view a buffer attribute
307
+
308
+ const bufferStride = bufferAttribute.isInterleavedBuffer === true ? bufferAttribute.stride : bufferAttribute.itemSize;
309
+
310
+ stride = bufferStride * attributeData.bytesPerElement;
311
+ offset = attribute.offset * attributeData.bytesPerElement;
312
+
313
+ } else {
314
+
315
+ stride = 0;
316
+ offset = 0;
317
+
318
+ }
319
+
320
+ if ( attributeData.isInteger ) {
321
+
322
+ gl.vertexAttribIPointer( i, attribute.itemSize, attributeData.type, stride, offset );
323
+
324
+ } else {
325
+
326
+ gl.vertexAttribPointer( i, attribute.itemSize, attributeData.type, attribute.normalized, stride, offset );
327
+
328
+ }
329
+
330
+ if ( bufferAttribute.isInstancedBufferAttribute === true || bufferAttribute.isInstancedInterleavedBuffer === true ) {
331
+
332
+ gl.vertexAttribDivisor( i, bufferAttribute.meshPerAttribute );
333
+
334
+ }
335
+
336
+ }
337
+
338
+ gl.bindBuffer( gl.ARRAY_BUFFER, null );
339
+
340
+ return vaoGPU;
341
+
342
+ }
343
+
344
+ }
345
+
346
+ export default WebGLVertexArrayUtils;